verben-ticketing-ui 0.8.2 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/src/lib/components/ticketing/ticketing.component.mjs +58 -3
- package/esm2022/src/lib/components/ticketing/ticketing.service.mjs +13 -1
- package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs +69 -2
- package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs.map +1 -1
- package/package.json +13 -13
- package/src/lib/components/ticketing/ticketing.component.d.ts +11 -1
- package/src/lib/components/ticketing/ticketing.service.d.ts +2 -1
|
@@ -61,6 +61,8 @@ export class TicketingComponent {
|
|
|
61
61
|
selectedTicket = null;
|
|
62
62
|
activeApp = null;
|
|
63
63
|
activeTenant = null;
|
|
64
|
+
activeUser = null;
|
|
65
|
+
allowTicketClosing = false;
|
|
64
66
|
activeTicket = null;
|
|
65
67
|
apps = [];
|
|
66
68
|
detailPath = '';
|
|
@@ -69,6 +71,9 @@ export class TicketingComponent {
|
|
|
69
71
|
ticketingAPI = ``;
|
|
70
72
|
defaultCompany = '';
|
|
71
73
|
baseUrl = ``;
|
|
74
|
+
closureTicket = null;
|
|
75
|
+
closureReason = '';
|
|
76
|
+
showClosureDialogue = false;
|
|
72
77
|
pendingRef = TicketStatus.Pending;
|
|
73
78
|
visibleColumnDef = [];
|
|
74
79
|
exportColumnDef = [];
|
|
@@ -173,6 +178,16 @@ export class TicketingComponent {
|
|
|
173
178
|
}
|
|
174
179
|
async ngOnInit() {
|
|
175
180
|
this.visibleColumnDef = this.service.ticketColumns.filter((x) => x.id != 'actions' || this.permissionConfig?.Actions['Create']);
|
|
181
|
+
if (this.allowTicketClosing &&
|
|
182
|
+
this.permissionConfig &&
|
|
183
|
+
this.permissionConfig.Actions['CloseTicket']) {
|
|
184
|
+
const insertIndex = Math.max(this.visibleColumnDef.length - 1, 0);
|
|
185
|
+
this.visibleColumnDef.splice(insertIndex, 0, {
|
|
186
|
+
id: 'close',
|
|
187
|
+
header: '',
|
|
188
|
+
canExport: false,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
176
191
|
this.exportColumnDef = this.service.ticketColumns.filter((x) => (x.id != 'actions' || this.permissionConfig?.Actions['Create']) &&
|
|
177
192
|
x.id != 'description');
|
|
178
193
|
// console.log({ State: this.permissionConfig });
|
|
@@ -789,18 +804,58 @@ export class TicketingComponent {
|
|
|
789
804
|
}
|
|
790
805
|
return this.selectedTicket.Status != this.pendingRef;
|
|
791
806
|
}
|
|
807
|
+
toggleClosureDialogue(item) {
|
|
808
|
+
this.closureTicket = item;
|
|
809
|
+
this.showClosureDialogue = !this.showClosureDialogue;
|
|
810
|
+
}
|
|
811
|
+
onModalOpen(event) { }
|
|
812
|
+
onModalClose(event) {
|
|
813
|
+
this.closureReason = '';
|
|
814
|
+
this.closureTicket = null;
|
|
815
|
+
this.showClosureDialogue = false;
|
|
816
|
+
}
|
|
817
|
+
canClose(item) {
|
|
818
|
+
return item.Status == TicketStatus.Pending;
|
|
819
|
+
}
|
|
820
|
+
async closeTicket() {
|
|
821
|
+
if (!this.closureTicket || !this.canClose(this.closureTicket)) {
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
if (this.closureReason.trim().length == 0) {
|
|
825
|
+
this.utilService.showInfo('Reason cannot be empty');
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
const payload = {
|
|
829
|
+
Key: this.closureTicket.Code,
|
|
830
|
+
Value: this.activeUser || '',
|
|
831
|
+
Other: this.closureReason,
|
|
832
|
+
};
|
|
833
|
+
const res = await this.service.closeTicket(payload);
|
|
834
|
+
if (res) {
|
|
835
|
+
this.utilService.showSuccess('Ticket closed successfully');
|
|
836
|
+
this.closureTicket.Status = res.Status;
|
|
837
|
+
this.closureTicket.LastHandler = res.LastHandler;
|
|
838
|
+
this.closureTicket.ExecutionTime = res.ExecutionTime;
|
|
839
|
+
this.updateTable();
|
|
840
|
+
this.onModalClose('');
|
|
841
|
+
}
|
|
842
|
+
}
|
|
792
843
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingComponent, deps: [{ token: i1.UtilService }, { token: i1.HttpWebRequestService }, { token: i0.ChangeDetectorRef }, { token: i2.TicketingService }, { token: i3.ActivatedRoute }, { token: i1.ImportService }, { token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
793
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: TicketingComponent, selector: "app-ticketing", inputs: { permissionConfig: "permissionConfig", activeApp: "activeApp", activeTenant: "activeTenant", detailPath: "detailPath", defaultCompany: "defaultCompany", baseUrl: "baseUrl" }, viewQueries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, descendants: true, isSignal: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }, { propertyName: "popUps", predicate: ["popup"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Description | ellipseWord }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel: 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel: \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n></app-add-ticket>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i6.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i6.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i6.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i6.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i6.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i6.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i6.DataImportComponent, selector: "lib-data-import", inputs: ["previewColumns", "formGroupConfig", "fields", "title", "columnTemplates", "parser", "previewData", "onImportComplete"], outputs: ["exportTemplateEvent", "importEvent", "importEventData", "rowSave"] }, { kind: "component", type: i6.DataXportComponent, selector: "lib-data-xport", inputs: ["data", "columns", "useImportKey", "dataFetchUrl", "dataQueryParameters", "dataQueryFunction"], outputs: ["exportDataEvent", "exportDataRangeEvent"] }, { kind: "component", type: i7.AddTicketComponent, selector: "app-add-ticket", inputs: ["activeApp", "activeTenant", "selectedTicket", "isDisabled", "isVisible", "defaultCompany"], outputs: ["onOpen", "onClose", "onSave"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AsyncLabelPipe, name: "asyncLabel" }, { kind: "pipe", type: i8.EllipseWordPipe, name: "ellipseWord" }, { kind: "pipe", type: i8.CompanyDatePipe, name: "companyDate" }] });
|
|
844
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: TicketingComponent, selector: "app-ticketing", inputs: { permissionConfig: "permissionConfig", activeApp: "activeApp", activeTenant: "activeTenant", activeUser: "activeUser", allowTicketClosing: "allowTicketClosing", detailPath: "detailPath", defaultCompany: "defaultCompany", baseUrl: "baseUrl" }, viewQueries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, descendants: true, isSignal: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }, { propertyName: "popUps", predicate: ["popup"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Description | ellipseWord }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel: 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel: \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"close\">\n <ng-template #cell let-row=\"row\" let-value>\n <verbena-button\n *ngIf=\"this.canClose(row)\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Close Ticket'\"\n [disable]=\"!this.canClose(row)\"\n (click)=\"toggleClosureDialogue(row)\"\n >\n </verbena-button>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n></app-add-ticket>\n\n<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"showClosureDialogue\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">Enter Reason</div>\n <div class=\"dialog-subtitle\">\n Please provide a reason for closing this ticket\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div class=\"add-app-form main-form-container flex flex-col gap-2\">\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Reason</div>\n <verbena-input\n name=\"Reason\"\n placeHolder=\"Enter reason...\"\n [(ngModel)]=\"closureReason\"\n />\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"this.closureReason.trim().length == 0\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Confirm'\"\n (click)=\"closeTicket()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}::ng-deep .ticket-dialog{max-width:60vw}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i6.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i6.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i6.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i6.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i6.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i6.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i6.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i6.DataImportComponent, selector: "lib-data-import", inputs: ["previewColumns", "formGroupConfig", "fields", "title", "columnTemplates", "parser", "previewData", "onImportComplete"], outputs: ["exportTemplateEvent", "importEvent", "importEventData", "rowSave"] }, { kind: "component", type: i6.DataXportComponent, selector: "lib-data-xport", inputs: ["data", "columns", "useImportKey", "dataFetchUrl", "dataQueryParameters", "dataQueryFunction"], outputs: ["exportDataEvent", "exportDataRangeEvent"] }, { kind: "component", type: i7.AddTicketComponent, selector: "app-add-ticket", inputs: ["activeApp", "activeTenant", "selectedTicket", "isDisabled", "isVisible", "defaultCompany"], outputs: ["onOpen", "onClose", "onSave"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AsyncLabelPipe, name: "asyncLabel" }, { kind: "pipe", type: i8.EllipseWordPipe, name: "ellipseWord" }, { kind: "pipe", type: i8.CompanyDatePipe, name: "companyDate" }] });
|
|
794
845
|
}
|
|
795
846
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingComponent, decorators: [{
|
|
796
847
|
type: Component,
|
|
797
|
-
args: [{ selector: 'app-ticketing', template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Description | ellipseWord }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel: 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel: \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n></app-add-ticket>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}\n"] }]
|
|
848
|
+
args: [{ selector: 'app-ticketing', template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Description | ellipseWord }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel: 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel: \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"close\">\n <ng-template #cell let-row=\"row\" let-value>\n <verbena-button\n *ngIf=\"this.canClose(row)\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Close Ticket'\"\n [disable]=\"!this.canClose(row)\"\n (click)=\"toggleClosureDialogue(row)\"\n >\n </verbena-button>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n></app-add-ticket>\n\n<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"showClosureDialogue\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">Enter Reason</div>\n <div class=\"dialog-subtitle\">\n Please provide a reason for closing this ticket\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div class=\"add-app-form main-form-container flex flex-col gap-2\">\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Reason</div>\n <verbena-input\n name=\"Reason\"\n placeHolder=\"Enter reason...\"\n [(ngModel)]=\"closureReason\"\n />\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"this.closureReason.trim().length == 0\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Confirm'\"\n (click)=\"closeTicket()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}::ng-deep .ticket-dialog{max-width:60vw}\n"] }]
|
|
798
849
|
}], ctorParameters: () => [{ type: i1.UtilService }, { type: i1.HttpWebRequestService }, { type: i0.ChangeDetectorRef }, { type: i2.TicketingService }, { type: i3.ActivatedRoute }, { type: i1.ImportService }, { type: i1.EnvironmentService }], propDecorators: { permissionConfig: [{
|
|
799
850
|
type: Input
|
|
800
851
|
}], activeApp: [{
|
|
801
852
|
type: Input
|
|
802
853
|
}], activeTenant: [{
|
|
803
854
|
type: Input
|
|
855
|
+
}], activeUser: [{
|
|
856
|
+
type: Input
|
|
857
|
+
}], allowTicketClosing: [{
|
|
858
|
+
type: Input
|
|
804
859
|
}], detailPath: [{
|
|
805
860
|
type: Input
|
|
806
861
|
}], defaultCompany: [{
|
|
@@ -817,4 +872,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
817
872
|
type: ViewChildren,
|
|
818
873
|
args: ['popup']
|
|
819
874
|
}] } });
|
|
820
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL3RpY2tldGluZy90aWNrZXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0aW5nL3RpY2tldGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBTWxFLHNGQUFzRjtBQUN0RiwrRkFBK0Y7QUFDL0YsNERBQTREO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxHQUtmLE1BQU0sY0FBYyxDQUFDO0FBS3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVB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RS9ELE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQzthQUN6RCxRQUFRLENBQUMsRUFBRSxDQUFDO2FBQ1osUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7YUFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDdkQsQ0FBQzt3R0FwNEJVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLGlSQXdCbUIsZUFBZSx5U0NwR2pFLDBtY0E0WEE7OzRGRGhUYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTs2UUFLaEIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQU1ZLFFBQVE7c0JBQXpCLFNBQVM7dUJBQUMsS0FBSztnQkFDQyxTQUFTO3NCQUF6QixTQUFTO3VCQUFDLElBQUk7Z0JBQ1EsTUFBTTtzQkFBNUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgdmlld0NoaWxkcmVuLFxuICBXcml0YWJsZVNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX1BBR0VfU0laRSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgUGFnZWRSZXN1bHQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRpY2tldCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0U3RhdHVzIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQge1xuICBVdGlsU2VydmljZSxcbiAgRW52aXJvbm1lbnRTZXJ2aWNlLFxufSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgSHR0cFdlYlJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbi8vIGltcG9ydCB7IEFkZEFwcENvbXBvbmVudCB9IGZyb20gJ0BhcHAvc2hhcmVkL2NvbXBvbmVudHMvYWRkLWFwcC9hZGQtYXBwLmNvbXBvbmVudCc7XG4vLyBpbXBvcnQgeyBBZGRUZW5hbnRDb21wb25lbnQgfSBmcm9tICdAYXBwL3NoYXJlZC9jb21wb25lbnRzL2FkZC10ZW5hbnQvYWRkLXRlbmFudC5jb21wb25lbnQnO1xuLy8gaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAnQGFwcC9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENvbHVtbkRlZmluaXRpb24sXG4gIENvbHVtbkRpcmVjdGl2ZSxcbiAgRGF0YUZpbHRlclR5cGUsXG4gIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgRGF0YVZpZXdDb21wb25lbnQsXG4gIElEYXRhRmlsdGVyLFxuICBWZXJiZW5Qb3BVcENvbXBvbmVudCxcbn0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IFRpY2tldGluZ1NlcnZpY2UgfSBmcm9tICcuL3RpY2tldGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEltcG9ydFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNvbmZpZyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaE9wZXJhdG9yIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBGaWx0ZXJUeXBlcyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlTaWduIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgYmFzZVN0eWxlIH0gZnJvbSAnLi9iYXNlLXRhYmxlLXN0eWxlJztcblxuZW51bSBUaWNrZXRQcm9wZXJ0eU5hbWUge1xuICBDcmVhdGVkQXQgPSAnQ3JlYXRlZCBBdCcsXG4gIFVwZGF0ZWRBdCA9ICdVcGRhdGVkIEF0JyxcbiAgVGl0bGUgPSAnVGl0bGUnLFxuICBEZXNjcmlwdGlvbiA9ICdEZXNjcmlwdGlvbicsXG4gIEN1cnJlbnRIYW5kbGVyID0gJ0N1cnJlbnQgSGFuZGxlcicsXG4gIFByaW9yaXR5ID0gJ1ByaW9yaXR5JyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbmVudW0gVGlja2V0UHJvcGVydHlNYXAge1xuICBDcmVhdGVkQXQgPSAnQ3JlYXRlZEF0JyxcbiAgVXBkYXRlZEF0ID0gJ1VwZGF0ZWRBdCcsXG4gIFRpdGxlID0gJ1RpdGxlJyxcbiAgRGVzY3JpcHRpb24gPSAnRGVzY3JpcHRpb24nLFxuICBDdXJyZW50SGFuZGxlciA9ICdDdXJyZW50SGFuZGxlcicsXG4gIFByaW9yaXR5ID0gJ1ByaW9yaXR5JyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10aWNrZXRpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGlja2V0aW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3RpY2tldGluZy5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgVGlja2V0aW5nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcGVybWlzc2lvbkNvbmZpZzogUGVybWlzc2lvbkNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHN0eWxlcyA9IGJhc2VTdHlsZTtcbiAgLy8gc2hvd0FwcEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gc2hvd1RlbmFudEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1RpY2tldEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gc2VsZWN0ZWRBcHA6IEFwcGxpY2F0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8vIHNlbGVjdGVkVGVuYW50OiBUZW5hbnQgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWRUaWNrZXQ6IFRpY2tldCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVBcHA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVUZW5hbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBhY3RpdmVUaWNrZXQ6IFRpY2tldCB8IG51bGwgPSBudWxsO1xuICBhcHBzOiBBcHBsaWNhdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGRldGFpbFBhdGg6IHN0cmluZyA9ICcnO1xuICB0ZW5hbnRzOiBUZW5hbnRbXSA9IFtdO1xuICB0aWNrZXRzOiBUaWNrZXRbXSA9IFtdO1xuICB0aWNrZXRpbmdBUEk6IHN0cmluZyA9IGBgO1xuICBASW5wdXQoKSBkZWZhdWx0Q29tcGFueTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJhc2VVcmw6IHN0cmluZyA9IGBgO1xuICBwZW5kaW5nUmVmOiBUaWNrZXRTdGF0dXMgPSBUaWNrZXRTdGF0dXMuUGVuZGluZztcbiAgdmlzaWJsZUNvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxhbnk+W10gPSBbXTtcbiAgZXhwb3J0Q29sdW1uRGVmOiBDb2x1bW5EZWZpbml0aW9uPGFueT5bXSA9IFtdO1xuICBpbXBvcnRlZERhdGE6IFdyaXRhYmxlU2lnbmFsPGFueVtdPiA9IHNpZ25hbChbXSk7XG4gIGNvbHVtblRlbXBsYXRlcyA9IHZpZXdDaGlsZHJlbjxDb2x1bW5EaXJlY3RpdmU+KENvbHVtbkRpcmVjdGl2ZSk7XG4gIEBWaWV3Q2hpbGQoJ3ZkdicpIGRhdGFWaWV3ITogRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGVWaWV3ITogRGF0YVRhYmxlQ29tcG9uZW50PFRpY2tldD47XG4gIEBWaWV3Q2hpbGRyZW4oJ3BvcHVwJykgcG9wVXBzITogUXVlcnlMaXN0PFZlcmJlblBvcFVwQ29tcG9uZW50PjtcbiAgcGFnZVNpemU6IG51bWJlciA9IERFRkFVTFRfUEFHRV9TSVpFO1xuICBzZWFyY2hEZWJvdW5jZVRpbWU6IG51bWJlciA9IDUwMDtcbiAgcGFnZVN0YXRlOiBQYWdlZFJlc3VsdDxUaWNrZXQ+IHwgbnVsbCA9IG51bGw7XG4gIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBvcGVuRHJvcGRvd25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGN1cnJlbnRGaWx0ZXJzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIGN1cnJlbnRTb3J0czogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBzZWFyY2hUZXJtJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgc3RhdHVzT3B0aW9uczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhUaWNrZXRTdGF0dXMpO1xuICB2aXNpYmxlQ29sdW1uczogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBmaWx0ZXJBcnJheTogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlVwZGF0ZWRBdCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5UaXRsZSxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkRlc2NyaXB0aW9uLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3VycmVudEhhbmRsZXIsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5Qcmlvcml0eSxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlN0YXR1cyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF07XG5cbiAgc29ydE9wdGlvbnM6IElEYXRhRmlsdGVyW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXQsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5EYXRlLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuVGl0bGUsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5EZXNjcmlwdGlvbixcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkN1cnJlbnRIYW5kbGVyLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuUHJpb3JpdHksXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5TdGF0dXMsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICBdO1xuXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmVyOiBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyBzZXJ2aWNlOiBUaWNrZXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgaW1wb3J0U2VydmljZTogSW1wb3J0U2VydmljZTxUaWNrZXQ+LFxuICAgIHByaXZhdGUgZW52U3ZjOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5EZWYgPSB0aGlzLnNlcnZpY2UudGlja2V0Q29sdW1ucy5maWx0ZXIoXG4gICAgICAoeCkgPT4geC5pZCAhPSAnYWN0aW9ucycgfHwgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydDcmVhdGUnXSxcbiAgICApO1xuICAgIHRoaXMuZXhwb3J0Q29sdW1uRGVmID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnMuZmlsdGVyKFxuICAgICAgKHgpID0+XG4gICAgICAgICh4LmlkICE9ICdhY3Rpb25zJyB8fCB0aGlzLnBlcm1pc3Npb25Db25maWc/LkFjdGlvbnNbJ0NyZWF0ZSddKSAmJlxuICAgICAgICB4LmlkICE9ICdkZXNjcmlwdGlvbicsXG4gICAgKTtcbiAgICAvLyAgY29uc29sZS5sb2coeyBTdGF0ZTogdGhpcy5wZXJtaXNzaW9uQ29uZmlnIH0pO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnNlcnZpY2UudGlja2V0Q29sdW1uc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguaWQgIT0gJ2FjdGlvbnMnIHx8IHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snQ3JlYXRlJ10sXG4gICAgICApXG4gICAgICAubWFwKChjb2wpID0+ICh7XG4gICAgICAgIGNoZWNrZWQ6IHRydWUsXG4gICAgICAgIG5hbWU6IHR5cGVvZiBjb2wuaGVhZGVyID09PSAnc3RyaW5nJyA/IGNvbC5oZWFkZXIgOiBjb2wuaWQsXG4gICAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgICB9KSk7XG4gICAgdGhpcy50aWNrZXRpbmdBUEkgPSBgJHt0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEl9L1RpY2tldGA7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUZW5hbnQpIHtcbiAgICAgIGNvbnN0IHRpY2tldHMgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0VGlja2V0c0ZvclRlbmFudCh0aGlzLmFjdGl2ZVRlbmFudCk7XG4gICAgICBpZiAodGlja2V0cykge1xuICAgICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHRpY2tldHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aWNrZXRzLlJlc3VsdDtcbiAgICAgICAgdGhpcy50aWNrZXRzID0gcmVzdWx0cy5tYXAoKHgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ueCxcbiAgICAgICAgICAgIElkOiB4LkNvZGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hUZXJtJFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lKSkgLy8gQWRqdXN0IGRlYm91bmNlIHRpbWUgaGVyZSAoaW4gbXMpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChzZWFyY2hUZXJtKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cyh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9hZE1vcmUoKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKCk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICBjb25zdCBtYXBwZWREYXRhOiBUaWNrZXRbXSA9IHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIElkOiB4LkNvZGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5jb25jYXQobWFwcGVkRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdGFibGVTYXZlVGlja2V0KGZvcm06IFRpY2tldCwgY2FsbEJhY2s6ICgpID0+IGFueSkge1xuICAgIGlmIChmb3JtLkRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnRGVzY3JpcHRpb24gY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvcm0uRGF0YVN0YXRlID1cbiAgICAgIGZvcm0uRGF0YVN0YXRlID09IE9iamVjdFN0YXRlLk5ldyA/IE9iamVjdFN0YXRlLk5ldyA6IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG4gICAgZm9ybS5JZCA9ICcnO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NhdmVUaWNrZXRgLFxuICAgICAgW2Zvcm1dLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1RpY2tldCBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBUaWNrZXRbXTtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgcmVzdWx0SXRlbSA9IHJlc3VsdFswXTtcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy50aWNrZXRzLmZpbmRJbmRleCgoeCkgPT4geCA9PSBmb3JtKTtcbiAgICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy50aWNrZXRzW2l0ZW1JbmRleF0uQ29kZSA9IHJlc3VsdEl0ZW0uQ29kZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5JZCA9IHJlc3VsdEl0ZW0uQ29kZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5EYXRhU3RhdGUgPSByZXN1bHRJdGVtLkRhdGFTdGF0ZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5UZW5hbnRJZCA9IHJlc3VsdEl0ZW0uVGVuYW50SWQ7XG4gICAgICAgICAgdGhpcy50aWNrZXRzW2l0ZW1JbmRleF0uU2VydmljZU5hbWUgPSByZXN1bHRJdGVtLlNlcnZpY2VOYW1lO1xuICAgICAgICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5tYXAoKHgpID0+IHgpO1xuICAgICAgICAgIHRoaXMuY2FjaGVJdGVtKHRoaXMudGlja2V0c1tpdGVtSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsQmFjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5tYXAoKHgpID0+IHgpO1xuICB9XG5cbiAgY2xvc2VQb3BVcCgpIHtcbiAgICB0aGlzLm9wZW5Ecm9wZG93bklkID0gbnVsbDtcbiAgICB0aGlzLnBvcFVwcy5mb3JFYWNoKChwb3BVcCkgPT4ge1xuICAgICAgaWYgKHBvcFVwLmRyb3Bkb3duT3Blbikge1xuICAgICAgICBwb3BVcC50b2dnbGVEcm9wZG93bigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25WaWV3Q2hhbmdlKGlzR3JpZFZpZXc6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgc2hvd1RhYmxlVmlldzogYm9vbGVhbiA9IHRydWU7XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRSb3dzOiBUaWNrZXRbXSkge31cblxuICBvbkNvbHVtbnNVcGRhdGVkKHVwZGF0ZWRDb2x1bW5zOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxUaWNrZXQ+W10gPSBbXTtcbiAgICB1cGRhdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29sID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnMuZmluZChcbiAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmhlYWRlciA9PT0gY29sLm5hbWUgfHwgY29sdW1uLmlkID09PSBjb2wubmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdDb2wpIHtcbiAgICAgICAgdXBkYXRlZENvbHVtbkRlZi5wdXNoKG1hdGNoaW5nQ29sKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IFsuLi51cGRhdGVkQ29sdW1uRGVmXTtcbiAgfVxuXG4gIGV4cG9ydEZpbHRlcnNBbmRTb3J0cyA9IGFzeW5jIChwYWdlU3RhdGU6IHtcbiAgICBza2lwOiBudW1iZXI7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgeC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCB8fFxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0XG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAvLyAgIEVudGl0eVZhbHVlOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgLy8gICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtdO1xuXG4gICAgLy8gaWYgKHRoaXMuYWN0aXZlQXBwKSB7XG4gICAgLy8gICBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2VhcmNoVGVybUV4aXN0cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyhUaWNrZXRQcm9wZXJ0eU1hcCkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHByb3BlcnR5LFxuICAgICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKSxcbiAgICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkxJS0UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LyR7cGFnZVN0YXRlLnNraXB9LyR7cGFnZVN0YXRlLmxpbWl0fWAsXG4gICAgICAgICAgc2VhcmNoUGF5bG9hZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgIClcbiAgICAgIDogcGF5bG9hZC5sZW5ndGggPT0gMFxuICAgICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUaWNrZXQvR2V0VGlja2V0LyR7cGFnZVN0YXRlLnNraXB9LyR7cGFnZVN0YXRlLmxpbWl0fWAsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8ke3BhZ2VTdGF0ZS5za2lwfS8ke3BhZ2VTdGF0ZS5saW1pdH1gLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbiAgYXN5bmMgdXBkYXRlRmlsdGVyc0FuZFNvcnRzKGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzU2VhcmNoKSB7XG4gICAgICB0aGlzLmRhdGFWaWV3Lm9uQ2xlYXJTZWFyY2goKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSAnJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAvLyAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gfSk7XG4gICAgZm9yIChsZXQgc29ydCBvZiB0aGlzLmN1cnJlbnRTb3J0cykge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgc29ydC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFNvcnQ6XG4gICAgICAgICAgc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uQXNjLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgIDogc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uRGVzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5EZXNjXG4gICAgICAgICAgICAgIDogU29ydERpcmVjdGlvbi5Ob25lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtdO1xuXG4gICAgLy8gaWYgKHRoaXMuYWN0aXZlQXBwKSB7XG4gICAgLy8gICBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2VhcmNoVGVybUV4aXN0cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyhUaWNrZXRQcm9wZXJ0eU1hcCkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHByb3BlcnR5LFxuICAgICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKSxcbiAgICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkxJS0UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgc2VhcmNoUGF5bG9hZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgIClcbiAgICAgIDogcGF5bG9hZC5sZW5ndGggPT0gMFxuICAgICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUaWNrZXQvR2V0VGlja2V0LzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycyA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50U29ydHMgPSBbXTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICB0aGlzLnRpY2tldHMgPSByZXN1bHQubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICBJZDogeC5Db2RlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKCk6IFByb21pc2U8UGFnZWRSZXN1bHQ8VGlja2V0PiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5wYWdlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hQYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXTtcblxuICAgIC8vIGlmICh0aGlzLmFjdGl2ZUFwcCkge1xuICAgIC8vICAgcGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNlYXJjaFRlcm1FeGlzdHMpIHtcbiAgICAgIE9iamVjdC52YWx1ZXMoVGlja2V0UHJvcGVydHlNYXApLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCksXG4gICAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLk9yLFxuICAgICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHNlYXJjaFBheWxvYWQsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICApXG4gICAgICA6IHBheWxvYWQubGVuZ3RoID09IDBcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgICBgVGlja2V0L0dldFRpY2tldC8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICAgIClcbiAgICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgICAgYFRpY2tldC9TZWFyY2hUaWNrZXQvJHt0aGlzLnBhZ2VTdGF0ZS5Ta2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgb25GaWx0ZXJVcGRhdGVkKHVwZGF0ZWRGaWx0ZXJzOiBJRGF0YUZpbHRlcltdIHwgc3RyaW5nKSB7XG4gICAgLy8gRW5zdXJlIHVwZGF0ZWRGaWx0ZXJzIGlzIGFuIGFycmF5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXBkYXRlZEZpbHRlcnMpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzID0gdXBkYXRlZEZpbHRlcnM7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cygpO1xuICAgIH1cbiAgfVxuICBvblNvcnRVcGRhdGVkKHVwZGF0ZWRTb3J0czogSURhdGFGaWx0ZXJbXSkge1xuICAgIHRoaXMuY3VycmVudFNvcnRzID0gdXBkYXRlZFNvcnRzO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKCk7XG4gIH1cblxuICBoYW5kbGVTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuc2VhcmNoVGVybSQubmV4dChldmVudC52YWx1ZSk7XG4gIH1cblxuICBoYW5kbGVFeHBvcnQoZXhwb3J0ZWREYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFeHBvcnRlZCBkYXRhOicsIGV4cG9ydGVkRGF0YSk7XG4gICAgdGhpcy5kb3dubG9hZENTVihleHBvcnRlZERhdGEpO1xuICB9XG5cbiAgaXNGaWx0ZXJlZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwIHx8IHRoaXMuY3VycmVudEZpbHRlcnMubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRvd25sb2FkQ1NWKGRhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGRhdGFbMF0pO1xuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBbXG4gICAgICBoZWFkZXJzLmpvaW4oJywnKSxcbiAgICAgIC4uLmRhdGEubWFwKChyb3cpID0+IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHJvd1toZWFkZXJdKS5qb2luKCcsJykpLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBpZiAobGluay5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2V4cG9ydC5jc3YnKTtcbiAgICAgIGxpbmsuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IGRlZmF1bHRDb21wYW55KCk6IHN0cmluZyB7XG4gIC8vICAgY29uc3QgY2hlY2sgPSB0aGlzLnN0b3JlLmdldChBcHBLZXkuVVNFUik7XG4gIC8vICAgaWYgKCFjaGVjaykge1xuICAvLyAgICAgcmV0dXJuICcnO1xuICAvLyAgIH1cbiAgLy8gICBjb25zdCB1c2VyOiBVc2VyID0gKHRoaXMuc3RvcmUuZ2V0KEFwcEtleS5VU0VSKSBhcyB7IFVzZXI6IFVzZXIgfSkuVXNlcjtcbiAgLy8gICByZXR1cm4gdXNlci5EZWZhdWx0Q29tcGFueSB8fCAnJztcbiAgLy8gfVxuXG4gIG9uQ29tcGxldGUoZXZlbnQ6IGFueVtdKSB7XG4gICAgdmFyIGRlZmF1bHRJdGVtOiBUaWNrZXQgPSB7XG4gICAgICBUaXRsZTogJycsXG4gICAgICBEZXNjcmlwdGlvbjogJycsXG4gICAgICBBcHA6IHRoaXMuYWN0aXZlQXBwID8gdGhpcy5hY3RpdmVBcHAgOiAnJyxcbiAgICAgIFN0YXR1czogVGlja2V0U3RhdHVzLlBlbmRpbmcsXG4gICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgTWVzc2FnZXM6IFtdLFxuICAgICAgRmlsZURhdGE6IFtdLFxuICAgICAgRmlsZVVybHM6IFtdLFxuICAgICAgSWQ6IHRoaXMudGlja2V0cy5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgIGlkOiAnJyxcbiAgICAgIENvZGU6ICcnLFxuICAgICAgVGVuYW50SWQ6IHRoaXMuYWN0aXZlVGVuYW50ID8gdGhpcy5hY3RpdmVUZW5hbnQgOiAnJyxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgIH07XG4gICAgdGhpcy5pbXBvcnRTZXJ2aWNlLm9uQ29tcGxldGUoXG4gICAgICBldmVudCxcbiAgICAgIGRlZmF1bHRJdGVtLFxuICAgICAgJ1RpY2tldC9TYXZlVGlja2V0JyxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICdUaWNrZXQnLFxuICAgICAgKGl0ZW1zOiBUaWNrZXRbXSkgPT4ge1xuICAgICAgICB0aGlzLnRpY2tldHMgPSB0aGlzLnRpY2tldHMuY29uY2F0KGl0ZW1zKTtcbiAgICAgIH0sXG4gICAgICB0aGlzLnBhZ2VTdGF0ZSxcbiAgICApO1xuICB9XG5cbiAgdGFibGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUaWNrZXQ+KCk7XG5cbiAgY2FjaGVJdGVtKGl0ZW06IFRpY2tldCkge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gaXRlbS5JZDtcbiAgICB0aGlzLnRhYmxlQ2FjaGUuc2V0KGNhY2hlS2V5LCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKSk7XG4gIH1cblxuICByZXN0b3JlQ2FjaGUoaXRlbTogVGlja2V0KSB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBpdGVtLklkO1xuICAgIGNvbnN0IGl0ZW1DYWNoZSA9IHRoaXMudGFibGVDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChpdGVtQ2FjaGUpIHtcbiAgICAgIGl0ZW0uRGVzY3JpcHRpb24gPSBpdGVtQ2FjaGUuRGVzY3JpcHRpb247XG4gICAgICBpdGVtLlByaW9yaXR5ID0gaXRlbUNhY2hlLlByaW9yaXR5O1xuICAgICAgaXRlbS5TdGF0dXMgPSBpdGVtQ2FjaGUuU3RhdHVzO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIG9uQXBwU2VsZWN0ZWQoYXBwOiBBcHBsaWNhdGlvbiB8IG51bGwpIHtcbiAgLy8gICB0aGlzLmFjdGl2ZUFwcCA9IGFwcDtcbiAgLy8gICAvLyBpZiAoYXBwKSB7XG4gIC8vICAgLy8gICBjb25zdCB0ZW5hbnRzID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldFRlbmFudHNCeUFwcChhcHAuQ29kZSk7XG4gIC8vICAgLy8gICBpZiAodGVuYW50cykge1xuICAvLyAgIC8vICAgICB0aGlzLnRlbmFudHMgPSB0ZW5hbnRzO1xuICAvLyAgIC8vICAgfVxuICAvLyAgIC8vIH1cbiAgLy8gfVxuXG4gIG9uQXBwTGlzdFVwZGF0ZWQoYXBwczogQXBwbGljYXRpb25bXSkge1xuICAgIHRoaXMuYXBwcyA9IGFwcHM7XG4gIH1cblxuICBvblRlbmFudExpc3RVcGRhdGVkKHRlbmFudHM6IFRlbmFudFtdKSB7XG4gICAgdGhpcy50ZW5hbnRzID0gdGVuYW50cztcbiAgfVxuXG4gIGdldExvZ29VcmwodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQXV0aGVudGljYXRpb25BUEl9LyR7dXJsfWA7XG4gIH1cblxuICBhZGROZXdUaWNrZXQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldCA9IG51bGw7XG4gICAgdGhpcy5zaG93VGlja2V0Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvLyBlZGl0QXBwKGFwcDogQXBwbGljYXRpb24pIHtcbiAgLy8gICB0aGlzLnNlbGVjdGVkQXBwID0gYXBwO1xuICAvLyAgIHRoaXMuc2hvd0FwcEZvcm0gPSB0cnVlO1xuICAvLyB9XG5cbiAgLy8gZWRpdFRlbmFudCh0ZW5hbnQ6IFRlbmFudCkge1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRUZW5hbnQgPSB0ZW5hbnQ7XG4gIC8vICAgdGhpcy5zaG93VGVuYW50Rm9ybSA9IHRydWU7XG4gIC8vIH1cblxuICBlZGl0VGlja2V0KHRpY2tldDogVGlja2V0KSB7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldCA9IHRpY2tldDtcbiAgICB0aGlzLnNob3dUaWNrZXRGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIG9uQXBwTW9kYWxDbG9zZSgpIHtcbiAgLy8gICB0aGlzLnNob3dBcHBGb3JtID0gZmFsc2U7XG4gIC8vICAgdGhpcy5zZWxlY3RlZEFwcCA9IG51bGw7XG4gIC8vIH1cblxuICAvLyBvblRlbmFudE1vZGFsQ2xvc2UoKSB7XG4gIC8vICAgdGhpcy5zaG93VGVuYW50Rm9ybSA9IGZhbHNlO1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRUZW5hbnQgPSBudWxsO1xuICAvLyB9XG5cbiAgb25UaWNrZXRNb2RhbENsb3NlKCkge1xuICAgIHRoaXMuc2hvd1RpY2tldEZvcm0gPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkVGlja2V0ID0gbnVsbDtcbiAgfVxuXG4gIC8vIG9uQXBwU2F2ZShhcHA6IEFwcGxpY2F0aW9uKSB7XG4gIC8vICAgY29uc3QgaWR4ID0gdGhpcy5hcHBzLmZpbmRJbmRleCgoeCkgPT4geC5Db2RlID09IGFwcC5Db2RlKTtcblxuICAvLyAgIGlmIChhcHAuQ29kZS50cmltKCkubGVuZ3RoID4gMCAmJiBpZHggPiAtMSkge1xuICAvLyAgICAgdGhpcy5hcHBzW2lkeF0uTmFtZSA9IGFwcC5OYW1lO1xuICAvLyAgICAgdGhpcy5hcHBzW2lkeF0uRGVzY3JpcHRpb24gPSBhcHAuRGVzY3JpcHRpb247XG4gIC8vICAgICB0aGlzLmFwcHNbaWR4XS5EYXRhU3RhdGUgPSBhcHAuRGF0YVN0YXRlO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICB0aGlzLmFwcHMucHVzaChhcHApO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIG9uVGVuYW50U2F2ZSh0ZW5hbnQ6IFRlbmFudCkge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMudGVuYW50cy5maW5kSW5kZXgoKHgpID0+IHguQ29kZSA9PSB0ZW5hbnQuQ29kZSk7XG5cbiAgLy8gICBpZiAodGVuYW50LkNvZGUudHJpbSgpLmxlbmd0aCA+IDAgJiYgaWR4ID4gLTEpIHtcbiAgLy8gICAgIHRoaXMudGVuYW50c1tpZHhdLk5hbWUgPSB0ZW5hbnQuTmFtZTtcbiAgLy8gICAgIHRoaXMudGVuYW50c1tpZHhdLkRlc2NyaXB0aW9uID0gdGVuYW50LkRlc2NyaXB0aW9uO1xuICAvLyAgICAgdGhpcy50ZW5hbnRzW2lkeF0uRGF0YVN0YXRlID0gdGVuYW50LkRhdGFTdGF0ZTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy50ZW5hbnRzLnB1c2godGVuYW50KTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBvblRpY2tldFNhdmUodGlja2V0OiBUaWNrZXQpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLnRpY2tldHMuZmluZEluZGV4KCh4KSA9PiB4LkNvZGUgPT0gdGlja2V0LkNvZGUpO1xuXG4gICAgLy8gY29uc29sZS5sb2coeyBUaWNrZXRzOiB0aGlzLnRpY2tldHMsIFRpY2tldDogdGlja2V0LCBpZHg6IGlkeCB9KTtcbiAgICBpZiAodGlja2V0LkNvZGUudHJpbSgpLmxlbmd0aCA+IDAgJiYgaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLlRpdGxlID0gdGlja2V0LlRpdGxlO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uRGVzY3JpcHRpb24gPSB0aWNrZXQuRGVzY3JpcHRpb247XG4gICAgICAvLyAgIHRoaXMudGlja2V0c1tpZHhdLkN1cnJlbnRIYW5kbGVyID0gdGlja2V0LkN1cnJlbnRIYW5kbGVyO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uUHJpb3JpdHkgPSB0aWNrZXQuUHJpb3JpdHk7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5TdGF0dXMgPSB0aWNrZXQuU3RhdHVzO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uRmlsZVVybHMgPSB0aWNrZXQuRmlsZVVybHM7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5EYXRhU3RhdGUgPSB0aWNrZXQuRGF0YVN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpY2tldHMudW5zaGlmdCh0aWNrZXQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICB2aWV3VGlja2V0RGV0YWlscyh0aWNrZXQ6IFRpY2tldCkge1xuICAgIHRoaXMudXRpbFNlcnZpY2UuZ29Ub1BhZ2UoYCR7dGhpcy5kZXRhaWxQYXRofWAsIHRpY2tldC5Db2RlKTtcbiAgfVxuXG4gIGNzc0NvbG9yVG9IZXgoY29sb3I6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gJyMwMDAnOyAvLyBzZXQgYSBrbm93biBjb2xvclxuICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsgLy8gYXNzaWduIGFueSBDU1MtdmFsaWQgY29sb3JcblxuICAgIGNvbnN0IGNvbXB1dGVkID0gY3R4LmZpbGxTdHlsZTtcbiAgICAvLyBJZiB0aGUgYnJvd3NlciBkb2VzIE5PVCB1bmRlcnN0YW5kIHRoZSB2YWx1ZSwgaXQgd29u4oCZdCBjaGFuZ2UgZnJvbSAnIzAwMCdcbiAgICBpZiAoXG4gICAgICBjb21wdXRlZC50b0xvd2VyQ2FzZSgpID09PSAnIzAwMDAwMCcgJiZcbiAgICAgIGNvbG9yLnRvTG93ZXJDYXNlKCkgIT09ICdibGFjaydcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIGNvbG9yIG5hbWUgb3IgdW5zdXBwb3J0ZWQgdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWQudG9VcHBlckNhc2UoKTsgLy8gcmV0dXJucyBoZXggbGlrZSAjMUU5MEZGXG4gIH1cbiAgc29mdGVuQ29sb3IoaGV4OiBzdHJpbmcsIGxpZ2h0ZW5QZXJjZW50ID0gNTUsIGFscGhhUGVyY2VudCA9IDU1KTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgI1xuICAgIGlmICghaGV4LnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgY29uc3QgY29udmVydGVkID0gdGhpcy5jc3NDb2xvclRvSGV4KGhleCk7XG4gICAgICBpZiAoY29udmVydGVkKSB7XG4gICAgICAgIGhleCA9IGNvbnZlcnRlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIENvbnZlcnQgc2hvcnRoYW5kICgjYWJjIOKGkiAjYWFiYmNjKVxuICAgICAgaGV4ID0gaGV4XG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoeCkgPT4geCArIHgpXG4gICAgICAgIC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICBsZXQgciA9IChudW0gPj4gMTYpICYgMHhmZjtcbiAgICBsZXQgZyA9IChudW0gPj4gOCkgJiAweGZmO1xuICAgIGxldCBiID0gbnVtICYgMHhmZjtcblxuICAgIC8vIExpZ2h0ZW4gdG93YXJkIHdoaXRlIGJ5IHRoZSBnaXZlbiBwZXJjZW50YWdlXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChyICsgKDI1NSAtIHIpICogKGxpZ2h0ZW5QZXJjZW50IC8gMTAwKSkpO1xuICAgIGcgPSBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoZyArICgyNTUgLSBnKSAqIChsaWdodGVuUGVyY2VudCAvIDEwMCkpKTtcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKGIgKyAoMjU1IC0gYikgKiAobGlnaHRlblBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICAvLyBDb252ZXJ0IGFscGhhIHBlcmNlbnQgdG8gMi1kaWdpdCBoZXhcbiAgICBjb25zdCBhbHBoYSA9IE1hdGgucm91bmQoKGFscGhhUGVyY2VudCAvIDEwMCkgKiAyNTUpO1xuICAgIGNvbnN0IGFIZXggPSBhbHBoYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHtnXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgLnRvVXBwZXJDYXNlKCl9JHtiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHthSGV4fWA7XG4gIH1cblxuICBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFRpY2tldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGlja2V0LlN0YXR1cyAhPSB0aGlzLnBlbmRpbmdSZWY7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoLWZ1bGwgZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgIDwhLS0gPGFwcC10ZW5hbnQtc2VsZWN0b3JcbiAgICAgIChvbkFwcFNlbGVjdGVkKT1cInRoaXMub25BcHBTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIChvblRlbmFudFNlbGVjdGVkKT1cIm9uVGVuYW50U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAob25BcHBzVXBkYXRlZCk9XCJ0aGlzLm9uQXBwTGlzdFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAob25UZW5hbnRzVXBkYXRlZCk9XCJ0aGlzLm9uVGVuYW50TGlzdFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgPjwvYXBwLXRlbmFudC1zZWxlY3Rvcj4gLS0+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGlja2V0cy1zZWN0aW9uIGZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aWNrZXQtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDx2ZXJiZW4tZGF0YS12aWV3XG4gICAgICAgICAgI3ZkdlxuICAgICAgICAgIFt2aWV3U3RhdGVdPVwie1xuICAgICAgICAgICAgaXNTZWFyY2g6IHRydWUsXG4gICAgICAgICAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICAgICAgICAgIGlzRmlsdGVyOiB0cnVlLFxuICAgICAgICAgICAgaXNTb3J0OiB0cnVlLFxuICAgICAgICAgICAgaXNFeHBvcnQ6ICFwZXJtaXNzaW9uQ29uZmlnIHx8IHBlcm1pc3Npb25Db25maWcuQWN0aW9uc1snRXhwb3J0J10sXG4gICAgICAgICAgICBpc1NlbGVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlzQ3JlYXRlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzVG9nZ2xlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzSW1wb3J0OiAhcGVybWlzc2lvbkNvbmZpZyB8fCBwZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0ltcG9ydCddLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIFtidXR0b25DbGFzc109XCInbXktY3VzdG9tLWJ1dHRvbi1jbGFzcydcIlxuICAgICAgICAgIFtpY29uQ2xhc3NdPVwiJ215LWljb24tY2xhc3MnXCJcbiAgICAgICAgICBbYWN0aXZlSWNvbkNsYXNzXT1cIidteS1hY3RpdmUtaWNvbi1jbGFzcydcIlxuICAgICAgICAgIFtzZWxlY3RlZENvbHVtbkNvdW50XT1cIjBcIlxuICAgICAgICAgIFtzZWxlY3RlZFNvcnRDb3VudF09XCIwXCJcbiAgICAgICAgICBbc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50XT1cIjBcIlxuICAgICAgICAgICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAob25TZWFyY2hDaGFuZ2UpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIFtpc1RhYmxlVmlld109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgdGFibGUtY29udGVudD5cbiAgICAgICAgICAgIDxsaWItZGF0YS10YWJsZVxuICAgICAgICAgICAgICBbZGF0YUtleV09XCInSWQnXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXRhYmxlXCJcbiAgICAgICAgICAgICAgI2R0XG4gICAgICAgICAgICAgIFtkYXRhXT1cInRpY2tldHNcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgW3N0eWxlQ29uZmlnXT1cInN0eWxlc1wiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbFxuICAgICAgICAgICAgICAgICAgbGV0LWlzU2VsZWN0ZWQ9XCJpc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIGxldC10b2dnbGVSb3dTZWxlY3Rpb249XCJ0b2dnbGVSb3dTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjaGVhZGVyXG4gICAgICAgICAgICAgICAgICBsZXQtYWxsUm93c1NlbGVjdGVkPVwiYWxsUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIGxldC1zb21lUm93c1NlbGVjdGVkPVwic29tZVJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlQWxsUm93cz1cInRvZ2dsZUFsbFJvd3NcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNvbWVSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQWxsUm93cygpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiY3JlYXRlZEF0XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHZhbHVlIHwgY29tcGFueURhdGUgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJ1cGRhdGVkQXRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgdmFsdWUgfCBjb21wYW55RGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICB7eyByb3cuVGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IFsobmdNb2RlbCldPVwicm93LlRpdGxlXCI+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHJvdy5EZXNjcmlwdGlvbiB8IGVsbGlwc2VXb3JkIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdXBkYXRlRGF0YT1cInVwZGF0ZURhdGFcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZHRoLW1heFwiPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LkRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLXRleHRhcmVhIFsobmdNb2RlbCldPVwicm93LkRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuYS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJjdXJyZW50SGFuZGxlclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgcm93LkN1cnJlbnRIYW5kbGVyIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwibGFzdEhhbmRsZXJcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHJvdy5MYXN0SGFuZGxlciB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwicHJpb3JpdHlcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICByb3cuUHJpb3JpdHkgJiYgcm93LlByaW9yaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jTGFiZWw6ICdUZW5hbnRQcmlvcml0eScgOiAnQ29sb3InIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jIGFzIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZW51bS12YWwgcm91bmRlZC1bOHB4XSBmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3IgPyBzb2Z0ZW5Db2xvcihjb2xvcikgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudW0tZG90XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICByb3cuUHJpb3JpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNMYWJlbDogXCJUZW5hbnRQcmlvcml0eVwiIDogXCJOYW1lXCIgOiB0aWNrZXRpbmdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IFsobmdNb2RlbCldPVwicm93LlByaW9yaXR5XCI+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cuU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlbnVtLXZhbCByb3VuZGVkLVs4cHhdIGZsZXggZ2FwLTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcm93LlN0YXR1c1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW51bS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHJvdy5TdGF0dXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzdGF0dXNPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiXG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwXG4gICAgICAgICAgICAgICAgICAgICNwb3B1cFxuICAgICAgICAgICAgICAgICAgICBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnOTknIH1cIlxuICAgICAgICAgICAgICAgICAgICBbZW5hYmxlTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBhY3Rpb25zLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLXRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3AtdXAtY29udGVudCBmbGV4IGZsZXgtY29sXCIgZHJvcGRvd24tY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhcGVybWlzc2lvbkNvbmZpZyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0NyZWF0ZSddXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUaWNrZXQodmFsdWUpOyBjbG9zZVBvcFVwKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3AtdXAtdmFsdWUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld1RpY2tldERldGFpbHModmFsdWUpOyBjbG9zZVBvcFVwKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3AtdXAtdmFsdWUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiXG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ0aWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0YWJsZVNhdmVUaWNrZXQodmFsdWUsIHRvZ2dsZVJvd0VkaXQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzdG9yZUNhY2hlKHZhbHVlKTsgdG9nZ2xlUm93RWRpdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY2xvc2Utbm8tY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDx2ZXJiZW4tc3ZnIChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KClcIiBpY29uPVwiZGVsZXRlXCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiPjwvdmVyYmVuLXN2Zz4gLS0+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbGliLWRhdGEtdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjb2x1bW4tY29udGVudD5cbiAgICAgICAgICAgIDx2ZXJiZW4tdmlzaWJsZS1jb2x1bW5cbiAgICAgICAgICAgICAgKGNvbHVtbnNVcGRhdGVkKT1cIm9uQ29sdW1uc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cIjVcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXZpc2libGUtY29sdW1uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgZmlsdGVyLWNvbnRlbnQ+XG4gICAgICAgICAgICA8dmVyYmVuLXRhYmxlLWZpbHRlclxuICAgICAgICAgICAgICAoZmlsdGVyc0FwcGxpZWQpPVwib25GaWx0ZXJVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjQyMHB4XCJcbiAgICAgICAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICAgICAgICBbZmlsdGVyT3B0aW9uc109XCJmaWx0ZXJBcnJheVwiXG4gICAgICAgICAgICAgIFttYXhGaWx0ZXJMZW5ndGhdPVwiM1wiXG4gICAgICAgICAgICA+PC92ZXJiZW4tdGFibGUtZmlsdGVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc29ydC1jb250ZW50PlxuICAgICAgICAgICAgPHZlcmJlbi1zb3J0LXRhYmxlXG4gICAgICAgICAgICAgIChzZWxlY3RlZE9wdGlvbnMpPVwib25Tb3J0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgd2lkdGg9XCI0MDBweFwiXG4gICAgICAgICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgICAgICAgIHRlcnRpYXJ5Q29sb3I9XCIjNDA0MDQwXCJcbiAgICAgICAgICAgICAgW2VuYWJsZURyYWdBbmREcm9wXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc29ydE9wdGlvbnNdPVwic29ydE9wdGlvbnNcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXNvcnQtdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpbXBvcnQtY29udGVudD5cbiAgICAgICAgICAgIDxsaWItZGF0YS1pbXBvcnRcbiAgICAgICAgICAgICAgW3ByZXZpZXdDb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICAgICAgICB0aXRsZT1cInRpY2tldFwiXG4gICAgICAgICAgICAgIChpbXBvcnRFdmVudERhdGEpPVwib25Db21wbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2NvbHVtblRlbXBsYXRlc109XCJjb2x1bW5UZW1wbGF0ZXMoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2xpYi1kYXRhLWltcG9ydD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGV4cG9ydC1jb250ZW50PlxuICAgICAgICAgICAgPGxpYi1kYXRhLXhwb3J0XG4gICAgICAgICAgICAgIFt1c2VJbXBvcnRLZXldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICAgICAgICBbZGF0YVF1ZXJ5RnVuY3Rpb25dPVwiZXhwb3J0RmlsdGVyc0FuZFNvcnRzXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwidGlja2V0c1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2xpYi1kYXRhLXhwb3J0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2hpbGRyZW4+XG4gICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgW3VzZUljb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIidhZGQnXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tcHJpbWFyeS1idXR0b25cIlxuICAgICAgICAgICAgICBbdGV4dF09XCInQWRkIE5ldyBUaWNrZXQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld1RpY2tldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdmVyYmVuLWRhdGEtdmlldz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInRpY2tldHMubGVuZ3RoID4gMFwiXG4gICAgICAgIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTVcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCI+e3sgdGlja2V0cy5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW4+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKClcIiBjbGFzcz1cImxvYWQtbW9yZSB2aWV3LWxpbmtzXCI+XG4gICAgICAgICAgTG9hZCBtb3JlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgdGhpcy5hcHBzLmxlbmd0aCA9PSAwIHx8XG4gICAgICAodGhpcy5hY3RpdmVBcHAgJiYgdGhpcy50ZW5hbnRzLmxlbmd0aCA9PSAwKSB8fFxuICAgICAgKHRoaXMuYWN0aXZlVGVuYW50ICYmIHRoaXMudGlja2V0cy5sZW5ndGggPT0gMCAmJiAhaXNGaWx0ZXJlZFN0YXRlKCkpXG4gICAgXCJcbiAgICBjbGFzcz1cImNyZWF0ZS1jb250YWluZXIgZmxleC0xIHJvdW5kZWQtWzIwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgPjwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gPGFwcC1hZGQtYXBwXG4gIFtpc1Zpc2libGVdPVwic2hvd0FwcEZvcm1cIlxuICBbc2VsZWN0ZWRBcHBdPVwic2VsZWN0ZWRBcHBcIlxuICAob25DbG9zZSk9XCJvbkFwcE1vZGFsQ2xvc2UoKVwiXG4gIChvblNhdmUpPVwib25BcHBTYXZlKCRldmVudClcIlxuPjwvYXBwLWFkZC1hcHA+XG5cbjxhcHAtYWRkLXRlbmFudFxuICBbaXNWaXNpYmxlXT1cInNob3dUZW5hbnRGb3JtXCJcbiAgW2FjdGl2ZUFwcF09XCJhY3RpdmVBcHBcIlxuICBbc2VsZWN0ZWRUZW5hbnRdPVwic2VsZWN0ZWRUZW5hbnRcIlxuICAob25DbG9zZSk9XCJvblRlbmFudE1vZGFsQ2xvc2UoKVwiXG4gIChvblNhdmUpPVwib25UZW5hbnRTYXZlKCRldmVudClcIlxuPjwvYXBwLWFkZC10ZW5hbnQ+IC0tPlxuXG48YXBwLWFkZC10aWNrZXRcbiAgW2lzVmlzaWJsZV09XCJzaG93VGlja2V0Rm9ybVwiXG4gIFthY3RpdmVBcHBdPVwiYWN0aXZlQXBwXCJcbiAgW2lzRGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgW2FjdGl2ZVRlbmFudF09XCJhY3RpdmVUZW5hbnRcIlxuICBbc2VsZWN0ZWRUaWNrZXRdPVwic2VsZWN0ZWRUaWNrZXRcIlxuICAob25DbG9zZSk9XCJvblRpY2tldE1vZGFsQ2xvc2UoKVwiXG4gIChvblNhdmUpPVwib25UaWNrZXRTYXZlKCRldmVudClcIlxuPjwvYXBwLWFkZC10aWNrZXQ+XG4iXX0=
|
|
875
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL3RpY2tldGluZy90aWNrZXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0aW5nL3RpY2tldGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBTWxFLHNGQUFzRjtBQUN0RiwrRkFBK0Y7QUFDL0YsNERBQTREO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxHQUtmLE1BQU0sY0FBYyxDQUFDO0FBS3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVB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QyxDQUFDO1FBQ3BELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO3dHQW44QlUsa0JBQWtCOzRGQUFsQixrQkFBa0IscVZBNkJtQixlQUFlLHlTQ3pHakUsMDlnQkFnY0E7OzRGRHBYYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTs2UUFLaEIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQVNZLFFBQVE7c0JBQXpCLFNBQVM7dUJBQUMsS0FBSztnQkFDQyxTQUFTO3NCQUF6QixTQUFTO3VCQUFDLElBQUk7Z0JBQ1EsTUFBTTtzQkFBNUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgdmlld0NoaWxkcmVuLFxuICBXcml0YWJsZVNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX1BBR0VfU0laRSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24sIEtleVZhbHVlUGFyYW0gfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgUGFnZWRSZXN1bHQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRpY2tldCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0U3RhdHVzIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQge1xuICBVdGlsU2VydmljZSxcbiAgRW52aXJvbm1lbnRTZXJ2aWNlLFxufSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgSHR0cFdlYlJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbi8vIGltcG9ydCB7IEFkZEFwcENvbXBvbmVudCB9IGZyb20gJ0BhcHAvc2hhcmVkL2NvbXBvbmVudHMvYWRkLWFwcC9hZGQtYXBwLmNvbXBvbmVudCc7XG4vLyBpbXBvcnQgeyBBZGRUZW5hbnRDb21wb25lbnQgfSBmcm9tICdAYXBwL3NoYXJlZC9jb21wb25lbnRzL2FkZC10ZW5hbnQvYWRkLXRlbmFudC5jb21wb25lbnQnO1xuLy8gaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAnQGFwcC9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENvbHVtbkRlZmluaXRpb24sXG4gIENvbHVtbkRpcmVjdGl2ZSxcbiAgRGF0YUZpbHRlclR5cGUsXG4gIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgRGF0YVZpZXdDb21wb25lbnQsXG4gIElEYXRhRmlsdGVyLFxuICBWZXJiZW5Qb3BVcENvbXBvbmVudCxcbn0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IFRpY2tldGluZ1NlcnZpY2UgfSBmcm9tICcuL3RpY2tldGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEltcG9ydFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNvbmZpZyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaE9wZXJhdG9yIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBGaWx0ZXJUeXBlcyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlTaWduIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgYmFzZVN0eWxlIH0gZnJvbSAnLi9iYXNlLXRhYmxlLXN0eWxlJztcblxuZW51bSBUaWNrZXRQcm9wZXJ0eU5hbWUge1xuICBDcmVhdGVkQXQgPSAnQ3JlYXRlZCBBdCcsXG4gIFVwZGF0ZWRBdCA9ICdVcGRhdGVkIEF0JyxcbiAgVGl0bGUgPSAnVGl0bGUnLFxuICBEZXNjcmlwdGlvbiA9ICdEZXNjcmlwdGlvbicsXG4gIEN1cnJlbnRIYW5kbGVyID0gJ0N1cnJlbnQgSGFuZGxlcicsXG4gIFByaW9yaXR5ID0gJ1ByaW9yaXR5JyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbmVudW0gVGlja2V0UHJvcGVydHlNYXAge1xuICBDcmVhdGVkQXQgPSAnQ3JlYXRlZEF0JyxcbiAgVXBkYXRlZEF0ID0gJ1VwZGF0ZWRBdCcsXG4gIFRpdGxlID0gJ1RpdGxlJyxcbiAgRGVzY3JpcHRpb24gPSAnRGVzY3JpcHRpb24nLFxuICBDdXJyZW50SGFuZGxlciA9ICdDdXJyZW50SGFuZGxlcicsXG4gIFByaW9yaXR5ID0gJ1ByaW9yaXR5JyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10aWNrZXRpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGlja2V0aW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3RpY2tldGluZy5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgVGlja2V0aW5nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcGVybWlzc2lvbkNvbmZpZzogUGVybWlzc2lvbkNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHN0eWxlcyA9IGJhc2VTdHlsZTtcbiAgLy8gc2hvd0FwcEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gc2hvd1RlbmFudEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1RpY2tldEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gc2VsZWN0ZWRBcHA6IEFwcGxpY2F0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8vIHNlbGVjdGVkVGVuYW50OiBUZW5hbnQgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWRUaWNrZXQ6IFRpY2tldCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVBcHA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVUZW5hbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVVc2VyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYWxsb3dUaWNrZXRDbG9zaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGl2ZVRpY2tldDogVGlja2V0IHwgbnVsbCA9IG51bGw7XG4gIGFwcHM6IEFwcGxpY2F0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgZGV0YWlsUGF0aDogc3RyaW5nID0gJyc7XG4gIHRlbmFudHM6IFRlbmFudFtdID0gW107XG4gIHRpY2tldHM6IFRpY2tldFtdID0gW107XG4gIHRpY2tldGluZ0FQSTogc3RyaW5nID0gYGA7XG4gIEBJbnB1dCgpIGRlZmF1bHRDb21wYW55OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nID0gYGA7XG4gIGNsb3N1cmVUaWNrZXQ6IFRpY2tldCB8IG51bGwgPSBudWxsO1xuICBjbG9zdXJlUmVhc29uOiBzdHJpbmcgPSAnJztcbiAgc2hvd0Nsb3N1cmVEaWFsb2d1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwZW5kaW5nUmVmOiBUaWNrZXRTdGF0dXMgPSBUaWNrZXRTdGF0dXMuUGVuZGluZztcbiAgdmlzaWJsZUNvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxhbnk+W10gPSBbXTtcbiAgZXhwb3J0Q29sdW1uRGVmOiBDb2x1bW5EZWZpbml0aW9uPGFueT5bXSA9IFtdO1xuICBpbXBvcnRlZERhdGE6IFdyaXRhYmxlU2lnbmFsPGFueVtdPiA9IHNpZ25hbChbXSk7XG4gIGNvbHVtblRlbXBsYXRlcyA9IHZpZXdDaGlsZHJlbjxDb2x1bW5EaXJlY3RpdmU+KENvbHVtbkRpcmVjdGl2ZSk7XG4gIEBWaWV3Q2hpbGQoJ3ZkdicpIGRhdGFWaWV3ITogRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGVWaWV3ITogRGF0YVRhYmxlQ29tcG9uZW50PFRpY2tldD47XG4gIEBWaWV3Q2hpbGRyZW4oJ3BvcHVwJykgcG9wVXBzITogUXVlcnlMaXN0PFZlcmJlblBvcFVwQ29tcG9uZW50PjtcbiAgcGFnZVNpemU6IG51bWJlciA9IERFRkFVTFRfUEFHRV9TSVpFO1xuICBzZWFyY2hEZWJvdW5jZVRpbWU6IG51bWJlciA9IDUwMDtcbiAgcGFnZVN0YXRlOiBQYWdlZFJlc3VsdDxUaWNrZXQ+IHwgbnVsbCA9IG51bGw7XG4gIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBvcGVuRHJvcGRvd25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGN1cnJlbnRGaWx0ZXJzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIGN1cnJlbnRTb3J0czogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBzZWFyY2hUZXJtJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgc3RhdHVzT3B0aW9uczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhUaWNrZXRTdGF0dXMpO1xuICB2aXNpYmxlQ29sdW1uczogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBmaWx0ZXJBcnJheTogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlVwZGF0ZWRBdCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5UaXRsZSxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkRlc2NyaXB0aW9uLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3VycmVudEhhbmRsZXIsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5Qcmlvcml0eSxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlN0YXR1cyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF07XG5cbiAgc29ydE9wdGlvbnM6IElEYXRhRmlsdGVyW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXQsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5EYXRlLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuVGl0bGUsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5EZXNjcmlwdGlvbixcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkN1cnJlbnRIYW5kbGVyLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuUHJpb3JpdHksXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5TdGF0dXMsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICBdO1xuXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmVyOiBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyBzZXJ2aWNlOiBUaWNrZXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgaW1wb3J0U2VydmljZTogSW1wb3J0U2VydmljZTxUaWNrZXQ+LFxuICAgIHByaXZhdGUgZW52U3ZjOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5EZWYgPSB0aGlzLnNlcnZpY2UudGlja2V0Q29sdW1ucy5maWx0ZXIoXG4gICAgICAoeCkgPT4geC5pZCAhPSAnYWN0aW9ucycgfHwgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydDcmVhdGUnXSxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5hbGxvd1RpY2tldENsb3NpbmcgJiZcbiAgICAgIHRoaXMucGVybWlzc2lvbkNvbmZpZyAmJlxuICAgICAgdGhpcy5wZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0Nsb3NlVGlja2V0J11cbiAgICApIHtcbiAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gTWF0aC5tYXgodGhpcy52aXNpYmxlQ29sdW1uRGVmLmxlbmd0aCAtIDEsIDApO1xuXG4gICAgICB0aGlzLnZpc2libGVDb2x1bW5EZWYuc3BsaWNlKGluc2VydEluZGV4LCAwLCB7XG4gICAgICAgIGlkOiAnY2xvc2UnLFxuICAgICAgICBoZWFkZXI6ICcnLFxuICAgICAgICBjYW5FeHBvcnQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZXhwb3J0Q29sdW1uRGVmID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnMuZmlsdGVyKFxuICAgICAgKHgpID0+XG4gICAgICAgICh4LmlkICE9ICdhY3Rpb25zJyB8fCB0aGlzLnBlcm1pc3Npb25Db25maWc/LkFjdGlvbnNbJ0NyZWF0ZSddKSAmJlxuICAgICAgICB4LmlkICE9ICdkZXNjcmlwdGlvbicsXG4gICAgKTtcbiAgICAvLyAgY29uc29sZS5sb2coeyBTdGF0ZTogdGhpcy5wZXJtaXNzaW9uQ29uZmlnIH0pO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnNlcnZpY2UudGlja2V0Q29sdW1uc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguaWQgIT0gJ2FjdGlvbnMnIHx8IHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snQ3JlYXRlJ10sXG4gICAgICApXG4gICAgICAubWFwKChjb2wpID0+ICh7XG4gICAgICAgIGNoZWNrZWQ6IHRydWUsXG4gICAgICAgIG5hbWU6IHR5cGVvZiBjb2wuaGVhZGVyID09PSAnc3RyaW5nJyA/IGNvbC5oZWFkZXIgOiBjb2wuaWQsXG4gICAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgICB9KSk7XG4gICAgdGhpcy50aWNrZXRpbmdBUEkgPSBgJHt0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEl9L1RpY2tldGA7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUZW5hbnQpIHtcbiAgICAgIGNvbnN0IHRpY2tldHMgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0VGlja2V0c0ZvclRlbmFudCh0aGlzLmFjdGl2ZVRlbmFudCk7XG4gICAgICBpZiAodGlja2V0cykge1xuICAgICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHRpY2tldHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aWNrZXRzLlJlc3VsdDtcbiAgICAgICAgdGhpcy50aWNrZXRzID0gcmVzdWx0cy5tYXAoKHgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ueCxcbiAgICAgICAgICAgIElkOiB4LkNvZGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hUZXJtJFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lKSkgLy8gQWRqdXN0IGRlYm91bmNlIHRpbWUgaGVyZSAoaW4gbXMpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChzZWFyY2hUZXJtKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cyh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9hZE1vcmUoKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKCk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICBjb25zdCBtYXBwZWREYXRhOiBUaWNrZXRbXSA9IHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIElkOiB4LkNvZGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5jb25jYXQobWFwcGVkRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdGFibGVTYXZlVGlja2V0KGZvcm06IFRpY2tldCwgY2FsbEJhY2s6ICgpID0+IGFueSkge1xuICAgIGlmIChmb3JtLkRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnRGVzY3JpcHRpb24gY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvcm0uRGF0YVN0YXRlID1cbiAgICAgIGZvcm0uRGF0YVN0YXRlID09IE9iamVjdFN0YXRlLk5ldyA/IE9iamVjdFN0YXRlLk5ldyA6IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG4gICAgZm9ybS5JZCA9ICcnO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NhdmVUaWNrZXRgLFxuICAgICAgW2Zvcm1dLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1RpY2tldCBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBUaWNrZXRbXTtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgcmVzdWx0SXRlbSA9IHJlc3VsdFswXTtcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy50aWNrZXRzLmZpbmRJbmRleCgoeCkgPT4geCA9PSBmb3JtKTtcbiAgICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy50aWNrZXRzW2l0ZW1JbmRleF0uQ29kZSA9IHJlc3VsdEl0ZW0uQ29kZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5JZCA9IHJlc3VsdEl0ZW0uQ29kZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5EYXRhU3RhdGUgPSByZXN1bHRJdGVtLkRhdGFTdGF0ZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5UZW5hbnRJZCA9IHJlc3VsdEl0ZW0uVGVuYW50SWQ7XG4gICAgICAgICAgdGhpcy50aWNrZXRzW2l0ZW1JbmRleF0uU2VydmljZU5hbWUgPSByZXN1bHRJdGVtLlNlcnZpY2VOYW1lO1xuICAgICAgICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5tYXAoKHgpID0+IHgpO1xuICAgICAgICAgIHRoaXMuY2FjaGVJdGVtKHRoaXMudGlja2V0c1tpdGVtSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsQmFjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5tYXAoKHgpID0+IHgpO1xuICB9XG5cbiAgY2xvc2VQb3BVcCgpIHtcbiAgICB0aGlzLm9wZW5Ecm9wZG93bklkID0gbnVsbDtcbiAgICB0aGlzLnBvcFVwcy5mb3JFYWNoKChwb3BVcCkgPT4ge1xuICAgICAgaWYgKHBvcFVwLmRyb3Bkb3duT3Blbikge1xuICAgICAgICBwb3BVcC50b2dnbGVEcm9wZG93bigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25WaWV3Q2hhbmdlKGlzR3JpZFZpZXc6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgc2hvd1RhYmxlVmlldzogYm9vbGVhbiA9IHRydWU7XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRSb3dzOiBUaWNrZXRbXSkge31cblxuICBvbkNvbHVtbnNVcGRhdGVkKHVwZGF0ZWRDb2x1bW5zOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxUaWNrZXQ+W10gPSBbXTtcbiAgICB1cGRhdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29sID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnMuZmluZChcbiAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmhlYWRlciA9PT0gY29sLm5hbWUgfHwgY29sdW1uLmlkID09PSBjb2wubmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdDb2wpIHtcbiAgICAgICAgdXBkYXRlZENvbHVtbkRlZi5wdXNoKG1hdGNoaW5nQ29sKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IFsuLi51cGRhdGVkQ29sdW1uRGVmXTtcbiAgfVxuXG4gIGV4cG9ydEZpbHRlcnNBbmRTb3J0cyA9IGFzeW5jIChwYWdlU3RhdGU6IHtcbiAgICBza2lwOiBudW1iZXI7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgeC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCB8fFxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0XG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAvLyAgIEVudGl0eVZhbHVlOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgLy8gICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtdO1xuXG4gICAgLy8gaWYgKHRoaXMuYWN0aXZlQXBwKSB7XG4gICAgLy8gICBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2VhcmNoVGVybUV4aXN0cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyhUaWNrZXRQcm9wZXJ0eU1hcCkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHByb3BlcnR5LFxuICAgICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKSxcbiAgICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkxJS0UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LyR7cGFnZVN0YXRlLnNraXB9LyR7cGFnZVN0YXRlLmxpbWl0fWAsXG4gICAgICAgICAgc2VhcmNoUGF5bG9hZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgIClcbiAgICAgIDogcGF5bG9hZC5sZW5ndGggPT0gMFxuICAgICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUaWNrZXQvR2V0VGlja2V0LyR7cGFnZVN0YXRlLnNraXB9LyR7cGFnZVN0YXRlLmxpbWl0fWAsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8ke3BhZ2VTdGF0ZS5za2lwfS8ke3BhZ2VTdGF0ZS5saW1pdH1gLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbiAgYXN5bmMgdXBkYXRlRmlsdGVyc0FuZFNvcnRzKGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzU2VhcmNoKSB7XG4gICAgICB0aGlzLmRhdGFWaWV3Lm9uQ2xlYXJTZWFyY2goKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSAnJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAvLyAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gfSk7XG4gICAgZm9yIChsZXQgc29ydCBvZiB0aGlzLmN1cnJlbnRTb3J0cykge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgc29ydC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFNvcnQ6XG4gICAgICAgICAgc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uQXNjLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgIDogc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uRGVzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5EZXNjXG4gICAgICAgICAgICAgIDogU29ydERpcmVjdGlvbi5Ob25lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtdO1xuXG4gICAgLy8gaWYgKHRoaXMuYWN0aXZlQXBwKSB7XG4gICAgLy8gICBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2VhcmNoVGVybUV4aXN0cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyhUaWNrZXRQcm9wZXJ0eU1hcCkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHByb3BlcnR5LFxuICAgICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKSxcbiAgICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkxJS0UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgc2VhcmNoUGF5bG9hZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgIClcbiAgICAgIDogcGF5bG9hZC5sZW5ndGggPT0gMFxuICAgICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUaWNrZXQvR2V0VGlja2V0LzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycyA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50U29ydHMgPSBbXTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICB0aGlzLnRpY2tldHMgPSByZXN1bHQubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICBJZDogeC5Db2RlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKCk6IFByb21pc2U8UGFnZWRSZXN1bHQ8VGlja2V0PiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5wYWdlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hQYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXTtcblxuICAgIC8vIGlmICh0aGlzLmFjdGl2ZUFwcCkge1xuICAgIC8vICAgcGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNlYXJjaFRlcm1FeGlzdHMpIHtcbiAgICAgIE9iamVjdC52YWx1ZXMoVGlja2V0UHJvcGVydHlNYXApLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCksXG4gICAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLk9yLFxuICAgICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHNlYXJjaFBheWxvYWQsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICApXG4gICAgICA6IHBheWxvYWQubGVuZ3RoID09IDBcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgICBgVGlja2V0L0dldFRpY2tldC8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICAgIClcbiAgICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgICAgYFRpY2tldC9TZWFyY2hUaWNrZXQvJHt0aGlzLnBhZ2VTdGF0ZS5Ta2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgb25GaWx0ZXJVcGRhdGVkKHVwZGF0ZWRGaWx0ZXJzOiBJRGF0YUZpbHRlcltdIHwgc3RyaW5nKSB7XG4gICAgLy8gRW5zdXJlIHVwZGF0ZWRGaWx0ZXJzIGlzIGFuIGFycmF5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXBkYXRlZEZpbHRlcnMpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzID0gdXBkYXRlZEZpbHRlcnM7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cygpO1xuICAgIH1cbiAgfVxuICBvblNvcnRVcGRhdGVkKHVwZGF0ZWRTb3J0czogSURhdGFGaWx0ZXJbXSkge1xuICAgIHRoaXMuY3VycmVudFNvcnRzID0gdXBkYXRlZFNvcnRzO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKCk7XG4gIH1cblxuICBoYW5kbGVTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuc2VhcmNoVGVybSQubmV4dChldmVudC52YWx1ZSk7XG4gIH1cblxuICBoYW5kbGVFeHBvcnQoZXhwb3J0ZWREYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFeHBvcnRlZCBkYXRhOicsIGV4cG9ydGVkRGF0YSk7XG4gICAgdGhpcy5kb3dubG9hZENTVihleHBvcnRlZERhdGEpO1xuICB9XG5cbiAgaXNGaWx0ZXJlZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwIHx8IHRoaXMuY3VycmVudEZpbHRlcnMubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRvd25sb2FkQ1NWKGRhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGRhdGFbMF0pO1xuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBbXG4gICAgICBoZWFkZXJzLmpvaW4oJywnKSxcbiAgICAgIC4uLmRhdGEubWFwKChyb3cpID0+IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHJvd1toZWFkZXJdKS5qb2luKCcsJykpLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBpZiAobGluay5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2V4cG9ydC5jc3YnKTtcbiAgICAgIGxpbmsuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IGRlZmF1bHRDb21wYW55KCk6IHN0cmluZyB7XG4gIC8vICAgY29uc3QgY2hlY2sgPSB0aGlzLnN0b3JlLmdldChBcHBLZXkuVVNFUik7XG4gIC8vICAgaWYgKCFjaGVjaykge1xuICAvLyAgICAgcmV0dXJuICcnO1xuICAvLyAgIH1cbiAgLy8gICBjb25zdCB1c2VyOiBVc2VyID0gKHRoaXMuc3RvcmUuZ2V0KEFwcEtleS5VU0VSKSBhcyB7IFVzZXI6IFVzZXIgfSkuVXNlcjtcbiAgLy8gICByZXR1cm4gdXNlci5EZWZhdWx0Q29tcGFueSB8fCAnJztcbiAgLy8gfVxuXG4gIG9uQ29tcGxldGUoZXZlbnQ6IGFueVtdKSB7XG4gICAgdmFyIGRlZmF1bHRJdGVtOiBUaWNrZXQgPSB7XG4gICAgICBUaXRsZTogJycsXG4gICAgICBEZXNjcmlwdGlvbjogJycsXG4gICAgICBBcHA6IHRoaXMuYWN0aXZlQXBwID8gdGhpcy5hY3RpdmVBcHAgOiAnJyxcbiAgICAgIFN0YXR1czogVGlja2V0U3RhdHVzLlBlbmRpbmcsXG4gICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgTWVzc2FnZXM6IFtdLFxuICAgICAgRmlsZURhdGE6IFtdLFxuICAgICAgRmlsZVVybHM6IFtdLFxuICAgICAgSWQ6IHRoaXMudGlja2V0cy5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgIGlkOiAnJyxcbiAgICAgIENvZGU6ICcnLFxuICAgICAgVGVuYW50SWQ6IHRoaXMuYWN0aXZlVGVuYW50ID8gdGhpcy5hY3RpdmVUZW5hbnQgOiAnJyxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgIH07XG4gICAgdGhpcy5pbXBvcnRTZXJ2aWNlLm9uQ29tcGxldGUoXG4gICAgICBldmVudCxcbiAgICAgIGRlZmF1bHRJdGVtLFxuICAgICAgJ1RpY2tldC9TYXZlVGlja2V0JyxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICdUaWNrZXQnLFxuICAgICAgKGl0ZW1zOiBUaWNrZXRbXSkgPT4ge1xuICAgICAgICB0aGlzLnRpY2tldHMgPSB0aGlzLnRpY2tldHMuY29uY2F0KGl0ZW1zKTtcbiAgICAgIH0sXG4gICAgICB0aGlzLnBhZ2VTdGF0ZSxcbiAgICApO1xuICB9XG5cbiAgdGFibGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUaWNrZXQ+KCk7XG5cbiAgY2FjaGVJdGVtKGl0ZW06IFRpY2tldCkge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gaXRlbS5JZDtcbiAgICB0aGlzLnRhYmxlQ2FjaGUuc2V0KGNhY2hlS2V5LCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKSk7XG4gIH1cblxuICByZXN0b3JlQ2FjaGUoaXRlbTogVGlja2V0KSB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBpdGVtLklkO1xuICAgIGNvbnN0IGl0ZW1DYWNoZSA9IHRoaXMudGFibGVDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChpdGVtQ2FjaGUpIHtcbiAgICAgIGl0ZW0uRGVzY3JpcHRpb24gPSBpdGVtQ2FjaGUuRGVzY3JpcHRpb247XG4gICAgICBpdGVtLlByaW9yaXR5ID0gaXRlbUNhY2hlLlByaW9yaXR5O1xuICAgICAgaXRlbS5TdGF0dXMgPSBpdGVtQ2FjaGUuU3RhdHVzO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIG9uQXBwU2VsZWN0ZWQoYXBwOiBBcHBsaWNhdGlvbiB8IG51bGwpIHtcbiAgLy8gICB0aGlzLmFjdGl2ZUFwcCA9IGFwcDtcbiAgLy8gICAvLyBpZiAoYXBwKSB7XG4gIC8vICAgLy8gICBjb25zdCB0ZW5hbnRzID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldFRlbmFudHNCeUFwcChhcHAuQ29kZSk7XG4gIC8vICAgLy8gICBpZiAodGVuYW50cykge1xuICAvLyAgIC8vICAgICB0aGlzLnRlbmFudHMgPSB0ZW5hbnRzO1xuICAvLyAgIC8vICAgfVxuICAvLyAgIC8vIH1cbiAgLy8gfVxuXG4gIG9uQXBwTGlzdFVwZGF0ZWQoYXBwczogQXBwbGljYXRpb25bXSkge1xuICAgIHRoaXMuYXBwcyA9IGFwcHM7XG4gIH1cblxuICBvblRlbmFudExpc3RVcGRhdGVkKHRlbmFudHM6IFRlbmFudFtdKSB7XG4gICAgdGhpcy50ZW5hbnRzID0gdGVuYW50cztcbiAgfVxuXG4gIGdldExvZ29VcmwodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQXV0aGVudGljYXRpb25BUEl9LyR7dXJsfWA7XG4gIH1cblxuICBhZGROZXdUaWNrZXQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldCA9IG51bGw7XG4gICAgdGhpcy5zaG93VGlja2V0Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvLyBlZGl0QXBwKGFwcDogQXBwbGljYXRpb24pIHtcbiAgLy8gICB0aGlzLnNlbGVjdGVkQXBwID0gYXBwO1xuICAvLyAgIHRoaXMuc2hvd0FwcEZvcm0gPSB0cnVlO1xuICAvLyB9XG5cbiAgLy8gZWRpdFRlbmFudCh0ZW5hbnQ6IFRlbmFudCkge1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRUZW5hbnQgPSB0ZW5hbnQ7XG4gIC8vICAgdGhpcy5zaG93VGVuYW50Rm9ybSA9IHRydWU7XG4gIC8vIH1cblxuICBlZGl0VGlja2V0KHRpY2tldDogVGlja2V0KSB7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldCA9IHRpY2tldDtcbiAgICB0aGlzLnNob3dUaWNrZXRGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIG9uQXBwTW9kYWxDbG9zZSgpIHtcbiAgLy8gICB0aGlzLnNob3dBcHBGb3JtID0gZmFsc2U7XG4gIC8vICAgdGhpcy5zZWxlY3RlZEFwcCA9IG51bGw7XG4gIC8vIH1cblxuICAvLyBvblRlbmFudE1vZGFsQ2xvc2UoKSB7XG4gIC8vICAgdGhpcy5zaG93VGVuYW50Rm9ybSA9IGZhbHNlO1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRUZW5hbnQgPSBudWxsO1xuICAvLyB9XG5cbiAgb25UaWNrZXRNb2RhbENsb3NlKCkge1xuICAgIHRoaXMuc2hvd1RpY2tldEZvcm0gPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkVGlja2V0ID0gbnVsbDtcbiAgfVxuXG4gIC8vIG9uQXBwU2F2ZShhcHA6IEFwcGxpY2F0aW9uKSB7XG4gIC8vICAgY29uc3QgaWR4ID0gdGhpcy5hcHBzLmZpbmRJbmRleCgoeCkgPT4geC5Db2RlID09IGFwcC5Db2RlKTtcblxuICAvLyAgIGlmIChhcHAuQ29kZS50cmltKCkubGVuZ3RoID4gMCAmJiBpZHggPiAtMSkge1xuICAvLyAgICAgdGhpcy5hcHBzW2lkeF0uTmFtZSA9IGFwcC5OYW1lO1xuICAvLyAgICAgdGhpcy5hcHBzW2lkeF0uRGVzY3JpcHRpb24gPSBhcHAuRGVzY3JpcHRpb247XG4gIC8vICAgICB0aGlzLmFwcHNbaWR4XS5EYXRhU3RhdGUgPSBhcHAuRGF0YVN0YXRlO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICB0aGlzLmFwcHMucHVzaChhcHApO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIG9uVGVuYW50U2F2ZSh0ZW5hbnQ6IFRlbmFudCkge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMudGVuYW50cy5maW5kSW5kZXgoKHgpID0+IHguQ29kZSA9PSB0ZW5hbnQuQ29kZSk7XG5cbiAgLy8gICBpZiAodGVuYW50LkNvZGUudHJpbSgpLmxlbmd0aCA+IDAgJiYgaWR4ID4gLTEpIHtcbiAgLy8gICAgIHRoaXMudGVuYW50c1tpZHhdLk5hbWUgPSB0ZW5hbnQuTmFtZTtcbiAgLy8gICAgIHRoaXMudGVuYW50c1tpZHhdLkRlc2NyaXB0aW9uID0gdGVuYW50LkRlc2NyaXB0aW9uO1xuICAvLyAgICAgdGhpcy50ZW5hbnRzW2lkeF0uRGF0YVN0YXRlID0gdGVuYW50LkRhdGFTdGF0ZTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy50ZW5hbnRzLnB1c2godGVuYW50KTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBvblRpY2tldFNhdmUodGlja2V0OiBUaWNrZXQpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLnRpY2tldHMuZmluZEluZGV4KCh4KSA9PiB4LkNvZGUgPT0gdGlja2V0LkNvZGUpO1xuXG4gICAgLy8gY29uc29sZS5sb2coeyBUaWNrZXRzOiB0aGlzLnRpY2tldHMsIFRpY2tldDogdGlja2V0LCBpZHg6IGlkeCB9KTtcbiAgICBpZiAodGlja2V0LkNvZGUudHJpbSgpLmxlbmd0aCA+IDAgJiYgaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLlRpdGxlID0gdGlja2V0LlRpdGxlO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uRGVzY3JpcHRpb24gPSB0aWNrZXQuRGVzY3JpcHRpb247XG4gICAgICAvLyAgIHRoaXMudGlja2V0c1tpZHhdLkN1cnJlbnRIYW5kbGVyID0gdGlja2V0LkN1cnJlbnRIYW5kbGVyO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uUHJpb3JpdHkgPSB0aWNrZXQuUHJpb3JpdHk7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5TdGF0dXMgPSB0aWNrZXQuU3RhdHVzO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uRmlsZVVybHMgPSB0aWNrZXQuRmlsZVVybHM7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5EYXRhU3RhdGUgPSB0aWNrZXQuRGF0YVN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpY2tldHMudW5zaGlmdCh0aWNrZXQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICB2aWV3VGlja2V0RGV0YWlscyh0aWNrZXQ6IFRpY2tldCkge1xuICAgIHRoaXMudXRpbFNlcnZpY2UuZ29Ub1BhZ2UoYCR7dGhpcy5kZXRhaWxQYXRofWAsIHRpY2tldC5Db2RlKTtcbiAgfVxuXG4gIGNzc0NvbG9yVG9IZXgoY29sb3I6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gJyMwMDAnOyAvLyBzZXQgYSBrbm93biBjb2xvclxuICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsgLy8gYXNzaWduIGFueSBDU1MtdmFsaWQgY29sb3JcblxuICAgIGNvbnN0IGNvbXB1dGVkID0gY3R4LmZpbGxTdHlsZTtcbiAgICAvLyBJZiB0aGUgYnJvd3NlciBkb2VzIE5PVCB1bmRlcnN0YW5kIHRoZSB2YWx1ZSwgaXQgd29u4oCZdCBjaGFuZ2UgZnJvbSAnIzAwMCdcbiAgICBpZiAoXG4gICAgICBjb21wdXRlZC50b0xvd2VyQ2FzZSgpID09PSAnIzAwMDAwMCcgJiZcbiAgICAgIGNvbG9yLnRvTG93ZXJDYXNlKCkgIT09ICdibGFjaydcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIGNvbG9yIG5hbWUgb3IgdW5zdXBwb3J0ZWQgdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWQudG9VcHBlckNhc2UoKTsgLy8gcmV0dXJucyBoZXggbGlrZSAjMUU5MEZGXG4gIH1cbiAgc29mdGVuQ29sb3IoaGV4OiBzdHJpbmcsIGxpZ2h0ZW5QZXJjZW50ID0gNTUsIGFscGhhUGVyY2VudCA9IDU1KTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgI1xuICAgIGlmICghaGV4LnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgY29uc3QgY29udmVydGVkID0gdGhpcy5jc3NDb2xvclRvSGV4KGhleCk7XG4gICAgICBpZiAoY29udmVydGVkKSB7XG4gICAgICAgIGhleCA9IGNvbnZlcnRlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIENvbnZlcnQgc2hvcnRoYW5kICgjYWJjIOKGkiAjYWFiYmNjKVxuICAgICAgaGV4ID0gaGV4XG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoeCkgPT4geCArIHgpXG4gICAgICAgIC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICBsZXQgciA9IChudW0gPj4gMTYpICYgMHhmZjtcbiAgICBsZXQgZyA9IChudW0gPj4gOCkgJiAweGZmO1xuICAgIGxldCBiID0gbnVtICYgMHhmZjtcblxuICAgIC8vIExpZ2h0ZW4gdG93YXJkIHdoaXRlIGJ5IHRoZSBnaXZlbiBwZXJjZW50YWdlXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChyICsgKDI1NSAtIHIpICogKGxpZ2h0ZW5QZXJjZW50IC8gMTAwKSkpO1xuICAgIGcgPSBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoZyArICgyNTUgLSBnKSAqIChsaWdodGVuUGVyY2VudCAvIDEwMCkpKTtcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKGIgKyAoMjU1IC0gYikgKiAobGlnaHRlblBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICAvLyBDb252ZXJ0IGFscGhhIHBlcmNlbnQgdG8gMi1kaWdpdCBoZXhcbiAgICBjb25zdCBhbHBoYSA9IE1hdGgucm91bmQoKGFscGhhUGVyY2VudCAvIDEwMCkgKiAyNTUpO1xuICAgIGNvbnN0IGFIZXggPSBhbHBoYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHtnXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgLnRvVXBwZXJDYXNlKCl9JHtiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHthSGV4fWA7XG4gIH1cblxuICBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFRpY2tldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGlja2V0LlN0YXR1cyAhPSB0aGlzLnBlbmRpbmdSZWY7XG4gIH1cblxuICB0b2dnbGVDbG9zdXJlRGlhbG9ndWUoaXRlbTogVGlja2V0KSB7XG4gICAgdGhpcy5jbG9zdXJlVGlja2V0ID0gaXRlbTtcbiAgICB0aGlzLnNob3dDbG9zdXJlRGlhbG9ndWUgPSAhdGhpcy5zaG93Q2xvc3VyZURpYWxvZ3VlO1xuICB9XG5cbiAgb25Nb2RhbE9wZW4oZXZlbnQ6IGFueSkge31cblxuICBvbk1vZGFsQ2xvc2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY2xvc3VyZVJlYXNvbiA9ICcnO1xuICAgIHRoaXMuY2xvc3VyZVRpY2tldCA9IG51bGw7XG4gICAgdGhpcy5zaG93Q2xvc3VyZURpYWxvZ3VlID0gZmFsc2U7XG4gIH1cblxuICBjYW5DbG9zZShpdGVtOiBUaWNrZXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS5TdGF0dXMgPT0gVGlja2V0U3RhdHVzLlBlbmRpbmc7XG4gIH1cblxuICBhc3luYyBjbG9zZVRpY2tldCgpIHtcbiAgICBpZiAoIXRoaXMuY2xvc3VyZVRpY2tldCB8fCAhdGhpcy5jYW5DbG9zZSh0aGlzLmNsb3N1cmVUaWNrZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xvc3VyZVJlYXNvbi50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ1JlYXNvbiBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiBLZXlWYWx1ZVBhcmFtID0ge1xuICAgICAgS2V5OiB0aGlzLmNsb3N1cmVUaWNrZXQuQ29kZSxcbiAgICAgIFZhbHVlOiB0aGlzLmFjdGl2ZVVzZXIgfHwgJycsXG4gICAgICBPdGhlcjogdGhpcy5jbG9zdXJlUmVhc29uLFxuICAgIH07XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZpY2UuY2xvc2VUaWNrZXQocGF5bG9hZCk7XG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnVGlja2V0IGNsb3NlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIHRoaXMuY2xvc3VyZVRpY2tldC5TdGF0dXMgPSByZXMuU3RhdHVzO1xuICAgICAgdGhpcy5jbG9zdXJlVGlja2V0Lkxhc3RIYW5kbGVyID0gcmVzLkxhc3RIYW5kbGVyO1xuICAgICAgdGhpcy5jbG9zdXJlVGlja2V0LkV4ZWN1dGlvblRpbWUgPSByZXMuRXhlY3V0aW9uVGltZTtcbiAgICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgICAgIHRoaXMub25Nb2RhbENsb3NlKCcnKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoLWZ1bGwgZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgIDwhLS0gPGFwcC10ZW5hbnQtc2VsZWN0b3JcbiAgICAgIChvbkFwcFNlbGVjdGVkKT1cInRoaXMub25BcHBTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIChvblRlbmFudFNlbGVjdGVkKT1cIm9uVGVuYW50U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAob25BcHBzVXBkYXRlZCk9XCJ0aGlzLm9uQXBwTGlzdFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAob25UZW5hbnRzVXBkYXRlZCk9XCJ0aGlzLm9uVGVuYW50TGlzdFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgPjwvYXBwLXRlbmFudC1zZWxlY3Rvcj4gLS0+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGlja2V0cy1zZWN0aW9uIGZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aWNrZXQtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDx2ZXJiZW4tZGF0YS12aWV3XG4gICAgICAgICAgI3ZkdlxuICAgICAgICAgIFt2aWV3U3RhdGVdPVwie1xuICAgICAgICAgICAgaXNTZWFyY2g6IHRydWUsXG4gICAgICAgICAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICAgICAgICAgIGlzRmlsdGVyOiB0cnVlLFxuICAgICAgICAgICAgaXNTb3J0OiB0cnVlLFxuICAgICAgICAgICAgaXNFeHBvcnQ6ICFwZXJtaXNzaW9uQ29uZmlnIHx8IHBlcm1pc3Npb25Db25maWcuQWN0aW9uc1snRXhwb3J0J10sXG4gICAgICAgICAgICBpc1NlbGVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlzQ3JlYXRlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzVG9nZ2xlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzSW1wb3J0OiAhcGVybWlzc2lvbkNvbmZpZyB8fCBwZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0ltcG9ydCddLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIFtidXR0b25DbGFzc109XCInbXktY3VzdG9tLWJ1dHRvbi1jbGFzcydcIlxuICAgICAgICAgIFtpY29uQ2xhc3NdPVwiJ215LWljb24tY2xhc3MnXCJcbiAgICAgICAgICBbYWN0aXZlSWNvbkNsYXNzXT1cIidteS1hY3RpdmUtaWNvbi1jbGFzcydcIlxuICAgICAgICAgIFtzZWxlY3RlZENvbHVtbkNvdW50XT1cIjBcIlxuICAgICAgICAgIFtzZWxlY3RlZFNvcnRDb3VudF09XCIwXCJcbiAgICAgICAgICBbc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50XT1cIjBcIlxuICAgICAgICAgICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAob25TZWFyY2hDaGFuZ2UpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIFtpc1RhYmxlVmlld109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgdGFibGUtY29udGVudD5cbiAgICAgICAgICAgIDxsaWItZGF0YS10YWJsZVxuICAgICAgICAgICAgICBbZGF0YUtleV09XCInSWQnXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXRhYmxlXCJcbiAgICAgICAgICAgICAgI2R0XG4gICAgICAgICAgICAgIFtkYXRhXT1cInRpY2tldHNcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgW3N0eWxlQ29uZmlnXT1cInN0eWxlc1wiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbFxuICAgICAgICAgICAgICAgICAgbGV0LWlzU2VsZWN0ZWQ9XCJpc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIGxldC10b2dnbGVSb3dTZWxlY3Rpb249XCJ0b2dnbGVSb3dTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjaGVhZGVyXG4gICAgICAgICAgICAgICAgICBsZXQtYWxsUm93c1NlbGVjdGVkPVwiYWxsUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIGxldC1zb21lUm93c1NlbGVjdGVkPVwic29tZVJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlQWxsUm93cz1cInRvZ2dsZUFsbFJvd3NcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNvbWVSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQWxsUm93cygpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiY3JlYXRlZEF0XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHZhbHVlIHwgY29tcGFueURhdGUgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJ1cGRhdGVkQXRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgdmFsdWUgfCBjb21wYW55RGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICB7eyByb3cuVGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IFsobmdNb2RlbCldPVwicm93LlRpdGxlXCI+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHJvdy5EZXNjcmlwdGlvbiB8IGVsbGlwc2VXb3JkIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdXBkYXRlRGF0YT1cInVwZGF0ZURhdGFcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZHRoLW1heFwiPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LkRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLXRleHRhcmVhIFsobmdNb2RlbCldPVwicm93LkRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuYS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJjdXJyZW50SGFuZGxlclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgcm93LkN1cnJlbnRIYW5kbGVyIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwibGFzdEhhbmRsZXJcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHJvdy5MYXN0SGFuZGxlciB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwicHJpb3JpdHlcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICByb3cuUHJpb3JpdHkgJiYgcm93LlByaW9yaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jTGFiZWw6ICdUZW5hbnRQcmlvcml0eScgOiAnQ29sb3InIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jIGFzIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZW51bS12YWwgcm91bmRlZC1bOHB4XSBmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3IgPyBzb2Z0ZW5Db2xvcihjb2xvcikgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudW0tZG90XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICByb3cuUHJpb3JpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNMYWJlbDogXCJUZW5hbnRQcmlvcml0eVwiIDogXCJOYW1lXCIgOiB0aWNrZXRpbmdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IFsobmdNb2RlbCldPVwicm93LlByaW9yaXR5XCI+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cuU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlbnVtLXZhbCByb3VuZGVkLVs4cHhdIGZsZXggZ2FwLTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcm93LlN0YXR1c1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW51bS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHJvdy5TdGF0dXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzdGF0dXNPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImNsb3NlXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmNhbkNsb3NlKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidDbG9zZSBUaWNrZXQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiIXRoaXMuY2FuQ2xvc2Uocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDbG9zdXJlRGlhbG9ndWUocm93KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxcbiAgICAgICAgICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCJcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHZlcmJlbi1wb3AtVXBcbiAgICAgICAgICAgICAgICAgICAgI3BvcHVwXG4gICAgICAgICAgICAgICAgICAgIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICc5OScgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtlbmFibGVNb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGFjdGlvbnMtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24tdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcC11cC1jb250ZW50IGZsZXggZmxleC1jb2xcIiBkcm9wZG93bi1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFwZXJtaXNzaW9uQ29uZmlnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Db25maWcuQWN0aW9uc1snQ3JlYXRlJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFRpY2tldCh2YWx1ZSk7IGNsb3NlUG9wVXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvcC11cC12YWx1ZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3VGlja2V0RGV0YWlscyh2YWx1ZSk7IGNsb3NlUG9wVXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvcC11cC12YWx1ZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tcG9wLVVwPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCJcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInRpY2tcIlxuICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRhYmxlU2F2ZVRpY2tldCh2YWx1ZSwgdG9nZ2xlUm93RWRpdClcIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXN0b3JlQ2FjaGUodmFsdWUpOyB0b2dnbGVSb3dFZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJjbG9zZS1uby1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHZlcmJlbi1zdmcgKGNsaWNrKT1cInRvZ2dsZVJvd0VkaXQoKVwiIGljb249XCJkZWxldGVcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCI+PC92ZXJiZW4tc3ZnPiAtLT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9saWItZGF0YS10YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNvbHVtbi1jb250ZW50PlxuICAgICAgICAgICAgPHZlcmJlbi12aXNpYmxlLWNvbHVtblxuICAgICAgICAgICAgICAoY29sdW1uc1VwZGF0ZWQpPVwib25Db2x1bW5zVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgd2lkdGg9XCI0MDBweFwiXG4gICAgICAgICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5zXCJcbiAgICAgICAgICAgICAgW2Rpc3BsYXllZENvbHVtbnNdPVwiNVwiXG4gICAgICAgICAgICA+PC92ZXJiZW4tdmlzaWJsZS1jb2x1bW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBmaWx0ZXItY29udGVudD5cbiAgICAgICAgICAgIDx2ZXJiZW4tdGFibGUtZmlsdGVyXG4gICAgICAgICAgICAgIChmaWx0ZXJzQXBwbGllZCk9XCJvbkZpbHRlclVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiNDIwcHhcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwiIzQwNDA0MFwiXG4gICAgICAgICAgICAgIFtmaWx0ZXJPcHRpb25zXT1cImZpbHRlckFycmF5XCJcbiAgICAgICAgICAgICAgW21heEZpbHRlckxlbmd0aF09XCIzXCJcbiAgICAgICAgICAgID48L3ZlcmJlbi10YWJsZS1maWx0ZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzb3J0LWNvbnRlbnQ+XG4gICAgICAgICAgICA8dmVyYmVuLXNvcnQtdGFibGVcbiAgICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9ucyk9XCJvblNvcnRVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICAgICAgICBbZW5hYmxlRHJhZ0FuZERyb3BdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzb3J0T3B0aW9uc109XCJzb3J0T3B0aW9uc1wiXG4gICAgICAgICAgICA+PC92ZXJiZW4tc29ydC10YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGltcG9ydC1jb250ZW50PlxuICAgICAgICAgICAgPGxpYi1kYXRhLWltcG9ydFxuICAgICAgICAgICAgICBbcHJldmlld0NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbkRlZlwiXG4gICAgICAgICAgICAgIHRpdGxlPVwidGlja2V0XCJcbiAgICAgICAgICAgICAgKGltcG9ydEV2ZW50RGF0YSk9XCJvbkNvbXBsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgICBbY29sdW1uVGVtcGxhdGVzXT1cImNvbHVtblRlbXBsYXRlcygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbGliLWRhdGEtaW1wb3J0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgZXhwb3J0LWNvbnRlbnQ+XG4gICAgICAgICAgICA8bGliLWRhdGEteHBvcnRcbiAgICAgICAgICAgICAgW3VzZUltcG9ydEtleV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbkRlZlwiXG4gICAgICAgICAgICAgIFtkYXRhUXVlcnlGdW5jdGlvbl09XCJleHBvcnRGaWx0ZXJzQW5kU29ydHNcIlxuICAgICAgICAgICAgICBbZGF0YV09XCJ0aWNrZXRzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbGliLWRhdGEteHBvcnQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjaGlsZHJlbj5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICBbdXNlSWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwiJ2FkZCdcIlxuICAgICAgICAgICAgICBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cIidBZGQgTmV3IFRpY2tldCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3VGlja2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC92ZXJiZW5hLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92ZXJiZW4tZGF0YS12aWV3PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwidGlja2V0cy5sZW5ndGggPiAwXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBnYXAtNVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGFnaW5hdG9yLXRleHRcIj57eyB0aWNrZXRzLmxlbmd0aCB9fSByZWNvcmRzIGxvYWRlZDwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibG9hZC1tb3JlIHZpZXctbGlua3NcIj5cbiAgICAgICAgICBMb2FkIG1vcmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICpuZ0lmPVwiXG4gICAgICB0aGlzLmFwcHMubGVuZ3RoID09IDAgfHxcbiAgICAgICh0aGlzLmFjdGl2ZUFwcCAmJiB0aGlzLnRlbmFudHMubGVuZ3RoID09IDApIHx8XG4gICAgICAodGhpcy5hY3RpdmVUZW5hbnQgJiYgdGhpcy50aWNrZXRzLmxlbmd0aCA9PSAwICYmICFpc0ZpbHRlcmVkU3RhdGUoKSlcbiAgICBcIlxuICAgIGNsYXNzPVwiY3JlYXRlLWNvbnRhaW5lciBmbGV4LTEgcm91bmRlZC1bMjBweF0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICA+PC9kaXY+XG48L2Rpdj5cblxuPCEtLSA8YXBwLWFkZC1hcHBcbiAgW2lzVmlzaWJsZV09XCJzaG93QXBwRm9ybVwiXG4gIFtzZWxlY3RlZEFwcF09XCJzZWxlY3RlZEFwcFwiXG4gIChvbkNsb3NlKT1cIm9uQXBwTW9kYWxDbG9zZSgpXCJcbiAgKG9uU2F2ZSk9XCJvbkFwcFNhdmUoJGV2ZW50KVwiXG4+PC9hcHAtYWRkLWFwcD5cblxuPGFwcC1hZGQtdGVuYW50XG4gIFtpc1Zpc2libGVdPVwic2hvd1RlbmFudEZvcm1cIlxuICBbYWN0aXZlQXBwXT1cImFjdGl2ZUFwcFwiXG4gIFtzZWxlY3RlZFRlbmFudF09XCJzZWxlY3RlZFRlbmFudFwiXG4gIChvbkNsb3NlKT1cIm9uVGVuYW50TW9kYWxDbG9zZSgpXCJcbiAgKG9uU2F2ZSk9XCJvblRlbmFudFNhdmUoJGV2ZW50KVwiXG4+PC9hcHAtYWRkLXRlbmFudD4gLS0+XG5cbjxhcHAtYWRkLXRpY2tldFxuICBbaXNWaXNpYmxlXT1cInNob3dUaWNrZXRGb3JtXCJcbiAgW2FjdGl2ZUFwcF09XCJhY3RpdmVBcHBcIlxuICBbaXNEaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICBbYWN0aXZlVGVuYW50XT1cImFjdGl2ZVRlbmFudFwiXG4gIFtzZWxlY3RlZFRpY2tldF09XCJzZWxlY3RlZFRpY2tldFwiXG4gIChvbkNsb3NlKT1cIm9uVGlja2V0TW9kYWxDbG9zZSgpXCJcbiAgKG9uU2F2ZSk9XCJvblRpY2tldFNhdmUoJGV2ZW50KVwiXG4+PC9hcHAtYWRkLXRpY2tldD5cblxuPHZlcmJlbi1kaWFsb2d1ZVxuICBbc2hvd0Nsb3NlSWNvbl09XCJmYWxzZVwiXG4gIFtkaXNtaXNzT3V0c2lkZUNsaWNrXT1cImZhbHNlXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwidHJ1ZVwiXG4gIFtzaXplXT1cIidtZWRpdW0nXCJcbiAgW21vZGVdPVwiJ2RpYWxvZ3VlJ1wiXG4gIFtjdXN0b21DbGFzc109XCIndGlja2V0LWRpYWxvZydcIlxuICBbZGlzYWJsZUZvb3Rlcl09XCJ0cnVlXCJcbiAgKG9wZW5Nb2RhbCk9XCJvbk1vZGFsT3BlbigkZXZlbnQpXCJcbiAgW2lzVmlzaWJsZV09XCJzaG93Q2xvc3VyZURpYWxvZ3VlXCJcbiAgW2JvZHlUZW1wbGF0ZV09XCJib2R5VGVtcGxhdGVcIlxuICAoY2xvc2VNb2RhbCk9XCJvbk1vZGFsQ2xvc2UoJGV2ZW50KVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keSBwLVsyNXB4XSBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWhlYWRlciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGUgZm9udC1ib2xkIHRleHQteGxcIj5FbnRlciBSZWFzb248L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1zdWJ0aXRsZVwiPlxuICAgICAgICAgIFBsZWFzZSBwcm92aWRlIGEgcmVhc29uIGZvciBjbG9zaW5nIHRoaXMgdGlja2V0XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDx2ZXJiZW5hLXRleHRhcmVhIG5hbWU9XCJUZXN0XCIgWyhuZ01vZGVsKV09XCJ0ZXN0XCIgLz5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvZ1Rlc3QoKVwiPkxvZzwvYnV0dG9uPiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYXBwLWZvcm0gbWFpbi1mb3JtLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+UmVhc29uPC9kaXY+XG4gICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgIG5hbWU9XCJSZWFzb25cIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJFbnRlciByZWFzb24uLi5cIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjbG9zdXJlUmVhc29uXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1idXR0b24tY29udGFpbmVyIGZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBjbGFzcz1cInZlcmJlbi1zZWNvbmRhcnktYnV0dG9uXCJcbiAgICAgICAgICBbdGV4dF09XCInQ2xvc2UnXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Nb2RhbENsb3NlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgIFtkaXNhYmxlXT1cInRoaXMuY2xvc3VyZVJlYXNvbi50cmltKCkubGVuZ3RoID09IDBcIlxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tcHJpbWFyeS1idXR0b25cIlxuICAgICAgICAgIFt0ZXh0XT1cIidDb25maXJtJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsb3NlVGlja2V0KClcIlxuICAgICAgICA+XG4gICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvdmVyYmVuLWRpYWxvZ3VlPlxuIl19
|