UNPKG

ngx-file-drop

Version:

Angular ngx-file-drop - Simple desktop file and folder drag and drop

1 lines 26.3 kB
{"version":3,"file":"ngx-file-drop.mjs","sources":["../../../projects/ngx-file-drop/src/lib/ngx-file-drop-entry.ts","../../../projects/ngx-file-drop/src/lib/ngx-templates.directive.ts","../../../projects/ngx-file-drop/src/lib/ngx-file-drop.component.ts","../../../projects/ngx-file-drop/src/lib/ngx-file-drop.component.html","../../../projects/ngx-file-drop/src/lib/ngx-file-drop.module.ts","../../../projects/ngx-file-drop/src/ngx-file-drop.ts"],"sourcesContent":["import { FileSystemEntry, FileSystemFileEntry, FileSystemDirectoryEntry } from './dom.types';\r\n\r\n/**\r\n * fileEntry is an instance of {@link FileSystemFileEntry} or {@link FileSystemDirectoryEntry}.\r\n * Which one is it can be checked using {@link FileSystemEntry.isFile} or {@link FileSystemEntry.isDirectory}\r\n * properties of the given {@link FileSystemEntry}.\r\n */\r\nexport class NgxFileDropEntry {\r\n constructor(\r\n public relativePath: string,\r\n public fileEntry: FileSystemEntry\r\n ) {\r\n }\r\n}\r\n","import { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({ selector: '[ngx-file-drop-content-tmp]' })\r\nexport class NgxFileDropContentTemplateDirective {\r\n constructor(public template: TemplateRef<any>) { }\r\n}\r\n","import {\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Output,\r\n Renderer2,\r\n TemplateRef,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { Subscription, timer } from 'rxjs';\r\n\r\nimport { NgxFileDropEntry } from './ngx-file-drop-entry';\r\nimport { FileSystemDirectoryEntry, FileSystemEntry, FileSystemFileEntry } from './dom.types';\r\nimport { NgxFileDropContentTemplateDirective } from './ngx-templates.directive';\r\n\r\n@Component({\r\n selector: 'ngx-file-drop',\r\n templateUrl: './ngx-file-drop.component.html',\r\n styleUrls: ['./ngx-file-drop.component.scss'],\r\n})\r\nexport class NgxFileDropComponent implements OnDestroy {\r\n\r\n @Input()\r\n public accept: string = '*';\r\n\r\n @Input()\r\n public directory: boolean = false;\r\n\r\n @Input()\r\n public multiple: boolean = true;\r\n\r\n @Input()\r\n public dropZoneLabel: string = '';\r\n\r\n @Input()\r\n public dropZoneClassName: string = 'ngx-file-drop__drop-zone';\r\n\r\n @Input()\r\n public useDragEnter: boolean = false;\r\n\r\n @Input()\r\n public contentClassName: string = 'ngx-file-drop__content';\r\n\r\n @Input()\r\n public showBrowseBtn: boolean = false;\r\n\r\n @Input()\r\n public browseBtnClassName: string = 'btn btn-primary btn-xs ngx-file-drop__browse-btn';\r\n\r\n @Input()\r\n public browseBtnLabel: string = 'Browse files';\r\n\r\n @Output()\r\n public onFileDrop: EventEmitter<NgxFileDropEntry[]> = new EventEmitter();\r\n\r\n @Output()\r\n public onFileOver: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output()\r\n public onFileLeave: EventEmitter<any> = new EventEmitter();\r\n\r\n // custom templates\r\n @ContentChild(NgxFileDropContentTemplateDirective, { read: TemplateRef }) contentTemplate?: TemplateRef<any>;\r\n\r\n @ViewChild('fileSelector', { static: true })\r\n public fileSelector?: ElementRef;\r\n\r\n public isDraggingOverDropZone: boolean = false;\r\n\r\n private globalDraggingInProgress: boolean = false;\r\n private readonly globalDragStartListener: () => void;\r\n private readonly globalDragEndListener: () => void;\r\n\r\n private files: NgxFileDropEntry[] = [];\r\n private numOfActiveReadEntries: number = 0;\r\n\r\n private helperFormEl: HTMLFormElement | null = null;\r\n private fileInputPlaceholderEl: HTMLDivElement | null = null;\r\n\r\n private dropEventTimerSubscription: Subscription | null = null;\r\n\r\n private _disabled: boolean = false;\r\n\r\n public get disabled(): boolean { return this._disabled; }\r\n\r\n @Input()\r\n public set disabled(value: boolean) {\r\n this._disabled = (value != null && `${value}` !== 'false');\r\n }\r\n\r\n constructor(\r\n private zone: NgZone,\r\n private renderer: Renderer2\r\n ) {\r\n this.globalDragStartListener = this.renderer.listen('document', 'dragstart', (evt: Event) => {\r\n this.globalDraggingInProgress = true;\r\n });\r\n this.globalDragEndListener = this.renderer.listen('document', 'dragend', (evt: Event) => {\r\n this.globalDraggingInProgress = false;\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this.dropEventTimerSubscription) {\r\n this.dropEventTimerSubscription.unsubscribe();\r\n this.dropEventTimerSubscription = null;\r\n }\r\n this.globalDragStartListener();\r\n this.globalDragEndListener();\r\n this.files = [];\r\n this.helperFormEl = null;\r\n this.fileInputPlaceholderEl = null;\r\n }\r\n\r\n public onDragOver(event: DragEvent): void {\r\n if (this.useDragEnter) {\r\n this.preventAndStop(event);\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'copy';\r\n }\r\n } else if (!this.isDropzoneDisabled() && !this.useDragEnter && event.dataTransfer) {\r\n if (!this.isDraggingOverDropZone) {\r\n this.isDraggingOverDropZone = true;\r\n this.onFileOver.emit(event);\r\n }\r\n this.preventAndStop(event);\r\n event.dataTransfer.dropEffect = 'copy';\r\n }\r\n }\r\n\r\n public onDragEnter(event: Event): void {\r\n if (!this.isDropzoneDisabled() && this.useDragEnter) {\r\n if (!this.isDraggingOverDropZone) {\r\n this.isDraggingOverDropZone = true;\r\n this.onFileOver.emit(event);\r\n }\r\n this.preventAndStop(event);\r\n }\r\n }\r\n\r\n public onDragLeave(event: Event): void {\r\n if (!this.isDropzoneDisabled()) {\r\n if (this.isDraggingOverDropZone) {\r\n this.isDraggingOverDropZone = false;\r\n this.onFileLeave.emit(event);\r\n }\r\n this.preventAndStop(event);\r\n }\r\n }\r\n\r\n public dropFiles(event: DragEvent): void {\r\n if (this.isDropzoneDisabled()) {\r\n return;\r\n }\r\n this.isDraggingOverDropZone = false;\r\n if (event.dataTransfer) {\r\n let items: FileList | DataTransferItemList;\r\n if (event.dataTransfer.items) {\r\n items = event.dataTransfer.items;\r\n } else {\r\n items = event.dataTransfer.files;\r\n }\r\n this.preventAndStop(event);\r\n this.checkFiles(items);\r\n }\r\n }\r\n\r\n public openFileSelector = (event?: MouseEvent): void => {\r\n if (this.fileSelector && this.fileSelector.nativeElement) {\r\n (this.fileSelector.nativeElement as HTMLInputElement).click();\r\n }\r\n };\r\n\r\n /**\r\n * Processes the change event of the file input and adds the given files.\r\n * @param Event event\r\n */\r\n public uploadFiles(event: Event): void {\r\n if (this.isDropzoneDisabled()) {\r\n return;\r\n }\r\n if (event.target) {\r\n const items = (event.target as HTMLInputElement).files || ([] as any);\r\n this.checkFiles(items);\r\n this.resetFileInput();\r\n }\r\n }\r\n\r\n private getFakeDropEntry(file: File): NgxFileDropEntry {\r\n const fakeFileEntry: FileSystemFileEntry = {\r\n name: file.name,\r\n isDirectory: false,\r\n isFile: true,\r\n file: <T>(callback: (filea: File) => T) => callback(file),\r\n };\r\n return new NgxFileDropEntry(fakeFileEntry.name, fakeFileEntry);\r\n }\r\n\r\n private checkFile(item: DataTransferItem | File): void {\r\n if (!item) {\r\n return;\r\n }\r\n // if (\"getAsFile\" in item) {\r\n // const file = item.getAsFile();\r\n // if (file) {\r\n // this.addToQueue(\r\n // this.getFakeDropEntry(file)\r\n // );\r\n // return;\r\n // }\r\n // }\r\n if (\"webkitGetAsEntry\" in item) {\r\n let entry = item.webkitGetAsEntry();\r\n if (entry) {\r\n if (entry.isFile) {\r\n const toUpload: NgxFileDropEntry = new NgxFileDropEntry(entry.name, entry);\r\n this.addToQueue(toUpload);\r\n\r\n } else if (entry.isDirectory) {\r\n this.traverseFileTree(entry, entry.name);\r\n }\r\n return;\r\n }\r\n }\r\n this.addToQueue(this.getFakeDropEntry((item as File)));\r\n }\r\n\r\n private checkFiles(items: FileList | DataTransferItemList): void {\r\n for (let i = 0; i < items.length; i++) {\r\n this.checkFile(items[i]);\r\n }\r\n\r\n if (this.dropEventTimerSubscription) {\r\n this.dropEventTimerSubscription.unsubscribe();\r\n }\r\n this.dropEventTimerSubscription = timer(200, 200)\r\n .subscribe(() => {\r\n if (this.files.length > 0 && this.numOfActiveReadEntries === 0) {\r\n const files = this.files;\r\n this.files = [];\r\n this.onFileDrop.emit(files);\r\n }\r\n });\r\n }\r\n\r\n private traverseFileTree(item: FileSystemEntry, path: string): void {\r\n if (item.isFile) {\r\n const toUpload: NgxFileDropEntry = new NgxFileDropEntry(path, item);\r\n this.files.push(toUpload);\r\n\r\n } else {\r\n path = path + '/';\r\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\r\n let entries: FileSystemEntry[] = [];\r\n\r\n const readEntries = () => {\r\n this.numOfActiveReadEntries++;\r\n dirReader.readEntries((result) => {\r\n if (!result.length) {\r\n // add empty folders\r\n if (entries.length === 0) {\r\n const toUpload: NgxFileDropEntry = new NgxFileDropEntry(path, item);\r\n this.zone.run(() => {\r\n this.addToQueue(toUpload);\r\n });\r\n\r\n } else {\r\n for (let i = 0; i < entries.length; i++) {\r\n this.zone.run(() => {\r\n this.traverseFileTree(entries[i], path + entries[i].name);\r\n });\r\n }\r\n }\r\n\r\n } else {\r\n // continue with the reading\r\n entries = entries.concat(result);\r\n readEntries();\r\n }\r\n\r\n this.numOfActiveReadEntries--;\r\n });\r\n };\r\n\r\n readEntries();\r\n }\r\n }\r\n\r\n /**\r\n * Clears any added files from the file input element so the same file can subsequently be added multiple times.\r\n */\r\n private resetFileInput(): void {\r\n if (this.fileSelector && this.fileSelector.nativeElement) {\r\n const fileInputEl = this.fileSelector.nativeElement as HTMLInputElement;\r\n const fileInputContainerEl = fileInputEl.parentElement;\r\n const helperFormEl = this.getHelperFormElement();\r\n const fileInputPlaceholderEl = this.getFileInputPlaceholderElement();\r\n\r\n // Just a quick check so we do not mess up the DOM (will never happen though).\r\n if (fileInputContainerEl !== helperFormEl) {\r\n // Insert the form input placeholder in the DOM before the form input element.\r\n this.renderer.insertBefore(fileInputContainerEl, fileInputPlaceholderEl, fileInputEl);\r\n // Add the form input as child of the temporary form element, removing the form input from the DOM.\r\n this.renderer.appendChild(helperFormEl, fileInputEl);\r\n // Reset the form, thus clearing the input element of any files.\r\n helperFormEl.reset();\r\n // Add the file input back to the DOM in place of the file input placeholder element.\r\n this.renderer.insertBefore(fileInputContainerEl, fileInputEl, fileInputPlaceholderEl);\r\n // Remove the input placeholder from the DOM\r\n this.renderer.removeChild(fileInputContainerEl, fileInputPlaceholderEl);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get a cached HTML form element as a helper element to clear the file input element.\r\n */\r\n private getHelperFormElement(): HTMLFormElement {\r\n if (!this.helperFormEl) {\r\n this.helperFormEl = this.renderer.createElement('form') as HTMLFormElement;\r\n }\r\n\r\n return this.helperFormEl;\r\n }\r\n\r\n /**\r\n * Get a cached HTML div element to be used as placeholder for the file input element when clearing said element.\r\n */\r\n private getFileInputPlaceholderElement(): HTMLDivElement {\r\n if (!this.fileInputPlaceholderEl) {\r\n this.fileInputPlaceholderEl = this.renderer.createElement('div') as HTMLDivElement;\r\n }\r\n\r\n return this.fileInputPlaceholderEl;\r\n }\r\n\r\n private isDropzoneDisabled(): boolean {\r\n return (this.globalDraggingInProgress || this.disabled);\r\n }\r\n\r\n private addToQueue(item: NgxFileDropEntry): void {\r\n this.files.push(item);\r\n }\r\n\r\n private preventAndStop(event: Event): void {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n}\r\n","<div [className]=\"dropZoneClassName\"\r\n [class.ngx-file-drop__drop-zone--over]=\"isDraggingOverDropZone\"\r\n (drop)=\"dropFiles($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <div [className]=\"contentClassName\">\r\n <input \r\n type=\"file\" \r\n #fileSelector \r\n [accept]=\"accept\" \r\n [attr.directory]=\"directory || undefined\" \r\n [attr.webkitdirectory]=\"directory || undefined\"\r\n [attr.mozdirectory]=\"directory || undefined\"\r\n [attr.msdirectory]=\"directory || undefined\"\r\n [attr.odirectory]=\"directory || undefined\"\r\n [multiple]=\"multiple\"\r\n (change)=\"uploadFiles($event)\" \r\n class=\"ngx-file-drop__file-input\" \r\n />\r\n\r\n <ng-template #defaultContentTemplate>\r\n <div *ngIf=\"dropZoneLabel\" class=\"ngx-file-drop__drop-zone-label\">{{dropZoneLabel}}</div>\r\n <div *ngIf=\"showBrowseBtn\">\r\n <input type=\"button\" [className]=\"browseBtnClassName\" value=\"{{browseBtnLabel}}\" (click)=\"openFileSelector($event)\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"contentTemplate || defaultContentTemplate\"\r\n [ngTemplateOutletContext]=\"{ openFileSelector: openFileSelector }\">\r\n </ng-template>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgxFileDropComponent } from './ngx-file-drop.component';\r\nimport { NgxFileDropContentTemplateDirective } from './ngx-templates.directive';\r\n\r\n@NgModule({\r\n declarations: [\r\n NgxFileDropComponent,\r\n NgxFileDropContentTemplateDirective,\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n NgxFileDropComponent,\r\n NgxFileDropContentTemplateDirective,\r\n ],\r\n providers: [],\r\n bootstrap: [\r\n NgxFileDropComponent\r\n ],\r\n})\r\nexport class NgxFileDropModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAEA;;;;AAIG;MACU,gBAAgB,CAAA;IACzB,WACW,CAAA,YAAoB,EACpB,SAA0B,EAAA;QAD1B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAQ;QACpB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAiB;KAEpC;AACJ;;MCVY,mCAAmC,CAAA;AAC9C,IAAA,WAAA,CAAmB,QAA0B,EAAA;QAA1B,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAkB;KAAK;8GADvC,mCAAmC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAnC,mCAAmC,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAnC,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAD/C,SAAS;mBAAC,EAAE,QAAQ,EAAE,6BAA6B,EAAE,CAAA;;;MCsBzC,oBAAoB,CAAA;IA+D/B,IAAW,QAAQ,KAAc,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE;IAEzD,IACW,QAAQ,CAAC,KAAc,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS,IAAI,KAAK,IAAI,IAAI,IAAI,CAAA,EAAG,KAAK,CAAA,CAAE,KAAK,OAAO,CAAC,CAAC;KAC5D;IAED,WACU,CAAA,IAAY,EACZ,QAAmB,EAAA;QADnB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QACZ,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAW;QArEtB,IAAM,CAAA,MAAA,GAAW,GAAG,CAAC;QAGrB,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;QAG3B,IAAQ,CAAA,QAAA,GAAY,IAAI,CAAC;QAGzB,IAAa,CAAA,aAAA,GAAW,EAAE,CAAC;QAG3B,IAAiB,CAAA,iBAAA,GAAW,0BAA0B,CAAC;QAGvD,IAAY,CAAA,YAAA,GAAY,KAAK,CAAC;QAG9B,IAAgB,CAAA,gBAAA,GAAW,wBAAwB,CAAC;QAGpD,IAAa,CAAA,aAAA,GAAY,KAAK,CAAC;QAG/B,IAAkB,CAAA,kBAAA,GAAW,kDAAkD,CAAC;QAGhF,IAAc,CAAA,cAAA,GAAW,cAAc,CAAC;AAGxC,QAAA,IAAA,CAAA,UAAU,GAAqC,IAAI,YAAY,EAAE,CAAC;AAGlE,QAAA,IAAA,CAAA,UAAU,GAAsB,IAAI,YAAY,EAAE,CAAC;AAGnD,QAAA,IAAA,CAAA,WAAW,GAAsB,IAAI,YAAY,EAAE,CAAC;QAQpD,IAAsB,CAAA,sBAAA,GAAY,KAAK,CAAC;QAEvC,IAAwB,CAAA,wBAAA,GAAY,KAAK,CAAC;QAI1C,IAAK,CAAA,KAAA,GAAuB,EAAE,CAAC;QAC/B,IAAsB,CAAA,sBAAA,GAAW,CAAC,CAAC;QAEnC,IAAY,CAAA,YAAA,GAA2B,IAAI,CAAC;QAC5C,IAAsB,CAAA,sBAAA,GAA0B,IAAI,CAAC;QAErD,IAA0B,CAAA,0BAAA,GAAwB,IAAI,CAAC;QAEvD,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;AAsF5B,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,KAAkB,KAAU;YACrD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACvD,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAkC,CAAC,KAAK,EAAE,CAAC;AAC/D,aAAA;AACH,SAAC,CAAC;AA7EA,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,GAAU,KAAI;AAC1F,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACvC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,GAAU,KAAI;AACtF,YAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;AACxC,SAAC,CAAC,CAAC;KACJ;IAEM,WAAW,GAAA;QAChB,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACnC,YAAA,IAAI,CAAC,0BAA0B,CAAC,WAAW,EAAE,CAAC;AAC9C,YAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;AACxC,SAAA;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;KACpC;AAEM,IAAA,UAAU,CAAC,KAAgB,EAAA;QAChC,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,gBAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;AACxC,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,EAAE;AACjF,YAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChC,gBAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACnC,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,aAAA;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,YAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;AACxC,SAAA;KACF;AAEM,IAAA,WAAW,CAAC,KAAY,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;AACnD,YAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChC,gBAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACnC,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,aAAA;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC5B,SAAA;KACF;AAEM,IAAA,WAAW,CAAC,KAAY,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9B,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,gBAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;AACpC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,aAAA;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC5B,SAAA;KACF;AAEM,IAAA,SAAS,CAAC,KAAgB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC7B,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACpC,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,YAAA,IAAI,KAAsC,CAAC;AAC3C,YAAA,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE;AAC5B,gBAAA,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;AAClC,aAAA;AAAM,iBAAA;AACL,gBAAA,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;AAClC,aAAA;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACxB,SAAA;KACF;AAQD;;;AAGG;AACI,IAAA,WAAW,CAAC,KAAY,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC7B,OAAO;AACR,SAAA;QACD,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,IAAK,EAAU,CAAC;AACtE,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,SAAA;KACF;AAEO,IAAA,gBAAgB,CAAC,IAAU,EAAA;AACjC,QAAA,MAAM,aAAa,GAAwB;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,CAAI,QAA4B,KAAK,QAAQ,CAAC,IAAI,CAAC;SAC1D,CAAC;QACF,OAAO,IAAI,gBAAgB,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KAChE;AAEO,IAAA,SAAS,CAAC,IAA6B,EAAA;QAC7C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;AACR,SAAA;;;;;;;;;;QAUD,IAAI,kBAAkB,IAAI,IAAI,EAAE;AAC9B,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACpC,YAAA,IAAI,KAAK,EAAE;gBACT,IAAI,KAAK,CAAC,MAAM,EAAE;oBAChB,MAAM,QAAQ,GAAqB,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3E,oBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAE3B,iBAAA;qBAAM,IAAI,KAAK,CAAC,WAAW,EAAE;oBAC5B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1C,iBAAA;gBACD,OAAO;AACR,aAAA;AACF,SAAA;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAE,IAAa,CAAC,CAAC,CAAC;KACxD;AAEO,IAAA,UAAU,CAAC,KAAsC,EAAA;AACvD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,SAAA;QAED,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACnC,YAAA,IAAI,CAAC,0BAA0B,CAAC,WAAW,EAAE,CAAC;AAC/C,SAAA;QACD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;aAC9C,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC,EAAE;AAC9D,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACzB,gBAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AAChB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,aAAA;AACH,SAAC,CAAC,CAAC;KACN;IAEO,gBAAgB,CAAC,IAAqB,EAAE,IAAY,EAAA;QAC1D,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,QAAQ,GAAqB,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE3B,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAClB,YAAA,MAAM,SAAS,GAAI,IAAiC,CAAC,YAAY,EAAE,CAAC;YACpE,IAAI,OAAO,GAAsB,EAAE,CAAC;YAEpC,MAAM,WAAW,GAAG,MAAK;gBACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC9B,gBAAA,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,KAAI;AAC/B,oBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAElB,wBAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;4BACxB,MAAM,QAAQ,GAAqB,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpE,4BAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,gCAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC5B,6BAAC,CAAC,CAAC;AAEJ,yBAAA;AAAM,6BAAA;AACL,4BAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gCAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,oCAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5D,iCAAC,CAAC,CAAC;AACJ,6BAAA;AACF,yBAAA;AAEF,qBAAA;AAAM,yBAAA;;AAEL,wBAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACjC,wBAAA,WAAW,EAAE,CAAC;AACf,qBAAA;oBAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAChC,iBAAC,CAAC,CAAC;AACL,aAAC,CAAC;AAEF,YAAA,WAAW,EAAE,CAAC;AACf,SAAA;KACF;AAED;;AAEG;IACK,cAAc,GAAA;QACpB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACxD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,aAAiC,CAAC;AACxE,YAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,aAAa,CAAC;AACvD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;AACjD,YAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAC;;YAGrE,IAAI,oBAAoB,KAAK,YAAY,EAAE;;gBAEzC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,WAAW,CAAC,CAAC;;gBAEtF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;;gBAErD,YAAY,CAAC,KAAK,EAAE,CAAC;;gBAErB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,oBAAoB,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;;gBAEtF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AACzE,aAAA;AACF,SAAA;KACF;AAED;;AAEG;IACK,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAoB,CAAC;AAC5E,SAAA;QAED,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;AAED;;AAEG;IACK,8BAA8B,GAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAChC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAmB,CAAC;AACpF,SAAA;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC;KACpC;IAEO,kBAAkB,GAAA;QACxB,QAAQ,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,QAAQ,EAAE;KACzD;AAEO,IAAA,UAAU,CAAC,IAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACvB;AAEO,IAAA,cAAc,CAAC,KAAY,EAAA;QACjC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;KACxB;8GAvUU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EA0CjB,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,mCAAmC,EAAU,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,yJClExE,64CAkCA,EAAA,MAAA,EAAA,CAAA,mWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDVa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBALhC,SAAS;+BACE,eAAe,EAAA,QAAA,EAAA,64CAAA,EAAA,MAAA,EAAA,CAAA,mWAAA,CAAA,EAAA,CAAA;qHAOlB,MAAM,EAAA,CAAA;sBADZ,KAAK;gBAIC,SAAS,EAAA,CAAA;sBADf,KAAK;gBAIC,QAAQ,EAAA,CAAA;sBADd,KAAK;gBAIC,aAAa,EAAA,CAAA;sBADnB,KAAK;gBAIC,iBAAiB,EAAA,CAAA;sBADvB,KAAK;gBAIC,YAAY,EAAA,CAAA;sBADlB,KAAK;gBAIC,gBAAgB,EAAA,CAAA;sBADtB,KAAK;gBAIC,aAAa,EAAA,CAAA;sBADnB,KAAK;gBAIC,kBAAkB,EAAA,CAAA;sBADxB,KAAK;gBAIC,cAAc,EAAA,CAAA;sBADpB,KAAK;gBAIC,UAAU,EAAA,CAAA;sBADhB,MAAM;gBAIA,UAAU,EAAA,CAAA;sBADhB,MAAM;gBAIA,WAAW,EAAA,CAAA;sBADjB,MAAM;gBAImE,eAAe,EAAA,CAAA;sBAAxF,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,mCAAmC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;gBAGjE,YAAY,EAAA,CAAA;sBADlB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAsBhC,QAAQ,EAAA,CAAA;sBADlB,KAAK;;;MEnEK,iBAAiB,CAAA;8GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;+GAAjB,iBAAiB,EAAA,SAAA,EAAA,CAH1B,oBAAoB,CAAA,EAAA,YAAA,EAAA,CAZpB,oBAAoB;YACpB,mCAAmC,CAAA,EAAA,OAAA,EAAA,CAGnC,YAAY,CAAA,EAAA,OAAA,EAAA,CAGZ,oBAAoB;YACpB,mCAAmC,CAAA,EAAA,CAAA,CAAA,EAAA;AAO1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAX1B,YAAY,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAWH,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAjB7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,oBAAoB;wBACpB,mCAAmC;AACpC,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,oBAAoB;wBACpB,mCAAmC;AACpC,qBAAA;AACD,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,SAAS,EAAE;wBACT,oBAAoB;AACrB,qBAAA;AACF,iBAAA,CAAA;;;ACrBD;;AAEG;;;;"}