@elite.framework/ng.ui.core 1.0.77 → 1.0.80
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.
- package/fesm2022/elite.framework-ng.ui.core-generic-crud-table.mjs +2 -2
- package/fesm2022/elite.framework-ng.ui.core-generic-crud-table.mjs.map +1 -1
- package/fesm2022/elite.framework-ng.ui.core-generic-report.mjs +12 -3
- package/fesm2022/elite.framework-ng.ui.core-generic-report.mjs.map +1 -1
- package/fesm2022/elite.framework-ng.ui.core-generic-selector.mjs +18 -2
- package/fesm2022/elite.framework-ng.ui.core-generic-selector.mjs.map +1 -1
- package/generic-report/index.d.ts +2 -1
- package/generic-selector/index.d.ts +4 -0
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elite.framework-ng.ui.core-generic-report.mjs","sources":["../tmp-esm2022/generic-report/lib/generic-report-module.js","../tmp-esm2022/generic-report/lib/generic-report.component.js","../tmp-esm2022/generic-report/elite.framework-ng.ui.core-generic-report.js"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from \"@angular/core\";\nexport class GenericReportModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, imports: [CommonModule] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, imports: [CommonModule] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [CommonModule],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1yZXBvcnQtbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy51aS5jb3JlL2dlbmVyaWMtcmVwb3J0L3NyYy9saWIvZ2VuZXJpYy1yZXBvcnQtbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUsvQyxNQUFNLE9BQU8sbUJBQW1CO3VHQUFuQixtQkFBbUI7d0dBQW5CLG1CQUFtQixZQUZwQixZQUFZO3dHQUVYLG1CQUFtQixZQUZwQixZQUFZOzsyRkFFWCxtQkFBbUI7a0JBSC9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJpY1JlcG9ydE1vZHVsZSB7fVxuIl19","import { CommonModule } from '@angular/common';\nimport { Component, inject, ViewChild, ElementRef, Input } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormlyModule } from '@ngx-formly/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { ButtonModule } from 'primeng/button';\nimport { DialogModule } from 'primeng/dialog';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { RadioButtonModule } from 'primeng/radiobutton';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { CardModule } from 'primeng/card';\nimport { DividerModule } from 'primeng/divider';\nimport { TabsModule } from 'primeng/tabs';\nimport { DynamicDialogRef, DynamicDialogConfig, DialogService, DynamicDialogModule } from 'primeng/dynamicdialog';\nimport { SelectModule } from 'primeng/select';\nimport { RestService } from '@elite.framework/ng.core/services';\nimport { Subject, takeUntil } from 'rxjs';\nimport { DrawerModule } from 'primeng/drawer';\nimport { QueryBuilderService } from '@elite.framework/ng.ui.core/generic-search-advanced';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"primeng/dynamicdialog\";\nimport * as i2 from \"@angular/common\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"primeng/button\";\nimport * as i5 from \"primeng/api\";\nimport * as i6 from \"primeng/radiobutton\";\nimport * as i7 from \"primeng/checkbox\";\nimport * as i8 from \"primeng/tabs\";\nimport * as i9 from \"@ngx-formly/core\";\nimport * as i10 from \"primeng/drawer\";\nimport * as i11 from \"@ngx-translate/core\";\nexport var ExportType;\n(function (ExportType) {\n ExportType[ExportType[\"LIST\"] = 0] = \"LIST\";\n ExportType[ExportType[\"HTML\"] = 1] = \"HTML\";\n ExportType[ExportType[\"PDF\"] = 2] = \"PDF\";\n ExportType[ExportType[\"EXCEL\"] = 3] = \"EXCEL\";\n ExportType[ExportType[\"PRINT\"] = 4] = \"PRINT\";\n})(ExportType || (ExportType = {}));\nexport class GenericReportComponent {\n ref;\n config;\n previewContainer;\n filterFields = [];\n fields_ = [];\n availableColumns = [];\n exportType = ExportType.EXCEL;\n fileName = '';\n showFilters = false;\n loading = false;\n activeTabIndex = 0;\n currentDate = new Date();\n previewData = [];\n options = {};\n enableQueryBuilder = true;\n localExport = false;\n queryString = '';\n apiName = '';\n model = {};\n form = new FormGroup({});\n exportConfig = {\n columns: {},\n filters: this.model,\n exportType: this.exportType,\n fileName: this.fileName\n };\n exportTypes = [\n { value: ExportType.EXCEL, label: 'EXCEL', icon: 'pi pi-file-excel' },\n { value: ExportType.PDF, label: 'PDF', icon: 'pi pi-file-pdf' },\n { value: ExportType.HTML, label: 'HTML', icon: 'pi pi-code' },\n { value: ExportType.PRINT, label: 'PRINT', icon: 'pi pi-print' }\n ];\n destroy$ = new Subject();\n translate = inject(TranslateService);\n restService = inject(RestService);\n queryBuilder = inject(QueryBuilderService);\n constructor(ref, config) {\n this.ref = ref;\n this.config = config;\n }\n ngOnInit() {\n this.filterFields = this.config.data?.filterFields || [];\n this.initializeComponent();\n this.buildQueryUIFields();\n }\n get filterCount() {\n const filters = ((this.model?.advancedFilters ?? [])[0]?.conditions?.length || 0) +\n ((this.model?.sorting ?? [])?.length || 0) +\n (this.model?.pagination && this.model?.pagination?.top ? 1 : 0);\n return filters;\n }\n buildQueryUIFields() {\n if (this.enableQueryBuilder) {\n this.fields_ = this.queryBuilder.buildQueryUIFields(this.filterFields);\n }\n else {\n this.fields_ = this.filterFields;\n }\n }\n initializeComponent() {\n this.apiName = this.config.data?.apiName || '';\n const columnDefinitions = this.config.data?.columns || {};\n if (Object.keys(columnDefinitions).length > 0) {\n this.availableColumns = Object.keys(columnDefinitions).map(key => ({\n key: String(key),\n displayName: String(columnDefinitions[key]),\n selected: true,\n customName: String(columnDefinitions[key])\n }));\n }\n else {\n this.availableColumns = (this.filterFields || []).map(f => {\n const key = String(f.key ?? '');\n const label = String(f.props?.label ?? key);\n return {\n key,\n displayName: this.translate.instant(label),\n selected: true,\n customName: label\n };\n });\n }\n this.filterFields = this.config.data?.filterFields || this.getDefaultFilterFields();\n this.model = this.config.data?.model || {};\n this.fileName = this.config.data?.defaultFileName || `export_${new Date().toISOString().split('T')[0]}`;\n // Load sample data for preview\n this.loadPreviewData();\n }\n getDefaultFilterFields() {\n return [\n {\n key: 'search',\n type: 'input',\n props: {\n label: this.translate.instant('SEARCH'),\n placeholder: this.translate.instant('ENTER_SEARCH_TERM'),\n }\n }\n ];\n }\n get selectedColumns() {\n return this.availableColumns.filter(col => col.selected);\n }\n onExportTypeChange(type) {\n this.exportType = type;\n // Auto-switch to preview tab for HTML/Print\n if ((type === ExportType.HTML || type === ExportType.PRINT) && this.selectedColumns.length > 0) {\n this.activeTabIndex = 1;\n }\n }\n onColumnToggle(column) {\n if (!column.selected) {\n column.customName = column.displayName;\n }\n // Refresh preview when columns change\n if (this.activeTabIndex === 1) {\n this.generatePreview();\n }\n }\n onCustomNameChange(column) {\n if (!column.customName?.trim()) {\n column.customName = column.displayName;\n }\n // Refresh preview when column names change\n if (this.activeTabIndex === 1) {\n this.generatePreview();\n }\n }\n selectAllColumns() {\n this.availableColumns.forEach(col => {\n col.selected = true;\n col.customName = col.displayName;\n });\n this.generatePreview();\n }\n deselectAllColumns() {\n this.availableColumns.forEach(col => {\n col.selected = false;\n });\n this.previewData = [];\n }\n generatePreview() {\n if (this.selectedColumns.length === 0) {\n this.previewData = [];\n return;\n }\n // In a real application, you would call your API here\n // For demo purposes, we're using the sample data\n this.loadPreviewData();\n }\n getPreviewValue(row, columnKey) {\n // Handle nested properties with dot notation\n return columnKey.split('.').reduce((obj, key) => obj?.[key], row) || '-';\n }\n getExportButtonText() {\n switch (this.exportType) {\n case ExportType.PRINT:\n return this.translate.instant('PRINT');\n case ExportType.HTML:\n return this.translate.instant('GENERATE_REPORT');\n default:\n return this.translate.instant('EXPORT');\n }\n }\n onSubmit() {\n // Use the new QueryBuilderService methods\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);\n // this.odataSearch.emit(odataParams);\n // Generate query string using the unified method\n this.queryString = this.queryBuilder.toODataQueryString(odataParams);\n // console.log('OData Query String:', queryString);\n if (this.model?.pagination && this.model?.pagination?.top) {\n // this.paginationChange.emit({\n // top:this.model?.pagination?.top,\n // // skip:,\n // });\n }\n // this.search.emit(\n // {\n // filter:this.model['filter'],\n // query:this.queryString,\n // // sorting:,\n // // top:,\n // // skip:,\n // }\n // );\n this.loadPreviewData();\n }\n onReset() {\n this.availableColumns.forEach(col => {\n col.selected = true;\n col.customName = col.displayName;\n });\n this.exportType = ExportType.EXCEL;\n this.fileName = `export_${new Date().toISOString().split('T')[0]}`;\n this.form.reset();\n this.model = {};\n this.activeTabIndex = 0;\n this.generatePreview();\n }\n onExport() {\n if (this.selectedColumns.length === 0)\n return;\n this.loading = true;\n // Prepare columns mapping\n const columnsMapping = {};\n this.selectedColumns.forEach(col => {\n columnsMapping[col.key] = col.customName || col.displayName;\n });\n const exportConfig = {\n columns: columnsMapping,\n filters: this.model,\n exportType: this.exportType,\n fileName: this.fileName\n };\n // Handle export based on type\n switch (this.exportType) {\n case ExportType.PRINT:\n this.printPreview();\n this.loading = false;\n break;\n case ExportType.HTML:\n this.generateHtmlReport(exportConfig);\n this.loading = false;\n break;\n default:\n this.handleApiExport(exportConfig);\n break;\n }\n }\n generateHtmlReport(config) {\n const htmlContent = this.previewContainer.nativeElement.innerHTML;\n const blob = new Blob([htmlContent], { type: 'text/html' });\n this.downloadFile(blob, `${config.fileName}.html`);\n }\n handleApiExport(config) {\n if (this.form.invalid)\n return;\n this.loading = true;\n const filters = {\n fileName: config.fileName || '',\n query: this.queryString,\n exportType: config.exportType,\n columns: JSON.stringify(config.columns),\n // ...this.currentFilters,\n // ...this.pageFilters,\n // ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\n };\n const params = Object.keys(filters).reduce((acc, key) => {\n acc[key] = filters[key];\n return acc;\n }, {});\n this.restService.request({\n method: 'GET',\n url: `/${this.apiName}/export`,\n // body: { ...config.filters, ...this.model },\n params: params\n }, { apiName: this.apiName })\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (response) => {\n this.downloadFile(response, `${config.fileName}.${this.getFileExtension(config.exportType)}`);\n this.loading = false;\n },\n error: (error) => {\n console.error('Export failed:', error);\n this.loading = false;\n }\n });\n }\n loadPreviewData() {\n if (this.form.invalid)\n return;\n this.loading = true;\n const filters = {\n query: this.queryString,\n exportType: ExportType.LIST,\n columns: JSON.stringify(this.getPreviewColumns()),\n // ...this.currentFilters,\n // ...this.pageFilters,\n // ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\n };\n const params = Object.keys(filters).reduce((acc, key) => {\n acc[key] = filters[key];\n return acc;\n }, {});\n this.restService.request({\n method: 'GET',\n url: `/${this.apiName}/export`,\n params: params\n }, { apiName: this.apiName })\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (response) => {\n this.previewData = response;\n this.loading = false;\n },\n error: (error) => {\n console.error('Preview load failed:', error);\n this.loading = false;\n }\n });\n }\n getPreviewColumns() {\n const columns = {};\n this.selectedColumns.forEach(col => {\n columns[col.key] = col.customName || col.displayName;\n });\n return columns;\n }\n downloadFile(blob, fileName) {\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n }\n getFileExtension(exportType) {\n switch (exportType) {\n case ExportType.EXCEL:\n return 'xlsx';\n case ExportType.PDF:\n return 'pdf';\n case ExportType.HTML:\n return 'html';\n default:\n return 'xlsx';\n }\n }\n printPreview() {\n const printContent = this.previewContainer.nativeElement.innerHTML;\n const originalContent = document.body.innerHTML;\n // Create print window\n const printWindow = window.open('', '_blank', 'width=800,height=600');\n if (printWindow) {\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>${this.fileName}</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; margin: 20px; }\r\n table { width: 100%; border-collapse: collapse; }\r\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\r\n th { background-color: #f5f5f5; font-weight: bold; }\r\n .header { text-align: center; margin-bottom: 20px; }\r\n .footer { text-align: center; margin-top: 20px; font-size: 12px; color: #666; }\r\n @media print {\r\n body { margin: 0; }\r\n .no-print { display: none; }\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n ${printContent}\r\n <div class=\"footer no-print\">\r\n <button onclick=\"window.print()\" style=\"padding: 10px 20px; margin: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;\">\r\n Print Report\r\n </button>\r\n <button onclick=\"window.close()\" style=\"padding: 10px 20px; margin: 10px; background: #6c757d; color: white; border: none; border-radius: 4px; cursor: pointer;\">\r\n Close\r\n </button>\r\n </div>\r\n </body>\r\n </html>\r\n `);\n printWindow.document.close();\n // Auto-print when window loads\n printWindow.onload = () => {\n printWindow.focus();\n // Uncomment the line below for auto-print\n // printWindow.print();\n };\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportComponent, deps: [{ token: i1.DynamicDialogRef }, { token: i1.DynamicDialogConfig }], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.1.8\", type: GenericReportComponent, isStandalone: true, selector: \"app-report\", inputs: { filterFields: \"filterFields\", enableQueryBuilder: \"enableQueryBuilder\", localExport: \"localExport\", queryString: \"queryString\", apiName: \"apiName\", model: \"model\" }, providers: [DialogService], viewQueries: [{ propertyName: \"previewContainer\", first: true, predicate: [\"previewContainer\"], descendants: true }], ngImport: i0, template: \"\\r\\n <div class=\\\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\\\">\\r\\n <!-- Header -->\\r\\n <!-- <div class=\\\"flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700\\\">\\r\\n <h2 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'EXPORT_DATA' | translate }}\\r\\n </h2>\\r\\n <button\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"p-1 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n aria-label=\\\"Close\\\">\\r\\n <i class=\\\"pi pi-times text-gray-500 dark:text-gray-400\\\"></i>\\r\\n </button>\\r\\n </div> -->\\r\\n\\r\\n <!-- Content -->\\r\\n <div class=\\\"flex-1 overflow-hidden\\\">\\r\\n <p-tabs [value]=\\\"activeTabIndex\\\">\\r\\n <!-- Configuration Tab -->\\r\\n <p-tablist>\\r\\n <p-tab value=\\\"0\\\">{{'CONFIGURATION' | translate}}</p-tab>\\r\\n <p-tab value=\\\"1\\\">{{'PREVIEW' | translate}}</p-tab>\\r\\n </p-tablist>\\r\\n <p-tabpanels>\\r\\n <p-tabpanel value=\\\"0\\\">\\r\\n <div class=\\\"grid grid-cols-1 lg:grid-cols-2 gap-6 p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Left Column - Export Settings -->\\r\\n <div class=\\\"space-y-6\\\">\\r\\n <!-- File Name -->\\r\\n <div class=\\\"space-y-2\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'FILE_NAME' | translate }}\\r\\n </label>\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"fileName\\\"\\r\\n class=\\\"w-full p-3 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500\\\"\\r\\n [placeholder]=\\\"'ENTER_FILE_NAME' | translate\\\">\\r\\n </div>\\r\\n\\r\\n <!-- Export Type -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'EXPORT_FORMAT' | translate }}\\r\\n </label>\\r\\n <div class=\\\"grid grid-cols-2 gap-3\\\">\\r\\n <div *ngFor=\\\"let type of exportTypes\\\" class=\\\"flex items-center\\\">\\r\\n <p-radioButton\\r\\n [name]=\\\"'exportType'\\\"\\r\\n [value]=\\\"type.value\\\"\\r\\n [(ngModel)]=\\\"exportType\\\"\\r\\n [inputId]=\\\"`${type.value}`\\\"\\r\\n (onClick)=\\\"onExportTypeChange(type.value)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-radioButton>\\r\\n <label [for]=\\\"type.value\\\" class=\\\"flex items-center cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n <i [class]=\\\"type.icon + ' mr-2'\\\"></i>\\r\\n {{ type.label | translate }}\\r\\n </label>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Filters Section -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SEARCH_FILTERS' | translate }}\\r\\n </label>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"showFilters = !showFilters\\\"\\r\\n class=\\\"text-sm text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ showFilters ? ('HIDE_FILTERS' | translate) : ('SHOW_FILTERS' | translate) }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- <div *ngIf=\\\"showFilters\\\" class=\\\"space-y-4 p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\">\\r\\n </formly-form>\\r\\n </div> -->\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Right Column - Column Selection -->\\r\\n <div class=\\\"space-y-4\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SELECT_COLUMNS' | translate }}\\r\\n </label>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"selectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'SELECT_ALL' | translate }}\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"deselectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'DESELECT_ALL' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <div class=\\\"max-h-80 overflow-y-auto border border-gray-200 dark:border-gray-700 rounded-lg\\\">\\r\\n <div *ngFor=\\\"let column of availableColumns\\\" class=\\\"flex items-center p-3 border-b border-gray-100 dark:border-gray-600 last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-700\\\">\\r\\n <p-checkbox\\r\\n [binary]=\\\"true\\\"\\r\\n [(ngModel)]=\\\"column.selected\\\"\\r\\n [inputId]=\\\"column.key\\\"\\r\\n (onChange)=\\\"onColumnToggle(column)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-checkbox>\\r\\n <label [for]=\\\"column.key\\\" class=\\\"flex-1 cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n {{ column.displayName }}\\r\\n </label>\\r\\n <div *ngIf=\\\"column.selected\\\" class=\\\"flex items-center gap-2\\\">\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"column.customName\\\"\\r\\n (blur)=\\\"onCustomNameChange(column)\\\"\\r\\n [placeholder]=\\\"column.displayName\\\"\\r\\n class=\\\"text-xs p-1 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white w-32\\\"\\r\\n [title]=\\\"'CUSTOM_COLUMN_NAME' | translate\\\">\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Selected Columns Summary -->\\r\\n <div *ngIf=\\\"selectedColumns.length > 0\\\" class=\\\"p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-blue-700 dark:text-blue-300\\\">\\r\\n {{ 'SELECTED_COLUMNS_COUNT' | translate: { count: selectedColumns.length } }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n <!-- Preview Tab -->\\r\\n <!-- [disabled]=\\\"selectedColumns.length === 0\\\" -->\\r\\n <p-tabpanel value=\\\"1\\\" >\\r\\n <div class=\\\"p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Preview Actions -->\\r\\n <div class=\\\"flex justify-between items-center mb-4\\\">\\r\\n <h3 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'REPORT_PREVIEW' | translate }}\\r\\n </h3>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n *ngIf=\\\"exportType === 1 || exportType === 4\\\"\\r\\n (click)=\\\"printPreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-print mr-2\\\"></i>\\r\\n {{ 'PRINT' | translate }}\\r\\n </button>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-refresh mr-2\\\"></i>\\r\\n {{ 'REFRESH_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Content -->\\r\\n <div #previewContainer class=\\\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-6\\\">\\r\\n <!-- Report Header -->\\r\\n <div class=\\\"text-center mb-6 border-b border-gray-200 dark:border-gray-700 pb-4\\\">\\r\\n <h1 class=\\\"text-2xl font-bold text-gray-900 dark:text-white\\\">{{ fileName }}</h1>\\r\\n <p class=\\\"text-gray-600 dark:text-gray-400 mt-2\\\">\\r\\n {{ 'GENERATED_ON' | translate }}: {{ currentDate | date:'medium' }}\\r\\n </p>\\r\\n </div>\\r\\n\\r\\n <!-- Report Table -->\\r\\n <div class=\\\"overflow-x-auto\\\">\\r\\n <table class=\\\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <thead class=\\\"bg-gray-50 dark:bg-gray-700\\\">\\r\\n <tr>\\r\\n <th\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ column.customName || column.displayName }}\\r\\n </th>\\r\\n </tr>\\r\\n </thead>\\r\\n <tbody class=\\\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <tr *ngFor=\\\"let row of previewData; let i = index\\\"\\r\\n [class.bg-gray-50]=\\\"i % 2 === 0\\\"\\r\\n [class.dark:bg-gray-900]=\\\"i % 2 === 0\\\">\\r\\n <td\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-white border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ getPreviewValue(row, column.key) }}\\r\\n </td>\\r\\n </tr>\\r\\n </tbody>\\r\\n </table>\\r\\n </div>\\r\\n\\r\\n <!-- Empty State -->\\r\\n <div *ngIf=\\\"previewData.length === 0\\\" class=\\\"text-center py-8\\\">\\r\\n <i class=\\\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\\\"></i>\\r\\n <p class=\\\"text-gray-500 dark:text-gray-400\\\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"mt-4 px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'GENERATE_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- Report Footer -->\\r\\n <div class=\\\"text-center mt-6 border-t border-gray-200 dark:border-gray-700 pt-4\\\">\\r\\n <p class=\\\"text-sm text-gray-500 dark:text-gray-400\\\">\\r\\n {{ 'PAGE' | translate }} 1 of 1\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Info -->\\r\\n <div class=\\\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-green-700 dark:text-green-300\\\">\\r\\n <i class=\\\"pi pi-info-circle mr-2\\\"></i>\\r\\n {{ 'PREVIEW_INFO' | translate }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n </p-tabpanels>\\r\\n </p-tabs>\\r\\n </div>\\r\\n\\r\\n <!-- Footer -->\\r\\n <div class=\\\"border-t border-gray-200 dark:border-gray-700 px-6 py-4 bg-gray-50 dark:bg-gray-800\\\">\\r\\n <div class=\\\"flex justify-between items-center\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onReset()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n <i class=\\\"pi pi-refresh ml-2\\\"></i>\\r\\n {{ 'RESET' | translate }}\\r\\n </button>\\r\\n\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n {{ 'CANCEL' | translate }}\\r\\n </button>\\r\\n\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onExport()\\\"\\r\\n [disabled]=\\\"loading || selectedColumns.length === 0\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors\\\">\\r\\n <i class=\\\"pi pi-download ml-2\\\" [class.animate-spin]=\\\"loading\\\"></i>\\r\\n {{ getExportButtonText() }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n @if(showFilters){\\r\\n<p-drawer\\r\\n [(visible)]=\\\"showFilters\\\"\\r\\n position=\\\"right\\\"\\r\\n [styleClass]=\\\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \\\"\\r\\n [modal]=\\\"true\\\"\\r\\n [dismissible]=\\\"true\\\"\\r\\n styleClass=\\\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\\\"\\r\\n>\\r\\n <!-- Entire form wrapper -->\\r\\n <form [formGroup]=\\\"form\\\" (ngSubmit)=\\\"onSubmit(); showFilters=false\\\" class=\\\"flex flex-col flex-1\\\">\\r\\n <!-- Scrollable Form -->\\r\\n <div class=\\\"flex-1 overflow-auto\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\"\\r\\n [options]=\\\"options\\\"\\r\\n >\\r\\n </formly-form>\\r\\n </div>\\r\\n\\r\\n </form>\\r\\n <!-- Action Buttons -->\\r\\n <ng-template pTemplate=\\\"footer\\\">\\r\\n <div class=\\\"flex justify-end mt-2 space-x-2 flex-none\\\">\\r\\n <button\\r\\n type=\\\"submit\\\"\\r\\n pButton size=\\\"small\\\"\\r\\n (click)=\\\" onSubmit(); showFilters=false\\\"\\r\\n label=\\\"{{ 'SEARCH' | translate }}\\\">\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n pButton\\r\\n size=\\\"small\\\"\\r\\n class=\\\"p-button-text\\\"\\r\\n (click)=\\\"onReset(); showFilters=false\\\"\\r\\n >\\r\\n {{ 'CLEAR' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </ng-template>\\r\\n</p-drawer>\\r\\n\\r\\n }\\r\\n\", dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i2.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i2.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.DefaultValueAccessor, selector: \"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]\" }, { kind: \"directive\", type: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"ngmodule\", type: FormsModule }, { kind: \"directive\", type: i3.NgModel, selector: \"[ngModel]:not([formControlName]):not([formControl])\", inputs: [\"name\", \"disabled\", \"ngModel\", \"ngModelOptions\"], outputs: [\"ngModelChange\"], exportAs: [\"ngModel\"] }, { kind: \"ngmodule\", type: TranslateModule }, { kind: \"ngmodule\", type: ButtonModule }, { kind: \"directive\", type: i4.ButtonDirective, selector: \"[pButton]\", inputs: [\"iconPos\", \"loadingIcon\", \"loading\", \"severity\", \"raised\", \"rounded\", \"text\", \"outlined\", \"size\", \"plain\", \"fluid\", \"label\", \"icon\", \"buttonProps\"] }, { kind: \"directive\", type: i5.PrimeTemplate, selector: \"[pTemplate]\", inputs: [\"type\", \"pTemplate\"] }, { kind: \"ngmodule\", type: DialogModule }, { kind: \"ngmodule\", type: SelectModule }, { kind: \"ngmodule\", type: MultiSelectModule }, { kind: \"ngmodule\", type: InputTextModule }, { kind: \"ngmodule\", type: RadioButtonModule }, { kind: \"component\", type: i6.RadioButton, selector: \"p-radioButton, p-radiobutton, p-radio-button\", inputs: [\"value\", \"tabindex\", \"inputId\", \"ariaLabelledBy\", \"ariaLabel\", \"styleClass\", \"autofocus\", \"binary\", \"variant\", \"size\"], outputs: [\"onClick\", \"onFocus\", \"onBlur\"] }, { kind: \"ngmodule\", type: CheckboxModule }, { kind: \"component\", type: i7.Checkbox, selector: \"p-checkbox, p-checkBox, p-check-box\", inputs: [\"value\", \"binary\", \"ariaLabelledBy\", \"ariaLabel\", \"tabindex\", \"inputId\", \"inputStyle\", \"styleClass\", \"inputClass\", \"indeterminate\", \"formControl\", \"checkboxIcon\", \"readonly\", \"autofocus\", \"trueValue\", \"falseValue\", \"variant\", \"size\"], outputs: [\"onChange\", \"onFocus\", \"onBlur\"] }, { kind: \"ngmodule\", type: CardModule }, { kind: \"ngmodule\", type: DividerModule }, { kind: \"ngmodule\", type: TabsModule }, { kind: \"component\", type: i8.Tabs, selector: \"p-tabs\", inputs: [\"value\", \"scrollable\", \"lazy\", \"selectOnFocus\", \"showNavigators\", \"tabindex\"], outputs: [\"valueChange\"] }, { kind: \"component\", type: i8.TabPanels, selector: \"p-tabpanels\" }, { kind: \"component\", type: i8.TabPanel, selector: \"p-tabpanel\", inputs: [\"value\"], outputs: [\"valueChange\"] }, { kind: \"component\", type: i8.TabList, selector: \"p-tablist\" }, { kind: \"component\", type: i8.Tab, selector: \"p-tab\", inputs: [\"value\", \"disabled\"], outputs: [\"valueChange\"] }, { kind: \"ngmodule\", type: FormlyModule }, { kind: \"component\", type: i9.LegacyFormlyForm, selector: \"formly-form\" }, { kind: \"ngmodule\", type: DynamicDialogModule }, { kind: \"ngmodule\", type: DrawerModule }, { kind: \"component\", type: i10.Drawer, selector: \"p-drawer\", inputs: [\"appendTo\", \"blockScroll\", \"style\", \"styleClass\", \"ariaCloseLabel\", \"autoZIndex\", \"baseZIndex\", \"modal\", \"closeButtonProps\", \"dismissible\", \"showCloseIcon\", \"closeOnEscape\", \"transitionOptions\", \"visible\", \"position\", \"fullScreen\", \"header\", \"maskStyle\", \"closable\"], outputs: [\"onShow\", \"onHide\", \"visibleChange\"] }, { kind: \"pipe\", type: i2.DatePipe, name: \"date\" }, { kind: \"pipe\", type: i11.TranslatePipe, name: \"translate\" }] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportComponent, decorators: [{\n type: Component,\n args: [{ selector: 'app-report', providers: [DialogService], imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TranslateModule,\n ButtonModule,\n DialogModule,\n SelectModule,\n MultiSelectModule,\n InputTextModule,\n RadioButtonModule,\n CheckboxModule,\n CardModule,\n DividerModule,\n TabsModule,\n FormlyModule,\n DynamicDialogModule,\n DrawerModule\n ], template: \"\\r\\n <div class=\\\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\\\">\\r\\n <!-- Header -->\\r\\n <!-- <div class=\\\"flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700\\\">\\r\\n <h2 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'EXPORT_DATA' | translate }}\\r\\n </h2>\\r\\n <button\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"p-1 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n aria-label=\\\"Close\\\">\\r\\n <i class=\\\"pi pi-times text-gray-500 dark:text-gray-400\\\"></i>\\r\\n </button>\\r\\n </div> -->\\r\\n\\r\\n <!-- Content -->\\r\\n <div class=\\\"flex-1 overflow-hidden\\\">\\r\\n <p-tabs [value]=\\\"activeTabIndex\\\">\\r\\n <!-- Configuration Tab -->\\r\\n <p-tablist>\\r\\n <p-tab value=\\\"0\\\">{{'CONFIGURATION' | translate}}</p-tab>\\r\\n <p-tab value=\\\"1\\\">{{'PREVIEW' | translate}}</p-tab>\\r\\n </p-tablist>\\r\\n <p-tabpanels>\\r\\n <p-tabpanel value=\\\"0\\\">\\r\\n <div class=\\\"grid grid-cols-1 lg:grid-cols-2 gap-6 p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Left Column - Export Settings -->\\r\\n <div class=\\\"space-y-6\\\">\\r\\n <!-- File Name -->\\r\\n <div class=\\\"space-y-2\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'FILE_NAME' | translate }}\\r\\n </label>\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"fileName\\\"\\r\\n class=\\\"w-full p-3 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500\\\"\\r\\n [placeholder]=\\\"'ENTER_FILE_NAME' | translate\\\">\\r\\n </div>\\r\\n\\r\\n <!-- Export Type -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'EXPORT_FORMAT' | translate }}\\r\\n </label>\\r\\n <div class=\\\"grid grid-cols-2 gap-3\\\">\\r\\n <div *ngFor=\\\"let type of exportTypes\\\" class=\\\"flex items-center\\\">\\r\\n <p-radioButton\\r\\n [name]=\\\"'exportType'\\\"\\r\\n [value]=\\\"type.value\\\"\\r\\n [(ngModel)]=\\\"exportType\\\"\\r\\n [inputId]=\\\"`${type.value}`\\\"\\r\\n (onClick)=\\\"onExportTypeChange(type.value)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-radioButton>\\r\\n <label [for]=\\\"type.value\\\" class=\\\"flex items-center cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n <i [class]=\\\"type.icon + ' mr-2'\\\"></i>\\r\\n {{ type.label | translate }}\\r\\n </label>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Filters Section -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SEARCH_FILTERS' | translate }}\\r\\n </label>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"showFilters = !showFilters\\\"\\r\\n class=\\\"text-sm text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ showFilters ? ('HIDE_FILTERS' | translate) : ('SHOW_FILTERS' | translate) }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- <div *ngIf=\\\"showFilters\\\" class=\\\"space-y-4 p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\">\\r\\n </formly-form>\\r\\n </div> -->\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Right Column - Column Selection -->\\r\\n <div class=\\\"space-y-4\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SELECT_COLUMNS' | translate }}\\r\\n </label>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"selectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'SELECT_ALL' | translate }}\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"deselectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'DESELECT_ALL' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <div class=\\\"max-h-80 overflow-y-auto border border-gray-200 dark:border-gray-700 rounded-lg\\\">\\r\\n <div *ngFor=\\\"let column of availableColumns\\\" class=\\\"flex items-center p-3 border-b border-gray-100 dark:border-gray-600 last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-700\\\">\\r\\n <p-checkbox\\r\\n [binary]=\\\"true\\\"\\r\\n [(ngModel)]=\\\"column.selected\\\"\\r\\n [inputId]=\\\"column.key\\\"\\r\\n (onChange)=\\\"onColumnToggle(column)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-checkbox>\\r\\n <label [for]=\\\"column.key\\\" class=\\\"flex-1 cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n {{ column.displayName }}\\r\\n </label>\\r\\n <div *ngIf=\\\"column.selected\\\" class=\\\"flex items-center gap-2\\\">\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"column.customName\\\"\\r\\n (blur)=\\\"onCustomNameChange(column)\\\"\\r\\n [placeholder]=\\\"column.displayName\\\"\\r\\n class=\\\"text-xs p-1 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white w-32\\\"\\r\\n [title]=\\\"'CUSTOM_COLUMN_NAME' | translate\\\">\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Selected Columns Summary -->\\r\\n <div *ngIf=\\\"selectedColumns.length > 0\\\" class=\\\"p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-blue-700 dark:text-blue-300\\\">\\r\\n {{ 'SELECTED_COLUMNS_COUNT' | translate: { count: selectedColumns.length } }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n <!-- Preview Tab -->\\r\\n <!-- [disabled]=\\\"selectedColumns.length === 0\\\" -->\\r\\n <p-tabpanel value=\\\"1\\\" >\\r\\n <div class=\\\"p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Preview Actions -->\\r\\n <div class=\\\"flex justify-between items-center mb-4\\\">\\r\\n <h3 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'REPORT_PREVIEW' | translate }}\\r\\n </h3>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n *ngIf=\\\"exportType === 1 || exportType === 4\\\"\\r\\n (click)=\\\"printPreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-print mr-2\\\"></i>\\r\\n {{ 'PRINT' | translate }}\\r\\n </button>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-refresh mr-2\\\"></i>\\r\\n {{ 'REFRESH_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Content -->\\r\\n <div #previewContainer class=\\\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-6\\\">\\r\\n <!-- Report Header -->\\r\\n <div class=\\\"text-center mb-6 border-b border-gray-200 dark:border-gray-700 pb-4\\\">\\r\\n <h1 class=\\\"text-2xl font-bold text-gray-900 dark:text-white\\\">{{ fileName }}</h1>\\r\\n <p class=\\\"text-gray-600 dark:text-gray-400 mt-2\\\">\\r\\n {{ 'GENERATED_ON' | translate }}: {{ currentDate | date:'medium' }}\\r\\n </p>\\r\\n </div>\\r\\n\\r\\n <!-- Report Table -->\\r\\n <div class=\\\"overflow-x-auto\\\">\\r\\n <table class=\\\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <thead class=\\\"bg-gray-50 dark:bg-gray-700\\\">\\r\\n <tr>\\r\\n <th\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ column.customName || column.displayName }}\\r\\n </th>\\r\\n </tr>\\r\\n </thead>\\r\\n <tbody class=\\\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <tr *ngFor=\\\"let row of previewData; let i = index\\\"\\r\\n [class.bg-gray-50]=\\\"i % 2 === 0\\\"\\r\\n [class.dark:bg-gray-900]=\\\"i % 2 === 0\\\">\\r\\n <td\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-white border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ getPreviewValue(row, column.key) }}\\r\\n </td>\\r\\n </tr>\\r\\n </tbody>\\r\\n </table>\\r\\n </div>\\r\\n\\r\\n <!-- Empty State -->\\r\\n <div *ngIf=\\\"previewData.length === 0\\\" class=\\\"text-center py-8\\\">\\r\\n <i class=\\\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\\\"></i>\\r\\n <p class=\\\"text-gray-500 dark:text-gray-400\\\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"mt-4 px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'GENERATE_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- Report Footer -->\\r\\n <div class=\\\"text-center mt-6 border-t border-gray-200 dark:border-gray-700 pt-4\\\">\\r\\n <p class=\\\"text-sm text-gray-500 dark:text-gray-400\\\">\\r\\n {{ 'PAGE' | translate }} 1 of 1\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Info -->\\r\\n <div class=\\\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-green-700 dark:text-green-300\\\">\\r\\n <i class=\\\"pi pi-info-circle mr-2\\\"></i>\\r\\n {{ 'PREVIEW_INFO' | translate }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n </p-tabpanels>\\r\\n </p-tabs>\\r\\n </div>\\r\\n\\r\\n <!-- Footer -->\\r\\n <div class=\\\"border-t border-gray-200 dark:border-gray-700 px-6 py-4 bg-gray-50 dark:bg-gray-800\\\">\\r\\n <div class=\\\"flex justify-between items-center\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onReset()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n <i class=\\\"pi pi-refresh ml-2\\\"></i>\\r\\n {{ 'RESET' | translate }}\\r\\n </button>\\r\\n\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n {{ 'CANCEL' | translate }}\\r\\n </button>\\r\\n\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onExport()\\\"\\r\\n [disabled]=\\\"loading || selectedColumns.length === 0\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors\\\">\\r\\n <i class=\\\"pi pi-download ml-2\\\" [class.animate-spin]=\\\"loading\\\"></i>\\r\\n {{ getExportButtonText() }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n @if(showFilters){\\r\\n<p-drawer\\r\\n [(visible)]=\\\"showFilters\\\"\\r\\n position=\\\"right\\\"\\r\\n [styleClass]=\\\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \\\"\\r\\n [modal]=\\\"true\\\"\\r\\n [dismissible]=\\\"true\\\"\\r\\n styleClass=\\\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\\\"\\r\\n>\\r\\n <!-- Entire form wrapper -->\\r\\n <form [formGroup]=\\\"form\\\" (ngSubmit)=\\\"onSubmit(); showFilters=false\\\" class=\\\"flex flex-col flex-1\\\">\\r\\n <!-- Scrollable Form -->\\r\\n <div class=\\\"flex-1 overflow-auto\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\"\\r\\n [options]=\\\"options\\\"\\r\\n >\\r\\n </formly-form>\\r\\n </div>\\r\\n\\r\\n </form>\\r\\n <!-- Action Buttons -->\\r\\n <ng-template pTemplate=\\\"footer\\\">\\r\\n <div class=\\\"flex justify-end mt-2 space-x-2 flex-none\\\">\\r\\n <button\\r\\n type=\\\"submit\\\"\\r\\n pButton size=\\\"small\\\"\\r\\n (click)=\\\" onSubmit(); showFilters=false\\\"\\r\\n label=\\\"{{ 'SEARCH' | translate }}\\\">\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n pButton\\r\\n size=\\\"small\\\"\\r\\n class=\\\"p-button-text\\\"\\r\\n (click)=\\\"onReset(); showFilters=false\\\"\\r\\n >\\r\\n {{ 'CLEAR' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </ng-template>\\r\\n</p-drawer>\\r\\n\\r\\n }\\r\\n\" }]\n }], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }], propDecorators: { previewContainer: [{\n type: ViewChild,\n args: ['previewContainer']\n }], filterFields: [{\n type: Input\n }], enableQueryBuilder: [{\n type: Input\n }], localExport: [{\n type: Input\n }], queryString: [{\n type: Input\n }], apiName: [{\n type: Input\n }], model: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy51aS5jb3JlL2dlbmVyaWMtcmVwb3J0L3NyYy9saWIvZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy51aS5jb3JlL2dlbmVyaWMtcmVwb3J0L3NyYy9saWIvZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFvRCxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlC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QWEsQ0FBQyxnSkN6QzdCLG0yZUE2VEEsMkNEbFJJLFlBQVksK1BBQ1osbUJBQW1CLDR5QkFDbkIsV0FBVyxzUEFDWCxlQUFlLDhCQUNmLFlBQVksMldBQ1osWUFBWSw4QkFDWixZQUFZLDhCQUNaLGlCQUFpQiw4QkFDakIsZUFBZSw4QkFDZixpQkFBaUIsaVRBQ2pCLGNBQWMseVpBQ2QsVUFBVSw4QkFDVixhQUFhLDhCQUNiLFVBQVUsOGlCQUNWLFlBQVkseUdBQ1osbUJBQW1CLDhCQUNuQixZQUFZOzsyRkFHSCxzQkFBc0I7a0JBeEJsQyxTQUFTOytCQUNFLFlBQVksYUFFVixDQUFDLGFBQWEsQ0FBQyxXQUNsQjt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixhQUFhO3dCQUNiLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFlBQVk7cUJBQ2I7dUhBRzhCLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBR3BCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBbUJHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybWx5RmllbGRDb25maWcsIEZvcm1seUZvcm0sIEZvcm1seUZvcm1PcHRpb25zLCBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNdWx0aVNlbGVjdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dCc7XHJcbmltcG9ydCB7IFJhZGlvQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9yYWRpb2J1dHRvbic7XHJcbmltcG9ydCB7IENoZWNrYm94TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XHJcbmltcG9ydCB7IENhcmRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NhcmQnO1xyXG5pbXBvcnQgeyBEaXZpZGVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaXZpZGVyJztcclxuaW1wb3J0IHsgVGFic01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFicyc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dSZWYsIER5bmFtaWNEaWFsb2dDb25maWcsIERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBTZWxlY3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NlbGVjdCc7XHJcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnQGVsaXRlLmZyYW1ld29yay9uZy5jb3JlL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERyYXdlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJhd2VyJztcclxuaW1wb3J0IHsgUXVlcnlCdWlsZGVyU2VydmljZSB9IGZyb20gJ0BlbGl0ZS5mcmFtZXdvcmsvbmcudWkuY29yZS9nZW5lcmljLXNlYXJjaC1hZHZhbmNlZCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydENvbmZpZyB7XHJcbiAgY29sdW1uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBmaWx0ZXJzOiBhbnk7XHJcbiAgZXhwb3J0VHlwZTogRXhwb3J0VHlwZTtcclxuICBmaWxlTmFtZT86IHN0cmluZztcclxufVxyXG5cclxuXHJcbmV4cG9ydCBlbnVtIEV4cG9ydFR5cGUge1xyXG4gIExJU1QgLFxyXG4gIEhUTUwgLFxyXG4gIFBERiAsXHJcbiAgRVhDRUwgLFxyXG4gIFBSSU5UXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydCcsXHJcbiAgdGVtcGxhdGVVcmw6Jy4vZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICBwcm92aWRlcnM6IFtEaWFsb2dTZXJ2aWNlXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBCdXR0b25Nb2R1bGUsXHJcbiAgICBEaWFsb2dNb2R1bGUsXHJcbiAgICBTZWxlY3RNb2R1bGUsXHJcbiAgICBNdWx0aVNlbGVjdE1vZHVsZSxcclxuICAgIElucHV0VGV4dE1vZHVsZSxcclxuICAgIFJhZGlvQnV0dG9uTW9kdWxlLFxyXG4gICAgQ2hlY2tib3hNb2R1bGUsXHJcbiAgICBDYXJkTW9kdWxlLFxyXG4gICAgRGl2aWRlck1vZHVsZSxcclxuICAgIFRhYnNNb2R1bGUsXHJcbiAgICBGb3JtbHlNb2R1bGUsXHJcbiAgICBEeW5hbWljRGlhbG9nTW9kdWxlLFxyXG4gICAgRHJhd2VyTW9kdWxlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2VuZXJpY1JlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgncHJldmlld0NvbnRhaW5lcicpIHByZXZpZXdDb250YWluZXIhOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcbiAgQElucHV0KCkgZmlsdGVyRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XHJcbiAgZmllbGRzXyA6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcclxuXHJcbiAgYXZhaWxhYmxlQ29sdW1uczogQXJyYXk8e1xyXG4gICAga2V5OiBzdHJpbmc7XHJcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW47XHJcbiAgICBjdXN0b21OYW1lPzogc3RyaW5nO1xyXG4gIH0+ID0gW107XHJcblxyXG4gIGV4cG9ydFR5cGU6IEV4cG9ydFR5cGUgPSBFeHBvcnRUeXBlLkVYQ0VMO1xyXG4gIGZpbGVOYW1lOiBzdHJpbmcgPSAnJztcclxuICBzaG93RmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhY3RpdmVUYWJJbmRleDogbnVtYmVyID0gMDtcclxuICBjdXJyZW50RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgcHJldmlld0RhdGE6IGFueVtdID0gW107XHJcblxyXG4gIG9wdGlvbnM6IEZvcm1seUZvcm1PcHRpb25zID0ge307XHJcbiAgQElucHV0KCkgZW5hYmxlUXVlcnlCdWlsZGVyOmJvb2xlYW4gPXRydWU7XHJcbiAgQElucHV0KCkgbG9jYWxFeHBvcnQ6Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgQElucHV0KCkgcXVlcnlTdHJpbmc6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGFwaU5hbWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBASW5wdXQoKSBtb2RlbDogYW55ID0ge307XHJcbiBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcgPSB7XHJcbiAgICBjb2x1bW5zOiB7fSxcclxuICAgICAgZmlsdGVyczogdGhpcy5tb2RlbCxcclxuICAgICAgZXhwb3J0VHlwZTogdGhpcy5leHBvcnRUeXBlLFxyXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZVxyXG4gIH07XHJcbiAgZXhwb3J0VHlwZXMgPSBbXHJcbiAgICB7IHZhbHVlOiBFeHBvcnRUeXBlLkVYQ0VMLCBsYWJlbDogJ0VYQ0VMJywgaWNvbjogJ3BpIHBpLWZpbGUtZXhjZWwnIH0sXHJcbiAgICB7IHZhbHVlOiBFeHBvcnRUeXBlLlBERiwgbGFiZWw6ICdQREYnLCBpY29uOiAncGkgcGktZmlsZS1wZGYnIH0sXHJcbiAgICB7IHZhbHVlOiBFeHBvcnRUeXBlLkhUTUwsIGxhYmVsOiAnSFRNTCcsIGljb246ICdwaSBwaS1jb2RlJyB9LFxyXG4gICAgeyB2YWx1ZTogRXhwb3J0VHlwZS5QUklOVCwgbGFiZWw6ICdQUklOVCcsIGljb246ICdwaSBwaS1wcmludCcgfVxyXG4gIF07XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcclxucHJpdmF0ZSByZXN0U2VydmljZTpSZXN0U2VydmljZSA9IGluamVjdCggUmVzdFNlcnZpY2UpO1xyXG4gcHJpdmF0ZSBxdWVyeUJ1aWxkZXIgPSBpbmplY3QoUXVlcnlCdWlsZGVyU2VydmljZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZixcclxuICAgIHB1YmxpYyBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWdcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5maWx0ZXJGaWVsZHMgPSB0aGlzLmNvbmZpZy5kYXRhPy5maWx0ZXJGaWVsZHMgfHwgW107XHJcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcclxuICAgICB0aGlzLmJ1aWxkUXVlcnlVSUZpZWxkcygpO1xyXG4gIH1cclxuIGdldCBmaWx0ZXJDb3VudCgpe1xyXG4gICAgY29uc3QgZmlsdGVycyA9ICgodGhpcy5tb2RlbD8uYWR2YW5jZWRGaWx0ZXJzID8/IFtdKVswXT8uY29uZGl0aW9ucz8ubGVuZ3RoIHx8IDApICtcclxuICAgICgodGhpcy5tb2RlbD8uc29ydGluZyA/PyBbXSk/Lmxlbmd0aCB8fCAwKSArXHJcbiAgICAodGhpcy5tb2RlbD8ucGFnaW5hdGlvbiAmJiB0aGlzLm1vZGVsPy5wYWdpbmF0aW9uPy50b3AgPyAxIDogMCk7XHJcbiAgICByZXR1cm4gZmlsdGVycztcclxuICB9XHJcbiAgcHJpdmF0ZSBidWlsZFF1ZXJ5VUlGaWVsZHMoKSB7XHJcbiAgICBpZiAodGhpcy5lbmFibGVRdWVyeUJ1aWxkZXIpIHtcclxuICAgICAgdGhpcy5maWVsZHNfID0gdGhpcy5xdWVyeUJ1aWxkZXIuYnVpbGRRdWVyeVVJRmllbGRzKHRoaXMuZmlsdGVyRmllbGRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmllbGRzXyA9IHRoaXMuZmlsdGVyRmllbGRzIDtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCkge1xyXG4gICAgdGhpcy5hcGlOYW1lID0gdGhpcy5jb25maWcuZGF0YT8uYXBpTmFtZSB8fCAnJztcclxuICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb25zID0gdGhpcy5jb25maWcuZGF0YT8uY29sdW1ucyB8fCB7fTtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29sdW1uRGVmaW5pdGlvbnMpLmxlbmd0aCA+IDApIHtcclxuICAgIHRoaXMuYXZhaWxhYmxlQ29sdW1ucyA9IE9iamVjdC5rZXlzKGNvbHVtbkRlZmluaXRpb25zKS5tYXAoa2V5ID0+ICh7XHJcbiAgICAgIGtleTogU3RyaW5nKGtleSksXHJcbiAgICAgIGRpc3BsYXlOYW1lOiBTdHJpbmcoY29sdW1uRGVmaW5pdGlvbnNba2V5XSksXHJcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxyXG4gICAgICBjdXN0b21OYW1lOiBTdHJpbmcoY29sdW1uRGVmaW5pdGlvbnNba2V5XSlcclxuICAgIH0pKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5hdmFpbGFibGVDb2x1bW5zID0gKHRoaXMuZmlsdGVyRmllbGRzIHx8IFtdKS5tYXAoZiA9PiB7XHJcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhmLmtleSA/PyAnJyk7XHJcbiAgICAgIGNvbnN0IGxhYmVsID0gU3RyaW5nKGYucHJvcHM/LmxhYmVsID8/IGtleSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGxhYmVsKSxcclxuICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcclxuICAgICAgICBjdXN0b21OYW1lOiBsYWJlbFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgICB0aGlzLmZpbHRlckZpZWxkcyA9IHRoaXMuY29uZmlnLmRhdGE/LmZpbHRlckZpZWxkcyB8fCB0aGlzLmdldERlZmF1bHRGaWx0ZXJGaWVsZHMoKTtcclxuICAgIHRoaXMubW9kZWwgPSB0aGlzLmNvbmZpZy5kYXRhPy5tb2RlbCB8fCB7fTtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSB0aGlzLmNvbmZpZy5kYXRhPy5kZWZhdWx0RmlsZU5hbWUgfHwgYGV4cG9ydF8ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdfWA7XHJcblxyXG4gICAgLy8gTG9hZCBzYW1wbGUgZGF0YSBmb3IgcHJldmlld1xyXG4gICAgdGhpcy5sb2FkUHJldmlld0RhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdEZpbHRlckZpZWxkcygpOiBGb3JtbHlGaWVsZENvbmZpZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6ICdzZWFyY2gnLFxyXG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdTRUFSQ0gnKSxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdFTlRFUl9TRUFSQ0hfVEVSTScpLFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZENvbHVtbnMoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5zZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydFR5cGVDaGFuZ2UodHlwZTogRXhwb3J0VHlwZSkge1xyXG4gICAgdGhpcy5leHBvcnRUeXBlID0gdHlwZTtcclxuICAgIC8vIEF1dG8tc3dpdGNoIHRvIHByZXZpZXcgdGFiIGZvciBIVE1ML1ByaW50XHJcbiAgICBpZiAoKHR5cGUgPT09IEV4cG9ydFR5cGUuSFRNTCB8fCB0eXBlID09PSBFeHBvcnRUeXBlLlBSSU5UKSAmJiB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Db2x1bW5Ub2dnbGUoY29sdW1uOiBhbnkpIHtcclxuICAgIGlmICghY29sdW1uLnNlbGVjdGVkKSB7XHJcbiAgICAgIGNvbHVtbi5jdXN0b21OYW1lID0gY29sdW1uLmRpc3BsYXlOYW1lO1xyXG4gICAgfVxyXG4gICAgLy8gUmVmcmVzaCBwcmV2aWV3IHdoZW4gY29sdW1ucyBjaGFuZ2VcclxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYkluZGV4ID09PSAxKSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVQcmV2aWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkN1c3RvbU5hbWVDaGFuZ2UoY29sdW1uOiBhbnkpIHtcclxuICAgIGlmICghY29sdW1uLmN1c3RvbU5hbWU/LnRyaW0oKSkge1xyXG4gICAgICBjb2x1bW4uY3VzdG9tTmFtZSA9IGNvbHVtbi5kaXNwbGF5TmFtZTtcclxuICAgIH1cclxuICAgIC8vIFJlZnJlc2ggcHJldmlldyB3aGVuIGNvbHVtbiBuYW1lcyBjaGFuZ2VcclxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYkluZGV4ID09PSAxKSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVQcmV2aWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBbGxDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5hdmFpbGFibGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgY29sLmN1c3RvbU5hbWUgPSBjb2wuZGlzcGxheU5hbWU7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2VuZXJhdGVQcmV2aWV3KCk7XHJcbiAgfVxyXG5cclxuICBkZXNlbGVjdEFsbENvbHVtbnMoKSB7XHJcbiAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb2wuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5wcmV2aWV3RGF0YSA9IFtdO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBnZW5lcmF0ZVByZXZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMucHJldmlld0RhdGEgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluIGEgcmVhbCBhcHBsaWNhdGlvbiwgeW91IHdvdWxkIGNhbGwgeW91ciBBUEkgaGVyZVxyXG4gICAgLy8gRm9yIGRlbW8gcHVycG9zZXMsIHdlJ3JlIHVzaW5nIHRoZSBzYW1wbGUgZGF0YVxyXG4gICAgdGhpcy5sb2FkUHJldmlld0RhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldFByZXZpZXdWYWx1ZShyb3c6IGFueSwgY29sdW1uS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBwcm9wZXJ0aWVzIHdpdGggZG90IG5vdGF0aW9uXHJcbiAgICByZXR1cm4gY29sdW1uS2V5LnNwbGl0KCcuJykucmVkdWNlKChvYmosIGtleSkgPT4gb2JqPy5ba2V5XSwgcm93KSB8fCAnLSc7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldEV4cG9ydEJ1dHRvblRleHQoKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodGhpcy5leHBvcnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRXhwb3J0VHlwZS5QUklOVDpcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnUFJJTlQnKTtcclxuICAgICAgY2FzZSBFeHBvcnRUeXBlLkhUTUw6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0dFTkVSQVRFX1JFUE9SVCcpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdFWFBPUlQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgLy8gVXNlIHRoZSBuZXcgUXVlcnlCdWlsZGVyU2VydmljZSBtZXRob2RzXHJcbiAgICBjb25zdCBvZGF0YVBhcmFtcyA9IHRoaXMucXVlcnlCdWlsZGVyLmJ1aWxkT0RhdGFGcm9tUXVlcnlNb2RlbCh0aGlzLm1vZGVsLCB0aGlzLmZpbHRlckZpZWxkcyk7XHJcbiAgICAvLyB0aGlzLm9kYXRhU2VhcmNoLmVtaXQob2RhdGFQYXJhbXMpO1xyXG5cclxuICAgIC8vIEdlbmVyYXRlIHF1ZXJ5IHN0cmluZyB1c2luZyB0aGUgdW5pZmllZCBtZXRob2RcclxuICAgIHRoaXMucXVlcnlTdHJpbmcgPSB0aGlzLnF1ZXJ5QnVpbGRlci50b09EYXRhUXVlcnlTdHJpbmcob2RhdGFQYXJhbXMpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ09EYXRhIFF1ZXJ5IFN0cmluZzonLCBxdWVyeVN0cmluZyk7XHJcbiAgICBpZih0aGlzLm1vZGVsPy5wYWdpbmF0aW9uICYmIHRoaXMubW9kZWw/LnBhZ2luYXRpb24/LnRvcCl7XHJcbiAgICAvLyB0aGlzLnBhZ2luYXRpb25DaGFuZ2UuZW1pdCh7XHJcbiAgICAvLyAgIHRvcDp0aGlzLm1vZGVsPy5wYWdpbmF0aW9uPy50b3AsXHJcbiAgICAvLyAgICAgLy8gc2tpcDosXHJcbiAgICAvLyB9KTtcclxuICB9XHJcbiAgLy8gICB0aGlzLnNlYXJjaC5lbWl0KFxyXG4gIC8vICAgICB7XHJcbiAgLy8gICAgICAgZmlsdGVyOnRoaXMubW9kZWxbJ2ZpbHRlciddLFxyXG4gIC8vICAgICAgIHF1ZXJ5OnRoaXMucXVlcnlTdHJpbmcsXHJcbiAgLy8gICAgICAgLy8gc29ydGluZzosXHJcbiAgLy8gICAgICAgLy8gdG9wOixcclxuICAvLyAgICAgICAvLyBza2lwOixcclxuXHJcbiAgLy8gICB9XHJcbiAgLy8gKTtcclxuICB0aGlzLmxvYWRQcmV2aWV3RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25SZXNldCgpIHtcclxuICAgIHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbC5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIGNvbC5jdXN0b21OYW1lID0gY29sLmRpc3BsYXlOYW1lO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmV4cG9ydFR5cGUgPSBFeHBvcnRUeXBlLkVYQ0VMO1xyXG4gICAgdGhpcy5maWxlTmFtZSA9IGBleHBvcnRfJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXX1gO1xyXG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLm1vZGVsID0ge307XHJcbiAgICB0aGlzLmFjdGl2ZVRhYkluZGV4ID0gMDtcclxuICAgIHRoaXMuZ2VuZXJhdGVQcmV2aWV3KCk7XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vIFByZXBhcmUgY29sdW1ucyBtYXBwaW5nXHJcbiAgICBjb25zdCBjb2x1bW5zTWFwcGluZzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb2x1bW5zTWFwcGluZ1tjb2wua2V5XSA9IGNvbC5jdXN0b21OYW1lIHx8IGNvbC5kaXNwbGF5TmFtZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGV4cG9ydENvbmZpZyA9IHtcclxuICAgICAgY29sdW1uczogY29sdW1uc01hcHBpbmcsXHJcbiAgICAgIGZpbHRlcnM6IHRoaXMubW9kZWwsXHJcbiAgICAgIGV4cG9ydFR5cGU6IHRoaXMuZXhwb3J0VHlwZSxcclxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWVcclxuICAgIH07XHJcblxyXG4gICAgLy8gSGFuZGxlIGV4cG9ydCBiYXNlZCBvbiB0eXBlXHJcbiAgICBzd2l0Y2ggKHRoaXMuZXhwb3J0VHlwZSkge1xyXG4gICAgICBjYXNlIEV4cG9ydFR5cGUuUFJJTlQ6XHJcbiAgICAgICAgdGhpcy5wcmludFByZXZpZXcoKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFeHBvcnRUeXBlLkhUTUw6XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUh0bWxSZXBvcnQoZXhwb3J0Q29uZmlnKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLmhhbmRsZUFwaUV4cG9ydChleHBvcnRDb25maWcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUh0bWxSZXBvcnQoY29uZmlnOiBhbnkpIHtcclxuICAgIGNvbnN0IGh0bWxDb250ZW50ID0gdGhpcy5wcmV2aWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtodG1sQ29udGVudF0sIHsgdHlwZTogJ3RleHQvaHRtbCcgfSk7XHJcbiAgICB0aGlzLmRvd25sb2FkRmlsZShibG9iLCBgJHtjb25maWcuZmlsZU5hbWV9Lmh0bWxgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQXBpRXhwb3J0KGNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgIGNvbnN0IGZpbHRlcnM6IFBhcnRpYWw8YW55PiA9IHtcclxuICAgICAgZmlsZU5hbWU6Y29uZmlnLmZpbGVOYW1lIHx8ICcnLFxyXG4gICAgICBxdWVyeTp0aGlzLnF1ZXJ5U3RyaW5nLFxyXG4gICAgICBleHBvcnRUeXBlOmNvbmZpZy5leHBvcnRUeXBlLFxyXG4gICAgICBjb2x1bW5zOkpTT04uc3RyaW5naWZ5KGNvbmZpZy5jb2x1bW5zKSxcclxuICAgIC8vIC4uLnRoaXMuY3VycmVudEZpbHRlcnMsXHJcbiAgICAvLyAuLi50aGlzLnBhZ2VGaWx0ZXJzLFxyXG4gICAgLy8gLi4uKHRoaXMuc2VhcmNoR2xvYmFsID8geyBmaWx0ZXI6IHRoaXMuc2VhcmNoR2xvYmFsIH0gOiB7fSksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMoZmlsdGVycykucmVkdWNlKChhY2M6YW55LCBrZXkpID0+IHtcclxuICAgICAgICBhY2Nba2V5XSA9IGZpbHRlcnNba2V5XTtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCB7fSk7XHJcblxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXF1ZXN0PGFueSwgYW55PihcclxuICAgICAge1xyXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgdXJsOiBgLyR7dGhpcy5hcGlOYW1lfS9leHBvcnRgLFxyXG4gICAgICAgIC8vIGJvZHk6IHsgLi4uY29uZmlnLmZpbHRlcnMsIC4uLnRoaXMubW9kZWwgfSxcclxuICAgICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgICB9LFxyXG4gICAgICB7IGFwaU5hbWU6IHRoaXMuYXBpTmFtZSB9XHJcbiAgICApXHJcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZEZpbGUocmVzcG9uc2UsIGAke2NvbmZpZy5maWxlTmFtZX0uJHt0aGlzLmdldEZpbGVFeHRlbnNpb24oY29uZmlnLmV4cG9ydFR5cGUpfWApO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXhwb3J0IGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByZXZpZXdEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGZpbHRlcnM6IFBhcnRpYWw8YW55PiA9IHtcclxuICAgICAgcXVlcnk6dGhpcy5xdWVyeVN0cmluZyxcclxuICAgICAgZXhwb3J0VHlwZTpFeHBvcnRUeXBlLkxJU1QsXHJcbiAgICAgIGNvbHVtbnM6SlNPTi5zdHJpbmdpZnkodGhpcy5nZXRQcmV2aWV3Q29sdW1ucygpKSxcclxuICAgIC8vIC4uLnRoaXMuY3VycmVudEZpbHRlcnMsXHJcbiAgICAvLyAuLi50aGlzLnBhZ2VGaWx0ZXJzLFxyXG4gICAgLy8gLi4uKHRoaXMuc2VhcmNoR2xvYmFsID8geyBmaWx0ZXI6IHRoaXMuc2VhcmNoR2xvYmFsIH0gOiB7fSksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMoZmlsdGVycykucmVkdWNlKChhY2M6YW55LCBrZXkpID0+IHtcclxuICAgICAgICBhY2Nba2V5XSA9IGZpbHRlcnNba2V5XTtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCB7fSk7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlcXVlc3Q8YW55LCBhbnk+KFxyXG4gICAgICB7XHJcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICB1cmw6IGAvJHt0aGlzLmFwaU5hbWV9L2V4cG9ydGAsXHJcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgfSxcclxuICAgICAgeyBhcGlOYW1lOiB0aGlzLmFwaU5hbWUgfVxyXG4gICAgKVxyXG4gICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucHJldmlld0RhdGEgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXZpZXcgbG9hZCBmYWlsZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJldmlld0NvbHVtbnMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBjb25zdCBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbHVtbnNbY29sLmtleV0gPSBjb2wuY3VzdG9tTmFtZSB8fCBjb2wuZGlzcGxheU5hbWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb3dubG9hZEZpbGUoYmxvYjogQmxvYiwgZmlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWxlRXh0ZW5zaW9uKGV4cG9ydFR5cGU6IEV4cG9ydFR5cGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChleHBvcnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRXhwb3J0VHlwZS5FWENFTDpcclxuICAgICAgICByZXR1cm4gJ3hsc3gnO1xyXG4gICAgICBjYXNlIEV4cG9ydFR5cGUuUERGOlxyXG4gICAgICAgIHJldHVybiAncGRmJztcclxuICAgICAgY2FzZSBFeHBvcnRUeXBlLkhUTUw6XHJcbiAgICAgICAgcmV0dXJuICdodG1sJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3hsc3gnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgIHByaW50UHJldmlldygpIHtcclxuICAgIGNvbnN0IHByaW50Q29udGVudCA9IHRoaXMucHJldmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcclxuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MO1xyXG5cclxuICAgIC8vIENyZWF0ZSBwcmludCB3aW5kb3dcclxuICAgIGNvbnN0IHByaW50V2luZG93ID0gd2luZG93Lm9wZW4oJycsICdfYmxhbmsnLCAnd2lkdGg9ODAwLGhlaWdodD02MDAnKTtcclxuICAgIGlmIChwcmludFdpbmRvdykge1xyXG4gICAgICBwcmludFdpbmRvdy5kb2N1bWVudC53cml0ZShgXHJcbiAgICAgICAgPCFET0NUWVBFIGh0bWw+XHJcbiAgICAgICAgPGh0bWw+XHJcbiAgICAgICAgICA8aGVhZD5cclxuICAgICAgICAgICAgPHRpdGxlPiR7dGhpcy5maWxlTmFtZX08L3RpdGxlPlxyXG4gICAgICAgICAgICA8c3R5bGU+XHJcbiAgICAgICAgICAgICAgYm9keSB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgbWFyZ2luOiAyMHB4OyB9XHJcbiAgICAgICAgICAgICAgdGFibGUgeyB3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfVxyXG4gICAgICAgICAgICAgIHRoLCB0ZCB7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDsgfVxyXG4gICAgICAgICAgICAgIHRoIHsgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH1cclxuICAgICAgICAgICAgICAuaGVhZGVyIHsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAyMHB4OyB9XHJcbiAgICAgICAgICAgICAgLmZvb3RlciB7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMjBweDsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzY2NjsgfVxyXG4gICAgICAgICAgICAgIEBtZWRpYSBwcmludCB7XHJcbiAgICAgICAgICAgICAgICBib2R5IHsgbWFyZ2luOiAwOyB9XHJcbiAgICAgICAgICAgICAgICAubm8tcHJpbnQgeyBkaXNwbGF5OiBub25lOyB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L3N0eWxlPlxyXG4gICAgICAgICAgPC9oZWFkPlxyXG4gICAgICAgICAgPGJvZHk+XHJcbiAgICAgICAgICAgICR7cHJpbnRDb250ZW50fVxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyIG5vLXByaW50XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPVwid2luZG93LnByaW50KClcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMjBweDsgbWFyZ2luOiAxMHB4OyBiYWNrZ3JvdW5kOiAjMDA3YmZmOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICBQcmludCBSZXBvcnRcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJ3aW5kb3cuY2xvc2UoKVwiIHN0eWxlPVwicGFkZGluZzogMTBweCAyMHB4OyBtYXJnaW46IDEwcHg7IGJhY2tncm91bmQ6ICM2Yzc1N2Q7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIENsb3NlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9ib2R5PlxyXG4gICAgICAgIDwvaHRtbD5cclxuICAgICAgYCk7XHJcbiAgICAgIHByaW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7XHJcblxyXG4gICAgICAvLyBBdXRvLXByaW50IHdoZW4gd2luZG93IGxvYWRzXHJcbiAgICAgIHByaW50V2luZG93Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBwcmludFdpbmRvdy5mb2N1cygpO1xyXG4gICAgICAgIC8vIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBmb3IgYXV0by1wcmludFxyXG4gICAgICAgIC8vIHByaW50V2luZG93LnByaW50KCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIiwiXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBoLWZ1bGwgYmctd2hpdGUgZGFyazpiZy1ncmF5LTkwMCByb3VuZGVkLWxnIG1heC13LTZ4bCBteC1hdXRvXCI+XHJcbiAgICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00IGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZVwiPlxyXG4gICAgICAgICAge3sgJ0VYUE9SVF9EQVRBJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvaDI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKGNsaWNrKT1cInJlZj8uY2xvc2UoKVwiXHJcbiAgICAgICAgICBjbGFzcz1cInAtMSByb3VuZGVkLWxnIGhvdmVyOmJnLWdyYXktMTAwIGRhcms6aG92ZXI6YmctZ3JheS03MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXRpbWVzIHRleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICA8IS0tIENvbnRlbnQgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgPHAtdGFicyBbdmFsdWVdPVwiYWN0aXZlVGFiSW5kZXhcIj5cclxuICAgICAgICAgIDwhLS0gQ29uZmlndXJhdGlvbiBUYWIgLS0+XHJcbiAgICAgICAgICAgIDxwLXRhYmxpc3Q+XHJcbiAgICAgICAgPHAtdGFiIHZhbHVlPVwiMFwiPnt7J0NPTkZJR1VSQVRJT04nIHwgdHJhbnNsYXRlfX08L3AtdGFiPlxyXG4gICAgICAgIDxwLXRhYiB2YWx1ZT1cIjFcIj57eydQUkVWSUVXJyB8IHRyYW5zbGF0ZX19PC9wLXRhYj5cclxuICAgIDwvcC10YWJsaXN0PlxyXG4gICAgPHAtdGFicGFuZWxzPlxyXG4gICAgICAgICAgPHAtdGFicGFuZWwgdmFsdWU9XCIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xIGxnOmdyaWQtY29scy0yIGdhcC02IHAtNCBtYXgtaC1bNjB2aF0gb3ZlcmZsb3cteS1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBMZWZ0IENvbHVtbiAtIEV4cG9ydCBTZXR0aW5ncyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS02XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEZpbGUgTmFtZSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdGSUxFX05BTUUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbGVOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBwLTMgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBkYXJrOmJvcmRlci1ncmF5LTYwMCByb3VuZGVkLWxnIGJnLXdoaXRlIGRhcms6YmctZ3JheS04MDAgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VOVEVSX0ZJTEVfTkFNRScgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRXhwb3J0IFR5cGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnRVhQT1JUX0ZPUk1BVCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0eXBlIG9mIGV4cG9ydFR5cGVzXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtcmFkaW9CdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2V4cG9ydFR5cGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInR5cGUudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImV4cG9ydFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJgJHt0eXBlLnZhbHVlfWBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkV4cG9ydFR5cGVDaGFuZ2UodHlwZS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1yLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1yYWRpb0J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cInR5cGUudmFsdWVcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIHRleHQtc20gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cInR5cGUuaWNvbiArICcgbXItMidcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHR5cGUubGFiZWwgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBGaWx0ZXJzIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgZGFyazp0ZXh0LWdyYXktMzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyAnU0VBUkNIX0ZJTFRFUlMnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RmlsdGVycyA9ICFzaG93RmlsdGVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc20gdGV4dC1ibHVlLTYwMCBkYXJrOnRleHQtYmx1ZS00MDAgaG92ZXI6dW5kZXJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBzaG93RmlsdGVycyA/ICgnSElERV9GSUxURVJTJyB8IHRyYW5zbGF0ZSkgOiAoJ1NIT1dfRklMVEVSUycgfCB0cmFuc2xhdGUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwic2hvd0ZpbHRlcnNcIiBjbGFzcz1cInNwYWNlLXktNCBwLTQgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMCByb3VuZGVkLWxnIGJnLWdyYXktNTAgZGFyazpiZy1ncmF5LTgwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtbHktZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cImZpZWxkc19cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIm1vZGVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtbHktZm9ybT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gUmlnaHQgQ29sdW1uIC0gQ29sdW1uIFNlbGVjdGlvbiAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS00XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnU0VMRUNUX0NPTFVNTlMnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsQ29sdW1ucygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14cyB0ZXh0LWJsdWUtNjAwIGRhcms6dGV4dC1ibHVlLTQwMCBob3Zlcjp1bmRlcmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdTRUxFQ1RfQUxMJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlc2VsZWN0QWxsQ29sdW1ucygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14cyB0ZXh0LWJsdWUtNjAwIGRhcms6dGV4dC1ibHVlLTQwMCBob3Zlcjp1bmRlcmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdERVNFTEVDVF9BTEwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1heC1oLTgwIG92ZXJmbG93LXktYXV0byBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwIHJvdW5kZWQtbGdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGF2YWlsYWJsZUNvbHVtbnNcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHAtMyBib3JkZXItYiBib3JkZXItZ3JheS0xMDAgZGFyazpib3JkZXItZ3JheS02MDAgbGFzdDpib3JkZXItYi0wIGhvdmVyOmJnLWdyYXktNTAgZGFyazpob3ZlcjpiZy1ncmF5LTcwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4uc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sdW1uLmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Db2x1bW5Ub2dnbGUoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1yLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiY29sdW1uLmtleVwiIGNsYXNzPVwiZmxleC0xIGN1cnNvci1wb2ludGVyIHRleHQtc20gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5kaXNwbGF5TmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5zZWxlY3RlZFwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLmN1c3RvbU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkN1c3RvbU5hbWVDaGFuZ2UoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4uZGlzcGxheU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteHMgcC0xIGJvcmRlciBib3JkZXItZ3JheS0zMDAgZGFyazpib3JkZXItZ3JheS02MDAgcm91bmRlZCBiZy13aGl0ZSBkYXJrOmJnLWdyYXktODAwIHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIHctMzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NVU1RPTV9DT0xVTU5fTkFNRScgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGVkIENvbHVtbnMgU3VtbWFyeSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMFwiIGNsYXNzPVwicC0zIGJnLWJsdWUtNTAgZGFyazpiZy1ibHVlLTkwMC8yMCByb3VuZGVkLWxnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWJsdWUtNzAwIGRhcms6dGV4dC1ibHVlLTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdTRUxFQ1RFRF9DT0xVTU5TX0NPVU5UJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCB9IH19XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvcC10YWJwYW5lbD5cclxuXHJcbiAgICAgICAgICA8IS0tIFByZXZpZXcgVGFiIC0tPlxyXG4gICAgICAgICAgIDwhLS0gW2Rpc2FibGVkXT1cInNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT09IDBcIiAtLT5cclxuICAgICAgICAgIDxwLXRhYnBhbmVsIHZhbHVlPVwiMVwiID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNCBtYXgtaC1bNjB2aF0gb3ZlcmZsb3cteS1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBQcmV2aWV3IEFjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgJ1JFUE9SVF9QUkVWSUVXJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImV4cG9ydFR5cGUgPT09IDEgfHwgZXhwb3J0VHlwZSA9PT0gNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInByaW50UHJldmlldygpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgZGFyazp0ZXh0LWdyYXktMzAwIGJvcmRlciBib3JkZXItZ3JheS0zMDAgZGFyazpib3JkZXItZ3JheS02MDAgcm91bmRlZC1sZyBob3ZlcjpiZy1ncmF5LTUwIGRhcms6aG92ZXI6YmctZ3JheS03MDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXByaW50IG1yLTJcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ1BSSU5UJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVByZXZpZXcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIGJnLWJsdWUtNjAwIHJvdW5kZWQtbGcgaG92ZXI6YmctYmx1ZS03MDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXJlZnJlc2ggbXItMlwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnUkVGUkVTSF9QUkVWSUVXJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFByZXZpZXcgQ29udGVudCAtLT5cclxuICAgICAgICAgICAgICA8ZGl2ICNwcmV2aWV3Q29udGFpbmVyIGNsYXNzPVwiYmctd2hpdGUgZGFyazpiZy1ncmF5LTgwMCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwIHJvdW5kZWQtbGcgcC02XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFJlcG9ydCBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbWItNiBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDAgcGItNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGVcIj57eyBmaWxlTmFtZSB9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5LTYwMCBkYXJrOnRleHQtZ3JheS00MDAgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdHRU5FUkFURURfT04nIHwgdHJhbnNsYXRlIH19OiB7eyBjdXJyZW50RGF0ZSB8IGRhdGU6J21lZGl1bScgfX1cclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSZXBvcnQgVGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmZsb3cteC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cIm1pbi13LWZ1bGwgZGl2aWRlLXkgZGl2aWRlLWdyYXktMjAwIGRhcms6ZGl2aWRlLWdyYXktNzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkIGNsYXNzPVwiYmctZ3JheS01MCBkYXJrOmJnLWdyYXktNzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygc2VsZWN0ZWRDb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTYgcHktMyB0ZXh0LWxlZnQgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIGRhcms6dGV4dC1ncmF5LTMwMCB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTYwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5jdXN0b21OYW1lIHx8IGNvbHVtbi5kaXNwbGF5TmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImJnLXdoaXRlIGRhcms6YmctZ3JheS04MDAgZGl2aWRlLXkgZGl2aWRlLWdyYXktMjAwIGRhcms6ZGl2aWRlLWdyYXktNzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwcmV2aWV3RGF0YTsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLWdyYXktNTBdPVwiaSAlIDIgPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kYXJrOmJnLWdyYXktOTAwXT1cImkgJSAyID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygc2VsZWN0ZWRDb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTYgcHktNCB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LXNtIHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS02MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRQcmV2aWV3VmFsdWUocm93LCBjb2x1bW4ua2V5KSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcmV2aWV3RGF0YS5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LThcIj5cclxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmJveCB0ZXh0LTR4bCB0ZXh0LWdyYXktNDAwIGRhcms6dGV4dC1ncmF5LTUwMCBtYi00XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwXCI+e3sgJ05PX1BSRVZJRVdfREFUQScgfCB0cmFuc2xhdGUgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2VuZXJhdGVQcmV2aWV3KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtNCBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWJsdWUtNjAwIGRhcms6dGV4dC1ibHVlLTQwMCBob3Zlcjp1bmRlcmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnR0VORVJBVEVfUFJFVklFVycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFJlcG9ydCBGb290ZXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtNiBib3JkZXItdCBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDAgcHQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnUEFHRScgfCB0cmFuc2xhdGUgfX0gMSBvZiAxXHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFByZXZpZXcgSW5mbyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCBwLTMgYmctZ3JlZW4tNTAgZGFyazpiZy1ncmVlbi05MDAvMjAgcm91bmRlZC1sZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JlZW4tNzAwIGRhcms6dGV4dC1ncmVlbi0zMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZSBtci0yXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICB7eyAnUFJFVklFV19JTkZPJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvcC10YWJwYW5lbD5cclxuXHJcbiAgICAgICAgICA8L3AtdGFicGFuZWxzPlxyXG4gICAgICAgIDwvcC10YWJzPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRm9vdGVyIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwIHB4LTYgcHktNCBiZy1ncmF5LTUwIGRhcms6YmctZ3JheS04MDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25SZXNldCgpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMCBob3Zlcjp0ZXh0LWdyYXktOTAwIGRhcms6aG92ZXI6dGV4dC13aGl0ZSBob3ZlcjpiZy1ncmF5LTEwMCBkYXJrOmhvdmVyOmJnLWdyYXktNzAwIHJvdW5kZWQtbGcgdHJhbnNpdGlvbi1jb2xvcnNcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXJlZnJlc2ggbWwtMlwiPjwvaT5cclxuICAgICAgICAgICAge3sgJ1JFU0VUJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZWY/LmNsb3NlKClcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDAgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBkYXJrOmJvcmRlci1ncmF5LTYwMCByb3VuZGVkLWxnIGhvdmVyOmJnLWdyYXktNTAgZGFyazpob3ZlcjpiZy1ncmF5LTcwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICB7eyAnQ0FOQ0VMJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25FeHBvcnQoKVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA9PT0gMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIGJnLWJsdWUtNjAwIHJvdW5kZWQtbGcgaG92ZXI6YmctYmx1ZS03MDAgZGlzYWJsZWQ6YmctZ3JheS0zMDAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIHRyYW5zaXRpb24tY29sb3JzXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1kb3dubG9hZCBtbC0yXCIgW2NsYXNzLmFuaW1hdGUtc3Bpbl09XCJsb2FkaW5nXCI+PC9pPlxyXG4gICAgICAgICAgICAgIHt7IGdldEV4cG9ydEJ1dHRvblRleHQoKSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gQGlmKHNob3dGaWx0ZXJzKXtcclxuPHAtZHJhd2VyXHJcbiAgWyh2aXNpYmxlKV09XCJzaG93RmlsdGVyc1wiXHJcbiAgcG9zaXRpb249XCJyaWdodFwiXHJcbiAgW3N0eWxlQ2xhc3NdPVwiJyF3LWZ1bGwgbWQ6IXctODAgbGc6IXctWzQwcmVtXSAhaC1mdWxsJyBcIlxyXG4gIFttb2RhbF09XCJ0cnVlXCJcclxuICBbZGlzbWlzc2libGVdPVwidHJ1ZVwiXHJcbiAgc3R5bGVDbGFzcz1cInAtNCB3LWZ1bGwgbWF4LXctbWQgbWF4LWgtWzkwdmhdIGZsZXggZmxleC1jb2xcIlxyXG4+XHJcbiAgPCEtLSBFbnRpcmUgZm9ybSB3cmFwcGVyIC0tPlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpOyBzaG93RmlsdGVycz1mYWxzZVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTFcIj5cclxuICAgIDwhLS0gU2Nyb2xsYWJsZSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XHJcbiAgICAgIDxmb3JtbHktZm9ybVxyXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgIFtmaWVsZHNdPVwiZmllbGRzX1wiXHJcbiAgICAgICAgW21vZGVsXT1cIm1vZGVsXCJcclxuICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcclxuICAgICAgPlxyXG4gICAgICA8L2Zvcm1seS1mb3JtPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZm9ybT5cclxuICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBtdC0yIHNwYWNlLXgtMiBmbGV4LW5vbmVcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgIHBCdXR0b24gc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAoY2xpY2spPVwiIG9uU3VibWl0KCk7IHNob3dGaWx0ZXJzPWZhbHNlXCJcclxuICAgICAgIGxhYmVsPVwie3sgJ1NFQVJDSCcgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgIChjbGljayk9XCJvblJlc2V0KCk7IHNob3dGaWx0ZXJzPWZhbHNlXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7ICdDTEVBUicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvcC1kcmF3ZXI+XHJcblxyXG4gfVxyXG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxpdGUuZnJhbWV3b3JrLW5nLnVpLmNvcmUtZ2VuZXJpYy1yZXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25nLnVpLmNvcmUvZ2VuZXJpYy1yZXBvcnQvc3JjL2VsaXRlLmZyYW1ld29yay1uZy51aS5jb3JlLWdlbmVyaWMtcmVwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAM,mBAAmB,CAAC;AACjC,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;AAC5K,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;AACvJ,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;AACvJ;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,QAAQ;AAC1B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,OAAO,EAAE,CAAC,YAAY,CAAC;AAC3C,iBAAiB;AACjB,SAAS,CAAC,EAAE,CAAC;;ACmBH,IAAC;AACX,CAAC,UAAU,UAAU,EAAE;AACvB,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;AAC7C,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO;AACjD,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO;AACjD,CAAC,EAAE,UAAU,KAAK,UAAU,GAAG,EAAE,CAAC,CAAC;AAC5B,MAAM,sBAAsB,CAAC;AACpC,IAAI,GAAG;AACP,IAAI,MAAM;AACV,IAAI,gBAAgB;AACpB,IAAI,YAAY,GAAG,EAAE;AACrB,IAAI,OAAO,GAAG,EAAE;AAChB,IAAI,gBAAgB,GAAG,EAAE;AACzB,IAAI,UAAU,GAAG,UAAU,CAAC,KAAK;AACjC,IAAI,QAAQ,GAAG,EAAE;AACjB,IAAI,WAAW,GAAG,KAAK;AACvB,IAAI,OAAO,GAAG,KAAK;AACnB,IAAI,cAAc,GAAG,CAAC;AACtB,IAAI,WAAW,GAAG,IAAI,IAAI,EAAE;AAC5B,IAAI,WAAW,GAAG,EAAE;AACpB,IAAI,OAAO,GAAG,EAAE;AAChB,IAAI,kBAAkB,GAAG,IAAI;AAC7B,IAAI,WAAW,GAAG,KAAK;AACvB,IAAI,WAAW,GAAG,EAAE;AACpB,IAAI,OAAO,GAAG,EAAE;AAChB,IAAI,KAAK,GAAG,EAAE;AACd,IAAI,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;AAC5B,IAAI,YAAY,GAAG;AACnB,QAAQ,OAAO,EAAE,EAAE;AACnB,QAAQ,OAAO,EAAE,IAAI,CAAC,KAAK;AAC3B,QAAQ,UAAU,EAAE,IAAI,CAAC,UAAU;AACnC,QAAQ,QAAQ,EAAE,IAAI,CAAC;AACvB,KAAK;AACL,IAAI,WAAW,GAAG;AAClB,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE;AAC7E,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE;AACvE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;AACrE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa;AACtE,KAAK;AACL,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE;AAC5B,IAAI,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACrC,IAAI,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC9C,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE;AAC7B,QAAQ,IAAI,CAAC,GAAG,GAAG,GAAG;AACtB,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM;AAC5B;AACA,IAAI,QAAQ,GAAG;AACf,QAAQ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,IAAI,EAAE;AAChE,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,QAAQ,IAAI,CAAC,kBAAkB,EAAE;AACjC;AACA,IAAI,IAAI,WAAW,GAAG;AACtB,QAAQ,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxF,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC;AACtD,aAAa,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAQ,OAAO,OAAO;AACtB;AACA,IAAI,kBAAkB,GAAG;AACzB,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACrC,YAAY,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;AAClF;AACA,aAAa;AACb,YAAY,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY;AAC5C;AACA;AACA,IAAI,mBAAmB,GAAG;AAC1B,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE;AACtD,QAAQ,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE;AACjE,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACvD,YAAY,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;AAC/E,gBAAgB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAChC,gBAAgB,WAAW,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAC3D,gBAAgB,QAAQ,EAAE,IAAI;AAC9B,gBAAgB,UAAU,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACzD,aAAa,CAAC,CAAC;AACf;AACA,aAAa;AACb,YAAY,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI;AACvE,gBAAgB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;AAC/C,gBAAgB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC;AAC3D,gBAAgB,OAAO;AACvB,oBAAoB,GAAG;AACvB,oBAAoB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AAC9D,oBAAoB,QAAQ,EAAE,IAAI;AAClC,oBAAoB,UAAU,EAAE;AAChC,iBAAiB;AACjB,aAAa,CAAC;AACd;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC3F,QAAQ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;AAClD,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G;AACA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC9B;AACA,IAAI,sBAAsB,GAAG;AAC7B,QAAQ,OAAO;AACf,YAAY;AACZ,gBAAgB,GAAG,EAAE,QAAQ;AAC7B,gBAAgB,IAAI,EAAE,OAAO;AAC7B,gBAAgB,KAAK,EAAE;AACvB,oBAAoB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC3D,oBAAoB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC;AAC5E;AACA;AACA,SAAS;AACT;AACA,IAAI,IAAI,eAAe,GAAG;AAC1B,QAAQ,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAChE;AACA,IAAI,kBAAkB,CAAC,IAAI,EAAE;AAC7B,QAAQ,IAAI,CAAC,UAAU,GAAG,IAAI;AAC9B;AACA,QAAQ,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,IAAI,KAAK,UAAU,CAAC,KAAK,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AACxG,YAAY,IAAI,CAAC,cAAc,GAAG,CAAC;AACnC;AACA;AACA,IAAI,cAAc,CAAC,MAAM,EAAE;AAC3B,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAC9B,YAAY,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW;AAClD;AACA;AACA,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE;AACvC,YAAY,IAAI,CAAC,eAAe,EAAE;AAClC;AACA;AACA,IAAI,kBAAkB,CAAC,MAAM,EAAE;AAC/B,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE;AACxC,YAAY,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW;AAClD;AACA;AACA,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE;AACvC,YAAY,IAAI,CAAC,eAAe,EAAE;AAClC;AACA;AACA,IAAI,gBAAgB,GAAG;AACvB,QAAQ,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI;AAC7C,YAAY,GAAG,CAAC,QAAQ,GAAG,IAAI;AAC/B,YAAY,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW;AAC5C,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC9B;AACA,IAAI,kBAAkB,GAAG;AACzB,QAAQ,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI;AAC7C,YAAY,GAAG,CAAC,QAAQ,GAAG,KAAK;AAChC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,WAAW,GAAG,EAAE;AAC7B;AACA,IAAI,eAAe,GAAG;AACtB,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/C,YAAY,IAAI,CAAC,WAAW,GAAG,EAAE;AACjC,YAAY;AACZ;AACA;AACA;AACA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC9B;AACA,IAAI,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE;AACpC;AACA,QAAQ,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG;AAChF;AACA,IAAI,mBAAmB,GAAG;AAC1B,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAC/B,YAAY,KAAK,UAAU,CAAC,KAAK;AACjC,gBAAgB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;AACtD,YAAY,KAAK,UAAU,CAAC,IAAI;AAChC,gBAAgB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC;AAChE,YAAY;AACZ,gBAAgB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvD;AACA;AACA,IAAI,QAAQ,GAAG;AACf;AACA,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC;AACrG;AACA;AACA,QAAQ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,CAAC;AAC5E;AACA,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC9B;AACA,IAAI,OAAO,GAAG;AACd,QAAQ,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI;AAC7C,YAAY,GAAG,CAAC,QAAQ,GAAG,IAAI;AAC/B,YAAY,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW;AAC5C,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,KAAK;AAC1C,QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACzB,QAAQ,IAAI,CAAC,KAAK,GAAG,EAAE;AACvB,QAAQ,IAAI,CAAC,cAAc,GAAG,CAAC;AAC/B,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC9B;AACA,IAAI,QAAQ,GAAG;AACf,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;AAC7C,YAAY;AACZ,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI;AAC3B;AACA,QAAQ,MAAM,cAAc,GAAG,EAAE;AACjC,QAAQ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI;AAC5C,YAAY,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW;AACvE,SAAS,CAAC;AACV,QAAQ,MAAM,YAAY,GAAG;AAC7B,YAAY,OAAO,EAAE,cAAc;AACnC,YAAY,OAAO,EAAE,IAAI,CAAC,KAAK;AAC/B,YAAY,UAAU,EAAE,IAAI,CAAC,UAAU;AACvC,YAAY,QAAQ,EAAE,IAAI,CAAC;AAC3B,SAAS;AACT;AACA,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAC/B,YAAY,KAAK,UAAU,CAAC,KAAK;AACjC,gBAAgB,IAAI,CAAC,YAAY,EAAE;AACnC,gBAAgB,IAAI,CAAC,OAAO,GAAG,KAAK;AACpC,gBAAgB;AAChB,YAAY,KAAK,UAAU,CAAC,IAAI;AAChC,gBAAgB,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;AACrD,gBAAgB,IAAI,CAAC,OAAO,GAAG,KAAK;AACpC,gBAAgB;AAChB,YAAY;AACZ,gBAAgB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;AAClD,gBAAgB;AAChB;AACA;AACA,IAAI,kBAAkB,CAAC,MAAM,EAAE;AAC/B,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS;AACzE,QAAQ,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACnE,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1D;AACA,IAAI,eAAe,CAAC,MAAM,EAAE;AAC5B,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;AAC7B,YAAY;AACZ,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI;AAC3B,QAAQ,MAAM,OAAO,GAAG;AACxB,YAAY,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;AAC3C,YAAY,KAAK,EAAE,IAAI,CAAC,WAAW;AACnC,YAAY,UAAU,EAAE,MAAM,CAAC,UAAU;AACzC,YAAY,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;AACnD;AACA;AACA;AACA,SAAS;AACT,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK;AACjE,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;AACnC,YAAY,OAAO,GAAG;AACtB,SAAS,EAAE,EAAE,CAAC;AACd,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AACjC,YAAY,MAAM,EAAE,KAAK;AACzB,YAAY,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AAC1C;AACA,YAAY,MAAM,EAAE;AACpB,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACpC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1C,aAAa,SAAS,CAAC;AACvB,YAAY,IAAI,EAAE,CAAC,QAAQ,KAAK;AAChC,gBAAgB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC7G,gBAAgB,IAAI,CAAC,OAAO,GAAG,KAAK;AACpC,aAAa;AACb,YAAY,KAAK,EAAE,CAAC,KAAK,KAAK;AAC9B,gBAAgB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;AACtD,gBAAgB,IAAI,CAAC,OAAO,GAAG,KAAK;AACpC;AACA,SAAS,CAAC;AACV;AACA,IAAI,eAAe,GAAG;AACtB,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;AAC7B,YAAY;AACZ,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI;AAC3B,QAAQ,MAAM,OAAO,GAAG;AACxB,YAAY,KAAK,EAAE,IAAI,CAAC,WAAW;AACnC,YAAY,UAAU,EAAE,UAAU,CAAC,IAAI;AACvC,YAAY,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7D;AACA;AACA;AACA,SAAS;AACT,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK;AACjE,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;AACnC,YAAY,OAAO,GAAG;AACtB,SAAS,EAAE,EAAE,CAAC;AACd,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AACjC,YAAY,MAAM,EAAE,KAAK;AACzB,YAAY,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AAC1C,YAAY,MAAM,EAAE;AACpB,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACpC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1C,aAAa,SAAS,CAAC;AACvB,YAAY,IAAI,EAAE,CAAC,QAAQ,KAAK;AAChC,gBAAgB,IAAI,CAAC,WAAW,GAAG,QAAQ;AAC3C,gBAAgB,IAAI,CAAC,OAAO,GAAG,KAAK;AACpC,aAAa;AACb,YAAY,KAAK,EAAE,CAAC,KAAK,KAAK;AAC9B,gBAAgB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;AAC5D,gBAAgB,IAAI,CAAC,OAAO,GAAG,KAAK;AACpC;AACA,SAAS,CAAC;AACV;AACA,IAAI,iBAAiB,GAAG;AACxB,QAAQ,MAAM,OAAO,GAAG,EAAE;AAC1B,QAAQ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI;AAC5C,YAAY,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW;AAChE,SAAS,CAAC;AACV,QAAQ,OAAO,OAAO;AACtB;AACA,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE;AACjC,QAAQ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACpD,QAAQ,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AAChD,QAAQ,IAAI,CAAC,IAAI,GAAG,GAAG;AACvB,QAAQ,IAAI,CAAC,QAAQ,GAAG,QAAQ;AAChC,QAAQ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACvC,QAAQ,IAAI,CAAC,KAAK,EAAE;AACpB,QAAQ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACvC,QAAQ,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;AACvC;AACA,IAAI,gBAAgB,CAAC,UAAU,EAAE;AACjC,QAAQ,QAAQ,UAAU;AAC1B,YAAY,KAAK,UAAU,CAAC,KAAK;AACjC,gBAAgB,OAAO,MAAM;AAC7B,YAAY,KAAK,UAAU,CAAC,GAAG;AAC/B,gBAAgB,OAAO,KAAK;AAC5B,YAAY,KAAK,UAAU,CAAC,IAAI;AAChC,gBAAgB,OAAO,MAAM;AAC7B,YAAY;AACZ,gBAAgB,OAAO,MAAM;AAC7B;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS;AAC1E,QAAQ,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS;AACvD;AACA,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,sBAAsB,CAAC;AAC7E,QAAQ,IAAI,WAAW,EAAE;AACzB,YAAY,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC;AACA;AACA;AACA,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,EAAE,YAAY,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,CAAC;AACR,YAAY,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE;AACxC;AACA,YAAY,WAAW,CAAC,MAAM,GAAG,MAAM;AACvC,gBAAgB,WAAW,CAAC,KAAK,EAAE;AACnC;AACA;AACA,aAAa;AACb;AACA;AACA,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;AACjP,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,m2eAAm2e,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,8CAA8C,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,oBAAoB,EAAE,QAAQ,EAAE,8MAA8M,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,2CAA2C,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,oBAAoB,EAAE,QAAQ,EAAE,0FAA0F,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,qDAAqD,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,8CAA8C,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,qCAAqC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AACv0nB;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,CAAC;AAChI,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE;AAClF,wBAAwB,YAAY;AACpC,wBAAwB,mBAAmB;AAC3C,wBAAwB,WAAW;AACnC,wBAAwB,eAAe;AACvC,wBAAwB,YAAY;AACpC,wBAAwB,YAAY;AACpC,wBAAwB,YAAY;AACpC,wBAAwB,iBAAiB;AACzC,wBAAwB,eAAe;AACvC,wBAAwB,iBAAiB;AACzC,wBAAwB,cAAc;AACtC,wBAAwB,UAAU;AAClC,wBAAwB,aAAa;AACrC,wBAAwB,UAAU;AAClC,wBAAwB,YAAY;AACpC,wBAAwB,mBAAmB;AAC3C,wBAAwB;AACxB,qBAAqB,EAAE,QAAQ,EAAE,m2eAAm2e,EAAE;AACt4e,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,gBAAgB,EAAE,CAAC;AAC1I,gBAAgB,IAAI,EAAE,SAAS;AAC/B,gBAAgB,IAAI,EAAE,CAAC,kBAAkB;AACzC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;AAC/B,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;AACrC,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC;AAC9B,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC;AAC9B,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC;AAC1B,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;AACxB,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,EAAE,CAAC;;AC1cnB;AACA;AACA;;;;"}
|
|
1
|
+
{"version":3,"file":"elite.framework-ng.ui.core-generic-report.mjs","sources":["../tmp-esm2022/generic-report/lib/generic-report-module.js","../tmp-esm2022/generic-report/lib/generic-report.component.js","../tmp-esm2022/generic-report/elite.framework-ng.ui.core-generic-report.js"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from \"@angular/core\";\nexport class GenericReportModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, imports: [CommonModule] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, imports: [CommonModule] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [CommonModule],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1yZXBvcnQtbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy51aS5jb3JlL2dlbmVyaWMtcmVwb3J0L3NyYy9saWIvZ2VuZXJpYy1yZXBvcnQtbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUsvQyxNQUFNLE9BQU8sbUJBQW1CO3VHQUFuQixtQkFBbUI7d0dBQW5CLG1CQUFtQixZQUZwQixZQUFZO3dHQUVYLG1CQUFtQixZQUZwQixZQUFZOzsyRkFFWCxtQkFBbUI7a0JBSC9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJpY1JlcG9ydE1vZHVsZSB7fVxuIl19","import { CommonModule } from '@angular/common';\nimport { Component, inject, ViewChild, ElementRef, Input } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormlyModule } from '@ngx-formly/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { ButtonModule } from 'primeng/button';\nimport { DialogModule } from 'primeng/dialog';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { RadioButtonModule } from 'primeng/radiobutton';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { CardModule } from 'primeng/card';\nimport { DividerModule } from 'primeng/divider';\nimport { TabsModule } from 'primeng/tabs';\nimport { DynamicDialogRef, DynamicDialogConfig, DialogService, DynamicDialogModule } from 'primeng/dynamicdialog';\nimport { SelectModule } from 'primeng/select';\nimport { RestService } from '@elite.framework/ng.core/services';\nimport { Subject, takeUntil } from 'rxjs';\nimport { DrawerModule } from 'primeng/drawer';\nimport { QueryBuilderService } from '@elite.framework/ng.ui.core/generic-search-advanced';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"primeng/dynamicdialog\";\nimport * as i2 from \"@angular/common\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"primeng/button\";\nimport * as i5 from \"primeng/api\";\nimport * as i6 from \"primeng/radiobutton\";\nimport * as i7 from \"primeng/checkbox\";\nimport * as i8 from \"primeng/tabs\";\nimport * as i9 from \"@ngx-formly/core\";\nimport * as i10 from \"primeng/drawer\";\nimport * as i11 from \"@ngx-translate/core\";\nexport var ExportType;\n(function (ExportType) {\n ExportType[ExportType[\"LIST\"] = 0] = \"LIST\";\n ExportType[ExportType[\"HTML\"] = 1] = \"HTML\";\n ExportType[ExportType[\"PDF\"] = 2] = \"PDF\";\n ExportType[ExportType[\"EXCEL\"] = 3] = \"EXCEL\";\n ExportType[ExportType[\"PRINT\"] = 4] = \"PRINT\";\n})(ExportType || (ExportType = {}));\nexport class GenericReportComponent {\n ref;\n config;\n previewContainer;\n filterFields = [];\n fields_ = [];\n availableColumns = [];\n exportType = ExportType.EXCEL;\n fileName = '';\n showFilters = false;\n loading = false;\n activeTabIndex = 0;\n currentDate = new Date();\n previewData = [];\n options = {};\n enableQueryBuilder = true;\n localExport = false;\n queryString = '';\n apiName = '';\n model = {};\n form = new FormGroup({});\n exportConfig = {\n columns: {},\n filters: this.model,\n exportType: this.exportType,\n fileName: this.fileName\n };\n exportTypes = [\n { value: ExportType.EXCEL, label: 'EXCEL', icon: 'pi pi-file-excel' },\n { value: ExportType.PDF, label: 'PDF', icon: 'pi pi-file-pdf' },\n { value: ExportType.HTML, label: 'HTML', icon: 'pi pi-code' },\n { value: ExportType.PRINT, label: 'PRINT', icon: 'pi pi-print' }\n ];\n destroy$ = new Subject();\n translate = inject(TranslateService);\n restService = inject(RestService);\n queryBuilder = inject(QueryBuilderService);\n constructor(ref, config) {\n this.ref = ref;\n this.config = config;\n }\n ngOnInit() {\n this.filterFields = this.config.data?.filterFields || [];\n this.initializeComponent();\n this.buildQueryUIFields();\n }\n get filterCount() {\n const filters = ((this.model?.advancedFilters ?? [])[0]?.conditions?.length || 0) +\n ((this.model?.sorting ?? [])?.length || 0) +\n (this.model?.pagination && this.model?.pagination?.top ? 1 : 0);\n return filters;\n }\n buildQueryUIFields() {\n if (this.enableQueryBuilder) {\n this.fields_ = this.queryBuilder.buildQueryUIFields(this.filterFields);\n }\n else {\n this.fields_ = this.filterFields;\n }\n }\n initializeComponent() {\n this.apiName = this.config.data?.apiName || '';\n const columnDefinitions = this.config.data?.columns || {};\n if (Object.keys(columnDefinitions).length > 0) {\n this.availableColumns = Object.keys(columnDefinitions).map(key => ({\n key: String(key),\n displayName: String(columnDefinitions[key]),\n selected: true,\n customName: String(columnDefinitions[key])\n }));\n }\n else {\n this.availableColumns = (this.filterFields || []).map(f => {\n const key = String(f.key ?? '');\n const label = String(f.props?.label ?? key);\n return {\n key,\n displayName: this.translate.instant(label),\n selected: true,\n customName: label\n };\n });\n }\n this.filterFields = this.config.data?.filterFields || this.getDefaultFilterFields();\n this.model = this.config.data?.model || {};\n this.fileName = this.config.data?.defaultFileName || `export_${new Date().toISOString().split('T')[0]}`;\n // Load sample data for preview\n this.loadPreviewData();\n }\n getDefaultFilterFields() {\n return [\n {\n key: 'search',\n type: 'input',\n props: {\n label: this.translate.instant('SEARCH'),\n placeholder: this.translate.instant('ENTER_SEARCH_TERM'),\n }\n }\n ];\n }\n get selectedColumns() {\n return this.availableColumns.filter(col => col.selected);\n }\n onExportTypeChange(type) {\n this.exportType = type;\n // Auto-switch to preview tab for HTML/Print\n if ((type === ExportType.HTML || type === ExportType.PRINT) && this.selectedColumns.length > 0) {\n this.activeTabIndex = 1;\n }\n }\n onColumnToggle(column) {\n if (!column.selected) {\n column.customName = column.displayName;\n }\n // Refresh preview when columns change\n if (this.activeTabIndex === 1) {\n this.generatePreview();\n }\n }\n onCustomNameChange(column) {\n if (!column.customName?.trim()) {\n column.customName = column.displayName;\n }\n // Refresh preview when column names change\n if (this.activeTabIndex === 1) {\n this.generatePreview();\n }\n }\n selectAllColumns() {\n this.availableColumns.forEach(col => {\n col.selected = true;\n col.customName = col.displayName;\n });\n this.generatePreview();\n }\n deselectAllColumns() {\n this.availableColumns.forEach(col => {\n col.selected = false;\n });\n this.previewData = [];\n }\n generatePreview() {\n if (this.selectedColumns.length === 0) {\n this.previewData = [];\n return;\n }\n // In a real application, you would call your API here\n // For demo purposes, we're using the sample data\n this.loadPreviewData();\n }\n getPreviewValue(row, columnKey) {\n // Handle nested properties with dot notation\n return columnKey.split('.').reduce((obj, key) => obj?.[key], row) || '-';\n }\n getExportButtonText() {\n switch (this.exportType) {\n case ExportType.PRINT:\n return this.translate.instant('PRINT');\n case ExportType.HTML:\n return this.translate.instant('GENERATE_REPORT');\n default:\n return this.translate.instant('EXPORT');\n }\n }\n onSubmit() {\n // Use the new QueryBuilderService methods\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);\n // this.odataSearch.emit(odataParams);\n // Generate query string using the unified method\n this.queryString = this.queryBuilder.toODataQueryString(odataParams);\n // console.log('OData Query String:', queryString);\n if (this.model?.pagination && this.model?.pagination?.top) {\n // this.paginationChange.emit({\n // top:this.model?.pagination?.top,\n // // skip:,\n // });\n }\n // this.search.emit(\n // {\n // filter:this.model['filter'],\n // query:this.queryString,\n // // sorting:,\n // // top:,\n // // skip:,\n // }\n // );\n this.loadPreviewData();\n }\n onReset() {\n this.availableColumns.forEach(col => {\n col.selected = true;\n col.customName = col.displayName;\n });\n this.exportType = ExportType.EXCEL;\n this.fileName = `export_${new Date().toISOString().split('T')[0]}`;\n this.form.reset();\n this.model = {};\n this.activeTabIndex = 0;\n this.generatePreview();\n }\n onExport() {\n if (this.selectedColumns.length === 0)\n return;\n this.loading = true;\n // Prepare columns mapping\n const columnsMapping = {};\n this.selectedColumns.forEach(col => {\n columnsMapping[col.key] = col.customName || col.displayName;\n });\n const exportConfig = {\n columns: columnsMapping,\n filters: this.model,\n exportType: this.exportType,\n fileName: this.fileName\n };\n // Handle export based on type\n switch (this.exportType) {\n case ExportType.PRINT:\n this.printPreview();\n this.loading = false;\n break;\n case ExportType.HTML:\n this.generateHtmlReport(exportConfig);\n this.loading = false;\n break;\n default:\n this.handleApiExport(exportConfig);\n break;\n }\n }\n generateHtmlReport(config) {\n const htmlContent = this.previewContainer.nativeElement.innerHTML;\n const blob = new Blob([htmlContent], { type: 'text/html' });\n this.downloadFile(blob, `${config.fileName}.html`);\n }\n handleApiExport(config) {\n if (this.form.invalid)\n return;\n this.loading = true;\n const filters = {\n fileName: config.fileName || '',\n query: this.queryString,\n exportType: config.exportType,\n columns: JSON.stringify(config.columns),\n // ...this.currentFilters,\n // ...this.pageFilters,\n // ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\n };\n const params = Object.keys(filters).reduce((acc, key) => {\n acc[key] = filters[key];\n return acc;\n }, {});\n this.restService.request({\n method: 'GET',\n url: `/${this.apiName}/export`,\n // body: { ...config.filters, ...this.model },\n params: params\n }, { apiName: this.apiName })\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (response) => {\n this.loading = false;\n if (config.exportType == ExportType.EXCEL) {\n const blob = this.base64ToBlob(response, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\n this.downloadFile(blob, `${config.fileName}.${this.getFileExtension(config.exportType)}`);\n }\n this.loading = false;\n },\n error: (error) => {\n console.error('Export failed:', error);\n this.loading = false;\n }\n });\n }\n loadPreviewData() {\n if (this.form.invalid)\n return;\n this.loading = true;\n const filters = {\n query: this.queryString,\n exportType: ExportType.LIST,\n columns: JSON.stringify(this.getPreviewColumns()),\n // ...this.currentFilters,\n // ...this.pageFilters,\n // ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\n };\n const params = Object.keys(filters).reduce((acc, key) => {\n acc[key] = filters[key];\n return acc;\n }, {});\n this.restService.request({\n method: 'GET',\n url: `/${this.apiName}/export`,\n params: params\n }, { apiName: this.apiName })\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (response) => {\n this.previewData = response;\n this.loading = false;\n },\n error: (error) => {\n console.error('Preview load failed:', error);\n this.loading = false;\n }\n });\n }\n getPreviewColumns() {\n const columns = {};\n this.selectedColumns.forEach(col => {\n columns[col.key] = col.customName || col.displayName;\n });\n return columns;\n }\n base64ToBlob(base64, mime) {\n const byteChars = atob(base64);\n const byteNums = Array.from(byteChars, c => c.charCodeAt(0));\n return new Blob([new Uint8Array(byteNums)], { type: mime });\n }\n downloadFile(blob, fileName) {\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n }\n getFileExtension(exportType) {\n switch (exportType) {\n case ExportType.EXCEL:\n return 'xlsx';\n case ExportType.PDF:\n return 'pdf';\n case ExportType.HTML:\n return 'html';\n default:\n return 'xlsx';\n }\n }\n printPreview() {\n const printContent = this.previewContainer.nativeElement.innerHTML;\n const originalContent = document.body.innerHTML;\n // Create print window\n const printWindow = window.open('', '_blank', 'width=800,height=600');\n if (printWindow) {\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>${this.fileName}</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; margin: 20px; }\r\n table { width: 100%; border-collapse: collapse; }\r\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\r\n th { background-color: #f5f5f5; font-weight: bold; }\r\n .header { text-align: center; margin-bottom: 20px; }\r\n .footer { text-align: center; margin-top: 20px; font-size: 12px; color: #666; }\r\n @media print {\r\n body { margin: 0; }\r\n .no-print { display: none; }\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n ${printContent}\r\n <div class=\"footer no-print\">\r\n <button onclick=\"window.print()\" style=\"padding: 10px 20px; margin: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;\">\r\n Print Report\r\n </button>\r\n <button onclick=\"window.close()\" style=\"padding: 10px 20px; margin: 10px; background: #6c757d; color: white; border: none; border-radius: 4px; cursor: pointer;\">\r\n Close\r\n </button>\r\n </div>\r\n </body>\r\n </html>\r\n `);\n printWindow.document.close();\n // Auto-print when window loads\n printWindow.onload = () => {\n printWindow.focus();\n // Uncomment the line below for auto-print\n // printWindow.print();\n };\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportComponent, deps: [{ token: i1.DynamicDialogRef }, { token: i1.DynamicDialogConfig }], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.1.8\", type: GenericReportComponent, isStandalone: true, selector: \"app-generic-report\", inputs: { filterFields: \"filterFields\", enableQueryBuilder: \"enableQueryBuilder\", localExport: \"localExport\", queryString: \"queryString\", apiName: \"apiName\", model: \"model\" }, providers: [DialogService], viewQueries: [{ propertyName: \"previewContainer\", first: true, predicate: [\"previewContainer\"], descendants: true }], ngImport: i0, template: \"\\r\\n <div class=\\\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\\\">\\r\\n <!-- Header -->\\r\\n <!-- <div class=\\\"flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700\\\">\\r\\n <h2 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'EXPORT_DATA' | translate }}\\r\\n </h2>\\r\\n <button\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"p-1 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n aria-label=\\\"Close\\\">\\r\\n <i class=\\\"pi pi-times text-gray-500 dark:text-gray-400\\\"></i>\\r\\n </button>\\r\\n </div> -->\\r\\n\\r\\n <!-- Content -->\\r\\n <div class=\\\"flex-1 overflow-hidden\\\">\\r\\n <p-tabs [value]=\\\"activeTabIndex\\\">\\r\\n <!-- Configuration Tab -->\\r\\n <p-tablist>\\r\\n <p-tab value=\\\"0\\\">{{'CONFIGURATION' | translate}}</p-tab>\\r\\n <p-tab value=\\\"1\\\">{{'PREVIEW' | translate}}</p-tab>\\r\\n </p-tablist>\\r\\n <p-tabpanels>\\r\\n <p-tabpanel value=\\\"0\\\">\\r\\n <div class=\\\"grid grid-cols-1 lg:grid-cols-2 gap-6 p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Left Column - Export Settings -->\\r\\n <div class=\\\"space-y-6\\\">\\r\\n <!-- File Name -->\\r\\n <div class=\\\"space-y-2\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'FILE_NAME' | translate }}\\r\\n </label>\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"fileName\\\"\\r\\n class=\\\"w-full p-3 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500\\\"\\r\\n [placeholder]=\\\"'ENTER_FILE_NAME' | translate\\\">\\r\\n </div>\\r\\n\\r\\n <!-- Export Type -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'EXPORT_FORMAT' | translate }}\\r\\n </label>\\r\\n <div class=\\\"grid grid-cols-2 gap-3\\\">\\r\\n <div *ngFor=\\\"let type of exportTypes\\\" class=\\\"flex items-center\\\">\\r\\n <p-radioButton\\r\\n [name]=\\\"'exportType'\\\"\\r\\n [value]=\\\"type.value\\\"\\r\\n [(ngModel)]=\\\"exportType\\\"\\r\\n [inputId]=\\\"`${type.value}`\\\"\\r\\n (onClick)=\\\"onExportTypeChange(type.value)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-radioButton>\\r\\n <label [for]=\\\"type.value\\\" class=\\\"flex items-center cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n <i [class]=\\\"type.icon + ' mr-2'\\\"></i>\\r\\n {{ type.label | translate }}\\r\\n </label>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Filters Section -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SEARCH_FILTERS' | translate }}\\r\\n </label>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"showFilters = !showFilters\\\"\\r\\n class=\\\"text-sm text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ showFilters ? ('HIDE_FILTERS' | translate) : ('SHOW_FILTERS' | translate) }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- <div *ngIf=\\\"showFilters\\\" class=\\\"space-y-4 p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\">\\r\\n </formly-form>\\r\\n </div> -->\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Right Column - Column Selection -->\\r\\n <div class=\\\"space-y-4\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SELECT_COLUMNS' | translate }}\\r\\n </label>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"selectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'SELECT_ALL' | translate }}\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"deselectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'DESELECT_ALL' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <div class=\\\"max-h-80 overflow-y-auto border border-gray-200 dark:border-gray-700 rounded-lg\\\">\\r\\n <div *ngFor=\\\"let column of availableColumns\\\" class=\\\"flex items-center p-3 border-b border-gray-100 dark:border-gray-600 last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-700\\\">\\r\\n <p-checkbox\\r\\n [binary]=\\\"true\\\"\\r\\n [(ngModel)]=\\\"column.selected\\\"\\r\\n [inputId]=\\\"column.key\\\"\\r\\n (onChange)=\\\"onColumnToggle(column)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-checkbox>\\r\\n <label [for]=\\\"column.key\\\" class=\\\"flex-1 cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n {{ column.displayName }}\\r\\n </label>\\r\\n <div *ngIf=\\\"column.selected\\\" class=\\\"flex items-center gap-2\\\">\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"column.customName\\\"\\r\\n (blur)=\\\"onCustomNameChange(column)\\\"\\r\\n [placeholder]=\\\"column.displayName\\\"\\r\\n class=\\\"text-xs p-1 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white w-32\\\"\\r\\n [title]=\\\"'CUSTOM_COLUMN_NAME' | translate\\\">\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Selected Columns Summary -->\\r\\n <div *ngIf=\\\"selectedColumns.length > 0\\\" class=\\\"p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-blue-700 dark:text-blue-300\\\">\\r\\n {{ 'SELECTED_COLUMNS_COUNT' | translate: { count: selectedColumns.length } }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n <!-- Preview Tab -->\\r\\n <!-- [disabled]=\\\"selectedColumns.length === 0\\\" -->\\r\\n <p-tabpanel value=\\\"1\\\" >\\r\\n <div class=\\\"p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Preview Actions -->\\r\\n <div class=\\\"flex justify-between items-center mb-4\\\">\\r\\n <h3 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'REPORT_PREVIEW' | translate }}\\r\\n </h3>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n *ngIf=\\\"exportType === 1 || exportType === 4\\\"\\r\\n (click)=\\\"printPreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-print mr-2\\\"></i>\\r\\n {{ 'PRINT' | translate }}\\r\\n </button>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-refresh mr-2\\\"></i>\\r\\n {{ 'REFRESH_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Content -->\\r\\n <div #previewContainer class=\\\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-6\\\">\\r\\n <!-- Report Header -->\\r\\n <div class=\\\"text-center mb-6 border-b border-gray-200 dark:border-gray-700 pb-4\\\">\\r\\n <h1 class=\\\"text-2xl font-bold text-gray-900 dark:text-white\\\">{{ fileName }}</h1>\\r\\n <p class=\\\"text-gray-600 dark:text-gray-400 mt-2\\\">\\r\\n {{ 'GENERATED_ON' | translate }}: {{ currentDate | date:'medium' }}\\r\\n </p>\\r\\n </div>\\r\\n\\r\\n <!-- Report Table -->\\r\\n <div class=\\\"overflow-x-auto\\\">\\r\\n <table class=\\\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <thead class=\\\"bg-gray-50 dark:bg-gray-700\\\">\\r\\n <tr>\\r\\n <th\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ column.customName || column.displayName }}\\r\\n </th>\\r\\n </tr>\\r\\n </thead>\\r\\n <tbody class=\\\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <tr *ngFor=\\\"let row of previewData; let i = index\\\"\\r\\n [class.bg-gray-50]=\\\"i % 2 === 0\\\"\\r\\n [class.dark:bg-gray-900]=\\\"i % 2 === 0\\\">\\r\\n <td\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-white border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ getPreviewValue(row, column.key) }}\\r\\n </td>\\r\\n </tr>\\r\\n </tbody>\\r\\n </table>\\r\\n </div>\\r\\n\\r\\n <!-- Empty State -->\\r\\n <div *ngIf=\\\"previewData.length === 0\\\" class=\\\"text-center py-8\\\">\\r\\n <i class=\\\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\\\"></i>\\r\\n <p class=\\\"text-gray-500 dark:text-gray-400\\\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"mt-4 px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'GENERATE_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- Report Footer -->\\r\\n <div class=\\\"text-center mt-6 border-t border-gray-200 dark:border-gray-700 pt-4\\\">\\r\\n <p class=\\\"text-sm text-gray-500 dark:text-gray-400\\\">\\r\\n {{ 'PAGE' | translate }} 1 of 1\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Info -->\\r\\n <div class=\\\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-green-700 dark:text-green-300\\\">\\r\\n <i class=\\\"pi pi-info-circle mr-2\\\"></i>\\r\\n {{ 'PREVIEW_INFO' | translate }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n </p-tabpanels>\\r\\n </p-tabs>\\r\\n </div>\\r\\n\\r\\n <!-- Footer -->\\r\\n <div class=\\\"border-t border-gray-200 dark:border-gray-700 px-6 py-4 bg-gray-50 dark:bg-gray-800\\\">\\r\\n <div class=\\\"flex justify-between items-center\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onReset()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n <i class=\\\"pi pi-refresh ml-2\\\"></i>\\r\\n {{ 'RESET' | translate }}\\r\\n </button>\\r\\n\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n {{ 'CANCEL' | translate }}\\r\\n </button>\\r\\n\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onExport()\\\"\\r\\n [disabled]=\\\"loading || selectedColumns.length === 0\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors\\\">\\r\\n <i class=\\\"pi pi-download ml-2\\\" [class.animate-spin]=\\\"loading\\\"></i>\\r\\n {{ getExportButtonText() }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n @if(showFilters){\\r\\n<p-drawer\\r\\n [(visible)]=\\\"showFilters\\\"\\r\\n position=\\\"right\\\"\\r\\n [styleClass]=\\\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \\\"\\r\\n [modal]=\\\"true\\\"\\r\\n [dismissible]=\\\"true\\\"\\r\\n styleClass=\\\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\\\"\\r\\n>\\r\\n <!-- Entire form wrapper -->\\r\\n <form [formGroup]=\\\"form\\\" (ngSubmit)=\\\"onSubmit(); showFilters=false\\\" class=\\\"flex flex-col flex-1\\\">\\r\\n <!-- Scrollable Form -->\\r\\n <div class=\\\"flex-1 overflow-auto\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\"\\r\\n [options]=\\\"options\\\"\\r\\n >\\r\\n </formly-form>\\r\\n </div>\\r\\n\\r\\n </form>\\r\\n <!-- Action Buttons -->\\r\\n <ng-template pTemplate=\\\"footer\\\">\\r\\n <div class=\\\"flex justify-end mt-2 space-x-2 flex-none\\\">\\r\\n <button\\r\\n type=\\\"submit\\\"\\r\\n pButton size=\\\"small\\\"\\r\\n (click)=\\\" onSubmit(); showFilters=false\\\"\\r\\n label=\\\"{{ 'SEARCH' | translate }}\\\">\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n pButton\\r\\n size=\\\"small\\\"\\r\\n class=\\\"p-button-text\\\"\\r\\n (click)=\\\"onReset(); showFilters=false\\\"\\r\\n >\\r\\n {{ 'CLEAR' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </ng-template>\\r\\n</p-drawer>\\r\\n\\r\\n }\\r\\n\", dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i2.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i2.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.DefaultValueAccessor, selector: \"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]\" }, { kind: \"directive\", type: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"ngmodule\", type: FormsModule }, { kind: \"directive\", type: i3.NgModel, selector: \"[ngModel]:not([formControlName]):not([formControl])\", inputs: [\"name\", \"disabled\", \"ngModel\", \"ngModelOptions\"], outputs: [\"ngModelChange\"], exportAs: [\"ngModel\"] }, { kind: \"ngmodule\", type: TranslateModule }, { kind: \"ngmodule\", type: ButtonModule }, { kind: \"directive\", type: i4.ButtonDirective, selector: \"[pButton]\", inputs: [\"iconPos\", \"loadingIcon\", \"loading\", \"severity\", \"raised\", \"rounded\", \"text\", \"outlined\", \"size\", \"plain\", \"fluid\", \"label\", \"icon\", \"buttonProps\"] }, { kind: \"directive\", type: i5.PrimeTemplate, selector: \"[pTemplate]\", inputs: [\"type\", \"pTemplate\"] }, { kind: \"ngmodule\", type: DialogModule }, { kind: \"ngmodule\", type: SelectModule }, { kind: \"ngmodule\", type: MultiSelectModule }, { kind: \"ngmodule\", type: InputTextModule }, { kind: \"ngmodule\", type: RadioButtonModule }, { kind: \"component\", type: i6.RadioButton, selector: \"p-radioButton, p-radiobutton, p-radio-button\", inputs: [\"value\", \"tabindex\", \"inputId\", \"ariaLabelledBy\", \"ariaLabel\", \"styleClass\", \"autofocus\", \"binary\", \"variant\", \"size\"], outputs: [\"onClick\", \"onFocus\", \"onBlur\"] }, { kind: \"ngmodule\", type: CheckboxModule }, { kind: \"component\", type: i7.Checkbox, selector: \"p-checkbox, p-checkBox, p-check-box\", inputs: [\"value\", \"binary\", \"ariaLabelledBy\", \"ariaLabel\", \"tabindex\", \"inputId\", \"inputStyle\", \"styleClass\", \"inputClass\", \"indeterminate\", \"formControl\", \"checkboxIcon\", \"readonly\", \"autofocus\", \"trueValue\", \"falseValue\", \"variant\", \"size\"], outputs: [\"onChange\", \"onFocus\", \"onBlur\"] }, { kind: \"ngmodule\", type: CardModule }, { kind: \"ngmodule\", type: DividerModule }, { kind: \"ngmodule\", type: TabsModule }, { kind: \"component\", type: i8.Tabs, selector: \"p-tabs\", inputs: [\"value\", \"scrollable\", \"lazy\", \"selectOnFocus\", \"showNavigators\", \"tabindex\"], outputs: [\"valueChange\"] }, { kind: \"component\", type: i8.TabPanels, selector: \"p-tabpanels\" }, { kind: \"component\", type: i8.TabPanel, selector: \"p-tabpanel\", inputs: [\"value\"], outputs: [\"valueChange\"] }, { kind: \"component\", type: i8.TabList, selector: \"p-tablist\" }, { kind: \"component\", type: i8.Tab, selector: \"p-tab\", inputs: [\"value\", \"disabled\"], outputs: [\"valueChange\"] }, { kind: \"ngmodule\", type: FormlyModule }, { kind: \"component\", type: i9.LegacyFormlyForm, selector: \"formly-form\" }, { kind: \"ngmodule\", type: DynamicDialogModule }, { kind: \"ngmodule\", type: DrawerModule }, { kind: \"component\", type: i10.Drawer, selector: \"p-drawer\", inputs: [\"appendTo\", \"blockScroll\", \"style\", \"styleClass\", \"ariaCloseLabel\", \"autoZIndex\", \"baseZIndex\", \"modal\", \"closeButtonProps\", \"dismissible\", \"showCloseIcon\", \"closeOnEscape\", \"transitionOptions\", \"visible\", \"position\", \"fullScreen\", \"header\", \"maskStyle\", \"closable\"], outputs: [\"onShow\", \"onHide\", \"visibleChange\"] }, { kind: \"pipe\", type: i2.DatePipe, name: \"date\" }, { kind: \"pipe\", type: i11.TranslatePipe, name: \"translate\" }] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: GenericReportComponent, decorators: [{\n type: Component,\n args: [{ selector: 'app-generic-report', providers: [DialogService], imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TranslateModule,\n ButtonModule,\n DialogModule,\n SelectModule,\n MultiSelectModule,\n InputTextModule,\n RadioButtonModule,\n CheckboxModule,\n CardModule,\n DividerModule,\n TabsModule,\n FormlyModule,\n DynamicDialogModule,\n DrawerModule\n ], template: \"\\r\\n <div class=\\\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\\\">\\r\\n <!-- Header -->\\r\\n <!-- <div class=\\\"flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700\\\">\\r\\n <h2 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'EXPORT_DATA' | translate }}\\r\\n </h2>\\r\\n <button\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"p-1 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n aria-label=\\\"Close\\\">\\r\\n <i class=\\\"pi pi-times text-gray-500 dark:text-gray-400\\\"></i>\\r\\n </button>\\r\\n </div> -->\\r\\n\\r\\n <!-- Content -->\\r\\n <div class=\\\"flex-1 overflow-hidden\\\">\\r\\n <p-tabs [value]=\\\"activeTabIndex\\\">\\r\\n <!-- Configuration Tab -->\\r\\n <p-tablist>\\r\\n <p-tab value=\\\"0\\\">{{'CONFIGURATION' | translate}}</p-tab>\\r\\n <p-tab value=\\\"1\\\">{{'PREVIEW' | translate}}</p-tab>\\r\\n </p-tablist>\\r\\n <p-tabpanels>\\r\\n <p-tabpanel value=\\\"0\\\">\\r\\n <div class=\\\"grid grid-cols-1 lg:grid-cols-2 gap-6 p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Left Column - Export Settings -->\\r\\n <div class=\\\"space-y-6\\\">\\r\\n <!-- File Name -->\\r\\n <div class=\\\"space-y-2\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'FILE_NAME' | translate }}\\r\\n </label>\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"fileName\\\"\\r\\n class=\\\"w-full p-3 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500\\\"\\r\\n [placeholder]=\\\"'ENTER_FILE_NAME' | translate\\\">\\r\\n </div>\\r\\n\\r\\n <!-- Export Type -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'EXPORT_FORMAT' | translate }}\\r\\n </label>\\r\\n <div class=\\\"grid grid-cols-2 gap-3\\\">\\r\\n <div *ngFor=\\\"let type of exportTypes\\\" class=\\\"flex items-center\\\">\\r\\n <p-radioButton\\r\\n [name]=\\\"'exportType'\\\"\\r\\n [value]=\\\"type.value\\\"\\r\\n [(ngModel)]=\\\"exportType\\\"\\r\\n [inputId]=\\\"`${type.value}`\\\"\\r\\n (onClick)=\\\"onExportTypeChange(type.value)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-radioButton>\\r\\n <label [for]=\\\"type.value\\\" class=\\\"flex items-center cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n <i [class]=\\\"type.icon + ' mr-2'\\\"></i>\\r\\n {{ type.label | translate }}\\r\\n </label>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Filters Section -->\\r\\n <div class=\\\"space-y-3\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SEARCH_FILTERS' | translate }}\\r\\n </label>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"showFilters = !showFilters\\\"\\r\\n class=\\\"text-sm text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ showFilters ? ('HIDE_FILTERS' | translate) : ('SHOW_FILTERS' | translate) }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- <div *ngIf=\\\"showFilters\\\" class=\\\"space-y-4 p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\">\\r\\n </formly-form>\\r\\n </div> -->\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Right Column - Column Selection -->\\r\\n <div class=\\\"space-y-4\\\">\\r\\n <div class=\\\"flex items-center justify-between\\\">\\r\\n <label class=\\\"block text-sm font-medium text-gray-700 dark:text-gray-300\\\">\\r\\n {{ 'SELECT_COLUMNS' | translate }}\\r\\n </label>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"selectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'SELECT_ALL' | translate }}\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"deselectAllColumns()\\\"\\r\\n class=\\\"text-xs text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'DESELECT_ALL' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <div class=\\\"max-h-80 overflow-y-auto border border-gray-200 dark:border-gray-700 rounded-lg\\\">\\r\\n <div *ngFor=\\\"let column of availableColumns\\\" class=\\\"flex items-center p-3 border-b border-gray-100 dark:border-gray-600 last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-700\\\">\\r\\n <p-checkbox\\r\\n [binary]=\\\"true\\\"\\r\\n [(ngModel)]=\\\"column.selected\\\"\\r\\n [inputId]=\\\"column.key\\\"\\r\\n (onChange)=\\\"onColumnToggle(column)\\\"\\r\\n class=\\\"mr-3\\\">\\r\\n </p-checkbox>\\r\\n <label [for]=\\\"column.key\\\" class=\\\"flex-1 cursor-pointer text-sm text-gray-700 dark:text-gray-300\\\">\\r\\n {{ column.displayName }}\\r\\n </label>\\r\\n <div *ngIf=\\\"column.selected\\\" class=\\\"flex items-center gap-2\\\">\\r\\n <input\\r\\n type=\\\"text\\\"\\r\\n [(ngModel)]=\\\"column.customName\\\"\\r\\n (blur)=\\\"onCustomNameChange(column)\\\"\\r\\n [placeholder]=\\\"column.displayName\\\"\\r\\n class=\\\"text-xs p-1 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white w-32\\\"\\r\\n [title]=\\\"'CUSTOM_COLUMN_NAME' | translate\\\">\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Selected Columns Summary -->\\r\\n <div *ngIf=\\\"selectedColumns.length > 0\\\" class=\\\"p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-blue-700 dark:text-blue-300\\\">\\r\\n {{ 'SELECTED_COLUMNS_COUNT' | translate: { count: selectedColumns.length } }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n <!-- Preview Tab -->\\r\\n <!-- [disabled]=\\\"selectedColumns.length === 0\\\" -->\\r\\n <p-tabpanel value=\\\"1\\\" >\\r\\n <div class=\\\"p-4 max-h-[60vh] overflow-y-auto\\\">\\r\\n <!-- Preview Actions -->\\r\\n <div class=\\\"flex justify-between items-center mb-4\\\">\\r\\n <h3 class=\\\"text-lg font-semibold text-gray-900 dark:text-white\\\">\\r\\n {{ 'REPORT_PREVIEW' | translate }}\\r\\n </h3>\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n *ngIf=\\\"exportType === 1 || exportType === 4\\\"\\r\\n (click)=\\\"printPreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-print mr-2\\\"></i>\\r\\n {{ 'PRINT' | translate }}\\r\\n </button>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors\\\">\\r\\n <i class=\\\"pi pi-refresh mr-2\\\"></i>\\r\\n {{ 'REFRESH_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Content -->\\r\\n <div #previewContainer class=\\\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-6\\\">\\r\\n <!-- Report Header -->\\r\\n <div class=\\\"text-center mb-6 border-b border-gray-200 dark:border-gray-700 pb-4\\\">\\r\\n <h1 class=\\\"text-2xl font-bold text-gray-900 dark:text-white\\\">{{ fileName }}</h1>\\r\\n <p class=\\\"text-gray-600 dark:text-gray-400 mt-2\\\">\\r\\n {{ 'GENERATED_ON' | translate }}: {{ currentDate | date:'medium' }}\\r\\n </p>\\r\\n </div>\\r\\n\\r\\n <!-- Report Table -->\\r\\n <div class=\\\"overflow-x-auto\\\">\\r\\n <table class=\\\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <thead class=\\\"bg-gray-50 dark:bg-gray-700\\\">\\r\\n <tr>\\r\\n <th\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ column.customName || column.displayName }}\\r\\n </th>\\r\\n </tr>\\r\\n </thead>\\r\\n <tbody class=\\\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\\\">\\r\\n <tr *ngFor=\\\"let row of previewData; let i = index\\\"\\r\\n [class.bg-gray-50]=\\\"i % 2 === 0\\\"\\r\\n [class.dark:bg-gray-900]=\\\"i % 2 === 0\\\">\\r\\n <td\\r\\n *ngFor=\\\"let column of selectedColumns\\\"\\r\\n class=\\\"px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-white border border-gray-200 dark:border-gray-600\\\">\\r\\n {{ getPreviewValue(row, column.key) }}\\r\\n </td>\\r\\n </tr>\\r\\n </tbody>\\r\\n </table>\\r\\n </div>\\r\\n\\r\\n <!-- Empty State -->\\r\\n <div *ngIf=\\\"previewData.length === 0\\\" class=\\\"text-center py-8\\\">\\r\\n <i class=\\\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\\\"></i>\\r\\n <p class=\\\"text-gray-500 dark:text-gray-400\\\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\\r\\n <button\\r\\n (click)=\\\"generatePreview()\\\"\\r\\n class=\\\"mt-4 px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 hover:underline\\\">\\r\\n {{ 'GENERATE_PREVIEW' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n\\r\\n <!-- Report Footer -->\\r\\n <div class=\\\"text-center mt-6 border-t border-gray-200 dark:border-gray-700 pt-4\\\">\\r\\n <p class=\\\"text-sm text-gray-500 dark:text-gray-400\\\">\\r\\n {{ 'PAGE' | translate }} 1 of 1\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <!-- Preview Info -->\\r\\n <div class=\\\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\\\">\\r\\n <p class=\\\"text-sm text-green-700 dark:text-green-300\\\">\\r\\n <i class=\\\"pi pi-info-circle mr-2\\\"></i>\\r\\n {{ 'PREVIEW_INFO' | translate }}\\r\\n </p>\\r\\n </div>\\r\\n </div>\\r\\n </p-tabpanel>\\r\\n\\r\\n </p-tabpanels>\\r\\n </p-tabs>\\r\\n </div>\\r\\n\\r\\n <!-- Footer -->\\r\\n <div class=\\\"border-t border-gray-200 dark:border-gray-700 px-6 py-4 bg-gray-50 dark:bg-gray-800\\\">\\r\\n <div class=\\\"flex justify-between items-center\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onReset()\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n <i class=\\\"pi pi-refresh ml-2\\\"></i>\\r\\n {{ 'RESET' | translate }}\\r\\n </button>\\r\\n\\r\\n <div class=\\\"flex gap-2\\\">\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"ref?.close()\\\"\\r\\n class=\\\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\\\"\\r\\n [disabled]=\\\"loading\\\">\\r\\n {{ 'CANCEL' | translate }}\\r\\n </button>\\r\\n\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n (click)=\\\"onExport()\\\"\\r\\n [disabled]=\\\"loading || selectedColumns.length === 0\\\"\\r\\n class=\\\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors\\\">\\r\\n <i class=\\\"pi pi-download ml-2\\\" [class.animate-spin]=\\\"loading\\\"></i>\\r\\n {{ getExportButtonText() }}\\r\\n </button>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n @if(showFilters){\\r\\n<p-drawer\\r\\n [(visible)]=\\\"showFilters\\\"\\r\\n position=\\\"right\\\"\\r\\n [styleClass]=\\\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \\\"\\r\\n [modal]=\\\"true\\\"\\r\\n [dismissible]=\\\"true\\\"\\r\\n styleClass=\\\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\\\"\\r\\n>\\r\\n <!-- Entire form wrapper -->\\r\\n <form [formGroup]=\\\"form\\\" (ngSubmit)=\\\"onSubmit(); showFilters=false\\\" class=\\\"flex flex-col flex-1\\\">\\r\\n <!-- Scrollable Form -->\\r\\n <div class=\\\"flex-1 overflow-auto\\\">\\r\\n <formly-form\\r\\n [form]=\\\"form\\\"\\r\\n [fields]=\\\"fields_\\\"\\r\\n [model]=\\\"model\\\"\\r\\n [options]=\\\"options\\\"\\r\\n >\\r\\n </formly-form>\\r\\n </div>\\r\\n\\r\\n </form>\\r\\n <!-- Action Buttons -->\\r\\n <ng-template pTemplate=\\\"footer\\\">\\r\\n <div class=\\\"flex justify-end mt-2 space-x-2 flex-none\\\">\\r\\n <button\\r\\n type=\\\"submit\\\"\\r\\n pButton size=\\\"small\\\"\\r\\n (click)=\\\" onSubmit(); showFilters=false\\\"\\r\\n label=\\\"{{ 'SEARCH' | translate }}\\\">\\r\\n </button>\\r\\n <button\\r\\n type=\\\"button\\\"\\r\\n pButton\\r\\n size=\\\"small\\\"\\r\\n class=\\\"p-button-text\\\"\\r\\n (click)=\\\"onReset(); showFilters=false\\\"\\r\\n >\\r\\n {{ 'CLEAR' | translate }}\\r\\n </button>\\r\\n </div>\\r\\n </ng-template>\\r\\n</p-drawer>\\r\\n\\r\\n }\\r\\n\" }]\n }], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }], propDecorators: { previewContainer: [{\n type: ViewChild,\n args: ['previewContainer']\n }], filterFields: [{\n type: Input\n }], enableQueryBuilder: [{\n type: Input\n }], localExport: [{\n type: Input\n }], queryString: [{\n type: Input\n }], apiName: [{\n type: Input\n }], model: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy51aS5jb3JlL2dlbmVyaWMtcmVwb3J0L3NyYy9saWIvZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy51aS5jb3JlL2dlbmVyaWMtcmVwb3J0L3NyYy9saWIvZ2VuZXJpYy1yZXBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFvRCxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlC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ZCxVQUFVO3dCQUNWLGFBQWE7d0JBQ2IsVUFBVTt3QkFDVixZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsWUFBWTtxQkFDYjt1SEFHOEIsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFHcEIsWUFBWTtzQkFBcEIsS0FBSztnQkFtQkcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtbHlGaWVsZENvbmZpZywgRm9ybWx5Rm9ybSwgRm9ybWx5Rm9ybU9wdGlvbnMsIEZvcm1seU1vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcbmltcG9ydCB7IE11bHRpU2VsZWN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XHJcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcclxuaW1wb3J0IHsgUmFkaW9CdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhZGlvYnV0dG9uJztcclxuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoZWNrYm94JztcclxuaW1wb3J0IHsgQ2FyZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2FyZCc7XHJcbmltcG9ydCB7IERpdmlkZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBUYWJzTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJzJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ1JlZiwgRHluYW1pY0RpYWxvZ0NvbmZpZywgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IFNlbGVjdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0JztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICdAZWxpdGUuZnJhbWV3b3JrL25nLmNvcmUvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHJhd2VyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kcmF3ZXInO1xyXG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnQGVsaXRlLmZyYW1ld29yay9uZy51aS5jb3JlL2dlbmVyaWMtc2VhcmNoLWFkdmFuY2VkJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0Q29uZmlnIHtcclxuICBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xyXG4gIGZpbHRlcnM6IGFueTtcclxuICBleHBvcnRUeXBlOiBFeHBvcnRUeXBlO1xyXG4gIGZpbGVOYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGVudW0gRXhwb3J0VHlwZSB7XHJcbiAgTElTVCAsXHJcbiAgSFRNTCAsXHJcbiAgUERGICxcclxuICBFWENFTCAsXHJcbiAgUFJJTlRcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZ2VuZXJpYy1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOicuL2dlbmVyaWMtcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICAgcHJvdmlkZXJzOiBbRGlhbG9nU2VydmljZV0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxyXG4gICAgQnV0dG9uTW9kdWxlLFxyXG4gICAgRGlhbG9nTW9kdWxlLFxyXG4gICAgU2VsZWN0TW9kdWxlLFxyXG4gICAgTXVsdGlTZWxlY3RNb2R1bGUsXHJcbiAgICBJbnB1dFRleHRNb2R1bGUsXHJcbiAgICBSYWRpb0J1dHRvbk1vZHVsZSxcclxuICAgIENoZWNrYm94TW9kdWxlLFxyXG4gICAgQ2FyZE1vZHVsZSxcclxuICAgIERpdmlkZXJNb2R1bGUsXHJcbiAgICBUYWJzTW9kdWxlLFxyXG4gICAgRm9ybWx5TW9kdWxlLFxyXG4gICAgRHluYW1pY0RpYWxvZ01vZHVsZSxcclxuICAgIERyYXdlck1vZHVsZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEdlbmVyaWNSZXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ3ByZXZpZXdDb250YWluZXInKSBwcmV2aWV3Q29udGFpbmVyITogRWxlbWVudFJlZjtcclxuXHJcblxyXG4gIEBJbnB1dCgpIGZpbHRlckZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xyXG4gIGZpZWxkc18gOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XHJcblxyXG4gIGF2YWlsYWJsZUNvbHVtbnM6IEFycmF5PHtcclxuICAgIGtleTogc3RyaW5nO1xyXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZztcclxuICAgIHNlbGVjdGVkOiBib29sZWFuO1xyXG4gICAgY3VzdG9tTmFtZT86IHN0cmluZztcclxuICB9PiA9IFtdO1xyXG5cclxuICBleHBvcnRUeXBlOiBFeHBvcnRUeXBlID0gRXhwb3J0VHlwZS5FWENFTDtcclxuICBmaWxlTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgc2hvd0ZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYWN0aXZlVGFiSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgY3VycmVudERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHByZXZpZXdEYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICBvcHRpb25zOiBGb3JtbHlGb3JtT3B0aW9ucyA9IHt9O1xyXG4gIEBJbnB1dCgpIGVuYWJsZVF1ZXJ5QnVpbGRlcjpib29sZWFuID10cnVlO1xyXG4gIEBJbnB1dCgpIGxvY2FsRXhwb3J0OmJvb2xlYW4gPWZhbHNlO1xyXG4gIEBJbnB1dCgpIHF1ZXJ5U3RyaW5nOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBhcGlOYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQElucHV0KCkgbW9kZWw6IGFueSA9IHt9O1xyXG4gZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnID0ge1xyXG4gICAgY29sdW1uczoge30sXHJcbiAgICAgIGZpbHRlcnM6IHRoaXMubW9kZWwsXHJcbiAgICAgIGV4cG9ydFR5cGU6IHRoaXMuZXhwb3J0VHlwZSxcclxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWVcclxuICB9O1xyXG4gIGV4cG9ydFR5cGVzID0gW1xyXG4gICAgeyB2YWx1ZTogRXhwb3J0VHlwZS5FWENFTCwgbGFiZWw6ICdFWENFTCcsIGljb246ICdwaSBwaS1maWxlLWV4Y2VsJyB9LFxyXG4gICAgeyB2YWx1ZTogRXhwb3J0VHlwZS5QREYsIGxhYmVsOiAnUERGJywgaWNvbjogJ3BpIHBpLWZpbGUtcGRmJyB9LFxyXG4gICAgeyB2YWx1ZTogRXhwb3J0VHlwZS5IVE1MLCBsYWJlbDogJ0hUTUwnLCBpY29uOiAncGkgcGktY29kZScgfSxcclxuICAgIHsgdmFsdWU6IEV4cG9ydFR5cGUuUFJJTlQsIGxhYmVsOiAnUFJJTlQnLCBpY29uOiAncGkgcGktcHJpbnQnIH1cclxuICBdO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XHJcbnByaXZhdGUgcmVzdFNlcnZpY2U6UmVzdFNlcnZpY2UgPSBpbmplY3QoIFJlc3RTZXJ2aWNlKTtcclxuIHByaXZhdGUgcXVlcnlCdWlsZGVyID0gaW5qZWN0KFF1ZXJ5QnVpbGRlclNlcnZpY2UpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuIHB1YmxpYyByZWY6IER5bmFtaWNEaWFsb2dSZWYsXHJcbiAgICBwdWJsaWMgY29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZmlsdGVyRmllbGRzID0gdGhpcy5jb25maWcuZGF0YT8uZmlsdGVyRmllbGRzIHx8IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsaXplQ29tcG9uZW50KCk7XHJcbiAgICAgdGhpcy5idWlsZFF1ZXJ5VUlGaWVsZHMoKTtcclxuICB9XHJcbiBnZXQgZmlsdGVyQ291bnQoKXtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSAoKHRoaXMubW9kZWw/LmFkdmFuY2VkRmlsdGVycyA/PyBbXSlbMF0/LmNvbmRpdGlvbnM/Lmxlbmd0aCB8fCAwKSArXHJcbiAgICAoKHRoaXMubW9kZWw/LnNvcnRpbmcgPz8gW10pPy5sZW5ndGggfHwgMCkgK1xyXG4gICAgKHRoaXMubW9kZWw/LnBhZ2luYXRpb24gJiYgdGhpcy5tb2RlbD8ucGFnaW5hdGlvbj8udG9wID8gMSA6IDApO1xyXG4gICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgfVxyXG4gIHByaXZhdGUgYnVpbGRRdWVyeVVJRmllbGRzKCkge1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlUXVlcnlCdWlsZGVyKSB7XHJcbiAgICAgIHRoaXMuZmllbGRzXyA9IHRoaXMucXVlcnlCdWlsZGVyLmJ1aWxkUXVlcnlVSUZpZWxkcyh0aGlzLmZpbHRlckZpZWxkcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpZWxkc18gPSB0aGlzLmZpbHRlckZpZWxkcyA7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbXBvbmVudCgpIHtcclxuICAgIHRoaXMuYXBpTmFtZSA9IHRoaXMuY29uZmlnLmRhdGE/LmFwaU5hbWUgfHwgJyc7XHJcbiAgICBjb25zdCBjb2x1bW5EZWZpbml0aW9ucyA9IHRoaXMuY29uZmlnLmRhdGE/LmNvbHVtbnMgfHwge307XHJcblxyXG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkRlZmluaXRpb25zKS5sZW5ndGggPiAwKSB7XHJcbiAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhjb2x1bW5EZWZpbml0aW9ucykubWFwKGtleSA9PiAoe1xyXG4gICAgICBrZXk6IFN0cmluZyhrZXkpLFxyXG4gICAgICBkaXNwbGF5TmFtZTogU3RyaW5nKGNvbHVtbkRlZmluaXRpb25zW2tleV0pLFxyXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcclxuICAgICAgY3VzdG9tTmFtZTogU3RyaW5nKGNvbHVtbkRlZmluaXRpb25zW2tleV0pXHJcbiAgICB9KSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuYXZhaWxhYmxlQ29sdW1ucyA9ICh0aGlzLmZpbHRlckZpZWxkcyB8fCBbXSkubWFwKGYgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcoZi5rZXkgPz8gJycpO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyhmLnByb3BzPy5sYWJlbCA/PyBrZXkpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGtleSxcclxuICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChsYWJlbCksXHJcbiAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXHJcbiAgICAgICAgY3VzdG9tTmFtZTogbGFiZWxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gICAgdGhpcy5maWx0ZXJGaWVsZHMgPSB0aGlzLmNvbmZpZy5kYXRhPy5maWx0ZXJGaWVsZHMgfHwgdGhpcy5nZXREZWZhdWx0RmlsdGVyRmllbGRzKCk7XHJcbiAgICB0aGlzLm1vZGVsID0gdGhpcy5jb25maWcuZGF0YT8ubW9kZWwgfHwge307XHJcbiAgICB0aGlzLmZpbGVOYW1lID0gdGhpcy5jb25maWcuZGF0YT8uZGVmYXVsdEZpbGVOYW1lIHx8IGBleHBvcnRfJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXX1gO1xyXG5cclxuICAgIC8vIExvYWQgc2FtcGxlIGRhdGEgZm9yIHByZXZpZXdcclxuICAgIHRoaXMubG9hZFByZXZpZXdEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERlZmF1bHRGaWx0ZXJGaWVsZHMoKTogRm9ybWx5RmllbGRDb25maWdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiAnc2VhcmNoJyxcclxuICAgICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnU0VBUkNIJyksXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnRU5URVJfU0VBUkNIX1RFUk0nKSxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRDb2x1bW5zKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRUeXBlQ2hhbmdlKHR5cGU6IEV4cG9ydFR5cGUpIHtcclxuICAgIHRoaXMuZXhwb3J0VHlwZSA9IHR5cGU7XHJcbiAgICAvLyBBdXRvLXN3aXRjaCB0byBwcmV2aWV3IHRhYiBmb3IgSFRNTC9QcmludFxyXG4gICAgaWYgKCh0eXBlID09PSBFeHBvcnRUeXBlLkhUTUwgfHwgdHlwZSA9PT0gRXhwb3J0VHlwZS5QUklOVCkgJiYgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVRhYkluZGV4ID0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ29sdW1uVG9nZ2xlKGNvbHVtbjogYW55KSB7XHJcbiAgICBpZiAoIWNvbHVtbi5zZWxlY3RlZCkge1xyXG4gICAgICBjb2x1bW4uY3VzdG9tTmFtZSA9IGNvbHVtbi5kaXNwbGF5TmFtZTtcclxuICAgIH1cclxuICAgIC8vIFJlZnJlc2ggcHJldmlldyB3aGVuIGNvbHVtbnMgY2hhbmdlXHJcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJbmRleCA9PT0gMSkge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlUHJldmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DdXN0b21OYW1lQ2hhbmdlKGNvbHVtbjogYW55KSB7XHJcbiAgICBpZiAoIWNvbHVtbi5jdXN0b21OYW1lPy50cmltKCkpIHtcclxuICAgICAgY29sdW1uLmN1c3RvbU5hbWUgPSBjb2x1bW4uZGlzcGxheU5hbWU7XHJcbiAgICB9XHJcbiAgICAvLyBSZWZyZXNoIHByZXZpZXcgd2hlbiBjb2x1bW4gbmFtZXMgY2hhbmdlXHJcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJbmRleCA9PT0gMSkge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlUHJldmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsQ29sdW1ucygpIHtcclxuICAgIHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbC5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIGNvbC5jdXN0b21OYW1lID0gY29sLmRpc3BsYXlOYW1lO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlUHJldmlldygpO1xyXG4gIH1cclxuXHJcbiAgZGVzZWxlY3RBbGxDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5hdmFpbGFibGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucHJldmlld0RhdGEgPSBbXTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZ2VuZXJhdGVQcmV2aWV3KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnByZXZpZXdEYXRhID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbiBhIHJlYWwgYXBwbGljYXRpb24sIHlvdSB3b3VsZCBjYWxsIHlvdXIgQVBJIGhlcmVcclxuICAgIC8vIEZvciBkZW1vIHB1cnBvc2VzLCB3ZSdyZSB1c2luZyB0aGUgc2FtcGxlIGRhdGFcclxuICAgIHRoaXMubG9hZFByZXZpZXdEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBnZXRQcmV2aWV3VmFsdWUocm93OiBhbnksIGNvbHVtbktleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIC8vIEhhbmRsZSBuZXN0ZWQgcHJvcGVydGllcyB3aXRoIGRvdCBub3RhdGlvblxyXG4gICAgcmV0dXJuIGNvbHVtbktleS5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIHJvdykgfHwgJy0nO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBnZXRFeHBvcnRCdXR0b25UZXh0KCk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuZXhwb3J0VHlwZSkge1xyXG4gICAgICBjYXNlIEV4cG9ydFR5cGUuUFJJTlQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ1BSSU5UJyk7XHJcbiAgICAgIGNhc2UgRXhwb3J0VHlwZS5IVE1MOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdHRU5FUkFURV9SRVBPUlQnKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnRVhQT1JUJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIC8vIFVzZSB0aGUgbmV3IFF1ZXJ5QnVpbGRlclNlcnZpY2UgbWV0aG9kc1xyXG4gICAgY29uc3Qgb2RhdGFQYXJhbXMgPSB0aGlzLnF1ZXJ5QnVpbGRlci5idWlsZE9EYXRhRnJvbVF1ZXJ5TW9kZWwodGhpcy5tb2RlbCwgdGhpcy5maWx0ZXJGaWVsZHMpO1xyXG4gICAgLy8gdGhpcy5vZGF0YVNlYXJjaC5lbWl0KG9kYXRhUGFyYW1zKTtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBxdWVyeSBzdHJpbmcgdXNpbmcgdGhlIHVuaWZpZWQgbWV0aG9kXHJcbiAgICB0aGlzLnF1ZXJ5U3RyaW5nID0gdGhpcy5xdWVyeUJ1aWxkZXIudG9PRGF0YVF1ZXJ5U3RyaW5nKG9kYXRhUGFyYW1zKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdPRGF0YSBRdWVyeSBTdHJpbmc6JywgcXVlcnlTdHJpbmcpO1xyXG4gICAgaWYodGhpcy5tb2RlbD8ucGFnaW5hdGlvbiAmJiB0aGlzLm1vZGVsPy5wYWdpbmF0aW9uPy50b3Ape1xyXG4gICAgLy8gdGhpcy5wYWdpbmF0aW9uQ2hhbmdlLmVtaXQoe1xyXG4gICAgLy8gICB0b3A6dGhpcy5tb2RlbD8ucGFnaW5hdGlvbj8udG9wLFxyXG4gICAgLy8gICAgIC8vIHNraXA6LFxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG4gIC8vICAgdGhpcy5zZWFyY2guZW1pdChcclxuICAvLyAgICAge1xyXG4gIC8vICAgICAgIGZpbHRlcjp0aGlzLm1vZGVsWydmaWx0ZXInXSxcclxuICAvLyAgICAgICBxdWVyeTp0aGlzLnF1ZXJ5U3RyaW5nLFxyXG4gIC8vICAgICAgIC8vIHNvcnRpbmc6LFxyXG4gIC8vICAgICAgIC8vIHRvcDosXHJcbiAgLy8gICAgICAgLy8gc2tpcDosXHJcblxyXG4gIC8vICAgfVxyXG4gIC8vICk7XHJcbiAgdGhpcy5sb2FkUHJldmlld0RhdGEoKTtcclxuICB9XHJcblxyXG4gIG9uUmVzZXQoKSB7XHJcbiAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb2wuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICBjb2wuY3VzdG9tTmFtZSA9IGNvbC5kaXNwbGF5TmFtZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5leHBvcnRUeXBlID0gRXhwb3J0VHlwZS5FWENFTDtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSBgZXhwb3J0XyR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF19YDtcclxuICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgdGhpcy5tb2RlbCA9IHt9O1xyXG4gICAgdGhpcy5hY3RpdmVUYWJJbmRleCA9IDA7XHJcbiAgICB0aGlzLmdlbmVyYXRlUHJldmlldygpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBQcmVwYXJlIGNvbHVtbnMgbWFwcGluZ1xyXG4gICAgY29uc3QgY29sdW1uc01hcHBpbmc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sdW1uc01hcHBpbmdbY29sLmtleV0gPSBjb2wuY3VzdG9tTmFtZSB8fCBjb2wuZGlzcGxheU5hbWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBleHBvcnRDb25maWcgPSB7XHJcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnNNYXBwaW5nLFxyXG4gICAgICBmaWx0ZXJzOiB0aGlzLm1vZGVsLFxyXG4gICAgICBleHBvcnRUeXBlOiB0aGlzLmV4cG9ydFR5cGUsXHJcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEhhbmRsZSBleHBvcnQgYmFzZWQgb24gdHlwZVxyXG4gICAgc3dpdGNoICh0aGlzLmV4cG9ydFR5cGUpIHtcclxuICAgICAgY2FzZSBFeHBvcnRUeXBlLlBSSU5UOlxyXG4gICAgICAgIHRoaXMucHJpbnRQcmV2aWV3KCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRXhwb3J0VHlwZS5IVE1MOlxyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVIdG1sUmVwb3J0KGV4cG9ydENvbmZpZyk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5oYW5kbGVBcGlFeHBvcnQoZXhwb3J0Q29uZmlnKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVIdG1sUmVwb3J0KGNvbmZpZzogYW55KSB7XHJcbiAgICBjb25zdCBodG1sQ29udGVudCA9IHRoaXMucHJldmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbaHRtbENvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2h0bWwnIH0pO1xyXG4gICAgdGhpcy5kb3dubG9hZEZpbGUoYmxvYiwgYCR7Y29uZmlnLmZpbGVOYW1lfS5odG1sYCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUFwaUV4cG9ydChjb25maWc6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICBjb25zdCBmaWx0ZXJzOiBQYXJ0aWFsPGFueT4gPSB7XHJcbiAgICAgIGZpbGVOYW1lOmNvbmZpZy5maWxlTmFtZSB8fCAnJyxcclxuICAgICAgcXVlcnk6dGhpcy5xdWVyeVN0cmluZyxcclxuICAgICAgZXhwb3J0VHlwZTpjb25maWcuZXhwb3J0VHlwZSxcclxuICAgICAgY29sdW1uczpKU09OLnN0cmluZ2lmeShjb25maWcuY29sdW1ucyksXHJcbiAgICAvLyAuLi50aGlzLmN1cnJlbnRGaWx0ZXJzLFxyXG4gICAgLy8gLi4udGhpcy5wYWdlRmlsdGVycyxcclxuICAgIC8vIC4uLih0aGlzLnNlYXJjaEdsb2JhbCA/IHsgZmlsdGVyOiB0aGlzLnNlYXJjaEdsb2JhbCB9IDoge30pLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5rZXlzKGZpbHRlcnMpLnJlZHVjZSgoYWNjOmFueSwga2V5KSA9PiB7XHJcbiAgICAgICAgYWNjW2tleV0gPSBmaWx0ZXJzW2tleV07XHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwge30pO1xyXG5cclxuICAgIHRoaXMucmVzdFNlcnZpY2UucmVxdWVzdDxhbnksIGFueT4oXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgIHVybDogYC8ke3RoaXMuYXBpTmFtZX0vZXhwb3J0YCxcclxuICAgICAgICAvLyBib2R5OiB7IC4uLmNvbmZpZy5maWx0ZXJzLCAuLi50aGlzLm1vZGVsIH0sXHJcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgfSxcclxuICAgICAgeyBhcGlOYW1lOiB0aGlzLmFwaU5hbWUgfVxyXG4gICAgKVxyXG4gICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgIGlmKGNvbmZpZy5leHBvcnRUeXBlID09IEV4cG9ydFR5cGUuRVhDRUwpe1xyXG4gICAgICAgICAgY29uc3QgYmxvYiA9IHRoaXMuYmFzZTY0VG9CbG9iKHJlc3BvbnNlLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnKTtcclxuICAgICAgICAgIHRoaXMuZG93bmxvYWRGaWxlKGJsb2IsIGAke2NvbmZpZy5maWxlTmFtZX0uJHt0aGlzLmdldEZpbGVFeHRlbnNpb24oY29uZmlnLmV4cG9ydFR5cGUpfWApO1xyXG4gICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXhwb3J0IGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByZXZpZXdEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGZpbHRlcnM6IFBhcnRpYWw8YW55PiA9IHtcclxuICAgICAgcXVlcnk6dGhpcy5xdWVyeVN0cmluZyxcclxuICAgICAgZXhwb3J0VHlwZTpFeHBvcnRUeXBlLkxJU1QsXHJcbiAgICAgIGNvbHVtbnM6SlNPTi5zdHJpbmdpZnkodGhpcy5nZXRQcmV2aWV3Q29sdW1ucygpKSxcclxuICAgIC8vIC4uLnRoaXMuY3VycmVudEZpbHRlcnMsXHJcbiAgICAvLyAuLi50aGlzLnBhZ2VGaWx0ZXJzLFxyXG4gICAgLy8gLi4uKHRoaXMuc2VhcmNoR2xvYmFsID8geyBmaWx0ZXI6IHRoaXMuc2VhcmNoR2xvYmFsIH0gOiB7fSksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMoZmlsdGVycykucmVkdWNlKChhY2M6YW55LCBrZXkpID0+IHtcclxuICAgICAgICBhY2Nba2V5XSA9IGZpbHRlcnNba2V5XTtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCB7fSk7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlcXVlc3Q8YW55LCBhbnk+KFxyXG4gICAgICB7XHJcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICB1cmw6IGAvJHt0aGlzLmFwaU5hbWV9L2V4cG9ydGAsXHJcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgfSxcclxuICAgICAgeyBhcGlOYW1lOiB0aGlzLmFwaU5hbWUgfVxyXG4gICAgKVxyXG4gICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucHJldmlld0RhdGEgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXZpZXcgbG9hZCBmYWlsZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJldmlld0NvbHVtbnMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBjb25zdCBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbHVtbnNbY29sLmtleV0gPSBjb2wuY3VzdG9tTmFtZSB8fCBjb2wuZGlzcGxheU5hbWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiYXNlNjRUb0Jsb2IoYmFzZTY0OiBzdHJpbmcsIG1pbWU6IHN0cmluZyk6IEJsb2Ige1xyXG4gIGNvbnN0IGJ5dGVDaGFycyA9IGF0b2IoYmFzZTY0KTtcclxuICBjb25zdCBieXRlTnVtcyA9IEFycmF5LmZyb20oYnl0ZUNoYXJzLCBjID0+IGMuY2hhckNvZGVBdCgwKSk7XHJcbiAgcmV0dXJuIG5ldyBCbG9iKFtuZXcgVWludDhBcnJheShieXRlTnVtcyldLCB7IHR5cGU6IG1pbWUgfSk7XHJcbn1cclxuICBwcml2YXRlIGRvd25sb2FkRmlsZShibG9iOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSB1cmw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbGVFeHRlbnNpb24oZXhwb3J0VHlwZTogRXhwb3J0VHlwZSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKGV4cG9ydFR5cGUpIHtcclxuICAgICAgY2FzZSBFeHBvcnRUeXBlLkVYQ0VMOlxyXG4gICAgICAgIHJldHVybiAneGxzeCc7XHJcbiAgICAgIGNhc2UgRXhwb3J0VHlwZS5QREY6XHJcbiAgICAgICAgcmV0dXJuICdwZGYnO1xyXG4gICAgICBjYXNlIEV4cG9ydFR5cGUuSFRNTDpcclxuICAgICAgICByZXR1cm4gJ2h0bWwnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAneGxzeCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgcHJpbnRQcmV2aWV3KCkge1xyXG4gICAgY29uc3QgcHJpbnRDb250ZW50ID0gdGhpcy5wcmV2aWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MO1xyXG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7XHJcblxyXG4gICAgLy8gQ3JlYXRlIHByaW50IHdpbmRvd1xyXG4gICAgY29uc3QgcHJpbnRXaW5kb3cgPSB3aW5kb3cub3BlbignJywgJ19ibGFuaycsICd3aWR0aD04MDAsaGVpZ2h0PTYwMCcpO1xyXG4gICAgaWYgKHByaW50V2luZG93KSB7XHJcbiAgICAgIHByaW50V2luZG93LmRvY3VtZW50LndyaXRlKGBcclxuICAgICAgICA8IURPQ1RZUEUgaHRtbD5cclxuICAgICAgICA8aHRtbD5cclxuICAgICAgICAgIDxoZWFkPlxyXG4gICAgICAgICAgICA8dGl0bGU+JHt0aGlzLmZpbGVOYW1lfTwvdGl0bGU+XHJcbiAgICAgICAgICAgIDxzdHlsZT5cclxuICAgICAgICAgICAgICBib2R5IHsgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBtYXJnaW46IDIwcHg7IH1cclxuICAgICAgICAgICAgICB0YWJsZSB7IHdpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB9XHJcbiAgICAgICAgICAgICAgdGgsIHRkIHsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB9XHJcbiAgICAgICAgICAgICAgdGggeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyBmb250LXdlaWdodDogYm9sZDsgfVxyXG4gICAgICAgICAgICAgIC5oZWFkZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDIwcHg7IH1cclxuICAgICAgICAgICAgICAuZm9vdGVyIHsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tdG9wOiAyMHB4OyBmb250LXNpemU6IDEycHg7IGNvbG9yOiAjNjY2OyB9XHJcbiAgICAgICAgICAgICAgQG1lZGlhIHByaW50IHtcclxuICAgICAgICAgICAgICAgIGJvZHkgeyBtYXJnaW46IDA7IH1cclxuICAgICAgICAgICAgICAgIC5uby1wcmludCB7IGRpc3BsYXk6IG5vbmU7IH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc3R5bGU+XHJcbiAgICAgICAgICA8L2hlYWQ+XHJcbiAgICAgICAgICA8Ym9keT5cclxuICAgICAgICAgICAgJHtwcmludENvbnRlbnR9XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgbm8tcHJpbnRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJ3aW5kb3cucHJpbnQoKVwiIHN0eWxlPVwicGFkZGluZzogMTBweCAyMHB4OyBtYXJnaW46IDEwcHg7IGJhY2tncm91bmQ6ICMwMDdiZmY7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIFByaW50IFJlcG9ydFxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz1cIndpbmRvdy5jbG9zZSgpXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7IG1hcmdpbjogMTBweDsgYmFja2dyb3VuZDogIzZjNzU3ZDsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgQ2xvc2VcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2JvZHk+XHJcbiAgICAgICAgPC9odG1sPlxyXG4gICAgICBgKTtcclxuICAgICAgcHJpbnRXaW5kb3cuZG9jdW1lbnQuY2xvc2UoKTtcclxuXHJcbiAgICAgIC8vIEF1dG8tcHJpbnQgd2hlbiB3aW5kb3cgbG9hZHNcclxuICAgICAgcHJpbnRXaW5kb3cub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIHByaW50V2luZG93LmZvY3VzKCk7XHJcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGZvciBhdXRvLXByaW50XHJcbiAgICAgICAgLy8gcHJpbnRXaW5kb3cucHJpbnQoKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxufVxyXG4iLCJcclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGgtZnVsbCBiZy13aGl0ZSBkYXJrOmJnLWdyYXktOTAwIHJvdW5kZWQtbGcgbWF4LXctNnhsIG14LWF1dG9cIj5cclxuICAgICAgPCEtLSBIZWFkZXIgLS0+XHJcbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTQgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlXCI+XHJcbiAgICAgICAgICB7eyAnRVhQT1JUX0RBVEEnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9oMj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVmPy5jbG9zZSgpXCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIHJvdW5kZWQtbGcgaG92ZXI6YmctZ3JheS0xMDAgZGFyazpob3ZlcjpiZy1ncmF5LTcwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdGltZXMgdGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDBcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgIDwhLS0gQ29udGVudCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBvdmVyZmxvdy1oaWRkZW5cIj5cclxuICAgICAgICA8cC10YWJzIFt2YWx1ZV09XCJhY3RpdmVUYWJJbmRleFwiPlxyXG4gICAgICAgICAgPCEtLSBDb25maWd1cmF0aW9uIFRhYiAtLT5cclxuICAgICAgICAgICAgPHAtdGFibGlzdD5cclxuICAgICAgICA8cC10YWIgdmFsdWU9XCIwXCI+e3snQ09ORklHVVJBVElPTicgfCB0cmFuc2xhdGV9fTwvcC10YWI+XHJcbiAgICAgICAgPHAtdGFiIHZhbHVlPVwiMVwiPnt7J1BSRVZJRVcnIHwgdHJhbnNsYXRlfX08L3AtdGFiPlxyXG4gICAgPC9wLXRhYmxpc3Q+XHJcbiAgICA8cC10YWJwYW5lbHM+XHJcbiAgICAgICAgICA8cC10YWJwYW5lbCB2YWx1ZT1cIjBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTEgbGc6Z3JpZC1jb2xzLTIgZ2FwLTYgcC00IG1heC1oLVs2MHZoXSBvdmVyZmxvdy15LWF1dG9cIj5cclxuICAgICAgICAgICAgICA8IS0tIExlZnQgQ29sdW1uIC0gRXhwb3J0IFNldHRpbmdzIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTZcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gRmlsZSBOYW1lIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgZGFyazp0ZXh0LWdyYXktMzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ0ZJTEVfTkFNRScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsZU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHAtMyBib3JkZXIgYm9yZGVyLWdyYXktMzAwIGRhcms6Ym9yZGVyLWdyYXktNjAwIHJvdW5kZWQtbGcgYmctd2hpdGUgZGFyazpiZy1ncmF5LTgwMCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRU5URVJfRklMRV9OQU1FJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBFeHBvcnQgVHlwZSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdFWFBPUlRfRk9STUFUJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHR5cGUgb2YgZXhwb3J0VHlwZXNcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1yYWRpb0J1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInZXhwb3J0VHlwZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidHlwZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhwb3J0VHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImAke3R5cGUudmFsdWV9YFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uRXhwb3J0VHlwZUNoYW5nZSh0eXBlLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLXJhZGlvQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwidHlwZS52YWx1ZVwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwidHlwZS5pY29uICsgJyBtci0yJ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHlwZS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEZpbHRlcnMgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdTRUFSQ0hfRklMVEVSUycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dGaWx0ZXJzID0gIXNob3dGaWx0ZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWJsdWUtNjAwIGRhcms6dGV4dC1ibHVlLTQwMCBob3Zlcjp1bmRlcmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHNob3dGaWx0ZXJzID8gKCdISURFX0ZJTFRFUlMnIHwgdHJhbnNsYXRlKSA6ICgnU0hPV19GSUxURVJTJyB8IHRyYW5zbGF0ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJzaG93RmlsdGVyc1wiIGNsYXNzPVwic3BhY2UteS00IHAtNCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwIHJvdW5kZWQtbGcgYmctZ3JheS01MCBkYXJrOmJnLWdyYXktODAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm1seS1mb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZHNdPVwiZmllbGRzX1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm1seS1mb3JtPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBSaWdodCBDb2x1bW4gLSBDb2x1bW4gU2VsZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdTRUxFQ1RfQ09MVU1OUycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGxDb2x1bW5zKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtYmx1ZS02MDAgZGFyazp0ZXh0LWJsdWUtNDAwIGhvdmVyOnVuZGVybGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1NFTEVDVF9BTEwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzZWxlY3RBbGxDb2x1bW5zKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtYmx1ZS02MDAgZGFyazp0ZXh0LWJsdWUtNDAwIGhvdmVyOnVuZGVybGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgJ0RFU0VMRUNUX0FMTCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF4LWgtODAgb3ZlcmZsb3cteS1hdXRvIGJvcmRlciBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDAgcm91bmRlZC1sZ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYXZhaWxhYmxlQ29sdW1uc1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcC0zIGJvcmRlci1iIGJvcmRlci1ncmF5LTEwMCBkYXJrOmJvcmRlci1ncmF5LTYwMCBsYXN0OmJvcmRlci1iLTAgaG92ZXI6YmctZ3JheS01MCBkYXJrOmhvdmVyOmJnLWdyYXktNzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJjb2x1bW4ua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNvbHVtblRvZ2dsZShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJjb2x1bW4ua2V5XCIgY2xhc3M9XCJmbGV4LTEgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgY29sdW1uLmRpc3BsYXlOYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnNlbGVjdGVkXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4uY3VzdG9tTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQ3VzdG9tTmFtZUNoYW5nZShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5kaXNwbGF5TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14cyBwLTEgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBkYXJrOmJvcmRlci1ncmF5LTYwMCByb3VuZGVkIGJnLXdoaXRlIGRhcms6YmctZ3JheS04MDAgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgdy0zMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ1VTVE9NX0NPTFVNTl9OQU1FJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0ZWQgQ29sdW1ucyBTdW1tYXJ5IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwXCIgY2xhc3M9XCJwLTMgYmctYmx1ZS01MCBkYXJrOmJnLWJsdWUtOTAwLzIwIHJvdW5kZWQtbGdcIj5cclxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtYmx1ZS03MDAgZGFyazp0ZXh0LWJsdWUtMzAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ1NFTEVDVEVEX0NPTFVNTlNfQ09VTlQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBzZWxlY3RlZENvbHVtbnMubGVuZ3RoIH0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9wLXRhYnBhbmVsPlxyXG5cclxuICAgICAgICAgIDwhLS0gUHJldmlldyBUYWIgLS0+XHJcbiAgICAgICAgICAgPCEtLSBbZGlzYWJsZWRdPVwic2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA9PT0gMFwiIC0tPlxyXG4gICAgICAgICAgPHAtdGFicGFuZWwgdmFsdWU9XCIxXCIgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00IG1heC1oLVs2MHZoXSBvdmVyZmxvdy15LWF1dG9cIj5cclxuICAgICAgICAgICAgICA8IS0tIFByZXZpZXcgQWN0aW9ucyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyAnUkVQT1JUX1BSRVZJRVcnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXhwb3J0VHlwZSA9PT0gMSB8fCBleHBvcnRUeXBlID09PSA0XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJpbnRQcmV2aWV3KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBkYXJrOnRleHQtZ3JheS0zMDAgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBkYXJrOmJvcmRlci1ncmF5LTYwMCByb3VuZGVkLWxnIGhvdmVyOmJnLWdyYXktNTAgZGFyazpob3ZlcjpiZy1ncmF5LTcwMCB0cmFuc2l0aW9uLWNvbG9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktcHJpbnQgbXItMlwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnUFJJTlQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdlbmVyYXRlUHJldmlldygpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgYmctYmx1ZS02MDAgcm91bmRlZC1sZyBob3ZlcjpiZy1ibHVlLTcwMCB0cmFuc2l0aW9uLWNvbG9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktcmVmcmVzaCBtci0yXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdSRUZSRVNIX1BSRVZJRVcnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gUHJldmlldyBDb250ZW50IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgI3ByZXZpZXdDb250YWluZXIgY2xhc3M9XCJiZy13aGl0ZSBkYXJrOmJnLWdyYXktODAwIGJvcmRlciBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDAgcm91bmRlZC1sZyBwLTZcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmVwb3J0IEhlYWRlciAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtYi02IGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMCBwYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZVwiPnt7IGZpbGVOYW1lIH19PC9oMT5cclxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTQwMCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ0dFTkVSQVRFRF9PTicgfCB0cmFuc2xhdGUgfX06IHt7IGN1cnJlbnREYXRlIHwgZGF0ZTonbWVkaXVtJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFJlcG9ydCBUYWJsZSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVyZmxvdy14LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwibWluLXctZnVsbCBkaXZpZGUteSBkaXZpZGUtZ3JheS0yMDAgZGFyazpkaXZpZGUtZ3JheS03MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9XCJiZy1ncmF5LTUwIGRhcms6YmctZ3JheS03MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBzZWxlY3RlZENvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtNiBweS0zIHRleHQtbGVmdCB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktMzAwIHVwcGVyY2FzZSB0cmFja2luZy13aWRlciBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNjAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sdW1uLmN1c3RvbU5hbWUgfHwgY29sdW1uLmRpc3BsYXlOYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiYmctd2hpdGUgZGFyazpiZy1ncmF5LTgwMCBkaXZpZGUteSBkaXZpZGUtZ3JheS0yMDAgZGFyazpkaXZpZGUtZ3JheS03MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHByZXZpZXdEYXRhOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctZ3JheS01MF09XCJpICUgMiA9PT0gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRhcms6YmctZ3JheS05MDBdPVwiaSAlIDIgPT09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBzZWxlY3RlZENvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtNiBweS00IHdoaXRlc3BhY2Utbm93cmFwIHRleHQtc20gdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTYwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFByZXZpZXdWYWx1ZShyb3csIGNvbHVtbi5rZXkpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEVtcHR5IFN0YXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByZXZpZXdEYXRhLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktOFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluYm94IHRleHQtNHhsIHRleHQtZ3JheS00MDAgZGFyazp0ZXh0LWdyYXktNTAwIG1iLTRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDBcIj57eyAnTk9fUFJFVklFV19EQVRBJyB8IHRyYW5zbGF0ZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVByZXZpZXcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdC00IHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtYmx1ZS02MDAgZGFyazp0ZXh0LWJsdWUtNDAwIGhvdmVyOnVuZGVybGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdHRU5FUkFURV9QUkVWSUVXJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmVwb3J0IEZvb3RlciAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC02IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMCBwdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwIGRhcms6dGV4dC1ncmF5LTQwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdQQUdFJyB8IHRyYW5zbGF0ZSB9fSAxIG9mIDFcclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gUHJldmlldyBJbmZvIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IHAtMyBiZy1ncmVlbi01MCBkYXJrOmJnLWdyZWVuLTkwMC8yMCByb3VuZGVkLWxnXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gdGV4dC1ncmVlbi03MDAgZGFyazp0ZXh0LWdyZWVuLTMwMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlIG1yLTJcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIHt7ICdQUkVWSUVXX0lORk8nIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9wLXRhYnBhbmVsPlxyXG5cclxuICAgICAgICAgIDwvcC10YWJwYW5lbHM+XHJcbiAgICAgICAgPC9wLXRhYnM+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBGb290ZXIgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXItdCBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDAgcHgtNiBweS00IGJnLWdyYXktNTAgZGFyazpiZy1ncmF5LTgwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblJlc2V0KClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgZGFyazp0ZXh0LWdyYXktMzAwIGhvdmVyOnRleHQtZ3JheS05MDAgZGFyazpob3Zlcjp0ZXh0LXdoaXRlIGhvdmVyOmJnLWdyYXktMTAwIGRhcms6aG92ZXI6YmctZ3JheS03MDAgcm91bmRlZC1sZyB0cmFuc2l0aW9uLWNvbG9yc1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktcmVmcmVzaCBtbC0yXCI+PC9pPlxyXG4gICAgICAgICAgICB7eyAnUkVTRVQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlZj8uY2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGRhcms6dGV4dC1ncmF5LTMwMCBib3JkZXIgYm9yZGVyLWdyYXktMzAwIGRhcms6Ym9yZGVyLWdyYXktNjAwIHJvdW5kZWQtbGcgaG92ZXI6YmctZ3JheS01MCBkYXJrOmhvdmVyOmJnLWdyYXktNzAwIHRyYW5zaXRpb24tY29sb3JzXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgIHt7ICdDQU5DRUwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkV4cG9ydCgpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZyB8fCBzZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgYmctYmx1ZS02MDAgcm91bmRlZC1sZyBob3ZlcjpiZy1ibHVlLTcwMCBkaXNhYmxlZDpiZy1ncmF5LTMwMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgdHJhbnNpdGlvbi1jb2xvcnNcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWRvd25sb2FkIG1sLTJcIiBbY2xhc3MuYW5pbWF0ZS1zcGluXT1cImxvYWRpbmdcIj48L2k+XHJcbiAgICAgICAgICAgICAge3sgZ2V0RXhwb3J0QnV0dG9uVGV4dCgpIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiBAaWYoc2hvd0ZpbHRlcnMpe1xyXG48cC1kcmF3ZXJcclxuICBbKHZpc2libGUpXT1cInNob3dGaWx0ZXJzXCJcclxuICBwb3NpdGlvbj1cInJpZ2h0XCJcclxuICBbc3R5bGVDbGFzc109XCInIXctZnVsbCBtZDohdy04MCBsZzohdy1bNDByZW1dICFoLWZ1bGwnIFwiXHJcbiAgW21vZGFsXT1cInRydWVcIlxyXG4gIFtkaXNtaXNzaWJsZV09XCJ0cnVlXCJcclxuICBzdHlsZUNsYXNzPVwicC00IHctZnVsbCBtYXgtdy1tZCBtYXgtaC1bOTB2aF0gZmxleCBmbGV4LWNvbFwiXHJcbj5cclxuICA8IS0tIEVudGlyZSBmb3JtIHdyYXBwZXIgLS0+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KCk7IHNob3dGaWx0ZXJzPWZhbHNlXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtMVwiPlxyXG4gICAgPCEtLSBTY3JvbGxhYmxlIEZvcm0gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cclxuICAgICAgPGZvcm1seS1mb3JtXHJcbiAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgW2ZpZWxkc109XCJmaWVsZHNfXCJcclxuICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvZm9ybWx5LWZvcm0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9mb3JtPlxyXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIG10LTIgc3BhY2UteC0yIGZsZXgtbm9uZVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgcEJ1dHRvbiBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIChjbGljayk9XCIgb25TdWJtaXQoKTsgc2hvd0ZpbHRlcnM9ZmFsc2VcIlxyXG4gICAgICAgbGFiZWw9XCJ7eyAnU0VBUkNIJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIHBCdXR0b25cclxuICAgICAgICBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uUmVzZXQoKTsgc2hvd0ZpbHRlcnM9ZmFsc2VcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgJ0NMRUFSJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9wLWRyYXdlcj5cclxuXHJcbiB9XHJcbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxpdGUuZnJhbWV3b3JrLW5nLnVpLmNvcmUtZ2VuZXJpYy1yZXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25nLnVpLmNvcmUvZ2VuZXJpYy1yZXBvcnQvc3JjL2VsaXRlLmZyYW1ld29yay1uZy51aS5jb3JlLWdlbmVyaWMtcmVwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|