@servicemind.tis/tis-image-and-file-upload-and-view 1.2.26 → 1.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"servicemind.tis-tis-image-and-file-upload-and-view.mjs","sources":["../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view.service.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-pdf-viewer/tis-pdf-viewer.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-pdf-viewer/tis-pdf-viewer.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-excel-file-viewer/tis-excel-file-viewer.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-excel-file-viewer/tis-excel-file-viewer.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-video/tis-video.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-video/tis-video.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-file-viewer.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-file-viewer.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-preview-image/tis-preview-image.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-preview-image/tis-preview-image.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-error-dialog/tis-error-dialog.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-error-dialog/tis-error-dialog.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/services/tis-helper.service.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-confirmation-dialog/tis-confirmation-dialog.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-confirmation-dialog/tis-confirmation-dialog.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/services/tis-remote-upload.service.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-qr-code-dialog/tis-qr-code-dialog.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-qr-code-dialog/tis-qr-code-dialog.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view.module.ts","../../../projects/tis-image-and-file-upload-and-view/src/public-api.ts","../../../projects/tis-image-and-file-upload-and-view/src/servicemind.tis-tis-image-and-file-upload-and-view.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TisImageAndFileUploadAndViewService {\n\n constructor() { }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core';\nimport type { SafeUrl } from '@angular/platform-browser';\nimport { NgxExtendedPdfViewerComponent } from 'ngx-extended-pdf-viewer';\n\n@Component({\n selector: 'tis-pdf-viewer',\n standalone: false,\n templateUrl: './tis-pdf-viewer.component.html',\n styleUrl: './tis-pdf-viewer.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TisPdfViewerComponent implements OnChanges {\n\n loading = true;\n isError = false;\n\n @Input({ required: true }) src!: string;\n\n @ViewChild(NgxExtendedPdfViewerComponent, { static: false })\n private pdfViewer!: NgxExtendedPdfViewerComponent;\n\n constructor(\n private cdRef: ChangeDetectorRef\n ) {\n\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if(changes['src']) {\n console.log('Pdf Viewer: src changed: ', changes['src']);\n }\n }\n\n destroyPdfViewer() {\n this.pdfViewer.ngOnDestroy();\n }\n\n loadingFinished(ev: any) {\n console.log('PDF Loaded', ev)\n this.loading = false;\n this.cdRef.detectChanges();\n this.pdfViewer.height = 'auto';\n }\n\n loadingError(ev: any) {\n console.log('PDF Loading Error:', ev);\n this.isError = true;\n this.loading = false;\n this.cdRef.detectChanges();\n }\n\n}\n","@if (isError) {\n <div class=\"flex tis-justify-content-center py-4\">\n <h3> Some Error Occurred in Loading PDF File. Please Try again. </h3>\n </div>\n} \n\n@if (!isError) {\n <div class=\"tis-extended-pdf-viewer\">\n @if(loading) {\n <div class=\"loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"50\"></mat-progress-spinner>\n </div>\n }\n <ngx-extended-pdf-viewer [src]=\"src\"\n [showToolbar]=\"true\"\n [showSidebarButton]=\"true\"\n [showFindButton]=\"false\"\n [showPagingButtons]=\"true\"\n [showDrawEditor]=\"false\"\n [showStampEditor]=\"false\"\n [showTextEditor]=\"false\"\n [showZoomButtons]=\"true\"\n [showPresentationModeButton]=\"false\"\n [showOpenFileButton]=\"false\"\n [showPrintButton]=\"true\"\n [showDownloadButton]=\"true\"\n [showSecondaryToolbarButton]=\"false\"\n [showRotateButton]=\"true\"\n [showHandToolButton]=\"false\"\n [showScrollingButton]=\"true\"\n [showSpreadButton]=\"false\"\n [showPropertiesButton]=\"false\"\n [zoom]=\"'page-fit'\"\n (pdfDownloaded)=\"loadingFinished($event)\"\n (pdfLoaded)=\"loadingFinished($event)\"\n (pdfLoadingFailed)=\"loadingError($event)\"\n >\n </ngx-extended-pdf-viewer>\n </div>\n}\n \n ","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport type { SafeUrl } from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'tis-excel-file-viewer',\n standalone: false,\n templateUrl: './tis-excel-file-viewer.component.html',\n styleUrl: './tis-excel-file-viewer.component.css'\n})\nexport class TisExcelFileViewerComponent implements OnChanges {\n\n @Input({ required: true }) src!: SafeUrl;\n\n baseUrl = `https://view.officeapps.live.com/op/embed.aspx?src=`;\n iframeSrc: SafeUrl | null = null;\n\n constructor(private sanitizer: DomSanitizer ) {\n\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['src']) {\n console.log('Url Received', this.src);\n const src = this.baseUrl + this.src;\n this.iframeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(src);\n console.log('Iframe src:', this.iframeSrc);\n }\n }\n\n \n}\n","<div class=\"bg-slate-900 w-full h-5\">\n \n</div>\n<div class=\"aspect-w-16 aspect-h-9\">\n <iframe class=\"w-full h-full\" [src]=\"iframeSrc\" frameborder='0'>This is an embedded <a target='_blank'\n href='http://office.com'>Microsoft Office</a> document, powered by <a target='_blank'\n href='http://office.com/webapps'>Office Online</a>.</iframe>\n</div>","import { Component, Input, SimpleChanges } from '@angular/core';\nimport type { SafeUrl } from '@angular/platform-browser';\n\n@Component({\n selector: 'tis-video',\n standalone: false,\n templateUrl: './tis-video.component.html',\n styleUrl: './tis-video.component.css'\n})\nexport class TisVideoComponent {\n @Input({ required: true }) src!: SafeUrl;\n type!: string;\n\n constructor() {}\n\n ngOnInit(): void {\n if(this.src){\n this.type = this.getFileType(String(this.src));\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if(changes['src']) {\n console.log('Pdf Viewer: src changed: ', changes['src']);\n this.type = this.getFileType(changes['src'].currentValue);\n }\n }\n\n getFileType(text: string) {\n let txtArr = text.split('.');\n let fileType = txtArr[txtArr.length - 1];\n return fileType.toLocaleLowerCase() == 'mov' ? 'mp4': fileType.toLocaleLowerCase();\n }\n}\n","<video controls autoplay style=\"min-width: 300px; max-width: 90vw; min-height: 300px; max-height: 90vh;\">\n <source [src]=\"src\" type=\"video/{{type}}\">\n Your browser does not support the video tag.\n</video>","import { Component, Inject, ViewChild } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport type { FileViewerDialogData } from '../interfaces';\nimport { TisPdfViewerComponent } from './tis-pdf-viewer/tis-pdf-viewer.component';\n\n@Component({\n selector: 'tis-file-viewer',\n standalone: false,\n templateUrl: './tis-file-viewer.component.html',\n styleUrl: './tis-file-viewer.component.css'\n})\nexport class TisFileViewerComponent {\n safeUrl!: string;\n\n @ViewChild(TisPdfViewerComponent, { static: false }) private pdfViewer!: TisPdfViewerComponent;\n\n constructor(\n public dialogRef: MatDialogRef<TisFileViewerComponent>,\n @Inject(MAT_DIALOG_DATA) public data: FileViewerDialogData,\n private sanitizer: DomSanitizer\n ) {\n console.log('File Viewer Data:', data);\n\n this.safeUrl = this.data.src;\n console.log('FileViewer SafeUrl:', this.safeUrl);\n\n dialogRef.beforeClosed().subscribe((result) => {\n console.log('The dialog is about to be closed');\n // Here's the interesting bit:\n if (this.pdfViewer) {\n this.pdfViewer.destroyPdfViewer();\n console.log('PDF Viewer Destroyed.');\n }\n });\n }\n\n downloadFile() {\n var el = document.createElement(\"a\");\n el.setAttribute(\"href\", this.safeUrl);\n el.setAttribute(\"download\", 'Video-' + new Date().valueOf());\n document.body.appendChild(el);\n el.click();\n el.remove();\n }\n\n onClose(status: boolean | null): void {\n this.dialogRef.close(status);\n }\n}\n","@if(safeUrl) {\n <div class=\"tis-pdf-viewer\">\n @if(data.fileType == 'video') {\n <mat-icon class=\"download-btn\" (click)=\"downloadFile()\" matTooltip=\"Download\">download</mat-icon>\n <!-- <button mat-icon-button color=\"primary\" class=\"download-btn\" >\n <mat-icon>download</mat-icon>\n </button> -->\n }\n @else {\n <button mat-mini-fab color=\"primary\" class=\"close-btn\" (click)=\"onClose(null)\" matTooltip=\"Close\">\n <mat-icon>clear</mat-icon>\n </button>\n }\n @if(data.fileType == 'pdf') {\n <tis-pdf-viewer [src]=\"safeUrl\"></tis-pdf-viewer>\n }\n @else if(data.fileType == 'excel') {\n <tis-excel-file-viewer [src]=\"safeUrl\"></tis-excel-file-viewer>\n }\n @else if(data.fileType == 'video') {\n <tis-video [src]=\"safeUrl\"></tis-video>\n }\n </div>\n}\n","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\n@Component({\n selector: 'tis-preview-image',\n standalone: false,\n templateUrl: './tis-preview-image.component.html',\n styleUrl: './tis-preview-image.component.css'\n})\nexport class TisPreviewImageComponent {\n width = 850;\n height = 650;\n isLoading: boolean = true;\n isLandscape: boolean | undefined;\n orientation: string | undefined;\n imageWidth: number | undefined;\n imageHeight: number | undefined;\n\n\n constructor(\n public dialogRef: MatDialogRef<TisPreviewImageComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n ) { }\n\n ngOnInit(): void {\n if (this.data.url) {\n setTimeout(() => {\n this.checkImageOrientation(this.data.url);\n }, 500);\n }\n }\n\n checkImageOrientation(imageUrl: string): void {\n const img = new Image();\n img.src = imageUrl;\n this.isLoading = true;\n\n img.onload = () => {\n this.imageWidth = img.naturalWidth;\n this.imageHeight = img.naturalHeight;\n this.isLandscape = img.naturalWidth > img.naturalHeight;\n this.orientation = this.isLandscape ? 'landscape-image' : 'portrait-image';\n this.isLoading = false;\n };\n\n img.onerror = () => {\n console.error('Failed to load image.');\n this.isLoading = false;\n };\n }\n\n onClose() {\n this.dialogRef.close()\n }\n}\n","@if(isLoading){\n <div style=\"width: 350px; height: 350px; display: flex; justify-content: center; align-items: center\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"80\"></mat-progress-spinner>\n </div>\n}\n@else{\n <div class=\"w-100 dialog-container\" appScrolling style=\"--img-width: {{(imageWidth && imageWidth < 700) ? imageWidth : 650}}px; --img-height: {{(imageHeight && imageHeight < 600) ? imageHeight : 600}}px\">\n <mat-icon\n class=\"close-icon\"\n (click)=\"onClose()\">cancel</mat-icon>\n <img \n *ngIf=\"data.url\" \n [src]=\"data.url\" \n alt=\"preview-image\" \n class=\"preview-image {{orientation}}\">\n </div>\n}","import { Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'lib-tis-error-dialog',\n standalone: false,\n templateUrl: './tis-error-dialog.component.html',\n styleUrl: './tis-error-dialog.component.css'\n})\nexport class TisErrorDialogComponent {\n constructor(\n public dialogRef: MatDialogRef<TisErrorDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n ) {}\n\n onClose(): void {\n this.dialogRef.close();\n }\n}\n","<h1 mat-dialog-title>\n <mat-icon class=\"{{data?.iconClass}}\">{{data?.icon}}</mat-icon>\n {{data?.title}}\n</h1>\n<div mat-dialog-content>\n {{data?.message}}\n</div>\n<div mat-dialog-actions>\n <button mat-button class=\"tis-text-upper {{data?.buttonClass ?? 'tis-btn-primary'}}\" (click)=\"onClose()\" cdkFocusInitial *ngIf=\"data?.buttonText && data?.buttonText != ''\">{{data?.buttonText}}</button>\n</div>","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar, MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar';\nimport { TisErrorDialogComponent } from '../tis-error-dialog/tis-error-dialog.component';\nimport { Observable } from 'rxjs';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TisHelperService {\n\n constructor(\n private snackBar: MatSnackBar,\n private dialog: MatDialog,\n private http: HttpClient\n ) { }\n\n showHttpErrorMsg(error: HttpErrorResponse, duration = 5000) {\n console.log('httpError: ', error);\n\n let errorMessage = 'Some Unknown Error Occurred.';\n let errorCode = 'Unknown Error';\n const httpError = error;\n\n if (httpError.status >= 400) {\n const errorFromServer = httpError.error?.errors || httpError.error || [];\n if (Array.isArray(errorFromServer) && errorFromServer.length > 0) {\n errorMessage = errorFromServer[0].message;\n errorCode = errorFromServer[0].code;\n }\n } else if (httpError.status < 100) {\n errorMessage = httpError.message;\n errorCode = httpError.statusText;\n }\n\n if (errorCode == \"VALIDATION_ERROR\" || errorCode == \"NOT_FOUND_ERROR\" || errorCode == \"THIRD_PARTY_API_ERROR\") {\n let confirmBoxData: any = {\n title: \"Error !\",\n message: errorMessage,\n icon: \"error\",\n iconClass: \"tis-text-danger\",\n buttonText: \"Ok\",\n buttonClass: \"tis-btn-primary\",\n };\n\n const dialogRef: MatDialogRef<TisErrorDialogComponent> = this.dialog.open(TisErrorDialogComponent, {\n width: \"550px\",\n panelClass: ['tis-simple-confirmation'],\n data: confirmBoxData,\n disableClose: false,\n });\n\n return dialogRef;\n\n } else {\n const snackbarRef: MatSnackBarRef<TextOnlySnackBar> = this.snackBar.open(errorMessage, 'Error', { duration: duration });\n return snackbarRef;\n }\n\n }\n\n showSuccessMsg(message: string, title: string, duration = 5000) {\n this.snackBar.open(message, title, {\n duration: duration\n })\n }\n\n showErrorMsg(message: string, title: string, duration = 5000) {\n this.snackBar.open(message, title, {\n duration: duration\n })\n }\n\n async compressFile(image: any, mimeType: string): Promise<Blob> {\n\n let imageData = image;\n\n let imageBlob: Blob = this.dataURItoBlob(imageData.split(',')[1], mimeType);\n return imageBlob;\n }\n\n dataURItoBlob(dataURI: string, mimeType: string): Blob {\n const byteString = window.atob(dataURI);\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const int8Array = new Uint8Array(arrayBuffer);\n for (let i = 0; i < byteString.length; i++) {\n int8Array[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([int8Array], { type: mimeType });\n return blob;\n }\n\n getDataUrlFromFile(file: any) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (e: any) => {\n resolve(e.target.result)\n };\n reader.onerror = (e: any) => {\n reject(e.target.error);\n };\n reader.readAsDataURL(file);\n })\n }\n\n getUploadUrl(url: string, filename: string, mimeType: string, type: string): Observable<any> {\n return this.http.post(url, { filename, mimeType, type });\n }\n\n attachFilesToEntity(url: string, data: any, limit: number): Observable<any> {\n return this.http.post(`${url}?limit=${limit}`, data);\n }\n\n updateTag(url: string, data: any): Observable<any> {\n return this.http.post(url, data);\n }\n\n updateSequence(url: string, data: any): Observable<any> {\n return this.http.post(url, data);\n }\n\n putFile(url: string, file: File, contentType?: string): Observable<any> {\n const headers = new HttpHeaders({ \"content-type\": contentType ? contentType : \"binary/octet-stream\"}).set('X-Skip-Auth-Interceptor', \"\");\n return this.http.put(url, file, { headers });\n }\n\n deleteUploadedFile(url: string, data: any): Observable<any> {\n return this.http.post(url, data);\n }\n\n}","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\n@Component({\n selector: 'tis-confirmation-dialog',\n standalone: false,\n templateUrl: './tis-confirmation-dialog.component.html',\n styleUrl: './tis-confirmation-dialog.component.css'\n})\nexport class TisConfirmationDialogComponent {\n constructor(\n public dialogRef: MatDialogRef<TisConfirmationDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n ) {\n this.dialogRef.addPanelClass(['md-tis-w-400-px']);\n }\n\n onClose(status: boolean | null): void {\n this.dialogRef.close(status);\n }\n}\n","<h1 mat-dialog-title style=\"align-items: center; display: flex;\">\n <mat-icon class=\"{{data?.iconClass}}\" style=\"color: var(--tis-cancel, #bb333b)\">{{data?.icon}}</mat-icon>\n <span>{{data?.title}}</span>\n</h1>\n<div mat-dialog-content style=\"padding: 20px 24px; padding-top: 0px;\">\n @if(data?.html){\n <h5 class=\"title\">{{data?.message}}</h5>\n <div [innerHTML]=\"data.html\">\n </div>\n }\n @else {\n <span>{{data?.message}}</span>\n }\n</div>\n<div mat-dialog-actions>\n <button mat-button class=\"{{data?.cancelButtonClass}}\" style=\"color: var(--tis-primary, var(--mat-sys-primary))\" (click)=\"onClose(false)\" *ngIf=\"data?.cancelButtonText && data?.cancelButtonText != ''\">{{data?.cancelButtonText}}</button>\n <button mat-button class=\"{{data?.approveButtonClass}}\" style=\"color: var(--tis-cancel, #bb333b)\" (click)=\"onClose(true)\" cdkFocusInitial *ngIf=\"data?.approveButtonText && data?.approveButtonText != ''\">{{data?.approveButtonText}}</button>\n</div>","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject, Subscription, throwError } from 'rxjs';\nimport { catchError, take, takeUntil, timeout } from 'rxjs/operators';\nimport { HttpClient } from '@angular/common/http';\nimport {\n TisSocketAdapter,\n TisRemoteUploadConfig,\n TisPairingSession,\n TisRemoteUploadEvent,\n TisRemoteUploadMessage,\n TisRemoteUploadedFile\n} from '../interfaces/socket-adapter.interface';\n\nconst DEFAULT_PAIRING_TTL = 24 * 60 * 60 * 1000; // 24 hours\nconst DEFAULT_STORAGE_KEY = 'tis-remote-upload-session';\nconst DEFAULT_QR_EXPIRY = 300; // 5 minutes\n\n/**\n * Mobile connection info stored in localStorage\n */\ninterface MobileConnectionInfo {\n mobileDeviceId: string;\n connectedAt: number;\n lastActivity: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TisRemoteUploadService implements OnDestroy {\n private static readonly COMPONENT = 'TisRemoteUploadService';\n private static readonly MOBILE_CONNECTION_KEY = 'tis-mobile-connection';\n\n private destroy$ = new Subject<void>();\n private channelSubscription: Subscription | null = null;\n\n private config: TisRemoteUploadConfig | null = null;\n private socketAdapter: TisSocketAdapter | null = null;\n\n // Cached values\n private deviceId: string = '';\n private userId: string = '';\n private apiUrl: string = '';\n private channelName: string = '';\n\n // State observables\n private pairingSession$ = new BehaviorSubject<TisPairingSession | null>(null);\n private connectionStatus$ = new BehaviorSubject<'disconnected' | 'pending' | 'connected'>('disconnected');\n private mobileConnection$ = new BehaviorSubject<MobileConnectionInfo | null>(null);\n private remoteUpload$ = new Subject<TisRemoteUploadEvent>();\n private error$ = new Subject<string>();\n\n constructor(private http: HttpClient) {\n // Restore mobile connection from storage on init\n this.restoreMobileConnection();\n }\n\n // ===========================================================================\n // Configuration\n // ===========================================================================\n\n /**\n * Configure the remote upload service\n */\n async configure(config: TisRemoteUploadConfig): Promise<void> {\n this.config = config;\n this.socketAdapter = config.socketAdapter || null;\n\n if (config.enabled && this.socketAdapter) {\n // Get device ID, user ID, and API URL from adapter\n this.deviceId = await Promise.resolve(this.socketAdapter.getDeviceId());\n this.userId = this.socketAdapter.getUserId \n ? await Promise.resolve(this.socketAdapter.getUserId()) \n : '';\n this.apiUrl = this.socketAdapter.getApiUrl?.() || '';\n this.channelName = `tis-mobile-upload-w-dev-${this.deviceId}`;\n\n // Subscribe to socket connection status\n this.socketAdapter.connectionStatus$\n .pipe(takeUntil(this.destroy$))\n .subscribe(connected => {\n if (connected) {\n // Always subscribe to our channel when connected\n this.subscribeToChannel(this.channelName);\n }\n });\n\n // Subscribe to channel immediately if already connected\n if (this.socketAdapter.isConnected()) {\n this.subscribeToChannel(this.channelName);\n }\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Configured:`, {\n deviceId: this.deviceId,\n userId: this.userId,\n channel: this.channelName\n });\n }\n }\n\n // ===========================================================================\n // Public Getters\n // ===========================================================================\n\n /**\n * Get desktop device ID\n */\n getDesktopDeviceId(): string {\n return this.deviceId;\n }\n\n /**\n * Get current mobile connection info\n */\n getMobileConnection(): Observable<MobileConnectionInfo | null> {\n return this.mobileConnection$.asObservable();\n }\n\n /**\n * Get current mobile device ID (if connected)\n */\n getMobileDeviceId(): string | null {\n return this.mobileConnection$.value?.mobileDeviceId || null;\n }\n\n /**\n * Get current pairing session\n */\n getPairingSession(): Observable<TisPairingSession | null> {\n return this.pairingSession$.asObservable();\n }\n\n /**\n * Get connection status\n */\n getConnectionStatus(): Observable<'disconnected' | 'pending' | 'connected'> {\n return this.connectionStatus$.asObservable();\n }\n\n /**\n * Get remote upload events\n */\n getRemoteUploads(): Observable<TisRemoteUploadEvent> {\n return this.remoteUpload$.asObservable();\n }\n\n /**\n * Get error events\n */\n getErrors(): Observable<string> {\n return this.error$.asObservable();\n }\n\n /**\n * Check if remote upload is available (configured and socket connected)\n */\n isAvailable(): boolean {\n return !!(\n this.config?.enabled &&\n this.socketAdapter &&\n this.socketAdapter.isConnected()\n );\n }\n\n /**\n * Check if currently connected to a mobile device\n */\n isConnectedToMobile(): boolean {\n return this.connectionStatus$.value === 'connected' && !!this.mobileConnection$.value;\n }\n\n /**\n * Alias for isConnectedToMobile - Check if paired with mobile\n */\n isPaired(): boolean {\n return this.isConnectedToMobile();\n }\n\n // ===========================================================================\n // QR Code Generation (New Flow)\n // ===========================================================================\n\n /**\n * Generate QR code data for mobile app\n * Flow:\n * 1. Call API to get a short-lived link token (UUID)\n * 2. Build QR URL with: apiUrl, deviceId, userId, token\n */\n async generateQrCode(): Promise<{ qrData: string; expiresAt: number }> {\n if (!this.isAvailable()) {\n throw new Error('Remote upload is not available. Check configuration and socket connection.');\n }\n\n if (!this.apiUrl) {\n throw new Error('API URL not configured in socket adapter');\n }\n\n try {\n // Step 1: Get link token from backend\n const endpoint = this.config?.apiEndpoints?.generateMobileLinkToken \n || `${this.apiUrl}/ease-of-access/mobile-upload-link-token`;\n\n const apiResponse = await this.callHttpApi<{ success: boolean; data: { token: string; expiresAt: number; deviceId?: string; userId?: string; apiUrl?: string } }>(\n endpoint, \n { deviceId: this.deviceId, userId: this.userId }\n );\n\n // Unwrap the data from API response\n const response = apiResponse.data || apiResponse as any;\n\n const expirySeconds = this.config?.qrCode?.expirySeconds || DEFAULT_QR_EXPIRY;\n const expiresAt = response.expiresAt || Date.now() + expirySeconds * 1000;\n\n // Step 2: Build QR URL\n const mobileUrl = this.config?.qrCode?.mobileUploadUrl || '';\n const qrData = this.buildQrUrl(mobileUrl, {\n token: response.token,\n deviceId: this.deviceId,\n userId: this.userId,\n apiUrl: this.apiUrl\n });\n\n // Update pairing session\n const session: TisPairingSession = {\n pairingCode: response.token,\n desktopDeviceId: this.deviceId,\n channel: this.channelName,\n createdAt: Date.now(),\n expiresAt,\n status: 'pending'\n };\n this.pairingSession$.next(session);\n this.connectionStatus$.next('pending');\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] QR code generated, waiting for mobile...`);\n\n return { qrData, expiresAt };\n\n } catch (error: any) {\n const msg = `Failed to generate QR code: ${error.message}`;\n console.error(`[${TisRemoteUploadService.COMPONENT}]`, msg);\n this.error$.next(msg);\n throw error;\n }\n }\n\n /**\n * Build QR URL with minimal parameters\n */\n private buildQrUrl(\n baseUrl: string,\n params: { token: string; deviceId: string; userId: string; apiUrl: string }\n ): string {\n const url = new URL(baseUrl);\n url.searchParams.set('token', params.token);\n url.searchParams.set('deviceId', params.deviceId);\n url.searchParams.set('userId', params.userId);\n url.searchParams.set('apiUrl', encodeURIComponent(params.apiUrl));\n return url.toString();\n }\n\n // ===========================================================================\n // Mobile Communication\n // ===========================================================================\n\n /**\n * Send message to mobile device via channel\n */\n sendToMobile(type: string, data: any): void {\n if (!this.socketAdapter?.sendViaSocket) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] sendViaSocket not available`);\n return;\n }\n\n const message = {\n action: 'send-to-channel',\n data: {\n channel: this.channelName,\n payload: {\n type,\n ...data,\n desktopDeviceId: this.deviceId,\n timestamp: Date.now()\n }\n }\n };\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Sending to mobile:`, message);\n this.socketAdapter.sendViaSocket(message);\n }\n\n /**\n * Accept mobile connection (send SUCCESS response)\n */\n private acceptMobileConnection(mobileDeviceId: string): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Accepting mobile connection:`, mobileDeviceId);\n\n // Save mobile connection\n const connectionInfo: MobileConnectionInfo = {\n mobileDeviceId,\n connectedAt: Date.now(),\n lastActivity: Date.now()\n };\n this.mobileConnection$.next(connectionInfo);\n this.saveMobileConnection(connectionInfo);\n\n // Update status\n this.connectionStatus$.next('connected');\n\n // Update session\n const session = this.pairingSession$.value;\n if (session) {\n const updatedSession: TisPairingSession = {\n ...session,\n mobileDeviceId,\n status: 'connected',\n lastActivity: Date.now()\n };\n this.pairingSession$.next(updatedSession);\n }\n\n // Send SUCCESS to mobile\n this.sendToMobile('connectionState', { state: 'SUCCESS' });\n }\n\n /**\n * Disconnect from mobile device - call API and clear local state\n */\n async disconnect(): Promise<void> {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Disconnecting from mobile...`);\n\n const mobileDeviceId = this.mobileConnection$.value?.mobileDeviceId;\n\n // Call disconnect API via socket\n if (this.socketAdapter?.callApiViaSocket && mobileDeviceId) {\n try {\n const callApi = this.socketAdapter.callApiViaSocket.bind(this.socketAdapter);\n const response = await new Promise<any>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error('Disconnect API timeout')), 10000);\n \n callApi('tis-image-mobile-uploader/disconnect-mobile-link', {\n desktopDeviceId: this.deviceId,\n mobileDeviceId: mobileDeviceId,\n initiatedBy: 'desktop'\n }).pipe(take(1)).subscribe({\n next: (res) => {\n clearTimeout(timeout);\n resolve(res);\n },\n error: (err) => {\n clearTimeout(timeout);\n reject(err);\n }\n });\n });\n console.log(`[${TisRemoteUploadService.COMPONENT}] Disconnect API response:`, response);\n } catch (error: any) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Disconnect API call failed:`, error);\n // Continue with local cleanup anyway\n }\n }\n\n // Notify mobile via channel (backup notification)\n this.sendToMobile('mobile-link-disconnected', { \n desktopDeviceId: this.deviceId,\n initiatedBy: 'desktop'\n });\n\n // Clear state\n this.mobileConnection$.next(null);\n this.connectionStatus$.next('disconnected');\n this.pairingSession$.next(null);\n this.clearMobileConnection();\n }\n\n /**\n * Handle disconnect initiated from remote (mobile) side\n */\n private handleRemoteDisconnect(data: any): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Mobile disconnected:`, data);\n \n // Clear state without calling API (mobile already initiated)\n this.mobileConnection$.next(null);\n this.connectionStatus$.next('disconnected');\n this.pairingSession$.next(null);\n this.clearMobileConnection();\n }\n\n // ===========================================================================\n // Channel Subscription & Message Handling\n // ===========================================================================\n\n /**\n * Subscribe to channel for receiving messages from mobile\n */\n private subscribeToChannel(channel: string): void {\n if (this.channelSubscription) {\n this.channelSubscription.unsubscribe();\n }\n\n if (!this.socketAdapter) {\n return;\n }\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Subscribing to channel:`, channel);\n\n this.channelSubscription = this.socketAdapter.subscribeToChannel(channel)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (message: any) => this.handleChannelMessage(message),\n error: (error) => {\n console.error(`[${TisRemoteUploadService.COMPONENT}] Channel error:`, error);\n this.error$.next(`Channel subscription error: ${error.message}`);\n }\n });\n }\n\n /**\n * Handle incoming channel messages from mobile\n */\n private handleChannelMessage(message: any): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Received:`, message);\n\n // Extract message type and data - handle nested payload structure\n const payload = message.payload || message.data || message;\n const type = payload.type || message.type;\n const data = payload;\n\n switch (type) {\n case 'connectionState':\n this.handleConnectionState(data);\n break;\n\n case 'mobile-link-established':\n this.handleMobileLinkEstablished(data);\n break;\n\n case 'image-uploaded':\n case 'upload_complete':\n this.handleUploadComplete(message);\n break;\n\n case 'disconnect':\n case 'mobile-link-disconnected':\n this.handleMobileDisconnect(data);\n break;\n\n default:\n // Check if it's an upload event\n if (data.file || data.fileName || data.fileUrl) {\n this.handleUploadComplete(message);\n } else {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Unknown message type:`, type);\n }\n }\n }\n\n /**\n * Handle mobile-link-established message\n * This is sent when mobile successfully connects via the backend\n */\n private handleMobileLinkEstablished(data: any): void {\n const mobileDeviceId = data.mobileDeviceId;\n const mobileConnectionId = data.mobileConnectionId;\n const userId = data.userId;\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Mobile link established:`, {\n mobileDeviceId,\n mobileConnectionId,\n userId\n });\n\n if (mobileDeviceId) {\n // Save mobile connection\n const connectionInfo: MobileConnectionInfo = {\n mobileDeviceId,\n connectedAt: Date.now(),\n lastActivity: Date.now()\n };\n this.mobileConnection$.next(connectionInfo);\n this.saveMobileConnection(connectionInfo);\n\n // Update status to connected\n this.connectionStatus$.next('connected');\n\n // Update session\n const session = this.pairingSession$.value;\n if (session) {\n const updatedSession: TisPairingSession = {\n ...session,\n mobileDeviceId,\n status: 'connected',\n lastActivity: Date.now()\n };\n this.pairingSession$.next(updatedSession);\n }\n\n // Send SUCCESS acknowledgment to mobile\n this.sendToMobile('connectionState', { \n state: 'SUCCESS',\n desktopDeviceId: this.deviceId,\n mobileConnectionId \n });\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Connection established with mobile device:`, mobileDeviceId);\n }\n }\n\n /**\n * Handle connection state messages from mobile\n */\n private handleConnectionState(data: any): void {\n const state = data.state || data.connectionState;\n const mobileDeviceId = data.mobileDeviceId;\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Connection state:`, state, 'from:', mobileDeviceId);\n\n if (state === 'INITIATED' && mobileDeviceId) {\n // Mobile is initiating connection - accept it\n this.acceptMobileConnection(mobileDeviceId);\n }\n }\n\n /**\n * Handle upload complete from mobile\n */\n private handleUploadComplete(message: any): void {\n const data = message.data || message.payload || message;\n const file = data.file || data;\n\n if (file) {\n const event: TisRemoteUploadEvent = {\n file,\n mobileDeviceId: data.mobileDeviceId || this.mobileConnection$.value?.mobileDeviceId || 'unknown',\n timestamp: data.timestamp || Date.now(),\n sessionId: data.sessionId\n };\n\n // Update last activity\n const conn = this.mobileConnection$.value;\n if (conn) {\n const updated = { ...conn, lastActivity: Date.now() };\n this.mobileConnection$.next(updated);\n this.saveMobileConnection(updated);\n }\n\n this.remoteUpload$.next(event);\n console.log(`[${TisRemoteUploadService.COMPONENT}] Upload received:`, event);\n }\n }\n\n /**\n * Handle mobile disconnect\n */\n private handleMobileDisconnect(data: any): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Mobile disconnected:`, data);\n \n this.mobileConnection$.next(null);\n this.connectionStatus$.next('disconnected');\n this.clearMobileConnection();\n\n // Update session\n const session = this.pairingSession$.value;\n if (session) {\n this.pairingSession$.next({\n ...session,\n status: 'disconnected',\n lastActivity: Date.now()\n });\n }\n }\n\n // ===========================================================================\n // Storage\n // ===========================================================================\n\n /**\n * Save mobile connection to localStorage\n */\n private saveMobileConnection(info: MobileConnectionInfo): void {\n try {\n localStorage.setItem(\n TisRemoteUploadService.MOBILE_CONNECTION_KEY, \n JSON.stringify(info)\n );\n } catch (e) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Failed to save connection:`, e);\n }\n }\n\n /**\n * Restore mobile connection from localStorage\n */\n private restoreMobileConnection(): void {\n try {\n const stored = localStorage.getItem(TisRemoteUploadService.MOBILE_CONNECTION_KEY);\n if (stored) {\n const info: MobileConnectionInfo = JSON.parse(stored);\n // Only restore if connected within last 24 hours\n if (Date.now() - info.lastActivity < DEFAULT_PAIRING_TTL) {\n this.mobileConnection$.next(info);\n // Note: actual connection status will be updated when mobile reconnects\n } else {\n this.clearMobileConnection();\n }\n }\n } catch (e) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Failed to restore connection:`, e);\n }\n }\n\n /**\n * Clear mobile connection from localStorage\n */\n private clearMobileConnection(): void {\n try {\n localStorage.removeItem(TisRemoteUploadService.MOBILE_CONNECTION_KEY);\n } catch (e) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Failed to clear connection:`, e);\n }\n }\n\n // ===========================================================================\n // HTTP API\n // ===========================================================================\n\n /**\n * Call HTTP API endpoint\n */\n private callHttpApi<T>(endpoint: string, data: any): Promise<T> {\n return new Promise((resolve, reject) => {\n this.http.post<T>(endpoint, data)\n .pipe(take(1), timeout(30000))\n .subscribe({\n next: resolve,\n error: reject\n });\n });\n }\n\n // ===========================================================================\n // Cleanup\n // ===========================================================================\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.channelSubscription) {\n this.channelSubscription.unsubscribe();\n }\n }\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { Subject, Subscription, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { TisRemoteUploadService } from '../services/tis-remote-upload.service';\nimport { TisPairingSession, TisRemoteUploadEvent } from '../interfaces/socket-adapter.interface';\n\nexport interface FieldInfo {\n label?: string;\n accept?: string;\n type?: 'image' | 'file';\n entityType?: string;\n entityId?: any;\n isMultiple?: boolean;\n limit?: number;\n isCompressed?: boolean;\n}\n\nexport interface TisQrCodeDialogData {\n title?: string;\n subtitle?: string;\n qrSize?: number;\n showCountdown?: boolean;\n autoCloseOnUpload?: boolean;\n fieldInfo?: FieldInfo;\n}\n\n@Component({\n selector: 'tis-qr-code-dialog',\n standalone: false,\n templateUrl: './tis-qr-code-dialog.component.html',\n styleUrls: ['./tis-qr-code-dialog.component.css']\n})\nexport class TisQrCodeDialogComponent implements OnInit, OnDestroy {\n qrData: string = '';\n expiresAt: number = 0;\n remainingTime: string = '';\n \n isLoading = true;\n isExpired = false;\n isConnected = false;\n errorMessage: string | null = null;\n\n connectionStatus: 'disconnected' | 'pending' | 'connected' = 'disconnected';\n uploadedFiles: TisRemoteUploadEvent[] = [];\n\n // Device IDs\n desktopDeviceId: string = '';\n mobileDeviceId: string | null = null;\n\n private destroy$ = new Subject<void>();\n private countdownSubscription: Subscription | null = null;\n\n constructor(\n public dialogRef: MatDialogRef<TisQrCodeDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: TisQrCodeDialogData,\n private remoteUploadService: TisRemoteUploadService\n ) {}\n\n ngOnInit(): void {\n // Get desktop device ID\n this.desktopDeviceId = this.remoteUploadService.getDesktopDeviceId();\n \n // Subscribe to events first\n this.subscribeToEvents();\n \n // Check if already connected to mobile\n this.checkExistingConnection();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n }\n\n /**\n * Check if there's an existing mobile connection\n */\n private checkExistingConnection(): void {\n this.mobileDeviceId = this.remoteUploadService.getMobileDeviceId();\n \n if (this.remoteUploadService.isConnectedToMobile()) {\n this.isConnected = true;\n this.connectionStatus = 'connected';\n this.isLoading = false;\n \n // Send field info to mobile since already connected\n if (this.data.fieldInfo) {\n this.sendFieldInfoToMobile();\n }\n } else {\n // No existing connection, generate QR code\n this.generateQrCode();\n }\n }\n\n private async generateQrCode(): Promise<void> {\n this.isLoading = true;\n this.errorMessage = null;\n this.isExpired = false;\n\n try {\n const result = await this.remoteUploadService.generateQrCode();\n this.qrData = result.qrData;\n this.expiresAt = result.expiresAt;\n\n this.isLoading = false;\n this.startCountdown();\n } catch (error: any) {\n this.isLoading = false;\n this.errorMessage = error.message || 'Failed to generate QR code';\n }\n }\n\n private subscribeToEvents(): void {\n // Connection status\n this.remoteUploadService.getConnectionStatus()\n .pipe(takeUntil(this.destroy$))\n .subscribe(status => {\n this.connectionStatus = status;\n const wasConnected = this.isConnected;\n this.isConnected = status === 'connected';\n \n // Send field info when first connected\n if (!wasConnected && this.isConnected && this.data.fieldInfo) {\n this.sendFieldInfoToMobile();\n }\n });\n\n // Mobile connection changes\n this.remoteUploadService.getMobileConnection()\n .pipe(takeUntil(this.destroy$))\n .subscribe(connection => {\n this.mobileDeviceId = connection?.mobileDeviceId || null;\n });\n\n // Remote uploads\n this.remoteUploadService.getRemoteUploads()\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n this.uploadedFiles.push(event);\n \n if (this.data.autoCloseOnUpload) {\n this.dialogRef.close({ uploaded: true, files: this.uploadedFiles });\n }\n });\n\n // Errors\n this.remoteUploadService.getErrors()\n .pipe(takeUntil(this.destroy$))\n .subscribe(error => {\n console.error('[TisQrCodeDialog] Error:', error);\n });\n }\n\n /**\n * Send field configuration to mobile device\n */\n private sendFieldInfoToMobile(): void {\n if (!this.data.fieldInfo) return;\n \n console.log('[TisQrCodeDialog] Sending field info to mobile:', this.data.fieldInfo);\n this.remoteUploadService.sendToMobile('field-info', this.data.fieldInfo);\n }\n\n private startCountdown(): void {\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n\n this.countdownSubscription = interval(1000)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n const now = Date.now();\n const remaining = Math.max(0, this.expiresAt - now);\n\n if (remaining <= 0) {\n this.isExpired = true;\n this.remainingTime = 'Expired';\n this.countdownSubscription?.unsubscribe();\n } else {\n const minutes = Math.floor(remaining / 60000);\n const seconds = Math.floor((remaining % 60000) / 1000);\n this.remainingTime = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }\n });\n }\n\n // ---------------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------------\n\n /**\n * Format device ID for display\n */\n formatDeviceId(id: string | null): string {\n if (!id) return '---';\n if (id.length > 16) {\n return `${id.slice(0, 8)}...${id.slice(-4)}`;\n }\n return id;\n }\n\n /**\n * Refresh QR code\n */\n refreshQrCode(): void {\n this.isExpired = false;\n this.uploadedFiles = [];\n this.generateQrCode();\n }\n\n /**\n * Connect to mobile (show QR if disconnected)\n */\n connectToMobile(): void {\n this.generateQrCode();\n }\n\n /**\n * Disconnect from mobile\n */\n disconnect(): void {\n this.remoteUploadService.disconnect();\n this.mobileDeviceId = null;\n this.isConnected = false;\n this.connectionStatus = 'disconnected';\n }\n\n /**\n * Close dialog\n */\n close(): void {\n this.dialogRef.close({ \n uploaded: this.uploadedFiles.length > 0, \n files: this.uploadedFiles \n });\n }\n}\n","<div class=\"qr-dialog-container\">\n <!-- Header -->\n <div class=\"qr-dialog-header\">\n <h2 class=\"qr-dialog-title\">{{ data.title || 'Upload from Mobile' }}</h2>\n <p class=\"qr-dialog-subtitle\">{{ data.subtitle || 'Scan this QR code with your mobile device to upload images' }}</p>\n <button mat-icon-button class=\"close-btn\" (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"qr-dialog-content\">\n <!-- Loading State -->\n <div *ngIf=\"isLoading\" class=\"loading-container\">\n <mat-spinner diameter=\"48\"></mat-spinner>\n <p>Generating QR Code...</p>\n </div>\n\n <!-- Error State -->\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-container\">\n <mat-icon class=\"error-icon\">error_outline</mat-icon>\n <p class=\"error-message\">{{ errorMessage }}</p>\n <button mat-raised-button color=\"primary\" (click)=\"refreshQrCode()\">\n Try Again\n </button>\n </div>\n\n <!-- Main Content -->\n <div *ngIf=\"!isLoading && !errorMessage\" class=\"qr-content\">\n \n <!-- Device Info Card -->\n <div class=\"device-info-card\">\n <div class=\"device-row\">\n <mat-icon class=\"device-icon desktop\">computer</mat-icon>\n <div class=\"device-details\">\n <span class=\"device-label\">THIS DEVICE</span>\n <span class=\"device-id\" [title]=\"desktopDeviceId\">{{ formatDeviceId(desktopDeviceId) }}</span>\n </div>\n </div>\n \n <div class=\"connection-line\" *ngIf=\"mobileDeviceId\">\n <mat-icon>sync_alt</mat-icon>\n </div>\n \n <div class=\"device-row\" *ngIf=\"mobileDeviceId\">\n <mat-icon class=\"device-icon mobile\">smartphone</mat-icon>\n <div class=\"device-details\">\n <span class=\"device-label\">CONNECTED MOBILE</span>\n <span class=\"device-id\" [title]=\"mobileDeviceId\">{{ formatDeviceId(mobileDeviceId) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Connected State -->\n <div *ngIf=\"isConnected\" class=\"connected-state\">\n <div class=\"connected-indicator\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>Mobile Connected!</span>\n </div>\n <p class=\"connected-message\">\n You can now upload images from your mobile device. \n Select a file/image upload field and the uploaded files will appear automatically.\n </p>\n \n <!-- Uploaded Files -->\n <div class=\"uploaded-files\" *ngIf=\"uploadedFiles.length > 0\">\n <h4>Uploaded Files ({{ uploadedFiles.length }})</h4>\n <div class=\"file-list\">\n <div class=\"file-item\" *ngFor=\"let upload of uploadedFiles\">\n <mat-icon>check_circle</mat-icon>\n <span>{{ upload.file.fileName }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- QR Code (only show when not connected) -->\n <div *ngIf=\"!isConnected\" class=\"qr-section\">\n <!-- Connection Status -->\n <div class=\"connection-status\" [ngClass]=\"connectionStatus\">\n <div class=\"status-indicator\"></div>\n <span *ngIf=\"connectionStatus === 'disconnected'\">Waiting for mobile...</span>\n <span *ngIf=\"connectionStatus === 'pending'\">Waiting for connection...</span>\n </div>\n\n <!-- QR Code -->\n <div class=\"qr-code-wrapper\" [class.expired]=\"isExpired\">\n <qrcode \n *ngIf=\"qrData\"\n [qrdata]=\"qrData\" \n [width]=\"data.qrSize || 200\" \n [errorCorrectionLevel]=\"'M'\"\n [elementType]=\"'canvas'\"\n [cssClass]=\"'qr-canvas'\"\n ></qrcode>\n \n <!-- Expired Overlay -->\n <div *ngIf=\"isExpired\" class=\"expired-overlay\">\n <mat-icon>refresh</mat-icon>\n <p>QR Code Expired</p>\n <button mat-raised-button color=\"primary\" (click)=\"refreshQrCode()\">\n Generate New Code\n </button>\n </div>\n </div>\n\n <!-- Countdown Timer -->\n <div class=\"countdown\" *ngIf=\"data.showCountdown !== false && !isExpired\">\n <mat-icon>timer</mat-icon>\n <span>Expires in {{ remainingTime }}</span>\n </div>\n </div>\n\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"qr-dialog-footer\">\n <button mat-button *ngIf=\"isConnected\" color=\"warn\" (click)=\"disconnect()\">\n <mat-icon>link_off</mat-icon>\n Disconnect\n </button>\n <button mat-button *ngIf=\"!isConnected && !isLoading\" (click)=\"connectToMobile()\">\n <mat-icon>qr_code</mat-icon>\n Connect & Upload via Mobile\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"close()\">\n {{ uploadedFiles.length > 0 ? 'Done' : 'Close' }}\n </button>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output, SimpleChanges, OnDestroy } from '@angular/core';\nimport { TisFileViewerComponent } from '../tis-file-viewer/tis-file-viewer.component';\nimport type { DialogConfig, FileViewerDialogData, FileViewerFileType, OptionConfig, UrlConfig, TisRemoteUploadConfig, TisRemoteUploadEvent } from '../interfaces';\nimport { TisPreviewImageComponent } from '../tis-preview-image/tis-preview-image.component';\nimport { BehaviorSubject, Observable, Subject, map, sequenceEqual, shareReplay, takeUntil } from 'rxjs';\nimport { MatDialog } from '@angular/material/dialog';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { TisHelperService } from '../services/tis-helper.service';\nimport { TisConfirmationDialogComponent } from '../tis-confirmation-dialog/tis-confirmation-dialog.component';\nimport { TisQrCodeDialogComponent, TisQrCodeDialogData } from '../tis-qr-code-dialog/tis-qr-code-dialog.component';\nimport { TisRemoteUploadService } from '../services/tis-remote-upload.service';\nimport { Config } from '../interfaces/config.type';\nimport { CdkDragDrop, CdkDragMove, moveItemInArray } from '@angular/cdk/drag-drop';\n\nconst generateRandomString = (length: number): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n@Component({\n selector: 'tis-image-and-file-upload-and-view',\n standalone: false,\n templateUrl: './tis-image-and-file-upload-and-view.component.html',\n styleUrl: './tis-image-and-file-upload-and-view.component.css'\n})\nexport class TisImageAndFileUploadAndViewComponent implements OnDestroy {\n private changeSubject = new BehaviorSubject<boolean>(false);\n private destroy$ = new Subject<void>();\n\n @Input({required: true}) urlConfig!: UrlConfig;\n @Input() entityType!: string;\n @Input() entityId: any;\n @Input() viewType: 'card' | 'list' | 'compact' = 'card';\n @Input() type: 'image' | 'file' = 'image';\n @Input() label: string | null = null;\n @Input() disabled: boolean = false;\n @Input() data: any;\n @Input() hint: string | null = null;\n @Input() accept: string = '';\n @Input() isValidateMimeType: boolean = true;\n @Input() selectedId: any = null;\n @Input() options: OptionConfig | null = null;\n @Input() required: boolean = false;\n @Input() previewOnly: boolean = false;\n @Input() previewInFlex: boolean = false;\n @Input() imageItemClass: string = '';\n @Input() isAddUploadedFileInLastNode: boolean = false;\n @Input() isEnableDeleteConfirmation: boolean = true;\n @Input() isEnableCapture: boolean = false;\n @Input() deleteConfirmationMsg!: string;\n @Input() dialogConfig!: DialogConfig;\n \n // Remote Upload Configuration\n @Input() remoteUploadConfig: TisRemoteUploadConfig | null = null;\n \n @Output() uploadInProgress = new EventEmitter();\n @Output() onUploaded = new EventEmitter();\n @Output() onFileSelect = new EventEmitter<any>();\n @Output() onFileRemoved = new EventEmitter<any>();\n @Output() onError = new EventEmitter();\n @Output() onRemoteUpload = new EventEmitter<TisRemoteUploadEvent>();\n\n @Input() isShowImageSequence: boolean = false;\n @Input() enableDragNDrop: boolean = false;\n @Output() dataSequenceChange = new EventEmitter<any>();\n\n isMobile = false;\n isTab = false;\n\n isHandset$!: Observable<boolean>;\n isTab$!: Observable<boolean>;\n\n\n config: Config = {\n isCompressed: false,\n hiddenDeleteBtn: false,\n hiddenPreview: false,\n selectionMode: false,\n isStoredDb: false,\n isMultiple: false,\n limit: 10,\n cols: 5,\n colsForTab: 5,\n colsForMobile: 3,\n height: '130px',\n selectorId: generateRandomString(10),\n enableImageTags: false,\n useAdvancedCamera: true // Enable advanced camera modal by default\n };\n\n isSliderLoaded = true;\n\n filesArray: any[] = [\n // {\n // \"s3Url\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/da226bf2-4e5f-4180-94d8-6746b1ce139b.jpg\",\n // \"uploadData\": {\n // \"isBase64Encoded\": false,\n // \"headers\": {\n // \"Access-Control-Allow-Origin\": \"*\"\n // },\n // \"uploadURL\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/da226bf2-4e5f-4180-94d8-6746b1ce139b.jpg?Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA37VN5NQI5HY4VFVN%2F20220617%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220617T152621Z&X-Amz-Expires=900&X-Amz-Signature=4004cfb10a740b9623d486de992a06f53b458ed6fc151c092eea88a3059eae8f&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read\",\n // \"photoFilename\": \"f7a32cd0-d0c1-474a-838e-47402d80527a.jpeg\",\n // \"fileName\": \"1452664590074.jpeg\",\n // \"uploadPath\": \"/survey_orders/f7a32cd0-d0c1-474a-838e-47402d80527a.jpeg\",\n // \"resourceUrl\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/da226bf2-4e5f-4180-94d8-6746b1ce139b.jpg\"\n // }\n // },\n // {\n // \"s3Url\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/31033a2a-5db6-450d-a541-58a94654dd0c.jpg\",\n // \"uploadData\": {\n // \"isBase64Encoded\": false,\n // \"headers\": {\n // \"Access-Control-Allow-Origin\": \"*\"\n // },\n // \"uploadURL\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/6c537889-c72a-48ca-9134-638e8d6a1aac.sql?Content-Type=application%2Fsql&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA37VN5NQI5HY4VFVN%2F20220617%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220617T152641Z&X-Amz-Expires=900&X-Amz-Signature=bcdf347df2a6495615bf48d619492e1deac2264231161da5dc3becaa7f45a796&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read\",\n // \"photoFilename\": \"6c537889-c72a-48ca-9134-638e8d6a1aac.sql\",\n // \"fileName\": \"eccom_bermuda.sql\",\n // \"uploadPath\": \"/survey_orders/6c537889-c72a-48ca-9134-638e8d6a1aac.sql\",\n // \"resourceUrl\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/6c537889-c72a-48ca-9134-638e8d6a1aac.sql\"\n // }\n // },\n // {\n // \"s3Url\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/b8424185-30c6-4f44-ba1e-ff616dfd6576.jpg\",\n // \"uploadData\": {\n // \"isBase64Encoded\": false,\n // \"headers\": {\n // \"Access-Control-Allow-Origin\": \"*\"\n // },\n // \"uploadURL\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/232f2548-dc93-4204-8835-86b69f3005a7.pdf?Content-Type=application%2Fpdf&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA37VN5NQI5HY4VFVN%2F20220617%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220617T152656Z&X-Amz-Expires=900&X-Amz-Signature=85643479c3fbecc5bd1fee9783e3cb72e27e16a034921b52cf2f377eefb01ff9&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read\",\n // \"photoFilename\": \"232f2548-dc93-4204-8835-86b69f3005a7.pdf\",\n // \"fileName\": \"print-registration-4x6.pdf\",\n // \"uploadPath\": \"/survey_orders/232f2548-dc93-4204-8835-86b69f3005a7.pdf\",\n // \"resourceUrl\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/232f2548-dc93-4204-8835-86b69f3005a7.pdf\"\n // }\n // }\n ];\n currentEntityId!: number;\n currentEntityType!: string;\n images = [];\n loading = false;\n status = false;\n\n\n constructor(\n public dialog: MatDialog,\n private helper: TisHelperService,\n private breakpointObserver: BreakpointObserver,\n private remoteUploadService: TisRemoteUploadService\n ) { }\n\n ngOnInit() {\n this.isHandset$ = this.breakpointObserver.observe([Breakpoints.Handset])\n .pipe(\n map(result => result.matches),\n shareReplay()\n );\n\n this.isTab$ = this.breakpointObserver.observe([Breakpoints.TabletPortrait])\n .pipe(\n map(result => result.matches),\n shareReplay()\n );\n \n this.prepareConfig();\n\n // Initialize remote upload if configured\n this.initRemoteUpload();\n\n // if(this.viewType == 'single-card'){\n // this.generateFilesForSingleCard();\n // }\n }\n\n ngAfterViewInit() {\n this.isHandset$.subscribe(r => {\n console.log('IS HANDSET:', r);\n this.isMobile = r;\n this.changeSubject.next(true);\n });\n this.isTab$.subscribe(r => {\n console.log('IS TAB:', r);\n this.isTab = r;\n this.changeSubject.next(true);\n });\n\n this.changeSubject.subscribe(status => {\n let cols = 1;\n if (this.isMobile) {\n cols = this.options?.colsForMobile ?? 3;\n }\n else if (this.isTab) {\n cols = this.options?.colsForTab ?? 4;\n }\n else {\n cols = this.options?.cols ?? 5;\n }\n\n this.config.cols = cols;\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['entityId']) {\n this.currentEntityId = changes['entityId'].currentValue;\n }\n if (changes['entityType']) {\n this.currentEntityType = changes['entityType'].currentValue;\n }\n if (changes['urlConfig']) {\n this.urlConfig = changes['urlConfig'].currentValue;\n this.config.isStoredDb = false;\n if (this.urlConfig?.attachToEntity) {\n this.config.isStoredDb = true;\n }\n }\n if (changes['options']) {\n this.prepareConfig();\n }\n if (changes['data']) {\n this.filesArray = changes['data']?.currentValue ?? [];\n this.filesArray = this.filesArray?.map(r => {\n r.loading = false;\n return r;\n });\n console.log(\"this.filesArray\", this.filesArray);\n }\n if(changes['viewType'] && changes['viewType'].currentValue == 'compact'){\n this.config.limit = 1;\n this.config.isMultiple = false;\n }\n if (changes['remoteUploadConfig']) {\n this.initRemoteUpload();\n }\n }\n\n prepareConfig() {\n if (this.options?.isCompressed) {\n this.config.isCompressed = this.options?.isCompressed;\n }\n\n if (this.options?.isSliderPreview) {\n this.config.isSliderPreview = this.options?.isSliderPreview;\n }\n\n if (this.options?.hiddenDeleteBtn) {\n this.config.hiddenDeleteBtn = this.options?.hiddenDeleteBtn;\n }\n\n if (this.options?.hiddenPreview) {\n this.config.hiddenPreview = this.options?.hiddenPreview;\n }\n\n if (this.options?.selectionMode) {\n this.config.selectionMode = this.options?.selectionMode;\n }\n\n this.config.isStoredDb = false;\n if (this.urlConfig?.attachToEntity) {\n this.config.isStoredDb = true;\n }\n\n if (this.options?.isMultiple) {\n this.config.isMultiple = this.options?.isMultiple;\n if(this.viewType == 'compact'){\n this.config.isMultiple = false;\n }\n }\n\n if (this.options?.fileSize) {\n this.config.fileSize = this.options?.fileSize;\n }\n\n if (this.options?.limit) {\n this.config.limit = this.options?.limit;\n if (this.viewType == 'compact') {\n this.config.limit = 1;\n }\n }\n\n if (this.options?.cols) {\n this.config.cols = this.options?.cols;\n }\n\n if (this.options?.colsForTab) {\n this.config.colsForTab = this.options?.colsForTab;\n }\n\n if (this.options?.colsForMobile) {\n this.config.colsForMobile = this.options?.colsForMobile;\n }\n\n if (this.options?.height) {\n this.config.height = this.options?.height;\n }\n\n if (this.options?.selectorId) {\n this.config.selectorId = this.options?.selectorId;\n }\n\n if (this.options?.enableImageTags) {\n this.config.enableImageTags = this.options?.enableImageTags;\n }\n\n if (this.options?.useAdvancedCamera !== undefined) {\n this.config.useAdvancedCamera = this.options?.useAdvancedCamera;\n }\n }\n\n /**\n * Validates selected files against the accept parameter\n * @param files - FileList of selected files\n * @returns boolean - true if all files are valid, false otherwise\n */\n private validateFileTypes(files: FileList): boolean {\n if (!this.accept || this.accept.trim() === '') {\n return true; // No validation needed if accept is not specified\n }\n\n const acceptedTypes = this.accept.split(',').map(type => type.trim().toLowerCase());\n const invalidFiles: string[] = [];\n \n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();\n \n if (!acceptedTypes.includes(fileExtension)) {\n invalidFiles.push(file.name);\n }\n }\n \n if (invalidFiles.length > 0) {\n const acceptedTypesStr = acceptedTypes.join(', ');\n const invalidFilesStr = invalidFiles.join(', ');\n this.helper.showErrorMsg(\n `Invalid file type(s): ${invalidFilesStr}. Only ${acceptedTypesStr} files are allowed.`, \n 'Error', \n 5000\n );\n return false;\n }\n \n return true;\n }\n\n setSliderLoading() {\n this.isSliderLoaded = false;\n setTimeout(() => {\n this.isSliderLoaded = true;\n }, 20);\n }\n\n openImageSelector(selectorId: string = this.config?.selectorId) {\n document.getElementById(selectorId)?.click();\n }\n\n async openCameraCapture() {\n // Check configuration preference and browser support\n if (this.config.useAdvancedCamera && typeof navigator !== 'undefined' && navigator.mediaDevices && typeof navigator.mediaDevices.getUserMedia === 'function') {\n try {\n // Try to open camera directly using MediaDevices API\n await this.openCameraDialog();\n } catch (error) {\n console.log('MediaDevices API failed, falling back to file input:', error);\n // Fallback to file input method\n this.openImageSelector();\n }\n } else {\n // Use simple file input method (works on most browsers including mobile)\n this.openImageSelector();\n }\n }\n\n\n\n\n\n private async openCameraDialog() {\n try {\n // Get available cameras first\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter(device => device.kind === 'videoinput');\n \n // Request camera access\n const stream = await navigator.mediaDevices.getUserMedia({ \n video: { \n facingMode: 'environment', // Prefer rear camera\n width: { ideal: this.isMobile ? 720 : 1920 },\n height: { ideal: this.isMobile ? 480 : 1080 }\n } \n });\n\n // Create a modal dialog with video preview and capture button\n this.showCameraModal(stream, videoDevices);\n\n } catch (error: any) {\n console.error('Error accessing camera:', error);\n \n if (error.name === 'NotAllowedError') {\n this.helper.showErrorMsg('Camera access denied. Please allow camera access and try again.', 'Error', 3000);\n } else if (error.name === 'NotFoundError') {\n this.helper.showErrorMsg('No camera found. Please use file upload instead.', 'Error', 3000);\n } else {\n this.helper.showErrorMsg('Could not access camera. Falling back to file upload.', 'Error', 3000);\n this.openImageSelector();\n }\n throw error;\n }\n }\n\n private showCameraModal(stream: MediaStream, videoDevices?: MediaDeviceInfo[]) {\n let currentStream = stream;\n let currentDeviceIndex = 0;\n\n // Create modal overlay with modern design\n const modal = document.createElement('div');\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(20, 20, 30, 0.95) 100%);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n padding: 20px;\n box-sizing: border-box;\n animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n // Add modern animations and styles\n const style = document.createElement('style');\n style.textContent = `\n @keyframes fadeIn {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes slideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n }\n @keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n }\n @keyframes glow {\n 0%, 100% { box-shadow: 0 0 20px rgba(102, 126, 234, 0.3); }\n 50% { box-shadow: 0 0 40px rgba(102, 126, 234, 0.7); }\n }\n .camera-loading {\n animation: pulse 2s infinite;\n }\n `;\n document.head.appendChild(style);\n\n // Create main container with minimal glass effect\n const mainContainer = document.createElement('div');\n mainContainer.style.cssText = `\n background: #1a1b1f;\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 20px;\n backdrop-filter: blur(20px);\n -webkit-backdrop-filter: blur(20px);\n padding: ${this.isMobile ? '16px' : '24px'};\n height: auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n animation: slideUp 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n // Create video container with clean styling\n const videoContainer = document.createElement('div');\n videoContainer.style.cssText = `\n position: relative;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n justify-content: center;\n `;\n\n // Create video element with clean styling\n const video = document.createElement('video');\n video.style.cssText = `\n width: 100%;\n max-width: 600px;\n height: auto;\n max-height: 70vh;\n border-radius: 12px;\n object-fit: cover;\n background: #000;\n `;\n video.autoplay = true;\n video.playsInline = true;\n video.srcObject = currentStream;\n\n // Create canvas for capturing\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n // Create camera switch button with clean design (only if multiple cameras)\n let switchCameraBtn: HTMLElement | null = null;\n if (videoDevices && videoDevices.length > 1) {\n switchCameraBtn = document.createElement('button');\n switchCameraBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#e3e3e3\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g><path d=\"M20,5h-3.17L15,3H9L7.17,5H4C2.9,5,2,5.9,2,7v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M20,19H4V7 h3.17h0.88l0.59-0.65L9.88,5h4.24l1.24,1.35L15.95,7h0.88H20V19z\"/></g><g><path d=\"M12,17c-2.21,0-4-1.79-4-4h2l-2.5-2.5L5,13h2c0,2.76,2.24,5,5,5c0.86,0,1.65-0.24,2.36-0.62l-0.74-0.74 C13.13,16.87,12.58,17,12,17z\"/></g><g><path d=\"M12,8c-0.86,0-1.65,0.24-2.36,0.62l0.74,0.73C10.87,9.13,11.42,9,12,9c2.21,0,4,1.79,4,4h-2l2.5,2.5L19,13h-2 C17,10.24,14.76,8,12,8z\"/></g></g></g></svg>\n `;\n switchCameraBtn.style.cssText = `\n position: absolute;\n top: 16px;\n right: 16px;\n background: rgba(0, 0, 0, 0.6);\n color: white;\n border: none;\n padding: ${this.isMobile ? '7px 7px' : '10px 10px'};\n border-radius: 25px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n width: auto;\n height: auto;\n z-index: 10;\n `;\n \n switchCameraBtn.addEventListener('mouseenter', () => {\n switchCameraBtn!.style.background = 'rgba(0, 0, 0, 0.8)';\n switchCameraBtn!.style.transform = 'scale(1.05)';\n });\n \n switchCameraBtn.addEventListener('mouseleave', () => {\n switchCameraBtn!.style.background = 'rgba(0, 0, 0, 0.6)';\n switchCameraBtn!.style.transform = 'scale(1)';\n });\n\n videoContainer.appendChild(switchCameraBtn);\n }\n\n // // Create camera status indicator (cleaner design)\n // const statusIndicator = document.createElement('div');\n // statusIndicator.style.cssText = `\n // position: absolute;\n // top: 16px;\n // left: 16px;\n // background: rgba(244, 67, 54, 0.9);\n // color: white;\n // padding: 6px 12px;\n // border-radius: 12px;\n // font-size: 11px;\n // font-weight: 600;\n // display: flex;\n // align-items: center;\n // gap: 6px;\n // backdrop-filter: blur(10px);\n // -webkit-backdrop-filter: blur(10px);\n // z-index: 10;\n // `;\n \n // const statusDot = document.createElement('div');\n // statusDot.style.cssText = `\n // width: 6px;\n // height: 6px;\n // background: #fff;\n // border-radius: 50%;\n // animation: pulse 2s infinite;\n // `;\n \n // statusIndicator.appendChild(statusDot);\n // statusIndicator.appendChild(document.createTextNode('LIVE'));\n // videoContainer.appendChild(statusIndicator);\n\n // Create buttons container with clean layout\n const buttonsDiv = document.createElement('div');\n buttonsDiv.style.cssText = `\n display: flex;\n gap: 12px;\n justify-content: center;\n align-items: center;\n padding: ${this.isMobile ? '10px' : '20px'};\n padding-bottom: 0px;\n background: transparent;\n flex-wrap: wrap;\n `;\n\n // Create capture button with clean design\n const captureBtn = document.createElement('button');\n captureBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"#e3e3e3\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path d=\"M20 4h-3.17L15 2H9L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h4.05l1.83-2h4.24l1.83 2H20v12zM12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z\"/>\n </svg>\n ${this.isMobile ? '' : '&nbsp;Capture'}\n `;\n captureBtn.style.cssText = `\n background: linear-gradient(135deg, #007AFF 0%, #0051D5 100%);\n color: white;\n border: none;\n padding: ${this.isMobile ? '12px' : '14px 20px'};\n border-radius: 25px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n width: auto;\n height: auto;\n min-width: ${this.isMobile ? '50px': '100px'};\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n box-shadow: 0 4px 20px rgba(0, 122, 255, 0.4);\n `;\n\n captureBtn.addEventListener('mouseenter', () => {\n captureBtn.style.transform = 'scale(1.05)';\n captureBtn.style.boxShadow = '0 8px 25px rgba(0, 122, 255, 0.6)';\n });\n \n captureBtn.addEventListener('mouseleave', () => {\n captureBtn.style.transform = 'scale(1)';\n captureBtn.style.boxShadow = '0 4px 20px rgba(0, 122, 255, 0.4)';\n });\n\n // Create library button with clean design\n const libraryBtn = document.createElement('button');\n libraryBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"#e3e3e3\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path d=\"M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z\"/>\n </svg>\n ${this.isMobile ? '' : '&nbsp;Upload'}\n `;\n libraryBtn.style.cssText = `\n background: linear-gradient(135deg, #34C759 0%, #248A3D 100%);\n color: white;\n border: none;\n padding: ${this.isMobile ? '12px' : '14px 20px'};\n border-radius: 25px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n width: auto;\n height: auto;\n min-width: ${this.isMobile ? '50px': '100px'};\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n box-shadow: 0 4px 20px rgba(52, 199, 89, 0.4);\n `;\n\n libraryBtn.addEventListener('mouseenter', () => {\n libraryBtn.style.transform = 'scale(1.05)';\n libraryBtn.style.boxShadow = '0 8px 25px rgba(52, 199, 89, 0.6)';\n });\n \n libraryBtn.addEventListener('mouseleave', () => {\n libraryBtn.style.transform = 'scale(1)';\n libraryBtn.style.boxShadow = '0 4px 20px rgba(52, 199, 89, 0.4)';\n });\n\n // Create cancel button with clean design\n const cancelBtn = document.createElement('button');\n cancelBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"#e3e3e3\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/>\n </svg>\n ${this.isMobile ? '' : '&nbsp;Cancel'}\n `;\n cancelBtn.style.cssText = `\n background: rgba(255, 255, 255, 0.1);\n color: white;\n border: 2px solid rgba(255, 255, 255, 0.3);\n padding: ${this.isMobile ? '12px' : '14px 20px'};\n border-radius: 25px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n width: auto;\n height: auto;\n min-width: ${this.isMobile ? '50px': '100px'};\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n `;\n\n cancelBtn.addEventListener('mouseenter', () => {\n cancelBtn.style.background = 'rgba(255, 255, 255, 0.3)';\n cancelBtn.style.transform = 'scale(1.05)';\n });\n \n cancelBtn.addEventListener('mouseleave', () => {\n cancelBtn.style.background = 'rgba(255, 255, 255, 0.1)';\n cancelBtn.style.transform = 'scale(1)';\n });\n\n // Add elements to modal with proper structure\n videoContainer.appendChild(video);\n buttonsDiv.appendChild(captureBtn);\n buttonsDiv.appendChild(libraryBtn);\n buttonsDiv.appendChild(cancelBtn);\n mainContainer.appendChild(videoContainer);\n mainContainer.appendChild(buttonsDiv);\n modal.appendChild(mainContainer);\n document.body.appendChild(modal);\n\n // Handle camera switching with modern loading states\n if (switchCameraBtn && videoDevices && videoDevices.length > 1) {\n switchCameraBtn.addEventListener('click', async () => {\n try {\n // Show loading state\n switchCameraBtn!.style.opacity = '0.7';\n switchCameraBtn!.style.pointerEvents = 'none';\n switchCameraBtn!.innerHTML = `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"margin-right: 8px; animation: spin 1s linear infinite;\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" opacity=\"0.3\"/>\n <path d=\"M12 2a10 10 0 0 1 10 10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n `;\n \n // Add spin animation\n const spinStyle = document.createElement('style');\n spinStyle.textContent = `\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n if (!document.querySelector('[data-spin-style]')) {\n spinStyle.setAttribute('data-spin-style', 'true');\n document.head.appendChild(spinStyle);\n }\n\n // Stop current stream\n currentStream.getTracks().forEach(track => track.stop());\n \n // Move to next camera\n currentDeviceIndex = (currentDeviceIndex + 1) % videoDevices.length;\n \n // Get new stream\n const newStream = await navigator.mediaDevices.getUserMedia({\n video: {\n deviceId: videoDevices[currentDeviceIndex].deviceId,\n width: { ideal: 1920 },\n height: { ideal: 1080 }\n }\n });\n \n currentStream = newStream;\n video.srcObject = newStream;\n\n // Reset button state\n setTimeout(() => {\n switchCameraBtn!.style.opacity = '1';\n switchCameraBtn!.style.pointerEvents = 'auto';\n switchCameraBtn!.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#e3e3e3\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g><path d=\"M20,5h-3.17L15,3H9L7.17,5H4C2.9,5,2,5.9,2,7v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M20,19H4V7 h3.17h0.88l0.59-0.65L9.88,5h4.24l1.24,1.35L15.95,7h0.88H20V19z\"/></g><g><path d=\"M12,17c-2.21,0-4-1.79-4-4h2l-2.5-2.5L5,13h2c0,2.76,2.24,5,5,5c0.86,0,1.65-0.24,2.36-0.62l-0.74-0.74 C13.13,16.87,12.58,17,12,17z\"/></g><g><path d=\"M12,8c-0.86,0-1.65,0.24-2.36,0.62l0.74,0.73C10.87,9.13,11.42,9,12,9c2.21,0,4,1.79,4,4h-2l2.5,2.5L19,13h-2 C17,10.24,14.76,8,12,8z\"/></g></g></g></svg>\n `;\n }, 500);\n } catch (error) {\n console.error('Error switching camera:', error);\n this.helper.showErrorMsg('Failed to switch camera. Please try again.', 'Error', 3000);\n \n // Reset button on error\n switchCameraBtn!.style.opacity = '1';\n switchCameraBtn!.style.pointerEvents = 'auto';\n switchCameraBtn!.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#e3e3e3\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g><path d=\"M20,5h-3.17L15,3H9L7.17,5H4C2.9,5,2,5.9,2,7v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M20,19H4V7 h3.17h0.88l0.59-0.65L9.88,5h4.24l1.24,1.35L15.95,7h0.88H20V19z\"/></g><g><path d=\"M12,17c-2.21,0-4-1.79-4-4h2l-2.5-2.5L5,13h2c0,2.76,2.24,5,5,5c0.86,0,1.65-0.24,2.36-0.62l-0.74-0.74 C13.13,16.87,12.58,17,12,17z\"/></g><g><path d=\"M12,8c-0.86,0-1.65,0.24-2.36,0.62l0.74,0.73C10.87,9.13,11.42,9,12,9c2.21,0,4,1.79,4,4h-2l2.5,2.5L19,13h-2 C17,10.24,14.76,8,12,8z\"/></g></g></g></svg>\n `;\n }\n });\n }\n\n // Handle library button click\n libraryBtn.addEventListener('click', () => {\n this.cleanupCameraModal(currentStream, modal);\n this.openImageSelector();\n });\n\n // Handle capture with modern effects\n captureBtn.addEventListener('click', () => {\n // Create capture flash effect\n const flashOverlay = document.createElement('div');\n flashOverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.8);\n border-radius: 16px;\n animation: flash 0.3s ease-out;\n pointer-events: none;\n z-index: 10;\n `;\n \n // Add flash animation\n const flashStyle = document.createElement('style');\n flashStyle.textContent = `\n @keyframes flash {\n 0% { opacity: 0; }\n 50% { opacity: 1; }\n 100% { opacity: 0; }\n }\n `;\n if (!document.querySelector('[data-flash-style]')) {\n flashStyle.setAttribute('data-flash-style', 'true');\n document.head.appendChild(flashStyle);\n }\n \n videoContainer.appendChild(flashOverlay);\n \n // Remove flash effect after animation\n setTimeout(() => {\n if (flashOverlay.parentNode) {\n flashOverlay.parentNode.removeChild(flashOverlay);\n }\n }, 300);\n\n // Set canvas dimensions to match video\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n \n // Draw video frame to canvas\n ctx?.drawImage(video, 0, 0);\n \n // Close modal immediately after capture\n this.cleanupCameraModal(currentStream, modal);\n \n // Convert canvas to blob\n canvas.toBlob(async (blob) => {\n if (blob) {\n // Create a file from the blob\n const file = new File([blob], `camera-capture-${Date.now()}.jpg`, {\n type: 'image/jpeg',\n lastModified: Date.now()\n });\n\n // Create a fake event to pass to detectImages\n const fakeEvent = {\n target: {\n files: [file],\n value: ''\n },\n preventDefault: () => {}\n };\n\n // Process the captured image\n await this.detectImages(fakeEvent);\n }\n }, 'image/jpeg', 0.9);\n });\n\n // Handle cancel\n cancelBtn.addEventListener('click', () => {\n this.cleanupCameraModal(currentStream, modal);\n });\n\n // Handle ESC key\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.cleanupCameraModal(currentStream, modal);\n document.removeEventListener('keydown', handleKeyPress);\n }\n };\n document.addEventListener('keydown', handleKeyPress);\n }\n\n private cleanupCameraModal(stream: MediaStream, modal: HTMLElement) {\n // Stop all video tracks\n stream.getTracks().forEach(track => track.stop());\n \n // Remove modal from DOM\n if (modal.parentNode) {\n modal.parentNode.removeChild(modal);\n }\n }\n\n async detectImages(event: any, index: number = -1) {\n console.log('detectImages:', event);\n event.preventDefault();\n\n if (this.config?.limit === 1) {\n this.filesArray = []; // Reset array for a single image\n }\n\n const files = event.target.files;\n if (!files) {\n this.helper.showErrorMsg('Please select an image', 'Error', 3000);\n return;\n }\n\n // Validate file types based on accept parameter\n if (this.isValidateMimeType && !this.validateFileTypes(files)) {\n return;\n }\n\n if ((this.filesArray?.length + files.length) > this.config?.limit) {\n this.helper.showErrorMsg(`You can upload a maximum of ${this.config?.limit} images`, 'Error', 3000);\n return;\n }\n\n this.loading = true;\n this.uploadInProgress.emit(true);\n\n let uploadedImages: any[] = [];\n\n // Pre-allocate slots in filesArray to avoid race conditions\n const startIndex = this.filesArray.length;\n const placeholders = [...files].map((file, idx) => ({\n tempId: `temp-${Date.now()}-${idx}`,\n title: file.name,\n name: file.name,\n loading: true,\n filename: file.name,\n s3Url: '', // Will be filled during processing\n sequence: this.isAddUploadedFileInLastNode ? startIndex + idx + 1 : this.filesArray.length + 1 - idx\n }));\n\n // Add all placeholders at once to prevent race conditions\n if (this.isAddUploadedFileInLastNode) {\n this.filesArray = [...this.filesArray, ...placeholders];\n } else {\n this.filesArray = [...placeholders.reverse(), ...this.filesArray];\n }\n this.setSliderLoading();\n\n // Process all images concurrently with their pre-assigned indices\n await Promise.all([...files].map((file, idx) => {\n const targetIndex = this.isAddUploadedFileInLastNode ? startIndex + idx : idx;\n return this.processImage(file, uploadedImages, targetIndex, placeholders[this.isAddUploadedFileInLastNode ? idx : files.length - 1 - idx].tempId);\n }));\n\n if (this.config?.isStoredDb) {\n await this.uploadImages(uploadedImages);\n }\n\n this.loading = false;\n this.uploadInProgress.emit(false);\n\n this.onSubmit(); // Call once after all uploads\n this.updateSequence();\n\n \n // Reset the input value so the same file can be selected again\n event.target.value = '';\n }\n\n async processImage(file: File, uploadedImages: any[], index: number, tempId?: string) {\n let fileSize = file.size / 1024;\n if (this.config?.fileSize && fileSize > this.config?.fileSize) {\n let maxSize = this.config.fileSize / 1024;\n this.helper.showErrorMsg(`File size must be ≤ ${maxSize >= 1 ? maxSize : this.config.fileSize} ${maxSize >= 1 ? 'MB' : 'KB'}`, 'Error', 3000);\n return;\n }\n\n return new Promise<void>((resolve) => {\n let reader = new FileReader();\n reader.onload = async (e: any) => {\n let mimeType = file.type;\n let compressedImage = this.config?.isCompressed ? await this.helper.compressFile(e.target?.result, mimeType) : e.target.result;\n\n try {\n let uploadResponse = await this.helper.getUploadUrl(this.urlConfig.getUploadUrl, file.name, mimeType, this.currentEntityType).toPromise();\n let uploadData = uploadResponse.data.uploadUrlData;\n \n // For initial display, use a data URL for preview but ensure S3 URL is used for database\n let dataUrl = await this.helper.getDataUrlFromFile(file);\n\n let currentImageData = {\n tempId: tempId || `temp-${Date.now()}`,\n title: file.name, name: file.name, s3Url: dataUrl, // Temporary preview URL\n filename: file.name, s3Path: uploadData.uploadPath,\n tempS3Url: uploadData.resourceUrl, // This will be the final S3 URL\n id: null,\n uploadData: uploadData, loading: true, // Set loading to true initially\n tags: null, tempTags: null, isEditMode: false, sequence: 1,\n };\n\n // Update the file at the pre-assigned index\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index] = {...this.filesArray[index], ...currentImageData};\n }\n \n this.setSliderLoading();\n uploadedImages.push(currentImageData);\n\n // Upload to S3\n await this.helper.putFile(uploadData.uploadURL, compressedImage).toPromise();\n\n // After successful upload, update with S3 URL and mark as completed\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].s3Url = uploadData.resourceUrl; // Use S3 URL\n this.filesArray[index].loading = false;\n // Ensure uploadData contains the correct S3 URL for database storage\n this.filesArray[index].uploadData.resourceUrl = uploadData.resourceUrl;\n }\n this.setSliderLoading();\n\n resolve();\n } catch (error: any) {\n // Set loading to false on error as well\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].loading = false;\n }\n this.helper.showHttpErrorMsg(error);\n resolve();\n }\n };\n\n reader.readAsArrayBuffer(file);\n });\n }\n\n uploadImages(data: any) {\n return new Promise((resolve, reject) => {\n if (data && data?.length > 0) {\n console.log('There is a image pending to attach:', data);\n\n // Keep track of tempIds for matching after API response\n let tempIdMapping: any[] = [];\n let images: any[] = [];\n let fa = data.map((r: any) => {\n if (r?.uploadData) {\n // Ensure we're using the S3 URL, not base64 data\n const s3Url = r.uploadData.resourceUrl;\n // Store tempId separately for matching, don't send it to API\n tempIdMapping.push({\n tempId: r.tempId,\n resourceUrl: s3Url\n });\n images.push({ \n fileName: r.uploadData?.fileName, \n resourceUrl: s3Url, // This ensures S3 URL is stored in database\n uploadPath: r.uploadData?.uploadPath, \n uploadURL: r.uploadData?.uploadURL\n // tempId removed - not sent to API\n });\n }\n return r;\n });\n\n this.helper.attachFilesToEntity(this.urlConfig?.attachToEntity || 'not-specified', { images: images, entityId: this.currentEntityId, entityType: this.currentEntityType }, this.config.limit).subscribe({\n next: (ir: any) => {\n ir?.data?.map((file: any, idx: number) =>{\n // Match by tempId first (more reliable for concurrent uploads), then fall back to S3 URL\n const uploadedImage = tempIdMapping[idx];\n let selectedIndex = this.filesArray?.findIndex(f => f.tempId === uploadedImage?.tempId);\n \n // Fallback to resourceUrl matching if tempId matching fails\n if(selectedIndex === -1) {\n selectedIndex = this.filesArray?.findIndex(f => f.uploadData?.resourceUrl == file.s3Url);\n }\n \n if(selectedIndex !== -1){\n this.filesArray[selectedIndex] = {\n ...this.filesArray[selectedIndex], \n loading: false, \n id: file?.id || null,\n s3Url: file.s3Url // Ensure we're using the S3 URL from the response\n }\n }\n });\n this.onSubmit();\n resolve(ir);\n },\n error: (imErr: any) => { this.helper.showHttpErrorMsg(imErr); this.onError.emit(true); resolve(false); }\n });\n\n } else {\n resolve(false);\n }\n });\n }\n\n deleteImage(event: any, t: any, index: number, img: any) {\n event.stopPropagation();\n if (this.isEnableDeleteConfirmation) {\n let confirmBoxData: DialogConfig = {\n title: this.dialogConfig?.title || 'Delete Image',\n message: this.deleteConfirmationMsg || (this.dialogConfig?.message || 'Are you sure, you want to delete this image?'),\n iconClass: this.dialogConfig?.iconClass || 'tis-text-danger',\n icon: this.dialogConfig?.icon || 'delete',\n approveButtonText: this.dialogConfig?.approveButtonText || 'Yes, delete',\n approveButtonClass: `tis-approve-button ${this.dialogConfig?.approveButtonClass}`,\n cancelButtonText: this.dialogConfig?.cancelButtonText || 'No',\n cancelButtonClass: `tis-cancel-button ${this.dialogConfig?.cancelButtonClass}`\n };\n\n const panelClass = ['tis-confirmation-dialog'];\n if(this.dialogConfig?.panelClass){\n panelClass.push(this.dialogConfig.panelClass);\n }\n\n const dialogRef = this.dialog.open(TisConfirmationDialogComponent, {\n width: \"450px\",\n panelClass: panelClass,\n data: confirmBoxData,\n disableClose: true,\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log(\"The dialog was closed with result:\", result);\n if (result) {\n this.removeImage(event, index, img);\n }\n });\n }\n else {\n this.removeImage(event, index, img);\n }\n }\n\n /*REMOVE SELECTED IMAGE */\n removeImage(event: any, index: number, img: any) {\n this.loading = true;\n this.filesArray[index].loading = true;\n if (img?.id) {\n delete img.uploadData;\n this.removeUploadedImage(img, index, true);\n }\n else {\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n }\n }\n\n removeUploadedImage(img: any, index: number, silently: boolean = false) {\n console.log(\"removeUploadedImage:\", img);\n this.helper.deleteUploadedFile(this.urlConfig.removeImage, img).subscribe((r: any) => {\n console.log('Image Delete Res:', r);\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n if (!silently) {\n this.helper.showSuccessMsg(r.message, 'Success', 3000);\n }\n },\n (err: any) => { this.filesArray[index].loading = false; this.helper.showErrorMsg(err, \"Error\") })\n }\n\n async detectFiles(event: any, index: number = -1) {\n console.log('detectFiles:', event);\n event.preventDefault();\n\n if (this.config?.limit === 1) {\n this.filesArray = []; // Reset array for a single file\n }\n\n const files = event.target.files;\n if (!files) {\n this.helper.showErrorMsg('Please select a file', 'Error', 3000);\n return;\n }\n\n // Validate file types based on accept parameter\n if (this.isValidateMimeType && !this.validateFileTypes(files)) {\n return;\n }\n\n if ((this.filesArray?.length + files.length) > this.config?.limit) {\n this.helper.showErrorMsg(`You can upload a maximum of ${this.config?.limit} files`, 'Error', 3000);\n return;\n }\n\n this.loading = true;\n this.uploadInProgress.emit(true);\n\n let uploadedFiles: any[] = [];\n\n // Pre-allocate slots in filesArray to avoid race conditions\n const startIndex = this.filesArray.length;\n const placeholders = [...files].map((file, idx) => ({\n tempId: `temp-${Date.now()}-${idx}`,\n title: file.name,\n name: file.name,\n loading: true,\n filename: file.name,\n s3Url: '', // Will be filled during processing\n sequence: this.isAddUploadedFileInLastNode ? startIndex + idx + 1 : this.filesArray.length + 1 - idx\n }));\n\n // Add all placeholders at once to prevent race conditions\n if (this.isAddUploadedFileInLastNode) {\n this.filesArray = [...this.filesArray, ...placeholders];\n } else {\n this.filesArray = [...placeholders.reverse(), ...this.filesArray];\n }\n this.setSliderLoading();\n\n // Process all files concurrently with their pre-assigned indices\n await Promise.all([...files].map((file, idx) => {\n const targetIndex = this.isAddUploadedFileInLastNode ? startIndex + idx : idx;\n return this.processFile(file, uploadedFiles, targetIndex, placeholders[this.isAddUploadedFileInLastNode ? idx : files.length - 1 - idx].tempId);\n }));\n\n if (this.config?.isStoredDb) {\n await this.uploadFiles(uploadedFiles);\n }\n\n this.loading = false;\n this.uploadInProgress.emit(false);\n\n this.onSubmit(); // Call once after all uploads\n this.updateSequence();\n\n // Reset the input value so the same file can be selected again\n event.target.value = '';\n }\n\n async processFile(file: File, uploadedFiles: any[], index: number, tempId?: string) {\n let fileSize = file.size / 1024;\n if (this.config?.fileSize && fileSize > this.config?.fileSize) {\n let maxSize = this.config.fileSize / 1024;\n this.helper.showErrorMsg(`File size must be ≤ ${maxSize >= 1 ? maxSize : this.config.fileSize} ${maxSize >= 1 ? 'MB' : 'KB'}`, 'Error', 3000);\n return;\n }\n\n return new Promise<void>((resolve) => {\n let reader = new FileReader();\n reader.onload = async (e: any) => {\n let mimeType = file.type;\n let buffer = new Uint8Array(<ArrayBuffer>reader.result);\n\n try {\n let uploadResponse = await this.helper.getUploadUrl(this.urlConfig.getUploadUrl, file.name, mimeType, this.currentEntityType).toPromise();\n let uploadData = uploadResponse.data.uploadUrlData;\n\n let currentFileData = {\n tempId: tempId || `temp-${Date.now()}`,\n title: file.name, name: file.name, s3Url: uploadData.resourceUrl, // Use S3 URL\n s3Path: uploadData.uploadPath, filename: file.name, id: null,\n uploadData: uploadData, loading: true, buffer: buffer, // Set loading to true initially\n tags: null, tempTags: null, isEditMode: false, sequence: 1,\n };\n\n // Update the file at the pre-assigned index\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index] = {...this.filesArray[index], ...currentFileData};\n }\n \n this.setSliderLoading();\n uploadedFiles.push(currentFileData);\n\n // Upload to S3\n await this.helper.putFile(uploadData.uploadURL, e.target.result).toPromise();\n\n // After successful upload, ensure S3 URL is used and mark as completed\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].s3Url = uploadData.resourceUrl; // Ensure S3 URL\n this.filesArray[index].loading = false;\n // Ensure uploadData contains the correct S3 URL for database storage\n this.filesArray[index].uploadData.resourceUrl = uploadData.resourceUrl;\n }\n this.setSliderLoading();\n\n resolve();\n } catch (error: any) {\n // Set loading to false on error as well\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].loading = false;\n }\n this.helper.showHttpErrorMsg(error);\n resolve();\n }\n };\n\n reader.readAsArrayBuffer(file);\n });\n }\n\n uploadFiles(data: any) {\n return new Promise((resolve, reject) => {\n if (data && data.length > 0) {\n console.log('There is a file pending to attach:', data);\n\n // Keep track of tempIds for matching after API response\n let tempIdMapping: any[] = [];\n let files: any[] = [];\n let fa = data.map((r: any) => {\n if (r?.uploadData) {\n // Ensure we're using the S3 URL, not any local file data\n const s3Url = r.uploadData.resourceUrl;\n // Store tempId separately for matching, don't send it to API\n tempIdMapping.push({\n tempId: r.tempId,\n resourceUrl: s3Url\n });\n files.push({ \n fileName: r.uploadData?.fileName, \n resourceUrl: s3Url, // This ensures S3 URL is stored in database\n uploadPath: r.uploadData?.uploadPath, \n uploadURL: r.uploadData?.uploadURL\n // tempId removed - not sent to API\n });\n }\n return r;\n });\n\n this.helper.attachFilesToEntity(this.urlConfig?.attachToEntity || 'not-specified', { files: files, entityId: this.currentEntityId, entityType: this.currentEntityType }, this.config.limit).subscribe({\n next: (ir: any) => {\n ir?.data?.map((file: any, idx: number) =>{\n // Match by tempId first (more reliable for concurrent uploads), then fall back to S3 URL\n const uploadedFile = tempIdMapping[idx];\n let selectedIndex = this.filesArray?.findIndex(f => f.tempId === uploadedFile?.tempId);\n \n // Fallback to resourceUrl matching if tempId matching fails\n if(selectedIndex === -1) {\n selectedIndex = this.filesArray?.findIndex(f => f.uploadData?.resourceUrl == file.s3Url);\n }\n \n if(selectedIndex !== -1){\n this.filesArray[selectedIndex] = {\n ...this.filesArray[selectedIndex], \n loading: false, \n id: file?.id || null,\n s3Url: file.s3Url // Ensure we're using the S3 URL from the response\n }\n }\n });\n this.onSubmit();\n resolve(ir);\n },\n error: (imErr: any) => { this.helper.showHttpErrorMsg(imErr); this.onError.emit(true); resolve(false); }\n });\n } else {\n resolve(false);\n }\n });\n }\n\n deleteFile(event: any, t: any, index: number, file: any) {\n event.stopPropagation();\n if (this.isEnableDeleteConfirmation) {\n let confirmBoxData: DialogConfig = {\n title: this.dialogConfig?.title || 'Delete File',\n message: this.deleteConfirmationMsg || (this.dialogConfig?.message || 'Are you sure, you want to delete this file?'),\n iconClass: this.dialogConfig?.iconClass || 'tis-text-danger',\n icon: this.dialogConfig?.icon || 'delete',\n approveButtonText: this.dialogConfig?.approveButtonText || 'Yes, delete',\n approveButtonClass: `tis-approve-button ${this.dialogConfig?.approveButtonClass}`,\n cancelButtonText: this.dialogConfig?.cancelButtonText || 'No',\n cancelButtonClass: `tis-cancel-button ${this.dialogConfig?.cancelButtonClass}`\n };\n\n const panelClass = ['tis-confirmation-dialog'];\n if(this.dialogConfig?.panelClass){\n panelClass.push(this.dialogConfig.panelClass);\n }\n\n const dialogRef = this.dialog.open(TisConfirmationDialogComponent, {\n width: \"450px\",\n panelClass: panelClass,\n data: confirmBoxData,\n disableClose: true,\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log(\"The dialog was closed with result:\", result);\n if (result) {\n this.removeFile(event, index, file);\n }\n });\n }\n else {\n this.removeFile(event, index, file);\n }\n }\n\n removeFile(event: any, index: number, file: any) {\n this.loading = true;\n this.filesArray[index].loading = true;\n if (file?.id) {\n delete file.uploadData;\n this.removeUploadedFile(file, index, true);\n }\n else {\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n this.onFileRemoved.emit(true);\n }\n }\n\n removeUploadedFile(file: any, index: number, silently = false) {\n console.log(\"removeUploadedFile:\", file);\n this.helper.deleteUploadedFile(this.urlConfig.removeImage, file).subscribe((r: any) => {\n console.log('File Delete Res:', r);\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n if (!silently) {\n this.helper.showSuccessMsg(r.message, 'Success', 3000);\n }\n this.onSubmit();\n },\n (err: any) => { this.filesArray[index].loading = false; this.helper.showErrorMsg(err, \"Error\") })\n }\n\n onSubmit() {\n // this.filesArray = this.filesArray?.map((r, i) => { r.s3Url = r?.uploadData?.resourceUrl; return r; });\n this.onUploaded.emit(this.filesArray);\n }\n\n async downloadFile(url: string, fileName: string) {\n try {\n // First try with fetch\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/octet-stream',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const blob = await response.blob();\n \n // Check if blob has content\n if (blob.size === 0) {\n throw new Error('File is empty or could not be fetched');\n }\n\n // Create download link\n const blobUrl = URL.createObjectURL(blob);\n const el = document.createElement(\"a\");\n el.href = blobUrl;\n el.download = fileName;\n el.style.display = 'none';\n \n // Add to DOM, click, and remove\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n \n // Cleanup blob URL\n setTimeout(() => {\n URL.revokeObjectURL(blobUrl);\n }, 100);\n\n } catch (error) {\n console.error(\"Fetch download failed, trying alternative method:\", error);\n \n // Fallback: Try direct link opening\n try {\n const el = document.createElement(\"a\");\n el.href = url;\n el.download = fileName;\n el.target = '_blank';\n el.style.display = 'none';\n \n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n \n } catch (fallbackError) {\n console.error(\"All download methods failed:\", fallbackError);\n this.helper.showErrorMsg(\"Failed to download file. Please try again or contact support.\", 'Error', 5000);\n }\n }\n }\n\n clickTimeout: any = null;\n clickDelay: number = 250; // Delay in milliseconds to distinguish single and double click\n\n onSelectFile(file: any) {\n if (this.config.selectionMode) {\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n this.clickTimeout = null;\n this.openFile(file); // Double-click detected\n } else {\n this.clickTimeout = setTimeout(() => {\n this.clickTimeout = null;\n if (this.config.selectionMode) {\n this.onFileSelect.emit(file); // Single-click detected\n }\n }, this.clickDelay);\n }\n }\n else {\n this.clickTimeout = null;\n this.openFile(file);\n }\n }\n\n openFile(file: any) {\n if (!this.config.hiddenPreview) {\n this.openPreviewDialog(file.s3Url, file.title);\n }\n }\n\n openPreviewDialog(url: string, title: string): void {\n if (url.indexOf('.jpg') != -1 || url.indexOf('.jpeg') != -1 || url.indexOf('.png') != -1) {\n this.openImagePreviewDialog(url);\n }\n else if (url.indexOf('.pdf') != -1) {\n this.openFileViewer(url, 'pdf');\n }\n // else if(url.indexOf('.csv') != -1){\n // this.openFileViewer(url, 'csv');\n // }\n else if (url.indexOf('.xlxs') != -1 || url.indexOf('.xlx') != -1 || url.indexOf('.xls') != -1) {\n this.openFileViewer(url, 'excel');\n }\n else {\n this.downloadFile(url, title);\n }\n }\n\n openImagePreviewDialog(url: string): void {\n const dialogRef = this.dialog.open(TisPreviewImageComponent, {\n panelClass: ['mat-p-0', 'relative'],\n data: { url },\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log('The dialog was closed', result);\n });\n }\n\n openFileViewer(pdfUrl: string, fileType: FileViewerFileType) {\n let dialogData: FileViewerDialogData = {\n src: pdfUrl,\n fileType: fileType\n };\n\n const dialogRef = this.dialog.open(TisFileViewerComponent, {\n width: this.isMobile ? \"100%\" : \"90%\",\n height: this.isMobile ? \"100%\" : \"98%\",\n minHeight: this.isMobile ? \"100%\" : \"80%\",\n maxWidth: this.isMobile ? \"100%\" : \"100%\",\n panelClass: ['tis-file-viewer'],\n data: dialogData,\n disableClose: false,\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log(\"FileViewer Dialog Closed\");\n });\n }\n\n checkingForPreview(img: string) {\n let imageArray = img.split('.');\n let imageType = imageArray[imageArray?.length - 1];\n if (imageType == 'png' || imageType == 'jpg' || imageType == 'jpeg') {\n return true;\n }\n else {\n return false;\n }\n }\n\n generateFilesForSingleCard(){\n if(this.filesArray?.length < this.config.limit){\n for (let index = 0; index < (this.config.limit - this.filesArray?.length); index++) {\n this.filesArray.push({\n selectorId: generateRandomString(10),\n tags: null,\n tempTags: null,\n isEditMode: false\n });\n }\n }\n else{\n this.filesArray = this.filesArray?.map((file: any) => {\n return {...file, selectorId: generateRandomString(10), tempTag: null, isEditMode: false};\n });\n }\n }\n\n editTagWithSpace(file: any){\n console.log(\"=== editTagWithSpace :: file ===\", file);\n \n let tempTag: any = file?.tempTags?.trim();\n console.log(\"=== editTagWithSpace :: tempTag ===\", tempTag);\n\n if(tempTag && tempTag != ''){\n let tempTagsArr: any[] = tempTag?.split(' ');\n console.log(\"=== editTagWithSpace :: before tempTagsArr ===\", tempTagsArr);\n\n tempTagsArr = tempTagsArr?.filter(e => (e && e != ''))?.map(t =>{\n if (t.includes('#')) {}\n else{\n t = `#${t}`;\n }\n return t;\n });\n\n tempTag = tempTagsArr.join(' ');\n file.tempTags = `${tempTag}`;\n }\n else{\n file.tempTags = tempTag\n }\n }\n\n // onKeydown(event: KeyboardEvent, file: any) {\n // if (event.key === ',' || event.keyCode === 188) {\n // event.preventDefault();\n // this.editTagWithComma(file);\n // }\n // }\n\n // editTagWithComma(file: any){\n // let tempTag: any = file?.tempTags?.trim();\n\n // if(tempTag && tempTag != ''){\n // let tempTagsArr: any[] = tempTag?.split(' ');\n // tempTagsArr = tempTagsArr?.filter(e => (e && e != ''))?.map(t =>{\n // if (t.includes('#')) {}\n // else{\n // t = `#${t}`;\n // }\n // return t;\n // });\n\n // tempTag = tempTagsArr.join(' ');\n // tempTag = tempTag.replace(/,/g, '');\n // file.tempTags = `${tempTag} `;\n // }\n // else{\n // file.tempTags = tempTag\n // }\n // }\n\n onSubmitTags(file: any){\n file.tags = file?.tempTags?.trim();\n file.isEditMode = false;\n this.helper.updateTag(this.urlConfig?.updateTag || 'not-specified', {id: file?.id || null, tag: file?.tags || null}).subscribe({\n next: (ir: any) => {\n this.helper.showSuccessMsg(ir.message, 'Success', 3000);\n this.onSubmit();\n },\n error: (err: any) => this.helper.showHttpErrorMsg(err)\n });\n }\n\n // Drag state for highlighting\n isDragging = false;\n dragSourceIndex: number | null = null;\n dropTargetIndex: number | null = null;\n\n onDragStarted(index: number) {\n this.isDragging = true;\n this.dragSourceIndex = index;\n this.dropTargetIndex = null;\n }\n\n onDragEntered(index: number) {\n if (this.isDragging && index !== this.dragSourceIndex) {\n this.dropTargetIndex = index;\n }\n }\n\n onDragMoved(event: CdkDragMove) {\n if (!this.isDragging) return;\n \n const pointerPosition = event.pointerPosition;\n const dropItems = document.querySelectorAll('.drag-drop-item');\n \n let foundTarget: number | null = null;\n \n dropItems.forEach((item) => {\n const rect = item.getBoundingClientRect();\n const index = parseInt(item.getAttribute('data-index') || '-1', 10);\n \n if (index !== -1 && index !== this.dragSourceIndex) {\n if (\n pointerPosition.x >= rect.left &&\n pointerPosition.x <= rect.right &&\n pointerPosition.y >= rect.top &&\n pointerPosition.y <= rect.bottom\n ) {\n foundTarget = index;\n }\n }\n });\n \n this.dropTargetIndex = foundTarget;\n }\n\n onMouseEnterItem(index: number) {\n if (this.isDragging && index !== this.dragSourceIndex) {\n this.dropTargetIndex = index;\n }\n }\n\n onMouseLeaveItem() {\n // Only clear if we're dragging - the next mouseenter will set the new target\n }\n\n onDragEnded() {\n // Don't reset state here - let drop() handle it\n // This event fires BEFORE drop(), so resetting here clears our tracked indices\n this.isDragging = false;\n // Keep dragSourceIndex and dropTargetIndex - they'll be reset in drop()\n }\n\n drop(event: CdkDragDrop<any[]>) {\n // Use our tracked source index instead of CDK's previousIndex (which is unreliable for grids)\n const sourceIndex = this.dragSourceIndex !== null ? this.dragSourceIndex : event.previousIndex;\n const targetIndex = this.dropTargetIndex !== null ? this.dropTargetIndex : event.currentIndex;\n\n // Log drag info for debugging\n const draggedItem = this.filesArray[sourceIndex];\n console.log('=== DRAG & DROP DEBUG ===');\n console.log('Picked element:', {\n title: draggedItem?.title || draggedItem?.s3Url?.split('/').pop(),\n originalPosition: sourceIndex + 1,\n s3Url: draggedItem?.s3Url\n });\n console.log('Dropping at position:', targetIndex + 1);\n console.log('dragSourceIndex (our tracking):', this.dragSourceIndex);\n console.log('dropTargetIndex (our tracking):', this.dropTargetIndex);\n console.log('event.currentIndex (CDK):', event.currentIndex);\n console.log('event.previousIndex (CDK):', event.previousIndex);\n\n // Reset drag state\n this.isDragging = false;\n this.dragSourceIndex = null;\n this.dropTargetIndex = null;\n\n // Ignore if same position\n if (sourceIndex === targetIndex) {\n console.log('Same position - no change needed');\n return;\n }\n\n // Access current data\n const currentData = [...this.filesArray];\n\n if (!currentData || currentData.length === 0) {\n return;\n }\n\n // Reorder: move item from source to target position (shift other items)\n moveItemInArray(currentData, sourceIndex, targetIndex);\n\n // Update filesArray with reordered data\n this.filesArray = currentData;\n\n // Log after reorder\n const newPosition = this.filesArray.findIndex((f: any) => f.s3Url === draggedItem?.s3Url);\n console.log('After reorder - element new position:', newPosition + 1);\n console.log('=========================');\n\n this.updateSequence(true);\n }\n\n updateSequence(isShowMessage: boolean = false){\n // Update sequence for all files (including those without id yet)\n // Re-calculate sequence based on current array order\n this.filesArray = this.filesArray.map((file: any, index: number) => {\n return {...file, sequence: (index + 1)};\n });\n\n if(this.enableDragNDrop && this.urlConfig?.updateSequence){\n // Only send files with id to the server for sequence update\n let filesWithId: any[] = this.filesArray.filter(f => f?.id && f?.id != null && f?.id != '');\n let files: any[] = filesWithId?.length ? JSON.parse(JSON.stringify(filesWithId)) : [];\n files = files?.map(f =>{\n return {id: f?.id, sequence: f?.sequence || 1};\n });\n \n if(files.length > 0) {\n this.helper.updateSequence(this.urlConfig?.updateSequence || 'not-specified', {files}).subscribe({\n next: (ir: any) => {\n if(isShowMessage){\n this.helper.showSuccessMsg(ir.message, 'Success', 3000);\n }\n else{\n // Only show success message when files actually have IDs (meaning they were uploaded)\n if(filesWithId.length > 0) {\n this.helper.showSuccessMsg(`${this.type == 'image' ? 'Image' : 'File'} has been uploaded successfully`, 'Success', 3000);\n }\n }\n this.dataSequenceChange.emit(this.filesArray);\n },\n error: (err: any) => { this.helper.showHttpErrorMsg(err); this.onError.emit(true); }\n });\n } else {\n // If no files with id yet, just emit the current array\n this.dataSequenceChange.emit(this.filesArray);\n }\n }\n else{\n this.dataSequenceChange.emit(this.filesArray);\n }\n }\n\n getTagsArray(tags: string){\n let tempTag: any = tags?.trim();\n let tempTagsArr: any[] = tempTag?.split(' ');\n\n return tempTagsArr?.filter(e => e && e != '');\n }\n\n // =====================\n // Remote Upload Methods\n // =====================\n\n /**\n * Check if remote upload is available and configured\n */\n isRemoteUploadAvailable(): boolean {\n return !!(\n this.remoteUploadConfig?.enabled &&\n this.remoteUploadConfig?.socketAdapter &&\n !this.isMobile &&\n !this.isTab\n );\n }\n\n /**\n * Initialize remote upload configuration\n * Call this in ngOnInit or when config changes\n */\n private initRemoteUpload(): void {\n if (this.remoteUploadConfig?.enabled && this.remoteUploadConfig?.socketAdapter) {\n this.remoteUploadService.configure(this.remoteUploadConfig);\n\n // Subscribe to remote uploads\n this.remoteUploadService.getRemoteUploads()\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n this.handleRemoteUpload(event);\n });\n }\n }\n\n /**\n * Handle a remote upload event\n */\n private handleRemoteUpload(event: TisRemoteUploadEvent): void {\n console.log('[TisImageAndFileUploadAndView] Remote upload received:', event);\n\n // Check if we've reached the limit\n if (this.config?.limit && this.filesArray.length >= this.config.limit) {\n this.helper.showErrorMsg(`Maximum limit of ${this.config.limit} files reached.`, 'Limit Reached');\n return;\n }\n\n // Add the uploaded file to the array\n const newFile = {\n s3Url: event.file.s3Url,\n title: event.file.fileName,\n name: event.file.fileName,\n filename: event.file.fileName,\n mimeType: event.file.mimeType,\n size: event.file.size,\n uploadData: event.file.uploadData,\n loading: false,\n sequence: this.filesArray.length + 1,\n remoteUpload: true,\n mobileDeviceId: event.mobileDeviceId,\n uploadedAt: event.timestamp\n };\n\n if (this.isAddUploadedFileInLastNode) {\n this.filesArray.push(newFile);\n } else {\n this.filesArray.unshift(newFile);\n }\n\n this.setSliderLoading();\n this.onSubmit();\n this.updateSequence();\n this.onRemoteUpload.emit(event);\n\n this.helper.showSuccessMsg(\n `${this.type === 'image' ? 'Image' : 'File'} uploaded from mobile device`,\n 'Remote Upload',\n 3000\n );\n }\n\n /**\n * Open the QR code dialog for mobile upload\n */\n openRemoteUploadDialog(): void {\n if (!this.isRemoteUploadAvailable()) {\n this.helper.showErrorMsg('Remote upload is not available', 'Not Available');\n return;\n }\n\n const dialogData: TisQrCodeDialogData = {\n title: this.dialogConfig?.title || 'Upload from Mobile',\n subtitle: `Scan this QR code to upload ${this.type === 'image' ? 'images' : 'files'} from your mobile device`,\n qrSize: 200,\n showCountdown: true,\n autoCloseOnUpload: false,\n fieldInfo: {\n label: this.label || `${this.type === 'image' ? 'Images' : 'Files'}`,\n accept: this.accept || (this.type === 'image' ? 'image/*' : '*'),\n type: this.type,\n entityType: this.entityType,\n entityId: this.entityId,\n isMultiple: this.config.isMultiple,\n limit: this.config.limit,\n isCompressed: this.config.isCompressed\n }\n };\n\n const dialogRef = this.dialog.open(TisQrCodeDialogComponent, {\n width: this.isMobile ? '100%' : '420px',\n maxWidth: '100%',\n panelClass: ['tis-qr-code-dialog'],\n data: dialogData,\n disableClose: false\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log('[TisImageAndFileUploadAndView] QR dialog closed:', result);\n // Files are already added via the remote upload subscription\n });\n }\n\n /**\n * Check if currently paired with a mobile device\n */\n isRemotePaired(): boolean {\n return this.remoteUploadService.isPaired();\n }\n\n /**\n * Disconnect from paired mobile device\n */\n disconnectRemote(): void {\n this.remoteUploadService.disconnect();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (config) {\n <input type=\"file\" size=\"60\" id=\"{{config.selectorId}}\" (change)=\"type == 'file'? detectFiles($event): detectImages($event)\" accept=\"{{accept}}\" [multiple]=\"config.isMultiple\" style=\"display: none;\" />\n @if(viewType == 'card'){\n <div [class.image-picker-label]=\"!previewOnly\" [class.error]=\"required && (filesArray?.length || 0) <= 0\" [style.height]=\"filesArray?.length ? null : config?.height\" style=\"--tis-image-picker-height: {{config?.height ?? 0}}\" cdkDropList (cdkDropListDropped)=\"drop($event)\" cdkDropListOrientation=\"horizontal\">\n @if(filesArray?.length){\n <div [ngClass]=\"{'grid-cols-1': config?.cols == 1, 'grid-cols-2': config?.cols == 2, 'grid-cols-3': config?.cols == 3, 'grid-cols-4': config?.cols == 4, 'grid-cols-5': config?.cols == 5, 'grid-cols-6': config?.cols == 6}\" class=\"{{previewInFlex ? 'flex' : 'grid'}} image-list\" style=\"gap: 25px;\">\n @for(file of filesArray; track file.s3Url; let i = $index; let l = $last;){\n @if(enableDragNDrop){\n <div class=\"flex flex-col drag-drop-item\" [attr.data-index]=\"i\" [class.drag-over-highlight]=\"dropTargetIndex === i && isDragging && dragSourceIndex !== i\">\n @if(isShowImageSequence){\n <div class=\"image-description\" style=\"margin-bottom: 15px;\">\n <div class=\"image-description-text\" style=\"text-align: center; font-weight: bold;\">Image {{i + 1}}</div>\n </div>\n }\n <div cdkDrag (cdkDragStarted)=\"onDragStarted(i)\" (cdkDragEnded)=\"onDragEnded()\" (cdkDragMoved)=\"onDragMoved($event)\">\n <div class=\"image-item {{imageItemClass}}\" [class.selected]=\"config?.selectionMode ? selectedId == file.id : false\" [class.tis-curser-pointer]=\"!config?.hiddenPreview || config?.selectionMode\" id=\"image-item-{{config.selectorId}}-{{i}}\" [style.background-image]=\"type == 'file'? '' : 'url('+file.s3Url+')'\" (click)=\"onSelectFile(file)\" cdkDragHandle>\n <mat-icon *ngIf=\"type == 'file'\" class=\"active tis-mat-icon-2x\">description</mat-icon>\n <span class=\"material-icons cancel\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"!disabled && !config.hiddenDeleteBtn && !file?.loading\">highlight_off</span>\n <span class=\"material-icons download\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn && !file?.loading\">download_for_offline</span>\n \n <!-- Loading overlay -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"30\"></mat-progress-spinner>\n </div>\n </div>\n </div>\n @if(config?.enableImageTags){\n <div class=\"image-description\">\n <div class=\"image-description-text\" *ngIf=\"!file?.isEditMode\">\n @if(file?.tags && file?.tags != ''){\n <span class=\"anchor\" *ngFor=\"let tag of getTagsArray(file?.tags)\">{{tag}} </span>\n }\n @else {\n <span>No Tags</span>\n }\n </div>\n <span class=\"material-icons edit-description-btn edit\" style=\"font-size: 20px;\" (click)=\"$event.stopPropagation(); file.tempTags = file.tags; file.isEditMode = true;\" *ngIf=\"!file?.isEditMode && !disabled\">edit</span>\n <div class=\"image-description-edit\" *ngIf=\"file?.isEditMode && !disabled\">\n <!-- (keydown)=\"onKeydown($event, file)\" -->\n <input [(ngModel)]=\"file.tempTags\" placeholder=\"Enter tags here...\" (keydown.enter)=\"onSubmitTags(file)\" (keydown.space)=\"editTagWithSpace(file)\" />\n <div class=\"description-actions\">\n <button class=\"description-action-btn description-cancel-btn\" (click)=\"$event.stopPropagation(); file.tempTags = file.tags; file.isEditMode = false;\">Cancel</button>\n <button class=\"description-action-btn description-save-btn\" (click)=\"$event.stopPropagation(); onSubmitTags(file);\">Save</button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n @else {\n <div class=\"flex flex-col\">\n @if(isShowImageSequence){\n <div class=\"image-description\" style=\"margin-bottom: 15px;\">\n <div class=\"image-description-text\" style=\"text-align: center; font-weight: bold;\">Image {{i + 1}}</div>\n </div>\n }\n <div class=\"image-item {{imageItemClass}}\" [class.selected]=\"config?.selectionMode ? selectedId == file.id : false\" [class.tis-curser-pointer]=\"!config?.hiddenPreview || config?.selectionMode\" id=\"image-item-{{config.selectorId}}-{{i}}\" [style.background-image]=\"type == 'file'? '' : 'url('+file.s3Url+')'\" (click)=\"onSelectFile(file)\">\n <mat-icon *ngIf=\"type == 'file'\" class=\"active tis-mat-icon-2x\">description</mat-icon>\n <span class=\"material-icons cancel\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"!disabled && !config.hiddenDeleteBtn && !file?.loading\">highlight_off</span>\n <span class=\"material-icons download\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn && !file?.loading\">download_for_offline</span>\n \n <!-- Loading overlay -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"30\"></mat-progress-spinner>\n </div>\n </div>\n @if(config?.enableImageTags){\n <div class=\"image-description\">\n <div class=\"image-description-text\" *ngIf=\"!file?.isEditMode\">{{file?.tags || 'No Tags'}}</div>\n <span class=\"material-icons edit-description-btn edit\" style=\"font-size: 20px;\" (click)=\"$event.stopPropagation(); file.isEditMode = true;\" *ngIf=\"!file?.isEditMode && !disabled\">edit</span>\n <div class=\"image-description-edit\" *ngIf=\"file?.isEditMode && !disabled\">\n <!-- (keydown)=\"onKeydown($event, file)\" -->\n <input [(ngModel)]=\"file.tempTags\" placeholder=\"Enter tags here...\" (keydown.enter)=\"onSubmitTags(file)\" (keydown.space)=\"editTagWithSpace(file)\" />\n <div class=\"description-actions\">\n <button class=\"description-action-btn description-cancel-btn\" (click)=\"$event.stopPropagation(); file.tempTags = file.tags; file.isEditMode = false;\">Cancel</button>\n <button class=\"description-action-btn description-save-btn\" (click)=\"$event.stopPropagation(); onSubmitTags(file);\">Save</button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if(l && (config?.limit || 0) > (filesArray?.length || 0) && !disabled){\n <div class=\"flex flex-col\">\n @if(isShowImageSequence){\n <div style=\"margin-top: .5rem; margin-bottom: 15px; height: 35px;\">\n </div>\n }\n <!-- Image upload options in grid -->\n <div class=\"image-item uploader\" id=\"image-item-{{config.selectorId}}-{{i}}-{{i}}\" style=\"display: flex; flex-direction: column; gap: 8px; justify-content: center; align-items: center; cursor: pointer;\" (click)=\"loading ? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon class=\"active\">upload_file</mat-icon>\n <!-- Mobile Upload Button -->\n @if(isRemoteUploadAvailable()){\n <button type=\"button\" class=\"mobile-upload-btn\" (click)=\"$event.stopPropagation(); openRemoteUploadDialog()\" title=\"Upload from Mobile\">\n <mat-icon>smartphone</mat-icon>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n }\n @else if(!disabled){\n <label style=\"display: flex; gap: 12px; flex-direction: column; justify-content: center; align-items: center; height: 100%; cursor: pointer;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon>upload_file</mat-icon>\n <p style=\"text-align: center; font-size: 14px; margin: 0px;\">\n {{label}}\n @if(hint && hint != ''){\n <br>\n <small>{{hint}}</small>\n }\n </p>\n <!-- Mobile Upload Button -->\n @if(isRemoteUploadAvailable()){\n <button type=\"button\" class=\"mobile-upload-btn\" (click)=\"$event.stopPropagation(); openRemoteUploadDialog()\" title=\"Upload from Mobile\">\n <mat-icon>smartphone</mat-icon>\n <span>Upload from Mobile</span>\n </button>\n }\n </label>\n }\n @else{\n <div class=\"not-found-section\" style=\"display: flex; flex-direction: column; justify-content: center; align-items: center; width: 100%; cursor: pointer;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"100%\" viewBox=\"0 0 512 512\" enable-background=\"new 0 0 512 512\" xml:space=\"preserve\">\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M283.000000,513.000000 C188.689560,513.000000 94.879120,513.000000 1.034338,513.000000 C1.034338,342.397858 1.034338,171.795731 1.034338,1.096792 C171.560455,1.096792 342.121002,1.096792 512.840759,1.096792 C512.840759,171.666550 512.840759,342.333252 512.840759,513.000000 C436.462372,513.000000 359.981171,513.000000 283.000000,513.000000 M214.500000,497.000000 C271.998901,496.999969 329.497833,497.019897 386.996674,496.975769 C394.561920,496.969971 401.787231,494.626648 406.395233,488.770782 C412.026520,481.614502 416.644897,473.577057 421.072449,465.572754 C437.390259,436.072754 453.464813,406.438049 469.597321,376.835754 C478.327332,360.816742 487.426758,344.977722 495.530029,328.645905 C501.012421,317.596252 494.173737,304.613556 481.201294,304.861847 C456.377502,305.336975 431.538177,304.999878 406.705292,304.999847 C404.938568,304.999847 403.171844,304.999847 401.000031,304.999847 C401.000031,302.348328 401.003784,300.379181 400.999481,298.410065 C400.935120,269.085632 400.853577,239.761169 400.867645,210.436768 C400.868164,209.340317 401.642242,208.138214 402.315186,207.164581 C408.841400,197.722305 416.441071,188.858276 421.779449,178.792419 C433.290894,157.086823 435.985443,133.380402 431.740631,109.507538 C425.335449,73.484550 405.456726,46.387234 373.051300,29.163473 C356.219269,20.217096 338.040710,16.499708 318.773804,16.813351 C301.234619,17.098873 284.897461,21.133270 269.449402,28.965902 C256.098724,35.735111 244.580948,44.876842 234.887085,56.467457 C224.793365,68.536171 217.675415,82.055397 213.023590,96.957832 C209.186737,109.249481 208.654160,121.911049 208.964157,134.687836 C209.387650,152.143631 214.172058,168.302002 222.741714,183.427231 C224.412766,186.376572 225.987946,189.380234 227.939270,192.969376 C211.045273,192.969376 194.919281,193.199417 178.811310,192.763687 C175.805389,192.682358 172.083817,190.621887 170.038193,188.292847 C160.046188,176.916489 150.561493,165.096268 140.789429,153.524185 C136.493210,148.436600 131.117233,145.037399 124.221672,145.023544 C96.055626,144.966995 67.881424,145.387711 39.727192,144.808304 C28.532793,144.577896 16.775660,156.479080 16.809900,167.857864 C17.130381,274.354980 17.052288,380.853516 16.870073,487.351288 C16.859135,493.743988 19.582472,497.123566 26.503685,497.103851 C88.835381,496.926239 151.167801,497.000000 214.500000,497.000000 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M214.000000,497.000000 C151.167801,497.000000 88.835381,496.926239 26.503685,497.103851 C19.582472,497.123566 16.859135,493.743988 16.870073,487.351288 C17.052288,380.853516 17.130381,274.354980 16.809900,167.857864 C16.775660,156.479080 28.532793,144.577896 39.727192,144.808304 C67.881424,145.387711 96.055626,144.966995 124.221672,145.023544 C131.117233,145.037399 136.493210,148.436600 140.789429,153.524185 C150.561493,165.096268 160.046188,176.916489 170.038193,188.292847 C172.083817,190.621887 175.805389,192.682358 178.811310,192.763687 C194.919281,193.199417 211.045273,192.969376 227.939270,192.969376 C225.987946,189.380234 224.412766,186.376572 222.741714,183.427231 C214.172058,168.302002 209.387650,152.143631 208.964157,134.687836 C208.654160,121.911049 209.186737,109.249481 213.023590,96.957832 C217.675415,82.055397 224.793365,68.536171 234.887085,56.467457 C244.580948,44.876842 256.098724,35.735111 269.449402,28.965902 C284.897461,21.133270 301.234619,17.098873 318.773804,16.813351 C338.040710,16.499708 356.219269,20.217096 373.051300,29.163473 C405.456726,46.387234 425.335449,73.484550 431.740631,109.507538 C435.985443,133.380402 433.290894,157.086823 421.779449,178.792419 C416.441071,188.858276 408.841400,197.722305 402.315186,207.164581 C401.642242,208.138214 400.868164,209.340317 400.867645,210.436768 C400.853577,239.761169 400.935120,269.085632 400.999481,298.410065 C401.003784,300.379181 401.000031,302.348328 401.000031,304.999847 C403.171844,304.999847 404.938568,304.999847 406.705292,304.999847 C431.538177,304.999878 456.377502,305.336975 481.201294,304.861847 C494.173737,304.613556 501.012421,317.596252 495.530029,328.645905 C487.426758,344.977722 478.327332,360.816742 469.597321,376.835754 C453.464813,406.438049 437.390259,436.072754 421.072449,465.572754 C416.644897,473.577057 412.026520,481.614502 406.395233,488.770782 C401.787231,494.626648 394.561920,496.969971 386.996674,496.975769 C329.497833,497.019897 271.998901,496.999969 214.000000,497.000000 M134.597260,321.000000 C127.620270,319.337616 123.942146,323.017517 121.500618,328.932983 C120.498009,331.362091 119.193306,333.673279 117.937233,335.989990 C103.522736,362.575897 89.117485,389.166901 74.653091,415.725647 C67.257729,429.304626 59.689438,442.789490 52.312668,456.378448 C47.974022,464.370728 43.857620,472.483643 39.401810,481.000000 C42.117859,481.000000 44.110912,481.000000 46.103966,481.000000 C144.765793,481.000000 243.427612,481.000031 342.089447,481.000000 C354.922150,481.000000 367.755981,481.100647 380.587189,480.961823 C388.353729,480.877808 394.963684,478.668121 399.028687,471.088623 C414.189636,442.819641 429.540070,414.652191 444.852783,386.464783 C452.465210,372.451935 460.203308,358.507233 467.780884,344.475739 C471.870789,336.902466 475.742279,329.211273 480.010315,321.000000 C364.545990,321.000000 250.059738,321.000000 134.597260,321.000000 M324.557129,242.085190 C327.301666,237.590393 329.664886,232.791306 332.924042,228.707169 C335.118561,225.957092 338.299622,222.950409 341.520416,222.240189 C357.159485,218.791580 371.110535,211.909912 382.881226,201.408112 C405.027954,181.648727 416.679504,157.025070 416.129883,126.765366 C415.719910,104.193253 408.285522,84.336838 393.808441,67.607040 C373.699219,44.368736 348.121246,32.686760 316.779572,33.851212 C294.904785,34.663937 275.751617,42.202290 259.624786,56.188839 C232.720886,79.522171 221.513794,109.436241 227.057266,144.851562 C232.965317,182.596176 262.283539,213.393021 299.806335,221.925400 C304.366974,222.962448 307.440796,225.236969 309.702332,229.227615 C313.147400,235.306534 316.865295,241.230835 320.988098,248.086838 C322.400177,245.685776 323.276184,244.196213 324.557129,242.085190 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M135.085373,321.000000 C250.059738,321.000000 364.545990,321.000000 480.010315,321.000000 C475.742279,329.211273 471.870789,336.902466 467.780884,344.475739 C460.203308,358.507233 452.465210,372.451935 444.852783,386.464783 C429.540070,414.652191 414.189636,442.819641 399.028687,471.088623 C394.963684,478.668121 388.353729,480.877808 380.587189,480.961823 C367.755981,481.100647 354.922150,481.000000 342.089447,481.000000 C243.427612,481.000031 144.765793,481.000000 46.103966,481.000000 C44.110912,481.000000 42.117859,481.000000 39.401810,481.000000 C43.857620,472.483643 47.974022,464.370728 52.312668,456.378448 C59.689438,442.789490 67.257729,429.304626 74.653091,415.725647 C89.117485,389.166901 103.522736,362.575897 117.937233,335.989990 C119.193306,333.673279 120.498009,331.362091 121.500618,328.932983 C123.942146,323.017517 127.620270,319.337616 135.085373,321.000000 M140.500000,440.999939 C132.167938,440.999939 123.835869,440.999023 115.503807,441.000183 C106.978073,441.001343 104.965355,442.559265 105.000999,449.124817 C105.035042,455.395599 107.121445,456.999329 115.262733,456.999634 C146.424759,457.000732 177.586792,457.000153 208.748825,457.000000 C224.913086,456.999939 241.077591,456.952484 257.241425,457.035980 C260.763824,457.054169 263.472839,456.015015 264.705200,452.580017 C267.060974,446.013672 263.486053,441.009705 256.482880,441.007080 C218.155258,440.992767 179.827621,441.000061 140.500000,440.999939 M211.498047,417.000153 C216.330338,416.999176 221.164948,417.091248 225.994263,416.971069 C230.865005,416.849884 232.921509,414.514984 232.998932,409.368042 C233.083664,403.733337 231.121094,401.059509 226.230942,401.046417 C196.071045,400.965607 165.910004,400.915100 135.752502,401.195435 C133.579193,401.215637 130.361252,403.471161 129.469467,405.497375 C126.665665,411.867889 130.514359,416.987915 137.514694,416.993042 C161.842728,417.010773 186.170807,417.000061 211.498047,417.000153 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M324.354675,242.395920 C323.276184,244.196213 322.400177,245.685776 320.988098,248.086838 C316.865295,241.230835 313.147400,235.306534 309.702332,229.227615 C307.440796,225.236969 304.366974,222.962448 299.806335,221.925400 C262.283539,213.393021 232.965317,182.596176 227.057266,144.851562 C221.513794,109.436241 232.720886,79.522171 259.624786,56.188839 C275.751617,42.202290 294.904785,34.663937 316.779572,33.851212 C348.121246,32.686760 373.699219,44.368736 393.808441,67.607040 C408.285522,84.336838 415.719910,104.193253 416.129883,126.765366 C416.679504,157.025070 405.027954,181.648727 382.881226,201.408112 C371.110535,211.909912 357.159485,218.791580 341.520416,222.240189 C338.299622,222.950409 335.118561,225.957092 332.924042,228.707169 C329.664886,232.791306 327.301666,237.590393 324.354675,242.395920 M365.048187,97.443359 C370.583435,91.700768 370.701630,85.175507 365.330109,81.880753 C361.672668,79.637360 356.630035,80.933273 352.129089,85.405678 C342.914734,94.561584 333.749512,103.766907 324.548431,112.936203 C323.412384,114.068321 322.181274,115.104980 320.457794,116.674324 C319.017365,114.966263 317.930176,113.478592 316.646271,112.186401 C307.370972,102.851303 298.080811,93.530586 288.741608,84.259491 C284.745544,80.292557 279.208740,79.658867 275.876648,82.619972 C271.622955,86.400055 271.606628,92.007065 276.075226,96.532738 C285.555145,106.133804 295.140411,115.630798 304.670227,125.182716 C305.910522,126.425888 307.078339,127.741364 308.699982,129.471832 C306.767456,131.142502 305.170319,132.365768 303.755219,133.772186 C294.658264,142.813187 285.530975,151.825531 276.561829,160.992294 C272.316803,165.330841 271.679443,172.193146 274.860229,175.243683 C278.125275,178.375015 284.989929,177.494553 289.133881,173.366959 C295.270966,167.254105 301.415710,161.148209 307.489624,154.972931 C311.886749,150.502441 316.174255,145.924133 320.608521,141.291687 C322.557465,143.156174 323.772125,144.275360 324.939575,145.441833 C334.366547,154.861099 343.762360,164.311676 353.216248,173.703827 C357.078430,177.540771 364.054932,178.250854 367.156860,175.284821 C369.494812,173.049301 370.182617,164.901749 365.897583,161.258850 C361.343750,157.387436 357.354156,152.853470 353.106140,148.620880 C346.649475,142.187607 340.182373,135.764771 333.450989,129.070267 C344.099365,118.419060 354.322937,108.192757 365.048187,97.443359 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M141.000000,440.999939 C179.827621,441.000061 218.155258,440.992767 256.482880,441.007080 C263.486053,441.009705 267.060974,446.013672 264.705200,452.580017 C263.472839,456.015015 260.763824,457.054169 257.241425,457.035980 C241.077591,456.952484 224.913086,456.999939 208.748825,457.000000 C177.586792,457.000153 146.424759,457.000732 115.262733,456.999634 C107.121445,456.999329 105.035042,455.395599 105.000999,449.124817 C104.965355,442.559265 106.978073,441.001343 115.503807,441.000183 C123.835869,440.999023 132.167938,440.999939 141.000000,440.999939 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M210.998444,417.000153 C186.170807,417.000061 161.842728,417.010773 137.514694,416.993042 C130.514359,416.987915 126.665665,411.867889 129.469467,405.497375 C130.361252,403.471161 133.579193,401.215637 135.752502,401.195435 C165.910004,400.915100 196.071045,400.965607 226.230942,401.046417 C231.121094,401.059509 233.083664,403.733337 232.998932,409.368042 C232.921509,414.514984 230.865005,416.849884 225.994263,416.971069 C221.164948,417.091248 216.330338,416.999176 210.998444,417.000153 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M364.797363,97.704910 C354.322937,108.192757 344.099365,118.419060 333.450989,129.070267 C340.182373,135.764771 346.649475,142.187607 353.106140,148.620880 C357.354156,152.853470 361.343750,157.387436 365.897583,161.258850 C370.182617,164.901749 369.494812,173.049301 367.156860,175.284821 C364.054932,178.250854 357.078430,177.540771 353.216248,173.703827 C343.762360,164.311676 334.366547,154.861099 324.939575,145.441833 C323.772125,144.275360 322.557465,143.156174 320.608521,141.291687 C316.174255,145.924133 311.886749,150.502441 307.489624,154.972931 C301.415710,161.148209 295.270966,167.254105 289.133881,173.366959 C284.989929,177.494553 278.125275,178.375015 274.860229,175.243683 C271.679443,172.193146 272.316803,165.330841 276.561829,160.992294 C285.530975,151.825531 294.658264,142.813187 303.755219,133.772186 C305.170319,132.365768 306.767456,131.142502 308.699982,129.471832 C307.078339,127.741364 305.910522,126.425888 304.670227,125.182716 C295.140411,115.630798 285.555145,106.133804 276.075226,96.532738 C271.606628,92.007065 271.622955,86.400055 275.876648,82.619972 C279.208740,79.658867 284.745544,80.292557 288.741608,84.259491 C298.080811,93.530586 307.370972,102.851303 316.646271,112.186401 C317.930176,113.478592 319.017365,114.966263 320.457794,116.674324 C322.181274,115.104980 323.412384,114.068321 324.548431,112.936203 C333.749512,103.766907 342.914734,94.561584 352.129089,85.405678 C356.630035,80.933273 361.672668,79.637360 365.330109,81.880753 C370.701630,85.175507 370.583435,91.700768 364.797363,97.704910 z\"/>\n </svg>\n\n </div>\n }\n </div>\n }\n @else if(viewType == 'compact'){\n <div [class.image-picker-label-compact]=\"!previewOnly\" [class.error]=\"required && (filesArray?.length || 0) <= 0\" style=\"height: 42px; width: 42px;\">\n @if(filesArray?.length){\n <div>\n @for(file of filesArray; track file.s3Url; let i = $index; let l = $last;){\n @if(i == 0) {\n <div>\n <div class=\"compact-image-item\" [class.selected]=\"config?.selectionMode ? selectedId == file.id : false\" [class.tis-curser-pointer]=\"!config?.hiddenPreview || config?.selectionMode\" id=\"image-item-{{config.selectorId}}-{{i}}\" [style.background-image]=\"type == 'file'? '' : 'url('+file.s3Url+')'\" (click)=\"onSelectFile(file)\" [style.background-size]=\"'contain'\">\n <mat-icon *ngIf=\"type == 'file'\" class=\"active tis-mat-icon\">description</mat-icon>\n <span class=\"material-icons cancel\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"!disabled && !config.hiddenDeleteBtn && !file?.loading\">highlight_off</span>\n <span class=\"material-icons download\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn && !file?.loading\">download_for_offline</span>\n \n <!-- Loading overlay -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"30\"></mat-progress-spinner>\n </div>\n </div>\n \n </div>\n }\n @if(l && (config?.limit || 0) > (filesArray?.length || 0) && !disabled){\n <div class=\"flex flex-col\">\n <!-- Image upload options in grid -->\n <div class=\"image-item uploader\" id=\"image-item-{{config.selectorId}}-{{i}}-{{i}}\" style=\"display: flex; flex-direction: column; gap: 8px; justify-content: center; align-items: center; cursor: pointer;\" (click)=\"loading ? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon class=\"active\">upload_file</mat-icon>\n </div>\n </div>\n }\n }\n </div>\n }\n @else if(!disabled){\n <label style=\"display: flex; gap: 12px; flex-direction: column; justify-content: center; align-items: center; height: 100%; cursor: pointer;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon>upload_file</mat-icon>\n </label>\n }\n @else{\n <div class=\"not-found-section\" style=\"display: flex; flex-direction: column; justify-content: center; align-items: center; width: 100%; cursor: pointer;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"100%\" viewBox=\"0 0 512 512\" enable-background=\"new 0 0 512 512\" xml:space=\"preserve\">\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M283.000000,513.000000 C188.689560,513.000000 94.879120,513.000000 1.034338,513.000000 C1.034338,342.397858 1.034338,171.795731 1.034338,1.096792 C171.560455,1.096792 342.121002,1.096792 512.840759,1.096792 C512.840759,171.666550 512.840759,342.333252 512.840759,513.000000 C436.462372,513.000000 359.981171,513.000000 283.000000,513.000000 M214.500000,497.000000 C271.998901,496.999969 329.497833,497.019897 386.996674,496.975769 C394.561920,496.969971 401.787231,494.626648 406.395233,488.770782 C412.026520,481.614502 416.644897,473.577057 421.072449,465.572754 C437.390259,436.072754 453.464813,406.438049 469.597321,376.835754 C478.327332,360.816742 487.426758,344.977722 495.530029,328.645905 C501.012421,317.596252 494.173737,304.613556 481.201294,304.861847 C456.377502,305.336975 431.538177,304.999878 406.705292,304.999847 C404.938568,304.999847 403.171844,304.999847 401.000031,304.999847 C401.000031,302.348328 401.003784,300.379181 400.999481,298.410065 C400.935120,269.085632 400.853577,239.761169 400.867645,210.436768 C400.868164,209.340317 401.642242,208.138214 402.315186,207.164581 C408.841400,197.722305 416.441071,188.858276 421.779449,178.792419 C433.290894,157.086823 435.985443,133.380402 431.740631,109.507538 C425.335449,73.484550 405.456726,46.387234 373.051300,29.163473 C356.219269,20.217096 338.040710,16.499708 318.773804,16.813351 C301.234619,17.098873 284.897461,21.133270 269.449402,28.965902 C256.098724,35.735111 244.580948,44.876842 234.887085,56.467457 C224.793365,68.536171 217.675415,82.055397 213.023590,96.957832 C209.186737,109.249481 208.654160,121.911049 208.964157,134.687836 C209.387650,152.143631 214.172058,168.302002 222.741714,183.427231 C224.412766,186.376572 225.987946,189.380234 227.939270,192.969376 C211.045273,192.969376 194.919281,193.199417 178.811310,192.763687 C175.805389,192.682358 172.083817,190.621887 170.038193,188.292847 C160.046188,176.916489 150.561493,165.096268 140.789429,153.524185 C136.493210,148.436600 131.117233,145.037399 124.221672,145.023544 C96.055626,144.966995 67.881424,145.387711 39.727192,144.808304 C28.532793,144.577896 16.775660,156.479080 16.809900,167.857864 C17.130381,274.354980 17.052288,380.853516 16.870073,487.351288 C16.859135,493.743988 19.582472,497.123566 26.503685,497.103851 C88.835381,496.926239 151.167801,497.000000 214.500000,497.000000 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M214.000000,497.000000 C151.167801,497.000000 88.835381,496.926239 26.503685,497.103851 C19.582472,497.123566 16.859135,493.743988 16.870073,487.351288 C17.052288,380.853516 17.130381,274.354980 16.809900,167.857864 C16.775660,156.479080 28.532793,144.577896 39.727192,144.808304 C67.881424,145.387711 96.055626,144.966995 124.221672,145.023544 C131.117233,145.037399 136.493210,148.436600 140.789429,153.524185 C150.561493,165.096268 160.046188,176.916489 170.038193,188.292847 C172.083817,190.621887 175.805389,192.682358 178.811310,192.763687 C194.919281,193.199417 211.045273,192.969376 227.939270,192.969376 C225.987946,189.380234 224.412766,186.376572 222.741714,183.427231 C214.172058,168.302002 209.387650,152.143631 208.964157,134.687836 C208.654160,121.911049 209.186737,109.249481 213.023590,96.957832 C217.675415,82.055397 224.793365,68.536171 234.887085,56.467457 C244.580948,44.876842 256.098724,35.735111 269.449402,28.965902 C284.897461,21.133270 301.234619,17.098873 318.773804,16.813351 C338.040710,16.499708 356.219269,20.217096 373.051300,29.163473 C405.456726,46.387234 425.335449,73.484550 431.740631,109.507538 C435.985443,133.380402 433.290894,157.086823 421.779449,178.792419 C416.441071,188.858276 408.841400,197.722305 402.315186,207.164581 C401.642242,208.138214 400.868164,209.340317 400.867645,210.436768 C400.853577,239.761169 400.935120,269.085632 400.999481,298.410065 C401.003784,300.379181 401.000031,302.348328 401.000031,304.999847 C403.171844,304.999847 404.938568,304.999847 406.705292,304.999847 C431.538177,304.999878 456.377502,305.336975 481.201294,304.861847 C494.173737,304.613556 501.012421,317.596252 495.530029,328.645905 C487.426758,344.977722 478.327332,360.816742 469.597321,376.835754 C453.464813,406.438049 437.390259,436.072754 421.072449,465.572754 C416.644897,473.577057 412.026520,481.614502 406.395233,488.770782 C401.787231,494.626648 394.561920,496.969971 386.996674,496.975769 C329.497833,497.019897 271.998901,496.999969 214.000000,497.000000 M134.597260,321.000000 C127.620270,319.337616 123.942146,323.017517 121.500618,328.932983 C120.498009,331.362091 119.193306,333.673279 117.937233,335.989990 C103.522736,362.575897 89.117485,389.166901 74.653091,415.725647 C67.257729,429.304626 59.689438,442.789490 52.312668,456.378448 C47.974022,464.370728 43.857620,472.483643 39.401810,481.000000 C42.117859,481.000000 44.110912,481.000000 46.103966,481.000000 C144.765793,481.000000 243.427612,481.000031 342.089447,481.000000 C354.922150,481.000000 367.755981,481.100647 380.587189,480.961823 C388.353729,480.877808 394.963684,478.668121 399.028687,471.088623 C414.189636,442.819641 429.540070,414.652191 444.852783,386.464783 C452.465210,372.451935 460.203308,358.507233 467.780884,344.475739 C471.870789,336.902466 475.742279,329.211273 480.010315,321.000000 C364.545990,321.000000 250.059738,321.000000 134.597260,321.000000 M324.557129,242.085190 C327.301666,237.590393 329.664886,232.791306 332.924042,228.707169 C335.118561,225.957092 338.299622,222.950409 341.520416,222.240189 C357.159485,218.791580 371.110535,211.909912 382.881226,201.408112 C405.027954,181.648727 416.679504,157.025070 416.129883,126.765366 C415.719910,104.193253 408.285522,84.336838 393.808441,67.607040 C373.699219,44.368736 348.121246,32.686760 316.779572,33.851212 C294.904785,34.663937 275.751617,42.202290 259.624786,56.188839 C232.720886,79.522171 221.513794,109.436241 227.057266,144.851562 C232.965317,182.596176 262.283539,213.393021 299.806335,221.925400 C304.366974,222.962448 307.440796,225.236969 309.702332,229.227615 C313.147400,235.306534 316.865295,241.230835 320.988098,248.086838 C322.400177,245.685776 323.276184,244.196213 324.557129,242.085190 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M135.085373,321.000000 C250.059738,321.000000 364.545990,321.000000 480.010315,321.000000 C475.742279,329.211273 471.870789,336.902466 467.780884,344.475739 C460.203308,358.507233 452.465210,372.451935 444.852783,386.464783 C429.540070,414.652191 414.189636,442.819641 399.028687,471.088623 C394.963684,478.668121 388.353729,480.877808 380.587189,480.961823 C367.755981,481.100647 354.922150,481.000000 342.089447,481.000000 C243.427612,481.000031 144.765793,481.000000 46.103966,481.000000 C44.110912,481.000000 42.117859,481.000000 39.401810,481.000000 C43.857620,472.483643 47.974022,464.370728 52.312668,456.378448 C59.689438,442.789490 67.257729,429.304626 74.653091,415.725647 C89.117485,389.166901 103.522736,362.575897 117.937233,335.989990 C119.193306,333.673279 120.498009,331.362091 121.500618,328.932983 C123.942146,323.017517 127.620270,319.337616 135.085373,321.000000 M140.500000,440.999939 C132.167938,440.999939 123.835869,440.999023 115.503807,441.000183 C106.978073,441.001343 104.965355,442.559265 105.000999,449.124817 C105.035042,455.395599 107.121445,456.999329 115.262733,456.999634 C146.424759,457.000732 177.586792,457.000153 208.748825,457.000000 C224.913086,456.999939 241.077591,456.952484 257.241425,457.035980 C260.763824,457.054169 263.472839,456.015015 264.705200,452.580017 C267.060974,446.013672 263.486053,441.009705 256.482880,441.007080 C218.155258,440.992767 179.827621,441.000061 140.500000,440.999939 M211.498047,417.000153 C216.330338,416.999176 221.164948,417.091248 225.994263,416.971069 C230.865005,416.849884 232.921509,414.514984 232.998932,409.368042 C233.083664,403.733337 231.121094,401.059509 226.230942,401.046417 C196.071045,400.965607 165.910004,400.915100 135.752502,401.195435 C133.579193,401.215637 130.361252,403.471161 129.469467,405.497375 C126.665665,411.867889 130.514359,416.987915 137.514694,416.993042 C161.842728,417.010773 186.170807,417.000061 211.498047,417.000153 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M324.354675,242.395920 C323.276184,244.196213 322.400177,245.685776 320.988098,248.086838 C316.865295,241.230835 313.147400,235.306534 309.702332,229.227615 C307.440796,225.236969 304.366974,222.962448 299.806335,221.925400 C262.283539,213.393021 232.965317,182.596176 227.057266,144.851562 C221.513794,109.436241 232.720886,79.522171 259.624786,56.188839 C275.751617,42.202290 294.904785,34.663937 316.779572,33.851212 C348.121246,32.686760 373.699219,44.368736 393.808441,67.607040 C408.285522,84.336838 415.719910,104.193253 416.129883,126.765366 C416.679504,157.025070 405.027954,181.648727 382.881226,201.408112 C371.110535,211.909912 357.159485,218.791580 341.520416,222.240189 C338.299622,222.950409 335.118561,225.957092 332.924042,228.707169 C329.664886,232.791306 327.301666,237.590393 324.354675,242.395920 M365.048187,97.443359 C370.583435,91.700768 370.701630,85.175507 365.330109,81.880753 C361.672668,79.637360 356.630035,80.933273 352.129089,85.405678 C342.914734,94.561584 333.749512,103.766907 324.548431,112.936203 C323.412384,114.068321 322.181274,115.104980 320.457794,116.674324 C319.017365,114.966263 317.930176,113.478592 316.646271,112.186401 C307.370972,102.851303 298.080811,93.530586 288.741608,84.259491 C284.745544,80.292557 279.208740,79.658867 275.876648,82.619972 C271.622955,86.400055 271.606628,92.007065 276.075226,96.532738 C285.555145,106.133804 295.140411,115.630798 304.670227,125.182716 C305.910522,126.425888 307.078339,127.741364 308.699982,129.471832 C306.767456,131.142502 305.170319,132.365768 303.755219,133.772186 C294.658264,142.813187 285.530975,151.825531 276.561829,160.992294 C272.316803,165.330841 271.679443,172.193146 274.860229,175.243683 C278.125275,178.375015 284.989929,177.494553 289.133881,173.366959 C295.270966,167.254105 301.415710,161.148209 307.489624,154.972931 C311.886749,150.502441 316.174255,145.924133 320.608521,141.291687 C322.557465,143.156174 323.772125,144.275360 324.939575,145.441833 C334.366547,154.861099 343.762360,164.311676 353.216248,173.703827 C357.078430,177.540771 364.054932,178.250854 367.156860,175.284821 C369.494812,173.049301 370.182617,164.901749 365.897583,161.258850 C361.343750,157.387436 357.354156,152.853470 353.106140,148.620880 C346.649475,142.187607 340.182373,135.764771 333.450989,129.070267 C344.099365,118.419060 354.322937,108.192757 365.048187,97.443359 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M141.000000,440.999939 C179.827621,441.000061 218.155258,440.992767 256.482880,441.007080 C263.486053,441.009705 267.060974,446.013672 264.705200,452.580017 C263.472839,456.015015 260.763824,457.054169 257.241425,457.035980 C241.077591,456.952484 224.913086,456.999939 208.748825,457.000000 C177.586792,457.000153 146.424759,457.000732 115.262733,456.999634 C107.121445,456.999329 105.035042,455.395599 105.000999,449.124817 C104.965355,442.559265 106.978073,441.001343 115.503807,441.000183 C123.835869,440.999023 132.167938,440.999939 141.000000,440.999939 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M210.998444,417.000153 C186.170807,417.000061 161.842728,417.010773 137.514694,416.993042 C130.514359,416.987915 126.665665,411.867889 129.469467,405.497375 C130.361252,403.471161 133.579193,401.215637 135.752502,401.195435 C165.910004,400.915100 196.071045,400.965607 226.230942,401.046417 C231.121094,401.059509 233.083664,403.733337 232.998932,409.368042 C232.921509,414.514984 230.865005,416.849884 225.994263,416.971069 C221.164948,417.091248 216.330338,416.999176 210.998444,417.000153 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M364.797363,97.704910 C354.322937,108.192757 344.099365,118.419060 333.450989,129.070267 C340.182373,135.764771 346.649475,142.187607 353.106140,148.620880 C357.354156,152.853470 361.343750,157.387436 365.897583,161.258850 C370.182617,164.901749 369.494812,173.049301 367.156860,175.284821 C364.054932,178.250854 357.078430,177.540771 353.216248,173.703827 C343.762360,164.311676 334.366547,154.861099 324.939575,145.441833 C323.772125,144.275360 322.557465,143.156174 320.608521,141.291687 C316.174255,145.924133 311.886749,150.502441 307.489624,154.972931 C301.415710,161.148209 295.270966,167.254105 289.133881,173.366959 C284.989929,177.494553 278.125275,178.375015 274.860229,175.243683 C271.679443,172.193146 272.316803,165.330841 276.561829,160.992294 C285.530975,151.825531 294.658264,142.813187 303.755219,133.772186 C305.170319,132.365768 306.767456,131.142502 308.699982,129.471832 C307.078339,127.741364 305.910522,126.425888 304.670227,125.182716 C295.140411,115.630798 285.555145,106.133804 276.075226,96.532738 C271.606628,92.007065 271.622955,86.400055 275.876648,82.619972 C279.208740,79.658867 284.745544,80.292557 288.741608,84.259491 C298.080811,93.530586 307.370972,102.851303 316.646271,112.186401 C317.930176,113.478592 319.017365,114.966263 320.457794,116.674324 C322.181274,115.104980 323.412384,114.068321 324.548431,112.936203 C333.749512,103.766907 342.914734,94.561584 352.129089,85.405678 C356.630035,80.933273 361.672668,79.637360 365.330109,81.880753 C370.701630,85.175507 370.583435,91.700768 364.797363,97.704910 z\"/>\n </svg>\n\n </div>\n }\n </div>\n }\n @else if(viewType == 'list'){\n <div [class.error-border]=\"required && (filesArray?.length || 0) <= 0\" [style.height]=\"filesArray?.length ? null : config?.height\" style=\"width: 100%; display: flex; gap: 12px; flex-direction: column; --tis-image-picker-height: {{config?.height ?? 0}}\">\n @if(filesArray?.length){\n @for(file of filesArray; track file.s3Url; let i = $index; let l = $last;){\n <div style=\"position: relative; display: flex; align-items: center; gap: 10px; border-radius: 5px; border: 1px solid black; padding: 5px; height: 56px;\">\n <mat-icon style=\"width: 40px; min-width: 22px;\">description</mat-icon>\n <div style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%;\">{{file?.title}}</div>\n <div style=\"display: flex; align-items: center; gap: 4px;\" *ngIf=\"!file?.loading\">\n <button type=\"button\" mat-icon-button aria-label=\"Download File\" class=\"tis-icon-btn-sm tis-text-download\" style=\"margin: 0px !important;\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn\">\n <mat-icon>download_for_offline</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button aria-label=\"View File\" class=\"tis-icon-btn-sm tis-text-view\" style=\"margin: 0px !important;\" (click)=\"openFile(file)\" *ngIf=\"!config.hiddenPreview\">\n <mat-icon>visibility</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button aria-label=\"Remove File\" class=\"tis-icon-btn-sm tis-text-cancel\" style=\"margin: 0px !important;\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"!disabled && !config.hiddenDeleteBtn\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n \n <!-- Loading overlay for list view -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\" style=\"border-radius: 5px;\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"25\"></mat-progress-spinner>\n </div>\n </div>\n @if(l && (config?.limit || 0) > (filesArray?.length || 0) && !disabled){\n <div style=\"cursor: pointer; display: flex; align-items: center; gap: 4px; border: 1px solid black; border-radius: 5px; padding: 5px; height: 56px;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon style=\"width: 40px; min-width: 22px;\">upload_file</mat-icon>\n <div style=\"width: 100%;\">\n <div style=\"display: flex; flex-direction: column; align-items: start; font-size: 14px;\">\n {{label}}\n @if(hint && hint != ''){\n <small>{{hint}}</small>\n }\n </div>\n </div>\n </div>\n }\n }\n }\n @else if(!disabled){\n <div style=\"cursor: pointer; display: flex; align-items: center; gap: 4px; border: 1px solid black; border-radius: 5px; padding: 5px; height: 56px;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon style=\"width: 40px; min-width: 22px;\">upload_file</mat-icon>\n <div style=\"width: 100%;\">\n <div style=\"display: flex; flex-direction: column; align-items: start; font-size: 14px;\">\n {{label}}\n @if(hint && hint != ''){\n <small>{{hint}}</small>\n }\n </div>\n </div>\n <!-- Mobile Upload Button for list view -->\n @if(isRemoteUploadAvailable()){\n <button type=\"button\" mat-icon-button class=\"mobile-upload-btn-list\" (click)=\"$event.stopPropagation(); openRemoteUploadDialog()\" title=\"Upload from Mobile\" aria-label=\"Upload from Mobile\">\n <mat-icon>smartphone</mat-icon>\n </button>\n }\n </div>\n }\n </div>\n }\n}\n","import { NgModule } from '@angular/core';\nimport { TisImageAndFileUploadAndViewComponent } from './tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component';\nimport { TisPreviewImageComponent } from './tis-preview-image/tis-preview-image.component';\nimport { CommonModule } from '@angular/common';\nimport { TisFileViewerComponent } from './tis-file-viewer/tis-file-viewer.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { TisErrorDialogComponent } from './tis-error-dialog/tis-error-dialog.component';\nimport { TisConfirmationDialogComponent } from './tis-confirmation-dialog/tis-confirmation-dialog.component';\nimport { TisExcelFileViewerComponent } from './tis-file-viewer/tis-excel-file-viewer/tis-excel-file-viewer.component';\nimport { TisPdfViewerComponent } from './tis-file-viewer/tis-pdf-viewer/tis-pdf-viewer.component';\nimport { TisVideoComponent } from './tis-file-viewer/tis-video/tis-video.component';\nimport { TisQrCodeDialogComponent } from './tis-qr-code-dialog/tis-qr-code-dialog.component';\nimport { NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';\nimport { MatInputModule } from '@angular/material/input';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { HttpClientModule } from '@angular/common/http';\nimport { QRCodeComponent } from 'angularx-qrcode';\n\n\nconst uiImports = [\n MatTooltipModule,\n MatIconModule,\n MatSnackBarModule,\n MatProgressSpinnerModule,\n MatInputModule,\n MatButtonModule,\n MatDialogModule,\n];\n\n\n@NgModule({\n declarations: [\n TisImageAndFileUploadAndViewComponent,\n TisPreviewImageComponent,\n TisFileViewerComponent,\n TisExcelFileViewerComponent,\n TisPdfViewerComponent,\n TisVideoComponent,\n TisErrorDialogComponent,\n TisConfirmationDialogComponent,\n TisQrCodeDialogComponent\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n NgxExtendedPdfViewerModule,\n FormsModule,\n ReactiveFormsModule,\n QRCodeComponent,\n ...uiImports,\n DragDropModule\n ],\n exports: [\n TisImageAndFileUploadAndViewComponent,\n TisQrCodeDialogComponent\n ]\n})\nexport class TisImageAndFileUploadAndViewModule { }\n","/*\n * Public API Surface of tis-image-and-file-upload-and-view\n */\n\nexport * from './lib/tis-image-and-file-upload-and-view.service';\nexport * from './lib/tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component';\nexport * from './lib/tis-image-and-file-upload-and-view.module';\n\n// Interfaces\nexport * from './lib/interfaces';\n\n// Remote Upload\nexport * from './lib/services/tis-remote-upload.service';\nexport * from './lib/tis-qr-code-dialog/tis-qr-code-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4","i5","i6.TisExcelFileViewerComponent","i7.TisPdfViewerComponent","i8.TisVideoComponent","i3","i2.TisRemoteUploadService","i6","i7","takeUntil","i2.TisHelperService","i4.TisRemoteUploadService","i8","i9"],"mappings":"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"}
1
+ {"version":3,"file":"servicemind.tis-tis-image-and-file-upload-and-view.mjs","sources":["../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view.service.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-pdf-viewer/tis-pdf-viewer.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-pdf-viewer/tis-pdf-viewer.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-excel-file-viewer/tis-excel-file-viewer.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-excel-file-viewer/tis-excel-file-viewer.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-video/tis-video.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-video/tis-video.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-file-viewer.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-file-viewer/tis-file-viewer.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-preview-image/tis-preview-image.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-preview-image/tis-preview-image.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-error-dialog/tis-error-dialog.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-error-dialog/tis-error-dialog.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/services/tis-helper.service.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-confirmation-dialog/tis-confirmation-dialog.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-confirmation-dialog/tis-confirmation-dialog.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/services/tis-remote-upload.service.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-qr-code-dialog/tis-qr-code-dialog.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-qr-code-dialog/tis-qr-code-dialog.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component.ts","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component.html","../../../projects/tis-image-and-file-upload-and-view/src/lib/tis-image-and-file-upload-and-view.module.ts","../../../projects/tis-image-and-file-upload-and-view/src/public-api.ts","../../../projects/tis-image-and-file-upload-and-view/src/servicemind.tis-tis-image-and-file-upload-and-view.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TisImageAndFileUploadAndViewService {\n\n constructor() { }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core';\nimport type { SafeUrl } from '@angular/platform-browser';\nimport { NgxExtendedPdfViewerComponent } from 'ngx-extended-pdf-viewer';\n\n@Component({\n selector: 'tis-pdf-viewer',\n standalone: false,\n templateUrl: './tis-pdf-viewer.component.html',\n styleUrl: './tis-pdf-viewer.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TisPdfViewerComponent implements OnChanges {\n\n loading = true;\n isError = false;\n\n @Input({ required: true }) src!: string;\n\n @ViewChild(NgxExtendedPdfViewerComponent, { static: false })\n private pdfViewer!: NgxExtendedPdfViewerComponent;\n\n constructor(\n private cdRef: ChangeDetectorRef\n ) {\n\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if(changes['src']) {\n console.log('Pdf Viewer: src changed: ', changes['src']);\n }\n }\n\n destroyPdfViewer() {\n this.pdfViewer.ngOnDestroy();\n }\n\n loadingFinished(ev: any) {\n console.log('PDF Loaded', ev)\n this.loading = false;\n this.cdRef.detectChanges();\n this.pdfViewer.height = 'auto';\n }\n\n loadingError(ev: any) {\n console.log('PDF Loading Error:', ev);\n this.isError = true;\n this.loading = false;\n this.cdRef.detectChanges();\n }\n\n}\n","@if (isError) {\n <div class=\"flex tis-justify-content-center py-4\">\n <h3> Some Error Occurred in Loading PDF File. Please Try again. </h3>\n </div>\n} \n\n@if (!isError) {\n <div class=\"tis-extended-pdf-viewer\">\n @if(loading) {\n <div class=\"loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"50\"></mat-progress-spinner>\n </div>\n }\n <ngx-extended-pdf-viewer [src]=\"src\"\n [showToolbar]=\"true\"\n [showSidebarButton]=\"true\"\n [showFindButton]=\"false\"\n [showPagingButtons]=\"true\"\n [showDrawEditor]=\"false\"\n [showStampEditor]=\"false\"\n [showTextEditor]=\"false\"\n [showZoomButtons]=\"true\"\n [showPresentationModeButton]=\"false\"\n [showOpenFileButton]=\"false\"\n [showPrintButton]=\"true\"\n [showDownloadButton]=\"true\"\n [showSecondaryToolbarButton]=\"false\"\n [showRotateButton]=\"true\"\n [showHandToolButton]=\"false\"\n [showScrollingButton]=\"true\"\n [showSpreadButton]=\"false\"\n [showPropertiesButton]=\"false\"\n [zoom]=\"'page-fit'\"\n (pdfDownloaded)=\"loadingFinished($event)\"\n (pdfLoaded)=\"loadingFinished($event)\"\n (pdfLoadingFailed)=\"loadingError($event)\"\n >\n </ngx-extended-pdf-viewer>\n </div>\n}\n \n ","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport type { SafeUrl } from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'tis-excel-file-viewer',\n standalone: false,\n templateUrl: './tis-excel-file-viewer.component.html',\n styleUrl: './tis-excel-file-viewer.component.css'\n})\nexport class TisExcelFileViewerComponent implements OnChanges {\n\n @Input({ required: true }) src!: SafeUrl;\n\n baseUrl = `https://view.officeapps.live.com/op/embed.aspx?src=`;\n iframeSrc: SafeUrl | null = null;\n\n constructor(private sanitizer: DomSanitizer ) {\n\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['src']) {\n console.log('Url Received', this.src);\n const src = this.baseUrl + this.src;\n this.iframeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(src);\n console.log('Iframe src:', this.iframeSrc);\n }\n }\n\n \n}\n","<div class=\"bg-slate-900 w-full h-5\">\n \n</div>\n<div class=\"aspect-w-16 aspect-h-9\">\n <iframe class=\"w-full h-full\" [src]=\"iframeSrc\" frameborder='0'>This is an embedded <a target='_blank'\n href='http://office.com'>Microsoft Office</a> document, powered by <a target='_blank'\n href='http://office.com/webapps'>Office Online</a>.</iframe>\n</div>","import { Component, Input, SimpleChanges } from '@angular/core';\nimport type { SafeUrl } from '@angular/platform-browser';\n\n@Component({\n selector: 'tis-video',\n standalone: false,\n templateUrl: './tis-video.component.html',\n styleUrl: './tis-video.component.css'\n})\nexport class TisVideoComponent {\n @Input({ required: true }) src!: SafeUrl;\n type!: string;\n\n constructor() {}\n\n ngOnInit(): void {\n if(this.src){\n this.type = this.getFileType(String(this.src));\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if(changes['src']) {\n console.log('Pdf Viewer: src changed: ', changes['src']);\n this.type = this.getFileType(changes['src'].currentValue);\n }\n }\n\n getFileType(text: string) {\n let txtArr = text.split('.');\n let fileType = txtArr[txtArr.length - 1];\n return fileType.toLocaleLowerCase() == 'mov' ? 'mp4': fileType.toLocaleLowerCase();\n }\n}\n","<video controls autoplay style=\"min-width: 300px; max-width: 90vw; min-height: 300px; max-height: 90vh;\">\n <source [src]=\"src\" type=\"video/{{type}}\">\n Your browser does not support the video tag.\n</video>","import { Component, Inject, ViewChild } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport type { FileViewerDialogData } from '../interfaces';\nimport { TisPdfViewerComponent } from './tis-pdf-viewer/tis-pdf-viewer.component';\n\n@Component({\n selector: 'tis-file-viewer',\n standalone: false,\n templateUrl: './tis-file-viewer.component.html',\n styleUrl: './tis-file-viewer.component.css'\n})\nexport class TisFileViewerComponent {\n safeUrl!: string;\n\n @ViewChild(TisPdfViewerComponent, { static: false }) private pdfViewer!: TisPdfViewerComponent;\n\n constructor(\n public dialogRef: MatDialogRef<TisFileViewerComponent>,\n @Inject(MAT_DIALOG_DATA) public data: FileViewerDialogData,\n private sanitizer: DomSanitizer\n ) {\n console.log('File Viewer Data:', data);\n\n this.safeUrl = this.data.src;\n console.log('FileViewer SafeUrl:', this.safeUrl);\n\n dialogRef.beforeClosed().subscribe((result) => {\n console.log('The dialog is about to be closed');\n // Here's the interesting bit:\n if (this.pdfViewer) {\n this.pdfViewer.destroyPdfViewer();\n console.log('PDF Viewer Destroyed.');\n }\n });\n }\n\n downloadFile() {\n var el = document.createElement(\"a\");\n el.setAttribute(\"href\", this.safeUrl);\n el.setAttribute(\"download\", 'Video-' + new Date().valueOf());\n document.body.appendChild(el);\n el.click();\n el.remove();\n }\n\n onClose(status: boolean | null): void {\n this.dialogRef.close(status);\n }\n}\n","@if(safeUrl) {\n <div class=\"tis-pdf-viewer\">\n @if(data.fileType == 'video') {\n <mat-icon class=\"download-btn\" (click)=\"downloadFile()\" matTooltip=\"Download\">download</mat-icon>\n <!-- <button mat-icon-button color=\"primary\" class=\"download-btn\" >\n <mat-icon>download</mat-icon>\n </button> -->\n }\n @else {\n <button mat-mini-fab color=\"primary\" class=\"close-btn\" (click)=\"onClose(null)\" matTooltip=\"Close\">\n <mat-icon>clear</mat-icon>\n </button>\n }\n @if(data.fileType == 'pdf') {\n <tis-pdf-viewer [src]=\"safeUrl\"></tis-pdf-viewer>\n }\n @else if(data.fileType == 'excel') {\n <tis-excel-file-viewer [src]=\"safeUrl\"></tis-excel-file-viewer>\n }\n @else if(data.fileType == 'video') {\n <tis-video [src]=\"safeUrl\"></tis-video>\n }\n </div>\n}\n","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\n@Component({\n selector: 'tis-preview-image',\n standalone: false,\n templateUrl: './tis-preview-image.component.html',\n styleUrl: './tis-preview-image.component.css'\n})\nexport class TisPreviewImageComponent {\n width = 850;\n height = 650;\n isLoading: boolean = true;\n isLandscape: boolean | undefined;\n orientation: string | undefined;\n imageWidth: number | undefined;\n imageHeight: number | undefined;\n\n\n constructor(\n public dialogRef: MatDialogRef<TisPreviewImageComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n ) { }\n\n ngOnInit(): void {\n if (this.data.url) {\n setTimeout(() => {\n this.checkImageOrientation(this.data.url);\n }, 500);\n }\n }\n\n checkImageOrientation(imageUrl: string): void {\n const img = new Image();\n img.src = imageUrl;\n this.isLoading = true;\n\n img.onload = () => {\n this.imageWidth = img.naturalWidth;\n this.imageHeight = img.naturalHeight;\n this.isLandscape = img.naturalWidth > img.naturalHeight;\n this.orientation = this.isLandscape ? 'landscape-image' : 'portrait-image';\n this.isLoading = false;\n };\n\n img.onerror = () => {\n console.error('Failed to load image.');\n this.isLoading = false;\n };\n }\n\n onClose() {\n this.dialogRef.close()\n }\n}\n","@if(isLoading){\n <div style=\"width: 350px; height: 350px; display: flex; justify-content: center; align-items: center\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"80\"></mat-progress-spinner>\n </div>\n}\n@else{\n <div class=\"w-100 dialog-container\" appScrolling style=\"--img-width: {{(imageWidth && imageWidth < 700) ? imageWidth : 650}}px; --img-height: {{(imageHeight && imageHeight < 600) ? imageHeight : 600}}px\">\n <mat-icon\n class=\"close-icon\"\n (click)=\"onClose()\">cancel</mat-icon>\n <img \n *ngIf=\"data.url\" \n [src]=\"data.url\" \n alt=\"preview-image\" \n class=\"preview-image {{orientation}}\">\n </div>\n}","import { Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'lib-tis-error-dialog',\n standalone: false,\n templateUrl: './tis-error-dialog.component.html',\n styleUrl: './tis-error-dialog.component.css'\n})\nexport class TisErrorDialogComponent {\n constructor(\n public dialogRef: MatDialogRef<TisErrorDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n ) {}\n\n onClose(): void {\n this.dialogRef.close();\n }\n}\n","<h1 mat-dialog-title>\n <mat-icon class=\"{{data?.iconClass}}\">{{data?.icon}}</mat-icon>\n {{data?.title}}\n</h1>\n<div mat-dialog-content>\n {{data?.message}}\n</div>\n<div mat-dialog-actions>\n <button mat-button class=\"tis-text-upper {{data?.buttonClass ?? 'tis-btn-primary'}}\" (click)=\"onClose()\" cdkFocusInitial *ngIf=\"data?.buttonText && data?.buttonText != ''\">{{data?.buttonText}}</button>\n</div>","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar, MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar';\nimport { TisErrorDialogComponent } from '../tis-error-dialog/tis-error-dialog.component';\nimport { Observable } from 'rxjs';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TisHelperService {\n\n constructor(\n private snackBar: MatSnackBar,\n private dialog: MatDialog,\n private http: HttpClient\n ) { }\n\n showHttpErrorMsg(error: HttpErrorResponse, duration = 5000) {\n console.log('httpError: ', error);\n\n let errorMessage = 'Some Unknown Error Occurred.';\n let errorCode = 'Unknown Error';\n const httpError = error;\n\n if (httpError.status >= 400) {\n const errorFromServer = httpError.error?.errors || httpError.error || [];\n if (Array.isArray(errorFromServer) && errorFromServer.length > 0) {\n errorMessage = errorFromServer[0].message;\n errorCode = errorFromServer[0].code;\n }\n } else if (httpError.status < 100) {\n errorMessage = httpError.message;\n errorCode = httpError.statusText;\n }\n\n if (errorCode == \"VALIDATION_ERROR\" || errorCode == \"NOT_FOUND_ERROR\" || errorCode == \"THIRD_PARTY_API_ERROR\") {\n let confirmBoxData: any = {\n title: \"Error !\",\n message: errorMessage,\n icon: \"error\",\n iconClass: \"tis-text-danger\",\n buttonText: \"Ok\",\n buttonClass: \"tis-btn-primary\",\n };\n\n const dialogRef: MatDialogRef<TisErrorDialogComponent> = this.dialog.open(TisErrorDialogComponent, {\n width: \"550px\",\n panelClass: ['tis-simple-confirmation'],\n data: confirmBoxData,\n disableClose: false,\n });\n\n return dialogRef;\n\n } else {\n const snackbarRef: MatSnackBarRef<TextOnlySnackBar> = this.snackBar.open(errorMessage, 'Error', { duration: duration });\n return snackbarRef;\n }\n\n }\n\n showSuccessMsg(message: string, title: string, duration = 5000) {\n this.snackBar.open(message, title, {\n duration: duration\n })\n }\n\n showErrorMsg(message: string, title: string, duration = 5000) {\n this.snackBar.open(message, title, {\n duration: duration\n })\n }\n\n async compressFile(image: any, mimeType: string): Promise<Blob> {\n\n let imageData = image;\n\n let imageBlob: Blob = this.dataURItoBlob(imageData.split(',')[1], mimeType);\n return imageBlob;\n }\n\n dataURItoBlob(dataURI: string, mimeType: string): Blob {\n const byteString = window.atob(dataURI);\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const int8Array = new Uint8Array(arrayBuffer);\n for (let i = 0; i < byteString.length; i++) {\n int8Array[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([int8Array], { type: mimeType });\n return blob;\n }\n\n getDataUrlFromFile(file: any) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (e: any) => {\n resolve(e.target.result)\n };\n reader.onerror = (e: any) => {\n reject(e.target.error);\n };\n reader.readAsDataURL(file);\n })\n }\n\n getUploadUrl(url: string, filename: string, mimeType: string, type: string): Observable<any> {\n return this.http.post(url, { filename, mimeType, type });\n }\n\n attachFilesToEntity(url: string, data: any, limit: number): Observable<any> {\n return this.http.post(`${url}?limit=${limit}`, data);\n }\n\n updateTag(url: string, data: any): Observable<any> {\n return this.http.post(url, data);\n }\n\n updateSequence(url: string, data: any): Observable<any> {\n return this.http.post(url, data);\n }\n\n putFile(url: string, file: File, contentType?: string): Observable<any> {\n const headers = new HttpHeaders({ \"content-type\": contentType ? contentType : \"binary/octet-stream\"}).set('X-Skip-Auth-Interceptor', \"\");\n return this.http.put(url, file, { headers });\n }\n\n deleteUploadedFile(url: string, data: any): Observable<any> {\n return this.http.post(url, data);\n }\n\n}","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\n@Component({\n selector: 'tis-confirmation-dialog',\n standalone: false,\n templateUrl: './tis-confirmation-dialog.component.html',\n styleUrl: './tis-confirmation-dialog.component.css'\n})\nexport class TisConfirmationDialogComponent {\n constructor(\n public dialogRef: MatDialogRef<TisConfirmationDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n ) {\n this.dialogRef.addPanelClass(['md-tis-w-400-px']);\n }\n\n onClose(status: boolean | null): void {\n this.dialogRef.close(status);\n }\n}\n","<h1 mat-dialog-title style=\"align-items: center; display: flex;\">\n <mat-icon class=\"{{data?.iconClass}}\" style=\"color: var(--tis-cancel, #bb333b)\">{{data?.icon}}</mat-icon>\n <span>{{data?.title}}</span>\n</h1>\n<div mat-dialog-content style=\"padding: 20px 24px; padding-top: 0px;\">\n @if(data?.html){\n <h5 class=\"title\">{{data?.message}}</h5>\n <div [innerHTML]=\"data.html\">\n </div>\n }\n @else {\n <span>{{data?.message}}</span>\n }\n</div>\n<div mat-dialog-actions>\n <button mat-button class=\"{{data?.cancelButtonClass}}\" style=\"color: var(--tis-primary, var(--mat-sys-primary))\" (click)=\"onClose(false)\" *ngIf=\"data?.cancelButtonText && data?.cancelButtonText != ''\">{{data?.cancelButtonText}}</button>\n <button mat-button class=\"{{data?.approveButtonClass}}\" style=\"color: var(--tis-cancel, #bb333b)\" (click)=\"onClose(true)\" cdkFocusInitial *ngIf=\"data?.approveButtonText && data?.approveButtonText != ''\">{{data?.approveButtonText}}</button>\n</div>","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject, Subscription, throwError } from 'rxjs';\nimport { catchError, take, takeUntil, timeout } from 'rxjs/operators';\nimport { HttpClient } from '@angular/common/http';\nimport {\n TisSocketAdapter,\n TisRemoteUploadConfig,\n TisPairingSession,\n TisRemoteUploadEvent,\n TisRemoteUploadMessage,\n TisRemoteUploadedFile\n} from '../interfaces/socket-adapter.interface';\n\nconst DEFAULT_PAIRING_TTL = 24 * 60 * 60 * 1000; // 24 hours\nconst DEFAULT_STORAGE_KEY = 'tis-remote-upload-session';\nconst DEFAULT_QR_EXPIRY = 300; // 5 minutes\n\n/**\n * Mobile connection info stored in localStorage\n */\ninterface MobileConnectionInfo {\n mobileDeviceId: string;\n connectedAt: number;\n lastActivity: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TisRemoteUploadService implements OnDestroy {\n private static readonly COMPONENT = 'TisRemoteUploadService';\n private static readonly MOBILE_CONNECTION_KEY = 'tis-mobile-connection';\n\n private destroy$ = new Subject<void>();\n private channelSubscription: Subscription | null = null;\n\n private config: TisRemoteUploadConfig | null = null;\n private socketAdapter: TisSocketAdapter | null = null;\n\n // Cached values\n private deviceId: string = '';\n private userId: string = '';\n private apiUrl: string = '';\n private channelName: string = '';\n\n // State observables\n private pairingSession$ = new BehaviorSubject<TisPairingSession | null>(null);\n private connectionStatus$ = new BehaviorSubject<'disconnected' | 'pending' | 'connected'>('disconnected');\n private mobileConnection$ = new BehaviorSubject<MobileConnectionInfo | null>(null);\n private remoteUpload$ = new Subject<TisRemoteUploadEvent>();\n private error$ = new Subject<string>();\n\n constructor(private http: HttpClient) {\n // Restore mobile connection from storage on init\n this.restoreMobileConnection();\n }\n\n // ===========================================================================\n // Configuration\n // ===========================================================================\n\n /**\n * Configure the remote upload service\n */\n async configure(config: TisRemoteUploadConfig): Promise<void> {\n this.config = config;\n this.socketAdapter = config.socketAdapter || null;\n\n if (config.enabled && this.socketAdapter) {\n // Get device ID, user ID, and API URL from adapter\n this.deviceId = await Promise.resolve(this.socketAdapter.getDeviceId());\n this.userId = this.socketAdapter.getUserId \n ? await Promise.resolve(this.socketAdapter.getUserId()) \n : '';\n this.apiUrl = this.socketAdapter.getApiUrl?.() || '';\n this.channelName = `tis-mobile-upload-w-dev-${this.deviceId}`;\n\n // Subscribe to socket connection status\n this.socketAdapter.connectionStatus$\n .pipe(takeUntil(this.destroy$))\n .subscribe(connected => {\n if (connected) {\n // Always subscribe to our channel when connected\n this.subscribeToChannel(this.channelName);\n }\n });\n\n // Subscribe to channel immediately if already connected\n if (this.socketAdapter.isConnected()) {\n this.subscribeToChannel(this.channelName);\n }\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Configured:`, {\n deviceId: this.deviceId,\n userId: this.userId,\n channel: this.channelName\n });\n }\n }\n\n // ===========================================================================\n // Public Getters\n // ===========================================================================\n\n /**\n * Get desktop device ID\n */\n getDesktopDeviceId(): string {\n return this.deviceId;\n }\n\n /**\n * Get current mobile connection info\n */\n getMobileConnection(): Observable<MobileConnectionInfo | null> {\n return this.mobileConnection$.asObservable();\n }\n\n /**\n * Get current mobile device ID (if connected)\n */\n getMobileDeviceId(): string | null {\n return this.mobileConnection$.value?.mobileDeviceId || null;\n }\n\n /**\n * Get current pairing session\n */\n getPairingSession(): Observable<TisPairingSession | null> {\n return this.pairingSession$.asObservable();\n }\n\n /**\n * Get connection status\n */\n getConnectionStatus(): Observable<'disconnected' | 'pending' | 'connected'> {\n return this.connectionStatus$.asObservable();\n }\n\n /**\n * Get remote upload events\n */\n getRemoteUploads(): Observable<TisRemoteUploadEvent> {\n return this.remoteUpload$.asObservable();\n }\n\n /**\n * Get error events\n */\n getErrors(): Observable<string> {\n return this.error$.asObservable();\n }\n\n /**\n * Check if remote upload is available (configured and socket connected)\n */\n isAvailable(): boolean {\n return !!(\n this.config?.enabled &&\n this.socketAdapter &&\n this.socketAdapter.isConnected()\n );\n }\n\n /**\n * Check if currently connected to a mobile device\n */\n isConnectedToMobile(): boolean {\n return this.connectionStatus$.value === 'connected' && !!this.mobileConnection$.value;\n }\n\n /**\n * Alias for isConnectedToMobile - Check if paired with mobile\n */\n isPaired(): boolean {\n return this.isConnectedToMobile();\n }\n\n // ===========================================================================\n // QR Code Generation (New Flow)\n // ===========================================================================\n\n /**\n * Generate QR code data for mobile app\n * Flow:\n * 1. Call API to get a short-lived link token (UUID)\n * 2. Build QR URL with: apiUrl, deviceId, userId, token\n */\n async generateQrCode(): Promise<{ qrData: string; expiresAt: number }> {\n if (!this.isAvailable()) {\n throw new Error('Remote upload is not available. Check configuration and socket connection.');\n }\n\n if (!this.apiUrl) {\n throw new Error('API URL not configured in socket adapter');\n }\n\n try {\n // Step 1: Get link token from backend\n const endpoint = this.config?.apiEndpoints?.generateMobileLinkToken \n || `${this.apiUrl}/ease-of-access/mobile-upload-link-token`;\n\n const apiResponse = await this.callHttpApi<{ success: boolean; data: { token: string; expiresAt: number; deviceId?: string; userId?: string; apiUrl?: string } }>(\n endpoint, \n { deviceId: this.deviceId, userId: this.userId }\n );\n\n // Unwrap the data from API response\n const response = apiResponse.data || apiResponse as any;\n\n const expirySeconds = this.config?.qrCode?.expirySeconds || DEFAULT_QR_EXPIRY;\n const expiresAt = response.expiresAt || Date.now() + expirySeconds * 1000;\n\n // Step 2: Build QR URL\n const mobileUrl = this.config?.qrCode?.mobileUploadUrl || '';\n const qrData = this.buildQrUrl(mobileUrl, {\n token: response.token,\n deviceId: this.deviceId,\n userId: this.userId,\n apiUrl: this.apiUrl\n });\n\n // Update pairing session\n const session: TisPairingSession = {\n pairingCode: response.token,\n desktopDeviceId: this.deviceId,\n channel: this.channelName,\n createdAt: Date.now(),\n expiresAt,\n status: 'pending'\n };\n this.pairingSession$.next(session);\n this.connectionStatus$.next('pending');\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] QR code generated, waiting for mobile...`);\n\n return { qrData, expiresAt };\n\n } catch (error: any) {\n const msg = `Failed to generate QR code: ${error.message}`;\n console.error(`[${TisRemoteUploadService.COMPONENT}]`, msg);\n this.error$.next(msg);\n throw error;\n }\n }\n\n /**\n * Build QR URL with minimal parameters\n */\n private buildQrUrl(\n baseUrl: string,\n params: { token: string; deviceId: string; userId: string; apiUrl: string }\n ): string {\n const url = new URL(baseUrl);\n url.searchParams.set('token', params.token);\n url.searchParams.set('deviceId', params.deviceId);\n url.searchParams.set('userId', params.userId);\n url.searchParams.set('apiUrl', encodeURIComponent(params.apiUrl));\n return url.toString();\n }\n\n // ===========================================================================\n // Mobile Communication\n // ===========================================================================\n\n /**\n * Send message to mobile device via channel\n */\n sendToMobile(type: string, data: any): void {\n if (!this.socketAdapter?.sendViaSocket) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] sendViaSocket not available`);\n return;\n }\n\n const message = {\n action: 'send-to-channel',\n data: {\n channel: this.channelName,\n payload: {\n type,\n ...data,\n desktopDeviceId: this.deviceId,\n timestamp: Date.now()\n }\n }\n };\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Sending to mobile:`, message);\n this.socketAdapter.sendViaSocket(message);\n }\n\n /**\n * Accept mobile connection (send SUCCESS response)\n */\n private acceptMobileConnection(mobileDeviceId: string): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Accepting mobile connection:`, mobileDeviceId);\n\n // Save mobile connection\n const connectionInfo: MobileConnectionInfo = {\n mobileDeviceId,\n connectedAt: Date.now(),\n lastActivity: Date.now()\n };\n this.mobileConnection$.next(connectionInfo);\n this.saveMobileConnection(connectionInfo);\n\n // Update status\n this.connectionStatus$.next('connected');\n\n // Update session\n const session = this.pairingSession$.value;\n if (session) {\n const updatedSession: TisPairingSession = {\n ...session,\n mobileDeviceId,\n status: 'connected',\n lastActivity: Date.now()\n };\n this.pairingSession$.next(updatedSession);\n }\n\n // Send SUCCESS to mobile\n this.sendToMobile('connectionState', { state: 'SUCCESS' });\n }\n\n /**\n * Disconnect from mobile device - call API and clear local state\n */\n async disconnect(): Promise<void> {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Disconnecting from mobile...`);\n\n const mobileDeviceId = this.mobileConnection$.value?.mobileDeviceId;\n\n // Call disconnect API via socket\n if (this.socketAdapter?.callApiViaSocket && mobileDeviceId) {\n try {\n const callApi = this.socketAdapter.callApiViaSocket.bind(this.socketAdapter);\n const response = await new Promise<any>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error('Disconnect API timeout')), 10000);\n \n callApi('tis-image-mobile-uploader/disconnect-mobile-link', {\n desktopDeviceId: this.deviceId,\n mobileDeviceId: mobileDeviceId,\n initiatedBy: 'desktop'\n }).pipe(take(1)).subscribe({\n next: (res) => {\n clearTimeout(timeout);\n resolve(res);\n },\n error: (err) => {\n clearTimeout(timeout);\n reject(err);\n }\n });\n });\n console.log(`[${TisRemoteUploadService.COMPONENT}] Disconnect API response:`, response);\n } catch (error: any) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Disconnect API call failed:`, error);\n // Continue with local cleanup anyway\n }\n }\n\n // Notify mobile via channel (backup notification)\n this.sendToMobile('mobile-link-disconnected', { \n desktopDeviceId: this.deviceId,\n initiatedBy: 'desktop'\n });\n\n // Clear state\n this.mobileConnection$.next(null);\n this.connectionStatus$.next('disconnected');\n this.pairingSession$.next(null);\n this.clearMobileConnection();\n }\n\n /**\n * Handle disconnect initiated from remote (mobile) side\n */\n private handleRemoteDisconnect(data: any): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Mobile disconnected:`, data);\n \n // Clear state without calling API (mobile already initiated)\n this.mobileConnection$.next(null);\n this.connectionStatus$.next('disconnected');\n this.pairingSession$.next(null);\n this.clearMobileConnection();\n }\n\n // ===========================================================================\n // Channel Subscription & Message Handling\n // ===========================================================================\n\n /**\n * Subscribe to channel for receiving messages from mobile\n */\n private subscribeToChannel(channel: string): void {\n if (this.channelSubscription) {\n this.channelSubscription.unsubscribe();\n }\n\n if (!this.socketAdapter) {\n return;\n }\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Subscribing to channel:`, channel);\n\n this.channelSubscription = this.socketAdapter.subscribeToChannel(channel)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (message: any) => this.handleChannelMessage(message),\n error: (error) => {\n console.error(`[${TisRemoteUploadService.COMPONENT}] Channel error:`, error);\n this.error$.next(`Channel subscription error: ${error.message}`);\n }\n });\n }\n\n /**\n * Handle incoming channel messages from mobile\n */\n private handleChannelMessage(message: any): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Received:`, message);\n\n // Extract message type and data - handle nested payload structure\n const payload = message.payload || message.data || message;\n const type = payload.type || message.type;\n const data = payload;\n\n switch (type) {\n case 'connectionState':\n this.handleConnectionState(data);\n break;\n\n case 'mobile-link-established':\n this.handleMobileLinkEstablished(data);\n break;\n\n case 'image-uploaded':\n case 'upload_complete':\n this.handleUploadComplete(message);\n break;\n\n case 'disconnect':\n case 'mobile-link-disconnected':\n this.handleMobileDisconnect(data);\n break;\n\n default:\n // Check if it's an upload event\n if (data.file || data.fileName || data.fileUrl) {\n this.handleUploadComplete(message);\n } else {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Unknown message type:`, type);\n }\n }\n }\n\n /**\n * Handle mobile-link-established message\n * This is sent when mobile successfully connects via the backend\n */\n private handleMobileLinkEstablished(data: any): void {\n const mobileDeviceId = data.mobileDeviceId;\n const mobileConnectionId = data.mobileConnectionId;\n const userId = data.userId;\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Mobile link established:`, {\n mobileDeviceId,\n mobileConnectionId,\n userId\n });\n\n if (mobileDeviceId) {\n // Save mobile connection\n const connectionInfo: MobileConnectionInfo = {\n mobileDeviceId,\n connectedAt: Date.now(),\n lastActivity: Date.now()\n };\n this.mobileConnection$.next(connectionInfo);\n this.saveMobileConnection(connectionInfo);\n\n // Update status to connected\n this.connectionStatus$.next('connected');\n\n // Update session\n const session = this.pairingSession$.value;\n if (session) {\n const updatedSession: TisPairingSession = {\n ...session,\n mobileDeviceId,\n status: 'connected',\n lastActivity: Date.now()\n };\n this.pairingSession$.next(updatedSession);\n }\n\n // Send SUCCESS acknowledgment to mobile\n this.sendToMobile('connectionState', { \n state: 'SUCCESS',\n desktopDeviceId: this.deviceId,\n mobileConnectionId \n });\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Connection established with mobile device:`, mobileDeviceId);\n }\n }\n\n /**\n * Handle connection state messages from mobile\n */\n private handleConnectionState(data: any): void {\n const state = data.state || data.connectionState;\n const mobileDeviceId = data.mobileDeviceId;\n\n console.log(`[${TisRemoteUploadService.COMPONENT}] Connection state:`, state, 'from:', mobileDeviceId);\n\n if (state === 'INITIATED' && mobileDeviceId) {\n // Mobile is initiating connection - accept it\n this.acceptMobileConnection(mobileDeviceId);\n }\n }\n\n /**\n * Handle upload complete from mobile\n */\n private handleUploadComplete(message: any): void {\n const data = message.data || message.payload || message;\n const file = data.file || data;\n\n if (file) {\n const event: TisRemoteUploadEvent = {\n file,\n mobileDeviceId: data.mobileDeviceId || this.mobileConnection$.value?.mobileDeviceId || 'unknown',\n timestamp: data.timestamp || Date.now(),\n sessionId: data.sessionId\n };\n\n // Update last activity\n const conn = this.mobileConnection$.value;\n if (conn) {\n const updated = { ...conn, lastActivity: Date.now() };\n this.mobileConnection$.next(updated);\n this.saveMobileConnection(updated);\n }\n\n this.remoteUpload$.next(event);\n console.log(`[${TisRemoteUploadService.COMPONENT}] Upload received:`, event);\n }\n }\n\n /**\n * Handle mobile disconnect\n */\n private handleMobileDisconnect(data: any): void {\n console.log(`[${TisRemoteUploadService.COMPONENT}] Mobile disconnected:`, data);\n \n this.mobileConnection$.next(null);\n this.connectionStatus$.next('disconnected');\n this.clearMobileConnection();\n\n // Update session\n const session = this.pairingSession$.value;\n if (session) {\n this.pairingSession$.next({\n ...session,\n status: 'disconnected',\n lastActivity: Date.now()\n });\n }\n }\n\n // ===========================================================================\n // Storage\n // ===========================================================================\n\n /**\n * Save mobile connection to localStorage\n */\n private saveMobileConnection(info: MobileConnectionInfo): void {\n try {\n localStorage.setItem(\n TisRemoteUploadService.MOBILE_CONNECTION_KEY, \n JSON.stringify(info)\n );\n } catch (e) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Failed to save connection:`, e);\n }\n }\n\n /**\n * Restore mobile connection from localStorage\n */\n private restoreMobileConnection(): void {\n try {\n const stored = localStorage.getItem(TisRemoteUploadService.MOBILE_CONNECTION_KEY);\n if (stored) {\n const info: MobileConnectionInfo = JSON.parse(stored);\n // Only restore if connected within last 24 hours\n if (Date.now() - info.lastActivity < DEFAULT_PAIRING_TTL) {\n this.mobileConnection$.next(info);\n // Note: actual connection status will be updated when mobile reconnects\n } else {\n this.clearMobileConnection();\n }\n }\n } catch (e) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Failed to restore connection:`, e);\n }\n }\n\n /**\n * Clear mobile connection from localStorage\n */\n private clearMobileConnection(): void {\n try {\n localStorage.removeItem(TisRemoteUploadService.MOBILE_CONNECTION_KEY);\n } catch (e) {\n console.warn(`[${TisRemoteUploadService.COMPONENT}] Failed to clear connection:`, e);\n }\n }\n\n // ===========================================================================\n // HTTP API\n // ===========================================================================\n\n /**\n * Call HTTP API endpoint\n */\n private callHttpApi<T>(endpoint: string, data: any): Promise<T> {\n return new Promise((resolve, reject) => {\n this.http.post<T>(endpoint, data)\n .pipe(take(1), timeout(30000))\n .subscribe({\n next: resolve,\n error: reject\n });\n });\n }\n\n // ===========================================================================\n // Cleanup\n // ===========================================================================\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.channelSubscription) {\n this.channelSubscription.unsubscribe();\n }\n }\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { Subject, Subscription, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { TisRemoteUploadService } from '../services/tis-remote-upload.service';\nimport { TisPairingSession, TisRemoteUploadEvent } from '../interfaces/socket-adapter.interface';\n\nexport interface FieldInfo {\n label?: string;\n accept?: string;\n type?: 'image' | 'file';\n entityType?: string;\n entityId?: any;\n isMultiple?: boolean;\n limit?: number;\n isCompressed?: boolean;\n}\n\nexport interface TisQrCodeDialogData {\n title?: string;\n subtitle?: string;\n qrSize?: number;\n showCountdown?: boolean;\n autoCloseOnUpload?: boolean;\n fieldInfo?: FieldInfo;\n}\n\n@Component({\n selector: 'tis-qr-code-dialog',\n standalone: false,\n templateUrl: './tis-qr-code-dialog.component.html',\n styleUrls: ['./tis-qr-code-dialog.component.css']\n})\nexport class TisQrCodeDialogComponent implements OnInit, OnDestroy {\n qrData: string = '';\n expiresAt: number = 0;\n remainingTime: string = '';\n \n isLoading = true;\n isExpired = false;\n isConnected = false;\n errorMessage: string | null = null;\n\n connectionStatus: 'disconnected' | 'pending' | 'connected' = 'disconnected';\n uploadedFiles: TisRemoteUploadEvent[] = [];\n\n // Device IDs\n desktopDeviceId: string = '';\n mobileDeviceId: string | null = null;\n\n private destroy$ = new Subject<void>();\n private countdownSubscription: Subscription | null = null;\n\n constructor(\n public dialogRef: MatDialogRef<TisQrCodeDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: TisQrCodeDialogData,\n private remoteUploadService: TisRemoteUploadService\n ) {}\n\n ngOnInit(): void {\n // Get desktop device ID\n this.desktopDeviceId = this.remoteUploadService.getDesktopDeviceId();\n \n // Subscribe to events first\n this.subscribeToEvents();\n \n // Check if already connected to mobile\n this.checkExistingConnection();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n }\n\n /**\n * Check if there's an existing mobile connection\n */\n private checkExistingConnection(): void {\n this.mobileDeviceId = this.remoteUploadService.getMobileDeviceId();\n \n if (this.remoteUploadService.isConnectedToMobile()) {\n this.isConnected = true;\n this.connectionStatus = 'connected';\n this.isLoading = false;\n \n // Send field info to mobile since already connected\n if (this.data.fieldInfo) {\n this.sendFieldInfoToMobile();\n }\n } else {\n // No existing connection, generate QR code\n this.generateQrCode();\n }\n }\n\n private async generateQrCode(): Promise<void> {\n this.isLoading = true;\n this.errorMessage = null;\n this.isExpired = false;\n\n try {\n const result = await this.remoteUploadService.generateQrCode();\n this.qrData = result.qrData;\n this.expiresAt = result.expiresAt;\n\n this.isLoading = false;\n this.startCountdown();\n } catch (error: any) {\n this.isLoading = false;\n this.errorMessage = error.message || 'Failed to generate QR code';\n }\n }\n\n private subscribeToEvents(): void {\n // Connection status\n this.remoteUploadService.getConnectionStatus()\n .pipe(takeUntil(this.destroy$))\n .subscribe(status => {\n this.connectionStatus = status;\n const wasConnected = this.isConnected;\n this.isConnected = status === 'connected';\n \n // Send field info when first connected\n if (!wasConnected && this.isConnected && this.data.fieldInfo) {\n this.sendFieldInfoToMobile();\n }\n });\n\n // Mobile connection changes\n this.remoteUploadService.getMobileConnection()\n .pipe(takeUntil(this.destroy$))\n .subscribe(connection => {\n this.mobileDeviceId = connection?.mobileDeviceId || null;\n });\n\n // Remote uploads\n this.remoteUploadService.getRemoteUploads()\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n this.uploadedFiles.push(event);\n \n if (this.data.autoCloseOnUpload) {\n this.dialogRef.close({ uploaded: true, files: this.uploadedFiles });\n }\n });\n\n // Errors\n this.remoteUploadService.getErrors()\n .pipe(takeUntil(this.destroy$))\n .subscribe(error => {\n console.error('[TisQrCodeDialog] Error:', error);\n });\n }\n\n /**\n * Send field configuration to mobile device\n */\n private sendFieldInfoToMobile(): void {\n if (!this.data.fieldInfo) return;\n \n console.log('[TisQrCodeDialog] Sending field info to mobile:', this.data.fieldInfo);\n this.remoteUploadService.sendToMobile('field-info', this.data.fieldInfo);\n }\n\n private startCountdown(): void {\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n\n this.countdownSubscription = interval(1000)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n const now = Date.now();\n const remaining = Math.max(0, this.expiresAt - now);\n\n if (remaining <= 0) {\n this.isExpired = true;\n this.remainingTime = 'Expired';\n this.countdownSubscription?.unsubscribe();\n } else {\n const minutes = Math.floor(remaining / 60000);\n const seconds = Math.floor((remaining % 60000) / 1000);\n this.remainingTime = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }\n });\n }\n\n // ---------------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------------\n\n /**\n * Format device ID for display\n */\n formatDeviceId(id: string | null): string {\n if (!id) return '---';\n if (id.length > 16) {\n return `${id.slice(0, 8)}...${id.slice(-4)}`;\n }\n return id;\n }\n\n /**\n * Refresh QR code\n */\n refreshQrCode(): void {\n this.isExpired = false;\n this.uploadedFiles = [];\n this.generateQrCode();\n }\n\n /**\n * Connect to mobile (show QR if disconnected)\n */\n connectToMobile(): void {\n this.generateQrCode();\n }\n\n /**\n * Disconnect from mobile\n */\n disconnect(): void {\n this.remoteUploadService.disconnect();\n this.mobileDeviceId = null;\n this.isConnected = false;\n this.connectionStatus = 'disconnected';\n }\n\n /**\n * Close dialog\n */\n close(): void {\n this.dialogRef.close({ \n uploaded: this.uploadedFiles.length > 0, \n files: this.uploadedFiles \n });\n }\n}\n","<div class=\"qr-dialog-container\">\n <!-- Header -->\n <div class=\"qr-dialog-header\">\n <h2 class=\"qr-dialog-title\">{{ data.title || 'Upload from Mobile' }}</h2>\n <p class=\"qr-dialog-subtitle\">{{ data.subtitle || 'Scan this QR code with your mobile device to upload images' }}</p>\n <button mat-icon-button class=\"close-btn\" (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"qr-dialog-content\">\n <!-- Loading State -->\n <div *ngIf=\"isLoading\" class=\"loading-container\">\n <mat-spinner diameter=\"48\"></mat-spinner>\n <p>Generating QR Code...</p>\n </div>\n\n <!-- Error State -->\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-container\">\n <mat-icon class=\"error-icon\">error_outline</mat-icon>\n <p class=\"error-message\">{{ errorMessage }}</p>\n <button mat-raised-button color=\"primary\" (click)=\"refreshQrCode()\">\n Try Again\n </button>\n </div>\n\n <!-- Main Content -->\n <div *ngIf=\"!isLoading && !errorMessage\" class=\"qr-content\">\n \n <!-- Device Info Card -->\n <div class=\"device-info-card\">\n <div class=\"device-row\">\n <mat-icon class=\"device-icon desktop\">computer</mat-icon>\n <div class=\"device-details\">\n <span class=\"device-label\">THIS DEVICE</span>\n <span class=\"device-id\" [title]=\"desktopDeviceId\">{{ formatDeviceId(desktopDeviceId) }}</span>\n </div>\n </div>\n \n <div class=\"connection-line\" *ngIf=\"mobileDeviceId\">\n <mat-icon>sync_alt</mat-icon>\n </div>\n \n <div class=\"device-row\" *ngIf=\"mobileDeviceId\">\n <mat-icon class=\"device-icon mobile\">smartphone</mat-icon>\n <div class=\"device-details\">\n <span class=\"device-label\">CONNECTED MOBILE</span>\n <span class=\"device-id\" [title]=\"mobileDeviceId\">{{ formatDeviceId(mobileDeviceId) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Connected State -->\n <div *ngIf=\"isConnected\" class=\"connected-state\">\n <div class=\"connected-indicator\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>Mobile Connected!</span>\n </div>\n <p class=\"connected-message\">\n You can now upload images from your mobile device. \n Select a file/image upload field and the uploaded files will appear automatically.\n </p>\n \n <!-- Uploaded Files -->\n <div class=\"uploaded-files\" *ngIf=\"uploadedFiles.length > 0\">\n <h4>Uploaded Files ({{ uploadedFiles.length }})</h4>\n <div class=\"file-list\">\n <div class=\"file-item\" *ngFor=\"let upload of uploadedFiles\">\n <mat-icon>check_circle</mat-icon>\n <span>{{ upload.file.fileName }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- QR Code (only show when not connected) -->\n <div *ngIf=\"!isConnected\" class=\"qr-section\">\n <!-- Connection Status -->\n <div class=\"connection-status\" [ngClass]=\"connectionStatus\">\n <div class=\"status-indicator\"></div>\n <span *ngIf=\"connectionStatus === 'disconnected'\">Waiting for mobile...</span>\n <span *ngIf=\"connectionStatus === 'pending'\">Waiting for connection...</span>\n </div>\n\n <!-- QR Code -->\n <div class=\"qr-code-wrapper\" [class.expired]=\"isExpired\">\n <qrcode \n *ngIf=\"qrData\"\n [qrdata]=\"qrData\" \n [width]=\"data.qrSize || 200\" \n [errorCorrectionLevel]=\"'M'\"\n [elementType]=\"'canvas'\"\n [cssClass]=\"'qr-canvas'\"\n ></qrcode>\n \n <!-- Expired Overlay -->\n <div *ngIf=\"isExpired\" class=\"expired-overlay\">\n <mat-icon>refresh</mat-icon>\n <p>QR Code Expired</p>\n <button mat-raised-button color=\"primary\" (click)=\"refreshQrCode()\">\n Generate New Code\n </button>\n </div>\n </div>\n\n <!-- Countdown Timer -->\n <div class=\"countdown\" *ngIf=\"data.showCountdown !== false && !isExpired\">\n <mat-icon>timer</mat-icon>\n <span>Expires in {{ remainingTime }}</span>\n </div>\n </div>\n\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"qr-dialog-footer\">\n <button mat-button *ngIf=\"isConnected\" color=\"warn\" (click)=\"disconnect()\">\n <mat-icon>link_off</mat-icon>\n Disconnect\n </button>\n <button mat-button *ngIf=\"!isConnected && !isLoading\" (click)=\"connectToMobile()\">\n <mat-icon>qr_code</mat-icon>\n Connect & Upload via Mobile\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"close()\">\n {{ uploadedFiles.length > 0 ? 'Done' : 'Close' }}\n </button>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output, SimpleChanges, OnDestroy } from '@angular/core';\nimport { TisFileViewerComponent } from '../tis-file-viewer/tis-file-viewer.component';\nimport type { DialogConfig, FileViewerDialogData, FileViewerFileType, OptionConfig, UrlConfig, TisRemoteUploadConfig, TisRemoteUploadEvent } from '../interfaces';\nimport { TisPreviewImageComponent } from '../tis-preview-image/tis-preview-image.component';\nimport { BehaviorSubject, Observable, Subject, map, sequenceEqual, shareReplay, takeUntil } from 'rxjs';\nimport { MatDialog } from '@angular/material/dialog';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { TisHelperService } from '../services/tis-helper.service';\nimport { TisConfirmationDialogComponent } from '../tis-confirmation-dialog/tis-confirmation-dialog.component';\nimport { TisQrCodeDialogComponent, TisQrCodeDialogData } from '../tis-qr-code-dialog/tis-qr-code-dialog.component';\nimport { TisRemoteUploadService } from '../services/tis-remote-upload.service';\nimport { Config } from '../interfaces/config.type';\nimport { CdkDragDrop, CdkDragMove, moveItemInArray } from '@angular/cdk/drag-drop';\n\nconst generateRandomString = (length: number): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n@Component({\n selector: 'tis-image-and-file-upload-and-view',\n standalone: false,\n templateUrl: './tis-image-and-file-upload-and-view.component.html',\n styleUrl: './tis-image-and-file-upload-and-view.component.css'\n})\nexport class TisImageAndFileUploadAndViewComponent implements OnDestroy {\n private changeSubject = new BehaviorSubject<boolean>(false);\n private destroy$ = new Subject<void>();\n\n @Input({required: true}) urlConfig!: UrlConfig;\n @Input() entityType!: string;\n @Input() entityId: any;\n @Input() viewType: 'card' | 'list' | 'compact' = 'card';\n @Input() type: 'image' | 'file' = 'image';\n @Input() label: string | null = null;\n @Input() disabled: boolean = false;\n @Input() data: any;\n @Input() hint: string | null = null;\n @Input() accept: string = '';\n @Input() isValidateMimeType: boolean = true;\n @Input() selectedId: any = null;\n @Input() options: OptionConfig | null = null;\n @Input() required: boolean = false;\n @Input() previewOnly: boolean = false;\n @Input() previewInFlex: boolean = false;\n @Input() imageItemClass: string = '';\n @Input() isAddUploadedFileInLastNode: boolean = false;\n @Input() isEnableDeleteConfirmation: boolean = true;\n @Input() isEnableCapture: boolean = false;\n @Input() deleteConfirmationMsg!: string;\n @Input() dialogConfig!: DialogConfig;\n \n // Remote Upload Configuration\n @Input() remoteUploadConfig: TisRemoteUploadConfig | null = null;\n \n @Output() uploadInProgress = new EventEmitter();\n @Output() onUploaded = new EventEmitter();\n @Output() onFileSelect = new EventEmitter<any>();\n @Output() onFileRemoved = new EventEmitter<any>();\n @Output() onError = new EventEmitter();\n @Output() onRemoteUpload = new EventEmitter<TisRemoteUploadEvent>();\n\n @Input() isShowImageSequence: boolean = false;\n @Input() enableDragNDrop: boolean = false;\n @Input() showDeleteButtonWhenDisabled: boolean = false;\n @Output() dataSequenceChange = new EventEmitter<any>();\n\n isMobile = false;\n isTab = false;\n\n isHandset$!: Observable<boolean>;\n isTab$!: Observable<boolean>;\n\n\n config: Config = {\n isCompressed: false,\n hiddenDeleteBtn: false,\n hiddenPreview: false,\n selectionMode: false,\n isStoredDb: false,\n isMultiple: false,\n limit: 10,\n cols: 5,\n colsForTab: 5,\n colsForMobile: 3,\n height: '130px',\n selectorId: generateRandomString(10),\n enableImageTags: false,\n useAdvancedCamera: true // Enable advanced camera modal by default\n };\n\n isSliderLoaded = true;\n\n filesArray: any[] = [\n // {\n // \"s3Url\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/da226bf2-4e5f-4180-94d8-6746b1ce139b.jpg\",\n // \"uploadData\": {\n // \"isBase64Encoded\": false,\n // \"headers\": {\n // \"Access-Control-Allow-Origin\": \"*\"\n // },\n // \"uploadURL\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/da226bf2-4e5f-4180-94d8-6746b1ce139b.jpg?Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA37VN5NQI5HY4VFVN%2F20220617%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220617T152621Z&X-Amz-Expires=900&X-Amz-Signature=4004cfb10a740b9623d486de992a06f53b458ed6fc151c092eea88a3059eae8f&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read\",\n // \"photoFilename\": \"f7a32cd0-d0c1-474a-838e-47402d80527a.jpeg\",\n // \"fileName\": \"1452664590074.jpeg\",\n // \"uploadPath\": \"/survey_orders/f7a32cd0-d0c1-474a-838e-47402d80527a.jpeg\",\n // \"resourceUrl\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/da226bf2-4e5f-4180-94d8-6746b1ce139b.jpg\"\n // }\n // },\n // {\n // \"s3Url\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/31033a2a-5db6-450d-a541-58a94654dd0c.jpg\",\n // \"uploadData\": {\n // \"isBase64Encoded\": false,\n // \"headers\": {\n // \"Access-Control-Allow-Origin\": \"*\"\n // },\n // \"uploadURL\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/6c537889-c72a-48ca-9134-638e8d6a1aac.sql?Content-Type=application%2Fsql&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA37VN5NQI5HY4VFVN%2F20220617%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220617T152641Z&X-Amz-Expires=900&X-Amz-Signature=bcdf347df2a6495615bf48d619492e1deac2264231161da5dc3becaa7f45a796&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read\",\n // \"photoFilename\": \"6c537889-c72a-48ca-9134-638e8d6a1aac.sql\",\n // \"fileName\": \"eccom_bermuda.sql\",\n // \"uploadPath\": \"/survey_orders/6c537889-c72a-48ca-9134-638e8d6a1aac.sql\",\n // \"resourceUrl\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/6c537889-c72a-48ca-9134-638e8d6a1aac.sql\"\n // }\n // },\n // {\n // \"s3Url\": \"https://obk-servicemind-uat-resources.s3.ap-southeast-1.amazonaws.com/parcel_create/b8424185-30c6-4f44-ba1e-ff616dfd6576.jpg\",\n // \"uploadData\": {\n // \"isBase64Encoded\": false,\n // \"headers\": {\n // \"Access-Control-Allow-Origin\": \"*\"\n // },\n // \"uploadURL\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/232f2548-dc93-4204-8835-86b69f3005a7.pdf?Content-Type=application%2Fpdf&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA37VN5NQI5HY4VFVN%2F20220617%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220617T152656Z&X-Amz-Expires=900&X-Amz-Signature=85643479c3fbecc5bd1fee9783e3cb72e27e16a034921b52cf2f377eefb01ff9&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read\",\n // \"photoFilename\": \"232f2548-dc93-4204-8835-86b69f3005a7.pdf\",\n // \"fileName\": \"print-registration-4x6.pdf\",\n // \"uploadPath\": \"/survey_orders/232f2548-dc93-4204-8835-86b69f3005a7.pdf\",\n // \"resourceUrl\": \"https://servicemind-resources-staging.s3.ap-southeast-1.amazonaws.com/survey_orders/232f2548-dc93-4204-8835-86b69f3005a7.pdf\"\n // }\n // }\n ];\n currentEntityId!: number;\n currentEntityType!: string;\n images = [];\n loading = false;\n status = false;\n\n\n constructor(\n public dialog: MatDialog,\n private helper: TisHelperService,\n private breakpointObserver: BreakpointObserver,\n private remoteUploadService: TisRemoteUploadService\n ) { }\n\n ngOnInit() {\n this.isHandset$ = this.breakpointObserver.observe([Breakpoints.Handset])\n .pipe(\n map(result => result.matches),\n shareReplay()\n );\n\n this.isTab$ = this.breakpointObserver.observe([Breakpoints.TabletPortrait])\n .pipe(\n map(result => result.matches),\n shareReplay()\n );\n \n this.prepareConfig();\n\n // Initialize remote upload if configured\n this.initRemoteUpload();\n\n // if(this.viewType == 'single-card'){\n // this.generateFilesForSingleCard();\n // }\n }\n\n ngAfterViewInit() {\n this.isHandset$.subscribe(r => {\n console.log('IS HANDSET:', r);\n this.isMobile = r;\n this.changeSubject.next(true);\n });\n this.isTab$.subscribe(r => {\n console.log('IS TAB:', r);\n this.isTab = r;\n this.changeSubject.next(true);\n });\n\n this.changeSubject.subscribe(status => {\n let cols = 1;\n if (this.isMobile) {\n cols = this.options?.colsForMobile ?? 3;\n }\n else if (this.isTab) {\n cols = this.options?.colsForTab ?? 4;\n }\n else {\n cols = this.options?.cols ?? 5;\n }\n\n this.config.cols = cols;\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['entityId']) {\n this.currentEntityId = changes['entityId'].currentValue;\n }\n if (changes['entityType']) {\n this.currentEntityType = changes['entityType'].currentValue;\n }\n if (changes['urlConfig']) {\n this.urlConfig = changes['urlConfig'].currentValue;\n this.config.isStoredDb = false;\n if (this.urlConfig?.attachToEntity) {\n this.config.isStoredDb = true;\n }\n }\n if (changes['options']) {\n this.prepareConfig();\n }\n if (changes['data']) {\n this.filesArray = changes['data']?.currentValue ?? [];\n this.filesArray = this.filesArray?.map(r => {\n r.loading = false;\n return r;\n });\n console.log(\"this.filesArray\", this.filesArray);\n }\n if(changes['viewType'] && changes['viewType'].currentValue == 'compact'){\n this.config.limit = 1;\n this.config.isMultiple = false;\n }\n if (changes['remoteUploadConfig']) {\n this.initRemoteUpload();\n }\n }\n\n prepareConfig() {\n if (this.options?.isCompressed) {\n this.config.isCompressed = this.options?.isCompressed;\n }\n\n if (this.options?.isSliderPreview) {\n this.config.isSliderPreview = this.options?.isSliderPreview;\n }\n\n if (this.options?.hiddenDeleteBtn) {\n this.config.hiddenDeleteBtn = this.options?.hiddenDeleteBtn;\n }\n\n if (this.options?.hiddenPreview) {\n this.config.hiddenPreview = this.options?.hiddenPreview;\n }\n\n if (this.options?.selectionMode) {\n this.config.selectionMode = this.options?.selectionMode;\n }\n\n this.config.isStoredDb = false;\n if (this.urlConfig?.attachToEntity) {\n this.config.isStoredDb = true;\n }\n\n if (this.options?.isMultiple) {\n this.config.isMultiple = this.options?.isMultiple;\n if(this.viewType == 'compact'){\n this.config.isMultiple = false;\n }\n }\n\n if (this.options?.fileSize) {\n this.config.fileSize = this.options?.fileSize;\n }\n\n if (this.options?.limit) {\n this.config.limit = this.options?.limit;\n if (this.viewType == 'compact') {\n this.config.limit = 1;\n }\n }\n\n if (this.options?.cols) {\n this.config.cols = this.options?.cols;\n }\n\n if (this.options?.colsForTab) {\n this.config.colsForTab = this.options?.colsForTab;\n }\n\n if (this.options?.colsForMobile) {\n this.config.colsForMobile = this.options?.colsForMobile;\n }\n\n if (this.options?.height) {\n this.config.height = this.options?.height;\n }\n\n if (this.options?.selectorId) {\n this.config.selectorId = this.options?.selectorId;\n }\n\n if (this.options?.enableImageTags) {\n this.config.enableImageTags = this.options?.enableImageTags;\n }\n\n if (this.options?.useAdvancedCamera !== undefined) {\n this.config.useAdvancedCamera = this.options?.useAdvancedCamera;\n }\n }\n\n /**\n * Validates selected files against the accept parameter\n * @param files - FileList of selected files\n * @returns boolean - true if all files are valid, false otherwise\n */\n private validateFileTypes(files: FileList): boolean {\n if (!this.accept || this.accept.trim() === '') {\n return true; // No validation needed if accept is not specified\n }\n\n const acceptedTypes = this.accept.split(',').map(type => type.trim().toLowerCase());\n const invalidFiles: string[] = [];\n \n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();\n \n if (!acceptedTypes.includes(fileExtension)) {\n invalidFiles.push(file.name);\n }\n }\n \n if (invalidFiles.length > 0) {\n const acceptedTypesStr = acceptedTypes.join(', ');\n const invalidFilesStr = invalidFiles.join(', ');\n this.helper.showErrorMsg(\n `Invalid file type(s): ${invalidFilesStr}. Only ${acceptedTypesStr} files are allowed.`, \n 'Error', \n 5000\n );\n return false;\n }\n \n return true;\n }\n\n setSliderLoading() {\n this.isSliderLoaded = false;\n setTimeout(() => {\n this.isSliderLoaded = true;\n }, 20);\n }\n\n openImageSelector(selectorId: string = this.config?.selectorId) {\n document.getElementById(selectorId)?.click();\n }\n\n async openCameraCapture() {\n // Check configuration preference and browser support\n if (this.config.useAdvancedCamera && typeof navigator !== 'undefined' && navigator.mediaDevices && typeof navigator.mediaDevices.getUserMedia === 'function') {\n try {\n // Try to open camera directly using MediaDevices API\n await this.openCameraDialog();\n } catch (error) {\n console.log('MediaDevices API failed, falling back to file input:', error);\n // Fallback to file input method\n this.openImageSelector();\n }\n } else {\n // Use simple file input method (works on most browsers including mobile)\n this.openImageSelector();\n }\n }\n\n\n\n\n\n private async openCameraDialog() {\n try {\n // Get available cameras first\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter(device => device.kind === 'videoinput');\n \n // Request camera access\n const stream = await navigator.mediaDevices.getUserMedia({ \n video: { \n facingMode: 'environment', // Prefer rear camera\n width: { ideal: this.isMobile ? 720 : 1920 },\n height: { ideal: this.isMobile ? 480 : 1080 }\n } \n });\n\n // Create a modal dialog with video preview and capture button\n this.showCameraModal(stream, videoDevices);\n\n } catch (error: any) {\n console.error('Error accessing camera:', error);\n \n if (error.name === 'NotAllowedError') {\n this.helper.showErrorMsg('Camera access denied. Please allow camera access and try again.', 'Error', 3000);\n } else if (error.name === 'NotFoundError') {\n this.helper.showErrorMsg('No camera found. Please use file upload instead.', 'Error', 3000);\n } else {\n this.helper.showErrorMsg('Could not access camera. Falling back to file upload.', 'Error', 3000);\n this.openImageSelector();\n }\n throw error;\n }\n }\n\n private showCameraModal(stream: MediaStream, videoDevices?: MediaDeviceInfo[]) {\n let currentStream = stream;\n let currentDeviceIndex = 0;\n\n // Create modal overlay with modern design\n const modal = document.createElement('div');\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(20, 20, 30, 0.95) 100%);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n padding: 20px;\n box-sizing: border-box;\n animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n // Add modern animations and styles\n const style = document.createElement('style');\n style.textContent = `\n @keyframes fadeIn {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes slideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n }\n @keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n }\n @keyframes glow {\n 0%, 100% { box-shadow: 0 0 20px rgba(102, 126, 234, 0.3); }\n 50% { box-shadow: 0 0 40px rgba(102, 126, 234, 0.7); }\n }\n .camera-loading {\n animation: pulse 2s infinite;\n }\n `;\n document.head.appendChild(style);\n\n // Create main container with minimal glass effect\n const mainContainer = document.createElement('div');\n mainContainer.style.cssText = `\n background: #1a1b1f;\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 20px;\n backdrop-filter: blur(20px);\n -webkit-backdrop-filter: blur(20px);\n padding: ${this.isMobile ? '16px' : '24px'};\n height: auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n animation: slideUp 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n // Create video container with clean styling\n const videoContainer = document.createElement('div');\n videoContainer.style.cssText = `\n position: relative;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n justify-content: center;\n `;\n\n // Create video element with clean styling\n const video = document.createElement('video');\n video.style.cssText = `\n width: 100%;\n max-width: 600px;\n height: auto;\n max-height: 70vh;\n border-radius: 12px;\n object-fit: cover;\n background: #000;\n `;\n video.autoplay = true;\n video.playsInline = true;\n video.srcObject = currentStream;\n\n // Create canvas for capturing\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n // Create camera switch button with clean design (only if multiple cameras)\n let switchCameraBtn: HTMLElement | null = null;\n if (videoDevices && videoDevices.length > 1) {\n switchCameraBtn = document.createElement('button');\n switchCameraBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#e3e3e3\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g><path d=\"M20,5h-3.17L15,3H9L7.17,5H4C2.9,5,2,5.9,2,7v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M20,19H4V7 h3.17h0.88l0.59-0.65L9.88,5h4.24l1.24,1.35L15.95,7h0.88H20V19z\"/></g><g><path d=\"M12,17c-2.21,0-4-1.79-4-4h2l-2.5-2.5L5,13h2c0,2.76,2.24,5,5,5c0.86,0,1.65-0.24,2.36-0.62l-0.74-0.74 C13.13,16.87,12.58,17,12,17z\"/></g><g><path d=\"M12,8c-0.86,0-1.65,0.24-2.36,0.62l0.74,0.73C10.87,9.13,11.42,9,12,9c2.21,0,4,1.79,4,4h-2l2.5,2.5L19,13h-2 C17,10.24,14.76,8,12,8z\"/></g></g></g></svg>\n `;\n switchCameraBtn.style.cssText = `\n position: absolute;\n top: 16px;\n right: 16px;\n background: rgba(0, 0, 0, 0.6);\n color: white;\n border: none;\n padding: ${this.isMobile ? '7px 7px' : '10px 10px'};\n border-radius: 25px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n width: auto;\n height: auto;\n z-index: 10;\n `;\n \n switchCameraBtn.addEventListener('mouseenter', () => {\n switchCameraBtn!.style.background = 'rgba(0, 0, 0, 0.8)';\n switchCameraBtn!.style.transform = 'scale(1.05)';\n });\n \n switchCameraBtn.addEventListener('mouseleave', () => {\n switchCameraBtn!.style.background = 'rgba(0, 0, 0, 0.6)';\n switchCameraBtn!.style.transform = 'scale(1)';\n });\n\n videoContainer.appendChild(switchCameraBtn);\n }\n\n // // Create camera status indicator (cleaner design)\n // const statusIndicator = document.createElement('div');\n // statusIndicator.style.cssText = `\n // position: absolute;\n // top: 16px;\n // left: 16px;\n // background: rgba(244, 67, 54, 0.9);\n // color: white;\n // padding: 6px 12px;\n // border-radius: 12px;\n // font-size: 11px;\n // font-weight: 600;\n // display: flex;\n // align-items: center;\n // gap: 6px;\n // backdrop-filter: blur(10px);\n // -webkit-backdrop-filter: blur(10px);\n // z-index: 10;\n // `;\n \n // const statusDot = document.createElement('div');\n // statusDot.style.cssText = `\n // width: 6px;\n // height: 6px;\n // background: #fff;\n // border-radius: 50%;\n // animation: pulse 2s infinite;\n // `;\n \n // statusIndicator.appendChild(statusDot);\n // statusIndicator.appendChild(document.createTextNode('LIVE'));\n // videoContainer.appendChild(statusIndicator);\n\n // Create buttons container with clean layout\n const buttonsDiv = document.createElement('div');\n buttonsDiv.style.cssText = `\n display: flex;\n gap: 12px;\n justify-content: center;\n align-items: center;\n padding: ${this.isMobile ? '10px' : '20px'};\n padding-bottom: 0px;\n background: transparent;\n flex-wrap: wrap;\n `;\n\n // Create capture button with clean design\n const captureBtn = document.createElement('button');\n captureBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"#e3e3e3\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path d=\"M20 4h-3.17L15 2H9L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h4.05l1.83-2h4.24l1.83 2H20v12zM12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z\"/>\n </svg>\n ${this.isMobile ? '' : '&nbsp;Capture'}\n `;\n captureBtn.style.cssText = `\n background: linear-gradient(135deg, #007AFF 0%, #0051D5 100%);\n color: white;\n border: none;\n padding: ${this.isMobile ? '12px' : '14px 20px'};\n border-radius: 25px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n width: auto;\n height: auto;\n min-width: ${this.isMobile ? '50px': '100px'};\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n box-shadow: 0 4px 20px rgba(0, 122, 255, 0.4);\n `;\n\n captureBtn.addEventListener('mouseenter', () => {\n captureBtn.style.transform = 'scale(1.05)';\n captureBtn.style.boxShadow = '0 8px 25px rgba(0, 122, 255, 0.6)';\n });\n \n captureBtn.addEventListener('mouseleave', () => {\n captureBtn.style.transform = 'scale(1)';\n captureBtn.style.boxShadow = '0 4px 20px rgba(0, 122, 255, 0.4)';\n });\n\n // Create library button with clean design\n const libraryBtn = document.createElement('button');\n libraryBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"#e3e3e3\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path d=\"M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z\"/>\n </svg>\n ${this.isMobile ? '' : '&nbsp;Upload'}\n `;\n libraryBtn.style.cssText = `\n background: linear-gradient(135deg, #34C759 0%, #248A3D 100%);\n color: white;\n border: none;\n padding: ${this.isMobile ? '12px' : '14px 20px'};\n border-radius: 25px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n width: auto;\n height: auto;\n min-width: ${this.isMobile ? '50px': '100px'};\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n box-shadow: 0 4px 20px rgba(52, 199, 89, 0.4);\n `;\n\n libraryBtn.addEventListener('mouseenter', () => {\n libraryBtn.style.transform = 'scale(1.05)';\n libraryBtn.style.boxShadow = '0 8px 25px rgba(52, 199, 89, 0.6)';\n });\n \n libraryBtn.addEventListener('mouseleave', () => {\n libraryBtn.style.transform = 'scale(1)';\n libraryBtn.style.boxShadow = '0 4px 20px rgba(52, 199, 89, 0.4)';\n });\n\n // Create cancel button with clean design\n const cancelBtn = document.createElement('button');\n cancelBtn.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"#e3e3e3\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/>\n </svg>\n ${this.isMobile ? '' : '&nbsp;Cancel'}\n `;\n cancelBtn.style.cssText = `\n background: rgba(255, 255, 255, 0.1);\n color: white;\n border: 2px solid rgba(255, 255, 255, 0.3);\n padding: ${this.isMobile ? '12px' : '14px 20px'};\n border-radius: 25px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n width: auto;\n height: auto;\n min-width: ${this.isMobile ? '50px': '100px'};\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n `;\n\n cancelBtn.addEventListener('mouseenter', () => {\n cancelBtn.style.background = 'rgba(255, 255, 255, 0.3)';\n cancelBtn.style.transform = 'scale(1.05)';\n });\n \n cancelBtn.addEventListener('mouseleave', () => {\n cancelBtn.style.background = 'rgba(255, 255, 255, 0.1)';\n cancelBtn.style.transform = 'scale(1)';\n });\n\n // Add elements to modal with proper structure\n videoContainer.appendChild(video);\n buttonsDiv.appendChild(captureBtn);\n buttonsDiv.appendChild(libraryBtn);\n buttonsDiv.appendChild(cancelBtn);\n mainContainer.appendChild(videoContainer);\n mainContainer.appendChild(buttonsDiv);\n modal.appendChild(mainContainer);\n document.body.appendChild(modal);\n\n // Handle camera switching with modern loading states\n if (switchCameraBtn && videoDevices && videoDevices.length > 1) {\n switchCameraBtn.addEventListener('click', async () => {\n try {\n // Show loading state\n switchCameraBtn!.style.opacity = '0.7';\n switchCameraBtn!.style.pointerEvents = 'none';\n switchCameraBtn!.innerHTML = `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" style=\"margin-right: 8px; animation: spin 1s linear infinite;\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" opacity=\"0.3\"/>\n <path d=\"M12 2a10 10 0 0 1 10 10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n `;\n \n // Add spin animation\n const spinStyle = document.createElement('style');\n spinStyle.textContent = `\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n if (!document.querySelector('[data-spin-style]')) {\n spinStyle.setAttribute('data-spin-style', 'true');\n document.head.appendChild(spinStyle);\n }\n\n // Stop current stream\n currentStream.getTracks().forEach(track => track.stop());\n \n // Move to next camera\n currentDeviceIndex = (currentDeviceIndex + 1) % videoDevices.length;\n \n // Get new stream\n const newStream = await navigator.mediaDevices.getUserMedia({\n video: {\n deviceId: videoDevices[currentDeviceIndex].deviceId,\n width: { ideal: 1920 },\n height: { ideal: 1080 }\n }\n });\n \n currentStream = newStream;\n video.srcObject = newStream;\n\n // Reset button state\n setTimeout(() => {\n switchCameraBtn!.style.opacity = '1';\n switchCameraBtn!.style.pointerEvents = 'auto';\n switchCameraBtn!.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#e3e3e3\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g><path d=\"M20,5h-3.17L15,3H9L7.17,5H4C2.9,5,2,5.9,2,7v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M20,19H4V7 h3.17h0.88l0.59-0.65L9.88,5h4.24l1.24,1.35L15.95,7h0.88H20V19z\"/></g><g><path d=\"M12,17c-2.21,0-4-1.79-4-4h2l-2.5-2.5L5,13h2c0,2.76,2.24,5,5,5c0.86,0,1.65-0.24,2.36-0.62l-0.74-0.74 C13.13,16.87,12.58,17,12,17z\"/></g><g><path d=\"M12,8c-0.86,0-1.65,0.24-2.36,0.62l0.74,0.73C10.87,9.13,11.42,9,12,9c2.21,0,4,1.79,4,4h-2l2.5,2.5L19,13h-2 C17,10.24,14.76,8,12,8z\"/></g></g></g></svg>\n `;\n }, 500);\n } catch (error) {\n console.error('Error switching camera:', error);\n this.helper.showErrorMsg('Failed to switch camera. Please try again.', 'Error', 3000);\n \n // Reset button on error\n switchCameraBtn!.style.opacity = '1';\n switchCameraBtn!.style.pointerEvents = 'auto';\n switchCameraBtn!.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#e3e3e3\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g><path d=\"M20,5h-3.17L15,3H9L7.17,5H4C2.9,5,2,5.9,2,7v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M20,19H4V7 h3.17h0.88l0.59-0.65L9.88,5h4.24l1.24,1.35L15.95,7h0.88H20V19z\"/></g><g><path d=\"M12,17c-2.21,0-4-1.79-4-4h2l-2.5-2.5L5,13h2c0,2.76,2.24,5,5,5c0.86,0,1.65-0.24,2.36-0.62l-0.74-0.74 C13.13,16.87,12.58,17,12,17z\"/></g><g><path d=\"M12,8c-0.86,0-1.65,0.24-2.36,0.62l0.74,0.73C10.87,9.13,11.42,9,12,9c2.21,0,4,1.79,4,4h-2l2.5,2.5L19,13h-2 C17,10.24,14.76,8,12,8z\"/></g></g></g></svg>\n `;\n }\n });\n }\n\n // Handle library button click\n libraryBtn.addEventListener('click', () => {\n this.cleanupCameraModal(currentStream, modal);\n this.openImageSelector();\n });\n\n // Handle capture with modern effects\n captureBtn.addEventListener('click', () => {\n // Create capture flash effect\n const flashOverlay = document.createElement('div');\n flashOverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.8);\n border-radius: 16px;\n animation: flash 0.3s ease-out;\n pointer-events: none;\n z-index: 10;\n `;\n \n // Add flash animation\n const flashStyle = document.createElement('style');\n flashStyle.textContent = `\n @keyframes flash {\n 0% { opacity: 0; }\n 50% { opacity: 1; }\n 100% { opacity: 0; }\n }\n `;\n if (!document.querySelector('[data-flash-style]')) {\n flashStyle.setAttribute('data-flash-style', 'true');\n document.head.appendChild(flashStyle);\n }\n \n videoContainer.appendChild(flashOverlay);\n \n // Remove flash effect after animation\n setTimeout(() => {\n if (flashOverlay.parentNode) {\n flashOverlay.parentNode.removeChild(flashOverlay);\n }\n }, 300);\n\n // Set canvas dimensions to match video\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n \n // Draw video frame to canvas\n ctx?.drawImage(video, 0, 0);\n \n // Close modal immediately after capture\n this.cleanupCameraModal(currentStream, modal);\n \n // Convert canvas to blob\n canvas.toBlob(async (blob) => {\n if (blob) {\n // Create a file from the blob\n const file = new File([blob], `camera-capture-${Date.now()}.jpg`, {\n type: 'image/jpeg',\n lastModified: Date.now()\n });\n\n // Create a fake event to pass to detectImages\n const fakeEvent = {\n target: {\n files: [file],\n value: ''\n },\n preventDefault: () => {}\n };\n\n // Process the captured image\n await this.detectImages(fakeEvent);\n }\n }, 'image/jpeg', 0.9);\n });\n\n // Handle cancel\n cancelBtn.addEventListener('click', () => {\n this.cleanupCameraModal(currentStream, modal);\n });\n\n // Handle ESC key\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.cleanupCameraModal(currentStream, modal);\n document.removeEventListener('keydown', handleKeyPress);\n }\n };\n document.addEventListener('keydown', handleKeyPress);\n }\n\n private cleanupCameraModal(stream: MediaStream, modal: HTMLElement) {\n // Stop all video tracks\n stream.getTracks().forEach(track => track.stop());\n \n // Remove modal from DOM\n if (modal.parentNode) {\n modal.parentNode.removeChild(modal);\n }\n }\n\n async detectImages(event: any, index: number = -1) {\n console.log('detectImages:', event);\n event.preventDefault();\n\n if (this.config?.limit === 1) {\n this.filesArray = []; // Reset array for a single image\n }\n\n const files = event.target.files;\n if (!files) {\n this.helper.showErrorMsg('Please select an image', 'Error', 3000);\n return;\n }\n\n // Validate file types based on accept parameter\n if (this.isValidateMimeType && !this.validateFileTypes(files)) {\n return;\n }\n\n if ((this.filesArray?.length + files.length) > this.config?.limit) {\n this.helper.showErrorMsg(`You can upload a maximum of ${this.config?.limit} images`, 'Error', 3000);\n return;\n }\n\n this.loading = true;\n this.uploadInProgress.emit(true);\n\n let uploadedImages: any[] = [];\n\n // Pre-allocate slots in filesArray to avoid race conditions\n const startIndex = this.filesArray.length;\n const placeholders = [...files].map((file, idx) => ({\n tempId: `temp-${Date.now()}-${idx}`,\n title: file.name,\n name: file.name,\n loading: true,\n filename: file.name,\n s3Url: '', // Will be filled during processing\n sequence: this.isAddUploadedFileInLastNode ? startIndex + idx + 1 : this.filesArray.length + 1 - idx\n }));\n\n // Add all placeholders at once to prevent race conditions\n if (this.isAddUploadedFileInLastNode) {\n this.filesArray = [...this.filesArray, ...placeholders];\n } else {\n this.filesArray = [...placeholders.reverse(), ...this.filesArray];\n }\n this.setSliderLoading();\n\n // Process all images concurrently with their pre-assigned indices\n await Promise.all([...files].map((file, idx) => {\n const targetIndex = this.isAddUploadedFileInLastNode ? startIndex + idx : idx;\n return this.processImage(file, uploadedImages, targetIndex, placeholders[this.isAddUploadedFileInLastNode ? idx : files.length - 1 - idx].tempId);\n }));\n\n if (this.config?.isStoredDb) {\n await this.uploadImages(uploadedImages);\n }\n\n this.loading = false;\n this.uploadInProgress.emit(false);\n\n this.onSubmit(); // Call once after all uploads\n this.updateSequence();\n\n \n // Reset the input value so the same file can be selected again\n event.target.value = '';\n }\n\n async processImage(file: File, uploadedImages: any[], index: number, tempId?: string) {\n let fileSize = file.size / 1024;\n if (this.config?.fileSize && fileSize > this.config?.fileSize) {\n let maxSize = this.config.fileSize / 1024;\n this.helper.showErrorMsg(`File size must be ≤ ${maxSize >= 1 ? maxSize : this.config.fileSize} ${maxSize >= 1 ? 'MB' : 'KB'}`, 'Error', 3000);\n return;\n }\n\n return new Promise<void>((resolve) => {\n let reader = new FileReader();\n reader.onload = async (e: any) => {\n let mimeType = file.type;\n let compressedImage = this.config?.isCompressed ? await this.helper.compressFile(e.target?.result, mimeType) : e.target.result;\n\n try {\n let uploadResponse = await this.helper.getUploadUrl(this.urlConfig.getUploadUrl, file.name, mimeType, this.currentEntityType).toPromise();\n let uploadData = uploadResponse.data.uploadUrlData;\n \n // For initial display, use a data URL for preview but ensure S3 URL is used for database\n let dataUrl = await this.helper.getDataUrlFromFile(file);\n\n let currentImageData = {\n tempId: tempId || `temp-${Date.now()}`,\n title: file.name, name: file.name, s3Url: dataUrl, // Temporary preview URL\n filename: file.name, s3Path: uploadData.uploadPath,\n tempS3Url: uploadData.resourceUrl, // This will be the final S3 URL\n id: null,\n uploadData: uploadData, loading: true, // Set loading to true initially\n tags: null, tempTags: null, isEditMode: false, sequence: 1,\n };\n\n // Update the file at the pre-assigned index\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index] = {...this.filesArray[index], ...currentImageData};\n }\n \n this.setSliderLoading();\n uploadedImages.push(currentImageData);\n\n // Upload to S3\n await this.helper.putFile(uploadData.uploadURL, compressedImage).toPromise();\n\n // After successful upload, update with S3 URL and mark as completed\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].s3Url = uploadData.resourceUrl; // Use S3 URL\n this.filesArray[index].loading = false;\n // Ensure uploadData contains the correct S3 URL for database storage\n this.filesArray[index].uploadData.resourceUrl = uploadData.resourceUrl;\n }\n this.setSliderLoading();\n\n resolve();\n } catch (error: any) {\n // Set loading to false on error as well\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].loading = false;\n }\n this.helper.showHttpErrorMsg(error);\n resolve();\n }\n };\n\n reader.readAsArrayBuffer(file);\n });\n }\n\n uploadImages(data: any) {\n return new Promise((resolve, reject) => {\n if (data && data?.length > 0) {\n console.log('There is a image pending to attach:', data);\n\n // Keep track of tempIds for matching after API response\n let tempIdMapping: any[] = [];\n let images: any[] = [];\n let fa = data.map((r: any) => {\n if (r?.uploadData) {\n // Ensure we're using the S3 URL, not base64 data\n const s3Url = r.uploadData.resourceUrl;\n // Store tempId separately for matching, don't send it to API\n tempIdMapping.push({\n tempId: r.tempId,\n resourceUrl: s3Url\n });\n images.push({ \n fileName: r.uploadData?.fileName, \n resourceUrl: s3Url, // This ensures S3 URL is stored in database\n uploadPath: r.uploadData?.uploadPath, \n uploadURL: r.uploadData?.uploadURL\n // tempId removed - not sent to API\n });\n }\n return r;\n });\n\n this.helper.attachFilesToEntity(this.urlConfig?.attachToEntity || 'not-specified', { images: images, entityId: this.currentEntityId, entityType: this.currentEntityType }, this.config.limit).subscribe({\n next: (ir: any) => {\n ir?.data?.map((file: any, idx: number) =>{\n // Match by tempId first (more reliable for concurrent uploads), then fall back to S3 URL\n const uploadedImage = tempIdMapping[idx];\n let selectedIndex = this.filesArray?.findIndex(f => f.tempId === uploadedImage?.tempId);\n \n // Fallback to resourceUrl matching if tempId matching fails\n if(selectedIndex === -1) {\n selectedIndex = this.filesArray?.findIndex(f => f.uploadData?.resourceUrl == file.s3Url);\n }\n \n if(selectedIndex !== -1){\n this.filesArray[selectedIndex] = {\n ...this.filesArray[selectedIndex], \n loading: false, \n id: file?.id || null,\n s3Url: file.s3Url // Ensure we're using the S3 URL from the response\n }\n }\n });\n this.onSubmit();\n resolve(ir);\n },\n error: (imErr: any) => { this.helper.showHttpErrorMsg(imErr); this.onError.emit(true); resolve(false); }\n });\n\n } else {\n resolve(false);\n }\n });\n }\n\n deleteImage(event: any, t: any, index: number, img: any) {\n event.stopPropagation();\n if (this.isEnableDeleteConfirmation) {\n let confirmBoxData: DialogConfig = {\n title: this.dialogConfig?.title || 'Delete Image',\n message: this.deleteConfirmationMsg || (this.dialogConfig?.message || 'Are you sure, you want to delete this image?'),\n iconClass: this.dialogConfig?.iconClass || 'tis-text-danger',\n icon: this.dialogConfig?.icon || 'delete',\n approveButtonText: this.dialogConfig?.approveButtonText || 'Yes, delete',\n approveButtonClass: `tis-approve-button ${this.dialogConfig?.approveButtonClass}`,\n cancelButtonText: this.dialogConfig?.cancelButtonText || 'No',\n cancelButtonClass: `tis-cancel-button ${this.dialogConfig?.cancelButtonClass}`\n };\n\n const panelClass = ['tis-confirmation-dialog'];\n if(this.dialogConfig?.panelClass){\n panelClass.push(this.dialogConfig.panelClass);\n }\n\n const dialogRef = this.dialog.open(TisConfirmationDialogComponent, {\n width: \"450px\",\n panelClass: panelClass,\n data: confirmBoxData,\n disableClose: true,\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log(\"The dialog was closed with result:\", result);\n if (result) {\n this.removeImage(event, index, img);\n }\n });\n }\n else {\n this.removeImage(event, index, img);\n }\n }\n\n /*REMOVE SELECTED IMAGE */\n removeImage(event: any, index: number, img: any) {\n this.loading = true;\n this.filesArray[index].loading = true;\n if (img?.id) {\n delete img.uploadData;\n this.removeUploadedImage(img, index, true);\n }\n else {\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n }\n }\n\n removeUploadedImage(img: any, index: number, silently: boolean = false) {\n console.log(\"removeUploadedImage:\", img);\n this.helper.deleteUploadedFile(this.urlConfig.removeImage, img).subscribe((r: any) => {\n console.log('Image Delete Res:', r);\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n if (!silently) {\n this.helper.showSuccessMsg(r.message, 'Success', 3000);\n }\n },\n (err: any) => { this.filesArray[index].loading = false; this.helper.showErrorMsg(err, \"Error\") })\n }\n\n async detectFiles(event: any, index: number = -1) {\n console.log('detectFiles:', event);\n event.preventDefault();\n\n if (this.config?.limit === 1) {\n this.filesArray = []; // Reset array for a single file\n }\n\n const files = event.target.files;\n if (!files) {\n this.helper.showErrorMsg('Please select a file', 'Error', 3000);\n return;\n }\n\n // Validate file types based on accept parameter\n if (this.isValidateMimeType && !this.validateFileTypes(files)) {\n return;\n }\n\n if ((this.filesArray?.length + files.length) > this.config?.limit) {\n this.helper.showErrorMsg(`You can upload a maximum of ${this.config?.limit} files`, 'Error', 3000);\n return;\n }\n\n this.loading = true;\n this.uploadInProgress.emit(true);\n\n let uploadedFiles: any[] = [];\n\n // Pre-allocate slots in filesArray to avoid race conditions\n const startIndex = this.filesArray.length;\n const placeholders = [...files].map((file, idx) => ({\n tempId: `temp-${Date.now()}-${idx}`,\n title: file.name,\n name: file.name,\n loading: true,\n filename: file.name,\n s3Url: '', // Will be filled during processing\n sequence: this.isAddUploadedFileInLastNode ? startIndex + idx + 1 : this.filesArray.length + 1 - idx\n }));\n\n // Add all placeholders at once to prevent race conditions\n if (this.isAddUploadedFileInLastNode) {\n this.filesArray = [...this.filesArray, ...placeholders];\n } else {\n this.filesArray = [...placeholders.reverse(), ...this.filesArray];\n }\n this.setSliderLoading();\n\n // Process all files concurrently with their pre-assigned indices\n await Promise.all([...files].map((file, idx) => {\n const targetIndex = this.isAddUploadedFileInLastNode ? startIndex + idx : idx;\n return this.processFile(file, uploadedFiles, targetIndex, placeholders[this.isAddUploadedFileInLastNode ? idx : files.length - 1 - idx].tempId);\n }));\n\n if (this.config?.isStoredDb) {\n await this.uploadFiles(uploadedFiles);\n }\n\n this.loading = false;\n this.uploadInProgress.emit(false);\n\n this.onSubmit(); // Call once after all uploads\n this.updateSequence();\n\n // Reset the input value so the same file can be selected again\n event.target.value = '';\n }\n\n async processFile(file: File, uploadedFiles: any[], index: number, tempId?: string) {\n let fileSize = file.size / 1024;\n if (this.config?.fileSize && fileSize > this.config?.fileSize) {\n let maxSize = this.config.fileSize / 1024;\n this.helper.showErrorMsg(`File size must be ≤ ${maxSize >= 1 ? maxSize : this.config.fileSize} ${maxSize >= 1 ? 'MB' : 'KB'}`, 'Error', 3000);\n return;\n }\n\n return new Promise<void>((resolve) => {\n let reader = new FileReader();\n reader.onload = async (e: any) => {\n let mimeType = file.type;\n let buffer = new Uint8Array(<ArrayBuffer>reader.result);\n\n try {\n let uploadResponse = await this.helper.getUploadUrl(this.urlConfig.getUploadUrl, file.name, mimeType, this.currentEntityType).toPromise();\n let uploadData = uploadResponse.data.uploadUrlData;\n\n let currentFileData = {\n tempId: tempId || `temp-${Date.now()}`,\n title: file.name, name: file.name, s3Url: uploadData.resourceUrl, // Use S3 URL\n s3Path: uploadData.uploadPath, filename: file.name, id: null,\n uploadData: uploadData, loading: true, buffer: buffer, // Set loading to true initially\n tags: null, tempTags: null, isEditMode: false, sequence: 1,\n };\n\n // Update the file at the pre-assigned index\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index] = {...this.filesArray[index], ...currentFileData};\n }\n \n this.setSliderLoading();\n uploadedFiles.push(currentFileData);\n\n // Upload to S3\n await this.helper.putFile(uploadData.uploadURL, e.target.result).toPromise();\n\n // After successful upload, ensure S3 URL is used and mark as completed\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].s3Url = uploadData.resourceUrl; // Ensure S3 URL\n this.filesArray[index].loading = false;\n // Ensure uploadData contains the correct S3 URL for database storage\n this.filesArray[index].uploadData.resourceUrl = uploadData.resourceUrl;\n }\n this.setSliderLoading();\n\n resolve();\n } catch (error: any) {\n // Set loading to false on error as well\n if(index !== -1 && this.filesArray[index]) {\n this.filesArray[index].loading = false;\n }\n this.helper.showHttpErrorMsg(error);\n resolve();\n }\n };\n\n reader.readAsArrayBuffer(file);\n });\n }\n\n uploadFiles(data: any) {\n return new Promise((resolve, reject) => {\n if (data && data.length > 0) {\n console.log('There is a file pending to attach:', data);\n\n // Keep track of tempIds for matching after API response\n let tempIdMapping: any[] = [];\n let files: any[] = [];\n let fa = data.map((r: any) => {\n if (r?.uploadData) {\n // Ensure we're using the S3 URL, not any local file data\n const s3Url = r.uploadData.resourceUrl;\n // Store tempId separately for matching, don't send it to API\n tempIdMapping.push({\n tempId: r.tempId,\n resourceUrl: s3Url\n });\n files.push({ \n fileName: r.uploadData?.fileName, \n resourceUrl: s3Url, // This ensures S3 URL is stored in database\n uploadPath: r.uploadData?.uploadPath, \n uploadURL: r.uploadData?.uploadURL\n // tempId removed - not sent to API\n });\n }\n return r;\n });\n\n this.helper.attachFilesToEntity(this.urlConfig?.attachToEntity || 'not-specified', { files: files, entityId: this.currentEntityId, entityType: this.currentEntityType }, this.config.limit).subscribe({\n next: (ir: any) => {\n ir?.data?.map((file: any, idx: number) =>{\n // Match by tempId first (more reliable for concurrent uploads), then fall back to S3 URL\n const uploadedFile = tempIdMapping[idx];\n let selectedIndex = this.filesArray?.findIndex(f => f.tempId === uploadedFile?.tempId);\n \n // Fallback to resourceUrl matching if tempId matching fails\n if(selectedIndex === -1) {\n selectedIndex = this.filesArray?.findIndex(f => f.uploadData?.resourceUrl == file.s3Url);\n }\n \n if(selectedIndex !== -1){\n this.filesArray[selectedIndex] = {\n ...this.filesArray[selectedIndex], \n loading: false, \n id: file?.id || null,\n s3Url: file.s3Url // Ensure we're using the S3 URL from the response\n }\n }\n });\n this.onSubmit();\n resolve(ir);\n },\n error: (imErr: any) => { this.helper.showHttpErrorMsg(imErr); this.onError.emit(true); resolve(false); }\n });\n } else {\n resolve(false);\n }\n });\n }\n\n deleteFile(event: any, t: any, index: number, file: any) {\n event.stopPropagation();\n if (this.isEnableDeleteConfirmation) {\n let confirmBoxData: DialogConfig = {\n title: this.dialogConfig?.title || 'Delete File',\n message: this.deleteConfirmationMsg || (this.dialogConfig?.message || 'Are you sure, you want to delete this file?'),\n iconClass: this.dialogConfig?.iconClass || 'tis-text-danger',\n icon: this.dialogConfig?.icon || 'delete',\n approveButtonText: this.dialogConfig?.approveButtonText || 'Yes, delete',\n approveButtonClass: `tis-approve-button ${this.dialogConfig?.approveButtonClass}`,\n cancelButtonText: this.dialogConfig?.cancelButtonText || 'No',\n cancelButtonClass: `tis-cancel-button ${this.dialogConfig?.cancelButtonClass}`\n };\n\n const panelClass = ['tis-confirmation-dialog'];\n if(this.dialogConfig?.panelClass){\n panelClass.push(this.dialogConfig.panelClass);\n }\n\n const dialogRef = this.dialog.open(TisConfirmationDialogComponent, {\n width: \"450px\",\n panelClass: panelClass,\n data: confirmBoxData,\n disableClose: true,\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log(\"The dialog was closed with result:\", result);\n if (result) {\n this.removeFile(event, index, file);\n }\n });\n }\n else {\n this.removeFile(event, index, file);\n }\n }\n\n removeFile(event: any, index: number, file: any) {\n this.loading = true;\n this.filesArray[index].loading = true;\n if (file?.id) {\n delete file.uploadData;\n this.removeUploadedFile(file, index, true);\n }\n else {\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n this.onFileRemoved.emit(true);\n }\n }\n\n removeUploadedFile(file: any, index: number, silently = false) {\n console.log(\"removeUploadedFile:\", file);\n this.helper.deleteUploadedFile(this.urlConfig.removeImage, file).subscribe((r: any) => {\n console.log('File Delete Res:', r);\n this.loading = false;\n this.filesArray.splice(index, 1);\n this.setSliderLoading();\n this.onSubmit();\n if (!silently) {\n this.helper.showSuccessMsg(r.message, 'Success', 3000);\n }\n this.onSubmit();\n },\n (err: any) => { this.filesArray[index].loading = false; this.helper.showErrorMsg(err, \"Error\") })\n }\n\n onSubmit() {\n // this.filesArray = this.filesArray?.map((r, i) => { r.s3Url = r?.uploadData?.resourceUrl; return r; });\n this.onUploaded.emit(this.filesArray);\n }\n\n async downloadFile(url: string, fileName: string) {\n try {\n // First try with fetch\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/octet-stream',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const blob = await response.blob();\n \n // Check if blob has content\n if (blob.size === 0) {\n throw new Error('File is empty or could not be fetched');\n }\n\n // Create download link\n const blobUrl = URL.createObjectURL(blob);\n const el = document.createElement(\"a\");\n el.href = blobUrl;\n el.download = fileName;\n el.style.display = 'none';\n \n // Add to DOM, click, and remove\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n \n // Cleanup blob URL\n setTimeout(() => {\n URL.revokeObjectURL(blobUrl);\n }, 100);\n\n } catch (error) {\n console.error(\"Fetch download failed, trying alternative method:\", error);\n \n // Fallback: Try direct link opening\n try {\n const el = document.createElement(\"a\");\n el.href = url;\n el.download = fileName;\n el.target = '_blank';\n el.style.display = 'none';\n \n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n \n } catch (fallbackError) {\n console.error(\"All download methods failed:\", fallbackError);\n this.helper.showErrorMsg(\"Failed to download file. Please try again or contact support.\", 'Error', 5000);\n }\n }\n }\n\n clickTimeout: any = null;\n clickDelay: number = 250; // Delay in milliseconds to distinguish single and double click\n\n onSelectFile(file: any) {\n if (this.config.selectionMode) {\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n this.clickTimeout = null;\n this.openFile(file); // Double-click detected\n } else {\n this.clickTimeout = setTimeout(() => {\n this.clickTimeout = null;\n if (this.config.selectionMode) {\n this.onFileSelect.emit(file); // Single-click detected\n }\n }, this.clickDelay);\n }\n }\n else {\n this.clickTimeout = null;\n this.openFile(file);\n }\n }\n\n openFile(file: any) {\n if (!this.config.hiddenPreview) {\n this.openPreviewDialog(file.s3Url, file.title);\n }\n }\n\n openPreviewDialog(url: string, title: string): void {\n if (url.indexOf('.jpg') != -1 || url.indexOf('.jpeg') != -1 || url.indexOf('.png') != -1) {\n this.openImagePreviewDialog(url);\n }\n else if (url.indexOf('.pdf') != -1) {\n this.openFileViewer(url, 'pdf');\n }\n // else if(url.indexOf('.csv') != -1){\n // this.openFileViewer(url, 'csv');\n // }\n else if (url.indexOf('.xlxs') != -1 || url.indexOf('.xlx') != -1 || url.indexOf('.xls') != -1) {\n this.openFileViewer(url, 'excel');\n }\n else {\n this.downloadFile(url, title);\n }\n }\n\n openImagePreviewDialog(url: string): void {\n const dialogRef = this.dialog.open(TisPreviewImageComponent, {\n panelClass: ['mat-p-0', 'relative'],\n data: { url },\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log('The dialog was closed', result);\n });\n }\n\n openFileViewer(pdfUrl: string, fileType: FileViewerFileType) {\n let dialogData: FileViewerDialogData = {\n src: pdfUrl,\n fileType: fileType\n };\n\n const dialogRef = this.dialog.open(TisFileViewerComponent, {\n width: this.isMobile ? \"100%\" : \"90%\",\n height: this.isMobile ? \"100%\" : \"98%\",\n minHeight: this.isMobile ? \"100%\" : \"80%\",\n maxWidth: this.isMobile ? \"100%\" : \"100%\",\n panelClass: ['tis-file-viewer'],\n data: dialogData,\n disableClose: false,\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log(\"FileViewer Dialog Closed\");\n });\n }\n\n checkingForPreview(img: string) {\n let imageArray = img.split('.');\n let imageType = imageArray[imageArray?.length - 1];\n if (imageType == 'png' || imageType == 'jpg' || imageType == 'jpeg') {\n return true;\n }\n else {\n return false;\n }\n }\n\n generateFilesForSingleCard(){\n if(this.filesArray?.length < this.config.limit){\n for (let index = 0; index < (this.config.limit - this.filesArray?.length); index++) {\n this.filesArray.push({\n selectorId: generateRandomString(10),\n tags: null,\n tempTags: null,\n isEditMode: false\n });\n }\n }\n else{\n this.filesArray = this.filesArray?.map((file: any) => {\n return {...file, selectorId: generateRandomString(10), tempTag: null, isEditMode: false};\n });\n }\n }\n\n editTagWithSpace(file: any){\n console.log(\"=== editTagWithSpace :: file ===\", file);\n \n let tempTag: any = file?.tempTags?.trim();\n console.log(\"=== editTagWithSpace :: tempTag ===\", tempTag);\n\n if(tempTag && tempTag != ''){\n let tempTagsArr: any[] = tempTag?.split(' ');\n console.log(\"=== editTagWithSpace :: before tempTagsArr ===\", tempTagsArr);\n\n tempTagsArr = tempTagsArr?.filter(e => (e && e != ''))?.map(t =>{\n if (t.includes('#')) {}\n else{\n t = `#${t}`;\n }\n return t;\n });\n\n tempTag = tempTagsArr.join(' ');\n file.tempTags = `${tempTag}`;\n }\n else{\n file.tempTags = tempTag\n }\n }\n\n // onKeydown(event: KeyboardEvent, file: any) {\n // if (event.key === ',' || event.keyCode === 188) {\n // event.preventDefault();\n // this.editTagWithComma(file);\n // }\n // }\n\n // editTagWithComma(file: any){\n // let tempTag: any = file?.tempTags?.trim();\n\n // if(tempTag && tempTag != ''){\n // let tempTagsArr: any[] = tempTag?.split(' ');\n // tempTagsArr = tempTagsArr?.filter(e => (e && e != ''))?.map(t =>{\n // if (t.includes('#')) {}\n // else{\n // t = `#${t}`;\n // }\n // return t;\n // });\n\n // tempTag = tempTagsArr.join(' ');\n // tempTag = tempTag.replace(/,/g, '');\n // file.tempTags = `${tempTag} `;\n // }\n // else{\n // file.tempTags = tempTag\n // }\n // }\n\n onSubmitTags(file: any){\n file.tags = file?.tempTags?.trim();\n file.isEditMode = false;\n this.helper.updateTag(this.urlConfig?.updateTag || 'not-specified', {id: file?.id || null, tag: file?.tags || null}).subscribe({\n next: (ir: any) => {\n this.helper.showSuccessMsg(ir.message, 'Success', 3000);\n this.onSubmit();\n },\n error: (err: any) => this.helper.showHttpErrorMsg(err)\n });\n }\n\n // Drag state for highlighting\n isDragging = false;\n dragSourceIndex: number | null = null;\n dropTargetIndex: number | null = null;\n\n onDragStarted(index: number) {\n this.isDragging = true;\n this.dragSourceIndex = index;\n this.dropTargetIndex = null;\n }\n\n onDragEntered(index: number) {\n if (this.isDragging && index !== this.dragSourceIndex) {\n this.dropTargetIndex = index;\n }\n }\n\n onDragMoved(event: CdkDragMove) {\n if (!this.isDragging) return;\n \n const pointerPosition = event.pointerPosition;\n const dropItems = document.querySelectorAll('.drag-drop-item');\n \n let foundTarget: number | null = null;\n \n dropItems.forEach((item) => {\n const rect = item.getBoundingClientRect();\n const index = parseInt(item.getAttribute('data-index') || '-1', 10);\n \n if (index !== -1 && index !== this.dragSourceIndex) {\n if (\n pointerPosition.x >= rect.left &&\n pointerPosition.x <= rect.right &&\n pointerPosition.y >= rect.top &&\n pointerPosition.y <= rect.bottom\n ) {\n foundTarget = index;\n }\n }\n });\n \n this.dropTargetIndex = foundTarget;\n }\n\n onMouseEnterItem(index: number) {\n if (this.isDragging && index !== this.dragSourceIndex) {\n this.dropTargetIndex = index;\n }\n }\n\n onMouseLeaveItem() {\n // Only clear if we're dragging - the next mouseenter will set the new target\n }\n\n onDragEnded() {\n // Don't reset state here - let drop() handle it\n // This event fires BEFORE drop(), so resetting here clears our tracked indices\n this.isDragging = false;\n // Keep dragSourceIndex and dropTargetIndex - they'll be reset in drop()\n }\n\n drop(event: CdkDragDrop<any[]>) {\n // Use our tracked source index instead of CDK's previousIndex (which is unreliable for grids)\n const sourceIndex = this.dragSourceIndex !== null ? this.dragSourceIndex : event.previousIndex;\n const targetIndex = this.dropTargetIndex !== null ? this.dropTargetIndex : event.currentIndex;\n\n // Log drag info for debugging\n const draggedItem = this.filesArray[sourceIndex];\n console.log('=== DRAG & DROP DEBUG ===');\n console.log('Picked element:', {\n title: draggedItem?.title || draggedItem?.s3Url?.split('/').pop(),\n originalPosition: sourceIndex + 1,\n s3Url: draggedItem?.s3Url\n });\n console.log('Dropping at position:', targetIndex + 1);\n console.log('dragSourceIndex (our tracking):', this.dragSourceIndex);\n console.log('dropTargetIndex (our tracking):', this.dropTargetIndex);\n console.log('event.currentIndex (CDK):', event.currentIndex);\n console.log('event.previousIndex (CDK):', event.previousIndex);\n\n // Reset drag state\n this.isDragging = false;\n this.dragSourceIndex = null;\n this.dropTargetIndex = null;\n\n // Ignore if same position\n if (sourceIndex === targetIndex) {\n console.log('Same position - no change needed');\n return;\n }\n\n // Access current data\n const currentData = [...this.filesArray];\n\n if (!currentData || currentData.length === 0) {\n return;\n }\n\n // Reorder: move item from source to target position (shift other items)\n moveItemInArray(currentData, sourceIndex, targetIndex);\n\n // Update filesArray with reordered data\n this.filesArray = currentData;\n\n // Log after reorder\n const newPosition = this.filesArray.findIndex((f: any) => f.s3Url === draggedItem?.s3Url);\n console.log('After reorder - element new position:', newPosition + 1);\n console.log('=========================');\n\n this.updateSequence(true);\n }\n\n updateSequence(isShowMessage: boolean = false){\n // Update sequence for all files (including those without id yet)\n // Re-calculate sequence based on current array order\n this.filesArray = this.filesArray.map((file: any, index: number) => {\n return {...file, sequence: (index + 1)};\n });\n\n if(this.enableDragNDrop && this.urlConfig?.updateSequence){\n // Only send files with id to the server for sequence update\n let filesWithId: any[] = this.filesArray.filter(f => f?.id && f?.id != null && f?.id != '');\n let files: any[] = filesWithId?.length ? JSON.parse(JSON.stringify(filesWithId)) : [];\n files = files?.map(f =>{\n return {id: f?.id, sequence: f?.sequence || 1};\n });\n \n if(files.length > 0) {\n this.helper.updateSequence(this.urlConfig?.updateSequence || 'not-specified', {files}).subscribe({\n next: (ir: any) => {\n if(isShowMessage){\n this.helper.showSuccessMsg(ir.message, 'Success', 3000);\n }\n else{\n // Only show success message when files actually have IDs (meaning they were uploaded)\n if(filesWithId.length > 0) {\n this.helper.showSuccessMsg(`${this.type == 'image' ? 'Image' : 'File'} has been uploaded successfully`, 'Success', 3000);\n }\n }\n this.dataSequenceChange.emit(this.filesArray);\n },\n error: (err: any) => { this.helper.showHttpErrorMsg(err); this.onError.emit(true); }\n });\n } else {\n // If no files with id yet, just emit the current array\n this.dataSequenceChange.emit(this.filesArray);\n }\n }\n else{\n this.dataSequenceChange.emit(this.filesArray);\n }\n }\n\n getTagsArray(tags: string){\n let tempTag: any = tags?.trim();\n let tempTagsArr: any[] = tempTag?.split(' ');\n\n return tempTagsArr?.filter(e => e && e != '');\n }\n\n // =====================\n // Remote Upload Methods\n // =====================\n\n /**\n * Check if remote upload is available and configured\n */\n isRemoteUploadAvailable(): boolean {\n return !!(\n this.remoteUploadConfig?.enabled &&\n this.remoteUploadConfig?.socketAdapter &&\n !this.isMobile &&\n !this.isTab\n );\n }\n\n /**\n * Initialize remote upload configuration\n * Call this in ngOnInit or when config changes\n */\n private initRemoteUpload(): void {\n if (this.remoteUploadConfig?.enabled && this.remoteUploadConfig?.socketAdapter) {\n this.remoteUploadService.configure(this.remoteUploadConfig);\n\n // Subscribe to remote uploads\n this.remoteUploadService.getRemoteUploads()\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n this.handleRemoteUpload(event);\n });\n }\n }\n\n /**\n * Handle a remote upload event\n */\n private handleRemoteUpload(event: TisRemoteUploadEvent): void {\n console.log('[TisImageAndFileUploadAndView] Remote upload received:', event);\n\n // Check if we've reached the limit\n if (this.config?.limit && this.filesArray.length >= this.config.limit) {\n this.helper.showErrorMsg(`Maximum limit of ${this.config.limit} files reached.`, 'Limit Reached');\n return;\n }\n\n // Add the uploaded file to the array\n const newFile = {\n s3Url: event.file.s3Url,\n title: event.file.fileName,\n name: event.file.fileName,\n filename: event.file.fileName,\n mimeType: event.file.mimeType,\n size: event.file.size,\n uploadData: event.file.uploadData,\n loading: false,\n sequence: this.filesArray.length + 1,\n remoteUpload: true,\n mobileDeviceId: event.mobileDeviceId,\n uploadedAt: event.timestamp\n };\n\n if (this.isAddUploadedFileInLastNode) {\n this.filesArray.push(newFile);\n } else {\n this.filesArray.unshift(newFile);\n }\n\n this.setSliderLoading();\n this.onSubmit();\n this.updateSequence();\n this.onRemoteUpload.emit(event);\n\n this.helper.showSuccessMsg(\n `${this.type === 'image' ? 'Image' : 'File'} uploaded from mobile device`,\n 'Remote Upload',\n 3000\n );\n }\n\n /**\n * Open the QR code dialog for mobile upload\n */\n openRemoteUploadDialog(): void {\n if (!this.isRemoteUploadAvailable()) {\n this.helper.showErrorMsg('Remote upload is not available', 'Not Available');\n return;\n }\n\n const dialogData: TisQrCodeDialogData = {\n title: this.dialogConfig?.title || 'Upload from Mobile',\n subtitle: `Scan this QR code to upload ${this.type === 'image' ? 'images' : 'files'} from your mobile device`,\n qrSize: 200,\n showCountdown: true,\n autoCloseOnUpload: false,\n fieldInfo: {\n label: this.label || `${this.type === 'image' ? 'Images' : 'Files'}`,\n accept: this.accept || (this.type === 'image' ? 'image/*' : '*'),\n type: this.type,\n entityType: this.entityType,\n entityId: this.entityId,\n isMultiple: this.config.isMultiple,\n limit: this.config.limit,\n isCompressed: this.config.isCompressed\n }\n };\n\n const dialogRef = this.dialog.open(TisQrCodeDialogComponent, {\n width: this.isMobile ? '100%' : '420px',\n maxWidth: '100%',\n panelClass: ['tis-qr-code-dialog'],\n data: dialogData,\n disableClose: false\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n console.log('[TisImageAndFileUploadAndView] QR dialog closed:', result);\n // Files are already added via the remote upload subscription\n });\n }\n\n /**\n * Check if currently paired with a mobile device\n */\n isRemotePaired(): boolean {\n return this.remoteUploadService.isPaired();\n }\n\n /**\n * Disconnect from paired mobile device\n */\n disconnectRemote(): void {\n this.remoteUploadService.disconnect();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (config) {\n <input type=\"file\" size=\"60\" id=\"{{config.selectorId}}\" (change)=\"type == 'file'? detectFiles($event): detectImages($event)\" accept=\"{{accept}}\" [multiple]=\"config.isMultiple\" style=\"display: none;\" />\n @if(viewType == 'card'){\n <div [class.image-picker-label]=\"!previewOnly\" [class.error]=\"required && (filesArray?.length || 0) <= 0\" [style.height]=\"filesArray?.length ? null : config?.height\" style=\"--tis-image-picker-height: {{config?.height ?? 0}}\" cdkDropList (cdkDropListDropped)=\"drop($event)\" cdkDropListOrientation=\"horizontal\">\n @if(filesArray?.length){\n <div [ngClass]=\"{'grid-cols-1': config?.cols == 1, 'grid-cols-2': config?.cols == 2, 'grid-cols-3': config?.cols == 3, 'grid-cols-4': config?.cols == 4, 'grid-cols-5': config?.cols == 5, 'grid-cols-6': config?.cols == 6}\" class=\"{{previewInFlex ? 'flex' : 'grid'}} image-list\" style=\"gap: 25px;\">\n @for(file of filesArray; track file.s3Url; let i = $index; let l = $last;){\n @if(enableDragNDrop){\n <div class=\"flex flex-col drag-drop-item\" [attr.data-index]=\"i\" [class.drag-over-highlight]=\"dropTargetIndex === i && isDragging && dragSourceIndex !== i\">\n @if(isShowImageSequence){\n <div class=\"image-description\" style=\"margin-bottom: 15px;\">\n <div class=\"image-description-text\" style=\"text-align: center; font-weight: bold;\">Image {{i + 1}}</div>\n </div>\n }\n <div cdkDrag (cdkDragStarted)=\"onDragStarted(i)\" (cdkDragEnded)=\"onDragEnded()\" (cdkDragMoved)=\"onDragMoved($event)\">\n <div class=\"image-item {{imageItemClass}}\" [class.selected]=\"config?.selectionMode ? selectedId == file.id : false\" [class.tis-curser-pointer]=\"!config?.hiddenPreview || config?.selectionMode\" id=\"image-item-{{config.selectorId}}-{{i}}\" [style.background-image]=\"type == 'file'? '' : 'url('+file.s3Url+')'\" (click)=\"onSelectFile(file)\" cdkDragHandle>\n <mat-icon *ngIf=\"type == 'file'\" class=\"active tis-mat-icon-2x\">description</mat-icon>\n <span class=\"material-icons cancel\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"(!disabled || showDeleteButtonWhenDisabled) && !config.hiddenDeleteBtn && !file?.loading\">highlight_off</span>\n <span class=\"material-icons download\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn && !file?.loading\">download_for_offline</span>\n \n <!-- Loading overlay -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"30\"></mat-progress-spinner>\n </div>\n </div>\n </div>\n @if(config?.enableImageTags){\n <div class=\"image-description\">\n <div class=\"image-description-text\" *ngIf=\"!file?.isEditMode\">\n @if(file?.tags && file?.tags != ''){\n <span class=\"anchor\" *ngFor=\"let tag of getTagsArray(file?.tags)\">{{tag}} </span>\n }\n @else {\n <span>No Tags</span>\n }\n </div>\n <span class=\"material-icons edit-description-btn edit\" style=\"font-size: 20px;\" (click)=\"$event.stopPropagation(); file.tempTags = file.tags; file.isEditMode = true;\" *ngIf=\"!file?.isEditMode && !disabled\">edit</span>\n <div class=\"image-description-edit\" *ngIf=\"file?.isEditMode && !disabled\">\n <!-- (keydown)=\"onKeydown($event, file)\" -->\n <input [(ngModel)]=\"file.tempTags\" placeholder=\"Enter tags here...\" (keydown.enter)=\"onSubmitTags(file)\" (keydown.space)=\"editTagWithSpace(file)\" />\n <div class=\"description-actions\">\n <button class=\"description-action-btn description-cancel-btn\" (click)=\"$event.stopPropagation(); file.tempTags = file.tags; file.isEditMode = false;\">Cancel</button>\n <button class=\"description-action-btn description-save-btn\" (click)=\"$event.stopPropagation(); onSubmitTags(file);\">Save</button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n @else {\n <div class=\"flex flex-col\">\n @if(isShowImageSequence){\n <div class=\"image-description\" style=\"margin-bottom: 15px;\">\n <div class=\"image-description-text\" style=\"text-align: center; font-weight: bold;\">Image {{i + 1}}</div>\n </div>\n }\n <div class=\"image-item {{imageItemClass}}\" [class.selected]=\"config?.selectionMode ? selectedId == file.id : false\" [class.tis-curser-pointer]=\"!config?.hiddenPreview || config?.selectionMode\" id=\"image-item-{{config.selectorId}}-{{i}}\" [style.background-image]=\"type == 'file'? '' : 'url('+file.s3Url+')'\" (click)=\"onSelectFile(file)\">\n <mat-icon *ngIf=\"type == 'file'\" class=\"active tis-mat-icon-2x\">description</mat-icon>\n <span class=\"material-icons cancel\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"(!disabled || showDeleteButtonWhenDisabled) && !config.hiddenDeleteBtn && !file?.loading\">highlight_off</span>\n <span class=\"material-icons download\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn && !file?.loading\">download_for_offline</span>\n \n <!-- Loading overlay -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"30\"></mat-progress-spinner>\n </div>\n </div>\n @if(config?.enableImageTags){\n <div class=\"image-description\">\n <div class=\"image-description-text\" *ngIf=\"!file?.isEditMode\">{{file?.tags || 'No Tags'}}</div>\n <span class=\"material-icons edit-description-btn edit\" style=\"font-size: 20px;\" (click)=\"$event.stopPropagation(); file.isEditMode = true;\" *ngIf=\"!file?.isEditMode && !disabled\">edit</span>\n <div class=\"image-description-edit\" *ngIf=\"file?.isEditMode && !disabled\">\n <!-- (keydown)=\"onKeydown($event, file)\" -->\n <input [(ngModel)]=\"file.tempTags\" placeholder=\"Enter tags here...\" (keydown.enter)=\"onSubmitTags(file)\" (keydown.space)=\"editTagWithSpace(file)\" />\n <div class=\"description-actions\">\n <button class=\"description-action-btn description-cancel-btn\" (click)=\"$event.stopPropagation(); file.tempTags = file.tags; file.isEditMode = false;\">Cancel</button>\n <button class=\"description-action-btn description-save-btn\" (click)=\"$event.stopPropagation(); onSubmitTags(file);\">Save</button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if(l && (config?.limit || 0) > (filesArray?.length || 0) && !disabled){\n <div class=\"flex flex-col\">\n @if(isShowImageSequence){\n <div style=\"margin-top: .5rem; margin-bottom: 15px; height: 35px;\">\n </div>\n }\n <!-- Image upload options in grid -->\n <div class=\"image-item uploader\" id=\"image-item-{{config.selectorId}}-{{i}}-{{i}}\" style=\"display: flex; flex-direction: column; gap: 8px; justify-content: center; align-items: center; cursor: pointer;\" (click)=\"loading ? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon class=\"active\">upload_file</mat-icon>\n <!-- Mobile Upload Button -->\n @if(isRemoteUploadAvailable()){\n <button type=\"button\" class=\"mobile-upload-btn\" (click)=\"$event.stopPropagation(); openRemoteUploadDialog()\" title=\"Upload from Mobile\">\n <mat-icon>smartphone</mat-icon>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n }\n @else if(!disabled){\n <label style=\"display: flex; gap: 12px; flex-direction: column; justify-content: center; align-items: center; height: 100%; cursor: pointer;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon>upload_file</mat-icon>\n <p style=\"text-align: center; font-size: 14px; margin: 0px;\">\n {{label}}\n @if(hint && hint != ''){\n <br>\n <small>{{hint}}</small>\n }\n </p>\n <!-- Mobile Upload Button -->\n @if(isRemoteUploadAvailable()){\n <button type=\"button\" class=\"mobile-upload-btn\" (click)=\"$event.stopPropagation(); openRemoteUploadDialog()\" title=\"Upload from Mobile\">\n <mat-icon>smartphone</mat-icon>\n <span>Upload from Mobile</span>\n </button>\n }\n </label>\n }\n @else{\n <div class=\"not-found-section\" style=\"display: flex; flex-direction: column; justify-content: center; align-items: center; width: 100%; cursor: pointer;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"100%\" viewBox=\"0 0 512 512\" enable-background=\"new 0 0 512 512\" xml:space=\"preserve\">\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M283.000000,513.000000 C188.689560,513.000000 94.879120,513.000000 1.034338,513.000000 C1.034338,342.397858 1.034338,171.795731 1.034338,1.096792 C171.560455,1.096792 342.121002,1.096792 512.840759,1.096792 C512.840759,171.666550 512.840759,342.333252 512.840759,513.000000 C436.462372,513.000000 359.981171,513.000000 283.000000,513.000000 M214.500000,497.000000 C271.998901,496.999969 329.497833,497.019897 386.996674,496.975769 C394.561920,496.969971 401.787231,494.626648 406.395233,488.770782 C412.026520,481.614502 416.644897,473.577057 421.072449,465.572754 C437.390259,436.072754 453.464813,406.438049 469.597321,376.835754 C478.327332,360.816742 487.426758,344.977722 495.530029,328.645905 C501.012421,317.596252 494.173737,304.613556 481.201294,304.861847 C456.377502,305.336975 431.538177,304.999878 406.705292,304.999847 C404.938568,304.999847 403.171844,304.999847 401.000031,304.999847 C401.000031,302.348328 401.003784,300.379181 400.999481,298.410065 C400.935120,269.085632 400.853577,239.761169 400.867645,210.436768 C400.868164,209.340317 401.642242,208.138214 402.315186,207.164581 C408.841400,197.722305 416.441071,188.858276 421.779449,178.792419 C433.290894,157.086823 435.985443,133.380402 431.740631,109.507538 C425.335449,73.484550 405.456726,46.387234 373.051300,29.163473 C356.219269,20.217096 338.040710,16.499708 318.773804,16.813351 C301.234619,17.098873 284.897461,21.133270 269.449402,28.965902 C256.098724,35.735111 244.580948,44.876842 234.887085,56.467457 C224.793365,68.536171 217.675415,82.055397 213.023590,96.957832 C209.186737,109.249481 208.654160,121.911049 208.964157,134.687836 C209.387650,152.143631 214.172058,168.302002 222.741714,183.427231 C224.412766,186.376572 225.987946,189.380234 227.939270,192.969376 C211.045273,192.969376 194.919281,193.199417 178.811310,192.763687 C175.805389,192.682358 172.083817,190.621887 170.038193,188.292847 C160.046188,176.916489 150.561493,165.096268 140.789429,153.524185 C136.493210,148.436600 131.117233,145.037399 124.221672,145.023544 C96.055626,144.966995 67.881424,145.387711 39.727192,144.808304 C28.532793,144.577896 16.775660,156.479080 16.809900,167.857864 C17.130381,274.354980 17.052288,380.853516 16.870073,487.351288 C16.859135,493.743988 19.582472,497.123566 26.503685,497.103851 C88.835381,496.926239 151.167801,497.000000 214.500000,497.000000 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M214.000000,497.000000 C151.167801,497.000000 88.835381,496.926239 26.503685,497.103851 C19.582472,497.123566 16.859135,493.743988 16.870073,487.351288 C17.052288,380.853516 17.130381,274.354980 16.809900,167.857864 C16.775660,156.479080 28.532793,144.577896 39.727192,144.808304 C67.881424,145.387711 96.055626,144.966995 124.221672,145.023544 C131.117233,145.037399 136.493210,148.436600 140.789429,153.524185 C150.561493,165.096268 160.046188,176.916489 170.038193,188.292847 C172.083817,190.621887 175.805389,192.682358 178.811310,192.763687 C194.919281,193.199417 211.045273,192.969376 227.939270,192.969376 C225.987946,189.380234 224.412766,186.376572 222.741714,183.427231 C214.172058,168.302002 209.387650,152.143631 208.964157,134.687836 C208.654160,121.911049 209.186737,109.249481 213.023590,96.957832 C217.675415,82.055397 224.793365,68.536171 234.887085,56.467457 C244.580948,44.876842 256.098724,35.735111 269.449402,28.965902 C284.897461,21.133270 301.234619,17.098873 318.773804,16.813351 C338.040710,16.499708 356.219269,20.217096 373.051300,29.163473 C405.456726,46.387234 425.335449,73.484550 431.740631,109.507538 C435.985443,133.380402 433.290894,157.086823 421.779449,178.792419 C416.441071,188.858276 408.841400,197.722305 402.315186,207.164581 C401.642242,208.138214 400.868164,209.340317 400.867645,210.436768 C400.853577,239.761169 400.935120,269.085632 400.999481,298.410065 C401.003784,300.379181 401.000031,302.348328 401.000031,304.999847 C403.171844,304.999847 404.938568,304.999847 406.705292,304.999847 C431.538177,304.999878 456.377502,305.336975 481.201294,304.861847 C494.173737,304.613556 501.012421,317.596252 495.530029,328.645905 C487.426758,344.977722 478.327332,360.816742 469.597321,376.835754 C453.464813,406.438049 437.390259,436.072754 421.072449,465.572754 C416.644897,473.577057 412.026520,481.614502 406.395233,488.770782 C401.787231,494.626648 394.561920,496.969971 386.996674,496.975769 C329.497833,497.019897 271.998901,496.999969 214.000000,497.000000 M134.597260,321.000000 C127.620270,319.337616 123.942146,323.017517 121.500618,328.932983 C120.498009,331.362091 119.193306,333.673279 117.937233,335.989990 C103.522736,362.575897 89.117485,389.166901 74.653091,415.725647 C67.257729,429.304626 59.689438,442.789490 52.312668,456.378448 C47.974022,464.370728 43.857620,472.483643 39.401810,481.000000 C42.117859,481.000000 44.110912,481.000000 46.103966,481.000000 C144.765793,481.000000 243.427612,481.000031 342.089447,481.000000 C354.922150,481.000000 367.755981,481.100647 380.587189,480.961823 C388.353729,480.877808 394.963684,478.668121 399.028687,471.088623 C414.189636,442.819641 429.540070,414.652191 444.852783,386.464783 C452.465210,372.451935 460.203308,358.507233 467.780884,344.475739 C471.870789,336.902466 475.742279,329.211273 480.010315,321.000000 C364.545990,321.000000 250.059738,321.000000 134.597260,321.000000 M324.557129,242.085190 C327.301666,237.590393 329.664886,232.791306 332.924042,228.707169 C335.118561,225.957092 338.299622,222.950409 341.520416,222.240189 C357.159485,218.791580 371.110535,211.909912 382.881226,201.408112 C405.027954,181.648727 416.679504,157.025070 416.129883,126.765366 C415.719910,104.193253 408.285522,84.336838 393.808441,67.607040 C373.699219,44.368736 348.121246,32.686760 316.779572,33.851212 C294.904785,34.663937 275.751617,42.202290 259.624786,56.188839 C232.720886,79.522171 221.513794,109.436241 227.057266,144.851562 C232.965317,182.596176 262.283539,213.393021 299.806335,221.925400 C304.366974,222.962448 307.440796,225.236969 309.702332,229.227615 C313.147400,235.306534 316.865295,241.230835 320.988098,248.086838 C322.400177,245.685776 323.276184,244.196213 324.557129,242.085190 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M135.085373,321.000000 C250.059738,321.000000 364.545990,321.000000 480.010315,321.000000 C475.742279,329.211273 471.870789,336.902466 467.780884,344.475739 C460.203308,358.507233 452.465210,372.451935 444.852783,386.464783 C429.540070,414.652191 414.189636,442.819641 399.028687,471.088623 C394.963684,478.668121 388.353729,480.877808 380.587189,480.961823 C367.755981,481.100647 354.922150,481.000000 342.089447,481.000000 C243.427612,481.000031 144.765793,481.000000 46.103966,481.000000 C44.110912,481.000000 42.117859,481.000000 39.401810,481.000000 C43.857620,472.483643 47.974022,464.370728 52.312668,456.378448 C59.689438,442.789490 67.257729,429.304626 74.653091,415.725647 C89.117485,389.166901 103.522736,362.575897 117.937233,335.989990 C119.193306,333.673279 120.498009,331.362091 121.500618,328.932983 C123.942146,323.017517 127.620270,319.337616 135.085373,321.000000 M140.500000,440.999939 C132.167938,440.999939 123.835869,440.999023 115.503807,441.000183 C106.978073,441.001343 104.965355,442.559265 105.000999,449.124817 C105.035042,455.395599 107.121445,456.999329 115.262733,456.999634 C146.424759,457.000732 177.586792,457.000153 208.748825,457.000000 C224.913086,456.999939 241.077591,456.952484 257.241425,457.035980 C260.763824,457.054169 263.472839,456.015015 264.705200,452.580017 C267.060974,446.013672 263.486053,441.009705 256.482880,441.007080 C218.155258,440.992767 179.827621,441.000061 140.500000,440.999939 M211.498047,417.000153 C216.330338,416.999176 221.164948,417.091248 225.994263,416.971069 C230.865005,416.849884 232.921509,414.514984 232.998932,409.368042 C233.083664,403.733337 231.121094,401.059509 226.230942,401.046417 C196.071045,400.965607 165.910004,400.915100 135.752502,401.195435 C133.579193,401.215637 130.361252,403.471161 129.469467,405.497375 C126.665665,411.867889 130.514359,416.987915 137.514694,416.993042 C161.842728,417.010773 186.170807,417.000061 211.498047,417.000153 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M324.354675,242.395920 C323.276184,244.196213 322.400177,245.685776 320.988098,248.086838 C316.865295,241.230835 313.147400,235.306534 309.702332,229.227615 C307.440796,225.236969 304.366974,222.962448 299.806335,221.925400 C262.283539,213.393021 232.965317,182.596176 227.057266,144.851562 C221.513794,109.436241 232.720886,79.522171 259.624786,56.188839 C275.751617,42.202290 294.904785,34.663937 316.779572,33.851212 C348.121246,32.686760 373.699219,44.368736 393.808441,67.607040 C408.285522,84.336838 415.719910,104.193253 416.129883,126.765366 C416.679504,157.025070 405.027954,181.648727 382.881226,201.408112 C371.110535,211.909912 357.159485,218.791580 341.520416,222.240189 C338.299622,222.950409 335.118561,225.957092 332.924042,228.707169 C329.664886,232.791306 327.301666,237.590393 324.354675,242.395920 M365.048187,97.443359 C370.583435,91.700768 370.701630,85.175507 365.330109,81.880753 C361.672668,79.637360 356.630035,80.933273 352.129089,85.405678 C342.914734,94.561584 333.749512,103.766907 324.548431,112.936203 C323.412384,114.068321 322.181274,115.104980 320.457794,116.674324 C319.017365,114.966263 317.930176,113.478592 316.646271,112.186401 C307.370972,102.851303 298.080811,93.530586 288.741608,84.259491 C284.745544,80.292557 279.208740,79.658867 275.876648,82.619972 C271.622955,86.400055 271.606628,92.007065 276.075226,96.532738 C285.555145,106.133804 295.140411,115.630798 304.670227,125.182716 C305.910522,126.425888 307.078339,127.741364 308.699982,129.471832 C306.767456,131.142502 305.170319,132.365768 303.755219,133.772186 C294.658264,142.813187 285.530975,151.825531 276.561829,160.992294 C272.316803,165.330841 271.679443,172.193146 274.860229,175.243683 C278.125275,178.375015 284.989929,177.494553 289.133881,173.366959 C295.270966,167.254105 301.415710,161.148209 307.489624,154.972931 C311.886749,150.502441 316.174255,145.924133 320.608521,141.291687 C322.557465,143.156174 323.772125,144.275360 324.939575,145.441833 C334.366547,154.861099 343.762360,164.311676 353.216248,173.703827 C357.078430,177.540771 364.054932,178.250854 367.156860,175.284821 C369.494812,173.049301 370.182617,164.901749 365.897583,161.258850 C361.343750,157.387436 357.354156,152.853470 353.106140,148.620880 C346.649475,142.187607 340.182373,135.764771 333.450989,129.070267 C344.099365,118.419060 354.322937,108.192757 365.048187,97.443359 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M141.000000,440.999939 C179.827621,441.000061 218.155258,440.992767 256.482880,441.007080 C263.486053,441.009705 267.060974,446.013672 264.705200,452.580017 C263.472839,456.015015 260.763824,457.054169 257.241425,457.035980 C241.077591,456.952484 224.913086,456.999939 208.748825,457.000000 C177.586792,457.000153 146.424759,457.000732 115.262733,456.999634 C107.121445,456.999329 105.035042,455.395599 105.000999,449.124817 C104.965355,442.559265 106.978073,441.001343 115.503807,441.000183 C123.835869,440.999023 132.167938,440.999939 141.000000,440.999939 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M210.998444,417.000153 C186.170807,417.000061 161.842728,417.010773 137.514694,416.993042 C130.514359,416.987915 126.665665,411.867889 129.469467,405.497375 C130.361252,403.471161 133.579193,401.215637 135.752502,401.195435 C165.910004,400.915100 196.071045,400.965607 226.230942,401.046417 C231.121094,401.059509 233.083664,403.733337 232.998932,409.368042 C232.921509,414.514984 230.865005,416.849884 225.994263,416.971069 C221.164948,417.091248 216.330338,416.999176 210.998444,417.000153 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M364.797363,97.704910 C354.322937,108.192757 344.099365,118.419060 333.450989,129.070267 C340.182373,135.764771 346.649475,142.187607 353.106140,148.620880 C357.354156,152.853470 361.343750,157.387436 365.897583,161.258850 C370.182617,164.901749 369.494812,173.049301 367.156860,175.284821 C364.054932,178.250854 357.078430,177.540771 353.216248,173.703827 C343.762360,164.311676 334.366547,154.861099 324.939575,145.441833 C323.772125,144.275360 322.557465,143.156174 320.608521,141.291687 C316.174255,145.924133 311.886749,150.502441 307.489624,154.972931 C301.415710,161.148209 295.270966,167.254105 289.133881,173.366959 C284.989929,177.494553 278.125275,178.375015 274.860229,175.243683 C271.679443,172.193146 272.316803,165.330841 276.561829,160.992294 C285.530975,151.825531 294.658264,142.813187 303.755219,133.772186 C305.170319,132.365768 306.767456,131.142502 308.699982,129.471832 C307.078339,127.741364 305.910522,126.425888 304.670227,125.182716 C295.140411,115.630798 285.555145,106.133804 276.075226,96.532738 C271.606628,92.007065 271.622955,86.400055 275.876648,82.619972 C279.208740,79.658867 284.745544,80.292557 288.741608,84.259491 C298.080811,93.530586 307.370972,102.851303 316.646271,112.186401 C317.930176,113.478592 319.017365,114.966263 320.457794,116.674324 C322.181274,115.104980 323.412384,114.068321 324.548431,112.936203 C333.749512,103.766907 342.914734,94.561584 352.129089,85.405678 C356.630035,80.933273 361.672668,79.637360 365.330109,81.880753 C370.701630,85.175507 370.583435,91.700768 364.797363,97.704910 z\"/>\n </svg>\n\n </div>\n }\n </div>\n }\n @else if(viewType == 'compact'){\n <div [class.image-picker-label-compact]=\"!previewOnly\" [class.error]=\"required && (filesArray?.length || 0) <= 0\" style=\"height: 42px; width: 42px;\">\n @if(filesArray?.length){\n <div>\n @for(file of filesArray; track file.s3Url; let i = $index; let l = $last;){\n @if(i == 0) {\n <div>\n <div class=\"compact-image-item\" [class.selected]=\"config?.selectionMode ? selectedId == file.id : false\" [class.tis-curser-pointer]=\"!config?.hiddenPreview || config?.selectionMode\" id=\"image-item-{{config.selectorId}}-{{i}}\" [style.background-image]=\"type == 'file'? '' : 'url('+file.s3Url+')'\" (click)=\"onSelectFile(file)\" [style.background-size]=\"'contain'\">\n <mat-icon *ngIf=\"type == 'file'\" class=\"active tis-mat-icon\">description</mat-icon>\n <span class=\"material-icons cancel\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"(!disabled || showDeleteButtonWhenDisabled) && !config.hiddenDeleteBtn && !file?.loading\">highlight_off</span>\n <span class=\"material-icons download\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn && !file?.loading\">download_for_offline</span>\n \n <!-- Loading overlay -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"30\"></mat-progress-spinner>\n </div>\n </div>\n \n </div>\n }\n @if(l && (config?.limit || 0) > (filesArray?.length || 0) && !disabled){\n <div class=\"flex flex-col\">\n <!-- Image upload options in grid -->\n <div class=\"image-item uploader\" id=\"image-item-{{config.selectorId}}-{{i}}-{{i}}\" style=\"display: flex; flex-direction: column; gap: 8px; justify-content: center; align-items: center; cursor: pointer;\" (click)=\"loading ? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon class=\"active\">upload_file</mat-icon>\n </div>\n </div>\n }\n }\n </div>\n }\n @else if(!disabled){\n <label style=\"display: flex; gap: 12px; flex-direction: column; justify-content: center; align-items: center; height: 100%; cursor: pointer;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon>upload_file</mat-icon>\n </label>\n }\n @else{\n <div class=\"not-found-section\" style=\"display: flex; flex-direction: column; justify-content: center; align-items: center; width: 100%; cursor: pointer;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"100%\" viewBox=\"0 0 512 512\" enable-background=\"new 0 0 512 512\" xml:space=\"preserve\">\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M283.000000,513.000000 C188.689560,513.000000 94.879120,513.000000 1.034338,513.000000 C1.034338,342.397858 1.034338,171.795731 1.034338,1.096792 C171.560455,1.096792 342.121002,1.096792 512.840759,1.096792 C512.840759,171.666550 512.840759,342.333252 512.840759,513.000000 C436.462372,513.000000 359.981171,513.000000 283.000000,513.000000 M214.500000,497.000000 C271.998901,496.999969 329.497833,497.019897 386.996674,496.975769 C394.561920,496.969971 401.787231,494.626648 406.395233,488.770782 C412.026520,481.614502 416.644897,473.577057 421.072449,465.572754 C437.390259,436.072754 453.464813,406.438049 469.597321,376.835754 C478.327332,360.816742 487.426758,344.977722 495.530029,328.645905 C501.012421,317.596252 494.173737,304.613556 481.201294,304.861847 C456.377502,305.336975 431.538177,304.999878 406.705292,304.999847 C404.938568,304.999847 403.171844,304.999847 401.000031,304.999847 C401.000031,302.348328 401.003784,300.379181 400.999481,298.410065 C400.935120,269.085632 400.853577,239.761169 400.867645,210.436768 C400.868164,209.340317 401.642242,208.138214 402.315186,207.164581 C408.841400,197.722305 416.441071,188.858276 421.779449,178.792419 C433.290894,157.086823 435.985443,133.380402 431.740631,109.507538 C425.335449,73.484550 405.456726,46.387234 373.051300,29.163473 C356.219269,20.217096 338.040710,16.499708 318.773804,16.813351 C301.234619,17.098873 284.897461,21.133270 269.449402,28.965902 C256.098724,35.735111 244.580948,44.876842 234.887085,56.467457 C224.793365,68.536171 217.675415,82.055397 213.023590,96.957832 C209.186737,109.249481 208.654160,121.911049 208.964157,134.687836 C209.387650,152.143631 214.172058,168.302002 222.741714,183.427231 C224.412766,186.376572 225.987946,189.380234 227.939270,192.969376 C211.045273,192.969376 194.919281,193.199417 178.811310,192.763687 C175.805389,192.682358 172.083817,190.621887 170.038193,188.292847 C160.046188,176.916489 150.561493,165.096268 140.789429,153.524185 C136.493210,148.436600 131.117233,145.037399 124.221672,145.023544 C96.055626,144.966995 67.881424,145.387711 39.727192,144.808304 C28.532793,144.577896 16.775660,156.479080 16.809900,167.857864 C17.130381,274.354980 17.052288,380.853516 16.870073,487.351288 C16.859135,493.743988 19.582472,497.123566 26.503685,497.103851 C88.835381,496.926239 151.167801,497.000000 214.500000,497.000000 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M214.000000,497.000000 C151.167801,497.000000 88.835381,496.926239 26.503685,497.103851 C19.582472,497.123566 16.859135,493.743988 16.870073,487.351288 C17.052288,380.853516 17.130381,274.354980 16.809900,167.857864 C16.775660,156.479080 28.532793,144.577896 39.727192,144.808304 C67.881424,145.387711 96.055626,144.966995 124.221672,145.023544 C131.117233,145.037399 136.493210,148.436600 140.789429,153.524185 C150.561493,165.096268 160.046188,176.916489 170.038193,188.292847 C172.083817,190.621887 175.805389,192.682358 178.811310,192.763687 C194.919281,193.199417 211.045273,192.969376 227.939270,192.969376 C225.987946,189.380234 224.412766,186.376572 222.741714,183.427231 C214.172058,168.302002 209.387650,152.143631 208.964157,134.687836 C208.654160,121.911049 209.186737,109.249481 213.023590,96.957832 C217.675415,82.055397 224.793365,68.536171 234.887085,56.467457 C244.580948,44.876842 256.098724,35.735111 269.449402,28.965902 C284.897461,21.133270 301.234619,17.098873 318.773804,16.813351 C338.040710,16.499708 356.219269,20.217096 373.051300,29.163473 C405.456726,46.387234 425.335449,73.484550 431.740631,109.507538 C435.985443,133.380402 433.290894,157.086823 421.779449,178.792419 C416.441071,188.858276 408.841400,197.722305 402.315186,207.164581 C401.642242,208.138214 400.868164,209.340317 400.867645,210.436768 C400.853577,239.761169 400.935120,269.085632 400.999481,298.410065 C401.003784,300.379181 401.000031,302.348328 401.000031,304.999847 C403.171844,304.999847 404.938568,304.999847 406.705292,304.999847 C431.538177,304.999878 456.377502,305.336975 481.201294,304.861847 C494.173737,304.613556 501.012421,317.596252 495.530029,328.645905 C487.426758,344.977722 478.327332,360.816742 469.597321,376.835754 C453.464813,406.438049 437.390259,436.072754 421.072449,465.572754 C416.644897,473.577057 412.026520,481.614502 406.395233,488.770782 C401.787231,494.626648 394.561920,496.969971 386.996674,496.975769 C329.497833,497.019897 271.998901,496.999969 214.000000,497.000000 M134.597260,321.000000 C127.620270,319.337616 123.942146,323.017517 121.500618,328.932983 C120.498009,331.362091 119.193306,333.673279 117.937233,335.989990 C103.522736,362.575897 89.117485,389.166901 74.653091,415.725647 C67.257729,429.304626 59.689438,442.789490 52.312668,456.378448 C47.974022,464.370728 43.857620,472.483643 39.401810,481.000000 C42.117859,481.000000 44.110912,481.000000 46.103966,481.000000 C144.765793,481.000000 243.427612,481.000031 342.089447,481.000000 C354.922150,481.000000 367.755981,481.100647 380.587189,480.961823 C388.353729,480.877808 394.963684,478.668121 399.028687,471.088623 C414.189636,442.819641 429.540070,414.652191 444.852783,386.464783 C452.465210,372.451935 460.203308,358.507233 467.780884,344.475739 C471.870789,336.902466 475.742279,329.211273 480.010315,321.000000 C364.545990,321.000000 250.059738,321.000000 134.597260,321.000000 M324.557129,242.085190 C327.301666,237.590393 329.664886,232.791306 332.924042,228.707169 C335.118561,225.957092 338.299622,222.950409 341.520416,222.240189 C357.159485,218.791580 371.110535,211.909912 382.881226,201.408112 C405.027954,181.648727 416.679504,157.025070 416.129883,126.765366 C415.719910,104.193253 408.285522,84.336838 393.808441,67.607040 C373.699219,44.368736 348.121246,32.686760 316.779572,33.851212 C294.904785,34.663937 275.751617,42.202290 259.624786,56.188839 C232.720886,79.522171 221.513794,109.436241 227.057266,144.851562 C232.965317,182.596176 262.283539,213.393021 299.806335,221.925400 C304.366974,222.962448 307.440796,225.236969 309.702332,229.227615 C313.147400,235.306534 316.865295,241.230835 320.988098,248.086838 C322.400177,245.685776 323.276184,244.196213 324.557129,242.085190 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M135.085373,321.000000 C250.059738,321.000000 364.545990,321.000000 480.010315,321.000000 C475.742279,329.211273 471.870789,336.902466 467.780884,344.475739 C460.203308,358.507233 452.465210,372.451935 444.852783,386.464783 C429.540070,414.652191 414.189636,442.819641 399.028687,471.088623 C394.963684,478.668121 388.353729,480.877808 380.587189,480.961823 C367.755981,481.100647 354.922150,481.000000 342.089447,481.000000 C243.427612,481.000031 144.765793,481.000000 46.103966,481.000000 C44.110912,481.000000 42.117859,481.000000 39.401810,481.000000 C43.857620,472.483643 47.974022,464.370728 52.312668,456.378448 C59.689438,442.789490 67.257729,429.304626 74.653091,415.725647 C89.117485,389.166901 103.522736,362.575897 117.937233,335.989990 C119.193306,333.673279 120.498009,331.362091 121.500618,328.932983 C123.942146,323.017517 127.620270,319.337616 135.085373,321.000000 M140.500000,440.999939 C132.167938,440.999939 123.835869,440.999023 115.503807,441.000183 C106.978073,441.001343 104.965355,442.559265 105.000999,449.124817 C105.035042,455.395599 107.121445,456.999329 115.262733,456.999634 C146.424759,457.000732 177.586792,457.000153 208.748825,457.000000 C224.913086,456.999939 241.077591,456.952484 257.241425,457.035980 C260.763824,457.054169 263.472839,456.015015 264.705200,452.580017 C267.060974,446.013672 263.486053,441.009705 256.482880,441.007080 C218.155258,440.992767 179.827621,441.000061 140.500000,440.999939 M211.498047,417.000153 C216.330338,416.999176 221.164948,417.091248 225.994263,416.971069 C230.865005,416.849884 232.921509,414.514984 232.998932,409.368042 C233.083664,403.733337 231.121094,401.059509 226.230942,401.046417 C196.071045,400.965607 165.910004,400.915100 135.752502,401.195435 C133.579193,401.215637 130.361252,403.471161 129.469467,405.497375 C126.665665,411.867889 130.514359,416.987915 137.514694,416.993042 C161.842728,417.010773 186.170807,417.000061 211.498047,417.000153 z\"/>\n <path fill=\"none\" opacity=\"1.000000\" stroke=\"none\" d=\" M324.354675,242.395920 C323.276184,244.196213 322.400177,245.685776 320.988098,248.086838 C316.865295,241.230835 313.147400,235.306534 309.702332,229.227615 C307.440796,225.236969 304.366974,222.962448 299.806335,221.925400 C262.283539,213.393021 232.965317,182.596176 227.057266,144.851562 C221.513794,109.436241 232.720886,79.522171 259.624786,56.188839 C275.751617,42.202290 294.904785,34.663937 316.779572,33.851212 C348.121246,32.686760 373.699219,44.368736 393.808441,67.607040 C408.285522,84.336838 415.719910,104.193253 416.129883,126.765366 C416.679504,157.025070 405.027954,181.648727 382.881226,201.408112 C371.110535,211.909912 357.159485,218.791580 341.520416,222.240189 C338.299622,222.950409 335.118561,225.957092 332.924042,228.707169 C329.664886,232.791306 327.301666,237.590393 324.354675,242.395920 M365.048187,97.443359 C370.583435,91.700768 370.701630,85.175507 365.330109,81.880753 C361.672668,79.637360 356.630035,80.933273 352.129089,85.405678 C342.914734,94.561584 333.749512,103.766907 324.548431,112.936203 C323.412384,114.068321 322.181274,115.104980 320.457794,116.674324 C319.017365,114.966263 317.930176,113.478592 316.646271,112.186401 C307.370972,102.851303 298.080811,93.530586 288.741608,84.259491 C284.745544,80.292557 279.208740,79.658867 275.876648,82.619972 C271.622955,86.400055 271.606628,92.007065 276.075226,96.532738 C285.555145,106.133804 295.140411,115.630798 304.670227,125.182716 C305.910522,126.425888 307.078339,127.741364 308.699982,129.471832 C306.767456,131.142502 305.170319,132.365768 303.755219,133.772186 C294.658264,142.813187 285.530975,151.825531 276.561829,160.992294 C272.316803,165.330841 271.679443,172.193146 274.860229,175.243683 C278.125275,178.375015 284.989929,177.494553 289.133881,173.366959 C295.270966,167.254105 301.415710,161.148209 307.489624,154.972931 C311.886749,150.502441 316.174255,145.924133 320.608521,141.291687 C322.557465,143.156174 323.772125,144.275360 324.939575,145.441833 C334.366547,154.861099 343.762360,164.311676 353.216248,173.703827 C357.078430,177.540771 364.054932,178.250854 367.156860,175.284821 C369.494812,173.049301 370.182617,164.901749 365.897583,161.258850 C361.343750,157.387436 357.354156,152.853470 353.106140,148.620880 C346.649475,142.187607 340.182373,135.764771 333.450989,129.070267 C344.099365,118.419060 354.322937,108.192757 365.048187,97.443359 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M141.000000,440.999939 C179.827621,441.000061 218.155258,440.992767 256.482880,441.007080 C263.486053,441.009705 267.060974,446.013672 264.705200,452.580017 C263.472839,456.015015 260.763824,457.054169 257.241425,457.035980 C241.077591,456.952484 224.913086,456.999939 208.748825,457.000000 C177.586792,457.000153 146.424759,457.000732 115.262733,456.999634 C107.121445,456.999329 105.035042,455.395599 105.000999,449.124817 C104.965355,442.559265 106.978073,441.001343 115.503807,441.000183 C123.835869,440.999023 132.167938,440.999939 141.000000,440.999939 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M210.998444,417.000153 C186.170807,417.000061 161.842728,417.010773 137.514694,416.993042 C130.514359,416.987915 126.665665,411.867889 129.469467,405.497375 C130.361252,403.471161 133.579193,401.215637 135.752502,401.195435 C165.910004,400.915100 196.071045,400.965607 226.230942,401.046417 C231.121094,401.059509 233.083664,403.733337 232.998932,409.368042 C232.921509,414.514984 230.865005,416.849884 225.994263,416.971069 C221.164948,417.091248 216.330338,416.999176 210.998444,417.000153 z\"/>\n <path fill=\"var(--tis-primary, #1F6AAD)\" opacity=\"1.000000\" stroke=\"none\" d=\" M364.797363,97.704910 C354.322937,108.192757 344.099365,118.419060 333.450989,129.070267 C340.182373,135.764771 346.649475,142.187607 353.106140,148.620880 C357.354156,152.853470 361.343750,157.387436 365.897583,161.258850 C370.182617,164.901749 369.494812,173.049301 367.156860,175.284821 C364.054932,178.250854 357.078430,177.540771 353.216248,173.703827 C343.762360,164.311676 334.366547,154.861099 324.939575,145.441833 C323.772125,144.275360 322.557465,143.156174 320.608521,141.291687 C316.174255,145.924133 311.886749,150.502441 307.489624,154.972931 C301.415710,161.148209 295.270966,167.254105 289.133881,173.366959 C284.989929,177.494553 278.125275,178.375015 274.860229,175.243683 C271.679443,172.193146 272.316803,165.330841 276.561829,160.992294 C285.530975,151.825531 294.658264,142.813187 303.755219,133.772186 C305.170319,132.365768 306.767456,131.142502 308.699982,129.471832 C307.078339,127.741364 305.910522,126.425888 304.670227,125.182716 C295.140411,115.630798 285.555145,106.133804 276.075226,96.532738 C271.606628,92.007065 271.622955,86.400055 275.876648,82.619972 C279.208740,79.658867 284.745544,80.292557 288.741608,84.259491 C298.080811,93.530586 307.370972,102.851303 316.646271,112.186401 C317.930176,113.478592 319.017365,114.966263 320.457794,116.674324 C322.181274,115.104980 323.412384,114.068321 324.548431,112.936203 C333.749512,103.766907 342.914734,94.561584 352.129089,85.405678 C356.630035,80.933273 361.672668,79.637360 365.330109,81.880753 C370.701630,85.175507 370.583435,91.700768 364.797363,97.704910 z\"/>\n </svg>\n\n </div>\n }\n </div>\n }\n @else if(viewType == 'list'){\n <div [class.error-border]=\"required && (filesArray?.length || 0) <= 0\" [style.height]=\"filesArray?.length ? null : config?.height\" style=\"width: 100%; display: flex; gap: 12px; flex-direction: column; --tis-image-picker-height: {{config?.height ?? 0}}\">\n @if(filesArray?.length){\n @for(file of filesArray; track file.s3Url; let i = $index; let l = $last;){\n <div style=\"position: relative; display: flex; align-items: center; gap: 10px; border-radius: 5px; border: 1px solid black; padding: 5px; height: 56px;\">\n <mat-icon style=\"width: 40px; min-width: 22px;\">description</mat-icon>\n <div style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%;\">{{file?.title}}</div>\n <div style=\"display: flex; align-items: center; gap: 4px;\" *ngIf=\"!file?.loading\">\n <button type=\"button\" mat-icon-button aria-label=\"Download File\" class=\"tis-icon-btn-sm tis-text-download\" style=\"margin: 0px !important;\" (click)=\"$event.stopPropagation(); downloadFile(file.s3Url, file.title)\" *ngIf=\"!config.hiddenDownloadBtn\">\n <mat-icon>download_for_offline</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button aria-label=\"View File\" class=\"tis-icon-btn-sm tis-text-view\" style=\"margin: 0px !important;\" (click)=\"openFile(file)\" *ngIf=\"!config.hiddenPreview\">\n <mat-icon>visibility</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button aria-label=\"Remove File\" class=\"tis-icon-btn-sm tis-text-cancel\" style=\"margin: 0px !important;\" (click)=\"type == 'file'? deleteFile($event, {}, i, file) : deleteImage($event, {}, i, file)\" *ngIf=\"(!disabled || showDeleteButtonWhenDisabled) && !config.hiddenDeleteBtn\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n \n <!-- Loading overlay for list view -->\n <div class=\"loading-img\" *ngIf=\"file?.loading\" style=\"border-radius: 5px;\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\" [diameter]=\"25\"></mat-progress-spinner>\n </div>\n </div>\n @if(l && (config?.limit || 0) > (filesArray?.length || 0) && !disabled){\n <div style=\"cursor: pointer; display: flex; align-items: center; gap: 4px; border: 1px solid black; border-radius: 5px; padding: 5px; height: 56px;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon style=\"width: 40px; min-width: 22px;\">upload_file</mat-icon>\n <div style=\"width: 100%;\">\n <div style=\"display: flex; flex-direction: column; align-items: start; font-size: 14px;\">\n {{label}}\n @if(hint && hint != ''){\n <small>{{hint}}</small>\n }\n </div>\n </div>\n </div>\n }\n }\n }\n @else if(!disabled){\n <div style=\"cursor: pointer; display: flex; align-items: center; gap: 4px; border: 1px solid black; border-radius: 5px; padding: 5px; height: 56px;\" (click)=\"loading? null : type == 'image' && isEnableCapture ? openCameraCapture() : openImageSelector()\">\n <mat-icon style=\"width: 40px; min-width: 22px;\">upload_file</mat-icon>\n <div style=\"width: 100%;\">\n <div style=\"display: flex; flex-direction: column; align-items: start; font-size: 14px;\">\n {{label}}\n @if(hint && hint != ''){\n <small>{{hint}}</small>\n }\n </div>\n </div>\n <!-- Mobile Upload Button for list view -->\n @if(isRemoteUploadAvailable()){\n <button type=\"button\" mat-icon-button class=\"mobile-upload-btn-list\" (click)=\"$event.stopPropagation(); openRemoteUploadDialog()\" title=\"Upload from Mobile\" aria-label=\"Upload from Mobile\">\n <mat-icon>smartphone</mat-icon>\n </button>\n }\n </div>\n }\n </div>\n }\n}\n","import { NgModule } from '@angular/core';\nimport { TisImageAndFileUploadAndViewComponent } from './tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component';\nimport { TisPreviewImageComponent } from './tis-preview-image/tis-preview-image.component';\nimport { CommonModule } from '@angular/common';\nimport { TisFileViewerComponent } from './tis-file-viewer/tis-file-viewer.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { TisErrorDialogComponent } from './tis-error-dialog/tis-error-dialog.component';\nimport { TisConfirmationDialogComponent } from './tis-confirmation-dialog/tis-confirmation-dialog.component';\nimport { TisExcelFileViewerComponent } from './tis-file-viewer/tis-excel-file-viewer/tis-excel-file-viewer.component';\nimport { TisPdfViewerComponent } from './tis-file-viewer/tis-pdf-viewer/tis-pdf-viewer.component';\nimport { TisVideoComponent } from './tis-file-viewer/tis-video/tis-video.component';\nimport { TisQrCodeDialogComponent } from './tis-qr-code-dialog/tis-qr-code-dialog.component';\nimport { NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';\nimport { MatInputModule } from '@angular/material/input';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { HttpClientModule } from '@angular/common/http';\nimport { QRCodeComponent } from 'angularx-qrcode';\n\n\nconst uiImports = [\n MatTooltipModule,\n MatIconModule,\n MatSnackBarModule,\n MatProgressSpinnerModule,\n MatInputModule,\n MatButtonModule,\n MatDialogModule,\n];\n\n\n@NgModule({\n declarations: [\n TisImageAndFileUploadAndViewComponent,\n TisPreviewImageComponent,\n TisFileViewerComponent,\n TisExcelFileViewerComponent,\n TisPdfViewerComponent,\n TisVideoComponent,\n TisErrorDialogComponent,\n TisConfirmationDialogComponent,\n TisQrCodeDialogComponent\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n NgxExtendedPdfViewerModule,\n FormsModule,\n ReactiveFormsModule,\n QRCodeComponent,\n ...uiImports,\n DragDropModule\n ],\n exports: [\n TisImageAndFileUploadAndViewComponent,\n TisQrCodeDialogComponent\n ]\n})\nexport class TisImageAndFileUploadAndViewModule { }\n","/*\n * Public API Surface of tis-image-and-file-upload-and-view\n */\n\nexport * from './lib/tis-image-and-file-upload-and-view.service';\nexport * from './lib/tis-image-and-file-upload-and-view/tis-image-and-file-upload-and-view.component';\nexport * from './lib/tis-image-and-file-upload-and-view.module';\n\n// Interfaces\nexport * from './lib/interfaces';\n\n// Remote Upload\nexport * from './lib/services/tis-remote-upload.service';\nexport * from './lib/tis-qr-code-dialog/tis-qr-code-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4","i5","i6.TisExcelFileViewerComponent","i7.TisPdfViewerComponent","i8.TisVideoComponent","i3","i2.TisRemoteUploadService","i6","i7","takeUntil","i2.TisHelperService","i4.TisRemoteUploadService","i8","i9"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKa,mCAAmC,CAAA;AAE9C,IAAA,WAAA,GAAA;uGAFW,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnC,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mCAAmC,cAFlC,MAAM,EAAA,CAAA;;2FAEP,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAH/C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCOY,qBAAqB,CAAA;AAWtB,IAAA,KAAA;IATV,OAAO,GAAG,IAAI;IACd,OAAO,GAAG,KAAK;AAEY,IAAA,GAAG;AAGtB,IAAA,SAAS;AAEjB,IAAA,WAAA,CACU,KAAwB,EAAA;QAAxB,IAAK,CAAA,KAAA,GAAL,KAAK;;AAKf,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAG,OAAO,CAAC,KAAK,CAAC,EAAE;YACjB,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;;;IAI5D,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;AAG9B,IAAA,eAAe,CAAC,EAAO,EAAA;AACrB,QAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM;;AAGhC,IAAA,YAAY,CAAC,EAAO,EAAA;AAClB,QAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;;uGArCjB,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAOrB,6BAA6B,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClB1C,40CAyCI,EAAA,MAAA,EAAA,CAAA,k7EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,eAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,KAAA,EAAA,WAAA,EAAA,WAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,yBAAA,EAAA,0BAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,QAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,uBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,+BAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD9BS,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EACd,UAAA,EAAA,KAAK,EAGA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,40CAAA,EAAA,MAAA,EAAA,CAAA,k7EAAA,CAAA,EAAA;sFAOpB,GAAG,EAAA,CAAA;sBAA7B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAGjB,SAAS,EAAA,CAAA;sBADhB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,6BAA6B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MERhD,2BAA2B,CAAA;AAOlB,IAAA,SAAA;AALO,IAAA,GAAG;IAE9B,OAAO,GAAI,qDAAqD;IAChE,SAAS,GAAmB,IAAI;AAEhC,IAAA,WAAA,CAAoB,SAAuB,EAAA;QAAvB,IAAS,CAAA,SAAA,GAAT,SAAS;;AAI7B,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,GAAG,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC;;;uGAhBnC,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,+HCVxC,4XAOM,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA;;2FDGO,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cACrB,KAAK,EAAA,QAAA,EAAA,4XAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA;mFAMU,GAAG,EAAA,CAAA;sBAA7B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;MEHd,iBAAiB,CAAA;AACD,IAAA,GAAG;AAC9B,IAAA,IAAI;AAEJ,IAAA,WAAA,GAAA;IAEA,QAAQ,GAAA;AACN,QAAA,IAAG,IAAI,CAAC,GAAG,EAAC;AACV,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;;AAIlD,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAG,OAAO,CAAC,KAAK,CAAC,EAAE;YACjB,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC;;;AAI7D,IAAA,WAAW,CAAC,IAAY,EAAA;QACtB,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5B,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AACxC,QAAA,OAAO,QAAQ,CAAC,iBAAiB,EAAE,IAAI,KAAK,GAAG,KAAK,GAAE,QAAQ,CAAC,iBAAiB,EAAE;;uGAtBzE,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,mHCT9B,6NAGQ,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDMK,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cACT,KAAK,EAAA,QAAA,EAAA,6NAAA,EAAA;wDAKU,GAAG,EAAA,CAAA;sBAA7B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;MEEd,sBAAsB,CAAA;AAMxB,IAAA,SAAA;AACyB,IAAA,IAAA;AACxB,IAAA,SAAA;AAPV,IAAA,OAAO;AAEsD,IAAA,SAAS;AAEtE,IAAA,WAAA,CACS,SAA+C,EACtB,IAA0B,EAClD,SAAuB,EAAA;QAFxB,IAAS,CAAA,SAAA,GAAT,SAAS;QACgB,IAAI,CAAA,IAAA,GAAJ,IAAI;QAC5B,IAAS,CAAA,SAAA,GAAT,SAAS;AAEjB,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC;QAEtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG;QAC5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC;QAEhD,SAAS,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAC5C,YAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;;AAE/C,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;AACjC,gBAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;;AAExC,SAAC,CAAC;;IAGJ,YAAY,GAAA;QACV,IAAI,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QACpC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;AACrC,QAAA,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AAC5D,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,KAAK,EAAE;QACV,EAAE,CAAC,MAAM,EAAE;;AAGb,IAAA,OAAO,CAAC,MAAsB,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;;AAnCnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,gDAOvB,eAAe,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAPd,sBAAsB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGtB,qBAAqB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECflC,+8BAwBA,EAAA,MAAA,EAAA,CAAA,gVAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,2BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDZa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,KAAK,EAAA,QAAA,EAAA,+8BAAA,EAAA,MAAA,EAAA,CAAA,gVAAA,CAAA,EAAA;;0BAWd,MAAM;2BAAC,eAAe;sEAJoC,SAAS,EAAA,CAAA;sBAArE,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,qBAAqB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MENxC,wBAAwB,CAAA;AAW1B,IAAA,SAAA;AACyB,IAAA,IAAA;IAXlC,KAAK,GAAG,GAAG;IACX,MAAM,GAAG,GAAG;IACZ,SAAS,GAAY,IAAI;AACzB,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,UAAU;AACV,IAAA,WAAW;IAGX,WACS,CAAA,SAAiD,EACxB,IAAS,EAAA;QADlC,IAAS,CAAA,SAAA,GAAT,SAAS;QACgB,IAAI,CAAA,IAAA,GAAJ,IAAI;;IAGtC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aAC1C,EAAE,GAAG,CAAC;;;AAIX,IAAA,qBAAqB,CAAC,QAAgB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,GAAG,GAAG,QAAQ;AAClB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AAErB,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,YAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,YAAY;AAClC,YAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,aAAa;YACpC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,aAAa;AACvD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,iBAAiB,GAAG,gBAAgB;AAC1E,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACxB,SAAC;AAED,QAAA,GAAG,CAAC,OAAO,GAAG,MAAK;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC;AACtC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACxB,SAAC;;IAGH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;AA3Cb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,gDAYzB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAZd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,8ECTrC,0uBAgBC,EAAA,MAAA,EAAA,CAAA,ybAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDPY,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,KAAK,EAAA,QAAA,EAAA,0uBAAA,EAAA,MAAA,EAAA,CAAA,ybAAA,CAAA,EAAA;;0BAgBd,MAAM;2BAAC,eAAe;;;MEZd,uBAAuB,CAAA;AAEzB,IAAA,SAAA;AACyB,IAAA,IAAA;IAFlC,WACS,CAAA,SAAgD,EACvB,IAAS,EAAA;QADlC,IAAS,CAAA,SAAA,GAAT,SAAS;QACgB,IAAI,CAAA,IAAA,GAAJ,IAAI;;IAGtC,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;AAPb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,gDAGxB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAHd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,iFCTpC,waASM,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,CAAA,EAAA,CAAA;;2FDAO,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,KAAK,EAAA,QAAA,EAAA,waAAA,EAAA;;0BAOd,MAAM;2BAAC,eAAe;;;MEDd,gBAAgB,CAAA;AAGjB,IAAA,QAAA;AACA,IAAA,MAAA;AACA,IAAA,IAAA;AAHV,IAAA,WAAA,CACU,QAAqB,EACrB,MAAiB,EACjB,IAAgB,EAAA;QAFhB,IAAQ,CAAA,QAAA,GAAR,QAAQ;QACR,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAI,CAAA,IAAA,GAAJ,IAAI;;AAGd,IAAA,gBAAgB,CAAC,KAAwB,EAAE,QAAQ,GAAG,IAAI,EAAA;AACxD,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC;QAEjC,IAAI,YAAY,GAAG,8BAA8B;QACjD,IAAI,SAAS,GAAG,eAAe;QAC/B,MAAM,SAAS,GAAG,KAAK;AAEvB,QAAA,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,EAAE;AAC3B,YAAA,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC,KAAK,IAAI,EAAE;AACxE,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAChE,gBAAA,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO;AACzC,gBAAA,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;;;AAEhC,aAAA,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE;AACjC,YAAA,YAAY,GAAG,SAAS,CAAC,OAAO;AAChC,YAAA,SAAS,GAAG,SAAS,CAAC,UAAU;;AAGlC,QAAA,IAAI,SAAS,IAAI,kBAAkB,IAAI,SAAS,IAAI,iBAAiB,IAAI,SAAS,IAAI,uBAAuB,EAAE;AAC7G,YAAA,IAAI,cAAc,GAAQ;AACxB,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,SAAS,EAAE,iBAAiB;AAC5B,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,WAAW,EAAE,iBAAiB;aAC/B;YAED,MAAM,SAAS,GAA0C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;AACjG,gBAAA,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,CAAC,yBAAyB,CAAC;AACvC,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,YAAY,EAAE,KAAK;AACpB,aAAA,CAAC;AAEF,YAAA,OAAO,SAAS;;aAEX;AACL,YAAA,MAAM,WAAW,GAAqC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACvH,YAAA,OAAO,WAAW;;;AAKtB,IAAA,cAAc,CAAC,OAAe,EAAE,KAAa,EAAE,QAAQ,GAAG,IAAI,EAAA;QAC5D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;AACjC,YAAA,QAAQ,EAAE;AACX,SAAA,CAAC;;AAGJ,IAAA,YAAY,CAAC,OAAe,EAAE,KAAa,EAAE,QAAQ,GAAG,IAAI,EAAA;QAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;AACjC,YAAA,QAAQ,EAAE;AACX,SAAA,CAAC;;AAGJ,IAAA,MAAM,YAAY,CAAC,KAAU,EAAE,QAAgB,EAAA;QAE7C,IAAI,SAAS,GAAG,KAAK;AAErB,QAAA,IAAI,SAAS,GAAS,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC3E,QAAA,OAAO,SAAS;;IAGlB,aAAa,CAAC,OAAe,EAAE,QAAgB,EAAA;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;AACtD,QAAA,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC;AAC7C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;;AAEzC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACtD,QAAA,OAAO,IAAI;;AAGb,IAAA,kBAAkB,CAAC,IAAS,EAAA;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAM,KAAI;AACzB,gBAAA,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC1B,aAAC;AACD,YAAA,MAAM,CAAC,OAAO,GAAG,CAAC,CAAM,KAAI;AAC1B,gBAAA,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB,aAAC;AACD,YAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC5B,SAAC,CAAC;;AAGJ,IAAA,YAAY,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB,EAAE,IAAY,EAAA;AACxE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG1D,IAAA,mBAAmB,CAAC,GAAW,EAAE,IAAS,EAAE,KAAa,EAAA;AACvD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,EAAE,IAAI,CAAC;;IAGtD,SAAS,CAAC,GAAW,EAAE,IAAS,EAAA;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;;IAGlC,cAAc,CAAC,GAAW,EAAE,IAAS,EAAA;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;;AAGlC,IAAA,OAAO,CAAC,GAAW,EAAE,IAAU,EAAE,WAAoB,EAAA;QACnD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,WAAW,GAAG,WAAW,GAAG,qBAAqB,EAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,CAAC;AACxI,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC;;IAG9C,kBAAkB,CAAC,GAAW,EAAE,IAAS,EAAA;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;;uGAtHvB,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAM,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCDY,8BAA8B,CAAA;AAEhC,IAAA,SAAA;AACyB,IAAA,IAAA;IAFlC,WACS,CAAA,SAAuD,EAC9B,IAAS,EAAA;QADlC,IAAS,CAAA,SAAA,GAAT,SAAS;QACgB,IAAI,CAAA,IAAA,GAAJ,IAAI;QAEpC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC;;AAGnD,IAAA,OAAO,CAAC,MAAsB,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;;AATnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,gDAG/B,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAHd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,oFCT3C,khCAiBM,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,CAAA,EAAA,CAAA;;2FDRO,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cACvB,KAAK,EAAA,QAAA,EAAA,khCAAA,EAAA;;0BAOd,MAAM;2BAAC,eAAe;;;AEC3B,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAChD,MAAM,mBAAmB,GAAG,2BAA2B;AACvD,MAAM,iBAAiB,GAAG,GAAG,CAAC;MAcjB,sBAAsB,CAAA;AAuBb,IAAA,IAAA;AAtBZ,IAAA,OAAgB,SAAS,GAAG,wBAAwB;AACpD,IAAA,OAAgB,qBAAqB,GAAG,uBAAuB;AAE/D,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;IAC9B,mBAAmB,GAAwB,IAAI;IAE/C,MAAM,GAAiC,IAAI;IAC3C,aAAa,GAA4B,IAAI;;IAG7C,QAAQ,GAAW,EAAE;IACrB,MAAM,GAAW,EAAE;IACnB,MAAM,GAAW,EAAE;IACnB,WAAW,GAAW,EAAE;;AAGxB,IAAA,eAAe,GAAG,IAAI,eAAe,CAA2B,IAAI,CAAC;AACrE,IAAA,iBAAiB,GAAG,IAAI,eAAe,CAA2C,cAAc,CAAC;AACjG,IAAA,iBAAiB,GAAG,IAAI,eAAe,CAA8B,IAAI,CAAC;AAC1E,IAAA,aAAa,GAAG,IAAI,OAAO,EAAwB;AACnD,IAAA,MAAM,GAAG,IAAI,OAAO,EAAU;AAEtC,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAI,CAAA,IAAA,GAAJ,IAAI;;QAEtB,IAAI,CAAC,uBAAuB,EAAE;;;;;AAOhC;;AAEG;IACH,MAAM,SAAS,CAAC,MAA6B,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI;QAEjD,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE;;AAExC,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;AACvE,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;AAC/B,kBAAE,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;kBACpD,EAAE;AACN,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,IAAI,EAAE;YACpD,IAAI,CAAC,WAAW,GAAG,CAAA,wBAAA,EAA2B,IAAI,CAAC,QAAQ,EAAE;;YAG7D,IAAI,CAAC,aAAa,CAAC;AAChB,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC7B,SAAS,CAAC,SAAS,IAAG;gBACrB,IAAI,SAAS,EAAE;;AAEb,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;;AAE7C,aAAC,CAAC;;AAGJ,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE;AACpC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;;YAG3C,OAAO,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,sBAAsB,CAAC,SAAS,eAAe,EAAE;gBAC/D,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC;AACf,aAAA,CAAC;;;;;;AAQN;;AAEG;IACH,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,QAAQ;;AAGtB;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;;AAG9C;;AAEG;IACH,iBAAiB,GAAA;QACf,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,IAAI,IAAI;;AAG7D;;AAEG;IACH,iBAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;;AAG5C;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;;AAG9C;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;;AAG1C;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;;AAGnC;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,OAAO,CAAC,EACN,IAAI,CAAC,MAAM,EAAE,OAAO;AACpB,YAAA,IAAI,CAAC,aAAa;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CACjC;;AAGH;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK;;AAGvF;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;;;;;AAOnC;;;;;AAKG;AACH,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC;;AAG/F,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;;AAG7D,QAAA,IAAI;;YAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE;AACvC,mBAAA,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,wCAAA,CAA0C;YAE7D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CACxC,QAAQ,EACR,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CACjD;;AAGD,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,IAAI,WAAkB;YAEvD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,IAAI,iBAAiB;AAC7E,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,IAAI;;YAGzE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,IAAI,EAAE;AAC5D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;gBACxC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC;AACd,aAAA,CAAC;;AAGF,YAAA,MAAM,OAAO,GAAsB;gBACjC,WAAW,EAAE,QAAQ,CAAC,KAAK;gBAC3B,eAAe,EAAE,IAAI,CAAC,QAAQ;gBAC9B,OAAO,EAAE,IAAI,CAAC,WAAW;AACzB,gBAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,SAAS;AACT,gBAAA,MAAM,EAAE;aACT;AACD,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;YAEtC,OAAO,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,sBAAsB,CAAC,SAAS,CAA4C,0CAAA,CAAA,CAAC;AAE7F,YAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;;QAE5B,OAAO,KAAU,EAAE;AACnB,YAAA,MAAM,GAAG,GAAG,CAAA,4BAAA,EAA+B,KAAK,CAAC,OAAO,EAAE;YAC1D,OAAO,CAAC,KAAK,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC;AAC3D,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AACrB,YAAA,MAAM,KAAK;;;AAIf;;AAEG;IACK,UAAU,CAChB,OAAe,EACf,MAA2E,EAAA;AAE3E,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;QAC5B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;QACjD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;AAC7C,QAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACjE,QAAA,OAAO,GAAG,CAAC,QAAQ,EAAE;;;;;AAOvB;;AAEG;IACH,YAAY,CAAC,IAAY,EAAE,IAAS,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE;YACtC,OAAO,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,sBAAsB,CAAC,SAAS,CAA+B,6BAAA,CAAA,CAAC;YACjF;;AAGF,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,MAAM,EAAE,iBAAiB;AACzB,YAAA,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI,CAAC,WAAW;AACzB,gBAAA,OAAO,EAAE;oBACP,IAAI;AACJ,oBAAA,GAAG,IAAI;oBACP,eAAe,EAAE,IAAI,CAAC,QAAQ;AAC9B,oBAAA,SAAS,EAAE,IAAI,CAAC,GAAG;AACpB;AACF;SACF;QAED,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAsB,oBAAA,CAAA,EAAE,OAAO,CAAC;AAChF,QAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;;AAG3C;;AAEG;AACK,IAAA,sBAAsB,CAAC,cAAsB,EAAA;QACnD,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAgC,8BAAA,CAAA,EAAE,cAAc,CAAC;;AAGjG,QAAA,MAAM,cAAc,GAAyB;YAC3C,cAAc;AACd,YAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACvB,YAAA,YAAY,EAAE,IAAI,CAAC,GAAG;SACvB;AACD,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC3C,QAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;;AAGzC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;;AAGxC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;QAC1C,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,cAAc,GAAsB;AACxC,gBAAA,GAAG,OAAO;gBACV,cAAc;AACd,gBAAA,MAAM,EAAE,WAAW;AACnB,gBAAA,YAAY,EAAE,IAAI,CAAC,GAAG;aACvB;AACD,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;;;QAI3C,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;AAG5D;;AAEG;AACH,IAAA,MAAM,UAAU,GAAA;QACd,OAAO,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,sBAAsB,CAAC,SAAS,CAAgC,8BAAA,CAAA,CAAC;QAEjF,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc;;QAGnE,IAAI,IAAI,CAAC,aAAa,EAAE,gBAAgB,IAAI,cAAc,EAAE;AAC1D,YAAA,IAAI;AACF,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,KAAI;AAC1D,oBAAA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,EAAE,KAAK,CAAC;oBAEpF,OAAO,CAAC,kDAAkD,EAAE;wBAC1D,eAAe,EAAE,IAAI,CAAC,QAAQ;AAC9B,wBAAA,cAAc,EAAE,cAAc;AAC9B,wBAAA,WAAW,EAAE;qBACd,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzB,wBAAA,IAAI,EAAE,CAAC,GAAG,KAAI;4BACZ,YAAY,CAAC,OAAO,CAAC;4BACrB,OAAO,CAAC,GAAG,CAAC;yBACb;AACD,wBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;4BACb,YAAY,CAAC,OAAO,CAAC;4BACrB,MAAM,CAAC,GAAG,CAAC;;AAEd,qBAAA,CAAC;AACJ,iBAAC,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAA4B,0BAAA,CAAA,EAAE,QAAQ,CAAC;;YACvF,OAAO,KAAU,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAA+B,6BAAA,CAAA,EAAE,KAAK,CAAC;;;;;AAM5F,QAAA,IAAI,CAAC,YAAY,CAAC,0BAA0B,EAAE;YAC5C,eAAe,EAAE,IAAI,CAAC,QAAQ;AAC9B,YAAA,WAAW,EAAE;AACd,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,qBAAqB,EAAE;;AAG9B;;AAEG;AACK,IAAA,sBAAsB,CAAC,IAAS,EAAA;QACtC,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAwB,sBAAA,CAAA,EAAE,IAAI,CAAC;;AAG/E,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,qBAAqB,EAAE;;;;;AAO9B;;AAEG;AACK,IAAA,kBAAkB,CAAC,OAAe,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;;AAGxC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB;;QAGF,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAA2B,yBAAA,CAAA,EAAE,OAAO,CAAC;QAErF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,OAAO;AACrE,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,CAAC,OAAY,KAAK,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;AAC1D,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;gBACf,OAAO,CAAC,KAAK,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAkB,gBAAA,CAAA,EAAE,KAAK,CAAC;gBAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAA+B,4BAAA,EAAA,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC;;AAEnE,SAAA,CAAC;;AAGN;;AAEG;AACK,IAAA,oBAAoB,CAAC,OAAY,EAAA;QACvC,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAa,WAAA,CAAA,EAAE,OAAO,CAAC;;QAGvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO;QAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;QACzC,MAAM,IAAI,GAAG,OAAO;QAEpB,QAAQ,IAAI;AACV,YAAA,KAAK,iBAAiB;AACpB,gBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAChC;AAEF,YAAA,KAAK,yBAAyB;AAC5B,gBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;gBACtC;AAEF,YAAA,KAAK,gBAAgB;AACrB,YAAA,KAAK,iBAAiB;AACpB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBAClC;AAEF,YAAA,KAAK,YAAY;AACjB,YAAA,KAAK,0BAA0B;AAC7B,gBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;gBACjC;AAEF,YAAA;;AAEE,gBAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE;AAC9C,oBAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;;qBAC7B;oBACL,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAyB,uBAAA,CAAA,EAAE,IAAI,CAAC;;;;AAKxF;;;AAGG;AACK,IAAA,2BAA2B,CAAC,IAAS,EAAA;AAC3C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc;AAC1C,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB;AAClD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;QAE1B,OAAO,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,sBAAsB,CAAC,SAAS,4BAA4B,EAAE;YAC5E,cAAc;YACd,kBAAkB;YAClB;AACD,SAAA,CAAC;QAEF,IAAI,cAAc,EAAE;;AAElB,YAAA,MAAM,cAAc,GAAyB;gBAC3C,cAAc;AACd,gBAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACvB,gBAAA,YAAY,EAAE,IAAI,CAAC,GAAG;aACvB;AACD,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC3C,YAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;;AAGzC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;;AAGxC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;YAC1C,IAAI,OAAO,EAAE;AACX,gBAAA,MAAM,cAAc,GAAsB;AACxC,oBAAA,GAAG,OAAO;oBACV,cAAc;AACd,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,YAAY,EAAE,IAAI,CAAC,GAAG;iBACvB;AACD,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;;;AAI3C,YAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE;AACnC,gBAAA,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,IAAI,CAAC,QAAQ;gBAC9B;AACD,aAAA,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAA8C,4CAAA,CAAA,EAAE,cAAc,CAAC;;;AAInH;;AAEG;AACK,IAAA,qBAAqB,CAAC,IAAS,EAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe;AAChD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc;AAE1C,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,sBAAsB,CAAC,SAAS,CAAqB,mBAAA,CAAA,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC;AAEtG,QAAA,IAAI,KAAK,KAAK,WAAW,IAAI,cAAc,EAAE;;AAE3C,YAAA,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;;;AAI/C;;AAEG;AACK,IAAA,oBAAoB,CAAC,OAAY,EAAA;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI;QAE9B,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,KAAK,GAAyB;gBAClC,IAAI;AACJ,gBAAA,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,IAAI,SAAS;gBAChG,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;gBACvC,SAAS,EAAE,IAAI,CAAC;aACjB;;AAGD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK;YACzC,IAAI,IAAI,EAAE;AACR,gBAAA,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AACrD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,gBAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;;AAGpC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAoB,kBAAA,CAAA,EAAE,KAAK,CAAC;;;AAIhF;;AAEG;AACK,IAAA,sBAAsB,CAAC,IAAS,EAAA;QACtC,OAAO,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAwB,sBAAA,CAAA,EAAE,IAAI,CAAC;AAE/E,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,CAAC,qBAAqB,EAAE;;AAG5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;QAC1C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxB,gBAAA,GAAG,OAAO;AACV,gBAAA,MAAM,EAAE,cAAc;AACtB,gBAAA,YAAY,EAAE,IAAI,CAAC,GAAG;AACvB,aAAA,CAAC;;;;;;AAQN;;AAEG;AACK,IAAA,oBAAoB,CAAC,IAA0B,EAAA;AACrD,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAClB,sBAAsB,CAAC,qBAAqB,EAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACrB;;QACD,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAA8B,4BAAA,CAAA,EAAE,CAAC,CAAC;;;AAIvF;;AAEG;IACK,uBAAuB,GAAA;AAC7B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,qBAAqB,CAAC;YACjF,IAAI,MAAM,EAAE;gBACV,MAAM,IAAI,GAAyB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;gBAErD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,GAAG,mBAAmB,EAAE;AACxD,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;qBAE5B;oBACL,IAAI,CAAC,qBAAqB,EAAE;;;;QAGhC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAAiC,+BAAA,CAAA,EAAE,CAAC,CAAC;;;AAI1F;;AAEG;IACK,qBAAqB,GAAA;AAC3B,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,UAAU,CAAC,sBAAsB,CAAC,qBAAqB,CAAC;;QACrE,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAC,SAAS,CAA+B,6BAAA,CAAA,EAAE,CAAC,CAAC;;;;;;AAQxF;;AAEG;IACK,WAAW,CAAI,QAAgB,EAAE,IAAS,EAAA;QAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,QAAQ,EAAE,IAAI;iBAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;AAC5B,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE;AACR,aAAA,CAAC;AACN,SAAC,CAAC;;;;;IAOJ,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;;;uGA5mB/B,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA;;2FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCKY,wBAAwB,CAAA;AAqB1B,IAAA,SAAA;AACyB,IAAA,IAAA;AACxB,IAAA,mBAAA;IAtBV,MAAM,GAAW,EAAE;IACnB,SAAS,GAAW,CAAC;IACrB,aAAa,GAAW,EAAE;IAE1B,SAAS,GAAG,IAAI;IAChB,SAAS,GAAG,KAAK;IACjB,WAAW,GAAG,KAAK;IACnB,YAAY,GAAkB,IAAI;IAElC,gBAAgB,GAA6C,cAAc;IAC3E,aAAa,GAA2B,EAAE;;IAG1C,eAAe,GAAW,EAAE;IAC5B,cAAc,GAAkB,IAAI;AAE5B,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;IAC9B,qBAAqB,GAAwB,IAAI;AAEzD,IAAA,WAAA,CACS,SAAiD,EACxB,IAAyB,EACjD,mBAA2C,EAAA;QAF5C,IAAS,CAAA,SAAA,GAAT,SAAS;QACgB,IAAI,CAAA,IAAA,GAAJ,IAAI;QAC5B,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB;;IAG7B,QAAQ,GAAA;;QAEN,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;;QAGpE,IAAI,CAAC,iBAAiB,EAAE;;QAGxB,IAAI,CAAC,uBAAuB,EAAE;;IAGhC,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE;;;AAI5C;;AAEG;IACK,uBAAuB,GAAA;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE;AAElE,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,EAAE;AAClD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW;AACnC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;AAGtB,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACvB,IAAI,CAAC,qBAAqB,EAAE;;;aAEzB;;YAEL,IAAI,CAAC,cAAc,EAAE;;;AAIjB,IAAA,MAAM,cAAc,GAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AAEtB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE;AAC9D,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC3B,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AAEjC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,IAAI,CAAC,cAAc,EAAE;;QACrB,OAAO,KAAU,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,4BAA4B;;;IAI7D,iBAAiB,GAAA;;AAEvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB;AACzC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,MAAM,IAAG;AAClB,YAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM;AAC9B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW;AACrC,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM,KAAK,WAAW;;AAGzC,YAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC5D,IAAI,CAAC,qBAAqB,EAAE;;AAEhC,SAAC,CAAC;;AAGJ,QAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB;AACzC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,UAAU,IAAG;YACtB,IAAI,CAAC,cAAc,GAAG,UAAU,EAAE,cAAc,IAAI,IAAI;AAC1D,SAAC,CAAC;;AAGJ,QAAA,IAAI,CAAC,mBAAmB,CAAC,gBAAgB;AACtC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAE9B,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC/B,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;;AAEvE,SAAC,CAAC;;AAGJ,QAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS;AAC/B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;AAClD,SAAC,CAAC;;AAGN;;AAEG;IACK,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAE1B,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACnF,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;;IAGlE,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE;;AAG1C,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,IAAI;AACvC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,MAAK;AACd,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;AAEnD,YAAA,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,gBAAA,IAAI,CAAC,qBAAqB,EAAE,WAAW,EAAE;;iBACpC;gBACL,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;AAC7C,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,IAAI,IAAI,CAAC;AACtD,gBAAA,IAAI,CAAC,aAAa,GAAG,GAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;;AAE5E,SAAC,CAAC;;;;;AAON;;AAEG;AACH,IAAA,cAAc,CAAC,EAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,KAAK;AACrB,QAAA,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE;AAClB,YAAA,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM,GAAA,EAAA,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;;AAE9C,QAAA,OAAO,EAAE;;AAGX;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACvB,IAAI,CAAC,cAAc,EAAE;;AAGvB;;AAEG;IACH,eAAe,GAAA;QACb,IAAI,CAAC,cAAc,EAAE;;AAGvB;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;AACrC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,cAAc;;AAGxC;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACnB,YAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YACvC,KAAK,EAAE,IAAI,CAAC;AACb,SAAA,CAAC;;AA9MO,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,gDAsBzB,eAAe,EAAA,EAAA,EAAA,KAAA,EAAAQ,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAtBd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,+ECjCrC,49JAmIA,EAAA,MAAA,EAAA,CAAA,yyNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,KAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDlGa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,KAAK,EAAA,QAAA,EAAA,49JAAA,EAAA,MAAA,EAAA,CAAA,yyNAAA,CAAA,EAAA;;0BA0Bd,MAAM;2BAAC,eAAe;;;AEzC3B,MAAM,oBAAoB,GAAG,CAAC,MAAc,KAAY;IACtD,MAAM,KAAK,GAAG,gEAAgE;IAC9E,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,QAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;;AAElE,IAAA,OAAO,MAAM;AACf,CAAC;MAQY,qCAAqC,CAAA;AAwHvC,IAAA,MAAA;AACC,IAAA,MAAA;AACA,IAAA,kBAAA;AACA,IAAA,mBAAA;AA1HF,IAAA,aAAa,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACnD,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEb,IAAA,SAAS;AACzB,IAAA,UAAU;AACV,IAAA,QAAQ;IACR,QAAQ,GAAgC,MAAM;IAC9C,IAAI,GAAqB,OAAO;IAChC,KAAK,GAAkB,IAAI;IAC3B,QAAQ,GAAY,KAAK;AACzB,IAAA,IAAI;IACJ,IAAI,GAAkB,IAAI;IAC1B,MAAM,GAAW,EAAE;IACnB,kBAAkB,GAAY,IAAI;IAClC,UAAU,GAAQ,IAAI;IACtB,OAAO,GAAwB,IAAI;IACnC,QAAQ,GAAY,KAAK;IACzB,WAAW,GAAY,KAAK;IAC5B,aAAa,GAAY,KAAK;IAC9B,cAAc,GAAW,EAAE;IAC3B,2BAA2B,GAAY,KAAK;IAC5C,0BAA0B,GAAY,IAAI;IAC1C,eAAe,GAAY,KAAK;AAChC,IAAA,qBAAqB;AACrB,IAAA,YAAY;;IAGZ,kBAAkB,GAAiC,IAAI;AAEtD,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAE;AACrC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAE;AAC/B,IAAA,YAAY,GAAG,IAAI,YAAY,EAAO;AACtC,IAAA,aAAa,GAAG,IAAI,YAAY,EAAO;AACvC,IAAA,OAAO,GAAG,IAAI,YAAY,EAAE;AAC5B,IAAA,cAAc,GAAG,IAAI,YAAY,EAAwB;IAE1D,mBAAmB,GAAY,KAAK;IACpC,eAAe,GAAY,KAAK;IAChC,4BAA4B,GAAY,KAAK;AAC5C,IAAA,kBAAkB,GAAG,IAAI,YAAY,EAAO;IAEtD,QAAQ,GAAG,KAAK;IAChB,KAAK,GAAG,KAAK;AAEb,IAAA,UAAU;AACV,IAAA,MAAM;AAGN,IAAA,MAAM,GAAW;AACf,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,aAAa,EAAE,KAAK;AACpB,QAAA,aAAa,EAAE,KAAK;AACpB,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,aAAa,EAAE,CAAC;AAChB,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;AACpC,QAAA,eAAe,EAAE,KAAK;QACtB,iBAAiB,EAAE,IAAI;KACxB;IAED,cAAc,GAAG,IAAI;AAErB,IAAA,UAAU,GAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2CnB;AACD,IAAA,eAAe;AACf,IAAA,iBAAiB;IACjB,MAAM,GAAG,EAAE;IACX,OAAO,GAAG,KAAK;IACf,MAAM,GAAG,KAAK;AAGd,IAAA,WAAA,CACS,MAAiB,EAChB,MAAwB,EACxB,kBAAsC,EACtC,mBAA2C,EAAA;QAH5C,IAAM,CAAA,MAAA,GAAN,MAAM;QACL,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB;QAClB,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB;;IAG7B,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC;AACpE,aAAA,IAAI,CACH,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,EAC7B,WAAW,EAAE,CACd;AAEH,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC;AACvE,aAAA,IAAI,CACH,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,EAC7B,WAAW,EAAE,CACd;QAEH,IAAI,CAAC,aAAa,EAAE;;QAGpB,IAAI,CAAC,gBAAgB,EAAE;;;;;IAOzB,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAG;AAC5B,YAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;AAC7B,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAG;AACxB,YAAA,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,CAAC;AACd,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,IAAG;YACpC,IAAI,IAAI,GAAG,CAAC;AACZ,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,CAAC;;AAEpC,iBAAA,IAAI,IAAI,CAAC,KAAK,EAAE;gBACnB,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC;;iBAEjC;gBACH,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC;;AAGhC,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI;AACzB,SAAC,CAAC;;AAGJ,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;YACvB,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,YAAY;;AAEzD,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;YACzB,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,YAAY;;AAE7D,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;YACxB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,YAAY;AAClD,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK;AAC9B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE;AAClC,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI;;;AAGjC,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE;YACtB,IAAI,CAAC,aAAa,EAAE;;AAEtB,QAAA,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;YACnB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,IAAI,EAAE;YACrD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAG;AACzC,gBAAA,CAAC,CAAC,OAAO,GAAG,KAAK;AACjB,gBAAA,OAAO,CAAC;AACV,aAAC,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC;;AAEjD,QAAA,IAAG,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,YAAY,IAAI,SAAS,EAAC;AACtE,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;AACrB,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK;;AAEhC,QAAA,IAAI,OAAO,CAAC,oBAAoB,CAAC,EAAE;YACjC,IAAI,CAAC,gBAAgB,EAAE;;;IAI3B,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY;;AAGvD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe;;AAG7D,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe;;AAG7D,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa;;AAGzD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa;;AAGzD,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK;AAC9B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI;;AAG/B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU;AACjD,YAAA,IAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAC;AAC5B,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK;;;AAIlC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ;;AAG/C,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK;AACvC,YAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;AAC9B,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;;;AAIzB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI;;AAGvC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU;;AAGnD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa;;AAGzD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;;AAG3C,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU;;AAGnD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe;;QAG7D,IAAI,IAAI,CAAC,OAAO,EAAE,iBAAiB,KAAK,SAAS,EAAE;YACjD,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB;;;AAInE;;;;AAIG;AACK,IAAA,iBAAiB,CAAC,KAAe,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7C,OAAO,IAAI,CAAC;;QAGd,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnF,MAAM,YAAY,GAAa,EAAE;AAEjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE;YAErE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AAC1C,gBAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;;AAIhC,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/C,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CACtB,CAAyB,sBAAA,EAAA,eAAe,CAAU,OAAA,EAAA,gBAAgB,qBAAqB,EACvF,OAAO,EACP,IAAI,CACL;AACD,YAAA,OAAO,KAAK;;AAGd,QAAA,OAAO,IAAI;;IAGb,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;SAC3B,EAAE,EAAE,CAAC;;AAGR,IAAA,iBAAiB,CAAC,UAAqB,GAAA,IAAI,CAAC,MAAM,EAAE,UAAU,EAAA;QAC5D,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE;;AAG9C,IAAA,MAAM,iBAAiB,GAAA;;QAErB,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,YAAY,IAAI,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,KAAK,UAAU,EAAE;AAC5J,YAAA,IAAI;;AAEF,gBAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;;YAC7B,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,GAAG,CAAC,sDAAsD,EAAE,KAAK,CAAC;;gBAE1E,IAAI,CAAC,iBAAiB,EAAE;;;aAErB;;YAEL,IAAI,CAAC,iBAAiB,EAAE;;;AAQpB,IAAA,MAAM,gBAAgB,GAAA;AAC5B,QAAA,IAAI;;YAEF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC/D,YAAA,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;;YAG3E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;AACvD,gBAAA,KAAK,EAAE;oBACL,UAAU,EAAE,aAAa;AACzB,oBAAA,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,EAAE;AAC5C,oBAAA,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI;AAC5C;AACF,aAAA,CAAC;;AAGF,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC;;QAE1C,OAAO,KAAU,EAAE;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAE/C,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,iEAAiE,EAAE,OAAO,EAAE,IAAI,CAAC;;AACrG,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE;gBACzC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,kDAAkD,EAAE,OAAO,EAAE,IAAI,CAAC;;iBACtF;gBACL,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,uDAAuD,EAAE,OAAO,EAAE,IAAI,CAAC;gBAChG,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,YAAA,MAAM,KAAK;;;IAIP,eAAe,CAAC,MAAmB,EAAE,YAAgC,EAAA;QAC3E,IAAI,aAAa,GAAG,MAAM;QAC1B,IAAI,kBAAkB,GAAG,CAAC;;QAG1B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,QAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;;;;;;;KAiBrB;;QAGD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;KAwBnB;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;QAGhC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACnD,QAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;iBAMjB,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;;;;;;KAM3C;;QAGD,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACpD,QAAA,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;KAQ9B;;QAGD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;KAQrB;AACD,QAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,QAAA,KAAK,CAAC,WAAW,GAAG,IAAI;AACxB,QAAA,KAAK,CAAC,SAAS,GAAG,aAAa;;QAG/B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;QAGnC,IAAI,eAAe,GAAuB,IAAI;QAC9C,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,YAAA,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;YAClD,eAAe,CAAC,SAAS,GAAG;;OAE3B;AACD,YAAA,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;mBAOnB,IAAI,CAAC,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;;;;;;;;;;;;;;;;OAgBnD;AAED,YAAA,eAAe,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAClD,gBAAA,eAAgB,CAAC,KAAK,CAAC,UAAU,GAAG,oBAAoB;AACxD,gBAAA,eAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa;AAClD,aAAC,CAAC;AAEF,YAAA,eAAe,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAClD,gBAAA,eAAgB,CAAC,KAAK,CAAC,UAAU,GAAG,oBAAoB;AACxD,gBAAA,eAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU;AAC/C,aAAC,CAAC;AAEF,YAAA,cAAc,CAAC,WAAW,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,QAAA,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;iBAKd,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;;;;KAI3C;;QAGD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QACnD,UAAU,CAAC,SAAS,GAAG;;;;;QAKnB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,eAAe;KACvC;AACD,QAAA,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG;;;;iBAId,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;;;;;;;mBAOlC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAE,OAAO,CAAA;;;;;;;;KAQ7C;AAED,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAC7C,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa;AAC1C,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,mCAAmC;AAClE,SAAC,CAAC;AAEF,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAC7C,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU;AACvC,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,mCAAmC;AAClE,SAAC,CAAC;;QAGF,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QACnD,UAAU,CAAC,SAAS,GAAG;;;;;QAKnB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,cAAc;KACtC;AACD,QAAA,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG;;;;iBAId,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;;;;;;;mBAOlC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAE,OAAO,CAAA;;;;;;;;KAQ7C;AAED,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAC7C,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa;AAC1C,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,mCAAmC;AAClE,SAAC,CAAC;AAEF,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAC7C,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU;AACvC,YAAA,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,mCAAmC;AAClE,SAAC,CAAC;;QAGF,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QAClD,SAAS,CAAC,SAAS,GAAG;;;;;QAKlB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,cAAc;KACtC;AACD,QAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG;;;;iBAIb,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;;;;;;;mBAOlC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAE,OAAO,CAAA;;;;;;;;;KAS7C;AAED,QAAA,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAC5C,YAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,0BAA0B;AACvD,YAAA,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa;AAC3C,SAAC,CAAC;AAEF,QAAA,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;AAC5C,YAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,0BAA0B;AACvD,YAAA,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU;AACxC,SAAC,CAAC;;AAGF,QAAA,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC;AACjC,QAAA,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC;AAClC,QAAA,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC;AAClC,QAAA,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;AACjC,QAAA,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC;AACzC,QAAA,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC;AACrC,QAAA,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC;AAChC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;QAGhC,IAAI,eAAe,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9D,YAAA,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAW;AACnD,gBAAA,IAAI;;AAEF,oBAAA,eAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;AACtC,oBAAA,eAAgB,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;oBAC7C,eAAgB,CAAC,SAAS,GAAG;;;;;WAK5B;;oBAGD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;oBACjD,SAAS,CAAC,WAAW,GAAG;;;;;WAKvB;oBACD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE;AAChD,wBAAA,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC;AACjD,wBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;;;AAItC,oBAAA,aAAa,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;;oBAGxD,kBAAkB,GAAG,CAAC,kBAAkB,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM;;oBAGnE,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;AAC1D,wBAAA,KAAK,EAAE;AACL,4BAAA,QAAQ,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,QAAQ;AACnD,4BAAA,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AACtB,4BAAA,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI;AACtB;AACF,qBAAA,CAAC;oBAEF,aAAa,GAAG,SAAS;AACzB,oBAAA,KAAK,CAAC,SAAS,GAAG,SAAS;;oBAG3B,UAAU,CAAC,MAAK;AACd,wBAAA,eAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AACpC,wBAAA,eAAgB,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;wBAC7C,eAAgB,CAAC,SAAS,GAAG;;aAE5B;qBACF,EAAE,GAAG,CAAC;;gBACP,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;oBAC/C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,4CAA4C,EAAE,OAAO,EAAE,IAAI,CAAC;;AAGrF,oBAAA,eAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AACpC,oBAAA,eAAgB,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;oBAC7C,eAAgB,CAAC,SAAS,GAAG;;WAE5B;;AAEL,aAAC,CAAC;;;AAIJ,QAAA,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AACxC,YAAA,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC;YAC7C,IAAI,CAAC,iBAAiB,EAAE;AAC1B,SAAC,CAAC;;AAGF,QAAA,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;;YAExC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,YAAA,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;OAW5B;;YAGD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;YAClD,UAAU,CAAC,WAAW,GAAG;;;;;;OAMxB;YACD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC,EAAE;AACjD,gBAAA,UAAU,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC;AACnD,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;;AAGvC,YAAA,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC;;YAGxC,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,YAAY,CAAC,UAAU,EAAE;AAC3B,oBAAA,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC;;aAEpD,EAAE,GAAG,CAAC;;AAGP,YAAA,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW;;YAGjC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;;AAG3B,YAAA,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC;;AAG7C,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,KAAI;gBAC3B,IAAI,IAAI,EAAE;;AAER,oBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,kBAAkB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;AAChE,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,YAAY,EAAE,IAAI,CAAC,GAAG;AACvB,qBAAA,CAAC;;AAGF,oBAAA,MAAM,SAAS,GAAG;AAChB,wBAAA,MAAM,EAAE;4BACN,KAAK,EAAE,CAAC,IAAI,CAAC;AACb,4BAAA,KAAK,EAAE;AACR,yBAAA;AACD,wBAAA,cAAc,EAAE,MAAK;qBACtB;;AAGD,oBAAA,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;;AAEtC,aAAC,EAAE,YAAY,EAAE,GAAG,CAAC;AACvB,SAAC,CAAC;;AAGF,QAAA,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AACvC,YAAA,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC;AAC/C,SAAC,CAAC;;AAGF,QAAA,MAAM,cAAc,GAAG,CAAC,CAAgB,KAAI;AAC1C,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;AACtB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC;AAC7C,gBAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;;AAE3D,SAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;;IAG9C,kBAAkB,CAAC,MAAmB,EAAE,KAAkB,EAAA;;AAEhE,QAAA,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;;AAGjD,QAAA,IAAI,KAAK,CAAC,UAAU,EAAE;AACpB,YAAA,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;;;AAIvC,IAAA,MAAM,YAAY,CAAC,KAAU,EAAE,KAAA,GAAgB,CAAC,CAAC,EAAA;AAC/C,QAAA,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC;QACnC,KAAK,CAAC,cAAc,EAAE;QAEtB,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;;AAGvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;QAChC,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,wBAAwB,EAAE,OAAO,EAAE,IAAI,CAAC;YACjE;;;AAIF,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;YAC7D;;AAGF,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;AACjE,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,+BAA+B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAS,OAAA,CAAA,EAAE,OAAO,EAAE,IAAI,CAAC;YACnG;;AAGF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,IAAI,cAAc,GAAU,EAAE;;AAG9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AACzC,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM;YAClD,MAAM,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAE,CAAA;YACnC,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI,CAAC,2BAA2B,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG;AAClG,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AACpC,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC;;aAClD;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;;QAEnE,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;AAC7C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,GAAG,UAAU,GAAG,GAAG,GAAG,GAAG;AAC7E,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;SAClJ,CAAC,CAAC;AAEH,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;AAC3B,YAAA,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;;AAGzC,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AAEjC,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,cAAc,EAAE;;AAIrB,QAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;;IAGzB,MAAM,YAAY,CAAC,IAAU,EAAE,cAAqB,EAAE,KAAa,EAAE,MAAe,EAAA;AAClF,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;YAC7D,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAE,CAAA,EAAE,OAAO,EAAE,IAAI,CAAC;YAC7I;;AAGF,QAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,YAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,YAAA,MAAM,CAAC,MAAM,GAAG,OAAO,CAAM,KAAI;AAC/B,gBAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI;AACxB,gBAAA,IAAI,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM;AAE9H,gBAAA,IAAI;AACF,oBAAA,IAAI,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,EAAE;AACzI,oBAAA,IAAI,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa;;oBAGlD,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAExD,oBAAA,IAAI,gBAAgB,GAAG;wBACrB,MAAM,EAAE,MAAM,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAE,CAAA;AACtC,wBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO;wBACjD,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU;AAClD,wBAAA,SAAS,EAAE,UAAU,CAAC,WAAW;AACjC,wBAAA,EAAE,EAAE,IAAI;AACR,wBAAA,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI;AACrC,wBAAA,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;qBAC3D;;AAGD,oBAAA,IAAG,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACzC,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,gBAAgB,EAAC;;oBAG3E,IAAI,CAAC,gBAAgB,EAAE;AACvB,oBAAA,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC;;AAGrC,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,SAAS,EAAE;;AAG5E,oBAAA,IAAG,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACzC,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC;wBACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK;;AAEtC,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW;;oBAExE,IAAI,CAAC,gBAAgB,EAAE;AAEvB,oBAAA,OAAO,EAAE;;gBACT,OAAO,KAAU,EAAE;;AAEnB,oBAAA,IAAG,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;wBACzC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK;;AAExC,oBAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC;AACnC,oBAAA,OAAO,EAAE;;AAEb,aAAC;AAED,YAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAChC,SAAC,CAAC;;AAGJ,IAAA,YAAY,CAAC,IAAS,EAAA;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,IAAI,IAAI,IAAI,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE;AAC5B,gBAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC;;gBAGxD,IAAI,aAAa,GAAU,EAAE;gBAC7B,IAAI,MAAM,GAAU,EAAE;gBACtB,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,KAAI;AAC3B,oBAAA,IAAI,CAAC,EAAE,UAAU,EAAE;;AAEjB,wBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW;;wBAEtC,aAAa,CAAC,IAAI,CAAC;4BACjB,MAAM,EAAE,CAAC,CAAC,MAAM;AAChB,4BAAA,WAAW,EAAE;AACd,yBAAA,CAAC;wBACF,MAAM,CAAC,IAAI,CAAC;AACV,4BAAA,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ;4BAChC,WAAW,EAAE,KAAK;AAClB,4BAAA,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU;AACpC,4BAAA,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE;;AAE1B,yBAAA,CAAC;;AAEJ,oBAAA,OAAO,CAAC;AACV,iBAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,IAAI,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;AACtM,oBAAA,IAAI,EAAE,CAAC,EAAO,KAAI;wBAChB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAS,EAAE,GAAW,KAAI;;AAEvC,4BAAA,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC;4BACxC,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,EAAE,MAAM,CAAC;;AAGvF,4BAAA,IAAG,aAAa,KAAK,CAAC,CAAC,EAAE;gCACvB,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC;;AAG1F,4BAAA,IAAG,aAAa,KAAK,CAAC,CAAC,EAAC;AACtB,gCAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG;AAC/B,oCAAA,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACjC,oCAAA,OAAO,EAAE,KAAK;AACd,oCAAA,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;AACpB,oCAAA,KAAK,EAAE,IAAI,CAAC,KAAK;iCAClB;;AAEL,yBAAC,CAAC;wBACF,IAAI,CAAC,QAAQ,EAAE;wBACf,OAAO,CAAC,EAAE,CAAC;qBACZ;AACD,oBAAA,KAAK,EAAE,CAAC,KAAU,KAAO,EAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvG,iBAAA,CAAC;;iBAEG;gBACL,OAAO,CAAC,KAAK,CAAC;;AAElB,SAAC,CAAC;;AAGJ,IAAA,WAAW,CAAC,KAAU,EAAE,CAAM,EAAE,KAAa,EAAE,GAAQ,EAAA;QACrD,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACnC,YAAA,IAAI,cAAc,GAAiB;AACjC,gBAAA,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,cAAc;AACjD,gBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,8CAA8C,CAAC;AACrH,gBAAA,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,IAAI,iBAAiB;AAC5D,gBAAA,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,QAAQ;AACzC,gBAAA,iBAAiB,EAAE,IAAI,CAAC,YAAY,EAAE,iBAAiB,IAAI,aAAa;AACxE,gBAAA,kBAAkB,EAAE,CAAsB,mBAAA,EAAA,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAE,CAAA;AACjF,gBAAA,gBAAgB,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,IAAI,IAAI;AAC7D,gBAAA,iBAAiB,EAAE,CAAqB,kBAAA,EAAA,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAE;aAC/E;AAED,YAAA,MAAM,UAAU,GAAG,CAAC,yBAAyB,CAAC;AAC9C,YAAA,IAAG,IAAI,CAAC,YAAY,EAAE,UAAU,EAAC;gBAC/B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;;YAG/C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;AACjE,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC;YAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;AAChD,gBAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC;gBACzD,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;;AAEvC,aAAC,CAAC;;aAEC;YACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;;;;AAKvC,IAAA,WAAW,CAAC,KAAU,EAAE,KAAa,EAAE,GAAQ,EAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI;AACrC,QAAA,IAAI,GAAG,EAAE,EAAE,EAAE;YACX,OAAO,GAAG,CAAC,UAAU;YACrB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;;aAEvC;AACH,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,QAAQ,EAAE;;;AAInB,IAAA,mBAAmB,CAAC,GAAQ,EAAE,KAAa,EAAE,WAAoB,KAAK,EAAA;AACpE,QAAA,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAM,KAAI;AACnF,YAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACnC,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;;AAE1D,SAAC,EACD,CAAC,GAAQ,KAAO,EAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA,EAAE,CAAC;;AAGnG,IAAA,MAAM,WAAW,CAAC,KAAU,EAAE,KAAA,GAAgB,CAAC,CAAC,EAAA;AAC9C,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC;QAClC,KAAK,CAAC,cAAc,EAAE;QAEtB,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;;AAGvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;QAChC,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC;YAC/D;;;AAIF,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;YAC7D;;AAGF,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;AACjE,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,+BAA+B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAQ,MAAA,CAAA,EAAE,OAAO,EAAE,IAAI,CAAC;YAClG;;AAGF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,IAAI,aAAa,GAAU,EAAE;;AAG7B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AACzC,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM;YAClD,MAAM,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAE,CAAA;YACnC,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI,CAAC,2BAA2B,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG;AAClG,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AACpC,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC;;aAClD;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;;QAEnE,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;AAC7C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,GAAG,UAAU,GAAG,GAAG,GAAG,GAAG;AAC7E,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;SAChJ,CAAC,CAAC;AAEH,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;AAC3B,YAAA,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;;AAGvC,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AAEjC,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,cAAc,EAAE;;AAGrB,QAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;;IAGzB,MAAM,WAAW,CAAC,IAAU,EAAE,aAAoB,EAAE,KAAa,EAAE,MAAe,EAAA;AAChF,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;YAC7D,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAE,CAAA,EAAE,OAAO,EAAE,IAAI,CAAC;YAC7I;;AAGF,QAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,YAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,YAAA,MAAM,CAAC,MAAM,GAAG,OAAO,CAAM,KAAI;AAC/B,gBAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI;gBACxB,IAAI,MAAM,GAAG,IAAI,UAAU,CAAc,MAAM,CAAC,MAAM,CAAC;AAEvD,gBAAA,IAAI;AACF,oBAAA,IAAI,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,EAAE;AACzI,oBAAA,IAAI,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa;AAElD,oBAAA,IAAI,eAAe,GAAG;wBACpB,MAAM,EAAE,MAAM,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAE,CAAA;AACtC,wBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW;AAChE,wBAAA,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI;wBAC5D,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM;AACrD,wBAAA,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;qBAC3D;;AAGD,oBAAA,IAAG,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACzC,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,eAAe,EAAC;;oBAG1E,IAAI,CAAC,gBAAgB,EAAE;AACvB,oBAAA,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;;AAGnC,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE;;AAG5E,oBAAA,IAAG,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACzC,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC;wBACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK;;AAEtC,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW;;oBAExE,IAAI,CAAC,gBAAgB,EAAE;AAEvB,oBAAA,OAAO,EAAE;;gBACT,OAAO,KAAU,EAAE;;AAEnB,oBAAA,IAAG,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;wBACzC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK;;AAExC,oBAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC;AACnC,oBAAA,OAAO,EAAE;;AAEb,aAAC;AAED,YAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAChC,SAAC,CAAC;;AAGJ,IAAA,WAAW,CAAC,IAAS,EAAA;QACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,gBAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,IAAI,CAAC;;gBAGvD,IAAI,aAAa,GAAU,EAAE;gBAC7B,IAAI,KAAK,GAAU,EAAE;gBACrB,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,KAAI;AAC3B,oBAAA,IAAI,CAAC,EAAE,UAAU,EAAE;;AAEjB,wBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW;;wBAEtC,aAAa,CAAC,IAAI,CAAC;4BACjB,MAAM,EAAE,CAAC,CAAC,MAAM;AAChB,4BAAA,WAAW,EAAE;AACd,yBAAA,CAAC;wBACF,KAAK,CAAC,IAAI,CAAC;AACT,4BAAA,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ;4BAChC,WAAW,EAAE,KAAK;AAClB,4BAAA,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU;AACpC,4BAAA,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE;;AAE1B,yBAAA,CAAC;;AAEJ,oBAAA,OAAO,CAAC;AACV,iBAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;AACpM,oBAAA,IAAI,EAAE,CAAC,EAAO,KAAI;wBAChB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAS,EAAE,GAAW,KAAI;;AAEvC,4BAAA,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC;4BACvC,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,EAAE,MAAM,CAAC;;AAGtF,4BAAA,IAAG,aAAa,KAAK,CAAC,CAAC,EAAE;gCACvB,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC;;AAG1F,4BAAA,IAAG,aAAa,KAAK,CAAC,CAAC,EAAC;AACtB,gCAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG;AAC/B,oCAAA,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACjC,oCAAA,OAAO,EAAE,KAAK;AACd,oCAAA,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;AACpB,oCAAA,KAAK,EAAE,IAAI,CAAC,KAAK;iCAClB;;AAEL,yBAAC,CAAC;wBACF,IAAI,CAAC,QAAQ,EAAE;wBACf,OAAO,CAAC,EAAE,CAAC;qBACZ;AACD,oBAAA,KAAK,EAAE,CAAC,KAAU,KAAO,EAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvG,iBAAA,CAAC;;iBACG;gBACL,OAAO,CAAC,KAAK,CAAC;;AAElB,SAAC,CAAC;;AAGJ,IAAA,UAAU,CAAC,KAAU,EAAE,CAAM,EAAE,KAAa,EAAE,IAAS,EAAA;QACrD,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACnC,YAAA,IAAI,cAAc,GAAiB;AACjC,gBAAA,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,aAAa;AAChD,gBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,6CAA6C,CAAC;AACpH,gBAAA,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,IAAI,iBAAiB;AAC5D,gBAAA,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,QAAQ;AACzC,gBAAA,iBAAiB,EAAE,IAAI,CAAC,YAAY,EAAE,iBAAiB,IAAI,aAAa;AACxE,gBAAA,kBAAkB,EAAE,CAAsB,mBAAA,EAAA,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAE,CAAA;AACjF,gBAAA,gBAAgB,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,IAAI,IAAI;AAC7D,gBAAA,iBAAiB,EAAE,CAAqB,kBAAA,EAAA,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAE;aAC/E;AAED,YAAA,MAAM,UAAU,GAAG,CAAC,yBAAyB,CAAC;AAC9C,YAAA,IAAG,IAAI,CAAC,YAAY,EAAE,UAAU,EAAC;gBAC/B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;;YAG/C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;AACjE,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC;YAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;AAChD,gBAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC;gBACzD,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;;AAEvC,aAAC,CAAC;;aAEC;YACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;;;AAIvC,IAAA,UAAU,CAAC,KAAU,EAAE,KAAa,EAAE,IAAS,EAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI;AACrC,QAAA,IAAI,IAAI,EAAE,EAAE,EAAE;YACZ,OAAO,IAAI,CAAC,UAAU;YACtB,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;;aAEvC;AACH,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;;AAIjC,IAAA,kBAAkB,CAAC,IAAS,EAAE,KAAa,EAAE,QAAQ,GAAG,KAAK,EAAA;AAC3D,QAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAM,KAAI;AACpF,YAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;;YAExD,IAAI,CAAC,QAAQ,EAAE;AACjB,SAAC,EACD,CAAC,GAAQ,KAAO,EAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA,EAAE,CAAC;;IAGnG,QAAQ,GAAA;;QAEN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;;AAGvC,IAAA,MAAM,YAAY,CAAC,GAAW,EAAE,QAAgB,EAAA;AAC9C,QAAA,IAAI;;AAEF,YAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAChC,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,OAAO,EAAE;AACP,oBAAA,cAAc,EAAE,0BAA0B;AAC3C,iBAAA;AACF,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,EAAuB,QAAQ,CAAC,MAAM,CAAE,CAAA,CAAC;;AAG3D,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;AAGlC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE;AACnB,gBAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;;;YAI1D,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;YACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACtC,YAAA,EAAE,CAAC,IAAI,GAAG,OAAO;AACjB,YAAA,EAAE,CAAC,QAAQ,GAAG,QAAQ;AACtB,YAAA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;;AAGzB,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,KAAK,EAAE;AACV,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;;YAG7B,UAAU,CAAC,MAAK;AACd,gBAAA,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;aAC7B,EAAE,GAAG,CAAC;;QAEP,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC;;AAGzE,YAAA,IAAI;gBACF,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACtC,gBAAA,EAAE,CAAC,IAAI,GAAG,GAAG;AACb,gBAAA,EAAE,CAAC,QAAQ,GAAG,QAAQ;AACtB,gBAAA,EAAE,CAAC,MAAM,GAAG,QAAQ;AACpB,gBAAA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAEzB,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,KAAK,EAAE;AACV,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;;YAE7B,OAAO,aAAa,EAAE;AACtB,gBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,aAAa,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,+DAA+D,EAAE,OAAO,EAAE,IAAI,CAAC;;;;IAK9G,YAAY,GAAQ,IAAI;AACxB,IAAA,UAAU,GAAW,GAAG,CAAC;AAEzB,IAAA,YAAY,CAAC,IAAS,EAAA;AACpB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AAC7B,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;iBACf;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;wBAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;AAEjC,iBAAC,EAAE,IAAI,CAAC,UAAU,CAAC;;;aAGlB;AACH,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;;AAIvB,IAAA,QAAQ,CAAC,IAAS,EAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;YAC9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;;;IAIlD,iBAAiB,CAAC,GAAW,EAAE,KAAa,EAAA;AAC1C,QAAA,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AACxF,YAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;;aAE7B,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;;;;;AAK5B,aAAA,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AAC7F,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC;;aAE9B;AACH,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;;;AAIjC,IAAA,sBAAsB,CAAC,GAAW,EAAA;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC3D,YAAA,UAAU,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;YACnC,IAAI,EAAE,EAAE,GAAG,EAAE;AACd,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;AAChD,YAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC;AAC9C,SAAC,CAAC;;IAGJ,cAAc,CAAC,MAAc,EAAE,QAA4B,EAAA;AACzD,QAAA,IAAI,UAAU,GAAyB;AACrC,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,QAAQ,EAAE;SACX;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACzD,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK;YACrC,MAAM,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK;YACtC,SAAS,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK;YACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM;YACzC,UAAU,EAAE,CAAC,iBAAiB,CAAC;AAC/B,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,YAAY,EAAE,KAAK;AACpB,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;AAChD,YAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;AACzC,SAAC,CAAC;;AAGJ,IAAA,kBAAkB,CAAC,GAAW,EAAA;QAC5B,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAC/B,IAAI,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,CAAC;AAClD,QAAA,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,MAAM,EAAE;AACnE,YAAA,OAAO,IAAI;;aAER;AACH,YAAA,OAAO,KAAK;;;IAIhB,0BAA0B,GAAA;AACxB,QAAA,IAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC;YAC7C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE;AAClF,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,oBAAA,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;AACpC,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,QAAQ,EAAE,IAAI;AACd,oBAAA,UAAU,EAAE;AACb,iBAAA,CAAC;;;aAGF;AACF,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAS,KAAI;AACnD,gBAAA,OAAO,EAAC,GAAG,IAAI,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAC;AAC1F,aAAC,CAAC;;;AAIN,IAAA,gBAAgB,CAAC,IAAS,EAAA;AACxB,QAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,IAAI,CAAC;QAErD,IAAI,OAAO,GAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AACzC,QAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC;AAE3D,QAAA,IAAG,OAAO,IAAI,OAAO,IAAI,EAAE,EAAC;YAC1B,IAAI,WAAW,GAAU,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC;AAC5C,YAAA,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,WAAW,CAAC;YAE1E,WAAW,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAG;gBAC9D,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;qBACjB;AACF,oBAAA,CAAC,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE;;AAEb,gBAAA,OAAO,CAAC;AACV,aAAC,CAAC;AAEF,YAAA,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAC/B,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAG,EAAA,OAAO,EAAE;;aAE1B;AACF,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiC3B,IAAA,YAAY,CAAC,IAAS,EAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,eAAe,EAAE,EAAC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAC,CAAC,CAAC,SAAS,CAAC;AAC7H,YAAA,IAAI,EAAE,CAAC,EAAO,KAAI;AAChB,gBAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;gBACvD,IAAI,CAAC,QAAQ,EAAE;aAChB;AACD,YAAA,KAAK,EAAE,CAAC,GAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG;AACtD,SAAA,CAAC;;;IAIJ,UAAU,GAAG,KAAK;IAClB,eAAe,GAAkB,IAAI;IACrC,eAAe,GAAkB,IAAI;AAErC,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAG7B,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE;AACrD,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;;;AAIhC,IAAA,WAAW,CAAC,KAAkB,EAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AAEtB,QAAA,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe;QAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;QAE9D,IAAI,WAAW,GAAkB,IAAI;AAErC,QAAA,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACzB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACzC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAEnE,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE;AAClD,gBAAA,IACE,eAAe,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI;AAC9B,oBAAA,eAAe,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK;AAC/B,oBAAA,eAAe,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG;AAC7B,oBAAA,eAAe,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,EAChC;oBACA,WAAW,GAAG,KAAK;;;AAGzB,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,GAAG,WAAW;;AAGpC,IAAA,gBAAgB,CAAC,KAAa,EAAA;QAC5B,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE;AACrD,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;;;IAIhC,gBAAgB,GAAA;;;IAIhB,WAAW,GAAA;;;AAGT,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;;AAIzB,IAAA,IAAI,CAAC,KAAyB,EAAA;;AAE5B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,aAAa;AAC9F,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,YAAY;;QAG7F,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;AAChD,QAAA,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;AACxC,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;AAC7B,YAAA,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;YACjE,gBAAgB,EAAE,WAAW,GAAG,CAAC;YACjC,KAAK,EAAE,WAAW,EAAE;AACrB,SAAA,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,WAAW,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,eAAe,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,eAAe,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,CAAC,YAAY,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC,aAAa,CAAC;;AAG9D,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAG3B,QAAA,IAAI,WAAW,KAAK,WAAW,EAAE;AAC/B,YAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;YAC/C;;;QAIF,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAExC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C;;;AAIF,QAAA,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;;AAGtD,QAAA,IAAI,CAAC,UAAU,GAAG,WAAW;;QAG7B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,WAAW,EAAE,KAAK,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,WAAW,GAAG,CAAC,CAAC;AACrE,QAAA,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;AAExC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;;IAG3B,cAAc,CAAC,gBAAyB,KAAK,EAAA;;;AAG3C,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,KAAI;AACjE,YAAA,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,EAAC;AACzC,SAAC,CAAC;QAEF,IAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,EAAE,cAAc,EAAC;;AAExD,YAAA,IAAI,WAAW,GAAU,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;YAC3F,IAAI,KAAK,GAAU,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE;AACrF,YAAA,KAAK,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,IAAG;AACrB,gBAAA,OAAO,EAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,IAAI,CAAC,EAAC;AAChD,aAAC,CAAC;AAEF,YAAA,IAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACnB,gBAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,IAAI,eAAe,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,oBAAA,IAAI,EAAE,CAAC,EAAO,KAAI;wBAChB,IAAG,aAAa,EAAC;AACf,4BAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;;6BAErD;;AAEF,4BAAA,IAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gCACzB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,GAAG,OAAO,GAAG,MAAM,CAAiC,+BAAA,CAAA,EAAE,SAAS,EAAE,IAAI,CAAC;;;wBAG5H,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;qBAC9C;oBACD,KAAK,EAAE,CAAC,GAAQ,KAAO,EAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnF,iBAAA,CAAC;;iBACG;;gBAEL,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;;;aAG7C;YACF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;;;AAIjD,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI,OAAO,GAAQ,IAAI,EAAE,IAAI,EAAE;QAC/B,IAAI,WAAW,GAAU,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC;AAE5C,QAAA,OAAO,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;;;;;AAO/C;;AAEG;IACH,uBAAuB,GAAA;AACrB,QAAA,OAAO,CAAC,EACN,IAAI,CAAC,kBAAkB,EAAE,OAAO;YAChC,IAAI,CAAC,kBAAkB,EAAE,aAAa;YACtC,CAAC,IAAI,CAAC,QAAQ;AACd,YAAA,CAAC,IAAI,CAAC,KAAK,CACZ;;AAGH;;;AAGG;IACK,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE;YAC9E,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC;;AAG3D,YAAA,IAAI,CAAC,mBAAmB,CAAC,gBAAgB;AACtC,iBAAA,IAAI,CAACC,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC7B,SAAS,CAAC,KAAK,IAAG;AACjB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,aAAC,CAAC;;;AAIR;;AAEG;AACK,IAAA,kBAAkB,CAAC,KAA2B,EAAA;AACpD,QAAA,OAAO,CAAC,GAAG,CAAC,wDAAwD,EAAE,KAAK,CAAC;;AAG5E,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACrE,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAoB,iBAAA,EAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA,eAAA,CAAiB,EAAE,eAAe,CAAC;YACjG;;;AAIF,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;AACvB,YAAA,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;AAC1B,YAAA,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;AACzB,YAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;AAC7B,YAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;AAC7B,YAAA,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;AACrB,YAAA,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;AACjC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;AACpC,YAAA,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC;SACnB;AAED,QAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AACpC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;;aACxB;AACL,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;;QAGlC,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,cAAc,CACxB,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,GAAG,MAAM,CAA8B,4BAAA,CAAA,EACzE,eAAe,EACf,IAAI,CACL;;AAGH;;AAEG;IACH,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,gCAAgC,EAAE,eAAe,CAAC;YAC3E;;AAGF,QAAA,MAAM,UAAU,GAAwB;AACtC,YAAA,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,oBAAoB;AACvD,YAAA,QAAQ,EAAE,CAAA,4BAAA,EAA+B,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAG,OAAO,CAA0B,wBAAA,CAAA;AAC7G,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,SAAS,EAAE;AACT,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA,EAAG,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAE,CAAA;AACpE,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;gBAChE,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,gBAAA,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;AAClC,gBAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACxB,gBAAA,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;AAC3B;SACF;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;YAC3D,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,OAAO;AACvC,YAAA,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,CAAC,oBAAoB,CAAC;AAClC,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,YAAY,EAAE;AACf,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;AAChD,YAAA,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,MAAM,CAAC;;AAEzE,SAAC,CAAC;;AAGJ;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;;AAG5C;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;;IAGvC,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;uGAv5Df,qCAAqC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAY,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAL,IAAA,CAAA,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAM,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qCAAqC,upCC7BlD,gogDA2PA,EAAA,MAAA,EAAA,CAAA,2yOAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FD9Na,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBANjD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oCAAoC,cAClC,KAAK,EAAA,QAAA,EAAA,gogDAAA,EAAA,MAAA,EAAA,CAAA,2yOAAA,CAAA,EAAA;iLAQQ,SAAS,EAAA,CAAA;sBAAjC,KAAK;uBAAC,EAAC,QAAQ,EAAE,IAAI,EAAC;gBACd,UAAU,EAAA,CAAA;sBAAlB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,2BAA2B,EAAA,CAAA;sBAAnC;gBACQ,0BAA0B,EAAA,CAAA;sBAAlC;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,qBAAqB,EAAA,CAAA;sBAA7B;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAES,gBAAgB,EAAA,CAAA;sBAAzB;gBACS,UAAU,EAAA,CAAA;sBAAnB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBACS,aAAa,EAAA,CAAA;sBAAtB;gBACS,OAAO,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAEQ,mBAAmB,EAAA,CAAA;sBAA3B;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,4BAA4B,EAAA,CAAA;sBAApC;gBACS,kBAAkB,EAAA,CAAA;sBAA3B;;;AE5CH,MAAM,SAAS,GAAG;IAChB,gBAAgB;IAChB,aAAa;IACb,iBAAiB;IACjB,wBAAwB;IACxB,cAAc;IACd,eAAe;IACf,eAAe;CAChB;MA8BY,kCAAkC,CAAA;uGAAlC,kCAAkC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAlC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kCAAkC,iBAzB3C,qCAAqC;YACrC,wBAAwB;YACxB,sBAAsB;YACtB,2BAA2B;YAC3B,qBAAqB;YACrB,iBAAiB;YACjB,uBAAuB;YACvB,8BAA8B;AAC9B,YAAA,wBAAwB,aAGxB,YAAY;YACZ,gBAAgB;YAChB,0BAA0B;YAC1B,WAAW;YACX,mBAAmB;AACnB,YAAA,eAAe,EA5BjB,gBAAgB;YAChB,aAAa;YACb,iBAAiB;YACjB,wBAAwB;YACxB,cAAc;YACd,eAAe;YACf,eAAe,EAwBb,cAAc,CAAA,EAAA,OAAA,EAAA,CAGd,qCAAqC;YACrC,wBAAwB,CAAA,EAAA,CAAA;AAGf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kCAAkC,YAd3C,YAAY;YACZ,gBAAgB;YAChB,0BAA0B;YAC1B,WAAW;YACX,mBAAmB;YACnB,eAAe,EACZ,SAAS,EACZ,cAAc,CAAA,EAAA,CAAA;;2FAOL,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBA3B9C,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,qCAAqC;wBACrC,wBAAwB;wBACxB,sBAAsB;wBACtB,2BAA2B;wBAC3B,qBAAqB;wBACrB,iBAAiB;wBACjB,uBAAuB;wBACvB,8BAA8B;wBAC9B;AACD,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,0BAA0B;wBAC1B,WAAW;wBACX,mBAAmB;wBACnB,eAAe;AACf,wBAAA,GAAG,SAAS;wBACZ;AACD,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,qCAAqC;wBACrC;AACD;AACF,iBAAA;;;AC9DD;;AAEG;;ACFH;;AAEG;;;;"}