@ng-matero/extensions 16.1.3 → 16.3.0

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 (147) hide show
  1. package/_index.scss +0 -3
  2. package/_theming.scss +0 -3
  3. package/alert/_alert-theme.scss +12 -28
  4. package/alert/alert.scss +28 -0
  5. package/colorpicker/_colorpicker-theme.scss +20 -8
  6. package/colorpicker/colorpicker-toggle.scss +23 -17
  7. package/column-resize/column-resize-notifier.d.ts +1 -1
  8. package/column-resize/polyfill.d.ts +1 -3
  9. package/column-resize/resizable.d.ts +1 -0
  10. package/column-resize/resize-strategy.d.ts +4 -3
  11. package/core/style/_sass-utils.scss +49 -0
  12. package/core/theming/_all-theme.scss +0 -2
  13. package/core/tokens/_token-utils.scss +127 -0
  14. package/core/tokens/m2/_index.scss +49 -0
  15. package/core/tokens/m2/mdc/_plain-tooltip.scss +72 -0
  16. package/core/tokens/m2/mtx/_alert.scss +55 -0
  17. package/core/tokens/m2/mtx/_colorpicker.scss +55 -0
  18. package/core/tokens/m2/mtx/_datetimepicker.scss +155 -0
  19. package/core/tokens/m2/mtx/_drawer.scss +45 -0
  20. package/core/tokens/m2/mtx/_grid.scss +57 -0
  21. package/core/tokens/m2/mtx/_loader.scss +45 -0
  22. package/core/tokens/m2/mtx/_popover.scss +46 -0
  23. package/core/tokens/m2/mtx/_progress.scss +56 -0
  24. package/core/tokens/m2/mtx/_select.scss +83 -0
  25. package/core/tokens/m2/mtx/_split.scss +54 -0
  26. package/core/typography/_typography.scss +203 -36
  27. package/datetimepicker/_datetimepicker-theme.scss +31 -183
  28. package/datetimepicker/calendar-body.scss +81 -1
  29. package/datetimepicker/calendar.scss +33 -3
  30. package/datetimepicker/clock.scss +50 -10
  31. package/datetimepicker/datetimepicker-content.scss +12 -0
  32. package/datetimepicker/datetimepicker-toggle.scss +23 -17
  33. package/datetimepicker/time.scss +41 -1
  34. package/drawer/_drawer-theme.scss +6 -10
  35. package/drawer/drawer-container.scss +11 -0
  36. package/esm2022/alert/alert.mjs +4 -4
  37. package/esm2022/colorpicker/colorpicker-toggle.mjs +2 -2
  38. package/esm2022/column-resize/column-resize-directives/column-resize-flex.mjs +3 -9
  39. package/esm2022/column-resize/column-resize-directives/column-resize.mjs +3 -9
  40. package/esm2022/column-resize/column-resize-directives/constants.mjs +1 -1
  41. package/esm2022/column-resize/column-resize-notifier.mjs +7 -2
  42. package/esm2022/column-resize/column-resize.mjs +3 -3
  43. package/esm2022/column-resize/event-dispatcher.mjs +5 -2
  44. package/esm2022/column-resize/polyfill.mjs +3 -19
  45. package/esm2022/column-resize/resizable.mjs +7 -7
  46. package/esm2022/column-resize/resize-ref.mjs +1 -1
  47. package/esm2022/column-resize/resize-strategy.mjs +16 -10
  48. package/esm2022/datetimepicker/calendar-body.mjs +2 -2
  49. package/esm2022/datetimepicker/calendar.mjs +3 -3
  50. package/esm2022/datetimepicker/clock.mjs +2 -2
  51. package/esm2022/datetimepicker/datetimepicker-toggle.mjs +2 -2
  52. package/esm2022/datetimepicker/datetimepicker.mjs +3 -3
  53. package/esm2022/datetimepicker/time.mjs +3 -3
  54. package/esm2022/drawer/drawer-container.mjs +3 -3
  55. package/esm2022/grid/cell.mjs +3 -19
  56. package/esm2022/grid/column-resize/column-resize-directives/common.mjs +1 -8
  57. package/esm2022/grid/column-resize/overlay-handle.mjs +11 -6
  58. package/esm2022/grid/column-resize/resizable-directives/common.mjs +1 -1
  59. package/esm2022/grid/column-resize/resizable-directives/resizable.mjs +3 -2
  60. package/esm2022/grid/column-resize/resize-strategy.mjs +10 -5
  61. package/esm2022/grid/grid-module.mjs +13 -9
  62. package/esm2022/grid/grid-utils.mjs +1 -9
  63. package/esm2022/grid/grid.mjs +28 -21
  64. package/esm2022/loader/loader.mjs +2 -2
  65. package/esm2022/photoviewer/mtxPhotoviewer.mjs +5 -0
  66. package/esm2022/photoviewer/photoviewer-module.mjs +17 -0
  67. package/esm2022/photoviewer/photoviewer.mjs +63 -0
  68. package/esm2022/photoviewer/public-api.mjs +3 -0
  69. package/esm2022/popover/popover-interfaces.mjs +1 -1
  70. package/esm2022/popover/popover.mjs +13 -3
  71. package/esm2022/progress/progress.mjs +4 -4
  72. package/esm2022/select/select.mjs +11 -3
  73. package/esm2022/split/split.mjs +2 -2
  74. package/esm2022/tooltip/tooltip.mjs +2 -2
  75. package/fesm2022/mtxAlert.mjs +3 -3
  76. package/fesm2022/mtxAlert.mjs.map +1 -1
  77. package/fesm2022/mtxColorpicker.mjs +2 -2
  78. package/fesm2022/mtxColorpicker.mjs.map +1 -1
  79. package/fesm2022/mtxColumnResize.mjs +38 -52
  80. package/fesm2022/mtxColumnResize.mjs.map +1 -1
  81. package/fesm2022/mtxDatetimepicker.mjs +12 -12
  82. package/fesm2022/mtxDatetimepicker.mjs.map +1 -1
  83. package/fesm2022/mtxDrawer.mjs +2 -2
  84. package/fesm2022/mtxDrawer.mjs.map +1 -1
  85. package/fesm2022/mtxGrid.mjs +188 -197
  86. package/fesm2022/mtxGrid.mjs.map +1 -1
  87. package/fesm2022/mtxLoader.mjs +2 -2
  88. package/fesm2022/mtxLoader.mjs.map +1 -1
  89. package/fesm2022/mtxPhotoviewer.mjs +84 -0
  90. package/fesm2022/mtxPhotoviewer.mjs.map +1 -0
  91. package/fesm2022/mtxPopover.mjs +12 -2
  92. package/fesm2022/mtxPopover.mjs.map +1 -1
  93. package/fesm2022/mtxProgress.mjs +3 -3
  94. package/fesm2022/mtxProgress.mjs.map +1 -1
  95. package/fesm2022/mtxSelect.mjs +10 -2
  96. package/fesm2022/mtxSelect.mjs.map +1 -1
  97. package/fesm2022/mtxSplit.mjs +2 -2
  98. package/fesm2022/mtxSplit.mjs.map +1 -1
  99. package/fesm2022/mtxTooltip.mjs +2 -2
  100. package/fesm2022/mtxTooltip.mjs.map +1 -1
  101. package/grid/_grid-theme.scss +14 -86
  102. package/grid/cell.d.ts +0 -2
  103. package/grid/cell.scss +0 -1
  104. package/grid/column-resize/_column-resize.scss +88 -94
  105. package/grid/column-resize/column-resize-directives/common.d.ts +0 -7
  106. package/grid/column-resize/overlay-handle.d.ts +1 -0
  107. package/grid/column-resize/resize-strategy.d.ts +2 -2
  108. package/grid/grid-module.d.ts +4 -4
  109. package/grid/grid-utils.d.ts +0 -6
  110. package/grid/grid.d.ts +10 -7
  111. package/grid/grid.scss +103 -15
  112. package/loader/_loader-theme.scss +6 -6
  113. package/loader/loader.scss +7 -0
  114. package/package.json +25 -25
  115. package/{slider → photoviewer}/index.d.ts +1 -1
  116. package/photoviewer/photoviewer-module.d.ts +7 -0
  117. package/photoviewer/photoviewer.d.ts +17 -0
  118. package/photoviewer/public-api.d.ts +2 -0
  119. package/popover/_popover-theme.scss +6 -40
  120. package/popover/popover-interfaces.d.ts +1 -0
  121. package/popover/popover.d.ts +6 -1
  122. package/popover/popover.scss +36 -2
  123. package/prebuilt-themes/deeppurple-amber.css +1 -1
  124. package/prebuilt-themes/indigo-pink.css +1 -1
  125. package/prebuilt-themes/pink-bluegrey.css +1 -1
  126. package/prebuilt-themes/purple-green.css +1 -1
  127. package/progress/_progress-theme.scss +6 -25
  128. package/progress/progress.scss +42 -0
  129. package/select/_select-theme.scss +19 -133
  130. package/select/select.d.ts +1 -0
  131. package/select/select.scss +147 -36
  132. package/split/_split-theme.scss +21 -18
  133. package/split/split.scss +13 -0
  134. package/tooltip/_tooltip-theme.scss +19 -24
  135. package/tooltip/tooltip.scss +18 -17
  136. package/esm2022/slider/mtxSlider.mjs +0 -5
  137. package/esm2022/slider/public-api.mjs +0 -3
  138. package/esm2022/slider/slider-module.mjs +0 -19
  139. package/esm2022/slider/slider.mjs +0 -1115
  140. package/fesm2022/mtxSlider.mjs +0 -1137
  141. package/fesm2022/mtxSlider.mjs.map +0 -1
  142. package/slider/_slider-theme.import.scss +0 -2
  143. package/slider/_slider-theme.scss +0 -232
  144. package/slider/public-api.d.ts +0 -2
  145. package/slider/slider-module.d.ts +0 -9
  146. package/slider/slider.d.ts +0 -277
  147. package/slider/slider.scss +0 -514
@@ -96,6 +96,8 @@ export class MtxGrid {
96
96
  this.rowStriped = this._defaultOptions?.rowStriped ?? false;
97
97
  /** Event emitted when the user clicks the row. */
98
98
  this.rowClick = new EventEmitter();
99
+ /** Event emitted when the user attempts to open a context menu. */
100
+ this.rowContextMenu = new EventEmitter();
99
101
  // ===== Expandable Row =====
100
102
  this.expansionRowStates = [];
101
103
  /** Whether the row is expandable. */
@@ -108,8 +110,6 @@ export class MtxGrid {
108
110
  this.multiSelectable = this._defaultOptions?.multiSelectable ?? true;
109
111
  /** Whether the user can select multiple rows with click. */
110
112
  this.multiSelectionWithClick = this._defaultOptions?.multiSelectionWithClick ?? false;
111
- /** The selected row items. */
112
- this.rowSelected = [];
113
113
  /** Whether the row is selectable. */
114
114
  this.rowSelectable = this._defaultOptions?.rowSelectable ?? false;
115
115
  /** Whether to hide the row selection checkbox. */
@@ -118,14 +118,16 @@ export class MtxGrid {
118
118
  this.disableRowClickSelection = this._defaultOptions?.disableRowClickSelection ?? false;
119
119
  /** The formatter to disable the row selection or hide the row's checkbox. */
120
120
  this.rowSelectionFormatter = {};
121
+ /** The selected row items. */
122
+ this.rowSelected = [];
121
123
  /** Event emitted when the row is selected. */
122
- this.rowSelectionChange = new EventEmitter();
124
+ this.rowSelectedChange = new EventEmitter();
123
125
  // ===== Cell Selection =====
124
126
  this.cellSelection = [];
125
127
  /** Whether the cell is selectable. */
126
128
  this.cellSelectable = this._defaultOptions?.cellSelectable ?? true;
127
129
  /** Event emitted when the cell is selected. */
128
- this.cellSelectionChange = new EventEmitter();
130
+ this.cellSelectedChange = new EventEmitter();
129
131
  // ===== Toolbar =====
130
132
  /** Whether to show the toolbar. */
131
133
  this.showToolbar = this._defaultOptions?.showToolbar ?? false;
@@ -277,7 +279,7 @@ export class MtxGrid {
277
279
  const colValue = this._utils.getCellValue(rowData, colDef);
278
280
  this.cellSelection = []; // reset
279
281
  this.cellSelection.push({ cellData: colValue, rowData, colDef });
280
- this.cellSelectionChange.emit(this.cellSelection);
282
+ this.cellSelectedChange.emit(this.cellSelection);
281
283
  if (this._selectedCell) {
282
284
  this._selectedCell.deselect(); // the selectedCell will be undefined
283
285
  }
@@ -296,7 +298,7 @@ export class MtxGrid {
296
298
  }
297
299
  this._toggleNormalCheckbox(rowData);
298
300
  }
299
- this.rowClick.emit({ rowData, index });
301
+ this.rowClick.emit({ event, rowData, index });
300
302
  }
301
303
  /** Whether the number of selected elements matches the total number of rows. */
302
304
  _isAllSelected() {
@@ -313,12 +315,12 @@ export class MtxGrid {
313
315
  this.rowSelection.select(row);
314
316
  }
315
317
  });
316
- this.rowSelectionChange.emit(this.rowSelection.selected);
318
+ this.rowSelectedChange.emit(this.rowSelection.selected);
317
319
  }
318
320
  /** Select normal row */
319
321
  _toggleNormalCheckbox(row) {
320
322
  this.rowSelection.toggle(row);
321
- this.rowSelectionChange.emit(this.rowSelection.selected);
323
+ this.rowSelectedChange.emit(this.rowSelection.selected);
322
324
  }
323
325
  /** Column change event */
324
326
  _onColumnChange(columns) {
@@ -365,8 +367,11 @@ export class MtxGrid {
365
367
  this.tableContainer.nativeElement.scrollLeft = value;
366
368
  }
367
369
  }
