@churchillliving/se-ui-toolkit 6.53.11 → 6.53.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/churchillliving-se-ui-toolkit.umd.js +10 -5
- package/bundles/churchillliving-se-ui-toolkit.umd.js.map +1 -1
- package/churchillliving-se-ui-toolkit.metadata.json +1 -1
- package/esm2015/lib/components/base/grid/grid.component.js +11 -6
- package/esm2015/lib/components/base/grid/grid.component.ngfactory.js +5 -5
- package/esm2015/lib/components/base/grid/grid.component.ngsummary.json +1 -1
- package/fesm2015/churchillliving-se-ui-toolkit.js +10 -5
- package/fesm2015/churchillliving-se-ui-toolkit.js.map +1 -1
- package/lib/components/base/grid/grid.component.d.ts +2 -1
- package/package.json +1 -1
|
@@ -58,6 +58,7 @@ export class GridComponent {
|
|
|
58
58
|
this.inEditMode = false;
|
|
59
59
|
this.saveRecordArray = [];
|
|
60
60
|
this.disabledSaveBtn = false;
|
|
61
|
+
this.setDialogData = true;
|
|
61
62
|
this.editModeChecked = true;
|
|
62
63
|
this.editModeunCkecked = false;
|
|
63
64
|
this.calendarFormat = 'mm/dd/y';
|
|
@@ -80,6 +81,7 @@ export class GridComponent {
|
|
|
80
81
|
this.editingRowKeys = {};
|
|
81
82
|
// Selects items in the grid based on passed on data
|
|
82
83
|
this.selectedRows = [];
|
|
84
|
+
this.addDataKeyValue = false;
|
|
83
85
|
this.globalData = [];
|
|
84
86
|
this.sortDisabled = false;
|
|
85
87
|
// Stores selected columns
|
|
@@ -185,10 +187,6 @@ export class GridComponent {
|
|
|
185
187
|
// set the row When adding the new Row on Grid
|
|
186
188
|
this.onGridRowAdd = new EventEmitter();
|
|
187
189
|
this.isGridHidden = false;
|
|
188
|
-
/**
|
|
189
|
-
* open Dialog in grid
|
|
190
|
-
*/
|
|
191
|
-
this.setDialogData = true;
|
|
192
190
|
}
|
|
193
191
|
set activeTestMode(val) {
|
|
194
192
|
if (val === true) {
|
|
@@ -810,6 +808,9 @@ export class GridComponent {
|
|
|
810
808
|
this.sortDisabled = true;
|
|
811
809
|
this.onGridRowAdd.emit(row);
|
|
812
810
|
}
|
|
811
|
+
/**
|
|
812
|
+
* open Dialog in grid
|
|
813
|
+
*/
|
|
813
814
|
openGridDialog(column, row) {
|
|
814
815
|
this.onClickEvent(column, row);
|
|
815
816
|
setTimeout(() => {
|
|
@@ -1283,6 +1284,9 @@ export class GridComponent {
|
|
|
1283
1284
|
this.rowActionEvents(selectedRow);
|
|
1284
1285
|
this.browserCloseEvent(false);
|
|
1285
1286
|
if (row.isNew) {
|
|
1287
|
+
if (this.addDataKeyValue) {
|
|
1288
|
+
row['id'] = selectedRow['id'];
|
|
1289
|
+
}
|
|
1286
1290
|
const { isNew } = row, newRowObj = __rest(row, ["isNew"]);
|
|
1287
1291
|
delete newRowObj[this.dataKey];
|
|
1288
1292
|
if (this.saveAllRecord) {
|
|
@@ -2126,7 +2130,7 @@ export class GridComponent {
|
|
|
2126
2130
|
GridComponent.decorators = [
|
|
2127
2131
|
{ type: Component, args: [{
|
|
2128
2132
|
selector: 'se-grid',
|
|
2129
|
-
template: "<p-confirmDialog\r\n [style]=\"{ width: '50vw' }\"\r\n *ngIf=\"useInlineCRUD\"\r\n key=\"handleInlineCRUD\"\r\n></p-confirmDialog>\r\n<p-confirmDialog\r\n [style]=\"{ width: '50vw' }\"\r\n *ngIf=\"columnActions.length > 0\"\r\n key=\"handlecolumnActions\"\r\n></p-confirmDialog>\r\n<div class=\"p-mb-2 p-d-flex p-ai-center\"\r\n *ngIf=\"\r\n allowColumnToggle ||\r\n rowActions.length > 0 ||\r\n useInlineCRUD ||\r\n allowExportToExcel ||\r\n allowExportToPdf ||\r\n clearGridFilter\r\n \"\r\n>\r\n<!-- button for apply filterValue on Grid -->\r\n <button\r\n *ngIf=\"filtering && !hideFilter\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-search\"\r\n (click)=\"applyGirdFilterBtn()\"\r\n [class]=\"\r\n searchGridFilter ? 'p-button-success p-mr-2 p-ml-1' : 'hide-clear-filter-button'\r\n \"\r\n></button>\r\n\r\n<!-- button for clear filterValue on Grid -->\r\n <button\r\n *ngIf=\"filtering && !hideFilter\"\r\n pButton\r\n id=\"clearGridFilterValuesButton\"\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n (click)=\"cleargridFiltersValue()\"\r\n [class]=\"\r\n clearGridFilter ? 'p-button-danger p-mr-2 p-ml-1' : 'hide-clear-filter-button'\r\n \"\r\n></button>\r\n\r\n<!-- button for edit all grid at once -->\r\n<!-- <button\r\n pButton\r\n *ngIf=\"hideEditAllRowsBtn && editAllRows\"\r\n id=\"editBtnGlobalvalues\"\r\n type=\"button\"\r\n [label]=\"'Edit'\"\r\n class=\"p-mr-2 ui-button-info\"\r\n icon=\"pi pi-pencil\"\r\n [class]=\"editRowPermission ? '' : 'p-disabled'\"\r\n (click)=\"editAllRowsAtOnce()\"\r\n ></button> -->\r\n\r\n <!-- button for save all grid at once -->\r\n <button\r\n pButton\r\n *ngIf=\"editAllRows && editRowPermission\"\r\n id=\"saveAllGridValues\"\r\n icon=\"pi pi-check\"\r\n [label]=\"'Save'\"\r\n class=\"p-mr-2 ui-button-info\"\r\n type=\"button\"\r\n (click)=\"saveAllRowsAtOnce()\"\r\n ></button>\r\n\r\n <!-- button for cancel all grid at once -->\r\n <button\r\n pButton\r\n *ngIf=\"editAllRows\"\r\n id=\"editBtnGlobalvalues\"\r\n type=\"button\"\r\n [label]=\"'Cancel'\"\r\n icon=\"pi pi-times\"\r\n class=\"p-mr-2 ui-button-info\"\r\n (click)=\"cancelAllRowsAtOnce()\"\r\n ></button>\r\n\r\n <!-- header Button for multiSelect on Grid -->\r\n <span *ngIf=\"allowColumnToggle\">\r\n <p-multiSelect\r\n [showToggleAll]=\"false\"\r\n [options]=\"columns\"\r\n [(ngModel)]=\"selectedColumns\"\r\n optionLabel=\"header\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ minWidth: '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n >\r\n </p-multiSelect>\r\n </span>\r\n\r\n <!-- header Button for Adding new Row on Grid -->\r\n <button\r\n pButton\r\n *ngIf=\"useInlineCRUD && addRowPermission && !hideOnRowAddBtn\"\r\n type=\"button\"\r\n [label]=\"'Add'\"\r\n pAddRow\r\n [table]=\"componentTableRef\"\r\n [newRow]=\"newGridRow\"\r\n [id]=\"dataKey\"\r\n pTooltip=\"Add New Row\"\r\n tooltipPosition=\"bottom\"\r\n icon=\"pi pi-plus\"\r\n class=\"ui-button-info p-mr-2\"\r\n (click)=\"addNewRow(newGridRow, true)\"\r\n pRipple\r\n ></button>\r\n \r\n<!-- header Button for Excel File on Grid -->\r\n<button\r\n *ngIf=\"allowExportToExcel\"\r\n type=\"button\"\r\n pButton\r\n icon=\"pi pi-file-excel\"\r\n (click)=\"exportExcel()\"\r\n class=\"p-button-success p-mt-0 p-mx-2\"\r\n pTooltip=\"Export to Excel\"\r\n tooltipPosition=\"bottom\"\r\n pRipple\r\n></button>\r\n\r\n<!-- header Button for PDF File on Grid -->\r\n<button\r\n *ngIf=\"allowExportToPdf\"\r\n type=\"button\"\r\n pButton\r\n icon=\"pi pi-file-pdf\"\r\n (click)=\"exportPdf()\"\r\n class=\"p-button-warning p-mr-2\"\r\n pTooltip=\"Export to Pdf\"\r\n tooltipPosition=\"bottom\"\r\n pRipple\r\n></button>\r\n</div>\r\n\r\n<p-table\r\n *ngIf=\"!isGridHidden\"\r\n id=\"my-table\"\r\n [value]=\"rowsData\"\r\n [columns]=\"selectedColumns\"\r\n sortMode=\"multiple\"\r\n [lazy]=\"useServerSideEvents\"\r\n [paginator]=\"pagination\"\r\n [class]=\"pagination || !rowsData.length ? 'pagination' : ''\"\r\n [rows]=\"defaultRows\"\r\n [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"setPaginationLength\"\r\n [showCurrentPageReport]=\"showCurrentPageReport\"\r\n currentPageReportTemplate=\"Showing {first} to {last} of {{\r\n totalRecords\r\n }} entries\"\r\n [loading]=\"autoLoadData ? loading : false\"\r\n (onSort)=\"sortDisabled ?? handleSortChange($event)\"\r\n (onFilter)=\"handleFilterChange($event)\"\r\n (onLazyLoad)=\"autoLoadData ? handleServerSideEvents($event) : ''\"\r\n (onPage)=\"handleServerSidePagination($event)\"\r\n #dt\r\n [dataKey]=\"dataKey\"\r\n [(selection)]=\"selectedRows\"\r\n [scrollable]=\"scrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n editMode=\"row\"\r\n [editingRowKeys]=\"editingRowKeys\"\r\n [autoLayout]=\"true\"\r\n [rowHover]=\"rowHover\"\r\n [ngClass]=\"{'horizontal-scroll': horizontalScroll === true ? true : false}\"\r\n>\r\n <!-- header Button for Action on Grid -->\r\n <div\r\n *ngIf=\"rowActions.length > 0 && rowActions.length > 0\"\r\n class=\"p-d-flex p-jc-end\"\r\n >\r\n <span *ngFor=\"let rowAction of rowActions\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n [label]=\"rowAction.title\"\r\n [class]=\"rowAction.class\"\r\n (click)=\"rowAction.onClick(selectedRows)\"\r\n ></button>\r\n </span>\r\n </div>\r\n\r\n <!-- header columns on Grid -->\r\n <ng-template pTemplate=\"header\" let-cols>\r\n <tr>\r\n <th *ngIf=\"allowSelection\" [ngStyle]=\"{ width: selectionColumnWidth }\">\r\n Select\r\n </th>\r\n <th\r\n *ngIf=\"setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\r\n >\r\n Actions\r\n </th>\r\n <th\r\n *ngFor=\"let column of cols\"\r\n [pSortableColumn]=\"column.field\"\r\n [style]=\"column.style\"\r\n [pSortableColumnDisabled]=\"sortDisabled ? true : column.sorting === false\"\r\n >\r\n <div style=\"display: flex;align-items: center;white-space: nowrap;\">\r\n <span class=\"flex-grow-1\">{{ column.header }}</span>\r\n <p-sortIcon\r\n *ngIf=\"column.sorting !== false\"\r\n [field]=\"column.field\"\r\n ></p-sortIcon>\r\n </div>\r\n </th>\r\n <th *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">Actions</th>\r\n </tr>\r\n <tr *ngIf=\"filtering && !hideFilter\">\r\n <th *ngIf=\"allowSelection\">\r\n <p-tableHeaderCheckbox\r\n *ngIf=\"selectionType === 'multiple'\"\r\n (click)=\"multiCheckBoxOnclick(rowsData)\"\r\n ></p-tableHeaderCheckbox>\r\n </th>\r\n <th *ngIf=\"setActionColumnAsFirst\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n </th>\r\n <th\r\n *ngFor=\"let column of cols\"\r\n [ngSwitch]=\"column?.filter?.type\"\r\n [style]=\"column.style\"\r\n [class]=\"hideFilterOptions ? 'hide-table-filter' : ''\"\r\n >\r\n <span *ngIf=\"column.filtering !== false\" [class]=\"column.filter?.showFilter ? '' : 'hide-filter-icon'\">\r\n <!-- Text input on Header For Filter-->\r\n <p-columnFilter\r\n [type]=\"'text'\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'input'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (keyup)=\"removingFilters($event, column)\"\r\n pInputText\r\n />\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- Numeric input on Header For Filter-->\r\n <p-columnFilter\r\n [type]=\"'numeric'\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'numeric_input'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-inputNumber\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (onBlur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (keyup)=\"removingFilters($event, column)\"\r\n ></p-inputNumber>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- lookup input on Header For Filter-->\r\n <p-columnFilter\r\n [type]=\"'text'\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'lookup_input'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <div class=\"close-icon-wrapper\">\r\n <input\r\n id=\"lookUp_filter\"\r\n autocomplete=\"off\"\r\n type=\"text\"\r\n [(ngModel)]=\"column.value\"\r\n [disabled]=\"column.disabled\"\r\n (click)=\"setFilterLookup(column)\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (keyup)=\"removingFilters($event, column)\"\r\n pInputText\r\n />\r\n <div><button *ngIf=\"column.value\" icon=\"pi pi-times\" pButton type=\"button\" (click)=\"lookupClearValue(column)\"></button></div>\r\n </div>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- checkbox on Header For Filter-->\r\n <p-columnFilter\r\n type=\"boolean\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'checkbox'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-checkbox\r\n [binary]=\"true\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (click)=\"clickCheckBoxFilter(column)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n >\r\n </p-checkbox>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- multiSelect on Header For Filter-->\r\n <p-columnFilter\r\n [field]=\"column.field\"\r\n matchMode=\"in\"\r\n [showMenu]=\"false\"\r\n *ngSwitchCase=\"'multi-select'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-multiSelect\r\n [ngModel]=\"value\"\r\n [options]=\"column.filter.data || []\"\r\n (onChange)=\"filter($event.value)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n placeholder=\"Any\"\r\n optionLabel=\"label\"\r\n >\r\n </p-multiSelect>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- dropdown on Header For Filter-->\r\n <p-columnFilter\r\n [field]=\"column.field\"\r\n matchMode=\"in\"\r\n [showMenu]=\"false\"\r\n *ngSwitchCase=\"'dropdown'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-dropdown\r\n [showClear]=\"true\"\r\n [placeholder]=\"'Select'\"\r\n [filter]=\"column.allowSearch\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyDropdownFilter(filter, $event)\"\r\n [options]=\"column.filter.data || []\"\r\n (onChange)=\"searchDropdownFilter(filter, $event, column)\"\r\n ></p-dropdown>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- calendar on Header For Filter-->\r\n <p-columnFilter\r\n [field]=\"column.field\"\r\n matchMode=\"in\"\r\n [showMenu]=\"false\"\r\n *ngSwitchCase=\"'calendar'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-calendar\r\n [placeholder]=\"'Select-Date'\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n appendTo=\"body\"\r\n (onSelect)=\"selectDate(column)\"\r\n [inputId]=\"column.field\"\r\n hourFormat=\"12\"\r\n (keyup.backspace)=\"removeNullCalendar(column, filter, $event)\"\r\n [showButtonBar]=\"true\"\r\n (onClose)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (onClearClick)=\"backspaceEvent($event, column)\"\r\n >\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- Default Filter For Header -->\r\n <p-columnFilter\r\n [type]=\"\r\n column.type && column.type !== 'link' ? column.type : 'text'\r\n \"\r\n [field]=\"column.field\"\r\n display=\"menu\"\r\n *ngSwitchDefault\r\n >\r\n </p-columnFilter>\r\n </span>\r\n </th>\r\n <th *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Body columns on Grid -->\r\n <ng-template pTemplate=\"body\" let-row let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr\r\n [ngClass]=\"row.highlightrow ? 'highlighted-row' : ''\"\r\n [class]=\"wordWrap ? '' : 'noWrap'\"\r\n (click)=\"!editing && handleRowClick(row)\"\r\n [pEditableRow]=\"row\"\r\n #gridRow\r\n [id]=\"row[dataKey]\"\r\n >\r\n <td *ngIf=\"allowSelection\" [ngStyle]=\"{ width: selectionColumnWidth }\">\r\n <p-tableRadioButton\r\n [value]=\"row\"\r\n *ngIf=\"selectionType === 'single'\"\r\n ></p-tableRadioButton>\r\n <p-tableCheckbox\r\n [value]=\"row\"\r\n *ngIf=\"selectionType === 'multiple'\"\r\n (click)=\"multiCheckBoxOnclick(row)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- first actions column -->\r\n <td *ngIf=\"setActionColumnAsFirst && columnActions.length > 0\">\r\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\r\n <i\r\n [title]=\"action.tooltip\"\r\n [class]=\"action.icon\"\r\n (click)=\"handleActionClick($event, action, row)\"\r\n ></i>\r\n </span>\r\n </td>\r\n <td *ngIf=\"setActionColumnAsFirst && useInlineCRUD && (deleteRowPermission || editRowPermission)\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n <span class=\"setActionColumnWidth\">\r\n <se-grid-row-actions\r\n [editing]=\"editing\"\r\n [editRowPermission]=\"editRowPermission\"\r\n [deleteRowPermission]=\"deleteRowPermission\"\r\n [row]=\"row\"\r\n (onRowEditInitBtn)=\"onRowEditInit($event)\"\r\n (deleteRecordBtn)=\"deleteRecord($event)\"\r\n (onRowEditSaveBtn)=\"onRowEditSave($event)\"\r\n (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\r\n [editAllRows]=\"disabledSaveBtn\"\r\n >\r\n </se-grid-row-actions>\r\n </span>\r\n </td>\r\n\r\n <!-- Grid Rows Data Bindings Start -->\r\n <td\r\n *ngFor=\"let column of selectedColumns\"\r\n [ngSwitch]=\"column.type\"\r\n [style]=\"column.style\"\r\n >\r\n\r\n <!-- Boolean column on Grid -->\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <td *ngIf=\"!editing\">\r\n <p-checkbox\r\n [disabled]=\"true\"\r\n [binary]=\"true\"\r\n (click)=\"selectedRow(row)\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n [(ngModel)]=\"\r\n row[column.field] &&\r\n (row[column.field].toString() === '1' ||\r\n row[column.field].toString().toLowerCase() === 'true' ||\r\n row[column.field].toString().toLowerCase() === 'y')\r\n ? checked\r\n : unChecked\r\n \"\r\n >\r\n </p-checkbox>\r\n </td>\r\n <td *ngIf=\"editing\">\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <!-- for edit checkBox -->\r\n <p-checkbox\r\n (click)=\"onClickEvent(column, row)\"\r\n (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [binary]=\"true\"\r\n [(ngModel)]=\"\r\n row[column.field] &&\r\n (row[column.field].toString() === '1' ||\r\n row[column.field].toString().toLowerCase() === 'true' ||\r\n row[column.field].toString().toLowerCase() === 'y')\r\n ? editModeChecked\r\n : editModeunCkecked\r\n \"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n ></p-checkbox>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{ row[column.field] }}\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n </td>\r\n </span>\r\n\r\n <!-- link column on Grid -->\r\n <span *ngSwitchCase=\"'link'\">\r\n <!-- link column for HyperLink Case -->\r\n <span *ngIf=\"column.allowSave === false\">\r\n <span\r\n *ngIf=\"column.target !== '_self'\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disable-link' : ''\"\r\n >\r\n <a [href]=\"row[column.field + '_obj']?.hyperlink\" target=\"_blank\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </a>\r\n </span>\r\n <span\r\n *ngIf=\"column.target === '_self'\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disable-link' : ''\"\r\n >\r\n <a [href]=\"row[column.field + '_obj']?.hyperlink\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </a>\r\n </span>\r\n </span>\r\n <!-- link column for Edit Case -->\r\n <span *ngIf=\"column.allowSave || column.allowSave === undefined\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <span *ngIf=\"column.editable === true || column.editable === undefined\">\r\n <input\r\n *ngIf=\"!row.isNew\"\r\n pInputText\r\n (click)=\"onClickEvent(column, row)\"\r\n type=\"text\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (change)=\"onChangeEvent(column, row)\"\r\n />\r\n <input\r\n pInputText\r\n *ngIf=\"row.isNew\"\r\n type=\"text\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (change)=\"onChangeEvent(column, row)\"\r\n />\r\n </span>\r\n <span *ngIf=\"column.editable === false\" \r\n (click)=\"openLink(row[column.field + '_obj']?.hyperlink)\"\r\n [class]=\"allowDisabled(column,row) ? 'disable-link' : 'hyperlink'\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </span>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span>\r\n <a (click)=\"onClickEvent(column, row)\" [href]=\"row[column.field + '_obj']?.hyperlink\" target=\"_blank\" \r\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disable-link' : ''\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </a>\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n </span>\r\n\r\n <!-- Iframe column on Grid -->\r\n <span *ngSwitchCase=\"'iframe'\">\r\n <span\r\n class=\"custom-link\"\r\n (click)=\"\r\n gridIFrame(column, row[column.field + '_obj'].hyperlink, row)\r\n \"\r\n [title]=\"\r\n row[column.field + '_obj'] &&\r\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\r\n ? row[column.field] : row[column.field + '_obj']?.displayText\r\n ? row[column.field + '_obj'].displayText\r\n : column.displayText\r\n ? column.displayText\r\n : row[column.field]\r\n \"\r\n >\r\n {{\r\n row[column.field + '_obj'] &&\r\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\r\n ? row[column.field] : row[column.field + '_obj']?.displayText\r\n ? row[column.field + '_obj'].displayText\r\n : column.displayText ? column.displayText : row[column.field]\r\n }}\r\n </span>\r\n </span>\r\n\r\n <!-- dialog column on Grid -->\r\n <span *ngSwitchCase=\"'dialog'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <span\r\n *ngIf=\"row[column.field + '_secondType'] !== 'date' && !row.hidegridbtn\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n >\r\n <span *ngIf=\"column.editable === true\">\r\n <input\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n type=\"text\"\r\n pInputText\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [name]=\"row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n />\r\n </span>\r\n <span\r\n *ngIf=\"\r\n column.editable === false || column.editable === undefined\r\n \"\r\n [class]=\"\r\n allowDisabled(column,row) ? 'disable-link custom-link' : 'custom-link'\r\n \"\r\n (click)=\"openGridDialog(column, row)\"\r\n >\r\n {{ !column.displayText && row.isNew ? '' : setConditionBaseValue(row, column) }}\r\n </span>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"row[column.field + '_secondType'] === 'date'\"\r\n [title]=\"\r\n row[column.field]\r\n | date: (column.format ? column.format : 'MM/dd/YY')\r\n \"\r\n >\r\n <p-calendar\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n (onClose)=\"onFocusOutEvent(column, row)\"\r\n [appendTo]=\"'body'\"\r\n hourFormat=\"12\"\r\n [showTime]=\"column.showTime\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [timeOnly]=\"column.timeOnly\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n ></p-calendar>\r\n </span>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n [class]=\"row.disabled == false ? 'custom-link' : column.editable === false ? 'custom-link' : allowDisabled(column,row) ? 'disable-link custom-link' : 'custom-link'\"\r\n (click)=\"openGridDialog(column, row)\"\r\n *ngIf=\"!row[column.field + '_secondType'] && !row.hidegridbtn\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n >\r\n {{ setConditionBaseValue(row, column) }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- lookup Input column on Grid -->\r\n <span *ngSwitchCase=\"'lookup_input'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div class=\"close-icon-wrapper\">\r\n <input\r\n readonly\r\n type=\"text\"\r\n pInputText\r\n [(ngModel)]=\"(column.disabled || column.editable === false) && column.displayField ? row[column.displayField] : typeOf(row[column.field]) === 'object' ?\r\n row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [name]=\"row[column.field]\"\r\n (keyup.tab)=\"selectLookupField(column, row)\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (click)=\"selectLookupField(column, row)\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n \t(blur)=\"onFocusOutEvent(column, row)\"\r\n />\r\n <div *ngIf=\"!allowDisabled(column,row)\"><button *ngIf=\"row[column.field] && typeOf(row[column.field]) === 'object'\r\n ? row[column.field].text\r\n : row[column.field] && !column.disabled\" icon=\"pi pi-times\" pButton type=\"button\" (click)=\"lookupClearValue(column,row)\"></button></div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span *ngIf=\"column.linkId\">\r\n <a [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target === '_self' ? '' : '_blank'\"> \r\n {{\r\n typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.text : row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n }}\r\n </a>\r\n </span>\r\n <span\r\n *ngIf=\"!column.linkId\"\r\n [class]=\"column.component && column.editLink === true ? 'custom-link' : ''\"\r\n (click)=\"openLookupHyperlink(column, row)\"\r\n >\r\n {{\r\n typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.text : row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- Numeric Input column on Grid -->\r\n <span *ngSwitchCase=\"'numeric'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <!-- for Currency && Decimal && Percent -->\r\n <span class=\"input-number\">\r\n <p-inputNumber\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [class]=\"\r\n column.errorMessage\r\n ? 'ng-invalid ng-dirty'\r\n : 'form-control'\r\n \"\r\n [showButtons]=\"!column.format ? true : false\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [name]=\"column.field\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (ngModelChange)=\"onChangeEvent(column, row)\"\r\n (onBlur)=\"onFocusOutEvent(column, row)\"\r\n [mode]=\"\r\n column.format &&\r\n column.format.type === 'currency'\r\n ? 'currency'\r\n : 'decimal'\r\n \"\r\n [currency]=\"\r\n column.format &&\r\n column.format.type === 'currency' &&\r\n column.format.formatParams &&\r\n column.format.formatParams.currency\r\n ? column.format.formatParams.currency\r\n : 'USD'\r\n \"\r\n [locale]=\"\r\n column.format &&\r\n column.format.type === 'currency' &&\r\n column.format.formatParams &&\r\n column.format.formatParams.locale\r\n ? column.format.formatParams.locale\r\n : 'en-US'\r\n \"\r\n [minFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\r\n [maxFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\r\n [suffix]=\"\r\n column.format &&\r\n column.format.type === 'percent' && !column?.format?.formatParams?.allowCalculate \r\n ? '%'\r\n : ''\r\n \"\r\n >\r\n </p-inputNumber>\r\n </span>\r\n <ng-template #locked_field\r\n ><span *ngIf=\"!row.isNew\" [title]=\"row[column.field]\">\r\n {{ row[column.field] }}\r\n </span></ng-template\r\n >\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n [title]=\"setNumericFormat(column, row)\">\r\n {{\r\n setNumericFormat(column, row)\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n \r\n <!-- Button column on Grid -->\r\n <span [title]=\"column.value ? column.value : column.icon\">\r\n <div *ngSwitchCase=\"'add_button'\">\r\n <button *ngIf=\"!row.hidegridbtn\"\r\n pButton\r\n type=\"button\"\r\n [icon]=\"row[column.field]?.action?.icon ? row[column.field]?.action?.icon : column.icon\"\r\n [name]=\"column.header\"\r\n class=\"merge-btn\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [label]=\"row[column.field]?.action?.displayText ? row[column.field]?.action?.displayText : column.value\"\r\n [ngStyle]=\"{\r\n background: column.color ? column.color : ''\r\n }\"\r\n (click)=\"onClickButton(column, row)\"\r\n ></button>\r\n </div>\r\n </span>\r\n\r\n <!-- Date column on Grid -->\r\n <span\r\n *ngSwitchCase=\"'date'\"\r\n [title]=\"setConditionBaseValue(row,column)\"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-calendar\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty ' + column.field + row[dataKey] : column.field + row[dataKey]\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n (onClose)=\"onFocusOutEvent(column, row)\"\r\n [appendTo]=\"'body'\"\r\n hourFormat=\"12\"\r\n [defaultDate]=\"defaultDate\"\r\n [stepMinute] = \"column.minutesInterval ? column.minutesInterval : 1\"\r\n [showTime]=\"column.showTime\"\r\n [timeOnly]=\"column.timeOnly\"\r\n [dateFormat]=\"column.format ? column.format : calendarFormat\"\r\n (keyup)=\"calenderInputValue(column, row)\"\r\n (onShow)=\"onClickEvent(column, row)\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n ></p-calendar>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{ setConditionBaseValue(row,column) }}\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <span [ngSwitch]=\"column.type\">\r\n <!-- Dropdown column on Grid -->\r\n <span\r\n *ngSwitchCase=\"'dropdown'\"\r\n [class]=\"dropdownInput ? '' : 'output-dropdown'\"\r\n [title]=\"\r\n setDropdwonReadOnlyValue(row, column)\r\n \"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown\r\n *ngIf=\"!row[column.field]?.action?.hidden\"\r\n [options]=\"\r\n row[column.field+'_data']\r\n ? row[column.field+'_data']\r\n : column.data\r\n \"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [placeholder]=\"row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field] ? row[column.field] : 'Select'\"\r\n [showClear]=\"row[column.field] ? true : false\"\r\n [optionLabel]=\"column.optionLabel\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [optionValue]=\"column.optionValue\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (onChange)=\"onChangeEvent(column, row)\"\r\n [filter]=\"column.allowSearch\"\r\n ></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span *ngIf=\"!row[column.field]?.action?.hidden\">\r\n {{\r\n setDropdwonReadOnlyValue(row, column)\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- MultiSelect column on Grid -->\r\n <span *ngSwitchCase=\"'multi-select'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-multiSelect\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n type=\"text\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [options]=\"column.data\"\r\n [optionLabel]=\"column.optionLabel\"\r\n [optionValue]=\"column.optionValue\"\r\n (onChange)=\"onChangeEvent(column, row)\"\r\n (onPanelShow)=\"showOption(column, row)\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [appendTo]=\"'body'\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n >\r\n </p-multiSelect>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n [title]=\"\r\n row[column.displayField]\r\n ? row[column.displayField]\r\n : setMultiSelectData(column, row[column.field])\r\n \"\r\n >\r\n {{\r\n row[column.displayField]\r\n ? row[column.displayField] :\r\n setMultiSelectData(column, row[column.field])\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- AutoComplete Search -->\r\n <span\r\n *ngSwitchCase=\"'AutoComplete'\"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-autoComplete\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [name]=\"column.header\"\r\n [suggestions]=\"column.data\"\r\n [field]=\"column.displayField\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\" \r\n [dropdown]=\"column.showOption\"\r\n (onChange)=\"onChangeEvent(column, row)\"\r\n (click)=\"onClickEvent(column, row)\"\r\n (completeMethod)=\"autoSearch($event, column, row)\"\r\n (onBlur)=\"onFocusOutEvent(column, row)\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [multiple]=\"true\"\r\n >\r\n </p-autoComplete>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.displayField]\">\r\n <span *ngFor=\"let value of row[column.field]; let i = index\">\r\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ? value[column.displayField] : value[column.displayField] + ';' : value[column.displayField] }}\r\n </span>\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span> \r\n <!-- Add Generate Report Button -->\r\n <span *ngSwitchCase=\"'report'\"> \r\n <p-cellEditor> \r\n <ng-template pTemplate=\"output\">\r\n <se-generate-report-btn [repId]=\"column.reportId\" [params]=\"column.params\" [showDialog]=\"column.showDialog\"></se-generate-report-btn>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <span *ngSwitchDefault>\r\n <!-- Input column on Grid -->\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [(ngModel)]=\"row.undefined ? '' : allowDisabled(column,row) && row[column.displayField] ? row[column.displayField] : typeOf(row[column.field]) === 'object' && (row[column.field]?.action || row[column.field]?.text) ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (change)=\"onChangeEvent(column, row)\"\r\n (click)=\"onClickButton(column, row)\"\r\n *ngIf=\"column.field !== dataKey; else locked_field\"\r\n />\r\n <ng-template #locked_field\r\n ><span *ngIf=\"!row.isNew\" [title]=\"row[column.field]\">\r\n {{ row[column.field] }}\r\n </span></ng-template\r\n >\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n (click)=\"onClickEvent(column, row)\"\r\n [title]=\"\r\n column.displayText ? column.displayText : \r\n row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n \"\r\n >\r\n {{\r\n row[column.field]?.action ? row[column.field]?.text : column.displayText ? column.displayText : \r\n row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n </span>\r\n </span>\r\n </td>\r\n <!-- Grid Rows Data Bindings End -->\r\n\r\n <!-- Action column on Grid -->\r\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && columnActions.length > 0\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\r\n <i\r\n [title]=\"action.tooltip\"\r\n [class]=\"action.icon\"\r\n (click)=\"handleActionClick($event, action, row)\"\r\n ></i>\r\n </span>\r\n </td>\r\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n <span class='setActionColumnWidth'>\r\n <se-grid-row-actions\r\n [editing]=\"editing\"\r\n [editRowPermission]=\"editRowPermission\"\r\n [deleteRowPermission]=\"deleteRowPermission\"\r\n [row]=\"row\"\r\n (onRowEditInitBtn)=\"onRowEditInit($event)\"\r\n (deleteRecordBtn)=\"deleteRecord($event)\"\r\n (onRowEditSaveBtn)=\"onRowEditSave($event)\"\r\n (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\r\n [editAllRows]=\"disabledSaveBtn\"\r\n >\r\n </se-grid-row-actions>\r\n </span>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Footer columns on Grid -->\r\n <ng-template pTemplate=\"footer\">\r\n <tr *ngIf=\"aggregateFooter\">\r\n <td *ngIf=\"setActionColumnAsFirst && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\r\n <td *ngFor=\"let outerColumn of selectedColumns\" [style]=\"outerColumn.style\">\r\n <div *ngFor=\"let innerColumn of selectedColumns\">\r\n <div *ngFor=\"let aggr of innerColumn?.aggregate\">\r\n <div *ngIf=\"aggr.aggrValue?.length && ((!aggr.displayField && innerColumn.field.toLowerCase() === outerColumn.field.toLowerCase()) || aggr.displayField && aggr.displayField.toLowerCase() === outerColumn.field.toLowerCase())\">\r\n <div [innerHTML]=\"aggr.aggrValue\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Footer for Empty Message columns on Grid -->\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"selectedColumns?.length + 1\">No records found.</td>\r\n </tr>\r\n </ng-template>\r\n</p-table>\r\n",
|
|
2133
|
+
template: "<p-confirmDialog\r\n [style]=\"{ width: '50vw' }\"\r\n *ngIf=\"useInlineCRUD\"\r\n key=\"handleInlineCRUD\"\r\n></p-confirmDialog>\r\n<p-confirmDialog\r\n [style]=\"{ width: '50vw' }\"\r\n *ngIf=\"columnActions.length > 0\"\r\n key=\"handlecolumnActions\"\r\n></p-confirmDialog>\r\n<div class=\"p-mb-2 p-d-flex p-ai-center\"\r\n *ngIf=\"\r\n allowColumnToggle ||\r\n rowActions.length > 0 ||\r\n useInlineCRUD ||\r\n allowExportToExcel ||\r\n allowExportToPdf ||\r\n clearGridFilter\r\n \"\r\n>\r\n<!-- button for apply filterValue on Grid -->\r\n <button\r\n *ngIf=\"filtering && !hideFilter\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-search\"\r\n (click)=\"applyGirdFilterBtn()\"\r\n [class]=\"\r\n searchGridFilter ? 'p-button-success p-mr-2 p-ml-1' : 'hide-clear-filter-button'\r\n \"\r\n></button>\r\n\r\n<!-- button for clear filterValue on Grid -->\r\n <button\r\n *ngIf=\"filtering && !hideFilter\"\r\n pButton\r\n id=\"clearGridFilterValuesButton\"\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n (click)=\"cleargridFiltersValue()\"\r\n [class]=\"\r\n clearGridFilter ? 'p-button-danger p-mr-2 p-ml-1' : 'hide-clear-filter-button'\r\n \"\r\n></button>\r\n\r\n<!-- button for edit all grid at once -->\r\n<!-- <button\r\n pButton\r\n *ngIf=\"hideEditAllRowsBtn && editAllRows\"\r\n id=\"editBtnGlobalvalues\"\r\n type=\"button\"\r\n [label]=\"'Edit'\"\r\n class=\"p-mr-2 ui-button-info\"\r\n icon=\"pi pi-pencil\"\r\n [class]=\"editRowPermission ? '' : 'p-disabled'\"\r\n (click)=\"editAllRowsAtOnce()\"\r\n ></button> -->\r\n\r\n <!-- button for save all grid at once -->\r\n <button\r\n pButton\r\n *ngIf=\"editAllRows && editRowPermission\"\r\n id=\"saveAllGridValues\"\r\n icon=\"pi pi-check\"\r\n [label]=\"'Save'\"\r\n class=\"p-mr-2 ui-button-info\"\r\n type=\"button\"\r\n (click)=\"saveAllRowsAtOnce()\"\r\n ></button>\r\n\r\n <!-- button for cancel all grid at once -->\r\n <button\r\n pButton\r\n *ngIf=\"editAllRows\"\r\n id=\"editBtnGlobalvalues\"\r\n type=\"button\"\r\n [label]=\"'Cancel'\"\r\n icon=\"pi pi-times\"\r\n class=\"p-mr-2 ui-button-info\"\r\n (click)=\"cancelAllRowsAtOnce()\"\r\n ></button>\r\n\r\n <!-- header Button for multiSelect on Grid -->\r\n <span *ngIf=\"allowColumnToggle\">\r\n <p-multiSelect\r\n [showToggleAll]=\"false\"\r\n [options]=\"columns\"\r\n [(ngModel)]=\"selectedColumns\"\r\n optionLabel=\"header\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ minWidth: '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n >\r\n </p-multiSelect>\r\n </span>\r\n\r\n <!-- header Button for Adding new Row on Grid -->\r\n <button\r\n pButton\r\n *ngIf=\"useInlineCRUD && addRowPermission && !hideOnRowAddBtn\"\r\n type=\"button\"\r\n [label]=\"'Add'\"\r\n pAddRow\r\n [table]=\"componentTableRef\"\r\n [newRow]=\"newGridRow\"\r\n [id]=\"dataKey\"\r\n pTooltip=\"Add New Row\"\r\n tooltipPosition=\"bottom\"\r\n icon=\"pi pi-plus\"\r\n class=\"ui-button-info p-mr-2\"\r\n (click)=\"addNewRow(newGridRow, true)\"\r\n pRipple\r\n ></button>\r\n \r\n<!-- header Button for Excel File on Grid -->\r\n<button\r\n *ngIf=\"allowExportToExcel\"\r\n type=\"button\"\r\n pButton\r\n icon=\"pi pi-file-excel\"\r\n (click)=\"exportExcel()\"\r\n class=\"p-button-success p-mt-0 p-mx-2\"\r\n pTooltip=\"Export to Excel\"\r\n tooltipPosition=\"bottom\"\r\n pRipple\r\n></button>\r\n\r\n<!-- header Button for PDF File on Grid -->\r\n<button\r\n *ngIf=\"allowExportToPdf\"\r\n type=\"button\"\r\n pButton\r\n icon=\"pi pi-file-pdf\"\r\n (click)=\"exportPdf()\"\r\n class=\"p-button-warning p-mr-2\"\r\n pTooltip=\"Export to Pdf\"\r\n tooltipPosition=\"bottom\"\r\n pRipple\r\n></button>\r\n</div>\r\n\r\n<p-table\r\n *ngIf=\"!isGridHidden\"\r\n id=\"my-table\"\r\n [value]=\"rowsData\"\r\n [columns]=\"selectedColumns\"\r\n sortMode=\"multiple\"\r\n [lazy]=\"useServerSideEvents\"\r\n [paginator]=\"pagination\"\r\n [class]=\"pagination || !rowsData.length ? 'pagination' : ''\"\r\n [rows]=\"defaultRows\"\r\n [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"setPaginationLength\"\r\n [showCurrentPageReport]=\"showCurrentPageReport\"\r\n currentPageReportTemplate=\"Showing {first} to {last} of {{\r\n totalRecords\r\n }} entries\"\r\n [loading]=\"autoLoadData ? loading : false\"\r\n (onSort)=\"sortDisabled ?? handleSortChange($event)\"\r\n (onFilter)=\"handleFilterChange($event)\"\r\n (onLazyLoad)=\"autoLoadData ? handleServerSideEvents($event) : ''\"\r\n (onPage)=\"handleServerSidePagination($event)\"\r\n #dt\r\n [dataKey]=\"dataKey\"\r\n [(selection)]=\"selectedRows\"\r\n [scrollable]=\"scrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n editMode=\"row\"\r\n [editingRowKeys]=\"editingRowKeys\"\r\n [autoLayout]=\"true\"\r\n [rowHover]=\"rowHover\"\r\n [ngClass]=\"{'horizontal-scroll': horizontalScroll === true ? true : false}\"\r\n>\r\n <!-- header Button for Action on Grid -->\r\n <div\r\n *ngIf=\"rowActions.length > 0 && rowActions.length > 0\"\r\n class=\"p-d-flex p-jc-end\"\r\n >\r\n <span *ngFor=\"let rowAction of rowActions\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n [label]=\"rowAction.title\"\r\n [class]=\"rowAction.class\"\r\n (click)=\"rowAction.onClick(selectedRows)\"\r\n ></button>\r\n </span>\r\n </div>\r\n\r\n <!-- header columns on Grid -->\r\n <ng-template pTemplate=\"header\" let-cols>\r\n <tr>\r\n <th *ngIf=\"allowSelection\" [ngStyle]=\"{ width: selectionColumnWidth }\">\r\n Select\r\n </th>\r\n <th\r\n *ngIf=\"setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\r\n >\r\n Actions\r\n </th>\r\n <th\r\n *ngFor=\"let column of cols\"\r\n [pSortableColumn]=\"column.field\"\r\n [style]=\"column.style\"\r\n [pSortableColumnDisabled]=\"sortDisabled ? true : column.sorting === false\"\r\n >\r\n <div style=\"display: flex;align-items: center;white-space: nowrap;\">\r\n <span class=\"flex-grow-1\">{{ column.header }}</span>\r\n <p-sortIcon\r\n *ngIf=\"column.sorting !== false\"\r\n [field]=\"column.field\"\r\n ></p-sortIcon>\r\n </div>\r\n </th>\r\n <th *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">Actions</th>\r\n </tr>\r\n <tr *ngIf=\"filtering && !hideFilter\">\r\n <th *ngIf=\"allowSelection\">\r\n <p-tableHeaderCheckbox\r\n *ngIf=\"selectionType === 'multiple'\"\r\n (click)=\"multiCheckBoxOnclick(rowsData)\"\r\n ></p-tableHeaderCheckbox>\r\n </th>\r\n <th *ngIf=\"setActionColumnAsFirst\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n </th>\r\n <th\r\n *ngFor=\"let column of cols\"\r\n [ngSwitch]=\"column?.filter?.type\"\r\n [style]=\"column.style\"\r\n [class]=\"hideFilterOptions ? 'hide-table-filter' : ''\"\r\n >\r\n <span *ngIf=\"column.filtering !== false\" [class]=\"column.filter?.showFilter ? '' : 'hide-filter-icon'\">\r\n <!-- Text input on Header For Filter-->\r\n <p-columnFilter\r\n [type]=\"'text'\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'input'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (keyup)=\"removingFilters($event, column)\"\r\n pInputText\r\n />\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- Numeric input on Header For Filter-->\r\n <p-columnFilter\r\n [type]=\"'numeric'\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'numeric_input'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-inputNumber\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (onBlur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (keyup)=\"removingFilters($event, column)\"\r\n ></p-inputNumber>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- lookup input on Header For Filter-->\r\n <p-columnFilter\r\n [type]=\"'text'\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'lookup_input'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <div class=\"close-icon-wrapper\">\r\n <input\r\n id=\"lookUp_filter\"\r\n autocomplete=\"off\"\r\n type=\"text\"\r\n [(ngModel)]=\"column.value\"\r\n [disabled]=\"column.disabled\"\r\n (click)=\"setFilterLookup(column)\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (keyup)=\"removingFilters($event, column)\"\r\n pInputText\r\n />\r\n <div><button *ngIf=\"column.value\" icon=\"pi pi-times\" pButton type=\"button\" (click)=\"lookupClearValue(column)\"></button></div>\r\n </div>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- checkbox on Header For Filter-->\r\n <p-columnFilter\r\n type=\"boolean\"\r\n [field]=\"column.field\"\r\n *ngSwitchCase=\"'checkbox'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-checkbox\r\n [binary]=\"true\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n (onChange)=\"setFilterFocusOut(column, filter, $event)\"\r\n (click)=\"clickCheckBoxFilter(column)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n >\r\n </p-checkbox>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- multiSelect on Header For Filter-->\r\n <p-columnFilter\r\n [field]=\"column.field\"\r\n matchMode=\"in\"\r\n [showMenu]=\"false\"\r\n *ngSwitchCase=\"'multi-select'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-multiSelect\r\n [ngModel]=\"value\"\r\n [options]=\"column.filter.data || []\"\r\n (onChange)=\"filter($event.value)\"\r\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n placeholder=\"Any\"\r\n optionLabel=\"label\"\r\n >\r\n </p-multiSelect>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- dropdown on Header For Filter-->\r\n <p-columnFilter\r\n [field]=\"column.field\"\r\n matchMode=\"in\"\r\n [showMenu]=\"false\"\r\n *ngSwitchCase=\"'dropdown'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-dropdown\r\n [showClear]=\"true\"\r\n [placeholder]=\"'Select'\"\r\n [filter]=\"column.allowSearch\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyDropdownFilter(filter, $event)\"\r\n [options]=\"column.filter.data || []\"\r\n (onChange)=\"searchDropdownFilter(filter, $event, column)\"\r\n ></p-dropdown>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- calendar on Header For Filter-->\r\n <p-columnFilter\r\n [field]=\"column.field\"\r\n matchMode=\"in\"\r\n [showMenu]=\"false\"\r\n *ngSwitchCase=\"'calendar'\"\r\n >\r\n <ng-template\r\n pTemplate=\"filter\"\r\n let-value\r\n let-filter=\"filterCallback\"\r\n >\r\n <p-calendar\r\n [placeholder]=\"'Select-Date'\"\r\n [(ngModel)]=\"column.value\"\r\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\r\n appendTo=\"body\"\r\n (onSelect)=\"selectDate(column)\"\r\n [inputId]=\"column.field\"\r\n hourFormat=\"12\"\r\n (keyup.backspace)=\"removeNullCalendar(column, filter, $event)\"\r\n [showButtonBar]=\"true\"\r\n (onClose)=\"setFilterFocusOut(column, filter, $event)\"\r\n (keydown)=\"backspaceEvent($event, column)\"\r\n (onClearClick)=\"backspaceEvent($event, column)\"\r\n >\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n\r\n <!-- Default Filter For Header -->\r\n <p-columnFilter\r\n [type]=\"\r\n column.type && column.type !== 'link' ? column.type : 'text'\r\n \"\r\n [field]=\"column.field\"\r\n display=\"menu\"\r\n *ngSwitchDefault\r\n >\r\n </p-columnFilter>\r\n </span>\r\n </th>\r\n <th *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Body columns on Grid -->\r\n <ng-template pTemplate=\"body\" let-row let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr\r\n [ngClass]=\"row.highlightrow ? 'highlighted-row' : ''\"\r\n [class]=\"wordWrap ? '' : 'noWrap'\"\r\n (click)=\"!editing && handleRowClick(row)\"\r\n [pEditableRow]=\"row\"\r\n #gridRow\r\n [id]=\"row[dataKey]\"\r\n >\r\n <td *ngIf=\"allowSelection\" [ngStyle]=\"{ width: selectionColumnWidth }\">\r\n <p-tableRadioButton\r\n [value]=\"row\"\r\n *ngIf=\"selectionType === 'single'\"\r\n ></p-tableRadioButton>\r\n <p-tableCheckbox\r\n [value]=\"row\"\r\n *ngIf=\"selectionType === 'multiple'\"\r\n (click)=\"multiCheckBoxOnclick(row)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- first actions column -->\r\n <td *ngIf=\"setActionColumnAsFirst && columnActions.length > 0\">\r\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\r\n <i\r\n [title]=\"action.tooltip\"\r\n [class]=\"action.icon\"\r\n (click)=\"handleActionClick($event, action, row)\"\r\n ></i>\r\n </span>\r\n </td>\r\n <td *ngIf=\"setActionColumnAsFirst && useInlineCRUD && (deleteRowPermission || editRowPermission)\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n <span class=\"setActionColumnWidth\">\r\n <se-grid-row-actions\r\n [editing]=\"editing\"\r\n [editRowPermission]=\"editRowPermission\"\r\n [deleteRowPermission]=\"deleteRowPermission\"\r\n [row]=\"row\"\r\n (onRowEditInitBtn)=\"onRowEditInit($event)\"\r\n (deleteRecordBtn)=\"deleteRecord($event)\"\r\n (onRowEditSaveBtn)=\"onRowEditSave($event)\"\r\n (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\r\n [editAllRows]=\"disabledSaveBtn\"\r\n >\r\n </se-grid-row-actions>\r\n </span>\r\n </td>\r\n\r\n <!-- Grid Rows Data Bindings Start -->\r\n <td\r\n *ngFor=\"let column of selectedColumns\"\r\n [ngSwitch]=\"column.type\"\r\n [style]=\"column.style\"\r\n >\r\n\r\n <!-- Boolean column on Grid -->\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <td *ngIf=\"!editing\">\r\n <p-checkbox\r\n [disabled]=\"true\"\r\n [binary]=\"true\"\r\n (click)=\"selectedRow(row)\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n [(ngModel)]=\"\r\n row[column.field] &&\r\n (row[column.field].toString() === '1' ||\r\n row[column.field].toString().toLowerCase() === 'true' ||\r\n row[column.field].toString().toLowerCase() === 'y')\r\n ? checked\r\n : unChecked\r\n \"\r\n >\r\n </p-checkbox>\r\n </td>\r\n <td *ngIf=\"editing\">\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <!-- for edit checkBox -->\r\n <p-checkbox\r\n (click)=\"onClickEvent(column, row)\"\r\n (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [binary]=\"true\"\r\n [(ngModel)]=\"\r\n row[column.field] &&\r\n (row[column.field].toString() === '1' ||\r\n row[column.field].toString().toLowerCase() === 'true' ||\r\n row[column.field].toString().toLowerCase() === 'y')\r\n ? editModeChecked\r\n : editModeunCkecked\r\n \"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n ></p-checkbox>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{ row[column.field] }}\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n </td>\r\n </span>\r\n\r\n <!-- link column on Grid -->\r\n <span *ngSwitchCase=\"'link'\">\r\n <!-- link column for HyperLink Case -->\r\n <span *ngIf=\"column.allowSave === false\">\r\n <span\r\n *ngIf=\"column.target !== '_self'\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disable-link' : ''\"\r\n >\r\n <a [href]=\"row[column.field + '_obj']?.hyperlink\" target=\"_blank\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </a>\r\n </span>\r\n <span\r\n *ngIf=\"column.target === '_self'\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disable-link' : ''\"\r\n >\r\n <a [href]=\"row[column.field + '_obj']?.hyperlink\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </a>\r\n </span>\r\n </span>\r\n <!-- link column for Edit Case -->\r\n <span *ngIf=\"column.allowSave || column.allowSave === undefined\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <span *ngIf=\"column.editable === true || column.editable === undefined\">\r\n <input\r\n *ngIf=\"!row.isNew\"\r\n pInputText\r\n (click)=\"onClickEvent(column, row)\"\r\n type=\"text\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (change)=\"onChangeEvent(column, row)\"\r\n />\r\n <input\r\n pInputText\r\n *ngIf=\"row.isNew\"\r\n type=\"text\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (change)=\"onChangeEvent(column, row)\"\r\n />\r\n </span>\r\n <span *ngIf=\"column.editable === false\" \r\n (click)=\"openLink(row[column.field + '_obj']?.hyperlink)\"\r\n [class]=\"allowDisabled(column,row) ? 'disable-link' : 'hyperlink'\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </span>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span>\r\n <a (click)=\"onClickEvent(column, row)\" [href]=\"row[column.field + '_obj']?.hyperlink\" target=\"_blank\" \r\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disable-link' : ''\">\r\n {{\r\n setConditionBaseValue(row, column)\r\n }}\r\n </a>\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n </span>\r\n\r\n <!-- Iframe column on Grid -->\r\n <span *ngSwitchCase=\"'iframe'\">\r\n <span\r\n class=\"custom-link\"\r\n (click)=\"\r\n gridIFrame(column, row[column.field + '_obj'].hyperlink, row)\r\n \"\r\n [title]=\"\r\n row[column.field + '_obj'] &&\r\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\r\n ? row[column.field] : row[column.field + '_obj']?.displayText\r\n ? row[column.field + '_obj'].displayText\r\n : column.displayText\r\n ? column.displayText\r\n : row[column.field]\r\n \"\r\n >\r\n {{\r\n row[column.field + '_obj'] &&\r\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\r\n ? row[column.field] : row[column.field + '_obj']?.displayText\r\n ? row[column.field + '_obj'].displayText\r\n : column.displayText ? column.displayText : row[column.field]\r\n }}\r\n </span>\r\n </span>\r\n\r\n <!-- dialog column on Grid -->\r\n <span *ngSwitchCase=\"'dialog'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <span\r\n *ngIf=\"row[column.field + '_secondType'] !== 'date' && !row.hidegridbtn\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n >\r\n <span *ngIf=\"column.editable === true\">\r\n <input\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n type=\"text\"\r\n pInputText\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [name]=\"row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n />\r\n </span>\r\n <span\r\n *ngIf=\"\r\n column.editable === false || column.editable === undefined\r\n \"\r\n [class]=\"\r\n allowDisabled(column,row) ? 'disable-link custom-link' : 'custom-link'\r\n \"\r\n (click)=\"openGridDialog(column, row)\"\r\n >\r\n {{ !column.displayText && row.isNew ? '' : setConditionBaseValue(row, column) }}\r\n </span>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"row[column.field + '_secondType'] === 'date'\"\r\n [title]=\"\r\n row[column.field]\r\n | date: (column.format ? column.format : 'MM/dd/YY')\r\n \"\r\n >\r\n <p-calendar\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n (onClose)=\"onFocusOutEvent(column, row)\"\r\n [appendTo]=\"'body'\"\r\n hourFormat=\"12\"\r\n [showTime]=\"column.showTime\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [timeOnly]=\"column.timeOnly\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n ></p-calendar>\r\n </span>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n [class]=\"row.disabled == false ? 'custom-link' : column.editable === false ? 'custom-link' : allowDisabled(column,row) ? 'disable-link custom-link' : 'custom-link'\"\r\n (click)=\"openGridDialog(column, row)\"\r\n *ngIf=\"!row[column.field + '_secondType'] && !row.hidegridbtn\"\r\n [title]=\"setConditionBaseValue(row, column)\"\r\n >\r\n {{ setConditionBaseValue(row, column) }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- lookup Input column on Grid -->\r\n <span *ngSwitchCase=\"'lookup_input'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div class=\"close-icon-wrapper\">\r\n <input\r\n readonly\r\n type=\"text\"\r\n pInputText\r\n [(ngModel)]=\"(column.disabled || column.editable === false) && column.displayField ? row[column.displayField] : typeOf(row[column.field]) === 'object' ?\r\n row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [name]=\"row[column.field]\"\r\n (keyup.tab)=\"selectLookupField(column, row)\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (click)=\"selectLookupField(column, row)\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n \t(blur)=\"onFocusOutEvent(column, row)\"\r\n />\r\n <div *ngIf=\"!allowDisabled(column,row)\"><button *ngIf=\"row[column.field] && typeOf(row[column.field]) === 'object'\r\n ? row[column.field].text\r\n : row[column.field] && !column.disabled\" icon=\"pi pi-times\" pButton type=\"button\" (click)=\"lookupClearValue(column,row)\"></button></div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span *ngIf=\"column.linkId\">\r\n <a [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target === '_self' ? '' : '_blank'\"> \r\n {{\r\n typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.text : row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n }}\r\n </a>\r\n </span>\r\n <span\r\n *ngIf=\"!column.linkId\"\r\n [class]=\"column.component && column.editLink === true ? 'custom-link' : ''\"\r\n (click)=\"openLookupHyperlink(column, row)\"\r\n >\r\n {{\r\n typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.text : row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- Numeric Input column on Grid -->\r\n <span *ngSwitchCase=\"'numeric'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <!-- for Currency && Decimal && Percent -->\r\n <span class=\"input-number\">\r\n <p-inputNumber\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [class]=\"\r\n column.errorMessage\r\n ? 'ng-invalid ng-dirty'\r\n : 'form-control'\r\n \"\r\n [showButtons]=\"!column.format ? true : false\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [name]=\"column.field\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (ngModelChange)=\"onChangeEvent(column, row)\"\r\n (onBlur)=\"onFocusOutEvent(column, row)\"\r\n [mode]=\"\r\n column.format &&\r\n column.format.type === 'currency'\r\n ? 'currency'\r\n : 'decimal'\r\n \"\r\n [currency]=\"\r\n column.format &&\r\n column.format.type === 'currency' &&\r\n column.format.formatParams &&\r\n column.format.formatParams.currency\r\n ? column.format.formatParams.currency\r\n : 'USD'\r\n \"\r\n [locale]=\"\r\n column.format &&\r\n column.format.type === 'currency' &&\r\n column.format.formatParams &&\r\n column.format.formatParams.locale\r\n ? column.format.formatParams.locale\r\n : 'en-US'\r\n \"\r\n [minFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\r\n [maxFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\r\n [suffix]=\"\r\n column.format &&\r\n column.format.type === 'percent' && !column?.format?.formatParams?.allowCalculate \r\n ? '%'\r\n : ''\r\n \"\r\n >\r\n </p-inputNumber>\r\n </span>\r\n <ng-template #locked_field\r\n ><span *ngIf=\"!row.isNew\" [title]=\"row[column.field]\">\r\n {{ row[column.field] }}\r\n </span></ng-template\r\n >\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n [title]=\"setNumericFormat(column, row)\">\r\n {{\r\n setNumericFormat(column, row)\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n \r\n <!-- Button column on Grid -->\r\n <span [title]=\"column.value ? column.value : column.icon\">\r\n <div *ngSwitchCase=\"'add_button'\">\r\n <button *ngIf=\"!row.hidegridbtn\"\r\n pButton\r\n type=\"button\"\r\n [icon]=\"row[column.field]?.action?.icon ? row[column.field]?.action?.icon : column.icon\"\r\n [name]=\"column.header\"\r\n class=\"merge-btn\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [label]=\"row[column.field]?.action?.displayText ? row[column.field]?.action?.displayText : column.value\"\r\n [ngStyle]=\"{\r\n background: column.color ? column.color : ''\r\n }\"\r\n (click)=\"onClickButton(column, row)\"\r\n ></button>\r\n </div>\r\n </span>\r\n\r\n <!-- Date column on Grid -->\r\n <span\r\n *ngSwitchCase=\"'date'\"\r\n [title]=\"setConditionBaseValue(row,column)\"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-calendar\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty ' + column.field + row[dataKey] : column.field + row[dataKey]\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n (onClose)=\"onFocusOutEvent(column, row)\"\r\n [appendTo]=\"'body'\"\r\n hourFormat=\"12\"\r\n [defaultDate]=\"defaultDate\"\r\n [stepMinute] = \"column.minutesInterval ? column.minutesInterval : 1\"\r\n [showTime]=\"column.showTime\"\r\n [timeOnly]=\"column.timeOnly\"\r\n [dateFormat]=\"column.format ? column.format : calendarFormat\"\r\n (keyup)=\"calenderInputValue(column, row)\"\r\n (onShow)=\"onClickEvent(column, row)\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n ></p-calendar>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{ setConditionBaseValue(row,column) }}\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <span [ngSwitch]=\"column.type\">\r\n <!-- Dropdown column on Grid -->\r\n <span\r\n *ngSwitchCase=\"'dropdown'\"\r\n [class]=\"dropdownInput ? '' : 'output-dropdown'\"\r\n [title]=\"\r\n setDropdwonReadOnlyValue(row, column)\r\n \"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown\r\n *ngIf=\"!row[column.field]?.action?.hidden\"\r\n [options]=\"\r\n row[column.field+'_data']\r\n ? row[column.field+'_data']\r\n : column.data\r\n \"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [placeholder]=\"row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field] ? row[column.field] : 'Select'\"\r\n [showClear]=\"row[column.field] ? true : false\"\r\n [optionLabel]=\"column.optionLabel\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [optionValue]=\"column.optionValue\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (onChange)=\"onChangeEvent(column, row)\"\r\n [filter]=\"column.allowSearch\"\r\n ></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span *ngIf=\"!row[column.field]?.action?.hidden\">\r\n {{\r\n setDropdwonReadOnlyValue(row, column)\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- MultiSelect column on Grid -->\r\n <span *ngSwitchCase=\"'multi-select'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-multiSelect\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n type=\"text\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' && row[column.field]?.action ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [options]=\"column.data\"\r\n [optionLabel]=\"column.optionLabel\"\r\n [optionValue]=\"column.optionValue\"\r\n (onChange)=\"onChangeEvent(column, row)\"\r\n (onPanelShow)=\"showOption(column, row)\"\r\n (click)=\"onClickEvent(column, row)\"\r\n [appendTo]=\"'body'\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n >\r\n </p-multiSelect>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n [title]=\"\r\n row[column.displayField]\r\n ? row[column.displayField]\r\n : setMultiSelectData(column, row[column.field])\r\n \"\r\n >\r\n {{\r\n row[column.displayField]\r\n ? row[column.displayField] :\r\n setMultiSelectData(column, row[column.field])\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <!-- AutoComplete Search -->\r\n <span\r\n *ngSwitchCase=\"'AutoComplete'\"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-autoComplete\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [name]=\"column.header\"\r\n [suggestions]=\"column.data\"\r\n [field]=\"column.displayField\"\r\n [(ngModel)]=\"typeOf(row[column.field]) === 'object' ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\" \r\n [dropdown]=\"column.showOption\"\r\n (onChange)=\"onChangeEvent(column, row)\"\r\n (click)=\"onClickEvent(column, row)\"\r\n (completeMethod)=\"autoSearch($event, column, row)\"\r\n (onBlur)=\"onFocusOutEvent(column, row)\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n [multiple]=\"true\"\r\n >\r\n </p-autoComplete>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.displayField]\">\r\n <span *ngFor=\"let value of row[column.field]; let i = index\">\r\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ? value[column.displayField] : value[column.displayField] + ';' : value[column.displayField] }}\r\n </span>\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span> \r\n <!-- Add Generate Report Button -->\r\n <span *ngSwitchCase=\"'report'\"> \r\n <p-cellEditor> \r\n <ng-template pTemplate=\"output\">\r\n <se-generate-report-btn [repId]=\"column.reportId\" [params]=\"column.params\" [showDialog]=\"column.showDialog\"></se-generate-report-btn>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n\r\n <span *ngSwitchDefault>\r\n <!-- Input column on Grid -->\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [class]=\"column.errorMessage ? 'ng-invalid ng-dirty' : ''\"\r\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\r\n [(ngModel)]=\"row.undefined ? '' : allowDisabled(column,row) && row[column.displayField] ? row[column.displayField] : typeOf(row[column.field]) === 'object' && (row[column.field]?.action || row[column.field]?.text) ? row[column.field]?.action?.displayField?.toLowerCase() ?\r\n row[row[column.field]?.action?.displayField.toLowerCase()] : row[column.field]?.text : row[column.field]\"\r\n [disabled]=\"allowDisabled(column,row)\"\r\n (blur)=\"onFocusOutEvent(column, row)\"\r\n (change)=\"onChangeEvent(column, row)\"\r\n (click)=\"onClickButton(column, row)\"\r\n *ngIf=\"column.field !== dataKey; else locked_field\"\r\n />\r\n <ng-template #locked_field\r\n ><span *ngIf=\"!row.isNew\" [title]=\"row[column.field]\">\r\n {{ row[column.field] }}\r\n </span></ng-template\r\n >\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <span\r\n (click)=\"onClickEvent(column, row)\"\r\n [title]=\"\r\n column.displayText ? column.displayText : \r\n row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n \"\r\n >\r\n {{\r\n row[column.field]?.action ? row[column.field]?.text : column.displayText ? column.displayText : \r\n row[column.displayField]\r\n ? row[column.displayField]\r\n : row[column.field]\r\n }}\r\n </span>\r\n </ng-template>\r\n </p-cellEditor>\r\n </span>\r\n </span>\r\n </span>\r\n </td>\r\n <!-- Grid Rows Data Bindings End -->\r\n\r\n <!-- Action column on Grid -->\r\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && columnActions.length > 0\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\r\n <i\r\n [title]=\"action.tooltip\"\r\n [class]=\"action.icon\"\r\n (click)=\"handleActionClick($event, action, row)\"\r\n ></i>\r\n </span>\r\n </td>\r\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\r\n <span class='setActionColumnWidth'>\r\n <se-grid-row-actions\r\n [editing]=\"editing\"\r\n [editRowPermission]=\"editRowPermission\"\r\n [deleteRowPermission]=\"deleteRowPermission\"\r\n [row]=\"row\"\r\n (onRowEditInitBtn)=\"onRowEditInit($event)\"\r\n (deleteRecordBtn)=\"deleteRecord($event)\"\r\n (onRowEditSaveBtn)=\"onRowEditSave($event)\"\r\n (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\r\n [editAllRows]=\"disabledSaveBtn\"\r\n >\r\n </se-grid-row-actions>\r\n </span>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Footer columns on Grid -->\r\n <ng-template pTemplate=\"footer\">\r\n <tr *ngIf=\"aggregateFooter\">\r\n <td *ngIf=\"setActionColumnAsFirst && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\r\n <td *ngFor=\"let outerColumn of selectedColumns\" [style]=\"outerColumn.style\">\r\n <div *ngFor=\"let innerColumn of selectedColumns\">\r\n <div *ngFor=\"let aggr of innerColumn?.aggregate\">\r\n <div *ngIf=\"aggr.aggrValue?.length && ((!aggr.displayField && innerColumn.field.toLowerCase() === outerColumn.field.toLowerCase()) || aggr.displayField && aggr.displayField.toLowerCase() === outerColumn.field.toLowerCase())\">\r\n <div [innerHTML]=\"aggr.aggrValue\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Footer for Empty Message columns on Grid -->\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"selectedColumns?.length + 1\">No records found.</td>\r\n </tr>\r\n </ng-template>\r\n</p-table>\r\n",
|
|
2130
2134
|
styles: [".action-btn{margin-right:10px;cursor:pointer}:host ::ng-deep .two-action-btn{flex:0!important;flex-basis:6%!important}:host ::ng-deep .three-action-btn{flex:0!important;flex-basis:8%!important}:host ::ng-deep .p-column-filter-clear-button{display:none}:host ::ng-deep .hide-table-filter .pi-filter:before{display:none}:host ::ng-deep .horizontal-scroll .p-datatable{position:relative;width:calc(100vw - 263px);overflow:auto;height:calc(100vh - 134px)}:host ::ng-deep .horizontal-scroll .p-datatable th,:host ::ng-deep .horizontal-scroll .p-datatable td{min-width:150px}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{padding:0 1rem!important}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td span{vertical-align:middle}:host ::ng-deep td[ng-reflect-ng-switch=multi-select] span{overflow:visible!important}:host ::ng-deep td[ng-reflect-ng-switch=dropdown] span{overflow:visible!important}:host ::ng-deep .input-number{border:0;border-radius:2px;padding:5px 0}:host ::ng-deep .input-number input{border:0;padding:0 10px 0 0;outline:none!important;box-shadow:none!important}:host ::ng-deep .input-number button{color:#2d2d2d;width:15px;height:12px;border:0;background-color:#eee}:host ::ng-deep .input-number button:hover{color:#2d2d2d;background-color:#ddd}:host ::ng-deep .input-number button span{font-size:12px}:host ::ng-deep .hide-filter-icon .p-column-filter-menu-button{display:none}.disable-link{color:#e4b7b8;pointer-events:none;text-decoration:underline;opacity:.5}.hyperlink{color:#cc7272;text-decoration:underline;cursor:pointer}.custom-link{color:#205dcf;cursor:pointer;font-size:12px}.setActionColumnWidth{display:flex}.noWrap td span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%}.highlighted-row{background-color:#dee2e6!important}td[ng-reflect-ng-switch=AutoComplete] span{overflow:visible!important}.hide-clear-filter-button{display:none}#hide-border{border-bottom:0!important}p-celleditor p-inputnumber{border:0}.merge-btn{margin-top:2px;line-height:14px}.close-icon-wrapper{position:relative}.close-icon-wrapper input{width:100%}.close-icon-wrapper button{position:absolute;right:5px;top:6px;width:25px;height:25px;background:unset;color:#777;border:0}\n"]
|
|
2131
2135
|
},] }
|
|
2132
2136
|
];
|
|
@@ -2151,6 +2155,7 @@ GridComponent.propDecorators = {
|
|
|
2151
2155
|
activeTestMode: [{ type: Input }],
|
|
2152
2156
|
table: [{ type: ViewChild, args: ['dt',] }],
|
|
2153
2157
|
selectedRows: [{ type: Input }],
|
|
2158
|
+
addDataKeyValue: [{ type: Input }],
|
|
2154
2159
|
horizontalScroll: [{ type: Input }],
|
|
2155
2160
|
loading: [{ type: Input }],
|
|
2156
2161
|
autoLoadData: [{ type: Input }],
|
|
@@ -2211,4 +2216,4 @@ GridComponent.propDecorators = {
|
|
|
2211
2216
|
onGridRowAdd: [{ type: Output }],
|
|
2212
2217
|
beforeunloadHandler: [{ type: HostListener, args: ['window:beforeunload', ['$event'],] }]
|
|
2213
2218
|
};
|
|
2214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUVqQixRQUFRLEVBQ1IsVUFBVSxFQUNWLFlBQVksRUFHWixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixhQUFhLEdBQ2QsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQVNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2Ysa0JBQWtCLEVBRWxCLGNBQWMsRUFFZCxlQUFlLEdBRWhCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEtBQUssU0FBUyxNQUFNLHFD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MkJBR2QsS0FBSzsrQkFVTCxLQUFLO3NCQUdMLEtBQUs7MkJBR0wsS0FBSzs2QkFHTCxLQUFLO21DQUdMLEtBQUs7OEJBR0wsS0FBSzsrQkFHTCxLQUFLO2lDQUdMLEtBQUs7cUNBR0wsS0FBSzs0QkFHTCxLQUFLO3lCQUdMLEtBQUs7NEJBR0wsS0FBSztzQkFHTCxLQUFLOzhCQUdMLEtBQUs7K0JBR0wsS0FBSzt5QkFHTCxLQUFLOzJCQUdMLEtBQUs7dUJBR0wsS0FBSzt5QkFFTCxLQUFLO3dCQUVMLEtBQUs7dUJBRUwsS0FBSztnQ0FFTCxLQUFLO2tDQUdMLEtBQUs7eUJBR0wsTUFBTTttQkFPTixLQUFLOytCQXVDTCxLQUFLO3NCQTBFTCxLQUFLOzBCQUVMLEtBQUs7Z0NBR0wsS0FBSzt5QkFHTCxLQUFLOzRCQUdMLEtBQUs7eUJBR0wsS0FBSztvQ0FHTCxLQUFLOzJCQUdMLEtBQUs7Z0NBRUwsS0FBSzswQkFHTCxLQUFLOzRCQUVMLEtBQUs7a0NBR0wsS0FBSzt5QkFHTCxNQUFNO29DQUdOLE1BQU07NEJBR04sTUFBTTsyQkFHTixNQUFNOzZCQUdOLE1BQU07cUNBR04sTUFBTTs0QkFHTixNQUFNO21DQUdOLE1BQU07c0NBR04sTUFBTTsyQkFLTixNQUFNOzBCQUlOLE1BQU07OEJBR04sTUFBTTswQkFHTixNQUFNO3VCQUdOLE1BQU07K0JBR04sTUFBTTsyQkFHTixLQUFLOzBCQUdMLEtBQUs7MEJBRUwsS0FBSzs0QkFHTCxNQUFNOzJCQUdOLE1BQU07a0NBNkJOLFlBQVksU0FBQyxxQkFBcUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPcHRpb25hbCxcclxuICBFbGVtZW50UmVmLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQge1xyXG4gIER5bmFtaWNEaWFsb2dSZWYsXHJcbiAgRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICBEaWFsb2dTZXJ2aWNlLFxyXG59IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG5pbXBvcnQgeyBHcmlkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyaWQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgSUdyaWRDb2x1bW4sXHJcbiAgSUdyaWRTb3J0LFxyXG4gIElHcmlkU2VydmVyU2lkZUV2ZW50LFxyXG4gIElHcmlkUGFnaW5hdGlvbkV2ZW50LFxyXG4gIElHbG9iYWxGaWx0ZXIsXHJcbiAgSUdyaWRGaWx0ZXIsXHJcbiAgSUdyaWRDb2x1bW5BY3Rpb24sXHJcbiAgSUdyaWRSb3dBY3Rpb24sXHJcbiAgRUdyaWRTZWxlY3Rpb25UeXBlLFxyXG4gIEVHcmlkQ29sdW1uVHlwZSxcclxuICBFR3JpZFNvcnREaXJlY3Rpb24sXHJcbiAgSUdyaWREYXRhRXhwb3J0LFxyXG4gIEVHcmlkQWdncmVnYXRlLFxyXG4gIElMb29rdXBWYWx1ZSxcclxuICBFR3JpZEZvcm1hdFR5cGUsXHJcbiAgSUdyaWRGaWx0ZXJJbmZvLFxyXG59IGZyb20gJy4uLy4uLy4uL21vZGVscy9ncmlkLm1vZGVsJztcclxuaW1wb3J0IHsgRVBlcm1pc3Npb25UeXBlLCBJUGVybWlzc2lvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy91c2VyLWluZm8ubW9kZWwnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWxlcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgV29ya1NoZWV0IH0gZnJvbSAneGxzeCc7XHJcbmltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IEVGb3JtYXRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBQYWdlTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BhZ2UtbG9nZ2VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZS1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBAVmlld0NoaWxkcmVuKCdncmlkUm93JykgZ3JpZFJvdzogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIEBPdXRwdXQoKSBpbmxpbmVSb3dDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQElucHV0KCkgc2V0IGFjdGl2ZVRlc3RNb2RlKHZhbDogYW55KSB7XHJcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XHJcbiAgICAgIGRlYnVnZ2VyO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXJ2ZXJGaWx0ZXJzOiBJR3JpZFNlcnZlclNpZGVFdmVudCA9IHt9O1xyXG4gIHJvd3NEYXRhOiBhbnlbXTtcclxuICByb3dzRGF0YUNvcHk6IGFueVtdID0gW107XHJcbiAgcm9sZXM6IHN0cmluZ1tdID0gW107XHJcbiAgaXNDb2x1bW5IaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICByb3dDbGlja0RhdGE6IElHcmlkQ29sdW1uO1xyXG4gIGNvbXBvbmVudFRhYmxlUmVmOiBhbnk7XHJcbiAgbG9va3VwT2JqZWN0OiBJTG9va3VwVmFsdWU7XHJcbiAgbG9va3VwRmlsdGVyT2JqOiBhbnk7XHJcbiAgbG9va3VwQmx1cjogYm9vbGVhbiA9IHRydWU7XHJcbiAgZ2xvYmFsRmlsdGVyc0FycmF5OiBhbnlbXSA9IFtdO1xyXG4gIGNoZWNrQWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FsZW5kZXJQcmV2aW91c1ZhbHVlOiBzdHJpbmcgPSAnJztcclxuICBncmlkRmlsdGVyT2JqOiBJR3JpZEZpbHRlckluZm87XHJcbiAgZGVmYXVsdERhdGU6IGFueTtcclxuICBkcm9wRG93bkZpbHRlcjogYW55ID0ge307XHJcbiAgZHJvcGRvd25JbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNhdmVBbGxSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlZGl0QWxsUmVjb3JkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuY2VsQWxsUmVjb3JkczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFkZE5ld1Jvd0NoZWNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW5FZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNhdmVSZWNvcmRBcnJheTogYW55W10gPSBbXTtcclxuICBkaXNhYmxlZFNhdmVCdG46Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBlZGl0TW9kZUNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVkaXRNb2RldW5Da2Vja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95JztcclxuICBzZXREcm9wZG93bkZpbHRlcjpib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gYXBwbHkgY2hlY2tlZC91bkNoZWNrZWQgcHJvcCBmb3IgQ2hlY2tCb3ggb2YgdGhlIFRhYmxlXHJcbiAgY2hlY2tlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgdW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGlkZUVkaXRBbGxSb3dzQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy9hcHBseSBBZGQvRGVsZXRlL0VkaXQgcHJvcCBmb3IgdGhlIGdyaWQgcGVybWlzc2lvblxyXG4gIGFkZFJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGRlbGV0ZVJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVkaXRSb3dQZXJtaXNzaW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gQXBwbHkgcHJvcCBzZXRBZ2dyZWdhdGVGb290ZXIgb24gRm9vdGVyIG9mIHRoZSBUYWJsZSBmb3IgYWdncmVnYXRlLlxyXG4gIHNldEFnZ3JlZ2F0ZUZvb3Rlcjogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBIaWRlIEFnZ3JlZ2F0ZSBGb290ZXIgV2hlbiBBZ2dyZWdhdGUgbm90IEFwcGx5IG9uIFRhYmxlLlxyXG4gIGFnZ3JlZ2F0ZUZvb3RlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBNYWludGFpbnMgcHJldmlvdXMgc3RhdGUgb2Ygcm93cyBiZWluZyBlZGl0ZWRcclxuICBlZGl0Um93c1JlY29yZHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHJcbiAgLy8gTWFpbnRhaW5zIHJlY29yZCBvZiByb3dzIGJlaW5nIGVkaXRlZFxyXG4gIGVkaXRpbmdSb3dLZXlzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGU6IFRhYmxlO1xyXG5cclxuICAvLyBTZWxlY3RzIGl0ZW1zIGluIHRoZSBncmlkIGJhc2VkIG9uIHBhc3NlZCBvbiBkYXRhXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSb3dzOiBhbnkgPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBnbG9iYWxEYXRhOiBJR3JpZEZpbHRlcltdID0gW107XHJcblxyXG4gIHNvcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBTdG9yZXMgc2VsZWN0ZWQgY29sdW1uc1xyXG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvLyBCb29sZWFuIHByb3AgdG8gYWxsb3cgaG9yaXpvbnRhbCBTY3JvbGwgb24gVGFibGUuXHJcbiAgQElucHV0KCkgaG9yaXpvbnRhbFNjcm9sbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBQcm9wIHRvIGhhbmRsZSBsb2FkZXIgb2YgZ3JpZFxyXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIC8vdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGhhbmRsZSBzZXJ2ZXIgc2lkZSBldmVudCBieSBkZWZhdWx0IGl0IGlzIHRydWUgd2hlbiBpdCBmYWxzZSBzZXJ2ZXIgc2lkZSBldmVudCB3aWxsIG5vdCBiZSBjYWxsZWRcclxuICBASW5wdXQoKSBhdXRvTG9hZERhdGE6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyBCb29sZWFuIHByb3AgdG8gY2hlY2sgd2hlcmUgc2VsZWN0ZWQgaXMgYWxsb3dlZCBvciBub3QuXHJcbiAgQElucHV0KCkgYWxsb3dTZWxlY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgLy8gU2V0IGNvbHVtbiB3aWR0aCBvZiBzZWxlY3RlZCByb3cuXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uQ29sdW1uV2lkdGg6IHN0cmluZyA9ICc4MHB4JztcclxuICBcclxuICAvLyBCb29sZWFuIHByb3AgdG8gaGlkZSB0aGUgYWRkIHJvdyBidXR0b24uXHJcbiAgQElucHV0KCkgaGlkZU9uUm93QWRkQnRuID0gZmFsc2U7XHJcblxyXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBleHBvcnQgdG8gcGRmLlxyXG4gIEBJbnB1dCgpIGFsbG93RXhwb3J0VG9QZGYgPSBmYWxzZTtcclxuXHJcbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IGV4cG9ydCB0byBleGNlbC5cclxuICBASW5wdXQoKSBhbGxvd0V4cG9ydFRvRXhjZWwgPSBmYWxzZTtcclxuICBcclxuICAvLyBCb29sZWFuIHByb3AgdG8gc2V0IHRoZSBhY3Rpb24gY29sdW1uIGFzIGZpcnN0IGNvbHVtbi5cclxuICBASW5wdXQoKSBzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ID0gZmFsc2U7XHJcblxyXG4gIC8vIElmIHRydWUsIGVuYWJsZXMgb3B0aW9ucyB0byBwZXJmb3JtIENSVUQgdXNpbmcgaW5saW5lIHJvdyBmdW5jdGlvbmFsaXR5XHJcbiAgQElucHV0KCkgdXNlSW5saW5lQ1JVRCA9IGZhbHNlO1xyXG5cclxuICAvLyBBcnJheSBvZiByb3cgYWN0aW9uc1xyXG4gIEBJbnB1dCgpIHJvd0FjdGlvbnM6IElHcmlkUm93QWN0aW9uW10gPSBbXTtcclxuXHJcbiAgLy8gU2V0cyBzZWxlY3Rpb24gdHlwZSBpLmU6IHNpbmdsZS9tdWx0aXBsZSBzZWxlY3Rpb25cclxuICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlOiBFR3JpZFNlbGVjdGlvblR5cGUgPSBFR3JpZFNlbGVjdGlvblR5cGUuU0lOR0xFO1xyXG5cclxuICAvLyBVbmlxdWUga2V5IHJlcXVpcmVzIGZvciBidWlsdC1pbiByb3cgc2VsZWN0aW9uIG9mIHByaW1lTmcgZ3JpZFxyXG4gIEBJbnB1dCgpIGRhdGFLZXk6IHN0cmluZyA9ICdpZCc7XHJcblxyXG4gIC8vIEZsYWcgZm9yIGNsZWFyIGZpbHRlciB2YWx1ZXMgYnV0dG9uXHJcbiAgQElucHV0KCkgY2xlYXJHcmlkRmlsdGVyID0gdHJ1ZTtcclxuXHJcbiAgLy8gRmxhZyBmb3Igc2VhcmNoIGZpbHRlciB2YWx1ZXMgYnV0dG9uXHJcbiAgQElucHV0KCkgc2VhcmNoR3JpZEZpbHRlciA9IHRydWU7XHJcblxyXG4gIC8vIEZsYWcgaW4gY2FzZSB0YWJsZSBpcyBzY3JvbGxhYmxlXHJcbiAgQElucHV0KCkgc2Nyb2xsYWJsZSA9IHRydWU7XHJcblxyXG4gIC8vIFNldHMgc2Nyb2xsIGhlaWdodCBmb3IgdGhlIHRhYmxlXHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0ID0gJzY4MHB4JztcclxuXHJcbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IHRvIHdyYXAgb3IgdW5XcmFwIHRoZSBncmlkLlxyXG4gIEBJbnB1dCgpIHdvcmRXcmFwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIG5ld0dyaWRSb3c6IGFueSA9IHt9O1xyXG5cclxuICBASW5wdXQoKSBmaWx0ZXJpbmcgPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSByb3dIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBoaWRlRmlsdGVyT3B0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBTZXRzIHBhZ2VuYXRpb24gZm9yIHRoZSB0YWJsZSBEYXRhLlxyXG4gIEBJbnB1dCgpIHNldFBhZ2luYXRpb25MZW5ndGg6IGFueVtdID0gWzUsIDEwLCAxNSwgeyBzaG93QWxsOiAnQWxsJyB9XTtcclxuXHJcbiAgLy8gc2V0IHRoZSBjaGFuZ2UgaW4gdGhlIHJvd0RhdGFcclxuICBAT3V0cHV0KCkgcm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3BzIHRoZSBsb2FkZXIgYW5kIHNldHMgdGhlIGRhdGEgdG8gZ3JpZFxyXG4gICAqIENsZWFycyB0aGUgZWRpdGluZyBzdGFja1xyXG4gICAqIFNjcm9sbHMgdG8gc2VsZWN0ZWQgZWxlbWVudCBpZiBzZWxlY3Rpb24gZm91bmRcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgcm93cyhkYXRhOiBhbnlbXSkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKCF0aGlzLmRhdGFLZXkpIHtcclxuICAgICAgICB0aGlzLmRhdGFLZXkgPSAnaWQnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucm93c0RhdGEgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldERhdGFGaWVsZHMoZGF0YSwgdGhpcy5kYXRhS2V5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGEgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGVhbmluZyB0aGUgZWRpdGluZyBzdGFja1xyXG4gICAgdGhpcy5lZGl0aW5nUm93S2V5cyA9IHt9O1xyXG4gICAgdGhpcy5lZGl0Um93c1JlY29yZHMgPSB7fTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRSb3dzKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50UmVmID0gdGhpcy5ncmlkUm93LmZpbmQoXHJcbiAgICAgICAgICAoeCkgPT4geC5uYXRpdmVFbGVtZW50LmlkID09PSB0aGlzLnNlbGVjdGVkUm93c1t0aGlzLmRhdGFLZXldXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRSZWYgJiZcclxuICAgICAgICAgIChcclxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudFxyXG4gICAgICAgICAgKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04pIHtcclxuICAgICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHt9LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vbWFuaXB1bGF0ZSBjaGVja2JveCBzdHJpbmcgdmFsdWUgdG8gdHJ1ZSBhbmQgZmFsc2UuXHJcbiAgICB0aGlzLmNoYW5nZUNoZWNrYm94U3RyaW5nVmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8vIEdsb2JhbCBmaWx0ZXIgc2VydmVyIHJlcXVlc3RcclxuICBASW5wdXQoKSBzZXQgZ2xvYmFsRmlsdGVyRGF0YShnbG9iYWxGaWx0ZXJzOiBJR2xvYmFsRmlsdGVyW10pIHtcclxuICAgIHRoaXMuZ2xvYmFsRGF0YSA9IHRoaXMuZ3JpZFNlcnZpY2VcclxuICAgICAgLnByZXBhcmVHbG9iYWxGaWx0ZXJzKGdsb2JhbEZpbHRlcnMpXHJcbiAgICAgID8uZmlsdGVyKCh4KSA9PiB4Py52YWx1ZSAhPT0gZmFsc2UpO1xyXG4gICAgY29uc3Qgc2VydmVyRmlsdGVyVmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcnZlckZpbHRlcnMpKTtcclxuICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnNcclxuICAgICAgPyB0aGlzLnNlcnZlckZpbHRlcnMuZmlsdGVycy5jb25jYXQodGhpcy5nbG9iYWxEYXRhKVxyXG4gICAgICA6IHRoaXMuZ2xvYmFsRGF0YTtcclxuXHJcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FwcGx5RmlsdGVyJykgPT09ICdmYWxzZScpIHtcclxuICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkgPSB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheT8ubGVuZ3RoID4gMFxyXG4gICAgICAgID8gdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuY29uY2F0KFsuLi5zZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVyc10pXHJcbiAgICAgICAgOiB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXBwbHlGaWx0ZXInKSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgIGdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZ2xvYmFsRmlsdGVyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuZm9yRWFjaCgoZmlsdGVyQXJyYXkpID0+IHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZmlsdGVyQXJyYXkuZmllbGQgPT09IGdsb2JhbEZpbHRlci5maWVsZCAmJlxyXG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgJiZcclxuICAgICAgICAgICAgZmlsdGVyQXJyYXkudmFsdWUgIT09IGdsb2JhbEZpbHRlci52YWx1ZVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZpbHRlckFycmF5LnZhbHVlID0gZ2xvYmFsRmlsdGVyLnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgZmluZEluZGV4ID0gdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoaW5kZXgpID0+IGluZGV4LmZpZWxkID09PSBnbG9iYWxGaWx0ZXIuZmllbGQgJiYgIWdsb2JhbEZpbHRlci52YWx1ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChmaW5kSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5LnNwbGljZShmaW5kSW5kZXgsIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMubG9hZGluZyA9IHRoaXMuYXV0b0xvYWREYXRhO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZih0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgfHwgdGhpcy5hdXRvTG9hZERhdGEpe1xyXG4gICAgICAgICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5ICYmIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuY29uY2F0KFxyXG4gICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgICAgbmV3IFNldChcclxuICAgICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnNcclxuICAgICAgICAgICAgICAucmV2ZXJzZSgpXHJcbiAgICAgICAgICAgICAgLm1hcCgoZmlsdGVyOiBhbnkpID0+IGZpbHRlci5maWVsZClcclxuICAgICAgICAgIClcclxuICAgICAgICApLm1hcCgoZmllbGQpID0+IHtcclxuICAgICAgICAgIHJldHVybiBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycy5maW5kKCh4OiBhbnkpID0+IHguZmllbGQgPT09IGZpZWxkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycyA9IHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzLmZpbHRlcihcclxuICAgICAgICAgIChvYmo6IGFueSkgPT5cclxuICAgICAgICAgICAgb2JqPy52YWx1ZSAmJiBvYmoudmFsdWU/LnRvU3RyaW5nKCk/Lmxlbmd0aCA+IDAgJiYgb2JqLmZpZWxkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50IHx8IHRoaXMuYXV0b0xvYWREYXRhID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAvLyBzZXR0aW5nIHBhZ2luYXRpb24gcGFnZSBhcyBmaXJzdFxyXG4gICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLnBhZ2UgPSAxO1xyXG4gICAgICAgICAgaWYodGhpcy5kZWZhdWx0Um93cyAmJiB0aGlzLnBhZ2luYXRpb24peyBcclxuICAgICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLnBhZ2VTaXplID0gdGhpcy5kZWZhdWx0Um93cztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgaWYodGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50KXtcclxuICAgICAgICAgIHRoaXMub25TZXJ2ZXJTaWRlRXZlbnRDaGFuZ2UuZW1pdChzZXJ2ZXJGaWx0ZXJWYWx1ZXMpXHJcbiAgICAgICAgIH1cclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdhcHBseUZpbHRlcicpO1xyXG4gICAgICAgICAgLy8gc2V0dGluZyBwYWdpbmF0aW9uIHBhZ2UgbnVtYmVyIFVJXHJcbiAgICAgICAgICB0aGlzLnRhYmxlLl9maXJzdCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gSW5wdXQgZGVjb3JhdG9yIHRvIHJlY2VpdmUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQgaW4gaGVhZGVyXHJcbiAgQElucHV0KCkgY29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSA9IFtdO1xyXG5cclxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhhbmRsZSB0b2dnbGluZyBvZiBjb2x1bW5zXHJcbiAgQElucHV0KCkgYWxsb3dDb2x1bW5Ub2dnbGUgPSBmYWxzZTtcclxuXHJcbiAgLy8gT3B0aW9uYWwgcHJvcCB0byBoaWRlIGZpbHRlcmluZyBvZiBjb2x1bW5zXHJcbiAgQElucHV0KCkgaGlkZUZpbHRlciA9IGZhbHNlO1xyXG5cclxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhhbmRsZSBsb29rdXAgZmlsdGVyc1xyXG4gIEBJbnB1dCgpIGxvb2t1cEZpbHRlcnMgPSBmYWxzZTtcclxuXHJcbiAgLy8gT3B0aW9uYWwgcHJvcCB0byBoYW5kbGUgcGFnaW5hdGlvblxyXG4gIEBJbnB1dCgpIHBhZ2luYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgLy8gT3B0aW9uYWwgcHJvcCB0byBoYW5kbGUgc2hvdyBDdXJyZW50UGFnZSBSZXBvcnRcclxuICBASW5wdXQoKSBzaG93Q3VycmVudFBhZ2VSZXBvcnQgPSBmYWxzZTtcclxuXHJcbiAgLy8gRGlzcGxheXMgdG90YWwgbnVtYmVyIG9mIHJlY29yZHNcclxuICBASW5wdXQoKSB0b3RhbFJlY29yZHMgPSAwO1xyXG5cclxuICBASW5wdXQoKSBzaG93Y29uZmlybURpYWxvZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIFNldHMgbnVtYmVyIG9mIHJvd3MgdG8gYmUgc2hvd24gdGhlIGdyaWRcclxuICBASW5wdXQoKSBkZWZhdWx0Um93czogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKSBjb2x1bW5BY3Rpb25zOiBJR3JpZENvbHVtbkFjdGlvbltdID0gW107XHJcblxyXG4gIC8vIERlY2lkZXMgdGhlIGdyaWQncyBiZWhhdmlvciBlaXRoZXIgZm9yIGNsaWVudCBzaWRlIG9yIHNlcnZlciBzaWRlIGV2ZW50c1xyXG4gIEBJbnB1dCgpIHVzZVNlcnZlclNpZGVFdmVudHMgPSBmYWxzZTtcclxuXHJcbiAgLy8gT3V0cHV0IGV2ZW50IHRvIGhhbmRsZSByb3cgY2xpY2tcclxuICBAT3V0cHV0KCkgb25Sb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIE91dHB1dCBldmVudCBlbWl0IHdoZW4gY2xpY2sgb24gZ3JpZCBjaGVja2JveCBmaWx0ZXJcclxuICBAT3V0cHV0KCkgb25DaGVja0JveEZpbHRlckNsaWNrOiBFdmVudEVtaXR0ZXI8YW55Pj0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBPdXRwdXQgZXZlbnQgdG8gaGFuZGxlIHJvdyBDaGVja0JveFxyXG4gIEBPdXRwdXQoKSBvblJvd0NoZWNrQm94OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gT3V0cHV0IGV2ZW50IHRvIHRyaWdnZXIgb24gc29ydCBjaGFuZ2VcclxuICBAT3V0cHV0KCkgb25Tb3J0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8SUdyaWRTb3J0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gT3V0cHV0IGV2ZW50IHRvIHRyaWdnZXIgb24gZmlsdGVyIGNoYW5nZVxyXG4gIEBPdXRwdXQoKSBvbkZpbHRlckNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIE91dHB1dCBldmVudCB0byBpbnZva2UgdGhlIG11bHRpU2VsZWN0aW9uIGNsaWNrIGV2ZW50XHJcbiAgQE91dHB1dCgpIG9uTXVsdGlTZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBDYWxscyB3aGVuZXZlciBhIGdyaWQgYW5kIGdsb2JhbEZpbHRlcnMgY2FsbGVkXHJcbiAgQE91dHB1dCgpIG9uQXBwbHlGaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvL3NldCBoZWFkZXIgY2hlY2tib3ggdmFsdWUgZm9yIGdldHRpbmcgYWxsIGNvbHVtbnMgb24gc3RheSBhZG1pblxyXG4gIEBPdXRwdXQoKSBpc0luY2x1ZGVkQWxsQ29sdW1uczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIENhbGxzIHdoZW5ldmVyIGEgbGF6eSBldmVudCBpcyBkaXNwYXRjaGVkXHJcbiAgQE91dHB1dCgpXHJcbiAgb25TZXJ2ZXJTaWRlRXZlbnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFNlcnZlclNpZGVFdmVudD4gPVxyXG4gICAgbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBPdXRwdXQgZXZlbnQgdG8gdHJpZ2dlciBvbiBwYWdpbmF0aW9uXHJcbiAgQE91dHB1dCgpXHJcbiAgb25QYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUdyaWRQYWdpbmF0aW9uRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBEaXNwYXRjaCBvdXRwdXQgZXZlbnQgdHJpZ2dlciBvbiBlZGl0IHJvd1xyXG4gIEBPdXRwdXQoKSBvblJvd1VwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgY2FuY2VsIGFsbCByb3dzXHJcbiAgQE91dHB1dCgpIG9uQ2FuY2VsQWxsUm93cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gZGVsZXRlIHJvd1xyXG4gIEBPdXRwdXQoKSBvblJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy9EaXNwYXRjaCBvdXRwdXQgZXZlbnQgdHJpZ2dlciBvbiBhZGQgcm93XHJcbiAgQE91dHB1dCgpIG9uUm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvL0Rpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIG9uIGFkZCwgdXBkYXRlIGFuZCBkZWxldGUgcm93XHJcbiAgQE91dHB1dCgpIG9uR3JpZFJvd0FjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIHNldCBwcm9wZXJ0eSBhbGxvd0NhY2hpbmcgZm9yIExvY2FsU3RvcmFnZVxyXG4gIEBJbnB1dCgpIGFsbG93Q2FjaGluZzogYm9vbGVhbjtcclxuXHJcbiAgLy8gc2V0IHByb3BlcnR5IHNvZnRDYWNoaW5nIGZvciBzZXR0aW5nIHRoZSB2YWx1ZXMgb2YgZ3JpZEZpbHRlclxyXG4gIEBJbnB1dCgpIHNvZnRDYWNoaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICBASW5wdXQoKSBlZGl0QWxsUm93czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBzZXQgdGhlIHJvdyBXaGVuIEVkaXQgdGhlIHJvdyBvbiBHcmlkXHJcbiAgQE91dHB1dCgpIG9uR3JpZFJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIHNldCB0aGUgcm93IFdoZW4gYWRkaW5nIHRoZSBuZXcgUm93IG9uIEdyaWRcclxuICBAT3V0cHV0KCkgb25HcmlkUm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBpc0dyaWRIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHB1YmxpYyBkZWNpbWFsUGlwZTogRGVjaW1hbFBpcGUsXHJcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgcHVibGljIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnLFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZlxyXG4gICkge31cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ29sdW1ucygpOiBJR3JpZENvbHVtbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBzZXQgc2VsZWN0ZWRDb2x1bW5zKHZhbDogSUdyaWRDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoKGNvbCkgPT4gdmFsLmluY2x1ZGVzKGNvbCkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYnJvd3NlciBjbG9zZSBldmVudFxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpiZWZvcmV1bmxvYWQnLCBbJyRldmVudCddKVxyXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoZXZlbnQ6YW55KSB7XHJcbiAgICBpZih0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpe1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBc3NpZ25tZW50IG9mIHNlbGVjdGVkIGNvbHVtbnMgb24gcGFnZSBsb2FkXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmVkaXRBbGxSb3dzKXtcclxuICAgICAgdGhpcy5kaXNhYmxlZFNhdmVCdG4gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmNvbXBvbmVudFRhYmxlUmVmID0gdGhpcy50YWJsZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldE51bWVyaWNWYWx1ZXMoKTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnMgb24gZ3JpZCBjb2x1bW5zXHJcbiAgYXBwbHlDb2x1bW5zUGVybWlzc2lvbnMoKSB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgIGxldCB0b3RhbEZpZWxkczogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGhpZGRlbkZpZWxkczogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSA9IGNvbHVtbi5wZXJtaXNzaW9ucztcclxuICAgICAgICAvLyBpZiAoIXBlcm1pc3Npb25zKSBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnM7XHJcbiAgICAgICAgbGV0IGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHBlcm1pc3Npb25zICYmIHBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24ucm9sZXMgJiYgcGVybWlzc2lvbi5yb2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gICBsZXQgaW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIChpKSA9PiBpLmZpZWxkID09PSBjb2x1bW4uZmllbGRcclxuICAgICAgICAgICAgICAgIC8vICAgKTtcclxuICAgICAgICAgICAgICAgIC8vICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuVklFVyAmJlxyXG4gICAgICAgICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0b3RhbEZpZWxkcysrO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xyXG4gICAgICAgICAgaGlkZGVuRmllbGRzKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuaXNDb2x1bW5IaWRkZW4gPSB0b3RhbEZpZWxkcyA+IDAgJiYgdG90YWxGaWVsZHMgPT09IGhpZGRlbkZpZWxkcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGFwcGx5IGdsb2JhbCBwZXJtaXNzaW9ucyBvbiBlbnRpcmUgZ3JpZFxyXG4gIGFwcGx5R3JpZFBlcm1pc3Npb25zKCkge1xyXG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMgJiYgdGhpcy5wZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiBhbnkgY29sdW1uIGhhcyBhbnkgcGVybWlzc2lvblxyXG4gICAgICBsZXQgaGFzQ29sdW1uUGVybWlzc2lvbnMgPSB0aGlzLmNvbHVtbnM/LnNvbWUoXHJcbiAgICAgICAgKHgpID0+IHg/LnBlcm1pc3Npb25zICYmIHgucGVybWlzc2lvbnMubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5wZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XHJcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXICYmXHJcbiAgICAgICAgICAhaGFzVmFsaWRFZGl0UGVybWlzc2lvblxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy51c2VJbmxpbmVDUlVEID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICghaXNWYWxpZCAmJiAhaGFzQ29sdW1uUGVybWlzc2lvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0dyaWRIaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnVzZUlubGluZUNSVUQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQgJiYgIWlzVmFsaWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNHcmlkSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZWRpdFJvd1Blcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkRFTEVURSAmJiAhaXNWYWxpZCkge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVSb3dQZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5BRERST1cgJiYgIWlzVmFsaWQpIHtcclxuICAgICAgICAgIHRoaXMuYWRkUm93UGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vblJvd0FkZC5vYnNlcnZlcnMubGVuZ3RoID09IDApIHRoaXMuYWRkUm93UGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMub25Sb3dEZWxldGUub2JzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB0aGlzLmRlbGV0ZVJvd1Blcm1pc3Npb24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZTogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuYWxsb3dDYWNoaW5nICE9PSBmYWxzZSAmJiB0aGlzLnBhZ2luYXRpb24pIHtcclxuICAgICAgdGhpcy5hbGxvd0NhY2hpbmcgPSB0aGlzLnBhZ2luYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU2V0RmlsdGVycy0nICsgdXRpbGl0aWVzLmN1cnJlbnRVcmwoKSk7XHJcbiAgICB9XHJcbiAgICAvLyBhZGQgZGVmYXVsdFJvdyBpbiBwYWdpbmF0aW9uIGFycmF5XHJcbiAgICBpZiAoIXRoaXMuc2V0UGFnaW5hdGlvbkxlbmd0aC5pbmNsdWRlcyh0aGlzLmRlZmF1bHRSb3dzKSkge1xyXG4gICAgICB0aGlzLnNldFBhZ2luYXRpb25MZW5ndGgudW5zaGlmdCh0aGlzLmRlZmF1bHRSb3dzKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhhc0NvbHVtbnM6IGJvb2xlYW4gPSB0aGlzLmNvbHVtbnMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDA7XHJcbiAgICBpZiAoaGFzQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldENvbHVtbkZpZWxkcyh0aGlzLmNvbHVtbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9sZXMgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXJSb2xlcygpO1xyXG5cclxuICAgIC8vIGFwcGx5IHVzZXIgcm9sZSBwZXJtaXNzaW9ucyBvbiBncmlkIGNvbHVtbnNcclxuICAgIHRoaXMuYXBwbHlDb2x1bW5zUGVybWlzc2lvbnMoKTtcclxuXHJcbiAgICAvLyBhcHBseSBnbG9iYWwgcGVybWlzc2lvbnMgb24gZW50aXJlIGdyaWRcclxuICAgIHRoaXMuYXBwbHlHcmlkUGVybWlzc2lvbnMoKTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM/LmZpbHRlcigoeCkgPT4gIXguaGlkZGVuKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIGlmIChoYXNDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0Q29sdW1uRmllbGRzKHRoaXMuY29sdW1ucyk7XHJcbiAgICAgIC8vIGNoZWNraW5nIGZpbHRlciBleGlzdCBvciBub3RcclxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5fc2VsZWN0ZWRDb2x1bW5zLnNvbWUoXHJcbiAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmZpbHRlcmluZyA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5maWx0ZXJpbmcgPT09IHRydWVcclxuICAgICAgKTtcclxuICAgICAgaWYgKGZpbHRlciA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLmhpZGVGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0aW1lIGludG8gdGhlIGRhdGVcclxuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmIGNvbHVtbi50aW1lT25seSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdICYmXHJcbiAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykgfHxcclxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUocm93W2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2V0IGZpbHRlciB2YWx1ZVxyXG4gICAgICAgIGlmIChjb2x1bW4uZmlsdGVyICYmIGNvbHVtbi52YWx1ZSAmJiBjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGQgXCJmbGV4LXNocmluazogMFwiIGZvciBmbGV4LWJhc2lzIFN0eWxlXHJcbiAgICAgICAgaWYgKGNvbHVtbi5zdHlsZSAmJiBjb2x1bW4uc3R5bGUuaW5jbHVkZXMoJ2ZsZXgtYmFzaXMnKSkge1xyXG4gICAgICAgICAgbGV0IHN0eWxlID0gY29sdW1uLnN0eWxlICsgJyAhaW1wb3J0YW50OyBmbGV4LXNocmluazogMCAhaW1wb3J0YW50JztcclxuICAgICAgICAgIGNvbHVtbi5zdHlsZSA9IHN0eWxlLmluY2x1ZGVzKCc7OycpXHJcbiAgICAgICAgICAgID8gc3R5bGUucmVwbGFjZSgnOzsnLCAnOycpXHJcbiAgICAgICAgICAgIDogc3R5bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgRGlzcGxheVRleHQgd2hlbiB2YWx1ZSBpcyBpbiBjdXJseSBicmFja2V0cy5cclxuICAgICAgICB0aGlzLnNldERpc3BsYXlUZXh0VmFsdWUoY29sdW1uKTtcclxuXHJcbiAgICAgICAgLy9BZ2dyZWdhdGUgc2NlbmFyaW9cclxuICAgICAgICBpZiAoY29sdW1uLmFnZ3JlZ2F0ZSAmJiBjb2x1bW4uYWdncmVnYXRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuYWdncmVnYXRlRm9vdGVyID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuc2V0QWdncmVnYXRlVGV4dChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNlYXJjaEZpbHRlcnM7XHJcbiAgICAgICAgaWYoIXRoaXMuc29mdENhY2hpbmcpe1xyXG4gICAgICAgICAgIHNlYXJjaEZpbHRlcnMgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU2V0RmlsdGVycy0nICsgdXRpbGl0aWVzLmN1cnJlbnRVcmwoKSkgYXMgYW55XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICBzZWFyY2hGaWx0ZXJzID0gdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdXRpbGl0aWVzLmN1cnJlbnRVcmwoKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLmhpZGVGaWx0ZXIgJiZcclxuICAgICAgICAgIHNlYXJjaEZpbHRlcnMgJiZcclxuICAgICAgICAgIHNlYXJjaEZpbHRlcnMuZmlsdGVycyAmJlxyXG4gICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHNlYXJjaEZpbHRlcnMuZmlsdGVycy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHgudmFsdWUgJiYgeC5maWVsZCA9PT0gY29sdW1uLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgaWYoY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09ICdjYWxlbmRhcicpe1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnZhbHVlID0gbmV3IERhdGUodGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oeC52YWx1ZSwgJ01NLWRkLVlZJykgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi52YWx1ZSA9IHgudmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29udmVydGluZyBkaXNwbGF5RmllbGQgdG9Mb3dlcmNhc2VcclxuICAgICAgICBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCkge1xyXG4gICAgICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCA9IGNvbHVtbi5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2V0IEF1dG9Db21wbGV0ZSBEYXRhXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUgJiZcclxuICAgICAgICAgIHRoaXMucm93c0RhdGEgJiZcclxuICAgICAgICAgIHRoaXMucm93c0RhdGEubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGhhdCBjb250YWlucyBjb21tYSBpbnRvIGFycmF5c1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiZcclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXT8udG9TdHJpbmcoKS5pbmNsdWRlcygnLCcpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF1cclxuICAgICAgICAgICAgICAgID8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcclxuICAgICAgICAgICAgICAgID8ubWFwKCh2YWx1ZTogYW55KSA9PiAoeyBbY29sdW1uLmRpc3BsYXlGaWVsZF06IHZhbHVlIH0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qga2V5OiBhbnkgPSBPYmplY3Qua2V5cyhyb3cpLmZpbmQoXHJcbiAgICAgICAgICAgICAgKHgpID0+IHggPT09IGNvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgc2ltcGxlIHN0cmluZyBpbnRvIGFycmF5XHJcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dba2V5XSkgJiYgcm93W2tleV0pIHtcclxuICAgICAgICAgICAgICByb3dba2V5XSA9IFt7IFtjb2x1bW4uZGlzcGxheUZpZWxkXTogcm93W2tleV0gfV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy93aGVuIHdlIGFkZCBhIG5ldyByb3csIGl0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWUgJiYgT2JqZWN0LmtleXModGhpcy5uZXdHcmlkUm93KS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyh0aGlzLm5ld0dyaWRSb3cpLmZpbmQoXHJcbiAgICAgICAgICAgICh4KSA9PiB4ID09PSBjb2x1bW4uZmllbGRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoa2V5ICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSBjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5ld0dyaWRSb3dba2V5XSA9IGNvbHVtbi52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gU2VhcmNoaW5nIHNjZW5hcmlvXHJcbiAgICAgIGlmIChjaGFuZ2Uucm93cz8uY3VycmVudFZhbHVlICYmIGNoYW5nZS5jb2x1bW5zPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAvLyBDaGVja3MgZWl0aGVyIGNvbHVtbiB2YWx1ZSBpcyBjaGFuZ2VzIChpLmUuLCBjb2x1bW4gaGlkZGVuIHNjZW5hcmlvKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZS5jb2x1bW5zLmN1cnJlbnRWYWx1ZSkudG9Mb3dlckNhc2UoKSAhPT1cclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuY29sdW1ucykudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gW107XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoeCwgaSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXguaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2ldKSB7XHJcbiAgICAgICAgICAgICAgICB4LnZhbHVlID0gdGhpcy5zZWxlY3RlZENvbHVtbnNbaV0udmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucy5wdXNoKHgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gW107XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKHgsIGkpID0+IHtcclxuICAgICAgICAgIGlmICgheC5oaWRkZW4pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2ldKSB7XHJcbiAgICAgICAgICAgICAgeC52YWx1ZSA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2ldLnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucy5wdXNoKHgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBjbGFzc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHRlZC1yb3cnKTtcclxuICAgICAgICBpZiAoY2xhc3NFbGVtZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNsYXNzRWxlbWVudFswXS5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5lZGl0QWxsUm93cyAmJiB0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwICYmIHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCl7IFxyXG4gICAgICAgICB0aGlzLmVkaXRBbGxSb3dzQXRPbmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ2xvYmFsU2VhcmNoYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbFNlYXJjaGJ0bicpO1xyXG4gICAgaWYgKGdsb2JhbFNlYXJjaGJ0bikge1xyXG4gICAgICB0aGlzLnNlYXJjaEdyaWRGaWx0ZXIgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDApe1xyXG4gICAgICB0aGlzLnJvd3NEYXRhQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzRGF0YSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc2V0IERpc3BsYXlUZXh0IHdoZW4gdmFsdWUgaXMgaW4gY3VybHkgYnJhY2tldHMuXHJcbiAgc2V0RGlzcGxheVRleHRWYWx1ZShjb2x1bW46IElHcmlkQ29sdW1uKSB7XHJcbiAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTElOSyB8fFxyXG4gICAgICAgIEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgfHxcclxuICAgICAgICBFR3JpZENvbHVtblR5cGUuSUZSQU1FXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ107XHJcbiAgICAgICAgaWYgKGNvbHVtbi5kaXNwbGF5VGV4dCAmJiBjb2x1bW4uZGlzcGxheVRleHQuaW5jbHVkZXMoJ3snKSkge1xyXG4gICAgICAgICAgY29uc3QgZGlzcGxheVRleHQgPSBjb2x1bW4uZGlzcGxheVRleHRcclxuICAgICAgICAgICAgLnJlcGxhY2UoJ3snLCAnJylcclxuICAgICAgICAgICAgLnJlcGxhY2UoJ30nLCAnJyk7XHJcbiAgICAgICAgICBpZiAoZGlzcGxheVRleHQgJiYgZmllbGQpIHtcclxuICAgICAgICAgICAgZmllbGQuZGlzcGxheVRleHQgPSByb3dbZGlzcGxheVRleHQudG9Mb3dlckNhc2UoKV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheVRleHQgJiYgZmllbGQpIHtcclxuICAgICAgICAgIGZpZWxkLmRpc3BsYXlUZXh0ID0gY29sdW1uLmRpc3BsYXlUZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGFuZ2Ugcm93IGtleSBhbmQgdmFsdWUgd2hlbiB1c2luZyBzZXRHcmlkUm93UHJvcFZhbHVlIGZ1bmN0aW9uXHJcbiAgc2V0Um93VmFsdWUocm93RGF0YTogYW55KSB7XHJcbiAgICBPYmplY3Qua2V5cyhyb3dEYXRhKT8uZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICByb3dEYXRhW3Jvd10gJiZcclxuICAgICAgICB0aGlzLnR5cGVPZihyb3dEYXRhW3Jvd10pID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgIHJvd0RhdGFbcm93XT8uYWN0aW9uPy5maWVsZFxyXG4gICAgICApIHtcclxuICAgICAgICBpZihyb3dEYXRhW3Jvd10/LmV4dHJhRmllbGQpe1xyXG4gICAgICAgICAgZGVsZXRlIHJvd0RhdGFbcm93XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcm93RGF0YVtyb3ddID0gcm93RGF0YVtyb3ddPy50ZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXROdW1lcmljTWluTXhGcmFjdGlvbihjb2x1bW46IGFueSkge1xyXG4gICAgbGV0IGRpZ2l0SW5mbyA9ICcyJztcclxuICAgIGlmKGNvbHVtbj8uZm9ybWF0LnR5cGUgPT09ICdwZXJjZW50JyAmJiAhY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUgJiYgIWNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm8pe1xyXG4gICAgICBkaWdpdEluZm8gPSAnMCdcclxuICAgIH1lbHNlIGlmKGNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm8pe1xyXG4gICAgICAgIGRpZ2l0SW5mbyA9IGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmRpZ2l0c0luZm87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlnaXRJbmZvO1xyXG4gIH1cclxuXHJcbiAgLy8gc2V0IHRoZSBmb3JtYXQgb2YgY3VycmVuY3kgJiYgbnVtYmVyICYmIGRlY2ltYWwgJiYgcGVyY2VudFxyXG4gIHNldE51bWVyaWNGb3JtYXQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XHJcbiAgICByb3cgPSB1dGlsaXRpZXMub2JqQ29udmVydFRvTG93ZXIocm93KTtcclxuICAgIGxldCB2YWx1ZTogYW55ID0gcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheVRleHRcclxuICAgICAgPyByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5VGV4dFxyXG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKVxyXG4gICAgICA/IHJvd1tyb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldXHJcbiAgICAgIDogcm93W2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldXHJcbiAgICAgID8gcm93W2NvbHVtbi5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKV1cclxuICAgICAgOiAocm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV0/LnRleHQgfHwgcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV0/LnRleHQgPT09IDAgfHwgcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV0/LnRleHQgPT09IG51bGwpIFxyXG4gICAgICA/IHJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKV0/LnRleHQgOiByb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCldO1xyXG4gICAgaWYgKHRoaXMudHlwZU9mKHZhbHVlKSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPT09IDApIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgbGV0IGZvcm1hdFBhcmFtcyA9IGNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcztcclxuICAgIGxldCBkaWdpdHNJbmZvID0gZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xyXG4gICAgaWYgKGNvbHVtbi5mb3JtYXQgJiYgdmFsdWUpIHtcclxuICAgICAgc3dpdGNoIChjb2x1bW4uZm9ybWF0Py50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuQ1VSUkVOQ1k6XHJcbiAgICAgICAgICB2YWx1ZSA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChcclxuICAgICAgICAgICAgZm9ybWF0UGFyYW1zPy5sb2NhbGUgPyBmb3JtYXRQYXJhbXMubG9jYWxlIDogJ2VuLVVTJyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxyXG4gICAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRQYXJhbXM/LmN1cnJlbmN5ID8gZm9ybWF0UGFyYW1zLmN1cnJlbmN5IDogJ1VTRCcsXHJcbiAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkaWdpdHNJbmZvID8gZGlnaXRzSW5mbyA6ICcyJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKT8uZm9ybWF0KHZhbHVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRUdyaWRGb3JtYXRUeXBlLkRFQ0lNQUw6XHJcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAnMicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuUEVSQ0VOVDpcclxuICAgICAgICBpZighY29sdW1uLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSl7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlKyclJztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vQ2hhbmdlIGRyb3Bkb3duIHZsdWUgYmFzZWQgb24gb3B0aW9uIGxhYmVsIGFuZCBvcHRpb252YWx1ZVxyXG4gIHNldERyb3Bkb3duVmFsdWUoY29sdW1uOiBhbnksIHNlbGVjdGVkUm93PzogYW55LCBjaGFuZ2U/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5yb3dzRGF0YSAmJiB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocm93KT8uZmluZCgoa2V5KSA9PiBrZXkgPT09IGNvbHVtbi5maWVsZCkpIHtcclxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICAgICAgY29sdW1uLm9wdGlvbkxhYmVsID0gY29sdW1uLm9wdGlvbkxhYmVsXHJcbiAgICAgICAgICAgICAgPyBjb2x1bW4ub3B0aW9uTGFiZWxcclxuICAgICAgICAgICAgICA6ICdsYWJlbCc7XHJcbiAgICAgICAgICAgIGNvbHVtbi5vcHRpb25WYWx1ZSA9IGNvbHVtbi5vcHRpb25WYWx1ZVxyXG4gICAgICAgICAgICAgID8gY29sdW1uLm9wdGlvblZhbHVlXHJcbiAgICAgICAgICAgICAgOiAndmFsdWUnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2x1bW4uZGF0YT8uZmluZChcclxuICAgICAgICAgICAgKHJlY29yZDogYW55KSA9PlxyXG4gICAgICAgICAgICAgIHJlY29yZFtjb2x1bW4ub3B0aW9uVmFsdWVdPy50b1N0cmluZygpID09PVxyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgZWRpdGVkUm93ID0gc2VsZWN0ZWRSb3cgJiYgT2JqZWN0LmtleXMoc2VsZWN0ZWRSb3cpLmxlbmd0aCA+IDAgPyBzZWxlY3RlZFJvd1t0aGlzLmRhdGFLZXldID09PSByb3dbdGhpcy5kYXRhS2V5XSA6IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICYmIGVkaXRlZFJvdykge1xyXG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHZhbHVlW2NvbHVtbi5vcHRpb25MYWJlbF07XHJcbiAgICAgICAgICB9ZWxzZSBpZih2YWx1ZSAmJiBjaGFuZ2UgPT09IGZhbHNlKXtcclxuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB2YWx1ZVtjb2x1bW4ub3B0aW9uTGFiZWxdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL21hbmlwdWxhdGUgY2hlY2tib3ggc3RyaW5nIHZhbHVlIHRvIHRydWUgYW5kIGZhbHNlLlxyXG4gIGNoYW5nZUNoZWNrYm94U3RyaW5nVmFsdWUoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY29sdW1ucyAmJlxyXG4gICAgICB0aGlzLnJvd3NEYXRhICYmXHJcbiAgICAgIHRoaXMucm93c0RhdGEubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5CT09MRUFOKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkXSA9PT0gJ3N0cmluZycpICYmXHJcbiAgICAgICAgICAgICAgICAocm93W2NvbHVtbi5maWVsZF0gPT09ICcxJyB8fCByb3dbY29sdW1uLmZpZWxkXSA9PT0gJzAnKSkgfHxcclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ1knIHx8XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPT09ICdOJ1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9XHJcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9PT0gJzEnIHx8IHJvd1tjb2x1bW4uZmllbGRdID09PSAnWSdcclxuICAgICAgICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSByb3dEYXRhXHJcbiAgICogUGFzc2VzIGRhdGEgb2YgY2xpY2tlZCByb3cgdG8gcGFyZW50XHJcbiAgICovXHJcbiAgaGFuZGxlUm93Q2xpY2socm93RGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnJvd0NsaWNrRGF0YSA9IHJvd0RhdGE7XHJcbiAgICB0aGlzLm9uUm93Q2xpY2suZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbHVtbkRhdGFcclxuICAgKiBQYXNzZXMgc29ydGluZyBpbmZvcm1hdGlvbiB0byBwYXJlbnQgb24gc29ydCBjaGFuZ2VcclxuICAgKi9cclxuICBoYW5kbGVTb3J0Q2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBzb3J0RGlyZWN0aW9uID0gbnVsbDtcclxuICAgIGxldCBzb3J0RmllbGQ6IHN0cmluZyA9ICcnO1xyXG4gICAgaWYgKGV2ZW50Lm11bHRpc29ydG1ldGEgJiYgZXZlbnQubXVsdGlzb3J0bWV0YVswXS5vcmRlcikge1xyXG4gICAgICBzb3J0RGlyZWN0aW9uID1cclxuICAgICAgICBldmVudC5tdWx0aXNvcnRtZXRhWzBdLm9yZGVyID09IDFcclxuICAgICAgICAgID8gRUdyaWRTb3J0RGlyZWN0aW9uLkFTQ1xyXG4gICAgICAgICAgOiBFR3JpZFNvcnREaXJlY3Rpb24uREVTQztcclxuICAgICAgc29ydEZpZWxkID0gZXZlbnQubXVsdGlzb3J0bWV0YVswXS5maWVsZDtcclxuICAgIH1cclxuICAgIGxldCBzb3J0czogSUdyaWRTb3J0ID0ge1xyXG4gICAgICBmaWVsZDogc29ydEZpZWxkLFxyXG4gICAgICBkaXJlY3Rpb246IHNvcnREaXJlY3Rpb24gYXMgRUdyaWRTb3J0RGlyZWN0aW9uLFxyXG4gICAgICBwcmlvcml0eTogMCxcclxuICAgIH07XHJcbiAgICB0aGlzLm9uU29ydENoYW5nZS5lbWl0KHNvcnRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICogUGFzc2VzIGFwcGxpZWQgZmlsdGVycyB0byBwYXJlbnQgb24gZmlsdGVyIGNoYW5nZVxyXG4gICAqL1xyXG4gIGhhbmRsZUZpbHRlckNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFldmVudC5maWx0ZXJzW2ZpbHRlci5maWVsZF0/LnZhbHVlKSB7XHJcbiAgICAgICAgZmlsdGVyLnZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGV2ZW50IDogRXZlbnRcclxuICAgKiBAcGFyYW0gY29sdW1uQWN0aW9uIDogSUdyaWRDb2x1bW5BY3Rpb25cclxuICAgKiBAcGFyYW0gcm93IDogYW55XHJcbiAgICogU3RvcCB0aGUgY2xpY2sgZXZlbnQgcHJvcGFnYXRpb24gdG8gcGFyZW50XHJcbiAgICogQ2FsbGJhY2tzIHRoZSByb3cgZGF0YSB0byBwYXJlbnRcclxuICAgKi9cclxuXHJcbiAgLyoqXHJcbiAgICogaW52b2tlIG9uQ2xpY2sgZXZlbnQgJiBvcGVuIElmcmFtZSBpbiBncmlkXHJcbiAgICovXHJcbiAgZ3JpZElGcmFtZShjb2x1bW46IGFueSwgcm93czogYW55LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpO1xyXG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oSWZyYW1lQ29tcG9uZW50LCB7XHJcbiAgICAgIGhlYWRlcjogY29sdW1uLmhlYWRlcixcclxuICAgICAgd2lkdGg6ICc4MCUnLFxyXG4gICAgICBoZWlnaHQ6ICc4MCUnLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdmFsdWU6IHJvd3MsXHJcbiAgICAgICAgaUZyYW1lSWQ6IGNvbHVtbi5kaXNwbGF5VGV4dCA/IGNvbHVtbi5kaXNwbGF5VGV4dCA6IGNvbHVtbi5maWVsZCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbHVtbi5jb21wb25lbnQ/Lm5hbWU7XHJcbiAgICBpZihjb21wb25lbnROYW1lKXtcclxuICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8odGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksIGNvbXBvbmVudE5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcyAmJiBjb2x1bW4ub25SZXR1cm4pIHtcclxuICAgICAgICBjb2x1bW4ub25SZXR1cm4ocmVzKTtcclxuICAgICAgfSBlbHNlIGlmIChyZXMgJiYgY29sdW1uLm9uQ2hhbmdlKSB7XHJcbiAgICAgICAgY29sdW1uLm9uQ2hhbmdlKHJlcyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3Um93KHJvdzogYW55LCBhZGRSb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5jb21wb25lbnRUYWJsZVJlZiA9IHRoaXMudGFibGU7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4uZmlsdGVyICYmXHJcbiAgICAgICAgY29sdW1uLmNvbXBvbmVudCAmJlxyXG4gICAgICAgIGNvbHVtbi5maWx0ZXIudHlwZSA9PT0gJ2NhbGVuZGFyJ1xyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoYWRkUm93KSB7XHJcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhWzBdW2NvbHVtbi5maWVsZCArICdfc2Vjb25kVHlwZSddID0gRUdyaWRDb2x1bW5UeXBlLkRBVEU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX3NlY29uZFR5cGUnXSA9IEVHcmlkQ29sdW1uVHlwZS5EQVRFO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvd0NsaWNrRGF0YSA9IHJvdztcclxuICAgIHRoaXMuYWRkTmV3Um93Q2hlY2sgPSB0cnVlO1xyXG4gICAgdGhpcy5kcm9wZG93bklucHV0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNvcnREaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLm9uR3JpZFJvd0FkZC5lbWl0KHJvdyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBvcGVuIERpYWxvZyBpbiBncmlkXHJcbiAgICovXHJcbiAgc2V0RGlhbG9nRGF0YTpib29sZWFuID0gdHJ1ZTtcclxuICBvcGVuR3JpZERpYWxvZyhjb2x1bW46IElHcmlkQ29sdW1uIHwgYW55LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuc2V0RGlhbG9nRGF0YSl7XHJcbiAgICAgICAgY29sdW1uWydwYXJlbnREaWFsb2dEYXRhJ10gPSBjb2x1bW4uZGF0YS5kYXRhO1xyXG4gICAgICAgIHRoaXMuc2V0RGlhbG9nRGF0YSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGNvbHVtbi5kYXRhICYmIGNvbHVtbi5kYXRhLmRhdGEgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10pe1xyXG4gICAgICAgIGNvbHVtbi5kYXRhLmRhdGEgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlhbG9nRGF0YTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLmNvbXBvbmVudCAmJiBjb2x1bW4uZGF0YSAmJiB0aGlzLnJvd0NsaWNrRGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnJvd0NsaWNrRGF0YSk7XHJcbiAgICAgICAgY29sdW1uLmRhdGEuZGF0YSA9IHV0aWxpdGllcy5hdXRvU2V0TG9va3VwRGF0YShcclxuICAgICAgICAgIGNvbHVtbi5wYXJlbnREaWFsb2dEYXRhLFxyXG4gICAgICAgICAgdGhpcy5yb3dDbGlja0RhdGFcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGNvbHVtbi5jb21wb25lbnQsIGNvbHVtbi5kYXRhKTtcclxuICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29sdW1uLmNvbXBvbmVudD8ubmFtZTtcclxuICAgICAgICBpZihjb21wb25lbnROYW1lKXtcclxuICAgICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLCBjb21wb25lbnROYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhICYmIGNvbHVtbi5vblJldHVybikge1xyXG4gICAgICAgICAgICBjb2x1bW4ub25SZXR1cm4oZGF0YSwgdGhpcy5yb3dDbGlja0RhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmKGNvbHVtbi5vbkNoYW5nZSl7XHJcbiAgICAgICAgICAgICAgY29sdW1uLm9uQ2hhbmdlKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIGJyb3dzZXJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2Upe1xyXG4gICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRNdWx0aVNlbGVjdERhdGEoY29sdW1uOiBJR3JpZENvbHVtbiwgc2VsZWN0ZWRWYWx1ZTphbnkpe1xyXG4gICAgaWYoc2VsZWN0ZWRWYWx1ZSAmJiBjb2x1bW4udHlwZSA9PSBFR3JpZENvbHVtblR5cGUuTVVMVElTRUxFQ1Qpe1xyXG4gICAgICBpZihzZWxlY3RlZFZhbHVlICYmIHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpe1xyXG4gICAgICAgIHNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFZhbHVlPy50b1N0cmluZygpPy5zcGxpdCgnLCcpPy5tYXAoKHZhbHVlKT0+IGNvbHVtbi5kYXRhPy5maW5kKChvcHRpb24pPT4gb3B0aW9uLnZhbHVlPy50b1N0cmluZygpID09PSB2YWx1ZT8udG9TdHJpbmcoKSk/LmxhYmVsKT8udG9TdHJpbmcoKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGNvbHVtbi5kYXRhPy5maW5kKChvcHRpb24pPT4gb3B0aW9uLnZhbHVlPy50b1N0cmluZygpID09PSBzZWxlY3RlZFZhbHVlPy50b1N0cmluZygpKT8ubGFiZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJuIGNvbmRpdGlvbmFsIGJhc2UgdmFsdWUgYW5kIHRpdGxlXHJcbiAgICovXHJcbiAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdzogYW55LCBjb2x1bW46IGFueSkge1xyXG4gICAgZGVsZXRlIHJvd1sndW5kZWZpbmVkJ107XHJcbiAgICBsZXQgdmFsdWU6YW55O1xyXG4gICAgaWYoY29sdW1uLnR5cGUgPT0gRUdyaWRDb2x1bW5UeXBlLkRBVEUpe1xyXG4gICAgICBsZXQgbmV3VmFsdWU6YW55O1xyXG4gICAgICBpZih0eXBlb2Yocm93W2NvbHVtbi5maWVsZF0pID09PSBcIm9iamVjdFwiICYmIHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24pe1xyXG4gICAgICAgIG5ld1ZhbHVlID0gcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheVRleHRcclxuICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlUZXh0XHJcbiAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKClcclxuICAgICAgICA/IHJvd1tyb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldXHJcbiAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXT8udGV4dFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKG5ld1ZhbHVlKXtcclxuICAgICAgICBpZihjb2x1bW4udGltZU9ubHkpe1xyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnNldFRpbWVGb3JtYXQobmV3VmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZm9ybWF0ID0gJyc7XHJcbiAgICAgICAgICBpZihjb2x1bW4uZm9ybWF0KXtcclxuICAgICAgICAgICAgaWYoY29sdW1uLmZvcm1hdCA9PT0gRUdyaWRGb3JtYXRUeXBlLlNNQUxMREFURSl7XHJcbiAgICAgICAgICAgICAgZm9ybWF0ID0gJ01NL2RkL3l5JztcclxuICAgICAgICAgICAgfWVsc2UgaWYoY29sdW1uLmZvcm1hdCA9PT0gRUdyaWRGb3JtYXRUeXBlLlNIT1JUREFURSl7XHJcbiAgICAgICAgICAgICAgZm9ybWF0ID0gJ01NL2RkL3l5eXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG5ld1ZhbHVlPy50b1N0cmluZygpID09PSBcIkludmFsaWQgRGF0ZVwiID8gbnVsbCA6IG5ld1ZhbHVlLCBmb3JtYXQgPyBmb3JtYXQgOiAnTU0vZGQveXknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlUZXh0XHJcbiAgICAgID8gcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheVRleHRcclxuICAgICAgOiByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKClcclxuICAgICAgPyByb3dbcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxyXG4gICAgICA6IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxyXG4gICAgICA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxyXG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddICYmXHJcbiAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQgPT09IG51bGxcclxuICAgICAgPyAnJ1xyXG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5VGV4dFxyXG4gICAgICA/IGNvbHVtbj8uZmlsdGVyPy50eXBlID09PSAnY2FsZW5kYXInICYmIGNvbHVtbi50aW1lT25seSAmJiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRJQUxPRyA/IFxyXG4gICAgICAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQudG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dC50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKSA/IFxyXG4gICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCA6IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0LCAnaGg6bW0gYScpXHJcbiAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHRcclxuICAgICAgOiBjb2x1bW4uZGlzcGxheVRleHRcclxuICAgICAgPyBjb2x1bW4uZGlzcGxheVRleHRcclxuICAgICAgOiByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgIH1cclxuICAgXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXREcm9wZHdvblJlYWRPbmx5VmFsdWUocm93OiBhbnksIGNvbHVtbjogYW55KXtcclxuICAgIGRlbGV0ZSByb3dbJ3VuZGVmaW5lZCddO1xyXG4gICAgY29uc3QgdmFsdWUgPSByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cclxuICAgID8gcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdXHJcbiAgICA6IHJvd1tjb2x1bW4uZmllbGRdO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBEZWxldGUgQ29uZmlybWF0aW9uIGRpYWxvZyB3aGVuIGNsaWNrIG9uIGRlbGV0ZSBpY29uIGluIEFjdGlvbiBjb2x1bW5cclxuICAgKi9cclxuICBoYW5kbGVBY3Rpb25DbGljayhldmVudDogRXZlbnQsIGNvbHVtbkFjdGlvbjogSUdyaWRDb2x1bW5BY3Rpb24sIHJvdzogYW55KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmIChjb2x1bW5BY3Rpb24udG9vbHRpcC50b0xvd2VyQ2FzZSgpID09PSAnZGVsZXRlJykge1xyXG4gICAgICBpZiAoY29sdW1uQWN0aW9uLmNvbmZpcm1EaWFsb2cgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgY29sdW1uQWN0aW9uLm9uQ2xpY2socm93KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcmVjb3JkPycsXHJcbiAgICAgICAgICBoZWFkZXI6ICdEZWxldGUgQ29uZmlybWF0aW9uJyxcclxuICAgICAgICAgIGljb246ICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsXHJcbiAgICAgICAgICBrZXk6ICdoYW5kbGVjb2x1bW5BY3Rpb25zJyxcclxuICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb2x1bW5BY3Rpb24ub25DbGljayhyb3cpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY2xvc2UoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZWplY3Q6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb2x1bW5BY3Rpb24ub25DbGljayhyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZXZlbnQgOiBMYXp5TG9hZEV2ZW50XHJcbiAgICogVHJpZ2dlcnMgZXZlcnl0aW1lIGEgc2VydmVyIHNpZGUgZmlsdGVyIGlzIHRyaWdnZXJcclxuICAgKi9cclxuICBoYW5kbGVTZXJ2ZXJTaWRlRXZlbnRzKGV2ZW50OiBhbnkpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZih0aGlzLnNlbGVjdGVkQ29sdW1ucyAmJiB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChldmVudC5maWx0ZXJzW3guZmllbGRdKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnNbeC5maWVsZF0udmFsdWUgPSB4LnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgIFxyXG4gICAgdGhpcy5sb2FkaW5nID0gdGhpcy5hdXRvTG9hZERhdGE7XHJcbiAgICB0aGlzLnNlcnZlckZpbHRlcnMgPSB7XHJcbiAgICAgIGZpbHRlcnM6IHRoaXMubG9va3VwRmlsdGVyc1xyXG4gICAgICAgID8gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkRmlsdGVycyhldmVudCwgdGhpcy5zZWxlY3RlZENvbHVtbnMpXHJcbiAgICAgICAgOiB0aGlzLmdyaWRTZXJ2aWNlLnByZXBhcmVCYXNpY0ZpbHRlcnMoZXZlbnQsIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSxcclxuICAgICAgc29ydHM6IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFNvcnRzKGV2ZW50LCB0aGlzLnNlbGVjdGVkQ29sdW1ucyksXHJcbiAgICAgIC4uLih0aGlzLnBhZ2luYXRpb24gJiYge1xyXG4gICAgICAgIHBhZ2U6IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFBhZ2luYXRpb24oZXZlbnQpLFxyXG4gICAgICAgIHBhZ2VTaXplOiBldmVudC5yb3dzIHx8IDEwLFxyXG4gICAgICB9KSxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlcnZlckZpbHRlcnM/LmZpbHRlcnMgJiZcclxuICAgICAgdGhpcy5zZXJ2ZXJGaWx0ZXJzPy5maWx0ZXJzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgKHRoaXMuYWxsb3dDYWNoaW5nIHx8IHRoaXMuc29mdENhY2hpbmcpXHJcbiAgICApIHtcclxuICAgICAgaWYoIXRoaXMuc29mdENhY2hpbmcpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdTZXRGaWx0ZXJzLScgKyB1dGlsaXRpZXMuY3VycmVudFVybCgpLEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t1dGlsaXRpZXMuY3VycmVudFVybCgpXSA9IHRoaXMuc2VydmVyRmlsdGVycztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlcnZlckZpbHRlclZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2ZXJGaWx0ZXJzKSk7XHJcbiAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycyA9ICh0aGlzLnNlcnZlckZpbHRlcnMuZmlsdGVycyB8fCBbXSkuY29uY2F0KFxyXG4gICAgICB0aGlzLmdsb2JhbERhdGFcclxuICAgICk7XHJcbiAgICB0aGlzLm9uU2VydmVyU2lkZUV2ZW50Q2hhbmdlLmVtaXQoc2VydmVyRmlsdGVyVmFsdWVzKTtcclxuICAgIH0sIDk1MCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKiBQYXNzZXMgYXBwbGllZCBwYWdpbmF0aW9uIHRvIHBhcmVudCBvbiBwYWdlIGNoYW5nZVxyXG4gICAqL1xyXG4gIGhhbmRsZVNlcnZlclNpZGVQYWdpbmF0aW9uKGV2ZW50OiBJR3JpZFBhZ2luYXRpb25FdmVudCkge1xyXG4gICAgdGhpcy5vblBhZ2VDaGFuZ2UuZW1pdChldmVudCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZFJvdyhyb3c6IGFueSkge1xyXG4gICAgdGhpcy5vblJvd0NoZWNrQm94LmVtaXQocm93KTtcclxuICB9XHJcblxyXG4gIC8vIHNldCB0aW1lIGZvcm1hdFxyXG4gIHNldFRpbWVGb3JtYXQoZGF0ZTogYW55KSB7XHJcbiAgICBsZXQgdmFsdWU6IGFueSA9ICcnO1xyXG4gICAgaWYgKGRhdGU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHwgZGF0ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xyXG4gICAgICB2YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGRhdGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShkYXRlLCAnaGg6bW0gYScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy9vcGVuIGh5cGVybGluayBpbiBlZGl0IGNhc2VcclxuICBvcGVuTGluayh1cmw6IGFueSkge1xyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICBjb25zdCBsaW5rOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgIGxpbmsuaHJlZiA9IHVybDtcclxuICAgICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Rm9ybWF0KGNvbHVtbjogYW55LCByb3c6IGFueSkge1xyXG4gICAgbGV0IHZhbHVlOiBhbnkgPSAnJztcclxuICAgIGlmIChjb2x1bW4uZm9ybWF0KSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXHJcbiAgICAgICAgY29sdW1uLmRpc3BsYXlUZXh0ID8gY29sdW1uLmRpc3BsYXlUZXh0IDogcm93W2NvbHVtbi5maWVsZF0sXHJcbiAgICAgICAgY29sdW1uLmZvcm1hdFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUgPSBjb2x1bW4uZGlzcGxheVRleHQgPyBjb2x1bW4uZGlzcGxheVRleHQgOiByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJvd1xyXG4gICAqIFNldHMgdmFsdWVzIHRvIGVkaXRhYmxlIHJvd1xyXG4gICAqIFJvdydzIGRhdGEgaXMgcHJlc2V2ZWQgdG8gcHJldmVudCBtdXRhdGlvblxyXG4gICAqIFJvdyBkYXRhS2V5IGlzIHByZXNlcnZlZCB0byBrZWVwIHRoZSByb3cgdW5pcXVlIGFuZCBpbiBlZGl0YWJsZSBzdGF0ZSBhcyBsb25nIGFzIG5vdCBzYXZlZFxyXG4gICAqL1xyXG5cclxuICBvblJvd0VkaXRJbml0KHJvdzogYW55KSB7XHJcbiAgICBsZXQgc2VsZWN0ZWRSb3cgPSB7IC4uLnJvdyB9O1xyXG4gICAgT2JqZWN0LmVudHJpZXMoc2VsZWN0ZWRSb3cpLmZvckVhY2goKFtrZXksIHZhbHVlXTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKHRoaXMuc2V0RHJvcGRvd25GaWx0ZXIpe1xyXG4gICAgICAgICAgdGhpcy5zZXREcm9wZG93bkZpbHRlclZhbHVlKGNvbCwgcm93LCBrZXkpO1xyXG4gICAgICAgICAgdGhpcy5zZXREcm9wZG93bkZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgdGhlIGF1dG9Db21wbGV0ZSBWYWx1ZSBpbiBlZGl0IG1vZGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkFVVE9DT01QTEVURSAmJlxyXG4gICAgICAgICAgY29sLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBrZXk/LnRvTG93ZXJDYXNlKCkgJiZcclxuICAgICAgICAgIHZhbHVlICYmXHJcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZS5tYXAoKHg6IGFueSkgPT4geFtjb2wuZGlzcGxheUZpZWxkXSk7XHJcbiAgICAgICAgICBpZiAobmV3VmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykpIHtcclxuICAgICAgICAgICAgcm93W2NvbC5maWVsZF0gPSBuZXdWYWx1ZVxyXG4gICAgICAgICAgICAgID8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgID8ucmVwbGFjZUFsbCgnOycsICcsJylcclxuICAgICAgICAgICAgICA/LnNwbGl0KCcsJylcclxuICAgICAgICAgICAgICA/Lm1hcCgoeDogYW55KSA9PiAoeyBbY29sLmRpc3BsYXlGaWVsZF06IHggfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IGxvb2t1cCBjb250cm9sIGZpZWxkIGJhc2VkIG9uIGRpc3BsYXkgZmllbGQuXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmIGNvbC5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgICAgIGlmIChjb2wuZmllbGQgPT09IGtleSkge1xyXG4gICAgICAgICAgICByb3dbY29sLmZpZWxkXSA9IHtcclxuICAgICAgICAgICAgICB0ZXh0OiByb3dbY29sLmRpc3BsYXlGaWVsZF0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IHJvd1tjb2wuZmllbGRdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04pIHtcclxuICAgICAgICAgIGxldCBvcHRpb24gPSBjb2w/LmRhdGE/LmZpbmQoXHJcbiAgICAgICAgICAgICh4OiBhbnkpID0+IHgubGFiZWwgPT09IHJvd1tjb2wuZmllbGRdPy50b1N0cmluZygpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKG9wdGlvbikge1xyXG4gICAgICAgICAgICByb3dbY29sLmZpZWxkXSA9IG9wdGlvbi52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBrZXk/LnRvTG93ZXJDYXNlKCkgJiZcclxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZT8uYWN0aW9uID8gdmFsdWUudGV4dCA6IHZhbHVlO1xyXG4gICAgICAgICAgaWYgKHJvd1tjb2wuZmllbGRdICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmKHJvd1trZXldPy5hY3Rpb24gJiYgT2JqZWN0LmtleXMocm93W2tleV0/LmFjdGlvbik/Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHJvd1trZXldLnRleHQgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICByb3dba2V5XSA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBjaGVjayB0aGUgTWludXRlcyBwYXR0ZXJuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIChjb2wuc2hvd1RpbWUgfHwgY29sLnRpbWVPbmx5KSAmJlxyXG4gICAgICAgICAgICBjb2wubWludXRlc0ludGVydmFsICYmXHJcbiAgICAgICAgICAgIHJvd1trZXldXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgcm93W2tleV0gPSBuZXcgRGF0ZSh1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKHJvd1trZXldKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRElBTE9HICYmXHJcbiAgICAgICAgICBjb2wuZmlsdGVyPy50eXBlID09PSAnY2FsZW5kYXInICYmXHJcbiAgICAgICAgICBjb2wuZmllbGQudG9Mb3dlckNhc2UoKSA9PT0ga2V5LnRvTG93ZXJDYXNlKClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByb3dba2V5XSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByb3dbY29sLmZpZWxkXSA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LICYmXHJcbiAgICAgICAgICBjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09IGtleT8udG9Mb3dlckNhc2UoKSAmJlxyXG4gICAgICAgICAgKGNvbC5hbGxvd1NhdmUgPT09IHRydWUgfHwgY29sLmFsbG93U2F2ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKGNvbC5lZGl0TGluayA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByb3dba2V5XSA9IHJvd1tjb2wuZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbms7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbC5lZGl0TGluayA9PT0gZmFsc2UgfHwgY29sLmVkaXRMaW5rID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcm93W2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dID0geyAuLi5yb3cgfTtcclxuICAgIHRoaXMuZWRpdGluZ1Jvd0tleXNbcm93W3RoaXMuZGF0YUtleV1dID0gdHJ1ZTtcclxuICAgIHRoaXMuY2hlY2tBY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5kcm9wZG93bklucHV0ID0gdHJ1ZTtcclxuICAgIHRoaXMucm93Q2xpY2tEYXRhID0gcm93O1xyXG4gICAgdGhpcy5pbkVkaXRNb2RlID0gdHJ1ZTtcclxuICAgIHRoaXMuY2FuY2VsQWxsUmVjb3JkcyA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlQWxsUmVjb3JkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNvcnREaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLm9uR3JpZFJvd0VkaXQuZW1pdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgdHlwZU9mKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBzZXQgZHJvcGRvd24gZmlsdGVyIHZhbHVlXHJcbiAgICovXHJcbiAgc2V0RHJvcGRvd25GaWx0ZXJWYWx1ZShjb2w6IGFueSwgcm93OiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICBpZiAoY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTiAmJiBjb2wuZHJvcERvd25Qcm9wKSB7XHJcbiAgICAgIGlmIChPYmplY3QudmFsdWVzKGNvbCkuc29tZSgodmFsdWUpID0+IHZhbHVlID09IGtleSkpIHsgICAgICAgIFxyXG4gICAgICAgIGxldCBvYmogPSBjb2wuZHJvcERvd25Qcm9wO1xyXG4gICAgICAgIGxldCBuZXdGaWx0ZXJzOiBhbnkgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKG9iai5maWx0ZXJzICYmIG9iai5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIG9iai5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBuZXdGaWx0ZXIgPSB7IC4uLmZpbHRlciB9O1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyS2V5ID0gT2JqZWN0LmtleXMocm93KS5maW5kKChrZXkpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgbWF0Y2hLZXk6IHN0cmluZyA9ICcnO1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZT8uaW5jbHVkZXMoJ3snKSAmJlxyXG4gICAgICAgICAgICAgICAga2V5LnRvTG93ZXJDYXNlKCkgPT09XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgID8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7JywgJycpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ30nLCAnJylcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIG1hdGNoS2V5ID0ga2V5O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hLZXk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyS2V5KSB7XHJcbiAgICAgICAgICAgICAgbmV3RmlsdGVyLnZhbHVlID0gcm93W2ZpbHRlcktleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3RmlsdGVycy5wdXNoKG5ld0ZpbHRlcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc2V0RHJvcGRvd25EYXRhKFxyXG4gICAgICAgICAgY29sLFxyXG4gICAgICAgICAgb2JqLnVuaXF1ZUtleSxcclxuICAgICAgICAgIG9iai52YWx1ZVByb3AsXHJcbiAgICAgICAgICBvYmoubGFiZWxQcm9wLFxyXG4gICAgICAgICAgbmV3RmlsdGVycyxcclxuICAgICAgICAgIHJvd1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb24gPSBjb2wuZGF0YS5maW5kKFxyXG4gICAgICAgICAgKHg6IGFueSkgPT4geC5sYWJlbCA9PT0gcm93W2NvbC5maWVsZF0/LnRvU3RyaW5nKClcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChvcHRpb24pIHtcclxuICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gb3B0aW9uLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gcm93XHJcbiAgICogUGFzc2VzIHRoZSBlZGl0ZWQgb3IgbmV3bHkgY3JlYXRlZCBkYXRhIHRvIHBhcmVudFxyXG4gICAqIEluIGNhc2Ugb2YgbmV3bHkgY3JlYXRlZCBkYXRhLCBkYXRhS2V5IGFuZCBpc05ldyBwcm9wIGlzIHJlbW92ZWRcclxuICAgKi9cclxuICBvblJvd0VkaXRTYXZlKHNlbGVjdGVkUm93OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgIGRlbGV0ZSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGQgKyAnLWRhdGEnXTtcclxuICAgICAgZGVsZXRlIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZCArICdfc2Vjb25kVHlwZSddO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgJiZcclxuICAgICAgICBjb2x1bW4uZGlzcGxheUZpZWxkICYmXHJcbiAgICAgICAgdGhpcy5sb29rdXBPYmplY3RcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IHRoaXMubG9va3VwT2JqZWN0LnZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sdW1uLmZvcm1hdHRlcikge1xyXG4gICAgICAgIGxldCB2YWx1ZTogYW55ID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlciA9PT0gJ2NoYXInKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSB0cnVlID8gJ1knIDogJ04nO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLmZvcm1hdHRlciA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSB0cnVlID8gJzEnIDogJzAnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxlY3RlZFJvdyA9IHsgLi4uc2VsZWN0ZWRSb3csIFtjb2x1bW4uZmllbGRdOiB2YWx1ZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL2NvbnZlcnQgZGF0ZSBpbnRvIHRpbWUgZm9ybWF0XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRBVEVcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYoIGNvbHVtbi50aW1lT25seSAmJiBjb2x1bW4uc2F2ZUFzU3RyaW5nKXtcclxuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLCAnaGg6bW0gYScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCFjb2x1bW4udGltZU9ubHkgJiYgY29sdW1uLnNob3dUaW1lKXtcclxuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLCAneXl5eS1NTS1kZCBISDptbTpzcycpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvL2NvbnZlcnQgbXVsdGlzZWxlY3QgYXJyYXkgaW50byBzdHJpbmdcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTVVMVElTRUxFQ1QgJiYgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXVxyXG4gICAgICApIHtcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNhdmluZyBBdXRvQ29tcGxldGUgRGF0YVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUgJiZcclxuICAgICAgICBjb2x1bW4uZGlzcGxheUZpZWxkICYmXHJcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXT8ubGVuZ3RoID4gMFxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgYXJyOiBhbnkgPSBbXTtcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocm93W2NvbHVtbi5kaXNwbGF5RmllbGRdKSB7XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IGFyci50b1N0cmluZygpPy5yZXBsYWNlQWxsKCcsJywgJzsnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHJvdzogYW55ID0geyAuLi5zZWxlY3RlZFJvdyB9O1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhyb3cpO1xyXG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgaWYgKHRoaXMubG9va3VwT2JqZWN0ICYmIHRoaXMubG9va3VwT2JqZWN0LmZpZWxkKSB7XHJcbiAgICAgICAgcm93W3RoaXMubG9va3VwT2JqZWN0LmZpZWxkXSA9IHRoaXMubG9va3VwT2JqZWN0LnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ19vYmonKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrQWN0aW9uID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgcm93ID0geyAuLi5yb3csIFtrZXkuc3BsaXQoJ18nKVswXV06IHJvd1trZXldLmRpc3BsYXlUZXh0IH07XHJcbiAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0gcm93W2tleV07XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgb2JqICYmXHJcbiAgICAgICAgICAob2JqLnR5cGUgPT09ICdsaW5rJyB8fFxyXG4gICAgICAgICAgICBvYmoudHlwZSA9PT0gJ2lmcmFtZScgfHxcclxuICAgICAgICAgICAgb2JqLnR5cGUgPT09ICdkaWFsb2cnKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZGVsZXRlIHJvd1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvKipcclxuICAgICAqIGp1c3QgZW1pdCB0aG9zZSBmaWVsZHMgd2hvIGV4aXN0IGluIHRoZSB0YWJlbFxyXG4gICAgICovXHJcbiAgICB0aGlzLnNldFJvd1ZhbHVlKHJvdyk7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgJiZcclxuICAgICAgICBjb2x1bW4uZmllbGQgJiZcclxuICAgICAgICB0eXBlb2Ygcm93W2NvbHVtbi5maWVsZF0gPT09ICdvYmplY3QnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IG5ld1JvdyA9IHsgLi4ucm93IH07XHJcbiAgICAgICAgbmV3Um93W2NvbHVtbi5maWVsZF0gPSBuZXdSb3dbY29sdW1uLmZpZWxkXT8udmFsdWU7XHJcbiAgICAgICAgcm93ID0geyAuLi5uZXdSb3cgfTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgKGNvbHVtbi5hbGxvd1NhdmUgPT09IHRydWUgfHwgY29sdW1uLmFsbG93U2F2ZSA9PT0gdW5kZWZpbmVkKSAmJlxyXG4gICAgICAgIChjb2x1bW4uZWRpdGFibGUgPT09IHRydWUgfHwgY29sdW1uLmVkaXRhYmxlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICkge1xyXG4gICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgJiZcclxuICAgICAgICAgIGNvbHVtbi5maWx0ZXI/LnR5cGUgPT09ICdjYWxlbmRhcidcclxuICAgICAgICApIHtcclxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdLFxyXG4gICAgICAgICAgICAneXl5eS1NTS1kZFQwMDowMDowMC4wMDBaJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2V0IERlY2ltYWwgRnJhY3Rpb24gVmFsdWVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0ICYmXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09IEVGb3JtYXRUeXBlLkRFQ0lNQUwgJiZcclxuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdICYmXHJcbiAgICAgICAgICAhcm93W2NvbHVtbi5maWVsZF0udG9TdHJpbmcoKS5pbmNsdWRlcygnLicpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgZGlnaXRzSW5mbyA9ICcuMDAnO1xyXG4gICAgICAgICAgbGV0IHplcm8gPSAnMCc7XHJcbiAgICAgICAgICBjb25zdCBmb3JtYXRQYXJhbXMgPSBjb2x1bW4uZm9ybWF0Py5mb3JtYXRQYXJhbXM7XHJcbiAgICAgICAgICBjb25zdCBmcmFjRGlnaXRzID0gY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcclxuICAgICAgICAgIGlmIChmcmFjRGlnaXRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZnJhY0RpZ2l0czsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgemVybyA9IHplcm8gKyAnMCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGlnaXRzSW5mbyA9ICcuJyArIHplcm87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdICsgZGlnaXRzSW5mbztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgcm93LmlzTmV3ICYmXHJcbiAgICAgICAgKGNvbHVtbi5hbGxvd1NhdmUgPT09IGZhbHNlIHx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGRlbGV0ZSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBkZWxldGUgc2VsZWN0ZWRSb3dbJ3VuZGVmaW5lZCddO1xyXG4gICAgdGhpcy5ncmlkU2VydmljZS5jaGVja1ZhbGlkaXR5KHRoaXMuY29sdW1ucywgcm93KTtcclxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmdyaWRWYWxpZGF0aW9uKHRoaXMuY29sdW1ucywgcm93KTtcclxuICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAvLyBzZXQgdGhlIGdyaWQgdXBkYXRlZC9pbnNlcnRlZCBkYXRhXHJcbiAgICAgIHRoaXMucm93QWN0aW9uRXZlbnRzKHNlbGVjdGVkUm93KTtcclxuICAgICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudChmYWxzZSk7XHJcbiAgICAgIGlmIChyb3cuaXNOZXcpIHtcclxuICAgICAgICBjb25zdCB7IGlzTmV3LCAuLi5uZXdSb3dPYmogfSA9IHJvdztcclxuICAgICAgICBkZWxldGUgbmV3Um93T2JqW3RoaXMuZGF0YUtleV07XHJcbiAgICAgICAgaWYgKHRoaXMuc2F2ZUFsbFJlY29yZCkge1xyXG4gICAgICAgICAgdGhpcy5zYXZlUmVjb3JkQXJyYXkucHVzaChuZXdSb3dPYmopO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5vblJvd0FkZC5lbWl0KG5ld1Jvd09iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLnNhdmVBbGxSZWNvcmQpIHtcclxuICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5LnB1c2gob2JqKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub25Sb3dVcGRhdGUuZW1pdChvYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVkaXRpbmdSb3dLZXlzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHRoaXMuZWRpdEFsbFJvd3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRpbmdSb3dLZXlzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhbGwgcm93cyBpbiByZWFkIG9ubHkgbW9kZSB0aGVuIHNob3cgZWRpdEFsbFJvd3MgYnV0dG9uLiAgICBcclxuICAgIGlmKE9iamVjdC52YWx1ZXModGhpcy5lZGl0aW5nUm93S2V5cykuZXZlcnkoKHZhbHVlKT0+ICF2YWx1ZSkpe1xyXG4gICAgICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICAgICB0aGlzLmhpZGVFZGl0QWxsUm93c0J0biA9IHRydWU7XHJcbiAgICAgICB0aGlzLnNvcnREaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgLy8gY29udmVydCBkYXRlIGludG8gdGltZVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAmJlxyXG4gICAgICAgIChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpPy5pbmNsdWRlcygnUE0nKSB8fFxyXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdBTScpKVxyXG4gICAgICApIHtcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUocm93W2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRST1BET1dOICYmXHJcbiAgICAgICAgY29sdW1uLm9wdGlvbkxhYmVsICYmXHJcbiAgICAgICAgY29sdW1uLm9wdGlvblZhbHVlXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHNlbGVjdGVkUm93KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcclxuICBncmlkVmFsaWRhdGlvbihjb2x1bW5zOiBhbnksIHJvdzogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZFNlcnZpY2UuY2hlY2tWYWxpZGl0eShjb2x1bW5zLCByb3cpKSB7XHJcbiAgICAgIGxldCBpc1JlcXVpcmVkID0gY29sdW1ucy5zb21lKFxyXG4gICAgICAgIChjb2x1bW46IGFueSkgPT4gY29sdW1uLmVycm9yTWVzc2FnZSAmJiAhcm93W2NvbHVtbi5maWVsZF1cclxuICAgICAgKTtcclxuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcclxuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcclxuICAgICAgICAgICdSZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcnLFxyXG4gICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoJ1NvbWUgZmllbGRzIGFyZSBpbnZhbGlkJywgJ0lOVkFMSUQgRklFTEQnKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJvdyA6IGFueVxyXG4gICAqIEBwYXJhbSBpbmRleCA6IG51bWJlclxyXG4gICAqIENsZWFycyBvdXQgdGhlIGVkaXQgcm93IGFuZCByZXBsYWNlIHdpdGggcmVhZGFibGUgb25lXHJcbiAgICovXHJcbiAgb25Sb3dFZGl0Q2FuY2VsKHJvdzogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAocm93LmlzTmV3KSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGFbaW5kZXhdID0gdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dO1xyXG4gICAgICBkZWxldGUgdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMuZWRpdGluZ1Jvd0tleXNbcm93W3RoaXMuZGF0YUtleV1dO1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikge1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHJvdyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICBpZihPYmplY3QudmFsdWVzKHRoaXMuZWRpdGluZ1Jvd0tleXMpLmV2ZXJ5KCh2YWx1ZSk9PiAhdmFsdWUpKXtcclxuICAgICAgdGhpcy5zb3J0RGlzYWJsZWQgPSBmYWxzZTtcclxuICAgfSAgXHJcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gZmFsc2U7XHJcbiAgICB0aGlzLmlubGluZVJvd0NhbmNlbC5lbWl0KHJvdyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSByb3dcclxuICAgKiBTZW5kcyB0aGUgcm93IHBheWxvYWQgdG8gcGFyZW50IGZvciBkZWxldGlvblxyXG4gICAqL1xyXG5cclxuICAgLyoqXHJcbiAgICpzZXQgdGhlIGdyaWREYXRhIG9uIHJvdyBhY3Rpb25zIGV2ZW50c1xyXG4gICAqL1xyXG4gICByb3dBY3Rpb25FdmVudHMocm93SW5mbywgZGVsZXRlUm93OiBib29sZWFuID0gZmFsc2Upe1xyXG4gICAgbGV0IGFjdGlvbjogc3RyaW5nID0gJyc7XHJcbiAgICBsZXQgZ3JpZFJvd3NEYXRhOiBhbnlbXSA9IFsuLi50aGlzLnJvd3NEYXRhXTtcclxuICAgIGNvbnN0IGluZGV4ID0gZ3JpZFJvd3NEYXRhLmZpbmRJbmRleCgocm93RGF0YSk9PiByb3dJbmZvW3RoaXMuZGF0YUtleV0gPT09IHJvd0RhdGFbdGhpcy5kYXRhS2V5XSk7XHJcbiAgICBpZihpbmRleCA+IC0xKXtcclxuICAgICAgaWYoZGVsZXRlUm93KXsgXHJcbiAgICAgICAgZ3JpZFJvd3NEYXRhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgdGhpcy5yb3dzRGF0YSA9IFsuLi5ncmlkUm93c0RhdGFdO1xyXG4gICAgICAgIGFjdGlvbiA9ICdkZWxldGUnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmKHRoaXMuYWRkTmV3Um93Q2hlY2spe1xyXG4gICAgICAgICAgYWN0aW9uID0gJ2luc2VydCc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBhY3Rpb24gPSAndXBkYXRlJztcclxuICAgICAgICB9XHJcbiAgICAgIGlmKHRoaXMub25HcmlkUm93QWN0aW9ucy5vYnNlcnZlcnMubGVuZ3RoICE9PSAwKXtcclxuICAgICAgICByb3dJbmZvWydyb3dBY3Rpb24nXT0gYWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGdyaWRSb3dzRGF0YVtpbmRleF0gPSByb3dJbmZvO1xyXG4gICAgfVxyXG4gIH1cclxuICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcclxuICB0aGlzLm9uR3JpZFJvd0FjdGlvbnMuZW1pdChncmlkUm93c0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBEZWxldGUgY29uZmlybWF0aW9uIGRpYWxvZyB3aGVuIHRyeWluZyB0byBkZWxldGUgcm93XHJcbiAgICovXHJcbiAgZGVsZXRlUmVjb3JkKHJvdzogYW55KSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIG1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyByZWNvcmQ/JyxcclxuICAgICAgaGVhZGVyOiAnRGVsZXRlIENvbmZpcm1hdGlvbicsXHJcbiAgICAgIGljb246ICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsXHJcbiAgICAgIGtleTogJ2hhbmRsZUlubGluZUNSVUQnLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy51c2VTZXJ2ZXJTaWRlRXZlbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgdGhlIGdyaWQgZGVsZXRlZCBkYXRhIFxyXG4gICAgICAgIHRoaXMucm93QWN0aW9uRXZlbnRzKHJvdywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KHJvdyk7XHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlKCk7XHJcbiAgICAgICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlamVjdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUbyBzZXQgZGlzYWJsZWQgdGhlIGNvbnRyb2xcclxuICAgKi9cclxuICBhbGxvd0Rpc2FibGVkKGNvbHVtbjogYW55LCByb3c6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkXSkgPT09ICdvYmplY3QnICYmIHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24pIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24gJiZcclxuICAgICAgICBPYmplY3Qua2V5cyhyb3dbY29sdW1uLmZpZWxkXS5hY3Rpb24pPy5pbmNsdWRlcygnZGlzYWJsZWQnKSAmJiByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNhYmxlZCA9PT0gdHJ1ZVxyXG4gICAgICApIHtcclxuICAgICAgICB2YWx1ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoY29sdW1uLmRpc2FibGVkIHx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UpIHtcclxuICAgICAgdmFsdWUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG8gc2V0IGFnZ3JlZ2F0ZSBpbiBncmlkIGZvb3RlclxyXG4gICAqL1xyXG4gIHNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uOiBJR3JpZENvbHVtbikge1xyXG4gICAgaWYgKGNvbHVtbj8uYWdncmVnYXRlKSB7XHJcbiAgICAgIGNvbHVtbi5hZ2dyZWdhdGUuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5yb3dzRGF0YSAmJiB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBjb2x1bW5UeXBlOiBFR3JpZEFnZ3JlZ2F0ZSA9IGNvbC50eXBlO1xyXG4gICAgICAgICAgaWYgKGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLkNPVU5UKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yb3dzRGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbC5hZ2dyVmFsdWUgPSB0aGlzLnNldEFnZ3JlZ2F0ZUZvb3RlclRleHQoY29sLCBjb3VudCwgJ0NvdW50Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb2x1bW5UeXBlID09PSBFR3JpZEFnZ3JlZ2F0ZS5TVU0gfHxcclxuICAgICAgICAgICAgY29sdW1uVHlwZSA9PT0gRUdyaWRBZ2dyZWdhdGUuQVZFUkFHRVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbFZhbHVlczogbnVtYmVyW10gPSB0aGlzLmdldENvbHVtblZhbHVlcyhjb2x1bW4pO1xyXG4gICAgICAgICAgICBpZiAoY29sVmFsdWVzICYmIGNvbFZhbHVlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3VtID0gY29sVmFsdWVzLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1ciwgMCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLlNVTSkge1xyXG4gICAgICAgICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9IHRoaXMuc2V0QWdncmVnYXRlRm9vdGVyVGV4dChjb2wsIHN1bSwgJ1N1bScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoY29sdW1uVHlwZSA9PT0gRUdyaWRBZ2dyZWdhdGUuQVZFUkFHRSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXZlcmFnZSA9IHN1bSAvIGNvbFZhbHVlcy5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgICAgIGNvbC5hZ2dyVmFsdWUgPSB0aGlzLnNldEFnZ3JlZ2F0ZUZvb3RlclRleHQoXHJcbiAgICAgICAgICAgICAgICAgIGNvbCxcclxuICAgICAgICAgICAgICAgICAgYXZlcmFnZSxcclxuICAgICAgICAgICAgICAgICAgJ0F2ZydcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbC5hZ2dyVmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0IGdyaWQgQWdncmVnYXRlIHZhbHVlc1xyXG4gICAqL1xyXG4gIHNldEFnZ3JlZ2F0ZUZvb3RlclRleHQoY29sdW1uOiBhbnksIHZhbHVlOiBudW1iZXIsIGRlZmF1bHRDYXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlzRGVjaW1hbEZvcm1hdDogYm9vbGVhbiA9IGNvbHVtbi5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJztcclxuICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBjb2x1bW4uZm9ybWF0Py5kaWdpdHNJbmZvO1xyXG4gICAgY29uc3QgY2FwdGlvbjogc3RyaW5nID1cclxuICAgICAgY29sdW1uLmNhcHRpb24/Lmxlbmd0aCA+IDAgPyBjb2x1bW4uY2FwdGlvbiA6IGRlZmF1bHRDYXB0aW9uO1xyXG5cclxuICAgIGNvbnN0IGRlY2ltYWxQb2ludCA9IGlzRGVjaW1hbEZvcm1hdFxyXG4gICAgICA/IHZhbHVlPy50b0ZpeGVkKGRpZ2l0c0luZm8gPyBkaWdpdHNJbmZvIDogMilcclxuICAgICAgOiB2YWx1ZT8udG9GaXhlZCgwKTtcclxuICAgIHJldHVybiBgJHtjYXB0aW9ufSAke2RlY2ltYWxQb2ludFxyXG4gICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKX0gPC9icj5gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0IGRlY2ltYXQgYW5kIG51bWVyaWMgdmFsdWVzXHJcbiAgICovXHJcbiAgc2V0TnVtZXJpY1ZhbHVlcygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5yb3dzRGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcclxuICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdCgocm93W2NvbHVtbi5maWVsZF0gLyAxMDApPy50b1N0cmluZygpKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkXSAvIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcclxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdChyb3dbY29sdW1uLmZpZWxkXSkudG9GaXhlZChkaWdpdHNJbmZvKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdChyb3dbY29sdW1uLmZpZWxkXSkudG9GaXhlZChkaWdpdHNJbmZvID8gZGlnaXRzSW5mbyA6IDIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgY29sdW1uIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiBmaWVsZFxyXG4gICAqL1xyXG4gIGdldENvbHVtblZhbHVlcyhjb2x1bW46IElHcmlkQ29sdW1uKSB7XHJcbiAgICBsZXQgYXJyOiBhbnkgPSBbXTtcclxuICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcclxuICAgICAga2V5cy5tYXAoKGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChjb2x1bW4uZmllbGQgPT09IGtleSkge1xyXG4gICAgICAgICAgYXJyLnB1c2gocm93W2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEV4cG9ydCB0byBQREZcclxuICAgKi9cclxuICBleHBvcnRQZGYoKSB7XHJcbiAgICB2YXIgZXhwb3J0RGF0YSA9IHRoaXMuc2V0RXhwb3J0RGF0YShbLi4udGhpcy5yb3dzRGF0YV0sIHRydWUpO1xyXG4gICAgbGV0IGRvYyA9IG5ldyBqc1BERigncCcsICdwdCcpO1xyXG4gICAgZG9jLnRhYmxlKDEsIDEsIGV4cG9ydERhdGEucm93cywgZXhwb3J0RGF0YS5oZWFkaW5ncywgeyBhdXRvU2l6ZTogdHJ1ZSB9KTtcclxuICAgIGRvYy5zYXZlKCdFeHBvcnQucGRmJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiAgU3ViLWZ1bmN0aW9uIHRvIHNldCByb3dzIGZvciBleHBvcnQgdG8gUGRmLCBhbmQgRXhjZWxcclxuICAgKiBAcm93cyBwYXJhbSBmb3Igcm93c1xyXG4gICAqIEBpc0V4Y2VsIHBhcmFtIGZvciBleHBvcnQgdG8gZXhjZWwgaW5kaWNhdGlvblxyXG4gICAqL1xyXG4gIHNldEV4cG9ydERhdGEocm93czogYW55W10gPSBbXSwgaXNQZGY6IGJvb2xlYW4gPSBmYWxzZSk6IElHcmlkRGF0YUV4cG9ydCB7XHJcbiAgICBjb25zdCBoZWFkaW5nczogYW55ID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZmllbGQpO1xyXG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgZm9yICh2YXIgcHJvcCBpbiByb3cpIHtcclxuICAgICAgICBpZiAoIWhlYWRpbmdzLmluY2x1ZGVzKHByb3ApKSB7XHJcbiAgICAgICAgICBkZWxldGUgcm93W3Byb3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNQZGYpIHtcclxuICAgICAgICAgIHJvd1twcm9wXSA9XHJcbiAgICAgICAgICAgICFyb3dbcHJvcF0gJiYgdHlwZW9mIHJvd1twcm9wXSAhPT0gJ2Jvb2xlYW4nXHJcbiAgICAgICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgICAgIDogcm93W3Byb3BdLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IHJvd3MsIGhlYWRpbmdzIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEV4cG9ydCB0byBFeGNlbFxyXG4gICAqL1xyXG4gIGV4cG9ydEV4Y2VsKCkge1xyXG4gICAgbGV0IGV4cG9ydERhdGE6IGFueSA9IHRoaXMuZXhwb3J0RGF0YVRvRXhjZWwoKTtcclxuICAgIGltcG9ydCgneGxzeCcpLnRoZW4oKHhsc3gpID0+IHtcclxuICAgICAgY29uc3Qgd29ya3NoZWV0OiBXb3JrU2hlZXQgPSB4bHN4LnV0aWxzLmpzb25fdG9fc2hlZXQoZXhwb3J0RGF0YSk7XHJcblxyXG4gICAgICBsZXQgcm93SW5kZXggPSAwO1xyXG4gICAgICBleHBvcnREYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbEluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlOiBzdHJpbmcgPSByb3dbY29sLmhlYWRlcl07XHJcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlICYmIGNlbGxWYWx1ZS5sZW5ndGggPiAwICYmIGNlbGxWYWx1ZS5pbmRleE9mKCd8JykgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmtUZXh0OiBzdHJpbmcgPSBjZWxsVmFsdWUuc3BsaXQoJ3wnKVswXTtcclxuICAgICAgICAgICAgbGV0IGxpbmtVcmw6IHN0cmluZyA9IGNlbGxWYWx1ZS5zcGxpdCgnfCcpWzFdO1xyXG4gICAgICAgICAgICBpZiAobGlua1VybCAmJiAhbGlua1VybC5zdGFydHNXaXRoKCdodHRwJykpIHtcclxuICAgICAgICAgICAgICBpZiAoIWxpbmtVcmwuc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5rVXJsID0gJy8nICsgbGlua1VybDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxpbmtVcmwgPVxyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICtcclxuICAgICAgICAgICAgICAgICcvLycgK1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICtcclxuICAgICAgICAgICAgICAgIGxpbmtVcmw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxBZGRyZXNzID0geGxzeC51dGlscy5lbmNvZGVfY2VsbCh7XHJcbiAgICAgICAgICAgICAgYzogY29sSW5kZXgsXHJcbiAgICAgICAgICAgICAgcjogcm93SW5kZXggKyAxLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHdvcmtzaGVldFtjZWxsQWRkcmVzc10gPSB7XHJcbiAgICAgICAgICAgICAgZjogYD1IWVBFUkxJTksoXCIke2xpbmtVcmx9XCIsIFwiJHtsaW5rVGV4dH1cIilgLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbEluZGV4Kys7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvd0luZGV4Kys7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB7XHJcbiAgICAgICAgU2hlZXRzOiB7IHNoZWV0MTogd29ya3NoZWV0IH0sXHJcbiAgICAgICAgU2hlZXROYW1lczogWydzaGVldDEnXSxcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgZXhjZWxCdWZmZXI6IGFueSA9IHhsc3gud3JpdGUod29ya2Jvb2ssIHtcclxuICAgICAgICBib29rVHlwZTogJ3hsc3gnLFxyXG4gICAgICAgIHR5cGU6ICdhcnJheScsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNhdmVBc0V4Y2VsRmlsZShleGNlbEJ1ZmZlciwgJ0V4cG9ydC54bHN4Jyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydERhdGFUb0V4Y2VsKCkge1xyXG4gICAgbGV0IGFycjogYW55ID0gW107XHJcbiAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRIZWFkZXIgPSBjb2x1bW4uaGVhZGVyO1xyXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxJTkspIHtcclxuICAgICAgICAgIGNvbnN0IGxpbmtPYmogPSByb3dbY29sdW1uLmRpc3BsYXlUZXh0Py50b0xvd2VyQ2FzZSgpICsgJ19vYmonXTtcclxuICAgICAgICAgIG9ialtncmlkSGVhZGVyXSA9IHJvd1tjb2x1bW4uZmllbGRdICsgJ3wnICsgbGlua09iaj8uaHlwZXJsaW5rO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYmpbZ3JpZEhlYWRlcl0gPSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgYXJyLnB1c2gob2JqKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFycjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogRXhwb3J0IHRvIGV4Y2VsIChzdWItbWV0aG9kKVxyXG4gICAqL1xyXG4gIHNhdmVBc0V4Y2VsRmlsZShidWZmZXI6IGFueSwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaW1wb3J0KCdmaWxlLXNhdmVyJykudGhlbigoRmlsZVNhdmVyKSA9PiB7XHJcbiAgICAgIGxldCBFWENFTF9UWVBFID1cclxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBFWENFTF9UWVBFIH0pO1xyXG4gICAgICBzYXZlQXMoZGF0YSwgZmlsZU5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKnNldCBjb25maWcgZGF0YSBvZiBsb29rdXAgY29udHJvbCBkaWFsb2dcclxuICAgKi9cclxuICBzZXRMb29rdXBEaWFsb2dDb25maWcocm93OiBhbnksIGNvbHVtbjogYW55LCBkYXRhOiBhbnkpIHtcclxuICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xyXG4gICAgaWYgKHJvd1tjb2x1bW4uZmllbGRdICYmIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5maWVsZF0udGV4dDtcclxuICAgIH0gZWxzZSBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCAmJiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0pIHtcclxuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbHVtbi5maWVsZCAmJiB0eXBlb2Ygcm93W2NvbHVtbi5maWVsZF0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IG5ld1JvdyA9IHsgLi4ucm93IH07XHJcbiAgICAgIG5ld1Jvd1tjb2x1bW4uZmllbGRdID0gbmV3Um93W2NvbHVtbi5maWVsZF0/LnZhbHVlO1xyXG4gICAgICByb3cgPSB7IC4uLm5ld1JvdyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxPT0tVUF9JTlBVVCAmJiBkYXRhKSB7XHJcbiAgICAgIGxldCBvYmogPSB1dGlsaXRpZXMuYXV0b1NldExvb2t1cERhdGEoZGF0YSwgcm93KTtcclxuICAgICAgcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddID0gb2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcm93RGF0YTogcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddLFxyXG4gICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcclxuICAgICAgY29sdW1uOiBjb2x1bW4sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBsaW5rIG9uIGxvb2t1cENvbnRyb2wgY29udHJvbCBpbiByZWFkIG9ubHkgbW9kZSB3aGVuIGVkaXRMaW5rIHNldCB0cnVlXHJcbiAgICovXHJcbiAgb3Blbkxvb2t1cEh5cGVybGluayhjb2x1bW46IElHcmlkQ29sdW1uLCByb3c6IGFueSkge1xyXG4gICAgaWYgKGNvbHVtbi5lZGl0TGluayA9PT0gdHJ1ZSAmJiBjb2x1bW4uY29tcG9uZW50KSB7XHJcbiAgICAgIGxldCBvYmo6IGFueSA9IHRoaXMuc2V0TG9va3VwRGlhbG9nQ29uZmlnKHJvdywgY29sdW1uLCBjb2x1bW4uZGF0YT8uZGF0YSk7XHJcbiAgICAgIG9ialsnY29tcG9uZW50J10gPSBjb2x1bW4uY29tcG9uZW50O1xyXG4gICAgICBjb25zdCByZWYgPSB0aGlzLm9wZW5Mb29rdXBEaWFsb2cob2JqKTtcclxuICAgICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIGNvbHVtbi5vblJldHVybikge1xyXG4gICAgICAgICAgY29sdW1uLm9uUmV0dXJuKHJlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG9wZW4gbG9va3VwIERpYWxvZ1xyXG4gICAqL1xyXG4gIG9wZW5Mb29rdXBEaWFsb2coY29sdW1uOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbHVtbkRhdGEgPSBjb2x1bW4uY29sdW1uPy5sb29rdXBDb250cm9sPy5kYXRhID8gIGNvbHVtbi5jb2x1bW4ubG9va3VwQ29udHJvbC5kYXRhIDogY29sdW1uLmNvbHVtbi5kYXRhXHJcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihjb2x1bW4uY29tcG9uZW50LCB7XHJcbiAgICAgIC4uLmNvbHVtbkRhdGEsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBzZWxlY3Rpb246IGNvbHVtbi5zZWxlY3Rpb24sXHJcbiAgICAgICAgZmllbGQ6IGNvbHVtbi5jb2x1bW4uZmllbGQsXHJcbiAgICAgICAgdmFsdWVGaWVsZDogY29sdW1uLmNvbHVtbi5sb29rdXBDb250cm9sPy5kYXRhPy52YWx1ZUZpZWxkLFxyXG4gICAgICAgIC4uLmNvbHVtbi5yb3dEYXRhLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29sdW1uLmNvbXBvbmVudD8ubmFtZTtcclxuICAgIGlmKGNvbXBvbmVudE5hbWUpe1xyXG4gICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyh0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSwgY29tcG9uZW50TmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxyXG4gICAqL1xyXG4gIHNlbGVjdExvb2t1cEZpZWxkKGNvbHVtbjogYW55LCByb3c/OiBhbnkpIHtcclxuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcclxuICAgIHRoaXMubG9va3VwT2JqZWN0ID0geyB0ZXh0OiAnJywgdmFsdWU6ICcnLCBmaWVsZDogJycgfTtcclxuICAgIGlmIChjb2x1bW4ubG9va3VwQ29udHJvbCkge1xyXG4gICAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLnNldExvb2t1cERpYWxvZ0NvbmZpZyhcclxuICAgICAgICByb3csXHJcbiAgICAgICAgY29sdW1uLFxyXG4gICAgICAgIGNvbHVtbi5sb29rdXBDb250cm9sLmRhdGE/LmRhdGFcclxuICAgICAgKTtcclxuICAgICAgb2JqWydjb21wb25lbnQnXSA9IGNvbHVtbi5sb29rdXBDb250cm9sLmNvbXBvbmVudDtcclxuICAgICAgY29uc3QgcmVmID0gdGhpcy5vcGVuTG9va3VwRGlhbG9nKG9iaik7XHJcbiAgICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZShcclxuICAgICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uLm9uUmV0dXJuKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbi5vblJldHVybihyZXMsIHJvdyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcclxuICAgICAgICAgICAgICBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgY29sdW1uLmxvb2t1cENvbnRyb2wsXHJcbiAgICAgICAgICAgICAgcmVzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNbY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXNbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCldLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy5sb29rdXBPYmplY3QgPSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHZhbHVlWydmaWVsZCddID0gY29sdW1uLmZpZWxkO1xyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gdmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByZXNbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0gIT09IG9iai5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcclxuICAgICAgICAgICAgaWYoY29sdW1uLm9uQ2hhbmdlKXtcclxuICAgICAgICAgICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKHsgZXJyb3IgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZpbHRlckxvb2t1cChjb2x1bW46IGFueSkge1xyXG4gICAgdGhpcy5ncmlkU2VydmljZS5zZXRMb29rVXBGaWx0ZXIoY29sdW1uLCB0aGlzLmRpYWxvZ1NlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgY2FsZW5kZXIgdmFsdWUgaXMgY2hhbmdlZCBvciBub3RcclxuICBjYWxlbmRlckNoYW5nZUV2ZW50KGNvbHVtbjogYW55LCByb3c6IGFueSkge1xyXG4gICAgbGV0IHZhbHVlQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIGNvbHVtbi50aW1lT25seSAmJlxyXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkXSwgJ2hoOm1tJykgIT09XHJcbiAgICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5jYWxlbmRlclByZXZpb3VzVmFsdWUsICdoaDptbScpXHJcbiAgICApIHtcclxuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgY29sdW1uLnNob3dUaW1lICYmXHJcbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHJvd1tjb2x1bW4uZmllbGRdLCAneXl5eS1NTS1kZCBoaDptbScpICE9PVxyXG4gICAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kZXJQcmV2aW91c1ZhbHVlLCAneXl5eS1NTS1kZCBoaDptbScpXHJcbiAgICApIHtcclxuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZF0sICd5eXl5LU1NLWRkJykgIT09XHJcbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kZXJQcmV2aW91c1ZhbHVlLCAneXl5eS1NTS1kZCcpXHJcbiAgICApIHtcclxuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYodmFsdWVDaGFuZ2Upe1xyXG4gICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xyXG4gICAgICBpZihjb2x1bW4ub25DaGFuZ2Upe1xyXG4gICAgICAgIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhbGVuZGVyUHJldmlvdXNWYWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgb25Gb2N1c091dEV2ZW50KGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdzogYW55KSB7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2NvbHVtbl0sIHJvdyk7XHJcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFKSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kZXJDaGFuZ2VFdmVudChjb2x1bW4sIHJvdyk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29sdW1uLm9uRm9jdXNPdXQpIHtcclxuICAgICAgY29sdW1uLm9uRm9jdXNPdXQocm93KTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGNvbHVtbi5vblJldHVybiAmJlxyXG4gICAgICBjb2x1bW4udHlwZSAhPT0gRUdyaWRDb2x1bW5UeXBlLkxPT0tVUF9JTlBVVFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbHVtbi5vblJldHVybihyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyRm9jdXNPdXQoY29sOiBhbnksIGZpbHRlcj86IGFueSwgZXZlbnQ/OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JpZEZpbHRlck9iaiA9IHsgY29sdW1uOiBjb2wsIGZpbHRlcjogZmlsdGVyLCBldmVudDogZXZlbnQgfTtcclxuICAgIGNvbnN0IG5ld0NvbHVtbjogYW55ID0geyAuLi5jb2wgfTtcclxuICAgIC8vY2hhbmdlIGZpbHRlciBjYWxlbmRlciBmb3JtYXRcclxuICAgIGlmIChuZXdDb2x1bW4udHlwZSA9PT0gJ2RhdGUnICYmIG5ld0NvbHVtbi52YWx1ZSkge1xyXG4gICAgICBuZXdDb2x1bW4udmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShcclxuICAgICAgICBjb2wudmFsdWUudG9TdHJpbmcoKS50cmltKCksXHJcbiAgICAgICAgJ3l5eXktTU0tZGQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPYmoobmV3Q29sdW1uKTtcclxuICAgICAgfSxcclxuICAgICAgbmV3Q29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgPyAyNTAgOiAwXHJcbiAgICApO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck9iaihjb2w6IGFueSkge1xyXG4gICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICBtYXRjaE1vZGU6IGNvbC5tYXRjaE1vZGUgPyBjb2wubWF0Y2hNb2RlIDogJ3N0YXJ0c1dpdGgnLFxyXG4gICAgICBvcGVyYXRvcjogY29sLm9wZXJhdG9yID8gY29sLm9wZXJhdG9yIDogJ2FuZCcsXHJcbiAgICAgIHRhYmxlQWxpYXM6IGNvbC50YWJsZUFsaWFzID8gY29sLnRhYmxlQWxpYXMgOiAnJyxcclxuICAgICAgdmFsdWU6IGNvbC52YWx1ZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5wdXNoKG9iaik7XHJcbiAgfVxyXG5cclxuICBhcHBseUVudGVyRXZlbnQoZmlsdGVyOiBhbnksIGV2ZW50OiBhbnksIGNvbHVtbjogYW55KSB7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSB0cnVlO1xyXG4gICAgdGhpcy5hdXRvTG9hZERhdGEgPSB0cnVlO1xyXG4gICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcclxuICAgIHRoaXMuZmlsdGVyT2JqKGNvbHVtbik7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XHJcbiAgICBpZiAoY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09IHRoaXMuZHJvcERvd25GaWx0ZXI/LmNvbHVtbj8uZmlsdGVyPy50eXBlKSB7XHJcbiAgICAgIHRoaXMuZHJvcERvd25GaWx0ZXIuZmlsdGVyKHRoaXMuZHJvcERvd25GaWx0ZXIuZXZlbnQudGFyZ2V0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlcihldmVudC50YXJnZXQudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTnVsbENhbGVuZGFyKGNvbHVtbjogSUdyaWRDb2x1bW4sIGZpbHRlcjogYW55LCBldmVudDogYW55KSB7XHJcbiAgICBpZiAoY29sdW1uLnZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcclxuICAgICAgdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYmFja3NwYWNlRXZlbnQoZXZlbnQ6IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIGlmIChcclxuICAgICAgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJlxyXG4gICAgICAoY29sdW1uLnZhbHVlPy50b1N0cmluZygpLmxlbmd0aCA9PT0gMSB8fFxyXG4gICAgICAgIGNvbHVtbi52YWx1ZT8udG9TdHJpbmcoKSA9PT0gJycgfHxcclxuICAgICAgICBjb2x1bW4udmFsdWUgPT09IG51bGwpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZW1vdmVOdWxsRmlsdGVycyhjb2x1bW4pO1xyXG4gICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRBVEUgJiYgY29sdW1uLnZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZU51bGxGaWx0ZXJzKGNvbHVtbjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkgJiYgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgYXJyID0gWy4uLnRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5XTtcclxuICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCgoaSkgPT4gaS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKTtcclxuICAgICAgYXJyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5ID0gYXJyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZpbmcgSGVhZGVyIEZpbHRlciBWYWx1ZSB1c2luZyBCYWNrc3BhY2Uga2V5IEV2ZW50IG9yIERlbGV0ZSBrZXkgRXZlbnQuXHJcbiAgcmVtb3ZpbmdGaWx0ZXJzKGV2ZW50OiBhbnksIGNvbHVtbjogSUdyaWRDb2x1bW4pIHtcclxuICAgIGlmIChcclxuICAgICAgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgfHwgZXZlbnQua2V5ID09PSAnRGVsZXRlJykgJiZcclxuICAgICAgY29sdW1uLnZhbHVlPy50b1N0cmluZygpLmxlbmd0aCA9PT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzZWFyY2hGaWx0ZXJzO1xyXG4gICAgICBpZighdGhpcy5zb2Z0Q2FjaGluZyl7XHJcbiAgICAgICAgc2VhcmNoRmlsdGVycyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCkpIGFzIGFueSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHNlYXJjaEZpbHRlcnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t1dGlsaXRpZXMuY3VycmVudFVybCgpXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VhcmNoRmlsdGVycyAmJiBzZWFyY2hGaWx0ZXJzLmZpbHRlcnMpIHtcclxuICAgICAgICBpZiAoc2VhcmNoRmlsdGVycy5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBpbmRleCA9IHNlYXJjaEZpbHRlcnMuZmlsdGVycy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICh4OiBhbnkpID0+IHguZmllbGQgPT09IGNvbHVtbi5maWVsZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaEZpbHRlcnMuZmlsdGVycy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU2V0RmlsdGVycy0nICsgdXRpbGl0aWVzLmN1cnJlbnRVcmwoKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgaWYoIXRoaXMuc29mdENhY2hpbmcpe1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCksSlNPTi5zdHJpbmdpZnkoc2VhcmNoRmlsdGVycykpO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3V0aWxpdGllcy5jdXJyZW50VXJsKCldID0gc2VhcmNoRmlsdGVycztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFkZCBDbGljayBCdXR0b24gRXZlbnQgb24gR3JpZC5cclxuICBvbkNsaWNrQnV0dG9uKGNvbHVtbjogYW55LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5vcGVuR3JpZERpYWxvZyhjb2x1bW4sIHJvdyk7XHJcbiAgfVxyXG5cclxuICAvLyBJbnZva2Ugb25DbGljayBFdmVudC5cclxuICBvbkNsaWNrRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XHJcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmIHJvd1tjb2x1bW4uZmllbGRdKSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kZXJQcmV2aW91c1ZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAhcm93W2NvbHVtbi5maWVsZF0gJiZcclxuICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmXHJcbiAgICAgIChjb2x1bW4uc2hvd1RpbWUgfHwgY29sdW1uLnRpbWVPbmx5KSAmJlxyXG4gICAgICBjb2x1bW4ubWludXRlc0ludGVydmFsXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5kZWZhdWx0RGF0ZSA9IG5ldyBEYXRlKHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwobmV3IERhdGUoKSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4ub25DbGljaykge1xyXG4gICAgICBjb2x1bW4ub25DbGljayhyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc2V0IHRoZSBzZWxlY3QgdmFsdWUgb2YgbXVsdGktc2VsZWN0XHJcbiAgc2hvd09wdGlvbihjb2x1bW4sIHJvdyl7XHJcbiAgICBpZihyb3dbY29sdW1uLmZpZWxkXSl7XHJcbiAgICAgIGlmKHR5cGVvZihyb3dbY29sdW1uLmZpZWxkXSkgPT09IFwic3RyaW5nXCIgJiYgIXJvd1tjb2x1bW4uZmllbGRdLmluY2x1ZGVzKCcsJykpe1xyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gW3Jvd1tjb2x1bW4uZmllbGRdXTtcclxuICAgICB9IGVsc2UgaWYocm93W2NvbHVtbi5maWVsZF0uaW5jbHVkZXMoJywnKSl7XHJcbiAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdLnNwbGl0KCcsJyk7XHJcbiAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhclZhbHVlKGNvbHVtbiwgcm93KXtcclxuICAgIGlmKGNvbHVtbj8udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRST1BET1dOICYmICFyb3dbY29sdW1uLmZpZWxkXSl7XHJcbiAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEludm9rZSBvbkNoYW5nZSBFdmVudFxyXG4gIG9uQ2hhbmdlRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XHJcbiAgICAvLyBzZXQgZHJvcGRvd24gZGlzcGxheUZpZWxkIHZhbHVlIGJhc2Ugb24gb3B0aW9uTGFiZWwgJiBvcHRpb25WYWx1ZS5cclxuICAgIHRoaXMuZGlzcGxheUZpZWxkRHJvcGRvd25WYWx1ZShjb2x1bW4sIHJvdyk7XHJcbiAgICB0aGlzLm9uQ2xlYXJWYWx1ZShjb2x1bW4sIHJvdyk7XHJcbiAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xyXG4gICAgaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xyXG4gICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrQm94Q2hhbmdlRXZlbnQoZXZlbnQ6YW55LGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdyl7XHJcbiAgICByb3dbY29sdW1uLmZpZWxkXSA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8gc2V0IGRyb3Bkb3duIGRpc3BsYXlGaWVsZCB2YWx1ZSBiYXNlIG9uIG9wdGlvbkxhYmVsICYgb3B0aW9uVmFsdWUuXHJcbiAgZGlzcGxheUZpZWxkRHJvcGRvd25WYWx1ZShjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcclxuICAgIGlmIChcclxuICAgICAgY29sdW1uPy50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiZcclxuICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCAmJlxyXG4gICAgICBjb2x1bW4uZGlzcGxheUZpZWxkPy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qga2V5OiBhbnkgPSBPYmplY3Qua2V5cyhyb3cpPy5maW5kKFxyXG4gICAgICAgIChyb3dJbmZvKSA9PlxyXG4gICAgICAgICAgcm93SW5mbz8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZFZhbHVlID0gY29sdW1uLmRhdGEuZmluZChcclxuICAgICAgICAocmVjb3JkOiBhbnkpID0+XHJcbiAgICAgICAgICByZWNvcmRbY29sdW1uLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSA9PT1cclxuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChrZXkgJiYgZGlzcGxheUZpZWxkVmFsdWUpIHtcclxuICAgICAgICByb3dba2V5XSA9IGRpc3BsYXlGaWVsZFZhbHVlW2NvbHVtbi5vcHRpb25MYWJlbF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFkZCBhdXRvU2VhcmNoIG9uIEdyaWQuXHJcbiAgYXV0b1NlYXJjaChldmVudDogYW55LCBjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcclxuICAgIGlmIChldmVudCAmJiBjb2x1bW4gJiYgcm93KSB7XHJcbiAgICAgIGNvbHVtbi5vblJldHVybihldmVudC5xdWVyeSwgY29sdW1uLCByb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZlIEZpbHRlclZhbHVlc1xyXG4gIGNsZWFyZ3JpZEZpbHRlcnNWYWx1ZSgpIHtcclxuICAgIGNvbnN0IGdsb2JhbEZpbHRlckNsZWFyVmFsdWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcclxuICAgICAgJ2NsZWFyR2xvYmFsRmlsdGVyQnRuJ1xyXG4gICAgKTtcclxuICAgIGlmIChnbG9iYWxGaWx0ZXJDbGVhclZhbHVlQnRuKSB7XHJcbiAgICAgIGdsb2JhbEZpbHRlckNsZWFyVmFsdWVCdG4uY2xpY2soKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1ucyAmJiB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICAgIGNvbC52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPYmooY29sKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlZGl0QWxsUm93c0F0T25jZSgpIHtcclxuICAgIGlmKHRoaXMuZWRpdFJvd1Blcm1pc3Npb24pe1xyXG4gICAgaWYgKHRoaXMuZ2V0Q2xhc3NGb3JFZGl0QWxsUm93cygnZWRpdFJvdycpKSB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnNvbWUoKGNvbHVtbik9PiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4gJiYgKGNvbHVtbi5maWx0ZXJpbmcgPT09IHRydWUgfHwgY29sdW1uLmZpbHRlcmluZyA9PT0gdW5kZWZpbmVkKSkpe1xyXG4gICAgICAgIHRoaXMuZWRpdEFsbFJlY29yZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oaWRlRWRpdEFsbFJvd3NCdG4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zb3J0RGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB9XHJcblxyXG4gIHNhdmVBbGxSb3dzQXRPbmNlKCkge1xyXG4gICAgdGhpcy5nZXRDbGFzc0ZvckVkaXRBbGxSb3dzKCdzYXZlUm93Jyk7XHJcbiAgfVxyXG5cclxuICAvLyByZXNldCB0aGUgZ3JpZCByb3dzVmFsdWUgdG8gb3JpZ25hbCB2YWx1ZXNcclxuICBjYW5jZWxBbGxSb3dzQXRPbmNlKCkge1xyXG4gICAgdGhpcy5yb3dzRGF0YSA9IFsuLi50aGlzLnJvd3NEYXRhQ29weV07XHJcbiAgICB0aGlzLnJvd3NEYXRhQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzRGF0YSkpO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnM/LmZvckVhY2goKGNvbHVtbik9PntcclxuICAgICAgaWYoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFKXtcclxuICAgICAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpPT57XHJcbiAgICAgICAgICBpZihyb3dbY29sdW1uLmZpZWxkXSl7XHJcbiAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPSBuZXcgRGF0ZShyb3dbY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkNhbmNlbEFsbFJvd3MuZW1pdCh0aGlzLnJvd3NEYXRhKTtcclxuICB9XHJcblxyXG4gIGdldENsYXNzRm9yRWRpdEFsbFJvd3MoY2xhc3NOYW1lOiBzdHJpbmcgPSAnJykge1xyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IGdldEJ0bnM6IGFueSA9XHJcbiAgICAgIHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgaWYgKGdldEJ0bnMgJiYgZ2V0QnRucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICBpZiAoY2xhc3NOYW1lID09PSAnc2F2ZVJvdycpIHtcclxuICAgICAgICB0aGlzLmVkaXRBbGxSZWNvcmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IHJlY29yZHMkID0gW107XHJcbiAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBnZXRCdG5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd1NhdmUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlY29yZHMkLnB1c2gocm93U2F2ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChyZWNvcmRzJCkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBQUFBXCIpO1xyXG4gICAgICAgICAgICB0aGlzLm9uUm93VXBkYXRlLmVtaXQodGhpcy5zYXZlUmVjb3JkQXJyYXkpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVSZWNvcmRBcnJheSA9IFtdO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwyMClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGdldEJ0bnMpIHtcclxuICAgICAgICAgIGlmKGNsYXNzTmFtZSA9PSAnY2FuY2VsUm93Jyl7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGl0ZW0uY2xpY2soKTtcclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGl0ZW0uY2xpY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgLy9Gb2N1c2VkIGNhbGVuZGVyIGlucHV0IG9uIHNlbGVjdCBkYXRlXHJcbiAgc2VsZWN0RGF0ZShjb2x1bW46IGFueSkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29sdW1uLmZpZWxkKT8uZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIC8vYXBwbHkgZmlsdGVyIG9uIGdyaWQgd2hlbiBzZWFyY2ggYnRuIGNsaWNrZWRcclxuICBhcHBseUdpcmRGaWx0ZXJCdG4oKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkRmlsdGVyT2JqICYmIE9iamVjdC5rZXlzKHRoaXMuZ3JpZEZpbHRlck9iaikubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmFwcGx5RW50ZXJFdmVudChcclxuICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouZmlsdGVyLFxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlck9iai5ldmVudCxcclxuICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouY29sdW1uXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBpbnZva2UgbXVsdGlTZWxlY3Rpb24gY2xpY2sgZXZlbnRcclxuICBtdWx0aUNoZWNrQm94T25jbGljayhyb3dJbmZvOiBhbnkpIHtcclxuICAgIGlmIChyb3dJbmZvKSB7XHJcbiAgICAgIHRoaXMub25NdWx0aVNlbGVjdGlvbkNoYW5nZS5lbWl0KHJvd0luZm8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXI6IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgZmlsdGVyKGV2ZW50LnRhcmdldCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hEcm9wZG93bkZpbHRlcihmaWx0ZXI6IGFueSwgZXZlbnQ6IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uLCBmaWx0ZXIsIGV2ZW50KTtcclxuICAgIHRoaXMuZHJvcERvd25GaWx0ZXIgPSB7IGZpbHRlcjogZmlsdGVyLCBldmVudDogZXZlbnQsIGNvbHVtbjogY29sdW1uIH07XHJcbiAgICBpZiAoY29sdW1uLmFsbG93U2VhcmNoICE9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXIsIGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvb2t1cENsZWFyVmFsdWUoY29sdW1uOiBhbnksIHJvdz86IGFueSkge1xyXG4gICAgaWYgKHJvdykge1xyXG4gICAgICByb3dbY29sdW1uLmZpZWxkXSA9ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29sdW1uLnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcclxuICAgIH1cclxuICAgIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XHJcbiAgICBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XHJcbiAgICAgIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gaW52b2tlIHdoZW4gY2xpY2sgaGVhZGVyIGNoZWNrYm94IGZpbHRlclxyXG4gIGNsaWNrQ2hlY2tCb3hGaWx0ZXIoY29sdW1uOiBJR3JpZENvbHVtbikge1xyXG4gICAgaWYgKHRoaXMuZWRpdEFsbFJlY29yZCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQk9PTEVBTiBcclxuICAgICAgICAgICYmXHJcbiAgICAgICAgICBjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NoZWNrYm94JyAmJiBjb2x1bW4uZmlsdGVyaW5nICE9IGZhbHNlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi52YWx1ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy90aGlzLm9uQ2hlY2tCb3hGaWx0ZXJDbGljay5lbWl0KGNvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5vbkNoZWNrQm94RmlsdGVyQ2xpY2suZW1pdChjb2x1bW4pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkNoZWNrQm94RmlsdGVyQ2xpY2suZW1pdChjb2x1bW4pO1xyXG4gIH1cclxuICAgIC8vc2V0IGhlYWRlciBjaGVja2JveCB2YWx1ZSBmb3IgZ2V0dGluZyBhbGwgY29sdW1ucyBvbiBzdGF5IGFkbWluXHJcbiAgICBzZXRIZWFkZXJDaGVja0JveFZhbHVlKHZhbHVlOiBhbnkpe1xyXG4gICAgICB0aGlzLmlzSW5jbHVkZWRBbGxDb2x1bW5zLmVtaXQodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgLy8gc2V0IGNhbGVuZGVyIDIgT3IgNCBkaWdpdCB5ZWFyIGZvcm1hdFxyXG4gIGNhbGVuZGVySW5wdXRWYWx1ZShjb2x1bW46IGFueSwgcm93OiBhbnkpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjb2x1bW4uZmllbGQgKyByb3dbdGhpcy5kYXRhS2V5XSlbMF0/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKHZhbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XHJcbiAgICAgIGlmKCB5ZWFyICYmIHllYXIubGVuZ3RoID09PSA0KXtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0PSAnbW0vZGQveXknO1xyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbmV3IERhdGUodmFsPy50YXJnZXQ/LnZhbHVlKT8udG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XHJcbiAgICAgIH0gZWxzZSBpZih5ZWFyICYmIHllYXIubGVuZ3RoKXtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19
|
|
2219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUVqQixRQUFRLEVBQ1IsVUFBVSxFQUNWLFlBQVksRUFHWixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixhQUFhLEdBQ2QsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQVNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2Ysa0JBQWtCLEVBRWxCLGNBQWMsRUFFZCxlQUFlLEdBRWhCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEtBQUssU0FBUyxNQUFNLHFD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QUcxQixtQkFBbUIsdUJBMFpoQixRQUFRO1lBM1pYLGdCQUFnQix1QkE0WmIsUUFBUTs7O3NCQWpYVixZQUFZLFNBQUMsU0FBUzs4QkFDdEIsTUFBTTs2QkFDTixLQUFLO29CQTBETCxTQUFTLFNBQUMsSUFBSTsyQkFHZCxLQUFLOzhCQUVMLEtBQUs7K0JBVUwsS0FBSztzQkFHTCxLQUFLOzJCQUdMLEtBQUs7NkJBR0wsS0FBSzttQ0FHTCxLQUFLOzhCQUdMLEtBQUs7K0JBR0wsS0FBSztpQ0FHTCxLQUFLO3FDQUdMLEtBQUs7NEJBR0wsS0FBSzt5QkFHTCxLQUFLOzRCQUdMLEtBQUs7c0JBR0wsS0FBSzs4QkFHTCxLQUFLOytCQUdMLEtBQUs7eUJBR0wsS0FBSzsyQkFHTCxLQUFLO3VCQUdMLEtBQUs7eUJBRUwsS0FBSzt3QkFFTCxLQUFLO3VCQUVMLEtBQUs7Z0NBRUwsS0FBSztrQ0FHTCxLQUFLO3lCQUdMLE1BQU07bUJBT04sS0FBSzsrQkF1Q0wsS0FBSztzQkEwRUwsS0FBSzswQkFFTCxLQUFLO2dDQUdMLEtBQUs7eUJBR0wsS0FBSzs0QkFHTCxLQUFLO3lCQUdMLEtBQUs7b0NBR0wsS0FBSzsyQkFHTCxLQUFLO2dDQUVMLEtBQUs7MEJBR0wsS0FBSzs0QkFFTCxLQUFLO2tDQUdMLEtBQUs7eUJBR0wsTUFBTTtvQ0FHTixNQUFNOzRCQUdOLE1BQU07MkJBR04sTUFBTTs2QkFHTixNQUFNO3FDQUdOLE1BQU07NEJBR04sTUFBTTttQ0FHTixNQUFNO3NDQUdOLE1BQU07MkJBS04sTUFBTTswQkFJTixNQUFNOzhCQUdOLE1BQU07MEJBR04sTUFBTTt1QkFHTixNQUFNOytCQUdOLE1BQU07MkJBR04sS0FBSzswQkFHTCxLQUFLOzBCQUVMLEtBQUs7NEJBR0wsTUFBTTsyQkFHTixNQUFNO2tDQTZCTixZQUFZLFNBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBPbkNoYW5nZXMsXHJcbiAgT3B0aW9uYWwsXHJcbiAgRWxlbWVudFJlZixcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHtcclxuICBEeW5hbWljRGlhbG9nUmVmLFxyXG4gIER5bmFtaWNEaWFsb2dDb25maWcsXHJcbiAgRGlhbG9nU2VydmljZSxcclxufSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcclxuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIElHcmlkQ29sdW1uLFxyXG4gIElHcmlkU29ydCxcclxuICBJR3JpZFNlcnZlclNpZGVFdmVudCxcclxuICBJR3JpZFBhZ2luYXRpb25FdmVudCxcclxuICBJR2xvYmFsRmlsdGVyLFxyXG4gIElHcmlkRmlsdGVyLFxyXG4gIElHcmlkQ29sdW1uQWN0aW9uLFxyXG4gIElHcmlkUm93QWN0aW9uLFxyXG4gIEVHcmlkU2VsZWN0aW9uVHlwZSxcclxuICBFR3JpZENvbHVtblR5cGUsXHJcbiAgRUdyaWRTb3J0RGlyZWN0aW9uLFxyXG4gIElHcmlkRGF0YUV4cG9ydCxcclxuICBFR3JpZEFnZ3JlZ2F0ZSxcclxuICBJTG9va3VwVmFsdWUsXHJcbiAgRUdyaWRGb3JtYXRUeXBlLFxyXG4gIElHcmlkRmlsdGVySW5mbyxcclxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XHJcbmltcG9ydCB7IEVQZXJtaXNzaW9uVHlwZSwgSVBlcm1pc3Npb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdXNlci1pbmZvLm1vZGVsJztcclxuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aGVudGljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJZnJhbWVDb21wb25lbnQgfSBmcm9tICcuLi9pZnJhbWUvaWZyYW1lLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFdvcmtTaGVldCB9IGZyb20gJ3hsc3gnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSwgRGVjaW1hbFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgKiBhcyB1dGlsaXRpZXMgZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBFRm9ybWF0VHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2UtZ3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dyaWQuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQFZpZXdDaGlsZHJlbignZ3JpZFJvdycpIGdyaWRSb3c6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuICBAT3V0cHV0KCkgaW5saW5lUm93Q2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBJbnB1dCgpIHNldCBhY3RpdmVUZXN0TW9kZSh2YWw6IGFueSkge1xyXG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICBkZWJ1Z2dlcjtcclxuICAgIH1cclxuICB9XHJcbiAgc2VydmVyRmlsdGVyczogSUdyaWRTZXJ2ZXJTaWRlRXZlbnQgPSB7fTtcclxuICByb3dzRGF0YTogYW55W107XHJcbiAgcm93c0RhdGFDb3B5OiBhbnlbXSA9IFtdO1xyXG4gIHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGlzQ29sdW1uSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcm93Q2xpY2tEYXRhOiBJR3JpZENvbHVtbjtcclxuICBjb21wb25lbnRUYWJsZVJlZjogYW55O1xyXG4gIGxvb2t1cE9iamVjdDogSUxvb2t1cFZhbHVlO1xyXG4gIGxvb2t1cEZpbHRlck9iajogYW55O1xyXG4gIGxvb2t1cEJsdXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGdsb2JhbEZpbHRlcnNBcnJheTogYW55W10gPSBbXTtcclxuICBjaGVja0FjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNhbGVuZGVyUHJldmlvdXNWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgZ3JpZEZpbHRlck9iajogSUdyaWRGaWx0ZXJJbmZvO1xyXG4gIGRlZmF1bHREYXRlOiBhbnk7XHJcbiAgZHJvcERvd25GaWx0ZXI6IGFueSA9IHt9O1xyXG4gIGRyb3Bkb3duSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzYXZlQWxsUmVjb3JkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZWRpdEFsbFJlY29yZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNhbmNlbEFsbFJlY29yZHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhZGROZXdSb3dDaGVjazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzYXZlUmVjb3JkQXJyYXk6IGFueVtdID0gW107XHJcbiAgZGlzYWJsZWRTYXZlQnRuOmJvb2xlYW4gPSBmYWxzZTtcclxuICBzZXREaWFsb2dEYXRhOmJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBlZGl0TW9kZUNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVkaXRNb2RldW5Da2Vja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95JztcclxuICBzZXREcm9wZG93bkZpbHRlcjpib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gYXBwbHkgY2hlY2tlZC91bkNoZWNrZWQgcHJvcCBmb3IgQ2hlY2tCb3ggb2YgdGhlIFRhYmxlXHJcbiAgY2hlY2tlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgdW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGlkZUVkaXRBbGxSb3dzQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy9hcHBseSBBZGQvRGVsZXRlL0VkaXQgcHJvcCBmb3IgdGhlIGdyaWQgcGVybWlzc2lvblxyXG4gIGFkZFJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGRlbGV0ZVJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVkaXRSb3dQZXJtaXNzaW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gQXBwbHkgcHJvcCBzZXRBZ2dyZWdhdGVGb290ZXIgb24gRm9vdGVyIG9mIHRoZSBUYWJsZSBmb3IgYWdncmVnYXRlLlxyXG4gIHNldEFnZ3JlZ2F0ZUZvb3Rlcjogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBIaWRlIEFnZ3JlZ2F0ZSBGb290ZXIgV2hlbiBBZ2dyZWdhdGUgbm90IEFwcGx5IG9uIFRhYmxlLlxyXG4gIGFnZ3JlZ2F0ZUZvb3RlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBNYWludGFpbnMgcHJldmlvdXMgc3RhdGUgb2Ygcm93cyBiZWluZyBlZGl0ZWRcclxuICBlZGl0Um93c1JlY29yZHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHJcbiAgLy8gTWFpbnRhaW5zIHJlY29yZCBvZiByb3dzIGJlaW5nIGVkaXRlZFxyXG4gIGVkaXRpbmdSb3dLZXlzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGU6IFRhYmxlO1xyXG5cclxuICAvLyBTZWxlY3RzIGl0ZW1zIGluIHRoZSBncmlkIGJhc2VkIG9uIHBhc3NlZCBvbiBkYXRhXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSb3dzOiBhbnkgPSBbXTtcclxuXHJcbiAgQElucHV0KCkgYWRkRGF0YUtleVZhbHVlID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZ2xvYmFsRGF0YTogSUdyaWRGaWx0ZXJbXSA9IFtdO1xyXG5cclxuICBzb3J0RGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gU3RvcmVzIHNlbGVjdGVkIGNvbHVtbnNcclxuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IGhvcml6b250YWwgU2Nyb2xsIG9uIFRhYmxlLlxyXG4gIEBJbnB1dCgpIGhvcml6b250YWxTY3JvbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gUHJvcCB0byBoYW5kbGUgbG9hZGVyIG9mIGdyaWRcclxuICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAvL3RoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBoYW5kbGUgc2VydmVyIHNpZGUgZXZlbnQgYnkgZGVmYXVsdCBpdCBpcyB0cnVlIHdoZW4gaXQgZmFsc2Ugc2VydmVyIHNpZGUgZXZlbnQgd2lsbCBub3QgYmUgY2FsbGVkXHJcbiAgQElucHV0KCkgYXV0b0xvYWREYXRhOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGNoZWNrIHdoZXJlIHNlbGVjdGVkIGlzIGFsbG93ZWQgb3Igbm90LlxyXG4gIEBJbnB1dCgpIGFsbG93U2VsZWN0aW9uID0gZmFsc2U7XHJcblxyXG4gIC8vIFNldCBjb2x1bW4gd2lkdGggb2Ygc2VsZWN0ZWQgcm93LlxyXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkNvbHVtbldpZHRoOiBzdHJpbmcgPSAnODBweCc7XHJcbiAgXHJcbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGhpZGUgdGhlIGFkZCByb3cgYnV0dG9uLlxyXG4gIEBJbnB1dCgpIGhpZGVPblJvd0FkZEJ0biA9IGZhbHNlO1xyXG5cclxuICAvLyBCb29sZWFuIHByb3AgdG8gYWxsb3cgZXhwb3J0IHRvIHBkZi5cclxuICBASW5wdXQoKSBhbGxvd0V4cG9ydFRvUGRmID0gZmFsc2U7XHJcblxyXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBleHBvcnQgdG8gZXhjZWwuXHJcbiAgQElucHV0KCkgYWxsb3dFeHBvcnRUb0V4Y2VsID0gZmFsc2U7XHJcbiAgXHJcbiAgLy8gQm9vbGVhbiBwcm9wIHRvIHNldCB0aGUgYWN0aW9uIGNvbHVtbiBhcyBmaXJzdCBjb2x1bW4uXHJcbiAgQElucHV0KCkgc2V0QWN0aW9uQ29sdW1uQXNGaXJzdCA9IGZhbHNlO1xyXG5cclxuICAvLyBJZiB0cnVlLCBlbmFibGVzIG9wdGlvbnMgdG8gcGVyZm9ybSBDUlVEIHVzaW5nIGlubGluZSByb3cgZnVuY3Rpb25hbGl0eVxyXG4gIEBJbnB1dCgpIHVzZUlubGluZUNSVUQgPSBmYWxzZTtcclxuXHJcbiAgLy8gQXJyYXkgb2Ygcm93IGFjdGlvbnNcclxuICBASW5wdXQoKSByb3dBY3Rpb25zOiBJR3JpZFJvd0FjdGlvbltdID0gW107XHJcblxyXG4gIC8vIFNldHMgc2VsZWN0aW9uIHR5cGUgaS5lOiBzaW5nbGUvbXVsdGlwbGUgc2VsZWN0aW9uXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZTogRUdyaWRTZWxlY3Rpb25UeXBlID0gRUdyaWRTZWxlY3Rpb25UeXBlLlNJTkdMRTtcclxuXHJcbiAgLy8gVW5pcXVlIGtleSByZXF1aXJlcyBmb3IgYnVpbHQtaW4gcm93IHNlbGVjdGlvbiBvZiBwcmltZU5nIGdyaWRcclxuICBASW5wdXQoKSBkYXRhS2V5OiBzdHJpbmcgPSAnaWQnO1xyXG5cclxuICAvLyBGbGFnIGZvciBjbGVhciBmaWx0ZXIgdmFsdWVzIGJ1dHRvblxyXG4gIEBJbnB1dCgpIGNsZWFyR3JpZEZpbHRlciA9IHRydWU7XHJcblxyXG4gIC8vIEZsYWcgZm9yIHNlYXJjaCBmaWx0ZXIgdmFsdWVzIGJ1dHRvblxyXG4gIEBJbnB1dCgpIHNlYXJjaEdyaWRGaWx0ZXIgPSB0cnVlO1xyXG5cclxuICAvLyBGbGFnIGluIGNhc2UgdGFibGUgaXMgc2Nyb2xsYWJsZVxyXG4gIEBJbnB1dCgpIHNjcm9sbGFibGUgPSB0cnVlO1xyXG5cclxuICAvLyBTZXRzIHNjcm9sbCBoZWlnaHQgZm9yIHRoZSB0YWJsZVxyXG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodCA9ICc2ODBweCc7XHJcblxyXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyB0byB3cmFwIG9yIHVuV3JhcCB0aGUgZ3JpZC5cclxuICBASW5wdXQoKSB3b3JkV3JhcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBuZXdHcmlkUm93OiBhbnkgPSB7fTtcclxuXHJcbiAgQElucHV0KCkgZmlsdGVyaW5nID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgcm93SG92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgaGlkZUZpbHRlck9wdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gU2V0cyBwYWdlbmF0aW9uIGZvciB0aGUgdGFibGUgRGF0YS5cclxuICBASW5wdXQoKSBzZXRQYWdpbmF0aW9uTGVuZ3RoOiBhbnlbXSA9IFs1LCAxMCwgMTUsIHsgc2hvd0FsbDogJ0FsbCcgfV07XHJcblxyXG4gIC8vIHNldCB0aGUgY2hhbmdlIGluIHRoZSByb3dEYXRhXHJcbiAgQE91dHB1dCgpIHJvd3NDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBTdG9wcyB0aGUgbG9hZGVyIGFuZCBzZXRzIHRoZSBkYXRhIHRvIGdyaWRcclxuICAgKiBDbGVhcnMgdGhlIGVkaXRpbmcgc3RhY2tcclxuICAgKiBTY3JvbGxzIHRvIHNlbGVjdGVkIGVsZW1lbnQgaWYgc2VsZWN0aW9uIGZvdW5kXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IHJvd3MoZGF0YTogYW55W10pIHtcclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICghdGhpcy5kYXRhS2V5KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhS2V5ID0gJ2lkJztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJvd3NEYXRhID0gdGhpcy5ncmlkU2VydmljZS5zZXREYXRhRmllbGRzKGRhdGEsIHRoaXMuZGF0YUtleSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJvd3NEYXRhID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYW5pbmcgdGhlIGVkaXRpbmcgc3RhY2tcclxuICAgIHRoaXMuZWRpdGluZ1Jvd0tleXMgPSB7fTtcclxuICAgIHRoaXMuZWRpdFJvd3NSZWNvcmRzID0ge307XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkUm93cykge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudFJlZiA9IHRoaXMuZ3JpZFJvdy5maW5kKFxyXG4gICAgICAgICAgKHgpID0+IHgubmF0aXZlRWxlbWVudC5pZCA9PT0gdGhpcy5zZWxlY3RlZFJvd3NbdGhpcy5kYXRhS2V5XVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50UmVmICYmXHJcbiAgICAgICAgICAoXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRcclxuICAgICAgICAgICkuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRST1BET1dOKSB7XHJcbiAgICAgICAgICB0aGlzLnNldERyb3Bkb3duVmFsdWUoY29sdW1uLCB7fSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL21hbmlwdWxhdGUgY2hlY2tib3ggc3RyaW5nIHZhbHVlIHRvIHRydWUgYW5kIGZhbHNlLlxyXG4gICAgdGhpcy5jaGFuZ2VDaGVja2JveFN0cmluZ1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHbG9iYWwgZmlsdGVyIHNlcnZlciByZXF1ZXN0XHJcbiAgQElucHV0KCkgc2V0IGdsb2JhbEZpbHRlckRhdGEoZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcltdKSB7XHJcbiAgICB0aGlzLmdsb2JhbERhdGEgPSB0aGlzLmdyaWRTZXJ2aWNlXHJcbiAgICAgIC5wcmVwYXJlR2xvYmFsRmlsdGVycyhnbG9iYWxGaWx0ZXJzKVxyXG4gICAgICA/LmZpbHRlcigoeCkgPT4geD8udmFsdWUgIT09IGZhbHNlKTtcclxuICAgIGNvbnN0IHNlcnZlckZpbHRlclZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2ZXJGaWx0ZXJzKSk7XHJcbiAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycyA9IHRoaXMuc2VydmVyRmlsdGVycy5maWx0ZXJzXHJcbiAgICAgID8gdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMuY29uY2F0KHRoaXMuZ2xvYmFsRGF0YSlcclxuICAgICAgOiB0aGlzLmdsb2JhbERhdGE7XHJcblxyXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhcHBseUZpbHRlcicpID09PSAnZmFsc2UnKSB7XHJcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5ID0gdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXk/Lmxlbmd0aCA+IDBcclxuICAgICAgICA/IHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5LmNvbmNhdChbLi4uc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnNdKVxyXG4gICAgICAgIDogdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FwcGx5RmlsdGVyJykgPT09ICd0cnVlJykge1xyXG4gICAgICBnbG9iYWxGaWx0ZXJzLmZvckVhY2goKGdsb2JhbEZpbHRlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5LmZvckVhY2goKGZpbHRlckFycmF5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGZpbHRlckFycmF5LmZpZWxkID09PSBnbG9iYWxGaWx0ZXIuZmllbGQgJiZcclxuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlICYmXHJcbiAgICAgICAgICAgIGZpbHRlckFycmF5LnZhbHVlICE9PSBnbG9iYWxGaWx0ZXIudmFsdWVcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBmaWx0ZXJBcnJheS52YWx1ZSA9IGdsb2JhbEZpbHRlci52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5LmZpbmRJbmRleChcclxuICAgICAgICAgICAgKGluZGV4KSA9PiBpbmRleC5maWVsZCA9PT0gZ2xvYmFsRmlsdGVyLmZpZWxkICYmICFnbG9iYWxGaWx0ZXIudmFsdWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoZmluZEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5zcGxpY2UoZmluZEluZGV4LCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0aGlzLmF1dG9Mb2FkRGF0YTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50IHx8IHRoaXMuYXV0b0xvYWREYXRhKXtcclxuICAgICAgICAgIHRoaXMub25BcHBseUZpbHRlci5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSAmJiB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycyA9IHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzLmNvbmNhdChcclxuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gQXJyYXkuZnJvbShcclxuICAgICAgICAgIG5ldyBTZXQoXHJcbiAgICAgICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzXHJcbiAgICAgICAgICAgICAgLnJldmVyc2UoKVxyXG4gICAgICAgICAgICAgIC5tYXAoKGZpbHRlcjogYW55KSA9PiBmaWx0ZXIuZmllbGQpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKS5tYXAoKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuZmluZCgoeDogYW55KSA9PiB4LmZpZWxkID09PSBmaWVsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMgPSBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycy5maWx0ZXIoXHJcbiAgICAgICAgICAob2JqOiBhbnkpID0+XHJcbiAgICAgICAgICAgIG9iaj8udmFsdWUgJiYgb2JqLnZhbHVlPy50b1N0cmluZygpPy5sZW5ndGggPiAwICYmIG9iai5maWVsZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCB8fCB0aGlzLmF1dG9Mb2FkRGF0YSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgLy8gc2V0dGluZyBwYWdpbmF0aW9uIHBhZ2UgYXMgZmlyc3RcclxuICAgICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5wYWdlID0gMTtcclxuICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdFJvd3MgJiYgdGhpcy5wYWdpbmF0aW9uKXsgXHJcbiAgICAgICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5wYWdlU2l6ZSA9IHRoaXMuZGVmYXVsdFJvd3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgIGlmKHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCl7XHJcbiAgICAgICAgICB0aGlzLm9uU2VydmVyU2lkZUV2ZW50Q2hhbmdlLmVtaXQoc2VydmVyRmlsdGVyVmFsdWVzKVxyXG4gICAgICAgICB9XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYXBwbHlGaWx0ZXInKTtcclxuICAgICAgICAgIC8vIHNldHRpbmcgcGFnaW5hdGlvbiBwYWdlIG51bWJlciBVSVxyXG4gICAgICAgICAgdGhpcy50YWJsZS5fZmlyc3QgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMzAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIElucHV0IGRlY29yYXRvciB0byByZWNlaXZlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIGhlYWRlclxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgcGVybWlzc2lvbnM6IElQZXJtaXNzaW9uW10gPSBbXTtcclxuXHJcbiAgLy8gT3B0aW9uYWwgcHJvcCB0byBoYW5kbGUgdG9nZ2xpbmcgb2YgY29sdW1uc1xyXG4gIEBJbnB1dCgpIGFsbG93Q29sdW1uVG9nZ2xlID0gZmFsc2U7XHJcblxyXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGlkZSBmaWx0ZXJpbmcgb2YgY29sdW1uc1xyXG4gIEBJbnB1dCgpIGhpZGVGaWx0ZXIgPSBmYWxzZTtcclxuXHJcbiAgLy8gT3B0aW9uYWwgcHJvcCB0byBoYW5kbGUgbG9va3VwIGZpbHRlcnNcclxuICBASW5wdXQoKSBsb29rdXBGaWx0ZXJzID0gZmFsc2U7XHJcblxyXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGFuZGxlIHBhZ2luYXRpb25cclxuICBASW5wdXQoKSBwYWdpbmF0aW9uID0gZmFsc2U7XHJcblxyXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGFuZGxlIHNob3cgQ3VycmVudFBhZ2UgUmVwb3J0XHJcbiAgQElucHV0KCkgc2hvd0N1cnJlbnRQYWdlUmVwb3J0ID0gZmFsc2U7XHJcblxyXG4gIC8vIERpc3BsYXlzIHRvdGFsIG51bWJlciBvZiByZWNvcmRzXHJcbiAgQElucHV0KCkgdG90YWxSZWNvcmRzID0gMDtcclxuXHJcbiAgQElucHV0KCkgc2hvd2NvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyBTZXRzIG51bWJlciBvZiByb3dzIHRvIGJlIHNob3duIHRoZSBncmlkXHJcbiAgQElucHV0KCkgZGVmYXVsdFJvd3M6IG51bWJlcjtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uQWN0aW9uczogSUdyaWRDb2x1bW5BY3Rpb25bXSA9IFtdO1xyXG5cclxuICAvLyBEZWNpZGVzIHRoZSBncmlkJ3MgYmVoYXZpb3IgZWl0aGVyIGZvciBjbGllbnQgc2lkZSBvciBzZXJ2ZXIgc2lkZSBldmVudHNcclxuICBASW5wdXQoKSB1c2VTZXJ2ZXJTaWRlRXZlbnRzID0gZmFsc2U7XHJcblxyXG4gIC8vIE91dHB1dCBldmVudCB0byBoYW5kbGUgcm93IGNsaWNrXHJcbiAgQE91dHB1dCgpIG9uUm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBPdXRwdXQgZXZlbnQgZW1pdCB3aGVuIGNsaWNrIG9uIGdyaWQgY2hlY2tib3ggZmlsdGVyXHJcbiAgQE91dHB1dCgpIG9uQ2hlY2tCb3hGaWx0ZXJDbGljazogRXZlbnRFbWl0dGVyPGFueT49IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gT3V0cHV0IGV2ZW50IHRvIGhhbmRsZSByb3cgQ2hlY2tCb3hcclxuICBAT3V0cHV0KCkgb25Sb3dDaGVja0JveDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIE91dHB1dCBldmVudCB0byB0cmlnZ2VyIG9uIHNvcnQgY2hhbmdlXHJcbiAgQE91dHB1dCgpIG9uU29ydENoYW5nZTogRXZlbnRFbWl0dGVyPElHcmlkU29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIE91dHB1dCBldmVudCB0byB0cmlnZ2VyIG9uIGZpbHRlciBjaGFuZ2VcclxuICBAT3V0cHV0KCkgb25GaWx0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBPdXRwdXQgZXZlbnQgdG8gaW52b2tlIHRoZSBtdWx0aVNlbGVjdGlvbiBjbGljayBldmVudFxyXG4gIEBPdXRwdXQoKSBvbk11bHRpU2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gQ2FsbHMgd2hlbmV2ZXIgYSBncmlkIGFuZCBnbG9iYWxGaWx0ZXJzIGNhbGxlZFxyXG4gIEBPdXRwdXQoKSBvbkFwcGx5RmlsdGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy9zZXQgaGVhZGVyIGNoZWNrYm94IHZhbHVlIGZvciBnZXR0aW5nIGFsbCBjb2x1bW5zIG9uIHN0YXkgYWRtaW5cclxuICBAT3V0cHV0KCkgaXNJbmNsdWRlZEFsbENvbHVtbnM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBDYWxscyB3aGVuZXZlciBhIGxhenkgZXZlbnQgaXMgZGlzcGF0Y2hlZFxyXG4gIEBPdXRwdXQoKVxyXG4gIG9uU2VydmVyU2lkZUV2ZW50Q2hhbmdlOiBFdmVudEVtaXR0ZXI8SUdyaWRTZXJ2ZXJTaWRlRXZlbnQ+ID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gT3V0cHV0IGV2ZW50IHRvIHRyaWdnZXIgb24gcGFnaW5hdGlvblxyXG4gIEBPdXRwdXQoKVxyXG4gIG9uUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPElHcmlkUGFnaW5hdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gZWRpdCByb3dcclxuICBAT3V0cHV0KCkgb25Sb3dVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIERpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIGNhbmNlbCBhbGwgcm93c1xyXG4gIEBPdXRwdXQoKSBvbkNhbmNlbEFsbFJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIERpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIG9uIGRlbGV0ZSByb3dcclxuICBAT3V0cHV0KCkgb25Sb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gYWRkIHJvd1xyXG4gIEBPdXRwdXQoKSBvblJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy9EaXNwYXRjaCBvdXRwdXQgZXZlbnQgdHJpZ2dlciBvbiBhZGQsIHVwZGF0ZSBhbmQgZGVsZXRlIHJvd1xyXG4gIEBPdXRwdXQoKSBvbkdyaWRSb3dBY3Rpb25zID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBzZXQgcHJvcGVydHkgYWxsb3dDYWNoaW5nIGZvciBMb2NhbFN0b3JhZ2VcclxuICBASW5wdXQoKSBhbGxvd0NhY2hpbmc6IGJvb2xlYW47XHJcblxyXG4gIC8vIHNldCBwcm9wZXJ0eSBzb2Z0Q2FjaGluZyBmb3Igc2V0dGluZyB0aGUgdmFsdWVzIG9mIGdyaWRGaWx0ZXJcclxuICBASW5wdXQoKSBzb2Z0Q2FjaGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgQElucHV0KCkgZWRpdEFsbFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gc2V0IHRoZSByb3cgV2hlbiBFZGl0IHRoZSByb3cgb24gR3JpZFxyXG4gIEBPdXRwdXQoKSBvbkdyaWRSb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBzZXQgdGhlIHJvdyBXaGVuIGFkZGluZyB0aGUgbmV3IFJvdyBvbiBHcmlkXHJcbiAgQE91dHB1dCgpIG9uR3JpZFJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgaXNHcmlkSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwdWJsaWMgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlLFxyXG4gICAgcHJpdmF0ZSBwYWdlTG9nZ2VyU2VydmljZTogUGFnZUxvZ2dlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgIHB1YmxpYyBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGNvbmZpZzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyByZWY6IER5bmFtaWNEaWFsb2dSZWZcclxuICApIHt9XHJcblxyXG4gIGdldCBzZWxlY3RlZENvbHVtbnMoKTogSUdyaWRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgc2V0IHNlbGVjdGVkQ29sdW1ucyh2YWw6IElHcmlkQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKChjb2wpID0+IHZhbC5pbmNsdWRlcyhjb2wpKTtcclxuICB9XHJcblxyXG4gIC8vIGJyb3dzZXIgY2xvc2UgZXZlbnRcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgWyckZXZlbnQnXSlcclxuICBiZWZvcmV1bmxvYWRIYW5kbGVyKGV2ZW50OmFueSkge1xyXG4gICAgaWYodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KXtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXNzaWdubWVudCBvZiBzZWxlY3RlZCBjb2x1bW5zIG9uIHBhZ2UgbG9hZFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5lZGl0QWxsUm93cyl7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWRTYXZlQnRuID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5jb21wb25lbnRUYWJsZVJlZiA9IHRoaXMudGFibGU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zZXROdW1lcmljVmFsdWVzKCk7XHJcbiAgICB9LCA1MDApO1xyXG4gIH1cclxuXHJcbiAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zIG9uIGdyaWQgY29sdW1uc1xyXG4gIGFwcGx5Q29sdW1uc1Blcm1pc3Npb25zKCkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICBsZXQgdG90YWxGaWVsZHM6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBoaWRkZW5GaWVsZHM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgcGVybWlzc2lvbnM6IElQZXJtaXNzaW9uW10gPSBjb2x1bW4ucGVybWlzc2lvbnM7XHJcbiAgICAgICAgLy8gaWYgKCFwZXJtaXNzaW9ucykgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zO1xyXG4gICAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChwZXJtaXNzaW9ucyAmJiBwZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnJvbGVzICYmIHBlcm1pc3Npb24ucm9sZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkICYmIHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xyXG4gICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vICAgbGV0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgIC8vICAgICAoaSkgPT4gaS5maWVsZCA9PT0gY29sdW1uLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAvLyAgICk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcclxuICAgICAgICAgICAgICAgICFoYXNWYWxpZEVkaXRQZXJtaXNzaW9uXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29sdW1uLmhpZGRlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5FRElUKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgICAgICAgICAgICBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgY29sdW1uLmhpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG90YWxGaWVsZHMrKztcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgIGhpZGRlbkZpZWxkcysrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmlzQ29sdW1uSGlkZGVuID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBoaWRkZW5GaWVsZHM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBhcHBseSBnbG9iYWwgcGVybWlzc2lvbnMgb24gZW50aXJlIGdyaWRcclxuICBhcHBseUdyaWRQZXJtaXNzaW9ucygpIHtcclxuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zICYmIHRoaXMucGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgYW55IGNvbHVtbiBoYXMgYW55IHBlcm1pc3Npb25cclxuICAgICAgbGV0IGhhc0NvbHVtblBlcm1pc3Npb25zID0gdGhpcy5jb2x1bW5zPy5zb21lKFxyXG4gICAgICAgICh4KSA9PiB4Py5wZXJtaXNzaW9ucyAmJiB4LnBlcm1pc3Npb25zLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMucGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xyXG4gICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFpc1ZhbGlkICYmIHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xyXG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuVklFVyAmJlxyXG4gICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMudXNlSW5saW5lQ1JVRCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgIWhhc0NvbHVtblBlcm1pc3Npb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNHcmlkSGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy51c2VJbmxpbmVDUlVEID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5FRElUICYmICFpc1ZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLmlzR3JpZEhpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmVkaXRSb3dQZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5ERUxFVEUgJiYgIWlzVmFsaWQpIHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlUm93UGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuQUREUk9XICYmICFpc1ZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLmFkZFJvd1Blcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub25Sb3dBZGQub2JzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB0aGlzLmFkZFJvd1Blcm1pc3Npb24gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLm9uUm93RGVsZXRlLm9ic2VydmVycy5sZW5ndGggPT0gMCkgdGhpcy5kZWxldGVSb3dQZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2U6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmFsbG93Q2FjaGluZyAhPT0gZmFsc2UgJiYgdGhpcy5wYWdpbmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuYWxsb3dDYWNoaW5nID0gdGhpcy5wYWdpbmF0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCkpO1xyXG4gICAgfVxyXG4gICAgLy8gYWRkIGRlZmF1bHRSb3cgaW4gcGFnaW5hdGlvbiBhcnJheVxyXG4gICAgaWYgKCF0aGlzLnNldFBhZ2luYXRpb25MZW5ndGguaW5jbHVkZXModGhpcy5kZWZhdWx0Um93cykpIHtcclxuICAgICAgdGhpcy5zZXRQYWdpbmF0aW9uTGVuZ3RoLnVuc2hpZnQodGhpcy5kZWZhdWx0Um93cyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBoYXNDb2x1bW5zOiBib29sZWFuID0gdGhpcy5jb2x1bW5zICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwO1xyXG4gICAgaWYgKGhhc0NvbHVtbnMpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5ncmlkU2VydmljZS5zZXRDb2x1bW5GaWVsZHModGhpcy5jb2x1bW5zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJvbGVzID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyUm9sZXMoKTtcclxuXHJcbiAgICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnMgb24gZ3JpZCBjb2x1bW5zXHJcbiAgICB0aGlzLmFwcGx5Q29sdW1uc1Blcm1pc3Npb25zKCk7XHJcblxyXG4gICAgLy8gYXBwbHkgZ2xvYmFsIHBlcm1pc3Npb25zIG9uIGVudGlyZSBncmlkXHJcbiAgICB0aGlzLmFwcGx5R3JpZFBlcm1pc3Npb25zKCk7XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoKHgpID0+ICF4LmhpZGRlbik7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICBpZiAoaGFzQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldENvbHVtbkZpZWxkcyh0aGlzLmNvbHVtbnMpO1xyXG4gICAgICAvLyBjaGVja2luZyBmaWx0ZXIgZXhpc3Qgb3Igbm90XHJcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX3NlbGVjdGVkQ29sdW1ucy5zb21lKFxyXG4gICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5maWx0ZXJpbmcgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uZmlsdGVyaW5nID09PSB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChmaWx0ZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlRmlsdGVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGltZSBpbnRvIHRoZSBkYXRlXHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSAmJiBjb2x1bW4udGltZU9ubHkgPT09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSAmJlxyXG4gICAgICAgICAgICAgIChyb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpIHx8XHJcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKHJvd1tjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNldCBmaWx0ZXIgdmFsdWVcclxuICAgICAgICBpZiAoY29sdW1uLmZpbHRlciAmJiBjb2x1bW4udmFsdWUgJiYgY29sdW1uLmZpbHRlcmluZyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIFwiZmxleC1zaHJpbms6IDBcIiBmb3IgZmxleC1iYXNpcyBTdHlsZVxyXG4gICAgICAgIGlmIChjb2x1bW4uc3R5bGUgJiYgY29sdW1uLnN0eWxlLmluY2x1ZGVzKCdmbGV4LWJhc2lzJykpIHtcclxuICAgICAgICAgIGxldCBzdHlsZSA9IGNvbHVtbi5zdHlsZSArICcgIWltcG9ydGFudDsgZmxleC1zaHJpbms6IDAgIWltcG9ydGFudCc7XHJcbiAgICAgICAgICBjb2x1bW4uc3R5bGUgPSBzdHlsZS5pbmNsdWRlcygnOzsnKVxyXG4gICAgICAgICAgICA/IHN0eWxlLnJlcGxhY2UoJzs7JywgJzsnKVxyXG4gICAgICAgICAgICA6IHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IERpc3BsYXlUZXh0IHdoZW4gdmFsdWUgaXMgaW4gY3VybHkgYnJhY2tldHMuXHJcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5VGV4dFZhbHVlKGNvbHVtbik7XHJcblxyXG4gICAgICAgIC8vQWdncmVnYXRlIHNjZW5hcmlvXHJcbiAgICAgICAgaWYgKGNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLmFnZ3JlZ2F0ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0ZUZvb3RlciA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzZWFyY2hGaWx0ZXJzO1xyXG4gICAgICAgIGlmKCF0aGlzLnNvZnRDYWNoaW5nKXtcclxuICAgICAgICAgICBzZWFyY2hGaWx0ZXJzID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCkpIGFzIGFueVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgc2VhcmNoRmlsdGVycyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3V0aWxpdGllcy5jdXJyZW50VXJsKCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhdGhpcy5oaWRlRmlsdGVyICYmXHJcbiAgICAgICAgICBzZWFyY2hGaWx0ZXJzICYmXHJcbiAgICAgICAgICBzZWFyY2hGaWx0ZXJzLmZpbHRlcnMgJiZcclxuICAgICAgICAgIHNlYXJjaEZpbHRlcnMuZmlsdGVycy5sZW5ndGggPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBzZWFyY2hGaWx0ZXJzLmZpbHRlcnMuZm9yRWFjaCgoeDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4LnZhbHVlICYmIHguZmllbGQgPT09IGNvbHVtbi5maWVsZCkge1xyXG4gICAgICAgICAgICAgIGlmKGNvbHVtbj8uZmlsdGVyPy50eXBlID09PSAnY2FsZW5kYXInKXtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi52YWx1ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHgudmFsdWUsICdNTS1kZC1ZWScpIGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4udmFsdWUgPSB4LnZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnZlcnRpbmcgZGlzcGxheUZpZWxkIHRvTG93ZXJjYXNlXHJcbiAgICAgICAgaWYgKGNvbHVtbi5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgPSBjb2x1bW4uZGlzcGxheUZpZWxkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNldCBBdXRvQ29tcGxldGUgRGF0YVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmXHJcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhICYmXHJcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRoYXQgY29udGFpbnMgY29tbWEgaW50byBhcnJheXNcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdICYmXHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJywnKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdXHJcbiAgICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXHJcbiAgICAgICAgICAgICAgICA/Lm1hcCgodmFsdWU6IGFueSkgPT4gKHsgW2NvbHVtbi5kaXNwbGF5RmllbGRdOiB2YWx1ZSB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGtleTogYW55ID0gT2JqZWN0LmtleXMocm93KS5maW5kKFxyXG4gICAgICAgICAgICAgICh4KSA9PiB4ID09PSBjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHNpbXBsZSBzdHJpbmcgaW50byBhcnJheVxyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm93W2tleV0pICYmIHJvd1trZXldKSB7XHJcbiAgICAgICAgICAgICAgcm93W2tleV0gPSBbeyBbY29sdW1uLmRpc3BsYXlGaWVsZF06IHJvd1trZXldIH1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vd2hlbiB3ZSBhZGQgYSBuZXcgcm93LCBpdCBzZXQgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlICYmIE9iamVjdC5rZXlzKHRoaXMubmV3R3JpZFJvdykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXModGhpcy5uZXdHcmlkUm93KS5maW5kKFxyXG4gICAgICAgICAgICAoeCkgPT4geCA9PT0gY29sdW1uLmZpZWxkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGtleSAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5uZXdHcmlkUm93W2tleV0gPSBjb2x1bW4udmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIFNlYXJjaGluZyBzY2VuYXJpb1xyXG4gICAgICBpZiAoY2hhbmdlLnJvd3M/LmN1cnJlbnRWYWx1ZSAmJiBjaGFuZ2UuY29sdW1ucz8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgLy8gQ2hlY2tzIGVpdGhlciBjb2x1bW4gdmFsdWUgaXMgY2hhbmdlcyAoaS5lLiwgY29sdW1uIGhpZGRlbiBzY2VuYXJpbylcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2UuY29sdW1ucy5jdXJyZW50VmFsdWUpLnRvTG93ZXJDYXNlKCkgIT09XHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbHVtbnMpLnRvTG93ZXJDYXNlKClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKHgsIGkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF4LmhpZGRlbikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgeC52YWx1ZSA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2ldLnZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMucHVzaCh4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKCh4LCBpKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXguaGlkZGVuKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXSkge1xyXG4gICAgICAgICAgICAgIHgudmFsdWUgPSB0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMucHVzaCh4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQtcm93Jyk7XHJcbiAgICAgICAgaWYgKGNsYXNzRWxlbWVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjbGFzc0VsZW1lbnRbMF0uc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuZWRpdEFsbFJvd3MgJiYgdGhpcy5yb3dzRGF0YT8ubGVuZ3RoID4gMCAmJiB0aGlzLmNvbHVtbnM/Lmxlbmd0aCA+IDApeyBcclxuICAgICAgICAgdGhpcy5lZGl0QWxsUm93c0F0T25jZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdsb2JhbFNlYXJjaGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnbG9iYWxTZWFyY2hidG4nKTtcclxuICAgIGlmIChnbG9iYWxTZWFyY2hidG4pIHtcclxuICAgICAgdGhpcy5zZWFyY2hHcmlkRmlsdGVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwKXtcclxuICAgICAgdGhpcy5yb3dzRGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93c0RhdGEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHNldCBEaXNwbGF5VGV4dCB3aGVuIHZhbHVlIGlzIGluIGN1cmx5IGJyYWNrZXRzLlxyXG4gIHNldERpc3BsYXlUZXh0VmFsdWUoY29sdW1uOiBJR3JpZENvbHVtbikge1xyXG4gICAgdGhpcy5yb3dzRGF0YT8uZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxJTksgfHxcclxuICAgICAgICBFR3JpZENvbHVtblR5cGUuRElBTE9HIHx8XHJcbiAgICAgICAgRUdyaWRDb2x1bW5UeXBlLklGUkFNRVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddO1xyXG4gICAgICAgIGlmIChjb2x1bW4uZGlzcGxheVRleHQgJiYgY29sdW1uLmRpc3BsYXlUZXh0LmluY2x1ZGVzKCd7JykpIHtcclxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlUZXh0ID0gY29sdW1uLmRpc3BsYXlUZXh0XHJcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7JywgJycpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKCd9JywgJycpO1xyXG4gICAgICAgICAgaWYgKGRpc3BsYXlUZXh0ICYmIGZpZWxkKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmRpc3BsYXlUZXh0ID0gcm93W2Rpc3BsYXlUZXh0LnRvTG93ZXJDYXNlKCldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLmRpc3BsYXlUZXh0ICYmIGZpZWxkKSB7XHJcbiAgICAgICAgICBmaWVsZC5kaXNwbGF5VGV4dCA9IGNvbHVtbi5kaXNwbGF5VGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gY2hhbmdlIHJvdyBrZXkgYW5kIHZhbHVlIHdoZW4gdXNpbmcgc2V0R3JpZFJvd1Byb3BWYWx1ZSBmdW5jdGlvblxyXG4gIHNldFJvd1ZhbHVlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgT2JqZWN0LmtleXMocm93RGF0YSk/LmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgcm93RGF0YVtyb3ddICYmXHJcbiAgICAgICAgdGhpcy50eXBlT2Yocm93RGF0YVtyb3ddKSA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICByb3dEYXRhW3Jvd10/LmFjdGlvbj8uZmllbGRcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYocm93RGF0YVtyb3ddPy5leHRyYUZpZWxkKXtcclxuICAgICAgICAgIGRlbGV0ZSByb3dEYXRhW3Jvd107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJvd0RhdGFbcm93XSA9IHJvd0RhdGFbcm93XT8udGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0TnVtZXJpY01pbk14RnJhY3Rpb24oY29sdW1uOiBhbnkpIHtcclxuICAgIGxldCBkaWdpdEluZm8gPSAnMic7XHJcbiAgICBpZihjb2x1bW4/LmZvcm1hdC50eXBlID09PSAncGVyY2VudCcgJiYgIWNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlICYmICFjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvKXtcclxuICAgICAgZGlnaXRJbmZvID0gJzAnXHJcbiAgICB9ZWxzZSBpZihjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvKXtcclxuICAgICAgICBkaWdpdEluZm8gPSBjb2x1bW4uZm9ybWF0LmZvcm1hdFBhcmFtcy5kaWdpdHNJbmZvO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRpZ2l0SW5mbztcclxuICB9XHJcblxyXG4gIC8vIHNldCB0aGUgZm9ybWF0IG9mIGN1cnJlbmN5ICYmIG51bWJlciAmJiBkZWNpbWFsICYmIHBlcmNlbnRcclxuICBzZXROdW1lcmljRm9ybWF0KGNvbHVtbjogYW55LCByb3c6IGFueSkge1xyXG4gICAgcm93ID0gdXRpbGl0aWVzLm9iakNvbnZlcnRUb0xvd2VyKHJvdyk7XHJcbiAgICBsZXQgdmFsdWU6IGFueSA9IHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlUZXh0XHJcbiAgICAgID8gcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheVRleHRcclxuICAgICAgOiByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKClcclxuICAgICAgPyByb3dbcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxyXG4gICAgICA6IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxyXG4gICAgICA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkLnRvTG93ZXJDYXNlKCldXHJcbiAgICAgIDogKHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldPy50ZXh0IHx8IHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldPy50ZXh0ID09PSAwIHx8IHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldPy50ZXh0ID09PSBudWxsKSBcclxuICAgICAgPyByb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCldPy50ZXh0IDogcm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpXTtcclxuICAgIGlmICh0aGlzLnR5cGVPZih2YWx1ZSkgPT09ICdudW1iZXInICYmIHZhbHVlID09PSAwKSB7XHJcbiAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGxldCBmb3JtYXRQYXJhbXMgPSBjb2x1bW4uZm9ybWF0Py5mb3JtYXRQYXJhbXM7XHJcbiAgICBsZXQgZGlnaXRzSW5mbyA9IGZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcclxuICAgIGlmIChjb2x1bW4uZm9ybWF0ICYmIHZhbHVlKSB7XHJcbiAgICAgIHN3aXRjaCAoY29sdW1uLmZvcm1hdD8udHlwZSkge1xyXG4gICAgICAgIGNhc2UgRUdyaWRGb3JtYXRUeXBlLkNVUlJFTkNZOlxyXG4gICAgICAgICAgdmFsdWUgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoXHJcbiAgICAgICAgICAgIGZvcm1hdFBhcmFtcz8ubG9jYWxlID8gZm9ybWF0UGFyYW1zLmxvY2FsZSA6ICdlbi1VUycsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcclxuICAgICAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0UGFyYW1zPy5jdXJyZW5jeSA/IGZvcm1hdFBhcmFtcy5jdXJyZW5jeSA6ICdVU0QnLFxyXG4gICAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAnMicsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk/LmZvcm1hdCh2YWx1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5ERUNJTUFMOlxyXG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8gPyBkaWdpdHNJbmZvIDogJzInKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRUdyaWRGb3JtYXRUeXBlLlBFUkNFTlQ6XHJcbiAgICAgICAgaWYoIWNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpe1xyXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSsnJSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvL0NoYW5nZSBkcm9wZG93biB2bHVlIGJhc2VkIG9uIG9wdGlvbiBsYWJlbCBhbmQgb3B0aW9udmFsdWVcclxuICBzZXREcm9wZG93blZhbHVlKGNvbHVtbjogYW55LCBzZWxlY3RlZFJvdz86IGFueSwgY2hhbmdlPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMucm93c0RhdGEgJiYgdGhpcy5yb3dzRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJvdyk/LmZpbmQoKGtleSkgPT4ga2V5ID09PSBjb2x1bW4uZmllbGQpKSB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbi5vcHRpb25MYWJlbCA9IGNvbHVtbi5vcHRpb25MYWJlbFxyXG4gICAgICAgICAgICAgID8gY29sdW1uLm9wdGlvbkxhYmVsXHJcbiAgICAgICAgICAgICAgOiAnbGFiZWwnO1xyXG4gICAgICAgICAgICBjb2x1bW4ub3B0aW9uVmFsdWUgPSBjb2x1bW4ub3B0aW9uVmFsdWVcclxuICAgICAgICAgICAgICA/IGNvbHVtbi5vcHRpb25WYWx1ZVxyXG4gICAgICAgICAgICAgIDogJ3ZhbHVlJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmRhdGE/LmZpbmQoXHJcbiAgICAgICAgICAgIChyZWNvcmQ6IGFueSkgPT5cclxuICAgICAgICAgICAgICByZWNvcmRbY29sdW1uLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSA9PT1cclxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXT8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IGVkaXRlZFJvdyA9IHNlbGVjdGVkUm93ICYmIE9iamVjdC5rZXlzKHNlbGVjdGVkUm93KS5sZW5ndGggPiAwID8gc2VsZWN0ZWRSb3dbdGhpcy5kYXRhS2V5XSA9PT0gcm93W3RoaXMuZGF0YUtleV0gOiBmYWxzZTtcclxuICAgICAgICAgIGlmICh2YWx1ZSAmJiBlZGl0ZWRSb3cpIHtcclxuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB2YWx1ZVtjb2x1bW4ub3B0aW9uTGFiZWxdO1xyXG4gICAgICAgICAgfWVsc2UgaWYodmFsdWUgJiYgY2hhbmdlID09PSBmYWxzZSl7XHJcbiAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gdmFsdWVbY29sdW1uLm9wdGlvbkxhYmVsXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9tYW5pcHVsYXRlIGNoZWNrYm94IHN0cmluZyB2YWx1ZSB0byB0cnVlIGFuZCBmYWxzZS5cclxuICBjaGFuZ2VDaGVja2JveFN0cmluZ1ZhbHVlKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNvbHVtbnMgJiZcclxuICAgICAgdGhpcy5yb3dzRGF0YSAmJlxyXG4gICAgICB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDAgJiZcclxuICAgICAgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQk9PTEVBTikge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgKHR5cGVvZiAocm93W2NvbHVtbi5maWVsZF0gPT09ICdzdHJpbmcnKSAmJlxyXG4gICAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGRdID09PSAnMScgfHwgcm93W2NvbHVtbi5maWVsZF0gPT09ICcwJykpIHx8XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPT09ICdZJyB8fFxyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID09PSAnTidcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPVxyXG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPT09ICcxJyB8fCByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ1knXHJcbiAgICAgICAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gcm93RGF0YVxyXG4gICAqIFBhc3NlcyBkYXRhIG9mIGNsaWNrZWQgcm93IHRvIHBhcmVudFxyXG4gICAqL1xyXG4gIGhhbmRsZVJvd0NsaWNrKHJvd0RhdGE6IGFueSkge1xyXG4gICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3dEYXRhO1xyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQocm93RGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb2x1bW5EYXRhXHJcbiAgICogUGFzc2VzIHNvcnRpbmcgaW5mb3JtYXRpb24gdG8gcGFyZW50IG9uIHNvcnQgY2hhbmdlXHJcbiAgICovXHJcbiAgaGFuZGxlU29ydENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgc29ydERpcmVjdGlvbiA9IG51bGw7XHJcbiAgICBsZXQgc29ydEZpZWxkOiBzdHJpbmcgPSAnJztcclxuICAgIGlmIChldmVudC5tdWx0aXNvcnRtZXRhICYmIGV2ZW50Lm11bHRpc29ydG1ldGFbMF0ub3JkZXIpIHtcclxuICAgICAgc29ydERpcmVjdGlvbiA9XHJcbiAgICAgICAgZXZlbnQubXVsdGlzb3J0bWV0YVswXS5vcmRlciA9PSAxXHJcbiAgICAgICAgICA/IEVHcmlkU29ydERpcmVjdGlvbi5BU0NcclxuICAgICAgICAgIDogRUdyaWRTb3J0RGlyZWN0aW9uLkRFU0M7XHJcbiAgICAgIHNvcnRGaWVsZCA9IGV2ZW50Lm11bHRpc29ydG1ldGFbMF0uZmllbGQ7XHJcbiAgICB9XHJcbiAgICBsZXQgc29ydHM6IElHcmlkU29ydCA9IHtcclxuICAgICAgZmllbGQ6IHNvcnRGaWVsZCxcclxuICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uIGFzIEVHcmlkU29ydERpcmVjdGlvbixcclxuICAgICAgcHJpb3JpdHk6IDAsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vblNvcnRDaGFuZ2UuZW1pdChzb3J0cyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqIFBhc3NlcyBhcHBsaWVkIGZpbHRlcnMgdG8gcGFyZW50IG9uIGZpbHRlciBjaGFuZ2VcclxuICAgKi9cclxuICBoYW5kbGVGaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZXZlbnQuZmlsdGVyc1tmaWx0ZXIuZmllbGRdPy52YWx1ZSkge1xyXG4gICAgICAgIGZpbHRlci52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMub25GaWx0ZXJDaGFuZ2UuZW1pdChldmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudCA6IEV2ZW50XHJcbiAgICogQHBhcmFtIGNvbHVtbkFjdGlvbiA6IElHcmlkQ29sdW1uQWN0aW9uXHJcbiAgICogQHBhcmFtIHJvdyA6IGFueVxyXG4gICAqIFN0b3AgdGhlIGNsaWNrIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudFxyXG4gICAqIENhbGxiYWNrcyB0aGUgcm93IGRhdGEgdG8gcGFyZW50XHJcbiAgICovXHJcblxyXG4gIC8qKlxyXG4gICAqIGludm9rZSBvbkNsaWNrIGV2ZW50ICYgb3BlbiBJZnJhbWUgaW4gZ3JpZFxyXG4gICAqL1xyXG4gIGdyaWRJRnJhbWUoY29sdW1uOiBhbnksIHJvd3M6IGFueSwgcm93OiBhbnkpIHtcclxuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcclxuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xyXG4gICAgICBoZWFkZXI6IGNvbHVtbi5oZWFkZXIsXHJcbiAgICAgIHdpZHRoOiAnODAlJyxcclxuICAgICAgaGVpZ2h0OiAnODAlJyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHZhbHVlOiByb3dzLFxyXG4gICAgICAgIGlGcmFtZUlkOiBjb2x1bW4uZGlzcGxheVRleHQgPyBjb2x1bW4uZGlzcGxheVRleHQgOiBjb2x1bW4uZmllbGQsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb2x1bW4uY29tcG9uZW50Py5uYW1lO1xyXG4gICAgaWYoY29tcG9uZW50TmFtZSl7XHJcbiAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLCBjb21wb25lbnROYW1lKTtcclxuICAgIH1cclxuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgY29sdW1uLm9uUmV0dXJuKSB7XHJcbiAgICAgICAgY29sdW1uLm9uUmV0dXJuKHJlcyk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzICYmIGNvbHVtbi5vbkNoYW5nZSkge1xyXG4gICAgICAgIGNvbHVtbi5vbkNoYW5nZShyZXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZE5ld1Jvdyhyb3c6IGFueSwgYWRkUm93OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIHRoaXMuY29tcG9uZW50VGFibGVSZWYgPSB0aGlzLnRhYmxlO1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29sdW1uLmZpbHRlciAmJlxyXG4gICAgICAgIGNvbHVtbi5jb21wb25lbnQgJiZcclxuICAgICAgICBjb2x1bW4uZmlsdGVyLnR5cGUgPT09ICdjYWxlbmRhcidcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKGFkZFJvdykge1xyXG4gICAgICAgICAgdGhpcy5yb3dzRGF0YVswXVtjb2x1bW4uZmllbGQgKyAnX3NlY29uZFR5cGUnXSA9IEVHcmlkQ29sdW1uVHlwZS5EQVRFO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19zZWNvbmRUeXBlJ10gPSBFR3JpZENvbHVtblR5cGUuREFURTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3c7XHJcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gdHJ1ZTtcclxuICAgIHRoaXMuZHJvcGRvd25JbnB1dCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zb3J0RGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5vbkdyaWRSb3dBZGQuZW1pdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBEaWFsb2cgaW4gZ3JpZFxyXG4gICAqL1xyXG4gIG9wZW5HcmlkRGlhbG9nKGNvbHVtbjogSUdyaWRDb2x1bW4gfCBhbnksIHJvdzogYW55KSB7XHJcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYodGhpcy5zZXREaWFsb2dEYXRhKXtcclxuICAgICAgICBjb2x1bW5bJ3BhcmVudERpYWxvZ0RhdGEnXSA9IGNvbHVtbi5kYXRhLmRhdGE7XHJcbiAgICAgICAgdGhpcy5zZXREaWFsb2dEYXRhID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYoY29sdW1uLmRhdGEgJiYgY29sdW1uLmRhdGEuZGF0YSAmJiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSl7XHJcbiAgICAgICAgY29sdW1uLmRhdGEuZGF0YSA9IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaWFsb2dEYXRhO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4uY29tcG9uZW50ICYmIGNvbHVtbi5kYXRhICYmIHRoaXMucm93Q2xpY2tEYXRhKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMucm93Q2xpY2tEYXRhKTtcclxuICAgICAgICBjb2x1bW4uZGF0YS5kYXRhID0gdXRpbGl0aWVzLmF1dG9TZXRMb29rdXBEYXRhKFxyXG4gICAgICAgICAgY29sdW1uLnBhcmVudERpYWxvZ0RhdGEsXHJcbiAgICAgICAgICB0aGlzLnJvd0NsaWNrRGF0YVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oY29sdW1uLmNvbXBvbmVudCwgY29sdW1uLmRhdGEpO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb2x1bW4uY29tcG9uZW50Py5uYW1lO1xyXG4gICAgICAgIGlmKGNvbXBvbmVudE5hbWUpe1xyXG4gICAgICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8odGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksIGNvbXBvbmVudE5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEgJiYgY29sdW1uLm9uUmV0dXJuKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbi5vblJldHVybihkYXRhLCB0aGlzLnJvd0NsaWNrRGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcclxuICAgICAgICAgICAgaWYoY29sdW1uLm9uQ2hhbmdlKXtcclxuICAgICAgICAgICAgICBjb2x1bW4ub25DaGFuZ2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgYnJvd3NlckNsb3NlRXZlbnQoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSl7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHNldE11bHRpU2VsZWN0RGF0YShjb2x1bW46IElHcmlkQ29sdW1uLCBzZWxlY3RlZFZhbHVlOmFueSl7XHJcbiAgICBpZihzZWxlY3RlZFZhbHVlICYmIGNvbHVtbi50eXBlID09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCl7XHJcbiAgICAgIGlmKHNlbGVjdGVkVmFsdWUgJiYgc2VsZWN0ZWRWYWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSl7XHJcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcsJyk/Lm1hcCgodmFsdWUpPT4gY29sdW1uLmRhdGE/LmZpbmQoKG9wdGlvbik9PiBvcHRpb24udmFsdWU/LnRvU3RyaW5nKCkgPT09IHZhbHVlPy50b1N0cmluZygpKT8ubGFiZWwpPy50b1N0cmluZygpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBzZWxlY3RlZFZhbHVlID0gY29sdW1uLmRhdGE/LmZpbmQoKG9wdGlvbik9PiBvcHRpb24udmFsdWU/LnRvU3RyaW5nKCkgPT09IHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCkpPy5sYWJlbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXR1cm4gY29uZGl0aW9uYWwgYmFzZSB2YWx1ZSBhbmQgdGl0bGVcclxuICAgKi9cclxuICBzZXRDb25kaXRpb25CYXNlVmFsdWUocm93OiBhbnksIGNvbHVtbjogYW55KSB7XHJcbiAgICBkZWxldGUgcm93Wyd1bmRlZmluZWQnXTtcclxuICAgIGxldCB2YWx1ZTphbnk7XHJcbiAgICBpZihjb2x1bW4udHlwZSA9PSBFR3JpZENvbHVtblR5cGUuREFURSl7XHJcbiAgICAgIGxldCBuZXdWYWx1ZTphbnk7XHJcbiAgICAgIGlmKHR5cGVvZihyb3dbY29sdW1uLmZpZWxkXSkgPT09IFwib2JqZWN0XCIgJiYgcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbil7XHJcbiAgICAgICAgbmV3VmFsdWUgPSByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5VGV4dFxyXG4gICAgICAgID8gcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheVRleHRcclxuICAgICAgICA6IHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKVxyXG4gICAgICAgID8gcm93W3Jvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cclxuICAgICAgICA6IHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldPy50ZXh0XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYobmV3VmFsdWUpe1xyXG4gICAgICAgIGlmKGNvbHVtbi50aW1lT25seSl7XHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuc2V0VGltZUZvcm1hdChuZXdWYWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBmb3JtYXQgPSAnJztcclxuICAgICAgICAgIGlmKGNvbHVtbi5mb3JtYXQpe1xyXG4gICAgICAgICAgICBpZihjb2x1bW4uZm9ybWF0ID09PSBFR3JpZEZvcm1hdFR5cGUuU01BTExEQVRFKXtcclxuICAgICAgICAgICAgICBmb3JtYXQgPSAnTU0vZGQveXknO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihjb2x1bW4uZm9ybWF0ID09PSBFR3JpZEZvcm1hdFR5cGUuU0hPUlREQVRFKXtcclxuICAgICAgICAgICAgICBmb3JtYXQgPSAnTU0vZGQveXl5eSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obmV3VmFsdWU/LnRvU3RyaW5nKCkgPT09IFwiSW52YWxpZCBEYXRlXCIgPyBudWxsIDogbmV3VmFsdWUsIGZvcm1hdCA/IGZvcm1hdCA6ICdNTS9kZC95eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZF0/LmFjdGlvbj8uZGlzcGxheVRleHRcclxuICAgICAgPyByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5VGV4dFxyXG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKVxyXG4gICAgICA/IHJvd1tyb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldXHJcbiAgICAgIDogcm93W2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldXHJcbiAgICAgID8gcm93W2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldXHJcbiAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10gJiZcclxuICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCA9PT0gbnVsbFxyXG4gICAgICA/ICcnXHJcbiAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XHJcbiAgICAgID8gY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09ICdjYWxlbmRhcicgJiYgY29sdW1uLnRpbWVPbmx5ICYmIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRElBTE9HID8gXHJcbiAgICAgIChyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dC50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykpID8gXHJcbiAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0IDogdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQsICdoaDptbSBhJylcclxuICAgICAgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dFxyXG4gICAgICA6IGNvbHVtbi5kaXNwbGF5VGV4dFxyXG4gICAgICA/IGNvbHVtbi5kaXNwbGF5VGV4dFxyXG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGRdO1xyXG4gICAgfVxyXG4gICBcclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHNldERyb3Bkd29uUmVhZE9ubHlWYWx1ZShyb3c6IGFueSwgY29sdW1uOiBhbnkpe1xyXG4gICAgZGVsZXRlIHJvd1sndW5kZWZpbmVkJ107XHJcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXVxyXG4gICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cclxuICAgIDogcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBvcGVuIERlbGV0ZSBDb25maXJtYXRpb24gZGlhbG9nIHdoZW4gY2xpY2sgb24gZGVsZXRlIGljb24gaW4gQWN0aW9uIGNvbHVtblxyXG4gICAqL1xyXG4gIGhhbmRsZUFjdGlvbkNsaWNrKGV2ZW50OiBFdmVudCwgY29sdW1uQWN0aW9uOiBJR3JpZENvbHVtbkFjdGlvbiwgcm93OiBhbnkpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKGNvbHVtbkFjdGlvbi50b29sdGlwLnRvTG93ZXJDYXNlKCkgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIGlmIChjb2x1bW5BY3Rpb24uY29uZmlybURpYWxvZyA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb2x1bW5BY3Rpb24ub25DbGljayhyb3cpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgICAgIG1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyByZWNvcmQ/JyxcclxuICAgICAgICAgIGhlYWRlcjogJ0RlbGV0ZSBDb25maXJtYXRpb24nLFxyXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcclxuICAgICAgICAgIGtleTogJ2hhbmRsZWNvbHVtbkFjdGlvbnMnLFxyXG4gICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbHVtbkFjdGlvbi5vbkNsaWNrKHJvdyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHJlamVjdDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY2xvc2UoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbHVtbkFjdGlvbi5vbkNsaWNrKHJvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudCA6IExhenlMb2FkRXZlbnRcclxuICAgKiBUcmlnZ2VycyBldmVyeXRpbWUgYSBzZXJ2ZXIgc2lkZSBmaWx0ZXIgaXMgdHJpZ2dlclxyXG4gICAqL1xyXG4gIGhhbmRsZVNlcnZlclNpZGVFdmVudHMoZXZlbnQ6IGFueSkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0ZWRDb2x1bW5zICYmIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKHg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGV2ZW50LmZpbHRlcnNbeC5maWVsZF0pIHtcclxuICAgICAgICAgICAgZXZlbnQuZmlsdGVyc1t4LmZpZWxkXS52YWx1ZSA9IHgudmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgXHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0aGlzLmF1dG9Mb2FkRGF0YTtcclxuICAgIHRoaXMuc2VydmVyRmlsdGVycyA9IHtcclxuICAgICAgZmlsdGVyczogdGhpcy5sb29rdXBGaWx0ZXJzXHJcbiAgICAgICAgPyB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRGaWx0ZXJzKGV2ZW50LCB0aGlzLnNlbGVjdGVkQ29sdW1ucylcclxuICAgICAgICA6IHRoaXMuZ3JpZFNlcnZpY2UucHJlcGFyZUJhc2ljRmlsdGVycyhldmVudCwgdGhpcy5zZWxlY3RlZENvbHVtbnMpLFxyXG4gICAgICBzb3J0czogdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU29ydHMoZXZlbnQsIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSxcclxuICAgICAgLi4uKHRoaXMucGFnaW5hdGlvbiAmJiB7XHJcbiAgICAgICAgcGFnZTogdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkUGFnaW5hdGlvbihldmVudCksXHJcbiAgICAgICAgcGFnZVNpemU6IGV2ZW50LnJvd3MgfHwgMTAsXHJcbiAgICAgIH0pLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VydmVyRmlsdGVycz8uZmlsdGVycyAmJlxyXG4gICAgICB0aGlzLnNlcnZlckZpbHRlcnM/LmZpbHRlcnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAodGhpcy5hbGxvd0NhY2hpbmcgfHwgdGhpcy5zb2Z0Q2FjaGluZylcclxuICAgICkge1xyXG4gICAgICBpZighdGhpcy5zb2Z0Q2FjaGluZyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCksSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2ZXJGaWx0ZXJzKSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3V0aWxpdGllcy5jdXJyZW50VXJsKCldID0gdGhpcy5zZXJ2ZXJGaWx0ZXJzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VydmVyRmlsdGVyVmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcnZlckZpbHRlcnMpKTtcclxuICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gKHRoaXMuc2VydmVyRmlsdGVycy5maWx0ZXJzIHx8IFtdKS5jb25jYXQoXHJcbiAgICAgIHRoaXMuZ2xvYmFsRGF0YVxyXG4gICAgKTtcclxuICAgIHRoaXMub25TZXJ2ZXJTaWRlRXZlbnRDaGFuZ2UuZW1pdChzZXJ2ZXJGaWx0ZXJWYWx1ZXMpO1xyXG4gICAgfSwgOTUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqIFBhc3NlcyBhcHBsaWVkIHBhZ2luYXRpb24gdG8gcGFyZW50IG9uIHBhZ2UgY2hhbmdlXHJcbiAgICovXHJcbiAgaGFuZGxlU2VydmVyU2lkZVBhZ2luYXRpb24oZXZlbnQ6IElHcmlkUGFnaW5hdGlvbkV2ZW50KSB7XHJcbiAgICB0aGlzLm9uUGFnZUNoYW5nZS5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkUm93KHJvdzogYW55KSB7XHJcbiAgICB0aGlzLm9uUm93Q2hlY2tCb3guZW1pdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgLy8gc2V0IHRpbWUgZm9ybWF0XHJcbiAgc2V0VGltZUZvcm1hdChkYXRlOiBhbnkpIHtcclxuICAgIGxldCB2YWx1ZTogYW55ID0gJyc7XHJcbiAgICBpZiAoZGF0ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCBkYXRlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKSB7XHJcbiAgICAgIHZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdoaDptbSBhJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvL29wZW4gaHlwZXJsaW5rIGluIGVkaXQgY2FzZVxyXG4gIG9wZW5MaW5rKHVybDogYW55KSB7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIGNvbnN0IGxpbms6IGFueSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtYXQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XHJcbiAgICBsZXQgdmFsdWU6IGFueSA9ICcnO1xyXG4gICAgaWYgKGNvbHVtbi5mb3JtYXQpIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShcclxuICAgICAgICBjb2x1bW4uZGlzcGxheVRleHQgPyBjb2x1bW4uZGlzcGxheVRleHQgOiByb3dbY29sdW1uLmZpZWxkXSxcclxuICAgICAgICBjb2x1bW4uZm9ybWF0XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWx1ZSA9IGNvbHVtbi5kaXNwbGF5VGV4dCA/IGNvbHVtbi5kaXNwbGF5VGV4dCA6IHJvd1tjb2x1bW4uZmllbGRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gcm93XHJcbiAgICogU2V0cyB2YWx1ZXMgdG8gZWRpdGFibGUgcm93XHJcbiAgICogUm93J3MgZGF0YSBpcyBwcmVzZXZlZCB0byBwcmV2ZW50IG11dGF0aW9uXHJcbiAgICogUm93IGRhdGFLZXkgaXMgcHJlc2VydmVkIHRvIGtlZXAgdGhlIHJvdyB1bmlxdWUgYW5kIGluIGVkaXRhYmxlIHN0YXRlIGFzIGxvbmcgYXMgbm90IHNhdmVkXHJcbiAgICovXHJcblxyXG4gIG9uUm93RWRpdEluaXQocm93OiBhbnkpIHtcclxuICAgIGxldCBzZWxlY3RlZFJvdyA9IHsgLi4ucm93IH07XHJcbiAgICBPYmplY3QuZW50cmllcyhzZWxlY3RlZFJvdykuZm9yRWFjaCgoW2tleSwgdmFsdWVdOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5zZXREcm9wZG93bkZpbHRlcil7XHJcbiAgICAgICAgICB0aGlzLnNldERyb3Bkb3duRmlsdGVyVmFsdWUoY29sLCByb3csIGtleSk7XHJcbiAgICAgICAgICB0aGlzLnNldERyb3Bkb3duRmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNldCB0aGUgYXV0b0NvbXBsZXRlIFZhbHVlIGluIGVkaXQgbW9kZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmXHJcbiAgICAgICAgICBjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09IGtleT8udG9Mb3dlckNhc2UoKSAmJlxyXG4gICAgICAgICAgdmFsdWUgJiZcclxuICAgICAgICAgIHZhbHVlLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlLm1hcCgoeDogYW55KSA9PiB4W2NvbC5kaXNwbGF5RmllbGRdKTtcclxuICAgICAgICAgIGlmIChuZXdWYWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSkge1xyXG4gICAgICAgICAgICByb3dbY29sLmZpZWxkXSA9IG5ld1ZhbHVlXHJcbiAgICAgICAgICAgICAgPy50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgPy5yZXBsYWNlQWxsKCc7JywgJywnKVxyXG4gICAgICAgICAgICAgID8uc3BsaXQoJywnKVxyXG4gICAgICAgICAgICAgID8ubWFwKCh4OiBhbnkpID0+ICh7IFtjb2wuZGlzcGxheUZpZWxkXTogeCB9KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgbG9va3VwIGNvbnRyb2wgZmllbGQgYmFzZWQgb24gZGlzcGxheSBmaWVsZC5cclxuICAgICAgICBpZiAoY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgJiYgY29sLmRpc3BsYXlGaWVsZCkge1xyXG4gICAgICAgICAgaWYgKGNvbC5maWVsZCA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0ge1xyXG4gICAgICAgICAgICAgIHRleHQ6IHJvd1tjb2wuZGlzcGxheUZpZWxkXSxcclxuICAgICAgICAgICAgICB2YWx1ZTogcm93W2NvbC5maWVsZF0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikge1xyXG4gICAgICAgICAgbGV0IG9wdGlvbiA9IGNvbD8uZGF0YT8uZmluZChcclxuICAgICAgICAgICAgKHg6IGFueSkgPT4geC5sYWJlbCA9PT0gcm93W2NvbC5maWVsZF0/LnRvU3RyaW5nKClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAob3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gb3B0aW9uLnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09IGtleT8udG9Mb3dlckNhc2UoKSAmJlxyXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlPy5hY3Rpb24gPyB2YWx1ZS50ZXh0IDogdmFsdWU7XHJcbiAgICAgICAgICBpZiAocm93W2NvbC5maWVsZF0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYocm93W2tleV0/LmFjdGlvbiAmJiBPYmplY3Qua2V5cyhyb3dba2V5XT8uYWN0aW9uKT8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgcm93W2tleV0udGV4dCA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHJvd1trZXldID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGNoZWNrIHRoZSBNaW51dGVzIHBhdHRlcm5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgKGNvbC5zaG93VGltZSB8fCBjb2wudGltZU9ubHkpICYmXHJcbiAgICAgICAgICAgIGNvbC5taW51dGVzSW50ZXJ2YWwgJiZcclxuICAgICAgICAgICAgcm93W2tleV1cclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICByb3dba2V5XSA9IG5ldyBEYXRlKHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwocm93W2tleV0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgJiZcclxuICAgICAgICAgIGNvbC5maWx0ZXI/LnR5cGUgPT09ICdjYWxlbmRhcicgJiZcclxuICAgICAgICAgIGNvbC5maWVsZC50b0xvd2VyQ2FzZSgpID09PSBrZXkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJvd1trZXldID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxJTksgJiZcclxuICAgICAgICAgIGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpICYmXHJcbiAgICAgICAgICAoY29sLmFsbG93U2F2ZSA9PT0gdHJ1ZSB8fCBjb2wuYWxsb3dTYXZlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAoY29sLmVkaXRMaW5rID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHJvd1trZXldID0gcm93W2NvbC5maWVsZCArICdfb2JqJ10/Lmh5cGVybGluaztcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY29sLmVkaXRMaW5rID09PSBmYWxzZSB8fCBjb2wuZWRpdExpbmsgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByb3dba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRSb3dzUmVjb3Jkc1tyb3dbdGhpcy5kYXRhS2V5XV0gPSB7IC4uLnJvdyB9O1xyXG4gICAgdGhpcy5lZGl0aW5nUm93S2V5c1tyb3dbdGhpcy5kYXRhS2V5XV0gPSB0cnVlO1xyXG4gICAgdGhpcy5jaGVja0FjdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLmRyb3Bkb3duSW5wdXQgPSB0cnVlO1xyXG4gICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3c7XHJcbiAgICB0aGlzLmluRWRpdE1vZGUgPSB0cnVlO1xyXG4gICAgdGhpcy5jYW5jZWxBbGxSZWNvcmRzID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSBmYWxzZTtcclxuICAgIHRoaXMuc29ydERpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMub25HcmlkUm93RWRpdC5lbWl0KHJvdyk7XHJcbiAgfVxyXG5cclxuICB0eXBlT2YodmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHNldCBkcm9wZG93biBmaWx0ZXIgdmFsdWVcclxuICAgKi9cclxuICBzZXREcm9wZG93bkZpbHRlclZhbHVlKGNvbDogYW55LCByb3c6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRST1BET1dOICYmIGNvbC5kcm9wRG93blByb3ApIHtcclxuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoY29sKS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgPT0ga2V5KSkgeyAgICAgICAgXHJcbiAgICAgICAgbGV0IG9iaiA9IGNvbC5kcm9wRG93blByb3A7XHJcbiAgICAgICAgbGV0IG5ld0ZpbHRlcnM6IGFueSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAob2JqLmZpbHRlcnMgJiYgb2JqLmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgb2JqLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG5ld0ZpbHRlciA9IHsgLi4uZmlsdGVyIH07XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJLZXkgPSBPYmplY3Qua2V5cyhyb3cpLmZpbmQoKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBtYXRjaEtleTogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlPy5pbmNsdWRlcygneycpICYmXHJcbiAgICAgICAgICAgICAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT1cclxuICAgICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgPy50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAgICAgPy50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3snLCAnJylcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnfScsICcnKVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hLZXkgPSBrZXk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaEtleTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJLZXkpIHtcclxuICAgICAgICAgICAgICBuZXdGaWx0ZXIudmFsdWUgPSByb3dbZmlsdGVyS2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXdGaWx0ZXJzLnB1c2gobmV3RmlsdGVyKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zZXREcm9wZG93bkRhdGEoXHJcbiAgICAgICAgICBjb2wsXHJcbiAgICAgICAgICBvYmoudW5pcXVlS2V5LFxyXG4gICAgICAgICAgb2JqLnZhbHVlUHJvcCxcclxuICAgICAgICAgIG9iai5sYWJlbFByb3AsXHJcbiAgICAgICAgICBuZXdGaWx0ZXJzLFxyXG4gICAgICAgICAgcm93XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IG9wdGlvbiA9IGNvbC5kYXRhLmZpbmQoXHJcbiAgICAgICAgICAoeDogYW55KSA9PiB4LmxhYmVsID09PSByb3dbY29sLmZpZWxkXT8udG9TdHJpbmcoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG9wdGlvbikge1xyXG4gICAgICAgICAgcm93W2NvbC5maWVsZF0gPSBvcHRpb24udmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSByb3dcclxuICAgKiBQYXNzZXMgdGhlIGVkaXRlZCBvciBuZXdseSBjcmVhdGVkIGRhdGEgdG8gcGFyZW50XHJcbiAgICogSW4gY2FzZSBvZiBuZXdseSBjcmVhdGVkIGRhdGEsIGRhdGFLZXkgYW5kIGlzTmV3IHByb3AgaXMgcmVtb3ZlZFxyXG4gICAqL1xyXG4gIG9uUm93RWRpdFNhdmUoc2VsZWN0ZWRSb3c6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgZGVsZXRlIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZCArICctZGF0YSddO1xyXG4gICAgICBkZWxldGUgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkICsgJ19zZWNvbmRUeXBlJ107XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxPT0tVUF9JTlBVVCAmJlxyXG4gICAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgJiZcclxuICAgICAgICB0aGlzLmxvb2t1cE9iamVjdFxyXG4gICAgICApIHtcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gdGhpcy5sb29rdXBPYmplY3QudmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyID09PSAnY2hhcicpIHtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IHRydWUgPyAnWScgOiAnTic7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZm9ybWF0dGVyID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IHRydWUgPyAnMScgOiAnMCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGVjdGVkUm93ID0geyAuLi5zZWxlY3RlZFJvdywgW2NvbHVtbi5maWVsZF06IHZhbHVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vY29udmVydCBkYXRlIGludG8gdGltZSBmb3JtYXRcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiggY29sdW1uLnRpbWVPbmx5ICYmIGNvbHVtbi5zYXZlQXNTdHJpbmcpe1xyXG4gICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0sICdoaDptbSBhJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIWNvbHVtbi50aW1lT25seSAmJiBjb2x1bW4uc2hvd1RpbWUpe1xyXG4gICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0sICd5eXl5LU1NLWRkIEhIOm1tOnNzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vY29udmVydCBtdWx0aXNlbGVjdCBhcnJheSBpbnRvIHN0cmluZ1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCAmJiBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdXHJcbiAgICAgICkge1xyXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXT8udG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2F2aW5nIEF1dG9Db21wbGV0ZSBEYXRhXHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkFVVE9DT01QTEVURSAmJlxyXG4gICAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgJiZcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy5sZW5ndGggPiAwXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBhcnI6IGFueSA9IFtdO1xyXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0uZm9yRWFjaCgocm93OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0pIHtcclxuICAgICAgICAgICAgYXJyLnB1c2gocm93W2NvbHVtbi5kaXNwbGF5RmllbGRdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gYXJyLnRvU3RyaW5nKCk/LnJlcGxhY2VBbGwoJywnLCAnOycpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcm93OiBhbnkgPSB7IC4uLnNlbGVjdGVkUm93IH07XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHJvdyk7XHJcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5sb29rdXBPYmplY3QgJiYgdGhpcy5sb29rdXBPYmplY3QuZmllbGQpIHtcclxuICAgICAgICByb3dbdGhpcy5sb29rdXBPYmplY3QuZmllbGRdID0gdGhpcy5sb29rdXBPYmplY3QudmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGtleS5pbmNsdWRlcygnX29iaicpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tBY3Rpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICByb3cgPSB7IC4uLnJvdywgW2tleS5zcGxpdCgnXycpWzBdXTogcm93W2tleV0uZGlzcGxheVRleHQgfTtcclxuICAgICAgICAgIHRoaXMuY2hlY2tBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgb2JqOiBhbnkgPSByb3dba2V5XTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBvYmogJiZcclxuICAgICAgICAgIChvYmoudHlwZSA9PT0gJ2xpbmsnIHx8XHJcbiAgICAgICAgICAgIG9iai50eXBlID09PSAnaWZyYW1lJyB8fFxyXG4gICAgICAgICAgICBvYmoudHlwZSA9PT0gJ2RpYWxvZycpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBkZWxldGUgcm93W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8qKlxyXG4gICAgICoganVzdCBlbWl0IHRob3NlIGZpZWxkcyB3aG8gZXhpc3QgaW4gdGhlIHRhYmVsXHJcbiAgICAgKi9cclxuICAgIHRoaXMuc2V0Um93VmFsdWUocm93KTtcclxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxPT0tVUF9JTlBVVCAmJlxyXG4gICAgICAgIGNvbHVtbi5maWVsZCAmJlxyXG4gICAgICAgIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCdcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgbmV3Um93ID0geyAuLi5yb3cgfTtcclxuICAgICAgICBuZXdSb3dbY29sdW1uLmZpZWxkXSA9IG5ld1Jvd1tjb2x1bW4uZmllbGRdPy52YWx1ZTtcclxuICAgICAgICByb3cgPSB7IC4uLm5ld1JvdyB9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoY29sdW1uLmFsbG93U2F2ZSA9PT0gdHJ1ZSB8fCBjb2x1bW4uYWxsb3dTYXZlID09PSB1bmRlZmluZWQpICYmXHJcbiAgICAgICAgKGNvbHVtbi5lZGl0YWJsZSA9PT0gdHJ1ZSB8fCBjb2x1bW4uZWRpdGFibGUgPT09IHVuZGVmaW5lZClcclxuICAgICAgKSB7XHJcbiAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRJQUxPRyAmJlxyXG4gICAgICAgICAgY29sdW1uLmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShcclxuICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0sXHJcbiAgICAgICAgICAgICd5eXl5LU1NLWRkVDAwOjAwOjAwLjAwMFonXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9TZXQgRGVjaW1hbCBGcmFjdGlvbiBWYWx1ZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcclxuICAgICAgICAgIGNvbHVtbi5mb3JtYXQudHlwZSA9PT0gRUZvcm1hdFR5cGUuREVDSU1BTCAmJlxyXG4gICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiZcclxuICAgICAgICAgICFyb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCcuJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBkaWdpdHNJbmZvID0gJy4wMCc7XHJcbiAgICAgICAgICBsZXQgemVybyA9ICcwJztcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdFBhcmFtcyA9IGNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcztcclxuICAgICAgICAgIGNvbnN0IGZyYWNEaWdpdHMgPSBjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xyXG4gICAgICAgICAgaWYgKGZyYWNEaWdpdHMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmcmFjRGlnaXRzOyBpKyspIHtcclxuICAgICAgICAgICAgICB6ZXJvID0gemVybyArICcwJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkaWdpdHNJbmZvID0gJy4nICsgemVybztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0gKyBkaWdpdHNJbmZvO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICByb3cuaXNOZXcgJiZcclxuICAgICAgICAoY29sdW1uLmFsbG93U2F2ZSA9PT0gZmFsc2UgfHwgY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgZGVsZXRlIHJvd1tjb2x1bW4uZmllbGRdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGRlbGV0ZSBzZWxlY3RlZFJvd1sndW5kZWZpbmVkJ107XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNoZWNrVmFsaWRpdHkodGhpcy5jb2x1bW5zLCByb3cpO1xyXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMuZ3JpZFZhbGlkYXRpb24odGhpcy5jb2x1bW5zLCByb3cpO1xyXG4gICAgaWYgKGlzVmFsaWQpIHtcclxuICAgIC8vIHNldCB0aGUgZ3JpZCB1cGRhdGVkL2luc2VydGVkIGRhdGFcclxuICAgICAgdGhpcy5yb3dBY3Rpb25FdmVudHMoc2VsZWN0ZWRSb3cpO1xyXG4gICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KGZhbHNlKTtcclxuICAgICAgaWYgKHJvdy5pc05ldykge1xyXG4gICAgICAgIGlmKHRoaXMuYWRkRGF0YUtleVZhbHVlKXtcclxuICAgICAgICAgIHJvd1snaWQnXSA9IHNlbGVjdGVkUm93WydpZCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IGlzTmV3LCAuLi5uZXdSb3dPYmogfSA9IHJvdztcclxuICAgICAgICBkZWxldGUgbmV3Um93T2JqW3RoaXMuZGF0YUtleV07XHJcbiAgICAgICAgaWYgKHRoaXMuc2F2ZUFsbFJlY29yZCkge1xyXG4gICAgICAgICAgdGhpcy5zYXZlUmVjb3JkQXJyYXkucHVzaChuZXdSb3dPYmopO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5vblJvd0FkZC5lbWl0KG5ld1Jvd09iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLnNhdmVBbGxSZWNvcmQpIHtcclxuICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5LnB1c2gob2JqKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub25Sb3dVcGRhdGUuZW1pdChvYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVkaXRpbmdSb3dLZXlzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHRoaXMuZWRpdEFsbFJvd3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRpbmdSb3dLZXlzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhbGwgcm93cyBpbiByZWFkIG9ubHkgbW9kZSB0aGVuIHNob3cgZWRpdEFsbFJvd3MgYnV0dG9uLiAgICBcclxuICAgIGlmKE9iamVjdC52YWx1ZXModGhpcy5lZGl0aW5nUm93S2V5cykuZXZlcnkoKHZhbHVlKT0+ICF2YWx1ZSkpe1xyXG4gICAgICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICAgICB0aGlzLmhpZGVFZGl0QWxsUm93c0J0biA9IHRydWU7XHJcbiAgICAgICB0aGlzLnNvcnREaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgLy8gY29udmVydCBkYXRlIGludG8gdGltZVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAmJlxyXG4gICAgICAgIChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpPy5pbmNsdWRlcygnUE0nKSB8fFxyXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdBTScpKVxyXG4gICAgICApIHtcclxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUocm93W2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRST1BET1dOICYmXHJcbiAgICAgICAgY29sdW1uLm9wdGlvbkxhYmVsICYmXHJcbiAgICAgICAgY29sdW1uLm9wdGlvblZhbHVlXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHNlbGVjdGVkUm93KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcclxuICBncmlkVmFsaWRhdGlvbihjb2x1bW5zOiBhbnksIHJvdzogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZFNlcnZpY2UuY2hlY2tWYWxpZGl0eShjb2x1bW5zLCByb3cpKSB7XHJcbiAgICAgIGxldCBpc1JlcXVpcmVkID0gY29sdW1ucy5zb21lKFxyXG4gICAgICAgIChjb2x1bW46IGFueSkgPT4gY29sdW1uLmVycm9yTWVzc2FnZSAmJiAhcm93W2NvbHVtbi5maWVsZF1cclxuICAgICAgKTtcclxuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcclxuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcclxuICAgICAgICAgICdSZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcnLFxyXG4gICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoJ1NvbWUgZmllbGRzIGFyZSBpbnZhbGlkJywgJ0lOVkFMSUQgRklFTEQnKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJvdyA6IGFueVxyXG4gICAqIEBwYXJhbSBpbmRleCA6IG51bWJlclxyXG4gICAqIENsZWFycyBvdXQgdGhlIGVkaXQgcm93IGFuZCByZXBsYWNlIHdpdGggcmVhZGFibGUgb25lXHJcbiAgICovXHJcbiAgb25Sb3dFZGl0Q2FuY2VsKHJvdzogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAocm93LmlzTmV3KSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93c0RhdGFbaW5kZXhdID0gdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dO1xyXG4gICAgICBkZWxldGUgdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMuZWRpdGluZ1Jvd0tleXNbcm93W3RoaXMuZGF0YUtleV1dO1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikge1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHJvdyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICBpZihPYmplY3QudmFsdWVzKHRoaXMuZWRpdGluZ1Jvd0tleXMpLmV2ZXJ5KCh2YWx1ZSk9PiAhdmFsdWUpKXtcclxuICAgICAgdGhpcy5zb3J0RGlzYWJsZWQgPSBmYWxzZTtcclxuICAgfSAgXHJcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gZmFsc2U7XHJcbiAgICB0aGlzLmlubGluZVJvd0NhbmNlbC5lbWl0KHJvdyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSByb3dcclxuICAgKiBTZW5kcyB0aGUgcm93IHBheWxvYWQgdG8gcGFyZW50IGZvciBkZWxldGlvblxyXG4gICAqL1xyXG5cclxuICAgLyoqXHJcbiAgICpzZXQgdGhlIGdyaWREYXRhIG9uIHJvdyBhY3Rpb25zIGV2ZW50c1xyXG4gICAqL1xyXG4gICByb3dBY3Rpb25FdmVudHMocm93SW5mbywgZGVsZXRlUm93OiBib29sZWFuID0gZmFsc2Upe1xyXG4gICAgbGV0IGFjdGlvbjogc3RyaW5nID0gJyc7XHJcbiAgICBsZXQgZ3JpZFJvd3NEYXRhOiBhbnlbXSA9IFsuLi50aGlzLnJvd3NEYXRhXTtcclxuICAgIGNvbnN0IGluZGV4ID0gZ3JpZFJvd3NEYXRhLmZpbmRJbmRleCgocm93RGF0YSk9PiByb3dJbmZvW3RoaXMuZGF0YUtleV0gPT09IHJvd0RhdGFbdGhpcy5kYXRhS2V5XSk7XHJcbiAgICBpZihpbmRleCA+IC0xKXtcclxuICAgICAgaWYoZGVsZXRlUm93KXsgXHJcbiAgICAgICAgZ3JpZFJvd3NEYXRhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgdGhpcy5yb3dzRGF0YSA9IFsuLi5ncmlkUm93c0RhdGFdO1xyXG4gICAgICAgIGFjdGlvbiA9ICdkZWxldGUnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmKHRoaXMuYWRkTmV3Um93Q2hlY2spe1xyXG4gICAgICAgICAgYWN0aW9uID0gJ2luc2VydCc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBhY3Rpb24gPSAndXBkYXRlJztcclxuICAgICAgICB9XHJcbiAgICAgIGlmKHRoaXMub25HcmlkUm93QWN0aW9ucy5vYnNlcnZlcnMubGVuZ3RoICE9PSAwKXtcclxuICAgICAgICByb3dJbmZvWydyb3dBY3Rpb24nXT0gYWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGdyaWRSb3dzRGF0YVtpbmRleF0gPSByb3dJbmZvO1xyXG4gICAgfVxyXG4gIH1cclxuICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcclxuICB0aGlzLm9uR3JpZFJvd0FjdGlvbnMuZW1pdChncmlkUm93c0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBEZWxldGUgY29uZmlybWF0aW9uIGRpYWxvZyB3aGVuIHRyeWluZyB0byBkZWxldGUgcm93XHJcbiAgICovXHJcbiAgZGVsZXRlUmVjb3JkKHJvdzogYW55KSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIG1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyByZWNvcmQ/JyxcclxuICAgICAgaGVhZGVyOiAnRGVsZXRlIENvbmZpcm1hdGlvbicsXHJcbiAgICAgIGljb246ICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsXHJcbiAgICAgIGtleTogJ2hhbmRsZUlubGluZUNSVUQnLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy51c2VTZXJ2ZXJTaWRlRXZlbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgdGhlIGdyaWQgZGVsZXRlZCBkYXRhIFxyXG4gICAgICAgIHRoaXMucm93QWN0aW9uRXZlbnRzKHJvdywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KHJvdyk7XHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlKCk7XHJcbiAgICAgICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlamVjdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUbyBzZXQgZGlzYWJsZWQgdGhlIGNvbnRyb2xcclxuICAgKi9cclxuICBhbGxvd0Rpc2FibGVkKGNvbHVtbjogYW55LCByb3c6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkXSkgPT09ICdvYmplY3QnICYmIHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24pIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy5hY3Rpb24gJiZcclxuICAgICAgICBPYmplY3Qua2V5cyhyb3dbY29sdW1uLmZpZWxkXS5hY3Rpb24pPy5pbmNsdWRlcygnZGlzYWJsZWQnKSAmJiByb3dbY29sdW1uLmZpZWxkXT8uYWN0aW9uPy5kaXNhYmxlZCA9PT0gdHJ1ZVxyXG4gICAgICApIHtcclxuICAgICAgICB2YWx1ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoY29sdW1uLmRpc2FibGVkIHx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UpIHtcclxuICAgICAgdmFsdWUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG8gc2V0IGFnZ3JlZ2F0ZSBpbiBncmlkIGZvb3RlclxyXG4gICAqL1xyXG4gIHNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uOiBJR3JpZENvbHVtbikge1xyXG4gICAgaWYgKGNvbHVtbj8uYWdncmVnYXRlKSB7XHJcbiAgICAgIGNvbHVtbi5hZ2dyZWdhdGUuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5yb3dzRGF0YSAmJiB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBjb2x1bW5UeXBlOiBFR3JpZEFnZ3JlZ2F0ZSA9IGNvbC50eXBlO1xyXG4gICAgICAgICAgaWYgKGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLkNPVU5UKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yb3dzRGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbC5hZ2dyVmFsdWUgPSB0aGlzLnNldEFnZ3JlZ2F0ZUZvb3RlclRleHQoY29sLCBjb3VudCwgJ0NvdW50Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb2x1bW5UeXBlID09PSBFR3JpZEFnZ3JlZ2F0ZS5TVU0gfHxcclxuICAgICAgICAgICAgY29sdW1uVHlwZSA9PT0gRUdyaWRBZ2dyZWdhdGUuQVZFUkFHRVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbFZhbHVlczogbnVtYmVyW10gPSB0aGlzLmdldENvbHVtblZhbHVlcyhjb2x1bW4pO1xyXG4gICAgICAgICAgICBpZiAoY29sVmFsdWVzICYmIGNvbFZhbHVlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3VtID0gY29sVmFsdWVzLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1ciwgMCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLlNVTSkge1xyXG4gICAgICAgICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9IHRoaXMuc2V0QWdncmVnYXRlRm9vdGVyVGV4dChjb2wsIHN1bSwgJ1N1bScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoY29sdW1uVHlwZSA9PT0gRUdyaWRBZ2dyZWdhdGUuQVZFUkFHRSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXZlcmFnZSA9IHN1bSAvIGNvbFZhbHVlcy5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgICAgIGNvbC5hZ2dyVmFsdWUgPSB0aGlzLnNldEFnZ3JlZ2F0ZUZvb3RlclRleHQoXHJcbiAgICAgICAgICAgICAgICAgIGNvbCxcclxuICAgICAgICAgICAgICAgICAgYXZlcmFnZSxcclxuICAgICAgICAgICAgICAgICAgJ0F2ZydcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbC5hZ2dyVmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0IGdyaWQgQWdncmVnYXRlIHZhbHVlc1xyXG4gICAqL1xyXG4gIHNldEFnZ3JlZ2F0ZUZvb3RlclRleHQoY29sdW1uOiBhbnksIHZhbHVlOiBudW1iZXIsIGRlZmF1bHRDYXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlzRGVjaW1hbEZvcm1hdDogYm9vbGVhbiA9IGNvbHVtbi5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJztcclxuICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBjb2x1bW4uZm9ybWF0Py5kaWdpdHNJbmZvO1xyXG4gICAgY29uc3QgY2FwdGlvbjogc3RyaW5nID1cclxuICAgICAgY29sdW1uLmNhcHRpb24/Lmxlbmd0aCA+IDAgPyBjb2x1bW4uY2FwdGlvbiA6IGRlZmF1bHRDYXB0aW9uO1xyXG5cclxuICAgIGNvbnN0IGRlY2ltYWxQb2ludCA9IGlzRGVjaW1hbEZvcm1hdFxyXG4gICAgICA/IHZhbHVlPy50b0ZpeGVkKGRpZ2l0c0luZm8gPyBkaWdpdHNJbmZvIDogMilcclxuICAgICAgOiB2YWx1ZT8udG9GaXhlZCgwKTtcclxuICAgIHJldHVybiBgJHtjYXB0aW9ufSAke2RlY2ltYWxQb2ludFxyXG4gICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKX0gPC9icj5gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0IGRlY2ltYXQgYW5kIG51bWVyaWMgdmFsdWVzXHJcbiAgICovXHJcbiAgc2V0TnVtZXJpY1ZhbHVlcygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5yb3dzRGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcclxuICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdCgocm93W2NvbHVtbi5maWVsZF0gLyAxMDApPy50b1N0cmluZygpKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkXSAvIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcclxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdChyb3dbY29sdW1uLmZpZWxkXSkudG9GaXhlZChkaWdpdHNJbmZvKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdChyb3dbY29sdW1uLmZpZWxkXSkudG9GaXhlZChkaWdpdHNJbmZvID8gZGlnaXRzSW5mbyA6IDIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgY29sdW1uIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiBmaWVsZFxyXG4gICAqL1xyXG4gIGdldENvbHVtblZhbHVlcyhjb2x1bW46IElHcmlkQ29sdW1uKSB7XHJcbiAgICBsZXQgYXJyOiBhbnkgPSBbXTtcclxuICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcclxuICAgICAga2V5cy5tYXAoKGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChjb2x1bW4uZmllbGQgPT09IGtleSkge1xyXG4gICAgICAgICAgYXJyLnB1c2gocm93W2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEV4cG9ydCB0byBQREZcclxuICAgKi9cclxuICBleHBvcnRQZGYoKSB7XHJcbiAgICB2YXIgZXhwb3J0RGF0YSA9IHRoaXMuc2V0RXhwb3J0RGF0YShbLi4udGhpcy5yb3dzRGF0YV0sIHRydWUpO1xyXG4gICAgbGV0IGRvYyA9IG5ldyBqc1BERigncCcsICdwdCcpO1xyXG4gICAgZG9jLnRhYmxlKDEsIDEsIGV4cG9ydERhdGEucm93cywgZXhwb3J0RGF0YS5oZWFkaW5ncywgeyBhdXRvU2l6ZTogdHJ1ZSB9KTtcclxuICAgIGRvYy5zYXZlKCdFeHBvcnQucGRmJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiAgU3ViLWZ1bmN0aW9uIHRvIHNldCByb3dzIGZvciBleHBvcnQgdG8gUGRmLCBhbmQgRXhjZWxcclxuICAgKiBAcm93cyBwYXJhbSBmb3Igcm93c1xyXG4gICAqIEBpc0V4Y2VsIHBhcmFtIGZvciBleHBvcnQgdG8gZXhjZWwgaW5kaWNhdGlvblxyXG4gICAqL1xyXG4gIHNldEV4cG9ydERhdGEocm93czogYW55W10gPSBbXSwgaXNQZGY6IGJvb2xlYW4gPSBmYWxzZSk6IElHcmlkRGF0YUV4cG9ydCB7XHJcbiAgICBjb25zdCBoZWFkaW5nczogYW55ID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZmllbGQpO1xyXG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgZm9yICh2YXIgcHJvcCBpbiByb3cpIHtcclxuICAgICAgICBpZiAoIWhlYWRpbmdzLmluY2x1ZGVzKHByb3ApKSB7XHJcbiAgICAgICAgICBkZWxldGUgcm93W3Byb3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNQZGYpIHtcclxuICAgICAgICAgIHJvd1twcm9wXSA9XHJcbiAgICAgICAgICAgICFyb3dbcHJvcF0gJiYgdHlwZW9mIHJvd1twcm9wXSAhPT0gJ2Jvb2xlYW4nXHJcbiAgICAgICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgICAgIDogcm93W3Byb3BdLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IHJvd3MsIGhlYWRpbmdzIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEV4cG9ydCB0byBFeGNlbFxyXG4gICAqL1xyXG4gIGV4cG9ydEV4Y2VsKCkge1xyXG4gICAgbGV0IGV4cG9ydERhdGE6IGFueSA9IHRoaXMuZXhwb3J0RGF0YVRvRXhjZWwoKTtcclxuICAgIGltcG9ydCgneGxzeCcpLnRoZW4oKHhsc3gpID0+IHtcclxuICAgICAgY29uc3Qgd29ya3NoZWV0OiBXb3JrU2hlZXQgPSB4bHN4LnV0aWxzLmpzb25fdG9fc2hlZXQoZXhwb3J0RGF0YSk7XHJcblxyXG4gICAgICBsZXQgcm93SW5kZXggPSAwO1xyXG4gICAgICBleHBvcnREYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbEluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlOiBzdHJpbmcgPSByb3dbY29sLmhlYWRlcl07XHJcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlICYmIGNlbGxWYWx1ZS5sZW5ndGggPiAwICYmIGNlbGxWYWx1ZS5pbmRleE9mKCd8JykgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmtUZXh0OiBzdHJpbmcgPSBjZWxsVmFsdWUuc3BsaXQoJ3wnKVswXTtcclxuICAgICAgICAgICAgbGV0IGxpbmtVcmw6IHN0cmluZyA9IGNlbGxWYWx1ZS5zcGxpdCgnfCcpWzFdO1xyXG4gICAgICAgICAgICBpZiAobGlua1VybCAmJiAhbGlua1VybC5zdGFydHNXaXRoKCdodHRwJykpIHtcclxuICAgICAgICAgICAgICBpZiAoIWxpbmtVcmwuc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5rVXJsID0gJy8nICsgbGlua1VybDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxpbmtVcmwgPVxyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICtcclxuICAgICAgICAgICAgICAgICcvLycgK1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICtcclxuICAgICAgICAgICAgICAgIGxpbmtVcmw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxBZGRyZXNzID0geGxzeC51dGlscy5lbmNvZGVfY2VsbCh7XHJcbiAgICAgICAgICAgICAgYzogY29sSW5kZXgsXHJcbiAgICAgICAgICAgICAgcjogcm93SW5kZXggKyAxLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHdvcmtzaGVldFtjZWxsQWRkcmVzc10gPSB7XHJcbiAgICAgICAgICAgICAgZjogYD1IWVBFUkxJTksoXCIke2xpbmtVcmx9XCIsIFwiJHtsaW5rVGV4dH1cIilgLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbEluZGV4Kys7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvd0luZGV4Kys7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB7XHJcbiAgICAgICAgU2hlZXRzOiB7IHNoZWV0MTogd29ya3NoZWV0IH0sXHJcbiAgICAgICAgU2hlZXROYW1lczogWydzaGVldDEnXSxcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgZXhjZWxCdWZmZXI6IGFueSA9IHhsc3gud3JpdGUod29ya2Jvb2ssIHtcclxuICAgICAgICBib29rVHlwZTogJ3hsc3gnLFxyXG4gICAgICAgIHR5cGU6ICdhcnJheScsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNhdmVBc0V4Y2VsRmlsZShleGNlbEJ1ZmZlciwgJ0V4cG9ydC54bHN4Jyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydERhdGFUb0V4Y2VsKCkge1xyXG4gICAgbGV0IGFycjogYW55ID0gW107XHJcbiAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRIZWFkZXIgPSBjb2x1bW4uaGVhZGVyO1xyXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxJTkspIHtcclxuICAgICAgICAgIGNvbnN0IGxpbmtPYmogPSByb3dbY29sdW1uLmRpc3BsYXlUZXh0Py50b0xvd2VyQ2FzZSgpICsgJ19vYmonXTtcclxuICAgICAgICAgIG9ialtncmlkSGVhZGVyXSA9IHJvd1tjb2x1bW4uZmllbGRdICsgJ3wnICsgbGlua09iaj8uaHlwZXJsaW5rO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYmpbZ3JpZEhlYWRlcl0gPSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgYXJyLnB1c2gob2JqKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFycjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogRXhwb3J0IHRvIGV4Y2VsIChzdWItbWV0aG9kKVxyXG4gICAqL1xyXG4gIHNhdmVBc0V4Y2VsRmlsZShidWZmZXI6IGFueSwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaW1wb3J0KCdmaWxlLXNhdmVyJykudGhlbigoRmlsZVNhdmVyKSA9PiB7XHJcbiAgICAgIGxldCBFWENFTF9UWVBFID1cclxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBFWENFTF9UWVBFIH0pO1xyXG4gICAgICBzYXZlQXMoZGF0YSwgZmlsZU5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKnNldCBjb25maWcgZGF0YSBvZiBsb29rdXAgY29udHJvbCBkaWFsb2dcclxuICAgKi9cclxuICBzZXRMb29rdXBEaWFsb2dDb25maWcocm93OiBhbnksIGNvbHVtbjogYW55LCBkYXRhOiBhbnkpIHtcclxuICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xyXG4gICAgaWYgKHJvd1tjb2x1bW4uZmllbGRdICYmIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5maWVsZF0udGV4dDtcclxuICAgIH0gZWxzZSBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCAmJiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0pIHtcclxuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbHVtbi5maWVsZCAmJiB0eXBlb2Ygcm93W2NvbHVtbi5maWVsZF0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IG5ld1JvdyA9IHsgLi4ucm93IH07XHJcbiAgICAgIG5ld1Jvd1tjb2x1bW4uZmllbGRdID0gbmV3Um93W2NvbHVtbi5maWVsZF0/LnZhbHVlO1xyXG4gICAgICByb3cgPSB7IC4uLm5ld1JvdyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkxPT0tVUF9JTlBVVCAmJiBkYXRhKSB7XHJcbiAgICAgIGxldCBvYmogPSB1dGlsaXRpZXMuYXV0b1NldExvb2t1cERhdGEoZGF0YSwgcm93KTtcclxuICAgICAgcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddID0gb2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcm93RGF0YTogcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddLFxyXG4gICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcclxuICAgICAgY29sdW1uOiBjb2x1bW4sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBsaW5rIG9uIGxvb2t1cENvbnRyb2wgY29udHJvbCBpbiByZWFkIG9ubHkgbW9kZSB3aGVuIGVkaXRMaW5rIHNldCB0cnVlXHJcbiAgICovXHJcbiAgb3Blbkxvb2t1cEh5cGVybGluayhjb2x1bW46IElHcmlkQ29sdW1uLCByb3c6IGFueSkge1xyXG4gICAgaWYgKGNvbHVtbi5lZGl0TGluayA9PT0gdHJ1ZSAmJiBjb2x1bW4uY29tcG9uZW50KSB7XHJcbiAgICAgIGxldCBvYmo6IGFueSA9IHRoaXMuc2V0TG9va3VwRGlhbG9nQ29uZmlnKHJvdywgY29sdW1uLCBjb2x1bW4uZGF0YT8uZGF0YSk7XHJcbiAgICAgIG9ialsnY29tcG9uZW50J10gPSBjb2x1bW4uY29tcG9uZW50O1xyXG4gICAgICBjb25zdCByZWYgPSB0aGlzLm9wZW5Mb29rdXBEaWFsb2cob2JqKTtcclxuICAgICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIGNvbHVtbi5vblJldHVybikge1xyXG4gICAgICAgICAgY29sdW1uLm9uUmV0dXJuKHJlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG9wZW4gbG9va3VwIERpYWxvZ1xyXG4gICAqL1xyXG4gIG9wZW5Mb29rdXBEaWFsb2coY29sdW1uOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbHVtbkRhdGEgPSBjb2x1bW4uY29sdW1uPy5sb29rdXBDb250cm9sPy5kYXRhID8gIGNvbHVtbi5jb2x1bW4ubG9va3VwQ29udHJvbC5kYXRhIDogY29sdW1uLmNvbHVtbi5kYXRhXHJcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihjb2x1bW4uY29tcG9uZW50LCB7XHJcbiAgICAgIC4uLmNvbHVtbkRhdGEsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBzZWxlY3Rpb246IGNvbHVtbi5zZWxlY3Rpb24sXHJcbiAgICAgICAgZmllbGQ6IGNvbHVtbi5jb2x1bW4uZmllbGQsXHJcbiAgICAgICAgdmFsdWVGaWVsZDogY29sdW1uLmNvbHVtbi5sb29rdXBDb250cm9sPy5kYXRhPy52YWx1ZUZpZWxkLFxyXG4gICAgICAgIC4uLmNvbHVtbi5yb3dEYXRhLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29sdW1uLmNvbXBvbmVudD8ubmFtZTtcclxuICAgIGlmKGNvbXBvbmVudE5hbWUpe1xyXG4gICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyh0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSwgY29tcG9uZW50TmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxyXG4gICAqL1xyXG4gIHNlbGVjdExvb2t1cEZpZWxkKGNvbHVtbjogYW55LCByb3c/OiBhbnkpIHtcclxuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcclxuICAgIHRoaXMubG9va3VwT2JqZWN0ID0geyB0ZXh0OiAnJywgdmFsdWU6ICcnLCBmaWVsZDogJycgfTtcclxuICAgIGlmIChjb2x1bW4ubG9va3VwQ29udHJvbCkge1xyXG4gICAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLnNldExvb2t1cERpYWxvZ0NvbmZpZyhcclxuICAgICAgICByb3csXHJcbiAgICAgICAgY29sdW1uLFxyXG4gICAgICAgIGNvbHVtbi5sb29rdXBDb250cm9sLmRhdGE/LmRhdGFcclxuICAgICAgKTtcclxuICAgICAgb2JqWydjb21wb25lbnQnXSA9IGNvbHVtbi5sb29rdXBDb250cm9sLmNvbXBvbmVudDtcclxuICAgICAgY29uc3QgcmVmID0gdGhpcy5vcGVuTG9va3VwRGlhbG9nKG9iaik7XHJcbiAgICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZShcclxuICAgICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uLm9uUmV0dXJuKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbi5vblJldHVybihyZXMsIHJvdyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcclxuICAgICAgICAgICAgICBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgY29sdW1uLmxvb2t1cENvbnRyb2wsXHJcbiAgICAgICAgICAgICAgcmVzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNbY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXNbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCldLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy5sb29rdXBPYmplY3QgPSByb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHZhbHVlWydmaWVsZCddID0gY29sdW1uLmZpZWxkO1xyXG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gdmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByZXNbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0gIT09IG9iai5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcclxuICAgICAgICAgICAgaWYoY29sdW1uLm9uQ2hhbmdlKXtcclxuICAgICAgICAgICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKHsgZXJyb3IgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZpbHRlckxvb2t1cChjb2x1bW46IGFueSkge1xyXG4gICAgdGhpcy5ncmlkU2VydmljZS5zZXRMb29rVXBGaWx0ZXIoY29sdW1uLCB0aGlzLmRpYWxvZ1NlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgY2FsZW5kZXIgdmFsdWUgaXMgY2hhbmdlZCBvciBub3RcclxuICBjYWxlbmRlckNoYW5nZUV2ZW50KGNvbHVtbjogYW55LCByb3c6IGFueSkge1xyXG4gICAgbGV0IHZhbHVlQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIGNvbHVtbi50aW1lT25seSAmJlxyXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkXSwgJ2hoOm1tJykgIT09XHJcbiAgICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5jYWxlbmRlclByZXZpb3VzVmFsdWUsICdoaDptbScpXHJcbiAgICApIHtcclxuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgY29sdW1uLnNob3dUaW1lICYmXHJcbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHJvd1tjb2x1bW4uZmllbGRdLCAneXl5eS1NTS1kZCBoaDptbScpICE9PVxyXG4gICAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kZXJQcmV2aW91c1ZhbHVlLCAneXl5eS1NTS1kZCBoaDptbScpXHJcbiAgICApIHtcclxuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZF0sICd5eXl5LU1NLWRkJykgIT09XHJcbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kZXJQcmV2aW91c1ZhbHVlLCAneXl5eS1NTS1kZCcpXHJcbiAgICApIHtcclxuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYodmFsdWVDaGFuZ2Upe1xyXG4gICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xyXG4gICAgICBpZihjb2x1bW4ub25DaGFuZ2Upe1xyXG4gICAgICAgIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhbGVuZGVyUHJldmlvdXNWYWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgb25Gb2N1c091dEV2ZW50KGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdzogYW55KSB7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2NvbHVtbl0sIHJvdyk7XHJcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFKSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kZXJDaGFuZ2VFdmVudChjb2x1bW4sIHJvdyk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29sdW1uLm9uRm9jdXNPdXQpIHtcclxuICAgICAgY29sdW1uLm9uRm9jdXNPdXQocm93KTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGNvbHVtbi5vblJldHVybiAmJlxyXG4gICAgICBjb2x1bW4udHlwZSAhPT0gRUdyaWRDb2x1bW5UeXBlLkxPT0tVUF9JTlBVVFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbHVtbi5vblJldHVybihyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyRm9jdXNPdXQoY29sOiBhbnksIGZpbHRlcj86IGFueSwgZXZlbnQ/OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JpZEZpbHRlck9iaiA9IHsgY29sdW1uOiBjb2wsIGZpbHRlcjogZmlsdGVyLCBldmVudDogZXZlbnQgfTtcclxuICAgIGNvbnN0IG5ld0NvbHVtbjogYW55ID0geyAuLi5jb2wgfTtcclxuICAgIC8vY2hhbmdlIGZpbHRlciBjYWxlbmRlciBmb3JtYXRcclxuICAgIGlmIChuZXdDb2x1bW4udHlwZSA9PT0gJ2RhdGUnICYmIG5ld0NvbHVtbi52YWx1ZSkge1xyXG4gICAgICBuZXdDb2x1bW4udmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShcclxuICAgICAgICBjb2wudmFsdWUudG9TdHJpbmcoKS50cmltKCksXHJcbiAgICAgICAgJ3l5eXktTU0tZGQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPYmoobmV3Q29sdW1uKTtcclxuICAgICAgfSxcclxuICAgICAgbmV3Q29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgPyAyNTAgOiAwXHJcbiAgICApO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck9iaihjb2w6IGFueSkge1xyXG4gICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICBtYXRjaE1vZGU6IGNvbC5tYXRjaE1vZGUgPyBjb2wubWF0Y2hNb2RlIDogJ3N0YXJ0c1dpdGgnLFxyXG4gICAgICBvcGVyYXRvcjogY29sLm9wZXJhdG9yID8gY29sLm9wZXJhdG9yIDogJ2FuZCcsXHJcbiAgICAgIHRhYmxlQWxpYXM6IGNvbC50YWJsZUFsaWFzID8gY29sLnRhYmxlQWxpYXMgOiAnJyxcclxuICAgICAgdmFsdWU6IGNvbC52YWx1ZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5wdXNoKG9iaik7XHJcbiAgfVxyXG5cclxuICBhcHBseUVudGVyRXZlbnQoZmlsdGVyOiBhbnksIGV2ZW50OiBhbnksIGNvbHVtbjogYW55KSB7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSB0cnVlO1xyXG4gICAgdGhpcy5hdXRvTG9hZERhdGEgPSB0cnVlO1xyXG4gICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcclxuICAgIHRoaXMuZmlsdGVyT2JqKGNvbHVtbik7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XHJcbiAgICBpZiAoY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09IHRoaXMuZHJvcERvd25GaWx0ZXI/LmNvbHVtbj8uZmlsdGVyPy50eXBlKSB7XHJcbiAgICAgIHRoaXMuZHJvcERvd25GaWx0ZXIuZmlsdGVyKHRoaXMuZHJvcERvd25GaWx0ZXIuZXZlbnQudGFyZ2V0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlcihldmVudC50YXJnZXQudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTnVsbENhbGVuZGFyKGNvbHVtbjogSUdyaWRDb2x1bW4sIGZpbHRlcjogYW55LCBldmVudDogYW55KSB7XHJcbiAgICBpZiAoY29sdW1uLnZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcclxuICAgICAgdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYmFja3NwYWNlRXZlbnQoZXZlbnQ6IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIGlmIChcclxuICAgICAgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJlxyXG4gICAgICAoY29sdW1uLnZhbHVlPy50b1N0cmluZygpLmxlbmd0aCA9PT0gMSB8fFxyXG4gICAgICAgIGNvbHVtbi52YWx1ZT8udG9TdHJpbmcoKSA9PT0gJycgfHxcclxuICAgICAgICBjb2x1bW4udmFsdWUgPT09IG51bGwpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZW1vdmVOdWxsRmlsdGVycyhjb2x1bW4pO1xyXG4gICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRBVEUgJiYgY29sdW1uLnZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZU51bGxGaWx0ZXJzKGNvbHVtbjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkgJiYgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgYXJyID0gWy4uLnRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5XTtcclxuICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCgoaSkgPT4gaS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKTtcclxuICAgICAgYXJyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5ID0gYXJyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZpbmcgSGVhZGVyIEZpbHRlciBWYWx1ZSB1c2luZyBCYWNrc3BhY2Uga2V5IEV2ZW50IG9yIERlbGV0ZSBrZXkgRXZlbnQuXHJcbiAgcmVtb3ZpbmdGaWx0ZXJzKGV2ZW50OiBhbnksIGNvbHVtbjogSUdyaWRDb2x1bW4pIHtcclxuICAgIGlmIChcclxuICAgICAgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgfHwgZXZlbnQua2V5ID09PSAnRGVsZXRlJykgJiZcclxuICAgICAgY29sdW1uLnZhbHVlPy50b1N0cmluZygpLmxlbmd0aCA9PT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzZWFyY2hGaWx0ZXJzO1xyXG4gICAgICBpZighdGhpcy5zb2Z0Q2FjaGluZyl7XHJcbiAgICAgICAgc2VhcmNoRmlsdGVycyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCkpIGFzIGFueSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHNlYXJjaEZpbHRlcnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t1dGlsaXRpZXMuY3VycmVudFVybCgpXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VhcmNoRmlsdGVycyAmJiBzZWFyY2hGaWx0ZXJzLmZpbHRlcnMpIHtcclxuICAgICAgICBpZiAoc2VhcmNoRmlsdGVycy5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBpbmRleCA9IHNlYXJjaEZpbHRlcnMuZmlsdGVycy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICh4OiBhbnkpID0+IHguZmllbGQgPT09IGNvbHVtbi5maWVsZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaEZpbHRlcnMuZmlsdGVycy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU2V0RmlsdGVycy0nICsgdXRpbGl0aWVzLmN1cnJlbnRVcmwoKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgaWYoIXRoaXMuc29mdENhY2hpbmcpe1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHV0aWxpdGllcy5jdXJyZW50VXJsKCksSlNPTi5zdHJpbmdpZnkoc2VhcmNoRmlsdGVycykpO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3V0aWxpdGllcy5jdXJyZW50VXJsKCldID0gc2VhcmNoRmlsdGVycztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFkZCBDbGljayBCdXR0b24gRXZlbnQgb24gR3JpZC5cclxuICBvbkNsaWNrQnV0dG9uKGNvbHVtbjogYW55LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5vcGVuR3JpZERpYWxvZyhjb2x1bW4sIHJvdyk7XHJcbiAgfVxyXG5cclxuICAvLyBJbnZva2Ugb25DbGljayBFdmVudC5cclxuICBvbkNsaWNrRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XHJcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmIHJvd1tjb2x1bW4uZmllbGRdKSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kZXJQcmV2aW91c1ZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAhcm93W2NvbHVtbi5maWVsZF0gJiZcclxuICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmXHJcbiAgICAgIChjb2x1bW4uc2hvd1RpbWUgfHwgY29sdW1uLnRpbWVPbmx5KSAmJlxyXG4gICAgICBjb2x1bW4ubWludXRlc0ludGVydmFsXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5kZWZhdWx0RGF0ZSA9IG5ldyBEYXRlKHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwobmV3IERhdGUoKSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4ub25DbGljaykge1xyXG4gICAgICBjb2x1bW4ub25DbGljayhyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc2V0IHRoZSBzZWxlY3QgdmFsdWUgb2YgbXVsdGktc2VsZWN0XHJcbiAgc2hvd09wdGlvbihjb2x1bW4sIHJvdyl7XHJcbiAgICBpZihyb3dbY29sdW1uLmZpZWxkXSl7XHJcbiAgICAgIGlmKHR5cGVvZihyb3dbY29sdW1uLmZpZWxkXSkgPT09IFwic3RyaW5nXCIgJiYgIXJvd1tjb2x1bW4uZmllbGRdLmluY2x1ZGVzKCcsJykpe1xyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gW3Jvd1tjb2x1bW4uZmllbGRdXTtcclxuICAgICB9IGVsc2UgaWYocm93W2NvbHVtbi5maWVsZF0uaW5jbHVkZXMoJywnKSl7XHJcbiAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdLnNwbGl0KCcsJyk7XHJcbiAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhclZhbHVlKGNvbHVtbiwgcm93KXtcclxuICAgIGlmKGNvbHVtbj8udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRST1BET1dOICYmICFyb3dbY29sdW1uLmZpZWxkXSl7XHJcbiAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEludm9rZSBvbkNoYW5nZSBFdmVudFxyXG4gIG9uQ2hhbmdlRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XHJcbiAgICAvLyBzZXQgZHJvcGRvd24gZGlzcGxheUZpZWxkIHZhbHVlIGJhc2Ugb24gb3B0aW9uTGFiZWwgJiBvcHRpb25WYWx1ZS5cclxuICAgIHRoaXMuZGlzcGxheUZpZWxkRHJvcGRvd25WYWx1ZShjb2x1bW4sIHJvdyk7XHJcbiAgICB0aGlzLm9uQ2xlYXJWYWx1ZShjb2x1bW4sIHJvdyk7XHJcbiAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xyXG4gICAgaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xyXG4gICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrQm94Q2hhbmdlRXZlbnQoZXZlbnQ6YW55LGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdyl7XHJcbiAgICByb3dbY29sdW1uLmZpZWxkXSA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8gc2V0IGRyb3Bkb3duIGRpc3BsYXlGaWVsZCB2YWx1ZSBiYXNlIG9uIG9wdGlvbkxhYmVsICYgb3B0aW9uVmFsdWUuXHJcbiAgZGlzcGxheUZpZWxkRHJvcGRvd25WYWx1ZShjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcclxuICAgIGlmIChcclxuICAgICAgY29sdW1uPy50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiZcclxuICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCAmJlxyXG4gICAgICBjb2x1bW4uZGlzcGxheUZpZWxkPy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qga2V5OiBhbnkgPSBPYmplY3Qua2V5cyhyb3cpPy5maW5kKFxyXG4gICAgICAgIChyb3dJbmZvKSA9PlxyXG4gICAgICAgICAgcm93SW5mbz8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZFZhbHVlID0gY29sdW1uLmRhdGEuZmluZChcclxuICAgICAgICAocmVjb3JkOiBhbnkpID0+XHJcbiAgICAgICAgICByZWNvcmRbY29sdW1uLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSA9PT1cclxuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChrZXkgJiYgZGlzcGxheUZpZWxkVmFsdWUpIHtcclxuICAgICAgICByb3dba2V5XSA9IGRpc3BsYXlGaWVsZFZhbHVlW2NvbHVtbi5vcHRpb25MYWJlbF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFkZCBhdXRvU2VhcmNoIG9uIEdyaWQuXHJcbiAgYXV0b1NlYXJjaChldmVudDogYW55LCBjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcclxuICAgIGlmIChldmVudCAmJiBjb2x1bW4gJiYgcm93KSB7XHJcbiAgICAgIGNvbHVtbi5vblJldHVybihldmVudC5xdWVyeSwgY29sdW1uLCByb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZlIEZpbHRlclZhbHVlc1xyXG4gIGNsZWFyZ3JpZEZpbHRlcnNWYWx1ZSgpIHtcclxuICAgIGNvbnN0IGdsb2JhbEZpbHRlckNsZWFyVmFsdWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcclxuICAgICAgJ2NsZWFyR2xvYmFsRmlsdGVyQnRuJ1xyXG4gICAgKTtcclxuICAgIGlmIChnbG9iYWxGaWx0ZXJDbGVhclZhbHVlQnRuKSB7XHJcbiAgICAgIGdsb2JhbEZpbHRlckNsZWFyVmFsdWVCdG4uY2xpY2soKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1ucyAmJiB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICAgIGNvbC52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPYmooY29sKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlZGl0QWxsUm93c0F0T25jZSgpIHtcclxuICAgIGlmKHRoaXMuZWRpdFJvd1Blcm1pc3Npb24pe1xyXG4gICAgaWYgKHRoaXMuZ2V0Q2xhc3NGb3JFZGl0QWxsUm93cygnZWRpdFJvdycpKSB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnNvbWUoKGNvbHVtbik9PiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4gJiYgKGNvbHVtbi5maWx0ZXJpbmcgPT09IHRydWUgfHwgY29sdW1uLmZpbHRlcmluZyA9PT0gdW5kZWZpbmVkKSkpe1xyXG4gICAgICAgIHRoaXMuZWRpdEFsbFJlY29yZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oaWRlRWRpdEFsbFJvd3NCdG4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zb3J0RGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB9XHJcblxyXG4gIHNhdmVBbGxSb3dzQXRPbmNlKCkge1xyXG4gICAgdGhpcy5nZXRDbGFzc0ZvckVkaXRBbGxSb3dzKCdzYXZlUm93Jyk7XHJcbiAgfVxyXG5cclxuICAvLyByZXNldCB0aGUgZ3JpZCByb3dzVmFsdWUgdG8gb3JpZ25hbCB2YWx1ZXNcclxuICBjYW5jZWxBbGxSb3dzQXRPbmNlKCkge1xyXG4gICAgdGhpcy5yb3dzRGF0YSA9IFsuLi50aGlzLnJvd3NEYXRhQ29weV07XHJcbiAgICB0aGlzLnJvd3NEYXRhQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzRGF0YSkpO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnM/LmZvckVhY2goKGNvbHVtbik9PntcclxuICAgICAgaWYoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFKXtcclxuICAgICAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpPT57XHJcbiAgICAgICAgICBpZihyb3dbY29sdW1uLmZpZWxkXSl7XHJcbiAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPSBuZXcgRGF0ZShyb3dbY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkNhbmNlbEFsbFJvd3MuZW1pdCh0aGlzLnJvd3NEYXRhKTtcclxuICB9XHJcblxyXG4gIGdldENsYXNzRm9yRWRpdEFsbFJvd3MoY2xhc3NOYW1lOiBzdHJpbmcgPSAnJykge1xyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IGdldEJ0bnM6IGFueSA9XHJcbiAgICAgIHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgaWYgKGdldEJ0bnMgJiYgZ2V0QnRucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICBpZiAoY2xhc3NOYW1lID09PSAnc2F2ZVJvdycpIHtcclxuICAgICAgICB0aGlzLmVkaXRBbGxSZWNvcmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IHJlY29yZHMkID0gW107XHJcbiAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBnZXRCdG5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd1NhdmUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlY29yZHMkLnB1c2gocm93U2F2ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChyZWNvcmRzJCkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBQUFBXCIpO1xyXG4gICAgICAgICAgICB0aGlzLm9uUm93VXBkYXRlLmVtaXQodGhpcy5zYXZlUmVjb3JkQXJyYXkpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVSZWNvcmRBcnJheSA9IFtdO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwyMClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGdldEJ0bnMpIHtcclxuICAgICAgICAgIGlmKGNsYXNzTmFtZSA9PSAnY2FuY2VsUm93Jyl7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGl0ZW0uY2xpY2soKTtcclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGl0ZW0uY2xpY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgLy9Gb2N1c2VkIGNhbGVuZGVyIGlucHV0IG9uIHNlbGVjdCBkYXRlXHJcbiAgc2VsZWN0RGF0ZShjb2x1bW46IGFueSkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29sdW1uLmZpZWxkKT8uZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIC8vYXBwbHkgZmlsdGVyIG9uIGdyaWQgd2hlbiBzZWFyY2ggYnRuIGNsaWNrZWRcclxuICBhcHBseUdpcmRGaWx0ZXJCdG4oKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkRmlsdGVyT2JqICYmIE9iamVjdC5rZXlzKHRoaXMuZ3JpZEZpbHRlck9iaikubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmFwcGx5RW50ZXJFdmVudChcclxuICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouZmlsdGVyLFxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlck9iai5ldmVudCxcclxuICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouY29sdW1uXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBpbnZva2UgbXVsdGlTZWxlY3Rpb24gY2xpY2sgZXZlbnRcclxuICBtdWx0aUNoZWNrQm94T25jbGljayhyb3dJbmZvOiBhbnkpIHtcclxuICAgIGlmIChyb3dJbmZvKSB7XHJcbiAgICAgIHRoaXMub25NdWx0aVNlbGVjdGlvbkNoYW5nZS5lbWl0KHJvd0luZm8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXI6IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgZmlsdGVyKGV2ZW50LnRhcmdldCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hEcm9wZG93bkZpbHRlcihmaWx0ZXI6IGFueSwgZXZlbnQ6IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uLCBmaWx0ZXIsIGV2ZW50KTtcclxuICAgIHRoaXMuZHJvcERvd25GaWx0ZXIgPSB7IGZpbHRlcjogZmlsdGVyLCBldmVudDogZXZlbnQsIGNvbHVtbjogY29sdW1uIH07XHJcbiAgICBpZiAoY29sdW1uLmFsbG93U2VhcmNoICE9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXIsIGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvb2t1cENsZWFyVmFsdWUoY29sdW1uOiBhbnksIHJvdz86IGFueSkge1xyXG4gICAgaWYgKHJvdykge1xyXG4gICAgICByb3dbY29sdW1uLmZpZWxkXSA9ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29sdW1uLnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcclxuICAgIH1cclxuICAgIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XHJcbiAgICBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XHJcbiAgICAgIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gaW52b2tlIHdoZW4gY2xpY2sgaGVhZGVyIGNoZWNrYm94IGZpbHRlclxyXG4gIGNsaWNrQ2hlY2tCb3hGaWx0ZXIoY29sdW1uOiBJR3JpZENvbHVtbikge1xyXG4gICAgaWYgKHRoaXMuZWRpdEFsbFJlY29yZCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQk9PTEVBTiBcclxuICAgICAgICAgICYmXHJcbiAgICAgICAgICBjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NoZWNrYm94JyAmJiBjb2x1bW4uZmlsdGVyaW5nICE9IGZhbHNlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi52YWx1ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy90aGlzLm9uQ2hlY2tCb3hGaWx0ZXJDbGljay5lbWl0KGNvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5vbkNoZWNrQm94RmlsdGVyQ2xpY2suZW1pdChjb2x1bW4pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkNoZWNrQm94RmlsdGVyQ2xpY2suZW1pdChjb2x1bW4pO1xyXG4gIH1cclxuICAgIC8vc2V0IGhlYWRlciBjaGVja2JveCB2YWx1ZSBmb3IgZ2V0dGluZyBhbGwgY29sdW1ucyBvbiBzdGF5IGFkbWluXHJcbiAgICBzZXRIZWFkZXJDaGVja0JveFZhbHVlKHZhbHVlOiBhbnkpe1xyXG4gICAgICB0aGlzLmlzSW5jbHVkZWRBbGxDb2x1bW5zLmVtaXQodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgLy8gc2V0IGNhbGVuZGVyIDIgT3IgNCBkaWdpdCB5ZWFyIGZvcm1hdFxyXG4gIGNhbGVuZGVySW5wdXRWYWx1ZShjb2x1bW46IGFueSwgcm93OiBhbnkpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjb2x1bW4uZmllbGQgKyByb3dbdGhpcy5kYXRhS2V5XSlbMF0/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKHZhbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XHJcbiAgICAgIGlmKCB5ZWFyICYmIHllYXIubGVuZ3RoID09PSA0KXtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0PSAnbW0vZGQveXknO1xyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbmV3IERhdGUodmFsPy50YXJnZXQ/LnZhbHVlKT8udG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XHJcbiAgICAgIH0gZWxzZSBpZih5ZWFyICYmIHllYXIubGVuZ3RoKXtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19
|