@tsi-developpement/tsi-shared-ui 1.11.13 → 1.11.15

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.
Files changed (20) hide show
  1. package/esm2022/lib/end-points/endpoints.mjs +5 -1
  2. package/esm2022/lib/models/workflow/workflow.mjs +6 -1
  3. package/esm2022/lib/services/workflow/workflow-configuration.service.mjs +7 -1
  4. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +20 -40
  5. package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +39 -13
  6. package/esm2022/lib/tsi-components/tsi-kanban-workflow-etat/tsi-kanban-workflow-etat.component.mjs +237 -25
  7. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +291 -63
  8. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
  9. package/lib/consts/app-providers.d.ts +1 -1
  10. package/lib/end-points/endpoints.d.ts +4 -0
  11. package/lib/models/workflow/workflow.d.ts +20 -0
  12. package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
  13. package/lib/services/workflow/workflow-configuration.service.d.ts +3 -1
  14. package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +2 -0
  15. package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +4 -9
  16. package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +9 -2
  17. package/lib/tsi-components/tsi-action-erp-create-or-edit/tsi-action-erp-create-or-edit.component.d.ts +2 -0
  18. package/lib/tsi-components/tsi-kanban-workflow-etat/tsi-kanban-workflow-etat.component.d.ts +35 -5
  19. package/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.d.ts +2 -0
  20. package/package.json +1 -1
@@ -5,13 +5,14 @@ import { TsiGenericGridComponent } from '../tsi-generic-grid/tsi-generic-grid.co
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "../../../services/notification/error-response-manager.service";
7
7
  import * as i2 from "../../../services/modal/tsi-modal.service";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "primeng/api";