370
+ _contextmenu(event, rowData, index) {
371
+ this.rowContextMenu.emit({ event, rowData, index });
372
+ }
368
373
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: MtxGrid, deps: [{ token: i1.MtxGridUtils }, { token: i0.ChangeDetectorRef }, { token: MTX_GRID_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
369
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: MtxGrid, selector: "mtx-grid", inputs: { displayedColumns: "displayedColumns", columns: "columns", data: "data", length: "length", loading: "loading", trackBy: "trackBy", columnResizable: "columnResizable", emptyValuePlaceholder: "emptyValuePlaceholder", pageOnFront: "pageOnFront", showPaginator: "showPaginator", pageDisabled: "pageDisabled", showFirstLastButtons: "showFirstLastButtons", pageIndex: "pageIndex", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hidePageSize: "hidePageSize", paginationTemplate: "paginationTemplate", sortOnFront: "sortOnFront", sortActive: "sortActive", sortDirection: "sortDirection", sortDisableClear: "sortDisableClear", sortDisabled: "sortDisabled", sortStart: "sortStart", rowHover: "rowHover", rowStriped: "rowStriped", expandable: "expandable", expansionTemplate: "expansionTemplate", multiSelectable: "multiSelectable", multiSelectionWithClick: "multiSelectionWithClick", rowSelected: "rowSelected", rowSelectable: "rowSelectable", hideRowSelectionCheckbox: "hideRowSelectionCheckbox", disableRowClickSelection: "disableRowClickSelection", rowSelectionFormatter: "rowSelectionFormatter", rowClassFormatter: "rowClassFormatter", cellSelectable: "cellSelectable", showToolbar: "showToolbar", toolbarTitle: "toolbarTitle", toolbarTemplate: "toolbarTemplate", columnHideable: "columnHideable", columnHideableChecked: "columnHideableChecked", columnSortable: "columnSortable", columnPinnable: "columnPinnable", columnPinOptions: "columnPinOptions", showColumnMenuButton: "showColumnMenuButton", columnMenuButtonText: "columnMenuButtonText", columnMenuButtonType: "columnMenuButtonType", columnMenuButtonColor: "columnMenuButtonColor", columnMenuButtonClass: "columnMenuButtonClass", columnMenuButtonIcon: "columnMenuButtonIcon", showColumnMenuHeader: "showColumnMenuHeader", columnMenuHeaderText: "columnMenuHeaderText", columnMenuHeaderTemplate: "columnMenuHeaderTemplate", showColumnMenuFooter: "showColumnMenuFooter", columnMenuFooterText: "columnMenuFooterText", columnMenuFooterTemplate: "columnMenuFooterTemplate", noResultText: "noResultText", noResultTemplate: "noResultTemplate", headerTemplate: "headerTemplate", headerExtraTemplate: "headerExtraTemplate", cellTemplate: "cellTemplate", useContentRowTemplate: "useContentRowTemplate", useContentHeaderRowTemplate: "useContentHeaderRowTemplate", useContentFooterRowTemplate: "useContentFooterRowTemplate", showSummary: "showSummary", summaryTemplate: "summaryTemplate", showSidebar: "showSidebar", sidebarTemplate: "sidebarTemplate", showStatusbar: "showStatusbar", statusbarTemplate: "statusbarTemplate" }, outputs: { page: "page", sortChange: "sortChange", rowClick: "rowClick", expansionChange: "expansionChange", rowSelectionChange: "rowSelectionChange", cellSelectionChange: "cellSelectionChange", columnChange: "columnChange" }, host: { classAttribute: "mtx-grid" }, queries: [{ propertyName: "rowDefs", predicate: MatRowDef }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "footerRowDefs", predicate: MatFooterRow }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "columnMenu", first: true, predicate: ["columnMenu"], descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], exportAs: ["mtxGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- Progress bar-->\r\n<div class=\"mtx-grid-progress\" *ngIf=\"loading\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- Toolbar -->\r\n<div class=\"mtx-grid-toolbar\" *ngIf=\"showToolbar\">\r\n <div class=\"mtx-grid-toolbar-content\">\r\n <ng-template [ngIf]=\"toolbarTemplate\" [ngIfElse]=\"defaultToolbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultToolbarTemplate>\r\n <div class=\"mtx-grid-toolbar-title\" *ngIf=\"toolbarTitle\">{{toolbarTitle}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"mtx-grid-toolbar-actions\">\r\n <mtx-grid-column-menu *ngIf=\"showColumnMenuButton\" #columnMenu\r\n [columns]=\"columns\"\r\n [buttonText]=\"columnMenuButtonText\"\r\n [buttonType]=\"columnMenuButtonType\"\r\n [buttonColor]=\"columnMenuButtonColor\"\r\n [buttonClass]=\"columnMenuButtonClass\"\r\n [buttonIcon]=\"columnMenuButtonIcon\"\r\n [selectable]=\"columnHideable\"\r\n [selectableChecked]=\"columnHideableChecked\"\r\n [sortable]=\"columnSortable\"\r\n [pinnable]=\"columnPinnable\"\r\n [showHeader]=\"showColumnMenuHeader\"\r\n [headerText]=\"columnMenuHeaderText\"\r\n [headerTemplate]=\"columnMenuHeaderTemplate\"\r\n [showFooter]=\"showColumnMenuFooter\"\r\n [footerText]=\"columnMenuFooterText\"\r\n [footerTemplate]=\"columnMenuFooterTemplate\"\r\n [pinOptions]=\"columnPinOptions\"\r\n (columnChange)=\"_onColumnChange($event)\">\r\n </mtx-grid-column-menu>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-main mtx-grid-layout\">\r\n <!-- Table content -->\r\n <div class=\"mtx-grid-content mtx-grid-layout\">\r\n <div #tableContainer class=\"mat-table-container\"\r\n [ngClass]=\"{'mat-table-with-data': !_hasNoResult}\">\r\n <table mat-table *ngIf=\"!columnResizable\"\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n\r\n <!-- TODO: Use flexbox-based mat-table -->\r\n <table mat-table *ngIf=\"columnResizable\"\r\n columnResize\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n [resizable]=\"col.resizable\"\r\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n <!-- No result -->\r\n <div class=\"mtx-grid-no-result\" *ngIf=\"_hasNoResult\">\r\n <ng-template [ngIf]=\"noResultTemplate\" [ngIfElse]=\"defaultNoResultTpl\">\r\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultNoResultTpl>{{noResultText}}</ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tool sidebar -->\r\n <div class=\"mtx-grid-sidebar\" *ngIf=\"showSidebar\">\r\n <ng-template [ngIf]=\"sidebarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-footer\">\r\n <!-- Status Bar -->\r\n <div class=\"mtx-grid-statusbar\" *ngIf=\"showStatusbar\">\r\n <ng-template [ngIf]=\"statusbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Pagination -->\r\n <div class=\"mtx-grid-pagination\">\r\n <ng-template [ngIf]=\"paginationTemplate\" [ngIfElse]=\"defaultPaginationTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultPaginationTemplate>\r\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\r\n [showFirstLastButtons]=\"showFirstLastButtons\"\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [hidePageSize]=\"hidePageSize\"\r\n (page)=\"_onPage($event)\"\r\n [disabled]=\"pageDisabled\">\r\n </mat-paginator>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<!-- Header template for extra content -->\r\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\r\n <ng-template [ngIf]=\"headerExtraTemplate | isTemplateRef\" [ngIfElse]=\"headerExtraTpl\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerExtraTpl>\r\n <ng-template [ngIf]=\"$any(headerExtraTemplate)?.[col.field] | isTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n</ng-template>\r\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:80px}.mtx-grid .mat-table-sticky-left{border-right-width:1px;border-right-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left-width:1px;border-left-style:solid}.mtx-grid .mat-table-sticky-right{border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid .mat-mdc-header-cell,.mtx-grid .mat-mdc-footer-cell,.mtx-grid .mat-mdc-cell{padding:4px 10px;box-sizing:border-box}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:24px}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:10px;padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}.mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:10px}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-mdc-row:last-of-type .mat-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin:0 4px}.mtx-grid .mat-header-cell-inner{display:inline-flex;align-items:center}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:8px;box-sizing:border-box}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:56px;padding:8px}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;width:40px;height:40px;vertical-align:middle}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:48px;overflow:hidden}.mtx-grid-checkbox-cell{flex:none;justify-content:center;width:60px;min-width:60px}.mtx-grid-checkbox-cell .mat-checkbox{display:flex;margin:0 10px}.mtx-grid-checkbox-cell .mat-checkbox-inner-container{margin-left:0}.mtx-grid-row-expand-button.mat-mdc-icon-button{width:40px;height:40px;padding:8px;vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button+mtx-grid-cell{vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button .mat-mdc-button-touch-target{width:100%;height:100%}.mtx-grid-icon{width:20px;height:20px;font-size:20px}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i2.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatTable; }), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderCellDef; }), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderRowDef; }), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatColumnDef; }), selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatCellDef; }), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatRowDef; }), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterCellDef; }), selector: "[matFooterCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterRowDef; }), selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderCell; }), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatCell; }), selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterCell; }), selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i0.forwardRef(function () { return i3.MatHeaderRow; }), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatRow; }), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatFooterRow; }), selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatSort; }), selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(function () { return i4.MatSortHeader; }), selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i0.forwardRef(function () { return i5.MatPaginator; }), selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MatCheckbox; }), selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i0.forwardRef(function () { return i7.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i8.MatProgressBar; }), selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatColumnResize; }), selector: "table[mat-table][columnResize]" }, { kind: "directive", type: i0.forwardRef(function () { return i10.MatResizable; }), selector: "mat-header-cell[resizable], th[mat-header-cell][resizable]", inputs: ["matResizableMinWidthPx", "matResizableMaxWidthPx", "resizable"] }, { kind: "component", type: i0.forwardRef(function () { return i11.MtxGridCell; }), selector: "mtx-grid-cell", inputs: ["rowData", "colDef", "data", "summary", "placeholder"], outputs: ["rowDataChange"], exportAs: ["mtxGridCell"] }, { kind: "component", type: i0.forwardRef(function () { return i12.MtxGridColumnMenu; }), selector: "mtx-grid-column-menu", inputs: ["columns", "selectable", "selectableChecked", "sortable", "pinnable", "buttonText", "buttonType", "buttonColor", "buttonClass", "buttonIcon", "showHeader", "headerText", "headerTemplate", "showFooter", "footerText", "footerTemplate", "pinOptions"], outputs: ["columnChange"], exportAs: ["mtxGridColumnMenu"] }, { kind: "directive", type: i0.forwardRef(function () { return i13.MtxGridExpansionToggle; }), selector: "[mtx-grid-expansion-toggle]", inputs: ["opened", "expandableRow", "expansionRowTpl"], outputs: ["openedChange", "toggleChange"] }, { kind: "directive", type: i0.forwardRef(function () { return MtxGridSelectableCell; }), selector: "[mtx-grid-selectable-cell]", inputs: ["mtxSelectableRowData"], outputs: ["cellSelectionChange"] }, { kind: "pipe", type: i0.forwardRef(function () { return i2.AsyncPipe; }), name: "async" }, { kind: "pipe", type: i0.forwardRef(function () { return i14.MtxToObservablePipe; }), name: "toObservable" }, { kind: "pipe", type: i0.forwardRef(function () { return i14.MtxIsTemplateRefPipe; }), name: "isTemplateRef" }, { kind: "pipe", type: i0.forwardRef(function () { return i15.MtxGridRowClassPipe; }), name: "rowClass" }, { kind: "pipe", type: i0.forwardRef(function () { return i15.MtxGridColClassPipe; }), name: "colClass" }], animations: [
374
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: MtxGrid, selector: "mtx-grid", inputs: { displayedColumns: "displayedColumns", columns: "columns", data: "data", length: "length", loading: "loading", trackBy: "trackBy", columnResizable: "columnResizable", emptyValuePlaceholder: "emptyValuePlaceholder", pageOnFront: "pageOnFront", showPaginator: "showPaginator", pageDisabled: "pageDisabled", showFirstLastButtons: "showFirstLastButtons", pageIndex: "pageIndex", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hidePageSize: "hidePageSize", paginationTemplate: "paginationTemplate", sortOnFront: "sortOnFront", sortActive: "sortActive", sortDirection: "sortDirection", sortDisableClear: "sortDisableClear", sortDisabled: "sortDisabled", sortStart: "sortStart", rowHover: "rowHover", rowStriped: "rowStriped", expandable: "expandable", expansionTemplate: "expansionTemplate", multiSelectable: "multiSelectable", multiSelectionWithClick: "multiSelectionWithClick", rowSelectable: "rowSelectable", hideRowSelectionCheckbox: "hideRowSelectionCheckbox", disableRowClickSelection: "disableRowClickSelection", rowSelectionFormatter: "rowSelectionFormatter", rowClassFormatter: "rowClassFormatter", rowSelected: "rowSelected", cellSelectable: "cellSelectable", showToolbar: "showToolbar", toolbarTitle: "toolbarTitle", toolbarTemplate: "toolbarTemplate", columnHideable: "columnHideable", columnHideableChecked: "columnHideableChecked", columnSortable: "columnSortable", columnPinnable: "columnPinnable", columnPinOptions: "columnPinOptions", showColumnMenuButton: "showColumnMenuButton", columnMenuButtonText: "columnMenuButtonText", columnMenuButtonType: "columnMenuButtonType", columnMenuButtonColor: "columnMenuButtonColor", columnMenuButtonClass: "columnMenuButtonClass", columnMenuButtonIcon: "columnMenuButtonIcon", showColumnMenuHeader: "showColumnMenuHeader", columnMenuHeaderText: "columnMenuHeaderText", columnMenuHeaderTemplate: "columnMenuHeaderTemplate", showColumnMenuFooter: "showColumnMenuFooter", columnMenuFooterText: "columnMenuFooterText", columnMenuFooterTemplate: "columnMenuFooterTemplate", noResultText: "noResultText", noResultTemplate: "noResultTemplate", headerTemplate: "headerTemplate", headerExtraTemplate: "headerExtraTemplate", cellTemplate: "cellTemplate", useContentRowTemplate: "useContentRowTemplate", useContentHeaderRowTemplate: "useContentHeaderRowTemplate", useContentFooterRowTemplate: "useContentFooterRowTemplate", showSummary: "showSummary", summaryTemplate: "summaryTemplate", showSidebar: "showSidebar", sidebarTemplate: "sidebarTemplate", showStatusbar: "showStatusbar", statusbarTemplate: "statusbarTemplate" }, outputs: { page: "page", sortChange: "sortChange", rowClick: "rowClick", rowContextMenu: "rowContextMenu", expansionChange: "expansionChange", rowSelectedChange: "rowSelectedChange", cellSelectedChange: "cellSelectedChange", columnChange: "columnChange" }, host: { classAttribute: "mtx-grid" }, queries: [{ propertyName: "rowDefs", predicate: MatRowDef }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "footerRowDefs", predicate: MatFooterRow }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "columnMenu", first: true, predicate: ["columnMenu"], descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], exportAs: ["mtxGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- Progress bar-->\r\n<div class=\"mtx-grid-progress\" *ngIf=\"loading\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- Toolbar -->\r\n<div class=\"mtx-grid-toolbar\" *ngIf=\"showToolbar\">\r\n <div class=\"mtx-grid-toolbar-content\">\r\n <ng-template [ngIf]=\"toolbarTemplate\" [ngIfElse]=\"defaultToolbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultToolbarTemplate>\r\n <div class=\"mtx-grid-toolbar-title\" *ngIf=\"toolbarTitle\">{{toolbarTitle}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"mtx-grid-toolbar-actions\">\r\n <mtx-grid-column-menu *ngIf=\"showColumnMenuButton\" #columnMenu\r\n [columns]=\"columns\"\r\n [buttonText]=\"columnMenuButtonText\"\r\n [buttonType]=\"columnMenuButtonType\"\r\n [buttonColor]=\"columnMenuButtonColor\"\r\n [buttonClass]=\"columnMenuButtonClass\"\r\n [buttonIcon]=\"columnMenuButtonIcon\"\r\n [selectable]=\"columnHideable\"\r\n [selectableChecked]=\"columnHideableChecked\"\r\n [sortable]=\"columnSortable\"\r\n [pinnable]=\"columnPinnable\"\r\n [showHeader]=\"showColumnMenuHeader\"\r\n [headerText]=\"columnMenuHeaderText\"\r\n [headerTemplate]=\"columnMenuHeaderTemplate\"\r\n [showFooter]=\"showColumnMenuFooter\"\r\n [footerText]=\"columnMenuFooterText\"\r\n [footerTemplate]=\"columnMenuFooterTemplate\"\r\n [pinOptions]=\"columnPinOptions\"\r\n (columnChange)=\"_onColumnChange($event)\">\r\n </mtx-grid-column-menu>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-main mtx-grid-layout\">\r\n <!-- Table content -->\r\n <div class=\"mtx-grid-content mtx-grid-layout\">\r\n <div #tableContainer class=\"mat-table-container\"\r\n [ngClass]=\"{'mat-table-with-data': !_hasNoResult}\">\r\n <table mat-table *ngIf=\"!columnResizable\"\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectedChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\r\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n\r\n <!-- TODO: Use flexbox-based mat-table -->\r\n <table mat-table *ngIf=\"columnResizable\"\r\n columnResize\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n [resizable]=\"col.resizable\"\r\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectedChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\r\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n <!-- No result -->\r\n <div class=\"mtx-grid-no-result\" *ngIf=\"_hasNoResult\">\r\n <ng-template [ngIf]=\"noResultTemplate\" [ngIfElse]=\"defaultNoResultTpl\">\r\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultNoResultTpl>{{noResultText}}</ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tool sidebar -->\r\n <div class=\"mtx-grid-sidebar\" *ngIf=\"showSidebar\">\r\n <ng-template [ngIf]=\"sidebarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-footer\">\r\n <!-- Status Bar -->\r\n <div class=\"mtx-grid-statusbar\" *ngIf=\"showStatusbar\">\r\n <ng-template [ngIf]=\"statusbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Pagination -->\r\n <div class=\"mtx-grid-pagination\">\r\n <ng-template [ngIf]=\"paginationTemplate\" [ngIfElse]=\"defaultPaginationTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultPaginationTemplate>\r\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\r\n [showFirstLastButtons]=\"showFirstLastButtons\"\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [hidePageSize]=\"hidePageSize\"\r\n (page)=\"_onPage($event)\"\r\n [disabled]=\"pageDisabled\">\r\n </mat-paginator>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<!-- Header template for extra content -->\r\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\r\n <ng-template [ngIf]=\"headerExtraTemplate | isTemplateRef\" [ngIfElse]=\"headerExtraTpl\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerExtraTpl>\r\n <ng-template [ngIf]=\"$any(headerExtraTemplate)?.[col.field] | isTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n</ng-template>\r\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%;border:1px solid var(--mtx-grid-outline-color)}.mtx-grid .mat-mdc-table.mat-table-striped .mat-row-odd{background-color:var(--mtx-grid-table-row-striped-background-color)}.mtx-grid .mat-mdc-table.mat-table-hover .mat-mdc-row:hover{background-color:var(--mtx-grid-table-row-hover-background-color)}.mtx-grid .mat-mdc-table .mat-mdc-row.selected,.mtx-grid .mat-mdc-table .mat-mdc-row.mat-row-odd.selected{background-color:var(--mtx-grid-table-row-selected-background-color)}.mtx-grid .mat-mdc-table .mat-mdc-cell.selected{box-shadow:inset 0 0 0 1px var(--mtx-grid-table-cell-selected-outline-color)}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:80px}.mtx-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-mdc-header-cell,.mtx-grid .mat-mdc-footer-cell,.mtx-grid .mat-mdc-cell{padding:4px 10px;box-sizing:border-box}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:24px}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:10px;padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}.mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:10px}.mtx-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color);background-color:var(--mtx-grid-table-footer-background-color)}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-mdc-row:last-of-type .mat-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin:0 4px}.mtx-grid .mat-header-cell-inner{display:inline-flex;align-items:center}.mtx-grid .mat-mdc-paginator{border-top:1px solid var(--mtx-grid-outline-color)}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:8px;box-sizing:border-box;border-bottom:1px solid var(--mtx-grid-outline-color)}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left:1px solid var(--mtx-grid-outline-color)}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right:1px solid var(--mtx-grid-outline-color)}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:56px;padding:8px;border-top:1px solid var(--mtx-grid-outline-color)}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;width:40px;height:40px;vertical-align:middle}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:48px;overflow:hidden}.mtx-grid-checkbox-cell{flex:none;justify-content:center;width:60px;min-width:60px}.mtx-grid-checkbox-cell .mat-checkbox{display:flex;margin:0 10px}.mtx-grid-checkbox-cell .mat-checkbox-inner-container{margin-left:0}.mtx-grid-row-expand-button.mat-mdc-icon-button{width:40px;height:40px;padding:8px;vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button+mtx-grid-cell{vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button .mat-mdc-button-touch-target{width:100%;height:100%}.mtx-grid-icon{width:20px;height:20px;font-size:20px}.mtx-grid-column-menu-item,.mtx-grid-column-menu-header,.mtx-grid-column-menu-footer{color:var(--mtx-grid-column-menu-text-color)}.mtx-grid-column-menu-header{border-bottom:1px solid var(--mtx-grid-column-menu-divider-color)}.mtx-grid-column-menu-footer{border-top:1px solid var(--mtx-grid-column-menu-divider-color)}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i2.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatTable; }), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderCellDef; }), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderRowDef; }), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatColumnDef; }), selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatCellDef; }), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatRowDef; }), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterCellDef; }), selector: "[matFooterCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterRowDef; }), selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderCell; }), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatCell; }), selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterCell; }), selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i0.forwardRef(function () { return i3.MatHeaderRow; }), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatRow; }), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatFooterRow; }), selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatSort; }), selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(function () { return i4.MatSortHeader; }), selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i0.forwardRef(function () { return i5.MatPaginator; }), selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MatCheckbox; }), selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i0.forwardRef(function () { return i7.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i8.MatProgressBar; }), selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatColumnResize; }), selector: "table[mat-table][columnResize]" }, { kind: "directive", type: i0.forwardRef(function () { return i10.MatResizable; }), selector: "mat-header-cell[resizable], th[mat-header-cell][resizable]", inputs: ["matResizableMinWidthPx", "matResizableMaxWidthPx", "resizable"] }, { kind: "component", type: i0.forwardRef(function () { return i11.MtxGridCell; }), selector: "mtx-grid-cell", inputs: ["rowData", "colDef", "data", "summary", "placeholder"], outputs: ["rowDataChange"], exportAs: ["mtxGridCell"] }, { kind: "component", type: i0.forwardRef(function () { return i12.MtxGridColumnMenu; }), selector: "mtx-grid-column-menu", inputs: ["columns", "selectable", "selectableChecked", "sortable", "pinnable", "buttonText", "buttonType", "buttonColor", "buttonClass", "buttonIcon", "showHeader", "headerText", "headerTemplate", "showFooter", "footerText", "footerTemplate", "pinOptions"], outputs: ["columnChange"], exportAs: ["mtxGridColumnMenu"] }, { kind: "directive", type: i0.forwardRef(function () { return i13.MtxGridExpansionToggle; }), selector: "[mtx-grid-expansion-toggle]", inputs: ["opened", "expandableRow", "expansionRowTpl"], outputs: ["openedChange", "toggleChange"] }, { kind: "directive", type: i0.forwardRef(function () { return MtxGridSelectableCell; }), selector: "[mtx-grid-selectable-cell]", inputs: ["mtxSelectableRowData"], outputs: ["cellSelectedChange"] }, { kind: "pipe", type: i0.forwardRef(function () { return i2.AsyncPipe; }), name: "async" }, { kind: "pipe", type: i0.forwardRef(function () { return i14.MtxToObservablePipe; }), name: "toObservable" }, { kind: "pipe", type: i0.forwardRef(function () { return i14.MtxIsTemplateRefPipe; }), name: "isTemplateRef" }, { kind: "pipe", type: i0.forwardRef(function () { return i15.MtxGridRowClassPipe; }), name: "rowClass" }, { kind: "pipe", type: i0.forwardRef(function () { return i15.MtxGridColClassPipe; }), name: "colClass" }], animations: [
370
375
  trigger('expansion', [
371
376
  state('collapsed, void', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
372
377
  state('expanded', style({ height: '*', visibility: 'visible' })),
@@ -386,7 +391,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
386
391
  transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
387
392
  transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
388
393
  ]),
389
- ], template: "<!-- Progress bar-->\r\n<div class=\"mtx-grid-progress\" *ngIf=\"loading\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- Toolbar -->\r\n<div class=\"mtx-grid-toolbar\" *ngIf=\"showToolbar\">\r\n <div class=\"mtx-grid-toolbar-content\">\r\n <ng-template [ngIf]=\"toolbarTemplate\" [ngIfElse]=\"defaultToolbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultToolbarTemplate>\r\n <div class=\"mtx-grid-toolbar-title\" *ngIf=\"toolbarTitle\">{{toolbarTitle}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"mtx-grid-toolbar-actions\">\r\n <mtx-grid-column-menu *ngIf=\"showColumnMenuButton\" #columnMenu\r\n [columns]=\"columns\"\r\n [buttonText]=\"columnMenuButtonText\"\r\n [buttonType]=\"columnMenuButtonType\"\r\n [buttonColor]=\"columnMenuButtonColor\"\r\n [buttonClass]=\"columnMenuButtonClass\"\r\n [buttonIcon]=\"columnMenuButtonIcon\"\r\n [selectable]=\"columnHideable\"\r\n [selectableChecked]=\"columnHideableChecked\"\r\n [sortable]=\"columnSortable\"\r\n [pinnable]=\"columnPinnable\"\r\n [showHeader]=\"showColumnMenuHeader\"\r\n [headerText]=\"columnMenuHeaderText\"\r\n [headerTemplate]=\"columnMenuHeaderTemplate\"\r\n [showFooter]=\"showColumnMenuFooter\"\r\n [footerText]=\"columnMenuFooterText\"\r\n [footerTemplate]=\"columnMenuFooterTemplate\"\r\n [pinOptions]=\"columnPinOptions\"\r\n (columnChange)=\"_onColumnChange($event)\">\r\n </mtx-grid-column-menu>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-main mtx-grid-layout\">\r\n <!-- Table content -->\r\n <div class=\"mtx-grid-content mtx-grid-layout\">\r\n <div #tableContainer class=\"mat-table-container\"\r\n [ngClass]=\"{'mat-table-with-data': !_hasNoResult}\">\r\n <table mat-table *ngIf=\"!columnResizable\"\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n\r\n <!-- TODO: Use flexbox-based mat-table -->\r\n <table mat-table *ngIf=\"columnResizable\"\r\n columnResize\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n [resizable]=\"col.resizable\"\r\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n <!-- No result -->\r\n <div class=\"mtx-grid-no-result\" *ngIf=\"_hasNoResult\">\r\n <ng-template [ngIf]=\"noResultTemplate\" [ngIfElse]=\"defaultNoResultTpl\">\r\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultNoResultTpl>{{noResultText}}</ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tool sidebar -->\r\n <div class=\"mtx-grid-sidebar\" *ngIf=\"showSidebar\">\r\n <ng-template [ngIf]=\"sidebarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-footer\">\r\n <!-- Status Bar -->\r\n <div class=\"mtx-grid-statusbar\" *ngIf=\"showStatusbar\">\r\n <ng-template [ngIf]=\"statusbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Pagination -->\r\n <div class=\"mtx-grid-pagination\">\r\n <ng-template [ngIf]=\"paginationTemplate\" [ngIfElse]=\"defaultPaginationTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultPaginationTemplate>\r\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\r\n [showFirstLastButtons]=\"showFirstLastButtons\"\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [hidePageSize]=\"hidePageSize\"\r\n (page)=\"_onPage($event)\"\r\n [disabled]=\"pageDisabled\">\r\n </mat-paginator>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<!-- Header template for extra content -->\r\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\r\n <ng-template [ngIf]=\"headerExtraTemplate | isTemplateRef\" [ngIfElse]=\"headerExtraTpl\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerExtraTpl>\r\n <ng-template [ngIf]=\"$any(headerExtraTemplate)?.[col.field] | isTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n</ng-template>\r\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:80px}.mtx-grid .mat-table-sticky-left{border-right-width:1px;border-right-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left-width:1px;border-left-style:solid}.mtx-grid .mat-table-sticky-right{border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid .mat-mdc-header-cell,.mtx-grid .mat-mdc-footer-cell,.mtx-grid .mat-mdc-cell{padding:4px 10px;box-sizing:border-box}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:24px}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:10px;padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}.mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:10px}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-mdc-row:last-of-type .mat-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin:0 4px}.mtx-grid .mat-header-cell-inner{display:inline-flex;align-items:center}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:8px;box-sizing:border-box}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:56px;padding:8px}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;width:40px;height:40px;vertical-align:middle}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:48px;overflow:hidden}.mtx-grid-checkbox-cell{flex:none;justify-content:center;width:60px;min-width:60px}.mtx-grid-checkbox-cell .mat-checkbox{display:flex;margin:0 10px}.mtx-grid-checkbox-cell .mat-checkbox-inner-container{margin-left:0}.mtx-grid-row-expand-button.mat-mdc-icon-button{width:40px;height:40px;padding:8px;vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button+mtx-grid-cell{vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button .mat-mdc-button-touch-target{width:100%;height:100%}.mtx-grid-icon{width:20px;height:20px;font-size:20px}\n"] }]
394
+ ], template: "<!-- Progress bar-->\r\n<div class=\"mtx-grid-progress\" *ngIf=\"loading\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- Toolbar -->\r\n<div class=\"mtx-grid-toolbar\" *ngIf=\"showToolbar\">\r\n <div class=\"mtx-grid-toolbar-content\">\r\n <ng-template [ngIf]=\"toolbarTemplate\" [ngIfElse]=\"defaultToolbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultToolbarTemplate>\r\n <div class=\"mtx-grid-toolbar-title\" *ngIf=\"toolbarTitle\">{{toolbarTitle}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"mtx-grid-toolbar-actions\">\r\n <mtx-grid-column-menu *ngIf=\"showColumnMenuButton\" #columnMenu\r\n [columns]=\"columns\"\r\n [buttonText]=\"columnMenuButtonText\"\r\n [buttonType]=\"columnMenuButtonType\"\r\n [buttonColor]=\"columnMenuButtonColor\"\r\n [buttonClass]=\"columnMenuButtonClass\"\r\n [buttonIcon]=\"columnMenuButtonIcon\"\r\n [selectable]=\"columnHideable\"\r\n [selectableChecked]=\"columnHideableChecked\"\r\n [sortable]=\"columnSortable\"\r\n [pinnable]=\"columnPinnable\"\r\n [showHeader]=\"showColumnMenuHeader\"\r\n [headerText]=\"columnMenuHeaderText\"\r\n [headerTemplate]=\"columnMenuHeaderTemplate\"\r\n [showFooter]=\"showColumnMenuFooter\"\r\n [footerText]=\"columnMenuFooterText\"\r\n [footerTemplate]=\"columnMenuFooterTemplate\"\r\n [pinOptions]=\"columnPinOptions\"\r\n (columnChange)=\"_onColumnChange($event)\">\r\n </mtx-grid-column-menu>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-main mtx-grid-layout\">\r\n <!-- Table content -->\r\n <div class=\"mtx-grid-content mtx-grid-layout\">\r\n <div #tableContainer class=\"mat-table-container\"\r\n [ngClass]=\"{'mat-table-with-data': !_hasNoResult}\">\r\n <table mat-table *ngIf=\"!columnResizable\"\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectedChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\r\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n\r\n <!-- TODO: Use flexbox-based mat-table -->\r\n <table mat-table *ngIf=\"columnResizable\"\r\n columnResize\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n [resizable]=\"col.resizable\"\r\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectedChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\r\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n <!-- No result -->\r\n <div class=\"mtx-grid-no-result\" *ngIf=\"_hasNoResult\">\r\n <ng-template [ngIf]=\"noResultTemplate\" [ngIfElse]=\"defaultNoResultTpl\">\r\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultNoResultTpl>{{noResultText}}</ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tool sidebar -->\r\n <div class=\"mtx-grid-sidebar\" *ngIf=\"showSidebar\">\r\n <ng-template [ngIf]=\"sidebarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-footer\">\r\n <!-- Status Bar -->\r\n <div class=\"mtx-grid-statusbar\" *ngIf=\"showStatusbar\">\r\n <ng-template [ngIf]=\"statusbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Pagination -->\r\n <div class=\"mtx-grid-pagination\">\r\n <ng-template [ngIf]=\"paginationTemplate\" [ngIfElse]=\"defaultPaginationTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultPaginationTemplate>\r\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\r\n [showFirstLastButtons]=\"showFirstLastButtons\"\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [hidePageSize]=\"hidePageSize\"\r\n (page)=\"_onPage($event)\"\r\n [disabled]=\"pageDisabled\">\r\n </mat-paginator>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<!-- Header template for extra content -->\r\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\r\n <ng-template [ngIf]=\"headerExtraTemplate | isTemplateRef\" [ngIfElse]=\"headerExtraTpl\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerExtraTpl>\r\n <ng-template [ngIf]=\"$any(headerExtraTemplate)?.[col.field] | isTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n</ng-template>\r\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%;border:1px solid var(--mtx-grid-outline-color)}.mtx-grid .mat-mdc-table.mat-table-striped .mat-row-odd{background-color:var(--mtx-grid-table-row-striped-background-color)}.mtx-grid .mat-mdc-table.mat-table-hover .mat-mdc-row:hover{background-color:var(--mtx-grid-table-row-hover-background-color)}.mtx-grid .mat-mdc-table .mat-mdc-row.selected,.mtx-grid .mat-mdc-table .mat-mdc-row.mat-row-odd.selected{background-color:var(--mtx-grid-table-row-selected-background-color)}.mtx-grid .mat-mdc-table .mat-mdc-cell.selected{box-shadow:inset 0 0 0 1px var(--mtx-grid-table-cell-selected-outline-color)}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:80px}.mtx-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-mdc-header-cell,.mtx-grid .mat-mdc-footer-cell,.mtx-grid .mat-mdc-cell{padding:4px 10px;box-sizing:border-box}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:24px}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:10px;padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}.mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:10px}.mtx-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color);background-color:var(--mtx-grid-table-footer-background-color)}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-mdc-row:last-of-type .mat-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin:0 4px}.mtx-grid .mat-header-cell-inner{display:inline-flex;align-items:center}.mtx-grid .mat-mdc-paginator{border-top:1px solid var(--mtx-grid-outline-color)}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:8px;box-sizing:border-box;border-bottom:1px solid var(--mtx-grid-outline-color)}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left:1px solid var(--mtx-grid-outline-color)}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right:1px solid var(--mtx-grid-outline-color)}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:56px;padding:8px;border-top:1px solid var(--mtx-grid-outline-color)}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;width:40px;height:40px;vertical-align:middle}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:48px;overflow:hidden}.mtx-grid-checkbox-cell{flex:none;justify-content:center;width:60px;min-width:60px}.mtx-grid-checkbox-cell .mat-checkbox{display:flex;margin:0 10px}.mtx-grid-checkbox-cell .mat-checkbox-inner-container{margin-left:0}.mtx-grid-row-expand-button.mat-mdc-icon-button{width:40px;height:40px;padding:8px;vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button+mtx-grid-cell{vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button .mat-mdc-button-touch-target{width:100%;height:100%}.mtx-grid-icon{width:20px;height:20px;font-size:20px}.mtx-grid-column-menu-item,.mtx-grid-column-menu-header,.mtx-grid-column-menu-footer{color:var(--mtx-grid-column-menu-text-color)}.mtx-grid-column-menu-header{border-bottom:1px solid var(--mtx-grid-column-menu-divider-color)}.mtx-grid-column-menu-footer{border-top:1px solid var(--mtx-grid-column-menu-divider-color)}\n"] }]
390
395
  }], ctorParameters: function () { return [{ type: i1.MtxGridUtils }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
391
396
  type: Optional
392
397
  }, {
@@ -472,6 +477,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
472
477
  type: Input
473
478
  }], rowClick: [{
474
479
  type: Output
480
+ }], rowContextMenu: [{
481
+ type: Output
475
482
  }], expandable: [{
476
483
  type: Input
477
484
  }], expansionTemplate: [{
@@ -482,8 +489,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
482
489
  type: Input
483
490
  }], multiSelectionWithClick: [{
484
491
  type: Input
485
- }], rowSelected: [{
486
- type: Input
487
492
  }], rowSelectable: [{
488
493
  type: Input
489
494
  }], hideRowSelectionCheckbox: [{
@@ -494,11 +499,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
494
499
  type: Input
495
500
  }], rowClassFormatter: [{
496
501
  type: Input
497
- }], rowSelectionChange: [{
502
+ }], rowSelected: [{
503
+ type: Input
504
+ }], rowSelectedChange: [{
498
505
  type: Output
499
506
  }], cellSelectable: [{
500
507
  type: Input
501
- }], cellSelectionChange: [{
508
+ }], cellSelectedChange: [{
502
509
  type: Output
503
510
  }], showToolbar: [{
504
511
  type: Input
@@ -585,7 +592,7 @@ export class MtxGridSelectableCell {
585
592
  this._selected = false;
586
593
  this.ctrlKeyPressed = false;
587
594
  this.shiftKeyPressed = false;
588
- this.cellSelectionChange = new EventEmitter();
595
+ this.cellSelectedChange = new EventEmitter();
589
596
  }
590
597
  onClick(event) {
591
598
  this.ctrlKeyPressed = event.ctrlKey;
@@ -596,18 +603,18 @@ export class MtxGridSelectableCell {
596
603
  }
597
604
  select() {
598
605
  this._selected = true;
599
- this.cellSelectionChange.emit(this);
606
+ this.cellSelectedChange.emit(this);
600
607
  }
601
608
  deselect() {
602
609
  this._selected = false;
603
- this.cellSelectionChange.emit(this);
610
+ this.cellSelectedChange.emit(this);
604
611
  }
605
612
  toggle() {
606
613
  this._selected = !this._selected;
607
- this.cellSelectionChange.emit(this);
614
+ this.cellSelectedChange.emit(this);
608
615
  }
609
616
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: MtxGridSelectableCell, deps: [{ token: MtxGrid }], target: i0.ɵɵFactoryTarget.Directive }); }
610
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: MtxGridSelectableCell, selector: "[mtx-grid-selectable-cell]", inputs: { mtxSelectableRowData: "mtxSelectableRowData" }, outputs: { cellSelectionChange: "cellSelectionChange" }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.selected": "this.selected" } }, ngImport: i0 }); }
617
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: MtxGridSelectableCell, selector: "[mtx-grid-selectable-cell]", inputs: { mtxSelectableRowData: "mtxSelectableRowData" }, outputs: { cellSelectedChange: "cellSelectedChange" }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.selected": "this.selected" } }, ngImport: i0 }); }
611
618
  }
