{"version":3,"file":"kif-lib-upload-files.mjs","sources":["../../../projects/kif-lib/upload-files/components/upload-files-file/upload-files-file.component.ts","../../../projects/kif-lib/upload-files/components/upload-files-file/upload-files-file.component.html","../../../projects/kif-lib/upload-files/upload-files.component.ts","../../../projects/kif-lib/upload-files/upload-files.component.html","../../../projects/kif-lib/upload-files/upload-files.module.ts","../../../projects/kif-lib/upload-files/public-api.ts","../../../projects/kif-lib/upload-files/kif-lib-upload-files.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FileUpload } from '../../interface/file-upload.interface';\nimport { CircleCheckBig, Download, Save, X } from 'lucide-angular';\n\n@Component({\n    selector: 'kit-upload-files-file',\n    templateUrl: './upload-files-file.component.html'\n})\nexport class UploadFilesFileComponent{\n    iconCircle = CircleCheckBig; \n    iconX = X; \n    iconDownload = Download;\n    iconSave = Save;\n    @Output() public removeFile: EventEmitter<void> = new EventEmitter();\n    @Output() public validFile: EventEmitter<void> = new EventEmitter();\n    /**\n     * Acción opcional \"Guardar como plantilla\" (CLVDKIF-1758). ADITIVA: solo se\n     * emite cuando el consumidor enciende `showSaveAsTemplate`. Entrega el\n     * archivo cargado para que el consumidor decida qué hacer con él.\n     */\n    @Output() public saveAsTemplate: EventEmitter<FileUpload> = new EventEmitter();\n\n    /**\n     * Muestra/oculta la acción \"Guardar como plantilla\" en la card.\n     * Default false → consumidores actuales NO ven el botón (retrocompatible).\n     */\n    @Input() public showSaveAsTemplate: boolean = false;\n\n    /**\n     * Texto del botón de descarga. Configurable de forma aditiva; el default\n     * conserva el texto actual para no alterar a los consumidores existentes.\n     */\n    @Input() public downloadLabel: string = 'Descargar documento';\n\n    public progressBar:number = 0;\n    private _fileUpload!: FileUpload;\n\n    constructor(){}\n\n    public onSaveAsTemplate(): void {\n        this.saveAsTemplate.emit(this.fileUpload);\n    }\n\n    @Input() public set fileUpload(file: FileUpload){\n        this._fileUpload = file;\n        this.uploadFile()\n    }\n\n    public get fileUpload(){\n        return this._fileUpload\n    }\n\n    public onRemoveFile(){\n        this.removeFile.emit()\n    }\n\n    public getFileSize(size: number | null){\n        if (size === null) {\n            return '';\n        }\n        return `${(size / 1024).toFixed(2)} KB`;\n    }\n\n    /** Nombre a mostrar: de la referencia precargada o, si no, del binario. */\n    public get displayName(): string {\n        return this._fileUpload?.preloaded?.name ?? this._fileUpload?.file?.name ?? '';\n    }\n\n    /**\n     * Tamaño a mostrar (bytes) o `null` si se desconoce. Precargado → `sizeBytes` si\n     * el back lo expone, si no `null` (la card oculta la línea de tamaño e ignora el\n     * placeholder). Subida normal → tamaño real del blob.\n     */\n    public get displaySize(): number | null {\n        if (this._fileUpload?.preloaded) {\n            return this._fileUpload.preloaded.sizeBytes ?? null;\n        }\n        return this._fileUpload?.file?.size ?? null;\n    }\n\n    public uploadFile(): void {\n        // ADITIVO — Archivo PRECARGADO (referencia sin binario real): se marca cargado\n        // (100%) sin leer el blob placeholder. Retrocompatible: solo aplica con `preloaded`.\n        if (this._fileUpload?.preloaded) {\n            this.progressBar = 100;\n            this.validFile.emit();\n            return;\n        }\n\n        const file = this._fileUpload?.file;\n        if (!file) {\n            return;\n        }\n\n        const reader = new FileReader();\n\n        reader.onloadstart = () => {\n            this.progressBar = 0;\n        };\n\n        reader.onprogress = (event) => {\n            if (event.lengthComputable) {\n                this.progressBar = Math.round((event.loaded / event.total) * 100);\n            }\n        };\n\n        reader.onload = () => {\n            this.validFile.emit();\n            this.progressBar = 100;\n        };\n\n        reader.onerror = () => {\n            console.error('File upload failed');\n        };\n\n        reader.readAsArrayBuffer(file);\n    }\n\n    public downloadFile(): void {\n        // ADITIVO — Archivo PRECARGADO: descarga por URL directa (p. ej. storageLocation)\n        // en vez del blob placeholder. Solo aplica cuando hay `preloaded`.\n        if (this.fileUpload.preloaded) {\n            const url = this.fileUpload.preloaded.downloadUrl;\n            if (!url) {\n                console.error('No hay una URL de descarga para el archivo precargado');\n                return;\n            }\n            const link = document.createElement('a');\n            link.href = url;\n            link.target = '_blank';\n            link.rel = 'noopener';\n            link.download = this.fileUpload.preloaded.name ?? '';\n            document.body.appendChild(link);\n            link.click();\n            document.body.removeChild(link);\n            return;\n        }\n\n        const file = this.fileUpload.file;\n\n        // Verificamos que el archivo existe\n        if (!file) {\n            console.error('No hay un archivo disponible para descargar');\n            return;\n        }\n\n        const fileURL = URL.createObjectURL(file);\n\n        const downloadLink = document.createElement('a');\n        downloadLink.href = fileURL;\n\n        downloadLink.download = file.name;\n\n\n        document.body.appendChild(downloadLink);\n\n        downloadLink.click();\n\n\n        document.body.removeChild(downloadLink);\n\n\n        setTimeout(() => {\n            URL.revokeObjectURL(fileURL);\n        }, 100);\n    }\n\n\n}","\n<div class=\"p-2 mb-4 border-dashed rounded d-flex flex-column gap-2\">\n\n    <div class=\"d-flex justify-content-end w-100\">\n\n            @if (!fileUpload.validating) {\n                <lucide-angular [size]=\"20\" [color]=\"'#343F4B'\" [img]=\"iconX\" (click)=\"onRemoveFile()\" class=\"cursor-pointer\"></lucide-angular>\n            }\n\n    </div>\n\n    <div class=\"d-flex flex-column align-items-center text-center gap-2\">\n\n        <div class=\"mb-0\">\n        @if (progressBar === 100 && !fileUpload.validating) {\n            <lucide-angular [size]=\"32\" [color]=\"'#2DC579'\" [img]=\"iconCircle\"></lucide-angular>\n        } @else {\n            <span class=\"loader-dots\">\n            <div class=\"dot\"></div>\n            <div class=\"dot\"></div>\n            <div class=\"dot\"></div>\n            </span>\n        }\n        </div>\n        \n\n        <p class=\"mb-0 title-dowloand\">{{displayName}}</p>\n        \n\n        <div class=\"progress-container d-flex align-items-center mb-0\">\n        <div class=\"flex-grow-1 me-2\">\n            <mat-progress-bar\n            [ngClass]=\"{'completed-progress': progressBar === 100 && !fileUpload.validating}\"\n            color=\"primary\"\n            [mode]=\"(progressBar === 100 && fileUpload.validating) ? 'indeterminate' : 'determinate'\"\n            [value]=\"fileUpload.validating ? undefined : progressBar\">\n            </mat-progress-bar>\n        </div>\n        <span class=\"progress-text\">\n            @if (progressBar === 100 && fileUpload.validating) {\n                Cargando...\n            } @else {\n                {{progressBar}}%\n            }\n        </span>\n        </div>\n        \n\n        @if (displaySize !== null) {\n            <div class=\"file-size\">{{getFileSize(displaySize)}}</div>\n        }\n        <div class=\"d-flex align-items-center justify-content-center gap-3 flex-wrap\">\n            <button\n            type=\"button\"\n            class=\"d-flex align-items-center gap-4-px  download-link upload-action-btn border-0 bg-transparent p-0\"\n            (click)=\"downloadFile()\"\n            [attr.aria-label]=\"downloadLabel\">\n            <lucide-angular [size]=\"16\" [color]=\"'#5B62DA'\" [img]=\"iconDownload\"></lucide-angular>\n            <span class=\"upload-action-text\">{{downloadLabel}}</span>\n        </button>\n        @if (showSaveAsTemplate) {\n            <button\n            type=\"button\"\n            class=\"d-flex align-items-center gap-4-px download-link upload-action-btn border-0 bg-transparent p-0\"\n            (click)=\"onSaveAsTemplate()\"\n            aria-label=\"Guardar como plantilla\">\n            <lucide-angular [size]=\"16\" [color]=\"'#5B62DA'\" [img]=\"iconSave\"></lucide-angular>\n            <span class=\"upload-action-text\">Guardar como plantilla</span>\n        </button>\n        }\n        </div>\n    </div>\n</div>","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { FileUpload } from './interface/file-upload.interface';\nimport { OctagonAlert, Upload, X } from 'lucide-angular';\n\n@Component({\n    selector: 'kit-upload-files',\n    templateUrl: './upload-files.component.html',    \n\n})\nexport class UploadFilesComponent {\n    iconUpload = Upload;\n    iconOctagon = OctagonAlert;\n    iconX =  X;\n    public message: string = 'El archivo no pudo ser cargado'\n    @ViewChild('inputFile') public inputFile!: ElementRef;\n    @Input() public filesSelected!: File[];\n    @Input() public allowedFormats: string[] = [];\n    @Input() public multipleFiles: boolean = false;\n    @Input() public description:string = 'Haz click para cargar documento';\n    @Input() public files:FileUpload[]=[];\n    @Input() sizeFile!: string;\n    @Input() invalidFileView: boolean = false;\n    /**\n     * Renderiza las cards de archivos cargados también en modo multi-archivo\n     */\n    @Input() public showLoadedFiles: boolean = false;\n    /**\n     * Propaga la acción opcional \"Guardar como plantilla\" a cada card.\n     */\n    @Input() public showSaveAsTemplate: boolean = false;\n    /** Texto del botón de descarga de cada card (aditivo, default conservado). */\n    @Input() public downloadLabel: string = 'Descargar documento';\n    // OUTPUT TO NOTIFY CHANGES\n    \n    @Output() public filesUpload: EventEmitter<FileUpload[]> = new EventEmitter();\n    @Output() public invalidFile: EventEmitter<void> = new EventEmitter();\n    @Output() public fileRemoved: EventEmitter<void> = new EventEmitter();\n    /** Reemite la acción \"Guardar como plantilla\" de una card (CLVDKIF-1758). */\n    @Output() public saveAsTemplate: EventEmitter<FileUpload> = new EventEmitter();\n    public fileNameInvalid: string = ''\n    public DIALOG_TITLE:string = ''\n    public DIALOG_INFO!:string;\n    // public files:FileUpload[]=[]\n    public dragOverActive: boolean = false;\n    constructor(){}\n\n    public get disableAddFile(){\n        return !this.multipleFiles && this.files.length === 1\n    }\n\n    public getAllowedFormats():string {\n        return this.allowedFormats.map(e =>`.${e}`).join(', ');\n    }\n\n    public handleUploadFile(event: any): void {\n        const file: File = event.target['files'][0];\n\n        event.target['value'] = '';\n        \n        this.processFile(file);\n    } \n      \n\n    public handleDrop(event: DragEvent): void {\n        event.preventDefault();\n        event.stopPropagation();\n        this.dragOverActive = false;\n        \n        if (event.dataTransfer && event.dataTransfer.files.length > 0) {\n            const files = event.dataTransfer.files;\n            \n            if (this.multipleFiles) {\n                let hasInvalidFiles = false;\n                \n                // Procesar todos los archivos\n                for (let i = 0; i < files.length; i++) {\n                    const result = this.processMultipleFiles(files[i]);\n                    if (!result) {\n                        hasInvalidFiles = true;\n                    }\n                }\n                \n                // Emitir solo una vez al final\n                this.emitFilesUpload();\n                \n                // Emitir invalidFile solo si hay archivos inválidos\n                if (hasInvalidFiles) {\n                    this.invalidFile.emit();\n                }\n            } else {\n                this.processFile(files[0]);\n            }\n        }\n    }\n\n\n    private processMultipleFiles(file: File): boolean {\n        const fileName = file.name;\n        const fileExtension = file.name.split('.').pop()?.toLowerCase();\n        \n        if (!this.files) {\n            this.files = [];\n        }\n\n        if (fileExtension && this.allowedFormats.includes(fileExtension)) {\n            if (file.size <= 10 * 1024 * 1024) {\n                this.files.push({ file, valid: true });\n                return true; // Archivo válido\n            } else {\n                this.message = 'El archivo no pudo ser cargado';\n                this.fileNameInvalid = fileName;\n                this.files.push({ file, valid: false });\n                return false; // Archivo inválido\n            }\n        } else {\n            this.message = 'El formato del archivo no es el correcto';\n            this.fileNameInvalid = fileName ? fileName : '';\n            this.files.push({ file, valid: false });\n            return false; // Archivo inválido\n        }\n    }\n        \n\n    private processFile(file: File): void {\n        const fileName = file.name;\n        const fileExtension = file.name.split('.').pop()?.toLowerCase();\n        \n        if (!this.files) {\n            this.files = [];\n        }\n        if (fileExtension && this.allowedFormats.includes(fileExtension)) {\n\n            if (file.size <= 10 * 1024 * 1024) {\n                this.files.push({ file, valid: true });\n                this.emitFilesUpload();\n            } else {\n                this.message = 'El archivo no pudo ser cargado';\n                this.invalidFile.emit();\n                if (this.multipleFiles) {\n                    this.files.push({ file, valid: false })\n                    this.emitFilesUpload(); \n                }\n            }\n        } else {\n\n            this.message = 'El formato del archivo no es el correcto'\n            this.fileNameInvalid = fileName ? fileName : '';\n            this.invalidFile.emit();\n            if (this.multipleFiles) {\n                this.files.push({ file, valid: false })\n                this.emitFilesUpload(); \n            }\n        }\n    }\n      \n    public handleValidFile(index: number) {\n        this.files[index].valid = true;\n        this.emitFilesUpload();\n    }\n    \n    public onRemoveFile(index: number) {\n        this.files.splice(index, 1);\n        this.emitFilesUpload();\n    }\n    public onSaveAsTemplate(file: FileUpload) {\n        this.saveAsTemplate.emit(file);\n    }\n    public onRemoveInvalidFile(){\n        if (this.invalidFileView) {\n            this.fileRemoved.emit();\n        }\n    }\n    private emitFilesUpload() {\n        this.filesUpload.emit(this.files);\n    }\n\n}","@if(files && files.length > 0 && (!multipleFiles || showLoadedFiles)){\n    @for (file of files; track file; let idx = $index) {\n        <kit-upload-files-file\n            class=\"\"\n            [fileUpload]=\"file\"\n            [showSaveAsTemplate]=\"showSaveAsTemplate\"\n            [downloadLabel]=\"downloadLabel\"\n            (validFile)=\"handleValidFile(idx)\"\n            (removeFile)=\"onRemoveFile(idx)\"\n            (saveAsTemplate)=\"onSaveAsTemplate(file)\"></kit-upload-files-file>                                \n    }  \n} @else {\n    @if (!invalidFileView || multipleFiles) {\n        <div \n            class=\"p-2 mb-4 border-dashed rounded d-flex flex-column justify-content-center align-items-center gap-2\"\n            (click)=\"inputFile.click()\"\n            (keydown.enter)=\"inputFile.click()\"\n            (keydown.space)=\"$event.preventDefault(); inputFile.click()\"\n            (dragover)=\"$event.preventDefault(); $event.stopPropagation(); dragOverActive=true\"\n            (dragleave)=\"$event.preventDefault(); $event.stopPropagation(); dragOverActive=false\"\n            (drop)=\"handleDrop($event)\"\n            [ngClass]=\"{'bg-light-hover': dragOverActive}\"\n            tabindex=\"0\"\n            role=\"button\"\n            aria-label=\"Subir archivo\"\n            style=\"cursor: pointer; transition: all 0.3s ease;\">\n            <lucide-angular [size]=\"24\" [color]=\"dragOverActive ? '#3048DA' : '#5B62DA'\" [img]=\"iconUpload\"></lucide-angular>\n            <div [innerHTML]=\"description\"></div>\n            <p class=\"subtitle-download mb-0\">{{sizeFile?sizeFile:'10 MB'}} tamaño máximo del archivo Soporta archivos tipo: {{getAllowedFormats()}}</p>\n            <!-- Input file con atributo multiple explícito -->\n            <input \n                (change)=\"handleUploadFile($event)\"\n                type=\"file\"\n                hidden\n                #inputFile\n                [accept]=\"getAllowedFormats()\"\n                [multiple]=\"multipleFiles\" />\n        </div>\n    } @else {\n        <div \n            class=\"p-2 mb-4 border-dashed rounded d-flex flex-column align-items-center gap-2\" \n            [class.error]=\"invalidFileView\">\n            <div class=\"d-flex justify-content-end w-100\">\n                <lucide-angular \n                    [size]=\"20\" \n                    [color]=\"'#2A323C'\" \n                    [img]=\"iconX\" \n                    (click)=\"onRemoveInvalidFile()\">\n                </lucide-angular>\n            </div>\n            <lucide-angular [size]=\"32\" [color]=\"'#B4271F'\" [img]=\"iconOctagon\"></lucide-angular>\n            <div>{{fileNameInvalid}}</div>\n            <p class=\"mb-0 subtitle-download--error\" >{{message}}</p>\n            <p class=\"subtitle-download--error mb-0 fw-bold\">Reintente nuevamente</p>\n        </div>\n    }\n}","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UploadFilesComponent } from './upload-files.component';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCardModule } from '@angular/material/card';\nimport { UploadFilesFileComponent } from './components/upload-files-file/upload-files-file.component';\nimport { LucideAngularModule } from 'lucide-angular';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        MatDialogModule,\n        MatIconModule,\n        MatCardModule,\n        LucideAngularModule,\n        MatProgressBarModule\n    ],\n    declarations: [\n        UploadFilesComponent,\n        UploadFilesFileComponent\n    ],\n    exports:[\n        UploadFilesComponent\n    ],\n    providers: []\n})\nexport class KifUploadFilesModule { }\n","/*\n * Public API Surface of kif-lib-file\n */\n\nexport * from './upload-files.component';\nexport * from './upload-files.module';\nexport * from './interface';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.UploadFilesFileComponent"],"mappings":";;;;;;;;;;;;MAQa,wBAAwB,CAAA;AA6BjC,IAAA,WAAA,GAAA;QA5BA,IAAA,CAAA,UAAU,GAAG,cAAc;QAC3B,IAAA,CAAA,KAAK,GAAG,CAAC;QACT,IAAA,CAAA,YAAY,GAAG,QAAQ;QACvB,IAAA,CAAA,QAAQ,GAAG,IAAI;AACE,QAAA,IAAA,CAAA,UAAU,GAAuB,IAAI,YAAY,EAAE;AACnD,QAAA,IAAA,CAAA,SAAS,GAAuB,IAAI,YAAY,EAAE;AACnE;;;;AAIG;AACc,QAAA,IAAA,CAAA,cAAc,GAA6B,IAAI,YAAY,EAAE;AAE9E;;;AAGG;QACa,IAAA,CAAA,kBAAkB,GAAY,KAAK;AAEnD;;;AAGG;QACa,IAAA,CAAA,aAAa,GAAW,qBAAqB;QAEtD,IAAA,CAAA,WAAW,GAAU,CAAC;IAGf;IAEP,gBAAgB,GAAA;QACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC7C;IAEA,IAAoB,UAAU,CAAC,IAAgB,EAAA;AAC3C,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,UAAU,EAAE;IACrB;AAEA,IAAA,IAAW,UAAU,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW;IAC3B;IAEO,YAAY,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC1B;AAEO,IAAA,WAAW,CAAC,IAAmB,EAAA;QAClC,IAAI,IAAI,KAAK,IAAI,EAAE;AACf,YAAA,OAAO,EAAE;AACZ,QAAA;AACD,QAAA,OAAO,CAAA,EAAG,CAAC,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,GAAA,CAAK;IAC3C;;AAGA,IAAA,IAAW,WAAW,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;IAClF;AAEA;;;;AAIG;AACH,IAAA,IAAW,WAAW,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE;YAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI;AACtD,QAAA;QACD,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI;IAC/C;IAEO,UAAU,GAAA;;;AAGb,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,WAAW,GAAG,GAAG;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACrB;AACH,QAAA;AAED,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI;QACnC,IAAI,CAAC,IAAI,EAAE;YACP;AACH,QAAA;AAED,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAE/B,QAAA,MAAM,CAAC,WAAW,GAAG,MAAK;AACtB,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACxB,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,UAAU,GAAG,CAAC,KAAK,KAAI;YAC1B,IAAI,KAAK,CAAC,gBAAgB,EAAE;AACxB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;AACpE,YAAA;AACL,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACjB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,GAAG,GAAG;AAC1B,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,OAAO,GAAG,MAAK;AAClB,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;AACvC,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;IAClC;IAEO,YAAY,GAAA;;;AAGf,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW;YACjD,IAAI,CAAC,GAAG,EAAE;AACN,gBAAA,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC;gBACtE;AACH,YAAA;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACxC,YAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;AACtB,YAAA,IAAI,CAAC,GAAG,GAAG,UAAU;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;AACpD,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/B;AACH,QAAA;AAED,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;;QAGjC,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC;YAC5D;AACH,QAAA;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QAEzC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AAChD,QAAA,YAAY,CAAC,IAAI,GAAG,OAAO;AAE3B,QAAA,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI;AAGjC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;QAEvC,YAAY,CAAC,KAAK,EAAE;AAGpB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;QAGvC,UAAU,CAAC,MAAK;AACZ,YAAA,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;QAChC,CAAC,EAAE,GAAG,CAAC;IACX;+GA7JS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,8QCRrC,02FAwEM,EAAA,YAAA,EAAA,CAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDhEO,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;+BACI,uBAAuB,EAAA,QAAA,EAAA,02FAAA,EAAA;wDAQhB,UAAU,EAAA,CAAA;sBAA1B;gBACgB,SAAS,EAAA,CAAA;sBAAzB;gBAMgB,cAAc,EAAA,CAAA;sBAA9B;gBAMe,kBAAkB,EAAA,CAAA;sBAAjC;gBAMe,aAAa,EAAA,CAAA;sBAA5B;gBAWmB,UAAU,EAAA,CAAA;sBAA7B;;;MElCQ,oBAAoB,CAAA;AAmC7B,IAAA,WAAA,GAAA;QAlCA,IAAA,CAAA,UAAU,GAAG,MAAM;QACnB,IAAA,CAAA,WAAW,GAAG,YAAY;QAC1B,IAAA,CAAA,KAAK,GAAI,CAAC;QACH,IAAA,CAAA,OAAO,GAAW,gCAAgC;QAGzC,IAAA,CAAA,cAAc,GAAa,EAAE;QAC7B,IAAA,CAAA,aAAa,GAAY,KAAK;QAC9B,IAAA,CAAA,WAAW,GAAU,iCAAiC;QACtD,IAAA,CAAA,KAAK,GAAc,EAAE;QAE5B,IAAA,CAAA,eAAe,GAAY,KAAK;AACzC;;AAEG;QACa,IAAA,CAAA,eAAe,GAAY,KAAK;AAChD;;AAEG;QACa,IAAA,CAAA,kBAAkB,GAAY,KAAK;;QAEnC,IAAA,CAAA,aAAa,GAAW,qBAAqB;;AAG5C,QAAA,IAAA,CAAA,WAAW,GAA+B,IAAI,YAAY,EAAE;AAC5D,QAAA,IAAA,CAAA,WAAW,GAAuB,IAAI,YAAY,EAAE;AACpD,QAAA,IAAA,CAAA,WAAW,GAAuB,IAAI,YAAY,EAAE;;AAEpD,QAAA,IAAA,CAAA,cAAc,GAA6B,IAAI,YAAY,EAAE;QACvE,IAAA,CAAA,eAAe,GAAW,EAAE;QAC5B,IAAA,CAAA,YAAY,GAAU,EAAE;;QAGxB,IAAA,CAAA,cAAc,GAAY,KAAK;IACxB;AAEd,IAAA,IAAW,cAAc,GAAA;AACrB,QAAA,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;IACzD;IAEO,iBAAiB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAG,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D;AAEO,IAAA,gBAAgB,CAAC,KAAU,EAAA;QAC9B,MAAM,IAAI,GAAS,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE3C,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;AAE1B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC1B;AAGO,IAAA,UAAU,CAAC,KAAgB,EAAA;QAC9B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAE3B,QAAA,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK;YAEtC,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,eAAe,GAAG,KAAK;;AAG3B,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAClD,IAAI,CAAC,MAAM,EAAE;wBACT,eAAe,GAAG,IAAI;AACzB,oBAAA;AACJ,gBAAA;;gBAGD,IAAI,CAAC,eAAe,EAAE;;AAGtB,gBAAA,IAAI,eAAe,EAAE;AACjB,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAC1B,gBAAA;AACJ,YAAA;AAAM,iBAAA;gBACH,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAA;AACJ,QAAA;IACL;AAGQ,IAAA,oBAAoB,CAAC,IAAU,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC1B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE;AAE/D,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACb,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AAClB,QAAA;QAED,IAAI,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAC9D,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;AACf,YAAA;AAAM,iBAAA;AACH,gBAAA,IAAI,CAAC,OAAO,GAAG,gCAAgC;AAC/C,gBAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;AAChB,YAAA;AACJ,QAAA;AAAM,aAAA;AACH,YAAA,IAAI,CAAC,OAAO,GAAG,0CAA0C;AACzD,YAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,EAAE;AAC/C,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;AAChB,QAAA;IACL;AAGQ,IAAA,WAAW,CAAC,IAAU,EAAA;AAC1B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC1B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE;AAE/D,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACb,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AAClB,QAAA;QACD,IAAI,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAE9D,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBACtC,IAAI,CAAC,eAAe,EAAE;AACzB,YAAA;AAAM,iBAAA;AACH,gBAAA,IAAI,CAAC,OAAO,GAAG,gCAAgC;AAC/C,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;gBACvB,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBACvC,IAAI,CAAC,eAAe,EAAE;AACzB,gBAAA;AACJ,YAAA;AACJ,QAAA;AAAM,aAAA;AAEH,YAAA,IAAI,CAAC,OAAO,GAAG,0CAA0C;AACzD,YAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,EAAE;AAC/C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YACvB,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBACvC,IAAI,CAAC,eAAe,EAAE;AACzB,YAAA;AACJ,QAAA;IACL;AAEO,IAAA,eAAe,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI;QAC9B,IAAI,CAAC,eAAe,EAAE;IAC1B;AAEO,IAAA,YAAY,CAAC,KAAa,EAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE;IAC1B;AACO,IAAA,gBAAgB,CAAC,IAAgB,EAAA;AACpC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;IACO,mBAAmB,GAAA;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAC1B,QAAA;IACL;IACQ,eAAe,GAAA;QACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACrC;+GArKS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,qmBCTjC,q2FAwDC,EAAA,YAAA,EAAA,CAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,wBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FD/CY,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBALhC,SAAS;+BACI,kBAAkB,EAAA,QAAA,EAAA,q2FAAA,EAAA;wDASG,SAAS,EAAA,CAAA;sBAAvC,SAAS;uBAAC,WAAW;gBACN,aAAa,EAAA,CAAA;sBAA5B;gBACe,cAAc,EAAA,CAAA;sBAA7B;gBACe,aAAa,EAAA,CAAA;sBAA5B;gBACe,WAAW,EAAA,CAAA;sBAA1B;gBACe,KAAK,EAAA,CAAA;sBAApB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBAIe,eAAe,EAAA,CAAA;sBAA9B;gBAIe,kBAAkB,EAAA,CAAA;sBAAjC;gBAEe,aAAa,EAAA,CAAA;sBAA5B;gBAGgB,WAAW,EAAA,CAAA;sBAA3B;gBACgB,WAAW,EAAA,CAAA;sBAA3B;gBACgB,WAAW,EAAA,CAAA;sBAA3B;gBAEgB,cAAc,EAAA,CAAA;sBAA9B;;;MEVQ,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,iBARzB,oBAAoB;AACpB,YAAA,wBAAwB,aATxB,YAAY;YACZ,eAAe;YACf,aAAa;YACb,aAAa;YACb,mBAAmB;AACnB,YAAA,oBAAoB,aAOpB,oBAAoB,CAAA,EAAA,CAAA,CAAA;AAIf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAhBzB,YAAY;YACZ,eAAe;YACf,aAAa;YACb,aAAa;YACb,mBAAmB;YACnB,oBAAoB,CAAA,EAAA,CAAA,CAAA;;4FAWf,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAlBhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,aAAa;wBACb,mBAAmB;wBACnB;AACH,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACV,oBAAoB;wBACpB;AACH,qBAAA;AACD,oBAAA,OAAO,EAAC;wBACJ;AACH,qBAAA;AACD,oBAAA,SAAS,EAAE;AACd,iBAAA;;;AC3BD;;AAEG;;ACFH;;AAEG;;;;"}