{"version":3,"file":"seniorsistemas-angular-components-pin-code-field.mjs","sources":["../../projects/angular-components/pin-code-field/src/lib/pin-code-field/pin-code-field.component.ts","../../projects/angular-components/pin-code-field/src/lib/pin-code-field/pin-code-field.component.html","../../projects/angular-components/pin-code-field/src/lib/pin-code-field.module.ts","../../projects/angular-components/pin-code-field/src/seniorsistemas-angular-components-pin-code-field.ts"],"sourcesContent":["import {\n    Component,\n    forwardRef,\n    viewChildren,\n    ElementRef,\n    signal,\n    input,\n    output,\n    effect,\n    computed,\n    model,\n    inject,\n    DestroyRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * @description Componente de entrada de código PIN/OTP com campos individuais para cada dígito.\n * Implementa {@link ControlValueAccessor} para integração nativa com Reactive Forms\n * e Template-driven Forms do Angular.\n *\n * Funcionalidades:\n * - Campos separados e navegáveis para cada dígito do código\n * - Comprimento configurável via input `length`\n * - Suporte a entrada numérica ou alfanumérica\n * - Navegação por teclado (setas, backspace)\n * - Suporte a colar (paste) com truncamento automático ao tamanho definido\n * - Estado de erro via input `invalid`\n * - Acessibilidade completa com ARIA labels e roles semânticos\n *\n * @example\n * ```html\n * <form [formGroup]=\"form\">\n *   <s-pin-code-field\n *     formControlName=\"code\"\n *     [length]=\"6\"\n *     [alphanumeric]=\"false\"\n *     [invalid]=\"(form.get('code')?.invalid && form.get('code')?.dirty) || false\"\n *     helpText=\"Digite seu código de 6 dígitos\"\n *     (codeFilled)=\"onCodeFilled($event)\">\n *   </s-pin-code-field>\n * </form>\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-pin-code-field',\n    templateUrl: './pin-code-field.component.html',\n    standalone: true,\n    imports: [CommonModule, TranslateModule],\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => PinCodeFieldComponent),\n            multi: true,\n        },\n    ],\n})\nexport class PinCodeFieldComponent implements ControlValueAccessor {\n    private static readonly LAST_INDEX_OFFSET = 1;\n    private static readonly EMPTY_VALUE = '';\n\n    /**\n     * @description Número de campos de entrada (comprimento do código PIN).\n     * Deve ser ao menos 1.\n     *\n     * @default 6\n     */\n    public length = input(6);\n\n    /**\n     * @description Permite entrada alfanumérica e de caracteres especiais.\n     * Quando `false`, aceita apenas dígitos numéricos (0–9).\n     *\n     * @default false\n     */\n    public alphanumeric = input(false);\n\n    /**\n     * @description Texto de ajuda exibido abaixo dos campos de entrada,\n     * fornecendo instruções adicionais ao usuário.\n     *\n     * @default ''\n     */\n    public helpText = input('');\n\n    /**\n     * @description Controla a visualização do estado de erro do componente.\n     * Quando `true`, exibe borda vermelha nos campos de entrada.\n     * Normalmente vinculado ao estado `invalid && dirty` do `FormControl`.\n     *\n     * @example\n     * ```html\n     * [invalid]=\"(control?.invalid && control?.dirty) || false\"\n     * ```\n     * @default false\n     */\n    public invalid = input(false);\n\n    /**\n     * @description Controla o estado desabilitado do componente via two-way binding.\n     * Quando `true`, todos os campos ficam desabilitados e a interação do usuário é bloqueada.\n     *\n     * @default false\n     */\n    public disabled = model(false);\n\n    /**\n     * @description Emitido quando todos os campos do código PIN são preenchidos.\n     * Emite o código completo como string.\n     *\n     * @example\n     * ```html\n     * (codeFilled)=\"onCodeFilled($event)\"\n     * ```\n     */\n    public codeFilled = output<string>();\n\n    /**\n     * @description Signal com os valores atuais de cada campo de entrada.\n     * O comprimento do array corresponde ao valor do input `length`.\n     */\n    public inputs = signal<string[]>([]);\n\n    /**\n     * Signal tracking whether the component has been touched by the user.\n     * Set to true when the last input field loses focus (blur event).\n     */\n    public touched = signal<boolean>(false);\n\n    /**\n     * Computed signal indicating whether all PIN code fields are filled.\n     * True only when every field contains a non-empty value.\n     */\n    public isComplete = computed(() => this.inputs().every((input) => input !== ''));\n\n    /**\n     * Computed signal containing the complete PIN code as a joined string.\n     * Returns empty string if no inputs are filled.\n     */\n    public currentValue = computed(() => this.inputs().join(''));\n\n    /**\n     * Signal tracking if the component host has the ng-invalid class from FormControl validators.\n     * Updated reactively whenever the invalid state changes.\n     */\n    private hasNgInvalidClass = signal<boolean>(false);\n\n    /**\n     * Signal tracking if the FormControl is dirty.\n     * Updated reactively whenever the dirty state changes.\n     */\n    private isControlDirty = signal<boolean>(false);\n\n    /**\n     * Computed signal indicating if the component should show error state.\n     * Returns true if:\n     * - The `invalid` input is true, OR\n     * - The component has the `ng-invalid` class AND the FormControl is dirty (touched/modified)\n     * This ensures errors are only shown to the user after they've interacted with the field.\n     */\n    public hasError = computed(() => this.invalid() || (this.hasNgInvalidClass() && this.isControlDirty()));\n\n    /**\n     * ViewChildren reference to all input DOM elements.\n     * Used for DOM manipulation (focus, selection).\n     */\n    public pinInputs = viewChildren<ElementRef>('pinInput');\n\n    private readonly elementRef = inject(ElementRef);\n    private readonly destroyRef = inject(DestroyRef);\n\n    private onChange: (value: string) => void = () => {};\n    private onTouched: () => void = () => {};\n\n    constructor() {\n        effect(\n            () => {\n                const newLength = this.length();\n                if (newLength < 1) {\n                    console.warn('PIN code length must be at least 1');\n                    return;\n                }\n                if (this.inputs().length !== newLength) {\n                    this.inputs.set(Array.from({ length: newLength }, () => ''));\n                }\n            },\n            { allowSignalWrites: true },\n        );\n\n        // Monitor ng-invalid and ng-dirty classes on the host element for reactive error state\n        effect(\n            () => {\n                // Access inputs to create dependency on changes\n                this.inputs();\n                this.invalid();\n\n                // Use setTimeout to defer the check to next tick to ensure Angular has updated DOM classes\n                const timeoutId = window.setTimeout(() => {\n                    const hostElement = this.elementRef.nativeElement;\n                    const hasNgInvalid = hostElement.classList.contains('ng-invalid');\n                    const isDirty = hostElement.classList.contains('ng-dirty');\n\n                    this.hasNgInvalidClass.set(hasNgInvalid);\n                    this.isControlDirty.set(isDirty);\n                });\n\n                // Cleanup timeout on component destroy\n                this.destroyRef.onDestroy(() => {\n                    clearTimeout(timeoutId);\n                });\n            },\n            { allowSignalWrites: true },\n        );\n    }\n\n    /**\n     * Handles input event on PIN code fields.\n     * Validates character input, prevents multiple characters per field,\n     * auto-advances to next field when character is entered.\n     *\n     * @param index - The input field index (0-based)\n     * @param event - The input event\n     */\n    public onInput(index: number, event: Event): void {\n        if (this.disabled()) {\n            event.preventDefault();\n            return;\n        }\n\n        const target = event.target as HTMLInputElement;\n        const value = target.value;\n\n        if (value.length > 1 || (value && !this.isValidCharacter(value))) {\n            this.clearInput(target);\n            return;\n        }\n\n        this.setInputAtIndex(index, value);\n\n        if (value && index < this.length() - 1) {\n            this.focusAndSelectInput(index + 1);\n        }\n\n        if (this.isComplete()) {\n            this.codeFilled.emit(this.currentValue());\n        }\n    }\n\n    /**\n     * Handles keyboard events on PIN code fields.\n     * Supports arrow navigation (left/right) and backspace key.\n     *\n     * Keyboard behavior:\n     * - ArrowRight: Move focus to next field\n     * - ArrowLeft: Move focus to previous field\n     * - Backspace: Clear current or previous field and adjust focus\n     *\n     * @param index - The input field index (0-based)\n     * @param event - The keyboard event\n     */\n    public onKeyDown(index: number, event: KeyboardEvent): void {\n        if (this.disabled()) {\n            event.preventDefault();\n            return;\n        }\n\n        const key = event.key;\n\n        switch (key) {\n            case 'ArrowRight':\n                if (index < this.length() - 1) {\n                    event.preventDefault();\n                    this.focusAndSelectInput(index + 1);\n                }\n                break;\n            case 'ArrowLeft':\n                if (index > 0) {\n                    event.preventDefault();\n                    this.focusAndSelectInput(index - 1);\n                }\n                break;\n            case 'Backspace':\n                event.preventDefault();\n                this.handleBackspace(index);\n                break;\n        }\n    }\n\n    /**\n     * Handles paste (clipboard) events on PIN code fields.\n     * Extracts valid characters from pasted content, filters by character type,\n     * and automatically truncates to match field length.\n     *\n     * Behavior:\n     * - Filters characters based on `alphanumeric` setting\n     * - Truncates to maximum field count\n     * - Fills available fields with pasted content\n     * - Emits codeFilled event if all fields are filled\n     *\n     * @param event - The clipboard event\n     */\n    public onPaste(event: ClipboardEvent): void {\n        if (this.disabled()) {\n            event.preventDefault();\n            return;\n        }\n\n        event.preventDefault();\n\n        const validChars = this.extractValidCharactersFromPaste(event);\n\n        if (validChars.length === 0) {\n            return;\n        }\n\n        const filledInputs = [...validChars, ...Array(this.length() - validChars.length).fill('')];\n\n        this.inputs.set(filledInputs);\n        this.updateValue();\n\n        // Focus on the first empty input or the last filled input if all are filled\n        const firstEmptyIndex = validChars.length < this.length() ? validChars.length : validChars.length - 1;\n        this.focusAndSelectInput(firstEmptyIndex);\n\n        if (this.isComplete()) {\n            this.codeFilled.emit(this.currentValue());\n        }\n    }\n\n    /**\n     * Handles focus event on PIN code fields.\n     * Selects all text in the input field when focused.\n     *\n     * @param index - The input field index (0-based)\n     */\n    public onFocus(index: number): void {\n        const input = this.pinInputs()[index];\n        if (input) {\n            input.nativeElement.select();\n        }\n    }\n\n    /**\n     * Handles blur event on PIN code fields.\n     * Marks the component as touched when the last input field loses focus.\n     * Also notifies the registered onTouched callback for FormControl integration.\n     *\n     * @param index - The input field index (0-based)\n     */\n    public onBlur(index: number): void {\n        // Only mark as touched when the LAST input loses focus\n        if (index === this.length() - PinCodeFieldComponent.LAST_INDEX_OFFSET) {\n            this.touched.set(true);\n            this.onTouched();\n        }\n    }\n\n    /**\n     * Clears the input value at specified index and adjusts focus accordingly.\n     * If current field is empty, moves to previous field and clears it.\n     *\n     * @private\n     * @param index - The input field index (0-based)\n     */\n    private handleBackspace(index: number): void {\n        const currentInputs = this.inputs();\n\n        // If current input has value, clear it\n        if (currentInputs[index]) {\n            this.setInputAtIndex(index, PinCodeFieldComponent.EMPTY_VALUE);\n            return;\n        }\n\n        // Otherwise, clear previous input and focus it\n        if (index > 0) {\n            this.setInputAtIndex(index - 1, PinCodeFieldComponent.EMPTY_VALUE);\n            this.focusAndSelectInput(index - 1);\n        }\n    }\n\n    /**\n     * Sets the value at a specific input field index and updates the form value.\n     * Updates the signal and triggers the change detection via onChange callback.\n     *\n     * @private\n     * @param index - The input field index (0-based)\n     * @param value - The value to set in the field\n     */\n    private setInputAtIndex(index: number, value: string): void {\n        const currentInputs = this.inputs();\n        currentInputs[index] = value;\n        this.inputs.set([...currentInputs]);\n        this.updateValue();\n    }\n\n    /**\n     * Focuses on and selects text in the input field at the specified index.\n     * Uses queueMicrotask to ensure DOM is updated before focusing.\n     *\n     * @private\n     * @param index - The input field index (0-based)\n     */\n    private focusAndSelectInput(index: number): void {\n        queueMicrotask(() => {\n            const input = this.pinInputs()[index];\n            if (input) {\n                input.nativeElement.focus();\n                input.nativeElement.select();\n            }\n        });\n    }\n\n    /**\n     * Clears the value of an input element.\n     * Used for input validation to reject invalid characters.\n     *\n     * @private\n     * @param target - The HTML input element to clear\n     */\n    private clearInput(target: HTMLInputElement): void {\n        target.value = '';\n    }\n\n    /**\n     * Extracts valid characters from pasted content.\n     * Filters based on alphanumeric setting and limits to component's length.\n     *\n     * @private\n     * @param event - The clipboard event\n     * @returns Array of valid characters from the pasted content\n     */\n    private extractValidCharactersFromPaste(event: ClipboardEvent): string[] {\n        const pastedText = (event.clipboardData?.getData('text') || '').trim();\n        return pastedText\n            .split('')\n            .filter((char) => this.isValidCharacter(char))\n            .slice(0, this.length());\n    }\n\n    /**\n     * Validates if a character is acceptable based on component configuration.\n     * For numeric mode, accepts only digits 0-9.\n     * For alphanumeric mode, accepts any non-whitespace character.\n     *\n     * @private\n     * @param char - The character to validate\n     * @returns true if character is valid, false otherwise\n     */\n    private isValidCharacter(char: string): boolean {\n        if (this.alphanumeric()) {\n            return char.trim().length > 0;\n        }\n        return /^[0-9]$/.test(char);\n    }\n\n    /**\n     * Updates the form value by calling the onChange callback registered by FormControl.\n     * This ensures the reactive form stays synchronized with component state.\n     *\n     * @private\n     */\n    private updateValue(): void {\n        this.onChange(this.currentValue());\n    }\n\n    /**\n     * Implements ControlValueAccessor interface.\n     * Called by the FormControl to write a value to the component.\n     * Only accepts string values with length matching the component's length setting.\n     *\n     * @param value - The value to write (typically from the FormControl)\n     */\n    public writeValue(value: any): void {\n        if (value) {\n            const stringValue = String(value);\n            if (stringValue.length === this.length()) {\n                this.inputs.set(stringValue.split(''));\n            }\n        }\n    }\n\n    /**\n     * Implements ControlValueAccessor interface.\n     * Called by the FormControl when value changes.\n     * Registers the callback to be called when the component value changes.\n     *\n     * @param fn - Callback function to invoke when component value changes\n     */\n    public registerOnChange(fn: (value: string) => void): void {\n        this.onChange = fn;\n    }\n\n    /**\n     * Implements ControlValueAccessor interface.\n     * Called by the FormControl to register the touched callback.\n     * The callback is invoked when the last input field loses focus.\n     *\n     * @param fn - Callback function to invoke when component is touched\n     */\n    public registerOnTouched(fn: () => void): void {\n        this.onTouched = fn;\n    }\n\n    /**\n     * Implements ControlValueAccessor interface.\n     * Called by the FormControl to set the disabled state of the component.\n     * Updates the disabled model to reflect the form's disabled state.\n     *\n     * @param isDisabled - Whether the component should be disabled\n     */\n    public setDisabledState(isDisabled: boolean): void {\n        this.disabled.set(isDisabled);\n    }\n}\n\n","<div class=\"gap-xsmall flex flex-col\">\n    <div\n        class=\"flex gap-2\"\n        role=\"group\"\n        aria-label=\"PIN code input\"\n        [attr.aria-labelledby]=\"helpText() ? 'pin-help-text' : null\"\n    >\n        @for (input of inputs(); let i = $index; track i) {\n            <input\n                #pinInput\n                type=\"text\"\n                class=\"h-12 w-12 rounded-xbig border text-center text-lg font-medium transition-all duration-200\"\n                [ngClass]=\"{\n                    'border-criticality-red focus:ring-criticality-red': hasError(),\n                    'border-grayscale-30 focus:border-primary focus:ring-primary': !hasError(),\n                    'cursor-not-allowed bg-grayscale-10 text-grayscale-60': disabled(),\n                    'bg-grayscale-0 text-grayscale-100 focus:outline-none': !disabled(),\n                }\"\n                [value]=\"input\"\n                [disabled]=\"disabled()\"\n                [attr.maxlength]=\"1\"\n                [attr.inputmode]=\"alphanumeric() ? 'text' : 'numeric'\"\n                [attr.aria-label]=\"\n                    alphanumeric()\n                        ? ('platform.angular_components.pin_code_character_index_of_total'\n                          | translate: { index: i + 1, length: length() })\n                        : ('platform.angular_components.pin_code_digit_index_of_total'\n                          | translate: { index: i + 1, length: length() })\n                \"\n                [attr.aria-describedby]=\"helpText() ? 'pin-help-text' : null\"\n                [attr.aria-required]=\"true\"\n                autocomplete=\"off\"\n                (input)=\"onInput(i, $event)\"\n                (keydown)=\"onKeyDown(i, $event)\"\n                (paste)=\"onPaste($event)\"\n                (focus)=\"onFocus(i)\"\n                (blur)=\"onBlur(i)\"\n            />\n        }\n    </div>\n\n    @if (helpText()) {\n        <div\n            id=\"pin-help-text\"\n            class=\"mt-small text-sm text-grayscale-60\"\n        >\n            {{ helpText() }}\n        </div>\n    }\n</div>\n\n","import { NgModule } from '@angular/core';\nimport { PinCodeFieldComponent } from './pin-code-field/pin-code-field.component';\n\n@NgModule({\n    imports: [PinCodeFieldComponent],\n    exports: [PinCodeFieldComponent],\n})\nexport class PinCodeFieldModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MAcU,qBAAqB,CAAA;AACtB,IAAA,OAAgB,iBAAiB,GAAG,CAAC,CAAC;AACtC,IAAA,OAAgB,WAAW,GAAG,EAAE,CAAC;AAEzC;;;;;AAKG;AACI,IAAA,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAEzB;;;;;AAKG;AACI,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAEnC;;;;;AAKG;AACI,IAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;AAE5B;;;;;;;;;;AAUG;AACI,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAE9B;;;;;AAKG;AACI,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAE/B;;;;;;;;AAQG;IACI,UAAU,GAAG,MAAM,EAAU,CAAC;AAErC;;;AAGG;AACI,IAAA,MAAM,GAAG,MAAM,CAAW,EAAE,CAAC,CAAC;AAErC;;;AAGG;AACI,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAExC;;;AAGG;IACI,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;AAEjF;;;AAGG;AACI,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAE7D;;;AAGG;AACK,IAAA,iBAAiB,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAEnD;;;AAGG;AACK,IAAA,cAAc,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAEhD;;;;;;AAMG;IACI,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AAExG;;;AAGG;AACI,IAAA,SAAS,GAAG,YAAY,CAAa,UAAU,CAAC,CAAC;AAEvC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEzC,IAAA,QAAQ,GAA4B,MAAK,GAAG,CAAC;AAC7C,IAAA,SAAS,GAAe,MAAK,GAAG,CAAC;AAEzC,IAAA,WAAA,GAAA;QACI,MAAM,CACF,MAAK;AACD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAChC,YAAA,IAAI,SAAS,GAAG,CAAC,EAAE;AACf,gBAAA,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACnD,OAAO;aACV;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,KAAK,SAAS,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;aAChE;AACL,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC9B,CAAC;;QAGF,MAAM,CACF,MAAK;;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,EAAE,CAAC;;AAGf,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AACrC,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;gBAClD,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAClE,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE3D,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACzC,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACrC,aAAC,CAAC,CAAC;;AAGH,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;gBAC3B,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5B,aAAC,CAAC,CAAC;AACP,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC9B,CAAC;KACL;AAED;;;;;;;AAOG;IACI,OAAO,CAAC,KAAa,EAAE,KAAY,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACjB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;AAED,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B,CAAC;AAChD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAE3B,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE;AAC9D,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO;SACV;AAED,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEnC,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;SACvC;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SAC7C;KACJ;AAED;;;;;;;;;;;AAWG;IACI,SAAS,CAAC,KAAa,EAAE,KAAoB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACjB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;AAED,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAEtB,QAAQ,GAAG;AACP,YAAA,KAAK,YAAY;gBACb,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;oBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;iBACvC;gBACD,MAAM;AACV,YAAA,KAAK,WAAW;AACZ,gBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;oBACX,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;iBACvC;gBACD,MAAM;AACV,YAAA,KAAK,WAAW;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,gBAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBAC5B,MAAM;SACb;KACJ;AAED;;;;;;;;;;;;AAYG;AACI,IAAA,OAAO,CAAC,KAAqB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACjB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;AAE/D,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO;SACV;QAED,MAAM,YAAY,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3F,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;;QAGnB,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AACtG,QAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;AAE1C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SAC7C;KACJ;AAED;;;;;AAKG;AACI,IAAA,OAAO,CAAC,KAAa,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE;AACP,YAAA,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;SAChC;KACJ;AAED;;;;;;AAMG;AACI,IAAA,MAAM,CAAC,KAAa,EAAA;;QAEvB,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,CAAC,iBAAiB,EAAE;AACnE,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,EAAE,CAAC;SACpB;KACJ;AAED;;;;;;AAMG;AACK,IAAA,eAAe,CAAC,KAAa,EAAA;AACjC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;;AAGpC,QAAA,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAC/D,OAAO;SACV;;AAGD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACnE,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;SACvC;KACJ;AAED;;;;;;;AAOG;IACK,eAAe,CAAC,KAAa,EAAE,KAAa,EAAA;AAChD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AACpC,QAAA,aAAa,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,EAAE,CAAC;KACtB;AAED;;;;;;AAMG;AACK,IAAA,mBAAmB,CAAC,KAAa,EAAA;QACrC,cAAc,CAAC,MAAK;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,KAAK,EAAE;AACP,gBAAA,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC5B,gBAAA,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;aAChC;AACL,SAAC,CAAC,CAAC;KACN;AAED;;;;;;AAMG;AACK,IAAA,UAAU,CAAC,MAAwB,EAAA;AACvC,QAAA,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;KACrB;AAED;;;;;;;AAOG;AACK,IAAA,+BAA+B,CAAC,KAAqB,EAAA;AACzD,QAAA,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AACvE,QAAA,OAAO,UAAU;aACZ,KAAK,CAAC,EAAE,CAAC;AACT,aAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;aAC7C,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KAChC;AAED;;;;;;;;AAQG;AACK,IAAA,gBAAgB,CAAC,IAAY,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACrB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC;AACD,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;AAED;;;;;AAKG;IACK,WAAW,GAAA;QACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACtC;AAED;;;;;;AAMG;AACI,IAAA,UAAU,CAAC,KAAU,EAAA;QACxB,IAAI,KAAK,EAAE;AACP,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AACtC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1C;SACJ;KACJ;AAED;;;;;;AAMG;AACI,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC/C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACtB;AAED;;;;;;AAMG;AACI,IAAA,iBAAiB,CAAC,EAAc,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACvB;AAED;;;;;;AAMG;AACI,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KACjC;wGAvcQ,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EARnB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EAAA;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC;AACpD,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;AACJ,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3DL,omEAmDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAS9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,SAAS;+BACI,kBAAkB,EAAA,UAAA,EAEhB,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,eAAe,CAAC,EAC7B,SAAA,EAAA;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,2BAA2B,CAAC;AACpD,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACJ,qBAAA,EAAA,QAAA,EAAA,omEAAA,EAAA,CAAA;;;MEpDQ,kBAAkB,CAAA;wGAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;yGAAlB,kBAAkB,EAAA,OAAA,EAAA,CAHjB,qBAAqB,CAAA,EAAA,OAAA,EAAA,CACrB,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAEtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHjB,qBAAqB,CAAA,EAAA,CAAA,CAAA;;4FAGtB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,qBAAqB,CAAC;oBAChC,OAAO,EAAE,CAAC,qBAAqB,CAAC;AACnC,iBAAA,CAAA;;;ACND;;AAEG;;;;"}