cilog-lib 1.10.1 → 1.10.3

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.
@@ -247,6 +247,7 @@ export class CilogTableComponent {
247
247
  document.getElementById(id).click();
248
248
  }
249
249
  onEditCell(row, column, value) {
250
+ event.stopPropagation();
250
251
  if (this.getOption(column, row, 'action') != null) {
251
252
  this.getOption(column, row, 'action')();
252
253
  }
@@ -581,8 +582,18 @@ export class CilogTableComponent {
581
582
  isModeEdition() {
582
583
  return this.options.editable;
583
584
  }
584
- isModeRowSelection() {
585
- return this.options.selectable == true && (this.options.modeSelection == null || this.options.modeSelection == ModeSelection.Row);
585
+ getModeSelection() {
586
+ if (this.options.selectable != true) {
587
+ return null;
588
+ }
589
+ switch (this.options.modeSelection) {
590
+ case ModeSelection.Checkbox:
591
+ case ModeSelection.Metakey:
592
+ return 'multiple';
593
+ case ModeSelection.Row:
594
+ default:
595
+ return 'single';
596
+ }
586
597
  }
587
598
  isModeCheckboxSelection() {
588
599
  return this.options.selectable == true && this.options.modeSelection != null && this.options.modeSelection == ModeSelection.Checkbox;
@@ -603,11 +614,11 @@ export class CilogTableComponent {
603
614
  });
604
615
  }
605
616
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.2", ngImport: i0, type: CilogTableComponent, deps: [{ token: i1.ConfirmationService }, { token: i1.FilterService }, { token: i0.ChangeDetectorRef }, { token: i2.ExportService }], target: i0.ɵɵFactoryTarget.Component }); }
606
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.2", 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", onFilterInit: "onFilterInit", onSort: "onSort", onPage: "onPage", onRowDoubleClick: "onRowDoubleClick" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }, { propertyName: "cm", first: true, predicate: ["cm"], descendants: true }, { propertyName: "inputNumber", first: true, predicate: ["inputNumber"], descendants: true }], ngImport: i0, template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n\r\n <button pButton\r\n *ngIf=\"options.exportExcel\"\r\n icon=\"pi pi-file-excel\"\r\n class=\"p-button-success absolute z-5 w-2rem h-2rem border-round-right border-noround-top\"\r\n pTooltip=\"Exporter le contenu de la grille au format Excel\"\r\n (click)=\"exportExcel()\">\r\n </button>\r\n\r\n <p-contextMenu #cm [model]=\"options.contextMenuItems\" />\r\n\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"isModeRowSelection() ? 'single' : 'multiple'\"\r\n [metaKeySelection]=\"isModeMetakeySelection()\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (onHeaderCheckboxToggle)=\"onSelectAll($event)\"\r\n (sortFunction)=\"sortGrille($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [groupRowsByOrder]=\"0\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScrollItemSize != null ? options.virtualScrollItemSize : 35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\"\r\n [(contextMenuSelection)]=\"contextMenuSelectedItem\"\r\n [contextMenu]=\"cm\">\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"!options.filterable && options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [pTooltip]=\"col.libelle\"\r\n [tooltipDisabled]=\"!col.tooltipHeader\"\r\n tooltipPosition=\"bottom\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && col.options.filterText)\r\n || (checkType('MultiSelect', col) && col.options.filterText)\r\n || checkType('Text', col)\r\n || checkType('File', col)\r\n || (checkType('Button', col) && col.options.filterCol))\r\n || checkType('Number', col)\r\n || checkType('CilogNumber', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n 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=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : '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 <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && !col.options.filterText) || (checkType('MultiSelect', col) && !col.options.filterText) || checkType('SelectButton', col) || checkType('State', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\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 [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScrollItemSize]=\"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=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\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\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotalStr(col) }}</div>\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=\"rowGrouping\">\r\n <td [attr.colspan]=\"columns.length\">\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\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\"\r\n (dblclick)=\"onRowDoubleClickEvent(rowData)\"\r\n [pContextMenuRow]=\"rowData\"\r\n [pContextMenuRowDisabled]=\"options.contextMenuItems == null\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></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=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (blur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keydown.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">\r\n {{ col.libelle }} :\r\n </div>\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n <ng-template let-data pTemplate=\"selectedItem\">\r\n <span *ngIf=\"data != null\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ data[getOption(col, rowData, 'optionLabel')] }}\r\n </span>\r\n <span *ngIf=\"data == null\"></span>\r\n </ng-template>\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [textColor]=\"rowData[col.id].textColor\"\r\n [bold]=\"rowData.bold == true || rowData[col.id].bold == true\"\r\n [italic]=\"rowData.italic == true || rowData[col.id].italic == true\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n (click)=\"onClickCellNumber(rowData, col)\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id] && !rowData[col.id].focus\">\r\n {{ getFormattedNumber(col, rowData, rowData[col.id].value) }}\r\n </div>\r\n <p-inputNumber #inputNumber\r\n *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly && rowData[col.id].focus == true\"\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 [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\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 (onBlur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onKeyDown)=\"onKeyDown($event, 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=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\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-data pTemplate=\"selectedItems\">\r\n <span *ngFor=\"let option of data, let i = index\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ option[getOption(col, rowData, 'optionLabel')] + (i != data.length - 1 ? ',' : '') }}\r\n </span>\r\n </ng-template>\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n *ngIf=\"rowData[col.id].value != null && isValueButtonByType(rowData[col.id].value, 'function')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [class]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n </button>\r\n <div *ngIf=\"isValueButtonByType(rowData[col.id].value, 'string')\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n {{ rowData[col.id].value }}\r\n </div>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 <ng-template let-item pTemplate=\"item\">\r\n <span class=\"text-center w-full\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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}}\"\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\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=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [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 [style]=\"{\r\n 'background-color': rowData[col.id].value.backgroundColor,\r\n 'color': rowData[col.id].value.textColor,\r\n 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null,\r\n 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null\r\n }\">\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</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:2!important}:host ::ng-deep .p-datatable-thead{z-index:3!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .suffixe,:host ::ng-deep .prefixe{height:25px;padding-top:1px!important}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!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-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{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;width:50px;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}: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}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i5.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "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", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i5.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i5.RowGroupHeader, selector: "[pRowGroupHeader]" }, { kind: "directive", type: i5.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i5.ContextMenuRow, selector: "[pContextMenuRow]", inputs: ["pContextMenuRow", "pContextMenuRowIndex", "pContextMenuRowDisabled"] }, { kind: "directive", type: i5.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i5.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i5.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i5.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i5.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i6.InputText, selector: "[pInputText]" }, { kind: "component", type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "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", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "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", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i11.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i12.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy", "pressDelay"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i14.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: i15.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "directive", type: i16.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i17.CilogInputNumberComponent, selector: "cilog-input-number", inputs: ["min", "max", "maxDecimals", "prefixe", "suffixe", "inputStyleClass", "disabled", "readonly", "textColor", "bold", "italic", "floatLabel"], outputs: ["onInput", "onChange", "onFocus", "onBlur"] }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] }); }
617
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.2", 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", onFilterInit: "onFilterInit", onSort: "onSort", onPage: "onPage", onRowDoubleClick: "onRowDoubleClick" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }, { propertyName: "cm", first: true, predicate: ["cm"], descendants: true }, { propertyName: "inputNumber", first: true, predicate: ["inputNumber"], descendants: true }], ngImport: i0, template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n\r\n <button pButton\r\n *ngIf=\"options.exportExcel\"\r\n icon=\"pi pi-file-excel\"\r\n class=\"p-button-success absolute z-5 w-2rem h-2rem border-round-right border-noround-top\"\r\n pTooltip=\"Exporter le contenu de la grille au format Excel\"\r\n (click)=\"exportExcel()\">\r\n </button>\r\n\r\n <p-contextMenu #cm [model]=\"options.contextMenuItems\" />\r\n\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"getModeSelection()\"\r\n [metaKeySelection]=\"isModeMetakeySelection()\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (onHeaderCheckboxToggle)=\"onSelectAll($event)\"\r\n (sortFunction)=\"sortGrille($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [groupRowsByOrder]=\"0\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScrollItemSize != null ? options.virtualScrollItemSize : 35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\"\r\n [(contextMenuSelection)]=\"contextMenuSelectedItem\"\r\n [contextMenu]=\"cm\">\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"!options.filterable && options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [pTooltip]=\"col.libelle\"\r\n [tooltipDisabled]=\"!col.tooltipHeader\"\r\n tooltipPosition=\"bottom\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && col.options.filterText)\r\n || (checkType('MultiSelect', col) && col.options.filterText)\r\n || checkType('Text', col)\r\n || checkType('File', col)\r\n || (checkType('Button', col) && col.options.filterCol))\r\n || checkType('Number', col)\r\n || checkType('CilogNumber', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n 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=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : '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 <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && !col.options.filterText) || (checkType('MultiSelect', col) && !col.options.filterText) || checkType('SelectButton', col) || checkType('State', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\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 [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScrollItemSize]=\"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=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\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\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotalStr(col) }}</div>\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=\"rowGrouping\">\r\n <td [attr.colspan]=\"columns.length\">\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\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 || isModeCheckboxSelection()\"\r\n (dblclick)=\"onRowDoubleClickEvent(rowData)\"\r\n [pContextMenuRow]=\"rowData\"\r\n [pContextMenuRowDisabled]=\"options.contextMenuItems == null\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></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=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (blur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keydown.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">\r\n {{ col.libelle }} :\r\n </div>\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n <ng-template let-data pTemplate=\"selectedItem\">\r\n <span *ngIf=\"data != null\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ data[getOption(col, rowData, 'optionLabel')] }}\r\n </span>\r\n <span *ngIf=\"data == null\"></span>\r\n </ng-template>\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [textColor]=\"rowData[col.id].textColor\"\r\n [bold]=\"rowData.bold == true || rowData[col.id].bold == true\"\r\n [italic]=\"rowData.italic == true || rowData[col.id].italic == true\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n (click)=\"onClickCellNumber(rowData, col)\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id] && !rowData[col.id].focus\">\r\n {{ getFormattedNumber(col, rowData, rowData[col.id].value) }}\r\n </div>\r\n <p-inputNumber #inputNumber\r\n *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly && rowData[col.id].focus == true\"\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 [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\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 (onBlur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onKeyDown)=\"onKeyDown($event, 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=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\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-data pTemplate=\"selectedItems\">\r\n <span *ngFor=\"let option of data, let i = index\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ option[getOption(col, rowData, 'optionLabel')] + (i != data.length - 1 ? ',' : '') }}\r\n </span>\r\n </ng-template>\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n *ngIf=\"rowData[col.id].value != null && isValueButtonByType(rowData[col.id].value, 'function')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [class]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n </button>\r\n <div *ngIf=\"isValueButtonByType(rowData[col.id].value, 'string')\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n {{ rowData[col.id].value }}\r\n </div>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 <ng-template let-item pTemplate=\"item\">\r\n <span class=\"text-center w-full\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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}}\"\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\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=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [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 [style]=\"{\r\n 'background-color': rowData[col.id].value.backgroundColor,\r\n 'color': rowData[col.id].value.textColor,\r\n 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null,\r\n 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null\r\n }\">\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</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:2!important}:host ::ng-deep .p-datatable-thead{z-index:3!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .suffixe,:host ::ng-deep .prefixe{height:25px;padding-top:1px!important}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!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-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{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;width:50px;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}: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}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i5.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "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", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i5.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i5.RowGroupHeader, selector: "[pRowGroupHeader]" }, { kind: "directive", type: i5.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i5.ContextMenuRow, selector: "[pContextMenuRow]", inputs: ["pContextMenuRow", "pContextMenuRowIndex", "pContextMenuRowDisabled"] }, { kind: "directive", type: i5.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i5.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i5.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i5.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i5.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i6.InputText, selector: "[pInputText]" }, { kind: "component", type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "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", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "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", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i11.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i12.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy", "pressDelay"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i14.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: i15.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "directive", type: i16.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i17.CilogInputNumberComponent, selector: "cilog-input-number", inputs: ["min", "max", "maxDecimals", "prefixe", "suffixe", "inputStyleClass", "disabled", "readonly", "textColor", "bold", "italic", "floatLabel"], outputs: ["onInput", "onChange", "onFocus", "onBlur"] }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] }); }
607
618
  }
608
619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.2", ngImport: i0, type: CilogTableComponent, decorators: [{
609
620
  type: Component,
