ng-firebase-table-kxp 1.1.5 → 1.1.7
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/esm2020/lib/components/table/table.component.mjs +6 -3
- package/esm2020/lib/types/Table.mjs +2 -2
- package/fesm2015/ng-firebase-table-kxp.mjs +6 -3
- package/fesm2015/ng-firebase-table-kxp.mjs.map +1 -1
- package/fesm2020/ng-firebase-table-kxp.mjs +6 -3
- package/fesm2020/ng-firebase-table-kxp.mjs.map +1 -1
- package/lib/types/Table.d.ts +1 -0
- package/package.json +1 -1
|
@@ -184,6 +184,9 @@ export class TableComponent {
|
|
|
184
184
|
bg: TABLE_DEFAULTS.DEFAULT_BG_COLOR,
|
|
185
185
|
text: TABLE_DEFAULTS.DEFAULT_TEXT_COLOR,
|
|
186
186
|
};
|
|
187
|
+
if (this.data.showSimpleSearch === undefined) {
|
|
188
|
+
this.data.showSimpleSearch = true;
|
|
189
|
+
}
|
|
187
190
|
this.columnProperties = this.data.displayedColumns.map((column) => {
|
|
188
191
|
return column.property;
|
|
189
192
|
});
|
|
@@ -1229,10 +1232,10 @@ export class TableComponent {
|
|
|
1229
1232
|
}
|
|
1230
1233
|
}
|
|
1231
1234
|
TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [{ token: i1.Router }, { token: i2.TableService }, { token: i3.AngularFirestore }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1232
|
-
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "lib-table", inputs: { data: "data", downloadTable: "downloadTable" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3 p-2\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Action Buttons -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <!-- UNIFIED CONTROL PANEL (for non-paginated tables): SEARCH, SORT & FILTERS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === false &&\n (hasFilterableColumn === true ||\n sortableDropdownItems.length > 0 ||\n dropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH -->\n <div class=\"mb-4\" *ngIf=\"hasFilterableColumn === true\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- SORT FIELD -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS PANEL -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true ||\n this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns; trackBy: trackByProperty\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <!-- Imagem com loading -->\n <div\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n\n <!-- Imagem com URL completa e loading -->\n <div\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!(isLoading$ | async)\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading$ | async\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !(isLoading$ | async) &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg px-3 py-2 text-sm shadow-lg\"\n [ngClass]=\"\n (tooltipBgColor || 'bg-gray-800') +\n ' ' +\n (tooltipTextColor || 'text-white')\n \"\n [ngStyle]=\"getTooltipStyles()\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{--table-color: #1976d2;--table-text-color: white;--table-header-bg: #1976d2;--table-header-text: white;--table-scrollbar-bg: #f5f5f5;--table-scrollbar-thumb: var(--table-color)}.table-container::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.table-container::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.table-container::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}.overflow-x-auto::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.overflow-x-auto::-webkit-scrollbar-thumb,.overflow-y-auto::-webkit-scrollbar-thumb,.overflow-auto::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.overflow-x-auto::-webkit-scrollbar-thumb:hover,.overflow-y-auto::-webkit-scrollbar-thumb:hover,.overflow-auto::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}:host ::ng-deep .mat-table .mat-header-cell,:host ::ng-deep .mat-header-cell,:host ::ng-deep th.mat-header-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep th.mat-mdc-header-cell{background-color:var(--table-header-bg, #1976d2)!important;color:var(--table-header-text, white)!important;font-weight:600}::ng-deep .fa-filter,::ng-deep i.fa-filter{color:var(--table-color, #1976d2)!important}::ng-deep .rounded-xl.border{border-color:var(--table-color, #1976d2)!important}::ng-deep .border-gray-200.rounded-xl{border-color:var(--table-color, #1976d2)!important}::ng-deep .mdc-notched-outline__notch{border-right:none!important}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}.mat-mdc-text-field-wrapper.mdc-text-field--outlined.mdc-text-field--disabled{background:rgba(0,0,0,.15);background-size:1px 100%!important;background-repeat:repeat-x!important}.mdc-text-field--disabled .mdc-text-field__input{color:#525252}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)){transition:all .2s ease;cursor:pointer}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):hover:not(:disabled){opacity:.9;transform:scale(1.02)}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):disabled{opacity:.5;cursor:not-allowed;transform:none}::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}button[matTooltip=\"Adicionar novo filtro\"],button:has(i.fa-plus){display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;border:2px solid #93c5fd;background-color:#dbeafe;padding:.5rem 1.5rem;font-size:.875rem;font-weight:500;color:#2563eb;transition:all .3s;cursor:pointer;transform:translateY(0)}button[matTooltip=\"Adicionar novo filtro\"]:hover,button:has(i.fa-plus):hover{transform:translateY(-2px);border-color:#60a5fa;background-color:#bfdbfe;box-shadow:0 4px 6px #0000001a}button[matTooltip=\"Aplicar filtros\"],button:has(i.fa-search){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#16a34a;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Aplicar filtros\"]:hover,button:has(i.fa-search):hover{background-color:#15803d}button[matTooltip=\"Aplicar filtros\"]:disabled,button:has(i.fa-search):disabled{opacity:.5;cursor:not-allowed}button[matTooltip=\"Limpar filtros\"],button:has(i.fas.fa-redo-alt){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#ef4444;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Limpar filtros\"]:hover,button:has(i.fas.fa-redo-alt):hover{background-color:#dc2626}button[matTooltip=\"Exportar Tabela\"],button:has(i.fa-download){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#f97316;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Exportar Tabela\"]:hover:not(:disabled),button:has(i.fa-download):hover:not(:disabled){background-color:#ea580c}button[matTooltip=\"Exportar Tabela\"]:disabled,button:has(i.fa-download):disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1235
|
+
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "lib-table", inputs: { data: "data", downloadTable: "downloadTable" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3 p-2\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Action Buttons -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <!-- UNIFIED CONTROL PANEL (for non-paginated tables): SEARCH, SORT & FILTERS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === false &&\n (hasFilterableColumn === true ||\n sortableDropdownItems.length > 0 ||\n dropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH -->\n <div\n class=\"mb-4\"\n *ngIf=\"hasFilterableColumn === true && data.showSimpleSearch !== false\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- SORT FIELD -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS PANEL -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true ||\n this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns; trackBy: trackByProperty\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <!-- Imagem com loading -->\n <div\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n\n <!-- Imagem com URL completa e loading -->\n <div\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!(isLoading$ | async)\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading$ | async\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !(isLoading$ | async) &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg px-3 py-2 text-sm shadow-lg\"\n [ngClass]=\"\n (tooltipBgColor || 'bg-gray-800') +\n ' ' +\n (tooltipTextColor || 'text-white')\n \"\n [ngStyle]=\"getTooltipStyles()\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{--table-color: #1976d2;--table-text-color: white;--table-header-bg: #1976d2;--table-header-text: white;--table-scrollbar-bg: #f5f5f5;--table-scrollbar-thumb: var(--table-color)}.table-container::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.table-container::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.table-container::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}.overflow-x-auto::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.overflow-x-auto::-webkit-scrollbar-thumb,.overflow-y-auto::-webkit-scrollbar-thumb,.overflow-auto::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.overflow-x-auto::-webkit-scrollbar-thumb:hover,.overflow-y-auto::-webkit-scrollbar-thumb:hover,.overflow-auto::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}:host ::ng-deep .mat-table .mat-header-cell,:host ::ng-deep .mat-header-cell,:host ::ng-deep th.mat-header-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep th.mat-mdc-header-cell{background-color:var(--table-header-bg, #1976d2)!important;color:var(--table-header-text, white)!important;font-weight:600}::ng-deep .fa-filter,::ng-deep i.fa-filter{color:var(--table-color, #1976d2)!important}::ng-deep .rounded-xl.border{border-color:var(--table-color, #1976d2)!important}::ng-deep .border-gray-200.rounded-xl{border-color:var(--table-color, #1976d2)!important}::ng-deep .mdc-notched-outline__notch{border-right:none!important}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}.mat-mdc-text-field-wrapper.mdc-text-field--outlined.mdc-text-field--disabled{background:rgba(0,0,0,.15);background-size:1px 100%!important;background-repeat:repeat-x!important}.mdc-text-field--disabled .mdc-text-field__input{color:#525252}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)){transition:all .2s ease;cursor:pointer}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):hover:not(:disabled){opacity:.9;transform:scale(1.02)}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):disabled{opacity:.5;cursor:not-allowed;transform:none}::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}button[matTooltip=\"Adicionar novo filtro\"],button:has(i.fa-plus){display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;border:2px solid #93c5fd;background-color:#dbeafe;padding:.5rem 1.5rem;font-size:.875rem;font-weight:500;color:#2563eb;transition:all .3s;cursor:pointer;transform:translateY(0)}button[matTooltip=\"Adicionar novo filtro\"]:hover,button:has(i.fa-plus):hover{transform:translateY(-2px);border-color:#60a5fa;background-color:#bfdbfe;box-shadow:0 4px 6px #0000001a}button[matTooltip=\"Aplicar filtros\"],button:has(i.fa-search){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#16a34a;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Aplicar filtros\"]:hover,button:has(i.fa-search):hover{background-color:#15803d}button[matTooltip=\"Aplicar filtros\"]:disabled,button:has(i.fa-search):disabled{opacity:.5;cursor:not-allowed}button[matTooltip=\"Limpar filtros\"],button:has(i.fas.fa-redo-alt){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#ef4444;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Limpar filtros\"]:hover,button:has(i.fas.fa-redo-alt):hover{background-color:#dc2626}button[matTooltip=\"Exportar Tabela\"],button:has(i.fa-download){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#f97316;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Exportar Tabela\"]:hover:not(:disabled),button:has(i.fa-download):hover:not(:disabled){background-color:#ea580c}button[matTooltip=\"Exportar Tabela\"]:disabled,button:has(i.fa-download):disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1233
1236
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
|
|
1234
1237
|
type: Component,
|
|
1235
|
-
args: [{ selector: 'lib-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3 p-2\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Action Buttons -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <!-- UNIFIED CONTROL PANEL (for non-paginated tables): SEARCH, SORT & FILTERS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === false &&\n (hasFilterableColumn === true ||\n sortableDropdownItems.length > 0 ||\n dropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH -->\n <div class=\"mb-4\" *ngIf=\"hasFilterableColumn === true\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- SORT FIELD -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS PANEL -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true ||\n this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns; trackBy: trackByProperty\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <!-- Imagem com loading -->\n <div\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n\n <!-- Imagem com URL completa e loading -->\n <div\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!(isLoading$ | async)\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading$ | async\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !(isLoading$ | async) &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg px-3 py-2 text-sm shadow-lg\"\n [ngClass]=\"\n (tooltipBgColor || 'bg-gray-800') +\n ' ' +\n (tooltipTextColor || 'text-white')\n \"\n [ngStyle]=\"getTooltipStyles()\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{--table-color: #1976d2;--table-text-color: white;--table-header-bg: #1976d2;--table-header-text: white;--table-scrollbar-bg: #f5f5f5;--table-scrollbar-thumb: var(--table-color)}.table-container::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.table-container::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.table-container::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}.overflow-x-auto::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.overflow-x-auto::-webkit-scrollbar-thumb,.overflow-y-auto::-webkit-scrollbar-thumb,.overflow-auto::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.overflow-x-auto::-webkit-scrollbar-thumb:hover,.overflow-y-auto::-webkit-scrollbar-thumb:hover,.overflow-auto::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}:host ::ng-deep .mat-table .mat-header-cell,:host ::ng-deep .mat-header-cell,:host ::ng-deep th.mat-header-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep th.mat-mdc-header-cell{background-color:var(--table-header-bg, #1976d2)!important;color:var(--table-header-text, white)!important;font-weight:600}::ng-deep .fa-filter,::ng-deep i.fa-filter{color:var(--table-color, #1976d2)!important}::ng-deep .rounded-xl.border{border-color:var(--table-color, #1976d2)!important}::ng-deep .border-gray-200.rounded-xl{border-color:var(--table-color, #1976d2)!important}::ng-deep .mdc-notched-outline__notch{border-right:none!important}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}.mat-mdc-text-field-wrapper.mdc-text-field--outlined.mdc-text-field--disabled{background:rgba(0,0,0,.15);background-size:1px 100%!important;background-repeat:repeat-x!important}.mdc-text-field--disabled .mdc-text-field__input{color:#525252}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)){transition:all .2s ease;cursor:pointer}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):hover:not(:disabled){opacity:.9;transform:scale(1.02)}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):disabled{opacity:.5;cursor:not-allowed;transform:none}::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}button[matTooltip=\"Adicionar novo filtro\"],button:has(i.fa-plus){display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;border:2px solid #93c5fd;background-color:#dbeafe;padding:.5rem 1.5rem;font-size:.875rem;font-weight:500;color:#2563eb;transition:all .3s;cursor:pointer;transform:translateY(0)}button[matTooltip=\"Adicionar novo filtro\"]:hover,button:has(i.fa-plus):hover{transform:translateY(-2px);border-color:#60a5fa;background-color:#bfdbfe;box-shadow:0 4px 6px #0000001a}button[matTooltip=\"Aplicar filtros\"],button:has(i.fa-search){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#16a34a;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Aplicar filtros\"]:hover,button:has(i.fa-search):hover{background-color:#15803d}button[matTooltip=\"Aplicar filtros\"]:disabled,button:has(i.fa-search):disabled{opacity:.5;cursor:not-allowed}button[matTooltip=\"Limpar filtros\"],button:has(i.fas.fa-redo-alt){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#ef4444;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Limpar filtros\"]:hover,button:has(i.fas.fa-redo-alt):hover{background-color:#dc2626}button[matTooltip=\"Exportar Tabela\"],button:has(i.fa-download){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#f97316;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Exportar Tabela\"]:hover:not(:disabled),button:has(i.fa-download):hover:not(:disabled){background-color:#ea580c}button[matTooltip=\"Exportar Tabela\"]:disabled,button:has(i.fa-download):disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
1238
|
+
args: [{ selector: 'lib-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3 p-2\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Action Buttons -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <!-- UNIFIED CONTROL PANEL (for non-paginated tables): SEARCH, SORT & FILTERS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === false &&\n (hasFilterableColumn === true ||\n sortableDropdownItems.length > 0 ||\n dropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH -->\n <div\n class=\"mb-4\"\n *ngIf=\"hasFilterableColumn === true && data.showSimpleSearch !== false\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- SORT FIELD -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS PANEL -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true ||\n this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns; trackBy: trackByProperty\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <!-- Imagem com loading -->\n <div\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n\n <!-- Imagem com URL completa e loading -->\n <div\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!(isLoading$ | async)\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading$ | async\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !(isLoading$ | async) &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg px-3 py-2 text-sm shadow-lg\"\n [ngClass]=\"\n (tooltipBgColor || 'bg-gray-800') +\n ' ' +\n (tooltipTextColor || 'text-white')\n \"\n [ngStyle]=\"getTooltipStyles()\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{--table-color: #1976d2;--table-text-color: white;--table-header-bg: #1976d2;--table-header-text: white;--table-scrollbar-bg: #f5f5f5;--table-scrollbar-thumb: var(--table-color)}.table-container::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.table-container::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.table-container::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}.overflow-x-auto::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.overflow-x-auto::-webkit-scrollbar-thumb,.overflow-y-auto::-webkit-scrollbar-thumb,.overflow-auto::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.overflow-x-auto::-webkit-scrollbar-thumb:hover,.overflow-y-auto::-webkit-scrollbar-thumb:hover,.overflow-auto::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}:host ::ng-deep .mat-table .mat-header-cell,:host ::ng-deep .mat-header-cell,:host ::ng-deep th.mat-header-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep th.mat-mdc-header-cell{background-color:var(--table-header-bg, #1976d2)!important;color:var(--table-header-text, white)!important;font-weight:600}::ng-deep .fa-filter,::ng-deep i.fa-filter{color:var(--table-color, #1976d2)!important}::ng-deep .rounded-xl.border{border-color:var(--table-color, #1976d2)!important}::ng-deep .border-gray-200.rounded-xl{border-color:var(--table-color, #1976d2)!important}::ng-deep .mdc-notched-outline__notch{border-right:none!important}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}.mat-mdc-text-field-wrapper.mdc-text-field--outlined.mdc-text-field--disabled{background:rgba(0,0,0,.15);background-size:1px 100%!important;background-repeat:repeat-x!important}.mdc-text-field--disabled .mdc-text-field__input{color:#525252}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)){transition:all .2s ease;cursor:pointer}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):hover:not(:disabled){opacity:.9;transform:scale(1.02)}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):disabled{opacity:.5;cursor:not-allowed;transform:none}::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}button[matTooltip=\"Adicionar novo filtro\"],button:has(i.fa-plus){display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;border:2px solid #93c5fd;background-color:#dbeafe;padding:.5rem 1.5rem;font-size:.875rem;font-weight:500;color:#2563eb;transition:all .3s;cursor:pointer;transform:translateY(0)}button[matTooltip=\"Adicionar novo filtro\"]:hover,button:has(i.fa-plus):hover{transform:translateY(-2px);border-color:#60a5fa;background-color:#bfdbfe;box-shadow:0 4px 6px #0000001a}button[matTooltip=\"Aplicar filtros\"],button:has(i.fa-search){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#16a34a;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Aplicar filtros\"]:hover,button:has(i.fa-search):hover{background-color:#15803d}button[matTooltip=\"Aplicar filtros\"]:disabled,button:has(i.fa-search):disabled{opacity:.5;cursor:not-allowed}button[matTooltip=\"Limpar filtros\"],button:has(i.fas.fa-redo-alt){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#ef4444;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Limpar filtros\"]:hover,button:has(i.fas.fa-redo-alt):hover{background-color:#dc2626}button[matTooltip=\"Exportar Tabela\"],button:has(i.fa-download){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#f97316;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Exportar Tabela\"]:hover:not(:disabled),button:has(i.fa-download):hover:not(:disabled){background-color:#ea580c}button[matTooltip=\"Exportar Tabela\"]:disabled,button:has(i.fa-download):disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
1236
1239
|
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.TableService }, { type: i3.AngularFirestore }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
|
|
1237
1240
|
type: Input
|
|
1238
1241
|
}], downloadTable: [{
|
|
@@ -1244,4 +1247,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1244
1247
|
type: ViewChild,
|
|
1245
1248
|
args: [MatSort]
|
|
1246
1249
|
}] } });
|
|
1247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFPTCxjQUFjLEdBQ2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBS1QsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsT0FBTyxFQUNQLFNBQVMsRUFDVCxlQUFlLEdBQ2hCLE1BQU0sTUFBTSxDQUFDO0FBS2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUW5FLE1BQU0sT0FBTyxjQUFjO0lBK0R6QixjQUFjO0lBQ2QsWUFDVSxNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsU0FBMkIsRUFDM0IsRUFBYyxFQUNkLEdBQXNCO1FBSnRCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsUUFBRyxH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aXRpb24sXG4gIFRhYixcbiAgVGFiRGF0YSxcbiAgVGFibGVEYXRhLFxuICBDb2x1bW4sXG4gIFRBQkxFX0RFRkFVTFRTLFxufSBmcm9tICcuLi8uLi90eXBlcy9UYWJsZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBFbGVtZW50UmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQW5ndWxhckZpcmVzdG9yZSxcbiAgUXVlcnlEb2N1bWVudFNuYXBzaG90LFxufSBmcm9tICdAYW5ndWxhci9maXJlL2NvbXBhdC9maXJlc3RvcmUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgU3ViamVjdCxcbiAgdGFrZVVudGlsLFxuICBCZWhhdmlvclN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT3JkZXJCeURpcmVjdGlvbiB9IGZyb20gJ2ZpcmViYXNlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvY29tcGF0JztcbmltcG9ydCBXaGVyZUZpbHRlck9wID0gZmlyZWJhc2UuZmlyZXN0b3JlLldoZXJlRmlsdGVyT3A7XG5pbXBvcnQgZmlyZXN0b3JlID0gZmlyZWJhc2UuZmlyZXN0b3JlO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIElOUFVUU1xuICBASW5wdXQoKSBkYXRhITogVGFibGVEYXRhO1xuICBASW5wdXQoKSBkb3dubG9hZFRhYmxlPzogKGFycmFuZ2U6IEFycmFuZ2UsIGNvbmRpdGlvbnM6IENvbmRpdGlvbltdKSA9PiB2b2lkO1xuICBhcnJhbmdlOiBBcnJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIC8vIFZBUklBQkxFU1xuICBkYXRhU291cmNlITogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIGN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG5cbiAgcHVibGljIGlzTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwdWJsaWMgaXRlbXM6IGFueVtdID0gW107XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBhbnlbXSA9IFtdOyAvLyBEYWRvcyBmaWx0cmFkb3MgcGFyYSBtb2RvIG7Do28gcGFnaW5hZG8gKHDDumJsaWNvIHBhcmEgYWNlc3NvIGV4dGVybm8pXG4gIHByaXZhdGUgbGFzdERvYzogUXVlcnlEb2N1bWVudFNuYXBzaG90PGFueT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmaXJzdERvYzogUXVlcnlEb2N1bWVudFNuYXBzaG90PGFueT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzb3J0Qnk6IHsgZmllbGQ6IHN0cmluZzsgb3JkZXI6IE9yZGVyQnlEaXJlY3Rpb24gfSA9IHtcbiAgICBmaWVsZDogVEFCTEVfREVGQVVMVFMuU09SVF9GSUVMRCxcbiAgICBvcmRlcjogVEFCTEVfREVGQVVMVFMuU09SVF9PUkRFUixcbiAgfTtcbiAgcHVibGljIGNvbHVtblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZmlsdGVyc0Zvcm06IEZvcm1BcnJheTtcblxuICBzZWxlY3RTb3J0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIGN1cnJlbnRBcnJhbmdlID0gJyc7XG5cbiAgaGFzTmV4dFBhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBkcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xuICBzb3J0YWJsZURyb3Bkb3duSXRlbXM6IGFueVtdID0gW107XG4gIHBhZ2VTaXplID0gVEFCTEVfREVGQVVMVFMuUEFHRV9TSVpFO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgcGFnZUV2ZW50PzogUGFnZUV2ZW50O1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgaGFzRmlsdGVyYWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuICBoYXNTb3J0YWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJQcmVkaWNhdGU6ICgoZGF0YTogYW55LCBmaWx0ZXI6IHN0cmluZykgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmlsdGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZVRpbWVNcyA9IFRBQkxFX0RFRkFVTFRTLkRFQk9VTkNFX1RJTUVfTVM7XG5cbiAgc2VsZWN0ZWRUYWI6IG51bWJlciA9IDA7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0ITogTWF0U29ydDtcblxuICAvLyBQcm9wcmllZGFkZXMgcGFyYSBjb250cm9sZSBkbyB0b29sdGlwXG4gIGhvdmVyZWRDZWxsOiB7IHJvdzogYW55OyBjb2w6IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIHNob3dUb29sdGlwOiBib29sZWFuID0gZmFsc2U7XG4gIHRvb2x0aXBUaW1lb3V0OiBhbnk7XG4gIHRvb2x0aXBDb250ZW50OiBzdHJpbmcgPSAnJztcbiAgdG9vbHRpcFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcbiAgdG9vbHRpcEJnQ29sb3I6IHN0cmluZyA9ICdiZy1ncmF5LTgwMCc7IC8vIENvciBwYWRyw6NvIGRvIHRvb2x0aXBcbiAgdG9vbHRpcEJnU3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCBudWxsID0gbnVsbDsgLy8gUGFyYSBjb3JlcyBoZXgvcmdiXG4gIHRvb2x0aXBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LXdoaXRlJzsgLy8gQ29yIHBhZHLDo28gZG8gdGV4dG8gZG8gdG9vbHRpcFxuICB0b29sdGlwVGV4dFN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7IC8vIFBhcmEgY29yZXMgaGV4L3JnYiBkbyB0ZXh0b1xuXG4gIC8vIENvbnRyb2xlIGRlIGxvYWRpbmcgZGUgaW1hZ2Vuc1xuICBpbWFnZUxvYWRpbmdTdGF0ZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIENPTlNUUlVDVE9SXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICBwcml2YXRlIGZpcmVzdG9yZTogQW5ndWxhckZpcmVzdG9yZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtID0gbmV3IEZvcm1BcnJheShbdGhpcy5jcmVhdGVGaWx0ZXJHcm91cCgpXSk7XG4gIH1cblxuICBjcmVhdGVGaWx0ZXJHcm91cCgpOiBGb3JtR3JvdXAge1xuICAgIC8vIENyaWFyIHZhbGlkYWRvciBkaXJldGFtZW50ZSBhcXVpIHBhcmEgZXZpdGFyIHByb2JsZW1hcyBkZSBjb250ZXh0byBkZSBpbmplw6fDo29cbiAgICBjb25zdCBkYXRlVmFsaWRhdG9yID0gdGhpcy50YWJsZVNlcnZpY2UuZGF0ZUZvcm1hdFZhbGlkYXRvcigpO1xuXG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoe1xuICAgICAgc2VsZWN0RmlsdGVyOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgdHlwZUZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIHNlbGVjdEl0ZW06IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBpbml0aWFsRGF0ZTogbmV3IEZvcm1Db250cm9sKCcnLCBbZGF0ZVZhbGlkYXRvcl0pLFxuICAgICAgZmluYWxEYXRlOiBuZXcgRm9ybUNvbnRyb2woJycsIFtkYXRlVmFsaWRhdG9yXSksXG4gICAgfSk7XG4gIH1cblxuICBhZGRGaWx0ZXIoZmlsdGVyRGF0YT86IHtcbiAgICBzZWxlY3RGaWx0ZXI6IGFueTtcbiAgICB0eXBlRmlsdGVyPzogc3RyaW5nO1xuICAgIHNlbGVjdEl0ZW0/OiBhbnlbXTtcbiAgICBpbml0aWFsRGF0ZT86IHN0cmluZztcbiAgICBmaW5hbERhdGU/OiBzdHJpbmc7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSAmJlxuICAgICAgdGhpcy5oYXNBY3RpdmVEYXRlRmlsdGVyKCkgJiZcbiAgICAgIGZpbHRlckRhdGE/LnNlbGVjdEZpbHRlcj8uYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZSdcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdGaWx0ZXJHcm91cCA9IHRoaXMuY3JlYXRlRmlsdGVyR3JvdXAoKTtcblxuICAgIGlmIChmaWx0ZXJEYXRhKSB7XG4gICAgICBpZiAoZmlsdGVyRGF0YS5zZWxlY3RGaWx0ZXIpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8uc2V0VmFsdWUoZmlsdGVyRGF0YS5zZWxlY3RGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEudHlwZUZpbHRlcikge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8uc2V0VmFsdWUoZmlsdGVyRGF0YS50eXBlRmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0SXRlbSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRGF0YS5pbml0aWFsRGF0ZSkge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuaW5pdGlhbERhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEuZmluYWxEYXRlKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuZmluYWxEYXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcnNGb3JtLnB1c2gobmV3RmlsdGVyR3JvdXApO1xuICB9XG5cbiAgaGFzQWN0aXZlRGF0ZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzRm9ybS5jb250cm9scy5zb21lKChjb250cm9sKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgIHJldHVybiBzZWxlY3RlZEZpbHRlcj8uYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZSc7XG4gICAgfSk7XG4gIH1cblxuICBnZXRBdmFpbGFibGVGaWx0ZXJPcHRpb25zKCk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiYgdGhpcy5oYXNBY3RpdmVEYXRlRmlsdGVyKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duSXRlbXMuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS5hcnJhbmdlICE9PSAnZmlsdGVyQnlEYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd25JdGVtcztcbiAgfVxuXG4gIG9uU2VsZWN0RmlsdGVyQ2hhbmdlKCkge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuZmlsdGVyc0Zvcm0ubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBsYXN0RmlsdGVyID0gdGhpcy5maWx0ZXJzRm9ybS5hdChsYXN0SW5kZXgpO1xuICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gbGFzdEZpbHRlci5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcblxuICAgIGlmIChzZWxlY3RlZEZpbHRlcikge1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RlZEZpbHRlci5hcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJyAmJlxuICAgICAgICB0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVGaWx0ZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0ucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGlmICh0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVBbGxGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY2xlYXIoKTtcbiAgICB0aGlzLmFkZEZpbHRlcigpO1xuICAgIHRoaXMucmVzZXRGaWx0ZXIoKTtcbiAgfVxuXG4gIC8vIE1FVEhPRFNcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIC8vIEFwbGljYXIgY29yZXMgcXVhbmRvIG8gZGF0YSBmb3IgZGVmaW5pZG8gb3UgbXVkYXJcbiAgICAgIC8vIFVzYXIgc2V0VGltZW91dCBwYXJhIGdhcmFudGlyIHF1ZSBhIHZpZXcgZXN0ZWphIHByb250YVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwcGx5Q3VzdG9tQ29sb3JzKCksIDApO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBHYXJhbnRpciBxdWUgYXMgY29yZXMgc2VqYW0gYXBsaWNhZGFzIGFww7NzIGEgdmlldyBlc3RhciBwcm9udGFcbiAgICB0aGlzLmFwcGx5Q3VzdG9tQ29sb3JzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VzdG9tQ29sb3JzKCk6IHZvaWQge1xuICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gdGhpcy5lbD8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWhvc3RFbGVtZW50IHx8ICF0aGlzLmRhdGEpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmRhdGEuY29sb3I/LmJnKSB7XG4gICAgICBob3N0RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10YWJsZS1jb2xvcicsIHRoaXMuZGF0YS5jb2xvci5iZyk7XG4gICAgICBob3N0RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10YWJsZS1oZWFkZXItYmcnLCB0aGlzLmRhdGEuY29sb3IuYmcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy50ZXh0KSB7XG4gICAgICBob3N0RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10YWJsZS10ZXh0LWNvbG9yJywgdGhpcy5kYXRhLmNvbG9yLnRleHQpO1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICctLXRhYmxlLWhlYWRlci10ZXh0JyxcbiAgICAgICAgdGhpcy5kYXRhLmNvbG9yLnRleHRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJDZWxscyA9IGhvc3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICcubWF0LWhlYWRlci1jZWxsLCAubWF0LW1kYy1oZWFkZXItY2VsbCwgdGgubWF0LWhlYWRlci1jZWxsLCB0aC5tYXQtbWRjLWhlYWRlci1jZWxsJ1xuICAgICAgKTtcbiAgICAgIGhlYWRlckNlbGxzLmZvckVhY2goKGNlbGw6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy5iZykge1xuICAgICAgICAgIGNlbGwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5kYXRhLmNvbG9yLmJnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuY29sb3I/LnRleHQpIHtcbiAgICAgICAgICBjZWxsLnN0eWxlLmNvbG9yID0gdGhpcy5kYXRhLmNvbG9yLnRleHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuY29sb3IpXG4gICAgICB0aGlzLmRhdGEuY29sb3IgPSB7XG4gICAgICAgIGJnOiBUQUJMRV9ERUZBVUxUUy5ERUZBVUxUX0JHX0NPTE9SLFxuICAgICAgICB0ZXh0OiBUQUJMRV9ERUZBVUxUUy5ERUZBVUxUX1RFWFRfQ09MT1IsXG4gICAgICB9O1xuICAgIHRoaXMuY29sdW1uUHJvcGVydGllcyA9IHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICByZXR1cm4gY29sdW1uLnByb3BlcnR5O1xuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5hY3Rpb25CdXR0b24gJiYgIXRoaXMuZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uKSB7XG4gICAgICB0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbiA9IChfcm93PzogYW55KSA9PiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5pc0ZpbHRlcmFibGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9PT0gZmFsc2UpIHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZmlsdGVyJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNTb3J0YWJsZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNTb3J0YWJsZUNvbHVtbiA9PT0gZmFsc2UpIHRoaXMuaGFzU29ydGFibGVDb2x1bW4gPSB0cnVlO1xuICAgICAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2FzY2VuZGluZycsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGNyZXNjZW50ZScsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2Rlc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBkZWNyZXNjZW50ZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pc0ZpbHRlcmFibGVCeURhdGUpIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZmlsdGVyQnlEYXRlJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZmlsdHJvIHBvciBkYXRhJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zICYmXG4gICAgICBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucykgJiZcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PlxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7IC4uLm9wdGlvbiwgYXJyYW5nZTogJ2VxdWFscycgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2VtIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvLyBDb20gcGFnaW5hw6fDo29cbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUpIHtcbiAgICAgIGlmICh0aGlzLmRhdGEuc29ydEJ5KVxuICAgICAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgICAgICBmaWVsZDogdGhpcy5kYXRhLnNvcnRCeS5maWVsZCxcbiAgICAgICAgICBvcmRlcjogdGhpcy5kYXRhLnNvcnRCeS5vcmRlcixcbiAgICAgICAgfTtcbiAgICAgIHRoaXMuZmlsdGVyU3ViamVjdFxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVNcyksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcblxuICAgICAgdGhpcy5zb3J0LmFjdGl2ZSA9ICdjcmVhdGVkQXQnO1xuICAgICAgdGhpcy5zb3J0LmRpcmVjdGlvbiA9ICdkZXNjJztcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgIGlmICh0aGlzLmRhdGEudG90YWxSZWYpIHtcbiAgICAgICAgZm9yIChjb25zdCB0b3RhbFJlZiBvZiB0aGlzLmRhdGEudG90YWxSZWYpIHtcbiAgICAgICAgICBjb25zdCB0b3RhbFJlZkRvYyA9IGF3YWl0IHRvdGFsUmVmLnJlZi5nZXQoKTtcbiAgICAgICAgICBjb25zdCBkb2NEYXRhID0gdG90YWxSZWZEb2MuZGF0YSgpIGFzIGFueTtcbiAgICAgICAgICBpZiAoZG9jRGF0YSAmJiBkb2NEYXRhW3RvdGFsUmVmLmZpZWxkXSlcbiAgICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9ICh0aGlzLnRvdGFsSXRlbXMgK1xuICAgICAgICAgICAgICBkb2NEYXRhW3RvdGFsUmVmLmZpZWxkXSkgYXMgbnVtYmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXREaXNwbGF5VmFsdWUoY29sOiBhbnksIHJvdzogYW55LCB3aXRoaW5MaW1pdDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBsZXQgdmFsdWU6IGFueTtcblxuICAgIGlmIChjb2wuY2FsY3VsYXRlVmFsdWUpIHtcbiAgICAgIHZhbHVlID0gY29sLmNhbGN1bGF0ZVZhbHVlKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShyb3csIGNvbC5wcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIGNvbC5hcnJheUZpZWxkKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0QXJyYXlWYWx1ZSh2YWx1ZSwgY29sLmFycmF5RmllbGQpO1xuICAgIH1cblxuICAgIGlmIChjb2wucXVlcnlMZW5ndGggJiYgcm93W2NvbC5wcm9wZXJ0eV0pIHtcbiAgICAgIHZhbHVlID0gcm93W2NvbC5wcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdmFsdWUgPSBjb2wucGlwZSA/IGNvbC5waXBlLnRyYW5zZm9ybSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHdpdGhpbkxpbWl0IHx8ICFjb2wuY2hhckxpbWl0IHx8IHZhbHVlLmxlbmd0aCA8PSBjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgY29sLmNoYXJMaW1pdCkgKyAnLi4uJztcbiAgfVxuXG4gIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwcm9wZXJ0aWVzLnJlZHVjZShcbiAgICAgIChhY2MsIGN1cnJlbnRQYXJ0KSA9PiBhY2MgJiYgYWNjW2N1cnJlbnRQYXJ0XSxcbiAgICAgIG9ialxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEFycmF5VmFsdWUoYXJyYXk6IGFueVtdLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGFycmF5XG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBzZW0gcGFnaW5hw6fDo29cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSXRlbXMoKSB7XG4gICAgdGhpcy5pbWFnZUxvYWRpbmdTdGF0ZS5jbGVhcigpOyAvLyBMaW1wYXIgZXN0YWRvIGRlIGxvYWRpbmcgZGUgaW1hZ2Vuc1xuICAgIHRoaXMuaXRlbXMgPSBhd2FpdCB0aGlzLnRhYmxlU2VydmljZS5nZXRJdGVtcyh0aGlzLmRhdGEuY29sbGVjdGlvblJlZik7XG4gICAgaWYgKHRoaXMuZGF0YS5jb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZFJlbGF0aW9ucygpO1xuICAgIGF3YWl0IHRoaXMubG9hZFF1ZXJ5TGVuZ3RocygpO1xuICAgIHRoaXMudG90YWxJdGVtcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuXG4gICAgLy8gSW5pY2lhbGl6YXIgYXJyYW5nZSBwYXJhIHRhYmVsYXMgbsOjbyBwYWdpbmFkYXNcbiAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgIHNvcnRCeTogdGhpcy5kYXRhLnNvcnRCeSB8fCB7XG4gICAgICAgIGZpZWxkOiBUQUJMRV9ERUZBVUxUUy5TT1JUX0ZJRUxELFxuICAgICAgICBvcmRlcjogVEFCTEVfREVGQVVMVFMuU09SVF9PUkRFUixcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLnNvcnRCeSA9IHRoaXMuZGF0YS5zb3J0QnkgfHwge1xuICAgICAgZmllbGQ6IFRBQkxFX0RFRkFVTFRTLlNPUlRfRklFTEQsXG4gICAgICBvcmRlcjogVEFCTEVfREVGQVVMVFMuU09SVF9PUkRFUixcbiAgICB9O1xuXG4gICAgLy8gQXBsaWNhciBmaWx0cm9zIGNsaWVudC1zaWRlIHNlIGV4aXN0aXJlbVxuICAgIGxldCBpdGVtc1RvRGlzcGxheSA9IFsuLi50aGlzLml0ZW1zXTtcbiAgICBpdGVtc1RvRGlzcGxheSA9IHRoaXMuYXBwbHlDbGllbnRTaWRlRmlsdGVycyhpdGVtc1RvRGlzcGxheSk7XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gaXRlbXNUb0Rpc3BsYXk7IC8vIEFybWF6ZW5hciBkYWRvcyBmaWx0cmFkb3NcblxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoaXRlbXNUb0Rpc3BsYXkpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICBpZiAodGhpcy5kYXRhLnNvcnRCeSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQuYWN0aXZlID0gdGhpcy5kYXRhLnNvcnRCeS5maWVsZDtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0LmRpcmVjdGlvbiA9IHRoaXMuZGF0YS5zb3J0Qnkub3JkZXI7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydC5zb3J0Q2hhbmdlLmVtaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKGRhdGEsIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMuc29tZSgoY29sKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChjb2wuZmlsdGVyUHJlZGljYXRlcykge1xuICAgICAgICAgIHJldHVybiBjb2wuZmlsdGVyUHJlZGljYXRlcy5zb21lKChwcmVkaWNhdGUpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBkYXRhW2NvbC5wcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsdWUgfHwgdHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJlZGljYXRlVmFsdWUgPSBwcm9wZXJ0eVZhbHVlW3ByZWRpY2F0ZV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlVmFsdWUgPT09IG51bGwgfHwgcHJlZGljYXRlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcocHJlZGljYXRlVmFsdWUpXG4gICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLnByb3BlcnR5ICYmIGNvbC5pc0ZpbHRlcmFibGUpIHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZGF0YVtjb2wucHJvcGVydHldO1xuICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlID09PSBudWxsIHx8IHByb3BlcnR5VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBTdHJpbmcocHJvcGVydHlWYWx1ZSlcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIEFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZSAoZmlsdHJvcyBwb3IgZGF0YSlcbiAgcHJpdmF0ZSBhcHBseUNsaWVudFNpZGVGaWx0ZXJzKGl0ZW1zOiBhbnlbXSk6IGFueVtdIHtcbiAgICBsZXQgZmlsdGVyZWRJdGVtcyA9IFsuLi5pdGVtc107XG5cbiAgICAvLyBBZ3J1cGFyIGZpbHRyb3MgZGUgZGF0YSBwb3IgcHJvcHJpZWRhZGVcbiAgICBjb25zdCBkYXRlRmlsdGVyc0J5UHJvcGVydHk6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIEFycmF5PHsgaW5pdGlhbDogRGF0ZTsgZmluYWw6IERhdGUgfT5cbiAgICA+ID0ge307XG4gICAgY29uc3Qgb3RoZXJGaWx0ZXJzOiBBcnJheTx7XG4gICAgICBncm91cDogRm9ybUdyb3VwO1xuICAgICAgc2VsZWN0ZWRGaWx0ZXI6IGFueTtcbiAgICAgIGFycmFuZ2U6IHN0cmluZztcbiAgICB9PiA9IFtdO1xuXG4gICAgdGhpcy5maWx0ZXJzRm9ybS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XG5cbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xuICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgZmluYWwgPSBncm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy52YWx1ZTtcblxuICAgICAgICAvLyBTw7MgYXBsaWNhciBmaWx0cm8gc2UgYW1iYXMgYXMgZGF0YXMgZXN0aXZlcmVtIHByZWVuY2hpZGFzXG4gICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsICYmIGluaXRpYWwudHJpbSgpICYmIGZpbmFsLnRyaW0oKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBWYWxpZGFyIGZvcm1hdG8gZGEgZGF0YSAoREQvTU0vQUFBQSlcbiAgICAgICAgICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gL14oXFxkezEsMn0pXFwvKFxcZHsxLDJ9KVxcLyhcXGR7NH0pJC87XG4gICAgICAgICAgICBpZiAoIWRhdGVQYXR0ZXJuLnRlc3QoaW5pdGlhbCkgfHwgIWRhdGVQYXR0ZXJuLnRlc3QoZmluYWwpKSB7XG4gICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JhciBzZSBmb3JtYXRvIGludsOhbGlkb1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xuICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xuICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xuXG4gICAgICAgICAgICAvLyBWYWxpZGFyIHNlIGFzIGRhdGFzIHPDo28gdsOhbGlkYXNcbiAgICAgICAgICAgIGlmIChpc05hTihpbml0aWFsRGF0ZS5nZXRUaW1lKCkpIHx8IGlzTmFOKGZpbmFsRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JhciBzZSBkYXRhcyBpbnbDoWxpZGFzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVzYXIgbyBjYW1wbyBkYSBjb2x1bmEgb3UgbyBzb3J0QnkuZmllbGQgY29tbyBwYWRyw6NvXG4gICAgICAgICAgICBjb25zdCBkYXRlRmllbGQgPSBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSB8fCB0aGlzLnNvcnRCeS5maWVsZDtcblxuICAgICAgICAgICAgaWYgKCFkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXSkge1xuICAgICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXS5wdXNoKHtcbiAgICAgICAgICAgICAgaW5pdGlhbDogaW5pdGlhbERhdGUsXG4gICAgICAgICAgICAgIGZpbmFsOiBmaW5hbERhdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvIGFvIHByb2Nlc3NhciBkYXRhcyBkbyBmaWx0cm86JywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3RoZXJGaWx0ZXJzLnB1c2goeyBncm91cCwgc2VsZWN0ZWRGaWx0ZXIsIGFycmFuZ2UgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3Qua2V5cyhkYXRlRmlsdGVyc0J5UHJvcGVydHkpLmZvckVhY2goKGRhdGVGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgaW50ZXJ2YWxzID0gZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF07XG5cbiAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IGl0ZW1bZGF0ZUZpZWxkXTtcblxuICAgICAgICAgIGlmICghZmllbGRWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBpdGVtRGF0ZTogRGF0ZTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUudG9EYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IGZpZWxkVmFsdWUudG9EYXRlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IG5ldyBEYXRlKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGl0ZW1EYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IG5ldyBEYXRlKGZpZWxkVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGludGVydmFscy5zb21lKFxuICAgICAgICAgICAgKGludGVydmFsKSA9PlxuICAgICAgICAgICAgICBpdGVtRGF0ZSA+PSBpbnRlcnZhbC5pbml0aWFsICYmIGl0ZW1EYXRlIDw9IGludGVydmFsLmZpbmFsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnRXJybyBhbyBwcm9jZXNzYXIgZmlsdHJvIGRlIGRhdGEgcGFyYSBvIGl0ZW06JyxcbiAgICAgICAgICAgIGl0ZW0uaWQsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIG90aGVyRmlsdGVycy5mb3JFYWNoKCh7IGdyb3VwLCBzZWxlY3RlZEZpbHRlciwgYXJyYW5nZSB9KSA9PiB7XG4gICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAmJiBmaWx0ZXJWYWx1ZS50cmltKCkpIHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5O1xuICAgICAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhpdGVtW3Byb3BlcnR5XSB8fCAnJylcbiAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyLmhhc093blByb3BlcnR5KCdpdGVtcycpICYmXG4gICAgICAgIGFycmFuZ2UgPT09ICdlcXVhbHMnXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJdGVtcykgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS52YWx1ZSk7XG4gICAgICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW1zLnNvbWUoKHNlbGVjdGVkSXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZSA9IGl0ZW1bc2VsZWN0ZWRJdGVtLnByb3BlcnR5XTtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZSA9PT0gc2VsZWN0ZWRJdGVtLnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZEl0ZW1zO1xuICB9XG5cbiAgLy8gSGFuZGxlciBwYXJhIG11ZGFuw6dhcyBkZSBkYXRhIG5vIGZpbHRyb1xuICBvbkRhdGVGaWx0ZXJDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gQXR1YWxpemFyIGFycmFuZ2UgY29tIG9zIGZpbHRyb3MgYXRpdm9zXG4gICAgICB0aGlzLmFycmFuZ2UgPSB0aGlzLmJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk7XG4gICAgICAvLyBBcGxpY2FyIGZpbHRyb3MgKG91IHJlbW92ZXIgc2UgY2FtcG9zIGVzdGl2ZXJlbSB2YXppb3MpXG4gICAgICB0aGlzLmFwcGx5RmlsdGVyc1RvRGF0YVNvdXJjZSgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBsaWNhciBtw6FzY2FyYSBkZSBkYXRhIChERC9NTS9BQUFBKSBtYW51YWxtZW50ZVxuICBvbkRhdGVJbnB1dChcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRyb2xOYW1lOiAnaW5pdGlhbERhdGUnIHwgJ2ZpbmFsRGF0ZScsXG4gICAgZmlsdGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICBsZXQgdmFsdWUgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpOyAvLyBSZW1vdmUgdHVkbyBxdWUgbsOjbyDDqSBkw61naXRvXG5cbiAgICAvLyBMaW1pdGFyIGEgOCBkw61naXRvcyAoRERNTUFBQUEpXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IDgpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgOCk7XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0YXI6IEREL01NL0FBQUFcbiAgICBpZiAodmFsdWUubGVuZ3RoIDw9IDIpIHtcbiAgICAgIHZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAyKSArICcvJyArIHZhbHVlLnNsaWNlKDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9XG4gICAgICAgIHZhbHVlLnNsaWNlKDAsIDIpICsgJy8nICsgdmFsdWUuc2xpY2UoMiwgNCkgKyAnLycgKyB2YWx1ZS5zbGljZSg0LCA4KTtcbiAgICB9XG5cbiAgICAvLyBBdHVhbGl6YXIgbyBGb3JtQ29udHJvbFxuICAgIGNvbnN0IGZpbHRlckdyb3VwID0gdGhpcy5maWx0ZXJzRm9ybS5hdChmaWx0ZXJJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIGZpbHRlckdyb3VwLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICAvLyBBcGxpY2FyIGZpbHRyb3MgYW8gZGF0YVNvdXJjZSBxdWFuZG8gbsOjbyBow6EgcGFnaW5hw6fDo29cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHJldHVybjtcblxuICAgIGxldCBmaWx0ZXJlZEl0ZW1zID0gdGhpcy5hcHBseUNsaWVudFNpZGVGaWx0ZXJzKFsuLi50aGlzLml0ZW1zXSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBmaWx0ZXJlZEl0ZW1zO1xuICAgIC8vIEF0dWFsaXphciBmaWx0ZXJlZEl0ZW1zIGNvbSBvcyBkYWRvcyBmaWx0cmFkb3MgKHNlcsOhIGF0dWFsaXphZG8gbm92YW1lbnRlIG5vIGhhbmRsZURvd25sb2FkIGNvbSBmaWx0ZXJlZERhdGEpXG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcztcbiAgICB0aGlzLnRvdGFsSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmxlbmd0aDtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgY29tIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXN5bmMgbG9hZEl0ZW1zUGFnaW5hdGVkKFxuICAgIG5hdmlnYXRpb246IHN0cmluZyA9ICdyZWxvYWQnLFxuICAgIHJlc2V0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5pbWFnZUxvYWRpbmdTdGF0ZS5jbGVhcigpOyAvLyBMaW1wYXIgZXN0YWRvIGRlIGxvYWRpbmcgZGUgaW1hZ2Vuc1xuICAgIGlmIChyZXNldCAmJiBbJ2ZvcndhcmQnLCAncmVsb2FkJ10uaW5jbHVkZXMobmF2aWdhdGlvbikpIHtcbiAgICAgIHRoaXMubGFzdERvYyA9IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSAwO1xuICAgIH1cbiAgICBpZiAocmVzZXQgJiYgWydiYWNrd2FyZCcsICdyZWxvYWQnXS5pbmNsdWRlcyhuYXZpZ2F0aW9uKSkge1xuICAgICAgdGhpcy5maXJzdERvYyA9IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUZpbHRlcnMgPSB0aGlzLmZpbHRlcnNGb3JtLmNvbnRyb2xzXG4gICAgICAuZmxhdE1hcCgoY29udHJvbCkgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZSkgcmV0dXJuIFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgZmlsdGVyaW5nOiBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IFtkYXlJLCBtb250aEksIHllYXJJXSA9IGluaXRpYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhJfS8ke2RheUl9LyR7eWVhckl9YCk7XG4gICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgZmluYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhGfS8ke2RheUZ9LyR7eWVhckZ9YCk7XG4gICAgICAgICAgICBmaW5hbERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICBmaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjoge1xuICAgICAgICAgICAgICAgIGluaXRpYWw6IGluaXRpYWxEYXRlLFxuICAgICAgICAgICAgICAgIGZpbmFsOiBmaW5hbERhdGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiYgYXJyYW5nZSA9PT0gJ2VxdWFscycpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAmJiAoZi5maWx0ZXI/LmZpbHRlcmluZyAhPT0gdW5kZWZpbmVkIHx8IGYuZGF0ZUZpbHRlcikpO1xuXG4gICAgdGhpcy5hcnJhbmdlID0ge1xuICAgICAgZmlsdGVyczogYWN0aXZlRmlsdGVycyxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgfTtcblxuICAgIGNvbnN0IHBhZ2luYXRlZDogYW55ID0ge1xuICAgICAgYmF0Y2hTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgY29sbGVjdGlvbjogdGhpcy5kYXRhLmNvbGxlY3Rpb24sXG4gICAgICBkb2M6IHsgbGFzdERvYzogdGhpcy5sYXN0RG9jLCBmaXJzdERvYzogdGhpcy5maXJzdERvYyB9LFxuICAgICAgbmF2aWdhdGlvbixcbiAgICAgIGFycmFuZ2U6IHRoaXMuYXJyYW5nZSxcbiAgICAgIGNvbmRpdGlvbnM6IHRoaXMuZGF0YS5jb25kaXRpb25zLFxuICAgICAgc2l6ZTogdGhpcy50b3RhbEl0ZW1zLFxuICAgICAgZmlsdGVyRm46IHRoaXMuZGF0YS5maWx0ZXJGbixcbiAgICAgIGNsaWVudFBhZ2VJbmRleDogdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRhYmxlU2VydmljZS5nZXRQYWdpbmF0ZWQocGFnaW5hdGVkKTtcbiAgICB0aGlzLml0ZW1zID0gcmVzdWx0Lml0ZW1zO1xuICAgIGF3YWl0IHRoaXMubG9hZFJlbGF0aW9ucygpO1xuICAgIGF3YWl0IHRoaXMubG9hZFF1ZXJ5TGVuZ3RocygpO1xuICAgIHRoaXMubGFzdERvYyA9IHJlc3VsdC5sYXN0RG9jIGFzIGFueTtcbiAgICB0aGlzLmZpcnN0RG9jID0gcmVzdWx0LmZpcnN0RG9jIGFzIGFueTtcblxuICAgIC8vIEF0dWFsaXphciBjdXJyZW50Q2xpZW50UGFnZUluZGV4IHNlIHJldG9ybmFkbyBwZWxvIGZhbGxiYWNrXG4gICAgaWYgKHJlc3VsdC5jdXJyZW50Q2xpZW50UGFnZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IHJlc3VsdC5jdXJyZW50Q2xpZW50UGFnZUluZGV4O1xuICAgIH1cblxuICAgIGxldCBzdW0gPSAwO1xuICAgIGlmICh0aGlzLmRhdGEudG90YWxSZWYpIHtcbiAgICAgIGZvciAoY29uc3QgdG90YWxSZWYgb2YgdGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsUmVmRG9jID0gYXdhaXQgdG90YWxSZWYucmVmLmdldCgpO1xuICAgICAgICBjb25zdCBkb2NEYXRhID0gdG90YWxSZWZEb2MuZGF0YSgpIGFzIGFueTtcbiAgICAgICAgaWYgKGRvY0RhdGEgfHwgcmVzdWx0LmZpbHRlckxlbmd0aCkge1xuICAgICAgICAgIHN1bSA9XG4gICAgICAgICAgICByZXN1bHQuZmlsdGVyTGVuZ3RoID8/XG4gICAgICAgICAgICAoKHN1bSArIChkb2NEYXRhID8gZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0gOiAwKSkgYXMgbnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gc3VtO1xuICAgIH1cblxuICAgIHRoaXMuaGFzTmV4dFBhZ2UgPSByZXN1bHQuaGFzTmV4dFBhZ2U7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLml0ZW1zKTtcbiAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBhc3luYyBvblBhZ2VDaGFuZ2UoZXZlbnQ/OiBQYWdlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiYgZXZlbnQpIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgICBjb25zdCBwcmV2aW91c1BhZ2VJbmRleCA9IGV2ZW50LnByZXZpb3VzUGFnZUluZGV4ID8/IDA7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgY29uc3QgZXZlbnRQYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcblxuICAgICAgbGV0IG5hdmlnYXRpb25EaXJlY3Rpb246IHN0cmluZztcbiAgICAgIGxldCByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIGxldCBvcmlnaW5hbFBhZ2VTaXplOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgICAgY29uc3QgbGFzdFBhZ2VJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGV2ZW50UGFnZVNpemUpIC0gMVxuICAgICAgKTtcblxuICAgICAgLy8gQXR1YWxpemFyIGN1cnJlbnRDbGllbnRQYWdlSW5kZXggc2VtcHJlIHBhcmEgbyBmYWxsYmFja1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gcGFnZUluZGV4O1xuXG4gICAgICBpZiAocHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyKys7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA8IHByZXZpb3VzUGFnZUluZGV4XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZU51bWJlciA9IE1hdGgubWF4KDEsIHRoaXMuY3VycmVudFBhZ2VOdW1iZXIgLSAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50UGFnZVNpemUgIT09IGN1cnJlbnRDb21wb25lbnRQYWdlU2l6ZSkge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnRQYWdlU2l6ZTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdmb3J3YXJkJztcbiAgICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHBhZ2VJbmRleCA9PT0gMCAmJlxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA8IHByZXZpb3VzUGFnZUluZGV4XG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1B1bG91IHBhcmEgYSBwcmltZWlyYSBww6FnaW5hJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2VOdW1iZXIgPSAxO1xuICAgICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSAwO1xuICAgICAgICByZXNldERvY3MgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcGFnZUluZGV4ID09PSBsYXN0UGFnZUluZGV4ICYmXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4ID4gcHJldmlvdXNQYWdlSW5kZXggJiZcbiAgICAgICAgcGFnZUluZGV4IC0gcHJldmlvdXNQYWdlSW5kZXggPiAxXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1B1bG91IHBhcmEgYSB1bHRpbWEgcMOhZ2luYScpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2JhY2t3YXJkJztcbiAgICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA9XG4gICAgICAgICAgdG90YWxJdGVtcyAtIGxhc3RQYWdlSW5kZXggKiBldmVudFBhZ2VTaXplO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA+IDAgJiZcbiAgICAgICAgICBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA8IGV2ZW50UGFnZVNpemVcbiAgICAgICAgKSB7XG4gICAgICAgICAgb3JpZ2luYWxQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4XG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1Byb2NlZGVuZG8nKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdmb3J3YXJkJztcbiAgICAgICAgcmVzZXREb2NzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA8IHByZXZpb3VzUGFnZUluZGV4XG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JldHJvY2VkZW5kby4nKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdiYWNrd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPT09IHByZXZpb3VzUGFnZUluZGV4XG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlY2FycmVnYW5kby4nKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdyZWxvYWQnO1xuICAgICAgICByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNQYWdlSW5kZXggPT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPT09IDApIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICBpZiAoZXZlbnQpIHRoaXMucGFnZUV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSU5FU1BFUkFETyEgQ29uZGnDp8OjbyBkZSBuYXZlZ2HDp8OjbyBuw6NvIHRyYXRhZGE6JywgZXZlbnQpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5wYWdlRXZlbnQgPSBldmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmF2aWdhdGlvbkRpcmVjdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKG5hdmlnYXRpb25EaXJlY3Rpb24sIHJlc2V0RG9jcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJybyBhbyBjYXJyZWdhciBpdGVucyBwYWdpbmFkb3M6JywgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChvcmlnaW5hbFBhZ2VTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gb3JpZ2luYWxQYWdlU2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB0aGlzLnBhZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gT3V0cm9zIG3DqXRvZG9zXG5cbiAgYXBwbHlGaWx0ZXIodmFsdWU6IHN0cmluZykge1xuICAgIC8vIFNlbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSBTdHJpbmcodmFsdWUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICAvLyBDb20gcGFnaW5hw6fDo29cbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuZmlsdGVyU3ViamVjdC5uZXh0KHRoaXMuZmlsdGVyVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9EZXRhaWxzKHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YS5pc05vdENsaWNrYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cmxQYXRoID0gdGhpcy5kYXRhLnVybCB8fCB0aGlzLmRhdGEubmFtZTtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwoXG4gICAgICB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtgLyR7dXJsUGF0aH1gLCByb3cuaWRdKVxuICAgICk7XG4gICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gIH1cblxuICBhc3luYyBnZXRSZWxhdGlvbihwYXJhbXM6IHtcbiAgICBpZDogYW55O1xuICAgIGNvbGxlY3Rpb246IHN0cmluZztcbiAgICBuZXdQcm9wZXJ0eTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHNuYXBzaG90OiBmaXJlc3RvcmUuRG9jdW1lbnRTbmFwc2hvdDx1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChcbiAgICAgICAgcGFyYW1zLmlkICE9PSAnJyAmJlxuICAgICAgICBwYXJhbXMuaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYXJhbXMuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhcmFtcy5jb2xsZWN0aW9uICE9PSAnJ1xuICAgICAgKSB7XG4gICAgICAgIHNuYXBzaG90ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5maXJlc3RvcmUuY29sbGVjdGlvbihwYXJhbXMuY29sbGVjdGlvbikuZG9jKHBhcmFtcy5pZCkuZ2V0KClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzbmFwc2hvdCAmJiBzbmFwc2hvdC5leGlzdHMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSBhcyBhbnk7XG4gICAgICAgIHJldHVybiBkYXRhPy5bcGFyYW1zLm5ld1Byb3BlcnR5XSA/PyAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRSZWxhdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25Qcm9taXNlcyA9IHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC5yZWxhdGlvbilcbiAgICAgIC5mbGF0TWFwKChjb2wpID0+XG4gICAgICAgIHRoaXMuaXRlbXMubWFwKGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbC5yZWxhdGlvbikge1xuICAgICAgICAgICAgaXRlbVtjb2wucHJvcGVydHldID0gYXdhaXQgdGhpcy5nZXRSZWxhdGlvbih7XG4gICAgICAgICAgICAgIGlkOiBpdGVtW2NvbC5yZWxhdGlvbi5zb3VyY2VQcm9wZXJ0eV0sXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbC5yZWxhdGlvbi50YXJnZXRlZENvbGxlY3Rpb24sXG4gICAgICAgICAgICAgIG5ld1Byb3BlcnR5OiBjb2wucmVsYXRpb24udGFyZ2V0ZWRQcm9wZXJ0eSB8fCBjb2wucHJvcGVydHksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocmVsYXRpb25Qcm9taXNlcyk7XG4gIH1cblxuICBhc3luYyBnZXRRdWVyeUxlbmd0aChwYXJhbXM6IHtcbiAgICBpdGVtOiBhbnk7XG4gICAgcmVsYXRpb246IHtcbiAgICAgIGNvbGxlY3Rpb246IHN0cmluZztcbiAgICAgIHByb3BlcnR5OiBzdHJpbmc7XG4gICAgICBvcGVyYXRvcjogV2hlcmVGaWx0ZXJPcDtcbiAgICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgfTtcbiAgfSkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5maXJlc3RvcmVcbiAgICAgIC5jb2xsZWN0aW9uKHBhcmFtcy5yZWxhdGlvbi5jb2xsZWN0aW9uKVxuICAgICAgLnJlZi53aGVyZShcbiAgICAgICAgcGFyYW1zLnJlbGF0aW9uLnByb3BlcnR5LFxuICAgICAgICBwYXJhbXMucmVsYXRpb24ub3BlcmF0b3IsXG4gICAgICAgIHBhcmFtcy5pdGVtW3BhcmFtcy5yZWxhdGlvbi52YWx1ZV1cbiAgICAgIClcbiAgICAgIC5nZXQoKTtcbiAgICByZXR1cm4gc25hcHNob3Quc2l6ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFF1ZXJ5TGVuZ3RocygpIHtcbiAgICBjb25zdCBsZW5ndGhQcm9taXNlcyA9IHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC5xdWVyeUxlbmd0aClcbiAgICAgIC5mbGF0TWFwKChjb2wpID0+XG4gICAgICAgIHRoaXMuaXRlbXMubWFwKGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbC5xdWVyeUxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbVtjb2wucHJvcGVydHldID0gYXdhaXQgdGhpcy5nZXRRdWVyeUxlbmd0aCh7XG4gICAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICAgIHJlbGF0aW9uOiBjb2wucXVlcnlMZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxlbmd0aFByb21pc2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXMoKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5jb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmRhdGEuY29uZGl0aW9ucy5mb3JFYWNoKChjb25kKSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wZXJhdG9yRnVuY3Rpb24gPSAodGhpcy50YWJsZVNlcnZpY2Uub3BlcmF0b3JzIGFzIGFueSlbXG4gICAgICAgICAgICBjb25kLm9wZXJhdG9yXG4gICAgICAgICAgXTtcbiAgICAgICAgICBpZiAob3BlcmF0b3JGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGl0ZW1bY29uZC5maXJlc3RvcmVQcm9wZXJ0eV0sXG4gICAgICAgICAgICAgIGNvbmQuZGFzaFByb3BlcnR5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEFycmFuZ2VGcm9tRmlsdGVycygpOiBBcnJhbmdlIHtcbiAgICBjb25zdCBhY3RpdmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzRm9ybS5jb250cm9sc1xuICAgICAgLmZsYXRNYXAoKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgaWYgKCFzZWxlY3RlZEZpbHRlcikgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IGFycmFuZ2UgPSBzZWxlY3RlZEZpbHRlci5hcnJhbmdlO1xuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUpIHJldHVybiBbXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICBwcm9wZXJ0eTogc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHksXG4gICAgICAgICAgICAgIGZpbHRlcmluZzogZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScpIHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgICBjb25zdCBmaW5hbCA9IGdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhJfS8ke2RheUl9LyR7eWVhckl9YCk7XG4gICAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xuICAgICAgICAgICAgICBmaW5hbERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcbiAgICAgICAgICAgICAgICAgIGZpbmFsOiBmaW5hbERhdGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRmlsdGVyLmhhc093blByb3BlcnR5KCdpdGVtcycpICYmIGFycmFuZ2UgPT09ICdlcXVhbHMnKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEl0ZW1zKSAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0ucHJvcGVydHksXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJzOiBhY3RpdmVGaWx0ZXJzLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRmlsdHJvIGRlIGRhdGFcbiAgYXN5bmMgc2VhcmNoKGV2ZW50PzogRXZlbnQpIHtcbiAgICAvLyBQcmV2ZW5pciBjb21wb3J0YW1lbnRvIHBhZHLDo28gZG8gZm9ybXVsw6FyaW8gYW8gcHJlc3Npb25hciBFbnRlclxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdFNvcnQudmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdFNvcnQudmFsdWUuYXJyYW5nZSA9PT0gJ2FzY2VuZGluZycpIHtcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB7XG4gICAgICAgICAgZmllbGQ6IHRoaXMuc2VsZWN0U29ydC52YWx1ZS5wcm9wZXJ0eSxcbiAgICAgICAgICBvcmRlcjogJ2FzYycsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWxlY3RTb3J0LnZhbHVlLmFycmFuZ2UgPT09ICdkZXNjZW5kaW5nJykge1xuICAgICAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgICAgICBmaWVsZDogdGhpcy5zZWxlY3RTb3J0LnZhbHVlLnByb3BlcnR5LFxuICAgICAgICAgIG9yZGVyOiAnZGVzYycsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VtIHBhZ2luYcOnw6NvOiBhcGxpY2FyIGZpbHRyb3MgY2xpZW50LXNpZGVcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICAvLyBBdHVhbGl6YXIgYXJyYW5nZSBjb20gb3MgZmlsdHJvcyBhdGl2b3NcbiAgICAgIHRoaXMuYXJyYW5nZSA9IHRoaXMuYnVpbGRBcnJhbmdlRnJvbUZpbHRlcnMoKTtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzVG9EYXRhU291cmNlKCk7XG4gICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlID1cbiAgICAgICAgdGhpcy5maWx0ZXJzRm9ybS5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0aGlzLmZpbHRlcnNGb3JtLmF0KDApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID8/ICcnXG4gICAgICAgICAgOiAnJztcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb20gcGFnaW5hw6fDo286IGNvbXBvcnRhbWVudG8gb3JpZ2luYWxcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPVxuICAgICAgICB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuZmlsdGVyc0Zvcm0uYXQoMCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPz8gJydcbiAgICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXNldEZpbHRlcigpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gJyc7XG4gICAgaWYgKHRoaXMuZmlsdGVyUHJlZGljYXRlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5maWx0ZXJQcmVkaWNhdGU7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzRm9ybS5jbGVhcigpO1xuICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgdGhpcy5zZWxlY3RTb3J0LnBhdGNoVmFsdWUoJycpO1xuICAgIHRoaXMuc29ydEJ5ID0ge1xuICAgICAgb3JkZXI6IHRoaXMuZGF0YS5zb3J0QnkgPyB0aGlzLmRhdGEuc29ydEJ5Lm9yZGVyIDogJ2Rlc2MnLFxuICAgICAgZmllbGQ6IHRoaXMuZGF0YS5zb3J0QnkgPyB0aGlzLmRhdGEuc29ydEJ5LmZpZWxkIDogJ2NyZWF0ZWRBdCcsXG4gICAgfTtcblxuICAgIC8vIFNlbSBwYWdpbmHDp8OjbzogcmVjYXJyZWdhciBpdGVucyBvcmlnaW5haXNcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICAvLyBSZXNldGFyIGFycmFuZ2UgcGFyYSB2YWxvcmVzIHBhZHLDo29cbiAgICAgIHRoaXMuYXJyYW5nZSA9IHtcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICB9O1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy5pdGVtc107XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPSAnJztcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb20gcGFnaW5hw6fDo286IGNvbXBvcnRhbWVudG8gb3JpZ2luYWxcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPSAnJztcbiAgICAgIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTcOpdG9kbyBww7pibGljbyBwYXJhIHJlY2FycmVnYXIgYSB0YWJlbGFcbiAgYXN5bmMgcmVsb2FkVGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG4gICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtcygpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZURpc3BsYXllZENvbHVtbnMoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtblByb3BlcnRpZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eTtcbiAgICB9KTtcblxuICAgIHRoaXMuZHJvcGRvd25JdGVtcyA9IFtdO1xuICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zID0gW107XG5cbiAgICB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzU29ydGFibGUpIHtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdhc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdkZXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZGVjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlQnlEYXRlKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlckJ5RGF0ZScsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGZpbHRybyBwb3IgZGF0YScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zICYmXG4gICAgICBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucylcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+XG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHsgLi4ub3B0aW9uLCBhcnJhbmdlOiAnZXF1YWxzJyB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpc1N0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICAvLyBNw6l0b2RvIHBhcmEgY29tYmluYXIgZXN0aWxvcyBkbyB0b29sdGlwXG4gIGdldFRvb2x0aXBTdHlsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3Qgc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgaWYgKHRoaXMudG9vbHRpcEJnU3R5bGUpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGVzLCB0aGlzLnRvb2x0aXBCZ1N0eWxlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9vbHRpcFRleHRTdHlsZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZXMsIHRoaXMudG9vbHRpcFRleHRTdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiBzdHlsZXM7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBwYXJhIGNvbnRyb2xlIGRvIHRvb2x0aXBcbiAgb25DZWxsTW91c2VFbnRlcihldmVudDogTW91c2VFdmVudCwgcm93OiBhbnksIGNvbDogYW55KTogdm9pZCB7XG4gICAgLy8gU8OzIG1vc3RyYXIgdG9vbHRpcCBzZSBhIGNvbHVuYSB0aXZlciBjaGFyTGltaXQgZGVmaW5pZG9cbiAgICBpZiAoIWNvbC5jaGFyTGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsVmFsdWUgPSB0aGlzLmdldERpc3BsYXlWYWx1ZShjb2wsIHJvdywgdHJ1ZSk7XG5cbiAgICAvLyBTw7MgbW9zdHJhciB0b29sdGlwIHNlIG8gdmFsb3IgY29tcGxldG8gZm9yIG1haW9yIHF1ZSBvIGxpbWl0ZVxuICAgIGlmIChmdWxsVmFsdWUubGVuZ3RoIDw9IGNvbC5jaGFyTGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhvdmVyZWRDZWxsID0geyByb3csIGNvbCB9O1xuICAgIHRoaXMudG9vbHRpcENvbnRlbnQgPSBmdWxsVmFsdWU7XG5cbiAgICAvLyBDb3IgZGUgZnVuZG8gZG8gdG9vbHRpcFxuICAgIGNvbnN0IHRvb2x0aXBCZ0NvbG9yID0gY29sLnRvb2x0aXA/LmNvbG9yIHx8ICdiZy1ncmF5LTgwMCc7XG4gICAgaWYgKHRvb2x0aXBCZ0NvbG9yLnN0YXJ0c1dpdGgoJyMnKSB8fCB0b29sdGlwQmdDb2xvci5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgdGhpcy50b29sdGlwQmdDb2xvciA9ICcnO1xuICAgICAgdGhpcy50b29sdGlwQmdTdHlsZSA9IHsgJ2JhY2tncm91bmQtY29sb3InOiB0b29sdGlwQmdDb2xvciB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvb2x0aXBCZ0NvbG9yID0gdG9vbHRpcEJnQ29sb3I7XG4gICAgICB0aGlzLnRvb2x0aXBCZ1N0eWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb3IgZG8gdGV4dG8gZG8gdG9vbHRpcFxuICAgIGNvbnN0IHRvb2x0aXBUZXh0Q29sb3IgPSBjb2wudG9vbHRpcD8udGV4dCB8fCAndGV4dC13aGl0ZSc7XG4gICAgaWYgKFxuICAgICAgdG9vbHRpcFRleHRDb2xvci5zdGFydHNXaXRoKCcjJykgfHxcbiAgICAgIHRvb2x0aXBUZXh0Q29sb3Iuc3RhcnRzV2l0aCgncmdiJylcbiAgICApIHtcbiAgICAgIHRoaXMudG9vbHRpcFRleHRDb2xvciA9ICcnO1xuICAgICAgdGhpcy50b29sdGlwVGV4dFN0eWxlID0geyBjb2xvcjogdG9vbHRpcFRleHRDb2xvciB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvb2x0aXBUZXh0Q29sb3IgPSB0b29sdGlwVGV4dENvbG9yO1xuICAgICAgdGhpcy50b29sdGlwVGV4dFN0eWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmlyIHBvc2nDp8OjbyBkbyB0b29sdGlwXG4gICAgdGhpcy50b29sdGlwUG9zaXRpb24gPSB7XG4gICAgICB4OiBldmVudC5jbGllbnRYICsgMTAsXG4gICAgICB5OiBldmVudC5jbGllbnRZIC0gMTAsXG4gICAgfTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gVGltZW91dCBwYXJhIG1vc3RyYXIgbyB0b29sdGlwXG4gICAgdGhpcy50b29sdGlwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhvdmVyZWRDZWxsICYmXG4gICAgICAgIHRoaXMuaG92ZXJlZENlbGwucm93ID09PSByb3cgJiZcbiAgICAgICAgdGhpcy5ob3ZlcmVkQ2VsbC5jb2wgPT09IGNvbFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2hvd1Rvb2x0aXAgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIDUwMCk7XG4gIH1cblxuICBvbkNlbGxNb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvb2x0aXBUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCk7XG4gICAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dUb29sdGlwID0gZmFsc2U7XG4gICAgdGhpcy5ob3ZlcmVkQ2VsbCA9IG51bGw7XG4gICAgdGhpcy50b29sdGlwQ29udGVudCA9ICcnO1xuICAgIHRoaXMudG9vbHRpcEJnQ29sb3IgPSAnYmctZ3JheS04MDAnOyAvLyBSZXNldGFyIHBhcmEgcGFkcsOjb1xuICAgIHRoaXMudG9vbHRpcEJnU3R5bGUgPSBudWxsOyAvLyBMaW1wYXIgZXN0aWxvIGN1c3RvbWl6YWRvXG4gICAgdGhpcy50b29sdGlwVGV4dENvbG9yID0gJ3RleHQtd2hpdGUnOyAvLyBSZXNldGFyIHBhcmEgcGFkcsOjb1xuICAgIHRoaXMudG9vbHRpcFRleHRTdHlsZSA9IG51bGw7IC8vIExpbXBhciBlc3RpbG8gY3VzdG9taXphZG8gZG8gdGV4dG9cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW1hZ2VLZXkocm93OiBhbnksIGNvbDogQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCByb3dJZCA9IHJvdy5pZCB8fCByb3cuX2lkIHx8IEpTT04uc3RyaW5naWZ5KHJvdyk7XG4gICAgcmV0dXJuIGAke3Jvd0lkfS0ke2NvbC5wcm9wZXJ0eX1gO1xuICB9XG5cbiAgaXNJbWFnZUxvYWRpbmcocm93OiBhbnksIGNvbDogQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRJbWFnZUtleShyb3csIGNvbCk7XG4gICAgcmV0dXJuICF0aGlzLmltYWdlTG9hZGluZ1N0YXRlLmhhcyhrZXkpO1xuICB9XG5cbiAgb25JbWFnZUxvYWQocm93OiBhbnksIGNvbDogQ29sdW1uKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRJbWFnZUtleShyb3csIGNvbCk7XG4gICAgdGhpcy5pbWFnZUxvYWRpbmdTdGF0ZS5zZXQoa2V5LCB0cnVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uSW1hZ2VFcnJvcihldmVudDogYW55LCByb3c6IGFueSwgY29sOiBDb2x1bW4sIGRlZmF1bHRJbWFnZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0SW1hZ2VLZXkocm93LCBjb2wpO1xuICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3RhdGUuc2V0KGtleSwgdHJ1ZSk7XG5cbiAgICBpZiAoZGVmYXVsdEltYWdlKSB7XG4gICAgICBldmVudC50YXJnZXQuc3JjID0gZGVmYXVsdEltYWdlO1xuICAgICAgZXZlbnQudGFyZ2V0Lm9uZXJyb3IgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC50YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2VsbE1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dUb29sdGlwKSB7XG4gICAgICB0aGlzLnRvb2x0aXBQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDEwLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gMTAsXG4gICAgICB9O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTcOpdG9kb3MgcGFyYSBpbnZlcnPDo28gdmVydGljYWwgZG9zIHRhYnNcbiAgZ2V0VGFiR3JvdXBzKHRhYnM6IGFueVtdKTogbnVtYmVyW10ge1xuICAgIGlmICghdGFicyB8fCB0YWJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgdG90YWxHcm91cHMgPSBNYXRoLmNlaWwodGFicy5sZW5ndGggLyA2KTtcbiAgICBjb25zdCBncm91cHM6IG51bWJlcltdID0gW107XG5cbiAgICAvLyBDcmlhciBhcnJheSBkZSDDrW5kaWNlcyBpbnZlcnRpZG9zICjDumx0aW1vIGdydXBvIHByaW1laXJvKVxuICAgIGZvciAobGV0IGkgPSB0b3RhbEdyb3VwcyAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBncm91cHMucHVzaChpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG5cbiAgZ2V0VGFiR3JvdXAodGFiczogYW55W10sIGdyb3VwSW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICBpZiAoIXRhYnMgfHwgdGFicy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBncm91cEluZGV4ICogNjtcbiAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXggKyA2LCB0YWJzLmxlbmd0aCk7XG5cbiAgICByZXR1cm4gdGFicy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gIH1cblxuICBnZXRSZWFsVGFiSW5kZXgoZ3JvdXBJbmRleDogbnVtYmVyLCB0YWJJbmRleEluR3JvdXA6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmRhdGEudGFicz8udGFic0RhdGEpIHJldHVybiAwO1xuICAgIGNvbnN0IHRvdGFsR3JvdXBzID0gTWF0aC5jZWlsKHRoaXMuZGF0YS50YWJzLnRhYnNEYXRhLmxlbmd0aCAvIDYpO1xuICAgIGNvbnN0IHJlYWxHcm91cEluZGV4ID0gdG90YWxHcm91cHMgLSAxIC0gZ3JvdXBJbmRleDtcbiAgICByZXR1cm4gcmVhbEdyb3VwSW5kZXggKiA2ICsgdGFiSW5kZXhJbkdyb3VwO1xuICB9XG5cbiAgb25UYWJsZVNlbGVjdGVkKGk6IG51bWJlciwgajogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEudGFicz8udGFic0RhdGEgfHwgIXRoaXMuZGF0YS50YWJzLm1ldGhvZCkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSB0aGlzLmdldFJlYWxUYWJJbmRleChpLCBqKTtcbiAgICBjb25zdCB0YWIgPSB0aGlzLmRhdGEudGFicy50YWJzRGF0YVt0aGlzLnNlbGVjdGVkVGFiXTtcbiAgICBpZiAodGFiKSB7XG4gICAgICB0aGlzLmRhdGEudGFicy5tZXRob2QodGFiLCB0aGlzLnNlbGVjdGVkVGFiKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpc1RhYlNlbGVjdGVkKG9yaWdpbmFsSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGFiID09PSBvcmlnaW5hbEluZGV4O1xuICB9XG5cbiAgc2hvdWxkU2hvd0FjdGlvbkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGF0YT8uYWN0aW9uQnV0dG9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbihudWxsKSA/PyB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gTcOpdG9kbyBwYXJhIGxpZGFyIGNvbSBkb3dubG9hZCAoZGlmZXJlbnRlIHBhcmEgcGFnaW5hZG8gZSBuw6NvIHBhZ2luYWRvKVxuICBoYW5kbGVEb3dubG9hZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZG93bmxvYWRUYWJsZSkgcmV0dXJuO1xuXG4gICAgLy8gU2UgbsOjbyBow6EgcGFnaW5hw6fDo28sIHVzYXIgZGFkb3MgZmlsdHJhZG9zIGRvIGRhdGFTb3VyY2VcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICAvLyBBdHVhbGl6YXIgZmlsdGVyZWRJdGVtcyBjb20gb3MgZGFkb3MgZmlsdHJhZG9zIGRvIGRhdGFTb3VyY2VcbiAgICAgIC8vIChxdWUgasOhIGluY2x1aSBmaWx0cm8gZGUgdGV4dG8gYXBsaWNhZG8gdmlhIGZpbHRlclByZWRpY2F0ZSlcbiAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgJiYgdGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YSkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBbLi4udGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YV07XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnN0cnVpciBhcnJhbmdlIGNvbSBvcyBmaWx0cm9zIGF0aXZvcyAoc2UgaG91dmVyKVxuICAgICAgY29uc3QgYXJyYW5nZSA9IHRoaXMuYnVpbGRBcnJhbmdlRnJvbUZpbHRlcnMoKTtcbiAgICAgIHRoaXMuZG93bmxvYWRUYWJsZShhcnJhbmdlLCB0aGlzLmRhdGEuY29uZGl0aW9ucyB8fCBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1vZG8gcGFnaW5hZG86IHVzYXIgYXJyYW5nZSBleGlzdGVudGUgKGNvbXBvcnRhbWVudG8gb3JpZ2luYWwpXG4gICAgICBpZiAodGhpcy5hcnJhbmdlKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRUYWJsZSh0aGlzLmFycmFuZ2UsIHRoaXMuZGF0YS5jb25kaXRpb25zIHx8IFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0J5UHJvcGVydHkoX2luZGV4OiBudW1iZXIsIGNvbDogQ29sdW1uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29sLnByb3BlcnR5O1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiZGF0YVwiIGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBnYXAtNlwiPlxuICAgIDwhLS0gVU5JRklFRCBDT05UUk9MIFBBTkVMOiBGSUxURVJTLCBTT1JUICYgQUNUSU9OUyAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZSBwLTQgc2hhZG93LWxnXCJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSAmJlxuICAgICAgICAoZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgc29ydGFibGVEcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbilcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPCEtLSBQQU5FTCBIRUFERVI6IFRpdGxlIGFuZCBDdXN0b20gQWN0aW9uIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1iLTQgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLWItMiBib3JkZXItZ3JheS0yMDAgcGItNCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8IS0tIExlZnQgU2lkZTogVGl0bGUgJiBNYWluIEFjdGlvbiBCdXR0b24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyIHRleHQteGwgdGV4dC1ibHVlLTUwMFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZ3JheS03MDBcIlxuICAgICAgICAgICAgICA+RmlsdHJvcyBlIEHDp8O1ZXM8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImRhdGEuYWN0aW9uQnV0dG9uICYmIGRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvblwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgKGRhdGEuYWN0aW9uQnV0dG9uLmNvbG9yQ2xhc3MgfHwgJ2JnLWJsdWUtNTAwJykgK1xuICAgICAgICAgICAgICAnIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBob3ZlcjpvcGFjaXR5LTcwJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImRhdGEuYWN0aW9uQnV0dG9uLnJvdXRlckxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIHt7IGRhdGEuYWN0aW9uQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU09SVCBGSUVMRCAoSW50ZWdyYXRlZCB3aXRoIGZpbHRlcnMpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cInNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTMgcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNvcnQtYWxwaGEtZG93biB0ZXh0LWN5YW4tNjAwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPk9yZGVuYXIgcG9yPC9zcGFuPlxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUuLi5cIiBbZm9ybUNvbnRyb2xdPVwic2VsZWN0U29ydFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzb3J0YWJsZURyb3Bkb3duSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNvcnQtYWxwaGEtZG93biB0ZXh0LWN5YW4tNjAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZJTFRFUlMgQ09OVEVOVCAoV0lUSCBSRUZJTkVNRU5UUykgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItNCBzcGFjZS15LTNcIiAqbmdJZj1cImZpbHRlcnNGb3JtLmNvbnRyb2xzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtmb3JtR3JvdXBdPVwiJGFueShmaWx0ZXJHcm91cClcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWx0ZXJHcm91cCBvZiBmaWx0ZXJzRm9ybS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTMgcC0yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gRklMVEVSIFRZUEUgU0VMRUNUT1IgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCIgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGlwbyBkZSBmaWx0cm88L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSBvIHRpcG8uLi5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEZpbHRlclwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdEZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRBdmFpbGFibGVGaWx0ZXJPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmljb24gfHwgJ2ZhIGZhLWZpbHRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWJsdWUtNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVEVYVCBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT0gJ2ZpbHRlcidcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgXCJGaWx0cmFyXCJcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRpZ2l0ZSBwYXJhIGZpbHRyYXIuLi5cIlxuICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRFJPUERPV04gRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWUgJiZcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cClcbiAgICAgICAgICAgICAgICAuZ2V0KCdzZWxlY3RGaWx0ZXInKVxuICAgICAgICAgICAgICAgID8udmFsdWUuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJylcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICBcIlNlbGVjaW9uZVwiXG4gICAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUuLi5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtIG9mICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgLml0ZW1zXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIERBVEUgRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzM0MHB4XSBmbGV4LWF1dG9cIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPT09XG4gICAgICAgICAgICAgICdmaWx0ZXJCeURhdGUnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLXN0cmV0Y2ggZ2FwLTMgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRhdGEgSW5pY2lhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25EYXRlSW5wdXQoJGV2ZW50LCAnaW5pdGlhbERhdGUnLCBpKVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkREL01NL0FBQUFcIlxuICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRhdGEgRmluYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25EYXRlSW5wdXQoJGV2ZW50LCAnZmluYWxEYXRlJywgaSlcIlxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbmFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkREL01NL0FBQUFcIlxuICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUkVNT1ZFIEZJTFRFUiBCVVRUT04gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcnNGb3JtLmxlbmd0aCA+IDFcIiBjbGFzcz1cIm1sLWF1dG8gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtMTAgdy0xMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTMwMCBob3ZlcjpiZy1yZWQtMTAwXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJlbW92ZXIgZmlsdHJvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCB0ZXh0LXJlZC01MDAgaG92ZXI6dGV4dC1yZWQtNjAwXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUEFORUwgRk9PVEVSOiBBZGQgRmlsdGVyICYgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiLW1iLTIgZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIHB0LTRcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEFkZCBGaWx0ZXIgQnV0dG9uIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJhbnNmb3JtIHJvdW5kZWQtZnVsbCBib3JkZXItMiBib3JkZXItYmx1ZS0zMDAgYmctYmx1ZS01MCBweC02IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWJsdWUtNjAwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCBob3ZlcjotdHJhbnNsYXRlLXktMC41IGhvdmVyOmJvcmRlci1ibHVlLTQwMCBob3ZlcjpiZy1ibHVlLTEwMCBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkaWNpb25hciBub3ZvIGZpbHRyb1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzIG1yLTJcIj48L2k+XG4gICAgICAgICAgICBBZGljaW9uYXIgRmlsdHJvXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmlnaHQgU2lkZTogU2VhcmNoLCBSZXNldCwgRXhwb3J0IC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMyBzZWxmLXN0YXJ0IHNtOnNlbGYtYXV0b1wiXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9PT0gdHJ1ZSB8fCB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID09PSB0cnVlXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1ncmVlbi02MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmVlbi03MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFwbGljYXIgZmlsdHJvc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+XG4gICAgICAgICAgICBQZXNxdWlzYXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1yZWQtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctcmVkLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTGltcGFyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPlxuICAgICAgICAgICAgUmVzZXRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmRvd25sb2FkICE9PSBmYWxzZSAmJiBkb3dubG9hZFRhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1vcmFuZ2UtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Ymctb3JhbmdlLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0YXIgVGFiZWxhXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICRhbnkoYXJyYW5nZSkgJiYgZG93bmxvYWRUYWJsZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBkb3dubG9hZFRhYmxlKCRhbnkoYXJyYW5nZSksIGRhdGEuY29uZGl0aW9ucyB8fCBbXSlcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIEV4cG9ydGFyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFVOSUZJRUQgQ09OVFJPTCBQQU5FTCAoZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVzKTogU0VBUkNILCBTT1JUICYgRklMVEVSUyAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZSBwLTQgc2hhZG93LWxnXCJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UgJiZcbiAgICAgICAgKGhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IHRydWUgfHxcbiAgICAgICAgICBzb3J0YWJsZURyb3Bkb3duSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIGRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIGRhdGEuYWN0aW9uQnV0dG9uKVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8IS0tIFBBTkVMIEhFQURFUjogVGl0bGUgYW5kIEN1c3RvbSBBY3Rpb24gLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibWItNCBmbGV4IGZsZXgtY29sIGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNCBib3JkZXItYi0yIGJvcmRlci1ncmF5LTIwMCBwYi00IG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlclwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gTGVmdCBTaWRlOiBUaXRsZSAmIE1haW4gQWN0aW9uIEJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWx0ZXIgdGV4dC14bCB0ZXh0LWJsdWUtNTAwXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTcwMFwiXG4gICAgICAgICAgICAgID5GaWx0cm9zIGUgQcOnw7Vlczwvc3BhblxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25CdXR0b24gJiYgZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAoZGF0YS5hY3Rpb25CdXR0b24uY29sb3JDbGFzcyB8fCAnYmctYmx1ZS01MDAnKSArXG4gICAgICAgICAgICAgICcgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIGhvdmVyOm9wYWNpdHktNzAnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiZGF0YS5hY3Rpb25CdXR0b24ucm91dGVyTGlua1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgIGRhdGEuYWN0aW9uQnV0dG9uLm1ldGhvZCA/IGRhdGEuYWN0aW9uQnV0dG9uLm1ldGhvZCgkZXZlbnQpIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAqbmdJZj1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZGF0YS5hY3Rpb25CdXR0b24uaWNvblwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAge3sgZGF0YS5hY3Rpb25CdXR0b24ubGFiZWwgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTSU1QTEUgU0VBUkNIIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cImhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IHRydWVcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIHRleHQtYmx1ZS01MDBcIj48L2k+XG4gICAgICAgICAgICBCdXNjYXJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cImFwcGx5RmlsdGVyKGZpbHRlcklucHV0LnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRpZ2l0ZSBwYXJhIGZpbHRyYXIuLi5cIlxuICAgICAgICAgICAgI2ZpbHRlcklucHV0XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IGNsYXNzPVwidGV4dC1ncmF5LTUwMFwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTT1JUIEZJRUxEIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cInNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc29ydC1hbHBoYS1kb3duIHRleHQtY3lhbi02MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+T3JkZW5hciBwb3I8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RTb3J0XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNvcnRhYmxlRHJvcGRvd25JdGVtc1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc29ydC1hbHBoYS1kb3duIHRleHQtY3lhbi02MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRklMVEVSUyBQQU5FTCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPCEtLSBGSUxURVJTIENPTlRFTlQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi00IHNwYWNlLXktM1wiICpuZ0lmPVwiZmlsdGVyc0Zvcm0uY29udHJvbHMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiJGFueShmaWx0ZXJHcm91cClcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpbHRlckdyb3VwIG9mIGZpbHRlcnNGb3JtLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8IS0tIEZJTFRFUiBUWVBFIFNFTEVDVE9SIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCIgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlRpcG8gZGUgZmlsdHJvPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIG8gdGlwby4uLlwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdEZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRBdmFpbGFibGVGaWx0ZXJPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaXRlbS5pY29uIHx8ICdmYSBmYS1maWx0ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWJsdWUtNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFRFWFQgRklMVEVSIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT1cbiAgICAgICAgICAgICAgICAnZmlsdGVyJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgXCJGaWx0cmFyXCJcbiAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGlnaXRlIHBhcmEgZmlsdHJhci4uLlwiXG4gICAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRFJPUERPV04gRklMVEVSIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApXG4gICAgICAgICAgICAgICAgICAuZ2V0KCdzZWxlY3RGaWx0ZXInKVxuICAgICAgICAgICAgICAgICAgPy52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tcbiAgICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICAgIFwiU2VsZWNpb25lXCJcbiAgICAgICAgICAgICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gb2YgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtc1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBEQVRFIEZJTFRFUiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMzQwcHhdIGZsZXgtYXV0b1wiXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPT09XG4gICAgICAgICAgICAgICAgJ2ZpbHRlckJ5RGF0ZSdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1zdHJldGNoIGdhcC0zIHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0YSBJbmljaWFsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkRhdGVJbnB1dCgkZXZlbnQsICdpbml0aWFsRGF0ZScsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25EYXRlRmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiREQvTU0vQUFBQVwiXG4gICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEZpbmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkRhdGVJbnB1dCgkZXZlbnQsICdmaW5hbERhdGUnLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZUZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmluYWxEYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFJFTU9WRSBGSUxURVIgQlVUVE9OIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcnNGb3JtLmxlbmd0aCA+IDFcIiBjbGFzcz1cIm1sLWF1dG8gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihpKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtMTAgdy0xMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTMwMCBob3ZlcjpiZy1yZWQtMTAwXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiUmVtb3ZlciBmaWx0cm9cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCB0ZXh0LXJlZC01MDAgaG92ZXI6dGV4dC1yZWQtNjAwXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBBTkVMIEZPT1RFUjogQWRkIEZpbHRlciAmIEFjdGlvbnMgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIi1tYi0yIGZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCBwdC00XCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gQWRkIEZpbHRlciBCdXR0b24gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRmlsdGVyKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInRyYW5zZm9ybSByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWJsdWUtMzAwIGJnLWJsdWUtNTAgcHgtNiBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ibHVlLTYwMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgaG92ZXI6LXRyYW5zbGF0ZS15LTAuNSBob3Zlcjpib3JkZXItYmx1ZS00MDAgaG92ZXI6YmctYmx1ZS0xMDAgaG92ZXI6c2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkaWNpb25hciBub3ZvIGZpbHRyb1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cyBtci0yXCI+PC9pPlxuICAgICAgICAgICAgICBBZGljaW9uYXIgRmlsdHJvXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMyBzZWxmLXN0YXJ0IHNtOnNlbGYtYXV0b1wiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICB0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgdGhpcy5oYXNTb3J0YWJsZUNvbHVtbiA9PT0gdHJ1ZVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNjAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JlZW4tNzAwXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFwbGljYXIgZmlsdHJvc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgICBQZXNxdWlzYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJnLXJlZC01MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1yZWQtNjAwXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkxpbXBhciBmaWx0cm9zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcmVkby1hbHRcIj48L2k+XG4gICAgICAgICAgICAgIFJlc2V0YXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5kb3dubG9hZCAhPT0gZmFsc2UgJiYgZG93bmxvYWRUYWJsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1vcmFuZ2UtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Ymctb3JhbmdlLTYwMFwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkV4cG9ydGFyIFRhYmVsYVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgJiYgdGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YS5sZW5ndGggPD0gMFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRG93bmxvYWQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICAgIEV4cG9ydGFyXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibXgtYXV0byBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgKm5nSWY9XCJkYXRhLnRhYnMgJiYgZGF0YS50YWJzLnRhYnNEYXRhICYmIGRhdGEudGFicy50YWJzRGF0YS5sZW5ndGggPiAwXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBDYWxjdWxhciBxdWFudG9zIGdydXBvcyBkZSA2IHRhYnMgZXhpc3RlbSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IGdyb3VwSW5kZXggb2YgZ2V0VGFiR3JvdXBzKGRhdGEudGFicy50YWJzRGF0YSk7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC1hdXRvIGZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgbGV0IHRhYiBvZiBnZXRUYWJHcm91cChkYXRhLnRhYnMudGFic0RhdGEsIGdyb3VwSW5kZXgpO1xuICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXhcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLTIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktMjAwIHB4LTQgcHktMiBmb250LW1lZGl1bSB0cmFuc2l0aW9uIGhvdmVyOmJyaWdodG5lc3MtOTVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgaXNUYWJTZWxlY3RlZChnZXRSZWFsVGFiSW5kZXgoaSwgaikpXG4gICAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1iLTAgYnJpZ2h0bmVzcy0xMTAnXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRhYmxlU2VsZWN0ZWQoaSwgailcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGFiLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGFiLmNvdW50ZXIgIT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTIgdGV4dC14cyBmb250LWJvbGRcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidGFiLmNvdW50ZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgdGFiLmNvdW50ZXIgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OCB3LWZ1bGwgb3ZlcmZsb3cteC1hdXRvIHJvdW5kZWQteGwgdGFibGUtY29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPHRhYmxlXG4gICAgICAgICAgbWF0LXRhYmxlXG4gICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICAgICAgbWF0U29ydFxuICAgICAgICAgICNzb3J0PVwibWF0U29ydFwiXG4gICAgICAgICAgbWF0U29ydEFjdGl2ZT1cImNyZWF0ZWRBdFwiXG4gICAgICAgICAgbWF0U29ydERpcmVjdGlvbj1cImRlc2NcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBkYXRhLmRpc3BsYXllZENvbHVtbnM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiXG4gICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7eyBjb2wucHJvcGVydHkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgIDwhLS0gSUYgVEhFIENPTFVNTiBJUyBOT1QgU09SVEFCTEUsIFRIRU4gRE9OJ1QgU0hPVyBUSEUgU09SVCBCVVRUT05TIC0tPlxuICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2wuaXNTb3J0YWJsZSB8fCBkYXRhLnBhZ2luYXRpb24gPT09IHRydWVcIlxuICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgY29sLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDwhLS0gSUYgVEhFIENPTFVNTiBJUyBTT1JUQUJMRSwgVEhFTiBTSE9XIFRIRSBTT1JUIEJVVFRPTlMgLS0+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmlzU29ydGFibGUgJiYgZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjb2wudGl0bGUgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wubWV0aG9kID8gY29sLm1ldGhvZChyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25DZWxsTW91c2VFbnRlcigkZXZlbnQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DZWxsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2VsbE1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgSUYgVEhFIENPTFVNTiBNVVNUIEJFIERJU1BMQVlFRCAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb2wuaW1hZ2UgJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jaGFyTGltaXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5wcm9wZXJ0eV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5wcm9wZXJ0eV0ubGVuZ3RoID4gY29sLmNoYXJMaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugd2l0aGluTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICYmIGlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJjb2wuaGFzTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgIT09IHRydWUgJiYgIWlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhpbkxpbWl0PlxuICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJvd1tjb2wucHJvcGVydHldXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAmJiBpc1N0cmluZyhjb2wuaGFzTGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImNvbC5oYXNMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAhPT0gdHJ1ZSAmJiAhaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdywgdHJ1ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tIElNQUdFIC0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgICAgICAgICA8IS0tIEltYWdlbSBjb20gbG9hZGluZyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjb2wuaW1hZ2UgJiYgY29sLmltYWdlLnBhdGggJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNJbWFnZUxvYWRpbmcocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjMyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wIG0tYXV0b1wiXG4gICAgICAgICAgICAgICAgICA+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjb2wuaW1hZ2UucGF0aCArICcvJyArIHJvd1tjb2wucHJvcGVydHldXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmltYWdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wYWNpdHktMF09XCJpc0ltYWdlTG9hZGluZyhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgICAobG9hZCk9XCJvbkltYWdlTG9hZChyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25JbWFnZUVycm9yKCRldmVudCwgcm93LCBjb2wsIGNvbC5pbWFnZS5kZWZhdWx0KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBJbWFnZW0gY29tIFVSTCBjb21wbGV0YSBlIGxvYWRpbmcgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgY29sLmltYWdlICYmIGNvbC5pbWFnZS51cmwgJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNJbWFnZUxvYWRpbmcocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjMyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wIG0tYXV0b1wiXG4gICAgICAgICAgICAgICAgICA+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJyb3dbY29sLnByb3BlcnR5XVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbC5pbWFnZS5jbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGFjaXR5LTBdPVwiaXNJbWFnZUxvYWRpbmcocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICAgICAgKGxvYWQpPVwib25JbWFnZUxvYWQocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cIm9uSW1hZ2VFcnJvcigkZXZlbnQsIHJvdywgY29sLCBjb2wuaW1hZ2UuZGVmYXVsdClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmljb25DbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaWNvbkNsYXNzIG9mIGNvbC5pY29uQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzLmJ1dHRvbk1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBpY29uQ2xhc3MuYnV0dG9uTWV0aG9kKHJvdywgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpY29uQ2xhc3MuY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3MuY29uZGl0aW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChpY29uQ2xhc3MuY29uZGl0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGFueShpY29uQ2xhc3MuY29uZGl0aW9uKShyb3cpKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPnt7IGljb25DbGFzcy50ZXh0IH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtblByb3BlcnRpZXNcIj48L3RyPlxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnZXhhbXBsZS1lbGVtZW50LXJvdyc6IGRhdGEuaXNOb3RDbGlja2FibGUgPT09IHRydWUsXG4gICAgICAgICAgICAgICdleGFtcGxlLWVsZW1lbnQtcm93IGN1cnNvci1wb2ludGVyJzogIWRhdGEuaXNOb3RDbGlja2FibGVcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgbWF0LXJvd1xuICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtblByb3BlcnRpZXNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9EZXRhaWxzKHJvdylcIlxuICAgICAgICAgID48L3RyPlxuXG4gICAgICAgICAgPCEtLSBST1cgU0hPV04gV0hFTiBUSEVSRSBJUyBOTyBNQVRDSElORyBEQVRBLiAtLT5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm1hdE5vRGF0YVJvdz5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiEoaXNMb2FkaW5nJCB8IGFzeW5jKVwiIGNsYXNzPVwibWF0LWNlbGwgcC00XCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgTmVuaHVtIHJlc3VsdGFkbyBlbmNvbnRyYWRvIHBhcmEgYSBidXNjYVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCJpc0xvYWRpbmckIHwgYXN5bmNcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRvci1jb250YWluZXJcIj5cbiAgICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgICAgI3BhZ2luYXRvclxuICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbMjUsIDUwLCAxMDBdXCJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICBbbGVuZ3RoXT1cInRvdGFsSXRlbXNcIlxuICAgICAgICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgcGFnZSBvZiBwZXJpb2RpYyBlbGVtZW50c1wiXG4gICAgICAgICAgICAocGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdoaWRlLWxlbmd0aCc6XG4gICAgICAgICAgICAgICAgWydmaWx0ZXInLCAnZmlsdGVyQnlEYXRlJywgJ2VxdWFscyddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZVxuICAgICAgICAgICAgICAgICkgfHwgdGhpcy5kYXRhLmZpbHRlckZuLFxuICAgICAgICAgICAgICAnaGlkZS1uZXh0LWJ1dHRvbic6ICFoYXNOZXh0UGFnZSAmJiBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUsXG4gICAgICAgICAgICAgICdoaWRlLWxhc3QtYnV0dG9uJzpcbiAgICAgICAgICAgICAgICAoIWhhc05leHRQYWdlICYmIGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSkgfHwgdGhpcy5kYXRhLmZpbHRlckZuXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICEoaXNMb2FkaW5nJCB8IGFzeW5jKSAmJlxuICAgICAgICAgICAgICBkYXRhU291cmNlPy5kYXRhICYmXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGRhdGE/LmZpbHRlckZuXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlLW51bWJlci1kaXNwbGF5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBjdXJyZW50UGFnZU51bWJlciB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFRPT0xUSVAgUEVSU09OQUxJWkFETyAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2hvd1Rvb2x0aXBcIlxuICAgIGNsYXNzPVwiZml4ZWQgei01MCBtYXgtdy1tZCBicmVhay13b3JkcyByb3VuZGVkLWxnIHB4LTMgcHktMiB0ZXh0LXNtIHNoYWRvdy1sZ1wiXG4gICAgW25nQ2xhc3NdPVwiXG4gICAgICAodG9vbHRpcEJnQ29sb3IgfHwgJ2JnLWdyYXktODAwJykgK1xuICAgICAgJyAnICtcbiAgICAgICh0b29sdGlwVGV4dENvbG9yIHx8ICd0ZXh0LXdoaXRlJylcbiAgICBcIlxuICAgIFtuZ1N0eWxlXT1cImdldFRvb2x0aXBTdHlsZXMoKVwiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwidG9vbHRpcFBvc2l0aW9uLnhcIlxuICAgIFtzdHlsZS50b3AucHhdPVwidG9vbHRpcFBvc2l0aW9uLnlcIlxuICAgIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInbm9uZSdcIlxuICA+XG4gICAge3sgdG9vbHRpcENvbnRlbnQgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
1250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFPTCxjQUFjLEdBQ2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBS1QsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsT0FBTyxFQUNQLFNBQVMsRUFDVCxlQUFlLEdBQ2hCLE1BQU0sTUFBTSxDQUFDO0FBS2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUW5FLE1BQU0sT0FBTyxjQUFjO0lBK0R6QixjQUFjO0lBQ2QsWUFDVSxNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsU0FBMkIsRUFDM0IsRUFBYyxFQUNkLEdBQXNCO1FBSnRCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsUUFBRyxH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O3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0gsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXJyYW5nZSxcbiAgQ29uZGl0aW9uLFxuICBUYWIsXG4gIFRhYkRhdGEsXG4gIFRhYmxlRGF0YSxcbiAgQ29sdW1uLFxuICBUQUJMRV9ERUZBVUxUUyxcbn0gZnJvbSAnLi4vLi4vdHlwZXMvVGFibGUnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFuZ3VsYXJGaXJlc3RvcmUsXG4gIFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCxcbn0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9jb21wYXQvZmlyZXN0b3JlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbiAgQmVoYXZpb3JTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9yZGVyQnlEaXJlY3Rpb24gfSBmcm9tICdmaXJlYmFzZS9maXJlc3RvcmUnO1xuaW1wb3J0IGZpcmViYXNlIGZyb20gJ2ZpcmViYXNlL2NvbXBhdCc7XG5pbXBvcnQgV2hlcmVGaWx0ZXJPcCA9IGZpcmViYXNlLmZpcmVzdG9yZS5XaGVyZUZpbHRlck9wO1xuaW1wb3J0IGZpcmVzdG9yZSA9IGZpcmViYXNlLmZpcmVzdG9yZTtcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICAvLyBJTlBVVFNcbiAgQElucHV0KCkgZGF0YSE6IFRhYmxlRGF0YTtcbiAgQElucHV0KCkgZG93bmxvYWRUYWJsZT86IChhcnJhbmdlOiBBcnJhbmdlLCBjb25kaXRpb25zOiBDb25kaXRpb25bXSkgPT4gdm9pZDtcbiAgYXJyYW5nZTogQXJyYW5nZSB8IG51bGwgPSBudWxsO1xuICAvLyBWQVJJQUJMRVNcbiAgZGF0YVNvdXJjZSE6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBjdXJyZW50UGFnZU51bWJlciA9IDE7XG4gIGN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSAwO1xuXG4gIHB1YmxpYyBpc0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIGl0ZW1zOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgZmlsdGVyZWRJdGVtczogYW55W10gPSBbXTsgLy8gRGFkb3MgZmlsdHJhZG9zIHBhcmEgbW9kbyBuw6NvIHBhZ2luYWRvIChww7pibGljbyBwYXJhIGFjZXNzbyBleHRlcm5vKVxuICBwcml2YXRlIGxhc3REb2M6IFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdDxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmlyc3REb2M6IFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdDxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmc7IG9yZGVyOiBPcmRlckJ5RGlyZWN0aW9uIH0gPSB7XG4gICAgZmllbGQ6IFRBQkxFX0RFRkFVTFRTLlNPUlRfRklFTEQsXG4gICAgb3JkZXI6IFRBQkxFX0RFRkFVTFRTLlNPUlRfT1JERVIsXG4gIH07XG4gIHB1YmxpYyBjb2x1bW5Qcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZpbHRlcnNGb3JtOiBGb3JtQXJyYXk7XG5cbiAgc2VsZWN0U29ydDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICBjdXJyZW50QXJyYW5nZSA9ICcnO1xuXG4gIGhhc05leHRQYWdlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZHJvcGRvd25JdGVtczogYW55W10gPSBbXTtcbiAgc29ydGFibGVEcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xuICBwYWdlU2l6ZSA9IFRBQkxFX0RFRkFVTFRTLlBBR0VfU0laRTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIHBhZ2VFdmVudD86IFBhZ2VFdmVudDtcbiAgZmlsdGVyVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGhhc0ZpbHRlcmFibGVDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaGFzU29ydGFibGVDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgZmlsdGVyUHJlZGljYXRlOiAoKGRhdGE6IGFueSwgZmlsdGVyOiBzdHJpbmcpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZpbHRlclN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VUaW1lTXMgPSBUQUJMRV9ERUZBVUxUUy5ERUJPVU5DRV9USU1FX01TO1xuXG4gIHNlbGVjdGVkVGFiOiBudW1iZXIgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XG5cbiAgLy8gUHJvcHJpZWRhZGVzIHBhcmEgY29udHJvbGUgZG8gdG9vbHRpcFxuICBob3ZlcmVkQ2VsbDogeyByb3c6IGFueTsgY29sOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBzaG93VG9vbHRpcDogYm9vbGVhbiA9IGZhbHNlO1xuICB0b29sdGlwVGltZW91dDogYW55O1xuICB0b29sdGlwQ29udGVudDogc3RyaW5nID0gJyc7XG4gIHRvb2x0aXBQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0geyB4OiAwLCB5OiAwIH07XG4gIHRvb2x0aXBCZ0NvbG9yOiBzdHJpbmcgPSAnYmctZ3JheS04MDAnOyAvLyBDb3IgcGFkcsOjbyBkbyB0b29sdGlwXG4gIHRvb2x0aXBCZ1N0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7IC8vIFBhcmEgY29yZXMgaGV4L3JnYlxuICB0b29sdGlwVGV4dENvbG9yOiBzdHJpbmcgPSAndGV4dC13aGl0ZSc7IC8vIENvciBwYWRyw6NvIGRvIHRleHRvIGRvIHRvb2x0aXBcbiAgdG9vbHRpcFRleHRTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsOyAvLyBQYXJhIGNvcmVzIGhleC9yZ2IgZG8gdGV4dG9cblxuICAvLyBDb250cm9sZSBkZSBsb2FkaW5nIGRlIGltYWdlbnNcbiAgaW1hZ2VMb2FkaW5nU3RhdGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBDT05TVFJVQ1RPUlxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXJlc3RvcmU6IEFuZ3VsYXJGaXJlc3RvcmUsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IG5ldyBGb3JtQXJyYXkoW3RoaXMuY3JlYXRlRmlsdGVyR3JvdXAoKV0pO1xuICB9XG5cbiAgY3JlYXRlRmlsdGVyR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICAvLyBDcmlhciB2YWxpZGFkb3IgZGlyZXRhbWVudGUgYXF1aSBwYXJhIGV2aXRhciBwcm9ibGVtYXMgZGUgY29udGV4dG8gZGUgaW5qZcOnw6NvXG4gICAgY29uc3QgZGF0ZVZhbGlkYXRvciA9IHRoaXMudGFibGVTZXJ2aWNlLmRhdGVGb3JtYXRWYWxpZGF0b3IoKTtcblxuICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIHNlbGVjdEZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIHR5cGVGaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBzZWxlY3RJdGVtOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgaW5pdGlhbERhdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW2RhdGVWYWxpZGF0b3JdKSxcbiAgICAgIGZpbmFsRGF0ZTogbmV3IEZvcm1Db250cm9sKCcnLCBbZGF0ZVZhbGlkYXRvcl0pLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkRmlsdGVyKGZpbHRlckRhdGE/OiB7XG4gICAgc2VsZWN0RmlsdGVyOiBhbnk7XG4gICAgdHlwZUZpbHRlcj86IHN0cmluZztcbiAgICBzZWxlY3RJdGVtPzogYW55W107XG4gICAgaW5pdGlhbERhdGU/OiBzdHJpbmc7XG4gICAgZmluYWxEYXRlPzogc3RyaW5nO1xuICB9KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcigpICYmXG4gICAgICBmaWx0ZXJEYXRhPy5zZWxlY3RGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3RmlsdGVyR3JvdXAgPSB0aGlzLmNyZWF0ZUZpbHRlckdyb3VwKCk7XG5cbiAgICBpZiAoZmlsdGVyRGF0YSkge1xuICAgICAgaWYgKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLnR5cGVGaWx0ZXIpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEudHlwZUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRGF0YS5zZWxlY3RJdGVtKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEuaW5pdGlhbERhdGUpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLmZpbmFsRGF0ZSkge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmZpbmFsRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzRm9ybS5wdXNoKG5ld0ZpbHRlckdyb3VwKTtcbiAgfVxuXG4gIGhhc0FjdGl2ZURhdGVGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHMuc29tZSgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlICYmIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbHRlcihcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0uYXJyYW5nZSAhPT0gJ2ZpbHRlckJ5RGF0ZSdcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duSXRlbXM7XG4gIH1cblxuICBvblNlbGVjdEZpbHRlckNoYW5nZSgpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdEZpbHRlciA9IHRoaXMuZmlsdGVyc0Zvcm0uYXQobGFzdEluZGV4KTtcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGxhc3RGaWx0ZXIuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG5cbiAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScgJiZcbiAgICAgICAgdGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtLnJlbW92ZUF0KGluZGV4KTtcbiAgICBpZiAodGhpcy5maWx0ZXJzRm9ybS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB0aGlzLnJlc2V0RmlsdGVyKCk7XG4gIH1cblxuICAvLyBNRVRIT0RTXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddKSB7XG4gICAgICAvLyBBcGxpY2FyIGNvcmVzIHF1YW5kbyBvIGRhdGEgZm9yIGRlZmluaWRvIG91IG11ZGFyXG4gICAgICAvLyBVc2FyIHNldFRpbWVvdXQgcGFyYSBnYXJhbnRpciBxdWUgYSB2aWV3IGVzdGVqYSBwcm9udGFcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcHBseUN1c3RvbUNvbG9ycygpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gR2FyYW50aXIgcXVlIGFzIGNvcmVzIHNlamFtIGFwbGljYWRhcyBhcMOzcyBhIHZpZXcgZXN0YXIgcHJvbnRhXG4gICAgdGhpcy5hcHBseUN1c3RvbUNvbG9ycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUN1c3RvbUNvbG9ycygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFob3N0RWxlbWVudCB8fCAhdGhpcy5kYXRhKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy5iZykge1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtY29sb3InLCB0aGlzLmRhdGEuY29sb3IuYmcpO1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtaGVhZGVyLWJnJywgdGhpcy5kYXRhLmNvbG9yLmJnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YS5jb2xvcj8udGV4dCkge1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtdGV4dC1jb2xvcicsIHRoaXMuZGF0YS5jb2xvci50ZXh0KTtcbiAgICAgIGhvc3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAnLS10YWJsZS1oZWFkZXItdGV4dCcsXG4gICAgICAgIHRoaXMuZGF0YS5jb2xvci50ZXh0XG4gICAgICApO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyQ2VsbHMgPSBob3N0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAnLm1hdC1oZWFkZXItY2VsbCwgLm1hdC1tZGMtaGVhZGVyLWNlbGwsIHRoLm1hdC1oZWFkZXItY2VsbCwgdGgubWF0LW1kYy1oZWFkZXItY2VsbCdcbiAgICAgICk7XG4gICAgICBoZWFkZXJDZWxscy5mb3JFYWNoKChjZWxsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jb2xvcj8uYmcpIHtcbiAgICAgICAgICBjZWxsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuZGF0YS5jb2xvci5iZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy50ZXh0KSB7XG4gICAgICAgICAgY2VsbC5zdHlsZS5jb2xvciA9IHRoaXMuZGF0YS5jb2xvci50ZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5kYXRhLmNvbG9yKVxuICAgICAgdGhpcy5kYXRhLmNvbG9yID0ge1xuICAgICAgICBiZzogVEFCTEVfREVGQVVMVFMuREVGQVVMVF9CR19DT0xPUixcbiAgICAgICAgdGV4dDogVEFCTEVfREVGQVVMVFMuREVGQVVMVF9URVhUX0NPTE9SLFxuICAgICAgfTtcbiAgICBpZiAodGhpcy5kYXRhLnNob3dTaW1wbGVTZWFyY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kYXRhLnNob3dTaW1wbGVTZWFyY2ggPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmNvbHVtblByb3BlcnRpZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eTtcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGlmICh0aGlzLmRhdGEuYWN0aW9uQnV0dG9uICYmICF0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbikge1xuICAgICAgdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24gPSAoX3Jvdz86IGFueSkgPT4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IGZhbHNlKSB0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzU29ydGFibGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU29ydGFibGVDb2x1bW4gPT09IGZhbHNlKSB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdhc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdkZXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZGVjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlQnlEYXRlKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlckJ5RGF0ZScsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGZpbHRybyBwb3IgZGF0YScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMpICYmXG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT5cbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goeyAuLi5vcHRpb24sIGFycmFuZ2U6ICdlcXVhbHMnIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNlbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLy8gQ29tIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLnNvcnRCeSlcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB7XG4gICAgICAgICAgZmllbGQ6IHRoaXMuZGF0YS5zb3J0QnkuZmllbGQsXG4gICAgICAgICAgb3JkZXI6IHRoaXMuZGF0YS5zb3J0Qnkub3JkZXIsXG4gICAgICAgIH07XG4gICAgICB0aGlzLmZpbHRlclN1YmplY3RcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lTXMpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuc29ydC5hY3RpdmUgPSAnY3JlYXRlZEF0JztcbiAgICAgIHRoaXMuc29ydC5kaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgIGZvciAoY29uc3QgdG90YWxSZWYgb2YgdGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxSZWZEb2MgPSBhd2FpdCB0b3RhbFJlZi5yZWYuZ2V0KCk7XG4gICAgICAgICAgY29uc3QgZG9jRGF0YSA9IHRvdGFsUmVmRG9jLmRhdGEoKSBhcyBhbnk7XG4gICAgICAgICAgaWYgKGRvY0RhdGEgJiYgZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0pXG4gICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAodGhpcy50b3RhbEl0ZW1zICtcbiAgICAgICAgICAgICAgZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0pIGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKGNvbDogYW55LCByb3c6IGFueSwgd2l0aGluTGltaXQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG5cbiAgICBpZiAoY29sLmNhbGN1bGF0ZVZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IGNvbC5jYWxjdWxhdGVWYWx1ZShyb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUocm93LCBjb2wucHJvcGVydHkpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb2wuYXJyYXlGaWVsZCkge1xuICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdEFycmF5VmFsdWUodmFsdWUsIGNvbC5hcnJheUZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoY29sLnF1ZXJ5TGVuZ3RoICYmIHJvd1tjb2wucHJvcGVydHldKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2wucHJvcGVydHldO1xuICAgIH1cblxuICAgIHZhbHVlID0gY29sLnBpcGUgPyBjb2wucGlwZS50cmFuc2Zvcm0odmFsdWUpIDogdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh3aXRoaW5MaW1pdCB8fCAhY29sLmNoYXJMaW1pdCB8fCB2YWx1ZS5sZW5ndGggPD0gY29sLmNoYXJMaW1pdCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGNvbC5jaGFyTGltaXQpICsgJy4uLic7XG4gIH1cblxuICBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gcHJvcGVydGllcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBjdXJyZW50UGFydCkgPT4gYWNjICYmIGFjY1tjdXJyZW50UGFydF0sXG4gICAgICBvYmpcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRBcnJheVZhbHVlKGFycmF5OiBhbnlbXSwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBhcnJheVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF0gfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpO1xuXG4gICAgcmV0dXJuIHZhbHVlcy5qb2luKCcsICcpO1xuICB9XG5cbiAgLy8gTcOpdG9kb3Mgc2VtIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXN5bmMgbG9hZEl0ZW1zKCkge1xuICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3RhdGUuY2xlYXIoKTsgLy8gTGltcGFyIGVzdGFkbyBkZSBsb2FkaW5nIGRlIGltYWdlbnNcbiAgICB0aGlzLml0ZW1zID0gYXdhaXQgdGhpcy50YWJsZVNlcnZpY2UuZ2V0SXRlbXModGhpcy5kYXRhLmNvbGxlY3Rpb25SZWYpO1xuICAgIGlmICh0aGlzLmRhdGEuY29uZGl0aW9ucykge1xuICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvYWRSZWxhdGlvbnMoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRRdWVyeUxlbmd0aHMoKTtcbiAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcblxuICAgIC8vIEluaWNpYWxpemFyIGFycmFuZ2UgcGFyYSB0YWJlbGFzIG7Do28gcGFnaW5hZGFzXG4gICAgdGhpcy5hcnJhbmdlID0ge1xuICAgICAgZmlsdGVyczogW10sXG4gICAgICBzb3J0Qnk6IHRoaXMuZGF0YS5zb3J0QnkgfHwge1xuICAgICAgICBmaWVsZDogVEFCTEVfREVGQVVMVFMuU09SVF9GSUVMRCxcbiAgICAgICAgb3JkZXI6IFRBQkxFX0RFRkFVTFRTLlNPUlRfT1JERVIsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5zb3J0QnkgPSB0aGlzLmRhdGEuc29ydEJ5IHx8IHtcbiAgICAgIGZpZWxkOiBUQUJMRV9ERUZBVUxUUy5TT1JUX0ZJRUxELFxuICAgICAgb3JkZXI6IFRBQkxFX0RFRkFVTFRTLlNPUlRfT1JERVIsXG4gICAgfTtcblxuICAgIC8vIEFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZSBzZSBleGlzdGlyZW1cbiAgICBsZXQgaXRlbXNUb0Rpc3BsYXkgPSBbLi4udGhpcy5pdGVtc107XG4gICAgaXRlbXNUb0Rpc3BsYXkgPSB0aGlzLmFwcGx5Q2xpZW50U2lkZUZpbHRlcnMoaXRlbXNUb0Rpc3BsYXkpO1xuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IGl0ZW1zVG9EaXNwbGF5OyAvLyBBcm1hemVuYXIgZGFkb3MgZmlsdHJhZG9zXG5cbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGl0ZW1zVG9EaXNwbGF5KTtcbiAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgaWYgKHRoaXMuZGF0YS5zb3J0QnkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0LmFjdGl2ZSA9IHRoaXMuZGF0YS5zb3J0QnkuZmllbGQ7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydC5kaXJlY3Rpb24gPSB0aGlzLmRhdGEuc29ydEJ5Lm9yZGVyO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQuc29ydENoYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLnNvbWUoKGNvbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoY29sLmZpbHRlclByZWRpY2F0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gY29sLmZpbHRlclByZWRpY2F0ZXMuc29tZSgocHJlZGljYXRlKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZGF0YVtjb2wucHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbHVlIHx8IHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZWRpY2F0ZVZhbHVlID0gcHJvcGVydHlWYWx1ZVtwcmVkaWNhdGVdO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZVZhbHVlID09PSBudWxsIHx8IHByZWRpY2F0ZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHByZWRpY2F0ZVZhbHVlKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIC5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbC5wcm9wZXJ0eSAmJiBjb2wuaXNGaWx0ZXJhYmxlKSB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGRhdGFbY29sLnByb3BlcnR5XTtcbiAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZSA9PT0gbnVsbCB8fCBwcm9wZXJ0eVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHByb3BlcnR5VmFsdWUpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBBcGxpY2FyIGZpbHRyb3MgY2xpZW50LXNpZGUgKGZpbHRyb3MgcG9yIGRhdGEpXG4gIHByaXZhdGUgYXBwbHlDbGllbnRTaWRlRmlsdGVycyhpdGVtczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGZpbHRlcmVkSXRlbXMgPSBbLi4uaXRlbXNdO1xuXG4gICAgLy8gQWdydXBhciBmaWx0cm9zIGRlIGRhdGEgcG9yIHByb3ByaWVkYWRlXG4gICAgY29uc3QgZGF0ZUZpbHRlcnNCeVByb3BlcnR5OiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBBcnJheTx7IGluaXRpYWw6IERhdGU7IGZpbmFsOiBEYXRlIH0+XG4gICAgPiA9IHt9O1xuICAgIGNvbnN0IG90aGVyRmlsdGVyczogQXJyYXk8e1xuICAgICAgZ3JvdXA6IEZvcm1Hcm91cDtcbiAgICAgIHNlbGVjdGVkRmlsdGVyOiBhbnk7XG4gICAgICBhcnJhbmdlOiBzdHJpbmc7XG4gICAgfT4gPSBbXTtcblxuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFycmFuZ2UgPSBzZWxlY3RlZEZpbHRlci5hcnJhbmdlO1xuXG4gICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XG5cbiAgICAgICAgLy8gU8OzIGFwbGljYXIgZmlsdHJvIHNlIGFtYmFzIGFzIGRhdGFzIGVzdGl2ZXJlbSBwcmVlbmNoaWRhc1xuICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCAmJiBpbml0aWFsLnRyaW0oKSAmJiBmaW5hbC50cmltKCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVmFsaWRhciBmb3JtYXRvIGRhIGRhdGEgKEREL01NL0FBQUEpXG4gICAgICAgICAgICBjb25zdCBkYXRlUGF0dGVybiA9IC9eKFxcZHsxLDJ9KVxcLyhcXGR7MSwyfSlcXC8oXFxkezR9KSQvO1xuICAgICAgICAgICAgaWYgKCFkYXRlUGF0dGVybi50ZXN0KGluaXRpYWwpIHx8ICFkYXRlUGF0dGVybi50ZXN0KGZpbmFsKSkge1xuICAgICAgICAgICAgICByZXR1cm47IC8vIElnbm9yYXIgc2UgZm9ybWF0byBpbnbDoWxpZG9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcbiAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhciBzZSBhcyBkYXRhcyBzw6NvIHbDoWxpZGFzXG4gICAgICAgICAgICBpZiAoaXNOYU4oaW5pdGlhbERhdGUuZ2V0VGltZSgpKSB8fCBpc05hTihmaW5hbERhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICByZXR1cm47IC8vIElnbm9yYXIgc2UgZGF0YXMgaW52w6FsaWRhc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVc2FyIG8gY2FtcG8gZGEgY29sdW5hIG91IG8gc29ydEJ5LmZpZWxkIGNvbW8gcGFkcsOjb1xuICAgICAgICAgICAgY29uc3QgZGF0ZUZpZWxkID0gc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHkgfHwgdGhpcy5zb3J0QnkuZmllbGQ7XG5cbiAgICAgICAgICAgIGlmICghZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0pIHtcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0ucHVzaCh7XG4gICAgICAgICAgICAgIGluaXRpYWw6IGluaXRpYWxEYXRlLFxuICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJybyBhbyBwcm9jZXNzYXIgZGF0YXMgZG8gZmlsdHJvOicsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG90aGVyRmlsdGVycy5wdXNoKHsgZ3JvdXAsIHNlbGVjdGVkRmlsdGVyLCBhcnJhbmdlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmtleXMoZGF0ZUZpbHRlcnNCeVByb3BlcnR5KS5mb3JFYWNoKChkYXRlRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IGludGVydmFscyA9IGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eVtkYXRlRmllbGRdO1xuXG4gICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBpdGVtW2RhdGVGaWVsZF07XG5cbiAgICAgICAgICBpZiAoIWZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgaXRlbURhdGU6IERhdGU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLnRvRGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBmaWVsZFZhbHVlLnRvRGF0ZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBuZXcgRGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc05hTihpdGVtRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBuZXcgRGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpbnRlcnZhbHMuc29tZShcbiAgICAgICAgICAgIChpbnRlcnZhbCkgPT5cbiAgICAgICAgICAgICAgaXRlbURhdGUgPj0gaW50ZXJ2YWwuaW5pdGlhbCAmJiBpdGVtRGF0ZSA8PSBpbnRlcnZhbC5maW5hbFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ0Vycm8gYW8gcHJvY2Vzc2FyIGZpbHRybyBkZSBkYXRhIHBhcmEgbyBpdGVtOicsXG4gICAgICAgICAgICBpdGVtLmlkLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBvdGhlckZpbHRlcnMuZm9yRWFjaCgoeyBncm91cCwgc2VsZWN0ZWRGaWx0ZXIsIGFycmFuZ2UgfSkgPT4ge1xuICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICBpZiAoZmlsdGVyVmFsdWUgJiYgZmlsdGVyVmFsdWUudHJpbSgpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eTtcbiAgICAgICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtwcm9wZXJ0eV0gfHwgJycpXG4gICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmlsdGVyVmFsdWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJlxuICAgICAgICBhcnJhbmdlID09PSAnZXF1YWxzJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBncm91cC5nZXQoJ3NlbGVjdEl0ZW0nKT8udmFsdWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHNlbGVjdGVkSXRlbXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0udmFsdWUpO1xuICAgICAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5zb21lKChzZWxlY3RlZEl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtVmFsdWUgPSBpdGVtW3NlbGVjdGVkSXRlbS5wcm9wZXJ0eV07XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtVmFsdWUgPT09IHNlbGVjdGVkSXRlbS52YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWRJdGVtcztcbiAgfVxuXG4gIC8vIEhhbmRsZXIgcGFyYSBtdWRhbsOnYXMgZGUgZGF0YSBubyBmaWx0cm9cbiAgb25EYXRlRmlsdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBhcnJhbmdlIGNvbSBvcyBmaWx0cm9zIGF0aXZvc1xuICAgICAgdGhpcy5hcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgLy8gQXBsaWNhciBmaWx0cm9zIChvdSByZW1vdmVyIHNlIGNhbXBvcyBlc3RpdmVyZW0gdmF6aW9zKVxuICAgICAgdGhpcy5hcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwbGljYXIgbcOhc2NhcmEgZGUgZGF0YSAoREQvTU0vQUFBQSkgbWFudWFsbWVudGVcbiAgb25EYXRlSW5wdXQoXG4gICAgZXZlbnQ6IGFueSxcbiAgICBjb250cm9sTmFtZTogJ2luaXRpYWxEYXRlJyB8ICdmaW5hbERhdGUnLFxuICAgIGZpbHRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XG4gICAgbGV0IHZhbHVlID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTsgLy8gUmVtb3ZlIHR1ZG8gcXVlIG7Do28gw6kgZMOtZ2l0b1xuXG4gICAgLy8gTGltaXRhciBhIDggZMOtZ2l0b3MgKERETU1BQUFBKVxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiA4KSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDgpO1xuICAgIH1cblxuICAgIC8vIEZvcm1hdGFyOiBERC9NTS9BQUFBXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8PSAyKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoIDw9IDQpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgMikgKyAnLycgKyB2YWx1ZS5zbGljZSgyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPVxuICAgICAgICB2YWx1ZS5zbGljZSgwLCAyKSArICcvJyArIHZhbHVlLnNsaWNlKDIsIDQpICsgJy8nICsgdmFsdWUuc2xpY2UoNCwgOCk7XG4gICAgfVxuXG4gICAgLy8gQXR1YWxpemFyIG8gRm9ybUNvbnRyb2xcbiAgICBjb25zdCBmaWx0ZXJHcm91cCA9IHRoaXMuZmlsdGVyc0Zvcm0uYXQoZmlsdGVySW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICBmaWx0ZXJHcm91cC5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgLy8gQXBsaWNhciBmaWx0cm9zIGFvIGRhdGFTb3VyY2UgcXVhbmRvIG7Do28gaMOhIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzVG9EYXRhU291cmNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSByZXR1cm47XG5cbiAgICBsZXQgZmlsdGVyZWRJdGVtcyA9IHRoaXMuYXBwbHlDbGllbnRTaWRlRmlsdGVycyhbLi4udGhpcy5pdGVtc10pO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZmlsdGVyZWRJdGVtcztcbiAgICAvLyBBdHVhbGl6YXIgZmlsdGVyZWRJdGVtcyBjb20gb3MgZGFkb3MgZmlsdHJhZG9zIChzZXLDoSBhdHVhbGl6YWRvIG5vdmFtZW50ZSBubyBoYW5kbGVEb3dubG9hZCBjb20gZmlsdGVyZWREYXRhKVxuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXM7XG4gICAgdGhpcy50b3RhbEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5sZW5ndGg7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIE3DqXRvZG9zIGNvbSBwYWdpbmHDp8Ojb1xuICBwcml2YXRlIGFzeW5jIGxvYWRJdGVtc1BhZ2luYXRlZChcbiAgICBuYXZpZ2F0aW9uOiBzdHJpbmcgPSAncmVsb2FkJyxcbiAgICByZXNldDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3RhdGUuY2xlYXIoKTsgLy8gTGltcGFyIGVzdGFkbyBkZSBsb2FkaW5nIGRlIGltYWdlbnNcbiAgICBpZiAocmVzZXQgJiYgWydmb3J3YXJkJywgJ3JlbG9hZCddLmluY2x1ZGVzKG5hdmlnYXRpb24pKSB7XG4gICAgICB0aGlzLmxhc3REb2MgPSBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICB9XG4gICAgaWYgKHJlc2V0ICYmIFsnYmFja3dhcmQnLCAncmVsb2FkJ10uaW5jbHVkZXMobmF2aWdhdGlvbikpIHtcbiAgICAgIHRoaXMuZmlyc3REb2MgPSBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzRm9ybS5jb250cm9sc1xuICAgICAgLmZsYXRNYXAoKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgaWYgKCFzZWxlY3RlZEZpbHRlcikgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IGFycmFuZ2UgPSBzZWxlY3RlZEZpbHRlci5hcnJhbmdlO1xuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUpIHJldHVybiBbXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICBwcm9wZXJ0eTogc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHksXG4gICAgICAgICAgICAgIGZpbHRlcmluZzogZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScpIHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgICBjb25zdCBmaW5hbCA9IGdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsKSB7XG4gICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xuICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xuICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgICAgZmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcbiAgICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRmlsdGVyLmhhc093blByb3BlcnR5KCdpdGVtcycpICYmIGFycmFuZ2UgPT09ICdlcXVhbHMnKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEl0ZW1zKSAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0ucHJvcGVydHksXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcblxuICAgIHRoaXMuYXJyYW5nZSA9IHtcbiAgICAgIGZpbHRlcnM6IGFjdGl2ZUZpbHRlcnMsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH07XG5cbiAgICBjb25zdCBwYWdpbmF0ZWQ6IGFueSA9IHtcbiAgICAgIGJhdGNoU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGNvbGxlY3Rpb246IHRoaXMuZGF0YS5jb2xsZWN0aW9uLFxuICAgICAgZG9jOiB7IGxhc3REb2M6IHRoaXMubGFzdERvYywgZmlyc3REb2M6IHRoaXMuZmlyc3REb2MgfSxcbiAgICAgIG5hdmlnYXRpb24sXG4gICAgICBhcnJhbmdlOiB0aGlzLmFycmFuZ2UsXG4gICAgICBjb25kaXRpb25zOiB0aGlzLmRhdGEuY29uZGl0aW9ucyxcbiAgICAgIHNpemU6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIGZpbHRlckZuOiB0aGlzLmRhdGEuZmlsdGVyRm4sXG4gICAgICBjbGllbnRQYWdlSW5kZXg6IHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50YWJsZVNlcnZpY2UuZ2V0UGFnaW5hdGVkKHBhZ2luYXRlZCk7XG4gICAgdGhpcy5pdGVtcyA9IHJlc3VsdC5pdGVtcztcbiAgICBhd2FpdCB0aGlzLmxvYWRSZWxhdGlvbnMoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRRdWVyeUxlbmd0aHMoKTtcbiAgICB0aGlzLmxhc3REb2MgPSByZXN1bHQubGFzdERvYyBhcyBhbnk7XG4gICAgdGhpcy5maXJzdERvYyA9IHJlc3VsdC5maXJzdERvYyBhcyBhbnk7XG5cbiAgICAvLyBBdHVhbGl6YXIgY3VycmVudENsaWVudFBhZ2VJbmRleCBzZSByZXRvcm5hZG8gcGVsbyBmYWxsYmFja1xuICAgIGlmIChyZXN1bHQuY3VycmVudENsaWVudFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSByZXN1bHQuY3VycmVudENsaWVudFBhZ2VJbmRleDtcbiAgICB9XG5cbiAgICBsZXQgc3VtID0gMDtcbiAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICBmb3IgKGNvbnN0IHRvdGFsUmVmIG9mIHRoaXMuZGF0YS50b3RhbFJlZikge1xuICAgICAgICBjb25zdCB0b3RhbFJlZkRvYyA9IGF3YWl0IHRvdGFsUmVmLnJlZi5nZXQoKTtcbiAgICAgICAgY29uc3QgZG9jRGF0YSA9IHRvdGFsUmVmRG9jLmRhdGEoKSBhcyBhbnk7XG4gICAgICAgIGlmIChkb2NEYXRhIHx8IHJlc3VsdC5maWx0ZXJMZW5ndGgpIHtcbiAgICAgICAgICBzdW0gPVxuICAgICAgICAgICAgcmVzdWx0LmZpbHRlckxlbmd0aCA/P1xuICAgICAgICAgICAgKChzdW0gKyAoZG9jRGF0YSA/IGRvY0RhdGFbdG90YWxSZWYuZmllbGRdIDogMCkpIGFzIG51bWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IHN1bTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc05leHRQYWdlID0gcmVzdWx0Lmhhc05leHRQYWdlO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5pdGVtcyk7XG4gICAgdGhpcy5maWx0ZXJQcmVkaWNhdGUgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYXN5bmMgb25QYWdlQ2hhbmdlKGV2ZW50PzogUGFnZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlICYmIGV2ZW50KSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyQubmV4dCh0cnVlKTtcblxuICAgICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSBldmVudC5wcmV2aW91c1BhZ2VJbmRleCA/PyAwO1xuICAgICAgY29uc3QgcGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xuICAgICAgY29uc3QgY3VycmVudENvbXBvbmVudFBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgIGNvbnN0IGV2ZW50UGFnZVNpemUgPSBldmVudC5wYWdlU2l6ZTtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLnRvdGFsSXRlbXM7XG5cbiAgICAgIGxldCBuYXZpZ2F0aW9uRGlyZWN0aW9uOiBzdHJpbmc7XG4gICAgICBsZXQgcmVzZXREb2NzID0gZmFsc2U7XG4gICAgICBsZXQgb3JpZ2luYWxQYWdlU2l6ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIGNvbnN0IGxhc3RQYWdlSW5kZXggPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBldmVudFBhZ2VTaXplKSAtIDFcbiAgICAgICk7XG5cbiAgICAgIC8vIEF0dWFsaXphciBjdXJyZW50Q2xpZW50UGFnZUluZGV4IHNlbXByZSBwYXJhIG8gZmFsbGJhY2tcbiAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcblxuICAgICAgaWYgKHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFnZUluZGV4ID4gcHJldmlvdXNQYWdlSW5kZXgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZU51bWJlcisrO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPCBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2VOdW1iZXIgPSBNYXRoLm1heCgxLCB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyIC0gMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFBhZ2VTaXplICE9PSBjdXJyZW50Q29tcG9uZW50UGFnZVNpemUpIHtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50UGFnZVNpemU7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwYWdlSW5kZXggPT09IDAgJiZcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPCBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQdWxvdSBwYXJhIGEgcHJpbWVpcmEgcMOhZ2luYScpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHBhZ2VJbmRleCA9PT0gbGFzdFBhZ2VJbmRleCAmJlxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4ICYmXG4gICAgICAgIHBhZ2VJbmRleCAtIHByZXZpb3VzUGFnZUluZGV4ID4gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQdWxvdSBwYXJhIGEgdWx0aW1hIHDDoWdpbmEnKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdiYWNrd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPVxuICAgICAgICAgIHRvdGFsSXRlbXMgLSBsYXN0UGFnZUluZGV4ICogZXZlbnRQYWdlU2l6ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPiAwICYmXG4gICAgICAgICAgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPCBldmVudFBhZ2VTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIG9yaWdpbmFsUGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZWRlbmRvJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPCBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXRyb2NlZGVuZG8uJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnYmFja3dhcmQnO1xuICAgICAgICByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4ID09PSBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZWNhcnJlZ2FuZG8uJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAncmVsb2FkJztcbiAgICAgICAgcmVzZXREb2NzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHByZXZpb3VzUGFnZUluZGV4ID09PSB1bmRlZmluZWQgJiYgcGFnZUluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV2ZW50KSB0aGlzLnBhZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0lORVNQRVJBRE8hIENvbmRpw6fDo28gZGUgbmF2ZWdhw6fDo28gbsOjbyB0cmF0YWRhOicsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICBpZiAoZXZlbnQpIHRoaXMucGFnZUV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hdmlnYXRpb25EaXJlY3Rpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZChuYXZpZ2F0aW9uRGlyZWN0aW9uLCByZXNldERvY3MpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gY2FycmVnYXIgaXRlbnMgcGFnaW5hZG9zOicsIGVycm9yKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAob3JpZ2luYWxQYWdlU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IG9yaWdpbmFsUGFnZVNpemU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudCkgdGhpcy5wYWdlRXZlbnQgPSBldmVudDtcbiAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE91dHJvcyBtw6l0b2Rvc1xuXG4gIGFwcGx5RmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAvLyBTZW0gcGFnaW5hw6fDo29cbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gU3RyaW5nKHZhbHVlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgLy8gQ29tIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLmZpbHRlclN1YmplY3QubmV4dCh0aGlzLmZpbHRlclZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnb1RvRGV0YWlscyhyb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEuaXNOb3RDbGlja2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdXJsUGF0aCA9IHRoaXMuZGF0YS51cmwgfHwgdGhpcy5kYXRhLm5hbWU7XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKFxuICAgICAgdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbYC8ke3VybFBhdGh9YCwgcm93LmlkXSlcbiAgICApO1xuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UmVsYXRpb24ocGFyYW1zOiB7XG4gICAgaWQ6IGFueTtcbiAgICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gICAgbmV3UHJvcGVydHk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzbmFwc2hvdDogZmlyZXN0b3JlLkRvY3VtZW50U25hcHNob3Q8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgIHBhcmFtcy5pZCAhPT0gJycgJiZcbiAgICAgICAgcGFyYW1zLmlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFyYW1zLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYXJhbXMuY29sbGVjdGlvbiAhPT0gJydcbiAgICAgICkge1xuICAgICAgICBzbmFwc2hvdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuZmlyZXN0b3JlLmNvbGxlY3Rpb24ocGFyYW1zLmNvbGxlY3Rpb24pLmRvYyhwYXJhbXMuaWQpLmdldCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc25hcHNob3QgJiYgc25hcHNob3QuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgYXMgYW55O1xuICAgICAgICByZXR1cm4gZGF0YT8uW3BhcmFtcy5uZXdQcm9wZXJ0eV0gPz8gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUmVsYXRpb25zKCkge1xuICAgIGNvbnN0IHJlbGF0aW9uUHJvbWlzZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1uc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wucmVsYXRpb24pXG4gICAgICAuZmxhdE1hcCgoY29sKSA9PlxuICAgICAgICB0aGlzLml0ZW1zLm1hcChhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChjb2wucmVsYXRpb24pIHtcbiAgICAgICAgICAgIGl0ZW1bY29sLnByb3BlcnR5XSA9IGF3YWl0IHRoaXMuZ2V0UmVsYXRpb24oe1xuICAgICAgICAgICAgICBpZDogaXRlbVtjb2wucmVsYXRpb24uc291cmNlUHJvcGVydHldLFxuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2wucmVsYXRpb24udGFyZ2V0ZWRDb2xsZWN0aW9uLFxuICAgICAgICAgICAgICBuZXdQcm9wZXJ0eTogY29sLnJlbGF0aW9uLnRhcmdldGVkUHJvcGVydHkgfHwgY29sLnByb3BlcnR5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHJlbGF0aW9uUHJvbWlzZXMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UXVlcnlMZW5ndGgocGFyYW1zOiB7XG4gICAgaXRlbTogYW55O1xuICAgIHJlbGF0aW9uOiB7XG4gICAgICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gICAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgb3BlcmF0b3I6IFdoZXJlRmlsdGVyT3A7XG4gICAgICB2YWx1ZTogc3RyaW5nO1xuICAgIH07XG4gIH0pIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuZmlyZXN0b3JlXG4gICAgICAuY29sbGVjdGlvbihwYXJhbXMucmVsYXRpb24uY29sbGVjdGlvbilcbiAgICAgIC5yZWYud2hlcmUoXG4gICAgICAgIHBhcmFtcy5yZWxhdGlvbi5wcm9wZXJ0eSxcbiAgICAgICAgcGFyYW1zLnJlbGF0aW9uLm9wZXJhdG9yLFxuICAgICAgICBwYXJhbXMuaXRlbVtwYXJhbXMucmVsYXRpb24udmFsdWVdXG4gICAgICApXG4gICAgICAuZ2V0KCk7XG4gICAgcmV0dXJuIHNuYXBzaG90LnNpemU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRRdWVyeUxlbmd0aHMoKSB7XG4gICAgY29uc3QgbGVuZ3RoUHJvbWlzZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1uc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wucXVlcnlMZW5ndGgpXG4gICAgICAuZmxhdE1hcCgoY29sKSA9PlxuICAgICAgICB0aGlzLml0ZW1zLm1hcChhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChjb2wucXVlcnlMZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW1bY29sLnByb3BlcnR5XSA9IGF3YWl0IHRoaXMuZ2V0UXVlcnlMZW5ndGgoe1xuICAgICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgICByZWxhdGlvbjogY29sLnF1ZXJ5TGVuZ3RoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChsZW5ndGhQcm9taXNlcyk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckl0ZW1zKCkge1xuICAgIGlmICh0aGlzLmRhdGEuY29uZGl0aW9ucykge1xuICAgICAgdGhpcy5kYXRhLmNvbmRpdGlvbnMuZm9yRWFjaCgoY29uZCkgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBvcGVyYXRvckZ1bmN0aW9uID0gKHRoaXMudGFibGVTZXJ2aWNlLm9wZXJhdG9ycyBhcyBhbnkpW1xuICAgICAgICAgICAgY29uZC5vcGVyYXRvclxuICAgICAgICAgIF07XG4gICAgICAgICAgaWYgKG9wZXJhdG9yRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRvckZ1bmN0aW9uKFxuICAgICAgICAgICAgICBpdGVtW2NvbmQuZmlyZXN0b3JlUHJvcGVydHldLFxuICAgICAgICAgICAgICBjb25kLmRhc2hQcm9wZXJ0eVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBcnJhbmdlRnJvbUZpbHRlcnMoKTogQXJyYW5nZSB7XG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHNcbiAgICAgIC5mbGF0TWFwKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybiBbXTtcblxuICAgICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcblxuICAgICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGdyb3VwLmdldCgndHlwZUZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlKSByZXR1cm4gW107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgcHJvcGVydHk6IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5LFxuICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgY29uc3QgZmluYWwgPSBncm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xuICAgICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcbiAgICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGF0ZUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgaW5pdGlhbDogaW5pdGlhbERhdGUsXG4gICAgICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBncm91cC5nZXQoJ3NlbGVjdEl0ZW0nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJdGVtcykgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogaXRlbS52YWx1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICYmIChmLmZpbHRlcj8uZmlsdGVyaW5nICE9PSB1bmRlZmluZWQgfHwgZi5kYXRlRmlsdGVyKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyczogYWN0aXZlRmlsdGVycyxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbHRybyBkZSBkYXRhXG4gIGFzeW5jIHNlYXJjaChldmVudD86IEV2ZW50KSB7XG4gICAgLy8gUHJldmVuaXIgY29tcG9ydGFtZW50byBwYWRyw6NvIGRvIGZvcm11bMOhcmlvIGFvIHByZXNzaW9uYXIgRW50ZXJcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTb3J0LnZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RTb3J0LnZhbHVlLmFycmFuZ2UgPT09ICdhc2NlbmRpbmcnKSB7XG4gICAgICAgIHRoaXMuc29ydEJ5ID0ge1xuICAgICAgICAgIGZpZWxkOiB0aGlzLnNlbGVjdFNvcnQudmFsdWUucHJvcGVydHksXG4gICAgICAgICAgb3JkZXI6ICdhc2MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZS5hcnJhbmdlID09PSAnZGVzY2VuZGluZycpIHtcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB7XG4gICAgICAgICAgZmllbGQ6IHRoaXMuc2VsZWN0U29ydC52YWx1ZS5wcm9wZXJ0eSxcbiAgICAgICAgICBvcmRlcjogJ2Rlc2MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlbSBwYWdpbmHDp8OjbzogYXBsaWNhciBmaWx0cm9zIGNsaWVudC1zaWRlXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gQXR1YWxpemFyIGFycmFuZ2UgY29tIG9zIGZpbHRyb3MgYXRpdm9zXG4gICAgICB0aGlzLmFycmFuZ2UgPSB0aGlzLmJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVyc1RvRGF0YVNvdXJjZSgpO1xuICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZSA9XG4gICAgICAgIHRoaXMuZmlsdGVyc0Zvcm0ubGVuZ3RoID4gMFxuICAgICAgICAgID8gdGhpcy5maWx0ZXJzRm9ybS5hdCgwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA/PyAnJ1xuICAgICAgICAgIDogJyc7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29tIHBhZ2luYcOnw6NvOiBjb21wb3J0YW1lbnRvIG9yaWdpbmFsXG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG4gICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlID1cbiAgICAgICAgdGhpcy5maWx0ZXJzRm9ybS5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0aGlzLmZpbHRlcnNGb3JtLmF0KDApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID8/ICcnXG4gICAgICAgICAgOiAnJztcbiAgICAgIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xuICAgIGlmICh0aGlzLmZpbHRlclByZWRpY2F0ZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZmlsdGVyUHJlZGljYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY2xlYXIoKTtcbiAgICB0aGlzLmFkZEZpbHRlcigpO1xuICAgIHRoaXMuc2VsZWN0U29ydC5wYXRjaFZhbHVlKCcnKTtcbiAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgIG9yZGVyOiB0aGlzLmRhdGEuc29ydEJ5ID8gdGhpcy5kYXRhLnNvcnRCeS5vcmRlciA6ICdkZXNjJyxcbiAgICAgIGZpZWxkOiB0aGlzLmRhdGEuc29ydEJ5ID8gdGhpcy5kYXRhLnNvcnRCeS5maWVsZCA6ICdjcmVhdGVkQXQnLFxuICAgIH07XG5cbiAgICAvLyBTZW0gcGFnaW5hw6fDo286IHJlY2FycmVnYXIgaXRlbnMgb3JpZ2luYWlzXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gUmVzZXRhciBhcnJhbmdlIHBhcmEgdmFsb3JlcyBwYWRyw6NvXG4gICAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuaXRlbXNdO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlID0gJyc7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29tIHBhZ2luYcOnw6NvOiBjb21wb3J0YW1lbnRvIG9yaWdpbmFsXG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG4gICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlID0gJyc7XG4gICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE3DqXRvZG8gcMO6YmxpY28gcGFyYSByZWNhcnJlZ2FyIGEgdGFiZWxhXG4gIGFzeW5jIHJlbG9hZFRhYmxlKCkge1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEaXNwbGF5ZWRDb2x1bW5zKCkge1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2x1bW5Qcm9wZXJ0aWVzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgIHJldHVybiBjb2x1bW4ucHJvcGVydHk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBbXTtcbiAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcyA9IFtdO1xuXG4gICAgdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmlzRmlsdGVyYWJsZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXInLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pc1NvcnRhYmxlKSB7XG4gICAgICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnYXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogY3Jlc2NlbnRlJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZGVzY2VuZGluZycsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGRlY3Jlc2NlbnRlJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzRmlsdGVyYWJsZUJ5RGF0ZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXJCeURhdGUnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBmaWx0cm8gcG9yIGRhdGEnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMpXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PlxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7IC4uLm9wdGlvbiwgYXJyYW5nZTogJ2VxdWFscycgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgLy8gTcOpdG9kbyBwYXJhIGNvbWJpbmFyIGVzdGlsb3MgZG8gdG9vbHRpcFxuICBnZXRUb29sdGlwU3R5bGVzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGlmICh0aGlzLnRvb2x0aXBCZ1N0eWxlKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHN0eWxlcywgdGhpcy50b29sdGlwQmdTdHlsZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvb2x0aXBUZXh0U3R5bGUpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGVzLCB0aGlzLnRvb2x0aXBUZXh0U3R5bGUpO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgcGFyYSBjb250cm9sZSBkbyB0b29sdGlwXG4gIG9uQ2VsbE1vdXNlRW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBjb2w6IGFueSk6IHZvaWQge1xuICAgIC8vIFPDsyBtb3N0cmFyIHRvb2x0aXAgc2UgYSBjb2x1bmEgdGl2ZXIgY2hhckxpbWl0IGRlZmluaWRvXG4gICAgaWYgKCFjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFZhbHVlID0gdGhpcy5nZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpO1xuXG4gICAgLy8gU8OzIG1vc3RyYXIgdG9vbHRpcCBzZSBvIHZhbG9yIGNvbXBsZXRvIGZvciBtYWlvciBxdWUgbyBsaW1pdGVcbiAgICBpZiAoZnVsbFZhbHVlLmxlbmd0aCA8PSBjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ob3ZlcmVkQ2VsbCA9IHsgcm93LCBjb2wgfTtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gZnVsbFZhbHVlO1xuXG4gICAgLy8gQ29yIGRlIGZ1bmRvIGRvIHRvb2x0aXBcbiAgICBjb25zdCB0b29sdGlwQmdDb2xvciA9IGNvbC50b29sdGlwPy5jb2xvciB8fCAnYmctZ3JheS04MDAnO1xuICAgIGlmICh0b29sdGlwQmdDb2xvci5zdGFydHNXaXRoKCcjJykgfHwgdG9vbHRpcEJnQ29sb3Iuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgIHRoaXMudG9vbHRpcEJnQ29sb3IgPSAnJztcbiAgICAgIHRoaXMudG9vbHRpcEJnU3R5bGUgPSB7ICdiYWNrZ3JvdW5kLWNvbG9yJzogdG9vbHRpcEJnQ29sb3IgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwQmdDb2xvciA9IHRvb2x0aXBCZ0NvbG9yO1xuICAgICAgdGhpcy50b29sdGlwQmdTdHlsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ29yIGRvIHRleHRvIGRvIHRvb2x0aXBcbiAgICBjb25zdCB0b29sdGlwVGV4dENvbG9yID0gY29sLnRvb2x0aXA/LnRleHQgfHwgJ3RleHQtd2hpdGUnO1xuICAgIGlmIChcbiAgICAgIHRvb2x0aXBUZXh0Q29sb3Iuc3RhcnRzV2l0aCgnIycpIHx8XG4gICAgICB0b29sdGlwVGV4dENvbG9yLnN0YXJ0c1dpdGgoJ3JnYicpXG4gICAgKSB7XG4gICAgICB0aGlzLnRvb2x0aXBUZXh0Q29sb3IgPSAnJztcbiAgICAgIHRoaXMudG9vbHRpcFRleHRTdHlsZSA9IHsgY29sb3I6IHRvb2x0aXBUZXh0Q29sb3IgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwVGV4dENvbG9yID0gdG9vbHRpcFRleHRDb2xvcjtcbiAgICAgIHRoaXMudG9vbHRpcFRleHRTdHlsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5pciBwb3Npw6fDo28gZG8gdG9vbHRpcFxuICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID0ge1xuICAgICAgeDogZXZlbnQuY2xpZW50WCArIDEwLFxuICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgIH07XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIFRpbWVvdXQgcGFyYSBtb3N0cmFyIG8gdG9vbHRpcFxuICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5ob3ZlcmVkQ2VsbCAmJlxuICAgICAgICB0aGlzLmhvdmVyZWRDZWxsLnJvdyA9PT0gcm93ICYmXG4gICAgICAgIHRoaXMuaG92ZXJlZENlbGwuY29sID09PSBjb2xcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNob3dUb29sdGlwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCA1MDApO1xuICB9XG5cbiAgb25DZWxsTW91c2VMZWF2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgICAgdGhpcy50b29sdGlwVGltZW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93VG9vbHRpcCA9IGZhbHNlO1xuICAgIHRoaXMuaG92ZXJlZENlbGwgPSBudWxsO1xuICAgIHRoaXMudG9vbHRpcENvbnRlbnQgPSAnJztcbiAgICB0aGlzLnRvb2x0aXBCZ0NvbG9yID0gJ2JnLWdyYXktODAwJzsgLy8gUmVzZXRhciBwYXJhIHBhZHLDo29cbiAgICB0aGlzLnRvb2x0aXBCZ1N0eWxlID0gbnVsbDsgLy8gTGltcGFyIGVzdGlsbyBjdXN0b21pemFkb1xuICAgIHRoaXMudG9vbHRpcFRleHRDb2xvciA9ICd0ZXh0LXdoaXRlJzsgLy8gUmVzZXRhciBwYXJhIHBhZHLDo29cbiAgICB0aGlzLnRvb2x0aXBUZXh0U3R5bGUgPSBudWxsOyAvLyBMaW1wYXIgZXN0aWxvIGN1c3RvbWl6YWRvIGRvIHRleHRvXG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlS2V5KHJvdzogYW55LCBjb2w6IENvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3Qgcm93SWQgPSByb3cuaWQgfHwgcm93Ll9pZCB8fCBKU09OLnN0cmluZ2lmeShyb3cpO1xuICAgIHJldHVybiBgJHtyb3dJZH0tJHtjb2wucHJvcGVydHl9YDtcbiAgfVxuXG4gIGlzSW1hZ2VMb2FkaW5nKHJvdzogYW55LCBjb2w6IENvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0SW1hZ2VLZXkocm93LCBjb2wpO1xuICAgIHJldHVybiAhdGhpcy5pbWFnZUxvYWRpbmdTdGF0ZS5oYXMoa2V5KTtcbiAgfVxuXG4gIG9uSW1hZ2VMb2FkKHJvdzogYW55LCBjb2w6IENvbHVtbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0SW1hZ2VLZXkocm93LCBjb2wpO1xuICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3RhdGUuc2V0KGtleSwgdHJ1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkltYWdlRXJyb3IoZXZlbnQ6IGFueSwgcm93OiBhbnksIGNvbDogQ29sdW1uLCBkZWZhdWx0SW1hZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEltYWdlS2V5KHJvdywgY29sKTtcbiAgICB0aGlzLmltYWdlTG9hZGluZ1N0YXRlLnNldChrZXksIHRydWUpO1xuXG4gICAgaWYgKGRlZmF1bHRJbWFnZSkge1xuICAgICAgZXZlbnQudGFyZ2V0LnNyYyA9IGRlZmF1bHRJbWFnZTtcbiAgICAgIGV2ZW50LnRhcmdldC5vbmVycm9yID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNlbGxNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93VG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggKyAxMCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE3DqXRvZG9zIHBhcmEgaW52ZXJzw6NvIHZlcnRpY2FsIGRvcyB0YWJzXG4gIGdldFRhYkdyb3Vwcyh0YWJzOiBhbnlbXSk6IG51bWJlcltdIHtcbiAgICBpZiAoIXRhYnMgfHwgdGFicy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHRvdGFsR3JvdXBzID0gTWF0aC5jZWlsKHRhYnMubGVuZ3RoIC8gNik7XG4gICAgY29uc3QgZ3JvdXBzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8gQ3JpYXIgYXJyYXkgZGUgw61uZGljZXMgaW52ZXJ0aWRvcyAow7psdGltbyBncnVwbyBwcmltZWlybylcbiAgICBmb3IgKGxldCBpID0gdG90YWxHcm91cHMgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgZ3JvdXBzLnB1c2goaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwcztcbiAgfVxuXG4gIGdldFRhYkdyb3VwKHRhYnM6IGFueVtdLCBncm91cEluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgaWYgKCF0YWJzIHx8IHRhYnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBzdGFydEluZGV4ID0gZ3JvdXBJbmRleCAqIDY7XG4gICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4ICsgNiwgdGFicy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHRhYnMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICB9XG5cbiAgZ2V0UmVhbFRhYkluZGV4KGdyb3VwSW5kZXg6IG51bWJlciwgdGFiSW5kZXhJbkdyb3VwOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5kYXRhLnRhYnM/LnRhYnNEYXRhKSByZXR1cm4gMDtcbiAgICBjb25zdCB0b3RhbEdyb3VwcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEudGFicy50YWJzRGF0YS5sZW5ndGggLyA2KTtcbiAgICBjb25zdCByZWFsR3JvdXBJbmRleCA9IHRvdGFsR3JvdXBzIC0gMSAtIGdyb3VwSW5kZXg7XG4gICAgcmV0dXJuIHJlYWxHcm91cEluZGV4ICogNiArIHRhYkluZGV4SW5Hcm91cDtcbiAgfVxuXG4gIG9uVGFibGVTZWxlY3RlZChpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5kYXRhLnRhYnM/LnRhYnNEYXRhIHx8ICF0aGlzLmRhdGEudGFicy5tZXRob2QpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGhpcy5nZXRSZWFsVGFiSW5kZXgoaSwgaik7XG4gICAgY29uc3QgdGFiID0gdGhpcy5kYXRhLnRhYnMudGFic0RhdGFbdGhpcy5zZWxlY3RlZFRhYl07XG4gICAgaWYgKHRhYikge1xuICAgICAgdGhpcy5kYXRhLnRhYnMubWV0aG9kKHRhYiwgdGhpcy5zZWxlY3RlZFRhYik7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNUYWJTZWxlY3RlZChvcmlnaW5hbEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYiA9PT0gb3JpZ2luYWxJbmRleDtcbiAgfVxuXG4gIHNob3VsZFNob3dBY3Rpb25CdXR0b24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRhdGE/LmFjdGlvbkJ1dHRvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24obnVsbCkgPz8gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE3DqXRvZG8gcGFyYSBsaWRhciBjb20gZG93bmxvYWQgKGRpZmVyZW50ZSBwYXJhIHBhZ2luYWRvIGUgbsOjbyBwYWdpbmFkbylcbiAgaGFuZGxlRG93bmxvYWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvd25sb2FkVGFibGUpIHJldHVybjtcblxuICAgIC8vIFNlIG7Do28gaMOhIHBhZ2luYcOnw6NvLCB1c2FyIGRhZG9zIGZpbHRyYWRvcyBkbyBkYXRhU291cmNlXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gQXR1YWxpemFyIGZpbHRlcmVkSXRlbXMgY29tIG9zIGRhZG9zIGZpbHRyYWRvcyBkbyBkYXRhU291cmNlXG4gICAgICAvLyAocXVlIGrDoSBpbmNsdWkgZmlsdHJvIGRlIHRleHRvIGFwbGljYWRvIHZpYSBmaWx0ZXJQcmVkaWNhdGUpXG4gICAgICBpZiAodGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gWy4uLnRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGFdO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25zdHJ1aXIgYXJyYW5nZSBjb20gb3MgZmlsdHJvcyBhdGl2b3MgKHNlIGhvdXZlcilcbiAgICAgIGNvbnN0IGFycmFuZ2UgPSB0aGlzLmJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk7XG4gICAgICB0aGlzLmRvd25sb2FkVGFibGUoYXJyYW5nZSwgdGhpcy5kYXRhLmNvbmRpdGlvbnMgfHwgW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb2RvIHBhZ2luYWRvOiB1c2FyIGFycmFuZ2UgZXhpc3RlbnRlIChjb21wb3J0YW1lbnRvIG9yaWdpbmFsKVxuICAgICAgaWYgKHRoaXMuYXJyYW5nZSkge1xuICAgICAgICB0aGlzLmRvd25sb2FkVGFibGUodGhpcy5hcnJhbmdlLCB0aGlzLmRhdGEuY29uZGl0aW9ucyB8fCBbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeVByb3BlcnR5KF9pbmRleDogbnVtYmVyLCBjb2w6IENvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbC5wcm9wZXJ0eTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTZcIj5cbiAgICA8IS0tIFVOSUZJRUQgQ09OVFJPTCBQQU5FTDogRklMVEVSUywgU09SVCAmIEFDVElPTlMgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIGJvcmRlciBib3JkZXItZ3JheS0yMDAgYmctd2hpdGUgcC00IHNoYWRvdy1sZ1wiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgICAgKGRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgZGF0YS5hY3Rpb25CdXR0b24pXG4gICAgICBcIlxuICAgID5cbiAgICAgIDwhLS0gUEFORUwgSEVBREVSOiBUaXRsZSBhbmQgQ3VzdG9tIEFjdGlvbiAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtYi00IGZsZXggZmxleC1jb2wgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IGJvcmRlci1iLTIgYm9yZGVyLWdyYXktMjAwIHBiLTQgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBMZWZ0IFNpZGU6IFRpdGxlICYgTWFpbiBBY3Rpb24gQnV0dG9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbHRlciB0ZXh0LXhsIHRleHQtYmx1ZS01MDBcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktNzAwXCJcbiAgICAgICAgICAgICAgPkZpbHRyb3MgZSBBw6fDtWVzPC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbiAmJiBkYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb25cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgIChkYXRhLmFjdGlvbkJ1dHRvbi5jb2xvckNsYXNzIHx8ICdiZy1ibHVlLTUwMCcpICtcbiAgICAgICAgICAgICAgJyBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgaG92ZXI6b3BhY2l0eS03MCdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJkYXRhLmFjdGlvbkJ1dHRvbi5yb3V0ZXJMaW5rXCJcbiAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgZGF0YS5hY3Rpb25CdXR0b24ubWV0aG9kID8gZGF0YS5hY3Rpb25CdXR0b24ubWV0aG9kKCRldmVudCkgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25CdXR0b24uaWNvblwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICB7eyBkYXRhLmFjdGlvbkJ1dHRvbi5sYWJlbCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNPUlQgRklFTEQgKEludGVncmF0ZWQgd2l0aCBmaWx0ZXJzKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgKm5nSWY9XCJzb3J0YWJsZURyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0zIHAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0LWFscGhhLWRvd24gdGV4dC1jeWFuLTYwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj5PcmRlbmFyIHBvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lLi4uXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdFNvcnRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc29ydGFibGVEcm9wZG93bkl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0LWFscGhhLWRvd24gdGV4dC1jeWFuLTYwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGSUxURVJTIENPTlRFTlQgKFdJVEggUkVGSU5FTUVOVFMpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgc3BhY2UteS0zXCIgKm5nSWY9XCJmaWx0ZXJzRm9ybS5jb250cm9scy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbZm9ybUdyb3VwXT1cIiRhbnkoZmlsdGVyR3JvdXApXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyR3JvdXAgb2YgZmlsdGVyc0Zvcm0uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0zIHAtMlwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIEZJTFRFUiBUWVBFIFNFTEVDVE9SIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlRpcG8gZGUgZmlsdHJvPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgbyB0aXBvLi4uXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RGaWx0ZXJcIlxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3RGaWx0ZXJDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaXRlbS5pY29uIHx8ICdmYSBmYS1maWx0ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc20gdGV4dC1ibHVlLTUwMFwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFRFWFQgRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPT09ICdmaWx0ZXInXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICAgIFwiRmlsdHJhclwiXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVGaWx0ZXJcIlxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJEaWdpdGUgcGFyYSBmaWx0cmFyLi4uXCJcbiAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIERST1BET1dOIEZJTFRFUiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlICYmXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApXG4gICAgICAgICAgICAgICAgLmdldCgnc2VsZWN0RmlsdGVyJylcbiAgICAgICAgICAgICAgICA/LnZhbHVlLmhhc093blByb3BlcnR5KCdpdGVtcycpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tcbiAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoXCJzZWxlY3RGaWx0ZXJcIik/LnZhbHVlPy50aXRsZSB8fFxuICAgICAgICAgICAgICAgICAgXCJTZWxlY2lvbmVcIlxuICAgICAgICAgICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lLi4uXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSBvZiAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIC5pdGVtc1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEQVRFIEZJTFRFUiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1pbi13LVszNDBweF0gZmxleC1hdXRvXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID09PVxuICAgICAgICAgICAgICAnZmlsdGVyQnlEYXRlJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1zdHJldGNoIGdhcC0zIHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEluaWNpYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRGF0ZUlucHV0KCRldmVudCwgJ2luaXRpYWxEYXRlJywgaSlcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5pdGlhbERhdGVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEZpbmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRGF0ZUlucHV0KCRldmVudCwgJ2ZpbmFsRGF0ZScsIGkpXCJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbERhdGVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJFTU9WRSBGSUxURVIgQlVUVE9OIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJzRm9ybS5sZW5ndGggPiAxXCIgY2xhc3M9XCJtbC1hdXRvIGZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihpKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTEwIHctMTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0zMDAgaG92ZXI6YmctcmVkLTEwMFwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZW1vdmVyIGZpbHRyb1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggdGV4dC1yZWQtNTAwIGhvdmVyOnRleHQtcmVkLTYwMFwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBBTkVMIEZPT1RFUjogQWRkIEZpbHRlciAmIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIi1tYi0yIGZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCBwdC00XCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBBZGQgRmlsdGVyIEJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInRyYW5zZm9ybSByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWJsdWUtMzAwIGJnLWJsdWUtNTAgcHgtNiBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ibHVlLTYwMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgaG92ZXI6LXRyYW5zbGF0ZS15LTAuNSBob3Zlcjpib3JkZXItYmx1ZS00MDAgaG92ZXI6YmctYmx1ZS0xMDAgaG92ZXI6c2hhZG93LW1kXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGljaW9uYXIgbm92byBmaWx0cm9cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cyBtci0yXCI+PC9pPlxuICAgICAgICAgICAgQWRpY2lvbmFyIEZpbHRyb1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJpZ2h0IFNpZGU6IFNlYXJjaCwgUmVzZXQsIEV4cG9ydCAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTMgc2VsZi1zdGFydCBzbTpzZWxmLWF1dG9cIlxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICB0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IHRydWUgfHwgdGhpcy5oYXNTb3J0YWJsZUNvbHVtbiA9PT0gdHJ1ZVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoKClcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNjAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JlZW4tNzAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBcGxpY2FyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgUGVzcXVpc2FyXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctcmVkLTUwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLXJlZC02MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkxpbXBhciBmaWx0cm9zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1yZWRvLWFsdFwiPjwvaT5cbiAgICAgICAgICAgIFJlc2V0YXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5kb3dubG9hZCAhPT0gZmFsc2UgJiYgZG93bmxvYWRUYWJsZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctb3JhbmdlLTUwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLW9yYW5nZS02MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkV4cG9ydGFyIFRhYmVsYVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhLmxlbmd0aCA8PSAwXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAkYW55KGFycmFuZ2UpICYmIGRvd25sb2FkVGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gZG93bmxvYWRUYWJsZSgkYW55KGFycmFuZ2UpLCBkYXRhLmNvbmRpdGlvbnMgfHwgW10pXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICBFeHBvcnRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBVTklGSUVEIENPTlRST0wgUEFORUwgKGZvciBub24tcGFnaW5hdGVkIHRhYmxlcyk6IFNFQVJDSCwgU09SVCAmIEZJTFRFUlMgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIGJvcmRlciBib3JkZXItZ3JheS0yMDAgYmctd2hpdGUgcC00IHNoYWRvdy1sZ1wiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlICYmXG4gICAgICAgIChoYXNGaWx0ZXJhYmxlQ29sdW1uID09PSB0cnVlIHx8XG4gICAgICAgICAgc29ydGFibGVEcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICBkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbilcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPCEtLSBQQU5FTCBIRUFERVI6IFRpdGxlIGFuZCBDdXN0b20gQWN0aW9uIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1iLTQgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLWItMiBib3JkZXItZ3JheS0yMDAgcGItNCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8IS0tIExlZnQgU2lkZTogVGl0bGUgJiBNYWluIEFjdGlvbiBCdXR0b24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyIHRleHQteGwgdGV4dC1ibHVlLTUwMFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZ3JheS03MDBcIlxuICAgICAgICAgICAgICA+RmlsdHJvcyBlIEHDp8O1ZXM8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImRhdGEuYWN0aW9uQnV0dG9uICYmIGRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvblwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgKGRhdGEuYWN0aW9uQnV0dG9uLmNvbG9yQ2xhc3MgfHwgJ2JnLWJsdWUtNTAwJykgK1xuICAgICAgICAgICAgICAnIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBob3ZlcjpvcGFjaXR5LTcwJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImRhdGEuYWN0aW9uQnV0dG9uLnJvdXRlckxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIHt7IGRhdGEuYWN0aW9uQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU0lNUExFIFNFQVJDSCAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtYi00XCJcbiAgICAgICAgKm5nSWY9XCJoYXNGaWx0ZXJhYmxlQ29sdW1uID09PSB0cnVlICYmIGRhdGEuc2hvd1NpbXBsZVNlYXJjaCAhPT0gZmFsc2VcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggdGV4dC1ibHVlLTUwMFwiPjwvaT5cbiAgICAgICAgICAgIEJ1c2NhclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5dXApPVwiYXBwbHlGaWx0ZXIoZmlsdGVySW5wdXQudmFsdWUpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGlnaXRlIHBhcmEgZmlsdHJhci4uLlwiXG4gICAgICAgICAgICAjZmlsdGVySW5wdXRcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggY2xhc3M9XCJ0ZXh0LWdyYXktNTAwXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNPUlQgRklFTEQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItNFwiICpuZ0lmPVwic29ydGFibGVEcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0LWFscGhhLWRvd24gdGV4dC1jeWFuLTYwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj5PcmRlbmFyIHBvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lLi4uXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdFNvcnRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc29ydGFibGVEcm9wZG93bkl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0LWFscGhhLWRvd24gdGV4dC1jeWFuLTYwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGSUxURVJTIFBBTkVMIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8IS0tIEZJTFRFUlMgQ09OVEVOVCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgc3BhY2UteS0zXCIgKm5nSWY9XCJmaWx0ZXJzRm9ybS5jb250cm9scy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCIkYW55KGZpbHRlckdyb3VwKVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyR3JvdXAgb2YgZmlsdGVyc0Zvcm0uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gRklMVEVSIFRZUEUgU0VMRUNUT1IgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGlwbyBkZSBmaWx0cm88L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgbyB0aXBvLi4uXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0RmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEF2YWlsYWJsZUZpbHRlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmljb24gfHwgJ2ZhIGZhLWZpbHRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gVEVYVCBGSUxURVIgLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID09PVxuICAgICAgICAgICAgICAgICdmaWx0ZXInXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBcIkZpbHRyYXJcIlxuICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJEaWdpdGUgcGFyYSBmaWx0cmFyLi4uXCJcbiAgICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBEUk9QRE9XTiBGSUxURVIgLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cClcbiAgICAgICAgICAgICAgICAgIC5nZXQoJ3NlbGVjdEZpbHRlcicpXG4gICAgICAgICAgICAgICAgICA/LnZhbHVlLmhhc093blByb3BlcnR5KCdpdGVtcycpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgXCJTZWxlY2lvbmVcIlxuICAgICAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lLi4uXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSBvZiAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLml0ZW1zXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIERBVEUgRklMVEVSIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13LVszNDBweF0gZmxleC1hdXRvXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT1cbiAgICAgICAgICAgICAgICAnZmlsdGVyQnlEYXRlJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLXN0cmV0Y2ggZ2FwLTMgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEluaWNpYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRGF0ZUlucHV0KCRldmVudCwgJ2luaXRpYWxEYXRlJywgaSlcIlxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkRhdGVGaWx0ZXJDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluaXRpYWxEYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkRhdGEgRmluYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRGF0ZUlucHV0KCRldmVudCwgJ2ZpbmFsRGF0ZScsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25EYXRlRmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbERhdGVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkREL01NL0FBQUFcIlxuICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUkVNT1ZFIEZJTFRFUiBCVVRUT04gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyc0Zvcm0ubGVuZ3RoID4gMVwiIGNsYXNzPVwibWwtYXV0byBmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC0xMCB3LTEwIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMzAwIGhvdmVyOmJnLXJlZC0xMDBcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZW1vdmVyIGZpbHRyb1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIHRleHQtcmVkLTUwMCBob3Zlcjp0ZXh0LXJlZC02MDBcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUEFORUwgRk9PVEVSOiBBZGQgRmlsdGVyICYgQWN0aW9ucyAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiLW1iLTIgZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIHB0LTRcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBBZGQgRmlsdGVyIEJ1dHRvbiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidHJhbnNmb3JtIHJvdW5kZWQtZnVsbCBib3JkZXItMiBib3JkZXItYmx1ZS0zMDAgYmctYmx1ZS01MCBweC02IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWJsdWUtNjAwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCBob3ZlcjotdHJhbnNsYXRlLXktMC41IGhvdmVyOmJvcmRlci1ibHVlLTQwMCBob3ZlcjpiZy1ibHVlLTEwMCBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQWRpY2lvbmFyIG5vdm8gZmlsdHJvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzIG1yLTJcIj48L2k+XG4gICAgICAgICAgICAgIEFkaWNpb25hciBGaWx0cm9cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0zIHNlbGYtc3RhcnQgc206c2VsZi1hdXRvXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID09PSB0cnVlXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1ncmVlbi02MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmVlbi03MDBcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQXBsaWNhciBmaWx0cm9zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+XG4gICAgICAgICAgICAgIFBlc3F1aXNhclxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctcmVkLTUwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLXJlZC02MDBcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTGltcGFyIGZpbHRyb3NcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1yZWRvLWFsdFwiPjwvaT5cbiAgICAgICAgICAgICAgUmVzZXRhclxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmRvd25sb2FkICE9PSBmYWxzZSAmJiBkb3dubG9hZFRhYmxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJnLW9yYW5nZS01MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1vcmFuZ2UtNjAwXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0YXIgVGFiZWxhXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhLmxlbmd0aCA8PSAwXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVEb3dubG9hZCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgRXhwb3J0YXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJteC1hdXRvIGZsZXggZmxleC1jb2xcIlxuICAgICAgICAqbmdJZj1cImRhdGEudGFicyAmJiBkYXRhLnRhYnMudGFic0RhdGEgJiYgZGF0YS50YWJzLnRhYnNEYXRhLmxlbmd0aCA+IDBcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENhbGN1bGFyIHF1YW50b3MgZ3J1cG9zIGRlIDYgdGFicyBleGlzdGVtIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgZ3JvdXBJbmRleCBvZiBnZXRUYWJHcm91cHMoZGF0YS50YWJzLnRhYnNEYXRhKTtcbiAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm14LWF1dG8gZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICBsZXQgdGFiIG9mIGdldFRhYkdyb3VwKGRhdGEudGFicy50YWJzRGF0YSwgZ3JvdXBJbmRleCk7XG4gICAgICAgICAgICAgICAgbGV0IGogPSBpbmRleFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXItMiBib3JkZXItZ3JheS0zMDAgYmctZ3JheS0yMDAgcHgtNCBweS0yIGZvbnQtbWVkaXVtIHRyYW5zaXRpb24gaG92ZXI6YnJpZ2h0bmVzcy05NVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICBpc1RhYlNlbGVjdGVkKGdldFJlYWxUYWJJbmRleChpLCBqKSlcbiAgICAgICAgICAgICAgICAgICAgPyAnYm9yZGVyLWItMCBicmlnaHRuZXNzLTExMCdcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGFibGVTZWxlY3RlZChpLCBqKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0YWIubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWIuY291bnRlciAhPT0gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMiB0ZXh0LXhzIGZvbnQtYm9sZFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0YWIuY291bnRlckNsYXNzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyB0YWIuY291bnRlciB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4IHctZnVsbCBvdmVyZmxvdy14LWF1dG8gcm91bmRlZC14bCB0YWJsZS1jb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8dGFibGVcbiAgICAgICAgICBtYXQtdGFibGVcbiAgICAgICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgICAgICAgICBtYXRTb3J0XG4gICAgICAgICAgI3NvcnQ9XCJtYXRTb3J0XCJcbiAgICAgICAgICBtYXRTb3J0QWN0aXZlPVwiY3JlYXRlZEF0XCJcbiAgICAgICAgICBtYXRTb3J0RGlyZWN0aW9uPVwiZGVzY1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGRhdGEuZGlzcGxheWVkQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCJcbiAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7IGNvbC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgPCEtLSBJRiBUSEUgQ09MVU1OIElTIE5PVCBTT1JUQUJMRSwgVEhFTiBET04nVCBTSE9XIFRIRSBTT1JUIEJVVFRPTlMgLS0+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5pc1NvcnRhYmxlIHx8IGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjb2wudGl0bGUgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPCEtLSBJRiBUSEUgQ09MVU1OIElTIFNPUlRBQkxFLCBUSEVOIFNIT1cgVEhFIFNPUlQgQlVUVE9OUyAtLT5cbiAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaXNTb3J0YWJsZSAmJiBkYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICAgICBtYXQtc29ydC1oZWFkZXJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGNvbC50aXRsZSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5tZXRob2QgPyBjb2wubWV0aG9kKHJvdykgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkNlbGxNb3VzZUVudGVyKCRldmVudCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkNlbGxNb3VzZUxlYXZlKClcIlxuICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25DZWxsTW91c2VNb3ZlKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBJRiBUSEUgQ09MVU1OIE1VU1QgQkUgRElTUExBWUVEIC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbC5pbWFnZSAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoYXJMaW1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sLnByb3BlcnR5XSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sLnByb3BlcnR5XS5sZW5ndGggPiBjb2wuY2hhckxpbWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB3aXRoaW5MaW1pdFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJyb3dbY29sLnByb3BlcnR5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgJiYgaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImNvbC5oYXNMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAhPT0gdHJ1ZSAmJiAhaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2l0aGluTGltaXQ+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICYmIGlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiY29sLmhhc0xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICE9PSB0cnVlICYmICFpc1N0cmluZyhjb2wuaGFzTGluaylcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0gSU1BR0UgLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICAgICAgICAgIDwhLS0gSW1hZ2VtIGNvbSBsb2FkaW5nIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbC5pbWFnZSAmJiBjb2wuaW1hZ2UucGF0aCAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0ltYWdlTG9hZGluZyhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMzJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgbS1hdXRvXCJcbiAgICAgICAgICAgICAgICAgID48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImNvbC5pbWFnZS5wYXRoICsgJy8nICsgcm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2wuaW1hZ2UuY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3BhY2l0eS0wXT1cImlzSW1hZ2VMb2FkaW5nKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgICAgIChsb2FkKT1cIm9uSW1hZ2VMb2FkKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkltYWdlRXJyb3IoJGV2ZW50LCByb3csIGNvbCwgY29sLmltYWdlLmRlZmF1bHQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEltYWdlbSBjb20gVVJMIGNvbXBsZXRhIGUgbG9hZGluZyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjb2wuaW1hZ2UgJiYgY29sLmltYWdlLnVybCAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0ltYWdlTG9hZGluZyhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMzJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgbS1hdXRvXCJcbiAgICAgICAgICAgICAgICAgID48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cInJvd1tjb2wucHJvcGVydHldXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmltYWdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wYWNpdHktMF09XCJpc0ltYWdlTG9hZGluZyhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgICAobG9hZCk9XCJvbkltYWdlTG9hZChyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25JbWFnZUVycm9yKCRldmVudCwgcm93LCBjb2wsIGNvbC5pbWFnZS5kZWZhdWx0KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaWNvbkNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpY29uQ2xhc3Mgb2YgY29sLmljb25DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3MuYnV0dG9uTWV0aG9kXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGljb25DbGFzcy5idXR0b25NZXRob2Qocm93LCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImljb25DbGFzcy5jbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzcy5jb25kaXRpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGljb25DbGFzcy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkYW55KGljb25DbGFzcy5jb25kaXRpb24pKHJvdykpXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgaWNvbkNsYXNzLnRleHQgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uUHJvcGVydGllc1wiPjwvdHI+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdleGFtcGxlLWVsZW1lbnQtcm93JzogZGF0YS5pc05vdENsaWNrYWJsZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgJ2V4YW1wbGUtZWxlbWVudC1yb3cgY3Vyc29yLXBvaW50ZXInOiAhZGF0YS5pc05vdENsaWNrYWJsZVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uUHJvcGVydGllc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0RldGFpbHMocm93KVwiXG4gICAgICAgICAgPjwvdHI+XG5cbiAgICAgICAgICA8IS0tIFJPVyBTSE9XTiBXSEVOIFRIRVJFIElTIE5PIE1BVENISU5HIERBVEEuIC0tPlxuICAgICAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIShpc0xvYWRpbmckIHwgYXN5bmMpXCIgY2xhc3M9XCJtYXQtY2VsbCBwLTRcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgICBOZW5odW0gcmVzdWx0YWRvIGVuY29udHJhZG8gcGFyYSBhIGJ1c2NhXG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cImlzTG9hZGluZyQgfCBhc3luY1wiPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdG9yLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgICAgICAjcGFnaW5hdG9yXG4gICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIlsyNSwgNTAsIDEwMF1cIlxuICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgIFtsZW5ndGhdPVwidG90YWxJdGVtc1wiXG4gICAgICAgICAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCBwYWdlIG9mIHBlcmlvZGljIGVsZW1lbnRzXCJcbiAgICAgICAgICAgIChwYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2hpZGUtbGVuZ3RoJzpcbiAgICAgICAgICAgICAgICBbJ2ZpbHRlcicsICdmaWx0ZXJCeURhdGUnLCAnZXF1YWxzJ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlXG4gICAgICAgICAgICAgICAgKSB8fCB0aGlzLmRhdGEuZmlsdGVyRm4sXG4gICAgICAgICAgICAgICdoaWRlLW5leHQtYnV0dG9uJzogIWhhc05leHRQYWdlICYmIGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgJ2hpZGUtbGFzdC1idXR0b24nOlxuICAgICAgICAgICAgICAgICghaGFzTmV4dFBhZ2UgJiYgZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlKSB8fCB0aGlzLmRhdGEuZmlsdGVyRm5cbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L21hdC1wYWdpbmF0b3I+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgIShpc0xvYWRpbmckIHwgYXN5bmMpICYmXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U/LmRhdGEgJiZcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgZGF0YT8uZmlsdGVyRm5cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2UtbnVtYmVyLWRpc3BsYXlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGN1cnJlbnRQYWdlTnVtYmVyIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVE9PTFRJUCBQRVJTT05BTElaQURPIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93VG9vbHRpcFwiXG4gICAgY2xhc3M9XCJmaXhlZCB6LTUwIG1heC13LW1kIGJyZWFrLXdvcmRzIHJvdW5kZWQtbGcgcHgtMyBweS0yIHRleHQtc20gc2hhZG93LWxnXCJcbiAgICBbbmdDbGFzc109XCJcbiAgICAgICh0b29sdGlwQmdDb2xvciB8fCAnYmctZ3JheS04MDAnKSArXG4gICAgICAnICcgK1xuICAgICAgKHRvb2x0aXBUZXh0Q29sb3IgfHwgJ3RleHQtd2hpdGUnKVxuICAgIFwiXG4gICAgW25nU3R5bGVdPVwiZ2V0VG9vbHRpcFN0eWxlcygpXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJ0b29sdGlwUG9zaXRpb24ueFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJ0b29sdGlwUG9zaXRpb24ueVwiXG4gICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIidub25lJ1wiXG4gID5cbiAgICB7eyB0b29sdGlwQ29udGVudCB9fVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|