@tsi-developpement/tsi-shared-ui 1.9.2 → 1.9.4

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 (43) hide show
  1. package/esm2022/lib/enums/grid-sizing-mode.mjs +15 -0
  2. package/esm2022/lib/enums/index.mjs +2 -2
  3. package/esm2022/lib/interfaces/grid/grid-configuration.mjs +1 -1
  4. package/esm2022/lib/interfaces/index.mjs +1 -2
  5. package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +1 -1
  6. package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +4 -5
  7. package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +61 -3
  8. package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +41 -12
  9. package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +1 -1
  10. package/esm2022/lib/tsi-components/manage-reporting/manage-reporting.component.mjs +3 -5
  11. package/esm2022/lib/tsi-components/modal-component/modal.component.mjs +1 -1
  12. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +71 -78
  13. package/esm2022/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.mjs +15 -5
  14. package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +7 -4
  15. package/esm2022/lib/tsi-components/tsi-action-erp-create-or-edit/tsi-action-erp-create-or-edit.component.mjs +1 -1
  16. package/esm2022/lib/tsi-components/tsi-action-erp-list/tsi-action-erp-list.component.mjs +1 -1
  17. package/esm2022/lib/tsi-components/tsi-dynamic-form/dynamic-form-list/dynamic-form-list.component.mjs +1 -1
  18. package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +7 -3
  19. package/esm2022/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.mjs +1 -1
  20. package/esm2022/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.mjs +1 -1
  21. package/esm2022/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.mjs +1 -1
  22. package/esm2022/lib/tsi-helpers/column-width.controller.mjs +97 -0
  23. package/esm2022/lib/tsi-helpers/grid-col-style.helper.mjs +28 -5
  24. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +4039 -3839
  25. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
  26. package/lib/consts/app-providers.d.ts +1 -1
  27. package/lib/enums/grid-sizing-mode.d.ts +13 -0
  28. package/lib/enums/index.d.ts +1 -1
  29. package/lib/interfaces/grid/grid-configuration.d.ts +7 -2
  30. package/lib/interfaces/index.d.ts +0 -1
  31. package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +45 -1
  32. package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +24 -3
  33. package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +48 -2
  34. package/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.d.ts +7 -1
  35. package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +3 -2
  36. package/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.d.ts +3 -1
  37. package/lib/tsi-helpers/column-width.controller.d.ts +67 -0
  38. package/lib/tsi-helpers/grid-col-style.helper.d.ts +16 -5
  39. package/package.json +1 -1
  40. package/esm2022/lib/enums/css-units.mjs +0 -10
  41. package/esm2022/lib/interfaces/styles/css-size-property.mjs +0 -17
  42. package/lib/enums/css-units.d.ts +0 -8
  43. package/lib/interfaces/styles/css-size-property.d.ts +0 -10
@@ -10,7 +10,9 @@ import { openTsiPopupTextViewerComponent } from '../../../functions/modal-open.f
10
10
  import { Fichier } from '../../../models';
11
11
  import { ExportExcelHelper } from '../../../tsi-helpers/export-excel.helper';
12
12
  import { FilterHelper } from '../../../tsi-helpers/filter-helper';
13
+ import { ColumnWidthController } from '../../../tsi-helpers/column-width.controller';
13
14
  import { ActionPlacement } from '../../../enums/action-placement';
15
+ import { GridSizingMode } from '../../../enums/grid-sizing-mode';
14
16
  import * as i0 from "@angular/core";
15
17
  import * as i1 from "../../../services/status/status-color.service";
16
18
  import * as i2 from "../../../services/fichier/fichier.service";
@@ -55,6 +57,24 @@ import * as i40 from "../../tsi-kanban-workflow-etat/tsi-kanban-workflow-etat.co
55
57
  import * as i41 from "../../../tsi-directives/presentation-designer-base.directive";
56
58
  import * as i42 from "../display-nested-prop/display-nested-prop.component";
57
59
  export class TsiGenericGridComponent {
60
+ /**
61
+ * Sizing style bound to the p-table's `[tableStyle]`. This is the single lever that
62
+ * distinguishes Fill from Hug (see GridSizingMode) — everything else (per-column widths,
63
+ * wrapping) is identical between modes. Applied inline on the table PrimeNG owns, so it
64
+ * beats PrimeNG's default `.p-datatable-table { width: 100% }` with no `!important`/`::ng-deep`.
65
+ * - Fill: keep the 50rem floor and let the table fill its container (width defaults to 100%).
66
+ * - Hug: `width:auto` shrinks the table to its columns; `min-width:0` drops the floor so a
67
+ * narrow table isn't stuck at 50rem; `max-width:100%` keeps it inside the page (overflow scrolls).
68
+ *
69
+ * Hug + `columnResizeMode="expand"`: dragging a column resizes that column (PrimeNG's
70
+ * per-column `!important` rules still win), but `width:auto` is re-asserted on change
71
+ * detection, so the table itself never expands past its content — it stays hugged by design.
72
+ */
73
+ get tableStyle() {
74
+ return this.sizingMode === GridSizingMode.Hug
75
+ ? { 'width': 'auto', 'min-width': '0', 'max-width': '100%' }
76
+ : { 'min-width': '50rem' };
77
+ }
58
78
  async eyeClicked(text) {
59
79
  let modalSize = ModalSizeEnum.ExtraLarge;
60
80
  let conf = {
@@ -260,6 +280,12 @@ export class TsiGenericGridComponent {
260
280
  this.showUploadButton = false;
261
281
  this.showNoteButton = false;
262
282
  this.showActionButton = false;
283
+ /**
284
+ * Fill (default): the table stretches to fill its container and auto columns share the
285
+ * leftover space. Hug: the table shrinks to its columns' size (never wider than the
286
+ * container), so leftover width stays empty rather than inflating columns.
287
+ */
288
+ this.sizingMode = GridSizingMode.Fill;
263
289
  this.onSave = new EventEmitter();
264
290
  this.filterMatchMode = FilterMatchMode;
265
291
  this.tooltipPosition = TooltipPosition;
@@ -361,8 +387,9 @@ export class TsiGenericGridComponent {
361
387
  this.actionPlacement = ActionPlacement;
362
388
  this._selectedColumns = [];
363
389
  this.importantColumns = ['consult', 'edit', 'delete', 'upload', 'download', 'info', 'notes', 'duplicate', 'form', 'actionERP'];
364
- this.isFirstLoadOfPage = true;
365
390
  this.titleCache = new Map();
391
+ /** Shared model for the developer-width / wrapping / resize-priority behavior. */
392
+ this.columnWidth = new ColumnWidthController((col) => this.isWidthEligible(col));
366
393
  }
367
394
  ngAfterViewInit() {
368
395
  let filterModeTooltipFromLocalStorage = localStorage.getItem(`${this.formName}-filterMode`);
@@ -514,6 +541,7 @@ export class TsiGenericGridComponent {
514
541
  restoreState(configuration) {
515
542
  let state = JSON.parse(configuration);
516
543
  if (this.dt) {
544
+ this.columnWidth.setRemembered(state.columnWidths);
517
545
  this.dt.columnWidthsState = state.columnWidths;
518
546
  this.dt.tableWidthState = state.tableWidth;
519
547
  let columnOrder = state.columnOrder;
@@ -523,6 +551,10 @@ export class TsiGenericGridComponent {
523
551
  this.columns = reorderedColumns;
524
552
  this.sortColumns();
525
553
  }
554
+ // Apply the remembered column widths to the DOM. Assigning columnWidthsState
555
+ // alone is a no-op here because the grid is not PrimeNG-"stateful"
556
+ // (no stateKey), so PrimeNG never calls this on its own.
557
+ this.dt.restoreColumnWidths();
526
558
  }
527
559
  }
528
560
  onSelectedColumnsChange(newValue) {
@@ -576,6 +608,8 @@ export class TsiGenericGridComponent {
576
608
  resetSelectedColumns(configuration) {
577
609
  let state = JSON.parse(configuration);
578
610
  if (this.dt) {
611
+ this.columnWidth.reset();
612
+ this.columnWidth.setRemembered(state.columnWidths);
579
613
  this.dt.columnWidthsState = state.columnWidths;
580
614
  this.dt.tableWidthState = state.tableWidth;
581
615
  let columnOrder = state.columnOrder;
@@ -585,6 +619,7 @@ export class TsiGenericGridComponent {
585
619
  this._columns = this._tempColumns;
586
620
  this.sortColumns();
587
621
  }
622
+ this.dt.restoreColumnWidths();
588
623
  }
589
624
  }
590
625
  notInSpecifiedColumn(field) {
@@ -594,6 +629,36 @@ export class TsiGenericGridComponent {
594
629
  isOverflowColumn(field) {
595
630
  return field === this.overflowColumnField;
596
631
  }
632
+ /**
633
+ * A column is eligible for a developer-preferred width, wrapping and top-align only
634
+ * when it is a regular data column. Action/button columns, the synthetic overflow
635
+ * column, image columns and frozen columns keep their own fixed, predictable size:
636
+ * frozen columns must keep their sticky-offset width or later frozen columns misalign (UC-7).
637
+ */
638
+ isWidthEligible(col) {
639
+ return !col.isButton
640
+ && !this.isOverflowColumn(col.field)
641
+ && col.type !== this.displayTypes.IMAGE_DISPLAY
642
+ && !col.isFrozen;
643
+ }
644
+ /** Remember which column the user resized so its developer-preferred width yields (UC-4). */
645
+ onColResize(event) {
646
+ this.columnWidth.onResize(event?.element?.getAttribute('data-field'));
647
+ }
648
+ /** Whether a column's content should wrap to stay inside its constrained width. */
649
+ shouldWrapColumn(col) {
650
+ return this.columnWidth.shouldWrap(col);
651
+ }
652
+ /** Header `<th>` style: column header style merged with the developer size style. */
653
+ getHeaderColumnStyle(col) {
654
+ const base = this.page.items.length > 0 ? (col.headerColumnStyle ?? {}) : {};
655
+ return { ...base, ...this.columnWidth.sizeStyle(col) };
656
+ }
657
+ /** Body `<td>` style: column body style + top-align (eligible cells) + developer size style. */
658
+ getBodyColumnStyle(col) {
659
+ const base = this.page.items.length > 0 ? (col.ngStyle ?? {}) : {};
660
+ return { ...base, ...this.columnWidth.verticalAlign(col), ...this.columnWidth.sizeStyle(col) };
661
+ }
597
662
  processStickyColumns(columns) {
598
663
  let index = 0;
599
664
  columns.forEach((col) => {
@@ -745,80 +810,6 @@ export class TsiGenericGridComponent {
745
810
  }
746
811
  this.pagedRequest.skipCount = event.first == 1 ? 0 : event.first;
747
812
  this.pagedRequest.maxResultCount = event.rows;
748
- if (this.formName && this.isFirstLoadOfPage) {
749
- this.isFirstLoadOfPage = false;
750
- const storedValue = localStorage.getItem(this.formName);
751
- if (storedValue) {
752
- const sessionData = JSON.parse(storedValue);
753
- const columnOrder = sessionData.columnOrder;
754
- const columnWidths = sessionData.columnWidths.split(',');
755
- const updatedSelectedColumns = [];
756
- columnOrder.forEach((field, index) => {
757
- const columnWidth = columnWidths[index];
758
- const existingColumnIndex = this.selectedColumns.findIndex(column => column.field === field);
759
- if (existingColumnIndex !== -1) {
760
- this.selectedColumns[existingColumnIndex].width = columnWidth;
761
- updatedSelectedColumns.push(this.selectedColumns[existingColumnIndex]);
762
- }
763
- });
764
- this.selectedColumns = updatedSelectedColumns;
765
- if ((sessionData.multiSortMeta && sessionData.multiSortMeta.length > 0) || (sessionData.filters)) {
766
- if (sessionData.multiSortMeta && sessionData.multiSortMeta.length > 0) {
767
- sessionData.multiSortMeta.forEach((meta) => {
768
- let sortMeta = {
769
- field: meta.field,
770
- order: meta.order
771
- };
772
- event.sortField = meta.field;
773
- event.sortOrder = meta.order;
774
- event.multiSortMeta?.push(sortMeta);
775
- });
776
- }
777
- if (sessionData.filters) {
778
- let filters = {};
779
- Object.entries(sessionData.filters).forEach(([fieldName, filterMetadata]) => {
780
- const filterMetadataValue = filterMetadata;
781
- if (filterMetadataValue[0] != null) {
782
- filters[fieldName] = filterMetadataValue[0];
783
- }
784
- });
785
- // Assign the filters to the event
786
- event.filters = filters;
787
- // event.filters = Object.entries(sessionData.filters).reduce((filters: { [s: string]: FilterMetadata }, [fieldName, filterMetadata ] ) => {
788
- // var filterMetadataValue = filterMetadata as FilterMetadata;
789
- // if (filterMetadataValue.value != undefined) {
790
- // filters[fieldName] = filterMetadata as FilterMetadata;
791
- // }
792
- // console.log('all filters', filters)
793
- // return filters;
794
- // }, {});
795
- // this.searchFields =[];
796
- // const filtersArray: [string, { value: string | null; matchMode: string,operator : string }[]][] = Object.entries(data.filters);
797
- // filtersArray.forEach(([fieldName, fieldValue]) => {
798
- // fieldValue.forEach(filter =>
799
- // {
800
- // if(filter.value){
801
- // let searchField : SearchField ={
802
- // field :fieldName,
803
- // labelValue : filter.value,
804
- // value:filter.value,
805
- // type : this.inferInputType(fieldName),
806
- // operator : this.getOperatorNumber(filter.matchMode)
807
- // };
808
- // console.log('searchField',searchField);
809
- // if (this.searchFields) {
810
- // this.searchFields.push(searchField);
811
- // }
812
- // }
813
- // });
814
- // });
815
- }
816
- }
817
- }
818
- else {
819
- console.log("No session data found in localStorage");
820
- }
821
- }
822
813
  this._gridHeaderFilters = this._extractFilters(event.filters);
823
814
  this._extractSortCriterias(event);
824
815
  this.search();
@@ -1846,7 +1837,7 @@ export class TsiGenericGridComponent {
1846
1837
  }
1847
1838
  }
1848
1839
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiGenericGridComponent, deps: [{ token: i1.StatusColorService }, { token: i2.FichierService }, { token: i3.HtmlTemplateGeneratorService }, { token: i4.DatePipe }, { token: i5.TsiNotificationService }, { token: i6.LocalizePipe }, { token: i7.LayoutHelperService }, { token: i8.LayoutService }, { token: i9.PrimeNGConfig }, { token: i10.AppSettingsService }, { token: i11.ErrorResponseManagerService }, { token: i0.EnvironmentInjector }, { token: i12.DynamicDialogConfig }, { token: i12.DynamicDialogRef }], target: i0.ɵɵFactoryTarget.Component }); }
1849
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: { cudComponent: "cudComponent", modalSize: "modalSize", showInfoButton: "showInfoButton", showDownloadButton: "showDownloadButton", showUploadButton: "showUploadButton", showNoteButton: "showNoteButton", showActionButton: "showActionButton", formName: "formName", id: "id", pagedRequest: "pagedRequest", configuration: "configuration", page: "page", key: "key", columns: "columns", isSearchButtonDisabled: "isSearchButtonDisabled", filteredColumns: "filteredColumns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSearchBox: "showSearchBox", showActionColumn: "showActionColumn", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", isGridDataPagedInApi: "isGridDataPagedInApi", header: "header", ShowFilterColumns: "ShowFilterColumns", showImportExportButton: "showImportExportButton", crudService: "crudService", searchFields: "searchFields", sortMode: "sortMode", filtersHtmlTemplate: "filtersHtmlTemplate", presentationSettings: "presentationSettings", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", searchOnInit: "searchOnInit", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showSearchField: "showSearchField", showCalenderView: "showCalenderView", calenderSchema: "calenderSchema", showCardView: "showCardView", showKanbanView: "showKanbanView", showKanbanViewOfWorkFlowEtat: "showKanbanViewOfWorkFlowEtat", page$: "page$", checkedByField: "checkedByField", selectAll: "selectAll", targetBusinessClass: "targetBusinessClass", descriminatorValue: "descriminatorValue", businessClass: "businessClass", entityInfo: "entityInfo" }, outputs: { onSave: "onSave", editRow: "editRow", deleteRow: "deleteRow", load: "load", buttonColumnClicked: "buttonColumnClicked", filtersHtmlTemplateChange: "filtersHtmlTemplateChange", selectedItemsChange: "selectedItemsChange", searchFieldsValueChanged: "searchFieldsValueChanged", calendarEventClick: "calendarEventClick", statusFilterChanged: "statusFilterChanged" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }, { propertyName: "tableHeaderCheckbox", first: true, predicate: ["tableHeaderCheckbox"], descendants: true }], ngImport: i0, template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n columnResizeMode=\"expand\" \r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" icon=\"pi pi-eraser\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-1'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\" \r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\"\r\n [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.actionDisplay != actionPlacement.Overflow\">\r\n <th style=\"overflow: inherit\" scope=\"col\">\r\n <ng-container *ngIf=\"!col.isButton && col.field != overflowColumnField ; else filterLessColumn\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n\r\n <!-- DATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDate [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDate.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDate.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DATETIME -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATETIME_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDateTime [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDateTime.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDateTime.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY SOCIETE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Societe-Input #currSocieteInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currSocieteInput.inputField)\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY OTHER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Other-Input #currOtherInput [inputField]=\"value\" [currency]=\"col.currencyOtherCode\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currOtherInput.inputField)\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- INTEGER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.INTEGER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Integer #integerInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(integerInput.inputField)\">\r\n </Tsi-Integer>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DECIMAL -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DECIMAL_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Decimal-Input #decimalInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(decimalInput.inputField)\">\r\n </Tsi-Decimal-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- RATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.RATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Rate-Input #rateInput [inputField]=\"value\" [isFraction]=\"col.isFraction\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(rateInput.inputField)\">\r\n </Tsi-Rate-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DEFAULT (text, boolean, or any unhandled type) -->\r\n <ng-container *ngSwitchDefault>\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #filterLessColumn></ng-template>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" \r\n style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n 'bg-white': col.isButton\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender \r\n [schema]=\"calenderSchema\" \r\n [eventsData]=\"page.items\" \r\n [crudService]=\"crudService\"\r\n [showInfoButton]=\"showInfoButton\"\r\n [showDownloadButton]=\"showDownloadButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" \r\n (eventClick)=\"handleCalendarEventClick($event)\">\r\n</tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\"[selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\"\r\n [selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i14.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i15.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i15.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i15.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i15.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i15.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i15.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i15.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i15.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i15.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i16.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i17.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i18.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i19.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i20.BadgeDirective, selector: "[pBadge]", inputs: ["badgeDisabled", "badgeSize", "size", "severity", "value", "badgeStyle", "badgeStyleClass"] }, { kind: "component", type: i21.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["numOfDecimal", "currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i22.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i23.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i24.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i25.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i26.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i27.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i28.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i29.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i30.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i31.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i32.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i33.TsiModalFooterComponent, selector: "Tsi-Modal-Footer", inputs: ["cancelDisabled", "saveDisabled", "cancelLabel", "saveLabel", "isConsult", "isDuplicate", "isOnlyCreate", "additionalButtonLabel", "additionalButtonIcon", "additionalButtonDisabled", "showAdditionalButton", "showSaveAndCloseButton", "mode"], outputs: ["onCancelClick", "onSaveClick", "onAdditionalButtonClick"] }, { kind: "component", type: i34.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i35.TsiSearchBoxComponent, selector: "tsi-search-box", inputs: ["searchFields", "businessClass", "descriminatorValue", "isRtlMode", "isSearchButtonDisabled", "entityInfo", "statusMetadata"], outputs: ["searchFieldsChange", "searchFieldsApplied", "keywordValueChanged", "statusFilterChanged", "workflowEtatFilterChanged", "comboBoxLabelChanged"] }, { kind: "component", type: i36.TsiCardListComponent, selector: "Tsi-card-list", inputs: ["cardBusinessClass", "header", "id", "page", "page$", "overflowActionsMenu", "selectKeyOnly", "key"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i37.TsiImageDisplayComponent, selector: "tsi-image-display", inputs: ["src", "alt", "width", "height", "isRounded", "headerTitles"] }, { kind: "component", type: i38.TsiKanbanComponent, selector: "Tsi-kanban", inputs: ["cardBusinessClass", "header", "id", "page$", "crudService", "overflowActionsMenu", "selectKeyOnly", "key", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i39.TsiCalenderComponent, selector: "tsi-calender", inputs: ["crudService", "schema", "eventsData", "showInfoButton", "showDownloadButton", "showUploadButton", "showNoteButton", "showActionButton"], outputs: ["eventClick", "dateRangeChange"] }, { kind: "component", type: i40.TsiKanbanWorkflowEtatComponent, selector: "Tsi-kanban-workflow-etat", inputs: ["cardBusinessClass", "header", "id", "page$", "descriminatorValue", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "directive", type: i41.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "component", type: i42.DisplayNestedPropComponent, selector: "Tsi-Display-Nested-Prop", inputs: ["id", "displayValue", "sourceUrl"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], animations: [
1840
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: { cudComponent: "cudComponent", modalSize: "modalSize", showInfoButton: "showInfoButton", showDownloadButton: "showDownloadButton", showUploadButton: "showUploadButton", showNoteButton: "showNoteButton", showActionButton: "showActionButton", sizingMode: "sizingMode", formName: "formName", id: "id", pagedRequest: "pagedRequest", configuration: "configuration", page: "page", key: "key", columns: "columns", isSearchButtonDisabled: "isSearchButtonDisabled", filteredColumns: "filteredColumns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSearchBox: "showSearchBox", showActionColumn: "showActionColumn", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", isGridDataPagedInApi: "isGridDataPagedInApi", header: "header", ShowFilterColumns: "ShowFilterColumns", showImportExportButton: "showImportExportButton", crudService: "crudService", searchFields: "searchFields", sortMode: "sortMode", filtersHtmlTemplate: "filtersHtmlTemplate", presentationSettings: "presentationSettings", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", searchOnInit: "searchOnInit", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showSearchField: "showSearchField", showCalenderView: "showCalenderView", calenderSchema: "calenderSchema", showCardView: "showCardView", showKanbanView: "showKanbanView", showKanbanViewOfWorkFlowEtat: "showKanbanViewOfWorkFlowEtat", page$: "page$", checkedByField: "checkedByField", selectAll: "selectAll", targetBusinessClass: "targetBusinessClass", descriminatorValue: "descriminatorValue", businessClass: "businessClass", entityInfo: "entityInfo" }, outputs: { onSave: "onSave", editRow: "editRow", deleteRow: "deleteRow", load: "load", buttonColumnClicked: "buttonColumnClicked", filtersHtmlTemplateChange: "filtersHtmlTemplateChange", selectedItemsChange: "selectedItemsChange", searchFieldsValueChanged: "searchFieldsValueChanged", calendarEventClick: "calendarEventClick", statusFilterChanged: "statusFilterChanged" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }, { propertyName: "tableHeaderCheckbox", first: true, predicate: ["tableHeaderCheckbox"], descendants: true }], ngImport: i0, template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"tableStyle\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n (onColResize)=\"onColResize($event)\"\r\n columnResizeMode=\"expand\"\r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" icon=\"pi pi-eraser\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-1'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [attr.data-field]=\"col.field\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"getHeaderColumnStyle(col)\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.actionDisplay != actionPlacement.Overflow\">\r\n <th style=\"overflow: inherit\" scope=\"col\">\r\n <ng-container *ngIf=\"!col.isButton && col.field != overflowColumnField ; else filterLessColumn\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n\r\n <!-- DATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDate [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDate.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDate.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DATETIME -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATETIME_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDateTime [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDateTime.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDateTime.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY SOCIETE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Societe-Input #currSocieteInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currSocieteInput.inputField)\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY OTHER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Other-Input #currOtherInput [inputField]=\"value\" [currency]=\"col.currencyOtherCode\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currOtherInput.inputField)\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- INTEGER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.INTEGER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Integer #integerInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(integerInput.inputField)\">\r\n </Tsi-Integer>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DECIMAL -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DECIMAL_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Decimal-Input #decimalInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(decimalInput.inputField)\">\r\n </Tsi-Decimal-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- RATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.RATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Rate-Input #rateInput [inputField]=\"value\" [isFraction]=\"col.isFraction\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(rateInput.inputField)\">\r\n </Tsi-Rate-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DEFAULT (text, boolean, or any unhandled type) -->\r\n <ng-container *ngSwitchDefault>\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #filterLessColumn></ng-template>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"getBodyColumnStyle(col)\" [class.tsi-col-wrap]=\"shouldWrapColumn(col)\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"getBodyColumnStyle(col)\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n 'bg-white': col.isButton\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender \r\n [schema]=\"calenderSchema\" \r\n [eventsData]=\"page.items\" \r\n [crudService]=\"crudService\"\r\n [showInfoButton]=\"showInfoButton\"\r\n [showDownloadButton]=\"showDownloadButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" \r\n (eventClick)=\"handleCalendarEventClick($event)\">\r\n</tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\"[selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\"\r\n [selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.tsi-col-wrap,.tsi-col-wrap>span:not(.status-badge),.tsi-col-wrap>div:not(.status-badge){white-space:normal!important;overflow-wrap:anywhere;word-break:break-word}td.tsi-col-wrap>span:not(.status-badge),td.tsi-col-wrap>div:not(.status-badge){display:inline-block}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i14.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i15.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i15.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i15.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i15.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i15.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i15.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i15.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i15.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i15.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i16.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i17.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i18.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i19.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i20.BadgeDirective, selector: "[pBadge]", inputs: ["badgeDisabled", "badgeSize", "size", "severity", "value", "badgeStyle", "badgeStyleClass"] }, { kind: "component", type: i21.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["numOfDecimal", "currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i22.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i23.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i24.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i25.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i26.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i27.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i28.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i29.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i30.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i31.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i32.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i33.TsiModalFooterComponent, selector: "Tsi-Modal-Footer", inputs: ["cancelDisabled", "saveDisabled", "cancelLabel", "saveLabel", "isConsult", "isDuplicate", "isOnlyCreate", "additionalButtonLabel", "additionalButtonIcon", "additionalButtonDisabled", "showAdditionalButton", "showSaveAndCloseButton", "mode"], outputs: ["onCancelClick", "onSaveClick", "onAdditionalButtonClick"] }, { kind: "component", type: i34.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i35.TsiSearchBoxComponent, selector: "tsi-search-box", inputs: ["searchFields", "businessClass", "descriminatorValue", "isRtlMode", "isSearchButtonDisabled", "entityInfo", "statusMetadata"], outputs: ["searchFieldsChange", "searchFieldsApplied", "keywordValueChanged", "statusFilterChanged", "workflowEtatFilterChanged", "comboBoxLabelChanged"] }, { kind: "component", type: i36.TsiCardListComponent, selector: "Tsi-card-list", inputs: ["cardBusinessClass", "header", "id", "page", "page$", "overflowActionsMenu", "selectKeyOnly", "key"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i37.TsiImageDisplayComponent, selector: "tsi-image-display", inputs: ["src", "alt", "width", "height", "isRounded", "headerTitles"] }, { kind: "component", type: i38.TsiKanbanComponent, selector: "Tsi-kanban", inputs: ["cardBusinessClass", "header", "id", "page$", "crudService", "overflowActionsMenu", "selectKeyOnly", "key", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i39.TsiCalenderComponent, selector: "tsi-calender", inputs: ["crudService", "schema", "eventsData", "showInfoButton", "showDownloadButton", "showUploadButton", "showNoteButton", "showActionButton"], outputs: ["eventClick", "dateRangeChange"] }, { kind: "component", type: i40.TsiKanbanWorkflowEtatComponent, selector: "Tsi-kanban-workflow-etat", inputs: ["cardBusinessClass", "header", "id", "page$", "descriminatorValue", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "directive", type: i41.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "component", type: i42.DisplayNestedPropComponent, selector: "Tsi-Display-Nested-Prop", inputs: ["id", "displayValue", "sourceUrl"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], animations: [
1850
1841
  trigger('slideInOut', [
1851
1842
  state('in', style({
1852
1843
  height: '*',
@@ -1878,7 +1869,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1878
1869
  })),
1879
1870
  transition('in <=> out', animate('600ms cubic-bezier(0.25, 0.8, 0.25, 1)'))
1880
1871
  ])
1881
- ], template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n columnResizeMode=\"expand\" \r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" icon=\"pi pi-eraser\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-1'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\" \r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\"\r\n [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.actionDisplay != actionPlacement.Overflow\">\r\n <th style=\"overflow: inherit\" scope=\"col\">\r\n <ng-container *ngIf=\"!col.isButton && col.field != overflowColumnField ; else filterLessColumn\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n\r\n <!-- DATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDate [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDate.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDate.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DATETIME -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATETIME_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDateTime [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDateTime.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDateTime.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY SOCIETE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Societe-Input #currSocieteInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currSocieteInput.inputField)\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY OTHER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Other-Input #currOtherInput [inputField]=\"value\" [currency]=\"col.currencyOtherCode\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currOtherInput.inputField)\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- INTEGER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.INTEGER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Integer #integerInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(integerInput.inputField)\">\r\n </Tsi-Integer>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DECIMAL -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DECIMAL_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Decimal-Input #decimalInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(decimalInput.inputField)\">\r\n </Tsi-Decimal-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- RATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.RATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Rate-Input #rateInput [inputField]=\"value\" [isFraction]=\"col.isFraction\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(rateInput.inputField)\">\r\n </Tsi-Rate-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DEFAULT (text, boolean, or any unhandled type) -->\r\n <ng-container *ngSwitchDefault>\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #filterLessColumn></ng-template>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" \r\n style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n 'bg-white': col.isButton\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender \r\n [schema]=\"calenderSchema\" \r\n [eventsData]=\"page.items\" \r\n [crudService]=\"crudService\"\r\n [showInfoButton]=\"showInfoButton\"\r\n [showDownloadButton]=\"showDownloadButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" \r\n (eventClick)=\"handleCalendarEventClick($event)\">\r\n</tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\"[selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\"\r\n [selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"] }]
1872
+ ], template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"tableStyle\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n (onColResize)=\"onColResize($event)\"\r\n columnResizeMode=\"expand\"\r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" icon=\"pi pi-eraser\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-1'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [attr.data-field]=\"col.field\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"getHeaderColumnStyle(col)\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.actionDisplay != actionPlacement.Overflow\">\r\n <th style=\"overflow: inherit\" scope=\"col\">\r\n <ng-container *ngIf=\"!col.isButton && col.field != overflowColumnField ; else filterLessColumn\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n\r\n <!-- DATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDate [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDate.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDate.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DATETIME -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DATETIME_DISPLAY\">\r\n <p-columnFilter [type]=\"'date'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.DATE_IS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-calendar #calDateTime [ngModel]=\"value\" appendTo=\"body\"\r\n (onSelect)=\"filter($event)\"\r\n (onBlur)=\"filter(calDateTime.value)\"\r\n (onClearClick)=\"filter(null)\"\r\n (keydown.enter)=\"filter(calDateTime.value)\">\r\n </p-calendar>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY SOCIETE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Societe-Input #currSocieteInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currSocieteInput.inputField)\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- CURRENCY OTHER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Currency-Other-Input #currOtherInput [inputField]=\"value\" [currency]=\"col.currencyOtherCode\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(currOtherInput.inputField)\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- INTEGER -->\r\n <ng-container *ngSwitchCase=\"displayTypes.INTEGER_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Integer #integerInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(integerInput.inputField)\">\r\n </Tsi-Integer>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DECIMAL -->\r\n <ng-container *ngSwitchCase=\"displayTypes.DECIMAL_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Decimal-Input #decimalInput [inputField]=\"value\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(decimalInput.inputField)\">\r\n </Tsi-Decimal-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- RATE -->\r\n <ng-container *ngSwitchCase=\"displayTypes.RATE_DISPLAY\">\r\n <p-columnFilter [type]=\"'numeric'\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <Tsi-Rate-Input #rateInput [inputField]=\"value\" [isFraction]=\"col.isFraction\"\r\n (inputFieldChange)=\"filter($event)\"\r\n (keydown.enter)=\"filter(rateInput.inputField)\">\r\n </Tsi-Rate-Input>\r\n </ng-template>\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n <!-- DEFAULT (text, boolean, or any unhandled type) -->\r\n <ng-container *ngSwitchDefault>\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\"\r\n [showButtons]=\"false\" [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #filterLessColumn></ng-template>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"getBodyColumnStyle(col)\" [class.tsi-col-wrap]=\"shouldWrapColumn(col)\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"getBodyColumnStyle(col)\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n 'bg-white': col.isButton\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayIconBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-icon (file-type logo) -->\r\n <ng-template #displayIconBlock>\r\n <ng-container *ngIf=\"col.type == displayTypes.ICON_DISPLAY; else displayTextEyeBlock\">\r\n <div *ngIf=\"item[col.field]\" class=\"flex align-items-center justify-content-center gap-2\">\r\n <i [class]=\"getFileTypeIconClass(item[col.field])\"\r\n [style.color]=\"getFileTypeIconColor(item[col.field])\"\r\n style=\"font-size: 1.25rem\"></i>\r\n <span>{{ item[col.field] }}</span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender \r\n [schema]=\"calenderSchema\" \r\n [eventsData]=\"page.items\" \r\n [crudService]=\"crudService\"\r\n [showInfoButton]=\"showInfoButton\"\r\n [showDownloadButton]=\"showDownloadButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" \r\n (eventClick)=\"handleCalendarEventClick($event)\">\r\n</tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\"[selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\"\r\n [selectKeyOnly]=\"selectKeyOnly\" [key]=\"key\" [overflowActionsMenu]=\"overflowActionsMenu\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.tsi-col-wrap,.tsi-col-wrap>span:not(.status-badge),.tsi-col-wrap>div:not(.status-badge){white-space:normal!important;overflow-wrap:anywhere;word-break:break-word}td.tsi-col-wrap>span:not(.status-badge),td.tsi-col-wrap>div:not(.status-badge){display:inline-block}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"] }]
1882
1873
  }], ctorParameters: () => [{ type: i1.StatusColorService }, { type: i2.FichierService }, { type: i3.HtmlTemplateGeneratorService }, { type: i4.DatePipe }, { type: i5.TsiNotificationService }, { type: i6.LocalizePipe }, { type: i7.LayoutHelperService }, { type: i8.LayoutService }, { type: i9.PrimeNGConfig }, { type: i10.AppSettingsService }, { type: i11.ErrorResponseManagerService }, { type: i0.EnvironmentInjector }, { type: i12.DynamicDialogConfig }, { type: i12.DynamicDialogRef }], propDecorators: { cudComponent: [{
1883
1874
  type: Input
1884
1875
  }], modalSize: [{
@@ -1893,6 +1884,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1893
1884
  type: Input
1894
1885
  }], showActionButton: [{
1895
1886
  type: Input
1887
+ }], sizingMode: [{
1888
+ type: Input
1896
1889
  }], onSave: [{
1897
1890
  type: Output
1898
1891
  }], dt: [{
@@ -2008,4 +2001,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2008
2001
  }], statusFilterChanged: [{
2009
2002
  type: Output
2010
2003
  }] } });
2011
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLWdlbmVyaWMtZ3JpZC90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktZ2VuZXJpYy1ncmlkL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRixPQUFPLEVBQWlCLFNBQVMsRUFBdUIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUF1RixNQUFNLGFBQWEsQ0FBQztBQUduSSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZMLE9BQU8sRUFBRSwrQkFBK0Is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QXlCO3NCQUFsQyxNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVudmlyb25tZW50SW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck1ldGFkYXRhLCBNZW51SXRlbSwgTWVudUl0ZW1Db21tYW5kRXZlbnQsIFByaW1lTkdDb25maWcsIFNvcnRNZXRhLCBUYWJsZVN0YXRlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgVGFibGUsIFRhYmxlSGVhZGVyQ2hlY2tib3gsIFRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVTZWxlY3RBbGxDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgcnRsTW9kZUtleXMgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvbG9jYWxzLmNvbnN0JztcclxuaW1wb3J0IHsgRGVmYXVsdFNvY2lldGVEZXZpc2UgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvdHNpLWNvbnN0cyc7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlQ29sb3JzLCBEaXNwbGF5VHlwZXMsIEZpbHRlck9wZXJhdG9yVHlwZSwgR3JpZFNlbGVjdGlvbk1vZGUsIEdyaWRTb3J0TW9kZSwgSW5wdXRUeXBlcywgTW9kYWxTaXplRW51bSwgTnVtZXJpY0Rpc3BsYXlUeXBlcywgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBvcGVuVHNpUG9wdXBUZXh0Vmlld2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zL21vZGFsLW9wZW4uZnVuY3Rpb24nO1xyXG5pbXBvcnQgeyBCdXR0b25DbGlja1Jlc3VsdCwgRGljdGlvbmFyeSwgR3JpZENvbHVtbiwgSUZpbHRlcmVkUmVxdWVzdCwgSUdyaWRDb25maWd1cmF0aW9uLCBJUGFnZSwgSVBhZ2VkUmVxdWVzdCwgSVBhZ2VkUmVzcG9uc2UsIElTb3J0QnlQcm9wcmV0eSwgSVNvcnRNZXRhIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IEZpY2hpZXIsIFByZXNlbnRhdGlvblNldHRpbmcsIFNlYXJjaEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRW50aXR5SW5mbyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9lbnRpdHktaW5mby9lbnRpdHktaW5mbyc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb24vYXBwLmxheW91dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS9jcnVkLWJhc2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpY2hpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmljaGllci9maWNoaWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2VuZXJhdG9yL2h0bWwtdGVtcGxhdGUtZ2VuZXJhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYXlvdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0L2xheW91dC1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi9lcnJvci1yZXNwb25zZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3NldHRpbmdzL2FwcC1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdHVzQ29sb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RhdHVzL3N0YXR1cy1jb2xvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXhwb3J0RXhjZWxIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9leHBvcnQtZXhjZWwuaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVySGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZmlsdGVyLWhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQgeyBBY3Rpb25QbGFjZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9hY3Rpb24tcGxhY2VtZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kcm9wZG93bi9kcm9wZG93bi1leHRlcm5hbC1zZWxlY3Rpb24tb3V0cHV0JztcclxuaW1wb3J0IHsgRXZlbnRTY2hlbWEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY29tbW9uL2V2ZW50LXNjaGVtYSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1HZW5lcmljLUdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dCcsIFtcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJyonLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSdcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnb3V0Jywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJzBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yMHB4KSdcclxuICAgICAgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdpbiA8PT4gb3V0JywgYW5pbWF0ZSgnNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSknKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpR2VuZXJpY0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvdmVyZmxvd0NvbHVtbkZpZWxkID0gJ292ZXJmbG93LWNvbHVtbi1maWVsZCc7XHJcblxyXG4gIEBJbnB1dCgpIGN1ZENvbXBvbmVudDogYW55O1xyXG4gIEBJbnB1dCgpIG1vZGFsU2l6ZTogYW55O1xyXG4gIEBJbnB1dCgpIHNob3dJbmZvQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0Rvd25sb2FkQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1VwbG9hZEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dOb3RlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBvblNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgZmlsdGVyTWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlO1xyXG4gIHRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbjtcclxuICBpc0FyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGFzeW5jIGV5ZUNsaWNrZWQodGV4dDogYW55KSB7XHJcblxyXG4gICAgbGV0IG1vZGFsU2l6ZSA9IE1vZGFsU2l6ZUVudW0uRXh0cmFMYXJnZTtcclxuICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICBkYXRhOiB0ZXh0LFxyXG4gICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IG1vZGFsU2l6ZS53aWR0aCxcclxuICAgICAgaGVpZ2h0OiBtb2RhbFNpemUuaGVpZ2h0XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX2RpYWxvZ1JlZiA9IGF3YWl0IG9wZW5Uc2lQb3B1cFRleHRWaWV3ZXJDb21wb25lbnQodGhpcy5faW5qZWN0b3IsIGNvbmYpO1xyXG5cclxuICAgIHRoaXMuX2RpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZSgodmFsPzogYW55KSA9PiB0aGlzLl9jbG9zZU1vZGFsKHZhbCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xvc2VNb2RhbCh2YWw/OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWwgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5fZGlhbG9nUmVmPy5kZXN0cm95KClcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaWFsb2dSZWY/LmRlc3Ryb3koKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdHJ1bmNhdGVTdHJpbmcodmFsdWU6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDUwKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxpbWl0ID8gdmFsdWUuc3Vic3RyKDAsIGxpbWl0KSArICcuLi4nIDogdmFsdWU7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgQFZpZXdDaGlsZChcImR0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZHQ6IFRhYmxlIHwgdW5kZWZpbmVkO1xyXG4gIEBWaWV3Q2hpbGQoXCJ0YWJsZUhlYWRlckNoZWNrYm94XCIpIHRhYmxlSGVhZGVyQ2hlY2tib3g6IFRhYmxlSGVhZGVyQ2hlY2tib3ggfCB1bmRlZmluZWRcclxuICBmaXJzdDogbnVtYmVyID0gMDtcclxuICByb3dzID0gMTtcclxuICBkaXNwbGF5VHlwZXMgPSBEaXNwbGF5VHlwZXM7XHJcbiAga2V5d29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHN1bW1hcmllczogRGljdGlvbmFyeTxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuICBpc1J0bE1vZGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIGlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICBtZXNzYWdlUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcclxuICBwcml2YXRlIGRyYWdFbnRlckNvdW50ID0gMDtcclxuICAvLyBwcml2YXRlIF9zZWFyY2hCb3hGaWx0ZXJzOiBBcnJheTxGaWx0ZXJCeVByb3ByZXR5PiA9IFtdO1xyXG4gIC8vIHByaXZhdGUgX2dyaWRIZWFkZXJGaWx0ZXJzOiBBcnJheTxGaWx0ZXJCeVByb3ByZXR5PiA9IFtdO1xyXG4gIHByaXZhdGUgX3NlYXJjaEZpZWxkczogQXJyYXk8U2VhcmNoRmllbGQ+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3NlYXJjaEJveEZpbHRlcnM6IEFycmF5PElGaWx0ZXJlZFJlcXVlc3Q+ID0gW107XHJcbiAgcHJpdmF0ZSBfZ3JpZEhlYWRlckZpbHRlcnM6IEFycmF5PElGaWx0ZXJlZFJlcXVlc3Q+ID0gW107XHJcbiAgcHJpdmF0ZSBfc29ydDogQXJyYXk8SVNvcnRCeVByb3ByZXR5PiA9IFtdO1xyXG4gIHNvcnRNZXRhczogU29ydE1ldGFbXSA9IFtdO1xyXG4gIHNlbGVjdGVkRnVsbEl0ZW1zPzogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHNlbGVjdGlvbjogYW55O1xyXG4gIG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZTtcclxuICBwcml2YXRlIF9kaWFsb2dSZWY/OiBEeW5hbWljRGlhbG9nUmVmO1xyXG4gIC8vanNvblN0cmluZ0xheW91dDogc3RyaW5nID0gJ3tcImZpcnN0XCI6MCxcInJvd3NcIjoxMCxcIm11bHRpU29ydE1ldGFcIjpbXSxcImNvbHVtbldpZHRoc1wiOlwiXCIsXCJ0YWJsZVdpZHRoXCI6XCIxMTg4cHhcIixcImNvbHVtbk9yZGVyXCI6W1wiXCJdfSc7XHJcbiAgbGF0ZXN0RmlsdGVycz86IElGaWx0ZXJlZFJlcXVlc3RbXTtcclxuICBpc0FkdmFuY2VkU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIHByaXZhdGUgX3BhZ2UgOiBJUGFnZTxhbnk+ID0ge1xyXG4gIC8vICAgaXRlbXM6IFtdLFxyXG4gIC8vICAgdG90YWxDb3VudDogMCxcclxuICAvLyAgIHN1bW1hcmllczogW10sXHJcbiAgLy8gICB0b3RhbFBhZ2VzOiAwLFxyXG4gIC8vICAgcGFnZU51bWJlcjogMSxcclxuICAvLyAgIHBhZ2VTaXplOiAxMCxcclxuICAvLyAgIGxvYWRpbmc6IGZhbHNlXHJcbiAgLy8gfTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIElucHV0c1xyXG4gIEBJbnB1dCgpIGZvcm1OYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHBhZ2VkUmVxdWVzdD86IElQYWdlZFJlcXVlc3Q7XHJcbiAgQElucHV0KCkgY29uZmlndXJhdGlvbj86IElHcmlkQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBfcGFnZTogSVBhZ2U8YW55PiA9IHtcclxuICAgIGl0ZW1zOiBbXSxcclxuICAgIHRvdGFsQ291bnQ6IDAsXHJcbiAgICBzdW1tYXJpZXM6IFtdLFxyXG4gICAgdG90YWxQYWdlczogMCxcclxuICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICBwYWdlU2l6ZTogMTAsXHJcbiAgICBsb2FkaW5nOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHBhZ2UodmFsdWU6IElQYWdlPGFueT4pIHtcclxuICAgIHRoaXMuX3BhZ2UgPSB2YWx1ZTtcclxuXHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlKCk6IElQYWdlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XHJcbiAgfVxyXG4gIC8vIChuZXdQYWdlOiBJUGFnZTxhbnk+KXtcclxuICAvLyAgIGlmKG5ld1BhZ2Upe1xyXG4gIC8vICAgICB0aGlzLl9wYWdlID0gbmV3UGFnZTtcclxuICAvLyAgICAgdGhpcy5fZXh0cmFjdFN1bW1hcmllcygpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICAvLyBnZXQgcGFnZSgpe1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX3BhZ2U7XHJcbiAgLy8gfVxyXG4gIEBJbnB1dCgpIGtleTogc3RyaW5nID0gJ3VpZCc7XHJcbiAgLyoqXHJcbiAgICpcclxuICAgKi9cclxuICBwcml2YXRlIF90ZW1wQ29sdW1uczogQXJyYXk8R3JpZENvbHVtbj4gPSBbXTtcclxuICB0ZW1wU2VhcmNoRmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4gPSBbXTtcclxuICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgY29sdW1ucyh2YWx1ZTogQXJyYXk8R3JpZENvbHVtbj4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICB0aGlzLl9jb2x1bW5zID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuaW5pdGlhbENvbHVtbnNQcm9jZXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxHcmlkQ29sdW1uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzU2VhcmNoQnV0dG9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgaXNTZWFyY2hCdXR0b25EaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNTZWFyY2hCdXR0b25EaXNhYmxlZCA9IHZhbHVlXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzU2VhcmNoQnV0dG9uRGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTZWFyY2hCdXR0b25EaXNhYmxlZFxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZmlsdGVyZWRDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBncmlkRGF0YT86IEFycmF5PGFueT47XHJcblxyXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgcGFyZW50OiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCb3g6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93QWN0aW9uQ29sdW1uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0hlYWRlckZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93RmlsdGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9pc0dyaWREYXRhUGFnZWRJbkFwaTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGlzR3JpZERhdGFQYWdlZEluQXBpKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0dyaWREYXRhUGFnZWRJbkFwaSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzR3JpZERhdGFQYWdlZEluQXBpKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzR3JpZERhdGFQYWdlZEluQXBpO1xyXG4gIH1cclxuICBASW5wdXQoKSBoZWFkZXI6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIFNob3dGaWx0ZXJDb2x1bW5zOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93SW1wb3J0RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuICBASW5wdXQoKSBzZXQgc2VhcmNoRmllbGRzKHZhbHVlOiBBcnJheTxTZWFyY2hGaWVsZD4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvL3Jlc2V0XHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgLy9pbml0IHVzaW5nIHZhbHVlXHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IEZpbHRlckhlbHBlci5pbml0U2VhcmNoRmllbGRzKHZhbHVlKTtcclxuICAgICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzZWFyY2hGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IEdyaWRTb3J0TW9kZSB8IGFueSA9IEdyaWRTb3J0TW9kZS5NdWx0aXBsZTtcclxuICBASW5wdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBwcmVzZW50YXRpb25TZXR0aW5ncz86IFByZXNlbnRhdGlvblNldHRpbmdcclxuXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkgPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lO1xyXG5cclxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YT8uaXNBZHZhbmNlZFNlYXJjaCAmJiB0aGlzLmNvbmZpZz8uZGF0YT8uc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWc/LmRhdGE/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9IHZhbHVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uTW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNldCBzZWFyY2hPbkluaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2VhcmNoT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KClcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hPbkluaXRcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNob3dHbG9iYWxTZWFyY2g6IGJvb2xlYW4gPSB0cnVlXHJcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IHRydWVcclxuICBASW5wdXQoKSBzaG93U2VhcmNoRmllbGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBfc2hvd0NhbGVuZGVyVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93Q2FsZW5kZXJWaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93Q2FsZW5kZXJWaWV3ID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fc2hvd0NhbGVuZGVyVmlldyA9PT0gZmFsc2UpIHtcclxuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5zdGFydClcclxuICAgICAgbGV0IGVuZCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uZW5kKVxyXG4gICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XHJcbiAgICAgICAgc3RhcnQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBlbmQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBjYWxlbmRlclNjaGVtYTogRXZlbnRTY2hlbWEgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBfc2hvd0NhcmRWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dDYXJkVmlldyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd0NhcmRWaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3Nob3dLYW5iYW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dLYW5iYW5WaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93S2FuYmFuVmlldyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICBASW5wdXQoKSBwYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuXHJcbiAgQElucHV0KCkgY2hlY2tlZEJ5RmllbGQ6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgX3NlbGVjdEFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzZWxlY3RBbGwodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3NlbGVjdEFsbCA9IHZhbHVlO1xyXG5cclxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50ID0gbmV3IEV2ZW50KCdzZWxlY3RBbGxDaGFuZ2UnKTtcclxuICAgIGNvbnN0IGV2ZW50OiBUYWJsZVNlbGVjdEFsbENoYW5nZUV2ZW50ID0ge1xyXG4gICAgICBjaGVja2VkOiB2YWx1ZSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogc3ludGhldGljRXZlbnQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub25TZWxlY3RBbGxDaGFuZ2UoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgdGFyZ2V0QnVzaW5lc3NDbGFzcz86IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgZGVzY3JpbWluYXRvclZhbHVlPzogc3RyaW5nXHJcblxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fc2VsZWN0QWxsOyB9XHJcblxyXG4gIHByaXZhdGUgX2VudGl0eUluZm8/OiBFbnRpdHlJbmZvO1xyXG4gIHByaXZhdGUgX2J1c2luZXNzQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGJ1c2luZXNzQ2xhc3ModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fYnVzaW5lc3NDbGFzcyA9IHZhbHVlO1xyXG4gICAgdGhpcy50cnlBcHBseUVudGl0eUluZm8oKTtcclxuICB9XHJcbiAgZ2V0IGJ1c2luZXNzQ2xhc3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGVudGl0eUluZm8odmFsdWU6IEVudGl0eUluZm8gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VudGl0eUluZm8gPSB2YWx1ZTtcclxuICAgIHRoaXMudHJ5QXBwbHlFbnRpdHlJbmZvKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGVudGl0eUluZm8oKTogRW50aXR5SW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5SW5mbztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIGVkaXRSb3c6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZVJvdzogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgbG9hZDogRXZlbnRFbWl0dGVyPHsgcmVxdWVzdDogSVBhZ2VkUmVxdWVzdCwgaXNGb3JDYWxlbmRhcjogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyByZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0LCBpc0ZvckNhbGVuZGFyOiBib29sZWFuIH0+KCk7XHJcbiAgQE91dHB1dCgpIGJ1dHRvbkNvbHVtbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrUmVzdWx0PigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XHJcbiAgQE91dHB1dCgpIHNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFycmF5PFNlYXJjaEZpZWxkPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFNlYXJjaEZpZWxkPj4oKTtcclxuICBAT3V0cHV0KCkgY2FsZW5kYXJFdmVudENsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzdGF0dXNGaWx0ZXJDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIC8vIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAvLyAgIGlmKGNoYW5nZXNbJ3BhZ2UnXSl7XHJcbiAgLy8gICAgIHRoaXMuX2V4dHJhY3RTdW1tYXJpZXMoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyXCI7XHJcbiAgcHJvdGVjdGVkIGZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcblxyXG4gIGZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICBmaWx0ZXJNb2RlVG9vbHRpcCA9IFwibWVudV9tb2RlXCI7XHJcbiAgY2hhbmdlSGVhZGVyRmlsdGVyc01vZGU6IHN0cmluZyA9IFwibWVudVwiO1xyXG5cclxuICBpdGVtcz86IGFueVtdO1xyXG4gIF9zZWFyY2hPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBpbmxpbmVBY3Rpb25Db2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICBvdmVyZmxvd0FjdGlvbkNvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gIGhhc092ZXJmbG93QWN0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG92ZXJmbG93QWN0aW9uc01lbnU6IE1lbnVJdGVtW10gPSBbXTtcclxuICBjdXJyZW50QWN0aW9uUm93OiBhbnk7XHJcbiAgYWN0aW9uUGxhY2VtZW50ID0gQWN0aW9uUGxhY2VtZW50O1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ29sdW1ucygpOiBHcmlkQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRDb2x1bW5zKHZhbHVlOiBHcmlkQ29sdW1uW10pIHtcclxuICAgIGxldCBzYWZlVmFsdWUgPSB2YWx1ZVxyXG4gICAgICA/IFsuLi52YWx1ZS5maWx0ZXIoYyA9PiBjLmZpZWxkICE9IHRoaXMub3ZlcmZsb3dDb2x1bW5GaWVsZCldXHJcbiAgICAgIDogW107XHJcblxyXG4gICAgdGhpcy5pbmxpbmVBY3Rpb25Db2x1bW5zID0gc2FmZVZhbHVlLmZpbHRlcihcclxuICAgICAgYyA9PiBjLmlzQnV0dG9uID09PSB0cnVlICYmIGMuYWN0aW9uRGlzcGxheSA9PT0gQWN0aW9uUGxhY2VtZW50LklubGluZVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm92ZXJmbG93QWN0aW9uQ29sdW1ucyA9IHNhZmVWYWx1ZS5maWx0ZXIoXHJcbiAgICAgIGMgPT4gYy5pc0J1dHRvbiA9PT0gdHJ1ZSAmJiBjLmFjdGlvbkRpc3BsYXkgIT09IEFjdGlvblBsYWNlbWVudC5JbmxpbmVcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5oYXNPdmVyZmxvd0FjdGlvbnMgPSB0aGlzLm92ZXJmbG93QWN0aW9uQ29sdW1ucy5sZW5ndGggPiAxO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc092ZXJmbG93QWN0aW9ucykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5pbmxpbmVBY3Rpb25Db2x1bW5zLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQsXHJcbiAgICAgICAgICBpc0Zyb3plbjogdHJ1ZSxcclxuICAgICAgICAgIGJ1dHRvbkljb246ICdwaSBwaS1lbGxpcHNpcy12JyxcclxuICAgICAgICAgIHN0eWxlQ2xhc3M6ICdwLWJ1dHRvbi10ZXh0IGhvdmVyOnNoYWRvdy04JyxcclxuICAgICAgICAgIGhlYWRlcjogJ01vcmUgYWN0aW9ucycsXHJcbiAgICAgICAgICB0cmFuc2xhdGVkSGVhZGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnTW9yZSBhY3Rpb25zJyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi5zYWZlVmFsdWUuZmlsdGVyKGMgPT4gIShjLmlzQnV0dG9uID09PSB0cnVlICYmIGMuYWN0aW9uRGlzcGxheSA9PT0gQWN0aW9uUGxhY2VtZW50LklubGluZSkpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICB0aGlzLm92ZXJmbG93QWN0aW9uc01lbnUgPSB0aGlzLmdldE92ZXJmbG93TWVudU1vZGVsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBzYWZlVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9jZXNzU3RpY2t5Q29sdW1ucyh0aGlzLl9zZWxlY3RlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3ZlcmZsb3dNZW51TW9kZWwoKTogTWVudUl0ZW1bXSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzT3ZlcmZsb3dBY3Rpb25zKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbkNvbHVtbnMubWFwKGNvbCA9PiAoe1xyXG4gICAgICBpZDogY29sLmZpZWxkLFxyXG4gICAgICBsYWJlbDogY29sLmhlYWRlcixcclxuICAgICAgaWNvbkNsYXNzOiBjb2wuYnV0dG9uSWNvbixcclxuICAgICAgc3R5bGVDbGFzczogY29sLnN0eWxlQ2xhc3MsXHJcbiAgICAgIGljb25TdHlsZUNsYXNzOiBjb2wuaWNvblN0eWxlQ2xhc3MsXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBvdmVyZmxvd0NvbHVtbkNsaWNrZWQobWVudTogTWVudSwgZXZlbnQ6IEV2ZW50LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50QWN0aW9uUm93ID0gcm93O1xyXG4gICAgbWVudS50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25PdmVyZmxvd0FjdGlvbkNsaWNrZWQocm93OiBhbnksIG1lbnVJdGVtOiBNZW51SXRlbSkge1xyXG4gICAgaWYgKCFyb3cgfHwgIW1lbnVJdGVtIHx8ICFtZW51SXRlbS5pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idXR0b25DbGlja2VkKHJvdywgbWVudUl0ZW0uaWQpXHJcbiAgfVxyXG5cclxuICBpbXBvcnRhbnRDb2x1bW5zID0gWydjb25zdWx0JywgJ2VkaXQnLCAnZGVsZXRlJywgJ3VwbG9hZCcsICdkb3dubG9hZCcsICdpbmZvJywgJ25vdGVzJywgJ2R1cGxpY2F0ZScsICdmb3JtJywgJ2FjdGlvbkVSUCddO1xyXG4gIGlzRmlyc3RMb2FkT2ZQYWdlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSB0aXRsZUNhY2hlID0gbmV3IE1hcDxhbnksIHN0cmluZ1tdPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3N0YXR1c0NvbG9yU2VydmljZTogU3RhdHVzQ29sb3JTZXJ2aWNlLFxyXG4gICAgcHVibGljIF9maWNoaWVyU2VydmljZTogRmljaGllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlOiBIdG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9jYWxpemU6IExvY2FsaXplUGlwZSxcclxuICAgIHByaXZhdGUgbGF5b3V0SGVscGVyU2VydmljZTogTGF5b3V0SGVscGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wcmltZW5nQ29uZmlnOiBQcmltZU5HQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXR0aW5nc1NlcnZpY2U6IEFwcFNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZTogRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgICBwdWJsaWMgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIHByaXZhdGUgX3JlZj86IER5bmFtaWNEaWFsb2dSZWYsXHJcblxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuZm9ybU5hbWV9LWZpbHRlck1vZGVgKVxyXG4gICAgaWYgKGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlICE9IG51bGxcclxuICAgICAgJiYgZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlICE9IFwiXCIpIHtcclxuICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZVxyXG4gICAgICB0aGlzLnNob3dIZWFkZXJGaWx0ZXJzID0gdHJ1ZVxyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlci1zbGFzaFwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcImhpZGVfZmlsdGVyXCI7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGVUb29sdGlwID09PSBcIm1lbnVfbW9kZVwiKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktY2hlY2tcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJyb3dfbW9kZVwiO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcIm1lbnVcIlxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcInJvd1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZUljb24gPSBcInBpIHBpLWVsbGlwc2lzLXZcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJtZW51X21vZGVcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSBmYWxzZVxyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlclwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgbGV0IGxhbmd1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHJ0bE1vZGVLZXlzLnJ0bE1vZGVFbmFibGVkKTtcclxuXHJcbiAgICBpZiAobGFuZ3VlICYmIEpTT04ucGFyc2UobGFuZ3VlKSkge1xyXG4gICAgICB0aGlzLmlzQXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oY29sdW1uLmhlYWRlciEhKSlcclxuXHJcbiAgICB0aGlzLl90ZW1wQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuXHJcbiAgICB0aGlzLnRlbXBTZWFyY2hGaWVsZHMgPSB0aGlzLl9zZWFyY2hGaWVsZHMgPz8gW107XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PlxyXG4gICAgICAhdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5maWVsZCkpO1xyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMgfHwgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbHVtbi5vcmRlciA9IGluZGV4O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pc1J0bE1vZGVFbmFibGVkKClcclxuICAgIHRoaXMudXBkYXRlUHJpbWVOR1RhYmxlRmlsdGVycygpXHJcbiAgICB0aGlzLl9ydGxNb2RlU3Vic2NyaWJlKClcclxuXHJcbiAgICB0aGlzLmV4dHJhY3REaWFsb2dDb25maWdEYXRhKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdHVzTWV0YWRhdGE/OiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlO1xyXG4gIHN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeT86IFN0YXR1c01ldGFkYXRhUmVzcG9uc2U7XHJcblxyXG4gIGdldFN0YXR1c09wdGlvbih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNNZXRhZGF0YT8ub3B0aW9ucy5maW5kKG8gPT4gby5zdGF0dXNWYWx1ZSA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShzdGF0dXNWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3Rvcnk/Lm9wdGlvbnMuZmluZChvID0+IG8udHJhbnNsYXRlZExhYmVsID09PSBzdGF0dXNWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RhdHVzQ29sb3JzRGV0YWlsc0J5QnVzaW5lc3NDbGFzcygpIHtcclxuXHJcbiAgICBpZiAodGhpcy50YXJnZXRCdXNpbmVzc0NsYXNzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnRhcmdldEJ1c2luZXNzQ2xhc3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzQnlCdXNpbmVzc0NsYXNzTmFtZSh0aGlzLnRhcmdldEJ1c2luZXNzQ2xhc3MpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgPSByZXNwb25zZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBzdGF0dXMgY29sb3JzJywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRTdGF0dXNDb2xvcnMoKTogdm9pZCB7XHJcblxyXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5idXNpbmVzc0NsYXNzITtcclxuICAgIGNvbnN0IHN0YXR1c0VudW1OYW1lID0gdGhpcy5lbnRpdHlJbmZvPy5zdGF0dXNFbnVtTmFtZSE7XHJcblxyXG4gICAgaWYgKCFjbGFzc05hbWUgfHwgIXN0YXR1c0VudW1OYW1lKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTWlzc2luZyBjbGFzc05hbWUgb3Igc3RhdHVzRW51bU5hbWUgZm9yIGVudGl0eUluZm8uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fc3RhdHVzQ29sb3JTZXJ2aWNlLmdldFN0YXR1c0NvbG9yRGV0YWlscyhjbGFzc05hbWUsIHN0YXR1c0VudW1OYW1lKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzTWV0YWRhdGEgPSByZXNwb25zZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBzdGF0dXMgY29sb3JzJywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1cyBjb2xvcnM6JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxpZ2h0ZW5Db2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgcGVyY2VudDogbnVtYmVyID0gNzApOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnJztcclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuXHJcbiAgICBsZXQgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGxldCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgbGV0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XHJcblxyXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyICsgKDI1NSAtIHIpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgZyA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihnICsgKDI1NSAtIGcpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgYiA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihiICsgKDI1NSAtIGIpICogcGVyY2VudCAvIDEwMCkpO1xyXG5cclxuICAgIGNvbnN0IG5ld0hleCA9XHJcbiAgICAgICcjJyArXHJcbiAgICAgIFtyLCBnLCBiXVxyXG4gICAgICAgIC5tYXAoeCA9PiB4LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKVxyXG4gICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3SGV4O1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVhZGFibGVUZXh0Q29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnYmxhY2snO1xyXG5cclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gMjMwID8gJ2JsYWNrJyA6IGAjJHtoZXh9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlFbnRpdHlJbmZvKGVudGl0eUluZm86IEVudGl0eUluZm8pIHtcclxuICAgIGlmICghZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHN0YXR1c0NvbHVtbk5hbWUgPSBlbnRpdHlJbmZvLnN0YXR1c0NvbHVtbk5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBzdGF0dXNDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChcclxuICAgICAgYyA9PiBjLmZpZWxkLnRvTG93ZXJDYXNlKCkgPT09IHN0YXR1c0NvbHVtbk5hbWVcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFzdGF0dXNDb2x1bW4pIHtcclxuICAgICAgY29uc29sZS53YXJuKGBTdGF0dXMgY29sdW1uIFwiJHtlbnRpdHlJbmZvLnN0YXR1c0NvbHVtbk5hbWV9XCIgbm90IGZvdW5kLmApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdHVzQ29sdW1uLmlzU3RhdHVzQ29sdW1uID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBidXR0b25Db2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaXNCdXR0b24pO1xyXG4gICAgY29uc3Qgb3RoZXJDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+ICFjLmlzQnV0dG9uICYmIGMgIT09IHN0YXR1c0NvbHVtbik7XHJcblxyXG4gICAgY29uc3QgbWF4QnV0dG9uT3JkZXIgPVxyXG4gICAgICBidXR0b25Db2x1bW5zLnJlZHVjZSgobSwgYykgPT4gTWF0aC5tYXgobSwgYy5vcmRlciA/PyAwKSwgMCkgfHwgMDtcclxuXHJcbiAgICBzdGF0dXNDb2x1bW4ub3JkZXIgPSBtYXhCdXR0b25PcmRlciArIDE7XHJcblxyXG4gICAgY29uc3QgcmVvcmRlcmVkID0gW1xyXG4gICAgICAuLi5idXR0b25Db2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMCkpLFxyXG4gICAgICBzdGF0dXNDb2x1bW4sXHJcbiAgICAgIC4uLm90aGVyQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKSxcclxuICAgIF07XHJcblxyXG4gICAgcmVvcmRlcmVkLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IChjb2wub3JkZXIgPSBpbmRleCkpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gWy4uLnJlb3JkZXJlZF07XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0U3RhdGUoKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSB7fTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZHQpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZHQucmVzaXphYmxlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmR0LnNhdmVDb2x1bW5XaWR0aHMoc3RhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZHQuc2F2ZUNvbHVtbk9yZGVyKHN0YXRlKTtcclxuXHJcbiAgICByZXR1cm4gc3RhdGVcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXN0b3JlU3RhdGUoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgdGhpcy5kdC5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcclxuICAgICAgdGhpcy5kdC50YWJsZVdpZHRoU3RhdGUgPSBzdGF0ZS50YWJsZVdpZHRoO1xyXG5cclxuICAgICAgbGV0IGNvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXI7XHJcblxyXG4gICAgICBpZiAoY29sdW1uT3JkZXIpIHtcclxuICAgICAgICBsZXQgcmVvcmRlcmVkQ29sdW1ucyA9IHRoaXMuZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5zb3J0Q29sdW1ucygpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ZWRDb2x1bW5zQ2hhbmdlKG5ld1ZhbHVlOiBHcmlkQ29sdW1uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gbmV3VmFsdWU7XHJcbiAgICB0aGlzLnNvcnRDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBzb3J0Q29sdW1ucygpIHtcclxuICAgIGNvbnN0IGlzSW1wb3J0YW50ID0gKGM6IEdyaWRDb2x1bW4pID0+XHJcbiAgICAgIHRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmNsdWRlcyhjLmZpZWxkKTtcclxuXHJcbiAgICBjb25zdCBzb3J0V2l0aFByaW9yaXR5ID0gKGE6IEdyaWRDb2x1bW4sIGI6IEdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgYUltcCA9IGlzSW1wb3J0YW50KGEpO1xyXG4gICAgICBjb25zdCBiSW1wID0gaXNJbXBvcnRhbnQoYik7XHJcblxyXG4gICAgICBpZiAoYUltcCAmJiAhYkltcCkgcmV0dXJuIC0xO1xyXG4gICAgICBpZiAoIWFJbXAgJiYgYkltcCkgcmV0dXJuIDE7XHJcblxyXG4gICAgICBpZiAoYUltcCAmJiBiSW1wKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIHRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmRleE9mKGEuZmllbGQpIC1cclxuICAgICAgICAgIHRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmRleE9mKGIuZmllbGQpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbkNvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzQnV0dG9uKTtcclxuICAgIGNvbnN0IG90aGVyQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLmlzQnV0dG9uKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IFtcclxuICAgICAgLi4uYnV0dG9uQ29sdW1ucy5zb3J0KHNvcnRXaXRoUHJpb3JpdHkpLFxyXG4gICAgICAuLi5vdGhlckNvbHVtbnMsXHJcbiAgICBdO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXI6IHN0cmluZ1tdKTogYW55W10ge1xyXG5cclxuICAgIGNvbnN0IGltcG9ydGFudCA9IHRoaXMuaW1wb3J0YW50Q29sdW1uc1xyXG4gICAgICAuZmlsdGVyKGtleSA9PiBjb2x1bW5PcmRlci5pbmNsdWRlcyhrZXkpKVxyXG4gICAgICAubWFwKGtleSA9PiB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpKVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgIGNvbnN0IG90aGVycyA9IGNvbHVtbk9yZGVyXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+ICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoa2V5KSlcclxuICAgICAgLm1hcChrZXkgPT4gdGhpcy5maW5kQ29sdW1uQnlLZXkoa2V5KSlcclxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICByZXR1cm4gWy4uLmltcG9ydGFudCwgLi4ub3RoZXJzXTtcclxuICB9XHJcblxyXG4gIGZpbmRDb2x1bW5CeUtleShrZXk6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX3RlbXBDb2x1bW5zKSB7XHJcbiAgICAgIGZvciAobGV0IGNvbCBvZiB0aGlzLl90ZW1wQ29sdW1ucykge1xyXG4gICAgICAgIGlmIChjb2wuaGVhZGVyID09PSBrZXkgfHwgY29sLmZpZWxkID09PSBrZXkpIHJldHVybiBjb2w7XHJcbiAgICAgICAgZWxzZSBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRDb2x1bW5zKGNvbmZpZ3VyYXRpb246IHN0cmluZykge1xyXG4gICAgbGV0IHN0YXRlOiBUYWJsZVN0YXRlID0gSlNPTi5wYXJzZShjb25maWd1cmF0aW9uKVxyXG4gICAgaWYgKHRoaXMuZHQpIHtcclxuXHJcbiAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5fdGVtcENvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5zb3J0Q29sdW1ucygpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5vdEluU3BlY2lmaWVkQ29sdW1uKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluY2x1ZGVzKGZpZWxkKVxyXG4gICAgICAmJiBmaWVsZCAhPT0gdGhpcy5vdmVyZmxvd0NvbHVtbkZpZWxkO1xyXG4gIH1cclxuXHJcbiAgaXNPdmVyZmxvd0NvbHVtbihmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmllbGQgPT09IHRoaXMub3ZlcmZsb3dDb2x1bW5GaWVsZDtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NTdGlja3lDb2x1bW5zKGNvbHVtbnM6IEdyaWRDb2x1bW5bXSkge1xyXG4gICAgbGV0IGluZGV4ID0gMDtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2wuaXNGcm96ZW4pIHtcclxuICAgICAgICBjb2wubmdTdHlsZSA9IHRoaXMuZ2V0VGhlU3R5bGUoY29sLCBpbmRleClcclxuICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA9IHsgLi4uY29sLm5nU3R5bGUsIHpJbmRleDogMTAwMCB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2JveFN0eWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNSdGxNb2RlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcmlnaHQ6IGAwcHhgLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxlZnQ6IGAwcHhgLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUaGVTdHlsZShjb2x1bW46IEdyaWRDb2x1bW4sIGNvbHVtbk9yZGVyOiBudW1iZXIpOiBhbnkge1xyXG5cclxuICAgIGNvbnN0IFNUQVJUID0gOTtcclxuICAgIGNvbnN0IEZJUlNUX0dBUCA9IDM3O1xyXG4gICAgY29uc3QgR0FQID0gNDY7XHJcblxyXG4gICAgaWYgKCFjb2x1bW4uaXNGcm96ZW4pIHtcclxuICAgICAgcmV0dXJuIHt9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbHVtbi5pc0Zyb3plbiA9PSB0cnVlKSB7XHJcblxyXG4gICAgICBsZXQgZWxlbWVudFBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gdGhpcy5tdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlKSB7XHJcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gMzAgKyBlbGVtZW50UG9zaXRpb24gKyAoY29sdW1uT3JkZXIgPz8gMCkgKiA2MDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoY29sdW1uT3JkZXIgPT09IDApIHtcclxuICAgICAgICAgIGVsZW1lbnRQb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk9yZGVyID09PSAxKSB7XHJcbiAgICAgICAgICBlbGVtZW50UG9zaXRpb24gPSBTVEFSVCArIEZJUlNUX0dBUDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gU1RBUlQgKyBGSVJTVF9HQVAgKyAoY29sdW1uT3JkZXIgLSAxKSAqIEdBUDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuaXNSdGxNb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHJpZ2h0OiBgJHtlbGVtZW50UG9zaXRpb259cHhgLFxyXG4gICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnLFxyXG4gICAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBsZWZ0OiBgJHtlbGVtZW50UG9zaXRpb259cHhgLFxyXG4gICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnLFxyXG4gICAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzUnRsTW9kZUVuYWJsZWQoKSB7XHJcbiAgICBpZiAodGhpcy5fbGF5b3V0U2VydmljZS5pc1J0bE1vZGVFbmFibGVkKCkpIHtcclxuICAgICAgdGhpcy5pc1J0bE1vZGUgPSB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVByaW1lTkdUYWJsZUZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLl9wcmltZW5nQ29uZmlnLnNldFRyYW5zbGF0aW9uKHtcclxuICAgICAgc3RhcnRzV2l0aDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19zdGFydHNXaXRoJyksXHJcbiAgICAgIGNvbnRhaW5zOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2NvbnRhaW5zJyksXHJcbiAgICAgIG5vdENvbnRhaW5zOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX25vdENvbnRhaW5zJyksXHJcbiAgICAgIGVuZHNXaXRoOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VuZHNXaXRoJyksXHJcbiAgICAgIGVxdWFsczogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19lcXVhbHMnKSxcclxuICAgICAgbm90RXF1YWxzOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX25vdEVxdWFscycpLFxyXG4gICAgICBub0ZpbHRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19ub0ZpbHRlcicpLFxyXG4gICAgICBsdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19sdCcpLFxyXG4gICAgICBsdGU6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbHRlJyksXHJcbiAgICAgIGd0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2d0JyksXHJcbiAgICAgIGd0ZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19ndGUnKSxcclxuICAgICAgaXM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfaXMnKSxcclxuICAgICAgaXNOb3Q6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfaXNOb3QnKSxcclxuICAgICAgYmVmb3JlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2JlZm9yZScpLFxyXG4gICAgICBhZnRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hZnRlcicpLFxyXG4gICAgICBkYXRlSXM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZGF0ZUlzJyksXHJcbiAgICAgIGRhdGVJc05vdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlSXNOb3QnKSxcclxuICAgICAgZGF0ZUJlZm9yZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlQmVmb3JlJyksXHJcbiAgICAgIGRhdGVBZnRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlQWZ0ZXInKSxcclxuICAgICAgY2xlYXI6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfY2xlYXInKSxcclxuICAgICAgYXBwbHk6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfYXBwbHknKSxcclxuICAgICAgbWF0Y2hBbGw6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbWF0Y2hBbGwnKSxcclxuICAgICAgbWF0Y2hBbnk6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbWF0Y2hBbnknKSxcclxuICAgICAgYWRkUnVsZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hZGRSdWxlJyksXHJcbiAgICAgIHJlbW92ZVJ1bGU6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfcmVtb3ZlUnVsZScpLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfYWNjZXB0JyksXHJcbiAgICAgIHJlamVjdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19yZWplY3QnKSxcclxuICAgICAgY2hvb3NlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2Nob29zZScpLFxyXG4gICAgICB1cGxvYWQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfdXBsb2FkJyksXHJcbiAgICAgIGNhbmNlbDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19jYW5jZWwnKSxcclxuICAgICAgdG9kYXk6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfdG9kYXknKSxcclxuICAgICAgd2Vla0hlYWRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc193ZWVrSGVhZGVyJyksXHJcbiAgICAgIGRhdGVGb3JtYXQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZGF0ZUZvcm1hdCcpLFxyXG4gICAgICB3ZWFrOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3dlYWsnKSxcclxuICAgICAgbWVkaXVtOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX21lZGl1bScpLFxyXG4gICAgICBzdHJvbmc6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfc3Ryb25nJyksXHJcbiAgICAgIHBhc3N3b3JkUHJvbXB0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3Bhc3N3b3JkUHJvbXB0JyksXHJcbiAgICAgIGVtcHR5TWVzc2FnZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19lbXB0eU1lc3NhZ2UnKSxcclxuICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VtcHR5RmlsdGVyTWVzc2FnZScpLFxyXG4gICAgICBmaXJzdERheU9mV2VlazogMSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcnRsTW9kZVN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMuX2xheW91dFNlcnZpY2UuZW5hYmxlUnRsTW9kZVN1YmplY3QkLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmlzUnRsTW9kZSA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMoc2VhcmNoRmllbGRWYWx1ZXM6IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQuZW1pdChzZWFyY2hGaWVsZFZhbHVlcylcclxuICB9XHJcblxyXG4gIGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID8gdGhpcy5wYWdlLnBhZ2VOdW1iZXIgPT09ICh0aGlzLnBhZ2UudG90YWxDb3VudCAtIHRoaXMucGFnZS5wYWdlU2l6ZSkgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID8gdGhpcy5wYWdlLnBhZ2VOdW1iZXIgPT09IDAgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZWRpdChpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZWRpdFJvdy5lbWl0KGl0ZW1bdGhpcy5rZXldKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZShpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZGVsZXRlUm93LmVtaXQoaXRlbVt0aGlzLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgbGF6eUxvYWQoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCkge1xyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0ID09IG51bGwgJiYgdGhpcy5wYWdlZFJlcXVlc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0ID0ge307XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2VkUmVxdWVzdC5za2lwQ291bnQgPSBldmVudC5maXJzdCA9PSAxID8gMCA6IGV2ZW50LmZpcnN0O1xyXG4gICAgdGhpcy5wYWdlZFJlcXVlc3QubWF4UmVzdWx0Q291bnQgPSBldmVudC5yb3dzO1xyXG4gICAgaWYgKHRoaXMuZm9ybU5hbWUgJiYgdGhpcy5pc0ZpcnN0TG9hZE9mUGFnZSkge1xyXG4gICAgICB0aGlzLmlzRmlyc3RMb2FkT2ZQYWdlID0gZmFsc2VcclxuICAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmZvcm1OYW1lKTtcclxuICAgICAgaWYgKHN0b3JlZFZhbHVlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAgICAgICBjb25zdCBjb2x1bW5PcmRlcjogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5PcmRlcjtcclxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aHM6IHN0cmluZ1tdID0gc2Vzc2lvbkRhdGEuY29sdW1uV2lkdGhzLnNwbGl0KCcsJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTZWxlY3RlZENvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gICAgICAgIGNvbHVtbk9yZGVyLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBjb2x1bW5XaWR0aHNbaW5kZXhdO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uSW5kZXggPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uSW5kZXggIT09IC0xKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XS53aWR0aCA9IGNvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zLnB1c2godGhpcy5zZWxlY3RlZENvbHVtbnNbZXhpc3RpbmdDb2x1bW5JbmRleF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHVwZGF0ZWRTZWxlY3RlZENvbHVtbnM7XHJcblxyXG4gICAgICAgIGlmICgoc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YSAmJiBzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHx8IChzZXNzaW9uRGF0YS5maWx0ZXJzKSkge1xyXG4gICAgICAgICAgaWYgKHNlc3Npb25EYXRhLm11bHRpU29ydE1ldGEgJiYgc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25EYXRhLm11bHRpU29ydE1ldGEuZm9yRWFjaCgobWV0YTogeyBmaWVsZDogYW55OyBvcmRlcjogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHNvcnRNZXRhOiBTb3J0TWV0YSA9IHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiBtZXRhLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgb3JkZXI6IG1ldGEub3JkZXJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZXZlbnQuc29ydEZpZWxkID0gbWV0YS5maWVsZDtcclxuICAgICAgICAgICAgICBldmVudC5zb3J0T3JkZXIgPSBtZXRhLm9yZGVyO1xyXG4gICAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGE/LnB1c2goc29ydE1ldGEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzZXNzaW9uRGF0YS5maWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJzOiB7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB9ID0ge307XHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHNlc3Npb25EYXRhLmZpbHRlcnMpLmZvckVhY2goKFtmaWVsZE5hbWUsIGZpbHRlck1ldGFkYXRhXSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlck1ldGFkYXRhVmFsdWUgPSBmaWx0ZXJNZXRhZGF0YSBhcyBbRmlsdGVyTWV0YWRhdGFdO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyTWV0YWRhdGFWYWx1ZVswXSAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZmlsdGVyc1tmaWVsZE5hbWVdID0gZmlsdGVyTWV0YWRhdGFWYWx1ZVswXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBmaWx0ZXJzIHRvIHRoZSBldmVudFxyXG4gICAgICAgICAgICBldmVudC5maWx0ZXJzID0gZmlsdGVycztcclxuICAgICAgICAgICAgLy8gZXZlbnQuZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKHNlc3Npb25EYXRhLmZpbHRlcnMpLnJlZHVjZSgoZmlsdGVyczogeyBbczogc3RyaW5nXTogRmlsdGVyTWV0YWRhdGEgfSwgW2ZpZWxkTmFtZSwgZmlsdGVyTWV0YWRhdGEgXSApID0+IHtcclxuICAgICAgICAgICAgLy8gICB2YXIgZmlsdGVyTWV0YWRhdGFWYWx1ZSA9IGZpbHRlck1ldGFkYXRhIGFzIEZpbHRlck1ldGFkYXRhO1xyXG4gICAgICAgICAgICAvLyAgIGlmIChmaWx0ZXJNZXRhZGF0YVZhbHVlLnZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyAgICAgZmlsdGVyc1tmaWVsZE5hbWVdID0gZmlsdGVyTWV0YWRhdGEgYXMgRmlsdGVyTWV0YWRhdGE7XHJcbiAgICAgICAgICAgIC8vICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZygnYWxsIGZpbHRlcnMnLCBmaWx0ZXJzKVxyXG4gICAgICAgICAgICAvLyAgIHJldHVybiBmaWx0ZXJzO1xyXG4gICAgICAgICAgICAvLyB9LCB7fSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2VhcmNoRmllbGRzID1bXTtcclxuICAgICAgICAgICAgLy8gY29uc3QgZmlsdGVyc0FycmF5OiBbc3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfCBudWxsOyBtYXRjaE1vZGU6IHN0cmluZyxvcGVyYXRvciA6IHN0cmluZyB9W11dW10gPSBPYmplY3QuZW50cmllcyhkYXRhLmZpbHRlcnMpO1xyXG5cclxuICAgICAgICAgICAgLy8gZmlsdGVyc0FycmF5LmZvckVhY2goKFtmaWVsZE5hbWUsIGZpZWxkVmFsdWVdKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyAgIGZpZWxkVmFsdWUuZm9yRWFjaChmaWx0ZXIgPT5cclxuICAgICAgICAgICAgLy8gICAgIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBpZihmaWx0ZXIudmFsdWUpe1xyXG4gICAgICAgICAgICAvLyAgICAgICBsZXQgc2VhcmNoRmllbGQgOiBTZWFyY2hGaWVsZCA9e1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGZpZWxkIDpmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgbGFiZWxWYWx1ZSA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICB2YWx1ZTpmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdHlwZSA6IHRoaXMuaW5mZXJJbnB1dFR5cGUoZmllbGROYW1lKSxcclxuICAgICAgICAgICAgLy8gICAgICAgICBvcGVyYXRvciA6IHRoaXMuZ2V0T3BlcmF0b3JOdW1iZXIoZmlsdGVyLm1hdGNoTW9kZSlcclxuICAgICAgICAgICAgLy8gICAgICAgfTtcclxuICAgICAgICAgICAgLy8gICAgICAgY29uc29sZS5sb2coJ3NlYXJjaEZpZWxkJyxzZWFyY2hGaWVsZCk7XHJcbiAgICAgICAgICAgIC8vICAgICAgIGlmICh0aGlzLnNlYXJjaEZpZWxkcykge1xyXG5cclxuICAgICAgICAgICAgLy8gICAgICAgdGhpcy5zZWFyY2hGaWVsZHMucHVzaChzZWFyY2hGaWVsZCk7XHJcbiAgICAgICAgICAgIC8vICAgICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gc2Vzc2lvbiBkYXRhIGZvdW5kIGluIGxvY2FsU3RvcmFnZVwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMgPSB0aGlzLl9leHRyYWN0RmlsdGVycyhldmVudC5maWx0ZXJzKTtcclxuICAgIHRoaXMuX2V4dHJhY3RTb3J0Q3JpdGVyaWFzKGV2ZW50KTtcclxuICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICBmaWVsZHMoKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2w6IEdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaChjb2wuZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZHM7XHJcbiAgfVxyXG5cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZChpdGVtOiBhbnksIGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgIHRoaXMuYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KHsgZmllbGQ6IGZpZWxkLCBrZXk6IGl0ZW1bdGhpcy5rZXldLCBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHkgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoeyBmaWVsZDogZmllbGQsIGtleTogaXRlbSwgc2VsZWN0S2V5T25seTogdGhpcy5zZWxlY3RLZXlPbmx5IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAga2V5d29yZFZhbHVlQ2hhbmdlZChrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMua2V5d29yZCA9IGtleXdvcmRcclxuICB9XHJcblxyXG4gIGlzQWxsUmVxdWlyZWRTZWFyY2hGaWVsZHNIYXZlVmFsdWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGludmFsaWRTZWFyY2hGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkc1xyXG4gICAgICA/LmZpbHRlcih4ID0+IHgucmVxdWlyZWQgPT0gdHJ1ZSAmJiAoeC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgeC52YWx1ZSA9PSAnJyB8fCB4LnZhbHVlID09IG51bGwpKVxyXG5cclxuICAgIGlmIChpbnZhbGlkU2VhcmNoRmllbGRzID09IHVuZGVmaW5lZCB8fCBpbnZhbGlkU2VhcmNoRmllbGRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBpbnZhbGlkU2VhcmNoRmllbGRzLmZvckVhY2goc2VhcmNoRmllbGQgPT4ge1xyXG4gICAgICBtZXNzYWdlcy5wdXNoKGA8Yj4ke3RoaXMubG9jYWxpemUudHJhbnNmb3JtKHNlYXJjaEZpZWxkLmxhYmVsVmFsdWUpfTwvYj4gJHt0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShcInNoYXJlZF9zZWFyY2hfZmllbGRfcmVxdWlyZWRcIil9YCk7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlc0Zyb21BcnJheVN0cmluZyhtZXNzYWdlcyk7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGluaXRTZWFyY2hPbkluaXQoKSB7XHJcbiAgICBsZXQgaW52YWxpZFNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzXHJcbiAgICAgID8uZmlsdGVyKHggPT4geC5yZXF1aXJlZCA9PSB0cnVlICYmICh4LnZhbHVlID09IHVuZGVmaW5lZCB8fCB4LnZhbHVlID09ICcnIHx8IHgudmFsdWUgPT0gbnVsbCkpID8/IFtdXHJcblxyXG4gICAgaWYgKHRoaXMuX3NlYXJjaE9uSW5pdCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSBpbnZhbGlkU2VhcmNoRmllbGRzLmxlbmd0aCA9PSAwXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21ib0JveExhYmVsQ2hhbmdlZChldmVudD86IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5fZXh0cmFjdFNlYXJjaEJveEZpbHRlcnMoKTtcclxuICAgIHRoaXMuX2dlbmVyYXRlRmlsdGVyc0h0bWxUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoKGV2dDogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJzZWFyY2g+Pj5cIiwgdGhpcy5zZWFyY2hGaWVsZHMpXHJcbiAgICAvLyBzZXQgZ2xvYmFsIGZpbHRlciB2YWx1ZVxyXG5cclxuICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCAmJiB0aGlzLmlzQWxsUmVxdWlyZWRTZWFyY2hGaWVsZHNIYXZlVmFsdWVzKCkpIHtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3Quc3VtbWFyaWVzID0gdGhpcy5fZXh0cmFjdEhhdmVTdW1tYXJ5UHJvcGVydGllcygpO1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5zb3J0aW5nID0gdGhpcy5fc29ydDtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3Qua2V5d29yZCA9IHRoaXMua2V5d29yZDtcclxuXHJcbiAgICAgIC8vYWRkIHNlYXJjaCBib3ggZmlsdGVyc1xyXG4gICAgICB0aGlzLl9leHRyYWN0U2VhcmNoQm94RmlsdGVycygpO1xyXG5cclxuICAgICAgLy9nZW5lcmF0ZSBmaWx0ZXJzIGh0bWwgdGVtcGxhdGVcclxuICAgICAgdGhpcy5fZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk7XHJcbiAgICAgIC8vY2xvbmVcclxuXHJcbiAgICAgIGxldCBuZXdSZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0ID0gdGhpcy5fY2xvbmVQYWdlZFJlcXVlc3QodGhpcy5wYWdlZFJlcXVlc3QpO1xyXG5cclxuICAgICAgLy9jb25jYXQgZmlsdGVyc1xyXG4gICAgICBuZXdSZXF1ZXN0LmZpbHRlcnMgPSBbLi4udGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMsIC4uLnRoaXMuX3NlYXJjaEJveEZpbHRlcnNdO1xyXG5cclxuICAgICAgLy9leGNsdWRlIHVzZWxlc3MgZmlsdGVyc1xyXG4gICAgICBuZXdSZXF1ZXN0ID0gdGhpcy5fZXhjbHVkZVVzZWxlc3NGaWx0ZXJzKG5ld1JlcXVlc3QpO1xyXG5cclxuICAgICAgLy8gdGVzdCBpZiBmaWx0ZXJzIHZhbHVlIGhhcyBjaGFuZ2VkXHJcbiAgICAgIGlmICgodGhpcy5sYXRlc3RGaWx0ZXJzID8gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXRlc3RGaWx0ZXJzKSA6IG51bGwpXHJcbiAgICAgICAgIT09IChuZXdSZXF1ZXN0LmZpbHRlcnMgPyBKU09OLnN0cmluZ2lmeShuZXdSZXF1ZXN0LmZpbHRlcnMpIDogbnVsbCkpIHtcclxuICAgICAgICBuZXdSZXF1ZXN0LnNraXBDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgICAgICB0aGlzLmR0LmZpcnN0ID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNhdmUgbGF0ZXN0IGZpbHRlcnNcclxuICAgICAgdGhpcy5sYXRlc3RGaWx0ZXJzID0gbmV3UmVxdWVzdC5maWx0ZXJzO1xyXG5cclxuICAgICAgdGhpcy5sb2FkLmVtaXQoeyByZXF1ZXN0OiBuZXdSZXF1ZXN0LCBpc0ZvckNhbGVuZGFyOiB0aGlzLl9zaG93Q2FsZW5kZXJWaWV3IH0pO1xyXG5cclxuICAgICAgdGhpcy5maWx0ZXJzSHRtbFRlbXBsYXRlQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJzSHRtbFRlbXBsYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZpcnN0RWxlbWVudEluZGV4KCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXRoaXMuZHQpIHJldHVybiAwO1xyXG5cclxuICAgIGlmICh0aGlzLnBhZ2UuaXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmR0LmZpcnN0ID09PSAwID8gMSA6ICh0aGlzLmR0Py5maXJzdCA/PyAwKTtcclxuICB9XHJcblxyXG4gIGdldFN1bW1hcnkoZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgc3VtbWFyeVJvdyA9IHRoaXMucGFnZS5zdW1tYXJpZXNcclxuICAgICAgLmZpbmQocyA9PiBzLnByb3ByZXR5LnRvVXBwZXJDYXNlKCkgPT0gZmllbGQudG9VcHBlckNhc2UoKSk7XHJcbiAgICBpZiAoc3VtbWFyeVJvdykge1xyXG4gICAgICByZXR1cm4gc3VtbWFyeVJvdy5zdW1tYXJ5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKSB7XHJcbiAgICBsZXQgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgICAgICBsZXQga2V5czogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaCgodjogYW55KSA9PiB7IGtleXMucHVzaCh2W3RoaXMua2V5XSkgfSk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSBrZXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPyBbdGhpcy5zZWxlY3Rpb25bdGhpcy5rZXldXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uID8gW3RoaXMuc2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk5vbmUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YT8uaXNBZHZhbmNlZFNlYXJjaCAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChzZWxlY3Rpb24pXHJcblxyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSkge1xyXG4gICAgICAgIGxldCBkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0OiBEcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0ID0ge1xyXG4gICAgICAgICAgaXRlbUtleVByb3BlcnR5TmFtZTogdGhpcy5rZXksXHJcbiAgICAgICAgICBpdGVtczogc2VsZWN0aW9uWzBdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVmPy5jbG9zZShkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0KVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGxDaGFuZ2UoZXZlbnQ6IFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0QWxsID0gZXZlbnQuY2hlY2tlZDtcclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdEFsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWRCeUZpZWxkICYmIHRoaXMuY2hlY2tlZEJ5RmllbGQudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLnBhZ2UuaXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgICBpdGVtID0+IGl0ZW1bdGhpcy5jaGVja2VkQnlGaWVsZF0gPT09IHRydWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5wYWdlLml0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gb25TZWxlY3RlZENvbHVtbnNDaGFuZ2UoKSB7XHJcbiAgLy8gICBpZiAodGhpcy5mb3JtTmFtZSkge1xyXG4gIC8vICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG5cclxuICAvLyAgICAgaWYgKHN0b3JlZFZhbHVlKSB7XHJcbiAgLy8gICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAvLyAgICAgICBsZXQgY29sdW1uT3JkZXI6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gICAgICAgbGV0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBbXTtcclxuICAvLyAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAvLyAgICAgICAgIGlmIChpdGVtLmZpZWxkID09PSAndXBsb2FkJykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2Rvd25sb2FkJykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2NvbnN1bHQnKSB7XHJcbiAgLy8gICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBlbHNlIGlmIChpdGVtLmZpZWxkID09PSAnZGVsZXRlJykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2VkaXQnKSB7XHJcbiAgLy8gICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuc29ydCgoYSwgYikgPT4ge1xyXG4gIC8vICAgICAgICAgaWYgKGEub3JkZXIgIT09IHVuZGVmaW5lZCAmJiBiLm9yZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAvLyAgICAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgcmV0dXJuIDA7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaChzZWxlY3RlZENvbHVtbiA9PiB7XHJcbiAgLy8gICAgICAgICBjb2x1bW5PcmRlci5wdXNoKHNlbGVjdGVkQ29sdW1uLmZpZWxkKTtcclxuICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGVkV2lkdGggPSBzZWxlY3RlZENvbHVtbi5taW5XaWR0aDtcclxuICAvLyAgICAgICAgIGlmIChzZWxlY3RlZFdpZHRoKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbHVtbldpZHRocy5wdXNoKHNlbGVjdGVkV2lkdGgudG9TdHJpbmcoKSk7XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAvL2NvbHVtbldpZHRocy5wdXNoKCc5MCcpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gIC8vICAgICAgIHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyID0gY29sdW1uT3JkZXI7XHJcbiAgLy8gICAgICAgc2Vzc2lvbkRhdGEuY29sdW1uV2lkdGhzID0gY29sdW1uV2lkdGhzLmpvaW4oJywnKTtcclxuXHJcbiAgLy8gICAgICAgLy9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmZvcm1OYW1lLCBKU09OLnN0cmluZ2lmeShzZXNzaW9uRGF0YSkpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIC8vY29uc3QgcmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRhYmxlQ29uZmlnSlNPTigpO1xyXG4gIC8vICAgICAgIC8vbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5mb3JtTmFtZSwgcmVzdWx0KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2VuZXJhdGVUYWJsZUNvbmZpZ0pTT04oKTogc3RyaW5nIHtcclxuICAvLyAgIGNvbnN0IHRhYmxlQ29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLmpzb25TdHJpbmdMYXlvdXQpO1xyXG4gIC8vICAgdGFibGVDb25maWcuY29sdW1uT3JkZXIgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZCk7XHJcbiAgLy8gICAvL3RhYmxlQ29uZmlnLmNvbHVtbldpZHRocyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLm1hcCgoKSA9PiAnOTAnKS5qb2luKCcsJyk7XHJcbiAgLy8gICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGFibGVDb25maWcpO1xyXG4gIC8vIH1cclxuXHJcblxyXG5cclxuICBvblN0YXRlUmVzdG9yZSh0YWJsZVN0YXRlOiBUYWJsZVN0YXRlKSB7XHJcbiAgICBpZiAodGFibGVTdGF0ZS5zZWxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0YWJsZVN0YXRlLnNlbGVjdGlvblxyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLmZvcm1OYW1lKSB7XHJcbiAgICAvLyAgIGNvbnN0IHN0b3JlZFZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5mb3JtTmFtZSk7XHJcbiAgICAvLyAgIGlmIChzdG9yZWRWYWx1ZSkge1xyXG4gICAgLy8gICAgIGNvbnN0IHNlc3Npb25EYXRhID0gSlNPTi5wYXJzZShzdG9yZWRWYWx1ZSk7XHJcbiAgICAvLyAgICAgY29uc3QgY29sdW1uT3JkZXI6IHN0cmluZ1tdID0gc2Vzc2lvbkRhdGEuY29sdW1uT3JkZXI7XHJcbiAgICAvLyAgICAgY29uc3QgY29sdW1uV2lkdGhzOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbldpZHRocy5zcGxpdCgnLCcpO1xyXG5cclxuICAgIC8vICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRDb2x1bW5zIGJhc2VkIG9uIGNvbHVtbk9yZGVyIGFuZCBjb2x1bW5XaWR0aHNcclxuICAgIC8vICAgICBjb25zdCB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICAgIC8vICAgICBjb2x1bW5PcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcclxuICAgIC8vICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gY29sdW1uV2lkdGhzW2luZGV4XTtcclxuICAgIC8vICAgICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHNlbGVjdGVkQ29sdW1uc1xyXG4gICAgLy8gICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCk7XHJcbiAgICAvLyAgICAgICBpZiAoZXhpc3RpbmdDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuICAgIC8vICAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBleGlzdHMgaW4gc2VsZWN0ZWRDb2x1bW5zLCB1cGRhdGUgaXRzIHdpZHRoXHJcbiAgICAvLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2V4aXN0aW5nQ29sdW1uSW5kZXhdLndpZHRoID0gY29sdW1uV2lkdGg7XHJcbiAgICAvLyAgICAgICAgIHVwZGF0ZWRTZWxlY3RlZENvbHVtbnMucHVzaCh0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XSk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIC8vIFVwZGF0ZSBzZWxlY3RlZENvbHVtbnMgd2l0aCB0aGUgcmVzdG9yZWQgZGF0YVxyXG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdXBkYXRlZFNlbGVjdGVkQ29sdW1ucztcclxuXHJcblxyXG4gICAgLy8gICAgICAgaWYoc3RvcmVkVmFsdWUpe1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoKGRhdGEubXVsdGlTb3J0TWV0YSAmJiBkYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkgfHwgKGRhdGEuZmlsdGVycyAmJiBkYXRhLm11bHRpU29ydE1ldGEuZmlsdGVycyA+IDApKSB7XHJcbiAgICAvLyAgICAgICAgICAgaWYgKGRhdGEubXVsdGlTb3J0TWV0YSAmJiBkYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgZGF0YS5tdWx0aVNvcnRNZXRhLmZvckVhY2goKG1ldGE6IHsgZmllbGQ6IGFueTsgb3JkZXI6IGFueTsgfSkgPT4geyBcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgIGxldCBzb3J0ID0ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHByb3BlcnR5OiBtZXRhLmZpZWxkLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIG9yZGVyOiBtZXRhLm9yZGVyID09IDEgPyAnQVNDJyA6ICdERVNDJ1xyXG4gICAgLy8gICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgIHRoaXMuX3NvcnQgPSBbc29ydF07XHJcbiAgICAvLyAgICAgICAgICAgICB9KTsgIFxyXG4gICAgLy8gICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICBpZiAoZGF0YS5maWx0ZXJzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcyA9W107XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzQXJyYXk6IFtzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB8IG51bGw7IG1hdGNoTW9kZTogc3RyaW5nLG9wZXJhdG9yIDogc3RyaW5nIH1bXV1bXSA9IE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsdGVycyk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKFtmaWVsZE5hbWUsIGZpZWxkVmFsdWVdKSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICBmaWVsZFZhbHVlLmZvckVhY2goZmlsdGVyID0+XHJcbiAgICAvLyAgICAgICAgICAgICAgICAge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICBpZihmaWx0ZXIudmFsdWUpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEZpZWxkIDogU2VhcmNoRmllbGQgPXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZmllbGQgOmZpZWxkTmFtZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbGFiZWxWYWx1ZSA6IGZpbHRlci52YWx1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ZmlsdGVyLnZhbHVlLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0eXBlIDogdGhpcy5pbmZlcklucHV0VHlwZShmaWVsZE5hbWUpLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA6IHRoaXMuZ2V0T3BlcmF0b3JOdW1iZXIoZmlsdGVyLm1hdGNoTW9kZSlcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc2VhcmNoRmllbGQnLHNlYXJjaEZpZWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaEZpZWxkcykge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRmllbGRzLnB1c2goc2VhcmNoRmllbGQpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgIH1cclxuXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJObyBzZXNzaW9uIGRhdGEgZm91bmQgaW4gbG9jYWxTdG9yYWdlXCIpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHQ/LmNsZWFyKCk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYClcclxuICB9XHJcblxyXG4gIGdldE9wZXJhdG9yTnVtYmVyKG9wZXJhdG9yOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIEZpbHRlck9wZXJhdG9yVHlwZVtvcGVyYXRvci50b1VwcGVyQ2FzZSgpIGFzIGtleW9mIHR5cGVvZiBGaWx0ZXJPcGVyYXRvclR5cGVdID8/IC0xO1xyXG4gIH1cclxuICBpbmZlcklucHV0VHlwZSh2YWx1ZTogYW55KTogSW5wdXRUeXBlcyB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAoL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5JTlRFR0VSO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eXFxkK1xcLlxcZCskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBJbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuREFURTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5URVhUX0JPWDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIElucHV0VHlwZXMuVEVYVF9CT1g7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGxvYWRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlWydnZXQnXSgndGFibGUtc3RhdGUnKTtcclxuICB9XHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbWV0aG9kc1xyXG4gIHByaXZhdGUgX2V4dHJhY3RGaWx0ZXJzKGV2ZW50OiBGaWx0ZXJNZXRhZGF0YVtdIHwgYW55KTogSUZpbHRlcmVkUmVxdWVzdFtdIHtcclxuICAgIGxldCBmaWx0ZXJzOiBJRmlsdGVyZWRSZXF1ZXN0W10gPSBbXTtcclxuICAgIGlmIChldmVudCAhPSBudWxsICYmIGV2ZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbmN5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBjb2wuY3VycmVuY3lPdGhlckNvZGU7XHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IHRoaXMuZGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWSkge1xyXG4gICAgICAgICAgY3VycmVuY3kgPSB0aGlzLmFwcFNldHRpbmdzU2VydmljZS5hcHBTZXR0aW5ncy5kZXZpc2VTb2NpZXRlLmNvZGVEZXZpc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChldmVudCAhPSBudWxsICYmIGV2ZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGZpbHRlciA9IGV2ZW50W2NvbC5maWVsZF07XHJcbiAgICAgICAgICBpZiAodGhpcy5fbm90TnVsbE9yVW5kZWZpbmVkKGZpbHRlcikpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ub3ROdWxsT3JVbmRlZmluZWQoaXRlbS52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBpdGVtLnZhbHVlIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oaXRlbS52YWx1ZSwgJ3l5eXktTU0tZGQnKVxyXG4gICAgICAgICAgICAgICAgICAgIDogaXRlbS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRmlsdGVySGVscGVyLlRvT3BlcmF0b3JUeXBlKGl0ZW0ubWF0Y2hNb2RlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZTogZmlsdGVyVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJldHlOYW1lOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBjb2wuaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgIG51bU9mRGVjaW1hbDogY29sLm51bU9mRGVjaW1hbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb21ib2JveExhYmVsOiBjb2wuY29tYm9MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbUNvbHVtbjogY29sLmlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZmlsdGVyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpbHRlci52YWx1ZSwgJ3l5eXktTU0tZGQnKVxyXG4gICAgICAgICAgICAgICAgICA6IGZpbHRlci52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJIZWxwZXIuVG9PcGVyYXRvclR5cGUoZmlsdGVyLm1hdGNoTW9kZSksXHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgcHJvcHJldHlOYW1lOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgIGhlYWRlcjogY29sLmhlYWRlcixcclxuICAgICAgICAgICAgICAgICAgdHlwZTogRmlsdGVySGVscGVyLlRvSW5wdXRUeXBlKGNvbC50eXBlKSxcclxuICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICBudW1PZkRlY2ltYWw6IGNvbC5udW1PZkRlY2ltYWwsXHJcbiAgICAgICAgICAgICAgICAgIGlzRnJhY3Rpb246IGNvbC5pc0ZyYWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBjb21ib2JveExhYmVsOiBjb2wuY29tYm9MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgaXNDdXN0b21Db2x1bW46IGNvbC5pc0N1c3RvbUNvbHVtblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFNvcnRDcml0ZXJpYXMobGF6eUxvYWRFdmVudDogVGFibGVMYXp5TG9hZEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc29ydE1ldGEgPSB0aGlzLl90b1NvcnRNZXRhKGxhenlMb2FkRXZlbnQpO1xyXG4gICAgaWYgKHNvcnRNZXRhKSB7XHJcbiAgICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgICAgdGhpcy5fZXh0cmFjdFNpbmdsZVNvcnRDcml0ZXJpYShzb3J0TWV0YSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICB0aGlzLl9leHRyYWN0TXVsdGlwbGVTb3J0Q3JpdGVyaWFzKHNvcnRNZXRhKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0U2luZ2xlU29ydENyaXRlcmlhKHNvcnRNZXRhOiBTb3J0TWV0YSkge1xyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHNvcnRNZXRhLmZpZWxkKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBzb3J0IGVsZW1lbnRcclxuICAgICAgICBsZXQgaXNDdXN0b21Db2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IHNvcnRNZXRhLmZpZWxkKT8uaXNDdXN0b21Db2x1bW47XHJcbiAgICAgICAgbGV0IHNvcnQ6IElTb3J0QnlQcm9wcmV0eSA9IHtcclxuICAgICAgICAgIHByb3BlcnR5OiBzb3J0TWV0YS5maWVsZCxcclxuICAgICAgICAgIG9yZGVyOiBzb3J0TWV0YS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQycsXHJcbiAgICAgICAgICBpc0N1c3RvbUNvbHVtbjogaXNDdXN0b21Db2x1bW5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc29ydCA9IFtzb3J0XVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHByb2Nlc3MgXFwnU2luZ2xlU29ydFxcJyB3aGVuIFtzb3J0TW9kZV0gaXMgXFwnbXVsdGlwbGVcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RNdWx0aXBsZVNvcnRDcml0ZXJpYXMoc29ydE1ldGFzOiBTb3J0TWV0YVtdKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAoc29ydE1ldGFzICYmIEFycmF5LmlzQXJyYXkoc29ydE1ldGFzKSkge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgc29ydCBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5fc29ydCA9IFtdO1xyXG4gICAgICAgIHRoaXMuc29ydE1ldGFzID0gc29ydE1ldGFzO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coJ21ldGEgJywgc29ydE1ldGFzKVxyXG4gICAgICAgIHNvcnRNZXRhcy5mb3JFYWNoKHNtID0+IHtcclxuICAgICAgICAgIGlmIChzbS5maWVsZCkge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHNvcnQgZWxlbWVudFxyXG4gICAgICAgICAgICBsZXQgaXNDdXN0b21Db2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IHNtLmZpZWxkKT8uaXNDdXN0b21Db2x1bW47XHJcbiAgICAgICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICAgICAgcHJvcGVydHk6IHNtLmZpZWxkLFxyXG4gICAgICAgICAgICAgIG9yZGVyOiBzbS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQycsXHJcbiAgICAgICAgICAgICAgaXNDdXN0b21Db2x1bW46IGlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vYWRkIHRoZSBuZXcgZWxlbWVudCB0byBfc29ydFxyXG4gICAgICAgICAgICB0aGlzLl9zb3J0LnB1c2goc29ydCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgcHJvY2VzcyBcXCdNdWx0aXBsZVNvcnRcXCcgd2hlbiBbc29ydE1vZGVdIGlzIFxcJ3NpbmdsZVxcJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbm90TnVsbE9yVW5kZWZpbmVkKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAob2JqICE9IG51bGxcclxuICAgICAgJiYgb2JqICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIFJldHVybnMgdGhlIHNlYXJjaCBmaWVsZHMgdGhhdCBhcmUgdmlzaWJsZSBwZXIgdGhlIHByZXNlbnRhdGlvbiBjb25maWcsIFdJVEhPVVQgbXV0YXRpbmcgdGhlXHJcbiAgLy8gcmVuZGVyZWQgYHNlYXJjaEZpZWxkc2AuIEhpZGRlbiBmaWVsZHMgc3RheSByZW5kZXJlZCAoYW5kIGFyZSBoaWRkZW4gaW4gdGhlIERPTSBieSB0aGVcclxuICAvLyBwcmVzZW50YXRpb25EZXNpZ25lckJhc2UgZGlyZWN0aXZlLCBsaWtlIGJ1dHRvbnMpIHNvIHRoZXkgY2FuIGJlIHJlLXNob3duIGluIGRlc2lnbiBtb2RlOyB0aGlzXHJcbiAgLy8gc3Vic2V0IGlzIHVzZWQgb25seSBmb3IgYnVpbGRpbmcgdGhlIHNlYXJjaCBxdWVyeSBzbyBoaWRkZW4gZmllbGRzIGFyZSBuZXZlciBzZW50IHRvIHRoZSBBUEkuXHJcbiAgcHJpdmF0ZSBfb25seVZpc2libGVTZWFyY2hGaWVsZHMoZmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4pOiBBcnJheTxTZWFyY2hGaWVsZD4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnByZXNlbnRhdGlvblNldHRpbmdzICYmXHJcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uU2V0dGluZ3MucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKHNmID0+IHtcclxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLnByZXNlbnRhdGlvblNldHRpbmdzPy5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsc1xyXG4gICAgICAgICAgLmZpbmQocCA9PiBwLmJsb2NrTmFtZSA9PT0gc2YuZmllbGQpO1xyXG5cclxuICAgICAgICByZXR1cm4gIWNvbmZpZyB8fCBjb25maWcuaXNCbG9ja1Zpc2libGUgPT09IHRydWUgfHwgY29uZmlnLmlzQmxvY2tWaXNpYmxlID09PSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICB0aGlzLl9vbmx5VmlzaWJsZVNlYXJjaEZpZWxkcyh0aGlzLnNlYXJjaEZpZWxkcykuZm9yRWFjaCgoc2Y6IFNlYXJjaEZpZWxkKSA9PiB7XHJcbiAgICAgICAgLy9pZiAoc2YudmFsdWUgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoc2Yub3BlcmF0b3IgIT0gbnVsbCAmJiBzZi5vcGVyYXRvciAhPSB1bmRlZmluZWQgJiYgc2YudmFsdWUgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICBsZXQgZmlsdGVyQnlQcm9wZXJ0eTogSUZpbHRlcmVkUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgb3BlcmF0b3I6IHNmLm9wZXJhdG9yXHJcbiAgICAgICAgICAgICwgZmlsdGVyVmFsdWU6IHNmLnZhbHVlXHJcbiAgICAgICAgICAgICwgcHJvcHJldHlOYW1lOiBzZi5maWVsZFxyXG4gICAgICAgICAgICAsIGhlYWRlcjogc2YubGFiZWxWYWx1ZVxyXG4gICAgICAgICAgICAsIHR5cGU6IHNmLnR5cGVcclxuICAgICAgICAgICAgLCBjb21ib2JveExhYmVsOiBzZi5jb21ib2JveExhYmVsXHJcbiAgICAgICAgICAgICwgY3VycmVuY3k6IHNmLmN1cnJlbmN5XHJcbiAgICAgICAgICAgICwgaXNGcmFjdGlvbjogc2YuaXNGcmFjdGlvblxyXG4gICAgICAgICAgICAsIG51bU9mRGVjaW1hbDogc2YubnVtT2ZEZWNpbWFsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycy5wdXNoKGZpbHRlckJ5UHJvcGVydHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzZi5vcGVyYXRvciA9PSB1bmRlZmluZWQgfHwgc2Yub3BlcmF0b3IgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgc2VhcmNoIGZpZWxkIHdpdGggW2ZpZWxkIDogJHtzZi5maWVsZH1dIGhhdmUgbm8gb3BlcmF0b3JzYClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xvbmVQYWdlZFJlcXVlc3QocmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgbGV0IGNsb25lOiBJUGFnZWRSZXF1ZXN0ID0ge1xyXG4gICAgICBtYXhSZXN1bHRDb3VudDogcmVxdWVzdC5tYXhSZXN1bHRDb3VudCxcclxuICAgICAgc2tpcENvdW50OiByZXF1ZXN0LnNraXBDb3VudCxcclxuICAgICAgc29ydGluZzogcmVxdWVzdC5zb3J0aW5nLFxyXG4gICAgICBrZXl3b3JkOiByZXF1ZXN0LmtleXdvcmQsXHJcbiAgICAgIGZpbHRlcnM6IHJlcXVlc3QuZmlsdGVycyxcclxuICAgICAgZ2V0QWxsRGF0YTogcmVxdWVzdC5nZXRBbGxEYXRhLFxyXG4gICAgICBzdW1tYXJpZXM6IHJlcXVlc3Quc3VtbWFyaWVzXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdEhhdmVTdW1tYXJ5UHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBsZXQgaGF2ZVN1bW1hcnlDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaGF2ZVN1bW1hcnkgPT09IHRydWUpO1xyXG4gICAgaWYgKGhhdmVTdW1tYXJ5Q29sdW1ucyAmJiBoYXZlU3VtbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBwcm9wZXJ0aWVzID0gaGF2ZVN1bW1hcnlDb2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFN1bW1hcmllcygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhZ2Uuc3VtbWFyaWVzKSB7XHJcbiAgICAgIHRoaXMucGFnZS5zdW1tYXJpZXMuZm9yRWFjaChzID0+IHtcclxuICAgICAgICB0aGlzLnN1bW1hcmllc1tzLnByb3ByZXR5XSA9IHMuc3VtbWFyeTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0TXVsdGlTb3J0TWV0YUl0ZW1zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc29ydCA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc29ydE1ldGFzKSB7XHJcbiAgICAgIHRoaXMuc29ydE1ldGFzLmZvckVhY2goKHM6IFNvcnRNZXRhKSA9PiB7XHJcbiAgICAgICAgbGV0IHNvcnQ6IElTb3J0QnlQcm9wcmV0eSA9IHtcclxuICAgICAgICAgIHByb3BlcnR5OiBzLmZpZWxkLFxyXG4gICAgICAgICAgb3JkZXI6IHMub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc29ydEl0ZW0gPSB0aGlzLl9zb3J0LmZpbmQocyA9PiBzLnByb3BlcnR5ID09IHNvcnQucHJvcGVydHkpO1xyXG5cclxuICAgICAgICBpZiAoc29ydEl0ZW0pIHtcclxuICAgICAgICAgIGlmIChzb3J0SXRlbS5vcmRlciAhPSBzb3J0Lm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHNvcnRJdGVtLm9yZGVyID0gc29ydC5vcmRlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zb3J0LnB1c2goc29ydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvU29ydE1ldGEodGFibGVMYXp5TG9hZEV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0RmllbGQgJiYgdGFibGVMYXp5TG9hZEV2ZW50LnNvcnRPcmRlcikge1xyXG4gICAgICAgIGxldCBzb3J0TWV0YTogSVNvcnRNZXRhID0ge1xyXG4gICAgICAgICAgZmllbGQ6IHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0RmllbGQsXHJcbiAgICAgICAgICBvcmRlcjogdGFibGVMYXp5TG9hZEV2ZW50LnNvcnRPcmRlclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc29ydE1ldGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGFibGVMYXp5TG9hZEV2ZW50Lm11bHRpU29ydE1ldGEpIHtcclxuICAgICAgICByZXR1cm4gdGFibGVMYXp5TG9hZEV2ZW50Lm11bHRpU29ydE1ldGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFtzb3J0TW9kZV0gaGF2ZSBiZWVuIHNldCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSA9IFwiXCJcclxuICAgIC8vZXhjbHVkZSB1c2VsZXNzIEdyaWQgZmlsdGVyIFxyXG4gICAgdGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMgPSB0aGlzLl9leGNsdWRlVXNlbGVzc0dyaWRGaWx0ZXIodGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMpXHJcblxyXG4gICAgLy9hZGQgc2VhcmNoIEJveCBmaWx0ZXJzIGh0bWxcclxuICAgIGlmICh0aGlzLl9zZWFyY2hCb3hGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSA9IHRoaXMuX2h0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2VcclxuICAgICAgICAuZ2VuZXJhdGVHcmlkRmlsdGVyc1RlbXBsYXRlKHRoaXMuX3NlYXJjaEJveEZpbHRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vYWRkIGdyaWQgaGVhZGVyIGZpbHRlcnMgaHRtbFxyXG4gICAgaWYgKHRoaXMuX2dyaWRIZWFkZXJGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSArPSB0aGlzLl9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlXHJcbiAgICAgICAgLmdlbmVyYXRlR3JpZEZpbHRlcnNUZW1wbGF0ZSh0aGlzLl9ncmlkSGVhZGVyRmlsdGVycywgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZUNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXhjbHVkZVVzZWxlc3NHcmlkRmlsdGVyKGZpbHRlcnM6IElGaWx0ZXJlZFJlcXVlc3RbXSkge1xyXG4gICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKHggPT5cclxuICAgICAgeC5maWx0ZXJWYWx1ZSAhPT0gbnVsbCAmJiB4LmZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgeC5maWx0ZXJWYWx1ZSAhPT0gXCJcIiAmJiB4Lm9wZXJhdG9yICE9PSB1bmRlZmluZWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leGNsdWRlVXNlbGVzc0ZpbHRlcnMocGFnZWRSZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0KTogSVBhZ2VkUmVxdWVzdCB7XHJcbiAgICBpZiAocGFnZWRSZXF1ZXN0ICYmIHBhZ2VkUmVxdWVzdC5maWx0ZXJzKSB7XHJcbiAgICAgIHBhZ2VkUmVxdWVzdC5maWx0ZXJzID0gcGFnZWRSZXF1ZXN0LmZpbHRlcnMuZmlsdGVyKGYgPT4gZi5maWx0ZXJWYWx1ZSAhPSB1bmRlZmluZWQgJiYgZi5maWx0ZXJWYWx1ZSAhPSBudWxsKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhZ2VkUmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydEV4Y2VsKCkge1xyXG4gICAgdGhpcy5wYWdlZFJlcXVlc3QhIS5nZXRBbGxEYXRhID0gdHJ1ZVxyXG4gICAgaWYgKHRoaXMuY3J1ZFNlcnZpY2UgIT0gbnVsbCAmJiB0aGlzLmNydWRTZXJ2aWNlICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlzR3JpZERhdGFQYWdlZEluQXBpKSB7XHJcbiAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ2V0QWxsUGFnZWQodGhpcy5wYWdlZFJlcXVlc3QhISkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodmFsdWU6IElQYWdlZFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkSXRlbXMgPSBFeHBvcnRFeGNlbEhlbHBlci5wcmVwcm9jZXNzRGF0ZUZvckV4Y2VsKHZhbHVlLml0ZW1zKTtcclxuICAgICAgICAgICAgdmFsdWUuaXRlbXMgPSBmb3JtYXR0ZWRJdGVtcztcclxuICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhRnJvbUFwaVRvRXhjZWxTaGVldCh2YWx1ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGFnZS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLnBhZ2UubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSB0aGlzLnBhZ2UuaXRlbXMuZmlsdGVyKChjb2w6IGFueSkgPT4gIWNvbC5pc0J1dHRvbik7XHJcbiAgICAgIGZpbHRlcmVkRGF0YSA9IEV4cG9ydEV4Y2VsSGVscGVyLnByZXByb2Nlc3NEYXRlRm9yRXhjZWwoZmlsdGVyZWREYXRhKTtcclxuICAgICAgdGhpcy5wYWdlLml0ZW1zID0gZmlsdGVyZWREYXRhXHJcbiAgICAgIHRoaXMuZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodGhpcy5wYWdlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodmFsdWU6IGFueSkge1xyXG4gICAgaW1wb3J0KFwieGxzeFwiKS50aGVuKHhsc3ggPT4ge1xyXG4gICAgICBjb25zdCB3b3JrYm9vayA9IHhsc3gudXRpbHMuYm9va19uZXcoKTtcclxuICAgICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0IS5maWx0ZXJzPy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIGNvbnN0IG1hcHBlZEZpbHRlcnMgPSB0aGlzLnBhZ2VkUmVxdWVzdCEuZmlsdGVycz8ubWFwKGZpbHRlciA9PiAoe1xyXG4gICAgICAgICAgcHJvcGVydHk6IGZpbHRlci5wcm9wcmV0eU5hbWUsXHJcbiAgICAgICAgICBvcGVyYXRvck5hbWU6IHRoaXMuZ2V0RmlsdGVyT3BlcmF0b3JOYW1lKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLmZpbHRlclZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB4bHN4LnV0aWxzLmpzb25fdG9fc2hlZXQoPGFueVtdPm1hcHBlZEZpbHRlcnMpXHJcbiAgICAgICAgeGxzeC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgZmlsdGVycywgJ0ZpbHRlcnMnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNlbGVjdGVkQ29sdW1uc0ZpZWxkcyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcih4ID0+ICF4LmlzQnV0dG9uKS5tYXAoY29sdW1uID0+IGNvbHVtbi50cmFuc2xhdGVkSGVhZGVyISEpXHJcbiAgICAgIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcyA9IHNlbGVjdGVkQ29sdW1uc0ZpZWxkcy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSAnJylcclxuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YSA9IHZhbHVlLml0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YTogeyBbaGVhZGVyOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICByb3dEYXRhW2NvbC50cmFuc2xhdGVkSGVhZGVyISFdID0gaXRlbVtjb2wuZmllbGRdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByb3dEYXRhO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgZmlsdGVyZWRXb3Jrc2hlZXREYXRhID0gdGhpcy5yZW1vdmVOb25FeGlzdGluZ0NvbHVtbnMod29ya3NoZWV0RGF0YSwgc2VsZWN0ZWRDb2x1bW5zRmllbGRzKVxyXG4gICAgICBjb25zdCB3b3Jrc2hlZXQgPSB4bHN4LnV0aWxzLmpzb25fdG9fc2hlZXQoZmlsdGVyZWRXb3Jrc2hlZXREYXRhKTtcclxuICAgICAgeGxzeC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgd29ya3NoZWV0LCAnRGF0YScpO1xyXG4gICAgICBjb25zdCBleGNlbEJ1ZmZlcjogYW55ID0geGxzeC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICB0aGlzLnNhdmVBc0V4Y2VsRmlsZShleGNlbEJ1ZmZlciwgXCJleGNlbFwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUFzRXhjZWxGaWxlKGJ1ZmZlcjogYW55LCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgRVhDRUxfVFlQRSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtjaGFyc2V0PVVURi04JztcclxuICAgIGxldCBFWENFTF9FWFRFTlNJT04gPSAnLnhsc3gnO1xyXG4gICAgY29uc3QgZGF0YTogQmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XHJcbiAgICAgIHR5cGU6IEVYQ0VMX1RZUEVcclxuICAgIH0pO1xyXG4gICAgRmlsZVNhdmVyLnNhdmVBcyhkYXRhLCBmaWxlTmFtZSArICdfZXhwb3J0XycgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIEVYQ0VMX0VYVEVOU0lPTik7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXJPcGVyYXRvck5hbWUob3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yVHlwZSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkVRVUFMOiByZXR1cm4gJ0VRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTEVTU09SRVFVQUw6IHJldHVybiAnTEVTUyBPUiBFUVVBTCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkdSRUFURVJPUkVRVUFMOiByZXR1cm4gJ0dSRUFURVIgT1IgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5MRVNTOiByZXR1cm4gJ0xFU1MnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5HUkVBVEVSOiByZXR1cm4gJ0dSRUFURVInO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5OT1RFUVVBTDogcmV0dXJuICdOT1QgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5DT05UQUlOUzogcmV0dXJuICdDT05UQUlOUyc7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnVU5LTk9XTl9PUEVSQVRPUic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVOb25FeGlzdGluZ0NvbHVtbnMod29ya3NoZWV0RGF0YTogYW55W10sIHNlbGVjdGVkQ29sdW1uc0ZpZWxkczogc3RyaW5nW10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gd29ya3NoZWV0RGF0YS5tYXAocm93ID0+IHtcclxuICAgICAgY29uc3QgbmV3Um93OiBhbnkgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBjb2wgb2Ygc2VsZWN0ZWRDb2x1bW5zRmllbGRzKSB7XHJcbiAgICAgICAgaWYgKHJvdy5oYXNPd25Qcm9wZXJ0eShjb2wpKSB7XHJcbiAgICAgICAgICBuZXdSb3dbY29sXSA9IHJvd1tjb2xdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3Um93O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIZWFkZXJGaWx0ZXJzKCkge1xyXG4gICAgaWYgKHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlclwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke3RoaXMuZm9ybU5hbWV9LWZpbHRlck1vZGVgKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7IC8vdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9PT0gZmFsc2VcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IHRydWU7XHJcbiAgICAgIHRoaXMuZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyLXNsYXNoXCI7XHJcbiAgICAgIHRoaXMuZmlsdGVyVG9vbHRpcCA9IFwiaGlkZV9maWx0ZXJcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUhlYWRlckZpbHRlcnNNb2RlKCkge1xyXG4gICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgdGhpcy5kdC5jbGVhcigpXHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuZm9ybU5hbWV9LWZpbHRlck1vZGVgLCB0aGlzLmZpbHRlck1vZGVUb29sdGlwKVxyXG4gICAgICBpZiAodGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9PT0gXCJtZW51X21vZGVcIikge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcIm1lbnVcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1jaGVja1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcInJvd19tb2RlXCI7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmR0LmZpbHRlcnNbY29sLmZpZWxkXSA9IFt7IHZhbHVlOiBudWxsLCBtYXRjaE1vZGU6IHVuZGVmaW5lZCB9XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kdC5fZmlsdGVyKClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNoYW5nZUhlYWRlckZpbHRlcnNNb2RlID0gXCJyb3dcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1lbGxpcHNpcy12XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IFwibWVudV9tb2RlXCI7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmR0LmZpbHRlcnNbY29sLmZpZWxkXSA9IHsgdmFsdWU6IG51bGwsIG1hdGNoTW9kZTogdW5kZWZpbmVkIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHQuX2ZpbHRlcigpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEhlYWRlckNsYXNzQ29sb3IoY29sdW1uVHlwZTogRGlzcGxheVR5cGVzKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2xvcmZ1bCA9IHRoaXMubGF5b3V0SGVscGVyU2VydmljZS5sYXlvdXRDb25maWd1cmF0aW9uLmlzQ29sb3JmdWxNb2RlRW5hYmxlZDtcclxuICAgIGlmIChjb2xvcmZ1bCA9PT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgY29sb3JGb3JJbnRlZ2VyRGlzcGxheSA9IERpc3BsYXlUeXBlQ29sb3JzW2NvbHVtblR5cGVdIHx8ICd3aGl0ZS1ncmlkJztcclxuICAgICAgcmV0dXJuIGNvbG9yRm9ySW50ZWdlckRpc3BsYXk7XHJcbiAgICB9IGVsc2UgcmV0dXJuICd3aGl0ZS1ncmlkJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yZnVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0SGVscGVyU2VydmljZS5sYXlvdXRDb25maWd1cmF0aW9uLmlzQ29sb3JmdWxNb2RlRW5hYmxlZDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbENvbHVtbnNQcm9jZXNzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGV2aXNlU29jaWV0ZU51bU9mRGVjaW1hbDogbnVtYmVyID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYXBwU2V0dGluZ3MuZGV2aXNlU29jaWV0ZS5ub21icmVEZWNpbWFsZXMgPz8gRGVmYXVsdFNvY2lldGVEZXZpc2Uubm9tYnJlRGVjaW1hbGVzO1xyXG5cclxuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgIC8vIHNldCBpc051bWVyaWNcclxuICAgICAgY29sLmlzTnVtZXJpYyA9IGNvbC50eXBlICE9IHVuZGVmaW5lZCAmJiBjb2wudHlwZSAhPSBudWxsICYmIChOdW1lcmljRGlzcGxheVR5cGVzLmluZGV4T2YoY29sLnR5cGUpID49IDApO1xyXG5cclxuICAgICAgLy8gc2V0IGZpbHRlcklucHV0VHlwZVxyXG4gICAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREFURV9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2RhdGUnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5EQVRFVElNRV9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2RhdGUnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWTpcclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ251bWVyaWMnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5DSEVDS0JPWF9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2Jvb2xlYW4nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ3RleHQnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IG51bU9mRGVjaW1hbFxyXG4gICAgICBpZiAoY29sLm51bU9mRGVjaW1hbCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKCFjb2wudHlwZSkge1xyXG4gICAgICAgIGNvbC5udW1PZkRlY2ltYWwgPSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb2wuaXNOdW1lcmljKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sLnR5cGUgPT09IERpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gZGV2aXNlU29jaWV0ZU51bU9mRGVjaW1hbDtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sLnR5cGUgPT09IERpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVkpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNhbGVuZGFyRXZlbnRDbGljayhpdGVtOiBhbnkpIHtcclxuICAgIGlmIChpdGVtLm1vZGUgPT09IFwiU0VBUkNIXCIpIHtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyRXZlbnRDbGljay5lbWl0KGl0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGF0ZVJhbmdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBzdGFydCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uc3RhcnQpXHJcbiAgICBsZXQgZW5kID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5lbmQpXHJcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XHJcbiAgICAgIHN0YXJ0LnZhbHVlID0gZXZlbnQuc3RhcnQ7XHJcbiAgICAgIGVuZC52YWx1ZSA9IGV2ZW50LmVuZDtcclxuICAgICAgc3RhcnQuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICBlbmQuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlYXJjaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsbFNlYXJjaEhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0Lm1heFJlc3VsdENvdW50ID0gZXZlbnQubWF4UmVzdWx0Q291bnQ7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNraXBDb3VudCA9IGV2ZW50LnNraXBDb3VudDtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgICAgdGhpcy5wYWdlJC5uZXh0KHsgLi4udGhpcy5wYWdlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SGVhZGVyVGl0bGVzKHRpdGxlczogc3RyaW5nW10sIGl0ZW06IGFueSk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghdGl0bGVzIHx8ICFpdGVtKVxyXG4gICAgICByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3Qga2V5ID0gaXRlbS51aWQ7XHJcbiAgICBpZiAodGhpcy50aXRsZUNhY2hlLmhhcyhrZXkpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRpdGxlQ2FjaGUuZ2V0KGtleSkgfHwgW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzID0gdGl0bGVzLm1hcCh0ID0+IGl0ZW1bdF0pLmZpbHRlcih2ID0+ICEhdik7XHJcbiAgICB0aGlzLnRpdGxlQ2FjaGUuc2V0KGtleSwgcmVzKTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlVHlwZUljb25DbGFzcyhleHQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICgoZXh0ID8/ICcnKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ3BkZic6IHJldHVybiAncGkgcGktZmlsZS1wZGYnO1xyXG4gICAgICBjYXNlICdkb2MnOiBjYXNlICdkb2N4JzogcmV0dXJuICdwaSBwaS1maWxlLXdvcmQnO1xyXG4gICAgICBjYXNlICd4bHMnOiBjYXNlICd4bHN4JzogY2FzZSAnY3N2JzogcmV0dXJuICdwaSBwaS1maWxlLWV4Y2VsJztcclxuICAgICAgY2FzZSAncG5nJzogY2FzZSAnanBnJzogY2FzZSAnanBlZyc6IGNhc2UgJ2dpZic6IGNhc2UgJ2JtcCc6IGNhc2UgJ3N2Zyc6IGNhc2UgJ3dlYnAnOlxyXG4gICAgICAgIHJldHVybiAncGkgcGktaW1hZ2UnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3BpIHBpLWZpbGUnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVR5cGVJY29uQ29sb3IoZXh0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoKGV4dCA/PyAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiByZXR1cm4gJyNFMjU3NEMnO1xyXG4gICAgICBjYXNlICdkb2MnOiBjYXNlICdkb2N4JzogcmV0dXJuICcjMkI1NzlBJztcclxuICAgICAgY2FzZSAneGxzJzogY2FzZSAneGxzeCc6IGNhc2UgJ2Nzdic6IHJldHVybiAnIzIxNzM0Nic7XHJcbiAgICAgIGNhc2UgJ3BuZyc6IGNhc2UgJ2pwZyc6IGNhc2UgJ2pwZWcnOiBjYXNlICdnaWYnOiBjYXNlICdibXAnOiBjYXNlICdzdmcnOiBjYXNlICd3ZWJwJzpcclxuICAgICAgICByZXR1cm4gJyNGNTlFMEInO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJyM2QjcyODAnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdGF0dXNGaWx0ZXJDaGFuZ2VkKGV2dDogYW55KSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IGV2dDtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbHRlcihzZiA9PiBzZi5maWVsZCAhPT0gdGhpcy5lbnRpdHlJbmZvPy5zdGF0dXNDb2x1bW5OYW1lKTtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzPy5wdXNoKHtcclxuICAgICAgZmllbGQ6IHRoaXMuZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSA/PyBcIlwiLFxyXG4gICAgICB2YWx1ZTogZXZ0LFxyXG4gICAgICBsYWJlbFZhbHVlOiAnJyxcclxuICAgICAgdHlwZTogSW5wdXRUeXBlcy5DT01CT0JPWCxcclxuICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTCxcclxuICAgICAgc3R5bGVDbGFzczogXCJoaWRkZW5cIlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRlbXBTZWFyY2hGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkcyA/PyB0aGlzLnRlbXBTZWFyY2hGaWVsZHNcclxuICB9XHJcblxyXG4gIG9uV29ya2Zsb3dFdGF0RmlsdGVyQ2hhbmdlZChldnQ6IGFueSkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBldnQ7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzPy5maWx0ZXIoc2YgPT4gc2YuZmllbGQgIT09IFwiV29ya2Zsb3dFdGF0XCIpO1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHM/LnB1c2goe1xyXG4gICAgICBmaWVsZDogXCJXb3JrZmxvd0V0YXRcIixcclxuICAgICAgdmFsdWU6IGV2dCxcclxuICAgICAgbGFiZWxWYWx1ZTogJycsXHJcbiAgICAgIHR5cGU6IElucHV0VHlwZXMuQ09NQk9CT1gsXHJcbiAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUuRVFVQUwsXHJcbiAgICAgIHN0eWxlQ2xhc3M6IFwiaGlkZGVuXCJcclxuICAgIH0pO1xyXG4gICAgdGhpcy50ZW1wU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHMgPz8gdGhpcy50ZW1wU2VhcmNoRmllbGRzXHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZShmaWxlLCBmaWxlRXh0ZW5zaW9uLCBpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlLCBmaWxlRXh0ZW5zaW9uOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XHJcbiAgICAgIGlmICghYXJyYXlCdWZmZXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgY29uc3QgZmljaGllclRvU2VuZCA9IG5ldyBGaWNoaWVyKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZGF0ZUZpY2hpZXIgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbSA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5vYmpldCA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbUZpY2hpZXJDb21wbGV0ID0gZmlsZS5uYW1lO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRlc2NyaXB0aW9uID0gJyc7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuY29udGVudSA9IGJhc2U2NENvbnRlbnQ7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQudGFibGVMaWVlID0gdGhpcy5idXNpbmVzc0NsYXNzO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnBrZXkgPSBpdGVtLnVpZD8udG9TdHJpbmcoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5leHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uXHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlLmNyZWF0ZShmaWNoaWVyVG9TZW5kKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXCJmaWNoaWVyX2pvaW50XCIpO1xyXG4gICAgICAgICAgdGhpcy5vblNhdmUuZW1pdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgfVxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQrKztcclxuXHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ092ZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUwLFxyXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQtLTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRyYWdFbnRlckNvdW50ID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZVBvc2l0aW9uID0ge1xyXG4gICAgICB4OiBldmVudC5jbGllbnRYICsgNTAsXHJcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkNvbmZpcm1TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uXHJcbiAgICAgIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0aW9uKVxyXG4gICAgICB8fCB0aGlzLnNlbGVjdGlvbi5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHRoaXMuX3JlZj8uY2xvc2UoW10pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24ubWFwKGkgPT4gaVt0aGlzLmtleV0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0OiBEcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0ID0ge1xyXG4gICAgICBpdGVtS2V5UHJvcGVydHlOYW1lOiB0aGlzLmtleSxcclxuICAgICAgaXRlbXM6IHNlbGVjdGlvblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9yZWY/LmNsb3NlKGRyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWxTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3JlZikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX3JlZi5jbG9zZShbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4dHJhY3REaWFsb2dDb25maWdEYXRhKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF0aGlzLmNvbmZpZz8uZGF0YSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNvbmZpZ0RhdGE6IGFueSA9IHRoaXMuY29uZmlnLmRhdGE7XHJcblxyXG4gICAgICBpZiAoJ2lzQWR2YW5jZWRTZWFyY2gnIGluIGNvbmZpZ0RhdGEpIHtcclxuICAgICAgICB0aGlzLmlzQWR2YW5jZWRTZWFyY2ggPSBjb25maWdEYXRhLmlzQWR2YW5jZWRTZWFyY2ggPz8gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgnc2VsZWN0aW9uTW9kZScgaW4gY29uZmlnRGF0YSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IGNvbmZpZ0RhdGEuc2VsZWN0aW9uTW9kZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCdzZWxlY3RLZXlPbmx5JyBpbiBjb25maWdEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RLZXlPbmx5ID0gY29uZmlnRGF0YS5zZWxlY3RLZXlPbmx5O1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyb3IpIFxyXG4gICAge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIGF0IGV4dHJhY3REaWFsb2dDb25maWdEYXRhIDogJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIHRyeUFwcGx5RW50aXR5SW5mbygpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2J1c2luZXNzQ2xhc3MgfHwgIXRoaXMuX2VudGl0eUluZm8pIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmFwcGx5RW50aXR5SW5mbyh0aGlzLl9lbnRpdHlJbmZvKTtcclxuICAgIHRoaXMubG9hZFN0YXR1c0NvbG9ycygpO1xyXG4gICAgdGhpcy5sb2FkU3RhdHVzQ29sb3JzRGV0YWlsc0J5QnVzaW5lc3NDbGFzcygpO1xyXG4gICAgdGhpcy5jYWxlbmRlclNjaGVtYSA9IHRoaXMuZ2V0RXZlbnREYXRlQ2FsZW5kYXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRFdmVudERhdGVDYWxlbmRhcigpOiBFdmVudFNjaGVtYSB7XHJcbiAgICBpZiAoIXRoaXMuX2VudGl0eUluZm8pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW50aXR5SW5mbyBub24gY2hhcmfDqVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiAndWlkJyxcclxuICAgICAgc3RhcnQ6IHRoaXMuX2VudGl0eUluZm8uY2FsZW5kYXJTdGFydERhdGVDb2x1bW4gPz8gJycsXHJcbiAgICAgIGVuZDogdGhpcy5fZW50aXR5SW5mby5jYWxlbmRhckVuZERhdGVDb2x1bW4gPz8gJycsXHJcbiAgICAgIHRpdGxlOiBbXHJcbiAgICAgICAgdGhpcy5fZW50aXR5SW5mby5jYXJkVGl0bGVDb2x1bW4gPz8gJycsXHJcbiAgICAgICAgdGhpcy5fZW50aXR5SW5mby5jYXJkU3ViSGVhZGVyQ29sdW1uID8/ICcnLFxyXG4gICAgICAgIHRoaXMuX2VudGl0eUluZm8uY2FyZERlc2NyaXB0aW9uQ29sdW1uID8/ICcnXHJcbiAgICAgIF0uZmlsdGVyKEJvb2xlYW4pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXRoaXMucGFnZT8uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZSA/IFtdIDogbnVsbDtcclxuXHJcbiAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zS2V5cyA9IG5ldyBTZXQoXHJcbiAgICAgIHRoaXMucGFnZS5pdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbVt0aGlzLmtleV0pLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoczogYW55KSA9PlxyXG4gICAgICAgIGl0ZW1zS2V5cy5oYXMoc1t0aGlzLmtleV0pLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRTdGlsbEV4aXN0cyA9IGl0ZW1zS2V5cy5oYXModGhpcy5zZWxlY3Rpb25bdGhpcy5rZXldKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZFN0aWxsRXhpc3RzKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSIsIjxkaXYgY2xhc3M9XCJncmlkXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiBbQHNsaWRlSW5PdXRdPVwic2hvd1NlYXJjaEZpZWxkID8gJ2luJyA6ICdvdXQnXCIgKm5nSWY9XCJzaG93R2xvYmFsU2VhcmNoXCI+XHJcbiAgICA8dHNpLXNlYXJjaC1ib3ggXHJcbiAgICAgIFtpc1J0bE1vZGVdPVwiaXNSdGxNb2RlXCIgXHJcbiAgICAgIFsoc2VhcmNoRmllbGRzKV09XCJzZWFyY2hGaWVsZHNcIiBcclxuICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgIFtlbnRpdHlJbmZvXT1cImVudGl0eUluZm9cIlxyXG4gICAgICBbc3RhdHVzTWV0YWRhdGFdPVwic3RhdHVzTWV0YWRhdGFcIlxyXG4gICAgICBbZGVzY3JpbWluYXRvclZhbHVlXT1cImRlc2NyaW1pbmF0b3JWYWx1ZVwiXHJcbiAgICAgIChzZWFyY2hGaWVsZHNDaGFuZ2UpPVwic2VhcmNoRmllbGRzVmFsdWVDaGFuZ2VzKCRldmVudClcIiBcclxuICAgICAgKGtleXdvcmRWYWx1ZUNoYW5nZWQpPVwia2V5d29yZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKHNlYXJjaEZpZWxkc0FwcGxpZWQpPVwic2VhcmNoKCRldmVudClcIlxyXG4gICAgICAoc3RhdHVzRmlsdGVyQ2hhbmdlZCk9XCJvblN0YXR1c0ZpbHRlckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICh3b3JrZmxvd0V0YXRGaWx0ZXJDaGFuZ2VkKT1cIm9uV29ya2Zsb3dFdGF0RmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKGNvbWJvQm94TGFiZWxDaGFuZ2VkKT1cImNvbWJvQm94TGFiZWxDaGFuZ2VkKCRldmVudClcIj5cclxuICAgIDwvdHNpLXNlYXJjaC1ib3g+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhbGVuZGVyVmlldyA9PT0gZmFsc2UgJiYgX3Nob3dDYXJkVmlldyA9PT0gZmFsc2UgJiYgX3Nob3dLYW5iYW5WaWV3ID09PSBmYWxzZVwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICBcclxuICAgIDxwLXRhYmxlICNkdCBcclxuICAgICAgW2xhenldPVwiaXNHcmlkRGF0YVBhZ2VkSW5BcGlcIiBcclxuICAgICAgW2xhenlMb2FkT25Jbml0XT1cInNlYXJjaE9uSW5pdFwiIFxyXG4gICAgICBbdG90YWxSZWNvcmRzXT1cInBhZ2UudG90YWxDb3VudFwiIFxyXG4gICAgICBbbG9hZGluZ109XCJwYWdlLmxvYWRpbmdcIiBcclxuICAgICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiIFxyXG4gICAgICBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBcclxuICAgICAgW3ZhbHVlXT1cInBhZ2UuaXRlbXNcIlxyXG4gICAgICBbcGFnaW5hdG9yXT1cInRydWVcIiBcclxuICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIFxyXG4gICAgICBbKHJvd3MpXT1cInBhZ2UucGFnZVNpemVcIlxyXG4gICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBcclxuICAgICAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJmaWVsZHMoKVwiIFxyXG4gICAgICBbdGFibGVTdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnNTByZW0nIH1cIlxyXG4gICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIlsxLCAxMCwgMjUsIDUwXVwiIFxyXG4gICAgICBbc29ydE1vZGVdPVwic29ydE1vZGVcIlxyXG4gICAgICBbbXVsdGlTb3J0TWV0YV09XCJzb3J0TWV0YXNcIiBcclxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxyXG4gICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCIgXHJcbiAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIiBcclxuICAgICAgKG9uTGF6eUxvYWQpPVwibGF6eUxvYWQoJGV2ZW50KVwiXHJcbiAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKVwiXHJcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwib25TZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiIFxyXG4gICAgICAob25Sb3dTZWxlY3QpPVwib25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpXCJcclxuICAgICAgY29sdW1uUmVzaXplTW9kZT1cImV4cGFuZFwiIFxyXG4gICAgICBkYXRhS2V5PVwie3sga2V5IH19XCIgXHJcbiAgICAgIHNjcm9sbEhlaWdodD1cIjYwMHB4XCIgXHJcbiAgICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1ncmlkbGluZXNcIiBcclxuICAgICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cInt7ICdTaG93aW5nJyB8IGxvY2FsaXplIH19IHt7Z2V0Rmlyc3RFbGVtZW50SW5kZXgoKX19IHt7XHJcbiAgICAgICAgJ3RvJyB8IGxvY2FsaXplXHJcbiAgICAgIH19IHtsYXN0fSB7eyAnb2YnIHwgbG9jYWxpemUgfX0gXHJcbiAgICAgIHt0b3RhbFJlY29yZHN9IHt7ICdlbnRyaWVzJyB8IGxvY2FsaXplIH19XCIgXHJcbiAgICAgID5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPlxyXG4gICAgICAgICAgICB7eyBoZWFkZXIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMSBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0ZpbHRlckJ1dHRvblwiIHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfdG9nZ2xlX2hlYWRlcl9maWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW2ljb25dPVwiZmlsdGVySWNvblwiIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCJmaWx0ZXJUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgaG92ZXI6c2hhZG93LTYgcC1idXR0b24tcHJpbWFyeSBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUhlYWRlckZpbHRlcnMoKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0hlYWRlckZpbHRlcnNcIiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJncmlkX3RvZ2dsZV9oZWFkZXJfZmlsdGVyX21vZGVcIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbaWNvbl09XCJmaWx0ZXJNb2RlSWNvblwiIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiXHJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiZmlsdGVyTW9kZVRvb2x0aXBcIiBbc3R5bGVDbGFzc109XCInbWwtMSBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uLWljb24tb25seSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUhlYWRlckZpbHRlcnNNb2RlKClcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJncmlkX2NsZWFyX2ZpbHRlcl9idXR0b25cIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiBbdG9vbHRpcFRleHRdPVwiJ2ljb24tY2xlYXItZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwibWwtMSBwLWVsZW1lbnQgaG92ZXI6c2hhZG93LTYgcC1idXR0b24tcHJpbWFyeSBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xlYXJGaWx0ZXJzKClcIiBpY29uPVwicGkgcGktZXJhc2VyXCI+XHJcbiAgICAgICAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCIgcHJlc2VudGF0aW9uRGVzaWduZXJCYXNlPVwiZ3JpZF9leHBvcnRfYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1CdXR0b24gaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktZmlsZS1leGNlbFwiIChvbkNsaWNrKT1cImV4cG9ydEV4Y2VsKClcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1zdWNjZXNzIGhvdmVyOnNoYWRvdy02IG1sLTIgcC0xIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cIlhMU1wiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBjbGFzcz1cIm1sLTFcIiBbb3B0aW9uc109XCJjb2x1bW5zXCIgW25nTW9kZWxdPVwic2VsZWN0ZWRDb2x1bW5zXCIgb3B0aW9uTGFiZWw9XCJ0cmFuc2xhdGVkSGVhZGVyXCJcclxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0ge3sgJ2NvbHVtbnNfc2VsZWN0ZWQnIHwgbG9jYWxpemUgfX1cIiBbc3R5bGVdPVwieyAnbWluLXdpZHRoJzogJzE4MHB4JyB9XCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdjaG9vc2VfY29sdW1ucycgfCBsb2NhbGl6ZSB9fVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0ZWRDb2x1bW5zQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSA8ZGl2PiAtLT5cclxuICAgICAgICAgIDwhLS0gPGJ1dHRvbiAqbmdJZj1cInNob3dHbG9iYWxTZWFyY2hcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGljb249XCJwaSBwaS1zZWFyY2hcIiAoY2xpY2spPVwic2VhcmNoKClcIj48L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGggW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gZ2V0Q2hlY2tib3hTdHlsZSgpIDoge31cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnei0xJ1wiICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAjdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCIhKGNvbC5pc0J1dHRvbiAmJiBjb2wuYWN0aW9uRGlzcGxheSA9PSBhY3Rpb25QbGFjZW1lbnQuT3ZlcmZsb3cpXCJcclxuICAgICAgICAgICAgICBzY29wZT1cImNvbFwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBwVG9vbHRpcD1cInt7IGNvbC50b29sVGlwVGV4dCB8IGxvY2FsaXplIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cIighY29sLmlzQnV0dG9uIHx8ICFpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZCkgfHwgIShjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWSkpID8gXHJcbiAgICAgICAgICAgICAgY29sLmZpZWxkIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgW3BSZXNpemFibGVDb2x1bW5EaXNhYmxlZF09XCJjb2wuaXNCdXR0b24gfHwgY29sLnR5cGUgPT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCJjb2wuaXNCdXR0b24gfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpXCIgXHJcbiAgICAgICAgICAgICAgW3BSZW9yZGVyYWJsZUNvbHVtbkRpc2FibGVkXT1cImNvbC5pc0J1dHRvbiB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZClcIiBwUmVvcmRlcmFibGVDb2x1bW5cclxuICAgICAgICAgICAgICBwUmVzaXphYmxlQ29sdW1uIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA6IHt9XCJcclxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY29sdW1uXT1cImNvbC5pc0J1dHRvbiB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZCkgfHwgY29sLnR5cGUgPT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZXCIgXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xyXG4gICAgICAgICAgICAgICAgZ2V0SGVhZGVyQ2xhc3NDb2xvcihjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAoY29sLmlzQnV0dG9uIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKSkgPyAndy0xcmVtJyA6ICcnLFxyXG4gICAgICAgICAgICAgICAgKGNvbC5pc0J1dHRvbiB8fCBjb2wudHlwZSA9PT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVkgfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpKSA/ICdub24tcmVzaXphYmxlLWNvbHVtbicgOiAnJyxcclxuICAgICAgICAgICAgICAgIF1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA6IHt9XCI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RJblNwZWNpZmllZENvbHVtbihjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwicC0wIG0tMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNvbCBwLTAgbS0wXCIgW25nQ2xhc3NdPVwieyd3LTFyZW0nOiBjb2wuaXNCdXR0b259XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmhlYWRlciB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29sLWZpeGVkIHAtMCBtLTBcIiBzdHlsZT1cIndpZHRoOiAxcmVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgIT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMXJlbSBtLTAgcC0wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZD1cInt7IGNvbC5maWVsZCB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgIDx0ciAqbmdJZj1cInNob3dIZWFkZXJGaWx0ZXJzXCI+XHJcbiAgICAgICAgICA8IS0tIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6M3JlbVwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6M3JlbVwiPjwvdGg+IC0tPlxyXG4gICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICcnXCIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCI+PC90aD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmFjdGlvbkRpc3BsYXkgIT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93XCI+XHJcbiAgICAgICAgICAgICAgPHRoIHN0eWxlPVwib3ZlcmZsb3c6IGluaGVyaXRcIiBzY29wZT1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2wuaXNCdXR0b24gJiYgY29sLmZpZWxkICE9IG92ZXJmbG93Q29sdW1uRmllbGQgOyBlbHNlIGZpbHRlckxlc3NDb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sLnR5cGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEQVRFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImRpc3BsYXlUeXBlcy5EQVRFX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCInZGF0ZSdcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5EQVRFX0lTXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgI2NhbERhdGUgW25nTW9kZWxdPVwidmFsdWVcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cImZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiZmlsdGVyKGNhbERhdGUudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyQ2xpY2spPVwiZmlsdGVyKG51bGwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbHRlcihjYWxEYXRlLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gREFURVRJTUUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLkRBVEVUSU1FX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCInZGF0ZSdcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5EQVRFX0lTXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgI2NhbERhdGVUaW1lIFtuZ01vZGVsXT1cInZhbHVlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJmaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25CbHVyKT1cImZpbHRlcihjYWxEYXRlVGltZS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJmaWx0ZXIobnVsbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZmlsdGVyKGNhbERhdGVUaW1lLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ1VSUkVOQ1kgU09DSUVURSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiJ251bWVyaWMnXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFtkaXNwbGF5XT1cImNoYW5nZUhlYWRlckZpbHRlcnNNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCIgW21hdGNoTW9kZV09XCJmaWx0ZXJNYXRjaE1vZGUuRVFVQUxTXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0ICNjdXJyU29jaWV0ZUlucHV0IFtpbnB1dEZpZWxkXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbHRlcihjdXJyU29jaWV0ZUlucHV0LmlucHV0RmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ1VSUkVOQ1kgT1RIRVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCInbnVtZXJpYydcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5FUVVBTFNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLUlucHV0ICNjdXJyT3RoZXJJbnB1dCBbaW5wdXRGaWVsZF09XCJ2YWx1ZVwiIFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lPdGhlckNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiZmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZmlsdGVyKGN1cnJPdGhlcklucHV0LmlucHV0RmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIElOVEVHRVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIFt0eXBlXT1cIidudW1lcmljJ1wiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkVRVUFMU1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCIgbGV0LXZhbHVlIGxldC1maWx0ZXI9XCJmaWx0ZXJDYWxsYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciAjaW50ZWdlcklucHV0IFtpbnB1dEZpZWxkXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbHRlcihpbnRlZ2VySW5wdXQuaW5wdXRGaWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBERUNJTUFMIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImRpc3BsYXlUeXBlcy5ERUNJTUFMX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCInbnVtZXJpYydcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5FUVVBTFNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtSW5wdXQgI2RlY2ltYWxJbnB1dCBbaW5wdXRGaWVsZF09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJmaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWx0ZXIoZGVjaW1hbElucHV0LmlucHV0RmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUkFURSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiJ251bWVyaWMnXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFtkaXNwbGF5XT1cImNoYW5nZUhlYWRlckZpbHRlcnNNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCIgW21hdGNoTW9kZV09XCJmaWx0ZXJNYXRjaE1vZGUuRVFVQUxTXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLUlucHV0ICNyYXRlSW5wdXQgW2lucHV0RmllbGRdPVwidmFsdWVcIiBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJmaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWx0ZXIocmF0ZUlucHV0LmlucHV0RmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gREVGQVVMVCAodGV4dCwgYm9vbGVhbiwgb3IgYW55IHVuaGFuZGxlZCB0eXBlKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiY29sLmZpbHRlcklucHV0VHlwZVwiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb2wubnVtT2ZEZWNpbWFsXCIgW21heEZyYWN0aW9uRGlnaXRzXT1cImNvbC5udW1PZkRlY2ltYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5FUVVBTFNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmaWx0ZXJMZXNzQ29sdW1uPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICBcclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LWluZGV4PVwicm93SW5kZXhcIj5cclxuXHJcbiAgICAgICAgPCEtLSBDQVNFIDogbXVsdGlwbGUgc2VsZWN0aW9uIC0tPlxyXG4gICAgICAgIDx0ciBbbmdTdHlsZV09XCJpdGVtLmNvbG9yICYmIGl0ZW0uY29sb3IgIT09ICcnID8geydiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbS5jb2xvcn0gOiB7fVwiICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZTtcclxuICAgICAgICAgICAgZWxzZSBub3RNdWx0aXBsZVNlbGVjdGlvbk1vZGVCbG9ja1wiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LGl0ZW0pXCIgKGRyYWdlbnRlcik9XCJvbkRyYWdFbnRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIj5cclxuICAgICAgICAgIDx0ZCBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBnZXRDaGVja2JveFN0eWxlKCkgOiB7fVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPCEtLSA8dGQgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1wZW5jaWxcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdChpdGVtKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXRyYXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+IC0tPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgPHRkICAqbmdJZj1cIiEoY29sLmlzQnV0dG9uICYmIGNvbC5hY3Rpb25EaXNwbGF5ID09IGFjdGlvblBsYWNlbWVudC5PdmVyZmxvdylcIiBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBjb2wubmdTdHlsZSA6IHt9XCIgW25nQ2xhc3NdPVwicGFnZS5sb2FkaW5nID8gJ25vLXotaW5kZXgnIDogJydcIlxyXG4gICAgICAgICAgICAgID5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBzdHlsZT1cImhlaWdodDogbWluLWNvbnRlbnQ7IG1hcmdpbi1sZWZ0OiAtLjVyZW07XCIgLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dCAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lDb2RlXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkYXRlVGltZVBpY2tlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFVElNRV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIiBbc2hvd1RpbWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNIRUNLQk9YX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktQ2hlY2tib3gtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlciAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU5URUdFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmF0ZU91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvblwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlOZXN0ZWRQcm9wT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLk5FU1RFRF9QUk9QX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkaXNwbGF5U3RhdHVzQ29sb3JCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1EaXNwbGF5LU5lc3RlZC1Qcm9wIFtzb3VyY2VVcmxdPVwiY29sLmRpc3BsYXlOZXN0ZWRQcm9wZXJ0eVNvdXJjZVVybFwiIFtpZF09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5VmFsdWVdPVwiY29sLmRpc3BsYXlOZXN0ZWRQcm9wZXJ0eWxhYmVsRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktRGlzcGxheS1OZXN0ZWQtUHJvcD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c0NvbG9yQmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sb3I7IGVsc2UgZGlzcGxheVN0YXR1c1ZhbHVlQ29sdW1uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXdoaXRlIHRleHQtc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bY29sLmZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c1ZhbHVlQ29sdW1uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sdW1uVmFsdWU7IGVsc2UgZGlzcGxheVN0YXR1c0NvbHVtbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tPHAtdGFnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSAmJiBnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KGl0ZW1bY29sLmZpZWxkXSkgYXMgb3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSBmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJvcHQuY29sb3JIZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJvcHQuY29sb3JIZXggPyAnd2hpdGUnIDogJ2JsYWNrJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ibGFjayBiZy13aGl0ZSc6ICFvcHQuY29sb3JIZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXdoaXRlJzogb3B0LmNvbG9ySGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0LnRyYW5zbGF0ZWRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgJiYgIWdldFN0YXR1c09wdGlvbkZvclN0YXR1c0hpc3RvcnkoaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LXN0YXR1cy1jb2x1bW4gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzQ29sdW1uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sdW1uOyBlbHNlIGRpc3BsYXlCdXR0b25CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLTxwLXRhZyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiZ2V0U3RhdHVzQ29sb3IoaXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWc+LS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGEgJiYgZ2V0U3RhdHVzT3B0aW9uKGl0ZW1bY29sLmZpZWxkXSkgYXMgb3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImxpZ2h0ZW5Db2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0UmVhZGFibGVUZXh0Q29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctdG9wXT1cIicwLjFyZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQudHJhbnNsYXRlZExhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhICYmICFnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktbmVzdGVkLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5QnV0dG9uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzQnV0dG9uOyBlbHNlIGRpc3BsYXlJbWFnZVwiID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBmcm96ZW4tY29sdW1uLXJ0bC1tb2RlIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gIFtzdHlsZUNsYXNzXT1cImNvbC5zdHlsZUNsYXNzXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwie3sgY29sLmJ1dHRvbkljb24gfX1cIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiBbdG9vbHRpcFRleHRdPVwiY29sLnRvb2xUaXBUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNvbC5idXR0b25MYWJlbCA/IGNvbC5idXR0b25MYWJlbCA6IGl0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChpdGVtLCBjb2wuZmllbGQpXCIgPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktaW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5SW1hZ2U+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVk7IGVsc2UgZGlzcGxheUljb25CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0ycmVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRzaS1pbWFnZS1kaXNwbGF5IFtoZWFkZXJUaXRsZXNdPVwiZ2V0SGVhZGVyVGl0bGVzKGNvbC5oZWFkZXJUaXRsZXMsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpc1JvdW5kZWRdPVwiY29sLmlzUm91bmRlZFwiIFtzcmNdPVwiaXRlbVtjb2wuZmllbGRdXCIgW2FsdF09XCJjb2wuaGVhZGVyIHx8ICdpbWFnZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90c2ktaW1hZ2UtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktaWNvbiAoZmlsZS10eXBlIGxvZ28pIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheUljb25CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSUNPTl9ESVNQTEFZOyBlbHNlIGRpc3BsYXlUZXh0RXllQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW1bY29sLmZpZWxkXVwiIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJnZXRGaWxlVHlwZUljb25DbGFzcyhpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRGaWxlVHlwZUljb25Db2xvcihpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxLjI1cmVtXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW1bY29sLmZpZWxkXSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktdGV4dC1leWUgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5VGV4dEV5ZUJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5URVhUX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBtb3JlQWN0aW9uc0Jsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gbW9yZSBhY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21vcmVBY3Rpb25zQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZCA9PSBvdmVyZmxvd0NvbHVtbkZpZWxkOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1tZW51IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgI21lbnVNb3JlQWN0aW9ucyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIm92ZXJmbG93QWN0aW9uc01lbnVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwib3ZlcmZsb3ctbWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwcHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW1lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcC1tZW51aXRlbS1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLnN0eWxlQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3ZlcmZsb3dBY3Rpb25DbGlja2VkKGl0ZW0sIG1lbnVJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51SXRlbS5pZCA9PT0gJ25vdGVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgbWVudUl0ZW0uaWNvbkNsYXNzIH19IHAtbWVudWl0ZW0taWNvbiBiYWRnZS1pY29uIGhhcy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLmljb25TdHlsZUNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhZGdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5PVwiZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0ubm90ZXNDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWRnZURpc2FibGVkXT1cIml0ZW0ubm90ZXNDb3VudCA9PSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkZ2VQb3NpdGlvbj1cInRvcC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWVudUl0ZW0uaWQgIT09ICdub3RlcydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7bWVudUl0ZW0uaWNvbkNsYXNzfX0gcC1tZW51aXRlbS1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWVudUl0ZW0ubGFiZWwgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwie3tjb2wuYnV0dG9uSWNvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwie3tjb2wuc3R5bGVDbGFzc319IG92ZXJmbG93LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib3ZlcmZsb3dDb2x1bW5DbGlja2VkKG1lbnVNb3JlQWN0aW9ucywgJGV2ZW50LCBpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtYnV0dG9uPiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEcmFnT3ZlclwiIFtuZ1N0eWxlXT1cInsgbGVmdDogbWVzc2FnZVBvc2l0aW9uLnggKyAncHgnLCB0b3A6IG1lc3NhZ2VQb3NpdGlvbi55ICsgJ3B4JyB9XCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctbWVzc2FnZSBjdXJzb3ItZm9sbG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgXCJKb2ludHVyZVwiIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICA8IS0tIENBU0UgOiBzaW5nbGUgb3Igbm9uZSBzZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3RNdWx0aXBsZVNlbGVjdGlvbk1vZGVCbG9jaz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDx0ciBbbmdTdHlsZV09XCJpdGVtLmNvbG9yICYmIGl0ZW0uY29sb3IgIT09ICcnID8geydiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbS5jb2xvcn0gOiB7fVwiXHJcbiAgICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93XT1cIml0ZW1cIiBbcFNlbGVjdGFibGVSb3dJbmRleF09XCJpbmRleFwiIGlkPVwidHNpLWdyaWQtcm93LXt7aW5kZXh9fVwiPlxyXG5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiEoY29sLmlzQnV0dG9uICYmIGNvbC5hY3Rpb25EaXNwbGF5ID09IGFjdGlvblBsYWNlbWVudC5PdmVyZmxvdylcIiBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBjb2wubmdTdHlsZSA6IHt9XCIgXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBtaW4tY29udGVudDtcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ3ctMXJlbSc6IGNvbC5pc0J1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICAnYmctd2hpdGUnOiBjb2wuaXNCdXR0b25cclxuICAgICAgICAgICAgICAgICAgfVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgIGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0ZVBpY2tlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5Q29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkYXRlVGltZVBpY2tlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlVGltZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVUSU1FX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtzaG93VGltZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DSEVDS0JPWF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ERUNJTUFMX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByYXRlT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlJBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLk5FU1RFRF9QUk9QX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGlzcGxheVN0YXR1c0NvbG9yQmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1EaXNwbGF5LU5lc3RlZC1Qcm9wIFtzb3VyY2VVcmxdPVwiY29sLmRpc3BsYXlOZXN0ZWRQcm9wZXJ0eVNvdXJjZVVybFwiIFtpZF09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVZhbHVlXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlsYWJlbEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EaXNwbGF5LU5lc3RlZC1Qcm9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzQ29sb3JCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sb3I7IGVsc2UgZGlzcGxheVN0YXR1c1ZhbHVlQ29sdW1uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIHJvdW5kZWQgdGV4dC13aGl0ZSB0ZXh0LXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzVmFsdWVDb2x1bW5CbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW5WYWx1ZTsgZWxzZSBkaXNwbGF5U3RhdHVzQ29sdW1uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cC10YWcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImdldFN0YXR1c0NvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5ICYmIGdldFN0YXR1c09wdGlvbkZvclN0YXR1c0hpc3RvcnkoaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIGZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIm9wdC5jb2xvckhleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5jb2xvckhleCA/ICd3aGl0ZScgOiAnYmxhY2snXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWJsYWNrIGJnLXdoaXRlJzogIW9wdC5jb2xvckhleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtd2hpdGUnOiBvcHQuY29sb3JIZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQudHJhbnNsYXRlZExhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSAmJiAhZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSBmb250LWJvbGQgc3RhdHVzLWJhZGdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1zdGF0dXMtcHJvcCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzQ29sdW1uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbHVtbjsgZWxzZSBkaXNwbGF5QnV0dG9uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxwLXRhZyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImdldFN0YXR1c0NvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz4tLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhICYmIGdldFN0YXR1c09wdGlvbihpdGVtW2NvbC5maWVsZF0pIGFzIG9wdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YXR1cy1iYWRnZSBmb250LWJvbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwibGlnaHRlbkNvbG9yKG9wdC5jb2xvckhleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFJlYWRhYmxlVGV4dENvbG9yKG9wdC5jb2xvckhleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctdG9wXT1cIicwLjFyZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWJvdHRvbV09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0LnRyYW5zbGF0ZWRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YSAmJiAgIWdldFN0YXR1c09wdGlvbihpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWJhZGdlIGZvbnQtYm9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5QnV0dG9uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc0J1dHRvbjsgZWxzZSBkaXNwbGF5SW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLm5nU3R5bGUgOiB7fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmcm96ZW4tY29sdW1uLXJ0bC1tb2RlIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtzdHlsZUNsYXNzXT1cImNvbC5zdHlsZUNsYXNzXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJ7eyBjb2wuYnV0dG9uSWNvbiB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgW3Rvb2x0aXBUZXh0XT1cImNvbC50b29sVGlwVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbkNsaWNrZWQoaXRlbSwgY29sLmZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiY29sLmlzSWNvbkJ1dHRvbiA/ICcnIDogKGNvbC5idXR0b25MYWJlbCA/PyBpdGVtW2NvbC5maWVsZF0pXCI+PC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LWltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlJbWFnZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVk7IGVsc2UgZGlzcGxheUljb25CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMnJlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHNpLWltYWdlLWRpc3BsYXkgW2hlYWRlclRpdGxlc109XCJnZXRIZWFkZXJUaXRsZXMoY29sLmhlYWRlclRpdGxlcywgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1JvdW5kZWRdPVwiY29sLmlzUm91bmRlZFwiIFtzcmNdPVwiaXRlbVtjb2wuZmllbGRdXCIgW2FsdF09XCJjb2wuaGVhZGVyIHx8ICdpbWFnZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RzaS1pbWFnZS1kaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktaWNvbiAoZmlsZS10eXBlIGxvZ28pIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlJY29uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JQ09OX0RJU1BMQVk7IGVsc2UgZGlzcGxheVRleHRFeWVCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW1bY29sLmZpZWxkXVwiIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZ2V0RmlsZVR5cGVJY29uQ2xhc3MoaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldEZpbGVUeXBlSWNvbkNvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxLjI1cmVtXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtW2NvbC5maWVsZF0gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS10ZXh0LWV5ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5VGV4dEV5ZUJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlRFWFRfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBtb3JlQWN0aW9uc0Jsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHBpIHBpLWV5ZVwiIChjbGljayk9XCJleWVDbGlja2VkKGl0ZW1bY29sLmZpZWxkXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRydW5jYXRlU3RyaW5nKGl0ZW1bY29sLmZpZWxkXSwgNTApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIG1vcmUgYWN0aW9ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtb3JlQWN0aW9uc0Jsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuZmllbGQgPT0gb3ZlcmZsb3dDb2x1bW5GaWVsZDsgZWxzZSBkZWZhdWx0VGV4dE91dHB1dEJsb2NrXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtbWVudSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNtZW51TW9yZUFjdGlvbnMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJvdmVyZmxvd0FjdGlvbnNNZW51XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3B1cF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cIm92ZXJmbG93LW1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyAnd2lkdGgnOiAnYXV0bycsICdtaW4td2lkdGgnOiAnMHB4JyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1tZW51SXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtbWVudWl0ZW0tbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5zdHlsZUNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk92ZXJmbG93QWN0aW9uQ2xpY2tlZChpdGVtLCBtZW51SXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWVudUl0ZW0uaWQgPT09ICdub3RlcydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7IG1lbnVJdGVtLmljb25DbGFzcyB9fSBwLW1lbnVpdGVtLWljb24gYmFkZ2UtaWNvbiBoYXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5pY29uU3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYWRnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eT1cImRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLm5vdGVzQ291bnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFkZ2VEaXNhYmxlZF09XCJpdGVtLm5vdGVzQ291bnQgPT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZGdlUG9zaXRpb249XCJ0b3AtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVJdGVtLmlkICE9PSAnbm90ZXMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e21lbnVJdGVtLmljb25DbGFzc319IHAtbWVudWl0ZW0taWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLmljb25TdHlsZUNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1lbnVJdGVtLmxhYmVsIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3AtbWVudT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInt7Y29sLmJ1dHRvbkljb259fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInt7Y29sLnN0eWxlQ2xhc3N9fSBvdmVyZmxvdy1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm92ZXJmbG93Q29sdW1uQ2xpY2tlZChtZW51TW9yZUFjdGlvbnMsICRldmVudCwgaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWJ1dHRvbj4gIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj48L3RkPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBzZWxlY3RlZENvbHVtbnNcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwicHItMFwiICpuZ0lmPVwiIShjb2wuaXNCdXR0b24gJiYgY29sLmFjdGlvbkRpc3BsYXkgPT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93KVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuc2hvd1N1bW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJTlRFR0VSX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFJBVEVfRElTUExBWSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uID8/IGZhbHNlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBERUNJTUFMX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+ICBcclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICBcclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgICB7eyBwYWdlLnRvdGFsQ291bnQgfX0ge3sgXCJyZWNvcmRzX2xhYmVsXCIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29sb3JmdWxcIj5cclxuICAgICAgICAgIDxzcGFuPlZpZXcgR3JpZDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPnwgU2VhcmNoT25Jbml0IDoge3sgc2VhcmNoT25Jbml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+fCBQYWdpbmF0aW9uIEluIEFwaSA6IHt7IGlzR3JpZERhdGFQYWdlZEluQXBpIH19PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC10YWJsZT5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhbGVuZGVyVmlldyA9PT0gdHJ1ZVwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8dHNpLWNhbGVuZGVyIFxyXG4gIFtzY2hlbWFdPVwiY2FsZW5kZXJTY2hlbWFcIiBcclxuICBbZXZlbnRzRGF0YV09XCJwYWdlLml0ZW1zXCIgXHJcbiAgW2NydWRTZXJ2aWNlXT1cImNydWRTZXJ2aWNlXCJcclxuICBbc2hvd0luZm9CdXR0b25dPVwic2hvd0luZm9CdXR0b25cIlxyXG4gIFtzaG93RG93bmxvYWRCdXR0b25dPVwic2hvd0Rvd25sb2FkQnV0dG9uXCJcclxuICBbc2hvd1VwbG9hZEJ1dHRvbl09XCJzaG93VXBsb2FkQnV0dG9uXCJcclxuICBbc2hvd05vdGVCdXR0b25dPVwic2hvd05vdGVCdXR0b25cIlxyXG4gIFtzaG93QWN0aW9uQnV0dG9uXT1cInNob3dBY3Rpb25CdXR0b25cIlxyXG4gIChkYXRlUmFuZ2VDaGFuZ2UpPVwiaGFuZGxlRGF0ZVJhbmdlQ2hhbmdlKCRldmVudClcIiBcclxuICAoZXZlbnRDbGljayk9XCJoYW5kbGVDYWxlbmRhckV2ZW50Q2xpY2soJGV2ZW50KVwiPlxyXG48L3RzaS1jYWxlbmRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93Q2FyZFZpZXcgPT09IHRydWVcIiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgPFRzaS1jYXJkLWxpc3QgW2NhcmRCdXNpbmVzc0NsYXNzXT1cImJ1c2luZXNzQ2xhc3NcIiBbaWRdPVwiaWRcIiAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25Db2x1bW5DbGlja2VkLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIFtwYWdlJF09XCJwYWdlJFwiIFtwYWdlXT1cInBhZ2VcIiAoY2FsbFNlYXJjaCk9XCJjYWxsU2VhcmNoSGFuZGxlcigkZXZlbnQpXCJbc2VsZWN0S2V5T25seV09XCJzZWxlY3RLZXlPbmx5XCIgW2tleV09XCJrZXlcIiBbb3ZlcmZsb3dBY3Rpb25zTWVudV09XCJvdmVyZmxvd0FjdGlvbnNNZW51XCI+XHJcbiAgICA8L1RzaS1jYXJkLWxpc3Q+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0thbmJhblZpZXcgPT09IHRydWUgJiYgIV9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0XCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2kta2FuYmFuIFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiIFtjcnVkU2VydmljZV09XCJjcnVkU2VydmljZVwiXHJcbiAgICAgIFtzZWxlY3RLZXlPbmx5XT1cInNlbGVjdEtleU9ubHlcIiBba2V5XT1cImtleVwiIFtvdmVyZmxvd0FjdGlvbnNNZW51XT1cIm92ZXJmbG93QWN0aW9uc01lbnVcIj5cclxuICAgIDwvVHNpLWthbmJhbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93S2FuYmFuVmlldyA9PT0gdHJ1ZSAmJiBfc2hvd0thbmJhblZpZXdPZldvcmtGbG93RXRhdFwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8VHNpLWthbmJhbi13b3JrZmxvdy1ldGF0IFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgW2Rlc2NyaW1pbmF0b3JWYWx1ZV09XCJkZXNjcmltaW5hdG9yVmFsdWVcIiAoY2FsbFNlYXJjaCk9XCJjYWxsU2VhcmNoSGFuZGxlcigkZXZlbnQpXCI+XHJcbiAgICA8L1RzaS1rYW5iYW4td29ya2Zsb3ctZXRhdD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImlzQWR2YW5jZWRTZWFyY2ggJiYgc2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICA8VHNpLU1vZGFsLUZvb3RlciBbc2hvd1NhdmVBbmRDbG9zZUJ1dHRvbl09XCJmYWxzZVwiIChvblNhdmVDbGljayk9XCJvbkNvbmZpcm1TZWxlY3Rpb24oKVwiIChvbkNhbmNlbENsaWNrKT1cIm9uQ2FuY2VsU2VsZWN0aW9uKClcIiAvPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
2004
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLWdlbmVyaWMtZ3JpZC90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktZ2VuZXJpYy1ncmlkL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRixPQUFPLEVBQWlCLFNBQVMsRUFBdUIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUF1RixNQUFNLGFBQWEsQ0FBQztBQUduSSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZMLE9BQU8sRUFBRSwrQkFBK0Is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eEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBV0csY0FBYztzQkFBdEIsS0FBSztnQkFHTyxZQUFZO3NCQUF4QixLQUFLO2dCQUtPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBS08sNEJBQTRCO3NCQUF4QyxLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFhRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQVFGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsVUFBVTtzQkFEYixLQUFLO2dCQWFJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbnZpcm9ubWVudEluamVjdG9yLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNZXRhZGF0YSwgTWVudUl0ZW0sIE1lbnVJdGVtQ29tbWFuZEV2ZW50LCBQcmltZU5HQ29uZmlnLCBTb3J0TWV0YSwgVGFibGVTdGF0ZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IFRhYmxlLCBUYWJsZUhlYWRlckNoZWNrYm94LCBUYWJsZUxhenlMb2FkRXZlbnQsIFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJ0bE1vZGVLZXlzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RzL2xvY2Fscy5jb25zdCc7XHJcbmltcG9ydCB7IERlZmF1bHRTb2NpZXRlRGV2aXNlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RzL3RzaS1jb25zdHMnO1xyXG5pbXBvcnQgeyBEaXNwbGF5VHlwZUNvbG9ycywgRGlzcGxheVR5cGVzLCBGaWx0ZXJPcGVyYXRvclR5cGUsIEdyaWRTZWxlY3Rpb25Nb2RlLCBHcmlkU29ydE1vZGUsIElucHV0VHlwZXMsIE1vZGFsU2l6ZUVudW0sIE51bWVyaWNEaXNwbGF5VHlwZXMsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgb3BlblRzaVBvcHVwVGV4dFZpZXdlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9tb2RhbC1vcGVuLmZ1bmN0aW9uJztcclxuaW1wb3J0IHsgQnV0dG9uQ2xpY2tSZXN1bHQsIERpY3Rpb25hcnksIEdyaWRDb2x1bW4sIElGaWx0ZXJlZFJlcXVlc3QsIElHcmlkQ29uZmlndXJhdGlvbiwgSVBhZ2UsIElQYWdlZFJlcXVlc3QsIElQYWdlZFJlc3BvbnNlLCBJU29ydEJ5UHJvcHJldHksIElTb3J0TWV0YSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBGaWNoaWVyLCBQcmVzZW50YXRpb25TZXR0aW5nLCBTZWFyY2hGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEVudGl0eUluZm8gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZW50aXR5LWluZm8vZW50aXR5LWluZm8nO1xyXG5pbXBvcnQgeyBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3N0YXR1cy9jb2xvci1zdGF0dXMnO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgTGF5b3V0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9uL2FwcC5sYXlvdXQuc2VydmljZSc7XHJcbmltcG9ydCB7IENydWRCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Jhc2UvY3J1ZC1iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWNoaWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpY2hpZXIvZmljaGllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHRtbFRlbXBsYXRlR2VuZXJhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dlbmVyYXRvci9odG1sLXRlbXBsYXRlLWdlbmVyYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xheW91dC9sYXlvdXQtaGVscGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vZXJyb3ItcmVzcG9uc2UtbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcHBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy9hcHAtc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFN0YXR1c0NvbG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0YXR1cy9zdGF0dXMtY29sb3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IEV4cG9ydEV4Y2VsSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZXhwb3J0LWV4Y2VsLmhlbHBlcic7XHJcbmltcG9ydCB7IEZpbHRlckhlbHBlciB9IGZyb20gJy4uLy4uLy4uL3RzaS1oZWxwZXJzL2ZpbHRlci1oZWxwZXInO1xyXG5pbXBvcnQgeyBDb2x1bW5XaWR0aENvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9jb2x1bW4td2lkdGguY29udHJvbGxlcic7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQgeyBBY3Rpb25QbGFjZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9hY3Rpb24tcGxhY2VtZW50JztcclxuaW1wb3J0IHsgR3JpZFNpemluZ01vZGUgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9ncmlkLXNpemluZy1tb2RlJztcclxuaW1wb3J0IHsgRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kcm9wZG93bi9kcm9wZG93bi1leHRlcm5hbC1zZWxlY3Rpb24tb3V0cHV0JztcclxuaW1wb3J0IHsgRXZlbnRTY2hlbWEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY29tbW9uL2V2ZW50LXNjaGVtYSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1HZW5lcmljLUdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dCcsIFtcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJyonLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSdcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnb3V0Jywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJzBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yMHB4KSdcclxuICAgICAgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdpbiA8PT4gb3V0JywgYW5pbWF0ZSgnNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSknKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpR2VuZXJpY0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvdmVyZmxvd0NvbHVtbkZpZWxkID0gJ292ZXJmbG93LWNvbHVtbi1maWVsZCc7XHJcblxyXG4gIEBJbnB1dCgpIGN1ZENvbXBvbmVudDogYW55O1xyXG4gIEBJbnB1dCgpIG1vZGFsU2l6ZTogYW55O1xyXG4gIEBJbnB1dCgpIHNob3dJbmZvQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0Rvd25sb2FkQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1VwbG9hZEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dOb3RlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBGaWxsIChkZWZhdWx0KTogdGhlIHRhYmxlIHN0cmV0Y2hlcyB0byBmaWxsIGl0cyBjb250YWluZXIgYW5kIGF1dG8gY29sdW1ucyBzaGFyZSB0aGVcclxuICAgKiBsZWZ0b3ZlciBzcGFjZS4gSHVnOiB0aGUgdGFibGUgc2hyaW5rcyB0byBpdHMgY29sdW1ucycgc2l6ZSAobmV2ZXIgd2lkZXIgdGhhbiB0aGVcclxuICAgKiBjb250YWluZXIpLCBzbyBsZWZ0b3ZlciB3aWR0aCBzdGF5cyBlbXB0eSByYXRoZXIgdGhhbiBpbmZsYXRpbmcgY29sdW1ucy5cclxuICAgKi9cclxuICBASW5wdXQoKSBzaXppbmdNb2RlOiBHcmlkU2l6aW5nTW9kZSA9IEdyaWRTaXppbmdNb2RlLkZpbGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNpemluZyBzdHlsZSBib3VuZCB0byB0aGUgcC10YWJsZSdzIGBbdGFibGVTdHlsZV1gLiBUaGlzIGlzIHRoZSBzaW5nbGUgbGV2ZXIgdGhhdFxyXG4gICAqIGRpc3Rpbmd1aXNoZXMgRmlsbCBmcm9tIEh1ZyAoc2VlIEdyaWRTaXppbmdNb2RlKSDigJQgZXZlcnl0aGluZyBlbHNlIChwZXItY29sdW1uIHdpZHRocyxcclxuICAgKiB3cmFwcGluZykgaXMgaWRlbnRpY2FsIGJldHdlZW4gbW9kZXMuIEFwcGxpZWQgaW5saW5lIG9uIHRoZSB0YWJsZSBQcmltZU5HIG93bnMsIHNvIGl0XHJcbiAgICogYmVhdHMgUHJpbWVORydzIGRlZmF1bHQgYC5wLWRhdGF0YWJsZS10YWJsZSB7IHdpZHRoOiAxMDAlIH1gIHdpdGggbm8gYCFpbXBvcnRhbnRgL2A6Om5nLWRlZXBgLlxyXG4gICAqIC0gRmlsbDoga2VlcCB0aGUgNTByZW0gZmxvb3IgYW5kIGxldCB0aGUgdGFibGUgZmlsbCBpdHMgY29udGFpbmVyICh3aWR0aCBkZWZhdWx0cyB0byAxMDAlKS5cclxuICAgKiAtIEh1ZzogYHdpZHRoOmF1dG9gIHNocmlua3MgdGhlIHRhYmxlIHRvIGl0cyBjb2x1bW5zOyBgbWluLXdpZHRoOjBgIGRyb3BzIHRoZSBmbG9vciBzbyBhXHJcbiAgICogICBuYXJyb3cgdGFibGUgaXNuJ3Qgc3R1Y2sgYXQgNTByZW07IGBtYXgtd2lkdGg6MTAwJWAga2VlcHMgaXQgaW5zaWRlIHRoZSBwYWdlIChvdmVyZmxvdyBzY3JvbGxzKS5cclxuICAgKlxyXG4gICAqIEh1ZyArIGBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCJgOiBkcmFnZ2luZyBhIGNvbHVtbiByZXNpemVzIHRoYXQgY29sdW1uIChQcmltZU5HJ3NcclxuICAgKiBwZXItY29sdW1uIGAhaW1wb3J0YW50YCBydWxlcyBzdGlsbCB3aW4pLCBidXQgYHdpZHRoOmF1dG9gIGlzIHJlLWFzc2VydGVkIG9uIGNoYW5nZVxyXG4gICAqIGRldGVjdGlvbiwgc28gdGhlIHRhYmxlIGl0c2VsZiBuZXZlciBleHBhbmRzIHBhc3QgaXRzIGNvbnRlbnQg4oCUIGl0IHN0YXlzIGh1Z2dlZCBieSBkZXNpZ24uXHJcbiAgICovXHJcbiAgZ2V0IHRhYmxlU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXppbmdNb2RlID09PSBHcmlkU2l6aW5nTW9kZS5IdWdcclxuICAgICAgPyB7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwJywgJ21heC13aWR0aCc6ICcxMDAlJyB9XHJcbiAgICAgIDogeyAnbWluLXdpZHRoJzogJzUwcmVtJyB9O1xyXG4gIH1cclxuICBAT3V0cHV0KCkgb25TYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGZpbHRlck1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZTtcclxuICB0b29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb247XHJcbiAgaXNBcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBhc3luYyBleWVDbGlja2VkKHRleHQ6IGFueSkge1xyXG5cclxuICAgIGxldCBtb2RhbFNpemUgPSBNb2RhbFNpemVFbnVtLkV4dHJhTGFyZ2U7XHJcbiAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgZGF0YTogdGV4dCxcclxuICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgIHdpZHRoOiBtb2RhbFNpemUud2lkdGgsXHJcbiAgICAgIGhlaWdodDogbW9kYWxTaXplLmhlaWdodFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9kaWFsb2dSZWYgPSBhd2FpdCBvcGVuVHNpUG9wdXBUZXh0Vmlld2VyQ29tcG9uZW50KHRoaXMuX2luamVjdG9yLCBjb25mKTtcclxuXHJcbiAgICB0aGlzLl9kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHZhbD86IGFueSkgPT4gdGhpcy5fY2xvc2VNb2RhbCh2YWwpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nsb3NlTW9kYWwodmFsPzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZj8uZGVzdHJveSgpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fZGlhbG9nUmVmPy5kZXN0cm95KClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRydW5jYXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSA1MCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsaW1pdCA/IHZhbHVlLnN1YnN0cigwLCBsaW1pdCkgKyAnLi4uJyA6IHZhbHVlO1xyXG4gIH1cclxuICAvLyNyZWdpb24gbG9jYWwgdmFyc1xyXG4gIEBWaWV3Q2hpbGQoXCJkdFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGR0OiBUYWJsZSB8IHVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKFwidGFibGVIZWFkZXJDaGVja2JveFwiKSB0YWJsZUhlYWRlckNoZWNrYm94OiBUYWJsZUhlYWRlckNoZWNrYm94IHwgdW5kZWZpbmVkXHJcbiAgZmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcm93cyA9IDE7XHJcbiAgZGlzcGxheVR5cGVzID0gRGlzcGxheVR5cGVzO1xyXG4gIGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBzdW1tYXJpZXM6IERpY3Rpb25hcnk8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbiAgaXNSdGxNb2RlOiBib29sZWFuID0gZmFsc2VcclxuICBpc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgbWVzc2FnZVBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XHJcbiAgcHJpdmF0ZSBkcmFnRW50ZXJDb3VudCA9IDA7XHJcbiAgLy8gcHJpdmF0ZSBfc2VhcmNoQm94RmlsdGVyczogQXJyYXk8RmlsdGVyQnlQcm9wcmV0eT4gPSBbXTtcclxuICAvLyBwcml2YXRlIF9ncmlkSGVhZGVyRmlsdGVyczogQXJyYXk8RmlsdGVyQnlQcm9wcmV0eT4gPSBbXTtcclxuICBwcml2YXRlIF9zZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9zZWFyY2hCb3hGaWx0ZXJzOiBBcnJheTxJRmlsdGVyZWRSZXF1ZXN0PiA9IFtdO1xyXG4gIHByaXZhdGUgX2dyaWRIZWFkZXJGaWx0ZXJzOiBBcnJheTxJRmlsdGVyZWRSZXF1ZXN0PiA9IFtdO1xyXG4gIHByaXZhdGUgX3NvcnQ6IEFycmF5PElTb3J0QnlQcm9wcmV0eT4gPSBbXTtcclxuICBzb3J0TWV0YXM6IFNvcnRNZXRhW10gPSBbXTtcclxuICBzZWxlY3RlZEZ1bGxJdGVtcz86IEFycmF5PGFueT4gPSBbXTtcclxuICBzZWxlY3Rpb246IGFueTtcclxuICBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGU7XHJcbiAgcHJpdmF0ZSBfZGlhbG9nUmVmPzogRHluYW1pY0RpYWxvZ1JlZjtcclxuICAvL2pzb25TdHJpbmdMYXlvdXQ6IHN0cmluZyA9ICd7XCJmaXJzdFwiOjAsXCJyb3dzXCI6MTAsXCJtdWx0aVNvcnRNZXRhXCI6W10sXCJjb2x1bW5XaWR0aHNcIjpcIlwiLFwidGFibGVXaWR0aFwiOlwiMTE4OHB4XCIsXCJjb2x1bW5PcmRlclwiOltcIlwiXX0nO1xyXG4gIGxhdGVzdEZpbHRlcnM/OiBJRmlsdGVyZWRSZXF1ZXN0W107XHJcbiAgaXNBZHZhbmNlZFNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBwcml2YXRlIF9wYWdlIDogSVBhZ2U8YW55PiA9IHtcclxuICAvLyAgIGl0ZW1zOiBbXSxcclxuICAvLyAgIHRvdGFsQ291bnQ6IDAsXHJcbiAgLy8gICBzdW1tYXJpZXM6IFtdLFxyXG4gIC8vICAgdG90YWxQYWdlczogMCxcclxuICAvLyAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgLy8gICBwYWdlU2l6ZTogMTAsXHJcbiAgLy8gICBsb2FkaW5nOiBmYWxzZVxyXG4gIC8vIH07XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBASW5wdXQoKSBmb3JtTmFtZT86IHN0cmluZztcclxuICBASW5wdXQoKSBpZD86IHN0cmluZztcclxuICBASW5wdXQoKSBwYWdlZFJlcXVlc3Q/OiBJUGFnZWRSZXF1ZXN0O1xyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYXRpb24/OiBJR3JpZENvbmZpZ3VyYXRpb247XHJcblxyXG4gIHByaXZhdGUgX3BhZ2U6IElQYWdlPGFueT4gPSB7XHJcbiAgICBpdGVtczogW10sXHJcbiAgICB0b3RhbENvdW50OiAwLFxyXG4gICAgc3VtbWFyaWVzOiBbXSxcclxuICAgIHRvdGFsUGFnZXM6IDAsXHJcbiAgICBwYWdlTnVtYmVyOiAxLFxyXG4gICAgcGFnZVNpemU6IDEwLFxyXG4gICAgbG9hZGluZzogZmFsc2VcclxuICB9O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBwYWdlKHZhbHVlOiBJUGFnZTxhbnk+KSB7XHJcbiAgICB0aGlzLl9wYWdlID0gdmFsdWU7XHJcblxyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFnZSgpOiBJUGFnZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlO1xyXG4gIH1cclxuICAvLyAobmV3UGFnZTogSVBhZ2U8YW55Pil7XHJcbiAgLy8gICBpZihuZXdQYWdlKXtcclxuICAvLyAgICAgdGhpcy5fcGFnZSA9IG5ld1BhZ2U7XHJcbiAgLy8gICAgIHRoaXMuX2V4dHJhY3RTdW1tYXJpZXMoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgLy8gZ2V0IHBhZ2UoKXtcclxuICAvLyAgIHJldHVybiB0aGlzLl9wYWdlO1xyXG4gIC8vIH1cclxuICBASW5wdXQoKSBrZXk6IHN0cmluZyA9ICd1aWQnO1xyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdGVtcENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgdGVtcFNlYXJjaEZpZWxkczogQXJyYXk8U2VhcmNoRmllbGQ+ID0gW107XHJcbiAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8R3JpZENvbHVtbj4gPSBbXTtcclxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGNvbHVtbnModmFsdWU6IEFycmF5PEdyaWRDb2x1bW4+IHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5fY29sdW1ucyA9IHZhbHVlO1xyXG4gICAgICB0aGlzLmluaXRpYWxDb2x1bW5zUHJvY2VzcygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8R3JpZENvbHVtbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcclxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGlzU2VhcmNoQnV0dG9uRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzU2VhcmNoQnV0dG9uRGlzYWJsZWQgPSB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc1NlYXJjaEJ1dHRvbkRpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzU2VhcmNoQnV0dG9uRGlzYWJsZWRcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGZpbHRlcmVkQ29sdW1uczogQXJyYXk8R3JpZENvbHVtbj4gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgZ3JpZERhdGE/OiBBcnJheTxhbnk+O1xyXG5cclxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpIHBhcmVudDogYW55O1xyXG5cclxuICBASW5wdXQoKSBzaG93U2VhcmNoQm94OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkNvbHVtbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dIZWFkZXJGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0ZpbHRlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfaXNHcmlkRGF0YVBhZ2VkSW5BcGk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBpc0dyaWREYXRhUGFnZWRJbkFwaSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNHcmlkRGF0YVBhZ2VkSW5BcGkgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBpc0dyaWREYXRhUGFnZWRJbkFwaSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0dyaWREYXRhUGFnZWRJbkFwaTtcclxuICB9XHJcbiAgQElucHV0KCkgaGVhZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBTaG93RmlsdGVyQ29sdW1uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0ltcG9ydEV4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNydWRTZXJ2aWNlPzogQ3J1ZEJhc2VTZXJ2aWNlPGFueSwgYW55LCBhbnksIGFueT47XHJcbiAgQElucHV0KCkgc2V0IHNlYXJjaEZpZWxkcyh2YWx1ZTogQXJyYXk8U2VhcmNoRmllbGQ+IHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgLy9yZXNldFxyXG4gICAgICB0aGlzLl9zZWFyY2hGaWVsZHMgPSBbXTtcclxuXHJcbiAgICAgIC8vaW5pdCB1c2luZyB2YWx1ZVxyXG4gICAgICB0aGlzLl9zZWFyY2hGaWVsZHMgPSBGaWx0ZXJIZWxwZXIuaW5pdFNlYXJjaEZpZWxkcyh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuaW5pdFNlYXJjaE9uSW5pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2VhcmNoRmllbGRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaEZpZWxkcztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNvcnRNb2RlOiBHcmlkU29ydE1vZGUgfCBhbnkgPSBHcmlkU29ydE1vZGUuTXVsdGlwbGU7XHJcbiAgQElucHV0KCkgZmlsdGVyc0h0bWxUZW1wbGF0ZT86IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgcHJlc2VudGF0aW9uU2V0dGluZ3M/OiBQcmVzZW50YXRpb25TZXR0aW5nXHJcblxyXG4gIEBJbnB1dCgpIHNlbGVjdEtleU9ubHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX3NlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlIHwgYW55ID0gR3JpZFNlbGVjdGlvbk1vZGUuTm9uZTtcclxuXHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbk1vZGUodmFsdWU6IEdyaWRTZWxlY3Rpb25Nb2RlIHwgYW55KSB7XHJcbiAgICBpZiAodGhpcy5jb25maWc/LmRhdGE/LmlzQWR2YW5jZWRTZWFyY2ggJiYgdGhpcy5jb25maWc/LmRhdGE/LnNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9IHRoaXMuY29uZmlnPy5kYXRhPy5zZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGlvbk1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBASW5wdXQoKSBzZXQgc2VhcmNoT25Jbml0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09IG51bGwpIHtcclxuICAgICAgdGhpcy5fc2VhcmNoT25Jbml0ID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VhcmNoT25Jbml0ID0gdmFsdWVcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IHNlYXJjaE9uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdFNlYXJjaE9uSW5pdCgpXHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoT25Jbml0XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzaG93R2xvYmFsU2VhcmNoOiBib29sZWFuID0gdHJ1ZVxyXG4gIEBJbnB1dCgpIHNob3dFeHBvcnRCdXR0b246IGJvb2xlYW4gPSB0cnVlXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEZpZWxkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcm90ZWN0ZWQgX3Nob3dDYWxlbmRlclZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZXQgc2hvd0NhbGVuZGVyVmlldyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd0NhbGVuZGVyVmlldyA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX3Nob3dDYWxlbmRlclZpZXcgPT09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uc3RhcnQpXHJcbiAgICAgIGxldCBlbmQgPSB0aGlzLnNlYXJjaEZpZWxkcz8uZmluZCh4ID0+IHguZmllbGQgPT09IHRoaXMuY2FsZW5kZXJTY2hlbWE/LmVuZClcclxuICAgICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xyXG4gICAgICAgIHN0YXJ0LmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgZW5kLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgQElucHV0KCkgY2FsZW5kZXJTY2hlbWE6IEV2ZW50U2NoZW1hIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgX3Nob3dDYXJkVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93Q2FyZFZpZXcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dDYXJkVmlldyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zaG93S2FuYmFuVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93S2FuYmFuVmlldyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd0thbmJhblZpZXcgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfc2hvd0thbmJhblZpZXdPZldvcmtGbG93RXRhdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgQElucHV0KCkgcGFnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XHJcblxyXG4gIEBJbnB1dCgpIGNoZWNrZWRCeUZpZWxkOiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIF9zZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2VsZWN0QWxsKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RBbGwgPSB2YWx1ZTtcclxuXHJcbiAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBFdmVudCgnc2VsZWN0QWxsQ2hhbmdlJyk7XHJcbiAgICBjb25zdCBldmVudDogVGFibGVTZWxlY3RBbGxDaGFuZ2VFdmVudCA9IHtcclxuICAgICAgY2hlY2tlZDogdmFsdWUsXHJcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IHN5bnRoZXRpY0V2ZW50LFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHRhcmdldEJ1c2luZXNzQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIGRlc2NyaW1pbmF0b3JWYWx1ZT86IHN0cmluZ1xyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdEFsbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3NlbGVjdEFsbDsgfVxyXG5cclxuICBwcml2YXRlIF9lbnRpdHlJbmZvPzogRW50aXR5SW5mbztcclxuICBwcml2YXRlIF9idXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBidXNpbmVzc0NsYXNzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2J1c2luZXNzQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMudHJ5QXBwbHlFbnRpdHlJbmZvKCk7XHJcbiAgfVxyXG4gIGdldCBidXNpbmVzc0NsYXNzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2J1c2luZXNzQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBlbnRpdHlJbmZvKHZhbHVlOiBFbnRpdHlJbmZvIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9lbnRpdHlJbmZvID0gdmFsdWU7XHJcbiAgICB0aGlzLnRyeUFwcGx5RW50aXR5SW5mbygpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldCBlbnRpdHlJbmZvKCk6IEVudGl0eUluZm8gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eUluZm87XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0c1xyXG4gIEBPdXRwdXQoKSBlZGl0Um93OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBkZWxldGVSb3c6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGxvYWQ6IEV2ZW50RW1pdHRlcjx7IHJlcXVlc3Q6IElQYWdlZFJlcXVlc3QsIGlzRm9yQ2FsZW5kYXI6IGJvb2xlYW4gfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgcmVxdWVzdDogSVBhZ2VkUmVxdWVzdCwgaXNGb3JDYWxlbmRhcjogYm9vbGVhbiB9PigpO1xyXG4gIEBPdXRwdXQoKSBidXR0b25Db2x1bW5DbGlja2VkOiBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgZmlsdGVyc0h0bWxUZW1wbGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xyXG4gIEBPdXRwdXQoKSBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBcnJheTxTZWFyY2hGaWVsZD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxTZWFyY2hGaWVsZD4+KCk7XHJcbiAgQE91dHB1dCgpIGNhbGVuZGFyRXZlbnRDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc3RhdHVzRmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuICAvLyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgLy8gICBpZihjaGFuZ2VzWydwYWdlJ10pe1xyXG4gIC8vICAgICB0aGlzLl9leHRyYWN0U3VtbWFyaWVzKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlclwiO1xyXG4gIHByb3RlY3RlZCBmaWx0ZXJUb29sdGlwID0gXCJzaG93X2ZpbHRlclwiO1xyXG5cclxuICBmaWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktZmlsdGVyXCI7XHJcbiAgZmlsdGVyTW9kZVRvb2x0aXAgPSBcIm1lbnVfbW9kZVwiO1xyXG4gIGNoYW5nZUhlYWRlckZpbHRlcnNNb2RlOiBzdHJpbmcgPSBcIm1lbnVcIjtcclxuXHJcbiAgaXRlbXM/OiBhbnlbXTtcclxuICBfc2VhcmNoT25Jbml0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgaW5saW5lQWN0aW9uQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgb3ZlcmZsb3dBY3Rpb25Db2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICBoYXNPdmVyZmxvd0FjdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBvdmVyZmxvd0FjdGlvbnNNZW51OiBNZW51SXRlbVtdID0gW107XHJcbiAgY3VycmVudEFjdGlvblJvdzogYW55O1xyXG4gIGFjdGlvblBsYWNlbWVudCA9IEFjdGlvblBsYWNlbWVudDtcclxuXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3RlZENvbHVtbnMoKTogR3JpZENvbHVtbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkQ29sdW1ucyh2YWx1ZTogR3JpZENvbHVtbltdKSB7XHJcbiAgICBsZXQgc2FmZVZhbHVlID0gdmFsdWVcclxuICAgICAgPyBbLi4udmFsdWUuZmlsdGVyKGMgPT4gYy5maWVsZCAhPSB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQpXVxyXG4gICAgICA6IFtdO1xyXG5cclxuICAgIHRoaXMuaW5saW5lQWN0aW9uQ29sdW1ucyA9IHNhZmVWYWx1ZS5maWx0ZXIoXHJcbiAgICAgIGMgPT4gYy5pc0J1dHRvbiA9PT0gdHJ1ZSAmJiBjLmFjdGlvbkRpc3BsYXkgPT09IEFjdGlvblBsYWNlbWVudC5JbmxpbmVcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5vdmVyZmxvd0FjdGlvbkNvbHVtbnMgPSBzYWZlVmFsdWUuZmlsdGVyKFxyXG4gICAgICBjID0+IGMuaXNCdXR0b24gPT09IHRydWUgJiYgYy5hY3Rpb25EaXNwbGF5ICE9PSBBY3Rpb25QbGFjZW1lbnQuSW5saW5lXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuaGFzT3ZlcmZsb3dBY3Rpb25zID0gdGhpcy5vdmVyZmxvd0FjdGlvbkNvbHVtbnMubGVuZ3RoID4gMTtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNPdmVyZmxvd0FjdGlvbnMpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gW1xyXG4gICAgICAgIC4uLnRoaXMuaW5saW5lQWN0aW9uQ29sdW1ucyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogdGhpcy5vdmVyZmxvd0NvbHVtbkZpZWxkLFxyXG4gICAgICAgICAgaXNGcm96ZW46IHRydWUsXHJcbiAgICAgICAgICBidXR0b25JY29uOiAncGkgcGktZWxsaXBzaXMtdicsXHJcbiAgICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBob3ZlcjpzaGFkb3ctOCcsXHJcbiAgICAgICAgICBoZWFkZXI6ICdNb3JlIGFjdGlvbnMnLFxyXG4gICAgICAgICAgdHJhbnNsYXRlZEhlYWRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ01vcmUgYWN0aW9ucycpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uc2FmZVZhbHVlLmZpbHRlcihjID0+ICEoYy5pc0J1dHRvbiA9PT0gdHJ1ZSAmJiBjLmFjdGlvbkRpc3BsYXkgPT09IEFjdGlvblBsYWNlbWVudC5JbmxpbmUpKVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgdGhpcy5vdmVyZmxvd0FjdGlvbnNNZW51ID0gdGhpcy5nZXRPdmVyZmxvd01lbnVNb2RlbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gc2FmZVZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucHJvY2Vzc1N0aWNreUNvbHVtbnModGhpcy5fc2VsZWN0ZWRDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIGdldE92ZXJmbG93TWVudU1vZGVsKCk6IE1lbnVJdGVtW10ge1xyXG4gICAgaWYgKCF0aGlzLmhhc092ZXJmbG93QWN0aW9ucykge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3ZlcmZsb3dBY3Rpb25Db2x1bW5zLm1hcChjb2wgPT4gKHtcclxuICAgICAgaWQ6IGNvbC5maWVsZCxcclxuICAgICAgbGFiZWw6IGNvbC5oZWFkZXIsXHJcbiAgICAgIGljb25DbGFzczogY29sLmJ1dHRvbkljb24sXHJcbiAgICAgIHN0eWxlQ2xhc3M6IGNvbC5zdHlsZUNsYXNzLFxyXG4gICAgICBpY29uU3R5bGVDbGFzczogY29sLmljb25TdHlsZUNsYXNzLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcmZsb3dDb2x1bW5DbGlja2VkKG1lbnU6IE1lbnUsIGV2ZW50OiBFdmVudCwgcm93OiBhbnkpIHtcclxuICAgIHRoaXMuY3VycmVudEFjdGlvblJvdyA9IHJvdztcclxuICAgIG1lbnUudG9nZ2xlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uT3ZlcmZsb3dBY3Rpb25DbGlja2VkKHJvdzogYW55LCBtZW51SXRlbTogTWVudUl0ZW0pIHtcclxuICAgIGlmICghcm93IHx8ICFtZW51SXRlbSB8fCAhbWVudUl0ZW0uaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnV0dG9uQ2xpY2tlZChyb3csIG1lbnVJdGVtLmlkKVxyXG4gIH1cclxuXHJcbiAgaW1wb3J0YW50Q29sdW1ucyA9IFsnY29uc3VsdCcsICdlZGl0JywgJ2RlbGV0ZScsICd1cGxvYWQnLCAnZG93bmxvYWQnLCAnaW5mbycsICdub3RlcycsICdkdXBsaWNhdGUnLCAnZm9ybScsICdhY3Rpb25FUlAnXTtcclxuXHJcbiAgcHJpdmF0ZSB0aXRsZUNhY2hlID0gbmV3IE1hcDxhbnksIHN0cmluZ1tdPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3N0YXR1c0NvbG9yU2VydmljZTogU3RhdHVzQ29sb3JTZXJ2aWNlLFxyXG4gICAgcHVibGljIF9maWNoaWVyU2VydmljZTogRmljaGllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlOiBIdG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9jYWxpemU6IExvY2FsaXplUGlwZSxcclxuICAgIHByaXZhdGUgbGF5b3V0SGVscGVyU2VydmljZTogTGF5b3V0SGVscGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wcmltZW5nQ29uZmlnOiBQcmltZU5HQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXR0aW5nc1NlcnZpY2U6IEFwcFNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZTogRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgICBwdWJsaWMgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIHByaXZhdGUgX3JlZj86IER5bmFtaWNEaWFsb2dSZWYsXHJcblxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuZm9ybU5hbWV9LWZpbHRlck1vZGVgKVxyXG4gICAgaWYgKGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlICE9IG51bGxcclxuICAgICAgJiYgZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlICE9IFwiXCIpIHtcclxuICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZVxyXG4gICAgICB0aGlzLnNob3dIZWFkZXJGaWx0ZXJzID0gdHJ1ZVxyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlci1zbGFzaFwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcImhpZGVfZmlsdGVyXCI7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGVUb29sdGlwID09PSBcIm1lbnVfbW9kZVwiKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktY2hlY2tcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJyb3dfbW9kZVwiO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcIm1lbnVcIlxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcInJvd1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZUljb24gPSBcInBpIHBpLWVsbGlwc2lzLXZcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJtZW51X21vZGVcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSBmYWxzZVxyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlclwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgbGV0IGxhbmd1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHJ0bE1vZGVLZXlzLnJ0bE1vZGVFbmFibGVkKTtcclxuXHJcbiAgICBpZiAobGFuZ3VlICYmIEpTT04ucGFyc2UobGFuZ3VlKSkge1xyXG4gICAgICB0aGlzLmlzQXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oY29sdW1uLmhlYWRlciEhKSlcclxuXHJcbiAgICB0aGlzLl90ZW1wQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuXHJcbiAgICB0aGlzLnRlbXBTZWFyY2hGaWVsZHMgPSB0aGlzLl9zZWFyY2hGaWVsZHMgPz8gW107XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PlxyXG4gICAgICAhdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5maWVsZCkpO1xyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMgfHwgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbHVtbi5vcmRlciA9IGluZGV4O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pc1J0bE1vZGVFbmFibGVkKClcclxuICAgIHRoaXMudXBkYXRlUHJpbWVOR1RhYmxlRmlsdGVycygpXHJcbiAgICB0aGlzLl9ydGxNb2RlU3Vic2NyaWJlKClcclxuXHJcbiAgICB0aGlzLmV4dHJhY3REaWFsb2dDb25maWdEYXRhKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdHVzTWV0YWRhdGE/OiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlO1xyXG4gIHN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeT86IFN0YXR1c01ldGFkYXRhUmVzcG9uc2U7XHJcblxyXG4gIGdldFN0YXR1c09wdGlvbih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNNZXRhZGF0YT8ub3B0aW9ucy5maW5kKG8gPT4gby5zdGF0dXNWYWx1ZSA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShzdGF0dXNWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3Rvcnk/Lm9wdGlvbnMuZmluZChvID0+IG8udHJhbnNsYXRlZExhYmVsID09PSBzdGF0dXNWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RhdHVzQ29sb3JzRGV0YWlsc0J5QnVzaW5lc3NDbGFzcygpIHtcclxuXHJcbiAgICBpZiAodGhpcy50YXJnZXRCdXNpbmVzc0NsYXNzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnRhcmdldEJ1c2luZXNzQ2xhc3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzQnlCdXNpbmVzc0NsYXNzTmFtZSh0aGlzLnRhcmdldEJ1c2luZXNzQ2xhc3MpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgPSByZXNwb25zZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBzdGF0dXMgY29sb3JzJywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRTdGF0dXNDb2xvcnMoKTogdm9pZCB7XHJcblxyXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5idXNpbmVzc0NsYXNzITtcclxuICAgIGNvbnN0IHN0YXR1c0VudW1OYW1lID0gdGhpcy5lbnRpdHlJbmZvPy5zdGF0dXNFbnVtTmFtZSE7XHJcblxyXG4gICAgaWYgKCFjbGFzc05hbWUgfHwgIXN0YXR1c0VudW1OYW1lKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTWlzc2luZyBjbGFzc05hbWUgb3Igc3RhdHVzRW51bU5hbWUgZm9yIGVudGl0eUluZm8uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fc3RhdHVzQ29sb3JTZXJ2aWNlLmdldFN0YXR1c0NvbG9yRGV0YWlscyhjbGFzc05hbWUsIHN0YXR1c0VudW1OYW1lKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzTWV0YWRhdGEgPSByZXNwb25zZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBzdGF0dXMgY29sb3JzJywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1cyBjb2xvcnM6JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxpZ2h0ZW5Db2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgcGVyY2VudDogbnVtYmVyID0gNzApOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnJztcclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuXHJcbiAgICBsZXQgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGxldCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgbGV0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XHJcblxyXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyICsgKDI1NSAtIHIpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgZyA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihnICsgKDI1NSAtIGcpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgYiA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihiICsgKDI1NSAtIGIpICogcGVyY2VudCAvIDEwMCkpO1xyXG5cclxuICAgIGNvbnN0IG5ld0hleCA9XHJcbiAgICAgICcjJyArXHJcbiAgICAgIFtyLCBnLCBiXVxyXG4gICAgICAgIC5tYXAoeCA9PiB4LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKVxyXG4gICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3SGV4O1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVhZGFibGVUZXh0Q29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnYmxhY2snO1xyXG5cclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gMjMwID8gJ2JsYWNrJyA6IGAjJHtoZXh9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlFbnRpdHlJbmZvKGVudGl0eUluZm86IEVudGl0eUluZm8pIHtcclxuICAgIGlmICghZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHN0YXR1c0NvbHVtbk5hbWUgPSBlbnRpdHlJbmZvLnN0YXR1c0NvbHVtbk5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBzdGF0dXNDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChcclxuICAgICAgYyA9PiBjLmZpZWxkLnRvTG93ZXJDYXNlKCkgPT09IHN0YXR1c0NvbHVtbk5hbWVcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFzdGF0dXNDb2x1bW4pIHtcclxuICAgICAgY29uc29sZS53YXJuKGBTdGF0dXMgY29sdW1uIFwiJHtlbnRpdHlJbmZvLnN0YXR1c0NvbHVtbk5hbWV9XCIgbm90IGZvdW5kLmApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdHVzQ29sdW1uLmlzU3RhdHVzQ29sdW1uID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBidXR0b25Db2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaXNCdXR0b24pO1xyXG4gICAgY29uc3Qgb3RoZXJDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+ICFjLmlzQnV0dG9uICYmIGMgIT09IHN0YXR1c0NvbHVtbik7XHJcblxyXG4gICAgY29uc3QgbWF4QnV0dG9uT3JkZXIgPVxyXG4gICAgICBidXR0b25Db2x1bW5zLnJlZHVjZSgobSwgYykgPT4gTWF0aC5tYXgobSwgYy5vcmRlciA/PyAwKSwgMCkgfHwgMDtcclxuXHJcbiAgICBzdGF0dXNDb2x1bW4ub3JkZXIgPSBtYXhCdXR0b25PcmRlciArIDE7XHJcblxyXG4gICAgY29uc3QgcmVvcmRlcmVkID0gW1xyXG4gICAgICAuLi5idXR0b25Db2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMCkpLFxyXG4gICAgICBzdGF0dXNDb2x1bW4sXHJcbiAgICAgIC4uLm90aGVyQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKSxcclxuICAgIF07XHJcblxyXG4gICAgcmVvcmRlcmVkLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IChjb2wub3JkZXIgPSBpbmRleCkpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gWy4uLnJlb3JkZXJlZF07XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0U3RhdGUoKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSB7fTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZHQpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZHQucmVzaXphYmxlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmR0LnNhdmVDb2x1bW5XaWR0aHMoc3RhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZHQuc2F2ZUNvbHVtbk9yZGVyKHN0YXRlKTtcclxuXHJcbiAgICByZXR1cm4gc3RhdGVcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXN0b3JlU3RhdGUoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgdGhpcy5jb2x1bW5XaWR0aC5zZXRSZW1lbWJlcmVkKHN0YXRlLmNvbHVtbldpZHRocyk7XHJcbiAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICAgIHRoaXMuc29ydENvbHVtbnMoKVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBcHBseSB0aGUgcmVtZW1iZXJlZCBjb2x1bW4gd2lkdGhzIHRvIHRoZSBET00uIEFzc2lnbmluZyBjb2x1bW5XaWR0aHNTdGF0ZVxyXG4gICAgICAvLyBhbG9uZSBpcyBhIG5vLW9wIGhlcmUgYmVjYXVzZSB0aGUgZ3JpZCBpcyBub3QgUHJpbWVORy1cInN0YXRlZnVsXCJcclxuICAgICAgLy8gKG5vIHN0YXRlS2V5KSwgc28gUHJpbWVORyBuZXZlciBjYWxscyB0aGlzIG9uIGl0cyBvd24uXHJcbiAgICAgIHRoaXMuZHQucmVzdG9yZUNvbHVtbldpZHRocygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZENvbHVtbnNDaGFuZ2UobmV3VmFsdWU6IEdyaWRDb2x1bW5bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBuZXdWYWx1ZTtcclxuICAgIHRoaXMuc29ydENvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIHNvcnRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgaXNJbXBvcnRhbnQgPSAoYzogR3JpZENvbHVtbikgPT5cclxuICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluY2x1ZGVzKGMuZmllbGQpO1xyXG5cclxuICAgIGNvbnN0IHNvcnRXaXRoUHJpb3JpdHkgPSAoYTogR3JpZENvbHVtbiwgYjogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICBjb25zdCBhSW1wID0gaXNJbXBvcnRhbnQoYSk7XHJcbiAgICAgIGNvbnN0IGJJbXAgPSBpc0ltcG9ydGFudChiKTtcclxuXHJcbiAgICAgIGlmIChhSW1wICYmICFiSW1wKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUltcCAmJiBiSW1wKSByZXR1cm4gMTtcclxuXHJcbiAgICAgIGlmIChhSW1wICYmIGJJbXApIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYS5maWVsZCkgLVxyXG4gICAgICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYi5maWVsZClcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYnV0dG9uQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcihjID0+IGMuaXNCdXR0b24pO1xyXG4gICAgY29uc3Qgb3RoZXJDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNCdXR0b24pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gW1xyXG4gICAgICAuLi5idXR0b25Db2x1bW5zLnNvcnQoc29ydFdpdGhQcmlvcml0eSksXHJcbiAgICAgIC4uLm90aGVyQ29sdW1ucyxcclxuICAgIF07XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcjogc3RyaW5nW10pOiBhbnlbXSB7XHJcblxyXG4gICAgY29uc3QgaW1wb3J0YW50ID0gdGhpcy5pbXBvcnRhbnRDb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGNvbHVtbk9yZGVyLmluY2x1ZGVzKGtleSkpXHJcbiAgICAgIC5tYXAoa2V5ID0+IHRoaXMuZmluZENvbHVtbkJ5S2V5KGtleSkpXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XHJcblxyXG4gICAgY29uc3Qgb3RoZXJzID0gY29sdW1uT3JkZXJcclxuICAgICAgLmZpbHRlcihrZXkgPT4gIXRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmNsdWRlcyhrZXkpKVxyXG4gICAgICAubWFwKGtleSA9PiB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpKVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgIHJldHVybiBbLi4uaW1wb3J0YW50LCAuLi5vdGhlcnNdO1xyXG4gIH1cclxuXHJcbiAgZmluZENvbHVtbkJ5S2V5KGtleTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fdGVtcENvbHVtbnMpIHtcclxuICAgICAgZm9yIChsZXQgY29sIG9mIHRoaXMuX3RlbXBDb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbC5oZWFkZXIgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcclxuICAgICAgICBlbHNlIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgdGhpcy5jb2x1bW5XaWR0aC5yZXNldCgpO1xyXG4gICAgICB0aGlzLmNvbHVtbldpZHRoLnNldFJlbWVtYmVyZWQoc3RhdGUuY29sdW1uV2lkdGhzKTtcclxuICAgICAgdGhpcy5kdC5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcclxuICAgICAgdGhpcy5kdC50YWJsZVdpZHRoU3RhdGUgPSBzdGF0ZS50YWJsZVdpZHRoO1xyXG5cclxuICAgICAgbGV0IGNvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXI7XHJcblxyXG4gICAgICBpZiAoY29sdW1uT3JkZXIpIHtcclxuICAgICAgICBsZXQgcmVvcmRlcmVkQ29sdW1ucyA9IHRoaXMuZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLl90ZW1wQ29sdW1ucztcclxuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zKClcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kdC5yZXN0b3JlQ29sdW1uV2lkdGhzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBub3RJblNwZWNpZmllZENvbHVtbihmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmNsdWRlcyhmaWVsZClcclxuICAgICAgJiYgZmllbGQgIT09IHRoaXMub3ZlcmZsb3dDb2x1bW5GaWVsZDtcclxuICB9XHJcblxyXG4gIGlzT3ZlcmZsb3dDb2x1bW4oZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZpZWxkID09PSB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGNvbHVtbiBpcyBlbGlnaWJsZSBmb3IgYSBkZXZlbG9wZXItcHJlZmVycmVkIHdpZHRoLCB3cmFwcGluZyBhbmQgdG9wLWFsaWduIG9ubHlcclxuICAgKiB3aGVuIGl0IGlzIGEgcmVndWxhciBkYXRhIGNvbHVtbi4gQWN0aW9uL2J1dHRvbiBjb2x1bW5zLCB0aGUgc3ludGhldGljIG92ZXJmbG93XHJcbiAgICogY29sdW1uLCBpbWFnZSBjb2x1bW5zIGFuZCBmcm96ZW4gY29sdW1ucyBrZWVwIHRoZWlyIG93biBmaXhlZCwgcHJlZGljdGFibGUgc2l6ZTpcclxuICAgKiBmcm96ZW4gY29sdW1ucyBtdXN0IGtlZXAgdGhlaXIgc3RpY2t5LW9mZnNldCB3aWR0aCBvciBsYXRlciBmcm96ZW4gY29sdW1ucyBtaXNhbGlnbiAoVUMtNykuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1dpZHRoRWxpZ2libGUoY29sOiBHcmlkQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIWNvbC5pc0J1dHRvblxyXG4gICAgICAmJiAhdGhpcy5pc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZClcclxuICAgICAgJiYgY29sLnR5cGUgIT09IHRoaXMuZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVlcclxuICAgICAgJiYgIWNvbC5pc0Zyb3plbjtcclxuICB9XHJcblxyXG4gIC8qKiBTaGFyZWQgbW9kZWwgZm9yIHRoZSBkZXZlbG9wZXItd2lkdGggLyB3cmFwcGluZyAvIHJlc2l6ZS1wcmlvcml0eSBiZWhhdmlvci4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtbldpZHRoID0gbmV3IENvbHVtbldpZHRoQ29udHJvbGxlcigoY29sKSA9PiB0aGlzLmlzV2lkdGhFbGlnaWJsZShjb2wpKTtcclxuXHJcbiAgLyoqIFJlbWVtYmVyIHdoaWNoIGNvbHVtbiB0aGUgdXNlciByZXNpemVkIHNvIGl0cyBkZXZlbG9wZXItcHJlZmVycmVkIHdpZHRoIHlpZWxkcyAoVUMtNCkuICovXHJcbiAgb25Db2xSZXNpemUoZXZlbnQ6IHsgZWxlbWVudD86IEhUTUxFbGVtZW50OyBkZWx0YT86IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbHVtbldpZHRoLm9uUmVzaXplKGV2ZW50Py5lbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmllbGQnKSk7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhIGNvbHVtbidzIGNvbnRlbnQgc2hvdWxkIHdyYXAgdG8gc3RheSBpbnNpZGUgaXRzIGNvbnN0cmFpbmVkIHdpZHRoLiAqL1xyXG4gIHNob3VsZFdyYXBDb2x1bW4oY29sOiBHcmlkQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5XaWR0aC5zaG91bGRXcmFwKGNvbCk7XHJcbiAgfVxyXG5cclxuICAvKiogSGVhZGVyIGA8dGg+YCBzdHlsZTogY29sdW1uIGhlYWRlciBzdHlsZSBtZXJnZWQgd2l0aCB0aGUgZGV2ZWxvcGVyIHNpemUgc3R5bGUuICovXHJcbiAgZ2V0SGVhZGVyQ29sdW1uU3R5bGUoY29sOiBHcmlkQ29sdW1uKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XHJcbiAgICBjb25zdCBiYXNlID0gdGhpcy5wYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyAoY29sLmhlYWRlckNvbHVtblN0eWxlID8/IHt9KSA6IHt9O1xyXG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgLi4udGhpcy5jb2x1bW5XaWR0aC5zaXplU3R5bGUoY29sKSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIEJvZHkgYDx0ZD5gIHN0eWxlOiBjb2x1bW4gYm9keSBzdHlsZSArIHRvcC1hbGlnbiAoZWxpZ2libGUgY2VsbHMpICsgZGV2ZWxvcGVyIHNpemUgc3R5bGUuICovXHJcbiAgZ2V0Qm9keUNvbHVtblN0eWxlKGNvbDogR3JpZENvbHVtbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgY29uc3QgYmFzZSA9IHRoaXMucGFnZS5pdGVtcy5sZW5ndGggPiAwID8gKGNvbC5uZ1N0eWxlID8/IHt9KSA6IHt9O1xyXG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgLi4udGhpcy5jb2x1bW5XaWR0aC52ZXJ0aWNhbEFsaWduKGNvbCksIC4uLnRoaXMuY29sdW1uV2lkdGguc2l6ZVN0eWxlKGNvbCkgfTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NTdGlja3lDb2x1bW5zKGNvbHVtbnM6IEdyaWRDb2x1bW5bXSkge1xyXG4gICAgbGV0IGluZGV4ID0gMDtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2wuaXNGcm96ZW4pIHtcclxuICAgICAgICBjb2wubmdTdHlsZSA9IHRoaXMuZ2V0VGhlU3R5bGUoY29sLCBpbmRleClcclxuICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA9IHsgLi4uY29sLm5nU3R5bGUsIHpJbmRleDogMTAwMCB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2JveFN0eWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNSdGxNb2RlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcmlnaHQ6IGAwcHhgLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxlZnQ6IGAwcHhgLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUaGVTdHlsZShjb2x1bW46IEdyaWRDb2x1bW4sIGNvbHVtbk9yZGVyOiBudW1iZXIpOiBhbnkge1xyXG5cclxuICAgIGNvbnN0IFNUQVJUID0gOTtcclxuICAgIGNvbnN0IEZJUlNUX0dBUCA9IDM3O1xyXG4gICAgY29uc3QgR0FQID0gNDY7XHJcblxyXG4gICAgaWYgKCFjb2x1bW4uaXNGcm96ZW4pIHtcclxuICAgICAgcmV0dXJuIHt9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbHVtbi5pc0Zyb3plbiA9PSB0cnVlKSB7XHJcblxyXG4gICAgICBsZXQgZWxlbWVudFBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gdGhpcy5tdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlKSB7XHJcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gMzAgKyBlbGVtZW50UG9zaXRpb24gKyAoY29sdW1uT3JkZXIgPz8gMCkgKiA2MDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoY29sdW1uT3JkZXIgPT09IDApIHtcclxuICAgICAgICAgIGVsZW1lbnRQb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk9yZGVyID09PSAxKSB7XHJcbiAgICAgICAgICBlbGVtZW50UG9zaXRpb24gPSBTVEFSVCArIEZJUlNUX0dBUDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gU1RBUlQgKyBGSVJTVF9HQVAgKyAoY29sdW1uT3JkZXIgLSAxKSAqIEdBUDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuaXNSdGxNb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHJpZ2h0OiBgJHtlbGVtZW50UG9zaXRpb259cHhgLFxyXG4gICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnLFxyXG4gICAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBsZWZ0OiBgJHtlbGVtZW50UG9zaXRpb259cHhgLFxyXG4gICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnLFxyXG4gICAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzUnRsTW9kZUVuYWJsZWQoKSB7XHJcbiAgICBpZiAodGhpcy5fbGF5b3V0U2VydmljZS5pc1J0bE1vZGVFbmFibGVkKCkpIHtcclxuICAgICAgdGhpcy5pc1J0bE1vZGUgPSB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVByaW1lTkdUYWJsZUZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLl9wcmltZW5nQ29uZmlnLnNldFRyYW5zbGF0aW9uKHtcclxuICAgICAgc3RhcnRzV2l0aDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19zdGFydHNXaXRoJyksXHJcbiAgICAgIGNvbnRhaW5zOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2NvbnRhaW5zJyksXHJcbiAgICAgIG5vdENvbnRhaW5zOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX25vdENvbnRhaW5zJyksXHJcbiAgICAgIGVuZHNXaXRoOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VuZHNXaXRoJyksXHJcbiAgICAgIGVxdWFsczogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19lcXVhbHMnKSxcclxuICAgICAgbm90RXF1YWxzOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX25vdEVxdWFscycpLFxyXG4gICAgICBub0ZpbHRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19ub0ZpbHRlcicpLFxyXG4gICAgICBsdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19sdCcpLFxyXG4gICAgICBsdGU6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbHRlJyksXHJcbiAgICAgIGd0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2d0JyksXHJcbiAgICAgIGd0ZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19ndGUnKSxcclxuICAgICAgaXM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfaXMnKSxcclxuICAgICAgaXNOb3Q6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfaXNOb3QnKSxcclxuICAgICAgYmVmb3JlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2JlZm9yZScpLFxyXG4gICAgICBhZnRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hZnRlcicpLFxyXG4gICAgICBkYXRlSXM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZGF0ZUlzJyksXHJcbiAgICAgIGRhdGVJc05vdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlSXNOb3QnKSxcclxuICAgICAgZGF0ZUJlZm9yZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlQmVmb3JlJyksXHJcbiAgICAgIGRhdGVBZnRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlQWZ0ZXInKSxcclxuICAgICAgY2xlYXI6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfY2xlYXInKSxcclxuICAgICAgYXBwbHk6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfYXBwbHknKSxcclxuICAgICAgbWF0Y2hBbGw6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbWF0Y2hBbGwnKSxcclxuICAgICAgbWF0Y2hBbnk6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbWF0Y2hBbnknKSxcclxuICAgICAgYWRkUnVsZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hZGRSdWxlJyksXHJcbiAgICAgIHJlbW92ZVJ1bGU6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfcmVtb3ZlUnVsZScpLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfYWNjZXB0JyksXHJcbiAgICAgIHJlamVjdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19yZWplY3QnKSxcclxuICAgICAgY2hvb3NlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2Nob29zZScpLFxyXG4gICAgICB1cGxvYWQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfdXBsb2FkJyksXHJcbiAgICAgIGNhbmNlbDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19jYW5jZWwnKSxcclxuICAgICAgdG9kYXk6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfdG9kYXknKSxcclxuICAgICAgd2Vla0hlYWRlcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc193ZWVrSGVhZGVyJyksXHJcbiAgICAgIGRhdGVGb3JtYXQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZGF0ZUZvcm1hdCcpLFxyXG4gICAgICB3ZWFrOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3dlYWsnKSxcclxuICAgICAgbWVkaXVtOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX21lZGl1bScpLFxyXG4gICAgICBzdHJvbmc6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfc3Ryb25nJyksXHJcbiAgICAgIHBhc3N3b3JkUHJvbXB0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3Bhc3N3b3JkUHJvbXB0JyksXHJcbiAgICAgIGVtcHR5TWVzc2FnZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19lbXB0eU1lc3NhZ2UnKSxcclxuICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VtcHR5RmlsdGVyTWVzc2FnZScpLFxyXG4gICAgICBmaXJzdERheU9mV2VlazogMSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcnRsTW9kZVN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMuX2xheW91dFNlcnZpY2UuZW5hYmxlUnRsTW9kZVN1YmplY3QkLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmlzUnRsTW9kZSA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMoc2VhcmNoRmllbGRWYWx1ZXM6IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQuZW1pdChzZWFyY2hGaWVsZFZhbHVlcylcclxuICB9XHJcblxyXG4gIGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID8gdGhpcy5wYWdlLnBhZ2VOdW1iZXIgPT09ICh0aGlzLnBhZ2UudG90YWxDb3VudCAtIHRoaXMucGFnZS5wYWdlU2l6ZSkgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID8gdGhpcy5wYWdlLnBhZ2VOdW1iZXIgPT09IDAgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZWRpdChpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZWRpdFJvdy5lbWl0KGl0ZW1bdGhpcy5rZXldKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZShpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZGVsZXRlUm93LmVtaXQoaXRlbVt0aGlzLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgbGF6eUxvYWQoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCkge1xyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0ID09IG51bGwgJiYgdGhpcy5wYWdlZFJlcXVlc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0ID0ge307XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2VkUmVxdWVzdC5za2lwQ291bnQgPSBldmVudC5maXJzdCA9PSAxID8gMCA6IGV2ZW50LmZpcnN0O1xyXG4gICAgdGhpcy5wYWdlZFJlcXVlc3QubWF4UmVzdWx0Q291bnQgPSBldmVudC5yb3dzO1xyXG4gICAgdGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMgPSB0aGlzLl9leHRyYWN0RmlsdGVycyhldmVudC5maWx0ZXJzKTtcclxuICAgIHRoaXMuX2V4dHJhY3RTb3J0Q3JpdGVyaWFzKGV2ZW50KTtcclxuICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICBmaWVsZHMoKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2w6IEdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaChjb2wuZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZHM7XHJcbiAgfVxyXG5cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZChpdGVtOiBhbnksIGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgIHRoaXMuYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KHsgZmllbGQ6IGZpZWxkLCBrZXk6IGl0ZW1bdGhpcy5rZXldLCBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHkgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoeyBmaWVsZDogZmllbGQsIGtleTogaXRlbSwgc2VsZWN0S2V5T25seTogdGhpcy5zZWxlY3RLZXlPbmx5IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAga2V5d29yZFZhbHVlQ2hhbmdlZChrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMua2V5d29yZCA9IGtleXdvcmRcclxuICB9XHJcblxyXG4gIGlzQWxsUmVxdWlyZWRTZWFyY2hGaWVsZHNIYXZlVmFsdWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGludmFsaWRTZWFyY2hGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkc1xyXG4gICAgICA/LmZpbHRlcih4ID0+IHgucmVxdWlyZWQgPT0gdHJ1ZSAmJiAoeC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgeC52YWx1ZSA9PSAnJyB8fCB4LnZhbHVlID09IG51bGwpKVxyXG5cclxuICAgIGlmIChpbnZhbGlkU2VhcmNoRmllbGRzID09IHVuZGVmaW5lZCB8fCBpbnZhbGlkU2VhcmNoRmllbGRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBpbnZhbGlkU2VhcmNoRmllbGRzLmZvckVhY2goc2VhcmNoRmllbGQgPT4ge1xyXG4gICAgICBtZXNzYWdlcy5wdXNoKGA8Yj4ke3RoaXMubG9jYWxpemUudHJhbnNmb3JtKHNlYXJjaEZpZWxkLmxhYmVsVmFsdWUpfTwvYj4gJHt0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShcInNoYXJlZF9zZWFyY2hfZmllbGRfcmVxdWlyZWRcIil9YCk7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlc0Zyb21BcnJheVN0cmluZyhtZXNzYWdlcyk7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGluaXRTZWFyY2hPbkluaXQoKSB7XHJcbiAgICBsZXQgaW52YWxpZFNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzXHJcbiAgICAgID8uZmlsdGVyKHggPT4geC5yZXF1aXJlZCA9PSB0cnVlICYmICh4LnZhbHVlID09IHVuZGVmaW5lZCB8fCB4LnZhbHVlID09ICcnIHx8IHgudmFsdWUgPT0gbnVsbCkpID8/IFtdXHJcblxyXG4gICAgaWYgKHRoaXMuX3NlYXJjaE9uSW5pdCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSBpbnZhbGlkU2VhcmNoRmllbGRzLmxlbmd0aCA9PSAwXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21ib0JveExhYmVsQ2hhbmdlZChldmVudD86IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5fZXh0cmFjdFNlYXJjaEJveEZpbHRlcnMoKTtcclxuICAgIHRoaXMuX2dlbmVyYXRlRmlsdGVyc0h0bWxUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoKGV2dDogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJzZWFyY2g+Pj5cIiwgdGhpcy5zZWFyY2hGaWVsZHMpXHJcbiAgICAvLyBzZXQgZ2xvYmFsIGZpbHRlciB2YWx1ZVxyXG5cclxuICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCAmJiB0aGlzLmlzQWxsUmVxdWlyZWRTZWFyY2hGaWVsZHNIYXZlVmFsdWVzKCkpIHtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3Quc3VtbWFyaWVzID0gdGhpcy5fZXh0cmFjdEhhdmVTdW1tYXJ5UHJvcGVydGllcygpO1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5zb3J0aW5nID0gdGhpcy5fc29ydDtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3Qua2V5d29yZCA9IHRoaXMua2V5d29yZDtcclxuXHJcbiAgICAgIC8vYWRkIHNlYXJjaCBib3ggZmlsdGVyc1xyXG4gICAgICB0aGlzLl9leHRyYWN0U2VhcmNoQm94RmlsdGVycygpO1xyXG5cclxuICAgICAgLy9nZW5lcmF0ZSBmaWx0ZXJzIGh0bWwgdGVtcGxhdGVcclxuICAgICAgdGhpcy5fZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk7XHJcbiAgICAgIC8vY2xvbmVcclxuXHJcbiAgICAgIGxldCBuZXdSZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0ID0gdGhpcy5fY2xvbmVQYWdlZFJlcXVlc3QodGhpcy5wYWdlZFJlcXVlc3QpO1xyXG5cclxuICAgICAgLy9jb25jYXQgZmlsdGVyc1xyXG4gICAgICBuZXdSZXF1ZXN0LmZpbHRlcnMgPSBbLi4udGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMsIC4uLnRoaXMuX3NlYXJjaEJveEZpbHRlcnNdO1xyXG5cclxuICAgICAgLy9leGNsdWRlIHVzZWxlc3MgZmlsdGVyc1xyXG4gICAgICBuZXdSZXF1ZXN0ID0gdGhpcy5fZXhjbHVkZVVzZWxlc3NGaWx0ZXJzKG5ld1JlcXVlc3QpO1xyXG5cclxuICAgICAgLy8gdGVzdCBpZiBmaWx0ZXJzIHZhbHVlIGhhcyBjaGFuZ2VkXHJcbiAgICAgIGlmICgodGhpcy5sYXRlc3RGaWx0ZXJzID8gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXRlc3RGaWx0ZXJzKSA6IG51bGwpXHJcbiAgICAgICAgIT09IChuZXdSZXF1ZXN0LmZpbHRlcnMgPyBKU09OLnN0cmluZ2lmeShuZXdSZXF1ZXN0LmZpbHRlcnMpIDogbnVsbCkpIHtcclxuICAgICAgICBuZXdSZXF1ZXN0LnNraXBDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgICAgICB0aGlzLmR0LmZpcnN0ID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNhdmUgbGF0ZXN0IGZpbHRlcnNcclxuICAgICAgdGhpcy5sYXRlc3RGaWx0ZXJzID0gbmV3UmVxdWVzdC5maWx0ZXJzO1xyXG5cclxuICAgICAgdGhpcy5sb2FkLmVtaXQoeyByZXF1ZXN0OiBuZXdSZXF1ZXN0LCBpc0ZvckNhbGVuZGFyOiB0aGlzLl9zaG93Q2FsZW5kZXJWaWV3IH0pO1xyXG5cclxuICAgICAgdGhpcy5maWx0ZXJzSHRtbFRlbXBsYXRlQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJzSHRtbFRlbXBsYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZpcnN0RWxlbWVudEluZGV4KCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXRoaXMuZHQpIHJldHVybiAwO1xyXG5cclxuICAgIGlmICh0aGlzLnBhZ2UuaXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmR0LmZpcnN0ID09PSAwID8gMSA6ICh0aGlzLmR0Py5maXJzdCA/PyAwKTtcclxuICB9XHJcblxyXG4gIGdldFN1bW1hcnkoZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgc3VtbWFyeVJvdyA9IHRoaXMucGFnZS5zdW1tYXJpZXNcclxuICAgICAgLmZpbmQocyA9PiBzLnByb3ByZXR5LnRvVXBwZXJDYXNlKCkgPT0gZmllbGQudG9VcHBlckNhc2UoKSk7XHJcbiAgICBpZiAoc3VtbWFyeVJvdykge1xyXG4gICAgICByZXR1cm4gc3VtbWFyeVJvdy5zdW1tYXJ5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKSB7XHJcbiAgICBsZXQgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgICAgICBsZXQga2V5czogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaCgodjogYW55KSA9PiB7IGtleXMucHVzaCh2W3RoaXMua2V5XSkgfSk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSBrZXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPyBbdGhpcy5zZWxlY3Rpb25bdGhpcy5rZXldXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uID8gW3RoaXMuc2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk5vbmUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YT8uaXNBZHZhbmNlZFNlYXJjaCAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChzZWxlY3Rpb24pXHJcblxyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSkge1xyXG4gICAgICAgIGxldCBkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0OiBEcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0ID0ge1xyXG4gICAgICAgICAgaXRlbUtleVByb3BlcnR5TmFtZTogdGhpcy5rZXksXHJcbiAgICAgICAgICBpdGVtczogc2VsZWN0aW9uWzBdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVmPy5jbG9zZShkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0KVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGxDaGFuZ2UoZXZlbnQ6IFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0QWxsID0gZXZlbnQuY2hlY2tlZDtcclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdEFsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWRCeUZpZWxkICYmIHRoaXMuY2hlY2tlZEJ5RmllbGQudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLnBhZ2UuaXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgICBpdGVtID0+IGl0ZW1bdGhpcy5jaGVja2VkQnlGaWVsZF0gPT09IHRydWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5wYWdlLml0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gb25TZWxlY3RlZENvbHVtbnNDaGFuZ2UoKSB7XHJcbiAgLy8gICBpZiAodGhpcy5mb3JtTmFtZSkge1xyXG4gIC8vICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG5cclxuICAvLyAgICAgaWYgKHN0b3JlZFZhbHVlKSB7XHJcbiAgLy8gICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAvLyAgICAgICBsZXQgY29sdW1uT3JkZXI6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gICAgICAgbGV0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBbXTtcclxuICAvLyAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAvLyAgICAgICAgIGlmIChpdGVtLmZpZWxkID09PSAndXBsb2FkJykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2Rvd25sb2FkJykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2NvbnN1bHQnKSB7XHJcbiAgLy8gICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBlbHNlIGlmIChpdGVtLmZpZWxkID09PSAnZGVsZXRlJykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2VkaXQnKSB7XHJcbiAgLy8gICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuc29ydCgoYSwgYikgPT4ge1xyXG4gIC8vICAgICAgICAgaWYgKGEub3JkZXIgIT09IHVuZGVmaW5lZCAmJiBiLm9yZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAvLyAgICAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgcmV0dXJuIDA7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaChzZWxlY3RlZENvbHVtbiA9PiB7XHJcbiAgLy8gICAgICAgICBjb2x1bW5PcmRlci5wdXNoKHNlbGVjdGVkQ29sdW1uLmZpZWxkKTtcclxuICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGVkV2lkdGggPSBzZWxlY3RlZENvbHVtbi5taW5XaWR0aDtcclxuICAvLyAgICAgICAgIGlmIChzZWxlY3RlZFdpZHRoKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbHVtbldpZHRocy5wdXNoKHNlbGVjdGVkV2lkdGgudG9TdHJpbmcoKSk7XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAvL2NvbHVtbldpZHRocy5wdXNoKCc5MCcpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gIC8vICAgICAgIHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyID0gY29sdW1uT3JkZXI7XHJcbiAgLy8gICAgICAgc2Vzc2lvbkRhdGEuY29sdW1uV2lkdGhzID0gY29sdW1uV2lkdGhzLmpvaW4oJywnKTtcclxuXHJcbiAgLy8gICAgICAgLy9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmZvcm1OYW1lLCBKU09OLnN0cmluZ2lmeShzZXNzaW9uRGF0YSkpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIC8vY29uc3QgcmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRhYmxlQ29uZmlnSlNPTigpO1xyXG4gIC8vICAgICAgIC8vbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5mb3JtTmFtZSwgcmVzdWx0KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2VuZXJhdGVUYWJsZUNvbmZpZ0pTT04oKTogc3RyaW5nIHtcclxuICAvLyAgIGNvbnN0IHRhYmxlQ29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLmpzb25TdHJpbmdMYXlvdXQpO1xyXG4gIC8vICAgdGFibGVDb25maWcuY29sdW1uT3JkZXIgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZCk7XHJcbiAgLy8gICAvL3RhYmxlQ29uZmlnLmNvbHVtbldpZHRocyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLm1hcCgoKSA9PiAnOTAnKS5qb2luKCcsJyk7XHJcbiAgLy8gICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGFibGVDb25maWcpO1xyXG4gIC8vIH1cclxuXHJcblxyXG5cclxuICBvblN0YXRlUmVzdG9yZSh0YWJsZVN0YXRlOiBUYWJsZVN0YXRlKSB7XHJcbiAgICBpZiAodGFibGVTdGF0ZS5zZWxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0YWJsZVN0YXRlLnNlbGVjdGlvblxyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLmZvcm1OYW1lKSB7XHJcbiAgICAvLyAgIGNvbnN0IHN0b3JlZFZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5mb3JtTmFtZSk7XHJcbiAgICAvLyAgIGlmIChzdG9yZWRWYWx1ZSkge1xyXG4gICAgLy8gICAgIGNvbnN0IHNlc3Npb25EYXRhID0gSlNPTi5wYXJzZShzdG9yZWRWYWx1ZSk7XHJcbiAgICAvLyAgICAgY29uc3QgY29sdW1uT3JkZXI6IHN0cmluZ1tdID0gc2Vzc2lvbkRhdGEuY29sdW1uT3JkZXI7XHJcbiAgICAvLyAgICAgY29uc3QgY29sdW1uV2lkdGhzOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbldpZHRocy5zcGxpdCgnLCcpO1xyXG5cclxuICAgIC8vICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRDb2x1bW5zIGJhc2VkIG9uIGNvbHVtbk9yZGVyIGFuZCBjb2x1bW5XaWR0aHNcclxuICAgIC8vICAgICBjb25zdCB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICAgIC8vICAgICBjb2x1bW5PcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcclxuICAgIC8vICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gY29sdW1uV2lkdGhzW2luZGV4XTtcclxuICAgIC8vICAgICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHNlbGVjdGVkQ29sdW1uc1xyXG4gICAgLy8gICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCk7XHJcbiAgICAvLyAgICAgICBpZiAoZXhpc3RpbmdDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuICAgIC8vICAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBleGlzdHMgaW4gc2VsZWN0ZWRDb2x1bW5zLCB1cGRhdGUgaXRzIHdpZHRoXHJcbiAgICAvLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2V4aXN0aW5nQ29sdW1uSW5kZXhdLndpZHRoID0gY29sdW1uV2lkdGg7XHJcbiAgICAvLyAgICAgICAgIHVwZGF0ZWRTZWxlY3RlZENvbHVtbnMucHVzaCh0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XSk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIC8vIFVwZGF0ZSBzZWxlY3RlZENvbHVtbnMgd2l0aCB0aGUgcmVzdG9yZWQgZGF0YVxyXG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdXBkYXRlZFNlbGVjdGVkQ29sdW1ucztcclxuXHJcblxyXG4gICAgLy8gICAgICAgaWYoc3RvcmVkVmFsdWUpe1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoKGRhdGEubXVsdGlTb3J0TWV0YSAmJiBkYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkgfHwgKGRhdGEuZmlsdGVycyAmJiBkYXRhLm11bHRpU29ydE1ldGEuZmlsdGVycyA+IDApKSB7XHJcbiAgICAvLyAgICAgICAgICAgaWYgKGRhdGEubXVsdGlTb3J0TWV0YSAmJiBkYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgZGF0YS5tdWx0aVNvcnRNZXRhLmZvckVhY2goKG1ldGE6IHsgZmllbGQ6IGFueTsgb3JkZXI6IGFueTsgfSkgPT4geyBcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgIGxldCBzb3J0ID0ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHByb3BlcnR5OiBtZXRhLmZpZWxkLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIG9yZGVyOiBtZXRhLm9yZGVyID09IDEgPyAnQVNDJyA6ICdERVNDJ1xyXG4gICAgLy8gICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgIHRoaXMuX3NvcnQgPSBbc29ydF07XHJcbiAgICAvLyAgICAgICAgICAgICB9KTsgIFxyXG4gICAgLy8gICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICBpZiAoZGF0YS5maWx0ZXJzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcyA9W107XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzQXJyYXk6IFtzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB8IG51bGw7IG1hdGNoTW9kZTogc3RyaW5nLG9wZXJhdG9yIDogc3RyaW5nIH1bXV1bXSA9IE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsdGVycyk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKFtmaWVsZE5hbWUsIGZpZWxkVmFsdWVdKSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICBmaWVsZFZhbHVlLmZvckVhY2goZmlsdGVyID0+XHJcbiAgICAvLyAgICAgICAgICAgICAgICAge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICBpZihmaWx0ZXIudmFsdWUpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEZpZWxkIDogU2VhcmNoRmllbGQgPXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZmllbGQgOmZpZWxkTmFtZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbGFiZWxWYWx1ZSA6IGZpbHRlci52YWx1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ZmlsdGVyLnZhbHVlLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0eXBlIDogdGhpcy5pbmZlcklucHV0VHlwZShmaWVsZE5hbWUpLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA6IHRoaXMuZ2V0T3BlcmF0b3JOdW1iZXIoZmlsdGVyLm1hdGNoTW9kZSlcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc2VhcmNoRmllbGQnLHNlYXJjaEZpZWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaEZpZWxkcykge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRmllbGRzLnB1c2goc2VhcmNoRmllbGQpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgIH1cclxuXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJObyBzZXNzaW9uIGRhdGEgZm91bmQgaW4gbG9jYWxTdG9yYWdlXCIpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHQ/LmNsZWFyKCk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYClcclxuICB9XHJcblxyXG4gIGdldE9wZXJhdG9yTnVtYmVyKG9wZXJhdG9yOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIEZpbHRlck9wZXJhdG9yVHlwZVtvcGVyYXRvci50b1VwcGVyQ2FzZSgpIGFzIGtleW9mIHR5cGVvZiBGaWx0ZXJPcGVyYXRvclR5cGVdID8/IC0xO1xyXG4gIH1cclxuICBpbmZlcklucHV0VHlwZSh2YWx1ZTogYW55KTogSW5wdXRUeXBlcyB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAoL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5JTlRFR0VSO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eXFxkK1xcLlxcZCskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBJbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuREFURTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5URVhUX0JPWDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIElucHV0VHlwZXMuVEVYVF9CT1g7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGxvYWRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlWydnZXQnXSgndGFibGUtc3RhdGUnKTtcclxuICB9XHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbWV0aG9kc1xyXG4gIHByaXZhdGUgX2V4dHJhY3RGaWx0ZXJzKGV2ZW50OiBGaWx0ZXJNZXRhZGF0YVtdIHwgYW55KTogSUZpbHRlcmVkUmVxdWVzdFtdIHtcclxuICAgIGxldCBmaWx0ZXJzOiBJRmlsdGVyZWRSZXF1ZXN0W10gPSBbXTtcclxuICAgIGlmIChldmVudCAhPSBudWxsICYmIGV2ZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbmN5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBjb2wuY3VycmVuY3lPdGhlckNvZGU7XHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IHRoaXMuZGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWSkge1xyXG4gICAgICAgICAgY3VycmVuY3kgPSB0aGlzLmFwcFNldHRpbmdzU2VydmljZS5hcHBTZXR0aW5ncy5kZXZpc2VTb2NpZXRlLmNvZGVEZXZpc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChldmVudCAhPSBudWxsICYmIGV2ZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGZpbHRlciA9IGV2ZW50W2NvbC5maWVsZF07XHJcbiAgICAgICAgICBpZiAodGhpcy5fbm90TnVsbE9yVW5kZWZpbmVkKGZpbHRlcikpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ub3ROdWxsT3JVbmRlZmluZWQoaXRlbS52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBpdGVtLnZhbHVlIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oaXRlbS52YWx1ZSwgJ3l5eXktTU0tZGQnKVxyXG4gICAgICAgICAgICAgICAgICAgIDogaXRlbS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRmlsdGVySGVscGVyLlRvT3BlcmF0b3JUeXBlKGl0ZW0ubWF0Y2hNb2RlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZTogZmlsdGVyVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJldHlOYW1lOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBjb2wuaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgIG51bU9mRGVjaW1hbDogY29sLm51bU9mRGVjaW1hbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb21ib2JveExhYmVsOiBjb2wuY29tYm9MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbUNvbHVtbjogY29sLmlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZmlsdGVyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpbHRlci52YWx1ZSwgJ3l5eXktTU0tZGQnKVxyXG4gICAgICAgICAgICAgICAgICA6IGZpbHRlci52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJIZWxwZXIuVG9PcGVyYXRvclR5cGUoZmlsdGVyLm1hdGNoTW9kZSksXHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgcHJvcHJldHlOYW1lOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgIGhlYWRlcjogY29sLmhlYWRlcixcclxuICAgICAgICAgICAgICAgICAgdHlwZTogRmlsdGVySGVscGVyLlRvSW5wdXRUeXBlKGNvbC50eXBlKSxcclxuICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICBudW1PZkRlY2ltYWw6IGNvbC5udW1PZkRlY2ltYWwsXHJcbiAgICAgICAgICAgICAgICAgIGlzRnJhY3Rpb246IGNvbC5pc0ZyYWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBjb21ib2JveExhYmVsOiBjb2wuY29tYm9MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgaXNDdXN0b21Db2x1bW46IGNvbC5pc0N1c3RvbUNvbHVtblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFNvcnRDcml0ZXJpYXMobGF6eUxvYWRFdmVudDogVGFibGVMYXp5TG9hZEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc29ydE1ldGEgPSB0aGlzLl90b1NvcnRNZXRhKGxhenlMb2FkRXZlbnQpO1xyXG4gICAgaWYgKHNvcnRNZXRhKSB7XHJcbiAgICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgICAgdGhpcy5fZXh0cmFjdFNpbmdsZVNvcnRDcml0ZXJpYShzb3J0TWV0YSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgICB0aGlzLl9leHRyYWN0TXVsdGlwbGVTb3J0Q3JpdGVyaWFzKHNvcnRNZXRhKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0U2luZ2xlU29ydENyaXRlcmlhKHNvcnRNZXRhOiBTb3J0TWV0YSkge1xyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHNvcnRNZXRhLmZpZWxkKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBzb3J0IGVsZW1lbnRcclxuICAgICAgICBsZXQgaXNDdXN0b21Db2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IHNvcnRNZXRhLmZpZWxkKT8uaXNDdXN0b21Db2x1bW47XHJcbiAgICAgICAgbGV0IHNvcnQ6IElTb3J0QnlQcm9wcmV0eSA9IHtcclxuICAgICAgICAgIHByb3BlcnR5OiBzb3J0TWV0YS5maWVsZCxcclxuICAgICAgICAgIG9yZGVyOiBzb3J0TWV0YS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQycsXHJcbiAgICAgICAgICBpc0N1c3RvbUNvbHVtbjogaXNDdXN0b21Db2x1bW5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc29ydCA9IFtzb3J0XVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHByb2Nlc3MgXFwnU2luZ2xlU29ydFxcJyB3aGVuIFtzb3J0TW9kZV0gaXMgXFwnbXVsdGlwbGVcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RNdWx0aXBsZVNvcnRDcml0ZXJpYXMoc29ydE1ldGFzOiBTb3J0TWV0YVtdKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAoc29ydE1ldGFzICYmIEFycmF5LmlzQXJyYXkoc29ydE1ldGFzKSkge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgc29ydCBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5fc29ydCA9IFtdO1xyXG4gICAgICAgIHRoaXMuc29ydE1ldGFzID0gc29ydE1ldGFzO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coJ21ldGEgJywgc29ydE1ldGFzKVxyXG4gICAgICAgIHNvcnRNZXRhcy5mb3JFYWNoKHNtID0+IHtcclxuICAgICAgICAgIGlmIChzbS5maWVsZCkge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHNvcnQgZWxlbWVudFxyXG4gICAgICAgICAgICBsZXQgaXNDdXN0b21Db2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IHNtLmZpZWxkKT8uaXNDdXN0b21Db2x1bW47XHJcbiAgICAgICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICAgICAgcHJvcGVydHk6IHNtLmZpZWxkLFxyXG4gICAgICAgICAgICAgIG9yZGVyOiBzbS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQycsXHJcbiAgICAgICAgICAgICAgaXNDdXN0b21Db2x1bW46IGlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vYWRkIHRoZSBuZXcgZWxlbWVudCB0byBfc29ydFxyXG4gICAgICAgICAgICB0aGlzLl9zb3J0LnB1c2goc29ydCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgcHJvY2VzcyBcXCdNdWx0aXBsZVNvcnRcXCcgd2hlbiBbc29ydE1vZGVdIGlzIFxcJ3NpbmdsZVxcJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbm90TnVsbE9yVW5kZWZpbmVkKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAob2JqICE9IG51bGxcclxuICAgICAgJiYgb2JqICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIFJldHVybnMgdGhlIHNlYXJjaCBmaWVsZHMgdGhhdCBhcmUgdmlzaWJsZSBwZXIgdGhlIHByZXNlbnRhdGlvbiBjb25maWcsIFdJVEhPVVQgbXV0YXRpbmcgdGhlXHJcbiAgLy8gcmVuZGVyZWQgYHNlYXJjaEZpZWxkc2AuIEhpZGRlbiBmaWVsZHMgc3RheSByZW5kZXJlZCAoYW5kIGFyZSBoaWRkZW4gaW4gdGhlIERPTSBieSB0aGVcclxuICAvLyBwcmVzZW50YXRpb25EZXNpZ25lckJhc2UgZGlyZWN0aXZlLCBsaWtlIGJ1dHRvbnMpIHNvIHRoZXkgY2FuIGJlIHJlLXNob3duIGluIGRlc2lnbiBtb2RlOyB0aGlzXHJcbiAgLy8gc3Vic2V0IGlzIHVzZWQgb25seSBmb3IgYnVpbGRpbmcgdGhlIHNlYXJjaCBxdWVyeSBzbyBoaWRkZW4gZmllbGRzIGFyZSBuZXZlciBzZW50IHRvIHRoZSBBUEkuXHJcbiAgcHJpdmF0ZSBfb25seVZpc2libGVTZWFyY2hGaWVsZHMoZmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4pOiBBcnJheTxTZWFyY2hGaWVsZD4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnByZXNlbnRhdGlvblNldHRpbmdzICYmXHJcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uU2V0dGluZ3MucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKHNmID0+IHtcclxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLnByZXNlbnRhdGlvblNldHRpbmdzPy5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsc1xyXG4gICAgICAgICAgLmZpbmQocCA9PiBwLmJsb2NrTmFtZSA9PT0gc2YuZmllbGQpO1xyXG5cclxuICAgICAgICByZXR1cm4gIWNvbmZpZyB8fCBjb25maWcuaXNCbG9ja1Zpc2libGUgPT09IHRydWUgfHwgY29uZmlnLmlzQmxvY2tWaXNpYmxlID09PSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICB0aGlzLl9vbmx5VmlzaWJsZVNlYXJjaEZpZWxkcyh0aGlzLnNlYXJjaEZpZWxkcykuZm9yRWFjaCgoc2Y6IFNlYXJjaEZpZWxkKSA9PiB7XHJcbiAgICAgICAgLy9pZiAoc2YudmFsdWUgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoc2Yub3BlcmF0b3IgIT0gbnVsbCAmJiBzZi5vcGVyYXRvciAhPSB1bmRlZmluZWQgJiYgc2YudmFsdWUgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICBsZXQgZmlsdGVyQnlQcm9wZXJ0eTogSUZpbHRlcmVkUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgb3BlcmF0b3I6IHNmLm9wZXJhdG9yXHJcbiAgICAgICAgICAgICwgZmlsdGVyVmFsdWU6IHNmLnZhbHVlXHJcbiAgICAgICAgICAgICwgcHJvcHJldHlOYW1lOiBzZi5maWVsZFxyXG4gICAgICAgICAgICAsIGhlYWRlcjogc2YubGFiZWxWYWx1ZVxyXG4gICAgICAgICAgICAsIHR5cGU6IHNmLnR5cGVcclxuICAgICAgICAgICAgLCBjb21ib2JveExhYmVsOiBzZi5jb21ib2JveExhYmVsXHJcbiAgICAgICAgICAgICwgY3VycmVuY3k6IHNmLmN1cnJlbmN5XHJcbiAgICAgICAgICAgICwgaXNGcmFjdGlvbjogc2YuaXNGcmFjdGlvblxyXG4gICAgICAgICAgICAsIG51bU9mRGVjaW1hbDogc2YubnVtT2ZEZWNpbWFsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycy5wdXNoKGZpbHRlckJ5UHJvcGVydHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzZi5vcGVyYXRvciA9PSB1bmRlZmluZWQgfHwgc2Yub3BlcmF0b3IgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgc2VhcmNoIGZpZWxkIHdpdGggW2ZpZWxkIDogJHtzZi5maWVsZH1dIGhhdmUgbm8gb3BlcmF0b3JzYClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xvbmVQYWdlZFJlcXVlc3QocmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgbGV0IGNsb25lOiBJUGFnZWRSZXF1ZXN0ID0ge1xyXG4gICAgICBtYXhSZXN1bHRDb3VudDogcmVxdWVzdC5tYXhSZXN1bHRDb3VudCxcclxuICAgICAgc2tpcENvdW50OiByZXF1ZXN0LnNraXBDb3VudCxcclxuICAgICAgc29ydGluZzogcmVxdWVzdC5zb3J0aW5nLFxyXG4gICAgICBrZXl3b3JkOiByZXF1ZXN0LmtleXdvcmQsXHJcbiAgICAgIGZpbHRlcnM6IHJlcXVlc3QuZmlsdGVycyxcclxuICAgICAgZ2V0QWxsRGF0YTogcmVxdWVzdC5nZXRBbGxEYXRhLFxyXG4gICAgICBzdW1tYXJpZXM6IHJlcXVlc3Quc3VtbWFyaWVzXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdEhhdmVTdW1tYXJ5UHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBsZXQgaGF2ZVN1bW1hcnlDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaGF2ZVN1bW1hcnkgPT09IHRydWUpO1xyXG4gICAgaWYgKGhhdmVTdW1tYXJ5Q29sdW1ucyAmJiBoYXZlU3VtbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBwcm9wZXJ0aWVzID0gaGF2ZVN1bW1hcnlDb2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFN1bW1hcmllcygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhZ2Uuc3VtbWFyaWVzKSB7XHJcbiAgICAgIHRoaXMucGFnZS5zdW1tYXJpZXMuZm9yRWFjaChzID0+IHtcclxuICAgICAgICB0aGlzLnN1bW1hcmllc1tzLnByb3ByZXR5XSA9IHMuc3VtbWFyeTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0TXVsdGlTb3J0TWV0YUl0ZW1zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc29ydCA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc29ydE1ldGFzKSB7XHJcbiAgICAgIHRoaXMuc29ydE1ldGFzLmZvckVhY2goKHM6IFNvcnRNZXRhKSA9PiB7XHJcbiAgICAgICAgbGV0IHNvcnQ6IElTb3J0QnlQcm9wcmV0eSA9IHtcclxuICAgICAgICAgIHByb3BlcnR5OiBzLmZpZWxkLFxyXG4gICAgICAgICAgb3JkZXI6IHMub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc29ydEl0ZW0gPSB0aGlzLl9zb3J0LmZpbmQocyA9PiBzLnByb3BlcnR5ID09IHNvcnQucHJvcGVydHkpO1xyXG5cclxuICAgICAgICBpZiAoc29ydEl0ZW0pIHtcclxuICAgICAgICAgIGlmIChzb3J0SXRlbS5vcmRlciAhPSBzb3J0Lm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHNvcnRJdGVtLm9yZGVyID0gc29ydC5vcmRlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zb3J0LnB1c2goc29ydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvU29ydE1ldGEodGFibGVMYXp5TG9hZEV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0RmllbGQgJiYgdGFibGVMYXp5TG9hZEV2ZW50LnNvcnRPcmRlcikge1xyXG4gICAgICAgIGxldCBzb3J0TWV0YTogSVNvcnRNZXRhID0ge1xyXG4gICAgICAgICAgZmllbGQ6IHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0RmllbGQsXHJcbiAgICAgICAgICBvcmRlcjogdGFibGVMYXp5TG9hZEV2ZW50LnNvcnRPcmRlclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc29ydE1ldGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGFibGVMYXp5TG9hZEV2ZW50Lm11bHRpU29ydE1ldGEpIHtcclxuICAgICAgICByZXR1cm4gdGFibGVMYXp5TG9hZEV2ZW50Lm11bHRpU29ydE1ldGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFtzb3J0TW9kZV0gaGF2ZSBiZWVuIHNldCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSA9IFwiXCJcclxuICAgIC8vZXhjbHVkZSB1c2VsZXNzIEdyaWQgZmlsdGVyIFxyXG4gICAgdGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMgPSB0aGlzLl9leGNsdWRlVXNlbGVzc0dyaWRGaWx0ZXIodGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMpXHJcblxyXG4gICAgLy9hZGQgc2VhcmNoIEJveCBmaWx0ZXJzIGh0bWxcclxuICAgIGlmICh0aGlzLl9zZWFyY2hCb3hGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSA9IHRoaXMuX2h0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2VcclxuICAgICAgICAuZ2VuZXJhdGVHcmlkRmlsdGVyc1RlbXBsYXRlKHRoaXMuX3NlYXJjaEJveEZpbHRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vYWRkIGdyaWQgaGVhZGVyIGZpbHRlcnMgaHRtbFxyXG4gICAgaWYgKHRoaXMuX2dyaWRIZWFkZXJGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSArPSB0aGlzLl9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlXHJcbiAgICAgICAgLmdlbmVyYXRlR3JpZEZpbHRlcnNUZW1wbGF0ZSh0aGlzLl9ncmlkSGVhZGVyRmlsdGVycywgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZUNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXhjbHVkZVVzZWxlc3NHcmlkRmlsdGVyKGZpbHRlcnM6IElGaWx0ZXJlZFJlcXVlc3RbXSkge1xyXG4gICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKHggPT5cclxuICAgICAgeC5maWx0ZXJWYWx1ZSAhPT0gbnVsbCAmJiB4LmZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgeC5maWx0ZXJWYWx1ZSAhPT0gXCJcIiAmJiB4Lm9wZXJhdG9yICE9PSB1bmRlZmluZWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leGNsdWRlVXNlbGVzc0ZpbHRlcnMocGFnZWRSZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0KTogSVBhZ2VkUmVxdWVzdCB7XHJcbiAgICBpZiAocGFnZWRSZXF1ZXN0ICYmIHBhZ2VkUmVxdWVzdC5maWx0ZXJzKSB7XHJcbiAgICAgIHBhZ2VkUmVxdWVzdC5maWx0ZXJzID0gcGFnZWRSZXF1ZXN0LmZpbHRlcnMuZmlsdGVyKGYgPT4gZi5maWx0ZXJWYWx1ZSAhPSB1bmRlZmluZWQgJiYgZi5maWx0ZXJWYWx1ZSAhPSBudWxsKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhZ2VkUmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydEV4Y2VsKCkge1xyXG4gICAgdGhpcy5wYWdlZFJlcXVlc3QhIS5nZXRBbGxEYXRhID0gdHJ1ZVxyXG4gICAgaWYgKHRoaXMuY3J1ZFNlcnZpY2UgIT0gbnVsbCAmJiB0aGlzLmNydWRTZXJ2aWNlICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlzR3JpZERhdGFQYWdlZEluQXBpKSB7XHJcbiAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ2V0QWxsUGFnZWQodGhpcy5wYWdlZFJlcXVlc3QhISkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodmFsdWU6IElQYWdlZFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkSXRlbXMgPSBFeHBvcnRFeGNlbEhlbHBlci5wcmVwcm9jZXNzRGF0ZUZvckV4Y2VsKHZhbHVlLml0ZW1zKTtcclxuICAgICAgICAgICAgdmFsdWUuaXRlbXMgPSBmb3JtYXR0ZWRJdGVtcztcclxuICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhRnJvbUFwaVRvRXhjZWxTaGVldCh2YWx1ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGFnZS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLnBhZ2UubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSB0aGlzLnBhZ2UuaXRlbXMuZmlsdGVyKChjb2w6IGFueSkgPT4gIWNvbC5pc0J1dHRvbik7XHJcbiAgICAgIGZpbHRlcmVkRGF0YSA9IEV4cG9ydEV4Y2VsSGVscGVyLnByZXByb2Nlc3NEYXRlRm9yRXhjZWwoZmlsdGVyZWREYXRhKTtcclxuICAgICAgdGhpcy5wYWdlLml0ZW1zID0gZmlsdGVyZWREYXRhXHJcbiAgICAgIHRoaXMuZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodGhpcy5wYWdlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodmFsdWU6IGFueSkge1xyXG4gICAgaW1wb3J0KFwieGxzeFwiKS50aGVuKHhsc3ggPT4ge1xyXG4gICAgICBjb25zdCB3b3JrYm9vayA9IHhsc3gudXRpbHMuYm9va19uZXcoKTtcclxuICAgICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0IS5maWx0ZXJzPy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIGNvbnN0IG1hcHBlZEZpbHRlcnMgPSB0aGlzLnBhZ2VkUmVxdWVzdCEuZmlsdGVycz8ubWFwKGZpbHRlciA9PiAoe1xyXG4gICAgICAgICAgcHJvcGVydHk6IGZpbHRlci5wcm9wcmV0eU5hbWUsXHJcbiAgICAgICAgICBvcGVyYXRvck5hbWU6IHRoaXMuZ2V0RmlsdGVyT3BlcmF0b3JOYW1lKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLmZpbHRlclZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB4bHN4LnV0aWxzLmpzb25fdG9fc2hlZXQoPGFueVtdPm1hcHBlZEZpbHRlcnMpXHJcbiAgICAgICAgeGxzeC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgZmlsdGVycywgJ0ZpbHRlcnMnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNlbGVjdGVkQ29sdW1uc0ZpZWxkcyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcih4ID0+ICF4LmlzQnV0dG9uKS5tYXAoY29sdW1uID0+IGNvbHVtbi50cmFuc2xhdGVkSGVhZGVyISEpXHJcbiAgICAgIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcyA9IHNlbGVjdGVkQ29sdW1uc0ZpZWxkcy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSAnJylcclxuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YSA9IHZhbHVlLml0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YTogeyBbaGVhZGVyOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICByb3dEYXRhW2NvbC50cmFuc2xhdGVkSGVhZGVyISFdID0gaXRlbVtjb2wuZmllbGRdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByb3dEYXRhO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgZmlsdGVyZWRXb3Jrc2hlZXREYXRhID0gdGhpcy5yZW1vdmVOb25FeGlzdGluZ0NvbHVtbnMod29ya3NoZWV0RGF0YSwgc2VsZWN0ZWRDb2x1bW5zRmllbGRzKVxyXG4gICAgICBjb25zdCB3b3Jrc2hlZXQgPSB4bHN4LnV0aWxzLmpzb25fdG9fc2hlZXQoZmlsdGVyZWRXb3Jrc2hlZXREYXRhKTtcclxuICAgICAgeGxzeC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgd29ya3NoZWV0LCAnRGF0YScpO1xyXG4gICAgICBjb25zdCBleGNlbEJ1ZmZlcjogYW55ID0geGxzeC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICB0aGlzLnNhdmVBc0V4Y2VsRmlsZShleGNlbEJ1ZmZlciwgXCJleGNlbFwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUFzRXhjZWxGaWxlKGJ1ZmZlcjogYW55LCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgRVhDRUxfVFlQRSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtjaGFyc2V0PVVURi04JztcclxuICAgIGxldCBFWENFTF9FWFRFTlNJT04gPSAnLnhsc3gnO1xyXG4gICAgY29uc3QgZGF0YTogQmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XHJcbiAgICAgIHR5cGU6IEVYQ0VMX1RZUEVcclxuICAgIH0pO1xyXG4gICAgRmlsZVNhdmVyLnNhdmVBcyhkYXRhLCBmaWxlTmFtZSArICdfZXhwb3J0XycgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIEVYQ0VMX0VYVEVOU0lPTik7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXJPcGVyYXRvck5hbWUob3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yVHlwZSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkVRVUFMOiByZXR1cm4gJ0VRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTEVTU09SRVFVQUw6IHJldHVybiAnTEVTUyBPUiBFUVVBTCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkdSRUFURVJPUkVRVUFMOiByZXR1cm4gJ0dSRUFURVIgT1IgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5MRVNTOiByZXR1cm4gJ0xFU1MnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5HUkVBVEVSOiByZXR1cm4gJ0dSRUFURVInO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5OT1RFUVVBTDogcmV0dXJuICdOT1QgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5DT05UQUlOUzogcmV0dXJuICdDT05UQUlOUyc7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnVU5LTk9XTl9PUEVSQVRPUic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVOb25FeGlzdGluZ0NvbHVtbnMod29ya3NoZWV0RGF0YTogYW55W10sIHNlbGVjdGVkQ29sdW1uc0ZpZWxkczogc3RyaW5nW10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gd29ya3NoZWV0RGF0YS5tYXAocm93ID0+IHtcclxuICAgICAgY29uc3QgbmV3Um93OiBhbnkgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBjb2wgb2Ygc2VsZWN0ZWRDb2x1bW5zRmllbGRzKSB7XHJcbiAgICAgICAgaWYgKHJvdy5oYXNPd25Qcm9wZXJ0eShjb2wpKSB7XHJcbiAgICAgICAgICBuZXdSb3dbY29sXSA9IHJvd1tjb2xdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3Um93O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIZWFkZXJGaWx0ZXJzKCkge1xyXG4gICAgaWYgKHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlclwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke3RoaXMuZm9ybU5hbWV9LWZpbHRlck1vZGVgKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7IC8vdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9PT0gZmFsc2VcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IHRydWU7XHJcbiAgICAgIHRoaXMuZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyLXNsYXNoXCI7XHJcbiAgICAgIHRoaXMuZmlsdGVyVG9vbHRpcCA9IFwiaGlkZV9maWx0ZXJcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUhlYWRlckZpbHRlcnNNb2RlKCkge1xyXG4gICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgdGhpcy5kdC5jbGVhcigpXHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuZm9ybU5hbWV9LWZpbHRlck1vZGVgLCB0aGlzLmZpbHRlck1vZGVUb29sdGlwKVxyXG4gICAgICBpZiAodGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9PT0gXCJtZW51X21vZGVcIikge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcIm1lbnVcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1jaGVja1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcInJvd19tb2RlXCI7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmR0LmZpbHRlcnNbY29sLmZpZWxkXSA9IFt7IHZhbHVlOiBudWxsLCBtYXRjaE1vZGU6IHVuZGVmaW5lZCB9XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kdC5fZmlsdGVyKClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNoYW5nZUhlYWRlckZpbHRlcnNNb2RlID0gXCJyb3dcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1lbGxpcHNpcy12XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IFwibWVudV9tb2RlXCI7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmR0LmZpbHRlcnNbY29sLmZpZWxkXSA9IHsgdmFsdWU6IG51bGwsIG1hdGNoTW9kZTogdW5kZWZpbmVkIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHQuX2ZpbHRlcigpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEhlYWRlckNsYXNzQ29sb3IoY29sdW1uVHlwZTogRGlzcGxheVR5cGVzKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2xvcmZ1bCA9IHRoaXMubGF5b3V0SGVscGVyU2VydmljZS5sYXlvdXRDb25maWd1cmF0aW9uLmlzQ29sb3JmdWxNb2RlRW5hYmxlZDtcclxuICAgIGlmIChjb2xvcmZ1bCA9PT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgY29sb3JGb3JJbnRlZ2VyRGlzcGxheSA9IERpc3BsYXlUeXBlQ29sb3JzW2NvbHVtblR5cGVdIHx8ICd3aGl0ZS1ncmlkJztcclxuICAgICAgcmV0dXJuIGNvbG9yRm9ySW50ZWdlckRpc3BsYXk7XHJcbiAgICB9IGVsc2UgcmV0dXJuICd3aGl0ZS1ncmlkJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yZnVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0SGVscGVyU2VydmljZS5sYXlvdXRDb25maWd1cmF0aW9uLmlzQ29sb3JmdWxNb2RlRW5hYmxlZDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbENvbHVtbnNQcm9jZXNzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGV2aXNlU29jaWV0ZU51bU9mRGVjaW1hbDogbnVtYmVyID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYXBwU2V0dGluZ3MuZGV2aXNlU29jaWV0ZS5ub21icmVEZWNpbWFsZXMgPz8gRGVmYXVsdFNvY2lldGVEZXZpc2Uubm9tYnJlRGVjaW1hbGVzO1xyXG5cclxuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgIC8vIHNldCBpc051bWVyaWNcclxuICAgICAgY29sLmlzTnVtZXJpYyA9IGNvbC50eXBlICE9IHVuZGVmaW5lZCAmJiBjb2wudHlwZSAhPSBudWxsICYmIChOdW1lcmljRGlzcGxheVR5cGVzLmluZGV4T2YoY29sLnR5cGUpID49IDApO1xyXG5cclxuICAgICAgLy8gc2V0IGZpbHRlcklucHV0VHlwZVxyXG4gICAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREFURV9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2RhdGUnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5EQVRFVElNRV9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2RhdGUnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWTpcclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ251bWVyaWMnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5DSEVDS0JPWF9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2Jvb2xlYW4nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ3RleHQnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IG51bU9mRGVjaW1hbFxyXG4gICAgICBpZiAoY29sLm51bU9mRGVjaW1hbCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKCFjb2wudHlwZSkge1xyXG4gICAgICAgIGNvbC5udW1PZkRlY2ltYWwgPSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb2wuaXNOdW1lcmljKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sLnR5cGUgPT09IERpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gZGV2aXNlU29jaWV0ZU51bU9mRGVjaW1hbDtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sLnR5cGUgPT09IERpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVkpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNhbGVuZGFyRXZlbnRDbGljayhpdGVtOiBhbnkpIHtcclxuICAgIGlmIChpdGVtLm1vZGUgPT09IFwiU0VBUkNIXCIpIHtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyRXZlbnRDbGljay5lbWl0KGl0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGF0ZVJhbmdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBzdGFydCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uc3RhcnQpXHJcbiAgICBsZXQgZW5kID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5lbmQpXHJcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XHJcbiAgICAgIHN0YXJ0LnZhbHVlID0gZXZlbnQuc3RhcnQ7XHJcbiAgICAgIGVuZC52YWx1ZSA9IGV2ZW50LmVuZDtcclxuICAgICAgc3RhcnQuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICBlbmQuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlYXJjaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsbFNlYXJjaEhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0Lm1heFJlc3VsdENvdW50ID0gZXZlbnQubWF4UmVzdWx0Q291bnQ7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNraXBDb3VudCA9IGV2ZW50LnNraXBDb3VudDtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgICAgdGhpcy5wYWdlJC5uZXh0KHsgLi4udGhpcy5wYWdlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SGVhZGVyVGl0bGVzKHRpdGxlczogc3RyaW5nW10sIGl0ZW06IGFueSk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghdGl0bGVzIHx8ICFpdGVtKVxyXG4gICAgICByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3Qga2V5ID0gaXRlbS51aWQ7XHJcbiAgICBpZiAodGhpcy50aXRsZUNhY2hlLmhhcyhrZXkpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRpdGxlQ2FjaGUuZ2V0KGtleSkgfHwgW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzID0gdGl0bGVzLm1hcCh0ID0+IGl0ZW1bdF0pLmZpbHRlcih2ID0+ICEhdik7XHJcbiAgICB0aGlzLnRpdGxlQ2FjaGUuc2V0KGtleSwgcmVzKTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlVHlwZUljb25DbGFzcyhleHQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICgoZXh0ID8/ICcnKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ3BkZic6IHJldHVybiAncGkgcGktZmlsZS1wZGYnO1xyXG4gICAgICBjYXNlICdkb2MnOiBjYXNlICdkb2N4JzogcmV0dXJuICdwaSBwaS1maWxlLXdvcmQnO1xyXG4gICAgICBjYXNlICd4bHMnOiBjYXNlICd4bHN4JzogY2FzZSAnY3N2JzogcmV0dXJuICdwaSBwaS1maWxlLWV4Y2VsJztcclxuICAgICAgY2FzZSAncG5nJzogY2FzZSAnanBnJzogY2FzZSAnanBlZyc6IGNhc2UgJ2dpZic6IGNhc2UgJ2JtcCc6IGNhc2UgJ3N2Zyc6IGNhc2UgJ3dlYnAnOlxyXG4gICAgICAgIHJldHVybiAncGkgcGktaW1hZ2UnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3BpIHBpLWZpbGUnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVR5cGVJY29uQ29sb3IoZXh0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoKGV4dCA/PyAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiByZXR1cm4gJyNFMjU3NEMnO1xyXG4gICAgICBjYXNlICdkb2MnOiBjYXNlICdkb2N4JzogcmV0dXJuICcjMkI1NzlBJztcclxuICAgICAgY2FzZSAneGxzJzogY2FzZSAneGxzeCc6IGNhc2UgJ2Nzdic6IHJldHVybiAnIzIxNzM0Nic7XHJcbiAgICAgIGNhc2UgJ3BuZyc6IGNhc2UgJ2pwZyc6IGNhc2UgJ2pwZWcnOiBjYXNlICdnaWYnOiBjYXNlICdibXAnOiBjYXNlICdzdmcnOiBjYXNlICd3ZWJwJzpcclxuICAgICAgICByZXR1cm4gJyNGNTlFMEInO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJyM2QjcyODAnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdGF0dXNGaWx0ZXJDaGFuZ2VkKGV2dDogYW55KSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IGV2dDtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbHRlcihzZiA9PiBzZi5maWVsZCAhPT0gdGhpcy5lbnRpdHlJbmZvPy5zdGF0dXNDb2x1bW5OYW1lKTtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzPy5wdXNoKHtcclxuICAgICAgZmllbGQ6IHRoaXMuZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSA/PyBcIlwiLFxyXG4gICAgICB2YWx1ZTogZXZ0LFxyXG4gICAgICBsYWJlbFZhbHVlOiAnJyxcclxuICAgICAgdHlwZTogSW5wdXRUeXBlcy5DT01CT0JPWCxcclxuICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTCxcclxuICAgICAgc3R5bGVDbGFzczogXCJoaWRkZW5cIlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRlbXBTZWFyY2hGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkcyA/PyB0aGlzLnRlbXBTZWFyY2hGaWVsZHNcclxuICB9XHJcblxyXG4gIG9uV29ya2Zsb3dFdGF0RmlsdGVyQ2hhbmdlZChldnQ6IGFueSkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBldnQ7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzPy5maWx0ZXIoc2YgPT4gc2YuZmllbGQgIT09IFwiV29ya2Zsb3dFdGF0XCIpO1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHM/LnB1c2goe1xyXG4gICAgICBmaWVsZDogXCJXb3JrZmxvd0V0YXRcIixcclxuICAgICAgdmFsdWU6IGV2dCxcclxuICAgICAgbGFiZWxWYWx1ZTogJycsXHJcbiAgICAgIHR5cGU6IElucHV0VHlwZXMuQ09NQk9CT1gsXHJcbiAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUuRVFVQUwsXHJcbiAgICAgIHN0eWxlQ2xhc3M6IFwiaGlkZGVuXCJcclxuICAgIH0pO1xyXG4gICAgdGhpcy50ZW1wU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHMgPz8gdGhpcy50ZW1wU2VhcmNoRmllbGRzXHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZShmaWxlLCBmaWxlRXh0ZW5zaW9uLCBpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlLCBmaWxlRXh0ZW5zaW9uOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XHJcbiAgICAgIGlmICghYXJyYXlCdWZmZXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgY29uc3QgZmljaGllclRvU2VuZCA9IG5ldyBGaWNoaWVyKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZGF0ZUZpY2hpZXIgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbSA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5vYmpldCA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbUZpY2hpZXJDb21wbGV0ID0gZmlsZS5uYW1lO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRlc2NyaXB0aW9uID0gJyc7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuY29udGVudSA9IGJhc2U2NENvbnRlbnQ7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQudGFibGVMaWVlID0gdGhpcy5idXNpbmVzc0NsYXNzO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnBrZXkgPSBpdGVtLnVpZD8udG9TdHJpbmcoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5leHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uXHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlLmNyZWF0ZShmaWNoaWVyVG9TZW5kKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXCJmaWNoaWVyX2pvaW50XCIpO1xyXG4gICAgICAgICAgdGhpcy5vblNhdmUuZW1pdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgfVxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQrKztcclxuXHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ092ZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUwLFxyXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQtLTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRyYWdFbnRlckNvdW50ID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZVBvc2l0aW9uID0ge1xyXG4gICAgICB4OiBldmVudC5jbGllbnRYICsgNTAsXHJcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkNvbmZpcm1TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uXHJcbiAgICAgIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0aW9uKVxyXG4gICAgICB8fCB0aGlzLnNlbGVjdGlvbi5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHRoaXMuX3JlZj8uY2xvc2UoW10pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24ubWFwKGkgPT4gaVt0aGlzLmtleV0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0OiBEcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0ID0ge1xyXG4gICAgICBpdGVtS2V5UHJvcGVydHlOYW1lOiB0aGlzLmtleSxcclxuICAgICAgaXRlbXM6IHNlbGVjdGlvblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9yZWY/LmNsb3NlKGRyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWxTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3JlZikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX3JlZi5jbG9zZShbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4dHJhY3REaWFsb2dDb25maWdEYXRhKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF0aGlzLmNvbmZpZz8uZGF0YSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNvbmZpZ0RhdGE6IGFueSA9IHRoaXMuY29uZmlnLmRhdGE7XHJcblxyXG4gICAgICBpZiAoJ2lzQWR2YW5jZWRTZWFyY2gnIGluIGNvbmZpZ0RhdGEpIHtcclxuICAgICAgICB0aGlzLmlzQWR2YW5jZWRTZWFyY2ggPSBjb25maWdEYXRhLmlzQWR2YW5jZWRTZWFyY2ggPz8gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgnc2VsZWN0aW9uTW9kZScgaW4gY29uZmlnRGF0YSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IGNvbmZpZ0RhdGEuc2VsZWN0aW9uTW9kZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCdzZWxlY3RLZXlPbmx5JyBpbiBjb25maWdEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RLZXlPbmx5ID0gY29uZmlnRGF0YS5zZWxlY3RLZXlPbmx5O1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyb3IpIFxyXG4gICAge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIGF0IGV4dHJhY3REaWFsb2dDb25maWdEYXRhIDogJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIHRyeUFwcGx5RW50aXR5SW5mbygpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2J1c2luZXNzQ2xhc3MgfHwgIXRoaXMuX2VudGl0eUluZm8pIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmFwcGx5RW50aXR5SW5mbyh0aGlzLl9lbnRpdHlJbmZvKTtcclxuICAgIHRoaXMubG9hZFN0YXR1c0NvbG9ycygpO1xyXG4gICAgdGhpcy5sb2FkU3RhdHVzQ29sb3JzRGV0YWlsc0J5QnVzaW5lc3NDbGFzcygpO1xyXG4gICAgdGhpcy5jYWxlbmRlclNjaGVtYSA9IHRoaXMuZ2V0RXZlbnREYXRlQ2FsZW5kYXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRFdmVudERhdGVDYWxlbmRhcigpOiBFdmVudFNjaGVtYSB7XHJcbiAgICBpZiAoIXRoaXMuX2VudGl0eUluZm8pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW50aXR5SW5mbyBub24gY2hhcmfDqVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiAndWlkJyxcclxuICAgICAgc3RhcnQ6IHRoaXMuX2VudGl0eUluZm8uY2FsZW5kYXJTdGFydERhdGVDb2x1bW4gPz8gJycsXHJcbiAgICAgIGVuZDogdGhpcy5fZW50aXR5SW5mby5jYWxlbmRhckVuZERhdGVDb2x1bW4gPz8gJycsXHJcbiAgICAgIHRpdGxlOiBbXHJcbiAgICAgICAgdGhpcy5fZW50aXR5SW5mby5jYXJkVGl0bGVDb2x1bW4gPz8gJycsXHJcbiAgICAgICAgdGhpcy5fZW50aXR5SW5mby5jYXJkU3ViSGVhZGVyQ29sdW1uID8/ICcnLFxyXG4gICAgICAgIHRoaXMuX2VudGl0eUluZm8uY2FyZERlc2NyaXB0aW9uQ29sdW1uID8/ICcnXHJcbiAgICAgIF0uZmlsdGVyKEJvb2xlYW4pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXRoaXMucGFnZT8uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZSA/IFtdIDogbnVsbDtcclxuXHJcbiAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zS2V5cyA9IG5ldyBTZXQoXHJcbiAgICAgIHRoaXMucGFnZS5pdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbVt0aGlzLmtleV0pLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoczogYW55KSA9PlxyXG4gICAgICAgIGl0ZW1zS2V5cy5oYXMoc1t0aGlzLmtleV0pLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRTdGlsbEV4aXN0cyA9IGl0ZW1zS2V5cy5oYXModGhpcy5zZWxlY3Rpb25bdGhpcy5rZXldKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZFN0aWxsRXhpc3RzKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSIsIjxkaXYgY2xhc3M9XCJncmlkXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiBbQHNsaWRlSW5PdXRdPVwic2hvd1NlYXJjaEZpZWxkID8gJ2luJyA6ICdvdXQnXCIgKm5nSWY9XCJzaG93R2xvYmFsU2VhcmNoXCI+XHJcbiAgICA8dHNpLXNlYXJjaC1ib3ggXHJcbiAgICAgIFtpc1J0bE1vZGVdPVwiaXNSdGxNb2RlXCIgXHJcbiAgICAgIFsoc2VhcmNoRmllbGRzKV09XCJzZWFyY2hGaWVsZHNcIiBcclxuICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgIFtlbnRpdHlJbmZvXT1cImVudGl0eUluZm9cIlxyXG4gICAgICBbc3RhdHVzTWV0YWRhdGFdPVwic3RhdHVzTWV0YWRhdGFcIlxyXG4gICAgICBbZGVzY3JpbWluYXRvclZhbHVlXT1cImRlc2NyaW1pbmF0b3JWYWx1ZVwiXHJcbiAgICAgIChzZWFyY2hGaWVsZHNDaGFuZ2UpPVwic2VhcmNoRmllbGRzVmFsdWVDaGFuZ2VzKCRldmVudClcIiBcclxuICAgICAgKGtleXdvcmRWYWx1ZUNoYW5nZWQpPVwia2V5d29yZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKHNlYXJjaEZpZWxkc0FwcGxpZWQpPVwic2VhcmNoKCRldmVudClcIlxyXG4gICAgICAoc3RhdHVzRmlsdGVyQ2hhbmdlZCk9XCJvblN0YXR1c0ZpbHRlckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICh3b3JrZmxvd0V0YXRGaWx0ZXJDaGFuZ2VkKT1cIm9uV29ya2Zsb3dFdGF0RmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKGNvbWJvQm94TGFiZWxDaGFuZ2VkKT1cImNvbWJvQm94TGFiZWxDaGFuZ2VkKCRldmVudClcIj5cclxuICAgIDwvdHNpLXNlYXJjaC1ib3g+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhbGVuZGVyVmlldyA9PT0gZmFsc2UgJiYgX3Nob3dDYXJkVmlldyA9PT0gZmFsc2UgJiYgX3Nob3dLYW5iYW5WaWV3ID09PSBmYWxzZVwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICBcclxuICAgIDxwLXRhYmxlICNkdCBcclxuICAgICAgW2xhenldPVwiaXNHcmlkRGF0YVBhZ2VkSW5BcGlcIiBcclxuICAgICAgW2xhenlMb2FkT25Jbml0XT1cInNlYXJjaE9uSW5pdFwiIFxyXG4gICAgICBbdG90YWxSZWNvcmRzXT1cInBhZ2UudG90YWxDb3VudFwiIFxyXG4gICAgICBbbG9hZGluZ109XCJwYWdlLmxvYWRpbmdcIiBcclxuICAgICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiIFxyXG4gICAgICBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBcclxuICAgICAgW3ZhbHVlXT1cInBhZ2UuaXRlbXNcIlxyXG4gICAgICBbcGFnaW5hdG9yXT1cInRydWVcIiBcclxuICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIFxyXG4gICAgICBbKHJvd3MpXT1cInBhZ2UucGFnZVNpemVcIlxyXG4gICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBcclxuICAgICAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJmaWVsZHMoKVwiIFxyXG4gICAgICBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCJcclxuICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbMSwgMTAsIDI1LCA1MF1cIiBcclxuICAgICAgW3NvcnRNb2RlXT1cInNvcnRNb2RlXCJcclxuICAgICAgW211bHRpU29ydE1ldGFdPVwic29ydE1ldGFzXCIgXHJcbiAgICAgIFtzZWxlY3RBbGxdPVwic2VsZWN0QWxsXCJcclxuICAgICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiIFxyXG4gICAgICBbKHNlbGVjdGlvbildPVwic2VsZWN0aW9uXCIgXHJcbiAgICAgIChvbkxhenlMb2FkKT1cImxhenlMb2FkKCRldmVudClcIlxyXG4gICAgICAob25Sb3dVbnNlbGVjdCk9XCJvblNlbGVjdGVkSXRlbXNDaGFuZ2VkKClcIlxyXG4gICAgICAoc2VsZWN0QWxsQ2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIiBcclxuICAgICAgKG9uUm93U2VsZWN0KT1cIm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKVwiXHJcbiAgICAgIChvbkNvbFJlc2l6ZSk9XCJvbkNvbFJlc2l6ZSgkZXZlbnQpXCJcclxuICAgICAgY29sdW1uUmVzaXplTW9kZT1cImV4cGFuZFwiXHJcbiAgICAgIGRhdGFLZXk9XCJ7eyBrZXkgfX1cIiBcclxuICAgICAgc2Nyb2xsSGVpZ2h0PVwiNjAwcHhcIiBcclxuICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLWdyaWRsaW5lc1wiIFxyXG4gICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie3sgJ1Nob3dpbmcnIHwgbG9jYWxpemUgfX0ge3tnZXRGaXJzdEVsZW1lbnRJbmRleCgpfX0ge3tcclxuICAgICAgICAndG8nIHwgbG9jYWxpemVcclxuICAgICAgfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSBcclxuICAgICAge3RvdGFsUmVjb3Jkc30ge3sgJ2VudHJpZXMnIHwgbG9jYWxpemUgfX1cIiBcclxuICAgICAgPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XHJcbiAgICAgICAgICAgIHt7IGhlYWRlciB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RmlsdGVyQnV0dG9uXCIgcHJlc2VudGF0aW9uRGVzaWduZXJCYXNlPVwiZ3JpZF90b2dnbGVfaGVhZGVyX2ZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbaWNvbl09XCJmaWx0ZXJJY29uXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgW3Rvb2x0aXBUZXh0XT1cImZpbHRlclRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyRmlsdGVycygpXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVhZGVyRmlsdGVyc1wiIHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfdG9nZ2xlX2hlYWRlcl9maWx0ZXJfbW9kZVwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtpY29uXT1cImZpbHRlck1vZGVJY29uXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCJmaWx0ZXJNb2RlVG9vbHRpcFwiIFtzdHlsZUNsYXNzXT1cIidtbC0xIHAtYnV0dG9uLXByaW1hcnkgcC1idXR0b24taWNvbi1vbmx5J1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyRmlsdGVyc01vZGUoKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfY2xlYXJfZmlsdGVyX2J1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCInaWNvbi1jbGVhci1maWx0ZXInXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJtbC0xIHAtZWxlbWVudCBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGVhckZpbHRlcnMoKVwiIGljb249XCJwaSBwaS1lcmFzZXJcIj5cclxuICAgICAgICAgICAgICA8L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJncmlkX2V4cG9ydF9idXR0b25cIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1maWxlLWV4Y2VsXCIgKG9uQ2xpY2spPVwiZXhwb3J0RXhjZWwoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXN1Y2Nlc3MgaG92ZXI6c2hhZG93LTYgbWwtMiBwLTEgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwiWExTXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IGNsYXNzPVwibWwtMVwiIFtvcHRpb25zXT1cImNvbHVtbnNcIiBbbmdNb2RlbF09XCJzZWxlY3RlZENvbHVtbnNcIiBvcHRpb25MYWJlbD1cInRyYW5zbGF0ZWRIZWFkZXJcIlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSB7eyAnY29sdW1uc19zZWxlY3RlZCcgfCBsb2NhbGl6ZSB9fVwiIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMTgwcHgnIH1cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3RlZENvbHVtbnNDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxkaXY+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2hvd0dsb2JhbFNlYXJjaFwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXNlYXJjaFwiIChjbGljayk9XCJzZWFyY2goKVwiPjwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0aCBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBnZXRDaGVja2JveFN0eWxlKCkgOiB7fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICd6LTEnXCIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cIiEoY29sLmlzQnV0dG9uICYmIGNvbC5hY3Rpb25EaXNwbGF5ID09IGFjdGlvblBsYWNlbWVudC5PdmVyZmxvdylcIlxyXG4gICAgICAgICAgICAgIHNjb3BlPVwiY29sXCIgW2F0dHIuZGF0YS1maWVsZF09XCJjb2wuZmllbGRcIiBbc3R5bGVdPVwiY29sLnN0eWxlXCIgcFRvb2x0aXA9XCJ7eyBjb2wudG9vbFRpcFRleHQgfCBsb2NhbGl6ZSB9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCIoIWNvbC5pc0J1dHRvbiB8fCAhaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpIHx8ICEoY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVkpKSA/IFxyXG4gICAgICAgICAgICAgIGNvbC5maWVsZCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIFtwUmVzaXphYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLmlzQnV0dG9uIHx8IGNvbC50eXBlID09PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWSB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiY29sLmlzQnV0dG9uIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKVwiIFxyXG4gICAgICAgICAgICAgIFtwUmVvcmRlcmFibGVDb2x1bW5EaXNhYmxlZF09XCJjb2wuaXNCdXR0b24gfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpXCIgcFJlb3JkZXJhYmxlQ29sdW1uXHJcbiAgICAgICAgICAgICAgcFJlc2l6YWJsZUNvbHVtbiBbbmdTdHlsZV09XCJnZXRIZWFkZXJDb2x1bW5TdHlsZShjb2wpXCJcclxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY29sdW1uXT1cImNvbC5pc0J1dHRvbiB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZCkgfHwgY29sLnR5cGUgPT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZXCJcclxuICAgICAgICAgICAgICBbY2xhc3MudHNpLWNvbC13cmFwXT1cInNob3VsZFdyYXBDb2x1bW4oY29sKVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xyXG4gICAgICAgICAgICAgICAgZ2V0SGVhZGVyQ2xhc3NDb2xvcihjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAoY29sLmlzQnV0dG9uIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKSkgPyAndy0xcmVtJyA6ICcnLFxyXG4gICAgICAgICAgICAgICAgKGNvbC5pc0J1dHRvbiB8fCBjb2wudHlwZSA9PT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVkgfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpKSA/ICdub24tcmVzaXphYmxlLWNvbHVtbicgOiAnJyxcclxuICAgICAgICAgICAgICAgIF1cIj5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdEluU3BlY2lmaWVkQ29sdW1uKGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJwLTAgbS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29sIHAtMCBtLTBcIiBbbmdDbGFzc109XCJ7J3ctMXJlbSc6IGNvbC5pc0J1dHRvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wuaGVhZGVyIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjb2wtZml4ZWQgcC0wIG0tMFwiIHN0eWxlPVwid2lkdGg6IDFyZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSAhPT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xcmVtIG0tMCBwLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkPVwie3sgY29sLmZpZWxkIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgPHRyICpuZ0lmPVwic2hvd0hlYWRlckZpbHRlcnNcIj5cclxuICAgICAgICAgIDwhLS0gPHRoIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJ3aWR0aDozcmVtXCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJ3aWR0aDozcmVtXCI+PC90aD4gLS0+XHJcbiAgICAgICAgICA8dGggW25nQ2xhc3NdPVwicGFnZS5sb2FkaW5nID8gJ25vLXotaW5kZXgnIDogJydcIiAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIj48L3RoPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuYWN0aW9uRGlzcGxheSAhPSBhY3Rpb25QbGFjZW1lbnQuT3ZlcmZsb3dcIj5cclxuICAgICAgICAgICAgICA8dGggc3R5bGU9XCJvdmVyZmxvdzogaW5oZXJpdFwiIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbC5pc0J1dHRvbiAmJiBjb2wuZmllbGQgIT0gb3ZlcmZsb3dDb2x1bW5GaWVsZCA7IGVsc2UgZmlsdGVyTGVzc0NvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2wudHlwZVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERBVEUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLkRBVEVfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIFt0eXBlXT1cIidkYXRlJ1wiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkRBVEVfSVNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciAjY2FsRGF0ZSBbbmdNb2RlbF09XCJ2YWx1ZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwiZmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQmx1cik9XCJmaWx0ZXIoY2FsRGF0ZS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJmaWx0ZXIobnVsbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZmlsdGVyKGNhbERhdGUudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEQVRFVElNRSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJkaXNwbGF5VHlwZXMuREFURVRJTUVfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIFt0eXBlXT1cIidkYXRlJ1wiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkRBVEVfSVNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciAjY2FsRGF0ZVRpbWUgW25nTW9kZWxdPVwidmFsdWVcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cImZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiZmlsdGVyKGNhbERhdGVUaW1lLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckNsaWNrKT1cImZpbHRlcihudWxsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWx0ZXIoY2FsRGF0ZVRpbWUudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDVVJSRU5DWSBTT0NJRVRFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCInbnVtZXJpYydcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5FUVVBTFNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgI2N1cnJTb2NpZXRlSW5wdXQgW2lucHV0RmllbGRdPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiZmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZmlsdGVyKGN1cnJTb2NpZXRlSW5wdXQuaW5wdXRGaWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDVVJSRU5DWSBPVEhFUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIFt0eXBlXT1cIidudW1lcmljJ1wiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkVRVUFMU1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCIgbGV0LXZhbHVlIGxldC1maWx0ZXI9XCJmaWx0ZXJDYWxsYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQgI2N1cnJPdGhlcklucHV0IFtpbnB1dEZpZWxkXT1cInZhbHVlXCIgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJmaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWx0ZXIoY3Vyck90aGVySW5wdXQuaW5wdXRGaWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSU5URUdFUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJkaXNwbGF5VHlwZXMuSU5URUdFUl9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiJ251bWVyaWMnXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFtkaXNwbGF5XT1cImNoYW5nZUhlYWRlckZpbHRlcnNNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCIgW21hdGNoTW9kZV09XCJmaWx0ZXJNYXRjaE1vZGUuRVFVQUxTXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyICNpbnRlZ2VySW5wdXQgW2lucHV0RmllbGRdPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiZmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZmlsdGVyKGludGVnZXJJbnB1dC5pbnB1dEZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERFQ0lNQUwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIFt0eXBlXT1cIidudW1lcmljJ1wiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkVRVUFMU1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCIgbGV0LXZhbHVlIGxldC1maWx0ZXI9XCJmaWx0ZXJDYWxsYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1JbnB1dCAjZGVjaW1hbElucHV0IFtpbnB1dEZpZWxkXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbHRlcihkZWNpbWFsSW5wdXQuaW5wdXRGaWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBSQVRFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImRpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCInbnVtZXJpYydcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIiBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5FUVVBTFNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtSW5wdXQgI3JhdGVJbnB1dCBbaW5wdXRGaWVsZF09XCJ2YWx1ZVwiIFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbHRlcihyYXRlSW5wdXQuaW5wdXRGaWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBERUZBVUxUICh0ZXh0LCBib29sZWFuLCBvciBhbnkgdW5oYW5kbGVkIHR5cGUpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCJjb2wuZmlsdGVySW5wdXRUeXBlXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFtkaXNwbGF5XT1cImNoYW5nZUhlYWRlckZpbHRlcnNNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbC5udW1PZkRlY2ltYWxcIiBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkVRVUFMU1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZpbHRlckxlc3NDb2x1bW4+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgIFxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaXRlbSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJyb3dJbmRleFwiPlxyXG5cclxuICAgICAgICA8IS0tIENBU0UgOiBtdWx0aXBsZSBzZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgPHRyIFtuZ1N0eWxlXT1cIml0ZW0uY29sb3IgJiYgaXRlbS5jb2xvciAhPT0gJycgPyB7J2JhY2tncm91bmQtY29sb3InOiBpdGVtLmNvbG9yfSA6IHt9XCIgKm5nSWY9XCJcclxuICAgICAgICAgICAgc2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlO1xyXG4gICAgICAgICAgICBlbHNlIG5vdE11bHRpcGxlU2VsZWN0aW9uTW9kZUJsb2NrXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsaXRlbSlcIiAoZHJhZ2VudGVyKT1cIm9uRHJhZ0VudGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPHRkIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGdldENoZWNrYm94U3R5bGUoKSA6IHt9XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8IS0tIDx0ZCBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0KGl0ZW0pXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyXCIgKGNsaWNrKT1cImRlbGV0ZShpdGVtKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcblxyXG4gICAgICAgICAgICA8dGQgICpuZ0lmPVwiIShjb2wuaXNCdXR0b24gJiYgY29sLmFjdGlvbkRpc3BsYXkgPT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93KVwiIFtuZ1N0eWxlXT1cImdldEJvZHlDb2x1bW5TdHlsZShjb2wpXCIgW2NsYXNzLnRzaS1jb2wtd3JhcF09XCJzaG91bGRXcmFwQ29sdW1uKGNvbClcIiBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIHN0eWxlPVwiaGVpZ2h0OiBtaW4tY29udGVudDsgbWFyZ2luLWxlZnQ6IC0uNXJlbTtcIiAtLT5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0ZVBpY2tlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGVUaW1lUGlja2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlVGltZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVUSU1FX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtzaG93VGltZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja2JveC1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ERUNJTUFMX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByYXRlT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlJBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlOZXN0ZWRQcm9wT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LW5lc3RlZC1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuTkVTVEVEX1BST1BfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlTdGF0dXNDb2xvckJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLURpc3BsYXktTmVzdGVkLVByb3AgW3NvdXJjZVVybF09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5U291cmNlVXJsXCIgW2lkXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlWYWx1ZV09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5bGFiZWxGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1EaXNwbGF5LU5lc3RlZC1Qcm9wPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzQ29sb3JCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2xvcjsgZWxzZSBkaXNwbGF5U3RhdHVzVmFsdWVDb2x1bW5CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSByb3VuZGVkIHRleHQtd2hpdGUgdGV4dC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbVtjb2wuZmllbGRdfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+IFxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzVmFsdWVDb2x1bW5CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW5WYWx1ZTsgZWxzZSBkaXNwbGF5U3RhdHVzQ29sdW1uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS08cC10YWcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImdldFN0YXR1c0NvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5ICYmIGdldFN0YXR1c09wdGlvbkZvclN0YXR1c0hpc3RvcnkoaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIGZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIm9wdC5jb2xvckhleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5jb2xvckhleCA/ICd3aGl0ZScgOiAnYmxhY2snXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWJsYWNrIGJnLXdoaXRlJzogIW9wdC5jb2xvckhleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtd2hpdGUnOiBvcHQuY29sb3JIZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQudHJhbnNsYXRlZExhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSAmJiAhZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSBmb250LWJvbGQgc3RhdHVzLWJhZGdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktc3RhdHVzLWNvbHVtbiAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNDb2x1bW5CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW47IGVsc2UgZGlzcGxheUJ1dHRvbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tPHAtdGFnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz4tLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YSAmJiBnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwibGlnaHRlbkNvbG9yKG9wdC5jb2xvckhleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRSZWFkYWJsZVRleHRDb2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy10b3BdPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWJvdHRvbV09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC50cmFuc2xhdGVkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGEgJiYgIWdldFN0YXR1c09wdGlvbihpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlCdXR0b25CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNCdXR0b247IGVsc2UgZGlzcGxheUltYWdlXCIgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGZyb3plbi1jb2x1bW4tcnRsLW1vZGUganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiAgW3N0eWxlQ2xhc3NdPVwiY29sLnN0eWxlQ2xhc3NcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ7eyBjb2wuYnV0dG9uSWNvbiB9fVwiIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCJjb2wudG9vbFRpcFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiY29sLmJ1dHRvbkxhYmVsID8gY29sLmJ1dHRvbkxhYmVsIDogaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGl0ZW0sIGNvbC5maWVsZClcIiA+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1pbWFnZSAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlJbWFnZT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWTsgZWxzZSBkaXNwbGF5SWNvbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTJyZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLWltYWdlLWRpc3BsYXkgW2hlYWRlclRpdGxlc109XCJnZXRIZWFkZXJUaXRsZXMoY29sLmhlYWRlclRpdGxlcywgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lzUm91bmRlZF09XCJjb2wuaXNSb3VuZGVkXCIgW3NyY109XCJpdGVtW2NvbC5maWVsZF1cIiBbYWx0XT1cImNvbC5oZWFkZXIgfHwgJ2ltYWdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RzaS1pbWFnZS1kaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1pY29uIChmaWxlLXR5cGUgbG9nbykgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5SWNvbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JQ09OX0RJU1BMQVk7IGVsc2UgZGlzcGxheVRleHRFeWVCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbVtjb2wuZmllbGRdXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImdldEZpbGVUeXBlSWNvbkNsYXNzKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldEZpbGVUeXBlSWNvbkNvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEuMjVyZW1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbVtjb2wuZmllbGRdIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS10ZXh0LWV5ZSAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlUZXh0RXllQmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlRFWFRfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIG1vcmVBY3Rpb25zQmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBtb3JlIGFjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbW9yZUFjdGlvbnNCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmZpZWxkID09IG92ZXJmbG93Q29sdW1uRmllbGQ7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLW1lbnUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjbWVudU1vcmVBY3Rpb25zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxdPVwib3ZlcmZsb3dBY3Rpb25zTWVudVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJvdmVyZmxvdy1tZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ3dpZHRoJzogJ2F1dG8nLCAnbWluLXdpZHRoJzogJzBweCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtbWVudUl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLW1lbnVpdGVtLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uc3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25PdmVyZmxvd0FjdGlvbkNsaWNrZWQoaXRlbSwgbWVudUl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVJdGVtLmlkID09PSAnbm90ZXMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBtZW51SXRlbS5pY29uQ2xhc3MgfX0gcC1tZW51aXRlbS1pY29uIGJhZGdlLWljb24gaGFzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS5ub3Rlc0NvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhZGdlRGlzYWJsZWRdPVwiaXRlbS5ub3Rlc0NvdW50ID09IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVBvc2l0aW9uPVwidG9wLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51SXRlbS5pZCAhPT0gJ25vdGVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3ttZW51SXRlbS5pY29uQ2xhc3N9fSBwLW1lbnVpdGVtLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5pY29uU3R5bGVDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtZW51SXRlbS5sYWJlbCB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ7e2NvbC5idXR0b25JY29ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ7e2NvbC5zdHlsZUNsYXNzfX0gb3ZlcmZsb3ctYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvdmVyZmxvd0NvbHVtbkNsaWNrZWQobWVudU1vcmVBY3Rpb25zLCAkZXZlbnQsIGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1idXR0b24+ICBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0RyYWdPdmVyXCIgW25nU3R5bGVdPVwieyBsZWZ0OiBtZXNzYWdlUG9zaXRpb24ueCArICdweCcsIHRvcDogbWVzc2FnZVBvc2l0aW9uLnkgKyAncHgnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJhZy1tZXNzYWdlIGN1cnNvci1mb2xsb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBcIkpvaW50dXJlXCIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIDwhLS0gQ0FTRSA6IHNpbmdsZSBvciBub25lIHNlbGVjdGlvbiAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vdE11bHRpcGxlU2VsZWN0aW9uTW9kZUJsb2NrPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPHRyIFtuZ1N0eWxlXT1cIml0ZW0uY29sb3IgJiYgaXRlbS5jb2xvciAhPT0gJycgPyB7J2JhY2tncm91bmQtY29sb3InOiBpdGVtLmNvbG9yfSA6IHt9XCJcclxuICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwiaXRlbVwiIFtwU2VsZWN0YWJsZVJvd0luZGV4XT1cImluZGV4XCIgaWQ9XCJ0c2ktZ3JpZC1yb3cte3tpbmRleH19XCI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIShjb2wuaXNCdXR0b24gJiYgY29sLmFjdGlvbkRpc3BsYXkgPT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93KVwiIFtuZ1N0eWxlXT1cImdldEJvZHlDb2x1bW5TdHlsZShjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnRzaS1jb2wtd3JhcF09XCJzaG91bGRXcmFwQ29sdW1uKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogbWluLWNvbnRlbnQ7XCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICd3LTFyZW0nOiBjb2wuaXNCdXR0b24sXHJcbiAgICAgICAgICAgICAgICAgICAgJ2JnLXdoaXRlJzogY29sLmlzQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIH1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFVElNRV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIiBbc2hvd1RpbWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja2JveC1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGludGVnZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmF0ZU91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvblwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktbmVzdGVkLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ORVNURURfUFJPUF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlTdGF0dXNDb2xvckJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGlzcGxheS1OZXN0ZWQtUHJvcCBbc291cmNlVXJsXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlTb3VyY2VVcmxcIiBbaWRdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlWYWx1ZV09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5bGFiZWxGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGlzcGxheS1OZXN0ZWQtUHJvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c0NvbG9yQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbG9yOyBlbHNlIGRpc3BsYXlTdGF0dXNWYWx1ZUNvbHVtbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSByb3VuZGVkIHRleHQtd2hpdGUgdGV4dC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbVtjb2wuZmllbGRdfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c1ZhbHVlQ29sdW1uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sdW1uVmFsdWU7IGVsc2UgZGlzcGxheVN0YXR1c0NvbHVtbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHAtdGFnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSAmJiBnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KGl0ZW1bY29sLmZpZWxkXSkgYXMgb3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSBmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJvcHQuY29sb3JIZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJvcHQuY29sb3JIZXggPyAnd2hpdGUnIDogJ2JsYWNrJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ibGFjayBiZy13aGl0ZSc6ICFvcHQuY29sb3JIZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXdoaXRlJzogb3B0LmNvbG9ySGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0LnRyYW5zbGF0ZWRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgJiYgIWdldFN0YXR1c09wdGlvbkZvclN0YXR1c0hpc3RvcnkoaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktc3RhdHVzLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c0NvbHVtbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW47IGVsc2UgZGlzcGxheUJ1dHRvbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cC10YWcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC10YWc+LS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YSAmJiBnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtYmFkZ2UgZm9udC1ib2xkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImxpZ2h0ZW5Db2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRSZWFkYWJsZVRleHRDb2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXRvcF09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC50cmFuc2xhdGVkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGEgJiYgICFnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YXR1cy1iYWRnZSBmb250LWJvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktbmVzdGVkLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheUJ1dHRvbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNCdXR0b247IGVsc2UgZGlzcGxheUltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5uZ1N0eWxlIDoge31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZnJvemVuLWNvbHVtbi1ydGwtbW9kZSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbc3R5bGVDbGFzc109XCJjb2wuc3R5bGVDbGFzc1wiIHR5cGU9XCJidXR0b25cIiBpY29uPVwie3sgY29sLmJ1dHRvbkljb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCJjb2wudG9vbFRpcFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGl0ZW0sIGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNvbC5pc0ljb25CdXR0b24gPyAnJyA6IChjb2wuYnV0dG9uTGFiZWwgPz8gaXRlbVtjb2wuZmllbGRdKVwiPjwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1pbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5SW1hZ2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZOyBlbHNlIGRpc3BsYXlJY29uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTJyZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRzaS1pbWFnZS1kaXNwbGF5IFtoZWFkZXJUaXRsZXNdPVwiZ2V0SGVhZGVyVGl0bGVzKGNvbC5oZWFkZXJUaXRsZXMsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNSb3VuZGVkXT1cImNvbC5pc1JvdW5kZWRcIiBbc3JjXT1cIml0ZW1bY29sLmZpZWxkXVwiIFthbHRdPVwiY29sLmhlYWRlciB8fCAnaW1hZ2UnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90c2ktaW1hZ2UtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LWljb24gKGZpbGUtdHlwZSBsb2dvKSAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5SWNvbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSUNPTl9ESVNQTEFZOyBlbHNlIGRpc3BsYXlUZXh0RXllQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtW2NvbC5maWVsZF1cIiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImdldEZpbGVUeXBlSWNvbkNsYXNzKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRGaWxlVHlwZUljb25Db2xvcihpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMS4yNXJlbVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbVtjb2wuZmllbGRdIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktdGV4dC1leWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVRleHRFeWVCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5URVhUX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgbW9yZUFjdGlvbnNCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBwaSBwaS1leWVcIiAoY2xpY2spPVwiZXllQ2xpY2tlZChpdGVtW2NvbC5maWVsZF0pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0cnVuY2F0ZVN0cmluZyhpdGVtW2NvbC5maWVsZF0sIDUwKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBtb3JlIGFjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbW9yZUFjdGlvbnNCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmZpZWxkID09IG92ZXJmbG93Q29sdW1uRmllbGQ7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLW1lbnUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjbWVudU1vcmVBY3Rpb25zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxdPVwib3ZlcmZsb3dBY3Rpb25zTWVudVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJvdmVyZmxvdy1tZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ3dpZHRoJzogJ2F1dG8nLCAnbWluLXdpZHRoJzogJzBweCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtbWVudUl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLW1lbnVpdGVtLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uc3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25PdmVyZmxvd0FjdGlvbkNsaWNrZWQoaXRlbSwgbWVudUl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVJdGVtLmlkID09PSAnbm90ZXMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBtZW51SXRlbS5pY29uQ2xhc3MgfX0gcC1tZW51aXRlbS1pY29uIGJhZGdlLWljb24gaGFzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS5ub3Rlc0NvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhZGdlRGlzYWJsZWRdPVwiaXRlbS5ub3Rlc0NvdW50ID09IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVBvc2l0aW9uPVwidG9wLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51SXRlbS5pZCAhPT0gJ25vdGVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3ttZW51SXRlbS5pY29uQ2xhc3N9fSBwLW1lbnVpdGVtLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5pY29uU3R5bGVDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtZW51SXRlbS5sYWJlbCB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ7e2NvbC5idXR0b25JY29ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ7e2NvbC5zdHlsZUNsYXNzfX0gb3ZlcmZsb3ctYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvdmVyZmxvd0NvbHVtbkNsaWNrZWQobWVudU1vcmVBY3Rpb25zLCAkZXZlbnQsIGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1idXR0b24+ICBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+PC90ZD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2Ygc2VsZWN0ZWRDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInByLTBcIiAqbmdJZj1cIiEoY29sLmlzQnV0dG9uICYmIGNvbC5hY3Rpb25EaXNwbGF5ID09IGFjdGlvblBsYWNlbWVudC5PdmVyZmxvdylcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnNob3dTdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIENVUlJFTkNZX1NPQ0lFVEVfRElTUExBWSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gSU5URUdFUl9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSQVRFX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlJBVEVfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvbiA/PyBmYWxzZVwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gREVDSU1BTF9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ERUNJTUFMX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgXHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XHJcbiAgICAgICAge3sgcGFnZS50b3RhbENvdW50IH19IHt7IFwicmVjb3Jkc19sYWJlbFwiIHwgbG9jYWxpemUgfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvbG9yZnVsXCI+XHJcbiAgICAgICAgICA8c3Bhbj5WaWV3IEdyaWQ8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj58IFNlYXJjaE9uSW5pdCA6IHt7IHNlYXJjaE9uSW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPnwgUGFnaW5hdGlvbiBJbiBBcGkgOiB7eyBpc0dyaWREYXRhUGFnZWRJbkFwaSB9fTwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3AtdGFibGU+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiX3Nob3dDYWxlbmRlclZpZXcgPT09IHRydWVcIiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgPHRzaS1jYWxlbmRlciBcclxuICBbc2NoZW1hXT1cImNhbGVuZGVyU2NoZW1hXCIgXHJcbiAgW2V2ZW50c0RhdGFdPVwicGFnZS5pdGVtc1wiIFxyXG4gIFtjcnVkU2VydmljZV09XCJjcnVkU2VydmljZVwiXHJcbiAgW3Nob3dJbmZvQnV0dG9uXT1cInNob3dJbmZvQnV0dG9uXCJcclxuICBbc2hvd0Rvd25sb2FkQnV0dG9uXT1cInNob3dEb3dubG9hZEJ1dHRvblwiXHJcbiAgW3Nob3dVcGxvYWRCdXR0b25dPVwic2hvd1VwbG9hZEJ1dHRvblwiXHJcbiAgW3Nob3dOb3RlQnV0dG9uXT1cInNob3dOb3RlQnV0dG9uXCJcclxuICBbc2hvd0FjdGlvbkJ1dHRvbl09XCJzaG93QWN0aW9uQnV0dG9uXCJcclxuICAoZGF0ZVJhbmdlQ2hhbmdlKT1cImhhbmRsZURhdGVSYW5nZUNoYW5nZSgkZXZlbnQpXCIgXHJcbiAgKGV2ZW50Q2xpY2spPVwiaGFuZGxlQ2FsZW5kYXJFdmVudENsaWNrKCRldmVudClcIj5cclxuPC90c2ktY2FsZW5kZXI+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhcmRWaWV3ID09PSB0cnVlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2ktY2FyZC1saXN0IFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiW3NlbGVjdEtleU9ubHldPVwic2VsZWN0S2V5T25seVwiIFtrZXldPVwia2V5XCIgW292ZXJmbG93QWN0aW9uc01lbnVdPVwib3ZlcmZsb3dBY3Rpb25zTWVudVwiPlxyXG4gICAgPC9Uc2ktY2FyZC1saXN0PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiX3Nob3dLYW5iYW5WaWV3ID09PSB0cnVlICYmICFfc2hvd0thbmJhblZpZXdPZldvcmtGbG93RXRhdFwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8VHNpLWthbmJhbiBbY2FyZEJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiIFtpZF09XCJpZFwiIChidXR0b25DbGlja2VkKT1cImJ1dHRvbkNvbHVtbkNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgW3BhZ2UkXT1cInBhZ2UkXCIgW3BhZ2VdPVwicGFnZVwiIChjYWxsU2VhcmNoKT1cImNhbGxTZWFyY2hIYW5kbGVyKCRldmVudClcIiBbY3J1ZFNlcnZpY2VdPVwiY3J1ZFNlcnZpY2VcIlxyXG4gICAgICBbc2VsZWN0S2V5T25seV09XCJzZWxlY3RLZXlPbmx5XCIgW2tleV09XCJrZXlcIiBbb3ZlcmZsb3dBY3Rpb25zTWVudV09XCJvdmVyZmxvd0FjdGlvbnNNZW51XCI+XHJcbiAgICA8L1RzaS1rYW5iYW4+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0thbmJhblZpZXcgPT09IHRydWUgJiYgX3Nob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXRcIiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgPFRzaS1rYW5iYW4td29ya2Zsb3ctZXRhdCBbY2FyZEJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiIFtpZF09XCJpZFwiIChidXR0b25DbGlja2VkKT1cImJ1dHRvbkNvbHVtbkNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgW3BhZ2UkXT1cInBhZ2UkXCIgW3BhZ2VdPVwicGFnZVwiIFtkZXNjcmltaW5hdG9yVmFsdWVdPVwiZGVzY3JpbWluYXRvclZhbHVlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiPlxyXG4gICAgPC9Uc2kta2FuYmFuLXdvcmtmbG93LWV0YXQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJpc0FkdmFuY2VkU2VhcmNoICYmIHNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiPlxyXG4gICAgPFRzaS1Nb2RhbC1Gb290ZXIgW3Nob3dTYXZlQW5kQ2xvc2VCdXR0b25dPVwiZmFsc2VcIiAob25TYXZlQ2xpY2spPVwib25Db25maXJtU2VsZWN0aW9uKClcIiAob25DYW5jZWxDbGljayk9XCJvbkNhbmNlbFNlbGVjdGlvbigpXCIgLz5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19