610
- args: [{ selector: 'cilog-table', template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n\r\n <button pButton\r\n *ngIf=\"options.exportExcel\"\r\n icon=\"pi pi-file-excel\"\r\n class=\"p-button-success absolute z-5 w-2rem h-2rem border-round-right border-noround-top\"\r\n pTooltip=\"Exporter le contenu de la grille au format Excel\"\r\n (click)=\"exportExcel()\">\r\n </button>\r\n\r\n <p-contextMenu #cm [model]=\"options.contextMenuItems\" />\r\n\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"isModeRowSelection() ? 'single' : 'multiple'\"\r\n [metaKeySelection]=\"isModeMetakeySelection()\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (onHeaderCheckboxToggle)=\"onSelectAll($event)\"\r\n (sortFunction)=\"sortGrille($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [groupRowsByOrder]=\"0\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScrollItemSize != null ? options.virtualScrollItemSize : 35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\"\r\n [(contextMenuSelection)]=\"contextMenuSelectedItem\"\r\n [contextMenu]=\"cm\">\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"!options.filterable && options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [pTooltip]=\"col.libelle\"\r\n [tooltipDisabled]=\"!col.tooltipHeader\"\r\n tooltipPosition=\"bottom\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && col.options.filterText)\r\n || (checkType('MultiSelect', col) && col.options.filterText)\r\n || checkType('Text', col)\r\n || checkType('File', col)\r\n || (checkType('Button', col) && col.options.filterCol))\r\n || checkType('Number', col)\r\n || checkType('CilogNumber', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n 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=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : '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 <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && !col.options.filterText) || (checkType('MultiSelect', col) && !col.options.filterText) || checkType('SelectButton', col) || checkType('State', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\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 [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScrollItemSize]=\"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=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\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\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotalStr(col) }}</div>\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=\"rowGrouping\">\r\n <td [attr.colspan]=\"columns.length\">\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\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\"\r\n (dblclick)=\"onRowDoubleClickEvent(rowData)\"\r\n [pContextMenuRow]=\"rowData\"\r\n [pContextMenuRowDisabled]=\"options.contextMenuItems == null\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></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=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (blur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keydown.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">\r\n {{ col.libelle }} :\r\n </div>\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n <ng-template let-data pTemplate=\"selectedItem\">\r\n <span *ngIf=\"data != null\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ data[getOption(col, rowData, 'optionLabel')] }}\r\n </span>\r\n <span *ngIf=\"data == null\"></span>\r\n </ng-template>\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [textColor]=\"rowData[col.id].textColor\"\r\n [bold]=\"rowData.bold == true || rowData[col.id].bold == true\"\r\n [italic]=\"rowData.italic == true || rowData[col.id].italic == true\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n (click)=\"onClickCellNumber(rowData, col)\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id] && !rowData[col.id].focus\">\r\n {{ getFormattedNumber(col, rowData, rowData[col.id].value) }}\r\n </div>\r\n <p-inputNumber #inputNumber\r\n *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly && rowData[col.id].focus == true\"\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 [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\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 (onBlur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onKeyDown)=\"onKeyDown($event, 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=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\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-data pTemplate=\"selectedItems\">\r\n <span *ngFor=\"let option of data, let i = index\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ option[getOption(col, rowData, 'optionLabel')] + (i != data.length - 1 ? ',' : '') }}\r\n </span>\r\n </ng-template>\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n *ngIf=\"rowData[col.id].value != null && isValueButtonByType(rowData[col.id].value, 'function')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [class]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n </button>\r\n <div *ngIf=\"isValueButtonByType(rowData[col.id].value, 'string')\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n {{ rowData[col.id].value }}\r\n </div>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 <ng-template let-item pTemplate=\"item\">\r\n <span class=\"text-center w-full\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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}}\"\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\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=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [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 [style]=\"{\r\n 'background-color': rowData[col.id].value.backgroundColor,\r\n 'color': rowData[col.id].value.textColor,\r\n 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null,\r\n 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null\r\n }\">\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</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:2!important}:host ::ng-deep .p-datatable-thead{z-index:3!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .suffixe,:host ::ng-deep .prefixe{height:25px;padding-top:1px!important}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!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-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{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;width:50px;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}: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}\n"] }]
621
+ args: [{ selector: 'cilog-table', template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n\r\n <button pButton\r\n *ngIf=\"options.exportExcel\"\r\n icon=\"pi pi-file-excel\"\r\n class=\"p-button-success absolute z-5 w-2rem h-2rem border-round-right border-noround-top\"\r\n pTooltip=\"Exporter le contenu de la grille au format Excel\"\r\n (click)=\"exportExcel()\">\r\n </button>\r\n\r\n <p-contextMenu #cm [model]=\"options.contextMenuItems\" />\r\n\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"getModeSelection()\"\r\n [metaKeySelection]=\"isModeMetakeySelection()\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (onHeaderCheckboxToggle)=\"onSelectAll($event)\"\r\n (sortFunction)=\"sortGrille($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [groupRowsByOrder]=\"0\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScrollItemSize != null ? options.virtualScrollItemSize : 35\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\"\r\n [(contextMenuSelection)]=\"contextMenuSelectedItem\"\r\n [contextMenu]=\"cm\">\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"!options.filterable && options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [pTooltip]=\"col.libelle\"\r\n [tooltipDisabled]=\"!col.tooltipHeader\"\r\n tooltipPosition=\"bottom\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\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\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n <p-tableHeaderCheckbox *ngIf=\"options.toggleAll\"></p-tableHeaderCheckbox>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && col.options.filterText)\r\n || (checkType('MultiSelect', col) && col.options.filterText)\r\n || checkType('Text', col)\r\n || checkType('File', col)\r\n || (checkType('Button', col) && col.options.filterCol))\r\n || checkType('Number', col)\r\n || checkType('CilogNumber', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n 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=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : '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 <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && ((checkType('Dropdown', col) && !col.options.filterText) || (checkType('MultiSelect', col) && !col.options.filterText) || checkType('SelectButton', col) || checkType('State', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\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 [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [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 [virtualScrollItemSize]=\"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=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\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\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotalStr(col) }}</div>\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=\"rowGrouping\">\r\n <td [attr.colspan]=\"columns.length\">\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\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 || isModeCheckboxSelection()\"\r\n (dblclick)=\"onRowDoubleClickEvent(rowData)\"\r\n [pContextMenuRow]=\"rowData\"\r\n [pContextMenuRowDisabled]=\"options.contextMenuItems == null\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></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=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (blur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keydown.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">\r\n {{ col.libelle }} :\r\n </div>\r\n <div *ngIf=\"rowData[col.id]\"\r\n style=\"white-space: pre;\">\r\n {{ getFormattedText(col, rowData) }}\r\n </div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n <ng-template let-data pTemplate=\"selectedItem\">\r\n <span *ngIf=\"data != null\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ data[getOption(col, rowData, 'optionLabel')] }}\r\n </span>\r\n <span *ngIf=\"data == null\"></span>\r\n </ng-template>\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [textColor]=\"rowData[col.id].textColor\"\r\n [bold]=\"rowData.bold == true || rowData[col.id].bold == true\"\r\n [italic]=\"rowData.italic == true || rowData[col.id].italic == true\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n (click)=\"onClickCellNumber(rowData, col)\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id] && !rowData[col.id].focus\">\r\n {{ getFormattedNumber(col, rowData, rowData[col.id].value) }}\r\n </div>\r\n <p-inputNumber #inputNumber\r\n *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly && rowData[col.id].focus == true\"\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 [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\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 (onBlur)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onKeyDown)=\"onKeyDown($event, 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=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left',\r\n 'text-right': col.position == 'right' || col.position == null,\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [inputStyle]=\"{ 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null, 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null }\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center'\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"paddingCell\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\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-data pTemplate=\"selectedItems\">\r\n <span *ngFor=\"let option of data, let i = index\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ option[getOption(col, rowData, 'optionLabel')] + (i != data.length - 1 ? ',' : '') }}\r\n </span>\r\n </ng-template>\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n *ngIf=\"rowData[col.id].value != null && isValueButtonByType(rowData[col.id].value, 'function')\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n [class]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n </button>\r\n <div *ngIf=\"isValueButtonByType(rowData[col.id].value, 'string')\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n {{ rowData[col.id].value }}\r\n </div>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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]=\"{\r\n 'paddingCell': rowData[col.id] != null\r\n }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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 <ng-template let-item pTemplate=\"item\">\r\n <span class=\"text-center w-full\"\r\n [ngClass]=\"{\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ '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 pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\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}}\"\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"{\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\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=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\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 [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [ngClass]=\"{\r\n 'paddingCell': rowData[col.id] != null,\r\n 'text-left': col.position == 'left' || col.position == null,\r\n 'text-right': col.position == 'right',\r\n 'text-center': col.position == 'center',\r\n 'font-bold': rowData.bold == true || rowData[col.id].bold == true,\r\n 'font-italic': rowData.italic == true || rowData[col.id].italic == true\r\n }\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ '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=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [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 [style]=\"{\r\n 'background-color': rowData[col.id].value.backgroundColor,\r\n 'color': rowData[col.id].value.textColor,\r\n 'font-weight': rowData.bold == true || rowData[col.id].bold == true ? 'bold' : null,\r\n 'font-style': rowData.italic == true || rowData[col.id].italic == true ? 'italic' : null\r\n }\">\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</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:2!important}:host ::ng-deep .p-datatable-thead{z-index:3!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .suffixe,:host ::ng-deep .prefixe{height:25px;padding-top:1px!important}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!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-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{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;width:50px;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}: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}\n"] }]
611
622
  }], ctorParameters: () => [{ type: i1.ConfirmationService }, { type: i1.FilterService }, { type: i0.ChangeDetectorRef }, { type: i2.ExportService }], propDecorators: { columns: [{
612
623
  type: Input
613
624
  }], columnsChange: [{
@@ -650,4 +661,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.2", ngImpor
650
661
  type: ViewChild,
651
662
  args: ['inputNumber']
652
663
  }] } });