612
619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: MtxGridSelectableCell, decorators: [{
613
620
  type: Directive,
@@ -619,10 +626,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
619
626
  args: ['class.selected']
620
627
  }], mtxSelectableRowData: [{
621
628
  type: Input
622
- }], cellSelectionChange: [{
629
+ }], cellSelectedChange: [{
623
630
  type: Output
624
631
  }], onClick: [{
625
632
  type: HostListener,
626
633
  args: ['click', ['$event']]
627
634
  }] } });
628
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZ3JpZC9ncmlkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9ncmlkL2dyaWQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsU0FBUyxFQVVULGVBQWUsRUFDZixTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFFWixjQUFjLEVBQ2QsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsWUFBWSxFQUVaLGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQVEsT0FBTyxFQUFpQixNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCdEUsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDM0IsQ0FBQztBQXFCRixNQUFNLE9BQU8sT0FBTztJQTZMbEIsSUFBSSxZQUFZO1FBQ2QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFD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YyxFQUFFO1lBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztpSUE5Q1UscUJBQXFCO3FIQUFyQixxQkFBcUI7OzJGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDRCQUE0QjtpQkFDdkM7MkZBU0ssUUFBUTtzQkFEWCxXQUFXO3VCQUFDLGdCQUFnQjtnQkFNekIsb0JBQW9CO3NCQUR2QixLQUFLO2dCQU9JLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFLUCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0NoaWxkLFxuICBPbkNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUcmFja0J5RnVuY3Rpb24sXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFF1ZXJ5TGlzdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEtleVZhbHVlQ2hhbmdlUmVjb3JkLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgT3B0aW9uYWwsXG4gIEluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0cmlnZ2VyLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIGFuaW1hdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7XG4gIE1hdEZvb3RlclJvdyxcbiAgTWF0Rm9vdGVyUm93RGVmLFxuICBNYXRIZWFkZXJSb3dEZWYsXG4gIE1hdFJvd0RlZixcbiAgTWF0VGFibGUsXG4gIE1hdFRhYmxlRGF0YVNvdXJjZSxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgU29ydCwgTWF0U29ydCwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5cbmltcG9ydCB7XG4gIE10eEdyaWRDb2x1bW4sXG4gIE10eEdyaWRDZWxsVGVtcGxhdGUsXG4gIE10eEdyaWRSb3dTZWxlY3Rpb25Gb3JtYXR0ZXIsXG4gIE10eEdyaWRSb3dDbGFzc0Zvcm1hdHRlcixcbiAgTXR4R3JpZEJ1dHRvblR5cGUsXG4gIE10eEdyaWRDb2x1bW5QaW5PcHRpb24sXG4gIE10eEdyaWREZWZhdWx0T3B0aW9ucyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE10eEdyaWRFeHBhbnNpb25Ub2dnbGUgfSBmcm9tICcuL2V4cGFuc2lvbi10b2dnbGUnO1xuaW1wb3J0IHsgTXR4R3JpZFV0aWxzIH0gZnJvbSAnLi9ncmlkLXV0aWxzJztcbmltcG9ydCB7IE10eEdyaWRDb2x1bW5NZW51IH0gZnJvbSAnLi9jb2x1bW4tbWVudSc7XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgZ3JpZCBvcHRpb25zLiAqL1xuZXhwb3J0IGNvbnN0IE1UWF9HUklEX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNdHhHcmlkRGVmYXVsdE9wdGlvbnM+KFxuICAnbXR4LWdyaWQtZGVmYXVsdC1vcHRpb25zJ1xuKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXR4LWdyaWQnLFxuICBleHBvcnRBczogJ210eEdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5zY3NzJ10sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ210eC1ncmlkJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdleHBhbnNpb24nLCBbXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkLCB2b2lkJywgc3R5bGUoeyBoZWlnaHQ6ICcwJywgbWluSGVpZ2h0OiAnMCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicsIHZpc2liaWxpdHk6ICd2aXNpYmxlJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IHZvaWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXG4gICAgXSksXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE10eEdyaWQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHRhYmxlITogTWF0VGFibGU8YW55PjtcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0ITogTWF0U29ydDtcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRSb3dEZWYpIHJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0Um93RGVmPGFueT4+O1xuICBAQ29udGVudENoaWxkcmVuKE1hdEhlYWRlclJvd0RlZikgaGVhZGVyUm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRIZWFkZXJSb3dEZWY+O1xuICBAQ29udGVudENoaWxkcmVuKE1hdEZvb3RlclJvdykgZm9vdGVyUm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRGb290ZXJSb3dEZWY+O1xuICBAVmlld0NoaWxkKCdjb2x1bW5NZW51JykgY29sdW1uTWVudSE6IE10eEdyaWRDb2x1bW5NZW51O1xuICBAVmlld0NoaWxkKCd0YWJsZUNvbnRhaW5lcicpIHRhYmxlQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcblxuICAvKiogVGhlIGdyaWQncyBkaXNwbGF5ZWQgY29sdW1ucy4gKi9cbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFRoZSBncmlkJ3MgY29sdW1ucy4gKi9cbiAgQElucHV0KCkgY29sdW1uczogTXR4R3JpZENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgZ3JpZCdzIGRhdGEuICovXG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRoZSBkYXRhLiAqL1xuICBASW5wdXQoKSBsZW5ndGggPSAwO1xuICAvKiogV2hldGhlciB0aGUgZ3JpZCBpcyBsb2FkaW5nLiAqL1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG4gIC8qKiBUcmFja2luZyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBjaGVjayB0aGUgZGlmZmVyZW5jZXMgaW4gZGF0YSBjaGFuZ2VzLiAqL1xuICBASW5wdXQoKSB0cmFja0J5ITogVHJhY2tCeUZ1bmN0aW9uPGFueT47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgcmVzaXphYmxlLiAqL1xuICBASW5wdXQoKSBjb2x1bW5SZXNpemFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uUmVzaXphYmxlID8/IGZhbHNlO1xuICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBlbXB0eSB2YWx1ZSAoYG51bGxgLCBgJydgLCBgW11gKS4gKi9cbiAgQElucHV0KCkgZW1wdHlWYWx1ZVBsYWNlaG9sZGVyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmVtcHR5VmFsdWVQbGFjZWhvbGRlciA/PyAnLS0nO1xuXG4gIC8vID09PT09IFBhZ2UgPT09PT1cblxuICAvKiogV2hldGhlciB0byBwYWdpbmF0ZSB0aGUgZGF0YSBvbiBmcm9udCBlbmQuICovXG4gIEBJbnB1dCgpIHBhZ2VPbkZyb250ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VPbkZyb250ID8/IHRydWU7XG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBhZ2luYXRvci4gKi9cbiAgQElucHV0KCkgc2hvd1BhZ2luYXRvciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93UGFnaW5hdG9yID8/IHRydWU7XG4gIC8qKiBXaGV0aGVyIHRoZSBwYWdpbmF0b3IgaXMgZGlzYWJsZWQuICovXG4gIEBJbnB1dCgpIHBhZ2VEaXNhYmxlZCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5wYWdlRGlzYWJsZWQgPz8gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGZpcnN0L2xhc3QgYnV0dG9ucyBVSSB0byB0aGUgdXNlci4gKi9cbiAgQElucHV0KCkgc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPz8gdHJ1ZTtcbiAgLyoqIFRoZSB6ZXJvLWJhc2VkIHBhZ2UgaW5kZXggb2YgdGhlIGRpc3BsYXllZCBsaXN0IG9mIGl0ZW1zLiAqL1xuICBASW5wdXQoKSBwYWdlSW5kZXggPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZUluZGV4ID8/IDA7XG4gIC8qKiBOdW1iZXIgb2YgaXRlbXMgdG8gZGlzcGxheSBvbiBhIHBhZ2UuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VTaXplID8/IDEwO1xuICAvKiogVGhlIHNldCBvZiBwcm92aWRlZCBwYWdlIHNpemUgb3B0aW9ucyB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLiAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZVNpemVPcHRpb25zID8/IFsxMCwgNTAsIDEwMF07XG4gIC8qKiBXaGV0aGVyIHRvIGhpZGUgdGhlIHBhZ2Ugc2l6ZSBzZWxlY3Rpb24gVUkgZnJvbSB0aGUgdXNlci4gKi9cbiAgQElucHV0KCkgaGlkZVBhZ2VTaXplID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmhpZGVQYWdlU2l6ZSA/PyBmYWxzZTtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgcGFnaW5hdG9yIGNoYW5nZXMgdGhlIHBhZ2Ugc2l6ZSBvciBwYWdlIGluZGV4LiAqL1xuICBAT3V0cHV0KCkgcGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUV2ZW50PigpO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgcGFnaW5hdGlvbi4gKi9cbiAgQElucHV0KCkgcGFnaW5hdGlvblRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyA9PT09PSBTb3J0ID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gc29ydCB0aGUgZGF0YSBvbiBmcm9udCBlbmQuICovXG4gIEBJbnB1dCgpIHNvcnRPbkZyb250ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnRPbkZyb250ID8/IHRydWU7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIG1vc3QgcmVjZW50bHkgc29ydGVkIE1hdFNvcnRhYmxlLiAqL1xuICBASW5wdXQoKSBzb3J0QWN0aXZlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnRBY3RpdmUgPz8gJyc7XG4gIC8qKiBUaGUgc29ydCBkaXJlY3Rpb24gb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgTWF0U29ydGFibGUuICovXG4gIEBJbnB1dCgpIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydERpcmVjdGlvbiA/PyAnJztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgdXNlciBmcm9tIGNsZWFyaW5nIHRoZSBzb3J0IGJ5IGZpbmlzaGluZyB0aGUgc29ydCBkaXJlY3Rpb24gY3ljbGUuXG4gICAqIE1heSBiZSBvdmVycmlkZW4gYnkgdGhlIGNvbHVtbidzIGBkaXNhYmxlQ2xlYXJgIGluIGBzb3J0UHJvcGAuXG4gICAqL1xuICBASW5wdXQoKSBzb3J0RGlzYWJsZUNsZWFyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnREaXNhYmxlQ2xlYXIgPz8gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHRoZSBzb3J0IGlzIGRpc2FibGVkLiAqL1xuICBASW5wdXQoKSBzb3J0RGlzYWJsZWQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydERpc2FibGVkID8/IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiB0byBzZXQgd2hlbiBhbiBNYXRTb3J0YWJsZSBpcyBpbml0aWFsbHkgc29ydGVkLlxuICAgKiBNYXkgYmUgb3ZlcnJpZGVuIGJ5IHRoZSBjb2x1bW4ncyBgc3RhcnRgIGluIGBzb3J0UHJvcGAuXG4gICAqL1xuICBASW5wdXQoKSBzb3J0U3RhcnQ6ICdhc2MnIHwgJ2Rlc2MnID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnRTdGFydCA/PyAnYXNjJztcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGVpdGhlciB0aGUgYWN0aXZlIHNvcnQgb3Igc29ydCBkaXJlY3Rpb24uICovXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpO1xuXG4gIC8vID09PT09IFJvdyA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHVzZSB0aGUgcm93IGhvdmVyIHN0eWxlLiAqL1xuICBASW5wdXQoKSByb3dIb3ZlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5yb3dIb3ZlciA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIHRoZSByb3cgc3RyaXBlZCBzdHlsZS4gKi9cbiAgQElucHV0KCkgcm93U3RyaXBlZCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5yb3dTdHJpcGVkID8/IGZhbHNlO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvLyA9PT09PSBFeHBhbmRhYmxlIFJvdyA9PT09PVxuXG4gIGV4cGFuc2lvblJvd1N0YXRlczogYW55W10gPSBbXTtcblxuICAvKiogV2hldGhlciB0aGUgcm93IGlzIGV4cGFuZGFibGUuICovXG4gIEBJbnB1dCgpIGV4cGFuZGFibGUgPSBmYWxzZTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGV4cGFuZGFibGUgcm93LiAqL1xuICBASW5wdXQoKSBleHBhbnNpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgdG9nZ2xlcyB0aGUgZXhwYW5kYWJsZSByb3cuICovXG4gIEBPdXRwdXQoKSBleHBhbnNpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvLyA9PT09PSBSb3cgU2VsZWN0aW9uID09PT09XG5cbiAgcm93U2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+ID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgcm93L2NlbGwgc2VsZWN0aW9uLiAqL1xuICBASW5wdXQoKSBtdWx0aVNlbGVjdGFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ubXVsdGlTZWxlY3RhYmxlID8/IHRydWU7XG4gIC8qKiBXaGV0aGVyIHRoZSB1c2VyIGNhbiBzZWxlY3QgbXVsdGlwbGUgcm93cyB3aXRoIGNsaWNrLiAqL1xuICBASW5wdXQoKSBtdWx0aVNlbGVjdGlvbldpdGhDbGljayA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5tdWx0aVNlbGVjdGlvbldpdGhDbGljayA/PyBmYWxzZTtcbiAgLyoqIFRoZSBzZWxlY3RlZCByb3cgaXRlbXMuICovXG4gIEBJbnB1dCgpIHJvd1NlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAvKiogV2hldGhlciB0aGUgcm93IGlzIHNlbGVjdGFibGUuICovXG4gIEBJbnB1dCgpIHJvd1NlbGVjdGFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucm93U2VsZWN0YWJsZSA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdG8gaGlkZSB0aGUgcm93IHNlbGVjdGlvbiBjaGVja2JveC4gKi9cbiAgQElucHV0KCkgaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmhpZGVSb3dTZWxlY3Rpb25DaGVja2JveCA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgZGlzYWJsZSByb3dzIHRvIGJlIHNlbGVjdGVkIHdoZW4gY2xpY2tlZC4gKi9cbiAgQElucHV0KCkgZGlzYWJsZVJvd0NsaWNrU2VsZWN0aW9uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmRpc2FibGVSb3dDbGlja1NlbGVjdGlvbiA/PyBmYWxzZTtcbiAgLyoqIFRoZSBmb3JtYXR0ZXIgdG8gZGlzYWJsZSB0aGUgcm93IHNlbGVjdGlvbiBvciBoaWRlIHRoZSByb3cncyBjaGVja2JveC4gKi9cbiAgQElucHV0KCkgcm93U2VsZWN0aW9uRm9ybWF0dGVyOiBNdHhHcmlkUm93U2VsZWN0aW9uRm9ybWF0dGVyID0ge307XG4gIC8qKiBUaGUgZm9ybWF0dGVyIHRvIHNldCB0aGUgcm93J3MgY2xhc3MuICovXG4gIEBJbnB1dCgpIHJvd0NsYXNzRm9ybWF0dGVyPzogTXR4R3JpZFJvd0NsYXNzRm9ybWF0dGVyO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSByb3cgaXMgc2VsZWN0ZWQuICovXG4gIEBPdXRwdXQoKSByb3dTZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8vID09PT09IENlbGwgU2VsZWN0aW9uID09PT09XG5cbiAgY2VsbFNlbGVjdGlvbjogYW55W10gPSBbXTtcblxuICAvKiogV2hldGhlciB0aGUgY2VsbCBpcyBzZWxlY3RhYmxlLiAqL1xuICBASW5wdXQoKSBjZWxsU2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jZWxsU2VsZWN0YWJsZSA/PyB0cnVlO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBjZWxsIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgY2VsbFNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDZWxsPzogTXR4R3JpZFNlbGVjdGFibGVDZWxsO1xuXG4gIC8vID09PT09IFRvb2xiYXIgPT09PT1cblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSB0b29sYmFyLiAqL1xuICBASW5wdXQoKSBzaG93VG9vbGJhciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93VG9vbGJhciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IG9mIHRoZSB0b29sYmFyJ3MgdGl0bGUuICovXG4gIEBJbnB1dCgpIHRvb2xiYXJUaXRsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy50b29sYmFyVGl0bGUgPz8gJyc7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSB0b29sYmFyLiAqL1xuICBASW5wdXQoKSB0b29sYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vID09PT09IENvbHVtbiBNZW51ID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBoaWRlYWJsZS4gKi9cbiAgQElucHV0KCkgY29sdW1uSGlkZWFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uSGlkZWFibGUgPz8gdHJ1ZTtcbiAgLyoqIEhpZGUgb3Igc2hvdyB3aGVuIHRoZSBjb2x1bW4ncyBjaGVja2JveCBpcyBjaGVja2VkLiAqL1xuICBASW5wdXQoKSBjb2x1bW5IaWRlYWJsZUNoZWNrZWQ6ICdzaG93JyB8ICdoaWRlJyA9XG4gICAgdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbkhpZGVhYmxlQ2hlY2tlZCA/PyAnc2hvdyc7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgc29ydGFibGUuICovXG4gIEBJbnB1dCgpIGNvbHVtblNvcnRhYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtblNvcnRhYmxlID8/IHRydWU7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgcGlubmFibGUuICovXG4gIEBJbnB1dCgpIGNvbHVtblBpbm5hYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtblBpbm5hYmxlID8/IHRydWU7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNvbHVtbiBpcyBoaWRlZCBvciBpcyBzb3J0ZWQuICovXG4gIEBPdXRwdXQoKSBjb2x1bW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE10eEdyaWRDb2x1bW5bXT4oKTtcbiAgLyoqIFRoZSBvcHRpb25zIGZvciB0aGUgY29sdW1uIHBpbiBsaXN0LiAqL1xuICBASW5wdXQoKSBjb2x1bW5QaW5PcHRpb25zOiBNdHhHcmlkQ29sdW1uUGluT3B0aW9uW10gPVxuICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5QaW5PcHRpb25zID8/IFtdO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgc2hvd0NvbHVtbk1lbnVCdXR0b24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0NvbHVtbk1lbnVCdXR0b24gPz8gdHJ1ZTtcbiAgLyoqIFRoZSB0ZXh0IGZvciB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51QnV0dG9uVGV4dCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51QnV0dG9uVGV4dCA/PyAnJztcbiAgLyoqIFRoZSB0eXBlIGZvciB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51QnV0dG9uVHlwZTogTXR4R3JpZEJ1dHRvblR5cGUgPVxuICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51QnV0dG9uVHlwZSA/PyAnc3Ryb2tlZCc7XG4gIC8qKiBUaGUgY29sb3IgZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25Db2xvcjogVGhlbWVQYWxldHRlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25Db2xvcjtcbiAgLyoqIFRoZSBjbGFzcyBmb3IgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUJ1dHRvbkNsYXNzID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25DbGFzcyA/PyAnJztcbiAgLyoqIFRoZSBpY29uIGZvciB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51QnV0dG9uSWNvbiA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51QnV0dG9uSWNvbiA/PyAnJztcblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBjb2x1bW4tbWVudSdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgc2hvd0NvbHVtbk1lbnVIZWFkZXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0NvbHVtbk1lbnVIZWFkZXIgPz8gZmFsc2U7XG4gIC8qKiBUaGUgdGV4dCBmb3IgdGhlIGNvbHVtbi1tZW51J3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51SGVhZGVyVGV4dCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51SGVhZGVyVGV4dCA/PyAnQ29sdW1ucyBIZWFkZXInO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgY29sdW1uLW1lbnUncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRoZSBjb2x1bW4tbWVudSdzIGZvb3Rlci4gKi9cbiAgQElucHV0KCkgc2hvd0NvbHVtbk1lbnVGb290ZXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0NvbHVtbk1lbnVGb290ZXIgPz8gZmFsc2U7XG4gIC8qKiBUaGUgdGV4dCBmb3IgdGhlIGNvbHVtbi1tZW51J3MgZm9vdGVyLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51Rm9vdGVyVGV4dCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51Rm9vdGVyVGV4dCA/PyAnQ29sdW1ucyBGb290ZXInO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgY29sdW1uLW1lbnUncyBmb290ZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVGb290ZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gTm8gUmVzdWx0ID09PT09XG5cbiAgLyoqIFRoZSBkaXNwbGF5ZWQgdGV4dCBmb3IgdGhlIGVtcHR5IGRhdGEuICovXG4gIEBJbnB1dCgpIG5vUmVzdWx0VGV4dCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5ub1Jlc3VsdFRleHQgPz8gJ05vIHJlY29yZHMgZm91bmQnO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgZW1wdHkgZGF0YS4gKi9cbiAgQElucHV0KCkgbm9SZXN1bHRUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgZ2V0IF9oYXNOb1Jlc3VsdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgJiYgIXRoaXMubG9hZGluZztcbiAgfVxuXG4gIC8vID09PT09IENlbGwgVGVtcGxhdGVzID09PT09XG5cbiAgLyoqIFRoZSBoZWFkZXIncyBjZWxsIHRlbXBsYXRlIGZvciB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCkgaGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcbiAgLyoqIFRoZSBoZWFkZXIncyBjZWxsIHRlbXBsYXRlIGZvciB0aGUgZ3JpZCBleGNsdWRlIHNvcnQuICovXG4gIEBJbnB1dCgpIGhlYWRlckV4dHJhVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcbiAgLyoqIFRoZSBjZWxsIHRlbXBsYXRlIGZvciB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCkgY2VsbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PiB8IE10eEdyaWRDZWxsVGVtcGxhdGU7XG5cbiAgLy8gPT09PT0gUm93IFRlbXBsYXRlcyA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHVzZSBjdXN0b20gcm93IHRlbXBsYXRlLiBJZiB0cnVlLCB5b3Ugc2hvdWxkIGRlZmluZSBhIG1hdFJvd0RlZi4gKi9cbiAgQElucHV0KCkgdXNlQ29udGVudFJvd1RlbXBsYXRlID0gZmFsc2U7XG4gIC8vIFRPRE86IEl0IGNhbid0IHVzZSB0b2dldGhlciB3aXRoIGB1c2VDb250ZW50Um93VGVtcGxhdGVgXG4gIEBJbnB1dCgpIHVzZUNvbnRlbnRIZWFkZXJSb3dUZW1wbGF0ZSA9IGZhbHNlO1xuICAvLyBUT0RPOiBJdCdzIG5vdCB3b3JraW5nXG4gIEBJbnB1dCgpIHVzZUNvbnRlbnRGb290ZXJSb3dUZW1wbGF0ZSA9IGZhbHNlO1xuXG4gIC8vID09PT09IFN1bW1hcnkgPT09PT1cblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBzdW1tYXJ5LiAqL1xuICBASW5wdXQoKSBzaG93U3VtbWFyeSA9IGZhbHNlO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgc3VtbWFyeS4gKi9cbiAgQElucHV0KCkgc3VtbWFyeVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PiB8IE10eEdyaWRDZWxsVGVtcGxhdGU7XG5cbiAgLy8gVE9ETzogU3VtbWFyeSBkaXNwbGF5IGNvbmRpdGlvbnNcbiAgZ2V0IF93aGV0aGVyU2hvd1N1bW1hcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1N1bW1hcnk7XG4gIH1cblxuICAvLyA9PT09PSBTaWRlIEJhciA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHNpZGViYXIuICovXG4gIEBJbnB1dCgpIHNob3dTaWRlYmFyID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBzaWRlYmFyLiAqL1xuICBASW5wdXQoKSBzaWRlYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vID09PT09IFN0YXR1cyBCYXIgPT09PT1cblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBzdGF0dXMgYmFyLiAqL1xuICBASW5wdXQoKSBzaG93U3RhdHVzYmFyID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBzdGF0dXMgYmFyLiAqL1xuICBASW5wdXQoKSBzdGF0dXNiYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqIFRoZSBjaGFuZ2VkIHJlY29yZCBvZiByb3cgZGF0YS4gKi9cbiAgcm93Q2hhbmdlUmVjb3JkPzogS2V5VmFsdWVDaGFuZ2VSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3V0aWxzOiBNdHhHcmlkVXRpbHMsXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChNVFhfR1JJRF9ERUZBVUxUX09QVElPTlMpXG4gICAgcHJpdmF0ZSBfZGVmYXVsdE9wdGlvbnM/OiBNdHhHcmlkRGVmYXVsdE9wdGlvbnNcbiAgKSB7fVxuXG4gIGRldGVjdENoYW5nZXMoKSB7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgX2dldENvbERhdGEoZGF0YTogYW55W10sIGNvbERlZjogTXR4R3JpZENvbHVtbikge1xuICAgIHJldHVybiB0aGlzLl91dGlscy5nZXRDb2xEYXRhKGRhdGEsIGNvbERlZik7XG4gIH1cblxuICAvLyBXYWl0aW5nIGZvciBhc3luYyBkYXRhXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLl9jb3VudFBpbm5lZFBvc2l0aW9uKCk7XG5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZSkubWFwKGl0ZW0gPT4gaXRlbS5maWVsZCk7XG5cbiAgICBpZiAodGhpcy5zaG93Q29sdW1uTWVudUJ1dHRvbikge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkhpZGVhYmxlQ2hlY2tlZCA9PT0gJ3Nob3cnKSB7XG4gICAgICAgICAgaXRlbS5zaG93ID0gIWl0ZW0uaGlkZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtLmhpZGUgPSAhIWl0ZW0uaGlkZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm93U2VsZWN0YWJsZSAmJiAhdGhpcy5oaWRlUm93U2VsZWN0aW9uQ2hlY2tib3gpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy51bnNoaWZ0KCdNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWYnKTtcbiAgICB9XG5cbiAgICAvLyBXZSBzaG91bGQgY29weSBlYWNoIGl0ZW0gb2YgZGF0YSBmb3IgZXhwYW5zaW9uIGRhdGFcbiAgICBpZiAodGhpcy5leHBhbmRhYmxlKSB7XG4gICAgICB0aGlzLmV4cGFuc2lvblJvd1N0YXRlcyA9IFtdOyAvLyByZXNldFxuXG4gICAgICB0aGlzLmRhdGE/LmZvckVhY2goXyA9PiB7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uUm93U3RhdGVzLnB1c2goeyBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dTZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnJvd1NlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRoaXMubXVsdGlTZWxlY3RhYmxlLCB0aGlzLnJvd1NlbGVjdGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuZGF0YSk7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdlT25Gcm9udCA/IHRoaXMucGFnaW5hdG9yIDogbnVsbDtcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydE9uRnJvbnQgPyB0aGlzLnNvcnQgOiBudWxsO1xuXG4gICAgLy8gT25seSBzY3JvbGwgdG9wIHdpdGggZGF0YSBjaGFuZ2VcbiAgICBpZiAoY2hhbmdlcy5kYXRhKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvcCgwKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMucGFnZU9uRnJvbnQpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0T25Gcm9udCkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm93RGVmcz8ubGVuZ3RoID4gMCAmJiB0aGlzLnVzZUNvbnRlbnRSb3dUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5yb3dEZWZzLmZvckVhY2gocm93RGVmID0+IHRoaXMudGFibGUuYWRkUm93RGVmKHJvd0RlZikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oZWFkZXJSb3dEZWZzPy5sZW5ndGggPiAwICYmIHRoaXMudXNlQ29udGVudEhlYWRlclJvd1RlbXBsYXRlKSB7XG4gICAgICB0aGlzLmhlYWRlclJvd0RlZnMuZm9yRWFjaChoZWFkZXJSb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRIZWFkZXJSb3dEZWYoaGVhZGVyUm93RGVmKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlclJvd0RlZnM/Lmxlbmd0aCA+IDAgJiYgdGhpcy51c2VDb250ZW50Rm9vdGVyUm93VGVtcGxhdGUpIHtcbiAgICAgIHRoaXMuZm9vdGVyUm93RGVmcy5mb3JFYWNoKGZvb3RlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEZvb3RlclJvd0RlZihmb290ZXJSb3dEZWYpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgX2NvdW50UGlubmVkUG9zaXRpb24oKSB7XG4gICAgY29uc3QgY291bnQgPSAoYWNjOiBudW1iZXIsIGN1cjogTXR4R3JpZENvbHVtbikgPT4gYWNjICsgcGFyc2VGbG9hdChjdXIud2lkdGggfHwgJzgwcHgnKTtcblxuICAgIGNvbnN0IHBpbm5lZExlZnRDb2xzID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnBpbm5lZCAmJiBjb2wucGlubmVkID09PSAnbGVmdCcpO1xuICAgIHBpbm5lZExlZnRDb2xzLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgaXRlbS5sZWZ0ID0gcGlubmVkTGVmdENvbHMuc2xpY2UoMCwgaWR4KS5yZWR1Y2UoY291bnQsIDApICsgJ3B4JztcbiAgICB9KTtcblxuICAgIGNvbnN0IHBpbm5lZFJpZ2h0Q29scyA9IHRoaXMuY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2wgPT4gY29sLnBpbm5lZCAmJiBjb2wucGlubmVkID09PSAncmlnaHQnKVxuICAgICAgLnJldmVyc2UoKTtcbiAgICBwaW5uZWRSaWdodENvbHMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICBpdGVtLnJpZ2h0ID0gcGlubmVkUmlnaHRDb2xzLnNsaWNlKDAsIGlkeCkucmVkdWNlKGNvdW50LCAwKSArICdweCc7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0SW5kZXgoaW5kZXg6IG51bWJlciwgZGF0YUluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdHlwZW9mIGluZGV4ID09PSAndW5kZWZpbmVkJyA/IGRhdGFJbmRleCA6IGluZGV4O1xuICB9XG5cbiAgX29uU29ydENoYW5nZShzb3J0OiBTb3J0KSB7XG4gICAgdGhpcy5zb3J0Q2hhbmdlLmVtaXQoc29ydCk7XG4gIH1cblxuICBfb25Sb3dEYXRhQ2hhbmdlKHJlY29yZDogS2V5VmFsdWVDaGFuZ2VSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdGhpcy5yb3dDaGFuZ2VSZWNvcmQgPSByZWNvcmQ7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXhwYW5zaW9uIGNoYW5nZSBldmVudCAqL1xuICBfb25FeHBhbnNpb25DaGFuZ2UoXG4gICAgZXhwYW5zaW9uUmVmOiBNdHhHcmlkRXhwYW5zaW9uVG9nZ2xlLFxuICAgIHJvd0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY29sdW1uOiBNdHhHcmlkQ29sdW1uLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2UuZW1pdCh7IGV4cGFuZGVkOiBleHBhbnNpb25SZWYuZXhwYW5kZWQsIGRhdGE6IHJvd0RhdGEsIGluZGV4LCBjb2x1bW4gfSk7XG4gIH1cblxuICAvKiogQ2VsbCBzZWxlY3QgZXZlbnQgKi9cbiAgX3NlbGVjdENlbGwoXG4gICAgY2VsbFJlZjogTXR4R3JpZFNlbGVjdGFibGVDZWxsLFxuICAgIHJvd0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY29sRGVmOiBNdHhHcmlkQ29sdW1uXG4gICk6IHZvaWQge1xuICAgIC8vIElmIG5vdCB0aGUgc2FtZSBjZWxsXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkQ2VsbCAhPT0gY2VsbFJlZikge1xuICAgICAgY29uc3QgY29sVmFsdWUgPSB0aGlzLl91dGlscy5nZXRDZWxsVmFsdWUocm93RGF0YSwgY29sRGVmKTtcbiAgICAgIHRoaXMuY2VsbFNlbGVjdGlvbiA9IFtdOyAvLyByZXNldFxuICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uLnB1c2goeyBjZWxsRGF0YTogY29sVmFsdWUsIHJvd0RhdGEsIGNvbERlZiB9KTtcblxuICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5jZWxsU2VsZWN0aW9uKTtcblxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkQ2VsbCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZENlbGwuZGVzZWxlY3QoKTsgLy8gdGhlIHNlbGVjdGVkQ2VsbCB3aWxsIGJlIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGVkQ2VsbCA9IGNlbGxSZWYuc2VsZWN0ZWQgPyBjZWxsUmVmIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJvdyBzZWxlY3QgZXZlbnQgKi9cbiAgX3NlbGVjdFJvdyhldmVudDogTW91c2VFdmVudCwgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChcbiAgICAgIHRoaXMucm93U2VsZWN0YWJsZSAmJlxuICAgICAgIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkPy4ocm93RGF0YSwgaW5kZXgpICYmXG4gICAgICAhdGhpcy5yb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuaGlkZUNoZWNrYm94Py4ocm93RGF0YSwgaW5kZXgpICYmXG4gICAgICAhdGhpcy5kaXNhYmxlUm93Q2xpY2tTZWxlY3Rpb25cbiAgICApIHtcbiAgICAgIC8vIG1ldGFLZXkgLT4gY29tbWFuZCBrZXlcbiAgICAgIGlmICghdGhpcy5tdWx0aVNlbGVjdGlvbldpdGhDbGljayAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xuICAgICAgICB0aGlzLnJvd1NlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90b2dnbGVOb3JtYWxDaGVja2JveChyb3dEYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyByb3dEYXRhLCBpbmRleCB9KTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgbWF0Y2hlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHJvd3MuICovXG4gIF9pc0FsbFNlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5yb3dTZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5maWx0ZXIoXG4gICAgICAocm93LCBpbmRleCkgPT4gIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkPy4ocm93LCBpbmRleClcbiAgICApLmxlbmd0aDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XG4gIH1cblxuICAvKiogU2VsZWN0IGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXG4gIF90b2dnbGVNYXN0ZXJDaGVja2JveCgpIHtcbiAgICB0aGlzLl9pc0FsbFNlbGVjdGVkKClcbiAgICAgID8gdGhpcy5yb3dTZWxlY3Rpb24uY2xlYXIoKVxuICAgICAgOiB0aGlzLmRhdGFTb3VyY2UuZGF0YS5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZD8uKHJvdywgaW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGlvbi5zZWxlY3Qocm93KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIHRoaXMucm93U2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5yb3dTZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqIFNlbGVjdCBub3JtYWwgcm93ICovXG4gIF90b2dnbGVOb3JtYWxDaGVja2JveChyb3c6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnJvd1NlbGVjdGlvbi50b2dnbGUocm93KTtcbiAgICB0aGlzLnJvd1NlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBDb2x1bW4gY2hhbmdlIGV2ZW50ICovXG4gIF9vbkNvbHVtbkNoYW5nZShjb2x1bW5zOiBNdHhHcmlkQ29sdW1uW10pIHtcbiAgICB0aGlzLmNvbHVtbkNoYW5nZS5lbWl0KGNvbHVtbnMpO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5nZXREaXNwbGF5ZWRDb2x1bW5GaWVsZHMoY29sdW1ucykpO1xuXG4gICAgaWYgKHRoaXMucm93U2VsZWN0YWJsZSAmJiAhdGhpcy5oaWRlUm93U2VsZWN0aW9uQ2hlY2tib3gpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy51bnNoaWZ0KCdNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWYnKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb2x1bW5GaWVsZHMoY29sdW1uczogTXR4R3JpZENvbHVtbltdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpZWxkcyA9IGNvbHVtbnNcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAodGhpcy5jb2x1bW5IaWRlYWJsZUNoZWNrZWQgPT09ICdzaG93JyA/IGl0ZW0uc2hvdyA6ICFpdGVtLmhpZGUpKVxuICAgICAgLm1hcChpdGVtID0+IGl0ZW0uZmllbGQpO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKiogQ3VzdG9taXplIGV4cGFuc2lvbiBldmVudCAqL1xuICB0b2dnbGVFeHBhbnNpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5leHBhbmRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZXhwYW5kYWJsZWAgc2hvdWxkIGJlIHNldCB0cnVlLicpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQgPSAhdGhpcy5leHBhbnNpb25Sb3dTdGF0ZXNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIHJldHVybiB0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQ7XG4gIH1cblxuICAvKiogU2Nyb2xsIHRvIHRvcCB3aGVuIHR1cm4gdG8gdGhlIG5leHQgcGFnZS4gKi9cbiAgX29uUGFnZShlOiBQYWdlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5wYWdlT25Gcm9udCkge1xuICAgICAgdGhpcy5zY3JvbGxUb3AoMCk7XG4gICAgfVxuICAgIHRoaXMucGFnZS5lbWl0KGUpO1xuICB9XG5cbiAgc2Nyb2xsVG9wKHZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgdm9pZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXIgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU/OiBudW1iZXIpOiBudW1iZXIgfCB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXIgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW210eC1ncmlkLXNlbGVjdGFibGUtY2VsbF0nLFxufSlcbmV4cG9ydCBjbGFzcyBNdHhHcmlkU2VsZWN0YWJsZUNlbGwge1xuICBwcml2YXRlIF9zZWxlY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9yb3dEYXRhITogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICBjdHJsS2V5UHJlc3NlZCA9IGZhbHNlO1xuICBzaGlmdEtleVByZXNzZWQgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdGVkJylcbiAgZ2V0IHNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBtdHhTZWxlY3RhYmxlUm93RGF0YSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9yb3dEYXRhKSB7XG4gICAgICB0aGlzLl9yb3dEYXRhID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIGNlbGxTZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE10eEdyaWRTZWxlY3RhYmxlQ2VsbD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9ncmlkOiBNdHhHcmlkKSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY3RybEtleVByZXNzZWQgPSBldmVudC5jdHJsS2V5O1xuICAgIHRoaXMuc2hpZnRLZXlQcmVzc2VkID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAodGhpcy5fZ3JpZC5jZWxsU2VsZWN0YWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuY2VsbFNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMpO1xuICB9XG5cbiAgZGVzZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNlbGxTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9ICF0aGlzLl9zZWxlY3RlZDtcbiAgICB0aGlzLmNlbGxTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzKTtcbiAgfVxufVxuIiwiPCEtLSBQcm9ncmVzcyBiYXItLT5cclxuPGRpdiBjbGFzcz1cIm10eC1ncmlkLXByb2dyZXNzXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBUb29sYmFyIC0tPlxyXG48ZGl2IGNsYXNzPVwibXR4LWdyaWQtdG9vbGJhclwiICpuZ0lmPVwic2hvd1Rvb2xiYXJcIj5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtdG9vbGJhci1jb250ZW50XCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidG9vbGJhclRlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRUb29sYmFyVGVtcGxhdGVcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvb2xiYXJUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VG9vbGJhclRlbXBsYXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtdG9vbGJhci10aXRsZVwiICpuZ0lmPVwidG9vbGJhclRpdGxlXCI+e3t0b29sYmFyVGl0bGV9fTwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtdG9vbGJhci1hY3Rpb25zXCI+XHJcbiAgICA8bXR4LWdyaWQtY29sdW1uLW1lbnUgKm5nSWY9XCJzaG93Q29sdW1uTWVudUJ1dHRvblwiICNjb2x1bW5NZW51XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1dHRvblRleHRdPVwiY29sdW1uTWVudUJ1dHRvblRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25UeXBlXT1cImNvbHVtbk1lbnVCdXR0b25UeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uQ29sb3JdPVwiY29sdW1uTWVudUJ1dHRvbkNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uQ2xhc3NdPVwiY29sdW1uTWVudUJ1dHRvbkNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uSWNvbl09XCJjb2x1bW5NZW51QnV0dG9uSWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwiY29sdW1uSGlkZWFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlQ2hlY2tlZF09XCJjb2x1bW5IaWRlYWJsZUNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJjb2x1bW5Tb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bpbm5hYmxlXT1cImNvbHVtblBpbm5hYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlYWRlcl09XCJzaG93Q29sdW1uTWVudUhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlclRleHRdPVwiY29sdW1uTWVudUhlYWRlclRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJUZW1wbGF0ZV09XCJjb2x1bW5NZW51SGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Rm9vdGVyXT1cInNob3dDb2x1bW5NZW51Rm9vdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyVGV4dF09XCJjb2x1bW5NZW51Rm9vdGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvb3RlclRlbXBsYXRlXT1cImNvbHVtbk1lbnVGb290ZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bpbk9wdGlvbnNdPVwiY29sdW1uUGluT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbkNoYW5nZSk9XCJfb25Db2x1bW5DaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgPC9tdHgtZ3JpZC1jb2x1bW4tbWVudT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibXR4LWdyaWQtbWFpbiBtdHgtZ3JpZC1sYXlvdXRcIj5cclxuICA8IS0tIFRhYmxlIGNvbnRlbnQgLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLWNvbnRlbnQgbXR4LWdyaWQtbGF5b3V0XCI+XHJcbiAgICA8ZGl2ICN0YWJsZUNvbnRhaW5lciBjbGFzcz1cIm1hdC10YWJsZS1jb250YWluZXJcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS13aXRoLWRhdGEnOiAhX2hhc05vUmVzdWx0fVwiPlxyXG4gICAgICA8dGFibGUgbWF0LXRhYmxlICpuZ0lmPVwiIWNvbHVtblJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1ob3Zlcic6IHJvd0hvdmVyLCAnbWF0LXRhYmxlLXN0cmlwZWQnOiByb3dTdHJpcGVkLCAnbWF0LXRhYmxlLWV4cGFuZGFibGUnOiBleHBhbmRhYmxlfVwiXHJcbiAgICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW211bHRpVGVtcGxhdGVEYXRhUm93c109XCJleHBhbmRhYmxlXCJcclxuICAgICAgICAgICAgIG1hdFNvcnRcclxuICAgICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydERpc2FibGVDbGVhcl09XCJzb3J0RGlzYWJsZUNsZWFyXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0RGlzYWJsZWRdPVwic29ydERpc2FibGVkXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0U3RhcnRdPVwic29ydFN0YXJ0XCJcclxuICAgICAgICAgICAgIChtYXRTb3J0Q2hhbmdlKT1cIl9vblNvcnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5XCI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dTZWxlY3RhYmxlICYmICFoaWRlUm93U2VsZWN0aW9uQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0Q29sdW1uRGVmPVwiTXR4R3JpZENoZWNrYm94Q29sdW1uRGVmXCI+XHJcbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwibXVsdGlTZWxlY3RhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3dTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBfaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJyb3dTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhX2lzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBfdG9nZ2xlTWFzdGVyQ2hlY2tib3goKSA6IG51bGxcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cIiEocm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveCAmJiByb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuaGlkZUNoZWNrYm94KHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQgJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkKHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBfdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93KSA6IG51bGxcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj48L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1ucztcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5XT1cImNvbC5waW5uZWQ9PT0nbGVmdCdcIiBbc3RpY2t5RW5kXT1cImNvbC5waW5uZWQ9PT0ncmlnaHQnXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wgfCBjb2xDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3ktbGVmdCc6IGNvbC5waW5uZWQgPT09ICdsZWZ0JywgJ21hdC10YWJsZS1zdGlja3ktcmlnaHQnOiBjb2wucGlubmVkID09PSAncmlnaHQnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogY29sLndpZHRoLCAnbWluLXdpZHRoJzogY29sLndpZHRoLCAnbGVmdCc6IGNvbC5sZWZ0LCAncmlnaHQnOiBjb2wucmlnaHR9XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1oZWFkZXItY2VsbC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImhlYWRlclRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJoZWFkZXJUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNoZWFkZXJUcGw+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIkYW55KGhlYWRlclRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJkZWZhdWx0SGVhZGVyVHBsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyVHBsPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFttYXQtc29ydC1oZWFkZXJdPVwiY29sLnNvcnRQcm9wPy5pZCB8fCBjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29sLnNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUNsZWFyXT1cImNvbC5zb3J0UHJvcD8uZGlzYWJsZUNsZWFyID8/IHNvcnREaXNhYmxlQ2xlYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbC5zb3J0UHJvcD8uYXJyb3dQb3NpdGlvbiFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtzdGFydF09XCJjb2wuc29ydFByb3A/LnN0YXJ0IVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLXBsYWNlaG9sZGVyXCIgKm5nSWY9XCJjb2wuc2hvd0V4cGFuZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2NvbC5oZWFkZXIgfCB0b09ic2VydmFibGUgfCBhc3luY319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG1hdC1zb3J0LWhlYWRlci1pY29uXCIgKm5nSWY9XCJjb2wuc29ydGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMsMTNIMTVWMTFIM00zLDZWOEgyMVY2TTMsMThIOVYxNkgzVjE4WlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJFeHRyYVRwbEJhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBoZWFkZXJFeHRyYVRlbXBsYXRlLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wgfCBjb2xDbGFzczogcm93OiByb3dDaGFuZ2VSZWNvcmQ6IHJvd0NoYW5nZVJlY29yZD8uY3VycmVudFZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdtaW4td2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIlxyXG4gICAgICAgICAgICAgICAgbXR4LWdyaWQtc2VsZWN0YWJsZS1jZWxsIChjZWxsU2VsZWN0aW9uQ2hhbmdlKT1cIl9zZWxlY3RDZWxsKCRldmVudCwgcm93LCBjb2wpXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImNlbGxUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWZcIiBbbmdJZkVsc2VdPVwiY2VsbFRwbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoY2VsbFRlbXBsYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbFRwbD5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIkYW55KGNlbGxUZW1wbGF0ZSk/Lltjb2wuZmllbGRdIHwgaXNUZW1wbGF0ZVJlZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nSWZFbHNlXT1cImNvbERlZkNlbGxUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoY2VsbFRlbXBsYXRlKVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCksIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbERlZkNlbGxUcGw+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY29sLmNlbGxUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0Q2VsbFRwbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sLmNlbGxUZW1wbGF0ZSFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCksIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsVHBsPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm10eC1ncmlkLXJvdy1leHBhbmQtYnV0dG9uXCIgKm5nSWY9XCJjb2wuc2hvd0V4cGFuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBtdHgtZ3JpZC1leHBhbnNpb24tdG9nZ2xlIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG9wZW5lZCldPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQ2hhbmdlKT1cIl9vbkV4cGFuc2lvbkNoYW5nZSgkZXZlbnQsIHJvdywgY29sLCBkYXRhSW5kZXgpO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwibXR4LWdyaWQtaWNvbiBtdHgtZ3JpZC1yb3ctZXhwYW5kLWljb25cIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPG10eC1ncmlkLWNlbGwgW3Jvd0RhdGFdPVwicm93XCIgW2NvbERlZl09XCJjb2xcIiBbcGxhY2Vob2xkZXJdPVwiZW1wdHlWYWx1ZVBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3dEYXRhQ2hhbmdlKT1cIl9vblJvd0RhdGFDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tdHgtZ3JpZC1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3ktbGVmdCc6IGNvbC5waW5uZWQgPT09ICdsZWZ0JywgJ21hdC10YWJsZS1zdGlja3ktcmlnaHQnOiBjb2wucGlubmVkID09PSAncmlnaHQnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogY29sLndpZHRoLCAnbWluLXdpZHRoJzogY29sLndpZHRoLCAnbGVmdCc6IGNvbC5sZWZ0LCAncmlnaHQnOiBjb2wucmlnaHR9XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tcGxhY2Vob2xkZXJcIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCI+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic3VtbWFyeVRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJzdW1tYXJ5VHBsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wsIGRhdGE6IGRhdGEgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VtbWFyeVRwbD5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIkYW55KHN1bW1hcnlUZW1wbGF0ZSk/Lltjb2wuZmllbGRdIHwgaXNUZW1wbGF0ZVJlZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nSWZFbHNlXT1cImRlZmF1bHRTdW1tYXJ5VHBsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KHN1bW1hcnlUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IF9nZXRDb2xEYXRhKGRhdGEsIGNvbCksIGNvbERhdGE6IF9nZXRDb2xEYXRhKGRhdGEsIGNvbCksIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTdW1tYXJ5VHBsPlxyXG4gICAgICAgICAgICAgICAgPG10eC1ncmlkLWNlbGwgW3N1bW1hcnldPVwidHJ1ZVwiIFtkYXRhXT1cImRhdGFcIiBbY29sRGVmXT1cImNvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZW1wdHlWYWx1ZVBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8L210eC1ncmlkLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlQ29udGVudEhlYWRlclJvd1RlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRIZWFkZXJSb3dUcGxcIj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlclJvd1RwbD5cclxuICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlQ29udGVudFJvd1RlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRSb3dUcGxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd1RwbD5cclxuICAgICAgICAgIDx0ciBtYXQtcm93XHJcbiAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cInJvdyB8IHJvd0NsYXNzOiBpbmRleDogZGF0YUluZGV4OiByb3dDbGFzc0Zvcm1hdHRlclwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZCc6IHJvd1NlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyl9XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiX3NlbGVjdFJvdygkZXZlbnQsIHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiX3doZXRoZXJTaG93U3VtbWFyeVwiPlxyXG4gICAgICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInVzZUNvbnRlbnRGb290ZXJSb3dUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHBhbmRhYmxlXCI+XHJcbiAgICAgICAgICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgQ29sdW1uIC0gVGhlIGV4cGFuZGFibGUgcm93IGlzIG1hZGUgdXAgb2YgdGhpcyBvbmUgY29sdW1uIHRoYXQgc3BhbnMgYWNyb3NzIGFsbCBjb2x1bW5zIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJNdHhHcmlkRXhwYW5zaW9uQ29sdW1uRGVmXCI+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJkaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tZGV0YWlsXCJcclxuICAgICAgICAgICAgICAgICAgIFtAZXhwYW5zaW9uXT1cImV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiZXhwYW5zaW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBkYXRhSW5kZXgsIGV4cGFuZGVkOiBleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPHRyIG1hdC1yb3dcclxuICAgICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydNdHhHcmlkRXhwYW5zaW9uQ29sdW1uRGVmJ107IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbXR4LWdyaWQtZXhwYW5zaW9uJywgZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCddXCI+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPCEtLSBUT0RPOiBVc2UgZmxleGJveC1iYXNlZCBtYXQtdGFibGUgLS0+XHJcbiAgICAgIDx0YWJsZSBtYXQtdGFibGUgKm5nSWY9XCJjb2x1bW5SZXNpemFibGVcIlxyXG4gICAgICAgICAgICAgY29sdW1uUmVzaXplXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1ob3Zlcic6IHJvd0hvdmVyLCAnbWF0LXRhYmxlLXN0cmlwZWQnOiByb3dTdHJpcGVkLCAnbWF0LXRhYmxlLWV4cGFuZGFibGUnOiBleHBhbmRhYmxlfVwiXHJcbiAgICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW211bHRpVGVtcGxhdGVEYXRhUm93c109XCJleHBhbmRhYmxlXCJcclxuICAgICAgICAgICAgIG1hdFNvcnRcclxuICAgICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydERpc2FibGVDbGVhcl09XCJzb3J0RGlzYWJsZUNsZWFyXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0RGlzYWJsZWRdPVwic29ydERpc2FibGVkXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0U3RhcnRdPVwic29ydFN0YXJ0XCJcclxuICAgICAgICAgICAgIChtYXRTb3J0Q2hhbmdlKT1cIl9vblNvcnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5XCI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dTZWxlY3RhYmxlICYmICFoaWRlUm93U2VsZWN0aW9uQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0Q29sdW1uRGVmPVwiTXR4R3JpZENoZWNrYm94Q29sdW1uRGVmXCI+XHJcbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwibXVsdGlTZWxlY3RhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3dTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBfaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJyb3dTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhX2lzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBfdG9nZ2xlTWFzdGVyQ2hlY2tib3goKSA6IG51bGxcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cIiEocm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveCAmJiByb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuaGlkZUNoZWNrYm94KHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQgJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkKHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBfdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93KSA6IG51bGxcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj48L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1ucztcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5XT1cImNvbC5waW5uZWQ9PT0nbGVmdCdcIiBbc3RpY2t5RW5kXT1cImNvbC5waW5uZWQ9PT0ncmlnaHQnXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wgfCBjb2xDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3ktbGVmdCc6IGNvbC5waW5uZWQgPT09ICdsZWZ0JywgJ21hdC10YWJsZS1zdGlja3ktcmlnaHQnOiBjb2wucGlubmVkID09PSAncmlnaHQnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogY29sLndpZHRoLCAnbGVmdCc6IGNvbC5sZWZ0LCAncmlnaHQnOiBjb2wucmlnaHR9XCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwiY29sLnJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgICAgICBbbWF0UmVzaXphYmxlTWluV2lkdGhQeF09XCJjb2wubWluV2lkdGhcIiBbbWF0UmVzaXphYmxlTWF4V2lkdGhQeF09XCJjb2wubWF4V2lkdGhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWhlYWRlci1jZWxsLWlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaGVhZGVyVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cImhlYWRlclRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nSWZFbHNlXT1cImRlZmF1bHRIZWFkZXJUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXJUcGw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW21hdC1zb3J0LWhlYWRlcl09XCJjb2wuc29ydFByb3A/LmlkIHx8IGNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb2wuc29ydGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlQ2xlYXJdPVwiY29sLnNvcnRQcm9wPy5kaXNhYmxlQ2xlYXIgPz8gc29ydERpc2FibGVDbGVhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sLnNvcnRQcm9wPy5hcnJvd1Bvc2l0aW9uIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0XT1cImNvbC5zb3J0UHJvcD8uc3RhcnQhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tcGxhY2Vob2xkZXJcIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y29sLmhlYWRlciB8IHRvT2JzZXJ2YWJsZSB8IGFzeW5jfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm10eC1ncmlkLWljb24gbWF0LXNvcnQtaGVhZGVyLWljb25cIiAqbmdJZj1cImNvbC5zb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMywxM0gxNVYxMUgzTTMsNlY4SDIxVjZNMywxOEg5VjE2SDNWMThaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlckV4dHJhVHBsQmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGhlYWRlckV4dHJhVGVtcGxhdGUsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDtcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzOiByb3c6IHJvd0NoYW5nZVJlY29yZCA6cm93Q2hhbmdlUmVjb3JkPy5jdXJyZW50VmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtc3RpY2t5LWxlZnQnOiBjb2wucGlubmVkID09PSAnbGVmdCcsICdtYXQtdGFibGUtc3RpY2t5LXJpZ2h0JzogY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiXHJcbiAgICAgICAgICAgICAgICBtdHgtZ3JpZC1zZWxlY3RhYmxlLWNlbGwgKGNlbGxTZWxlY3Rpb25DaGFuZ2UpPVwiX3NlbGVjdENlbGwoJGV2ZW50LCByb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY2VsbFRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJjZWxsVHBsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoY2VsbFRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiY29sRGVmQ2VsbFRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29sRGVmQ2VsbFRwbD5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjb2wuY2VsbFRlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRDZWxsVHBsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wuY2VsbFRlbXBsYXRlIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUcGw+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXR4LWdyaWQtcm93LWV4cGFuZC1idXR0b25cIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIG10eC1ncmlkLWV4cGFuc2lvbi10b2dnbGUgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsob3BlbmVkKV09XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVDaGFuZ2UpPVwiX29uRXhwYW5zaW9uQ2hhbmdlKCRldmVudCwgcm93LCBjb2wsIGRhdGFJbmRleCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG10eC1ncmlkLXJvdy1leHBhbmQtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbcm93RGF0YV09XCJyb3dcIiBbY29sRGVmXT1cImNvbFwiIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvd0RhdGFDaGFuZ2UpPVwiX29uUm93RGF0YUNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L210eC1ncmlkLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1wbGFjZWhvbGRlclwiICpuZ0lmPVwiY29sLnNob3dFeHBhbmRcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdW1tYXJ5VGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cInN1bW1hcnlUcGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KHN1bW1hcnlUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCwgZGF0YTogZGF0YSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdW1tYXJ5VHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiZGVmYXVsdFN1bW1hcnlUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGF0YTogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN1bW1hcnlUcGw+XHJcbiAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbc3VtbWFyeV09XCJ0cnVlXCIgW2RhdGFdPVwiZGF0YVwiIFtjb2xEZWZdPVwiY29sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgIDwvbXR4LWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50SGVhZGVyUm93VGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdEhlYWRlclJvd1RwbFwiPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyUm93VHBsPlxyXG4gICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50Um93VGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdFJvd1RwbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Um93VHBsPlxyXG4gICAgICAgICAgPHRyIG1hdC1yb3dcclxuICAgICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcclxuICAgICAgICAgICAgICBbY2xhc3NdPVwicm93IHwgcm93Q2xhc3M6IGluZGV4OiBkYXRhSW5kZXg6IHJvd0NsYXNzRm9ybWF0dGVyXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogcm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KX1cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJfc2VsZWN0Um93KCRldmVudCwgcm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCI+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJfd2hldGhlclNob3dTdW1tYXJ5XCI+XHJcbiAgICAgICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlQ29udGVudEZvb3RlclJvd1RlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGFibGVcIj5cclxuICAgICAgICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZXhwYW5kYWJsZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIk10eEdyaWRFeHBhbnNpb25Db2x1bW5EZWZcIj5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImRpc3BsYXllZENvbHVtbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1kZXRhaWxcIlxyXG4gICAgICAgICAgICAgICAgICAgW0BleHBhbnNpb25dPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJleHBhbnNpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IGRhdGFJbmRleCwgZXhwYW5kZWQ6IGV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8dHIgbWF0LXJvd1xyXG4gICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ010eEdyaWRFeHBhbnNpb25Db2x1bW5EZWYnXTsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtdHgtZ3JpZC1leHBhbnNpb24nLCBleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ11cIj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE5vIHJlc3VsdCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1uby1yZXN1bHRcIiAqbmdJZj1cIl9oYXNOb1Jlc3VsdFwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwibm9SZXN1bHRUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0Tm9SZXN1bHRUcGxcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9SZXN1bHRUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vUmVzdWx0VHBsPnt7bm9SZXN1bHRUZXh0fX08L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVG9vbCBzaWRlYmFyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1zaWRlYmFyXCIgKm5nSWY9XCJzaG93U2lkZWJhclwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNpZGViYXJUZW1wbGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2lkZWJhclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm10eC1ncmlkLWZvb3RlclwiPlxyXG4gIDwhLS0gU3RhdHVzIEJhciAtLT5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtc3RhdHVzYmFyXCIgKm5nSWY9XCJzaG93U3RhdHVzYmFyXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic3RhdHVzYmFyVGVtcGxhdGVcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN0YXR1c2JhclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gUGFnaW5hdGlvbiAtLT5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtcGFnaW5hdGlvblwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBhZ2luYXRpb25UZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0UGFnaW5hdGlvblRlbXBsYXRlXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwYWdpbmF0aW9uVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2luYXRpb25UZW1wbGF0ZT5cclxuICAgICAgPG1hdC1wYWdpbmF0b3IgW2NsYXNzLm1hdC1wYWdpbmF0b3ItaGlkZGVuXT1cIiFzaG93UGFnaW5hdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInNob3dGaXJzdExhc3RCdXR0b25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2xlbmd0aF09XCJsZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2hpZGVQYWdlU2l6ZV09XCJoaWRlUGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAocGFnZSk9XCJfb25QYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZURpc2FibGVkXCI+XHJcbiAgICAgIDwvbWF0LXBhZ2luYXRvcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBIZWFkZXIgdGVtcGxhdGUgZm9yIGV4dHJhIGNvbnRlbnQgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaGVhZGVyRXh0cmFUcGxCYXNlIGxldC1oZWFkZXJFeHRyYVRlbXBsYXRlIGxldC1jb2w9XCJjb2xEZWZcIj5cclxuICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaGVhZGVyRXh0cmFUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWZcIiBbbmdJZkVsc2VdPVwiaGVhZGVyRXh0cmFUcGxcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJFeHRyYVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAjaGVhZGVyRXh0cmFUcGw+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShoZWFkZXJFeHRyYVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJFeHRyYVRlbXBsYXRlW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
635
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZ3JpZC9ncmlkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9ncmlkL2dyaWQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsU0FBUyxFQVVULGVBQWUsRUFDZixTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFFWixjQUFjLEVBQ2QsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsWUFBWSxFQUVaLGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQVEsT0FBTyxFQUFpQixNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCdEUsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDM0IsQ0FBQztBQXFCRixNQUFNLE9BQU8sT0FBTztJQStMbEIsSUFBSSxZQUFZO1FBQ2QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFD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dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdDaGlsZCxcbiAgT25DaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHJhY2tCeUZ1bmN0aW9uLFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBFbGVtZW50UmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBRdWVyeUxpc3QsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBLZXlWYWx1ZUNoYW5nZVJlY29yZCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIE9wdGlvbmFsLFxuICBJbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQge1xuICBNYXRGb290ZXJSb3csXG4gIE1hdEZvb3RlclJvd0RlZixcbiAgTWF0SGVhZGVyUm93RGVmLFxuICBNYXRSb3dEZWYsXG4gIE1hdFRhYmxlLFxuICBNYXRUYWJsZURhdGFTb3VyY2UsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IFNvcnQsIE1hdFNvcnQsIFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuXG5pbXBvcnQge1xuICBNdHhHcmlkQ29sdW1uLFxuICBNdHhHcmlkQ2VsbFRlbXBsYXRlLFxuICBNdHhHcmlkUm93U2VsZWN0aW9uRm9ybWF0dGVyLFxuICBNdHhHcmlkUm93Q2xhc3NGb3JtYXR0ZXIsXG4gIE10eEdyaWRCdXR0b25UeXBlLFxuICBNdHhHcmlkQ29sdW1uUGluT3B0aW9uLFxuICBNdHhHcmlkRGVmYXVsdE9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNdHhHcmlkRXhwYW5zaW9uVG9nZ2xlIH0gZnJvbSAnLi9leHBhbnNpb24tdG9nZ2xlJztcbmltcG9ydCB7IE10eEdyaWRVdGlscyB9IGZyb20gJy4vZ3JpZC11dGlscyc7XG5pbXBvcnQgeyBNdHhHcmlkQ29sdW1uTWVudSB9IGZyb20gJy4vY29sdW1uLW1lbnUnO1xuXG4vKiogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBkZWZhdWx0IGdyaWQgb3B0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBNVFhfR1JJRF9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TXR4R3JpZERlZmF1bHRPcHRpb25zPihcbiAgJ210eC1ncmlkLWRlZmF1bHQtb3B0aW9ucydcbik7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ210eC1ncmlkJyxcbiAgZXhwb3J0QXM6ICdtdHhHcmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dyaWQuc2NzcyddLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdtdHgtZ3JpZCcsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZXhwYW5zaW9uJywgW1xuICAgICAgc3RhdGUoJ2NvbGxhcHNlZCwgdm9pZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMCcsIG1pbkhlaWdodDogJzAnLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9KSksXG4gICAgICBzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogJyonLCB2aXNpYmlsaXR5OiAndmlzaWJsZScgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICAgIHRyYW5zaXRpb24oJ2V4cGFuZGVkIDw9PiB2b2lkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBNdHhHcmlkIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKE1hdFRhYmxlKSB0YWJsZSE6IE1hdFRhYmxlPGFueT47XG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Um93RGVmKSByb3dEZWZzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRIZWFkZXJSb3dEZWYpIGhlYWRlclJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0SGVhZGVyUm93RGVmPjtcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRGb290ZXJSb3cpIGZvb3RlclJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0Rm9vdGVyUm93RGVmPjtcbiAgQFZpZXdDaGlsZCgnY29sdW1uTWVudScpIGNvbHVtbk1lbnUhOiBNdHhHcmlkQ29sdW1uTWVudTtcbiAgQFZpZXdDaGlsZCgndGFibGVDb250YWluZXInKSB0YWJsZUNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XG5cbiAgLyoqIFRoZSBncmlkJ3MgZGlzcGxheWVkIGNvbHVtbnMuICovXG4gIEBJbnB1dCgpIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIC8qKiBUaGUgZ3JpZCdzIGNvbHVtbnMuICovXG4gIEBJbnB1dCgpIGNvbHVtbnM6IE10eEdyaWRDb2x1bW5bXSA9IFtdO1xuICAvKiogVGhlIGdyaWQncyBkYXRhLiAqL1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICAvKiogVGhlIHRvdGFsIG51bWJlciBvZiB0aGUgZGF0YS4gKi9cbiAgQElucHV0KCkgbGVuZ3RoID0gMDtcbiAgLyoqIFdoZXRoZXIgdGhlIGdyaWQgaXMgbG9hZGluZy4gKi9cbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuICAvKiogVHJhY2tpbmcgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2hlY2sgdGhlIGRpZmZlcmVuY2VzIGluIGRhdGEgY2hhbmdlcy4gKi9cbiAgQElucHV0KCkgdHJhY2tCeSE6IFRyYWNrQnlGdW5jdGlvbjxhbnk+O1xuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZS4gKi9cbiAgQElucHV0KCkgY29sdW1uUmVzaXphYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtblJlc2l6YWJsZSA/PyBmYWxzZTtcbiAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgZW1wdHkgdmFsdWUgKGBudWxsYCwgYCcnYCwgYFtdYCkuICovXG4gIEBJbnB1dCgpIGVtcHR5VmFsdWVQbGFjZWhvbGRlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5lbXB0eVZhbHVlUGxhY2Vob2xkZXIgPz8gJy0tJztcblxuICAvLyA9PT09PSBQYWdlID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gcGFnaW5hdGUgdGhlIGRhdGEgb24gZnJvbnQgZW5kLiAqL1xuICBASW5wdXQoKSBwYWdlT25Gcm9udCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5wYWdlT25Gcm9udCA/PyB0cnVlO1xuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBwYWdpbmF0b3IuICovXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0b3IgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd1BhZ2luYXRvciA/PyB0cnVlO1xuICAvKiogV2hldGhlciB0aGUgcGFnaW5hdG9yIGlzIGRpc2FibGVkLiAqL1xuICBASW5wdXQoKSBwYWdlRGlzYWJsZWQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZURpc2FibGVkID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBmaXJzdC9sYXN0IGJ1dHRvbnMgVUkgdG8gdGhlIHVzZXIuICovXG4gIEBJbnB1dCgpIHNob3dGaXJzdExhc3RCdXR0b25zID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNob3dGaXJzdExhc3RCdXR0b25zID8/IHRydWU7XG4gIC8qKiBUaGUgemVyby1iYXNlZCBwYWdlIGluZGV4IG9mIHRoZSBkaXNwbGF5ZWQgbGlzdCBvZiBpdGVtcy4gKi9cbiAgQElucHV0KCkgcGFnZUluZGV4ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VJbmRleCA/PyAwO1xuICAvKiogTnVtYmVyIG9mIGl0ZW1zIHRvIGRpc3BsYXkgb24gYSBwYWdlLiAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5wYWdlU2l6ZSA/PyAxMDtcbiAgLyoqIFRoZSBzZXQgb2YgcHJvdmlkZWQgcGFnZSBzaXplIG9wdGlvbnMgdG8gZGlzcGxheSB0byB0aGUgdXNlci4gKi9cbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VTaXplT3B0aW9ucyA/PyBbMTAsIDUwLCAxMDBdO1xuICAvKiogV2hldGhlciB0byBoaWRlIHRoZSBwYWdlIHNpemUgc2VsZWN0aW9uIFVJIGZyb20gdGhlIHVzZXIuICovXG4gIEBJbnB1dCgpIGhpZGVQYWdlU2l6ZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5oaWRlUGFnZVNpemUgPz8gZmFsc2U7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHBhZ2luYXRvciBjaGFuZ2VzIHRoZSBwYWdlIHNpemUgb3IgcGFnZSBpbmRleC4gKi9cbiAgQE91dHB1dCgpIHBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHBhZ2luYXRpb24uICovXG4gIEBJbnB1dCgpIHBhZ2luYXRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gU29ydCA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNvcnQgdGhlIGRhdGEgb24gZnJvbnQgZW5kLiAqL1xuICBASW5wdXQoKSBzb3J0T25Gcm9udCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0T25Gcm9udCA/PyB0cnVlO1xuICAvKiogVGhlIGlkIG9mIHRoZSBtb3N0IHJlY2VudGx5IHNvcnRlZCBNYXRTb3J0YWJsZS4gKi9cbiAgQElucHV0KCkgc29ydEFjdGl2ZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0QWN0aXZlID8/ICcnO1xuICAvKiogVGhlIHNvcnQgZGlyZWN0aW9uIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIE1hdFNvcnRhYmxlLiAqL1xuICBASW5wdXQoKSBzb3J0RGlyZWN0aW9uOiBTb3J0RGlyZWN0aW9uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnREaXJlY3Rpb24gPz8gJyc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIHVzZXIgZnJvbSBjbGVhcmluZyB0aGUgc29ydCBieSBmaW5pc2hpbmcgdGhlIHNvcnQgZGlyZWN0aW9uIGN5Y2xlLlxuICAgKiBNYXkgYmUgb3ZlcnJpZGVuIGJ5IHRoZSBjb2x1bW4ncyBgZGlzYWJsZUNsZWFyYCBpbiBgc29ydFByb3BgLlxuICAgKi9cbiAgQElucHV0KCkgc29ydERpc2FibGVDbGVhciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0RGlzYWJsZUNsZWFyID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgc29ydCBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KCkgc29ydERpc2FibGVkID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnREaXNhYmxlZCA/PyBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gdG8gc2V0IHdoZW4gYW4gTWF0U29ydGFibGUgaXMgaW5pdGlhbGx5IHNvcnRlZC5cbiAgICogTWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgY29sdW1uJ3MgYHN0YXJ0YCBpbiBgc29ydFByb3BgLlxuICAgKi9cbiAgQElucHV0KCkgc29ydFN0YXJ0OiAnYXNjJyB8ICdkZXNjJyA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0U3RhcnQgPz8gJ2FzYyc7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyBlaXRoZXIgdGhlIGFjdGl2ZSBzb3J0IG9yIHNvcnQgZGlyZWN0aW9uLiAqL1xuICBAT3V0cHV0KCkgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydD4oKTtcblxuICAvLyA9PT09PSBSb3cgPT09PT1cblxuICAvKiogV2hldGhlciB0byB1c2UgdGhlIHJvdyBob3ZlciBzdHlsZS4gKi9cbiAgQElucHV0KCkgcm93SG92ZXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucm93SG92ZXIgPz8gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHRvIHVzZSB0aGUgcm93IHN0cmlwZWQgc3R5bGUuICovXG4gIEBJbnB1dCgpIHJvd1N0cmlwZWQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucm93U3RyaXBlZCA/PyBmYWxzZTtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHJvdy4gKi9cbiAgQE91dHB1dCgpIHJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gb3BlbiBhIGNvbnRleHQgbWVudS4gKi9cbiAgQE91dHB1dCgpIHJvd0NvbnRleHRNZW51ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gPT09PT0gRXhwYW5kYWJsZSBSb3cgPT09PT1cblxuICBleHBhbnNpb25Sb3dTdGF0ZXM6IGFueVtdID0gW107XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHJvdyBpcyBleHBhbmRhYmxlLiAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBleHBhbmRhYmxlIHJvdy4gKi9cbiAgQElucHV0KCkgZXhwYW5zaW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIGV4cGFuZGFibGUgcm93LiAqL1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gPT09PT0gUm93IFNlbGVjdGlvbiA9PT09PVxuXG4gIHJvd1NlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55PiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcblxuICAvKiogV2hldGhlciB0byBzdXBwb3J0IG11bHRpcGxlIHJvdy9jZWxsIHNlbGVjdGlvbi4gKi9cbiAgQElucHV0KCkgbXVsdGlTZWxlY3RhYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/Lm11bHRpU2VsZWN0YWJsZSA/PyB0cnVlO1xuICAvKiogV2hldGhlciB0aGUgdXNlciBjYW4gc2VsZWN0IG11bHRpcGxlIHJvd3Mgd2l0aCBjbGljay4gKi9cbiAgQElucHV0KCkgbXVsdGlTZWxlY3Rpb25XaXRoQ2xpY2sgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ubXVsdGlTZWxlY3Rpb25XaXRoQ2xpY2sgPz8gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHRoZSByb3cgaXMgc2VsZWN0YWJsZS4gKi9cbiAgQElucHV0KCkgcm93U2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5yb3dTZWxlY3RhYmxlID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0byBoaWRlIHRoZSByb3cgc2VsZWN0aW9uIGNoZWNrYm94LiAqL1xuICBASW5wdXQoKSBoaWRlUm93U2VsZWN0aW9uQ2hlY2tib3ggPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94ID8/IGZhbHNlO1xuICAvKiogV2hldGhlciBkaXNhYmxlIHJvd3MgdG8gYmUgc2VsZWN0ZWQgd2hlbiBjbGlja2VkLiAqL1xuICBASW5wdXQoKSBkaXNhYmxlUm93Q2xpY2tTZWxlY3Rpb24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uZGlzYWJsZVJvd0NsaWNrU2VsZWN0aW9uID8/IGZhbHNlO1xuICAvKiogVGhlIGZvcm1hdHRlciB0byBkaXNhYmxlIHRoZSByb3cgc2VsZWN0aW9uIG9yIGhpZGUgdGhlIHJvdydzIGNoZWNrYm94LiAqL1xuICBASW5wdXQoKSByb3dTZWxlY3Rpb25Gb3JtYXR0ZXI6IE10eEdyaWRSb3dTZWxlY3Rpb25Gb3JtYXR0ZXIgPSB7fTtcbiAgLyoqIFRoZSBmb3JtYXR0ZXIgdG8gc2V0IHRoZSByb3cncyBjbGFzcy4gKi9cbiAgQElucHV0KCkgcm93Q2xhc3NGb3JtYXR0ZXI/OiBNdHhHcmlkUm93Q2xhc3NGb3JtYXR0ZXI7XG4gIC8qKiBUaGUgc2VsZWN0ZWQgcm93IGl0ZW1zLiAqL1xuICBASW5wdXQoKSByb3dTZWxlY3RlZDogYW55W10gPSBbXTtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgcm93IGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgcm93U2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8vID09PT09IENlbGwgU2VsZWN0aW9uID09PT09XG5cbiAgY2VsbFNlbGVjdGlvbjogYW55W10gPSBbXTtcblxuICAvKiogV2hldGhlciB0aGUgY2VsbCBpcyBzZWxlY3RhYmxlLiAqL1xuICBASW5wdXQoKSBjZWxsU2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jZWxsU2VsZWN0YWJsZSA/PyB0cnVlO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBjZWxsIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgY2VsbFNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICBwcml2YXRlIF9zZWxlY3RlZENlbGw/OiBNdHhHcmlkU2VsZWN0YWJsZUNlbGw7XG5cbiAgLy8gPT09PT0gVG9vbGJhciA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRvb2xiYXIuICovXG4gIEBJbnB1dCgpIHNob3dUb29sYmFyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNob3dUb29sYmFyID8/IGZhbHNlO1xuICAvKiogVGhlIHRleHQgb2YgdGhlIHRvb2xiYXIncyB0aXRsZS4gKi9cbiAgQElucHV0KCkgdG9vbGJhclRpdGxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnRvb2xiYXJUaXRsZSA/PyAnJztcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRvb2xiYXIuICovXG4gIEBJbnB1dCgpIHRvb2xiYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gQ29sdW1uIE1lbnUgPT09PT1cblxuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIGhpZGVhYmxlLiAqL1xuICBASW5wdXQoKSBjb2x1bW5IaWRlYWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5IaWRlYWJsZSA/PyB0cnVlO1xuICAvKiogSGlkZSBvciBzaG93IHdoZW4gdGhlIGNvbHVtbidzIGNoZWNrYm94IGlzIGNoZWNrZWQuICovXG4gIEBJbnB1dCgpIGNvbHVtbkhpZGVhYmxlQ2hlY2tlZDogJ3Nob3cnIHwgJ2hpZGUnID1cbiAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uSGlkZWFibGVDaGVja2VkID8/ICdzaG93JztcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZS4gKi9cbiAgQElucHV0KCkgY29sdW1uU29ydGFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uU29ydGFibGUgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwaW5uYWJsZS4gKi9cbiAgQElucHV0KCkgY29sdW1uUGlubmFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uUGlubmFibGUgPz8gdHJ1ZTtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgY29sdW1uIGlzIGhpZGVkIG9yIGlzIHNvcnRlZC4gKi9cbiAgQE91dHB1dCgpIGNvbHVtbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXR4R3JpZENvbHVtbltdPigpO1xuICAvKiogVGhlIG9wdGlvbnMgZm9yIHRoZSBjb2x1bW4gcGluIGxpc3QuICovXG4gIEBJbnB1dCgpIGNvbHVtblBpbk9wdGlvbnM6IE10eEdyaWRDb2x1bW5QaW5PcHRpb25bXSA9XG4gICAgdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtblBpbk9wdGlvbnMgPz8gW107XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uTWVudUJ1dHRvbiA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUJ1dHRvbiA/PyB0cnVlO1xuICAvKiogVGhlIHRleHQgZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25UZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25UZXh0ID8/ICcnO1xuICAvKiogVGhlIHR5cGUgZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25UeXBlOiBNdHhHcmlkQnV0dG9uVHlwZSA9XG4gICAgdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25UeXBlID8/ICdzdHJva2VkJztcbiAgLyoqIFRoZSBjb2xvciBmb3IgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUJ1dHRvbkNvbG9yOiBUaGVtZVBhbGV0dGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvbkNvbG9yO1xuICAvKiogVGhlIGNsYXNzIGZvciB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51QnV0dG9uQ2xhc3MgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvbkNsYXNzID8/ICcnO1xuICAvKiogVGhlIGljb24gZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25JY29uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25JY29uID8/ICcnO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGNvbHVtbi1tZW51J3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uTWVudUhlYWRlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUhlYWRlciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IGZvciB0aGUgY29sdW1uLW1lbnUncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVIZWFkZXJUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVIZWFkZXJUZXh0ID8/ICdDb2x1bW5zIEhlYWRlcic7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBjb2x1bW4tbWVudSdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdGhlIGNvbHVtbi1tZW51J3MgZm9vdGVyLiAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uTWVudUZvb3RlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUZvb3RlciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IGZvciB0aGUgY29sdW1uLW1lbnUncyBmb290ZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVGb290ZXJUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVGb290ZXJUZXh0ID8/ICdDb2x1bW5zIEZvb3Rlcic7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBjb2x1bW4tbWVudSdzIGZvb3Rlci4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUZvb3RlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyA9PT09PSBObyBSZXN1bHQgPT09PT1cblxuICAvKiogVGhlIGRpc3BsYXllZCB0ZXh0IGZvciB0aGUgZW1wdHkgZGF0YS4gKi9cbiAgQElucHV0KCkgbm9SZXN1bHRUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/Lm5vUmVzdWx0VGV4dCA/PyAnTm8gcmVjb3JkcyBmb3VuZCc7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBlbXB0eSBkYXRhLiAqL1xuICBASW5wdXQoKSBub1Jlc3VsdFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBnZXQgX2hhc05vUmVzdWx0KCkge1xuICAgIHJldHVybiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGEubGVuZ3RoID09PSAwKSAmJiAhdGhpcy5sb2FkaW5nO1xuICB9XG5cbiAgLy8gPT09PT0gQ2VsbCBUZW1wbGF0ZXMgPT09PT1cblxuICAvKiogVGhlIGhlYWRlcidzIGNlbGwgdGVtcGxhdGUgZm9yIHRoZSBncmlkLiAqL1xuICBASW5wdXQoKSBoZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT4gfCBNdHhHcmlkQ2VsbFRlbXBsYXRlO1xuICAvKiogVGhlIGhlYWRlcidzIGNlbGwgdGVtcGxhdGUgZm9yIHRoZSBncmlkIGV4Y2x1ZGUgc29ydC4gKi9cbiAgQElucHV0KCkgaGVhZGVyRXh0cmFUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT4gfCBNdHhHcmlkQ2VsbFRlbXBsYXRlO1xuICAvKiogVGhlIGNlbGwgdGVtcGxhdGUgZm9yIHRoZSBncmlkLiAqL1xuICBASW5wdXQoKSBjZWxsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcblxuICAvLyA9PT09PSBSb3cgVGVtcGxhdGVzID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGN1c3RvbSByb3cgdGVtcGxhdGUuIElmIHRydWUsIHlvdSBzaG91bGQgZGVmaW5lIGEgbWF0Um93RGVmLiAqL1xuICBASW5wdXQoKSB1c2VDb250ZW50Um93VGVtcGxhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETzogSXQgY2FuJ3QgdXNlIHRvZ2V0aGVyIHdpdGggYHVzZUNvbnRlbnRSb3dUZW1wbGF0ZWBcbiAgQElucHV0KCkgdXNlQ29udGVudEhlYWRlclJvd1RlbXBsYXRlID0gZmFsc2U7XG4gIC8vIFRPRE86IEl0J3Mgbm90IHdvcmtpbmdcbiAgQElucHV0KCkgdXNlQ29udGVudEZvb3RlclJvd1RlbXBsYXRlID0gZmFsc2U7XG5cbiAgLy8gPT09PT0gU3VtbWFyeSA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHN1bW1hcnkuICovXG4gIEBJbnB1dCgpIHNob3dTdW1tYXJ5ID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBzdW1tYXJ5LiAqL1xuICBASW5wdXQoKSBzdW1tYXJ5VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcblxuICAvLyBUT0RPOiBTdW1tYXJ5IGRpc3BsYXkgY29uZGl0aW9uc1xuICBnZXQgX3doZXRoZXJTaG93U3VtbWFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U3VtbWFyeTtcbiAgfVxuXG4gIC8vID09PT09IFNpZGUgQmFyID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgc2lkZWJhci4gKi9cbiAgQElucHV0KCkgc2hvd1NpZGViYXIgPSBmYWxzZTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHNpZGViYXIuICovXG4gIEBJbnB1dCgpIHNpZGViYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gU3RhdHVzIEJhciA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHN0YXR1cyBiYXIuICovXG4gIEBJbnB1dCgpIHNob3dTdGF0dXNiYXIgPSBmYWxzZTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHN0YXR1cyBiYXIuICovXG4gIEBJbnB1dCgpIHN0YXR1c2JhclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogVGhlIGNoYW5nZWQgcmVjb3JkIG9mIHJvdyBkYXRhLiAqL1xuICByb3dDaGFuZ2VSZWNvcmQ/OiBLZXlWYWx1ZUNoYW5nZVJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdXRpbHM6IE10eEdyaWRVdGlscyxcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1UWF9HUklEX0RFRkFVTFRfT1BUSU9OUylcbiAgICBwcml2YXRlIF9kZWZhdWx0T3B0aW9ucz86IE10eEdyaWREZWZhdWx0T3B0aW9uc1xuICApIHt9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpIHtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBfZ2V0Q29sRGF0YShkYXRhOiBhbnlbXSwgY29sRGVmOiBNdHhHcmlkQ29sdW1uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3V0aWxzLmdldENvbERhdGEoZGF0YSwgY29sRGVmKTtcbiAgfVxuXG4gIC8vIFdhaXRpbmcgZm9yIGFzeW5jIGRhdGFcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuX2NvdW50UGlubmVkUG9zaXRpb24oKTtcblxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRlKS5tYXAoaXRlbSA9PiBpdGVtLmZpZWxkKTtcblxuICAgIGlmICh0aGlzLnNob3dDb2x1bW5NZW51QnV0dG9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uSGlkZWFibGVDaGVja2VkID09PSAnc2hvdycpIHtcbiAgICAgICAgICBpdGVtLnNob3cgPSAhaXRlbS5oaWRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uaGlkZSA9ICEhaXRlbS5oaWRlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dTZWxlY3RhYmxlICYmICF0aGlzLmhpZGVSb3dTZWxlY3Rpb25DaGVja2JveCkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnVuc2hpZnQoJ010eEdyaWRDaGVja2JveENvbHVtbkRlZicpO1xuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCBjb3B5IGVhY2ggaXRlbSBvZiBkYXRhIGZvciBleHBhbnNpb24gZGF0YVxuICAgIGlmICh0aGlzLmV4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5zaW9uUm93U3RhdGVzID0gW107IC8vIHJlc2V0XG5cbiAgICAgIHRoaXMuZGF0YT8uZm9yRWFjaChfID0+IHtcbiAgICAgICAgdGhpcy5leHBhbnNpb25Sb3dTdGF0ZXMucHVzaCh7IGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvd1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMucm93U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5tdWx0aVNlbGVjdGFibGUsIHRoaXMucm93U2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5kYXRhKTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2VPbkZyb250ID8gdGhpcy5wYWdpbmF0b3IgOiBudWxsO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0T25Gcm9udCA/IHRoaXMuc29ydCA6IG51bGw7XG5cbiAgICAvLyBPbmx5IHNjcm9sbCB0b3Agd2l0aCBkYXRhIGNoYW5nZVxuICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9wKDApO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5wYWdlT25Gcm9udCkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRPbkZyb250KSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dEZWZzPy5sZW5ndGggPiAwICYmIHRoaXMudXNlQ29udGVudFJvd1RlbXBsYXRlKSB7XG4gICAgICB0aGlzLnJvd0RlZnMuZm9yRWFjaChyb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRSb3dEZWYocm93RGVmKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhlYWRlclJvd0RlZnM/Lmxlbmd0aCA+IDAgJiYgdGhpcy51c2VDb250ZW50SGVhZGVyUm93VGVtcGxhdGUpIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9vdGVyUm93RGVmcz8ubGVuZ3RoID4gMCAmJiB0aGlzLnVzZUNvbnRlbnRGb290ZXJSb3dUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5mb290ZXJSb3dEZWZzLmZvckVhY2goZm9vdGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvd0RlZikpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge31cblxuICBfY291bnRQaW5uZWRQb3NpdGlvbigpIHtcbiAgICBjb25zdCBjb3VudCA9IChhY2M6IG51bWJlciwgY3VyOiBNdHhHcmlkQ29sdW1uKSA9PiBhY2MgKyBwYXJzZUZsb2F0KGN1ci53aWR0aCB8fCAnODBweCcpO1xuXG4gICAgY29uc3QgcGlubmVkTGVmdENvbHMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wucGlubmVkICYmIGNvbC5waW5uZWQgPT09ICdsZWZ0Jyk7XG4gICAgcGlubmVkTGVmdENvbHMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICBpdGVtLmxlZnQgPSBwaW5uZWRMZWZ0Q29scy5zbGljZSgwLCBpZHgpLnJlZHVjZShjb3VudCwgMCkgKyAncHgnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGlubmVkUmlnaHRDb2xzID0gdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wucGlubmVkICYmIGNvbC5waW5uZWQgPT09ICdyaWdodCcpXG4gICAgICAucmV2ZXJzZSgpO1xuICAgIHBpbm5lZFJpZ2h0Q29scy5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgIGl0ZW0ucmlnaHQgPSBwaW5uZWRSaWdodENvbHMuc2xpY2UoMCwgaWR4KS5yZWR1Y2UoY291bnQsIDApICsgJ3B4JztcbiAgICB9KTtcbiAgfVxuXG4gIF9nZXRJbmRleChpbmRleDogbnVtYmVyLCBkYXRhSW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgaW5kZXggPT09ICd1bmRlZmluZWQnID8gZGF0YUluZGV4IDogaW5kZXg7XG4gIH1cblxuICBfb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIF9vblJvd0RhdGFDaGFuZ2UocmVjb3JkOiBLZXlWYWx1ZUNoYW5nZVJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnJvd0NoYW5nZVJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHBhbnNpb24gY2hhbmdlIGV2ZW50ICovXG4gIF9vbkV4cGFuc2lvbkNoYW5nZShcbiAgICBleHBhbnNpb25SZWY6IE10eEdyaWRFeHBhbnNpb25Ub2dnbGUsXG4gICAgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb2x1bW46IE10eEdyaWRDb2x1bW4sXG4gICAgaW5kZXg6IG51bWJlclxuICApIHtcbiAgICB0aGlzLmV4cGFuc2lvbkNoYW5nZS5lbWl0KHsgZXhwYW5kZWQ6IGV4cGFuc2lvblJlZi5leHBhbmRlZCwgZGF0YTogcm93RGF0YSwgaW5kZXgsIGNvbHVtbiB9KTtcbiAgfVxuXG4gIC8qKiBDZWxsIHNlbGVjdCBldmVudCAqL1xuICBfc2VsZWN0Q2VsbChcbiAgICBjZWxsUmVmOiBNdHhHcmlkU2VsZWN0YWJsZUNlbGwsXG4gICAgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb2xEZWY6IE10eEdyaWRDb2x1bW5cbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgbm90IHRoZSBzYW1lIGNlbGxcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRDZWxsICE9PSBjZWxsUmVmKSB7XG4gICAgICBjb25zdCBjb2xWYWx1ZSA9IHRoaXMuX3V0aWxzLmdldENlbGxWYWx1ZShyb3dEYXRhLCBjb2xEZWYpO1xuICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uID0gW107IC8vIHJlc2V0XG4gICAgICB0aGlzLmNlbGxTZWxlY3Rpb24ucHVzaCh7IGNlbGxEYXRhOiBjb2xWYWx1ZSwgcm93RGF0YSwgY29sRGVmIH0pO1xuXG4gICAgICB0aGlzLmNlbGxTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuY2VsbFNlbGVjdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZENlbGwpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRDZWxsLmRlc2VsZWN0KCk7IC8vIHRoZSBzZWxlY3RlZENlbGwgd2lsbCBiZSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3RlZENlbGwgPSBjZWxsUmVmLnNlbGVjdGVkID8gY2VsbFJlZiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSb3cgc2VsZWN0IGV2ZW50ICovXG4gIF9zZWxlY3RSb3coZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJvd1NlbGVjdGFibGUgJiZcbiAgICAgICF0aGlzLnJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZD8uKHJvd0RhdGEsIGluZGV4KSAmJlxuICAgICAgIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveD8uKHJvd0RhdGEsIGluZGV4KSAmJlxuICAgICAgIXRoaXMuZGlzYWJsZVJvd0NsaWNrU2VsZWN0aW9uXG4gICAgKSB7XG4gICAgICAvLyBtZXRhS2V5IC0+IGNvbW1hbmQga2V5XG4gICAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3Rpb25XaXRoQ2xpY2sgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93RGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHsgZXZlbnQsIHJvd0RhdGEsIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cbiAgX2lzQWxsU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnJvd1NlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbHRlcihcbiAgICAgIChyb3csIGluZGV4KSA9PiAhdGhpcy5yb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQ/Lihyb3csIGluZGV4KVxuICAgICkubGVuZ3RoO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIC8qKiBTZWxlY3QgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgX3RvZ2dsZU1hc3RlckNoZWNrYm94KCkge1xuICAgIHRoaXMuX2lzQWxsU2VsZWN0ZWQoKVxuICAgICAgPyB0aGlzLnJvd1NlbGVjdGlvbi5jbGVhcigpXG4gICAgICA6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkPy4ocm93LCBpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3Qgbm9ybWFsIHJvdyAqL1xuICBfdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdGhpcy5yb3dTZWxlY3Rpb24udG9nZ2xlKHJvdyk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBDb2x1bW4gY2hhbmdlIGV2ZW50ICovXG4gIF9vbkNvbHVtbkNoYW5nZShjb2x1bW5zOiBNdHhHcmlkQ29sdW1uW10pIHtcbiAgICB0aGlzLmNvbHVtbkNoYW5nZS5lbWl0KGNvbHVtbnMpO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5nZXREaXNwbGF5ZWRDb2x1bW5GaWVsZHMoY29sdW1ucykpO1xuXG4gICAgaWYgKHRoaXMucm93U2VsZWN0YWJsZSAmJiAhdGhpcy5oaWRlUm93U2VsZWN0aW9uQ2hlY2tib3gpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy51bnNoaWZ0KCdNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWYnKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb2x1bW5GaWVsZHMoY29sdW1uczogTXR4R3JpZENvbHVtbltdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpZWxkcyA9IGNvbHVtbnNcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAodGhpcy5jb2x1bW5IaWRlYWJsZUNoZWNrZWQgPT09ICdzaG93JyA/IGl0ZW0uc2hvdyA6ICFpdGVtLmhpZGUpKVxuICAgICAgLm1hcChpdGVtID0+IGl0ZW0uZmllbGQpO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKiogQ3VzdG9taXplIGV4cGFuc2lvbiBldmVudCAqL1xuICB0b2dnbGVFeHBhbnNpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5leHBhbmRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZXhwYW5kYWJsZWAgc2hvdWxkIGJlIHNldCB0cnVlLicpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQgPSAhdGhpcy5leHBhbnNpb25Sb3dTdGF0ZXNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIHJldHVybiB0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQ7XG4gIH1cblxuICAvKiogU2Nyb2xsIHRvIHRvcCB3aGVuIHR1cm4gdG8gdGhlIG5leHQgcGFnZS4gKi9cbiAgX29uUGFnZShlOiBQYWdlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5wYWdlT25Gcm9udCkge1xuICAgICAgdGhpcy5zY3JvbGxUb3AoMCk7XG4gICAgfVxuICAgIHRoaXMucGFnZS5lbWl0KGUpO1xuICB9XG5cbiAgc2Nyb2xsVG9wKHZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgdm9pZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXIgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU/OiBudW1iZXIpOiBudW1iZXIgfCB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXIgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBfY29udGV4dG1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnJvd0NvbnRleHRNZW51LmVtaXQoeyBldmVudCwgcm93RGF0YSwgaW5kZXggfSk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW210eC1ncmlkLXNlbGVjdGFibGUtY2VsbF0nLFxufSlcbmV4cG9ydCBjbGFzcyBNdHhHcmlkU2VsZWN0YWJsZUNlbGwge1xuICBwcml2YXRlIF9zZWxlY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9yb3dEYXRhITogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICBjdHJsS2V5UHJlc3NlZCA9IGZhbHNlO1xuICBzaGlmdEtleVByZXNzZWQgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdGVkJylcbiAgZ2V0IHNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBtdHhTZWxlY3RhYmxlUm93RGF0YSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9yb3dEYXRhKSB7XG4gICAgICB0aGlzLl9yb3dEYXRhID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIGNlbGxTZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXR4R3JpZFNlbGVjdGFibGVDZWxsPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dyaWQ6IE10eEdyaWQpIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jdHJsS2V5UHJlc3NlZCA9IGV2ZW50LmN0cmxLZXk7XG4gICAgdGhpcy5zaGlmdEtleVByZXNzZWQgPSBldmVudC5zaGlmdEtleTtcblxuICAgIGlmICh0aGlzLl9ncmlkLmNlbGxTZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHRydWU7XG4gICAgdGhpcy5jZWxsU2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzKTtcbiAgfVxuXG4gIGRlc2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5jZWxsU2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9ICF0aGlzLl9zZWxlY3RlZDtcbiAgICB0aGlzLmNlbGxTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMpO1xuICB9XG59XG4iLCI8IS0tIFByb2dyZXNzIGJhci0tPlxyXG48ZGl2IGNsYXNzPVwibXR4LWdyaWQtcHJvZ3Jlc3NcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuPC9kaXY+XHJcblxyXG48IS0tIFRvb2xiYXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyXCIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLWNvbnRlbnRcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ0b29sYmFyVGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdFRvb2xiYXJUZW1wbGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidG9vbGJhclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUb29sYmFyVGVtcGxhdGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLXRpdGxlXCIgKm5nSWY9XCJ0b29sYmFyVGl0bGVcIj57e3Rvb2xiYXJUaXRsZX19PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLWFjdGlvbnNcIj5cclxuICAgIDxtdHgtZ3JpZC1jb2x1bW4tbWVudSAqbmdJZj1cInNob3dDb2x1bW5NZW51QnV0dG9uXCIgI2NvbHVtbk1lbnVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uVGV4dF09XCJjb2x1bW5NZW51QnV0dG9uVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1dHRvblR5cGVdPVwiY29sdW1uTWVudUJ1dHRvblR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25Db2xvcl09XCJjb2x1bW5NZW51QnV0dG9uQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25DbGFzc109XCJjb2x1bW5NZW51QnV0dG9uQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25JY29uXT1cImNvbHVtbk1lbnVCdXR0b25JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJjb2x1bW5IaWRlYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVDaGVja2VkXT1cImNvbHVtbkhpZGVhYmxlQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImNvbHVtblNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGlubmFibGVdPVwiY29sdW1uUGlubmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cInNob3dDb2x1bW5NZW51SGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVyVGV4dF09XCJjb2x1bW5NZW51SGVhZGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlclRlbXBsYXRlXT1cImNvbHVtbk1lbnVIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dGb290ZXJdPVwic2hvd0NvbHVtbk1lbnVGb290ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb290ZXJUZXh0XT1cImNvbHVtbk1lbnVGb290ZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyVGVtcGxhdGVdPVwiY29sdW1uTWVudUZvb3RlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGluT3B0aW9uc109XCJjb2x1bW5QaW5PcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sdW1uQ2hhbmdlKT1cIl9vbkNvbHVtbkNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICA8L210eC1ncmlkLWNvbHVtbi1tZW51PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1tYWluIG10eC1ncmlkLWxheW91dFwiPlxyXG4gIDwhLS0gVGFibGUgY29udGVudCAtLT5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtY29udGVudCBtdHgtZ3JpZC1sYXlvdXRcIj5cclxuICAgIDxkaXYgI3RhYmxlQ29udGFpbmVyIGNsYXNzPVwibWF0LXRhYmxlLWNvbnRhaW5lclwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXdpdGgtZGF0YSc6ICFfaGFzTm9SZXN1bHR9XCI+XHJcbiAgICAgIDx0YWJsZSBtYXQtdGFibGUgKm5nSWY9XCIhY29sdW1uUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLWhvdmVyJzogcm93SG92ZXIsICdtYXQtdGFibGUtc3RyaXBlZCc6IHJvd1N0cmlwZWQsICdtYXQtdGFibGUtZXhwYW5kYWJsZSc6IGV4cGFuZGFibGV9XCJcclxuICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cImV4cGFuZGFibGVcIlxyXG4gICAgICAgICAgICAgbWF0U29ydFxyXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwic29ydEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0RGlzYWJsZUNsZWFyXT1cInNvcnREaXNhYmxlQ2xlYXJcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnREaXNhYmxlZF09XCJzb3J0RGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnRTdGFydF09XCJzb3J0U3RhcnRcIlxyXG4gICAgICAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwiX29uU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd1NlbGVjdGFibGUgJiYgIWhpZGVSb3dTZWxlY3Rpb25DaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWZcIj5cclxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJtdWx0aVNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIF9pc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFfaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IF90b2dnbGVNYXN0ZXJDaGVja2JveCgpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDtcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiIShyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuaGlkZUNoZWNrYm94ICYmIHJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3gocm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZCAmJiByb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQocm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3dTZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IF90b2dnbGVOb3JtYWxDaGVja2JveChyb3cpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPjwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zO1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGlja3ldPVwiY29sLnBpbm5lZD09PSdsZWZ0J1wiIFtzdGlja3lFbmRdPVwiY29sLnBpbm5lZD09PSdyaWdodCdcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdtaW4td2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWhlYWRlci1jZWxsLWlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaGVhZGVyVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cImhlYWRlclRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nSWZFbHNlXT1cImRlZmF1bHRIZWFkZXJUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXJUcGw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW21hdC1zb3J0LWhlYWRlcl09XCJjb2wuc29ydFByb3A/LmlkIHx8IGNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb2wuc29ydGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlQ2xlYXJdPVwiY29sLnNvcnRQcm9wPy5kaXNhYmxlQ2xlYXIgPz8gc29ydERpc2FibGVDbGVhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sLnNvcnRQcm9wPy5hcnJvd1Bvc2l0aW9uIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0XT1cImNvbC5zb3J0UHJvcD8uc3RhcnQhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tcGxhY2Vob2xkZXJcIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y29sLmhlYWRlciB8IHRvT2JzZXJ2YWJsZSB8IGFzeW5jfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm10eC1ncmlkLWljb24gbWF0LXNvcnQtaGVhZGVyLWljb25cIiAqbmdJZj1cImNvbC5zb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMywxM0gxNVYxMUgzTTMsNlY4SDIxVjZNMywxOEg5VjE2SDNWMThaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlckV4dHJhVHBsQmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGhlYWRlckV4dHJhVGVtcGxhdGUsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDtcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzOiByb3c6IHJvd0NoYW5nZVJlY29yZDogcm93Q2hhbmdlUmVjb3JkPy5jdXJyZW50VmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtc3RpY2t5LWxlZnQnOiBjb2wucGlubmVkID09PSAnbGVmdCcsICdtYXQtdGFibGUtc3RpY2t5LXJpZ2h0JzogY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ21pbi13aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiXHJcbiAgICAgICAgICAgICAgICBtdHgtZ3JpZC1zZWxlY3RhYmxlLWNlbGwgKGNlbGxTZWxlY3RlZENoYW5nZSk9XCJfc2VsZWN0Q2VsbCgkZXZlbnQsIHJvdywgY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjZWxsVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cImNlbGxUcGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGNlbGxUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCksIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGxUcGw+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShjZWxsVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJjb2xEZWZDZWxsVHBsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGNlbGxUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb2xEZWZDZWxsVHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImNvbC5jZWxsVGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdENlbGxUcGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbC5jZWxsVGVtcGxhdGUhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbFRwbD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtdHgtZ3JpZC1yb3ctZXhwYW5kLWJ1dHRvblwiICpuZ0lmPVwiY29sLnNob3dFeHBhbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gbXR4LWdyaWQtZXhwYW5zaW9uLXRvZ2dsZSB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhvcGVuZWQpXT1cImV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUNoYW5nZSk9XCJfb25FeHBhbnNpb25DaGFuZ2UoJGV2ZW50LCByb3csIGNvbCwgZGF0YUluZGV4KTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm10eC1ncmlkLWljb24gbXR4LWdyaWQtcm93LWV4cGFuZC1pY29uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmb2N1c2FibGU9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxtdHgtZ3JpZC1jZWxsIFtyb3dEYXRhXT1cInJvd1wiIFtjb2xEZWZdPVwiY29sXCIgW3BsYWNlaG9sZGVyXT1cImVtcHR5VmFsdWVQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm93RGF0YUNoYW5nZSk9XCJfb25Sb3dEYXRhQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDwvbXR4LWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtc3RpY2t5LWxlZnQnOiBjb2wucGlubmVkID09PSAnbGVmdCcsICdtYXQtdGFibGUtc3RpY2t5LXJpZ2h0JzogY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ21pbi13aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLXBsYWNlaG9sZGVyXCIgKm5nSWY9XCJjb2wuc2hvd0V4cGFuZFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInN1bW1hcnlUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWZcIiBbbmdJZkVsc2VdPVwic3VtbWFyeVRwbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sLCBkYXRhOiBkYXRhIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1bW1hcnlUcGw+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJkZWZhdWx0U3VtbWFyeVRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBfZ2V0Q29sRGF0YShkYXRhLCBjb2wpLCBjb2xEYXRhOiBfZ2V0Q29sRGF0YShkYXRhLCBjb2wpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3VtbWFyeVRwbD5cclxuICAgICAgICAgICAgICAgIDxtdHgtZ3JpZC1jZWxsIFtzdW1tYXJ5XT1cInRydWVcIiBbZGF0YV09XCJkYXRhXCIgW2NvbERlZl09XCJjb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVtcHR5VmFsdWVQbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgPC9tdHgtZ3JpZC1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInVzZUNvbnRlbnRIZWFkZXJSb3dUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0SGVhZGVyUm93VHBsXCI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXJSb3dUcGw+XHJcbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInVzZUNvbnRlbnRSb3dUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0Um93VHBsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSb3dUcGw+XHJcbiAgICAgICAgICA8dHIgbWF0LXJvd1xyXG4gICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJyb3cgfCByb3dDbGFzczogaW5kZXg6IGRhdGFJbmRleDogcm93Q2xhc3NGb3JtYXR0ZXJcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQnOiByb3dTZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpfVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIl9zZWxlY3RSb3coJGV2ZW50LCByb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSlcIlxyXG4gICAgICAgICAgICAgIChjb250ZXh0bWVudSk9XCJfY29udGV4dG1lbnUoJGV2ZW50LCByb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSlcIj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIl93aGV0aGVyU2hvd1N1bW1hcnlcIj5cclxuICAgICAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50Rm9vdGVyUm93VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhwYW5kYWJsZVwiPlxyXG4gICAgICAgICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSBleHBhbmRhYmxlIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiTXR4R3JpZEV4cGFuc2lvbkNvbHVtbkRlZlwiPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4XCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiZGlzcGxheWVkQ29sdW1ucy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLWRldGFpbFwiXHJcbiAgICAgICAgICAgICAgICAgICBbQGV4cGFuc2lvbl09XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImV4cGFuc2lvblRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogZGF0YUluZGV4LCBleHBhbmRlZDogZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDx0ciBtYXQtcm93XHJcbiAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnTXR4R3JpZEV4cGFuc2lvbkNvbHVtbkRlZiddOyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ210eC1ncmlkLWV4cGFuc2lvbicsIGV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXVwiPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC90YWJsZT5cclxuXHJcbiAgICAgIDwhLS0gVE9ETzogVXNlIGZsZXhib3gtYmFzZWQgbWF0LXRhYmxlIC0tPlxyXG4gICAgICA8dGFibGUgbWF0LXRhYmxlICpuZ0lmPVwiY29sdW1uUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgIGNvbHVtblJlc2l6ZVxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtaG92ZXInOiByb3dIb3ZlciwgJ21hdC10YWJsZS1zdHJpcGVkJzogcm93U3RyaXBlZCwgJ21hdC10YWJsZS1leHBhbmRhYmxlJzogZXhwYW5kYWJsZX1cIlxyXG4gICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiZXhwYW5kYWJsZVwiXHJcbiAgICAgICAgICAgICBtYXRTb3J0XHJcbiAgICAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxyXG4gICAgICAgICAgICAgW21hdFNvcnREaXNhYmxlQ2xlYXJdPVwic29ydERpc2FibGVDbGVhclwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydERpc2FibGVkXT1cInNvcnREaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydFN0YXJ0XT1cInNvcnRTdGFydFwiXHJcbiAgICAgICAgICAgICAobWF0U29ydENoYW5nZSk9XCJfb25Tb3J0Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93U2VsZWN0YWJsZSAmJiAhaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cIk10eEdyaWRDaGVja2JveENvbHVtbkRlZlwiPlxyXG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cIm11bHRpU2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicm93U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgX2lzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwicm93U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIV9pc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gX3RvZ2dsZU1hc3RlckNoZWNrYm94KCkgOiBudWxsXCI+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4O1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCIhKHJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3ggJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveChyb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkICYmIHJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZChyb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gX3RvZ2dsZU5vcm1hbENoZWNrYm94KHJvdykgOiBudWxsXCI+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWYgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+PC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0aWNreV09XCJjb2wucGlubmVkPT09J2xlZnQnXCIgW3N0aWNreUVuZF09XCJjb2wucGlubmVkPT09J3JpZ2h0J1wiPlxyXG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmXHJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sIHwgY29sQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtc3RpY2t5LWxlZnQnOiBjb2wucGlubmVkID09PSAnbGVmdCcsICdtYXQtdGFibGUtc3RpY2t5LXJpZ2h0JzogY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiXHJcbiAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cImNvbC5yZXNpemFibGVcIlxyXG4gICAgICAgICAgICAgICAgW21hdFJlc2l6YWJsZU1pbldpZHRoUHhdPVwiY29sLm1pbldpZHRoXCIgW21hdFJlc2l6YWJsZU1heFdpZHRoUHhdPVwiY29sLm1heFdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1oZWFkZXItY2VsbC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImhlYWRlclRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJoZWFkZXJUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNoZWFkZXJUcGw+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIkYW55KGhlYWRlclRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJkZWZhdWx0SGVhZGVyVHBsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyVHBsPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFttYXQtc29ydC1oZWFkZXJdPVwiY29sLnNvcnRQcm9wPy5pZCB8fCBjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29sLnNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUNsZWFyXT1cImNvbC5zb3J0UHJvcD8uZGlzYWJsZUNsZWFyID8/IHNvcnREaXNhYmxlQ2xlYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbC5zb3J0UHJvcD8uYXJyb3dQb3NpdGlvbiFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtzdGFydF09XCJjb2wuc29ydFByb3A/LnN0YXJ0IVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLXBsYWNlaG9sZGVyXCIgKm5nSWY9XCJjb2wuc2hvd0V4cGFuZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2NvbC5oZWFkZXIgfCB0b09ic2VydmFibGUgfCBhc3luY319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG1hdC1zb3J0LWhlYWRlci1pY29uXCIgKm5nSWY9XCJjb2wuc29ydGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMsMTNIMTVWMTFIM00zLDZWOEgyMVY2TTMsMThIOVYxNkgzVjE4WlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJFeHRyYVRwbEJhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBoZWFkZXJFeHRyYVRlbXBsYXRlLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wgfCBjb2xDbGFzczogcm93OiByb3dDaGFuZ2VSZWNvcmQgOnJvd0NoYW5nZVJlY29yZD8uY3VycmVudFZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIlxyXG4gICAgICAgICAgICAgICAgbXR4LWdyaWQtc2VsZWN0YWJsZS1jZWxsIChjZWxsU2VsZWN0ZWRDaGFuZ2UpPVwiX3NlbGVjdENlbGwoJGV2ZW50LCByb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY2VsbFRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJjZWxsVHBsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoY2VsbFRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiY29sRGVmQ2VsbFRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29sRGVmQ2VsbFRwbD5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjb2wuY2VsbFRlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRDZWxsVHBsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wuY2VsbFRlbXBsYXRlIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUcGw+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXR4LWdyaWQtcm93LWV4cGFuZC1idXR0b25cIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIG10eC1ncmlkLWV4cGFuc2lvbi10b2dnbGUgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsob3BlbmVkKV09XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVDaGFuZ2UpPVwiX29uRXhwYW5zaW9uQ2hhbmdlKCRldmVudCwgcm93LCBjb2wsIGRhdGFJbmRleCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG10eC1ncmlkLXJvdy1leHBhbmQtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbcm93RGF0YV09XCJyb3dcIiBbY29sRGVmXT1cImNvbFwiIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvd0RhdGFDaGFuZ2UpPVwiX29uUm93RGF0YUNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L210eC1ncmlkLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1wbGFjZWhvbGRlclwiICpuZ0lmPVwiY29sLnNob3dFeHBhbmRcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdW1tYXJ5VGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cInN1bW1hcnlUcGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KHN1bW1hcnlUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCwgZGF0YTogZGF0YSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdW1tYXJ5VHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiZGVmYXVsdFN1bW1hcnlUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGF0YTogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN1bW1hcnlUcGw+XHJcbiAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbc3VtbWFyeV09XCJ0cnVlXCIgW2RhdGFdPVwiZGF0YVwiIFtjb2xEZWZdPVwiY29sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgIDwvbXR4LWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50SGVhZGVyUm93VGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdEhlYWRlclJvd1RwbFwiPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyUm93VHBsPlxyXG4gICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50Um93VGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdFJvd1RwbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Um93VHBsPlxyXG4gICAgICAgICAgPHRyIG1hdC1yb3dcclxuICAgICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcclxuICAgICAgICAgICAgICBbY2xhc3NdPVwicm93IHwgcm93Q2xhc3M6IGluZGV4OiBkYXRhSW5kZXg6IHJvd0NsYXNzRm9ybWF0dGVyXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogcm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KX1cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJfc2VsZWN0Um93KCRldmVudCwgcm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCJcclxuICAgICAgICAgICAgICAoY29udGV4dG1lbnUpPVwiX2NvbnRleHRtZW51KCRldmVudCwgcm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCI+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJfd2hldGhlclNob3dTdW1tYXJ5XCI+XHJcbiAgICAgICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlQ29udGVudEZvb3RlclJvd1RlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGFibGVcIj5cclxuICAgICAgICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZXhwYW5kYWJsZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIk10eEdyaWRFeHBhbnNpb25Db2x1bW5EZWZcIj5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImRpc3BsYXllZENvbHVtbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1kZXRhaWxcIlxyXG4gICAgICAgICAgICAgICAgICAgW0BleHBhbnNpb25dPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJleHBhbnNpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IGRhdGFJbmRleCwgZXhwYW5kZWQ6IGV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8dHIgbWF0LXJvd1xyXG4gICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ010eEdyaWRFeHBhbnNpb25Db2x1bW5EZWYnXTsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtdHgtZ3JpZC1leHBhbnNpb24nLCBleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ11cIj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE5vIHJlc3VsdCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1uby1yZXN1bHRcIiAqbmdJZj1cIl9oYXNOb1Jlc3VsdFwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwibm9SZXN1bHRUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0Tm9SZXN1bHRUcGxcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9SZXN1bHRUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vUmVzdWx0VHBsPnt7bm9SZXN1bHRUZXh0fX08L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVG9vbCBzaWRlYmFyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1zaWRlYmFyXCIgKm5nSWY9XCJzaG93U2lkZWJhclwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNpZGViYXJUZW1wbGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2lkZWJhclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm10eC1ncmlkLWZvb3RlclwiPlxyXG4gIDwhLS0gU3RhdHVzIEJhciAtLT5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtc3RhdHVzYmFyXCIgKm5nSWY9XCJzaG93U3RhdHVzYmFyXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic3RhdHVzYmFyVGVtcGxhdGVcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN0YXR1c2JhclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gUGFnaW5hdGlvbiAtLT5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtcGFnaW5hdGlvblwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBhZ2luYXRpb25UZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0UGFnaW5hdGlvblRlbXBsYXRlXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwYWdpbmF0aW9uVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2luYXRpb25UZW1wbGF0ZT5cclxuICAgICAgPG1hdC1wYWdpbmF0b3IgW2NsYXNzLm1hdC1wYWdpbmF0b3ItaGlkZGVuXT1cIiFzaG93UGFnaW5hdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInNob3dGaXJzdExhc3RCdXR0b25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2xlbmd0aF09XCJsZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2hpZGVQYWdlU2l6ZV09XCJoaWRlUGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAocGFnZSk9XCJfb25QYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZURpc2FibGVkXCI+XHJcbiAgICAgIDwvbWF0LXBhZ2luYXRvcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBIZWFkZXIgdGVtcGxhdGUgZm9yIGV4dHJhIGNvbnRlbnQgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaGVhZGVyRXh0cmFUcGxCYXNlIGxldC1oZWFkZXJFeHRyYVRlbXBsYXRlIGxldC1jb2w9XCJjb2xEZWZcIj5cclxuICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaGVhZGVyRXh0cmFUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWZcIiBbbmdJZkVsc2VdPVwiaGVhZGVyRXh0cmFUcGxcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJFeHRyYVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAjaGVhZGVyRXh0cmFUcGw+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShoZWFkZXJFeHRyYVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJFeHRyYVRlbXBsYXRlW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19