10
- import * as i5 from "primeng/toolbar";
11
- import * as i6 from "../tsi-generic-grid/tsi-generic-grid.component";
12
- import * as i7 from "../../button-components/tsi-button/tsi-button.component";
13
- import * as i8 from "../../reporting/reporting.component";
14
- import * as i9 from "../../../pipes/localize.pipe";
8
+ import * as i3 from "../../../services/configuration/entity-configuration.service";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "primeng/api";
11
+ import * as i6 from "primeng/toolbar";
12
+ import * as i7 from "../tsi-generic-grid/tsi-generic-grid.component";
13
+ import * as i8 from "../../button-components/tsi-button/tsi-button.component";
14
+ import * as i9 from "../../reporting/reporting.component";
15
+ import * as i10 from "../../../pipes/localize.pipe";
15
16
  export class TsiViewGridComponent {
16
17
  set page(value) {
17
18
  this._page = value;
@@ -19,6 +20,16 @@ export class TsiViewGridComponent {
19
20
  get page() {
20
21
  return this._page;
21
22
  }
23
+ get businessClass() {
24
+ return this._businessClass;
25
+ }
26
+ set businessClass(value) {
27
+ if (value === this._businessClass) {
28
+ return;
29
+ }
30
+ this._businessClass = value;
31
+ this._loadEntityInfo();
32
+ }
22
33
  set columns(value) {
23
34
  this._columns = value ?? [];
24
35
  }
@@ -65,10 +76,11 @@ export class TsiViewGridComponent {
65
76
  }
66
77
  //#region Outputs
67
78
  //#endregion
68
- constructor(_errorResponseManagerService, _tsiModalService, _cdr) {
79
+ constructor(_errorResponseManagerService, _tsiModalService, _cdr, _entityConfigService) {
69
80
  this._errorResponseManagerService = _errorResponseManagerService;
70
81
  this._tsiModalService = _tsiModalService;
71
82
  this._cdr = _cdr;
83
+ this._entityConfigService = _entityConfigService;
72
84
  this._formEndpoint = undefined;
73
85
  this.tooltipPosition = TooltipPosition;
74
86
  this.pagedRequest = {
@@ -225,6 +237,20 @@ export class TsiViewGridComponent {
225
237
  this.selectedItemsChange.emit(event);
226
238
  }
227
239
  //#region private methods
240
+ async _loadEntityInfo() {
241
+ if (!this._businessClass) {
242
+ return;
243
+ }
244
+ try {
245
+ this.entityInfo = await this._entityConfigService.getEntityInfoFromCache(this._businessClass);
246
+ if (!this.entityInfo) {
247
+ console.warn(`No entity info found for ${this._businessClass}`);
248
+ }
249
+ }
250
+ catch (error) {
251
+ console.error(error);
252
+ }
253
+ }
228
254
  _setformEndpointBody() {
229
255
  let ox = this._clonePagedRequest(this.pagedRequest);
230
256
  ox['getAllData'] = true;
@@ -342,13 +368,13 @@ export class TsiViewGridComponent {
342
368
  // break;
343
369
  }
344
370
  }
345
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiViewGridComponent, deps: [{ token: i1.ErrorResponseManagerService }, { token: i2.TsiModalService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
346
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiViewGridComponent, selector: "tsi-view-grid", inputs: { columns: "columns", gridConfiguration: "gridConfiguration", viewComponent: "viewComponent", crudService: "crudService", header: "header", modalSize: "modalSize", showConsultButton: "showConsultButton", showSearchField: "showSearchField", searchFields: "searchFields", formEndpoint: "formEndpoint", formName: "formName", id: "id", showImportExportButton: "showImportExportButton", targetBusinessClass: "targetBusinessClass", getDataFromApi: "getDataFromApi", gridData: "gridData", isSearchButtonDisabled: "isSearchButtonDisabled", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", key: "key", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showCalenderView: "showCalenderView", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", selectAll: "selectAll", checkedByField: "checkedByField", sortMode: "sortMode", sizingMode: "sizingMode", searchOnInit: "searchOnInit" }, outputs: { summariesChange: "summariesChange", selectedItemsChange: "selectedItemsChange", buttonColumnClicked: "buttonColumnClicked", searchFieldsValueChanged: "searchFieldsValueChanged", getAllPagedResultChanged: "getAllPagedResultChanged" }, viewQueries: [{ propertyName: "genericGridComponent", first: true, predicate: TsiGenericGridComponent, descendants: true }], ngImport: i0, template: "<div class=\"card\">\r\n \r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"border-radius-7 mb-1 flex align-items-center gap-2\">\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"flex gap-2 ml-2\">\r\n <Tsi-Button icon=\"pi pi-sliders-h\" [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_tsi_component_grid_menu_view\" *ngIf=\"searchFields\"\r\n styleClass=\"h-2rem hover:shadow-6 p-button-icon-only {{showSearchField ? 'p-button-secondary' : 'p-button-success'}}\" \r\n (click)=\"displaySearchFields()\">\r\n </Tsi-Button>\r\n <Tsi-Button icon=\"p-button-icon pi pi-calendar {{showCalenderView ? 'pi pi-align-justify' : 'pi pi-calendar'}}\" \r\n styleClass=\"p-element p-button-primary hover:shadow-6 h-2rem p-button p-component p-button-icon-only\" (click)=\"toggleCalenderView()\" \r\n tooltipText=\"{{(showCalenderView ? 'shared_tsi_component_grid_list_view' : 'shared_tsi_component_grid_calender_view') | localize}}\" [tooltipPosition]=\"tooltipPosition.Top\"></Tsi-Button>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"right\">\r\n <app-reporting *ngIf=\"formEndpoint || businessClass\"\r\n [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\"\r\n [formEndpointBody]=\"formEndpointBody\"\r\n [isFormEndpointPaged]=\"true\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n (refreshData)=\"refresh($event)\"\r\n [filtersHtmlTemplate]=\"filtersHtmlTemplate\"\r\n [businessClass]=\"businessClass\"\r\n [pagedRequest]=\"pagedRequest\"\r\n [configModeButtonId]=\"configModeButtonId\"\r\n [showNoteButton]=\"false\"\r\n [showActionButton]=\"false\"\r\n [showInfoButton]=\"false\"\r\n [showUploadButton]=\"false\"\r\n [selectedItemUids]=\"selectedItems\"\r\n ></app-reporting>\r\n </ng-template>\r\n </p-toolbar>\r\n \r\n <div>\r\n\r\n <Tsi-Generic-Grid \r\n [formName]=\"formName\" \r\n [header]=\"header\" \r\n [page]=\"page\" \r\n [pagedRequest]=\"pagedRequest\" \r\n [columns]=\"columns\"\r\n [searchFields]=\"searchFields\" \r\n [showSearchField]=\"showSearchField\" \r\n (load)=\"load($event)\"\r\n (searchFieldsValueChanged)=\"searchFieldsValueChanges($event)\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [(filtersHtmlTemplate)]=\"filtersHtmlTemplate\"\r\n [selectKeyOnly]=\"selectKeyOnly\"\r\n [selectionMode]=\"selectionMode\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n [key]=\"key\"\r\n [crudService]=\"crudService\"\r\n [(selectedItems)]=\"selectedItems\"\r\n (selectedItemsChange)=\"onSelectedItemsChange($event)\"\r\n [isGridDataPagedInApi]=\"getDataFromApi\"\r\n [searchOnInit]=\"searchOnInit\"\r\n [showExportButton]=\"showExportButton\"\r\n [showHeaderFilters]=\"showHeaderFilters\"\r\n [showFilterButton]=\"showFilterButton\"\r\n [showGlobalSearch]=\"showGlobalSearch\"\r\n [isSearchButtonDisabled]=\"isSearchButtonDisabled\"\r\n [showCalenderView]=\"showCalenderView\"\r\n (calendarEventClick)=\"handleCalendarEventClick($event)\"\r\n [selectAll]=\"selectAll\"\r\n [checkedByField]=\"checkedByField\"\r\n [targetBusinessClass]=\"targetBusinessClass\"\r\n [sortMode]=\"sortMode\"\r\n [sizingMode]=\"sizingMode\"\r\n ></Tsi-Generic-Grid>\r\n </div>\r\n</div>", styles: [".hide-search-fields{background-color:#64748b!important;border-color:#64748b!important}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i6.TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: ["cudComponent", "modalSize", "showInfoButton", "showDownloadButton", "showUploadButton", "showNoteButton", "showActionButton", "sizingMode", "formName", "id", "pagedRequest", "configuration", "page", "key", "columns", "isSearchButtonDisabled", "filteredColumns", "gridData", "isTableLoading", "parent", "showSearchBox", "showActionColumn", "showHeaderFilters", "showFilterButton", "isGridDataPagedInApi", "header", "ShowFilterColumns", "showImportExportButton", "crudService", "searchFields", "sortMode", "filtersHtmlTemplate", "presentationSettings", "selectKeyOnly", "selectionMode", "selectedItems", "searchOnInit", "showGlobalSearch", "showExportButton", "showSearchField", "showCalenderView", "calenderSchema", "showCardView", "showKanbanView", "showKanbanViewOfWorkFlowEtat", "page$", "checkedByField", "selectAll", "targetBusinessClass", "descriminatorValue", "businessClass", "groupBy", "entityInfo"], outputs: ["onSave", "editRow", "deleteRow", "load", "buttonColumnClicked", "filtersHtmlTemplateChange", "selectedItemsChange", "searchFieldsValueChanged", "calendarEventClick", "statusFilterChanged"] }, { kind: "component", type: i7.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i8.ReportingComponent, selector: "app-reporting", inputs: ["showImportExportButton", "showNoteButton", "showInfoButton", "showUploadButton", "showActionButton", "isReportingToolbarDisabled", "formName", "formEndpoint", "formEndpointBody", "isFormEndpointPaged", "filtersHtmlTemplate", "optionalEndpoints", "businessClass", "mode", "cudComponent", "httpMethodType", "requestData", "customReportingMode", "pagedRequest", "reportDiscriminator", "nombreDocumentsJoints", "id", "configModeButtonId", "showManageWorkflowButton", "selectedItemUids", "fromTsiForm", "customSendMailMode", "reportingInformation"], outputs: ["onSave", "refreshData", "closedModalFileUpload", "toggleDesignMode", "openWorkflow"] }, { kind: "pipe", type: i9.LocalizePipe, name: "localize" }] }); }
371
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiViewGridComponent, deps: [{ token: i1.ErrorResponseManagerService }, { token: i2.TsiModalService }, { token: i0.ChangeDetectorRef }, { token: i3.EntityConfigurationService }], target: i0.ɵɵFactoryTarget.Component }); }
372
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiViewGridComponent, selector: "tsi-view-grid", inputs: { columns: "columns", gridConfiguration: "gridConfiguration", viewComponent: "viewComponent", crudService: "crudService", header: "header", modalSize: "modalSize", showConsultButton: "showConsultButton", showSearchField: "showSearchField", searchFields: "searchFields", formEndpoint: "formEndpoint", formName: "formName", id: "id", showImportExportButton: "showImportExportButton", targetBusinessClass: "targetBusinessClass", getDataFromApi: "getDataFromApi", gridData: "gridData", isSearchButtonDisabled: "isSearchButtonDisabled", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", key: "key", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showCalenderView: "showCalenderView", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", selectAll: "selectAll", checkedByField: "checkedByField", sortMode: "sortMode", sizingMode: "sizingMode", searchOnInit: "searchOnInit" }, outputs: { summariesChange: "summariesChange", selectedItemsChange: "selectedItemsChange", buttonColumnClicked: "buttonColumnClicked", searchFieldsValueChanged: "searchFieldsValueChanged", getAllPagedResultChanged: "getAllPagedResultChanged" }, viewQueries: [{ propertyName: "genericGridComponent", first: true, predicate: TsiGenericGridComponent, descendants: true }], ngImport: i0, template: "<div class=\"card\">\r\n \r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"border-radius-7 mb-1 flex align-items-center gap-2\">\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"flex gap-2 ml-2\">\r\n <Tsi-Button icon=\"pi pi-sliders-h\" [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_tsi_component_grid_menu_view\" *ngIf=\"searchFields\"\r\n styleClass=\"h-2rem hover:shadow-6 p-button-icon-only {{showSearchField ? 'p-button-secondary' : 'p-button-success'}}\" \r\n (click)=\"displaySearchFields()\">\r\n </Tsi-Button>\r\n <Tsi-Button icon=\"p-button-icon pi pi-calendar {{showCalenderView ? 'pi pi-align-justify' : 'pi pi-calendar'}}\" \r\n styleClass=\"p-element p-button-primary hover:shadow-6 h-2rem p-button p-component p-button-icon-only\" (click)=\"toggleCalenderView()\" \r\n tooltipText=\"{{(showCalenderView ? 'shared_tsi_component_grid_list_view' : 'shared_tsi_component_grid_calender_view') | localize}}\" [tooltipPosition]=\"tooltipPosition.Top\"></Tsi-Button>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"right\">\r\n <app-reporting *ngIf=\"formEndpoint || businessClass\"\r\n [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\"\r\n [formEndpointBody]=\"formEndpointBody\"\r\n [isFormEndpointPaged]=\"true\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n (refreshData)=\"refresh($event)\"\r\n [filtersHtmlTemplate]=\"filtersHtmlTemplate\"\r\n [businessClass]=\"businessClass\"\r\n [pagedRequest]=\"pagedRequest\"\r\n [configModeButtonId]=\"configModeButtonId\"\r\n [showNoteButton]=\"false\"\r\n [showActionButton]=\"false\"\r\n [showInfoButton]=\"false\"\r\n [showUploadButton]=\"false\"\r\n [selectedItemUids]=\"selectedItems\"\r\n ></app-reporting>\r\n </ng-template>\r\n </p-toolbar>\r\n \r\n <div>\r\n\r\n <Tsi-Generic-Grid \r\n [formName]=\"formName\" \r\n [header]=\"header\" \r\n [page]=\"page\" \r\n [pagedRequest]=\"pagedRequest\" \r\n [columns]=\"columns\"\r\n [searchFields]=\"searchFields\" \r\n [showSearchField]=\"showSearchField\" \r\n (load)=\"load($event)\"\r\n (searchFieldsValueChanged)=\"searchFieldsValueChanges($event)\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [(filtersHtmlTemplate)]=\"filtersHtmlTemplate\"\r\n [selectKeyOnly]=\"selectKeyOnly\"\r\n [selectionMode]=\"selectionMode\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n [key]=\"key\"\r\n [crudService]=\"crudService\"\r\n [(selectedItems)]=\"selectedItems\"\r\n (selectedItemsChange)=\"onSelectedItemsChange($event)\"\r\n [isGridDataPagedInApi]=\"getDataFromApi\"\r\n [searchOnInit]=\"searchOnInit\"\r\n [showExportButton]=\"showExportButton\"\r\n [showHeaderFilters]=\"showHeaderFilters\"\r\n [showFilterButton]=\"showFilterButton\"\r\n [showGlobalSearch]=\"showGlobalSearch\"\r\n [isSearchButtonDisabled]=\"isSearchButtonDisabled\"\r\n [showCalenderView]=\"showCalenderView\"\r\n (calendarEventClick)=\"handleCalendarEventClick($event)\"\r\n [selectAll]=\"selectAll\"\r\n [checkedByField]=\"checkedByField\"\r\n [targetBusinessClass]=\"targetBusinessClass\"\r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [sortMode]=\"sortMode\"\r\n [sizingMode]=\"sizingMode\"\r\n ></Tsi-Generic-Grid>\r\n </div>\r\n</div>", styles: [".hide-search-fields{background-color:#64748b!important;border-color:#64748b!important}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i7.TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: ["cudComponent", "modalSize", "showInfoButton", "showDownloadButton", "showUploadButton", "showNoteButton", "showActionButton", "sizingMode", "formName", "id", "pagedRequest", "configuration", "page", "key", "columns", "isSearchButtonDisabled", "filteredColumns", "gridData", "isTableLoading", "parent", "showSearchBox", "showActionColumn", "showHeaderFilters", "showFilterButton", "isGridDataPagedInApi", "header", "ShowFilterColumns", "showImportExportButton", "crudService", "searchFields", "sortMode", "filtersHtmlTemplate", "presentationSettings", "selectKeyOnly", "selectionMode", "selectedItems", "searchOnInit", "showGlobalSearch", "showExportButton", "showSearchField", "showCalenderView", "calenderSchema", "showCardView", "showKanbanView", "showKanbanViewOfWorkFlowEtat", "page$", "checkedByField", "selectAll", "targetBusinessClass", "descriminatorValue", "businessClass", "groupBy", "entityInfo"], outputs: ["onSave", "editRow", "deleteRow", "load", "buttonColumnClicked", "filtersHtmlTemplateChange", "selectedItemsChange", "searchFieldsValueChanged", "calendarEventClick", "statusFilterChanged"] }, { kind: "component", type: i8.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i9.ReportingComponent, selector: "app-reporting", inputs: ["showImportExportButton", "showNoteButton", "showInfoButton", "showUploadButton", "showActionButton", "isReportingToolbarDisabled", "formName", "formEndpoint", "formEndpointBody", "isFormEndpointPaged", "filtersHtmlTemplate", "optionalEndpoints", "businessClass", "mode", "cudComponent", "httpMethodType", "requestData", "customReportingMode", "pagedRequest", "reportDiscriminator", "nombreDocumentsJoints", "id", "configModeButtonId", "showManageWorkflowButton", "selectedItemUids", "fromTsiForm", "customSendMailMode", "reportingInformation"], outputs: ["onSave", "refreshData", "closedModalFileUpload", "toggleDesignMode", "openWorkflow"] }, { kind: "pipe", type: i10.LocalizePipe, name: "localize" }] }); }
347
373
  }
348
374
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiViewGridComponent, decorators: [{
349
375
  type: Component,
350
- args: [{ selector: 'tsi-view-grid', template: "<div class=\"card\">\r\n \r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"border-radius-7 mb-1 flex align-items-center gap-2\">\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"flex gap-2 ml-2\">\r\n <Tsi-Button icon=\"pi pi-sliders-h\" [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_tsi_component_grid_menu_view\" *ngIf=\"searchFields\"\r\n styleClass=\"h-2rem hover:shadow-6 p-button-icon-only {{showSearchField ? 'p-button-secondary' : 'p-button-success'}}\" \r\n (click)=\"displaySearchFields()\">\r\n </Tsi-Button>\r\n <Tsi-Button icon=\"p-button-icon pi pi-calendar {{showCalenderView ? 'pi pi-align-justify' : 'pi pi-calendar'}}\" \r\n styleClass=\"p-element p-button-primary hover:shadow-6 h-2rem p-button p-component p-button-icon-only\" (click)=\"toggleCalenderView()\" \r\n tooltipText=\"{{(showCalenderView ? 'shared_tsi_component_grid_list_view' : 'shared_tsi_component_grid_calender_view') | localize}}\" [tooltipPosition]=\"tooltipPosition.Top\"></Tsi-Button>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"right\">\r\n <app-reporting *ngIf=\"formEndpoint || businessClass\"\r\n [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\"\r\n [formEndpointBody]=\"formEndpointBody\"\r\n [isFormEndpointPaged]=\"true\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n (refreshData)=\"refresh($event)\"\r\n [filtersHtmlTemplate]=\"filtersHtmlTemplate\"\r\n [businessClass]=\"businessClass\"\r\n [pagedRequest]=\"pagedRequest\"\r\n [configModeButtonId]=\"configModeButtonId\"\r\n [showNoteButton]=\"false\"\r\n [showActionButton]=\"false\"\r\n [showInfoButton]=\"false\"\r\n [showUploadButton]=\"false\"\r\n [selectedItemUids]=\"selectedItems\"\r\n ></app-reporting>\r\n </ng-template>\r\n </p-toolbar>\r\n \r\n <div>\r\n\r\n <Tsi-Generic-Grid \r\n [formName]=\"formName\" \r\n [header]=\"header\" \r\n [page]=\"page\" \r\n [pagedRequest]=\"pagedRequest\" \r\n [columns]=\"columns\"\r\n [searchFields]=\"searchFields\" \r\n [showSearchField]=\"showSearchField\" \r\n (load)=\"load($event)\"\r\n (searchFieldsValueChanged)=\"searchFieldsValueChanges($event)\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [(filtersHtmlTemplate)]=\"filtersHtmlTemplate\"\r\n [selectKeyOnly]=\"selectKeyOnly\"\r\n [selectionMode]=\"selectionMode\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n [key]=\"key\"\r\n [crudService]=\"crudService\"\r\n [(selectedItems)]=\"selectedItems\"\r\n (selectedItemsChange)=\"onSelectedItemsChange($event)\"\r\n [isGridDataPagedInApi]=\"getDataFromApi\"\r\n [searchOnInit]=\"searchOnInit\"\r\n [showExportButton]=\"showExportButton\"\r\n [showHeaderFilters]=\"showHeaderFilters\"\r\n [showFilterButton]=\"showFilterButton\"\r\n [showGlobalSearch]=\"showGlobalSearch\"\r\n [isSearchButtonDisabled]=\"isSearchButtonDisabled\"\r\n [showCalenderView]=\"showCalenderView\"\r\n (calendarEventClick)=\"handleCalendarEventClick($event)\"\r\n [selectAll]=\"selectAll\"\r\n [checkedByField]=\"checkedByField\"\r\n [targetBusinessClass]=\"targetBusinessClass\"\r\n [sortMode]=\"sortMode\"\r\n [sizingMode]=\"sizingMode\"\r\n ></Tsi-Generic-Grid>\r\n </div>\r\n</div>", styles: [".hide-search-fields{background-color:#64748b!important;border-color:#64748b!important}\n"] }]
351
- }], ctorParameters: () => [{ type: i1.ErrorResponseManagerService }, { type: i2.TsiModalService }, { type: i0.ChangeDetectorRef }], propDecorators: { genericGridComponent: [{
376
+ args: [{ selector: 'tsi-view-grid', template: "<div class=\"card\">\r\n \r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"border-radius-7 mb-1 flex align-items-center gap-2\">\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"flex gap-2 ml-2\">\r\n <Tsi-Button icon=\"pi pi-sliders-h\" [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_tsi_component_grid_menu_view\" *ngIf=\"searchFields\"\r\n styleClass=\"h-2rem hover:shadow-6 p-button-icon-only {{showSearchField ? 'p-button-secondary' : 'p-button-success'}}\" \r\n (click)=\"displaySearchFields()\">\r\n </Tsi-Button>\r\n <Tsi-Button icon=\"p-button-icon pi pi-calendar {{showCalenderView ? 'pi pi-align-justify' : 'pi pi-calendar'}}\" \r\n styleClass=\"p-element p-button-primary hover:shadow-6 h-2rem p-button p-component p-button-icon-only\" (click)=\"toggleCalenderView()\" \r\n tooltipText=\"{{(showCalenderView ? 'shared_tsi_component_grid_list_view' : 'shared_tsi_component_grid_calender_view') | localize}}\" [tooltipPosition]=\"tooltipPosition.Top\"></Tsi-Button>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"right\">\r\n <app-reporting *ngIf=\"formEndpoint || businessClass\"\r\n [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\"\r\n [formEndpointBody]=\"formEndpointBody\"\r\n [isFormEndpointPaged]=\"true\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n (refreshData)=\"refresh($event)\"\r\n [filtersHtmlTemplate]=\"filtersHtmlTemplate\"\r\n [businessClass]=\"businessClass\"\r\n [pagedRequest]=\"pagedRequest\"\r\n [configModeButtonId]=\"configModeButtonId\"\r\n [showNoteButton]=\"false\"\r\n [showActionButton]=\"false\"\r\n [showInfoButton]=\"false\"\r\n [showUploadButton]=\"false\"\r\n [selectedItemUids]=\"selectedItems\"\r\n ></app-reporting>\r\n </ng-template>\r\n </p-toolbar>\r\n \r\n <div>\r\n\r\n <Tsi-Generic-Grid \r\n [formName]=\"formName\" \r\n [header]=\"header\" \r\n [page]=\"page\" \r\n [pagedRequest]=\"pagedRequest\" \r\n [columns]=\"columns\"\r\n [searchFields]=\"searchFields\" \r\n [showSearchField]=\"showSearchField\" \r\n (load)=\"load($event)\"\r\n (searchFieldsValueChanged)=\"searchFieldsValueChanges($event)\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [(filtersHtmlTemplate)]=\"filtersHtmlTemplate\"\r\n [selectKeyOnly]=\"selectKeyOnly\"\r\n [selectionMode]=\"selectionMode\"\r\n [showImportExportButton]=\"showImportExportButton\"\r\n [key]=\"key\"\r\n [crudService]=\"crudService\"\r\n [(selectedItems)]=\"selectedItems\"\r\n (selectedItemsChange)=\"onSelectedItemsChange($event)\"\r\n [isGridDataPagedInApi]=\"getDataFromApi\"\r\n [searchOnInit]=\"searchOnInit\"\r\n [showExportButton]=\"showExportButton\"\r\n [showHeaderFilters]=\"showHeaderFilters\"\r\n [showFilterButton]=\"showFilterButton\"\r\n [showGlobalSearch]=\"showGlobalSearch\"\r\n [isSearchButtonDisabled]=\"isSearchButtonDisabled\"\r\n [showCalenderView]=\"showCalenderView\"\r\n (calendarEventClick)=\"handleCalendarEventClick($event)\"\r\n [selectAll]=\"selectAll\"\r\n [checkedByField]=\"checkedByField\"\r\n [targetBusinessClass]=\"targetBusinessClass\"\r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [sortMode]=\"sortMode\"\r\n [sizingMode]=\"sizingMode\"\r\n ></Tsi-Generic-Grid>\r\n </div>\r\n</div>", styles: [".hide-search-fields{background-color:#64748b!important;border-color:#64748b!important}\n"] }]
377
+ }], ctorParameters: () => [{ type: i1.ErrorResponseManagerService }, { type: i2.TsiModalService }, { type: i0.ChangeDetectorRef }, { type: i3.EntityConfigurationService }], propDecorators: { genericGridComponent: [{
352
378
  type: ViewChild,
353
379
  args: [TsiGenericGridComponent]
354
380
  }], columns: [{
@@ -424,4 +450,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
424
450
  }], getAllPagedResultChanged: [{
425
451
  type: Output
426
452
  }] } });
427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXZpZXctZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLXZpZXctZ3JpZC90c2ktdmlldy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktdmlldy1ncmlkL3RzaS12aWV3LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFPaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7Ozs7Ozs7O0FBT3pGLE1BQU0sT0FBTyxvQkFBb0I7SUE0Qi9CLElBQUksSUFBSSxDQUFDLEtBQWlCO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQWtCRCxJQUFhLE9BQU8sQ0FBQyxLQUFtQjtRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksT0FBTyxLQUFtQixPQUFPLElBQUksQ0FBQyxRQUFR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QkFRRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBYUksZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFDRyx3QkFBd0I7c0JBQWpDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgQ29tcG9uZW50X01vZGVzLCBHcmlkU2VsZWN0aW9uTW9kZSwgR3JpZFNpemluZ01vZGUsIEdyaWRTb3J0TW9kZSwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBwcmVjaXNlU3VtIH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgQnV0dG9uQ2xpY2tSZXN1bHQsIEdyaWRDb2x1bW4sIElHcmlkQ29uZmlndXJhdGlvbiwgSU1vZGFsU2l6ZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBJUGFnZSwgSVBhZ2VkUmVxdWVzdCwgSVBhZ2VkUmVzcG9uc2UsIElTdW1tYXJ5Rm9yUHJvcHJldHkgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi1iYXNlJztcclxuaW1wb3J0IHsgU2VhcmNoRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDcnVkQmFzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9iYXNlL2NydWQtYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kYWwvdHNpLW1vZGFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vZXJyb3ItcmVzcG9uc2UtbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpR2VuZXJpY0dyaWRDb21wb25lbnQgfSBmcm9tICcuLi90c2ktZ2VuZXJpYy1ncmlkL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHNpLXZpZXctZ3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS12aWV3LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RzaS12aWV3LWdyaWQuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaVZpZXdHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgLy8jcmVnaW9uIGxvY2FsIHZhcnNcclxuICBwcml2YXRlIF9kaWFsb2dSZWY/OiBEeW5hbWljRGlhbG9nUmVmO1xyXG4gIHByaXZhdGUgX2Zvcm1FbmRwb2ludDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gIHRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbjtcclxuICBpdGVtcz86IGFueVtdO1xyXG5cclxuICBwYWdlZFJlcXVlc3Q6IElQYWdlZFJlcXVlc3QgPSB7XHJcbiAgICBtYXhSZXN1bHRDb3VudDogMTAsXHJcbiAgICBza2lwQ291bnQ6IDAsXHJcbiAgICBzb3J0aW5nOiBbXSxcclxuICAgIGtleXdvcmQ6ICcnLFxyXG4gICAgZmlsdGVyczogW10sXHJcbiAgICBnZXRBbGxEYXRhOiBmYWxzZSxcclxuICAgIHN1bW1hcmllczogW10sXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfcGFnZTogSVBhZ2U8YW55PiA9IHtcclxuICAgIGl0ZW1zOiBbXSxcclxuICAgIHBhZ2VTaXplOiAxMCxcclxuICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICB0b3RhbENvdW50OiAwLFxyXG4gICAgdG90YWxQYWdlczogMCxcclxuICAgIHN1bW1hcmllczogW10sXHJcbiAgICBsb2FkaW5nOiBmYWxzZSxcclxuICB9O1xyXG5cclxuICBzZXQgcGFnZSh2YWx1ZTogSVBhZ2U8YW55Pikge1xyXG4gICAgdGhpcy5fcGFnZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2UoKTogSVBhZ2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICB9XHJcbiAgZmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcm93cyA9IDE7XHJcbiAgZm9ybUVuZHBvaW50Qm9keTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIGZpbHRlcnNIdG1sVGVtcGxhdGU/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgY29uZmlnTW9kZUJ1dHRvbklkOiBzdHJpbmcgPSBcImNvbmZnLW1vZGUtYnV0dG9uLWZyb20tbGlzdFwiXHJcblxyXG4gIHB1YmxpYyBidXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBfc2VhcmNoT25Jbml0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQFZpZXdDaGlsZChUc2lHZW5lcmljR3JpZENvbXBvbmVudCkgZ2VuZXJpY0dyaWRDb21wb25lbnQ/OiBUc2lHZW5lcmljR3JpZENvbXBvbmVudDtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBwcml2YXRlIF9jb2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKSBzZXQgY29sdW1ucyh2YWx1ZTogR3JpZENvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jb2x1bW5zID0gdmFsdWUgPz8gW107XHJcbiAgfVxyXG5cclxuICBnZXQgY29sdW1ucygpOiBHcmlkQ29sdW1uW10geyByZXR1cm4gdGhpcy5fY29sdW1uczsgfVxyXG5cclxuICBASW5wdXQoKSBncmlkQ29uZmlndXJhdGlvbj86IElHcmlkQ29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoKSB2aWV3Q29tcG9uZW50OiBhbnk7XHJcbiAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuICBASW5wdXQoKSBoZWFkZXI6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIG1vZGFsU2l6ZT86IElNb2RhbFNpemU7XHJcbiAgQElucHV0KCkgc2hvd0NvbnN1bHRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93U2VhcmNoRmllbGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNlYXJjaEZpZWxkczogU2VhcmNoRmllbGRbXSB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZXQgZm9ybUVuZHBvaW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9mb3JtRW5kcG9pbnQgPSBgJHt2YWx1ZX0vZ2V0YWxscGFnZWRgO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgZm9ybUVuZHBvaW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1FbmRwb2ludDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGZvcm1OYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dJbXBvcnRFeHBvcnRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB0YXJnZXRCdXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBfZ3JpZERhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuXHJcbiAgLy9ncmlkIHNlbGVjdGlvblxyXG4gIEBJbnB1dCgpIGdldERhdGFGcm9tQXBpOiBib29sZWFuID0gdHJ1ZVxyXG5cclxuICAvLyBASW5wdXQoKSBncmlkRGF0YT86IEFycmF5PGFueT5cclxuXHJcbiAgQElucHV0KCkgcHVibGljIGdldCBncmlkRGF0YSgpOiBBcnJheTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9ncmlkRGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZ3JpZERhdGEoZGF0YTogQXJyYXk8YW55Pikge1xyXG4gICAgdGhpcy5fZ3JpZERhdGEgPSBbXTtcclxuICAgIHRoaXMuX2dyaWREYXRhID0gZGF0YTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fZ3JpZERhdGEgIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHRoaXMuX2dyaWREYXRhICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5faW5pdFBhZ2VGcm9tR3JpZERhdGEoZGF0YSk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLl9ncmlkRGF0YSA9PSB1bmRlZmluZWQgfHwgdGhpcy5fZ3JpZERhdGEgPT0gbnVsbFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciAhIHlvdSBtdXN0IHByb3ZpZGUgZ3JpZCBEYXRhIVwiKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNTZWFyY2hCdXR0b25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgaXNTZWFyY2hCdXR0b25EaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNTZWFyY2hCdXR0b25EaXNhYmxlZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc1NlYXJjaEJ1dHRvbkRpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzU2VhcmNoQnV0dG9uRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZWxlY3RLZXlPbmx5OiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLk5vbmU7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIGtleTogc3RyaW5nID0gJ3VpZCc7XHJcbiAgQElucHV0KCkgc2hvd0dsb2JhbFNlYXJjaDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0NhbGVuZGVyVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dIZWFkZXJGaWx0ZXJzOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93RmlsdGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzZWxlY3RBbGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNoZWNrZWRCeUZpZWxkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzb3J0TW9kZTogR3JpZFNvcnRNb2RlIHwgYW55ID0gR3JpZFNvcnRNb2RlLk11bHRpcGxlO1xyXG4gIEBJbnB1dCgpIHNpemluZ01vZGU6IEdyaWRTaXppbmdNb2RlID0gR3JpZFNpemluZ01vZGUuRmlsbDtcclxuXHJcbiAgQElucHV0KCkgc2V0IHNlYXJjaE9uSW5pdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NlYXJjaE9uSW5pdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzZWFyY2hPbkluaXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoT25Jbml0O1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gT3V0cHV0c1xyXG5cclxuICBAT3V0cHV0KCkgc3VtbWFyaWVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8SVN1bW1hcnlGb3JQcm9wcmV0eT4+ID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8SVN1bW1hcnlGb3JQcm9wcmV0eT4+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PiA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGJ1dHRvbkNvbHVtbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrUmVzdWx0PigpO1xyXG4gIEBPdXRwdXQoKSBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBcnJheTxTZWFyY2hGaWVsZD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxTZWFyY2hGaWVsZD4+KCk7XHJcbiAgQE91dHB1dCgpIGdldEFsbFBhZ2VkUmVzdWx0Q2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgLy8jcmVnaW9uIE91dHB1dHNcclxuICAvLyNlbmRyZWdpb25cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2U6IEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RzaU1vZGFsU2VydmljZTogVHNpTW9kYWxTZXJ2aWNlLCBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnY29sdW1ucyBjYW50IGJlIG51bGwgb3IgdW5kZWZpbmVkLCBkZXZlbG9wcGVyIG11c3Qgc2V0IGNvbHVtbnMgb2YgZ3JpZCAhJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09IHRydWUpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcjogJ3NoYXJlZF9hY3Rpb25zX2NvbnN1bHQnLFxyXG4gICAgICAgICAgZmllbGQ6ICdjb25zdWx0JyxcclxuICAgICAgICAgIGlzQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgYnV0dG9uSWNvbjogJ3BpIHBpLWV5ZScsXHJcbiAgICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0JyxcclxuICAgICAgICAgIHRvb2xUaXBUZXh0OiBcInNoYXJlZF9hY3Rpb25fY29uc3VsdFwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi50aGlzLmNvbHVtbnMsXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uIGdyaWQgc3RhdGVcclxuXHJcbiAgZ2V0U3RhdGUoKSB7XHJcbiAgICBpZiAodGhpcy5nZW5lcmljR3JpZENvbXBvbmVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmljR3JpZENvbXBvbmVudC5nZXRTdGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIHJlc3RvcmVTdGF0ZShjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmdlbmVyaWNHcmlkQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJpY0dyaWRDb21wb25lbnQucmVzdG9yZVN0YXRlKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5nZW5lcmljR3JpZENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLmdlbmVyaWNHcmlkQ29tcG9uZW50LnJlc2V0U2VsZWN0ZWRDb2x1bW5zKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZVxyXG4gICAgICA/IHRoaXMucGFnZS5wYWdlTnVtYmVyID09PSB0aGlzLnBhZ2UudG90YWxDb3VudCAtIHRoaXMucGFnZS5wYWdlU2l6ZVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2UgPyB0aGlzLnBhZ2UucGFnZU51bWJlciA9PT0gMCA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMobmV3U2VhcmNoRmllbGRWYWx1ZXM6IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQuZW1pdChuZXdTZWFyY2hGaWVsZFZhbHVlcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXp5TG9hZFxyXG4gICAqL1xyXG4gIC8vZmlyc3QgPT0+IHBhZ2UucGFnZU51bWJlclxyXG4gIC8vcm93cyA9PT4gcGFnZS5wYWdlU2l6ZVxyXG4gIC8vdGhpcy5wYWdlLml0ZW1zLmxlbmd0aCA9PT4gdG90YWwgY291bnRcclxuXHJcbiAgaGFuZGxlQnV0dG9uQ29sdW1uQ2xpY2tlZChldmVudDogQnV0dG9uQ2xpY2tSZXN1bHQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdldERhdGFGcm9tQXBpKSB7XHJcbiAgICAgIGlmIChldmVudC5maWVsZCA9PSAnY29uc3VsdCcgJiYgdGhpcy52aWV3Q29tcG9uZW50ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXdDb21wb25lbnQgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBpdGVtS2V5OiBhbnkgPSB0aGlzLnNlbGVjdEtleU9ubHkgPyBldmVudC5rZXkgOiBldmVudC5rZXlbdGhpcy5rZXldO1xyXG4gICAgICAgIHRoaXMuX2NvbnN1bHRSb3coaXRlbUtleSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoe1xyXG4gICAgICAgIGtleTogZXZlbnQua2V5LFxyXG4gICAgICAgIGZpZWxkOiBldmVudC5maWVsZCxcclxuICAgICAgICBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHksXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoe1xyXG4gICAgICAgIGtleTogZXZlbnQua2V5LFxyXG4gICAgICAgIGZpZWxkOiBldmVudC5maWVsZCxcclxuICAgICAgICBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZChldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5nZXREYXRhRnJvbUFwaSkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XHJcbiAgICAgIHRoaXMuX3NldGZvcm1FbmRwb2ludEJvZHkoKTtcclxuICAgICAgdGhpcy5fbG9hZERTKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGtleXdvcmQgPSB0aGlzLnBhZ2VkUmVxdWVzdD8ua2V5d29yZD8udG9Mb2NhbGVMb3dlckNhc2UoKVxyXG4gICAgICBpZiAoIWtleXdvcmQgfHwga2V5d29yZCA9PSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5faW5pdFBhZ2VGcm9tR3JpZERhdGEoKVxyXG4gICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBsZXQgZGF0YSA9IFsuLi50aGlzLl9ncmlkRGF0YV07XHJcbiAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+XHJcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhpdGVtKS5zb21lKHZhbHVlID0+XHJcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsICYmXHJcbiAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoa2V5d29yZClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuX2luaXRQYWdlRnJvbUdyaWREYXRhKGZpbHRlcmVkRGF0YSlcclxuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3VtbWFyeShjb2w6IEdyaWRDb2x1bW4sIGdyaWREYXRhPzogQXJyYXk8YW55Pik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gcHJlY2lzZVN1bSgoZ3JpZERhdGEgPz8gW10pLm1hcCgocm93OiBhbnkpID0+IHJvd1tjb2wuZmllbGRdKSk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGVkSXRlbXNDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBfc2V0Zm9ybUVuZHBvaW50Qm9keSgpOiB2b2lkIHtcclxuICAgIGxldCBveDogYW55ID0gdGhpcy5fY2xvbmVQYWdlZFJlcXVlc3QodGhpcy5wYWdlZFJlcXVlc3QpO1xyXG4gICAgb3hbJ2dldEFsbERhdGEnXSA9IHRydWU7XHJcbiAgICB0aGlzLmZvcm1FbmRwb2ludEJvZHkgPSBKU09OLnN0cmluZ2lmeShveCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkRFMoaXNGb3JDYWxlbmRlcjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLnBhZ2UubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VkUmVxdWVzdCA9IHtcclxuICAgICAgLi4udGhpcy5wYWdlZFJlcXVlc3QsXHJcbiAgICAgIGdldEFsbERhdGE6IGlzRm9yQ2FsZW5kZXIsXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuY3J1ZFNlcnZpY2UgIT0gbnVsbCAmJiB0aGlzLmNydWRTZXJ2aWNlICE9IHVuZGVmaW5lZClcclxuICAgICAgdGhpcy5jcnVkU2VydmljZS5nZXRBbGxQYWdlZCh0aGlzLnBhZ2VkUmVxdWVzdCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodmFsdWU6IElQYWdlZFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2UgPSB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wYWdlLFxyXG4gICAgICAgICAgICAgIGl0ZW1zIDogdmFsdWUuaXRlbXMsXHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudDogdmFsdWUudG90YWxDb3VudCxcclxuICAgICAgICAgICAgICBzdW1tYXJpZXM6IHZhbHVlLnN1bW1hcmllcyA/IHZhbHVlLnN1bW1hcmllcyA6IFtdLFxyXG4gICAgICAgICAgICAgIGdyb3VwczogdmFsdWUuZ3JvdXBzLFxyXG4gICAgICAgICAgICAgIHRvdGFsUGFnZXM6ICh0aGlzLnBhZ2UudG90YWxDb3VudCAtICh0aGlzLnBhZ2UudG90YWxDb3VudCAlIHRoaXMucGFnZS5wYWdlU2l6ZSkpIC8gdGhpcy5wYWdlLnBhZ2VTaXplICsgMSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc3VtbWFyaWVzQ2hhbmdlLmVtaXQodGhpcy5wYWdlLnN1bW1hcmllcyk7XHJcbiAgICAgICAgICB0aGlzLmdldEFsbFBhZ2VkUmVzdWx0Q2hhbmdlZC5lbWl0KHZhbHVlKTtcclxuICAgICAgICAgIHRoaXMucGFnZS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2UoZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbnN1bHRSb3coaXRlbUtleTogYW55KSB7XHJcbiAgICB0aGlzLl9vcGVuTW9kYWwoQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsIGl0ZW1LZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb3Blbk1vZGFsKG1vZGU6IHN0cmluZywgaXRlbUtleT86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWc7XHJcbiAgICBpZiAodGhpcy5tb2RhbFNpemUgIT0gbnVsbCAmJiB0aGlzLm1vZGFsU2l6ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uZiA9IHtcclxuICAgICAgICBkYXRhOiB7IGlkOiBpdGVtS2V5LCBtb2RlOiBtb2RlIH0sXHJcbiAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubW9kYWxTaXplLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5tb2RhbFNpemUuaGVpZ2h0LFxyXG4gICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uZiA9IHsgZGF0YTogeyBpZDogaXRlbUtleSwgbW9kZTogbW9kZSB9LCBtYXhpbWl6YWJsZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGlhbG9nUmVmID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlLm9wZW4odGhpcy52aWV3Q29tcG9uZW50LCBjb25mKTtcclxuXHJcbiAgICB0aGlzLl9kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHZhbD86IGFueSkgPT4gdGhpcy5fY2xvc2VNb2RhbCh2YWwpKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2xvc2VNb2RhbCh2YWw/OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvYWREUygpO1xyXG4gICAgdGhpcy5fZGlhbG9nUmVmPy5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudCA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuX2xvYWREUygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xvbmVQYWdlZFJlcXVlc3QocmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgbGV0IGNsb25lOiBJUGFnZWRSZXF1ZXN0ID0ge1xyXG4gICAgICBtYXhSZXN1bHRDb3VudDogcmVxdWVzdC5tYXhSZXN1bHRDb3VudCxcclxuICAgICAgc2tpcENvdW50OiByZXF1ZXN0LnNraXBDb3VudCxcclxuICAgICAgc29ydGluZzogcmVxdWVzdC5zb3J0aW5nLFxyXG4gICAgICBrZXl3b3JkOiByZXF1ZXN0LmtleXdvcmQsXHJcbiAgICAgIGZpbHRlcnM6IHJlcXVlc3QuZmlsdGVycyxcclxuICAgICAgZ2V0QWxsRGF0YTogcmVxdWVzdC5nZXRBbGxEYXRhLFxyXG4gICAgICBzdW1tYXJpZXM6IHJlcXVlc3Quc3VtbWFyaWVzLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQYWdlRnJvbUdyaWREYXRhKGdyaWREYXRhID0gdGhpcy5fZ3JpZERhdGEpIHtcclxuICAgIHRoaXMucGFnZSA9IHtcclxuICAgICAgLi4udGhpcy5wYWdlLFxyXG4gICAgICBpdGVtczogWy4uLmdyaWREYXRhXSxcclxuICAgICAgdG90YWxDb3VudDogZ3JpZERhdGEubGVuZ3RoLFxyXG4gICAgICB0b3RhbFBhZ2VzOlxyXG4gICAgICAgIChncmlkRGF0YS5sZW5ndGggLSAoZ3JpZERhdGEubGVuZ3RoICUgdGhpcy5wYWdlLnBhZ2VTaXplKSkgL1xyXG4gICAgICAgIHRoaXMucGFnZS5wYWdlU2l6ZSArXHJcbiAgICAgICAgMSxcclxuICAgICAgcGFnZU51bWJlcjogMSxcclxuICAgICAgcGFnZVNpemU6IDEwLFxyXG4gICAgICBzdW1tYXJpZXM6IHRoaXMuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5oYXZlU3VtbWFyeSlcclxuICAgICAgICAubWFwKGNvbCA9PiAoe1xyXG4gICAgICAgICAgcHJvcHJldHk6IGNvbC5maWVsZCxcclxuICAgICAgICAgIHN1bW1hcnk6IHRoaXMuZ2V0U3VtbWFyeShjb2wsIGdyaWREYXRhKVxyXG4gICAgICAgIH0pKSxcclxuICAgICAgbG9hZGluZzogZmFsc2VcclxuICAgIH07XHJcbiAgICB0aGlzLnN1bW1hcmllc0NoYW5nZS5lbWl0KHRoaXMucGFnZS5zdW1tYXJpZXMpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgZGlzcGxheVNlYXJjaEZpZWxkcygpIHtcclxuICAgIHRoaXMuc2hvd1NlYXJjaEZpZWxkID0gIXRoaXMuc2hvd1NlYXJjaEZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGNhbGVuZGVyXHJcbiAgdG9nZ2xlQ2FsZW5kZXJWaWV3KCkge1xyXG4gICAgdGhpcy5zaG93Q2FsZW5kZXJWaWV3ID0gIXRoaXMuc2hvd0NhbGVuZGVyVmlldztcclxuICAgIHRoaXMuX2xvYWREUyh0aGlzLnNob3dDYWxlbmRlclZpZXcpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2FsZW5kYXJFdmVudENsaWNrKGl0ZW06IGFueSkge1xyXG4gICAgc3dpdGNoIChpdGVtLm1vZGUpIHtcclxuICAgICAgY2FzZSBDb21wb25lbnRfTW9kZXMuQ09OU1VMVDpcclxuICAgICAgICB0aGlzLl9jb25zdWx0Um93KGl0ZW0uaWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAvLyBjYXNlIENvbXBvbmVudF9Nb2Rlcy5DUkVBVEUgOlxyXG4gICAgICAvLyAgIHRoaXMuX29wZW5Nb2RhbChDb21wb25lbnRfTW9kZXMuQ1JFQVRFLG51bGwsbnVsbCk7XHJcbiAgICAgIC8vIGJyZWFrO1xyXG4gICAgICAvLyBjYXNlIENvbXBvbmVudF9Nb2Rlcy5FRElUIDpcclxuICAgICAgLy8gICB0aGlzLl9lZGl0Um93KGl0ZW0uaWQpO1xyXG4gICAgICAvLyBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn0iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gIFxyXG4gIDxwLXRvb2xiYXIgKm5nSWY9XCJmb3JtRW5kcG9pbnRcIiBzdHlsZUNsYXNzPVwiYm9yZGVyLXJhZGl1cy03IG1iLTEgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsZWZ0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIG1sLTJcIj5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAgaWNvbj1cInBpIHBpLXNsaWRlcnMtaFwiIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9tZW51X3ZpZXdcIiAqbmdJZj1cInNlYXJjaEZpZWxkc1wiXHJcbiAgICAgICAgc3R5bGVDbGFzcz1cImgtMnJlbSBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1pY29uLW9ubHkge3tzaG93U2VhcmNoRmllbGQgPyAncC1idXR0b24tc2Vjb25kYXJ5JyA6ICdwLWJ1dHRvbi1zdWNjZXNzJ319XCIgXHJcbiAgICAgICAgICAoY2xpY2spPVwiZGlzcGxheVNlYXJjaEZpZWxkcygpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWNhbGVuZGFyIHt7c2hvd0NhbGVuZGVyVmlldyA/ICdwaSBwaS1hbGlnbi1qdXN0aWZ5JyA6ICdwaSBwaS1jYWxlbmRhcid9fVwiIFxyXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tcHJpbWFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGVyVmlldygpXCIgXHJcbiAgICAgICAgdG9vbHRpcFRleHQ9XCJ7eyhzaG93Q2FsZW5kZXJWaWV3ID8gJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfbGlzdF92aWV3JyA6ICdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX3ZpZXcnKSB8IGxvY2FsaXplfX1cIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIFxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJpZ2h0XCI+XHJcbiAgICAgICAgPGFwcC1yZXBvcnRpbmcgKm5nSWY9XCJmb3JtRW5kcG9pbnQgfHwgYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgICAgICBbZm9ybUVuZHBvaW50XT1cImZvcm1FbmRwb2ludFwiXHJcbiAgICAgICAgICBbZm9ybU5hbWVdPVwiZm9ybU5hbWVcIlxyXG4gICAgICAgICAgW2Zvcm1FbmRwb2ludEJvZHldPVwiZm9ybUVuZHBvaW50Qm9keVwiXHJcbiAgICAgICAgICBbaXNGb3JtRW5kcG9pbnRQYWdlZF09XCJ0cnVlXCJcclxuICAgICAgICAgIFtzaG93SW1wb3J0RXhwb3J0QnV0dG9uXT1cInNob3dJbXBvcnRFeHBvcnRCdXR0b25cIlxyXG4gICAgICAgICAgKHJlZnJlc2hEYXRhKT1cInJlZnJlc2goJGV2ZW50KVwiXHJcbiAgICAgICAgICBbZmlsdGVyc0h0bWxUZW1wbGF0ZV09XCJmaWx0ZXJzSHRtbFRlbXBsYXRlXCJcclxuICAgICAgICAgIFtidXNpbmVzc0NsYXNzXT1cImJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICAgICAgW3BhZ2VkUmVxdWVzdF09XCJwYWdlZFJlcXVlc3RcIlxyXG4gICAgICAgICAgW2NvbmZpZ01vZGVCdXR0b25JZF09XCJjb25maWdNb2RlQnV0dG9uSWRcIlxyXG4gICAgICAgICAgW3Nob3dOb3RlQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtzaG93QWN0aW9uQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtzaG93SW5mb0J1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc2hvd1VwbG9hZEJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJdGVtVWlkc109XCJzZWxlY3RlZEl0ZW1zXCJcclxuICAgICAgICAgID48L2FwcC1yZXBvcnRpbmc+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC10b29sYmFyPlxyXG4gIFxyXG4gIDxkaXY+XHJcblxyXG4gICAgPFRzaS1HZW5lcmljLUdyaWQgXHJcbiAgICAgIFtmb3JtTmFtZV09XCJmb3JtTmFtZVwiIFxyXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiIFxyXG4gICAgICBbcGFnZV09XCJwYWdlXCIgXHJcbiAgICAgIFtwYWdlZFJlcXVlc3RdPVwicGFnZWRSZXF1ZXN0XCIgXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBbc2VhcmNoRmllbGRzXT1cInNlYXJjaEZpZWxkc1wiIFxyXG4gICAgICBbc2hvd1NlYXJjaEZpZWxkXT1cInNob3dTZWFyY2hGaWVsZFwiIFxyXG4gICAgICAobG9hZCk9XCJsb2FkKCRldmVudClcIlxyXG4gICAgICAoc2VhcmNoRmllbGRzVmFsdWVDaGFuZ2VkKT1cInNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlcygkZXZlbnQpXCJcclxuICAgICAgKGJ1dHRvbkNvbHVtbkNsaWNrZWQpPVwiaGFuZGxlQnV0dG9uQ29sdW1uQ2xpY2tlZCgkZXZlbnQpXCJcclxuICAgICAgWyhmaWx0ZXJzSHRtbFRlbXBsYXRlKV09XCJmaWx0ZXJzSHRtbFRlbXBsYXRlXCJcclxuICAgICAgW3NlbGVjdEtleU9ubHldPVwic2VsZWN0S2V5T25seVwiXHJcbiAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIlxyXG4gICAgICBbc2hvd0ltcG9ydEV4cG9ydEJ1dHRvbl09XCJzaG93SW1wb3J0RXhwb3J0QnV0dG9uXCJcclxuICAgICAgW2tleV09XCJrZXlcIlxyXG4gICAgICBbY3J1ZFNlcnZpY2VdPVwiY3J1ZFNlcnZpY2VcIlxyXG4gICAgICBbKHNlbGVjdGVkSXRlbXMpXT1cInNlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAoc2VsZWN0ZWRJdGVtc0NoYW5nZSk9XCJvblNlbGVjdGVkSXRlbXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIFtpc0dyaWREYXRhUGFnZWRJbkFwaV09XCJnZXREYXRhRnJvbUFwaVwiXHJcbiAgICAgIFtzZWFyY2hPbkluaXRdPVwic2VhcmNoT25Jbml0XCJcclxuICAgICAgW3Nob3dFeHBvcnRCdXR0b25dPVwic2hvd0V4cG9ydEJ1dHRvblwiXHJcbiAgICAgIFtzaG93SGVhZGVyRmlsdGVyc109XCJzaG93SGVhZGVyRmlsdGVyc1wiXHJcbiAgICAgIFtzaG93RmlsdGVyQnV0dG9uXT1cInNob3dGaWx0ZXJCdXR0b25cIlxyXG4gICAgICBbc2hvd0dsb2JhbFNlYXJjaF09XCJzaG93R2xvYmFsU2VhcmNoXCJcclxuICAgICAgW2lzU2VhcmNoQnV0dG9uRGlzYWJsZWRdPVwiaXNTZWFyY2hCdXR0b25EaXNhYmxlZFwiXHJcbiAgICAgIFtzaG93Q2FsZW5kZXJWaWV3XT1cInNob3dDYWxlbmRlclZpZXdcIlxyXG4gICAgICAoY2FsZW5kYXJFdmVudENsaWNrKT1cImhhbmRsZUNhbGVuZGFyRXZlbnRDbGljaygkZXZlbnQpXCJcclxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxyXG4gICAgICBbY2hlY2tlZEJ5RmllbGRdPVwiY2hlY2tlZEJ5RmllbGRcIlxyXG4gICAgICBbdGFyZ2V0QnVzaW5lc3NDbGFzc109XCJ0YXJnZXRCdXNpbmVzc0NsYXNzXCJcclxuICAgICAgW3NvcnRNb2RlXT1cInNvcnRNb2RlXCJcclxuICAgICAgW3NpemluZ01vZGVdPVwic2l6aW5nTW9kZVwiXHJcbiAgICAgID48L1RzaS1HZW5lcmljLUdyaWQ+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXZpZXctZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLXZpZXctZ3JpZC90c2ktdmlldy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktdmlldy1ncmlkL3RzaS12aWV3LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFTaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7Ozs7Ozs7OztBQU96RixNQUFNLE9BQU8sb0JBQW9CO0lBNEIvQixJQUFJLElBQUksQ0FBQyxLQUFpQjtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFVRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksYUFBYSxDQUFDLEtBQXlCO1FBQ3pDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUUs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akIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFTyxZQUFZO3NCQUF4QixLQUFLO2dCQWFJLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csd0JBQXdCO3NCQUFqQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudF9Nb2RlcywgR3JpZFNlbGVjdGlvbk1vZGUsIEdyaWRTaXppbmdNb2RlLCBHcmlkU29ydE1vZGUsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgcHJlY2lzZVN1bSB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IEJ1dHRvbkNsaWNrUmVzdWx0LCBHcmlkQ29sdW1uLCBJR3JpZENvbmZpZ3VyYXRpb24sIElNb2RhbFNpemUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgSVBhZ2UsIElQYWdlZFJlcXVlc3QsIElQYWdlZFJlc3BvbnNlLCBJU3VtbWFyeUZvclByb3ByZXR5IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9wYWdpbmF0aW9uL3BhZ2luYXRpb24tYmFzZSc7XHJcbmltcG9ydCB7IFNlYXJjaEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRW50aXR5SW5mbyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9lbnRpdHktaW5mby9lbnRpdHktaW5mbyc7XHJcbmltcG9ydCB7IENydWRCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Jhc2UvY3J1ZC1iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24vZW50aXR5LWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaU1vZGFsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21vZGFsL3RzaS1tb2RhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL2Vycm9yLXJlc3BvbnNlLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaUdlbmVyaWNHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vdHNpLWdlbmVyaWMtZ3JpZC90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RzaS12aWV3LWdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktdmlldy1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktdmlldy1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lWaWV3R3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgcHJpdmF0ZSBfZGlhbG9nUmVmPzogRHluYW1pY0RpYWxvZ1JlZjtcclxuICBwcml2YXRlIF9mb3JtRW5kcG9pbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICB0b29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb247XHJcbiAgaXRlbXM/OiBhbnlbXTtcclxuXHJcbiAgcGFnZWRSZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0ID0ge1xyXG4gICAgbWF4UmVzdWx0Q291bnQ6IDEwLFxyXG4gICAgc2tpcENvdW50OiAwLFxyXG4gICAgc29ydGluZzogW10sXHJcbiAgICBrZXl3b3JkOiAnJyxcclxuICAgIGZpbHRlcnM6IFtdLFxyXG4gICAgZ2V0QWxsRGF0YTogZmFsc2UsXHJcbiAgICBzdW1tYXJpZXM6IFtdLFxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgX3BhZ2U6IElQYWdlPGFueT4gPSB7XHJcbiAgICBpdGVtczogW10sXHJcbiAgICBwYWdlU2l6ZTogMTAsXHJcbiAgICBwYWdlTnVtYmVyOiAxLFxyXG4gICAgdG90YWxDb3VudDogMCxcclxuICAgIHRvdGFsUGFnZXM6IDAsXHJcbiAgICBzdW1tYXJpZXM6IFtdLFxyXG4gICAgbG9hZGluZzogZmFsc2UsXHJcbiAgfTtcclxuXHJcbiAgc2V0IHBhZ2UodmFsdWU6IElQYWdlPGFueT4pIHtcclxuICAgIHRoaXMuX3BhZ2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlKCk6IElQYWdlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XHJcbiAgfVxyXG4gIGZpcnN0OiBudW1iZXIgPSAwO1xyXG4gIHJvd3MgPSAxO1xyXG4gIGZvcm1FbmRwb2ludEJvZHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBmaWx0ZXJzSHRtbFRlbXBsYXRlPzogc3RyaW5nID0gJyc7XHJcblxyXG4gIGNvbmZpZ01vZGVCdXR0b25JZDogc3RyaW5nID0gXCJjb25mZy1tb2RlLWJ1dHRvbi1mcm9tLWxpc3RcIlxyXG5cclxuICBwcml2YXRlIF9idXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBnZXQgYnVzaW5lc3NDbGFzcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9idXNpbmVzc0NsYXNzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGJ1c2luZXNzQ2xhc3ModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl9idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2J1c2luZXNzQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2xvYWRFbnRpdHlJbmZvKCk7XHJcbiAgfVxyXG5cclxuICBlbnRpdHlJbmZvPzogRW50aXR5SW5mbztcclxuXHJcbiAgX3NlYXJjaE9uSW5pdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoVHNpR2VuZXJpY0dyaWRDb21wb25lbnQpIGdlbmVyaWNHcmlkQ29tcG9uZW50PzogVHNpR2VuZXJpY0dyaWRDb21wb25lbnQ7XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgcHJpdmF0ZSBfY29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgQElucHV0KCkgc2V0IGNvbHVtbnModmFsdWU6IEdyaWRDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IHZhbHVlID8/IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbHVtbnMoKTogR3JpZENvbHVtbltdIHsgcmV0dXJuIHRoaXMuX2NvbHVtbnM7IH1cclxuXHJcbiAgQElucHV0KCkgZ3JpZENvbmZpZ3VyYXRpb24/OiBJR3JpZENvbmZpZ3VyYXRpb247XHJcbiAgQElucHV0KCkgdmlld0NvbXBvbmVudDogYW55O1xyXG4gIEBJbnB1dCgpIGNydWRTZXJ2aWNlPzogQ3J1ZEJhc2VTZXJ2aWNlPGFueSwgYW55LCBhbnksIGFueT47XHJcbiAgQElucHV0KCkgaGVhZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBtb2RhbFNpemU/OiBJTW9kYWxTaXplO1xyXG4gIEBJbnB1dCgpIHNob3dDb25zdWx0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEZpZWxkOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzZWFyY2hGaWVsZHM6IFNlYXJjaEZpZWxkW10gfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2V0IGZvcm1FbmRwb2ludCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5fZm9ybUVuZHBvaW50ID0gYCR7dmFsdWV9L2dldGFsbHBhZ2VkYDtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGZvcm1FbmRwb2ludCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtRW5kcG9pbnQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBmb3JtTmFtZT86IHN0cmluZztcclxuICBASW5wdXQoKSBpZD86IHN0cmluZztcclxuICBASW5wdXQoKSBzaG93SW1wb3J0RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdGFyZ2V0QnVzaW5lc3NDbGFzcz86IHN0cmluZztcclxuXHJcbiAgX2dyaWREYXRhOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIC8vZ3JpZCBzZWxlY3Rpb25cclxuICBASW5wdXQoKSBnZXREYXRhRnJvbUFwaTogYm9vbGVhbiA9IHRydWVcclxuXHJcbiAgLy8gQElucHV0KCkgZ3JpZERhdGE/OiBBcnJheTxhbnk+XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBnZXQgZ3JpZERhdGEoKTogQXJyYXk8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ3JpZERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGdyaWREYXRhKGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIHRoaXMuX2dyaWREYXRhID0gW107XHJcbiAgICB0aGlzLl9ncmlkRGF0YSA9IGRhdGE7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2dyaWREYXRhICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICB0aGlzLl9ncmlkRGF0YSAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2luaXRQYWdlRnJvbUdyaWREYXRhKGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5fZ3JpZERhdGEgPT0gdW5kZWZpbmVkIHx8IHRoaXMuX2dyaWREYXRhID09IG51bGxcclxuICAgICkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgISB5b3UgbXVzdCBwcm92aWRlIGdyaWQgRGF0YSFcIilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzU2VhcmNoQnV0dG9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGlzU2VhcmNoQnV0dG9uRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzU2VhcmNoQnV0dG9uRGlzYWJsZWQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNTZWFyY2hCdXR0b25EaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBASW5wdXQoKSBrZXk6IHN0cmluZyA9ICd1aWQnO1xyXG4gIEBJbnB1dCgpIHNob3dHbG9iYWxTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dFeHBvcnRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dDYWxlbmRlclZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93SGVhZGVyRmlsdGVyczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0ZpbHRlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2VsZWN0QWxsOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjaGVja2VkQnlGaWVsZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgc29ydE1vZGU6IEdyaWRTb3J0TW9kZSB8IGFueSA9IEdyaWRTb3J0TW9kZS5NdWx0aXBsZTtcclxuICBASW5wdXQoKSBzaXppbmdNb2RlOiBHcmlkU2l6aW5nTW9kZSA9IEdyaWRTaXppbmdNb2RlLkZpbGw7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBzZWFyY2hPbkluaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VhcmNoT25Jbml0ID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VhcmNoT25Jbml0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaE9uSW5pdDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIE91dHB1dHNcclxuXHJcbiAgQE91dHB1dCgpIHN1bW1hcmllc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PElTdW1tYXJ5Rm9yUHJvcHJldHk+PiA9XHJcbiAgICBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElTdW1tYXJ5Rm9yUHJvcHJldHk+PigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBidXR0b25Db2x1bW5DbGlja2VkOiBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgc2VhcmNoRmllbGRzVmFsdWVDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QXJyYXk8U2VhcmNoRmllbGQ+PiA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8U2VhcmNoRmllbGQ+PigpO1xyXG4gIEBPdXRwdXQoKSBnZXRBbGxQYWdlZFJlc3VsdENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlOiBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lNb2RhbFNlcnZpY2U6IFRzaU1vZGFsU2VydmljZSwgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX2VudGl0eUNvbmZpZ1NlcnZpY2U6IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnY29sdW1ucyBjYW50IGJlIG51bGwgb3IgdW5kZWZpbmVkLCBkZXZlbG9wcGVyIG11c3Qgc2V0IGNvbHVtbnMgb2YgZ3JpZCAhJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09IHRydWUpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcjogJ3NoYXJlZF9hY3Rpb25zX2NvbnN1bHQnLFxyXG4gICAgICAgICAgZmllbGQ6ICdjb25zdWx0JyxcclxuICAgICAgICAgIGlzQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgYnV0dG9uSWNvbjogJ3BpIHBpLWV5ZScsXHJcbiAgICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0JyxcclxuICAgICAgICAgIHRvb2xUaXBUZXh0OiBcInNoYXJlZF9hY3Rpb25fY29uc3VsdFwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi50aGlzLmNvbHVtbnMsXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uIGdyaWQgc3RhdGVcclxuXHJcbiAgZ2V0U3RhdGUoKSB7XHJcbiAgICBpZiAodGhpcy5nZW5lcmljR3JpZENvbXBvbmVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmljR3JpZENvbXBvbmVudC5nZXRTdGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIHJlc3RvcmVTdGF0ZShjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmdlbmVyaWNHcmlkQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJpY0dyaWRDb21wb25lbnQucmVzdG9yZVN0YXRlKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5nZW5lcmljR3JpZENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLmdlbmVyaWNHcmlkQ29tcG9uZW50LnJlc2V0U2VsZWN0ZWRDb2x1bW5zKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZVxyXG4gICAgICA/IHRoaXMucGFnZS5wYWdlTnVtYmVyID09PSB0aGlzLnBhZ2UudG90YWxDb3VudCAtIHRoaXMucGFnZS5wYWdlU2l6ZVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2UgPyB0aGlzLnBhZ2UucGFnZU51bWJlciA9PT0gMCA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMobmV3U2VhcmNoRmllbGRWYWx1ZXM6IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQuZW1pdChuZXdTZWFyY2hGaWVsZFZhbHVlcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXp5TG9hZFxyXG4gICAqL1xyXG4gIC8vZmlyc3QgPT0+IHBhZ2UucGFnZU51bWJlclxyXG4gIC8vcm93cyA9PT4gcGFnZS5wYWdlU2l6ZVxyXG4gIC8vdGhpcy5wYWdlLml0ZW1zLmxlbmd0aCA9PT4gdG90YWwgY291bnRcclxuXHJcbiAgaGFuZGxlQnV0dG9uQ29sdW1uQ2xpY2tlZChldmVudDogQnV0dG9uQ2xpY2tSZXN1bHQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdldERhdGFGcm9tQXBpKSB7XHJcbiAgICAgIGlmIChldmVudC5maWVsZCA9PSAnY29uc3VsdCcgJiYgdGhpcy52aWV3Q29tcG9uZW50ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXdDb21wb25lbnQgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBpdGVtS2V5OiBhbnkgPSB0aGlzLnNlbGVjdEtleU9ubHkgPyBldmVudC5rZXkgOiBldmVudC5rZXlbdGhpcy5rZXldO1xyXG4gICAgICAgIHRoaXMuX2NvbnN1bHRSb3coaXRlbUtleSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoe1xyXG4gICAgICAgIGtleTogZXZlbnQua2V5LFxyXG4gICAgICAgIGZpZWxkOiBldmVudC5maWVsZCxcclxuICAgICAgICBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHksXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoe1xyXG4gICAgICAgIGtleTogZXZlbnQua2V5LFxyXG4gICAgICAgIGZpZWxkOiBldmVudC5maWVsZCxcclxuICAgICAgICBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZChldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5nZXREYXRhRnJvbUFwaSkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XHJcbiAgICAgIHRoaXMuX3NldGZvcm1FbmRwb2ludEJvZHkoKTtcclxuICAgICAgdGhpcy5fbG9hZERTKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGtleXdvcmQgPSB0aGlzLnBhZ2VkUmVxdWVzdD8ua2V5d29yZD8udG9Mb2NhbGVMb3dlckNhc2UoKVxyXG4gICAgICBpZiAoIWtleXdvcmQgfHwga2V5d29yZCA9PSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5faW5pdFBhZ2VGcm9tR3JpZERhdGEoKVxyXG4gICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBsZXQgZGF0YSA9IFsuLi50aGlzLl9ncmlkRGF0YV07XHJcbiAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+XHJcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhpdGVtKS5zb21lKHZhbHVlID0+XHJcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsICYmXHJcbiAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoa2V5d29yZClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuX2luaXRQYWdlRnJvbUdyaWREYXRhKGZpbHRlcmVkRGF0YSlcclxuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3VtbWFyeShjb2w6IEdyaWRDb2x1bW4sIGdyaWREYXRhPzogQXJyYXk8YW55Pik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gcHJlY2lzZVN1bSgoZ3JpZERhdGEgPz8gW10pLm1hcCgocm93OiBhbnkpID0+IHJvd1tjb2wuZmllbGRdKSk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGVkSXRlbXNDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBhc3luYyBfbG9hZEVudGl0eUluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2J1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuZW50aXR5SW5mbyA9IGF3YWl0IHRoaXMuX2VudGl0eUNvbmZpZ1NlcnZpY2UuZ2V0RW50aXR5SW5mb0Zyb21DYWNoZSh0aGlzLl9idXNpbmVzc0NsYXNzKTtcclxuICAgICAgaWYgKCF0aGlzLmVudGl0eUluZm8pIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYE5vIGVudGl0eSBpbmZvIGZvdW5kIGZvciAke3RoaXMuX2J1c2luZXNzQ2xhc3N9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldGZvcm1FbmRwb2ludEJvZHkoKTogdm9pZCB7XHJcbiAgICBsZXQgb3g6IGFueSA9IHRoaXMuX2Nsb25lUGFnZWRSZXF1ZXN0KHRoaXMucGFnZWRSZXF1ZXN0KTtcclxuICAgIG94WydnZXRBbGxEYXRhJ10gPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtRW5kcG9pbnRCb2R5ID0gSlNPTi5zdHJpbmdpZnkob3gpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbG9hZERTKGlzRm9yQ2FsZW5kZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5wYWdlLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYWdlZFJlcXVlc3QgPSB7XHJcbiAgICAgIC4uLnRoaXMucGFnZWRSZXF1ZXN0LFxyXG4gICAgICBnZXRBbGxEYXRhOiBpc0ZvckNhbGVuZGVyLFxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlICE9IG51bGwgJiYgdGhpcy5jcnVkU2VydmljZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ2V0QWxsUGFnZWQodGhpcy5wYWdlZFJlcXVlc3QpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHZhbHVlOiBJUGFnZWRSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdlID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucGFnZSxcclxuICAgICAgICAgICAgICBpdGVtcyA6IHZhbHVlLml0ZW1zLFxyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQ6IHZhbHVlLnRvdGFsQ291bnQsXHJcbiAgICAgICAgICAgICAgc3VtbWFyaWVzOiB2YWx1ZS5zdW1tYXJpZXMgPyB2YWx1ZS5zdW1tYXJpZXMgOiBbXSxcclxuICAgICAgICAgICAgICBncm91cHM6IHZhbHVlLmdyb3VwcyxcclxuICAgICAgICAgICAgICB0b3RhbFBhZ2VzOiAodGhpcy5wYWdlLnRvdGFsQ291bnQgLSAodGhpcy5wYWdlLnRvdGFsQ291bnQgJSB0aGlzLnBhZ2UucGFnZVNpemUpKSAvIHRoaXMucGFnZS5wYWdlU2l6ZSArIDEsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnN1bW1hcmllc0NoYW5nZS5lbWl0KHRoaXMucGFnZS5zdW1tYXJpZXMpO1xyXG4gICAgICAgICAgdGhpcy5nZXRBbGxQYWdlZFJlc3VsdENoYW5nZWQuZW1pdCh2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnBhZ2UubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKGVycm9yKTtcclxuICAgICAgICAgIHRoaXMucGFnZS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jb25zdWx0Um93KGl0ZW1LZXk6IGFueSkge1xyXG4gICAgdGhpcy5fb3Blbk1vZGFsKENvbXBvbmVudF9Nb2Rlcy5DT05TVUxULCBpdGVtS2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29wZW5Nb2RhbChtb2RlOiBzdHJpbmcsIGl0ZW1LZXk/OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnO1xyXG4gICAgaWYgKHRoaXMubW9kYWxTaXplICE9IG51bGwgJiYgdGhpcy5tb2RhbFNpemUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbmYgPSB7XHJcbiAgICAgICAgZGF0YTogeyBpZDogaXRlbUtleSwgbW9kZTogbW9kZSB9LFxyXG4gICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1vZGFsU2l6ZS53aWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubW9kYWxTaXplLmhlaWdodCxcclxuICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbmYgPSB7IGRhdGE6IHsgaWQ6IGl0ZW1LZXksIG1vZGU6IG1vZGUgfSwgbWF4aW1pemFibGU6IHRydWUgfTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RpYWxvZ1JlZiA9IHRoaXMuX3RzaU1vZGFsU2VydmljZS5vcGVuKHRoaXMudmlld0NvbXBvbmVudCwgY29uZik7XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCh2YWw/OiBhbnkpID0+IHRoaXMuX2Nsb3NlTW9kYWwodmFsKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2Nsb3NlTW9kYWwodmFsPzogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2FkRFMoKTtcclxuICAgIHRoaXMuX2RpYWxvZ1JlZj8uZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaChldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLl9sb2FkRFMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nsb25lUGFnZWRSZXF1ZXN0KHJlcXVlc3Q6IElQYWdlZFJlcXVlc3QpOiBJUGFnZWRSZXF1ZXN0IHtcclxuICAgIGxldCBjbG9uZTogSVBhZ2VkUmVxdWVzdCA9IHtcclxuICAgICAgbWF4UmVzdWx0Q291bnQ6IHJlcXVlc3QubWF4UmVzdWx0Q291bnQsXHJcbiAgICAgIHNraXBDb3VudDogcmVxdWVzdC5za2lwQ291bnQsXHJcbiAgICAgIHNvcnRpbmc6IHJlcXVlc3Quc29ydGluZyxcclxuICAgICAga2V5d29yZDogcmVxdWVzdC5rZXl3b3JkLFxyXG4gICAgICBmaWx0ZXJzOiByZXF1ZXN0LmZpbHRlcnMsXHJcbiAgICAgIGdldEFsbERhdGE6IHJlcXVlc3QuZ2V0QWxsRGF0YSxcclxuICAgICAgc3VtbWFyaWVzOiByZXF1ZXN0LnN1bW1hcmllcyxcclxuICAgIH07XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UGFnZUZyb21HcmlkRGF0YShncmlkRGF0YSA9IHRoaXMuX2dyaWREYXRhKSB7XHJcbiAgICB0aGlzLnBhZ2UgPSB7XHJcbiAgICAgIC4uLnRoaXMucGFnZSxcclxuICAgICAgaXRlbXM6IFsuLi5ncmlkRGF0YV0sXHJcbiAgICAgIHRvdGFsQ291bnQ6IGdyaWREYXRhLmxlbmd0aCxcclxuICAgICAgdG90YWxQYWdlczpcclxuICAgICAgICAoZ3JpZERhdGEubGVuZ3RoIC0gKGdyaWREYXRhLmxlbmd0aCAlIHRoaXMucGFnZS5wYWdlU2l6ZSkpIC9cclxuICAgICAgICB0aGlzLnBhZ2UucGFnZVNpemUgK1xyXG4gICAgICAgIDEsXHJcbiAgICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICAgIHBhZ2VTaXplOiAxMCxcclxuICAgICAgc3VtbWFyaWVzOiB0aGlzLmNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wuaGF2ZVN1bW1hcnkpXHJcbiAgICAgICAgLm1hcChjb2wgPT4gKHtcclxuICAgICAgICAgIHByb3ByZXR5OiBjb2wuZmllbGQsXHJcbiAgICAgICAgICBzdW1tYXJ5OiB0aGlzLmdldFN1bW1hcnkoY29sLCBncmlkRGF0YSlcclxuICAgICAgICB9KSksXHJcbiAgICAgIGxvYWRpbmc6IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdW1tYXJpZXNDaGFuZ2UuZW1pdCh0aGlzLnBhZ2Uuc3VtbWFyaWVzKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIGRpc3BsYXlTZWFyY2hGaWVsZHMoKSB7XHJcbiAgICB0aGlzLnNob3dTZWFyY2hGaWVsZCA9ICF0aGlzLnNob3dTZWFyY2hGaWVsZDtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBjYWxlbmRlclxyXG4gIHRvZ2dsZUNhbGVuZGVyVmlldygpIHtcclxuICAgIHRoaXMuc2hvd0NhbGVuZGVyVmlldyA9ICF0aGlzLnNob3dDYWxlbmRlclZpZXc7XHJcbiAgICB0aGlzLl9sb2FkRFModGhpcy5zaG93Q2FsZW5kZXJWaWV3KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNhbGVuZGFyRXZlbnRDbGljayhpdGVtOiBhbnkpIHtcclxuICAgIHN3aXRjaCAoaXRlbS5tb2RlKSB7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50X01vZGVzLkNPTlNVTFQ6XHJcbiAgICAgICAgdGhpcy5fY29uc3VsdFJvdyhpdGVtLmlkKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgLy8gY2FzZSBDb21wb25lbnRfTW9kZXMuQ1JFQVRFIDpcclxuICAgICAgLy8gICB0aGlzLl9vcGVuTW9kYWwoQ29tcG9uZW50X01vZGVzLkNSRUFURSxudWxsLG51bGwpO1xyXG4gICAgICAvLyBicmVhaztcclxuICAgICAgLy8gY2FzZSBDb21wb25lbnRfTW9kZXMuRURJVCA6XHJcbiAgICAgIC8vICAgdGhpcy5fZWRpdFJvdyhpdGVtLmlkKTtcclxuICAgICAgLy8gYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59IiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICBcclxuICA8cC10b29sYmFyICpuZ0lmPVwiZm9ybUVuZHBvaW50XCIgc3R5bGVDbGFzcz1cImJvcmRlci1yYWRpdXMtNyBtYi0xIGZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibGVmdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBtbC0yXCI+XHJcbiAgICAgICAgPFRzaS1CdXR0b24gIGljb249XCJwaSBwaS1zbGlkZXJzLWhcIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfbWVudV92aWV3XCIgKm5nSWY9XCJzZWFyY2hGaWVsZHNcIlxyXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJoLTJyZW0gaG92ZXI6c2hhZG93LTYgcC1idXR0b24taWNvbi1vbmx5IHt7c2hvd1NlYXJjaEZpZWxkID8gJ3AtYnV0dG9uLXNlY29uZGFyeScgOiAncC1idXR0b24tc3VjY2Vzcyd9fVwiIFxyXG4gICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlTZWFyY2hGaWVsZHMoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuICAgICAgICA8VHNpLUJ1dHRvbiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1jYWxlbmRhciB7e3Nob3dDYWxlbmRlclZpZXcgPyAncGkgcGktYWxpZ24tanVzdGlmeScgOiAncGkgcGktY2FsZW5kYXInfX1cIiBcclxuICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXByaW1hcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJ0b2dnbGVDYWxlbmRlclZpZXcoKVwiIFxyXG4gICAgICAgIHRvb2x0aXBUZXh0PVwie3soc2hvd0NhbGVuZGVyVmlldyA/ICdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2xpc3RfdmlldycgOiAnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9jYWxlbmRlcl92aWV3JykgfCBsb2NhbGl6ZX19XCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICBcclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJyaWdodFwiPlxyXG4gICAgICAgIDxhcHAtcmVwb3J0aW5nICpuZ0lmPVwiZm9ybUVuZHBvaW50IHx8IGJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICAgICAgW2Zvcm1FbmRwb2ludF09XCJmb3JtRW5kcG9pbnRcIlxyXG4gICAgICAgICAgW2Zvcm1OYW1lXT1cImZvcm1OYW1lXCJcclxuICAgICAgICAgIFtmb3JtRW5kcG9pbnRCb2R5XT1cImZvcm1FbmRwb2ludEJvZHlcIlxyXG4gICAgICAgICAgW2lzRm9ybUVuZHBvaW50UGFnZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbc2hvd0ltcG9ydEV4cG9ydEJ1dHRvbl09XCJzaG93SW1wb3J0RXhwb3J0QnV0dG9uXCJcclxuICAgICAgICAgIChyZWZyZXNoRGF0YSk9XCJyZWZyZXNoKCRldmVudClcIlxyXG4gICAgICAgICAgW2ZpbHRlcnNIdG1sVGVtcGxhdGVdPVwiZmlsdGVyc0h0bWxUZW1wbGF0ZVwiXHJcbiAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCJcclxuICAgICAgICAgIFtwYWdlZFJlcXVlc3RdPVwicGFnZWRSZXF1ZXN0XCJcclxuICAgICAgICAgIFtjb25maWdNb2RlQnV0dG9uSWRdPVwiY29uZmlnTW9kZUJ1dHRvbklkXCJcclxuICAgICAgICAgIFtzaG93Tm90ZUJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc2hvd0FjdGlvbkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc2hvd0luZm9CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW3Nob3dVcGxvYWRCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSXRlbVVpZHNdPVwic2VsZWN0ZWRJdGVtc1wiXHJcbiAgICAgICAgICA+PC9hcHAtcmVwb3J0aW5nPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L3AtdG9vbGJhcj5cclxuICBcclxuICA8ZGl2PlxyXG5cclxuICAgIDxUc2ktR2VuZXJpYy1HcmlkIFxyXG4gICAgICBbZm9ybU5hbWVdPVwiZm9ybU5hbWVcIiBcclxuICAgICAgW2hlYWRlcl09XCJoZWFkZXJcIiBcclxuICAgICAgW3BhZ2VdPVwicGFnZVwiIFxyXG4gICAgICBbcGFnZWRSZXF1ZXN0XT1cInBhZ2VkUmVxdWVzdFwiIFxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgW3NlYXJjaEZpZWxkc109XCJzZWFyY2hGaWVsZHNcIiBcclxuICAgICAgW3Nob3dTZWFyY2hGaWVsZF09XCJzaG93U2VhcmNoRmllbGRcIiBcclxuICAgICAgKGxvYWQpPVwibG9hZCgkZXZlbnQpXCJcclxuICAgICAgKHNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlZCk9XCJzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMoJGV2ZW50KVwiXHJcbiAgICAgIChidXR0b25Db2x1bW5DbGlja2VkKT1cImhhbmRsZUJ1dHRvbkNvbHVtbkNsaWNrZWQoJGV2ZW50KVwiXHJcbiAgICAgIFsoZmlsdGVyc0h0bWxUZW1wbGF0ZSldPVwiZmlsdGVyc0h0bWxUZW1wbGF0ZVwiXHJcbiAgICAgIFtzZWxlY3RLZXlPbmx5XT1cInNlbGVjdEtleU9ubHlcIlxyXG4gICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgW3Nob3dJbXBvcnRFeHBvcnRCdXR0b25dPVwic2hvd0ltcG9ydEV4cG9ydEJ1dHRvblwiXHJcbiAgICAgIFtrZXldPVwia2V5XCJcclxuICAgICAgW2NydWRTZXJ2aWNlXT1cImNydWRTZXJ2aWNlXCJcclxuICAgICAgWyhzZWxlY3RlZEl0ZW1zKV09XCJzZWxlY3RlZEl0ZW1zXCJcclxuICAgICAgKHNlbGVjdGVkSXRlbXNDaGFuZ2UpPVwib25TZWxlY3RlZEl0ZW1zQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICBbaXNHcmlkRGF0YVBhZ2VkSW5BcGldPVwiZ2V0RGF0YUZyb21BcGlcIlxyXG4gICAgICBbc2VhcmNoT25Jbml0XT1cInNlYXJjaE9uSW5pdFwiXHJcbiAgICAgIFtzaG93RXhwb3J0QnV0dG9uXT1cInNob3dFeHBvcnRCdXR0b25cIlxyXG4gICAgICBbc2hvd0hlYWRlckZpbHRlcnNdPVwic2hvd0hlYWRlckZpbHRlcnNcIlxyXG4gICAgICBbc2hvd0ZpbHRlckJ1dHRvbl09XCJzaG93RmlsdGVyQnV0dG9uXCJcclxuICAgICAgW3Nob3dHbG9iYWxTZWFyY2hdPVwic2hvd0dsb2JhbFNlYXJjaFwiXHJcbiAgICAgIFtpc1NlYXJjaEJ1dHRvbkRpc2FibGVkXT1cImlzU2VhcmNoQnV0dG9uRGlzYWJsZWRcIlxyXG4gICAgICBbc2hvd0NhbGVuZGVyVmlld109XCJzaG93Q2FsZW5kZXJWaWV3XCJcclxuICAgICAgKGNhbGVuZGFyRXZlbnRDbGljayk9XCJoYW5kbGVDYWxlbmRhckV2ZW50Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgIFtzZWxlY3RBbGxdPVwic2VsZWN0QWxsXCJcclxuICAgICAgW2NoZWNrZWRCeUZpZWxkXT1cImNoZWNrZWRCeUZpZWxkXCJcclxuICAgICAgW3RhcmdldEJ1c2luZXNzQ2xhc3NdPVwidGFyZ2V0QnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgIFtidXNpbmVzc0NsYXNzXT1cImJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICBbZW50aXR5SW5mb109XCJlbnRpdHlJbmZvXCJcclxuICAgICAgW3NvcnRNb2RlXT1cInNvcnRNb2RlXCJcclxuICAgICAgW3NpemluZ01vZGVdPVwic2l6aW5nTW9kZVwiXHJcbiAgICAgID48L1RzaS1HZW5lcmljLUdyaWQ+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==