653
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVekUsTUFBTSxPQUFPLG1CQUFtQjtJQXFDNUIsWUFDWSxtQkFBd0MsRUFDeEMsYUFBNEIsRUFDNUIsS0FBd0IsRUFDeEIsYUFBNEI7UUFINUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZDeEMsZUFBVSxHQUFZLElBQUksQ0FBQztRQUdqQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFHOUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBTTFDLFdBQU0sR0FBMkIsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUM5RCxlQUFVLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFDbEUsYUFBUSxHQUErQixJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUN4RSxhQUFRLEdBQTZCLElBQUksWUFBWSxFQUFjLENBQUM7UUFDcEUsZUFBVSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3RFLGFBQVEsR0FBMEIsSUFB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LENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2xDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDN0IsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dDQUNoRSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDdEMsQ0FBQzt3QkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDUCxDQUFDO3lCQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3RDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDMUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDbkQsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUMsQ0FBQyxD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dEVtaXR0ZXIsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgRmlsdGVyU2VydmljZSwgTGF6eUxvYWRFdmVudCwgU29ydEV2ZW50IH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBJRWRpdGlvbiwgSVN1cHByZXNzaW9uLCBJU2VsZWN0aW9uLCBJRmlsdGVyLCBJU29ydCwgSVBhZ2UsIElTb3J0Q3VzdG9tIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnRlcmZhY2VzL2VkaXRpb24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgSUNvbHVtbiwgSVJvdywgSU9wdGlvbnNHcmlsbGUsIElDZWxsLCBJT3B0aW9uc0ZpbGUsIElPcHRpb25zTXVsdGlTZWxlY3QsIElPcHRpb25zRHJvcGRvd24sIElPcHRpb25zTnVtYmVyIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnRlcmZhY2VzL2dyaWxsZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBDb2xUeXBlLCBNb2RlU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtcy9ncmlsbGUuZW51bSc7XHJcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leGNlbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICdwcmltZW5nL2NvbnRleHRtZW51JztcclxuaW1wb3J0IHsgSW5wdXROdW1iZXIgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjaWxvZy10YWJsZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2lsb2dUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgaW5pdEZpbHRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgY29sdW1uczogSUNvbHVtbltdO1xyXG4gICAgQE91dHB1dCgpIGNvbHVtbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5bXT4oKTtcclxuXHJcbiAgICBASW5wdXQoKSB2YWx1ZXM6IElSb3dbXTtcclxuICAgIEBPdXRwdXQoKSB2YWx1ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dbXT4oKTtcclxuXHJcbiAgICBASW5wdXQoKSBvcHRpb25zOiBJT3B0aW9uc0dyaWxsZTtcclxuXHJcbiAgICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuO1xyXG5cclxuICAgIEBPdXRwdXQoKSBvbkVkaXQ6IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElFZGl0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRWRpdEluaXQ6IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElFZGl0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRGVsZXRlOiBFdmVudEVtaXR0ZXI8SVN1cHByZXNzaW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVN1cHByZXNzaW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25VbnNlbGVjdDogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRmlsdGVyOiBFdmVudEVtaXR0ZXI8SUZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXI+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25GaWx0ZXJJbml0OiBFdmVudEVtaXR0ZXI8SVJvd1tdPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1tdPigpO1xyXG4gICAgQE91dHB1dCgpIG9uU29ydDogRXZlbnRFbWl0dGVyPElTb3J0PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25QYWdlOiBFdmVudEVtaXR0ZXI8SVBhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGFnZT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblJvd0RvdWJsZUNsaWNrOiBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+KCk7XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dzOiBJUm93W10gfCBJUm93O1xyXG5cclxuICAgIGZpbHRlckRhdGVzUmFuZ2U6IERhdGVbXTtcclxuXHJcbiAgICBvcHRpb25zU3dpdGNoOiBhbnlbXTtcclxuXHJcbiAgICBjb250ZXh0TWVudVNlbGVjdGVkSXRlbTogSVJvdztcclxuXHJcbiAgICBAVmlld0NoaWxkKCd0YWJsZScsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlOiBUYWJsZTtcclxuICAgIEBWaWV3Q2hpbGQoJ2NtJykgY206IENvbnRleHRNZW51O1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXROdW1iZXInKSBpbnB1dE51bWJlcjogSW5wdXROdW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIGV4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zU3dpdGNoID0gW1xyXG4gICAgICAgICAgICB7IGxhYmVsOiAnT3VpJywgdmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogJ05vbicsIHZhbHVlOiBmYWxzZSB9LFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgLy8gRGF0ZVxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignZGF0ZVJhbmdlRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gZmlsdGVyWzBdLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGVuZDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgZW5kRGF0ZTogRGF0ZTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlclsxXSkge1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKGZpbHRlclsxXS5nZXRGdWxsWWVhcigpLCBmaWx0ZXJbMV0uZ2V0TW9udGgoKSwgZmlsdGVyWzFdLmdldERhdGUoKSwgMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gbmV3IERhdGUoZmlsdGVyWzBdLmdldEZ1bGxZZWFyKCksIGZpbHRlclswXS5nZXRNb250aCgpLCBmaWx0ZXJbMF0uZ2V0RGF0ZSgpLCAyMywgNTksIDU5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbmQgPSBlbmREYXRlLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNlbGwudmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogY2VsbC52YWx1ZS5nZXRUaW1lKCkgPj0gc3RhcnQgJiYgY2VsbC52YWx1ZS5nZXRUaW1lKCkgPD0gZW5kO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIE9iamV0XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdvYmpldEZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5maW5kKHZhbCA9PiB2YWwuSUQgPT0gY2VsbC52YWx1ZT8uSUQpICE9IG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gU2VsZWN0IEJ1dHRvblxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3Rlcignc2VsZWN0QnV0dG9uRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyLmZpbmQodmFsID0+IHZhbC52YWx1ZSA9PSBjZWxsLnZhbHVlKSAhPSBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdsaXN0ZUZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZpbHRlci5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbC52YWx1ZS5pbmRleE9mKHZhbCkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gb2s7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCdzd2l0Y2hGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoZmlsdGVyLmluZGV4T2YoY2VsbC52YWx1ZSkgIT0gLTEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEJ1dHRvblxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignYnV0dG9uRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbHRlck9iakZpZWxkOiBzdHJpbmcgPSBjZWxsLm9wdGlvbnNbJ2ZpbHRlck9iakZpZWxkJ107XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJPYmpTdWJGaWVsZDogc3RyaW5nID0gY2VsbC5vcHRpb25zWydmaWx0ZXJPYmpTdWJGaWVsZCddO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGwub2JqID09IG51bGwgfHwgZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLnRyaW0oKSA9PSAnJyB8fCBmaWx0ZXJPYmpGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpbHRlck9ialN1YkZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZWxsLm9ialtmaWx0ZXJPYmpGaWVsZF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5vYmpbZmlsdGVyT2JqRmllbGRdLmZpbmQodmFsID0+IHZhbFtmaWx0ZXJPYmpTdWJGaWVsZF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSkpICE9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBUZXh0XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCd0ZXh0RmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci50cmltKCkgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjZWxsLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbC52YWx1ZSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjZWxsLnZhbHVlID09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGNlbGwudmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJywnKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNlbGwudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbC5vcHRpb25zID09IG51bGwgfHwgY2VsbC5vcHRpb25zWydvcHRpb25MYWJlbEZpbHRlclRleHQnXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0TXVsdGlTZWxlY3RDb25jYXQoY2VsbC52YWx1ZSwgY2VsbC5vcHRpb25zWydvcHRpb25MYWJlbEZpbHRlclRleHQnXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbC5vcHRpb25zID09IG51bGwgfHwgY2VsbC5vcHRpb25zWydvcHRpb25MYWJlbEZpbHRlclRleHQnXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNlbGwudmFsdWVbY2VsbC5vcHRpb25zWydvcHRpb25MYWJlbEZpbHRlclRleHQnXV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zID0geyBkZWZhdWx0RmlsdGVyczogbnVsbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9uc1snb25seUxpc3RWYWx1ZXMnXSAmJiBjb2wub3B0aW9uc1snb3B0aW9uR3JvdXBMYWJlbCddID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10gPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxbY29sLmlkXS52YWx1ZS5mb3JFYWNoKHZhbDIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zWydvcHRpb25zJ10uZmluZChvcHQgPT4gb3B0LklEID09IHZhbDIuSUQpID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wub3B0aW9uc1snb3B0aW9ucyddLnB1c2godmFsMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5Ecm9wZG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCAmJiBjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC5JRCA9PSB2YWxbY29sLmlkXS52YWx1ZS5JRCkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5wdXNoKHZhbFtjb2wuaWRdLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY29sLm9wdGlvbnNbJ29wdGlvbnMnXSA9IFsuLi5jb2wub3B0aW9uc1snb3B0aW9ucyddLnNvcnQoKGEsIGIpID0+IGFbY29sLm9wdGlvbnNbJ29wdGlvbkxhYmVsJ11dLmxvY2FsZUNvbXBhcmUoYVtjb2wub3B0aW9uc1snb3B0aW9uTGFiZWwnXV0pKV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNvbHVtbnNDaGFuZ2UuZW1pdCh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMgIT0gbnVsbCkubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0RmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNvbC5pbnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCBjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycywgdGhpcy5nZXRGaWx0ZXJCeUNvbChjb2wpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50YWJsZS5zY3JvbGxlciAmJiB0aGlzLm9wdGlvbnMubW9kZUFwcGVuZE9ubHkpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZS5zY3JvbGxlci5hcHBlbmRPbmx5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRmlsdGVyVGFibGUoZXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbml0RmlsdGVyID09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkZpbHRlckluaXQuZW1pdChldmVudC5maWx0ZXJlZFZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0RmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uSW5wdXROdW1iZXIoZXZlbnQpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgbG9hZExhenkoZXZlbnQ6IExhenlMb2FkRXZlbnQpIHtcclxuICAgICAgICAvL3RoaXMudmFsdWVzID0gZXZlbnQucm93cy5zbGljZShldmVudC5maXJzdCwgKGV2ZW50LmZpcnN0ICsgZXZlbnQucm93cykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNvcnRcclxuICAgIHNvcnRHcmlsbGUoZXZlbnQ6IFNvcnRFdmVudCkge1xyXG5cclxuICAgICAgICBsZXQgY29sOiBJQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5pZCA9PSBldmVudC5maWVsZCk7XHJcbiAgICAgICAgdGhpcy5vblNvcnQuZW1pdCh7IGNvbHVtbjogY29sLCBvcmRlcjogZXZlbnQub3JkZXIgfSlcclxuICAgICAgICBsZXQgdHlwZUNvbDogQ29sVHlwZSA9IGNvbC50eXBlO1xyXG5cclxuICAgICAgICBldmVudC5kYXRhLnNvcnQoKGRhdGExLCBkYXRhMikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUxID0gZGF0YTFbZXZlbnQuZmllbGRdLnZhbHVlO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUyID0gZGF0YTJbZXZlbnQuZmllbGRdLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zLmN1c3RvbVNvcnQgJiYgY29sLm9wdGlvbnMuc29ydEZ1bmN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2wub3B0aW9ucy5zb3J0RnVuY3Rpb24oeyBjb2x1bW46IGNvbCwgb3JkZXI6IGV2ZW50Lm9yZGVyLCB2YWx1ZTE6IHZhbHVlMSwgdmFsdWUyOiB2YWx1ZTIgfSBhcyBJU29ydEN1c3RvbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLlRleHQgfHwgdHlwZUNvbCA9PSBDb2xUeXBlLkZpbGUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTFbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJyldID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTJbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMiwgJ29wdGlvbkxhYmVsJyldID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlMSwgdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJykpLmxvY2FsZUNvbXBhcmUodGhpcy5nZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZTIsIHRoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQ29sID09IENvbFR5cGUuRHJvcGRvd24gfHwgdHlwZUNvbCA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbiB8fCB0eXBlQ29sID09IENvbFR5cGUuU3RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUxW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTEsICdvcHRpb25MYWJlbCcpXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUyW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUxW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTEsICdvcHRpb25MYWJlbCcpXS5sb2NhbGVDb21wYXJlKHZhbHVlMlt0aGlzLmdldE9wdGlvbihjb2wsIGRhdGEyLCAnb3B0aW9uTGFiZWwnKV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk51bWJlciB8fCB0eXBlQ29sID09IENvbFR5cGUuQ2lsb2dOdW1iZXIgfHwgdHlwZUNvbCA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAodmFsdWUxIDwgdmFsdWUyKSA/IC0xIDogKHZhbHVlMSA+IHZhbHVlMikgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLlN3aXRjaClcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAodmFsdWUxID09PSB2YWx1ZTIpID8gMCA6IHZhbHVlMSA/IC0xIDogMTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gMDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQub3JkZXIgKiByZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNoZWNrVHlwZSh0eXBlQ29sOiBzdHJpbmcsIGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIHJldHVybiBjb2xbJ3R5cGUnXSA9PSB0eXBlQ29sO1xyXG4gICAgfVxyXG5cclxuICAgIGNsaWNrQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2x1bW4sIHJvdywgJ2FjdGlvbicpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oY29sdW1uLCByb3csICdhY3Rpb24nKSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMub25FZGl0LmVtaXQoeyByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4sIHZhbHVlOiB2YWx1ZSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERlc3Ryb3kgRm9jdXNcclxuICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHZhbFtjb2x1bW4uaWRdLmZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCByb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmIChldmVudC5rZXkgPT0gJ0VudGVyJykge1xyXG4gICAgICAgICAgICB0aGlzLm9uRWRpdENlbGwocm93LCBjb2x1bW4sIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdE11bHRpc2VsZWN0KHJvdzogSVJvdywgY29sdW1uOiBJQ29sdW1uLCBldmVudCkge1xyXG4gICAgICAgIHRoaXMub25FZGl0Q2VsbChyb3csIGNvbHVtbiwgeyBsaXN0U2VsZWN0ZWQ6IGV2ZW50LnZhbHVlLCBpdGVtU2VsZWN0ZWQ6IGV2ZW50Lml0ZW1WYWx1ZSwgc2VsZWN0ZWQ6IGV2ZW50LnZhbHVlLmluZGV4T2YoZXZlbnQuaXRlbVZhbHVlKSAhPSAtMSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdEFsbChldmVudCkge1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QuZW1pdCh7IHJvdzogbnVsbCwgc2VsZWN0ZWRSb3dzOiB0aGlzLnNlbGVjdGVkUm93cywgY2hlY2tlZDogZXZlbnQuY2hlY2tlZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdFJvdyhyb3c6IElSb3cpIHtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoeyByb3c6IHJvdywgc2VsZWN0ZWRSb3dzOiB0aGlzLnNlbGVjdGVkUm93cywgY2hlY2tlZDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvblVuc2VsZWN0Um93KHJvdzogSVJvdykge1xyXG4gICAgICAgIHRoaXMub25VbnNlbGVjdC5lbWl0KHsgcm93OiByb3csIHNlbGVjdGVkUm93czogdGhpcy5zZWxlY3RlZFJvd3MsIGNoZWNrZWQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydGFibGUgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBbLi4udGhpcy52YWx1ZXNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VUYWJsZShldmVudDogSVBhZ2UpIHtcclxuICAgICAgICB0aGlzLm9uUGFnZS5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZUxpbmUocm93OiBJUm93KSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxseURlbGV0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRGVsZXRlLmVtaXQoeyByb3c6IHJvdyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgICAgICAgICAgICBrZXk6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfDinRlcy12b3VzIHPDu3IgZGUgdm91bG9pciBzdXBwcmltZXIgY2V0dGUgbGlnbmUgPycsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zcGxpY2UodGhpcy52YWx1ZXMuaW5kZXhPZihyb3cpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlc107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRlbGV0ZS5lbWl0KHsgcm93OiByb3cgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRJbml0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25FZGl0SW5pdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Sb3dEb3VibGVDbGlja0V2ZW50KHJvdzogSVJvdykge1xyXG4gICAgICAgIHRoaXMub25Sb3dEb3VibGVDbGljay5lbWl0KHsgcm93OiByb3cgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3B0aW9uKGNvbCwgcm93LCBvcHRpb246IHN0cmluZykge1xyXG4gICAgICAgIGlmIChyb3cgIT0gbnVsbCAmJiByb3dbY29sLmlkXS5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKHJvd1tjb2wuaWRdLm9wdGlvbnNbb3B0aW9uXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcm93W2NvbC5pZF0ub3B0aW9uc1tvcHRpb25dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2wgIT0gbnVsbCAmJiBjb2wub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9uc1tvcHRpb25dICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2wub3B0aW9uc1tvcHRpb25dXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TXVsdGlTZWxlY3RDb25jYXQodmFsdWUsIGxhYmVsOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKHZhbCA9PiB7IHJldHVybiB2YWxbbGFiZWxdOyB9KS5qb2luKCcsICcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0TGliZWxsZUJ5VmFsdWUocm93LCBjb2wpIHtcclxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gICAgICAgIGlmIChyb3dbY29sLmlkXS52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd1tjb2wuaWRdLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsYWJlbCA9IHJvd1tjb2wuaWRdLm9wdGlvbnNbJ29wdGlvbnMnXS5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT0gcm93W2NvbC5pZF0udmFsdWUpW3Jvd1tjb2wuaWRdLm9wdGlvbnMub3B0aW9uTGFiZWxdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGNvbC5vcHRpb25zWydvcHRpb25zJ10uZmluZChvcHQgPT4gb3B0LnZhbHVlID09IHJvd1tjb2wuaWRdLnZhbHVlKVtjb2wub3B0aW9ucy5vcHRpb25MYWJlbF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbHRlckJ5Q29sKGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIC8vIERhdGVzIChyYW5nZSlcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5EYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZGF0ZVJhbmdlRmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT2JqZXRcclxuICAgICAgICBpZiAoKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24gJiYgISg8SU9wdGlvbnNEcm9wZG93bj5jb2wub3B0aW9ucykuZmlsdGVyVGV4dCkgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TdGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ29iamV0RmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTGlzdGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCAmJiAhKDxJT3B0aW9uc011bHRpU2VsZWN0PmNvbC5vcHRpb25zKS5maWx0ZXJUZXh0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbGlzdGVGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUZXh0ZVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkZpbGVcclxuICAgICAgICAgICAgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5UZXh0XHJcbiAgICAgICAgICAgIHx8IGNvbC50eXBlID09IENvbFR5cGUuTnVtYmVyXHJcbiAgICAgICAgICAgIHx8IGNvbC50eXBlID09IENvbFR5cGUuQ2lsb2dOdW1iZXJcclxuICAgICAgICAgICAgfHwgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QgJiYgKDxJT3B0aW9uc011bHRpU2VsZWN0PmNvbC5vcHRpb25zKS5maWx0ZXJUZXh0KVxyXG4gICAgICAgICAgICB8fCAoY29sLnR5cGUgPT0gQ29sVHlwZS5Ecm9wZG93biAmJiAoPElPcHRpb25zRHJvcGRvd24+Y29sLm9wdGlvbnMpLmZpbHRlclRleHQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAndGV4dEZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLlN3aXRjaCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3N3aXRjaEZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3NlbGVjdEJ1dHRvbkZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRmlsdGVyQ29sKGV2ZW50LCBjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICBsZXQgdmFsdWU6IGFueTtcclxuXHJcbiAgICAgICAgLy8gRGF0ZXMgKHJhbmdlKVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT2JqZXRcclxuICAgICAgICBpZiAoKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24gJiYgISg8SU9wdGlvbnNEcm9wZG93bj5jb2wub3B0aW9ucykuZmlsdGVyVGV4dCkgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TdGF0ZSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50ID09IG51bGwgPyBudWxsIDogZXZlbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QgJiYgISg8SU9wdGlvbnNNdWx0aVNlbGVjdD5jb2wub3B0aW9ucykuZmlsdGVyVGV4dCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50ID09IG51bGwgPyBudWxsIDogZXZlbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRleHRlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRmlsZVxyXG4gICAgICAgICAgICB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlRleHRcclxuICAgICAgICAgICAgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXJcclxuICAgICAgICAgICAgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5DaWxvZ051bWJlclxyXG4gICAgICAgICAgICB8fCAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCAmJiAoPElPcHRpb25zTXVsdGlTZWxlY3Q+Y29sLm9wdGlvbnMpLmZpbHRlclRleHQpXHJcbiAgICAgICAgICAgIHx8IChjb2wudHlwZSA9PSBDb2xUeXBlLkRyb3Bkb3duICYmICg8SU9wdGlvbnNEcm9wZG93bj5jb2wub3B0aW9ucykuZmlsdGVyVGV4dCkpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLlN3aXRjaCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZWxlY3RCdXR0b25cclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24pIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudCA9PSBudWxsID8gbnVsbCA6IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBCdXR0b25cclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5CdXR0b24pIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpbHRlcihjb2wsIHZhbHVlLCB0aGlzLmdldEZpbHRlckJ5Q29sKGNvbCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlLnNjcm9sbGVyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZS5zY3JvbGxlci5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZS5zY3JvbGxlci5pbml0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW46IGNvbCwgdmFsdWU6IHZhbHVlLCBmaWx0ZXJlZFZhbHVlOiB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWUgfSlcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXIoY29sOiBJQ29sdW1uLCB2YWw6IGFueSwgZmlsdGVyOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWVyIC0gQ29sbGVyIGRlIGxhIG3DqXRob2RlIGZpbHRlcigpIGRlIHRhYmxlLnRzIGRlIFByaW1lTkcgc2FucyBsYSBkw6lzeW5jaHJvbmlzYXRpb24gY2F1c8OpZSBwYXIgZmlsdGVyRGVsYXkgKHNldFRpbWVvdXQpXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUuZmlsdGVyVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlLmlzRmlsdGVyQmxhbmsodmFsKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLmZpbHRlcnNbY29sLmlkXSA9IHsgdmFsdWU6IHZhbCwgbWF0Y2hNb2RlOiBmaWx0ZXIgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFibGUuZmlsdGVyc1tjb2wuaWRdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlLmZpbHRlcnNbY29sLmlkXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudGFibGUuX2ZpbHRlcigpO1xyXG4gICAgICAgIHRoaXMudGFibGUuZmlsdGVyVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50YWJsZS5hbmNob3JSb3dJbmRleCA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlLnNjcm9sbGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGUuc2Nyb2xsZXIudmlld0luaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgaWYgKGNvbC5kaXNwbGF5VG90YWwgJiYgKGNvbC50eXBlID09IENvbFR5cGUuTnVtYmVyIHx8IGNvbC50eXBlID09IENvbFR5cGUuQ2lsb2dOdW1iZXIpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZXM6IElSb3dbXSA9IHRoaXMudmFsdWVzO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvdGFsQnlGaWx0ZXIgPT0gdHJ1ZSAmJiB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy50YWJsZS5maWx0ZXJlZFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0b3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsLmV4Y2x1c2lvblRvdGFsICYmICF2YWxbY29sLmlkXS5leGNsdXNpb25Ub3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLkNoZWNrYm94ICYmIHRoaXMub3B0aW9ucy50b3RhbEJ5U2VsZWN0aW9uID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUm93cyAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRSb3dzLmZpbmQocm93ID0+IHJvdy5pZCA9PSB2YWwuaWQpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUb3RhbFN0cihjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICBpZiAoY29sLmRpc3BsYXlUb3RhbCAmJiAoY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5DaWxvZ051bWJlcikpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb2wubWV0aG9kVG90YWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgbnVsbCwgY29sLm1ldGhvZFRvdGFsKCksIHRydWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlczogSVJvd1tdID0gdGhpcy52YWx1ZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvdGFsQnlGaWx0ZXIgPT0gdHJ1ZSAmJiB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCB0b3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwuZXhjbHVzaW9uVG90YWwgJiYgIXZhbFtjb2wuaWRdLmV4Y2x1c2lvblRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gPT0gTW9kZVNlbGVjdGlvbi5DaGVja2JveCAmJiB0aGlzLm9wdGlvbnMudG90YWxCeVNlbGVjdGlvbiA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzICE9IG51bGwgJiYgdGhpcy5zZWxlY3RlZFJvd3MuZmluZChyb3cgPT4gcm93LmlkID09IHZhbC5pZCkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSAodmFsW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHZhbFtjb2wuaWRdLnZhbHVlIDogMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvcm1hdHRlZE51bWJlcihjb2wsIG51bGwsIHRvdGFsLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtYXR0ZWRUZXh0KGNvbDogSUNvbHVtbiwgcm93RGF0YTogSVJvdykge1xyXG4gICAgICAgIGxldCB2YWx1ZTogc3RyaW5nID0gcm93RGF0YVtjb2wuaWRdLnZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRlbnRhdGlvbjogbnVtYmVyID0gdGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnaW5kZW50YXRpb24nKTtcclxuICAgICAgICAgICAgaWYgKGluZGVudGF0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnICAgICAgICcucmVwZWF0KGluZGVudGF0aW9uKSArIHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtYXR0ZWROdW1iZXIoY29sOiBJQ29sdW1uLCByb3dEYXRhOiBJUm93LCB2YWx1ZTogbnVtYmVyLCB0b3RhbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZmluYWxWYWx1ZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFByw6lmaXhlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlLnB1c2godGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBWYWxldXJcclxuICAgICAgICAgICAgaWYgKHRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWluRGVjaW1hbGVzVG90YWw6IG51bWJlciA9IDI7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF4RGVjaW1hbGVzVG90YWw6IG51bWJlciA9IDI7XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxJT3B0aW9uc051bWJlcj5jb2wub3B0aW9ucykubWluRGVjaW1hbGVzVG90YWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbkRlY2ltYWxlc1RvdGFsID0gKDxJT3B0aW9uc051bWJlcj5jb2wub3B0aW9ucykubWluRGVjaW1hbGVzVG90YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxJT3B0aW9uc051bWJlcj5jb2wub3B0aW9ucykubWF4RGVjaW1hbGVzVG90YWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1heERlY2ltYWxlc1RvdGFsID0gKDxJT3B0aW9uc051bWJlcj5jb2wub3B0aW9ucykubWF4RGVjaW1hbGVzVG90YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobWF4RGVjaW1hbGVzVG90YWwgPCBtaW5EZWNpbWFsZXNUb3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1heERlY2ltYWxlc1RvdGFsID0gbWluRGVjaW1hbGVzVG90YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlLnB1c2godmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2ZyLUZSJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG1heERlY2ltYWxlc1RvdGFsLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkRlY2ltYWxlc1RvdGFsIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBtaW5EZWNpbWFsZXM6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxldCBtYXhEZWNpbWFsZXM6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4RGVjaW1hbGVzID0gdGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWF4RGVjaW1hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbkRlY2ltYWxlcyA9IHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21pbkRlY2ltYWxlcycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9maW5hbFZhbHVlLnB1c2godmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2ZyLUZSJykpXHJcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlLnB1c2godmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2ZyLUZSJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG1heERlY2ltYWxlcywgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBtaW5EZWNpbWFsZXMgfSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTdWZmaXhlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzdWZmaXgnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlLnB1c2godGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnc3VmZml4JykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZS5qb2luKCcgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkRmlsZShjZWxsOiBJQ2VsbCkge1xyXG4gICAgICAgIGxldCBwYXRoOiBzdHJpbmcgPSAoPElPcHRpb25zRmlsZT5jZWxsLm9wdGlvbnMpLmRvd25sb2FkUGF0aDtcclxuICAgICAgICBsZXQgZmlsZU5hbWUgPSBjZWxsLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGE6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIGFzIEhUTUxBbmNob3JFbGVtZW50O1xyXG4gICAgICAgIGEuaHJlZiA9IHBhdGg7XHJcbiAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XHJcbiAgICAgICAgYS5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChwYXRoKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNGcm96ZW5Db2x1bW5zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZnJvemVuID09IHRydWUpLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdHJhY2tCeUZ1bmN0aW9uKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0/LmlkO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsdWVCdXR0b25CeVR5cGUodmFsdWU6IGFueSwgdHlwZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNb2RlRWRpdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVkaXRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTW9kZVJvd1NlbGVjdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNlbGVjdGFibGUgPT0gdHJ1ZSAmJiAodGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gPT0gbnVsbCB8fCB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLlJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlID09IHRydWUgJiYgdGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLkNoZWNrYm94O1xyXG4gICAgfVxyXG5cclxuICAgIGlzTW9kZU1ldGFrZXlTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlID09IHRydWUgJiYgdGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLk1ldGFrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0RXhjZWwoKSB7XHJcbiAgICAgICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydEV4Y2VsKHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSAhPSBudWxsID8gdGhpcy50YWJsZS5maWx0ZXJlZFZhbHVlIDogdGhpcy52YWx1ZXMsIHRoaXMuY29sdW1ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja0NlbGxOdW1iZXIocm93OiBJUm93LCBjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHZhbFtjb2wuaWRdLmZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93W2NvbC5pZF0uZm9jdXMgPSB0cnVlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0TnVtYmVyLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IFtuZ1N0eWxlXT1cInsgJ2hlaWdodCc6IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0ICE9IG51bGwgPyBvcHRpb25zLnNjcm9sbEhlaWdodCA6ICcxMDAlJyB9XCI+XHJcblxyXG4gICAgPGJ1dHRvbiBwQnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwib3B0aW9ucy5leHBvcnRFeGNlbFwiXHJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1maWxlLWV4Y2VsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGFic29sdXRlIHotNSB3LTJyZW0gaC0ycmVtIGJvcmRlci1yb3VuZC1yaWdodCBib3JkZXItbm9yb3VuZC10b3BcIlxyXG4gICAgICAgICAgICBwVG9vbHRpcD1cIkV4cG9ydGVyIGxlIGNvbnRlbnUgZGUgbGEgZ3JpbGxlIGF1IGZvcm1hdCBFeGNlbFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRFeGNlbCgpXCI+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8cC1jb250ZXh0TWVudSAjY20gW21vZGVsXT1cIm9wdGlvbnMuY29udGV4dE1lbnVJdGVtc1wiIC8+XHJcblxyXG4gICAgPHAtdGFibGUgI3RhYmxlXHJcbiAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNcIlxyXG4gICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcclxuICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cImlzTW9kZVJvd1NlbGVjdGlvbigpID8gJ3NpbmdsZScgOiAnbXVsdGlwbGUnXCJcclxuICAgICAgICAgICAgIFttZXRhS2V5U2VsZWN0aW9uXT1cImlzTW9kZU1ldGFrZXlTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICBbKHNlbGVjdGlvbildPVwic2VsZWN0ZWRSb3dzXCJcclxuICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJvblNlbGVjdFJvdygkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uVW5zZWxlY3RSb3coJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAob25IZWFkZXJDaGVja2JveFRvZ2dsZSk9XCJvblNlbGVjdEFsbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChzb3J0RnVuY3Rpb24pPVwic29ydEdyaWxsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFtjdXN0b21Tb3J0XT1cIm9wdGlvbnMuZ3JvdXBpbmcgPT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgICAgICAgW3Njcm9sbEhlaWdodF09XCInZmxleCdcIlxyXG4gICAgICAgICAgICAgW3Jvd0dyb3VwTW9kZV09XCJvcHRpb25zLmdyb3VwaW5nICE9IG51bGwgPyAnc3ViaGVhZGVyJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgW2dyb3VwUm93c0J5XT1cIm9wdGlvbnMuZ3JvdXBpbmcgIT0gbnVsbCA/IG9wdGlvbnMuZ3JvdXBpbmcub2JqICsgJy4nICsgb3B0aW9ucy5ncm91cGluZy5pZCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgW2dyb3VwUm93c0J5T3JkZXJdPVwiMFwiXHJcbiAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJvcHRpb25zLnZpcnR1YWxTY3JvbGwgPT0gdHJ1ZSAmJiBvcHRpb25zLnNjcm9sbEhlaWdodCAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsSXRlbVNpemVdPVwib3B0aW9ucy52aXJ0dWFsU2Nyb2xsSXRlbVNpemUgIT0gbnVsbCA/IG9wdGlvbnMudmlydHVhbFNjcm9sbEl0ZW1TaXplIDogMzVcIlxyXG4gICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJvcHRpb25zLnBhZ2luYXRvciA9PSBudWxsID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgIFtyb3dzXT1cIm9wdGlvbnMucGFnaW5hdG9yUm93c1wiXHJcbiAgICAgICAgICAgICAob25QYWdlKT1cIm9uUGFnZVRhYmxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW3RhYmxlU3R5bGVDbGFzc109XCIhb3B0aW9ucy50aGVtZUdyaWxsZSA/ICdncmlkX2dyZXknIDogb3B0aW9ucy50aGVtZUdyaWxsZVwiXHJcbiAgICAgICAgICAgICBbbGF6eV09XCJvcHRpb25zLmxhenkgPT0gdHJ1ZSA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAob25GaWx0ZXIpPVwib25GaWx0ZXJUYWJsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFtyb3dUcmFja0J5XT1cInRyYWNrQnlGdW5jdGlvblwiXHJcbiAgICAgICAgICAgICBbKGNvbnRleHRNZW51U2VsZWN0aW9uKV09XCJjb250ZXh0TWVudVNlbGVjdGVkSXRlbVwiXHJcbiAgICAgICAgICAgICBbY29udGV4dE1lbnVdPVwiY21cIj5cclxuXHJcbiAgICAgICAgPCEtLSBIRUFERVIgLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBIRUFERVJTIC0tPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJyb3dIZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtbj5cclxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICpuZ0lmPVwiIW9wdGlvbnMuZmlsdGVyYWJsZSAmJiBvcHRpb25zLnRvZ2dsZUFsbFwiPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IGNvbC5iYWNrZ3JvdW5kQ29sb3IgPyBjb2wuYmFja2dyb3VuZENvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAndGV4dC1jZW50ZXInIDogb3B0aW9ucy5jZW50ZXJIZWFkZXJzIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhb3B0aW9ucy5zb3J0YWJsZSB8fCBvcHRpb25zLmdyb3VwaW5nICE9IG51bGwgfHwgY29sLmxpYmVsbGUgPT0gbnVsbCB8fCBjb2wubGliZWxsZSA9PSAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgY29sLmlkIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlZnJlc2hEYXRhKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wubGliZWxsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwieyAnY29sb3InOiBjb2wudGV4dENvbG9yID8gY29sLnRleHRDb2xvciA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmxpYmVsbGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uICpuZ0lmPVwib3B0aW9ucy5zb3J0YWJsZSAmJiBvcHRpb25zLmdyb3VwaW5nID09IG51bGwgJiYgY29sLmxpYmVsbGUgIT0gbnVsbCAmJiBjb2wubGliZWxsZSAhPSAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cIm9wdGlvbnMucm93c0RlbGV0YWJsZVwiPjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZJTFRSRVMgLS0+XHJcbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMuZmlsdGVyYWJsZVwiIGNsYXNzPVwicm93RmlsdGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggKm5nSWY9XCJvcHRpb25zLnRvZ2dsZUFsbFwiPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiAoKGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIGNvbC5vcHRpb25zLmZpbHRlclRleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSAmJiBjb2wub3B0aW9ucy5maWx0ZXJUZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGVja1R5cGUoJ1RleHQnLCBjb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoZWNrVHlwZSgnRmlsZScsIGNvbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoZWNrVHlwZSgnQnV0dG9uJywgY29sKSAmJiBjb2wub3B0aW9ucy5maWx0ZXJDb2wpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGVja1R5cGUoJ051bWJlcicsIGNvbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hlY2tUeXBlKCdDaWxvZ051bWJlcicsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciAqbmdJZj1cIiFjb2wuZGlzYWJsZUZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aWV3XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gbnVsbCA/ICdkYXRlJyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICd5ZWFyJyA/ICd5eScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICdtb250aCcgPyAnbW0veXknIDogJ2RkL21tL3l5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5pZCArICdfZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwicmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0J1dHRvbkJhcj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckNsaWNrKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGlzdGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgKChjaGVja1R5cGUoJ0Ryb3Bkb3duJywgY29sKSAmJiAhY29sLm9wdGlvbnMuZmlsdGVyVGV4dCkgfHwgKGNoZWNrVHlwZSgnTXVsdGlTZWxlY3QnLCBjb2wpICYmICFjb2wub3B0aW9ucy5maWx0ZXJUZXh0KSB8fCBjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgfHwgY2hlY2tUeXBlKCdTdGF0ZScsIGNvbCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2wub3B0aW9ucz8ub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJJRFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2wub3B0aW9ucz8ub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBzZWxlY3Rpb25uw6lzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBDaGlsZHJlbiAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkdyb3VwTGFiZWxdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cENoaWxkcmVuXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uRmlsdGVyQ29sKG51bGwsIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Z3JvdXBbY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbF19fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU3dpdGNoIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnU3dpdGNoJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiIWNvbC5kaXNhYmxlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1N3aXRjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBOb24gZmlsdHJhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIChjaGVja1R5cGUoJ0ltYWdlJywgY29sKSB8fCAoY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpICYmICFjb2wub3B0aW9ucy5maWx0ZXJDb2wpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVE9UQUwgLS0+XHJcbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMucm93VG90YWxcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb3dUb3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd0ZXh0LWNlbnRlcicgOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGdldFRvdGFsU3RyKGNvbCkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCIgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIj48L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS1Hcm91cGhlYWRlci0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJncm91cGhlYWRlclwiIGxldC1yb3dEYXRhPlxyXG4gICAgICAgICAgICA8dHIgcFJvd0dyb3VwSGVhZGVyIGNsYXNzPVwicm93R3JvdXBpbmdcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRfYm9sZFwiPnt7IHJvd0RhdGFbb3B0aW9ucy5ncm91cGluZy5vYmpdW29wdGlvbnMuZ3JvdXBpbmcubGliZWxsZV0gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPCEtLSBCb2R5IC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGEgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDx0ciBpZD1cInt7IHJvd0RhdGEuaWQgfX1cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGEuY29sb3IgPyByb3dEYXRhLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd109XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd0Rpc2FibGVkXT1cIiFvcHRpb25zLnNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uUm93RG91YmxlQ2xpY2tFdmVudChyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgICAgICBbcENvbnRleHRNZW51Um93XT1cInJvd0RhdGFcIlxyXG4gICAgICAgICAgICAgICAgW3BDb250ZXh0TWVudVJvd0Rpc2FibGVkXT1cIm9wdGlvbnMuY29udGV4dE1lbnVJdGVtcyA9PSBudWxsXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cInJvd0RhdGFcIiBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seVwiPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5dPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5GaWVsZF09XCJjb2wuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUZXh0KGNvbCwgcm93RGF0YSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiAoIWlzTW9kZUVkaXRpb24oKSB8fCByb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicgOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5saWJlbGxlIH19IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRleHQoY29sLCByb3dEYXRhKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWRkaW5nQ2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYXNlWkluZGV4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdiYXNlWkluZGV4JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAndmlydHVhbFNjcm9sbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsSXRlbVNpemVdPVwiMzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZGF0YSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGEgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGFbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YSA9PSBudWxsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nQ2VsbCc6IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXSA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDaWxvZyBOdW1iZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdDaWxvZ051bWJlcicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpbG9nLWlucHV0LW51bWJlciAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0U3R5bGVDbGFzc109XCJjb2wucG9zaXRpb24gPT0gbnVsbCB8fCBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyA/ICd0ZXh0LXJpZ2h0JyA6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6ICd0ZXh0LWNlbnRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwicm93RGF0YVtjb2wuaWRdLnRleHRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JvbGRdPVwicm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0YWxpY109XCJyb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1ZmZpeGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZml4ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21pbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERlY2ltYWxzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWF4RGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSA6IDIgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NpbG9nLWlucHV0LW51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgcm93RGF0YSwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnTnVtYmVyJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nQ2VsbCc6IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0NlbGxOdW1iZXIocm93RGF0YSwgY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICYmICFyb3dEYXRhW2NvbC5pZF0uZm9jdXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZE51bWJlcihjb2wsIHJvd0RhdGEsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyICNpbnB1dE51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSAmJiByb3dEYXRhW2NvbC5pZF0uZm9jdXMgPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3Nob3dCdXR0b25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRTdHlsZUNsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlXT1cInsgJ2ZvbnQtd2VpZ2h0Jzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSA/ICdib2xkJyA6IG51bGwsICdmb250LXN0eWxlJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWUgPyAnaXRhbGljJyA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW4nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSA6IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgIT0gbnVsbCAmJiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSA9PSB0cnVlID8gMCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpIDogMiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25CbHVyKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uS2V5RG93bik9XCJvbktleURvd24oJGV2ZW50LCByb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgcm93RGF0YSwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0RhdGUnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBkYXRlOiAnZGQvTU0veXl5eSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpZXddPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSBudWxsID8gJ2RhdGUnIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gJ3llYXInID8gJ3l5JyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gJ21vbnRoJyA/ICdtbS95eScgOiAnZGQvbW0veXknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REYXlPZldlZWs9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRTdHlsZUNsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlXT1cInsgJ2ZvbnQtd2VpZ2h0Jzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSA/ICdib2xkJyA6IG51bGwsICdmb250LXN0eWxlJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWUgPyAnaXRhbGljJyA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdjbGVhcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21pbkRhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEYXRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdERhdGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2RlZmF1bHREYXRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdEYXRlJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWluLXdpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWxlZnQnOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWJvbGQnOiByb3dEYXRhLmJvbGQgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uYm9sZCA9PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBkYXRlOiAoZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAneWVhcicgPyAneXl5eScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICdtb250aCcgPyAnTU0veXl5eScgOiAnZGQvTU0veXl5eScpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aVNlbGVjdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWxlZnQnOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFkZGluZ0NlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VaSW5kZXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Jhc2VaSW5kZXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICd2aXJ0dWFsU2Nyb2xsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiZWRpdE11bHRpc2VsZWN0KHJvd0RhdGEsIGNvbCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cENoaWxkcmVuJykgIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cExhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cExhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBDaGlsZHJlbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZGF0YSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkYXRhLCBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbltnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gKyAoaSAhPSBkYXRhLmxlbmd0aCAtIDEgPyAnLCcgOiAnJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1ncm91cCBwVGVtcGxhdGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tncm91cFtjb2wub3B0aW9ucy5vcHRpb25Hcm91cExhYmVsXX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiBnZXRNdWx0aVNlbGVjdENvbmNhdChyb3dEYXRhW2NvbC5pZF0udmFsdWUsIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0TXVsdGlTZWxlY3RDb25jYXQocm93RGF0YVtjb2wuaWRdLnZhbHVlLCBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnSW1hZ2UnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIiBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdpZHRoOiA0MHB4O1wiIHNyYz1cInt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCdXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWRkaW5nQ2VsbCB0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgJiYgaXNWYWx1ZUJ1dHRvbkJ5VHlwZShyb3dEYXRhW2NvbC5pZF0udmFsdWUsICdmdW5jdGlvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2xhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdpY29uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdsYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidwLWJ1dHRvbi0nICsgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3NldmVyaXR5JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzVmFsdWVCdXR0b25CeVR5cGUocm93RGF0YVtjb2wuaWRdLnZhbHVlLCAnc3RyaW5nJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25WYWx1ZScpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uVmFsdWUnKSA6ICd2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtY2VudGVyIHctZnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nQ2VsbCc6IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyBnZXRTZWxlY3RMaWJlbGxlQnlWYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTd2l0Y2ggLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdTd2l0Y2gnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgKGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdhY3Rpb24nKSA9PSBudWxsICYmICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0U3dpdGNoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXVwbG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0J5SWQoJ2lucHV0XycgKyByb3dEYXRhW2NvbC5pZF0uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7J291dHB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Rvd25sb2FkUGF0aCcpICYmIHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktZG93bmxvYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRGaWxlKHJvd0RhdGFbY29sLmlkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCIgaWQ9XCJ7eydpbnB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkfX1cIiAjaW5wdXRGaWxlIHBJbnB1dFRleHQgdHlwZT1cImZpbGVcIiBoaWRkZW4gKGNoYW5nZSk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgPSBpbnB1dEZpbGUuZmlsZXNbMF0ubmFtZTsgb25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIGlucHV0RmlsZS5maWxlc1swXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRmlsZScsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWxlZnQnOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWJvbGQnOiByb3dEYXRhLmJvbGQgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uYm9sZCA9PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N0YXRlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC10YWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLnNldmVyaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLnRleHRDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0Jzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSA/ICdib2xkJyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LXN0eWxlJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWUgPyAnaXRhbGljJyA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRGVsZXRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YS5kZWxldGFibGUgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJyb3dEYXRhLmRlbGV0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBidXR0b25EZWxldGUgcC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVMaW5lKHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG48L2Rpdj5cclxuIl19
664
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVekUsTUFBTSxPQUFPLG1CQUFtQjtJQXFDNUIsWUFDWSxtQkFBd0MsRUFDeEMsYUFBNEIsRUFDNUIsS0FBd0IsRUFDeEIsYUFBNEI7UUFINUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZDeEMsZUFBVSxHQUFZLElBQUksQ0FBQztRQUdqQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFHOUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBTTFDLFdBQU0sR0FBMkIsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUM5RCxlQUFVLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFDbEUsYUFBUSxHQUErQixJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUN4RSxhQUFRLEdBQTZCLElBQUksWUFBWSxFQUFjLENBQUM7UUFDcEUsZUFBVSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3RFLGFBQVEsR0FBMEIsSUFB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LENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2xDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDN0IsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dDQUNoRSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDdEMsQ0FBQzt3QkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDUCxDQUFDO3lCQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3RDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDMUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDbkQsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUMsQ0FBQyxD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QUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ25CLEVBQUU7c0JBQWxCLFNBQVM7dUJBQUMsSUFBSTtnQkFDVyxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIEZpbHRlclNlcnZpY2UsIExhenlMb2FkRXZlbnQsIFNvcnRFdmVudCB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgSUVkaXRpb24sIElTdXBwcmVzc2lvbiwgSVNlbGVjdGlvbiwgSUZpbHRlciwgSVNvcnQsIElQYWdlLCBJU29ydEN1c3RvbSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW50ZXJmYWNlcy9lZGl0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IElDb2x1bW4sIElSb3csIElPcHRpb25zR3JpbGxlLCBJQ2VsbCwgSU9wdGlvbnNGaWxlLCBJT3B0aW9uc011bHRpU2VsZWN0LCBJT3B0aW9uc0Ryb3Bkb3duLCBJT3B0aW9uc051bWJlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW50ZXJmYWNlcy9ncmlsbGUuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgQ29sVHlwZSwgTW9kZVNlbGVjdGlvbiB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bXMvZ3JpbGxlLmVudW0nO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhjZWwuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IElucHV0TnVtYmVyIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY2lsb2ctdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENpbG9nVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIGluaXRGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpIGNvbHVtbnM6IElDb2x1bW5bXTtcclxuICAgIEBPdXRwdXQoKSBjb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uW10+KCk7XHJcblxyXG4gICAgQElucHV0KCkgdmFsdWVzOiBJUm93W107XHJcbiAgICBAT3V0cHV0KCkgdmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93W10+KCk7XHJcblxyXG4gICAgQElucHV0KCkgb3B0aW9uczogSU9wdGlvbnNHcmlsbGU7XHJcblxyXG4gICAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25FZGl0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkVkaXRJbml0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uVW5zZWxlY3Q6IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPElGaWx0ZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRmlsdGVySW5pdDogRXZlbnRFbWl0dGVyPElSb3dbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dbXT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNvcnQ6IEV2ZW50RW1pdHRlcjxJU29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUGFnZTogRXZlbnRFbWl0dGVyPElQYWdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2U+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Sb3dEb3VibGVDbGljazogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG5cclxuICAgIHNlbGVjdGVkUm93czogSVJvd1tdIHwgSVJvdztcclxuXHJcbiAgICBmaWx0ZXJEYXRlc1JhbmdlOiBEYXRlW107XHJcblxyXG4gICAgb3B0aW9uc1N3aXRjaDogYW55W107XHJcblxyXG4gICAgY29udGV4dE1lbnVTZWxlY3RlZEl0ZW06IElSb3c7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZTogVGFibGU7XHJcbiAgICBAVmlld0NoaWxkKCdjbScpIGNtOiBDb250ZXh0TWVudTtcclxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0TnVtYmVyJykgaW5wdXROdW1iZXI6IElucHV0TnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBleHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlXHJcbiAgICApIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N3aXRjaCA9IFtcclxuICAgICAgICAgICAgeyBsYWJlbDogJ091aScsIHZhbHVlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb24nLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIC8vIERhdGVcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2RhdGVSYW5nZUZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGZpbHRlclswXS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGxldCBlbmQ6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IGVuZERhdGU6IERhdGU7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJbMV0pIHtcclxuICAgICAgICAgICAgICAgIGVuZERhdGUgPSBuZXcgRGF0ZShmaWx0ZXJbMV0uZ2V0RnVsbFllYXIoKSwgZmlsdGVyWzFdLmdldE1vbnRoKCksIGZpbHRlclsxXS5nZXREYXRlKCksIDIzLCA1OSwgNTkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKGZpbHRlclswXS5nZXRGdWxsWWVhcigpLCBmaWx0ZXJbMF0uZ2V0TW9udGgoKSwgZmlsdGVyWzBdLmdldERhdGUoKSwgMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW5kID0gZW5kRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnZhbHVlID09IG51bGwgPyBmYWxzZSA6IGNlbGwudmFsdWUuZ2V0VGltZSgpID49IHN0YXJ0ICYmIGNlbGwudmFsdWUuZ2V0VGltZSgpIDw9IGVuZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3Rlcignb2JqZXRGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZmluZCh2YWwgPT4gdmFsLklEID09IGNlbGwudmFsdWU/LklEKSAhPSBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFNlbGVjdCBCdXR0b25cclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ3NlbGVjdEJ1dHRvbkZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5maW5kKHZhbCA9PiB2YWwudmFsdWUgPT0gY2VsbC52YWx1ZSkgIT0gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBMaXN0ZVxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignbGlzdGVGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmaWx0ZXIuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUuaW5kZXhPZih2YWwpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9rO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3Rlcignc3dpdGNoRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKGZpbHRlci5pbmRleE9mKGNlbGwudmFsdWUpICE9IC0xKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBCdXR0b25cclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2J1dHRvbkZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJPYmpGaWVsZDogc3RyaW5nID0gY2VsbC5vcHRpb25zWydmaWx0ZXJPYmpGaWVsZCddO1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyT2JqU3ViRmllbGQ6IHN0cmluZyA9IGNlbGwub3B0aW9uc1snZmlsdGVyT2JqU3ViRmllbGQnXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsLm9iaiA9PSBudWxsIHx8IGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci50cmltKCkgPT0gJycgfHwgZmlsdGVyT2JqRmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJPYmpTdWJGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5vYmpbZmlsdGVyT2JqRmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwub2JqW2ZpbHRlck9iakZpZWxkXS5maW5kKHZhbCA9PiB2YWxbZmlsdGVyT2JqU3ViRmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpKSAhPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gVGV4dFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcigndGV4dEZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIudHJpbSgpID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2VsbC52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB2YWx1ZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNlbGwudmFsdWUgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gY2VsbC52YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY2VsbC52YWx1ZSA9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcsJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwub3B0aW9ucyA9PSBudWxsIHx8IGNlbGwub3B0aW9uc1snb3B0aW9uTGFiZWxGaWx0ZXJUZXh0J10gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldE11bHRpU2VsZWN0Q29uY2F0KGNlbGwudmFsdWUsIGNlbGwub3B0aW9uc1snb3B0aW9uTGFiZWxGaWx0ZXJUZXh0J10pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwub3B0aW9ucyA9PSBudWxsIHx8IGNlbGwub3B0aW9uc1snb3B0aW9uTGFiZWxGaWx0ZXJUZXh0J10gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlW2NlbGwub3B0aW9uc1snb3B0aW9uTGFiZWxGaWx0ZXJUZXh0J11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9ucyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wub3B0aW9ucyA9IHsgZGVmYXVsdEZpbHRlcnM6IG51bGwgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnNbJ29ubHlMaXN0VmFsdWVzJ10gJiYgY29sLm9wdGlvbnNbJ29wdGlvbkdyb3VwTGFiZWwnXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wub3B0aW9uc1snb3B0aW9ucyddID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2NvbC5pZF0udmFsdWUuZm9yRWFjaCh2YWwyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC5JRCA9PSB2YWwyLklEKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5wdXNoKHZhbDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbFtjb2wuaWRdLnZhbHVlICE9IG51bGwgJiYgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5maW5kKG9wdCA9PiBvcHQuSUQgPT0gdmFsW2NvbC5pZF0udmFsdWUuSUQpID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10ucHVzaCh2YWxbY29sLmlkXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10gPSBbLi4uY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5zb3J0KChhLCBiKSA9PiBhW2NvbC5vcHRpb25zWydvcHRpb25MYWJlbCddXS5sb2NhbGVDb21wYXJlKGFbY29sLm9wdGlvbnNbJ29wdGlvbkxhYmVsJ11dKSldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ2hhbmdlLmVtaXQodGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzICE9IG51bGwpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2wuaW52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsIHRoaXMuZ2V0RmlsdGVyQnlDb2woY29sKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUuc2Nyb2xsZXIgJiYgdGhpcy5vcHRpb25zLm1vZGVBcHBlbmRPbmx5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGUuc2Nyb2xsZXIuYXBwZW5kT25seSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlclRhYmxlKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdEZpbHRlciA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25GaWx0ZXJJbml0LmVtaXQoZXZlbnQuZmlsdGVyZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbklucHV0TnVtYmVyKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRMYXp5KGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICAgICAgLy90aGlzLnZhbHVlcyA9IGV2ZW50LnJvd3Muc2xpY2UoZXZlbnQuZmlyc3QsIChldmVudC5maXJzdCArIGV2ZW50LnJvd3MpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTb3J0XHJcbiAgICBzb3J0R3JpbGxlKGV2ZW50OiBTb3J0RXZlbnQpIHtcclxuXHJcbiAgICAgICAgbGV0IGNvbDogSUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuaWQgPT0gZXZlbnQuZmllbGQpO1xyXG4gICAgICAgIHRoaXMub25Tb3J0LmVtaXQoeyBjb2x1bW46IGNvbCwgb3JkZXI6IGV2ZW50Lm9yZGVyIH0pXHJcbiAgICAgICAgbGV0IHR5cGVDb2w6IENvbFR5cGUgPSBjb2wudHlwZTtcclxuXHJcbiAgICAgICAgZXZlbnQuZGF0YS5zb3J0KChkYXRhMSwgZGF0YTIpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlMSA9IGRhdGExW2V2ZW50LmZpZWxkXS52YWx1ZTtcclxuICAgICAgICAgICAgbGV0IHZhbHVlMiA9IGRhdGEyW2V2ZW50LmZpZWxkXS52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9ucy5jdXN0b21Tb3J0ICYmIGNvbC5vcHRpb25zLnNvcnRGdW5jdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLm9wdGlvbnMuc29ydEZ1bmN0aW9uKHsgY29sdW1uOiBjb2wsIG9yZGVyOiBldmVudC5vcmRlciwgdmFsdWUxOiB2YWx1ZTEsIHZhbHVlMjogdmFsdWUyIH0gYXMgSVNvcnRDdXN0b20pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5UZXh0IHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5GaWxlKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlQ29sID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUxW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTEsICdvcHRpb25MYWJlbCcpXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUyW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZTEsIHRoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTEsICdvcHRpb25MYWJlbCcpKS5sb2NhbGVDb21wYXJlKHRoaXMuZ2V0TXVsdGlTZWxlY3RDb25jYXQodmFsdWUyLCB0aGlzLmdldE9wdGlvbihjb2wsIGRhdGEyLCAnb3B0aW9uTGFiZWwnKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24gfHwgdHlwZUNvbCA9PSBDb2xUeXBlLlN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMVt0aGlzLmdldE9wdGlvbihjb2wsIGRhdGExLCAnb3B0aW9uTGFiZWwnKV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlMlt0aGlzLmdldE9wdGlvbihjb2wsIGRhdGEyLCAnb3B0aW9uTGFiZWwnKV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlMVt0aGlzLmdldE9wdGlvbihjb2wsIGRhdGExLCAnb3B0aW9uTGFiZWwnKV0ubG9jYWxlQ29tcGFyZSh2YWx1ZTJbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMiwgJ29wdGlvbkxhYmVsJyldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5OdW1iZXIgfHwgdHlwZUNvbCA9PSBDb2xUeXBlLkNpbG9nTnVtYmVyIHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA8IHZhbHVlMikgPyAtMSA6ICh2YWx1ZTEgPiB2YWx1ZTIpID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5Td2l0Y2gpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA9PT0gdmFsdWUyKSA/IDAgOiB2YWx1ZTEgPyAtMSA6IDE7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09IDA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGV2ZW50Lm9yZGVyICogcmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjaGVja1R5cGUodHlwZUNvbDogc3RyaW5nLCBjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICByZXR1cm4gY29sWyd0eXBlJ10gPT0gdHlwZUNvbDtcclxuICAgIH1cclxuXHJcbiAgICBjbGlja0J5SWQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5jbGljaygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdENlbGwocm93OiBJUm93LCBjb2x1bW46IElDb2x1bW4sIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbHVtbiwgcm93LCAnYWN0aW9uJykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvbihjb2x1bW4sIHJvdywgJ2FjdGlvbicpKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vbkVkaXQuZW1pdCh7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiwgdmFsdWU6IHZhbHVlIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGVzdHJveSBGb2N1c1xyXG4gICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgdmFsW2NvbHVtbi5pZF0uZm9jdXMgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJvdzogSVJvdywgY29sdW1uOiBJQ29sdW1uLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PSAnRW50ZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25FZGl0Q2VsbChyb3csIGNvbHVtbiwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlZGl0TXVsdGlzZWxlY3Qocm93OiBJUm93LCBjb2x1bW46IElDb2x1bW4sIGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5vbkVkaXRDZWxsKHJvdywgY29sdW1uLCB7IGxpc3RTZWxlY3RlZDogZXZlbnQudmFsdWUsIGl0ZW1TZWxlY3RlZDogZXZlbnQuaXRlbVZhbHVlLCBzZWxlY3RlZDogZXZlbnQudmFsdWUuaW5kZXhPZihldmVudC5pdGVtVmFsdWUpICE9IC0xIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0QWxsKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHsgcm93OiBudWxsLCBzZWxlY3RlZFJvd3M6IHRoaXMuc2VsZWN0ZWRSb3dzLCBjaGVja2VkOiBldmVudC5jaGVja2VkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0Um93KHJvdzogSVJvdykge1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QuZW1pdCh7IHJvdzogcm93LCBzZWxlY3RlZFJvd3M6IHRoaXMuc2VsZWN0ZWRSb3dzLCBjaGVja2VkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVW5zZWxlY3RSb3cocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5vblVuc2VsZWN0LmVtaXQoeyByb3c6IHJvdywgc2VsZWN0ZWRSb3dzOiB0aGlzLnNlbGVjdGVkUm93cywgY2hlY2tlZDogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERhdGEoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3J0YWJsZSAmJiB0aGlzLm9wdGlvbnMudmlydHVhbFNjcm9sbCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlc107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uUGFnZVRhYmxlKGV2ZW50OiBJUGFnZSkge1xyXG4gICAgICAgIHRoaXMub25QYWdlLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVsZXRlTGluZShyb3c6IElSb3cpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1hbnVhbGx5RGVsZXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25EZWxldGUuZW1pdCh7IHJvdzogcm93IH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgICAgICAgICAgIGtleTogJ2NvbmZpcm0nLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ8OKdGVzLXZvdXMgc8O7ciBkZSB2b3Vsb2lyIHN1cHByaW1lciBjZXR0ZSBsaWduZSA/JyxcclxuICAgICAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNwbGljZSh0aGlzLnZhbHVlcy5pbmRleE9mKHJvdyksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzID0gWy4uLnRoaXMudmFsdWVzXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc0NoYW5nZS5lbWl0KHRoaXMudmFsdWVzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGVsZXRlLmVtaXQoeyByb3c6IHJvdyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdEluaXRDZWxsKHJvdzogSVJvdywgY29sdW1uOiBJQ29sdW1uLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkVkaXRJbml0LmVtaXQoeyByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4sIHZhbHVlOiB2YWx1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvblJvd0RvdWJsZUNsaWNrRXZlbnQocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5vblJvd0RvdWJsZUNsaWNrLmVtaXQoeyByb3c6IHJvdyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRPcHRpb24oY29sLCByb3csIG9wdGlvbjogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIHJvd1tjb2wuaWRdLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAocm93W2NvbC5pZF0ub3B0aW9uc1tvcHRpb25dICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByb3dbY29sLmlkXS5vcHRpb25zW29wdGlvbl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbCAhPSBudWxsICYmIGNvbC5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zW29wdGlvbl0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC5vcHRpb25zW29wdGlvbl1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZSwgbGFiZWw6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAodmFsID0+IHsgcmV0dXJuIHZhbFtsYWJlbF07IH0pLmpvaW4oJywgJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RMaWJlbGxlQnlWYWx1ZShyb3csIGNvbCkge1xyXG4gICAgICAgIGxldCBsYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKHJvd1tjb2wuaWRdLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93W2NvbC5pZF0ub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gcm93W2NvbC5pZF0ub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSByb3dbY29sLmlkXS52YWx1ZSlbcm93W2NvbC5pZF0ub3B0aW9ucy5vcHRpb25MYWJlbF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbC5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT0gcm93W2NvbC5pZF0udmFsdWUpW2NvbC5vcHRpb25zLm9wdGlvbkxhYmVsXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyQnlDb2woY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgLy8gRGF0ZXMgKHJhbmdlKVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdkYXRlUmFuZ2VGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIGlmICgoY29sLnR5cGUgPT0gQ29sVHlwZS5Ecm9wZG93biAmJiAhKDxJT3B0aW9uc0Ryb3Bkb3duPmNvbC5vcHRpb25zKS5maWx0ZXJUZXh0KSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2JqZXRGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBMaXN0ZVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLk11bHRpU2VsZWN0ICYmICEoPElPcHRpb25zTXVsdGlTZWxlY3Q+Y29sLm9wdGlvbnMpLmZpbHRlclRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdsaXN0ZUZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRleHRlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRmlsZVxyXG4gICAgICAgICAgICB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlRleHRcclxuICAgICAgICAgICAgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXJcclxuICAgICAgICAgICAgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5DaWxvZ051bWJlclxyXG4gICAgICAgICAgICB8fCAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCAmJiAoPElPcHRpb25zTXVsdGlTZWxlY3Q+Y29sLm9wdGlvbnMpLmZpbHRlclRleHQpXHJcbiAgICAgICAgICAgIHx8IChjb2wudHlwZSA9PSBDb2xUeXBlLkRyb3Bkb3duICYmICg8SU9wdGlvbnNEcm9wZG93bj5jb2wub3B0aW9ucykuZmlsdGVyVGV4dCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICd0ZXh0RmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuU3dpdGNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnc3dpdGNoRmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuU2VsZWN0QnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnc2VsZWN0QnV0dG9uRmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb25GaWx0ZXJDb2woZXZlbnQsIGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIGxldCB2YWx1ZTogYW55O1xyXG5cclxuICAgICAgICAvLyBEYXRlcyAocmFuZ2UpXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIGlmICgoY29sLnR5cGUgPT0gQ29sVHlwZS5Ecm9wZG93biAmJiAhKDxJT3B0aW9uc0Ryb3Bkb3duPmNvbC5vcHRpb25zKS5maWx0ZXJUZXh0KSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlN0YXRlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQgPT0gbnVsbCA/IG51bGwgOiBldmVudC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTGlzdGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCAmJiAhKDxJT3B0aW9uc011bHRpU2VsZWN0PmNvbC5vcHRpb25zKS5maWx0ZXJUZXh0KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQgPT0gbnVsbCA/IG51bGwgOiBldmVudC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGV4dGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5GaWxlXHJcbiAgICAgICAgICAgIHx8IGNvbC50eXBlID09IENvbFR5cGUuVGV4dFxyXG4gICAgICAgICAgICB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLk51bWJlclxyXG4gICAgICAgICAgICB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLkNpbG9nTnVtYmVyXHJcbiAgICAgICAgICAgIHx8IChjb2wudHlwZSA9PSBDb2xUeXBlLk11bHRpU2VsZWN0ICYmICg8SU9wdGlvbnNNdWx0aVNlbGVjdD5jb2wub3B0aW9ucykuZmlsdGVyVGV4dClcclxuICAgICAgICAgICAgfHwgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24gJiYgKDxJT3B0aW9uc0Ryb3Bkb3duPmNvbC5vcHRpb25zKS5maWx0ZXJUZXh0KSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuU3dpdGNoKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlbGVjdEJ1dHRvblxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50ID09IG51bGwgPyBudWxsIDogZXZlbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEJ1dHRvblxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkJ1dHRvbikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgdmFsdWUsIHRoaXMuZ2V0RmlsdGVyQnlDb2woY29sKSk7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUuc2Nyb2xsZXIgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLnNjcm9sbGVyLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLnNjcm9sbGVyLmluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbjogY29sLCB2YWx1ZTogdmFsdWUsIGZpbHRlcmVkVmFsdWU6IHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlcihjb2w6IElDb2x1bW4sIHZhbDogYW55LCBmaWx0ZXI6IHN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBDb3BpZXIgLSBDb2xsZXIgZGUgbGEgbcOpdGhvZGUgZmlsdGVyKCkgZGUgdGFibGUudHMgZGUgUHJpbWVORyBzYW5zIGxhIGTDqXN5bmNocm9uaXNhdGlvbiBjYXVzw6llIHBhciBmaWx0ZXJEZWxheSAoc2V0VGltZW91dClcclxuICAgICAgICBpZiAodGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRhYmxlLmZpbHRlclRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMudGFibGUuaXNGaWx0ZXJCbGFuayh2YWwpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGUuZmlsdGVyc1tjb2wuaWRdID0geyB2YWx1ZTogdmFsLCBtYXRjaE1vZGU6IGZpbHRlciB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZS5maWx0ZXJzW2NvbC5pZF0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGFibGUuZmlsdGVyc1tjb2wuaWRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50YWJsZS5fZmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRhYmxlLmFuY2hvclJvd0luZGV4ID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUuc2Nyb2xsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZS5zY3JvbGxlci52aWV3SW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUb3RhbChjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICBpZiAoY29sLmRpc3BsYXlUb3RhbCAmJiAoY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5DaWxvZ051bWJlcikpIHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlczogSVJvd1tdID0gdGhpcy52YWx1ZXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG90YWxCeUZpbHRlciA9PSB0cnVlICYmIHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwuZXhjbHVzaW9uVG90YWwgJiYgIXZhbFtjb2wuaWRdLmV4Y2x1c2lvblRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uID09IE1vZGVTZWxlY3Rpb24uQ2hlY2tib3ggJiYgdGhpcy5vcHRpb25zLnRvdGFsQnlTZWxlY3Rpb24gPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzICE9IG51bGwgJiYgdGhpcy5zZWxlY3RlZFJvd3MuZmluZChyb3cgPT4gcm93LmlkID09IHZhbC5pZCkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFRvdGFsU3RyKGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIGlmIChjb2wuZGlzcGxheVRvdGFsICYmIChjb2wudHlwZSA9PSBDb2xUeXBlLk51bWJlciB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLkNpbG9nTnVtYmVyKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbC5tZXRob2RUb3RhbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGb3JtYXR0ZWROdW1iZXIoY29sLCBudWxsLCBjb2wubWV0aG9kVG90YWwoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzOiBJUm93W10gPSB0aGlzLnZhbHVlcztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG90YWxCeUZpbHRlciA9PSB0cnVlICYmIHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy50YWJsZS5maWx0ZXJlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgdmFsdWVzLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5leGNsdXNpb25Ub3RhbCAmJiAhdmFsW2NvbC5pZF0uZXhjbHVzaW9uVG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLkNoZWNrYm94ICYmIHRoaXMub3B0aW9ucy50b3RhbEJ5U2VsZWN0aW9uID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJvd3MgIT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkUm93cy5maW5kKHJvdyA9PiByb3cuaWQgPT0gdmFsLmlkKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgbnVsbCwgdG90YWwsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1hdHRlZFRleHQoY29sOiBJQ29sdW1uLCByb3dEYXRhOiBJUm93KSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgPSByb3dEYXRhW2NvbC5pZF0udmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IGluZGVudGF0aW9uOiBudW1iZXIgPSB0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdpbmRlbnRhdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZW50YXRpb24gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcgICAgICAgJy5yZXBlYXQoaW5kZW50YXRpb24pICsgdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1hdHRlZE51bWJlcihjb2w6IElDb2x1bW4sIHJvd0RhdGE6IElSb3csIHZhbHVlOiBudW1iZXIsIHRvdGFsOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBmaW5hbFZhbHVlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUHLDqWZpeGVcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ByZWZpeCcpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFZhbGV1clxyXG4gICAgICAgICAgICBpZiAodG90YWwpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtaW5EZWNpbWFsZXNUb3RhbDogbnVtYmVyID0gMjtcclxuICAgICAgICAgICAgICAgIGxldCBtYXhEZWNpbWFsZXNUb3RhbDogbnVtYmVyID0gMjtcclxuICAgICAgICAgICAgICAgIGlmICgoPElPcHRpb25zTnVtYmVyPmNvbC5vcHRpb25zKS5taW5EZWNpbWFsZXNUb3RhbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluRGVjaW1hbGVzVG90YWwgPSAoPElPcHRpb25zTnVtYmVyPmNvbC5vcHRpb25zKS5taW5EZWNpbWFsZXNUb3RhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgoPElPcHRpb25zTnVtYmVyPmNvbC5vcHRpb25zKS5tYXhEZWNpbWFsZXNUb3RhbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4RGVjaW1hbGVzVG90YWwgPSAoPElPcHRpb25zTnVtYmVyPmNvbC5vcHRpb25zKS5tYXhEZWNpbWFsZXNUb3RhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChtYXhEZWNpbWFsZXNUb3RhbCA8IG1pbkRlY2ltYWxlc1RvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4RGVjaW1hbGVzVG90YWwgPSBtaW5EZWNpbWFsZXNUb3RhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RGVjaW1hbGVzVG90YWwsIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluRGVjaW1hbGVzVG90YWwgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1pbkRlY2ltYWxlczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1heERlY2ltYWxlczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhEZWNpbWFsZXMgPSB0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluRGVjaW1hbGVzID0gdGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2ZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInKSlcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RGVjaW1hbGVzLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkRlY2ltYWxlcyB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzdWZmaXgnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlLmpvaW4oJyAnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZG93bmxvYWRGaWxlKGNlbGw6IElDZWxsKSB7XHJcbiAgICAgICAgbGV0IHBhdGg6IHN0cmluZyA9ICg8SU9wdGlvbnNGaWxlPmNlbGwub3B0aW9ucykuZG93bmxvYWRQYXRoO1xyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgYS5ocmVmID0gcGF0aDtcclxuICAgICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc0Zyb3plbkNvbHVtbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5mcm96ZW4gPT0gdHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFja0J5RnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaXRlbT8uaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaXNWYWx1ZUJ1dHRvbkJ5VHlwZSh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBpc01vZGVFZGl0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZWRpdGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TW9kZVNlbGVjdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSAhPSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTW9kZVNlbGVjdGlvbi5DaGVja2JveDpcclxuICAgICAgICAgICAgY2FzZSBNb2RlU2VsZWN0aW9uLk1ldGFrZXk6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ211bHRpcGxlJztcclxuICAgICAgICAgICAgY2FzZSBNb2RlU2VsZWN0aW9uLlJvdzpcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc2luZ2xlJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlID09IHRydWUgJiYgdGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLkNoZWNrYm94O1xyXG4gICAgfVxyXG5cclxuICAgIGlzTW9kZU1ldGFrZXlTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlID09IHRydWUgJiYgdGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiA9PSBNb2RlU2VsZWN0aW9uLk1ldGFrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0RXhjZWwoKSB7XHJcbiAgICAgICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydEV4Y2VsKHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSAhPSBudWxsID8gdGhpcy50YWJsZS5maWx0ZXJlZFZhbHVlIDogdGhpcy52YWx1ZXMsIHRoaXMuY29sdW1ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja0NlbGxOdW1iZXIocm93OiBJUm93LCBjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHZhbFtjb2wuaWRdLmZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93W2NvbC5pZF0uZm9jdXMgPSB0cnVlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0TnVtYmVyLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IFtuZ1N0eWxlXT1cInsgJ2hlaWdodCc6IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0ICE9IG51bGwgPyBvcHRpb25zLnNjcm9sbEhlaWdodCA6ICcxMDAlJyB9XCI+XHJcblxyXG4gICAgPGJ1dHRvbiBwQnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwib3B0aW9ucy5leHBvcnRFeGNlbFwiXHJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1maWxlLWV4Y2VsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGFic29sdXRlIHotNSB3LTJyZW0gaC0ycmVtIGJvcmRlci1yb3VuZC1yaWdodCBib3JkZXItbm9yb3VuZC10b3BcIlxyXG4gICAgICAgICAgICBwVG9vbHRpcD1cIkV4cG9ydGVyIGxlIGNvbnRlbnUgZGUgbGEgZ3JpbGxlIGF1IGZvcm1hdCBFeGNlbFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRFeGNlbCgpXCI+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8cC1jb250ZXh0TWVudSAjY20gW21vZGVsXT1cIm9wdGlvbnMuY29udGV4dE1lbnVJdGVtc1wiIC8+XHJcblxyXG4gICAgPHAtdGFibGUgI3RhYmxlXHJcbiAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNcIlxyXG4gICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcclxuICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cImdldE1vZGVTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICBbbWV0YUtleVNlbGVjdGlvbl09XCJpc01vZGVNZXRha2V5U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkUm93c1wiXHJcbiAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwib25TZWxlY3RSb3coJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAob25Sb3dVbnNlbGVjdCk9XCJvblVuc2VsZWN0Um93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgKG9uSGVhZGVyQ2hlY2tib3hUb2dnbGUpPVwib25TZWxlY3RBbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoc29ydEZ1bmN0aW9uKT1cInNvcnRHcmlsbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbY3VzdG9tU29ydF09XCJvcHRpb25zLmdyb3VwaW5nID09IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcclxuICAgICAgICAgICAgIFtzY3JvbGxIZWlnaHRdPVwiJ2ZsZXgnXCJcclxuICAgICAgICAgICAgIFtyb3dHcm91cE1vZGVdPVwib3B0aW9ucy5ncm91cGluZyAhPSBudWxsID8gJ3N1YmhlYWRlcicgOiBudWxsXCJcclxuICAgICAgICAgICAgIFtncm91cFJvd3NCeV09XCJvcHRpb25zLmdyb3VwaW5nICE9IG51bGwgPyBvcHRpb25zLmdyb3VwaW5nLm9iaiArICcuJyArIG9wdGlvbnMuZ3JvdXBpbmcuaWQgOiBudWxsXCJcclxuICAgICAgICAgICAgIFtncm91cFJvd3NCeU9yZGVyXT1cIjBcIlxyXG4gICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwib3B0aW9ucy52aXJ0dWFsU2Nyb2xsID09IHRydWUgJiYgb3B0aW9ucy5zY3JvbGxIZWlnaHQgIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIm9wdGlvbnMudmlydHVhbFNjcm9sbEl0ZW1TaXplICE9IG51bGwgPyBvcHRpb25zLnZpcnR1YWxTY3JvbGxJdGVtU2l6ZSA6IDM1XCJcclxuICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwib3B0aW9ucy5wYWdpbmF0b3IgPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZVwiXHJcbiAgICAgICAgICAgICBbcm93c109XCJvcHRpb25zLnBhZ2luYXRvclJvd3NcIlxyXG4gICAgICAgICAgICAgKG9uUGFnZSk9XCJvblBhZ2VUYWJsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFt0YWJsZVN0eWxlQ2xhc3NdPVwiIW9wdGlvbnMudGhlbWVHcmlsbGUgPyAnZ3JpZF9ncmV5JyA6IG9wdGlvbnMudGhlbWVHcmlsbGVcIlxyXG4gICAgICAgICAgICAgW2xhenldPVwib3B0aW9ucy5sYXp5ID09IHRydWUgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgKG9uRmlsdGVyKT1cIm9uRmlsdGVyVGFibGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbcm93VHJhY2tCeV09XCJ0cmFja0J5RnVuY3Rpb25cIlxyXG4gICAgICAgICAgICAgWyhjb250ZXh0TWVudVNlbGVjdGlvbildPVwiY29udGV4dE1lbnVTZWxlY3RlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgW2NvbnRleHRNZW51XT1cImNtXCI+XHJcblxyXG4gICAgICAgIDwhLS0gSEVBREVSIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSEVBREVSUyAtLT5cclxuICAgICAgICAgICAgPHRyIGNsYXNzPVwicm93SGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAqbmdJZj1cIiFvcHRpb25zLmZpbHRlcmFibGUgJiYgb3B0aW9ucy50b2dnbGVBbGxcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiBjb2wuYmFja2dyb3VuZENvbG9yID8gY29sLmJhY2tncm91bmRDb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3RleHQtY2VudGVyJyA6IG9wdGlvbnMuY2VudGVySGVhZGVycyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiIW9wdGlvbnMuc29ydGFibGUgfHwgb3B0aW9ucy5ncm91cGluZyAhPSBudWxsIHx8IGNvbC5saWJlbGxlID09IG51bGwgfHwgY29sLmxpYmVsbGUgPT0gJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IGNvbC5pZCB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZWZyZXNoRGF0YSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLmxpYmVsbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgJ2NvbG9yJzogY29sLnRleHRDb2xvciA/IGNvbC50ZXh0Q29sb3IgOiBudWxsIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5saWJlbGxlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiAqbmdJZj1cIm9wdGlvbnMuc29ydGFibGUgJiYgb3B0aW9ucy5ncm91cGluZyA9PSBudWxsICYmIGNvbC5saWJlbGxlICE9IG51bGwgJiYgY29sLmxpYmVsbGUgIT0gJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCIgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIj48L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGSUxUUkVTIC0tPlxyXG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJvcHRpb25zLmZpbHRlcmFibGVcIiBjbGFzcz1cInJvd0ZpbHRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtbj5cclxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICpuZ0lmPVwib3B0aW9ucy50b2dnbGVBbGxcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgKChjaGVja1R5cGUoJ0Ryb3Bkb3duJywgY29sKSAmJiBjb2wub3B0aW9ucy5maWx0ZXJUZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgJiYgY29sLm9wdGlvbnMuZmlsdGVyVGV4dClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hlY2tUeXBlKCdUZXh0JywgY29sKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1R5cGUoJ0J1dHRvbicsIGNvbCkgJiYgY29sLm9wdGlvbnMuZmlsdGVyQ29sKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hlY2tUeXBlKCdOdW1iZXInLCBjb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiIWNvbC5kaXNhYmxlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0RhdGUnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09IG51bGwgPyAnZGF0ZScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAneWVhcicgPyAneXknIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAnbW9udGgnID8gJ21tL3l5JyA6ICdkZC9tbS95eSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJjb2wuaWQgKyAnX2ZpbHRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERheU9mV2Vlaz1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHlJbnB1dF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTW9kZT1cInJhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dCdXR0b25CYXI9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIExpc3RlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmICgoY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgJiYgIWNvbC5vcHRpb25zLmZpbHRlclRleHQpIHx8IChjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSAmJiAhY29sLm9wdGlvbnMuZmlsdGVyVGV4dCkgfHwgY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpIHx8IGNoZWNrVHlwZSgnU3RhdGUnLCBjb2wpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiIWNvbC5kaXNhYmxlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sLm9wdGlvbnM/Lm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwiSURcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29sLm9wdGlvbnM/Lm9wdGlvbkxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsSXRlbVNpemVdPVwiMzVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0gc2VsZWN0aW9ubsOpc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZpbHRlckNvbCgkZXZlbnQsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwQ2hpbGRyZW4gIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cExhYmVsXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJjb2wub3B0aW9ucy5vcHRpb25Hcm91cENoaWxkcmVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkZpbHRlckNvbChudWxsLCBjb2wpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWdyb3VwIHBUZW1wbGF0ZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2dyb3VwW2NvbC5vcHRpb25zLm9wdGlvbkdyb3VwTGFiZWxdfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFN3aXRjaCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N3aXRjaCcsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCAqbmdJZj1cIiFjb2wuZGlzYWJsZUZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNTd2l0Y2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlYWRlcl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBzZWxlY3Rpb25uw6lzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTm9uIGZpbHRyYWJsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiAoY2hlY2tUeXBlKCdJbWFnZScsIGNvbCkgfHwgKGNoZWNrVHlwZSgnQnV0dG9uJywgY29sKSAmJiAhY29sLm9wdGlvbnMuZmlsdGVyQ29sKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cIm9wdGlvbnMucm93c0RlbGV0YWJsZVwiPjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRPVEFMIC0tPlxyXG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJvcHRpb25zLnJvd1RvdGFsXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicm93VG90YWxcIj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtbj5cclxuICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAndGV4dC1jZW50ZXInIDogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBnZXRUb3RhbFN0cihjb2wpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8IS0tR3JvdXBoZWFkZXItLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZ3JvdXBoZWFkZXJcIiBsZXQtcm93RGF0YT5cclxuICAgICAgICAgICAgPHRyIHBSb3dHcm91cEhlYWRlciBjbGFzcz1cInJvd0dyb3VwaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0X2JvbGRcIj57eyByb3dEYXRhW29wdGlvbnMuZ3JvdXBpbmcub2JqXVtvcHRpb25zLmdyb3VwaW5nLmxpYmVsbGVdIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS0gQm9keSAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dHIgaWQ9XCJ7eyByb3dEYXRhLmlkIH19XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhLmNvbG9yID8gcm93RGF0YS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3dEaXNhYmxlZF09XCIhb3B0aW9ucy5zZWxlY3RhYmxlIHx8IGlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uUm93RG91YmxlQ2xpY2tFdmVudChyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgICAgICBbcENvbnRleHRNZW51Um93XT1cInJvd0RhdGFcIlxyXG4gICAgICAgICAgICAgICAgW3BDb250ZXh0TWVudVJvd0Rpc2FibGVkXT1cIm9wdGlvbnMuY29udGV4dE1lbnVJdGVtcyA9PSBudWxsXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cInJvd0RhdGFcIiBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seVwiPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5dPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5GaWVsZF09XCJjb2wuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUZXh0KGNvbCwgcm93RGF0YSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiAoIWlzTW9kZUVkaXRpb24oKSB8fCByb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicgOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5saWJlbGxlIH19IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRleHQoY29sLCByb3dEYXRhKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWRkaW5nQ2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYXNlWkluZGV4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdiYXNlWkluZGV4JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAndmlydHVhbFNjcm9sbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsSXRlbVNpemVdPVwiMzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZGF0YSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGEgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGFbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YSA9PSBudWxsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWVbZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJyldIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nQ2VsbCc6IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXSA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDaWxvZyBOdW1iZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdDaWxvZ051bWJlcicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpbG9nLWlucHV0LW51bWJlciAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0U3R5bGVDbGFzc109XCJjb2wucG9zaXRpb24gPT0gbnVsbCB8fCBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyA/ICd0ZXh0LXJpZ2h0JyA6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6ICd0ZXh0LWNlbnRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwicm93RGF0YVtjb2wuaWRdLnRleHRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JvbGRdPVwicm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0YWxpY109XCJyb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1ZmZpeGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZml4ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21pbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERlY2ltYWxzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWF4RGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSA6IDIgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NpbG9nLWlucHV0LW51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgcm93RGF0YSwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnTnVtYmVyJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nQ2VsbCc6IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0NlbGxOdW1iZXIocm93RGF0YSwgY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICYmICFyb3dEYXRhW2NvbC5pZF0uZm9jdXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZE51bWJlcihjb2wsIHJvd0RhdGEsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyICNpbnB1dE51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSAmJiByb3dEYXRhW2NvbC5pZF0uZm9jdXMgPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3Nob3dCdXR0b25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRTdHlsZUNsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlXT1cInsgJ2ZvbnQtd2VpZ2h0Jzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSA/ICdib2xkJyA6IG51bGwsICdmb250LXN0eWxlJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWUgPyAnaXRhbGljJyA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW4nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSA6IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgIT0gbnVsbCAmJiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSA9PSB0cnVlID8gMCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpIDogMiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25CbHVyKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uS2V5RG93bik9XCJvbktleURvd24oJGV2ZW50LCByb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJvbkVkaXRJbml0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgcm93RGF0YSwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0RhdGUnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBkYXRlOiAnZGQvTU0veXl5eSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpZXddPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSBudWxsID8gJ2RhdGUnIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gJ3llYXInID8gJ3l5JyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gJ21vbnRoJyA/ICdtbS95eScgOiAnZGQvbW0veXknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REYXlPZldlZWs9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRTdHlsZUNsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlXT1cInsgJ2ZvbnQtd2VpZ2h0Jzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSA/ICdib2xkJyA6IG51bGwsICdmb250LXN0eWxlJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWUgPyAnaXRhbGljJyA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdjbGVhcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21pbkRhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEYXRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdERhdGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2RlZmF1bHREYXRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdEYXRlJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWluLXdpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWxlZnQnOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWJvbGQnOiByb3dEYXRhLmJvbGQgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uYm9sZCA9PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBkYXRlOiAoZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAneWVhcicgPyAneXl5eScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICdtb250aCcgPyAnTU0veXl5eScgOiAnZGQvTU0veXl5eScpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aVNlbGVjdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWxlZnQnOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFkZGluZ0NlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VaSW5kZXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Jhc2VaSW5kZXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICd2aXJ0dWFsU2Nyb2xsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiZWRpdE11bHRpc2VsZWN0KHJvd0RhdGEsIGNvbCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cENoaWxkcmVuJykgIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cExhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cExhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBDaGlsZHJlbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZGF0YSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkYXRhLCBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbltnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gKyAoaSAhPSBkYXRhLmxlbmd0aCAtIDEgPyAnLCcgOiAnJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1ncm91cCBwVGVtcGxhdGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tncm91cFtjb2wub3B0aW9ucy5vcHRpb25Hcm91cExhYmVsXX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ011bHRpU2VsZWN0JywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiBnZXRNdWx0aVNlbGVjdENvbmNhdChyb3dEYXRhW2NvbC5pZF0udmFsdWUsIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmdDZWxsJzogcm93RGF0YVtjb2wuaWRdICE9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXJpZ2h0JzogY29sLnBvc2l0aW9uID09ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1jZW50ZXInOiBjb2wucG9zaXRpb24gPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0TXVsdGlTZWxlY3RDb25jYXQocm93RGF0YVtjb2wuaWRdLnZhbHVlLCBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnSW1hZ2UnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIiBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdpZHRoOiA0MHB4O1wiIHNyYz1cInt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCdXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWRkaW5nQ2VsbCB0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgJiYgaXNWYWx1ZUJ1dHRvbkJ5VHlwZShyb3dEYXRhW2NvbC5pZF0udmFsdWUsICdmdW5jdGlvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2xhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdpY29uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdsYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidwLWJ1dHRvbi0nICsgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3NldmVyaXR5JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWl0YWxpYyc6IHJvd0RhdGEuaXRhbGljID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLml0YWxpYyA9PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzVmFsdWVCdXR0b25CeVR5cGUocm93RGF0YVtjb2wuaWRdLnZhbHVlLCAnc3RyaW5nJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1sZWZ0JzogY29sLnBvc2l0aW9uID09ICdsZWZ0JyB8fCBjb2wucG9zaXRpb24gPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbnMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25WYWx1ZScpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uVmFsdWUnKSA6ICd2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtY2VudGVyIHctZnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nQ2VsbCc6IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyBnZXRTZWxlY3RMaWJlbGxlQnlWYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTd2l0Y2ggLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdTd2l0Y2gnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgKGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdhY3Rpb24nKSA9PSBudWxsICYmICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0U3dpdGNoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXVwbG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0J5SWQoJ2lucHV0XycgKyByb3dEYXRhW2NvbC5pZF0uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7J291dHB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtbGVmdCc6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgfHwgY29sLnBvc2l0aW9uID09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1yaWdodCc6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtY2VudGVyJzogY29sLnBvc2l0aW9uID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCc6IHJvd0RhdGEuYm9sZCA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5ib2xkID09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1pdGFsaWMnOiByb3dEYXRhLml0YWxpYyA9PSB0cnVlIHx8IHJvd0RhdGFbY29sLmlkXS5pdGFsaWMgPT0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcm93RGF0YVtjb2wuaWRdLnZhbHVlICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Rvd25sb2FkUGF0aCcpICYmIHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktZG93bmxvYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRGaWxlKHJvd0RhdGFbY29sLmlkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCIgaWQ9XCJ7eydpbnB1dF8nICsgcm93RGF0YVtjb2wuaWRdLmlkfX1cIiAjaW5wdXRGaWxlIHBJbnB1dFRleHQgdHlwZT1cImZpbGVcIiBoaWRkZW4gKGNoYW5nZSk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgPSBpbnB1dEZpbGUuZmlsZXNbMF0ubmFtZTsgb25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIGlucHV0RmlsZS5maWxlc1swXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRmlsZScsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWxlZnQnOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnIHx8IGNvbC5wb3NpdGlvbiA9PSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcmlnaHQnOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWNlbnRlcic6IGNvbC5wb3NpdGlvbiA9PSAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWJvbGQnOiByb3dEYXRhLmJvbGQgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uYm9sZCA9PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtaXRhbGljJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N0YXRlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC10YWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLnNldmVyaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLnRleHRDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0Jzogcm93RGF0YS5ib2xkID09IHRydWUgfHwgcm93RGF0YVtjb2wuaWRdLmJvbGQgPT0gdHJ1ZSA/ICdib2xkJyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LXN0eWxlJzogcm93RGF0YS5pdGFsaWMgPT0gdHJ1ZSB8fCByb3dEYXRhW2NvbC5pZF0uaXRhbGljID09IHRydWUgPyAnaXRhbGljJyA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRGVsZXRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YS5kZWxldGFibGUgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJyb3dEYXRhLmRlbGV0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBidXR0b25EZWxldGUgcC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVMaW5lKHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG48L2Rpdj5cclxuIl19