cilog-lib 0.6.1 → 0.7.0
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/helpers/interfaces/grille.interface.mjs +1 -1
- package/esm2020/lib/views/table/table.component.mjs +17 -4
- package/fesm2015/cilog-lib.mjs +16 -3
- package/fesm2015/cilog-lib.mjs.map +1 -1
- package/fesm2020/cilog-lib.mjs +16 -3
- package/fesm2020/cilog-lib.mjs.map +1 -1
- package/lib/helpers/interfaces/grille.interface.d.ts +3 -0
- package/lib/views/table/table.component.d.ts +1 -0
- package/package.json +1 -1
|
@@ -301,14 +301,27 @@ export class CilogTableComponent {
|
|
|
301
301
|
this.onFilter.emit({ column: this.filterCol, value: this.filterValue, filteredValue: this.table.filteredValue });
|
|
302
302
|
}
|
|
303
303
|
isModeCheckboxSelection() {
|
|
304
|
-
return
|
|
304
|
+
return this.options.selectable == true && this.options.modeSelection != null && this.options.modeSelection == ModeSelection.Checkbox;
|
|
305
|
+
}
|
|
306
|
+
getTotal(col) {
|
|
307
|
+
if (col.displayTotal && col.type == ColType.Number) {
|
|
308
|
+
let values = this.table.filteredValue != null ? this.table.filteredValue : this.values;
|
|
309
|
+
let total = 0;
|
|
310
|
+
values.forEach(val => {
|
|
311
|
+
total += (val[col.id].value != null ? val[col.id].value : 0);
|
|
312
|
+
});
|
|
313
|
+
return total.toLocaleString('fr-FR', { maximumFractionDigits: 2 });
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
305
318
|
}
|
|
306
319
|
}
|
|
307
320
|
CilogTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: CilogTableComponent, deps: [{ token: i1.ConfirmationService }, { token: i1.FilterService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
308
|
-
CilogTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: CilogTableComponent, selector: "cilog-table", inputs: { columns: "columns", values: "values", options: "options", loading: "loading" }, outputs: { columnsChange: "columnsChange", valuesChange: "valuesChange", onEdit: "onEdit", onEditInit: "onEditInit", onDelete: "onDelete", onSelect: "onSelect", onUnselect: "onUnselect", onFilter: "onFilter", onSort: "onSort", onPage: "onPage" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }], ngImport: i0, template: "<p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeEdition() && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"options.scrollHeight != null ? options.scrollHeight : null\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll != null && options.scrollHeight != null ? true : false\"\r\n [virtualRowHeight]=\"35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [groupRowsByOrder]=\"0\">\r\n\r\n <!-- Header -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\">\r\n \r\n </th>\r\n <th *ngFor=\"let col of columns\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'centerText' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\">\r\n <span>{{ col.libelle }}</span>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null\" [field]=\"col.id\"></p-sortIcon>\r\n </th>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\">\r\n\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <input pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"checkType('Date', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-calendar dateFormat=\"dd/mm/yy\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"checkType('Number', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-inputNumber mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Groupheader -->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"row_grouping\">\r\n <td [attr.colspan]=\"columns.length + 1\">\r\n <span class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</span>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable || isModeEdition()\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\" class=\"cellDelete\">\r\n <p-tableCheckbox [value]=\"rowData\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\" />\r\n </td>\r\n <td *ngIf=\"checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</span>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n itemSize=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</span>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | number }}</span>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n dateFormat=\"dd/mm/yy\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: 'dd/MM/yyyy' }}</span>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl>\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</span>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"checkType('Image', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"checkType('Button', col)\"\r\n class=\"paddingCell centerText\"\r\n [ngStyle]=\"{ 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</span>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n style=\"justify-content: center;\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\" pInputText type=\"text\" value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\" readonly>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</span>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-tag [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n</p-table>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-thead>tr>th>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .p-datatable-tbody>tr>td>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .row_grouping{background:#faeada!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important}:host ::ng-deep .p-datatable .p-sortable-column.p-highlight{color:#2196f3!important}:host ::ng-deep .p-datatable .p-sortable-column.p-highlight .p-sortable-column-icon{color:#2196f3!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding-bottom:8px!important;padding-top:8px!important;font-weight:600!important;color:#495057!important;background:#dedddd!important;overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .p-datatable-tbody>tr{height:35px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;min-width:0!important;width:1px}:host ::ng-deep .centerText{justify-content:center!important}:host ::ng-deep .p-button{padding-top:1px;padding-bottom:1px}:host ::ng-deep .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep p-calendar,:host ::ng-deep p-inputNumber,:host ::ng-deep p-dropdown,:host ::ng-deep p-selectButton,:host ::ng-deep p-multiselect{width:100%!important}:host ::ng-deep .p-calendar{width:100%!important}:host ::ng-deep .p-inputtext{width:100%!important;height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{width:100%;height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{width:100%;padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{width:100%;height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown{width:100%;vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect{width:100%;vertical-align:middle}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}@media screen and (max-width: 650px){:host ::ng-deep .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable-tfoot>tr>td{display:none!important;width:inherit!important}:host ::ng-deep .p-datatable-tbody>tr{border:2px solid rgba(0,0,0,.12);flex-direction:column;height:inherit!important;padding-top:12px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:0!important;flex-basis:auto!important;width:100%!important}:host ::ng-deep td .p-column-title{padding:.4rem;min-width:35%;display:inline-block!important;margin:-.4rem 1rem -.4rem -.4rem;font-weight:700}:host ::ng-deep .centerText{justify-content:inherit!important}}\n"], components: [{ type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i3.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i4.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i2.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { type: i6.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear"] }, { type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { type: i8.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabelledBy"], outputs: ["onChange"] }, { type: i9.Tag, selector: "p-tag", inputs: ["styleClass", "style", "severity", "value", "icon", "rounded"] }], directives: [{ type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.InputText, selector: "[pInputText]" }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.RowGroupHeader, selector: "[pRowGroupHeader]" }, { type: i2.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { type: i2.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i14.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }], pipes: { "number": i10.DecimalPipe, "date": i10.DatePipe } });
|
|
321
|
+
CilogTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: CilogTableComponent, selector: "cilog-table", inputs: { columns: "columns", values: "values", options: "options", loading: "loading" }, outputs: { columnsChange: "columnsChange", valuesChange: "valuesChange", onEdit: "onEdit", onEditInit: "onEditInit", onDelete: "onDelete", onSelect: "onSelect", onUnselect: "onUnselect", onFilter: "onFilter", onSort: "onSort", onPage: "onPage" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }], ngImport: i0, template: "<p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeEdition() && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"options.scrollHeight != null ? options.scrollHeight : null\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll != null && options.scrollHeight != null ? true : false\"\r\n [virtualRowHeight]=\"35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [groupRowsByOrder]=\"0\">\r\n\r\n <!-- HEADER -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <!-- HEADERS -->\r\n <tr class=\"rowHeader\">\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\">\r\n\r\n </th>\r\n <th *ngFor=\"let col of columns\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'centerText' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\">\r\n <span>{{ col.libelle }}</span>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null\" [field]=\"col.id\"></p-sortIcon>\r\n </th>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\" class=\"rowFilter\">\r\n\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <input pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"checkType('Date', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-calendar dateFormat=\"dd/mm/yy\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"checkType('Number', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-inputNumber mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- TOTAL -->\r\n <tr *ngIf=\"options.rowTotal\" class=\"rowTotal\">\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\"></th>\r\n <th *ngFor=\"let col of columns\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'centerText' : true }\">\r\n <span>{{ getTotal(col) }}</span>\r\n </th>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Groupheader -->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"rowGrouping\">\r\n <td [attr.colspan]=\"columns.length + 1\">\r\n <span class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</span>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable || isModeEdition()\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\" class=\"cellDelete\">\r\n <p-tableCheckbox [value]=\"rowData\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\" />\r\n </td>\r\n <td *ngIf=\"checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color' : rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</span>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n itemSize=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</span>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | number }}</span>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n dateFormat=\"dd/mm/yy\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: 'dd/MM/yyyy' }}</span>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl>\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</span>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"checkType('Image', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"checkType('Button', col)\"\r\n class=\"paddingCell centerText\"\r\n [ngStyle]=\"{ 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</span>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n style=\"justify-content: center;\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\" pInputText type=\"text\" value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\" readonly>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</span>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-tag [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n</p-table>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!important}:host ::ng-deep .rowHeader>th{background-color:#795548!important}:host ::ng-deep .rowHeader>th span{color:#fff!important}:host ::ng-deep .rowHeader>th i{color:#fff!important}:host ::ng-deep .rowFilter>th{background-color:#795548!important}:host ::ng-deep .rowGrouping{background:#faeada!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-thead>tr>th>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .p-datatable-tbody>tr>td>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding-bottom:8px!important;padding-top:8px!important;font-weight:600!important;color:#495057!important;overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important;height:35px!important}:host ::ng-deep .p-datatable-tbody>tr{height:35px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;min-width:0!important;width:1px}:host ::ng-deep .centerText{justify-content:center!important}:host ::ng-deep .p-button{padding-top:1px;padding-bottom:1px}:host ::ng-deep .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep p-calendar,:host ::ng-deep p-inputNumber,:host ::ng-deep p-dropdown,:host ::ng-deep p-selectButton,:host ::ng-deep p-multiselect{width:100%!important}:host ::ng-deep .p-calendar{width:100%!important}:host ::ng-deep .p-inputtext{width:100%!important;height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{width:100%;height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{width:100%;padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{width:100%;height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown{width:100%;vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect{width:100%;vertical-align:middle}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}@media screen and (max-width: 650px){:host ::ng-deep .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable-tfoot>tr>td{display:none!important;width:inherit!important}:host ::ng-deep .p-datatable-tbody>tr{border:2px solid rgba(0,0,0,.12);flex-direction:column;height:inherit!important;padding-top:12px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:0!important;flex-basis:auto!important;width:100%!important}:host ::ng-deep td .p-column-title{padding:.4rem;min-width:35%;display:inline-block!important;margin:-.4rem 1rem -.4rem -.4rem;font-weight:700}:host ::ng-deep .centerText{justify-content:inherit!important}}\n"], components: [{ type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i3.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i4.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i2.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { type: i6.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear"] }, { type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { type: i8.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabelledBy"], outputs: ["onChange"] }, { type: i9.Tag, selector: "p-tag", inputs: ["styleClass", "style", "severity", "value", "icon", "rounded"] }], directives: [{ type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.InputText, selector: "[pInputText]" }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.RowGroupHeader, selector: "[pRowGroupHeader]" }, { type: i2.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { type: i2.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i14.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }], pipes: { "number": i10.DecimalPipe, "date": i10.DatePipe } });
|
|
309
322
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: CilogTableComponent, decorators: [{
|
|
310
323
|
type: Component,
|
|
311
|
-
args: [{ selector: 'cilog-table', template: "<p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeEdition() && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"options.scrollHeight != null ? options.scrollHeight : null\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll != null && options.scrollHeight != null ? true : false\"\r\n [virtualRowHeight]=\"35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [groupRowsByOrder]=\"0\">\r\n\r\n <!-- Header -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\">\r\n \r\n </th>\r\n <th *ngFor=\"let col of columns\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'centerText' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\">\r\n <span>{{ col.libelle }}</span>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null\" [field]=\"col.id\"></p-sortIcon>\r\n </th>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\">\r\n\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <input pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"checkType('Date', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-calendar dateFormat=\"dd/mm/yy\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"checkType('Number', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-inputNumber mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Groupheader -->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"row_grouping\">\r\n <td [attr.colspan]=\"columns.length + 1\">\r\n <span class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</span>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable || isModeEdition()\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\" class=\"cellDelete\">\r\n <p-tableCheckbox [value]=\"rowData\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\" />\r\n </td>\r\n <td *ngIf=\"checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</span>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n itemSize=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</span>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | number }}</span>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n dateFormat=\"dd/mm/yy\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: 'dd/MM/yyyy' }}</span>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl>\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</span>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"checkType('Image', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"checkType('Button', col)\"\r\n class=\"paddingCell centerText\"\r\n [ngStyle]=\"{ 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</span>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n style=\"justify-content: center;\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\" pInputText type=\"text\" value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\" readonly>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</span>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-tag [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n</p-table>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-thead>tr>th>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .p-datatable-tbody>tr>td>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .row_grouping{background:#faeada!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important}:host ::ng-deep .p-datatable .p-sortable-column.p-highlight{color:#2196f3!important}:host ::ng-deep .p-datatable .p-sortable-column.p-highlight .p-sortable-column-icon{color:#2196f3!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding-bottom:8px!important;padding-top:8px!important;font-weight:600!important;color:#495057!important;background:#dedddd!important;overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .p-datatable-tbody>tr{height:35px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;min-width:0!important;width:1px}:host ::ng-deep .centerText{justify-content:center!important}:host ::ng-deep .p-button{padding-top:1px;padding-bottom:1px}:host ::ng-deep .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep p-calendar,:host ::ng-deep p-inputNumber,:host ::ng-deep p-dropdown,:host ::ng-deep p-selectButton,:host ::ng-deep p-multiselect{width:100%!important}:host ::ng-deep .p-calendar{width:100%!important}:host ::ng-deep .p-inputtext{width:100%!important;height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{width:100%;height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{width:100%;padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{width:100%;height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown{width:100%;vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect{width:100%;vertical-align:middle}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}@media screen and (max-width: 650px){:host ::ng-deep .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable-tfoot>tr>td{display:none!important;width:inherit!important}:host ::ng-deep .p-datatable-tbody>tr{border:2px solid rgba(0,0,0,.12);flex-direction:column;height:inherit!important;padding-top:12px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:0!important;flex-basis:auto!important;width:100%!important}:host ::ng-deep td .p-column-title{padding:.4rem;min-width:35%;display:inline-block!important;margin:-.4rem 1rem -.4rem -.4rem;font-weight:700}:host ::ng-deep .centerText{justify-content:inherit!important}}\n"] }]
|
|
324
|
+
args: [{ selector: 'cilog-table', template: "<p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeEdition() && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"options.scrollHeight != null ? options.scrollHeight : null\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll != null && options.scrollHeight != null ? true : false\"\r\n [virtualRowHeight]=\"35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [groupRowsByOrder]=\"0\">\r\n\r\n <!-- HEADER -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <!-- HEADERS -->\r\n <tr class=\"rowHeader\">\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\">\r\n\r\n </th>\r\n <th *ngFor=\"let col of columns\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'centerText' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\">\r\n <span>{{ col.libelle }}</span>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null\" [field]=\"col.id\"></p-sortIcon>\r\n </th>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\" class=\"rowFilter\">\r\n\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <input pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"checkType('Date', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-calendar dateFormat=\"dd/mm/yy\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"checkType('Number', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-inputNumber mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n <p-multiSelect [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\">\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- TOTAL -->\r\n <tr *ngIf=\"options.rowTotal\" class=\"rowTotal\">\r\n <th class=\"cellDelete\" *ngIf=\"isModeCheckboxSelection()\"></th>\r\n <th *ngFor=\"let col of columns\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'centerText' : true }\">\r\n <span>{{ getTotal(col) }}</span>\r\n </th>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Groupheader -->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"rowGrouping\">\r\n <td [attr.colspan]=\"columns.length + 1\">\r\n <span class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</span>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable || isModeEdition()\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\" class=\"cellDelete\">\r\n <p-tableCheckbox [value]=\"rowData\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\" />\r\n </td>\r\n <td *ngIf=\"checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color' : rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</span>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n itemSize=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</span>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | number }}</span>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n dateFormat=\"dd/mm/yy\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: 'dd/MM/yyyy' }}</span>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n itemSize=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl>\r\n <ng-template let-group pTemplate=\"group\">\r\n <span>{{group[col.options.optionGroupLabel]}}</span>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</span>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"checkType('Image', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"checkType('Button', col)\"\r\n class=\"paddingCell centerText\"\r\n [ngStyle]=\"{ 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</span>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n style=\"justify-content: center;\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\" pInputText type=\"text\" value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\" readonly>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'flex': col.width ? '0 0 auto' : null,\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <span *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</span>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"checkType('State', col)\"\r\n [ngStyle]=\"{ 'flex': col.width ? '0 0 auto' : null, 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"centerText\">\r\n <span class=\"p-column-title\">{{ col.libelle }} : </span>\r\n <p-tag [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n</p-table>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!important}:host ::ng-deep .rowHeader>th{background-color:#795548!important}:host ::ng-deep .rowHeader>th span{color:#fff!important}:host ::ng-deep .rowHeader>th i{color:#fff!important}:host ::ng-deep .rowFilter>th{background-color:#795548!important}:host ::ng-deep .rowGrouping{background:#faeada!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-thead>tr>th>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .p-datatable-tbody>tr>td>span{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding-bottom:8px!important;padding-top:8px!important;font-weight:600!important;color:#495057!important;overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important;height:35px!important}:host ::ng-deep .p-datatable-tbody>tr{height:35px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;min-width:0!important;width:1px}:host ::ng-deep .centerText{justify-content:center!important}:host ::ng-deep .p-button{padding-top:1px;padding-bottom:1px}:host ::ng-deep .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep p-calendar,:host ::ng-deep p-inputNumber,:host ::ng-deep p-dropdown,:host ::ng-deep p-selectButton,:host ::ng-deep p-multiselect{width:100%!important}:host ::ng-deep .p-calendar{width:100%!important}:host ::ng-deep .p-inputtext{width:100%!important;height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{width:100%;height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{width:100%;padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{width:100%;height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown{width:100%;vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect{width:100%;vertical-align:middle}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}@media screen and (max-width: 650px){:host ::ng-deep .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable-tfoot>tr>td{display:none!important;width:inherit!important}:host ::ng-deep .p-datatable-tbody>tr{border:2px solid rgba(0,0,0,.12);flex-direction:column;height:inherit!important;padding-top:12px!important}:host ::ng-deep .p-datatable-tbody>tr>td{border:0!important;flex-basis:auto!important;width:100%!important}:host ::ng-deep td .p-column-title{padding:.4rem;min-width:35%;display:inline-block!important;margin:-.4rem 1rem -.4rem -.4rem;font-weight:700}:host ::ng-deep .centerText{justify-content:inherit!important}}\n"] }]
|
|
312
325
|
}], ctorParameters: function () { return [{ type: i1.ConfirmationService }, { type: i1.FilterService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { columns: [{
|
|
313
326
|
type: Input
|
|
314
327
|
}], columnsChange: [{
|
|
@@ -341,4 +354,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImpor
|
|
|
341
354
|
type: ViewChild,
|
|
342
355
|
args: ['table', { static: true }]
|
|
343
356
|
}] } });
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPekUsTUFBTSxPQUFPLG1CQUFtQjtJQStCNUIsWUFDWSxtQkFBd0MsRUFDeEMsYUFBNEIsRUFDNUIsS0FBd0I7UUFGeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQTVCMUIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRzlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUsxQyxXQUFNLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFDOUQsZUFBVSxHQUEyQixJQUFJLFlBQVksRUFBWSxDQUFDO1FBQ2xFLGFBQVEsR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDeEUsYUFBUSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3BFLGVBQVUsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN0RSxhQUFRLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDOUQsV0FBTSxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ3hELFdBQU0sR0FB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S0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDbkssQ0FBQzs7Z0hBeFVRLG1CQUFtQjtvR0FBbkIsbUJBQW1CLGtmQ1poQyx5ai9CQXVjQTsyRkQzYmEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNJLGFBQWE7c0tBU2QsT0FBTztzQkFBZixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUUsTUFBTTtzQkFBZCxLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUUsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBUStCLEtBQUs7c0JBQTFDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgRmlsdGVyU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgSUVkaXRpb24sIElTdXBwcmVzc2lvbiwgSVNlbGVjdGlvbiwgSUZpbHRlciwgSVNvcnQsIElQYWdlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnRlcmZhY2VzL2VkaXRpb24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgSUNvbHVtbiwgSVJvdywgSU9wdGlvbnNHcmlsbGUgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2ludGVyZmFjZXMvZ3JpbGxlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IENvbFR5cGUsIE1vZGVTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9oZWxwZXJzL2VudW1zL2dyaWxsZS5lbnVtJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjaWxvZy10YWJsZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2lsb2dUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgZmlsdGVyQ29sOiBJQ29sdW1uO1xyXG4gICAgZmlsdGVyVmFsdWU6IGFueTtcclxuXHJcbiAgICBASW5wdXQoKSBjb2x1bW5zOiBJQ29sdW1uW107XHJcbiAgICBAT3V0cHV0KCkgY29sdW1uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbltdPigpO1xyXG5cclxuICAgIEBJbnB1dCgpIHZhbHVlczogSVJvd1tdO1xyXG4gICAgQE91dHB1dCgpIHZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1tdPigpO1xyXG5cclxuICAgIEBJbnB1dCgpIG9wdGlvbnM6IElPcHRpb25zR3JpbGxlO1xyXG4gICAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25FZGl0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkVkaXRJbml0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uVW5zZWxlY3Q6IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPElGaWx0ZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyPigpO1xyXG4gICAgQE91dHB1dCgpIG9uU29ydDogRXZlbnRFbWl0dGVyPElTb3J0PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25QYWdlOiBFdmVudEVtaXR0ZXI8SVBhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGFnZT4oKTtcclxuXHJcbiAgICBzZWxlY3RlZFJvd3M6IElSb3dbXSB8IElSb3c7XHJcblxyXG4gICAgZmlsdGVyRGF0ZXNSYW5nZTogRGF0ZVtdO1xyXG5cclxuICAgIG9wdGlvbnNTd2l0Y2g6IGFueVtdO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgdGFibGU6IFRhYmxlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICAgICkgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zU3dpdGNoID0gW1xyXG4gICAgICAgICAgICB7IGxhYmVsOiAnT3VpJywgdmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogJ05vbicsIHZhbHVlOiBmYWxzZSB9LFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgLy8gRGF0ZVxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignZGF0ZVJhbmdlRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gZmlsdGVyWzBdLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGVuZDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgZW5kRGF0ZTogRGF0ZTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlclsxXSkge1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKGZpbHRlclsxXS5nZXRGdWxsWWVhcigpLCBmaWx0ZXJbMV0uZ2V0TW9udGgoKSwgZmlsdGVyWzFdLmdldERhdGUoKSwgMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gbmV3IERhdGUoZmlsdGVyWzBdLmdldEZ1bGxZZWFyKCksIGZpbHRlclswXS5nZXRNb250aCgpLCBmaWx0ZXJbMF0uZ2V0RGF0ZSgpLCAyMywgNTksIDU5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbmQgPSBlbmREYXRlLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNlbGwudmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogY2VsbC52YWx1ZS5nZXRUaW1lKCkgPj0gc3RhcnQgJiYgY2VsbC52YWx1ZS5nZXRUaW1lKCkgPD0gZW5kO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFRleHRcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ3RleHRGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIudHJpbSgpID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2VsbC52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNlbGwudmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gTnVtYmVyXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdudW1iZXJGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnZhbHVlID09IGZpbHRlcjtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3Rlcignb2JqZXRGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoZmlsdGVyLmluZGV4T2YoY2VsbC52YWx1ZSkgIT0gLTEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdsaXN0ZUZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZpbHRlci5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbC52YWx1ZS5pbmRleE9mKHZhbCkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gb2s7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdzd2l0Y2hGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoZmlsdGVyLmluZGV4T2YoY2VsbC52YWx1ZSkgIT0gLTEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEJ1dHRvblxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignYnV0dG9uRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbHRlck9iakZpZWxkOiBzdHJpbmcgPSBjZWxsLm9wdGlvbnNbJ2ZpbHRlck9iakZpZWxkJ107XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJPYmpTdWJGaWVsZDogc3RyaW5nID0gY2VsbC5vcHRpb25zWydmaWx0ZXJPYmpTdWJGaWVsZCddO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGwub2JqID09IG51bGwgfHwgZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLnRyaW0oKSA9PSAnJyB8fCBmaWx0ZXJPYmpGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGZpbHRlck9ialN1YkZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZWxsLm9ialtmaWx0ZXJPYmpGaWVsZF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5vYmpbZmlsdGVyT2JqRmllbGRdLmZpbmQodmFsID0+IHZhbFtmaWx0ZXJPYmpTdWJGaWVsZF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSkpICE9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zID0geyBkZWZhdWx0RmlsdGVyczogbnVsbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ2hhbmdlLmVtaXQodGhpcy5jb2x1bW5zKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsIHRoaXMuZ2V0RmlsdGVyQnlDb2woY29sKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbklucHV0TnVtYmVyKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNvcnRcclxuICAgIGN1c3RvbVNvcnQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBjb2w6IElDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLmlkID09IGV2ZW50LmZpZWxkKTtcclxuICAgICAgICB0aGlzLm9uU29ydC5lbWl0KHsgY29sdW1uOiBjb2wsIG9yZGVyOiBldmVudC5vcmRlciB9KVxyXG4gICAgICAgIGxldCB0eXBlQ29sOiBDb2xUeXBlID0gY29sLnR5cGU7XHJcbiAgICAgICAgZXZlbnQuZGF0YS5zb3J0KChkYXRhMSwgZGF0YTIpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlMSA9IGRhdGExW2V2ZW50LmZpZWxkXS52YWx1ZTtcclxuICAgICAgICAgICAgbGV0IHZhbHVlMiA9IGRhdGEyW2V2ZW50LmZpZWxkXS52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5UZXh0IHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5GaWxlKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlMSwgdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJykpLmxvY2FsZUNvbXBhcmUodGhpcy5nZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZTIsIHRoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24gfHwgdHlwZUNvbCA9PSBDb2xUeXBlLlN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTFbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJyldLmxvY2FsZUNvbXBhcmUodmFsdWUyW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk51bWJlciB8fCB0eXBlQ29sID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA8IHZhbHVlMikgPyAtMSA6ICh2YWx1ZTEgPiB2YWx1ZTIpID8gMSA6IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLlN3aXRjaClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2YWx1ZTEgPT09IHZhbHVlMikgPyAwIDogdmFsdWUxID8gLTEgOiAxO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoZXZlbnQub3JkZXIgKiByZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrVHlwZSh0eXBlQ29sOiBzdHJpbmcsIGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIHJldHVybiBjb2xbJ3R5cGUnXSA9PSB0eXBlQ29sO1xyXG4gICAgfVxyXG5cclxuICAgIGNsaWNrQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2x1bW4sIHJvdywgJ2FjdGlvbicpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oY29sdW1uLCByb3csICdhY3Rpb24nKSgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uRWRpdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0Um93KHJvdzogSVJvdykge1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QuZW1pdCh7IHJvdzogcm93LCBzZWxlY3RlZFJvd3M6IHRoaXMuc2VsZWN0ZWRSb3dzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVW5zZWxlY3RSb3cocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5vblVuc2VsZWN0LmVtaXQoeyByb3c6IHJvdywgc2VsZWN0ZWRSb3dzOiB0aGlzLnNlbGVjdGVkUm93cyB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoRGF0YSgpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNvcnRhYmxlICYmIHRoaXMub3B0aW9ucy52aXJ0dWFsU2Nyb2xsKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gWy4uLnRoaXMudmFsdWVzXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25QYWdlVGFibGUoZXZlbnQ6IElQYWdlKSB7XHJcbiAgICAgICAgdGhpcy5vblBhZ2UuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EZWxldGVMaW5lKHJvdzogSVJvdykge1xyXG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgICAgICAga2V5OiAnY29uZmlybScsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICfDinRlcy12b3VzIHPDu3IgZGUgdm91bG9pciBzdXBwcmltZXIgY2V0dGUgbGlnbmUgPycsXHJcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc3BsaWNlKHRoaXMudmFsdWVzLmluZGV4T2Yocm93KSwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlc107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc0NoYW5nZS5lbWl0KHRoaXMudmFsdWVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25EZWxldGUuZW1pdCh7IHJvdzogcm93IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0SW5pdENlbGwocm93OiBJUm93LCBjb2x1bW46IElDb2x1bW4sIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uRWRpdEluaXQuZW1pdCh7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiwgdmFsdWU6IHZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTW9kZUVkaXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5lZGl0YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRPcHRpb24oY29sLCByb3csIG9wdGlvbjogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHJvd1tjb2wuaWRdLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAocm93W2NvbC5pZF0ub3B0aW9uc1tvcHRpb25dICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByb3dbY29sLmlkXS5vcHRpb25zW29wdGlvbl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbC5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zW29wdGlvbl0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC5vcHRpb25zW29wdGlvbl1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZSwgbGFiZWw6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAodmFsID0+IHsgcmV0dXJuIHZhbFtsYWJlbF07IH0pLmpvaW4oJywgJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RMaWJlbGxlQnlWYWx1ZShyb3csIGNvbCkge1xyXG4gICAgICAgIGxldCBsYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKHJvd1tjb2wuaWRdLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93W2NvbC5pZF0ub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gcm93W2NvbC5pZF0ub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSByb3dbY29sLmlkXS52YWx1ZSlbcm93W2NvbC5pZF0ub3B0aW9ucy5vcHRpb25MYWJlbF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT0gcm93W2NvbC5pZF0udmFsdWUpW2NvbC5vcHRpb25zLm9wdGlvbkxhYmVsXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyQnlDb2woY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgLy8gRGF0ZXMgKHJhbmdlKVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdkYXRlUmFuZ2VGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOdW1iZXJcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdudW1iZXJGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IGNvbC50eXBlID09IENvbFR5cGUuU3RhdGUgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24pIHtcclxuICAgICAgICAgICAgcmV0dXJuICdvYmpldEZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdsaXN0ZUZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRleHRlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRmlsZSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICd0ZXh0RmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb25GaWx0ZXJDb2woZXZlbnQsIGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIC8vIERhdGVzIChyYW5nZSlcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5EYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsICdkYXRlUmFuZ2VGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTnVtYmVyXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgZXZlbnQudmFsdWUsICdudW1iZXJGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT2JqZXRcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5Ecm9wZG93biB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlN0YXRlIHx8IGNvbC50eXBlID09IENvbFR5cGUuU2VsZWN0QnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgZXZlbnQudmFsdWUsICdvYmpldEZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBMaXN0ZVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgZXZlbnQudmFsdWUsICdsaXN0ZUZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUZXh0ZVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkZpbGUgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5UZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgZXZlbnQudGFyZ2V0LnZhbHVlLCAndGV4dEZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTd2l0Y2hcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5Td2l0Y2gpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBldmVudC52YWx1ZSwgJ3N3aXRjaEZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBCdXR0b25cclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5CdXR0b24pIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBldmVudC50YXJnZXQudmFsdWUsICdidXR0b25GaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyKGNvbDogSUNvbHVtbiwgdmFsOiBhbnksIGZpbHRlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb2wgPSBjb2w7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbDtcclxuICAgICAgICB0aGlzLnRhYmxlLmZpbHRlcih2YWwsIGNvbC5pZCwgZmlsdGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlclRhYmxlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uOiB0aGlzLmZpbHRlckNvbCwgdmFsdWU6IHRoaXMuZmlsdGVyVmFsdWUsIGZpbHRlcmVkVmFsdWU6IHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpc01vZGVDaGVja2JveFNlbGVjdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMub3B0aW9ucy5lZGl0YWJsZSAmJiB0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSA9PSB0cnVlICYmIHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gPT0gTW9kZVNlbGVjdGlvbi5DaGVja2JveDtcclxuICAgIH1cclxufVxyXG4iLCI8cC10YWJsZSAjdGFibGVcclxuICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNcIlxyXG4gICAgICAgICBkYXRhS2V5PVwiaWRcIlxyXG4gICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJvcHRpb25zLnNlbGVjdGFibGUgJiYgIWlzTW9kZUVkaXRpb24oKSAmJiAhaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKSA/ICdzaW5nbGUnIDogbnVsbFwiXHJcbiAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZFJvd3NcIlxyXG4gICAgICAgICAob25Sb3dTZWxlY3QpPVwib25TZWxlY3RSb3coJGV2ZW50KVwiXHJcbiAgICAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uVW5zZWxlY3RSb3coJGV2ZW50KVwiXHJcbiAgICAgICAgIChzb3J0RnVuY3Rpb24pPVwiY3VzdG9tU29ydCgkZXZlbnQpXCJcclxuICAgICAgICAgW2N1c3RvbVNvcnRdPVwib3B0aW9ucy5ncm91cGluZyA9PSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cIm9wdGlvbnMuc2Nyb2xsSGVpZ2h0ICE9IG51bGwgPyBvcHRpb25zLnNjcm9sbEhlaWdodCA6IG51bGxcIlxyXG4gICAgICAgICBbcm93R3JvdXBNb2RlXT1cIm9wdGlvbnMuZ3JvdXBpbmcgIT0gbnVsbCA/ICdzdWJoZWFkZXInIDogbnVsbFwiXHJcbiAgICAgICAgIFtncm91cFJvd3NCeV09XCJvcHRpb25zLmdyb3VwaW5nICE9IG51bGwgPyBvcHRpb25zLmdyb3VwaW5nLm9iaiArICcuJyArIG9wdGlvbnMuZ3JvdXBpbmcuaWQgOiBudWxsXCJcclxuICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwib3B0aW9ucy52aXJ0dWFsU2Nyb2xsICE9IG51bGwgJiYgb3B0aW9ucy5zY3JvbGxIZWlnaHQgIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgIFt2aXJ0dWFsUm93SGVpZ2h0XT1cIjM1XCJcclxuICAgICAgICAgW3BhZ2luYXRvcl09XCJvcHRpb25zLnBhZ2luYXRvciA9PSBudWxsID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgW3Jvd3NdPVwib3B0aW9ucy5wYWdpbmF0b3JSb3dzXCJcclxuICAgICAgICAgKG9uUGFnZSk9XCJvblBhZ2VUYWJsZSgkZXZlbnQpXCJcclxuICAgICAgICAgKG9uRmlsdGVyKT1cIm9uRmlsdGVyVGFibGUoJGV2ZW50KVwiXHJcbiAgICAgICAgIFtncm91cFJvd3NCeU9yZGVyXT1cIjBcIj5cclxuXHJcbiAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjZW50ZXJUZXh0JyA6IG9wdGlvbnMuY2VudGVySGVhZGVycyB9XCJcclxuICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmlkXCJcclxuICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhb3B0aW9ucy5zb3J0YWJsZSB8fCBvcHRpb25zLmdyb3VwaW5nICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgaWQ9XCJ7eyBjb2wuaWQgfX1cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlZnJlc2hEYXRhKClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC5saWJlbGxlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHAtc29ydEljb24gKm5nSWY9XCJvcHRpb25zLnNvcnRhYmxlICYmIG9wdGlvbnMuZ3JvdXBpbmcgPT0gbnVsbFwiIFtmaWVsZF09XCJjb2wuaWRcIj48L3Atc29ydEljb24+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cIm9wdGlvbnMucm93c0RlbGV0YWJsZVwiPjwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICA8IS0tIEZJTFRSRVMgLS0+XHJcbiAgICAgICAgPHRyICpuZ0lmPVwib3B0aW9ucy5maWx0ZXJhYmxlXCI+XHJcblxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCIgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCI+PC90aD5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjaGVja1R5cGUoJ1RleHQnLCBjb2wpIHx8IGNoZWNrVHlwZSgnRmlsZScsIGNvbCkgfHwgKGNoZWNrVHlwZSgnQnV0dG9uJywgY29sKSAmJiBjb2wub3B0aW9ucy5maWx0ZXJDb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImNoZWNrVHlwZSgnRGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyIGRhdGVGb3JtYXQ9XCJkZC9tbS95eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sLmlkICsgJ19maWx0ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERheU9mV2Vlaz1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTW9kZT1cInJhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QnV0dG9uQmFyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY2hlY2tUeXBlKCdOdW1iZXInLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBtb2RlPVwiZGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlPVwiZnItRlJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIExpc3RlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgfHwgY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgfHwgY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpIHx8IGNoZWNrVHlwZSgnU3RhdGUnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJjb2wub3B0aW9ucz8ub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwiSURcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2wub3B0aW9ucz8ub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TaXplPVwiMzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBzZWxlY3Rpb25uw6lzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBDaGlsZHJlbiAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBMYWJlbF09XCJjb2wub3B0aW9ucy5vcHRpb25Hcm91cExhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJjb2wub3B0aW9ucy5vcHRpb25Hcm91cENoaWxkcmVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Z3JvdXBbY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbF19fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3dpdGNoIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY2hlY2tUeXBlKCdTd2l0Y2gnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJvcHRpb25zU3dpdGNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlYWRlcl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVNpemU9XCIzMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gTm9uIGZpbHRyYWJsZSAtLT5cclxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImNoZWNrVHlwZSgnSW1hZ2UnLCBjb2wpIHx8IChjaGVja1R5cGUoJ0J1dHRvbicsIGNvbCkgJiYgIWNvbC5vcHRpb25zLmZpbHRlckNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCIgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIj48L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0gR3JvdXBoZWFkZXIgLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZ3JvdXBoZWFkZXJcIiBsZXQtcm93RGF0YT5cclxuICAgICAgICA8dHIgcFJvd0dyb3VwSGVhZGVyIGNsYXNzPVwicm93X2dyb3VwaW5nXCI+XHJcbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0X2JvbGRcIj57eyByb3dEYXRhW29wdGlvbnMuZ3JvdXBpbmcub2JqXVtvcHRpb25zLmdyb3VwaW5nLmxpYmVsbGVdIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0gQm9keSAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGEgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgPHRyIGlkPVwie3sgcm93RGF0YS5pZCB9fVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhLmNvbG9yID8gcm93RGF0YS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd109XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93RGlzYWJsZWRdPVwiIW9wdGlvbnMuc2VsZWN0YWJsZSB8fCBpc01vZGVFZGl0aW9uKClcIj5cclxuXHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIiBjbGFzcz1cImNlbGxEZWxldGVcIj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cInJvd0RhdGFcIj48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUZXh0IC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5dPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BFZGl0YWJsZUNvbHVtbkZpZWxkXT1cImNvbC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnVGV4dCcsIGNvbCkgJiYgKCFpc01vZGVFZGl0aW9uKCkgfHwgcm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLCAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9ucycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYXNlWkluZGV4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdiYXNlWkluZGV4JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICd2aXJ0dWFsU2Nyb2xsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TaXplPVwiMzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ0Ryb3Bkb3duJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ051bWJlcicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgbnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU9XCJmci1GUlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzaG93QnV0dG9ucycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VmZml4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzdWZmaXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSAhPSBudWxsICYmIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpID09IHRydWUgPyAwIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21pbkRlY2ltYWxlcycpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgOiAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgIT0gbnVsbCAmJiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSA9PSB0cnVlID8gMCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpIDogMiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnRGF0ZScsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0PVwiZGQvbW0veXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHlJbnB1dF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdEYXRlJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIE11bHRpU2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiZ2V0TXVsdGlTZWxlY3RDb25jYXQocm93RGF0YVtjb2wuaWRdLnZhbHVlLCBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnZmlsdGVyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VaSW5kZXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Jhc2VaSW5kZXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ZpcnR1YWxTY3JvbGwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU2l6ZT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0gc2VsZWN0aW9ubsOpc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkdyb3VwQ2hpbGRyZW4nKSAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBMYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBMYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBDaGlsZHJlbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWdyb3VwIHBUZW1wbGF0ZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2dyb3VwW2NvbC5vcHRpb25zLm9wdGlvbkdyb3VwTGFiZWxdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnTXVsdGlTZWxlY3QnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJnZXRNdWx0aVNlbGVjdENvbmNhdChyb3dEYXRhW2NvbC5pZF0udmFsdWUsIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdJbWFnZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VudGVyVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aWR0aDogNDBweDtcIiBzcmM9XCJ7eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnQnV0dG9uJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWRkaW5nQ2VsbCBjZW50ZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIncC1idXR0b24tJyArIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzZXZlcml0eScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnaWNvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2xhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBTZWxlY3RCdXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uVmFsdWUnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvblZhbHVlJykgOiAndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnU2VsZWN0QnV0dG9uJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0U2VsZWN0TGliZWxsZUJ5VmFsdWUocm93RGF0YSwgY29sKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBTd2l0Y2ggLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ1N3aXRjaCcsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImp1c3RpZnktY29udGVudDogY2VudGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8IChnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnYWN0aW9uJykgPT0gbnVsbCAmJiAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1pbnB1dFN3aXRjaD5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBGaWxlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdGaWxlJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS11cGxvYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0J5SWQoJ2lucHV0XycgKyByb3dEYXRhW2NvbC5pZF0uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7J291dHB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkfX1cIiBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJ7eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19XCIgcmVhZG9ubHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCIgaWQ9XCJ7eydpbnB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkfX1cIiAjaW5wdXRGaWxlIHBJbnB1dFRleHQgdHlwZT1cImZpbGVcIiBoaWRkZW4gKGNoYW5nZSk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgPSBpbnB1dEZpbGUuZmlsZXNbMF0ubmFtZTsgb25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIGlucHV0RmlsZS5maWxlc1swXSlcIj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN0YXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdTdGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VudGVyVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8cC10YWcgW3ZhbHVlXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLnNldmVyaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLmljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBEZWxldGlvbiAtLT5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhLmRlbGV0YWJsZSA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwicm93RGF0YS5kZWxldGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBidXR0b25EZWxldGUgcC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTGluZShyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L3AtdGFibGU+XHJcbiJdfQ==
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPekUsTUFBTSxPQUFPLG1CQUFtQjtJQStCNUIsWUFDWSxtQkFBd0MsRUFDeEMsYUFBNEIsRUFDNUIsS0FBd0I7UUFGeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQTVCMUIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRzlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUsxQyxXQUFNLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFDOUQsZUFBVSxHQUEyQixJQUFJLFlBQVksRUFBWSxDQUFDO1FBQ2xFLGFBQVEsR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDeEUsYUFBUSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3BFLGVBQVUsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN0RSxhQUFRLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDOUQsV0FBTSxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ3hELFdBQU0sR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztJQWM5RCxDQUFDO0lBRUwsUUFBUTtRQUNKLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDakIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDN0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7U0FDakMsQ0FBQTtRQUVELE9BQU87UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxJQUFJLEtBQUssR0FBVyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxHQUFXLENBQUM7WUFDaEIsSUFBSSxPQUFhLENBQUM7WUFDbEIsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1gsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDdEc7aUJBQU07Z0JBQ0gsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDdEc7WUFDRCxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUM7UUFDckcsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3ZELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUN2QyxPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDcEIsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN6RCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNwQixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRO1FBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hELE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUTtRQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4RCxJQUFJLEVBQUUsR0FBWSxLQUFLLENBQUM7WUFDeEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDL0IsRUFBRSxHQUFHLElBQUksQ0FBQztpQkFDYjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVM7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDekQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBRXpELElBQUksY0FBYyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RCxJQUFJLGlCQUFpQixHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUVsRSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO2dCQUNyRixPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDaEY7aUJBQU07Z0JBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQzthQUM1SDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtnQkFDckIsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUMxQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxRTtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQUs7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO0lBQ1AsVUFBVSxDQUFDLEtBQVU7UUFDakIsSUFBSSxHQUFHLEdBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ3JELElBQUksT0FBTyxHQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDdEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSTtnQkFDaEMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNYLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSTtnQkFDckMsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDVixJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUk7Z0JBQ3JDLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ1YsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUk7Z0JBQ3ZELE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JMO2lCQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7Z0JBQ25HLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9IO2lCQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQzdELE1BQU0sR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvRDtpQkFBTSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTTtnQkFDaEMsTUFBTSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRW5ELE1BQU0sSUFBSSxDQUFDLENBQUM7WUFFaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQWUsRUFBRSxHQUFZO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQVU7UUFDaEIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVMsRUFBRSxNQUFlLEVBQUUsS0FBVTtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzNCO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNoRTtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBUztRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBUztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUNyRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFTO1FBQ2xCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDN0IsR0FBRyxFQUFFLFNBQVM7WUFDZCxPQUFPLEVBQUUsa0RBQWtEO1lBQzNELE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVMsRUFBRSxNQUFlLEVBQUUsS0FBVTtRQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDakMsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQWM7UUFDOUIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEM7U0FDSjtRQUNELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDckIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDN0IsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2FBQzdCO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQWE7UUFDckMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUQ7YUFBTTtZQUNILE9BQU8sRUFBRSxDQUFDO1NBQ2I7SUFDTCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDNUIsSUFBSSxLQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDN0IsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN2SDthQUFNO1lBQ0gsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtnQkFDckIsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDdkc7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBWTtRQUN2QixnQkFBZ0I7UUFDaEIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDMUIsT0FBTyxpQkFBaUIsQ0FBQztTQUM1QjtRQUNELFNBQVM7UUFDVCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM1QixPQUFPLGNBQWMsQ0FBQztTQUN6QjtRQUNELFFBQVE7UUFDUixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQy9GLE9BQU8sYUFBYSxDQUFDO1NBQ3hCO1FBQ0QsUUFBUTtRQUNSLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQ2pDLE9BQU8sYUFBYSxDQUFDO1NBQ3hCO1FBQ0QsUUFBUTtRQUNSLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUN0RCxPQUFPLFlBQVksQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQVk7UUFDM0IsZ0JBQWdCO1FBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDbkU7UUFDRCxTQUFTO1FBQ1QsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNqRDtRQUNELFFBQVE7UUFDUixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQy9GLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDaEQ7UUFDRCxRQUFRO1FBQ1IsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNoRDtRQUNELFFBQVE7UUFDUixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDdEQ7UUFDRCxTQUFTO1FBQ1QsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNqRDtRQUNELFNBQVM7UUFDVCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBWSxFQUFFLEdBQVEsRUFBRSxNQUFjO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBSztRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3pJLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBWTtRQUNqQixJQUFJLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ2hELElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0YsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEU7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDOztnSEFyVlEsbUJBQW1CO29HQUFuQixtQkFBbUIsa2ZDWmhDLGtqakNBdWZBOzJGRDNlYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0ksYUFBYTtzS0FTZCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFFRSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFRK0IsS0FBSztzQkFBMUMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBJRWRpdGlvbiwgSVN1cHByZXNzaW9uLCBJU2VsZWN0aW9uLCBJRmlsdGVyLCBJU29ydCwgSVBhZ2UgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2ludGVyZmFjZXMvZWRpdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBJQ29sdW1uLCBJUm93LCBJT3B0aW9uc0dyaWxsZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW50ZXJmYWNlcy9ncmlsbGUuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgQ29sVHlwZSwgTW9kZVNlbGVjdGlvbiB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bXMvZ3JpbGxlLmVudW0nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NpbG9nLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaWxvZ1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBmaWx0ZXJDb2w6IElDb2x1bW47XHJcbiAgICBmaWx0ZXJWYWx1ZTogYW55O1xyXG5cclxuICAgIEBJbnB1dCgpIGNvbHVtbnM6IElDb2x1bW5bXTtcclxuICAgIEBPdXRwdXQoKSBjb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uW10+KCk7XHJcblxyXG4gICAgQElucHV0KCkgdmFsdWVzOiBJUm93W107XHJcbiAgICBAT3V0cHV0KCkgdmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93W10+KCk7XHJcblxyXG4gICAgQElucHV0KCkgb3B0aW9uczogSU9wdGlvbnNHcmlsbGU7XHJcbiAgICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuO1xyXG5cclxuICAgIEBPdXRwdXQoKSBvbkVkaXQ6IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElFZGl0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRWRpdEluaXQ6IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElFZGl0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRGVsZXRlOiBFdmVudEVtaXR0ZXI8SVN1cHByZXNzaW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVN1cHByZXNzaW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25VbnNlbGVjdDogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRmlsdGVyOiBFdmVudEVtaXR0ZXI8SUZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXI+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Tb3J0OiBFdmVudEVtaXR0ZXI8SVNvcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydD4oKTtcclxuICAgIEBPdXRwdXQoKSBvblBhZ2U6IEV2ZW50RW1pdHRlcjxJUGFnZT4gPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlPigpO1xyXG5cclxuICAgIHNlbGVjdGVkUm93czogSVJvd1tdIHwgSVJvdztcclxuXHJcbiAgICBmaWx0ZXJEYXRlc1JhbmdlOiBEYXRlW107XHJcblxyXG4gICAgb3B0aW9uc1N3aXRjaDogYW55W107XHJcblxyXG4gICAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZTogVGFibGU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnNTd2l0Y2ggPSBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdPdWknLCB2YWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiAnTm9uJywgdmFsdWU6IGZhbHNlIH0sXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICAvLyBEYXRlXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdkYXRlUmFuZ2VGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBmaWx0ZXJbMF0uZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBsZXQgZW5kOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBlbmREYXRlOiBEYXRlO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyWzFdKSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gbmV3IERhdGUoZmlsdGVyWzFdLmdldEZ1bGxZZWFyKCksIGZpbHRlclsxXS5nZXRNb250aCgpLCBmaWx0ZXJbMV0uZ2V0RGF0ZSgpLCAyMywgNTksIDU5KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVuZERhdGUgPSBuZXcgRGF0ZShmaWx0ZXJbMF0uZ2V0RnVsbFllYXIoKSwgZmlsdGVyWzBdLmdldE1vbnRoKCksIGZpbHRlclswXS5nZXREYXRlKCksIDIzLCA1OSwgNTkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVuZCA9IGVuZERhdGUuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gY2VsbC52YWx1ZSA9PSBudWxsID8gZmFsc2UgOiBjZWxsLnZhbHVlLmdldFRpbWUoKSA+PSBzdGFydCAmJiBjZWxsLnZhbHVlLmdldFRpbWUoKSA8PSBlbmQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gVGV4dFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcigndGV4dEZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci50cmltKCkgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjZWxsLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY2VsbC52YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlci50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBOdW1iZXJcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ251bWJlckZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2VsbC52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNlbGwudmFsdWUgPT0gZmlsdGVyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIE9iamV0XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdvYmpldEZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXIuaW5kZXhPZihjZWxsLnZhbHVlKSAhPSAtMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gTGlzdGVcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2xpc3RlRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgb2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgZmlsdGVyLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLnZhbHVlLmluZGV4T2YodmFsKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvaztcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBTd2l0Y2hcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ3N3aXRjaEZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXIuaW5kZXhPZihjZWxsLnZhbHVlKSAhPSAtMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gQnV0dG9uXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdidXR0b25GaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlsdGVyT2JqRmllbGQ6IHN0cmluZyA9IGNlbGwub3B0aW9uc1snZmlsdGVyT2JqRmllbGQnXTtcclxuICAgICAgICAgICAgbGV0IGZpbHRlck9ialN1YkZpZWxkOiBzdHJpbmcgPSBjZWxsLm9wdGlvbnNbJ2ZpbHRlck9ialN1YkZpZWxkJ107XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbC5vYmogPT0gbnVsbCB8fCBmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIudHJpbSgpID09ICcnIHx8IGZpbHRlck9iakZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoZmlsdGVyT2JqU3ViRmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwub2JqW2ZpbHRlck9iakZpZWxkXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlci50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZWxsLm9ialtmaWx0ZXJPYmpGaWVsZF0uZmluZCh2YWwgPT4gdmFsW2ZpbHRlck9ialN1YkZpZWxkXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlci50b0xvd2VyQ2FzZSgpKSkgIT0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29sLm9wdGlvbnMgPSB7IGRlZmF1bHRGaWx0ZXJzOiBudWxsIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNvbHVtbnNDaGFuZ2UuZW1pdCh0aGlzLmNvbHVtbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycywgdGhpcy5nZXRGaWx0ZXJCeUNvbChjb2wpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSW5wdXROdW1iZXIoZXZlbnQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU29ydFxyXG4gICAgY3VzdG9tU29ydChldmVudDogYW55KSB7XHJcbiAgICAgICAgbGV0IGNvbDogSUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuaWQgPT0gZXZlbnQuZmllbGQpO1xyXG4gICAgICAgIHRoaXMub25Tb3J0LmVtaXQoeyBjb2x1bW46IGNvbCwgb3JkZXI6IGV2ZW50Lm9yZGVyIH0pXHJcbiAgICAgICAgbGV0IHR5cGVDb2w6IENvbFR5cGUgPSBjb2wudHlwZTtcclxuICAgICAgICBldmVudC5kYXRhLnNvcnQoKGRhdGExLCBkYXRhMikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUxID0gZGF0YTFbZXZlbnQuZmllbGRdLnZhbHVlO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUyID0gZGF0YTJbZXZlbnQuZmllbGRdLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gMDtcclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLlRleHQgfHwgdHlwZUNvbCA9PSBDb2xUeXBlLkZpbGUpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlQ29sID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0TXVsdGlTZWxlY3RDb25jYXQodmFsdWUxLCB0aGlzLmdldE9wdGlvbihjb2wsIGRhdGExLCAnb3B0aW9uTGFiZWwnKSkubG9jYWxlQ29tcGFyZSh0aGlzLmdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlMiwgdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMiwgJ29wdGlvbkxhYmVsJykpKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQ29sID09IENvbFR5cGUuRHJvcGRvd24gfHwgdHlwZUNvbCA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbiB8fCB0eXBlQ29sID09IENvbFR5cGUuU3RhdGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlMVt0aGlzLmdldE9wdGlvbihjb2wsIGRhdGExLCAnb3B0aW9uTGFiZWwnKV0ubG9jYWxlQ29tcGFyZSh2YWx1ZTJbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMiwgJ29wdGlvbkxhYmVsJyldKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQ29sID09IENvbFR5cGUuTnVtYmVyIHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAodmFsdWUxIDwgdmFsdWUyKSA/IC0xIDogKHZhbHVlMSA+IHZhbHVlMikgPyAxIDogMDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQ29sID09IENvbFR5cGUuU3dpdGNoKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA9PT0gdmFsdWUyKSA/IDAgOiB2YWx1ZTEgPyAtMSA6IDE7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9PSAwO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIChldmVudC5vcmRlciAqIHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tUeXBlKHR5cGVDb2w6IHN0cmluZywgY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbFsndHlwZSddID09IHR5cGVDb2w7XHJcbiAgICB9XHJcblxyXG4gICAgY2xpY2tCeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuY2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRDZWxsKHJvdzogSVJvdywgY29sdW1uOiBJQ29sdW1uLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbHVtbiwgcm93LCAnYWN0aW9uJykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvbihjb2x1bW4sIHJvdywgJ2FjdGlvbicpKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMub25FZGl0LmVtaXQoeyByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4sIHZhbHVlOiB2YWx1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3RSb3cocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHsgcm93OiByb3csIHNlbGVjdGVkUm93czogdGhpcy5zZWxlY3RlZFJvd3MgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25VbnNlbGVjdFJvdyhyb3c6IElSb3cpIHtcclxuICAgICAgICB0aGlzLm9uVW5zZWxlY3QuZW1pdCh7IHJvdzogcm93LCBzZWxlY3RlZFJvd3M6IHRoaXMuc2VsZWN0ZWRSb3dzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydGFibGUgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBbLi4udGhpcy52YWx1ZXNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VUYWJsZShldmVudDogSVBhZ2UpIHtcclxuICAgICAgICB0aGlzLm9uUGFnZS5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZUxpbmUocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICAgICAgICBrZXk6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogJ8OKdGVzLXZvdXMgc8O7ciBkZSB2b3Vsb2lyIHN1cHByaW1lciBjZXR0ZSBsaWduZSA/JyxcclxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zcGxpY2UodGhpcy52YWx1ZXMuaW5kZXhPZihyb3cpLCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzID0gWy4uLnRoaXMudmFsdWVzXTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQodGhpcy52YWx1ZXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkRlbGV0ZS5lbWl0KHsgcm93OiByb3cgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRJbml0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25FZGl0SW5pdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNb2RlRWRpdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVkaXRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wdGlvbihjb2wsIHJvdywgb3B0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAocm93W2NvbC5pZF0ub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbY29sLmlkXS5vcHRpb25zW29wdGlvbl0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tjb2wuaWRdLm9wdGlvbnNbb3B0aW9uXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29sLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnNbb3B0aW9uXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLm9wdGlvbnNbb3B0aW9uXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlLCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2YWwgPT4geyByZXR1cm4gdmFsW2xhYmVsXTsgfSkuam9pbignLCAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdExpYmVsbGVCeVZhbHVlKHJvdywgY29sKSB7XHJcbiAgICAgICAgbGV0IGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICAgICAgICBpZiAocm93W2NvbC5pZF0udmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dbY29sLmlkXS5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGFiZWwgPSByb3dbY29sLmlkXS5vcHRpb25zWydvcHRpb25zJ10uZmluZChvcHQgPT4gb3B0LnZhbHVlID09IHJvd1tjb2wuaWRdLnZhbHVlKVtyb3dbY29sLmlkXS5vcHRpb25zLm9wdGlvbkxhYmVsXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSByb3dbY29sLmlkXS52YWx1ZSlbY29sLm9wdGlvbnMub3B0aW9uTGFiZWxdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJCeUNvbChjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICAvLyBEYXRlcyAocmFuZ2UpXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RhdGVSYW5nZUZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE51bWJlclxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLk51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ251bWJlckZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9iamV0XHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24gfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TdGF0ZSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ29iamV0RmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTGlzdGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2xpc3RlRmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGV4dGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5GaWxlIHx8IGNvbC50eXBlID09IENvbFR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHRGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlckNvbChldmVudCwgY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgLy8gRGF0ZXMgKHJhbmdlKVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycywgJ2RhdGVSYW5nZUZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOdW1iZXJcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBldmVudC52YWx1ZSwgJ251bWJlckZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IGNvbC50eXBlID09IENvbFR5cGUuU3RhdGUgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24pIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBldmVudC52YWx1ZSwgJ29iamV0RmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBldmVudC52YWx1ZSwgJ2xpc3RlRmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRleHRlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRmlsZSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBldmVudC50YXJnZXQudmFsdWUsICd0ZXh0RmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLlN3aXRjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcihjb2wsIGV2ZW50LnZhbHVlLCAnc3dpdGNoRmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEJ1dHRvblxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkJ1dHRvbikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcihjb2wsIGV2ZW50LnRhcmdldC52YWx1ZSwgJ2J1dHRvbkZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXIoY29sOiBJQ29sdW1uLCB2YWw6IGFueSwgZmlsdGVyOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckNvbCA9IGNvbDtcclxuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsO1xyXG4gICAgICAgIHRoaXMudGFibGUuZmlsdGVyKHZhbCwgY29sLmlkLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRmlsdGVyVGFibGUoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW46IHRoaXMuZmlsdGVyQ29sLCB2YWx1ZTogdGhpcy5maWx0ZXJWYWx1ZSwgZmlsdGVyZWRWYWx1ZTogdGhpcy50YWJsZS5maWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSA9PSB0cnVlICYmIHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gPT0gTW9kZVNlbGVjdGlvbi5DaGVja2JveDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb3RhbChjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICBpZiAoY29sLmRpc3BsYXlUb3RhbCAmJiBjb2wudHlwZSA9PSBDb2xUeXBlLk51bWJlcikge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWVzOiBJUm93W10gPSB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWUgIT0gbnVsbCA/IHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSA6IHRoaXMudmFsdWVzO1xyXG4gICAgICAgICAgICBsZXQgdG90YWw6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gdG90YWwudG9Mb2NhbGVTdHJpbmcoJ2ZyLUZSJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxwLXRhYmxlICN0YWJsZVxyXG4gICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1wiXHJcbiAgICAgICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cIm9wdGlvbnMuc2VsZWN0YWJsZSAmJiAhaXNNb2RlRWRpdGlvbigpICYmICFpc01vZGVDaGVja2JveFNlbGVjdGlvbigpID8gJ3NpbmdsZScgOiBudWxsXCJcclxuICAgICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkUm93c1wiXHJcbiAgICAgICAgIChvblJvd1NlbGVjdCk9XCJvblNlbGVjdFJvdygkZXZlbnQpXCJcclxuICAgICAgICAgKG9uUm93VW5zZWxlY3QpPVwib25VbnNlbGVjdFJvdygkZXZlbnQpXCJcclxuICAgICAgICAgKHNvcnRGdW5jdGlvbik9XCJjdXN0b21Tb3J0KCRldmVudClcIlxyXG4gICAgICAgICBbY3VzdG9tU29ydF09XCJvcHRpb25zLmdyb3VwaW5nID09IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICAgICAgIFtzY3JvbGxIZWlnaHRdPVwib3B0aW9ucy5zY3JvbGxIZWlnaHQgIT0gbnVsbCA/IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0IDogbnVsbFwiXHJcbiAgICAgICAgIFtyb3dHcm91cE1vZGVdPVwib3B0aW9ucy5ncm91cGluZyAhPSBudWxsID8gJ3N1YmhlYWRlcicgOiBudWxsXCJcclxuICAgICAgICAgW2dyb3VwUm93c0J5XT1cIm9wdGlvbnMuZ3JvdXBpbmcgIT0gbnVsbCA/IG9wdGlvbnMuZ3JvdXBpbmcub2JqICsgJy4nICsgb3B0aW9ucy5ncm91cGluZy5pZCA6IG51bGxcIlxyXG4gICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJvcHRpb25zLnZpcnR1YWxTY3JvbGwgIT0gbnVsbCAmJiBvcHRpb25zLnNjcm9sbEhlaWdodCAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgW3ZpcnR1YWxSb3dIZWlnaHRdPVwiMzVcIlxyXG4gICAgICAgICBbcGFnaW5hdG9yXT1cIm9wdGlvbnMucGFnaW5hdG9yID09IG51bGwgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICBbcm93c109XCJvcHRpb25zLnBhZ2luYXRvclJvd3NcIlxyXG4gICAgICAgICAob25QYWdlKT1cIm9uUGFnZVRhYmxlKCRldmVudClcIlxyXG4gICAgICAgICAob25GaWx0ZXIpPVwib25GaWx0ZXJUYWJsZSgkZXZlbnQpXCJcclxuICAgICAgICAgW2dyb3VwUm93c0J5T3JkZXJdPVwiMFwiPlxyXG5cclxuICAgIDwhLS0gSEVBREVSIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgICA8IS0tIEhFQURFUlMgLS0+XHJcbiAgICAgICAgPHRyIGNsYXNzPVwicm93SGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIj5cclxuXHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLCAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NlbnRlclRleHQnIDogb3B0aW9ucy5jZW50ZXJIZWFkZXJzIH1cIlxyXG4gICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuaWRcIlxyXG4gICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFvcHRpb25zLnNvcnRhYmxlIHx8IG9wdGlvbnMuZ3JvdXBpbmcgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICBpZD1cInt7IGNvbC5pZCB9fVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVmcmVzaERhdGEoKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29sLmxpYmVsbGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiAqbmdJZj1cIm9wdGlvbnMuc29ydGFibGUgJiYgb3B0aW9ucy5ncm91cGluZyA9PSBudWxsXCIgW2ZpZWxkXT1cImNvbC5pZFwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICA8IS0tIEZJTFRSRVMgLS0+XHJcbiAgICAgICAgPHRyICpuZ0lmPVwib3B0aW9ucy5maWx0ZXJhYmxlXCIgY2xhc3M9XCJyb3dGaWx0ZXJcIj5cclxuXHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIj48L3RoPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gVGV4dCAtLT5cclxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImNoZWNrVHlwZSgnVGV4dCcsIGNvbCkgfHwgY2hlY2tUeXBlKCdGaWxlJywgY29sKSB8fCAoY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpICYmIGNvbC5vcHRpb25zLmZpbHRlckNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY2hlY2tUeXBlKCdEYXRlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLCAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgZGF0ZUZvcm1hdD1cImRkL21tL3l5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJjb2wuaWQgKyAnX2ZpbHRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5SW5wdXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwicmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dCdXR0b25CYXI9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckNsaWNrKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjaGVja1R5cGUoJ051bWJlcicsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIG1vZGU9XCJkZWNpbWFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU9XCJmci1GUlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gTGlzdGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjaGVja1R5cGUoJ0Ryb3Bkb3duJywgY29sKSB8fCBjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSB8fCBjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgfHwgY2hlY2tUeXBlKCdTdGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImNvbC5vcHRpb25zPy5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJJRFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImNvbC5vcHRpb25zPy5vcHRpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVNpemU9XCIzMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJjb2wub3B0aW9ucy5vcHRpb25Hcm91cENoaWxkcmVuICE9IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cExhYmVsXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cENoaWxkcmVuXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwQ2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1ncm91cCBwVGVtcGxhdGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tncm91cFtjb2wub3B0aW9ucy5vcHRpb25Hcm91cExhYmVsXX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBTd2l0Y2ggLS0+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjaGVja1R5cGUoJ1N3aXRjaCcsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cIm9wdGlvbnNTd2l0Y2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU2l6ZT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0gc2VsZWN0aW9ubsOpc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBOb24gZmlsdHJhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY2hlY2tUeXBlKCdJbWFnZScsIGNvbCkgfHwgKGNoZWNrVHlwZSgnQnV0dG9uJywgY29sKSAmJiAhY29sLm9wdGlvbnMuZmlsdGVyQ29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLCAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICA8IS0tIFRPVEFMIC0tPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMucm93VG90YWxcIiBjbGFzcz1cInJvd1RvdGFsXCI+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIj48L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjZW50ZXJUZXh0JyA6IHRydWUgfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0VG90YWwoY29sKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8IS0tIEdyb3VwaGVhZGVyIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImdyb3VwaGVhZGVyXCIgbGV0LXJvd0RhdGE+XHJcbiAgICAgICAgPHRyIHBSb3dHcm91cEhlYWRlciBjbGFzcz1cInJvd0dyb3VwaW5nXCI+XHJcbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0X2JvbGRcIj57eyByb3dEYXRhW29wdGlvbnMuZ3JvdXBpbmcub2JqXVtvcHRpb25zLmdyb3VwaW5nLmxpYmVsbGVdIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0gQm9keSAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGEgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgPHRyIGlkPVwie3sgcm93RGF0YS5pZCB9fVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhLmNvbG9yID8gcm93RGF0YS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd109XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93RGlzYWJsZWRdPVwiIW9wdGlvbnMuc2VsZWN0YWJsZSB8fCBpc01vZGVFZGl0aW9uKClcIj5cclxuXHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIiBjbGFzcz1cImNlbGxEZWxldGVcIj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cInJvd0RhdGFcIj48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUZXh0IC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5dPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BFZGl0YWJsZUNvbHVtbkZpZWxkXT1cImNvbC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnVGV4dCcsIGNvbCkgJiYgKCFpc01vZGVFZGl0aW9uKCkgfHwgcm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InIDogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9ucycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYXNlWkluZGV4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdiYXNlWkluZGV4JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICd2aXJ0dWFsU2Nyb2xsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TaXplPVwiMzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ0Ryb3Bkb3duJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXSA6ICcnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIE51bWJlciAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnTnVtYmVyJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbklucHV0TnVtYmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3Nob3dCdXR0b25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZml4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ByZWZpeCcpICsgJyAnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSA6IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSAhPSBudWxsICYmIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpID09IHRydWUgPyAwIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWF4RGVjaW1hbGVzJykgOiAyIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ051bWJlcicsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgbnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgbnVtYmVyIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ0RhdGUnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLCAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cImRkL21tL3l5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERheU9mV2Vlaz1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5SW5wdXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnRGF0ZScsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIE11bHRpU2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiZ2V0TXVsdGlTZWxlY3RDb25jYXQocm93RGF0YVtjb2wuaWRdLnZhbHVlLCBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnZmlsdGVyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VaSW5kZXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Jhc2VaSW5kZXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ZpcnR1YWxTY3JvbGwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU2l6ZT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0gc2VsZWN0aW9ubsOpc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkdyb3VwQ2hpbGRyZW4nKSAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBMYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBMYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBDaGlsZHJlbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWdyb3VwIHBUZW1wbGF0ZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2dyb3VwW2NvbC5vcHRpb25zLm9wdGlvbkdyb3VwTGFiZWxdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnTXVsdGlTZWxlY3QnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cImdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0TXVsdGlTZWxlY3RDb25jYXQocm93RGF0YVtjb2wuaWRdLnZhbHVlLCBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gSW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjaGVja1R5cGUoJ0ltYWdlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnZmxleCc6IGNvbC53aWR0aCA/ICcwIDAgYXV0bycgOiBudWxsLCAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZW50ZXJUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIiBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdpZHRoOiA0MHB4O1wiIHNyYz1cInt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhZGRpbmdDZWxsIGNlbnRlclRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIidwLWJ1dHRvbi0nICsgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3NldmVyaXR5JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdsYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdpY29uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnU2VsZWN0QnV0dG9uJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9ucycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25WYWx1ZScpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uVmFsdWUnKSA6ICd2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1zZWxlY3RCdXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IGdldFNlbGVjdExpYmVsbGVCeVZhbHVlKHJvd0RhdGEsIGNvbCkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3dpdGNoIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdTd2l0Y2gnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dFN3aXRjaCAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAoZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2FjdGlvbicpID09IG51bGwgJiYgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXRTd2l0Y2g+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRmlsZSAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImNoZWNrVHlwZSgnRmlsZScsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdXBsb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tCeUlkKCdpbnB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJ7eydvdXRwdXRfJyArIHJvd0RhdGFbY29sLmlkXS5pZH19XCIgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwie3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJyB9fVwiIHJlYWRvbmx5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiIGlkPVwie3snaW5wdXRfJyArIHJvd0RhdGFbY29sLmlkXS5pZH19XCIgI2lucHV0RmlsZSBwSW5wdXRUZXh0IHR5cGU9XCJmaWxlXCIgaGlkZGVuIChjaGFuZ2UpPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlID0gaW5wdXRGaWxlLmZpbGVzWzBdLm5hbWU7IG9uRWRpdENlbGwocm93RGF0YSwgY29sLCBpbnB1dEZpbGUuZmlsZXNbMF0pXCI+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdGaWxlJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdmbGV4JzogY29sLndpZHRoID8gJzAgMCBhdXRvJyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN0YXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY2hlY2tUeXBlKCdTdGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZsZXgnOiBjb2wud2lkdGggPyAnMCAwIGF1dG8nIDogbnVsbCwgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VudGVyVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8cC10YWcgW3ZhbHVlXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLnNldmVyaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLmljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBEZWxldGlvbiAtLT5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhLmRlbGV0YWJsZSA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwicm93RGF0YS5kZWxldGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBidXR0b25EZWxldGUgcC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTGluZShyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L3AtdGFibGU+XHJcbiJdfQ==
|