ngx-register-base 1.3.3 → 2.0.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 (160) hide show
  1. package/README.md +10 -0
  2. package/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +3 -3
  3. package/esm2022/lib/components/column-settings/column-settings.component.mjs +30 -25
  4. package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +4 -12
  5. package/esm2022/lib/components/column-settings/components/reset-settings-form/reset-settings-form.component.mjs +13 -0
  6. package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +9 -9
  7. package/esm2022/lib/components/filter-button/filter-button.component.mjs +4 -5
  8. package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +22 -22
  9. package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +9 -6
  10. package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +13 -8
  11. package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +4 -4
  12. package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +16 -13
  13. package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +4 -4
  14. package/esm2022/lib/components/filters/components/filter-list.module.mjs +33 -7
  15. package/esm2022/lib/components/filters/register-table-filter.component.mjs +5 -4
  16. package/esm2022/lib/components/filters/register-table-filter.module.mjs +5 -5
  17. package/esm2022/lib/components/index.mjs +2 -2
  18. package/esm2022/lib/components/inputs/index.mjs +4 -4
  19. package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +37 -30
  20. package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +3 -3
  21. package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +27 -15
  22. package/esm2022/lib/components/inputs/param-date-range/index.mjs +2 -0
  23. package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +80 -18
  24. package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +65 -30
  25. package/esm2022/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.component.mjs +406 -0
  26. package/esm2022/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.consts.mjs +13 -0
  27. package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +31 -34
  28. package/esm2022/lib/components/inputs/param-dropbox/param-dropbox.component.mjs +126 -0
  29. package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +40 -9
  30. package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +29 -8
  31. package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +97 -113
  32. package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +41 -45
  33. package/esm2022/lib/components/inputs/param-switcher/index.mjs +2 -0
  34. package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +61 -11
  35. package/esm2022/lib/components/inputs/param-switcher/param-switcher.types.mjs +2 -0
  36. package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +7 -25
  37. package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +21 -20
  38. package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +11 -6
  39. package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +5 -3
  40. package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +24 -7
  41. package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +3 -3
  42. package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +9 -2
  43. package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +13 -6
  44. package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +9 -4
  45. package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +9 -5
  46. package/esm2022/lib/components/inputs/sub-components/param-label-hint-icon/param-label-hint-icon.component.mjs +12 -0
  47. package/esm2022/lib/components/paginator/paginator.component.mjs +10 -12
  48. package/esm2022/lib/components/register-table/register-table.component.mjs +31 -12
  49. package/esm2022/lib/components/search-input/search-input.component.mjs +5 -7
  50. package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +23 -35
  51. package/esm2022/lib/components/template-modal/index.mjs +3 -0
  52. package/esm2022/lib/components/template-modal/template-modal.base.mjs +16 -0
  53. package/esm2022/lib/components/template-modal/template-modal.component.mjs +16 -0
  54. package/esm2022/lib/core/param/index.mjs +1 -1
  55. package/esm2022/lib/core/param/param-base.mjs +28 -3
  56. package/esm2022/lib/core/param/param-date-base.mjs +20 -11
  57. package/esm2022/lib/core/param/param-select-base.mjs +14 -6
  58. package/esm2022/lib/core/register-base/register-base.store.mjs +1 -1
  59. package/esm2022/lib/directives/date/date-time.types.mjs +1 -1
  60. package/esm2022/lib/providers/index.mjs +2 -0
  61. package/esm2022/lib/providers/provide-icons.mjs +23 -0
  62. package/esm2022/lib/services/date-time.service.mjs +1 -38
  63. package/esm2022/lib/services/dialog/dialog.service.mjs +1 -13
  64. package/esm2022/lib/services/dialog/dialog.types.mjs +2 -2
  65. package/esm2022/lib/services/message.service.mjs +48 -0
  66. package/esm2022/lib/services/validation-message.service.mjs +52 -0
  67. package/esm2022/lib/store/fast-query-store.service.mjs +16 -1
  68. package/esm2022/lib/utils/index.mjs +2 -1
  69. package/esm2022/lib/utils/utils.mjs +17 -0
  70. package/esm2022/public-api.mjs +2 -1
  71. package/fesm2022/ngx-register-base.mjs +1464 -1026
  72. package/fesm2022/ngx-register-base.mjs.map +1 -1
  73. package/icons/arrow-turn-up-left.svg +3 -0
  74. package/icons/check.svg +3 -0
  75. package/icons/floppy.svg +3 -0
  76. package/icons/star-empty.svg +10 -0
  77. package/icons/star-fill.svg +3 -0
  78. package/icons/trash.svg +3 -0
  79. package/icons/xmark.svg +3 -0
  80. package/lib/components/column-settings/column-settings.component.d.ts +9 -9
  81. package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +5 -5
  82. package/lib/components/{reset-settings-form → column-settings/components/reset-settings-form}/reset-settings-form.component.d.ts +2 -5
  83. package/lib/components/column-settings/consts/column-settings.consts.d.ts +8 -8
  84. package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +5 -8
  85. package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +2 -1
  86. package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +2 -1
  87. package/lib/components/filters/components/filter-list/filter-list.service.d.ts +2 -3
  88. package/lib/components/filters/components/filter-list.module.d.ts +7 -7
  89. package/lib/components/filters/register-table-filter.component.d.ts +2 -1
  90. package/lib/components/filters/register-table-filter.module.d.ts +2 -2
  91. package/lib/components/index.d.ts +1 -1
  92. package/lib/components/inputs/index.d.ts +3 -4
  93. package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +2 -8
  94. package/lib/components/inputs/param-custom/param-custom.component.d.ts +1 -1
  95. package/lib/components/inputs/param-date/param-date.component.d.ts +7 -10
  96. package/lib/components/inputs/param-date-range/index.d.ts +1 -0
  97. package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +13 -16
  98. package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +8 -13
  99. package/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.component.d.ts +96 -0
  100. package/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.consts.d.ts +12 -0
  101. package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +17 -16
  102. package/lib/components/inputs/param-dropbox/param-dropbox.component.d.ts +31 -0
  103. package/lib/components/inputs/param-month/param-month.component.d.ts +10 -8
  104. package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +10 -8
  105. package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +9 -11
  106. package/lib/components/inputs/param-select/param-select.component.d.ts +9 -12
  107. package/lib/components/inputs/param-switcher/index.d.ts +2 -0
  108. package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +21 -5
  109. package/lib/components/inputs/param-switcher/param-switcher.types.d.ts +7 -0
  110. package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +3 -2
  111. package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +5 -4
  112. package/lib/components/inputs/param-text/param-text.component.d.ts +6 -4
  113. package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +2 -1
  114. package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +3 -2
  115. package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +1 -1
  116. package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +2 -1
  117. package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +2 -1
  118. package/lib/components/inputs/sub-components/param-label-hint-icon/param-label-hint-icon.component.d.ts +5 -0
  119. package/lib/components/paginator/paginator.component.d.ts +3 -4
  120. package/lib/components/register-table/register-table.component.d.ts +5 -3
  121. package/lib/components/sliding-panel/sliding-panel.component.d.ts +8 -8
  122. package/lib/components/template-modal/index.d.ts +2 -0
  123. package/lib/components/template-modal/template-modal.base.d.ts +9 -0
  124. package/lib/components/template-modal/template-modal.component.d.ts +6 -0
  125. package/lib/core/param/index.d.ts +1 -0
  126. package/lib/core/param/param-base.d.ts +18 -2
  127. package/lib/core/param/param-date-base.d.ts +15 -9
  128. package/lib/core/param/param-select-base.d.ts +12 -7
  129. package/lib/core/register-base/register-base.store.d.ts +2 -3
  130. package/lib/directives/date/date-time.types.d.ts +0 -2
  131. package/lib/providers/index.d.ts +1 -0
  132. package/lib/providers/provide-icons.d.ts +3 -0
  133. package/lib/services/date-time.service.d.ts +0 -13
  134. package/lib/services/dialog/dialog.service.d.ts +1 -3
  135. package/lib/services/dialog/dialog.types.d.ts +0 -3
  136. package/lib/services/message.service.d.ts +20 -0
  137. package/lib/services/validation-message.service.d.ts +14 -0
  138. package/lib/store/fast-query-store.service.d.ts +1 -0
  139. package/lib/utils/index.d.ts +1 -0
  140. package/lib/utils/utils.d.ts +3 -0
  141. package/package.json +5 -12
  142. package/public-api.d.ts +1 -0
  143. package/styles/common-param.less +15 -0
  144. package/styles/flex.less +5 -1
  145. package/styles/icons.less +8 -0
  146. package/styles/modals.less +54 -0
  147. package/styles/overrides/tui/tui-input.less +94 -121
  148. package/styles/styles.less +2 -0
  149. package/esm2022/lib/components/inputs/inputs.module.mjs +0 -166
  150. package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +0 -15
  151. package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +0 -18
  152. package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +0 -19
  153. package/esm2022/lib/utils/prizm.shared.module.mjs +0 -284
  154. package/icons/calendar-blank.svg +0 -10
  155. package/lib/components/inputs/inputs.module.d.ts +0 -31
  156. package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +0 -6
  157. package/lib/components/sliding-panel/sliding-panel.module.d.ts +0 -9
  158. package/lib/utils/prizm.shared.module.d.ts +0 -14
  159. /package/icons/{calendar-icon.svg → calendar-date-time.svg} +0 -0
  160. /package/icons/{calendar-custom.svg → calendar-date.svg} +0 -0
@@ -18,13 +18,14 @@ import { StickyColumnPipe } from './pipes/sticky-column.pipe';
18
18
  import { CHECKBOX_SELECTOR_KEY, CHECKBOX_SELECTOR_WIDTH_PX, MIN_COL_WIDTH_PX, } from './consts/register-table.consts';
19
19
  import { BehaviorSubject, combineLatest, debounceTime, map, skip, Subject, switchMap, tap, } from 'rxjs';
20
20
  import { CheckboxSelectorComponent } from '../checkbox-selector/checkbox-selector.component';
21
- import { distinctUntilChangedJSONs } from '../../utils';
21
+ import { distinctUntilChangedJSONs, isDefined } from '../../utils';
22
22
  import { StickyDirective, StickyRelativeDirective } from '../../directives';
23
23
  import { ERegisterObjectState } from '../../types';
24
24
  import { SelectedObjectsStateService } from '../../services';
25
25
  import { TuiResizable, TuiResizer } from '@taiga-ui/cdk';
26
26
  import { FormatDatePipe } from '../../directives/date/format-date.pipe';
27
27
  import { PaginatorComponent } from '../paginator/paginator.component';
28
+ import { AlertType, MessageService } from '../../services/message.service';
28
29
  import * as i0 from "@angular/core";
29
30
  import * as i1 from "@taiga-ui/addon-table";
30
31
  import * as i2 from "@taiga-ui/core";
@@ -81,10 +82,10 @@ export class RegisterTableComponent {
81
82
  this.emptyText = input('Нет данных');
82
83
  /** Дизейбл сортировки */
83
84
  this.sortingDisabled = input(false);
84
- /** Максимальное значения выбора чекбоксов через поле ввода */
85
- this.checkboxInputMaxValue = input(null);
86
85
  /** Дизейбл выбора чекбоксов */
87
86
  this.checkboxDisabled = input(false);
87
+ /** Максимальное значение количества выбираемых записей */
88
+ this.maxSelectedRows = input(null);
88
89
  /** Дизейбл выбора чекбоксов */
89
90
  this.paginatorDisabled = input(false);
90
91
  this.selectedCounter = computed(() => {
@@ -106,6 +107,7 @@ export class RegisterTableComponent {
106
107
  this._selectedService = inject(SelectedObjectsStateService, {
107
108
  optional: true,
108
109
  });
110
+ this._messageService = inject(MessageService);
109
111
  /** Событие выбора в чекбокс-селекторе */
110
112
  this.selectChanged = output();
111
113
  /** Событие изменения значений пагинатора */
@@ -207,11 +209,14 @@ export class RegisterTableComponent {
207
209
  _projectCellTemplates() {
208
210
  effect(() => {
209
211
  this._projectedCellsMap.clear();
210
- for (const template of this.cellTemplates()) {
211
- this._projectedCellsMap.set(template.cellTemplateName, template.tpl);
212
- }
212
+ this._setProjectedCellsMap();
213
213
  });
214
214
  }
215
+ _setProjectedCellsMap() {
216
+ for (const template of this.cellTemplates()) {
217
+ this._projectedCellsMap.set(template.cellTemplateName, template.tpl);
218
+ }
219
+ }
215
220
  _syncRowVisibilityDOM() {
216
221
  this._observerRowsVisibilityDOM$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
217
222
  }
@@ -282,11 +287,25 @@ export class RegisterTableComponent {
282
287
  this._hoveredRow$.next(row);
283
288
  }
284
289
  onRowClick(event, row) {
285
- const blueHighlightsSelected = window.getSelection();
286
- blueHighlightsSelected?.removeAllRanges();
290
+ if (this.checkboxColumn()) {
291
+ const blueHighlightsSelected = window.getSelection();
292
+ blueHighlightsSelected?.removeAllRanges();
293
+ }
287
294
  const stateObjects = this.stateObjects?.();
288
295
  // TODO оставить только if после SMA2-3134
289
296
  if (stateObjects) {
297
+ const maxRows = this.maxSelectedRows();
298
+ const selectedRows = this.selectedCounter();
299
+ if (isDefined(maxRows) && selectedRows >= maxRows) {
300
+ this._messageService.showAlert(`
301
+ Выбрано максимально возможное количество выбранных записей в реестре — ${maxRows}.
302
+ Дальнейший выбор заблокирован.
303
+ `, {
304
+ appearance: AlertType.WARNING,
305
+ autoClose: 10_000,
306
+ });
307
+ return;
308
+ }
290
309
  if (event.shiftKey) {
291
310
  this._changeRangeRowsState(stateObjects, this.lastSelectedRow, row);
292
311
  }
@@ -497,14 +516,14 @@ export class RegisterTableComponent {
497
516
  return 1 + Math.max(...columns.map((c) => this._getMaxDepth(c.children || [])));
498
517
  }
499
518
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
500
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RegisterTableComponent, isStandalone: true, selector: "sproc-register-table", inputs: { isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: true, transformFunction: null }, isPaginatorLoading: { classPropertyName: "isPaginatorLoading", publicName: "isPaginatorLoading", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: true, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: true, transformFunction: null }, checkboxColumn: { classPropertyName: "checkboxColumn", publicName: "checkboxColumn", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, columnsData: { classPropertyName: "columnsData", publicName: "columnsData", isSignal: true, isRequired: true, transformFunction: null }, stickyLeftIds: { classPropertyName: "stickyLeftIds", publicName: "stickyLeftIds", isSignal: true, isRequired: false, transformFunction: null }, stickyRightIds: { classPropertyName: "stickyRightIds", publicName: "stickyRightIds", isSignal: true, isRequired: false, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, totalNotFiltered: { classPropertyName: "totalNotFiltered", publicName: "totalNotFiltered", isSignal: true, isRequired: true, transformFunction: null }, rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: true, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, selectedObjects: { classPropertyName: "selectedObjects", publicName: "selectedObjects", isSignal: true, isRequired: false, transformFunction: null }, isSelectloading: { classPropertyName: "isSelectloading", publicName: "isSelectloading", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, sortingDisabled: { classPropertyName: "sortingDisabled", publicName: "sortingDisabled", isSignal: true, isRequired: false, transformFunction: null }, checkboxInputMaxValue: { classPropertyName: "checkboxInputMaxValue", publicName: "checkboxInputMaxValue", isSignal: true, isRequired: false, transformFunction: null }, checkboxDisabled: { classPropertyName: "checkboxDisabled", publicName: "checkboxDisabled", isSignal: true, isRequired: false, transformFunction: null }, paginatorDisabled: { classPropertyName: "paginatorDisabled", publicName: "paginatorDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectChanged: "selectChanged", paginatorChange: "paginatorChange", rowClick: "rowClick", rowDblClick: "rowDblClick", rowSelected: "rowSelected", sort: "sort", thsWidthChange: "thsWidthChange", visibleRowsChange: "visibleRowsChange" }, providers: [
519
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RegisterTableComponent, isStandalone: true, selector: "sproc-register-table", inputs: { isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: true, transformFunction: null }, isPaginatorLoading: { classPropertyName: "isPaginatorLoading", publicName: "isPaginatorLoading", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: true, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: true, transformFunction: null }, checkboxColumn: { classPropertyName: "checkboxColumn", publicName: "checkboxColumn", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, columnsData: { classPropertyName: "columnsData", publicName: "columnsData", isSignal: true, isRequired: true, transformFunction: null }, stickyLeftIds: { classPropertyName: "stickyLeftIds", publicName: "stickyLeftIds", isSignal: true, isRequired: false, transformFunction: null }, stickyRightIds: { classPropertyName: "stickyRightIds", publicName: "stickyRightIds", isSignal: true, isRequired: false, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, totalNotFiltered: { classPropertyName: "totalNotFiltered", publicName: "totalNotFiltered", isSignal: true, isRequired: true, transformFunction: null }, rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: true, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, selectedObjects: { classPropertyName: "selectedObjects", publicName: "selectedObjects", isSignal: true, isRequired: false, transformFunction: null }, isSelectloading: { classPropertyName: "isSelectloading", publicName: "isSelectloading", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, sortingDisabled: { classPropertyName: "sortingDisabled", publicName: "sortingDisabled", isSignal: true, isRequired: false, transformFunction: null }, checkboxDisabled: { classPropertyName: "checkboxDisabled", publicName: "checkboxDisabled", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedRows: { classPropertyName: "maxSelectedRows", publicName: "maxSelectedRows", isSignal: true, isRequired: false, transformFunction: null }, paginatorDisabled: { classPropertyName: "paginatorDisabled", publicName: "paginatorDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectChanged: "selectChanged", paginatorChange: "paginatorChange", rowClick: "rowClick", rowDblClick: "rowDblClick", rowSelected: "rowSelected", sort: "sort", thsWidthChange: "thsWidthChange", visibleRowsChange: "visibleRowsChange" }, providers: [
501
520
  DomIntersectionService,
502
521
  KeyPressedService,
503
522
  {
504
523
  provide: KEY_PRESSED,
505
524
  useValue: 'Shift',
506
525
  },
507
- ], queries: [{ propertyName: "headerTemplates", predicate: HeaderTemplateDirective, isSignal: true }, { propertyName: "cellTemplates", predicate: CellTemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "bodyRows", predicate: ["bodyRow"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "scrollbar", first: true, predicate: TuiScrollbar, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n ></sproc-checkbox-selector>\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"cell.col.value!\"\n ></tui-icon>\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"columnData.value!\"\n ></tui-icon>\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n >\n </sproc-paginator>\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"], dependencies: [{ kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: FormatDatePipe, name: "formatDate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.TuiTableDirective, selector: "table[tuiTable]", inputs: ["columns", "direction", "size", "sorter"], outputs: ["directionChange", "sorterChange", "sortChange"] }, { kind: "component", type: i1.TuiTableTbody, selector: "tbody[tuiTbody]", inputs: ["data", "heading", "open"], outputs: ["openChange"] }, { kind: "component", type: i1.TuiTableThGroup, selector: "tr[tuiThGroup]" }, { kind: "component", type: i1.TuiTableTh, selector: "th[tuiTh]", inputs: ["sorter", "resizable", "sticky", "requiredSort"] }, { kind: "component", type: i1.TuiTableTd, selector: "th[tuiTd], td[tuiTd]" }, { kind: "component", type: i1.TuiTableTr, selector: "tr[tuiTr]" }, { kind: "directive", type: i1.TuiTableCell, selector: "ng-template[tuiCell]", inputs: ["tuiCell"] }, { kind: "directive", type: i1.TuiTableHead, selector: "[tuiHead]", inputs: ["tuiHead"] }, { kind: "directive", type: i1.TuiTableSortBy, selector: "table[tuiTable][tuiSortBy]", inputs: ["tuiSortBy"], outputs: ["tuiSortByChange", "tuiSortChange"] }, { kind: "directive", type: i1.TuiTableSortable, selector: "th[tuiTh][tuiSortable]", inputs: ["tuiSortable"] }, { kind: "pipe", type: ClassByTypePipe, name: "classByType" }, { kind: "pipe", type: StickyColumnPipe, name: "stickyColumn" }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "component", type: PaginatorComponent, selector: "sproc-paginator", inputs: ["textOnPage", "totalRecords", "pageLinkSize", "showMoreDisabled", "disabled", "rows", "page", "paginatorOptions", "rowsCountOptions", "selectedCounter", "totalNotFiltered", "isLoading", "minRowsCount", "maxRowsCount"], outputs: ["rowsChange", "pageChange", "paginatorChange"] }, { kind: "component", type: CheckboxSelectorComponent, selector: "sproc-checkbox-selector", inputs: ["totalRecords", "selected", "disabled", "loading", "inputMaxValue"], outputs: ["onApply"] }, { kind: "directive", type: StickyDirective, selector: "[stickyLeft], [stickyRight], [stickyTop], [stickyBottom]", inputs: ["stickyLeft", "stickyRight", "stickyTop", "stickyBottom", "stickyRelative", "position", "stylesOnSticky"] }, { kind: "directive", type: StickyRelativeDirective, selector: "[stickyRelative]", inputs: ["columns"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiResizer, selector: "[tuiResizer]", inputs: ["tuiResizer"], outputs: ["tuiSizeChange"] }, { kind: "directive", type: TuiResizable, selector: "[tuiResizable]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
526
+ ], queries: [{ propertyName: "headerTemplates", predicate: HeaderTemplateDirective, isSignal: true }, { propertyName: "cellTemplates", predicate: CellTemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "bodyRows", predicate: ["bodyRow"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "scrollbar", first: true, predicate: TuiScrollbar, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [inputMaxValue]=\"maxSelectedRows()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n />\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n />\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon class=\"register-table--icon-color\" [icon]=\"cell.col.value!\" />\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n />\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon class=\"register-table--icon-color\" [icon]=\"columnData.value!\" />\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n />\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"], dependencies: [{ kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: FormatDatePipe, name: "formatDate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.TuiTableDirective, selector: "table[tuiTable]", inputs: ["columns", "direction", "size", "sorter"], outputs: ["directionChange", "sorterChange", "sortChange"] }, { kind: "component", type: i1.TuiTableTbody, selector: "tbody[tuiTbody]", inputs: ["data", "heading", "open"], outputs: ["openChange"] }, { kind: "component", type: i1.TuiTableThGroup, selector: "tr[tuiThGroup]" }, { kind: "component", type: i1.TuiTableTh, selector: "th[tuiTh]", inputs: ["sorter", "resizable", "sticky", "requiredSort"] }, { kind: "component", type: i1.TuiTableTd, selector: "th[tuiTd], td[tuiTd]" }, { kind: "component", type: i1.TuiTableTr, selector: "tr[tuiTr]" }, { kind: "directive", type: i1.TuiTableCell, selector: "ng-template[tuiCell]", inputs: ["tuiCell"] }, { kind: "directive", type: i1.TuiTableHead, selector: "[tuiHead]", inputs: ["tuiHead"] }, { kind: "directive", type: i1.TuiTableSortBy, selector: "table[tuiTable][tuiSortBy]", inputs: ["tuiSortBy"], outputs: ["tuiSortByChange", "tuiSortChange"] }, { kind: "directive", type: i1.TuiTableSortable, selector: "th[tuiTh][tuiSortable]", inputs: ["tuiSortable"] }, { kind: "pipe", type: ClassByTypePipe, name: "classByType" }, { kind: "pipe", type: StickyColumnPipe, name: "stickyColumn" }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "component", type: PaginatorComponent, selector: "sproc-paginator", inputs: ["textOnPage", "totalRecords", "pageLinkSize", "showMoreDisabled", "disabled", "rows", "page", "paginatorOptions", "rowsCountOptions", "selectedCounter", "totalNotFiltered", "isLoading", "minRowsCount", "maxRowsCount"], outputs: ["rowsChange", "pageChange", "paginatorChange"] }, { kind: "component", type: CheckboxSelectorComponent, selector: "sproc-checkbox-selector", inputs: ["totalRecords", "selected", "disabled", "loading", "inputMaxValue"], outputs: ["onApply"] }, { kind: "directive", type: StickyDirective, selector: "[stickyLeft], [stickyRight], [stickyTop], [stickyBottom]", inputs: ["stickyLeft", "stickyRight", "stickyTop", "stickyBottom", "stickyRelative", "position", "stylesOnSticky"] }, { kind: "directive", type: StickyRelativeDirective, selector: "[stickyRelative]", inputs: ["columns"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiResizer, selector: "[tuiResizer]", inputs: ["tuiResizer"], outputs: ["tuiSizeChange"] }, { kind: "directive", type: TuiResizable, selector: "[tuiResizable]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
508
527
  }
509
528
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterTableComponent, decorators: [{
510
529
  type: Component,
@@ -539,6 +558,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
539
558
  provide: KEY_PRESSED,
540
559
  useValue: 'Shift',
541
560
  },
542
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n ></sproc-checkbox-selector>\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"cell.col.value!\"\n ></tui-icon>\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"columnData.value!\"\n ></tui-icon>\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n >\n </sproc-paginator>\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"] }]
561
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [inputMaxValue]=\"maxSelectedRows()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n />\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n />\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon class=\"register-table--icon-color\" [icon]=\"cell.col.value!\" />\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n />\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon class=\"register-table--icon-color\" [icon]=\"columnData.value!\" />\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n />\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"] }]
543
562
  }], ctorParameters: () => [] });
544
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZ2lzdGVyLWJhc2Uvc3JjL2xpYi9jb21wb25lbnRzL3JlZ2lzdGVyLXRhYmxlL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9yZWdpc3Rlci10YWJsZS9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVMLGVBQWUsR0FJaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUNMLG9CQUFv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Uzt3QkFDVCxXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGtCQUFrQjt3QkFDbEIseUJBQXlCO3dCQUN6QixlQUFlO3dCQUNmLHVCQUF1Qjt3QkFDdkIsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLFlBQVk7cUJBQ2IsYUFDVTt3QkFDVCxzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakI7NEJBQ0UsT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLFFBQVEsRUFBRSxPQUFPO3lCQUNsQjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxuICB2aWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tSW50ZXJzZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RvbS1pbnRlcnNlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBUdWlIaW50LCBUdWlJY29uLCBUdWlMb2FkZXIsIFR1aVNjcm9sbGJhciB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aVRhYmxlLCBUdWlUYWJsZVNvcnRDaGFuZ2UgfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBEZWNpbWFsUGlwZSwgTmdDbGFzcywgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb2x1bW5EYXRhVHlwZXMsXG4gIEVDb2x1bW5EYXRhVHlwZSxcbiAgSUNvbHVtbkRhdGEsXG4gIFJlZ2lzdGVyVGFibGVDZWxsU29ydGVyLFxuICBUaFdpZHRoRW50cnksXG59IGZyb20gJy4vbW9kZWwvc2NoZW1hJztcbmltcG9ydCB7IFR1aUNoZWNrYm94IH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBFRGF0ZVBhdHRlcm4sIEVUaW1lem9uZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS9kYXRlLXRpbWUudHlwZXMnO1xuaW1wb3J0IHtcbiAgb3V0cHV0RnJvbU9ic2VydmFibGUsXG4gIHRha2VVbnRpbERlc3Ryb3llZCxcbiAgdG9PYnNlcnZhYmxlLFxuICB0b1NpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvaGVhZGVyLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRlVGltZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRlLXRpbWUuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2VsbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBLRVlfUFJFU1NFRCwgS2V5UHJlc3NlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9rZXktcHJlc3NlZC5zZXJ2aWNlJztcbmltcG9ydCB7IEVPcmRlciwgVEhTX1dJRFRIX0NIQU5HRVNfREVCT1VOQ0VfVElNRV9NTFMgfSBmcm9tICcuLi8uLi9jb25zdHMvcmVnaXN0ZXItYmFzZS5jb25zdHMnO1xuaW1wb3J0IHsgQ2xhc3NCeVR5cGVQaXBlIH0gZnJvbSAnLi9waXBlcy9jbGFzcy1ieS10eXBlLnBpcGUnO1xuaW1wb3J0IHsgU3RpY2t5Q29sdW1uUGlwZSB9IGZyb20gJy4vcGlwZXMvc3RpY2t5LWNvbHVtbi5waXBlJztcbmltcG9ydCB7XG4gIENIRUNLQk9YX1NFTEVDVE9SX0tFWSxcbiAgQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFgsXG4gIE1JTl9DT0xfV0lEVEhfUFgsXG59IGZyb20gJy4vY29uc3RzL3JlZ2lzdGVyLXRhYmxlLmNvbnN0cyc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgbWFwLFxuICBza2lwLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gtc2VsZWN0b3IvY2hlY2tib3gtc2VsZWN0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkSlNPTnMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBTdGlja3lEaXJlY3RpdmUsIFN0aWNreVJlbGF0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBTY2FsYXJVVUlEIH0gZnJvbSAnaGFzdXJhJztcbmltcG9ydCB7IEVSZWdpc3Rlck9iamVjdFN0YXRlLCBJUmVnaXN0ZXJPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcHBseVNlbGVjdGlvblR5cGVzIH0gZnJvbSAnLi4vY2hlY2tib3gtc2VsZWN0b3IvY2hlY2tib3gtc2VsZWN0b3IudHlwZXMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgVHVpUmVzaXphYmxlLCBUdWlSZXNpemVyIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBGb3JtYXREYXRlUGlwZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS9mb3JtYXQtZGF0ZS5waXBlJztcbmltcG9ydCB7IElQYWdpbmF0b3JPdXRwdXQgfSBmcm9tICcuLi9wYWdpbmF0b3IvdHlwZXMvcGFnaW5hdG9yLnR5cGVzJztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcblxuLyoqINCe0LHRidC40Lkg0LrQvtC80L/QvtC90LXQvdGCINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGC0LDQsdC70LjRhtGLINGA0LXRgdGB0YLRgNCwICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcHJvYy1yZWdpc3Rlci10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC5sZXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBUdWlTY3JvbGxiYXIsXG4gICAgVHVpTG9hZGVyLFxuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBUdWlDaGVja2JveCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEZvcm1hdERhdGVQaXBlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFR1aUxvYWRlcixcbiAgICBUdWlUYWJsZSxcbiAgICBDbGFzc0J5VHlwZVBpcGUsXG4gICAgU3RpY2t5Q29sdW1uUGlwZSxcbiAgICBUdWlIaW50LFxuICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFN0aWNreURpcmVjdGl2ZSxcbiAgICBTdGlja3lSZWxhdGl2ZURpcmVjdGl2ZSxcbiAgICBUdWlJY29uLFxuICAgIFR1aVJlc2l6ZXIsXG4gICAgVHVpUmVzaXphYmxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBEb21JbnRlcnNlY3Rpb25TZXJ2aWNlLFxuICAgIEtleVByZXNzZWRTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEtFWV9QUkVTU0VELFxuICAgICAgdXNlVmFsdWU6ICdTaGlmdCcsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINC30LDQs9C+0LvQvtCy0LrQvtCyINGC0LDQsdC70LjRhtGLLCDRgtC10LzQv9C70LXQudGC0Ysg0YEg0LTQuNGA0LXQutGC0LjQstC+0LkgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGhlYWRlclRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbjxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZT4oSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINGP0YfQtdC10Log0YLQsNCx0LvQuNGG0YssINGC0LXQvNC/0LvQtdC50YLRiyDRgSDQtNC40YDQtdC60YLQuNCy0L7QuSBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGNlbGxUZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW48Q2VsbFRlbXBsYXRlRGlyZWN0aXZlPihDZWxsVGVtcGxhdGVEaXJlY3RpdmUpO1xuXG4gIC8qKiDQrdC70LXQvNC10L3RgtGLINGB0YLRgNC+0Log0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIGJvZHlSb3dzID0gdmlld0NoaWxkcmVuKCdib2R5Um93JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAvKiog0K3Qu9C10LzQtdC90YIg0YHQutGA0L7Qu9C70LAg0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIHNjcm9sbGJhciA9IHZpZXdDaGlsZChUdWlTY3JvbGxiYXIsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgLyoqINCh0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LPRgNGD0LfQutC4INC00LDQvdC90YvRhSDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgaXNMb2FkaW5nID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbiB8IG51bGw+KCk7XG4gIC8qKiDQodC+0YHRgtC+0Y/QvdC40LUg0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUg0L/QsNCz0LjQvdCw0YbQuNC4ICovXG4gIHB1YmxpYyBpc1BhZ2luYXRvckxvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiDQndC+0LzQtdGAINGB0YLRgNCw0L3QuNGG0YsgKi9cbiAgcHVibGljIHBhZ2UgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXIgfCBudWxsPigpO1xuICAvKiog0JrQvtC70LjRh9C10YHRgtCy0L4g0LfQsNC/0LjRgdC10Lkg0L3QsCDQvtC00L3QvtC5INGB0YLRgNCw0L3QuNGG0LUgKi9cbiAgcHVibGljIGxpbWl0ID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyIHwgbnVsbD4oKTtcbiAgLyoqINCe0YLQvtCx0YDQsNC20LXQvdC40LUg0LrQvtC70L7QvdC60Lgg0LLRi9Cx0L7RgNCwINGB0YLRgNC+0LogKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC+0YLQvtCx0YDQsNC20LDQtdGC0YHRjykgKi9cbiAgcHVibGljIGNoZWNrYm94Q29sdW1uID0gaW5wdXQodHJ1ZSk7XG4gIC8qKiDQodC/0LjRgdC+0Log0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgY29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPHN0cmluZ1tdPigpO1xuICAvKiog0JTQsNC90L3Ri9C1INGB0YLQvtC70LHRhtC+0LIgKi9cbiAgcHVibGljIGNvbHVtbnNEYXRhID0gaW5wdXQucmVxdWlyZWQ8SUNvbHVtbkRhdGFbXT4oKTtcbiAgLyoqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0YTQuNC60YHQuNGA0L7QstCw0L3QvdGL0YUg0YHQu9C10LLQsCDRgdGC0L7Qu9Cx0YbQvtCyICovXG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzID0gaW5wdXQ8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG4gIC8qKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNGLINGE0LjQutGB0LjRgNC+0LLQsNC90L3Ri9GFINGB0LvQtdCy0LAg0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHMgPSBpbnB1dDxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LkgKi9cbiAgcHVibGljIHRvdGFsUmVjb3JkcyA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwICovXG4gIHB1YmxpYyB0b3RhbE5vdEZpbHRlcmVkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICAvKiog0JfQvdCw0YfQtdC90LjRjyDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgcm93RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZElkcyA9IGlucHV0KG5ldyBTZXQ8U2NhbGFyVVVJRD4oKSk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24g0J7QsdGK0LXQutGC0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBpbnB1dChuZXcgU2V0PGFueT4oKSk7XG4gIC8qKiDQl9Cw0LPRgNGD0LfQutCwINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0YUg0LfQsNC/0LjRgdC10Lkg0L/RgNC4INCy0YvQsdC+0YDQtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0YnQtdCz0L4g0L/Rg9C90LrRgtCwINCyINGH0LXQutCx0L7QutGBLdGB0LXQu9C10LrRgtC+0YDQtSAqL1xuICBwdWJsaWMgaXNTZWxlY3Rsb2FkaW5nID0gaW5wdXQ8Ym9vbGVhbiB8IG51bGw+KGZhbHNlKTtcbiAgLyoqINCi0LXQutGB0YIg0L/Rg9GB0YLQvtC5INGC0LDQsdC70LjRhtGLICovXG4gIHB1YmxpYyBlbXB0eVRleHQgPSBpbnB1dDxzdHJpbmc+KCfQndC10YIg0LTQsNC90L3Ri9GFJyk7XG4gIC8qKiDQlNC40LfQtdC50LHQuyDRgdC+0YDRgtC40YDQvtCy0LrQuCAqL1xuICBwdWJsaWMgc29ydGluZ0Rpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuICAvKiog0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40Y8g0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiDRh9C10YDQtdC3INC/0L7Qu9C1INCy0LLQvtC00LAgKi9cbiAgcHVibGljIGNoZWNrYm94SW5wdXRNYXhWYWx1ZSA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvKiog0JTQuNC30LXQudCx0Lsg0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiAqL1xuICBwdWJsaWMgY2hlY2tib3hEaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcbiAgLyoqINCU0LjQt9C10LnQsdC7INCy0YvQsdC+0YDQsCDRh9C10LrQsdC+0LrRgdC+0LIgKi9cbiAgcHVibGljIHBhZ2luYXRvckRpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuXG4gIHB1YmxpYyBzZWxlY3RlZENvdW50ZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zZWxlY3RlZFZhbHVlcygpPy5zaXplID8/IG51bGw7XG4gICAgY29uc3QgdW5zZWxlY3RlZFNpemUgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnN0YXRlVW5mZXRjaGVkT2JqZWN0cygpO1xuICAgIGNvbnN0IGlzTm90U2VsZWN0ZWQgPSB1bmZldGNoZWRPYmplY3RzICE9PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRDtcblxuICAgIGlmIChzZWxlY3RlZFNpemUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlcHJlY2F0ZWRTZWxlY3RlZFJvd3NDb3VudGVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcygpLnNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzTm90U2VsZWN0ZWQgPyBzZWxlY3RlZFNpemUgOiB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdW5zZWxlY3RlZFNpemU7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkdHMgPSBpbmplY3QoRGF0ZVRpbWVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2hpZnQgPSBpbmplY3QoS2V5UHJlc3NlZFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb21JbnRlcnNlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KERvbUludGVyc2VjdGlvblNlcnZpY2UpO1xuICAvLyBUT0RPINGD0LTQsNC70LjRgtGMIG9wdGlvbmFsOiB0cnVlINC/0L7RgdC70LUg0LLRi9C/0L7Qu9C90LXQvdC40Y8g0LfQsNC00LDRh9C4IFNNQTItMzEzNFxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuXG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQstGL0LHQvtGA0LAg0LIg0YfQtdC60LHQvtC60YEt0YHQtdC70LXQutGC0L7RgNC1ICovXG4gIHB1YmxpYyBzZWxlY3RDaGFuZ2VkID0gb3V0cHV0PEFwcGx5U2VsZWN0aW9uVHlwZXM+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0LfQvdCw0YfQtdC90LjQuSDQv9Cw0LPQuNC90LDRgtC+0YDQsCAqL1xuICBwdWJsaWMgcGFnaW5hdG9yQ2hhbmdlID0gb3V0cHV0PElQYWdpbmF0b3JPdXRwdXQ+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93Q2xpY2sgPSBvdXRwdXQ8YW55PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0LTQstC+0LnQvdC+0LPQviDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93RGJsQ2xpY2sgPSBvdXRwdXQ8YW55PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0L3QsNC20LDRgtC40Y8g0L3QsCDRgdGC0YDQvtC60YMgKi9cbiAgcHVibGljIHJvd1NlbGVjdGVkID0gb3V0cHV0PHsgcm93OiBhbnlbXTsgY291bnQ6IG51bWJlciB9PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0YHQvtGA0YLQuNGA0L7QstC60Lgg0LfQvdCw0YfQtdC90LjQuSDQsiDRgtCw0LHQu9C40YbQtSAqL1xuICBwdWJsaWMgc29ydCA9IG91dHB1dDxSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+W10+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0YjQuNGA0LjQvdGLINC60L7Qu9C+0L3QutC4ICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Roc1dpZHRoTWFwID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gbmV3IE1hcCh0aGlzLmNvbHVtbnNEYXRhKCkubWFwKCh7IG5hbWUsIHdpZHRoIH0pID0+IFtuYW1lLCBuZXcgQmVoYXZpb3JTdWJqZWN0KHdpZHRoKV0pKVxuICApO1xuICBwdWJsaWMgdGhzV2lkdGhDaGFuZ2UgPSBvdXRwdXRGcm9tT2JzZXJ2YWJsZTxUaFdpZHRoRW50cnlbXT4oXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMuX3Roc1dpZHRoTWFwKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChjaGFuZ2VzKSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgIFsuLi5jaGFuZ2VzLmVudHJpZXMoKV0ubWFwKChbbmFtZSwgJHdpZHRoXSkgPT5cbiAgICAgICAgICAgICR3aWR0aC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgod2lkdGgpID0+ICh7IG5hbWUsIHdpZHRoIH0pKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZEpTT05zKCksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKFRIU19XSURUSF9DSEFOR0VTX0RFQk9VTkNFX1RJTUVfTUxTKSxcbiAgICAgICAgICBza2lwKDEpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0LLQuNC00LjQvNGL0YUg0YHRgtGA0L7QuiDRgtCw0LHQu9C40YbRiyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmJvZHlSb3dzKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoYm9keVJvd3MpID0+XG4gICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICBib2R5Um93cy5tYXAoKGJvZHlSb3csIGluZGV4KSA9PlxuICAgICAgICAgIHRoaXMuX2RvbUludGVyc2VjdGlvblNlcnZpY2UuY3JlYXRlQW5kT2JzZXJ2ZShib2R5Um93KS5waXBlKFxuICAgICAgICAgICAgLy8gVE9ETyDRg9C00LDQu9C40YLRjCB0YXAsINC60LDQuiDRgtC+0LvRjNC60L4g0L/QtdGA0LXRgdGC0LDQvdC10YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyBpc192aXNpYmxlINC/0L4g0L/RgNC+0LXQutGC0YNcbiAgICAgICAgICAgIHRhcCgoaXNWaXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm93RGF0YSgpW2luZGV4XS5pc192aXNpYmxlID0gaXNWaXNpYmxlO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKGlzVmlzaWJsZSkgPT4gKGlzVmlzaWJsZSA/IHRoaXMucm93RGF0YSgpW2luZGV4XSA6IHVuZGVmaW5lZCkpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnBpcGUobWFwKCh2aXNpYmxlUm93cykgPT4gdmlzaWJsZVJvd3MuZmlsdGVyKCh2aXNpYmxlUm93KSA9PiAhIXZpc2libGVSb3cpKSlcbiAgICApXG4gICk7XG4gIHB1YmxpYyB2aXNpYmxlUm93c0NoYW5nZSA9IG91dHB1dEZyb21PYnNlcnZhYmxlPGFueVtdPih0aGlzLl9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVDb2x1bW5EYXRhVHlwZSA9IEVDb2x1bW5EYXRhVHlwZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVUaW1lem9uZSA9IEVUaW1lem9uZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVEYXRlUGF0dGVybiA9IEVEYXRlUGF0dGVybjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVSZWdpc3Rlck9iamVjdFN0YXRlID0gRVJlZ2lzdGVyT2JqZWN0U3RhdGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVE9SX0tFWSA9IENIRUNLQk9YX1NFTEVDVE9SX0tFWTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYID0gQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFg7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0aWNreVRoU3R5bGUgPSBPYmplY3QuZnJlZXplKHsgJ3otaW5kZXgnOiAyMiB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0aWNreVRkU3R5bGUgPSBPYmplY3QuZnJlZXplKHsgJ3otaW5kZXgnOiAyMSB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sdW1uc1dpdGhDaGVja2JveGVzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgIENIRUNLQk9YX1NFTEVDVE9SX0tFWSxcbiAgICAuLi50aGlzLmNvbHVtbnMoKSxcbiAgXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxQb3NpdGlvbiA9IHNpZ25hbDx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4oeyB0b3A6IDAsIGxlZnQ6IDAgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZVdpZHRoID0gdG9TaWduYWwoXG4gICAgY29tYmluZUxhdGVzdChbdG9PYnNlcnZhYmxlKHRoaXMuY29sdW1uc1dpdGhDaGVja2JveGVzKSwgdG9PYnNlcnZhYmxlKHRoaXMuX3Roc1dpZHRoTWFwKV0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgICh7IDA6IHZpc2libGVDb2x1bW5zLCAxOiBjaGFuZ2VzIH0pID0+XG4gICAgICAgICAgbmV3IE1hcChbLi4uY2hhbmdlcy5lbnRyaWVzKCldLmZpbHRlcigoW3RoTmFtZV0pID0+IHZpc2libGVDb2x1bW5zLmluY2x1ZGVzKHRoTmFtZSkpKVxuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcCgoY2hhbmdlcykgPT5cbiAgICAgICAgY29tYmluZUxhdGVzdChcbiAgICAgICAgICBbLi4uY2hhbmdlcy5lbnRyaWVzKCldLm1hcCgoeyAxOiAkd2lkdGggfSkgPT5cbiAgICAgICAgICAgICR3aWR0aC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgod2lkdGgpID0+IHdpZHRoKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBtYXAoKHdpZHRocykgPT4ge1xuICAgICAgICAgICAgbGV0IHRhYmxlV2lkdGggPSB0aGlzLmNoZWNrYm94Q29sdW1uKCkgPyBDSEVDS0JPWF9TRUxFQ1RPUl9XSURUSF9QWCA6IDA7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgd2lkdGggb2Ygd2lkdGhzKSB7XG4gICAgICAgICAgICAgIHRhYmxlV2lkdGggKz0gd2lkdGggPyBOdW1iZXIod2lkdGgpIDogMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlV2lkdGg7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBwcm90ZWN0ZWQgc3RhdGVPYmplY3RzID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zdGF0ZTtcblxuICBwcm90ZWN0ZWQgdmlzaWJsZUNvbHVtbnNUcmVlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl9maWx0ZXJWaXNpYmxlQ29sdW1ucyh0aGlzLmNvbHVtbnNEYXRhKCksIHRoaXMuY29sdW1ucygpKVxuICApO1xuICBwcm90ZWN0ZWQgbWF4RGVwdGggPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9nZXRNYXhEZXB0aCh0aGlzLnZpc2libGVDb2x1bW5zVHJlZSgpKSk7XG4gIHByb3RlY3RlZCBsZWF2ZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9nZXRGbGF0TGVhdmVzKHRoaXMudmlzaWJsZUNvbHVtbnNUcmVlKCkpKTtcblxuICBwcm90ZWN0ZWQgaGVhZGVyUm93cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBtYXhEZXB0aCA9IHRoaXMubWF4RGVwdGgoKTtcbiAgICBjb25zdCByb3dzOiB7IGNvbDogSUNvbHVtbkRhdGE7IHJvd3NwYW46IG51bWJlcjsgY29sc3BhbjogbnVtYmVyIH1bXVtdID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBtYXhEZXB0aCB9LFxuICAgICAgKCkgPT4gW11cbiAgICApO1xuXG4gICAgaWYgKG1heERlcHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnZpc2libGVDb2x1bW5zVHJlZSgpKSB7XG4gICAgICB0aGlzLl9idWlsZEhlYWRlclJlY3Vyc2l2ZShjb2wsIDAsIG1heERlcHRoLCByb3dzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfZGVwcmVjYXRlZFNlbGVjdGVkUm93c0NvdW50ZXIgPSBzaWduYWwoMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVab25lQ2hhbmdlcyQgPSB0aGlzLmR0cy5pc1RpbWVab25lQ2hhbmdlZCQ7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbHVtbk9yZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2plY3RlZEhlYWRlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGVkQ2VsbHNNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja2VkUm93JCA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG92ZXJlZFJvdyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBsYXN0U2VsZWN0ZWRSb3c6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2V0U2Nyb2xsUG9zaXRpb25BZnRlckRhdGFMb2FkaW5nKCk7XG4gICAgdGhpcy5fcHJvamVjdEhlYWRlclRlbXBsYXRlcygpO1xuICAgIHRoaXMuX3Byb2plY3RDZWxsVGVtcGxhdGVzKCk7XG4gICAgLy8gVE9ETyDRg9C00LDQu9C40YLRjCDQvNC10YLQvtC0LCDQutCw0Log0YLQvtC70YzQutC+INC/0LXRgNC10YHRgtCw0L3QtdGCINC40YHQv9C+0LvRjNC30L7QstCw0YLRjNGB0Y8gaXNfdmlzaWJsZSDQv9C+INC/0YDQvtC10LrRgtGDXG4gICAgdGhpcy5fc3luY1Jvd1Zpc2liaWxpdHlET00oKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5yb3dEYXRhKCk7XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgIXRoaXMubGFzdFNlbGVjdGVkUm93KSB7XG4gICAgICAgIFt0aGlzLmxhc3RTZWxlY3RlZFJvd10gPSBkYXRhO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsUG9zaXRpb25BZnRlckRhdGFMb2FkaW5nKCk6IHZvaWQge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5zY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbGJhckVsZW1lbnQgPSB0aGlzLnNjcm9sbGJhcigpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHNjcm9sbGJhckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHNjcm9sbGJhckVsZW1lbnQuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICAgICAgc2Nyb2xsYmFyRWxlbWVudC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvamVjdEhlYWRlclRlbXBsYXRlcygpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcHJvamVjdGVkSGVhZGVyc01hcC5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiB0aGlzLmhlYWRlclRlbXBsYXRlcygpKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZEhlYWRlcnNNYXAuc2V0KHRlbXBsYXRlLmhlYWRlclRlbXBsYXRlTmFtZSgpLCB0ZW1wbGF0ZS50cGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvamVjdENlbGxUZW1wbGF0ZXMoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRoaXMuY2VsbFRlbXBsYXRlcygpKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLnNldCh0ZW1wbGF0ZS5jZWxsVGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZS50cGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Jvd1Zpc2liaWxpdHlET00oKTogdm9pZCB7XG4gICAgdGhpcy5fb2JzZXJ2ZXJSb3dzVmlzaWJpbGl0eURPTSQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fY2xpY2tlZFJvdyQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9ob3ZlcmVkUm93JC5jb21wbGV0ZSgpO1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiB0aGlzLl90aHNXaWR0aE1hcCgpLnZhbHVlcygpKSB7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUobmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3RlZEhlYWRlcnNNYXAuZ2V0KG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByb2plY3Rpb25DZWxsQnlOYW1lKG5hbWU6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0ZWRDZWxsc01hcC5nZXQobmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc29ydENoYW5nZSh7IHNvcnRDb21wYXJhdG9yIH06IFR1aVRhYmxlU29ydENoYW5nZTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGFueT4+Pik6IHZvaWQge1xuICAgIGlmICghc29ydENvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHNvcnRDb21wYXJhdG9yKHt9LCB7fSkgYXMgYW55IGFzIHN0cmluZztcbiAgICBjb25zdCBjb2x1bW5PcmRlciA9IHRoaXMuY29sdW1uT3JkZXJzLmdldChpZCk7XG5cbiAgICBpZiAodGhpcy5fc2hpZnQuaXNQcmVzc2VkKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uT3JkZXIoaWQsIGNvbHVtbk9yZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uT3JkZXIoaWQsIGNvbHVtbk9yZGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnQuZW1pdChbLi4udGhpcy5jb2x1bW5PcmRlcnMudmFsdWVzKCldKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uT3JkZXIoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb2x1bW5PcmRlcjogUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXI8YW55PiB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uT3JkZXIpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gY29sdW1uT3JkZXI7XG4gICAgICBjb25zdCB7IG9yZGVyIH0gPSBvcHRpb25zO1xuXG4gICAgICBpZiAob3JkZXIgPT09IEVPcmRlci5ERVNDKSB7XG4gICAgICAgIHRoaXMuY29sdW1uT3JkZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbk9yZGVycy5zZXQoaWQsIHsgb3B0aW9uczogeyAuLi5vcHRpb25zLCBvcmRlcjogRU9yZGVyLkRFU0MgfSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuc2V0KGlkLCB7IG9wdGlvbnM6IHsgaWQsIG9yZGVyOiBFT3JkZXIuQVNDIH0gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldFRoTmFtZSh0aE5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuICgpID0+IHRoTmFtZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY29sdW1uRGF0YTogSUNvbHVtbkRhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHNvcnRhYmxlLCB0eXBlIH0gPSBjb2x1bW5EYXRhO1xuICAgIGNvbnN0IGF2YWlsYWJsZVNvcnRDb2x1bW5UeXBlczogQ29sdW1uRGF0YVR5cGVzW10gPSBbXG4gICAgICBFQ29sdW1uRGF0YVR5cGUuVEVYVCxcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5EQVRFLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLk5VTSxcbiAgICBdO1xuXG4gICAgcmV0dXJuICF0aGlzLnNvcnRpbmdEaXNhYmxlZCgpICYmIHNvcnRhYmxlICE9PSBmYWxzZSAmJiBhdmFpbGFibGVTb3J0Q29sdW1uVHlwZXMuaW5jbHVkZXModHlwZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tSZXNpemVCbG9ja2VkKGNvbHVtbkRhdGE6IElDb2x1bW5EYXRhKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzaXphYmxlQmxvY2tlZFR5cGVzOiBDb2x1bW5EYXRhVHlwZXNbXSA9IFtcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5DSEVDS0JPWCxcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5JQ09OLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLklDT05fU1ZHLFxuICAgIF07XG5cbiAgICByZXR1cm4gY29sdW1uRGF0YS5maXhlZCB8fCByZXNpemFibGVCbG9ja2VkVHlwZXMuaW5jbHVkZXMoY29sdW1uRGF0YS50eXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0hvdmVyKHJvdzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2hvdmVyZWRSb3ckLm5leHQocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBibHVlSGlnaGxpZ2h0c1NlbGVjdGVkID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGJsdWVIaWdobGlnaHRzU2VsZWN0ZWQ/LnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgY29uc3Qgc3RhdGVPYmplY3RzID0gdGhpcy5zdGF0ZU9iamVjdHM/LigpO1xuXG4gICAgLy8gVE9ETyDQvtGB0YLQsNCy0LjRgtGMINGC0L7Qu9GM0LrQviBpZiDQv9C+0YHQu9C1IFNNQTItMzEzNFxuICAgIGlmIChzdGF0ZU9iamVjdHMpIHtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VSYW5nZVJvd3NTdGF0ZShzdGF0ZU9iamVjdHMsIHRoaXMubGFzdFNlbGVjdGVkUm93LCByb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9jaGFuZ2VPbmx5Um93U3RhdGUoc3RhdGVPYmplY3RzLCByb3csIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NoYW5nZU9ubHlSb3dTdGF0ZShzdGF0ZU9iamVjdHMsIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRSb3cgPSByb3c7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNlbGVjdGVkVmFsdWVzKCk7XG5cbiAgICAgIGlmIChzZWxlY3RlZE9iamVjdHMpIHtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHtcbiAgICAgICAgICByb3c6IFsuLi5zZWxlY3RlZE9iamVjdHNdLFxuICAgICAgICAgIGNvdW50OiBzZWxlY3RlZE9iamVjdHMuc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NsaWNrZWRSb3ckLm5leHQocm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFJhbmdlUm93cyh0aGlzLmxhc3RTZWxlY3RlZFJvdywgcm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0T25seVJvdyhyb3csIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0T25seVJvdyhyb3cpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHtcbiAgICAgIHJvdzogWy4uLnRoaXMuc2VsZWN0ZWRPYmplY3RzKCldLFxuICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoYW5nZU9ubHlSb3dTdGF0ZShcbiAgICBzdGF0ZTogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdD4sXG4gICAgcm93OiB1bmtub3duLFxuICAgIHNhdmVTZWxlY3RlZD86IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByb3cgIT09ICdvYmplY3QnIHx8ICFyb3cgfHwgISgnaWQnIGluIHJvdykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ9Cf0L7Qu9C1IGlkINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0Y3Qu9C10LzQtdC90YLQtScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb3cuaWQgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gc3RhdGUuZ2V0KGlkKT8uc3RhdGUgPT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgaWYgKHNhdmVTZWxlY3RlZCkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9iamVjdEJ5S2V5KGlkLCB7XG4gICAgICAgIHN0YXRlOiB3YXNTZWxlY3RlZCA/IEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURUQgOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoaWQsIHsgc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdE9ubHlSb3cocm93OiB1bmtub3duLCBzYXZlU2VsZWN0ZWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByb3cgIT09ICdvYmplY3QnIHx8ICFyb3cgfHwgISgnaWQnIGluIHJvdykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ9Cf0L7Qu9C1IGlkINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0Y3Qu9C10LzQtdC90YLQtScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb3cuaWQgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZElkcygpLmhhcyhpZCk7XG5cbiAgICBpZiAoc2F2ZVNlbGVjdGVkKSB7XG4gICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmRlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuZGVsZXRlKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuYWRkKGlkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5hZGQocm93KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuYWRkKGlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuYWRkKHJvdyk7XG4gICAgfVxuICAgIHRoaXMuX2VtaXREZXByZWNhdGVkU2VsZWN0ZWRSb3dzKCk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0RGVwcmVjYXRlZFNlbGVjdGVkUm93cygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXByZWNhdGVkU2VsZWN0ZWRSb3dzQ291bnRlci51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZSArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlUmFuZ2VSb3dzU3RhdGUoXG4gICAgc3RhdGVPYmplY3RzOiBNYXA8U2NhbGFyVVVJRCwgSVJlZ2lzdGVyT2JqZWN0PixcbiAgICBwcmV2aW91c1JvdzogdW5rbm93bixcbiAgICBjdXJyZW50Um93OiB1bmtub3duXG4gICk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcblxuICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZpb3VzUm93KTtcbiAgICBsZXQgY3VyckluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihjdXJyZW50Um93KTtcblxuICAgIGlmIChwcmV2SW5kZXggPiBjdXJySW5kZXgpIHtcbiAgICAgIGNvbnN0IHRlbXBJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgICAgIGN1cnJJbmRleCA9IHRlbXBJbmRleDtcbiAgICB9XG5cbiAgICBjb25zdCBpZHNPYmplY3RzU2hvdWxkU2VsZWN0ZWQ6IFNldDxTY2FsYXJVVUlEPiA9IG5ldyBTZXQoXG4gICAgICB0aGlzLnJvd0RhdGEoKVxuICAgICAgICAuc2xpY2UocHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXgsIGN1cnJJbmRleCArIDEpXG4gICAgICAgIC5tYXAoKHJvdykgPT4gcm93LmlkKVxuICAgICk7XG5cbiAgICBjb25zdCBzbGljZWRTdGF0ZU9iamVjdHMgPSBuZXcgTWFwKFxuICAgICAgWy4uLnN0YXRlT2JqZWN0c10uZmlsdGVyKChba2V5XSkgPT4gaWRzT2JqZWN0c1Nob3VsZFNlbGVjdGVkLmhhcyhrZXkpKVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzbGljZWRTdGF0ZU9iamVjdHMua2V5cygpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5LCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RSYW5nZVJvd3MocHJldmlvdXNSb3c6IHVua25vd24sIGN1cnJlbnRSb3c6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihwcmV2aW91c1Jvdyk7XG4gICAgbGV0IGN1cnJJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2YoY3VycmVudFJvdyk7XG5cbiAgICBpZiAocHJldkluZGV4ID4gY3VyckluZGV4KSB7XG4gICAgICBjb25zdCB0ZW1wSW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICBwcmV2SW5kZXggPSBjdXJySW5kZXg7XG4gICAgICBjdXJySW5kZXggPSB0ZW1wSW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXNTaG91bGRTZWxlY3RlZCA9IHRoaXMucm93RGF0YSgpLnNsaWNlKFxuICAgICAgcHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXgsXG4gICAgICBjdXJySW5kZXggKyAxXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuY2xlYXIoKTtcbiAgICB0aGlzLl9lbWl0RGVwcmVjYXRlZFNlbGVjdGVkUm93cygpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zU2hvdWxkU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5hZGQoaXRlbS5pZCk7XG4gICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmFkZChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdGhSZXNpemVDaGFuZ2VzKG5hbWU6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRoV2lkdGhDaGFuZ2VzRW50cnkgPSB0aGlzLl90aHNXaWR0aE1hcCgpLmdldChuYW1lKTtcblxuICAgIGlmICh0aFdpZHRoQ2hhbmdlc0VudHJ5KSB7XG4gICAgICBjb25zdCB2YWxpZFdpZHRoID0gd2lkdGggPiBNSU5fQ09MX1dJRFRIX1BYID8gd2lkdGggOiBNSU5fQ09MX1dJRFRIX1BYO1xuICAgICAgdGhXaWR0aENoYW5nZXNFbnRyeS5uZXh0KHZhbGlkV2lkdGgudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRoV2lkdGgobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0aFdpZHRoQ2hhbmdlc0VudHJ5ID0gdGhpcy5fdGhzV2lkdGhNYXAoKS5nZXQobmFtZSk7XG5cbiAgICByZXR1cm4gdGhXaWR0aENoYW5nZXNFbnRyeT8uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlU2Nyb2xsRW5kUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyRWxlbWVudCA9IHRoaXMuc2Nyb2xsYmFyKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoc2Nyb2xsYmFyRWxlbWVudCAmJiAhdGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IHNjcm9sbGJhckVsZW1lbnQ7XG5cbiAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24uc2V0KHtcbiAgICAgICAgdG9wOiBzY3JvbGxUb3AsXG4gICAgICAgIGxlZnQ6IHNjcm9sbExlZnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShzdGF0ZTogRVJlZ2lzdGVyT2JqZWN0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNldEFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5OiBTY2FsYXJVVUlELCB1cGRhdGVzOiBQYXJ0aWFsPElSZWdpc3Rlck9iamVjdD4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNldFN0YXRlT2JqZWN0QnlLZXkoa2V5LCB1cGRhdGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrUm93QmVmb3JlU2VsZWN0KHJvdzogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNoaWZ0UHJlc3NlZCA9IHRoaXMuX3NoaWZ0LmlzUHJlc3NlZCgpO1xuICAgIGNvbnN0IHByZXZSb3cgPSB0aGlzLmxhc3RTZWxlY3RlZFJvdztcbiAgICBjb25zdCBob3ZlcmVkUm93ID0gdGhpcy5faG92ZXJlZFJvdyQuZ2V0VmFsdWUoKTtcblxuICAgIGlmIChzaGlmdFByZXNzZWQgJiYgcHJldlJvdyAmJiBob3ZlcmVkUm93KSB7XG4gICAgICBsZXQgYmVmb3JlSW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZSb3cpO1xuICAgICAgbGV0IGFmdGVySW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKGhvdmVyZWRSb3cpO1xuXG4gICAgICBpZiAoYmVmb3JlSW5kZXggPiBhZnRlckluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRlbXBJbmRleCA9IGJlZm9yZUluZGV4O1xuICAgICAgICBiZWZvcmVJbmRleCA9IGFmdGVySW5kZXg7XG4gICAgICAgIGFmdGVySW5kZXggPSB0ZW1wSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2Yocm93KTtcblxuICAgICAgcmV0dXJuIGJlZm9yZUluZGV4IDw9IGN1cnJlbnRJbmRleCAmJiBjdXJyZW50SW5kZXggPD0gYWZ0ZXJJbmRleDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZEhlYWRlclJlY3Vyc2l2ZShcbiAgICBjb2w6IElDb2x1bW5EYXRhLFxuICAgIGxldmVsOiBudW1iZXIsXG4gICAgbWF4RGVwdGg6IG51bWJlcixcbiAgICByb3dzOiB7IGNvbDogSUNvbHVtbkRhdGE7IHJvd3NwYW46IG51bWJlcjsgY29sc3BhbjogbnVtYmVyIH1bXVtdXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2wuY2hpbGRyZW4gfHwgW107XG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBjaGlsZHJlbi5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgY3VzdG9tUm93c3BhbiA9IGNvbC5yb3dzcGFuIHx8IDE7XG4gICAgY29uc3QgbmV4dExldmVsID0gbGV2ZWwgKyBjdXN0b21Sb3dzcGFuO1xuXG4gICAgbGV0IGNvbHNwYW4gPSAwO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbHNwYW4gKz0gdGhpcy5fYnVpbGRIZWFkZXJSZWN1cnNpdmUoY2hpbGQsIG5leHRMZXZlbCwgbWF4RGVwdGgsIHJvd3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2xzcGFuID0gMTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzcGFuID0gaGFzQ2hpbGRyZW4gPyBjdXN0b21Sb3dzcGFuIDogbWF4RGVwdGggLSBsZXZlbDtcblxuICAgIGlmIChyb3dzW2xldmVsXSkge1xuICAgICAgcm93c1tsZXZlbF0ucHVzaCh7IGNvbCwgcm93c3BhbiwgY29sc3BhbiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sc3BhbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEZsYXRMZWF2ZXMoY29sdW1uczogSUNvbHVtbkRhdGFbXSk6IElDb2x1bW5EYXRhW10ge1xuICAgIHJldHVybiBjb2x1bW5zLmZsYXRNYXAoKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5jaGlsZHJlbiAmJiBjb2wuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RmxhdExlYXZlcyhjb2wuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtjb2xdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyVmlzaWJsZUNvbHVtbnMoY29sdW1uczogSUNvbHVtbkRhdGFbXSwgc2hvd2VkTmFtZXM6IHN0cmluZ1tdKTogSUNvbHVtbkRhdGFbXSB7XG4gICAgcmV0dXJuIGNvbHVtbnNcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBpZiAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkcmVuID0gdGhpcy5fZmlsdGVyVmlzaWJsZUNvbHVtbnMoY29sLmNoaWxkcmVuLCBzaG93ZWROYW1lcyk7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uY29sLCBjaGlsZHJlbjogdmlzaWJsZUNoaWxkcmVuIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChjb2wpID0+IHNob3dlZE5hbWVzLmluY2x1ZGVzKGNvbC5uYW1lKSB8fCAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRNYXhEZXB0aChjb2x1bW5zOiBJQ29sdW1uRGF0YVtdKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAxICsgTWF0aC5tYXgoLi4uY29sdW1ucy5tYXAoKGMpID0+IHRoaXMuX2dldE1heERlcHRoKGMuY2hpbGRyZW4gfHwgW10pKSk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3NlY3Rpb25cIj5cbiAgPHR1aS1zY3JvbGxiYXIgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fc2Nyb2xsYWJsZVwiIChzY3JvbGxlbmQpPVwic2F2ZVNjcm9sbEVuZFBvc2l0aW9uKClcIj5cbiAgICA8dHVpLWxvYWRlciBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19sb2FkZXJcIiBbc2hvd0xvYWRlcl09XCJpc0xvYWRpbmcoKSB8fCBmYWxzZVwiIFtvdmVybGF5XT1cInRydWVcIj5cbiAgICAgIDx0YWJsZVxuICAgICAgICB0dWlUYWJsZVxuICAgICAgICBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgc3RpY2t5UmVsYXRpdmVcbiAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1dpdGhDaGVja2JveGVzKClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwidGFibGVXaWR0aCgpXCJcbiAgICAgICAgdHVpU29ydEJ5PVwiXCJcbiAgICAgICAgKHNvcnRDaGFuZ2UpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIEBmb3IgKGhyb3cgb2YgaGVhZGVyUm93cygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ciB0dWlUaEdyb3VwPlxuICAgICAgICAgICAgICBAaWYgKCRmaXJzdCAmJiBjaGVja2JveENvbHVtbigpKSB7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgKnR1aUhlYWQ9XCJDSEVDS0JPWF9TRUxFQ1RPUl9LRVlcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fdGgtYmFja2dyb3VuZC0tdGFibGUtY2VsbC1ibHVlIHJlZ2lzdGVyLXRhYmxlX19jZWxsLWljb24gcmVnaXN0ZXItdGFibGVfX2NlbGwtY2hlY2tib3gtc2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIkNIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYXCJcbiAgICAgICAgICAgICAgICAgIFtzb3J0ZXJdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgICBbcm93U3Bhbl09XCJtYXhEZXB0aCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3Byb2MtY2hlY2tib3gtc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkSWRzKClcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNTZWxlY3Rsb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2tib3hEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQXBwbHkpPVwic2VsZWN0Q2hhbmdlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvc3Byb2MtY2hlY2tib3gtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChjZWxsIG9mIGhyb3c7IHRyYWNrIGNlbGwuY29sLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBAbGV0IHRoQ2xhc3MgPSBjZWxsLmNvbC5jbGFzcyA/PyAnJztcbiAgICAgICAgICAgICAgICBAbGV0IHRoVHlwZSA9IGNlbGwuY29sLnR5cGU7XG4gICAgICAgICAgICAgICAgQGxldCB0aE5hbWUgPSBjZWxsLmNvbC5uYW1lO1xuICAgICAgICAgICAgICAgIEBsZXQgc29ydGFibGUgPSBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY2VsbC5jb2wpO1xuICAgICAgICAgICAgICAgIEBsZXQgcmVzaXplQmxvY2tlZCA9IGNoZWNrUmVzaXplQmxvY2tlZChjZWxsLmNvbCk7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgdHVpUmVzaXphYmxlXG4gICAgICAgICAgICAgICAgICAqdHVpSGVhZD1cInRoTmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ3JlZ2lzdGVyLXRhYmxlX190aCcsIHRoVHlwZSB8IGNsYXNzQnlUeXBlLCB0aENsYXNzXVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5TGVmdF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lMZWZ0SWRzKCkpXCJcbiAgICAgICAgICAgICAgICAgIFtzdGlja3lSaWdodF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lSaWdodElkcygpKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVzT25TdGlja3ldPVwic3RpY2t5VGhTdHlsZVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY2VsbC5jb2wuaGVhZGVyU3R5bGUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJnZXRUaFdpZHRoKHRoTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbdHVpU29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgW3NvcnRlcl09XCJzb3J0YWJsZSA/IHNldFRoTmFtZSh0aE5hbWUpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJjZWxsLmNvbC50b29sdGlwVGV4dCA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dTcGFuXT1cImNlbGwucm93c3BhblwiXG4gICAgICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjZWxsLmNvbHNwYW5cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIub3JkZXJdPVwiY29sdW1uT3JkZXJzLmdldCh0aE5hbWUpPy5vcHRpb25zPy5vcmRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjZWxsLmNvbC5pc0hlYWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IHRoUHJvamVjdGlvbiA9IGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUodGhOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRoUHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoUHJvamVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNlbGwuY29sLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGhUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZS0taWNvbi1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNlbGwuY29sLnZhbHVlIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC90dWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OX1NWRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNlbGwuY29sLnZhbHVlXCIgW2FsdF09XCJ0aE5hbWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLlRFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2VsbC5jb2wuc3ZnU3JjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZWxsLmNvbC5zdmdTcmNcIiBbYWx0XT1cInRoTmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtb3ZlcmZsb3ctLWVsbGlwc2lzXCIgW25nU3R5bGVdPVwiY2VsbC5jb2wudGV4dFN0eWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGwuY29sLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuTlVNKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIXJlc2l6ZUJsb2NrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX2NlbGwtcmVzaXplclwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R1aVJlc2l6ZXJdPVwiWzEsIDBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAodHVpU2l6ZUNoYW5nZSk9XCJ0aFJlc2l6ZUNoYW5nZXMoY2VsbC5jb2wubmFtZSwgJGV2ZW50WzBdKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgQGxldCByb3dzID0gcm93RGF0YSgpO1xuICAgICAgICA8dGJvZHkgdHVpVGJvZHk+XG4gICAgICAgICAgQGZvciAocm93IG9mIHJvd3M7IHRyYWNrIHJvdy5pZCkge1xuICAgICAgICAgICAgQGxldCBzdGF0ZSA9IHN0YXRlT2JqZWN0cz8uKCk7XG4gICAgICAgICAgICBAbGV0IHRyU2VsZWN0ZWQgPVxuICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgID8gc3RhdGUuZ2V0KHJvdy5pZCk/LnN0YXRlID09PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJZHMoKS5oYXMocm93LmlkKTtcblxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICNib2R5Um93XG4gICAgICAgICAgICAgIHR1aVRyXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3Jvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJ0clNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNoaWZ0LXByZXNzZWRdPVwibWFya1Jvd0JlZm9yZVNlbGVjdChyb3cpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Sb3dIb3Zlcihyb3cpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25Sb3dIb3ZlcihudWxsKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0NsaWNrKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICAgIChkYmxjbGljayk9XCJyb3dEYmxDbGljay5lbWl0KHJvdylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKGNoZWNrYm94Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHR1aVRkXG4gICAgICAgICAgICAgICAgICAqdHVpQ2VsbD1cIkNIRUNLQk9YX1NFTEVDVE9SX0tFWVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19jZWxsLWNoZWNrYm94LXNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjaGVja2JveERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBmb3IgKGNvbHVtbkRhdGEgb2YgbGVhdmVzKCk7IHRyYWNrIGNvbHVtbkRhdGEubmFtZSkge1xuICAgICAgICAgICAgICAgIEBsZXQgdGRUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgICAgICAgICAgICAgIEBsZXQgdGRLZXkgPSBjb2x1bW5EYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgQGxldCB0ZFZhbHVlID0gcm93W3RkS2V5XTtcbiAgICAgICAgICAgICAgICBAbGV0IHRkQ2xhc3MgPSBjb2x1bW5EYXRhLmNsYXNzVGQgPz8gJyc7XG5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHR1aVRkXG4gICAgICAgICAgICAgICAgICAqdHVpQ2VsbD1cInRkS2V5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlt0ZFR5cGUgfCBjbGFzc0J5VHlwZTogJ3RkJywgdGRDbGFzc11cIlxuICAgICAgICAgICAgICAgICAgW3N0aWNreUxlZnRdPVwidGRLZXkgfCBzdGlja3lDb2x1bW46IHN0aWNreUxlZnRJZHMoKVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5UmlnaHRdPVwidGRLZXkgfCBzdGlja3lDb2x1bW46IHN0aWNreVJpZ2h0SWRzKClcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlc09uU3RpY2t5XT1cInN0aWNreVRkU3R5bGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uRGF0YS5pc1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgdGRQcm9qZWN0aW9uID0gZ2V0UHJvamVjdGlvbkNlbGxCeU5hbWUodGRLZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAodGRQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGRQcm9qZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogdGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZS0taWNvbi1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiY29sdW1uRGF0YS52YWx1ZSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90dWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OX1NWRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0ZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb2x1bW5EYXRhLnZhbHVlXCIgW2FsdF09XCJ0ZEtleVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIXRkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLlRFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0dWlIaW50XT1cInRkVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/PyAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRkVmFsdWUgPyBjb2x1bW5EYXRhLnBvc3RmaXggOiAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLk5VTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/PyAnJyB8IG51bWJlcjogY29sdW1uRGF0YS5udW1iZXJQaXBlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZFZhbHVlID8gY29sdW1uRGF0YS5wb3N0Zml4IDogJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybWF0RGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVGltZXpvbmUuVVRDXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbkRhdGEuZGF0ZVBhdHRlcm4gPz8gRURhdGVQYXR0ZXJuLkRBVEVfVElNRV9XSVRIT1VUX1NFQ09ORFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRpbWVab25lQ2hhbmdlcyQgfCBhc3luYykpID8/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/IGNvbHVtbkRhdGEucG9zdGZpeCA6ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJlbXB0eS1sYXllclwiPlxuICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyZWQtdGV4dFwiPnt7IGVtcHR5VGV4dCgpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC90dWktbG9hZGVyPlxuICA8L3R1aS1zY3JvbGxiYXI+XG5cbiAgPHNwcm9jLXBhZ2luYXRvclxuICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3BhZ2luYXRvclwiXG4gICAgW3BhZ2VdPVwicGFnZSgpXCJcbiAgICBbcm93c109XCJsaW1pdCgpXCJcbiAgICBbcGFnZUxpbmtTaXplXT1cIjFcIlxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzKClcIlxuICAgIFt0b3RhbE5vdEZpbHRlcmVkXT1cInRvdGFsTm90RmlsdGVyZWQoKVwiXG4gICAgW3Jvd3NDb3VudE9wdGlvbnNdPVwiWzMwLCA0MCwgNTBdXCJcbiAgICBbc2VsZWN0ZWRDb3VudGVyXT1cInNlbGVjdGVkQ291bnRlcigpXCJcbiAgICAocGFnaW5hdG9yQ2hhbmdlKT1cInBhZ2luYXRvckNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3JEaXNhYmxlZCgpXCJcbiAgICBbaXNMb2FkaW5nXT1cImlzUGFnaW5hdG9yTG9hZGluZygpXCJcbiAgPlxuICA8L3Nwcm9jLXBhZ2luYXRvcj5cbjwvc2VjdGlvbj5cbiJdfQ==
563
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZ2lzdGVyLWJhc2Uvc3JjL2xpYi9jb21wb25lbnRzL3JlZ2lzdGVyLXRhYmxlL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9yZWdpc3Rlci10YWJsZS9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVMLGVBQWUsR0FJaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUNMLG9CQUFv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LFdBQVc7Z0JBQ3BCLFFBQVEsRUFBRSxPQUFPO2FBQ2xCO1NBQ0YsMERBS2lFLHVCQUF1QixnRUFFM0IscUJBQXFCLGdIQUdqQyxVQUFVLHlFQUUvQixZQUFZLDJCQUFVLFVBQVUsNkNDM0gvRCxnMVVBMlBBLHV6T0QzS0ksWUFBWSw4RUFDWixTQUFTLGlJQUNULE9BQU8sb0ZBQ1AsT0FBTywyRUFDUCxXQUFXLG9HQUNYLGdCQUFnQiwrSUFDaEIsV0FBVywwQ0FDWCxjQUFjLDhDQUNkLFNBQVMsNkNBQ1QsV0FBVyw4QkFDWCxtQkFBbUIsNG9DQUduQixlQUFlLCtDQUNmLGdCQUFnQiw2TkFFaEIsa0JBQWtCLDBWQUNsQix5QkFBeUIsd0tBQ3pCLGVBQWUseU5BQ2YsdUJBQXVCLGtGQUN2QixPQUFPLHFGQUNQLFVBQVUsNkdBQ1YsWUFBWTs7NEZBWUgsc0JBQXNCO2tCQXhDbEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FHcEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osU0FBUzt3QkFDVCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsV0FBVzt3QkFDWCxnQkFBZ0I7d0JBQ2hCLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxTQUFTO3dCQUNULFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixTQUFTO3dCQUNULFFBQVE7d0JBQ1IsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLE9BQU87d0JBQ1Asa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLGVBQWU7d0JBQ2YsdUJBQXVCO3dCQUN2QixPQUFPO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTtxQkFDYixhQUNVO3dCQUNULHNCQUFzQjt3QkFDdEIsaUJBQWlCO3dCQUNqQjs0QkFDRSxPQUFPLEVBQUUsV0FBVzs0QkFDcEIsUUFBUSxFQUFFLE9BQU87eUJBQ2xCO3FCQUNGLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGNvbnRlbnRDaGlsZHJlbixcbiAgRGVzdHJveVJlZixcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG4gIHZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21JbnRlcnNlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZG9tLWludGVyc2VjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFR1aUhpbnQsIFR1aUljb24sIFR1aUxvYWRlciwgVHVpU2Nyb2xsYmFyIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVHVpVGFibGUsIFR1aVRhYmxlU29ydENoYW5nZSB9IGZyb20gJ0B0YWlnYS11aS9hZGRvbi10YWJsZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIERlY2ltYWxQaXBlLCBOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbHVtbkRhdGFUeXBlcyxcbiAgRUNvbHVtbkRhdGFUeXBlLFxuICBJQ29sdW1uRGF0YSxcbiAgUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXIsXG4gIFRoV2lkdGhFbnRyeSxcbn0gZnJvbSAnLi9tb2RlbC9zY2hlbWEnO1xuaW1wb3J0IHsgVHVpQ2hlY2tib3ggfSBmcm9tICdAdGFpZ2EtdWkva2l0JztcbmltcG9ydCB7IEVEYXRlUGF0dGVybiwgRVRpbWV6b25lIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9kYXRlL2RhdGUtdGltZS50eXBlcyc7XG5pbXBvcnQge1xuICBvdXRwdXRGcm9tT2JzZXJ2YWJsZSxcbiAgdGFrZVVudGlsRGVzdHJveWVkLFxuICB0b09ic2VydmFibGUsXG4gIHRvU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9oZWFkZXItdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGVUaW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGUtdGltZS5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jZWxsLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEtFWV9QUkVTU0VELCBLZXlQcmVzc2VkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2tleS1wcmVzc2VkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRU9yZGVyLCBUSFNfV0lEVEhfQ0hBTkdFU19ERUJPVU5DRV9USU1FX01MUyB9IGZyb20gJy4uLy4uL2NvbnN0cy9yZWdpc3Rlci1iYXNlLmNvbnN0cyc7XG5pbXBvcnQgeyBDbGFzc0J5VHlwZVBpcGUgfSBmcm9tICcuL3BpcGVzL2NsYXNzLWJ5LXR5cGUucGlwZSc7XG5pbXBvcnQgeyBTdGlja3lDb2x1bW5QaXBlIH0gZnJvbSAnLi9waXBlcy9zdGlja3ktY29sdW1uLnBpcGUnO1xuaW1wb3J0IHtcbiAgQ0hFQ0tCT1hfU0VMRUNUT1JfS0VZLFxuICBDSEVDS0JPWF9TRUxFQ1RPUl9XSURUSF9QWCxcbiAgTUlOX0NPTF9XSURUSF9QWCxcbn0gZnJvbSAnLi9jb25zdHMvcmVnaXN0ZXItdGFibGUuY29uc3RzJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBtYXAsXG4gIHNraXAsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoZWNrYm94U2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9jaGVja2JveC1zZWxlY3Rvci9jaGVja2JveC1zZWxlY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWRKU09OcywgaXNEZWZpbmVkIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgU3RpY2t5RGlyZWN0aXZlLCBTdGlja3lSZWxhdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgU2NhbGFyVVVJRCB9IGZyb20gJ2hhc3VyYSc7XG5pbXBvcnQgeyBFUmVnaXN0ZXJPYmplY3RTdGF0ZSwgSVJlZ2lzdGVyT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBwbHlTZWxlY3Rpb25UeXBlcyB9IGZyb20gJy4uL2NoZWNrYm94LXNlbGVjdG9yL2NoZWNrYm94LXNlbGVjdG9yLnR5cGVzJztcbmltcG9ydCB7IFNlbGVjdGVkT2JqZWN0c1N0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFR1aVJlc2l6YWJsZSwgVHVpUmVzaXplciB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgRm9ybWF0RGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2RhdGUvZm9ybWF0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBJUGFnaW5hdG9yT3V0cHV0IH0gZnJvbSAnLi4vcGFnaW5hdG9yL3R5cGVzL3BhZ2luYXRvci50eXBlcyc7XG5pbXBvcnQgeyBQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbGVydFR5cGUsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcblxuLyoqINCe0LHRidC40Lkg0LrQvtC80L/QvtC90LXQvdGCINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGC0LDQsdC70LjRhtGLINGA0LXRgdGB0YLRgNCwICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcHJvYy1yZWdpc3Rlci10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC5sZXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBUdWlTY3JvbGxiYXIsXG4gICAgVHVpTG9hZGVyLFxuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBUdWlDaGVja2JveCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEZvcm1hdERhdGVQaXBlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFR1aUxvYWRlcixcbiAgICBUdWlUYWJsZSxcbiAgICBDbGFzc0J5VHlwZVBpcGUsXG4gICAgU3RpY2t5Q29sdW1uUGlwZSxcbiAgICBUdWlIaW50LFxuICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFN0aWNreURpcmVjdGl2ZSxcbiAgICBTdGlja3lSZWxhdGl2ZURpcmVjdGl2ZSxcbiAgICBUdWlJY29uLFxuICAgIFR1aVJlc2l6ZXIsXG4gICAgVHVpUmVzaXphYmxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBEb21JbnRlcnNlY3Rpb25TZXJ2aWNlLFxuICAgIEtleVByZXNzZWRTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEtFWV9QUkVTU0VELFxuICAgICAgdXNlVmFsdWU6ICdTaGlmdCcsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINC30LDQs9C+0LvQvtCy0LrQvtCyINGC0LDQsdC70LjRhtGLLCDRgtC10LzQv9C70LXQudGC0Ysg0YEg0LTQuNGA0LXQutGC0LjQstC+0LkgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGhlYWRlclRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbjxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZT4oSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINGP0YfQtdC10Log0YLQsNCx0LvQuNGG0YssINGC0LXQvNC/0LvQtdC50YLRiyDRgSDQtNC40YDQtdC60YLQuNCy0L7QuSBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGNlbGxUZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW48Q2VsbFRlbXBsYXRlRGlyZWN0aXZlPihDZWxsVGVtcGxhdGVEaXJlY3RpdmUpO1xuXG4gIC8qKiDQrdC70LXQvNC10L3RgtGLINGB0YLRgNC+0Log0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIGJvZHlSb3dzID0gdmlld0NoaWxkcmVuKCdib2R5Um93JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAvKiog0K3Qu9C10LzQtdC90YIg0YHQutGA0L7Qu9C70LAg0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIHNjcm9sbGJhciA9IHZpZXdDaGlsZChUdWlTY3JvbGxiYXIsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgLyoqINCh0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LPRgNGD0LfQutC4INC00LDQvdC90YvRhSDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgaXNMb2FkaW5nID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbiB8IG51bGw+KCk7XG4gIC8qKiDQodC+0YHRgtC+0Y/QvdC40LUg0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUg0L/QsNCz0LjQvdCw0YbQuNC4ICovXG4gIHB1YmxpYyBpc1BhZ2luYXRvckxvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiDQndC+0LzQtdGAINGB0YLRgNCw0L3QuNGG0YsgKi9cbiAgcHVibGljIHBhZ2UgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXIgfCBudWxsPigpO1xuICAvKiog0JrQvtC70LjRh9C10YHRgtCy0L4g0LfQsNC/0LjRgdC10Lkg0L3QsCDQvtC00L3QvtC5INGB0YLRgNCw0L3QuNGG0LUgKi9cbiAgcHVibGljIGxpbWl0ID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyIHwgbnVsbD4oKTtcbiAgLyoqINCe0YLQvtCx0YDQsNC20LXQvdC40LUg0LrQvtC70L7QvdC60Lgg0LLRi9Cx0L7RgNCwINGB0YLRgNC+0LogKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC+0YLQvtCx0YDQsNC20LDQtdGC0YHRjykgKi9cbiAgcHVibGljIGNoZWNrYm94Q29sdW1uID0gaW5wdXQodHJ1ZSk7XG4gIC8qKiDQodC/0LjRgdC+0Log0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgY29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPHN0cmluZ1tdPigpO1xuICAvKiog0JTQsNC90L3Ri9C1INGB0YLQvtC70LHRhtC+0LIgKi9cbiAgcHVibGljIGNvbHVtbnNEYXRhID0gaW5wdXQucmVxdWlyZWQ8SUNvbHVtbkRhdGFbXT4oKTtcbiAgLyoqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0YTQuNC60YHQuNGA0L7QstCw0L3QvdGL0YUg0YHQu9C10LLQsCDRgdGC0L7Qu9Cx0YbQvtCyICovXG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzID0gaW5wdXQ8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG4gIC8qKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNGLINGE0LjQutGB0LjRgNC+0LLQsNC90L3Ri9GFINGB0LvQtdCy0LAg0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHMgPSBpbnB1dDxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LkgKi9cbiAgcHVibGljIHRvdGFsUmVjb3JkcyA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwICovXG4gIHB1YmxpYyB0b3RhbE5vdEZpbHRlcmVkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICAvKiog0JfQvdCw0YfQtdC90LjRjyDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgcm93RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZElkcyA9IGlucHV0KG5ldyBTZXQ8U2NhbGFyVVVJRD4oKSk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24g0J7QsdGK0LXQutGC0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBpbnB1dChuZXcgU2V0PGFueT4oKSk7XG4gIC8qKiDQl9Cw0LPRgNGD0LfQutCwINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0YUg0LfQsNC/0LjRgdC10Lkg0L/RgNC4INCy0YvQsdC+0YDQtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0YnQtdCz0L4g0L/Rg9C90LrRgtCwINCyINGH0LXQutCx0L7QutGBLdGB0LXQu9C10LrRgtC+0YDQtSAqL1xuICBwdWJsaWMgaXNTZWxlY3Rsb2FkaW5nID0gaW5wdXQ8Ym9vbGVhbiB8IG51bGw+KGZhbHNlKTtcbiAgLyoqINCi0LXQutGB0YIg0L/Rg9GB0YLQvtC5INGC0LDQsdC70LjRhtGLICovXG4gIHB1YmxpYyBlbXB0eVRleHQgPSBpbnB1dDxzdHJpbmc+KCfQndC10YIg0LTQsNC90L3Ri9GFJyk7XG4gIC8qKiDQlNC40LfQtdC50LHQuyDRgdC+0YDRgtC40YDQvtCy0LrQuCAqL1xuICBwdWJsaWMgc29ydGluZ0Rpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuICAvKiog0JTQuNC30LXQudCx0Lsg0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiAqL1xuICBwdWJsaWMgY2hlY2tib3hEaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcbiAgLyoqINCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INC60L7Qu9C40YfQtdGB0YLQstCwINCy0YvQsdC40YDQsNC10LzRi9GFINC30LDQv9C40YHQtdC5ICovXG4gIHB1YmxpYyBtYXhTZWxlY3RlZFJvd3MgPSBpbnB1dDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgLyoqINCU0LjQt9C10LnQsdC7INCy0YvQsdC+0YDQsCDRh9C10LrQsdC+0LrRgdC+0LIgKi9cbiAgcHVibGljIHBhZ2luYXRvckRpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuXG4gIHB1YmxpYyBzZWxlY3RlZENvdW50ZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zZWxlY3RlZFZhbHVlcygpPy5zaXplID8/IG51bGw7XG4gICAgY29uc3QgdW5zZWxlY3RlZFNpemUgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnN0YXRlVW5mZXRjaGVkT2JqZWN0cygpO1xuICAgIGNvbnN0IGlzTm90U2VsZWN0ZWQgPSB1bmZldGNoZWRPYmplY3RzICE9PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRDtcblxuICAgIGlmIChzZWxlY3RlZFNpemUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlcHJlY2F0ZWRTZWxlY3RlZFJvd3NDb3VudGVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcygpLnNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzTm90U2VsZWN0ZWQgPyBzZWxlY3RlZFNpemUgOiB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdW5zZWxlY3RlZFNpemU7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkdHMgPSBpbmplY3QoRGF0ZVRpbWVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2hpZnQgPSBpbmplY3QoS2V5UHJlc3NlZFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb21JbnRlcnNlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KERvbUludGVyc2VjdGlvblNlcnZpY2UpO1xuICAvLyBUT0RPINGD0LTQsNC70LjRgtGMIG9wdGlvbmFsOiB0cnVlINC/0L7RgdC70LUg0LLRi9C/0L7Qu9C90LXQvdC40Y8g0LfQsNC00LDRh9C4IFNNQTItMzEzNFxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlU2VydmljZSA9IGluamVjdChNZXNzYWdlU2VydmljZSk7XG5cbiAgLyoqINCh0L7QsdGL0YLQuNC1INCy0YvQsdC+0YDQsCDQsiDRh9C10LrQsdC+0LrRgS3RgdC10LvQtdC60YLQvtGA0LUgKi9cbiAgcHVibGljIHNlbGVjdENoYW5nZWQgPSBvdXRwdXQ8QXBwbHlTZWxlY3Rpb25UeXBlcz4oKTtcbiAgLyoqINCh0L7QsdGL0YLQuNC1INC40LfQvNC10L3QtdC90LjRjyDQt9C90LDRh9C10L3QuNC5INC/0LDQs9C40L3QsNGC0L7RgNCwICovXG4gIHB1YmxpYyBwYWdpbmF0b3JDaGFuZ2UgPSBvdXRwdXQ8SVBhZ2luYXRvck91dHB1dD4oKTtcbiAgLyoqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0YHRgtGA0L7QutGDICovXG4gIHB1YmxpYyByb3dDbGljayA9IG91dHB1dDxhbnk+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQtNCy0L7QudC90L7Qs9C+INC90LDQttCw0YLQuNGPINC90LAg0YHRgtGA0L7QutGDICovXG4gIHB1YmxpYyByb3dEYmxDbGljayA9IG91dHB1dDxhbnk+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93U2VsZWN0ZWQgPSBvdXRwdXQ8eyByb3c6IGFueVtdOyBjb3VudDogbnVtYmVyIH0+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDRgdC+0YDRgtC40YDQvtCy0LrQuCDQt9C90LDRh9C10L3QuNC5INCyINGC0LDQsdC70LjRhtC1ICovXG4gIHB1YmxpYyBzb3J0ID0gb3V0cHV0PFJlZ2lzdGVyVGFibGVDZWxsU29ydGVyPGFueT5bXT4oKTtcbiAgLyoqINCh0L7QsdGL0YLQuNC1INC40LfQvNC10L3QtdC90LjRjyDRiNC40YDQuNC90Ysg0LrQvtC70L7QvdC60LggKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdGhzV2lkdGhNYXAgPSBjb21wdXRlZChcbiAgICAoKSA9PiBuZXcgTWFwKHRoaXMuY29sdW1uc0RhdGEoKS5tYXAoKHsgbmFtZSwgd2lkdGggfSkgPT4gW25hbWUsIG5ldyBCZWhhdmlvclN1YmplY3Qod2lkdGgpXSkpXG4gICk7XG4gIHB1YmxpYyB0aHNXaWR0aENoYW5nZSA9IG91dHB1dEZyb21PYnNlcnZhYmxlPFRoV2lkdGhFbnRyeVtdPihcbiAgICB0b09ic2VydmFibGUodGhpcy5fdGhzV2lkdGhNYXApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGNoYW5nZXMpID0+XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgICAgICAgWy4uLmNoYW5nZXMuZW50cmllcygpXS5tYXAoKFtuYW1lLCAkd2lkdGhdKSA9PlxuICAgICAgICAgICAgJHdpZHRoLmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKCh3aWR0aCkgPT4gKHsgbmFtZSwgd2lkdGggfSkpKVxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkSlNPTnMoKSxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoVEhTX1dJRFRIX0NIQU5HRVNfREVCT1VOQ0VfVElNRV9NTFMpLFxuICAgICAgICAgIHNraXAoMSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcbiAgLyoqINCh0L7QsdGL0YLQuNC1INC40LfQvNC10L3QtdC90LjRjyDQstC40LTQuNC80YvRhSDRgdGC0YDQvtC6INGC0LDQsdC70LjRhtGLICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX29ic2VydmVyUm93c1Zpc2liaWxpdHlET00kID0gdG9PYnNlcnZhYmxlKHRoaXMuYm9keVJvd3MpLnBpcGUoXG4gICAgc3dpdGNoTWFwKChib2R5Um93cykgPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgICAgIGJvZHlSb3dzLm1hcCgoYm9keVJvdywgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5fZG9tSW50ZXJzZWN0aW9uU2VydmljZS5jcmVhdGVBbmRPYnNlcnZlKGJvZHlSb3cpLnBpcGUoXG4gICAgICAgICAgICAvLyBUT0RPINGD0LTQsNC70LjRgtGMIHRhcCwg0LrQsNC6INGC0L7Qu9GM0LrQviDQv9C10YDQtdGB0YLQsNC90LXRgiDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YzRgdGPIGlzX3Zpc2libGUg0L/QviDQv9GA0L7QtdC60YLRg1xuICAgICAgICAgICAgdGFwKChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yb3dEYXRhKClbaW5kZXhdLmlzX3Zpc2libGUgPSBpc1Zpc2libGU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgoaXNWaXNpYmxlKSA9PiAoaXNWaXNpYmxlID8gdGhpcy5yb3dEYXRhKClbaW5kZXhdIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkucGlwZShtYXAoKHZpc2libGVSb3dzKSA9PiB2aXNpYmxlUm93cy5maWx0ZXIoKHZpc2libGVSb3cpID0+ICEhdmlzaWJsZVJvdykpKVxuICAgIClcbiAgKTtcbiAgcHVibGljIHZpc2libGVSb3dzQ2hhbmdlID0gb3V0cHV0RnJvbU9ic2VydmFibGU8YW55W10+KHRoaXMuX29ic2VydmVyUm93c1Zpc2liaWxpdHlET00kKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRUNvbHVtbkRhdGFUeXBlID0gRUNvbHVtbkRhdGFUeXBlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRVRpbWV6b25lID0gRVRpbWV6b25lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRURhdGVQYXR0ZXJuID0gRURhdGVQYXR0ZXJuO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRVJlZ2lzdGVyT2JqZWN0U3RhdGUgPSBFUmVnaXN0ZXJPYmplY3RTdGF0ZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQ0hFQ0tCT1hfU0VMRUNUT1JfS0VZID0gQ0hFQ0tCT1hfU0VMRUNUT1JfS0VZO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFggPSBDSEVDS0JPWF9TRUxFQ1RPUl9XSURUSF9QWDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RpY2t5VGhTdHlsZSA9IE9iamVjdC5mcmVlemUoeyAnei1pbmRleCc6IDIyIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RpY2t5VGRTdHlsZSA9IE9iamVjdC5mcmVlemUoeyAnei1pbmRleCc6IDIxIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2x1bW5zV2l0aENoZWNrYm94ZXMgPSBjb21wdXRlZCgoKSA9PiBbXG4gICAgQ0hFQ0tCT1hfU0VMRUNUT1JfS0VZLFxuICAgIC4uLnRoaXMuY29sdW1ucygpLFxuICBdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNjcm9sbFBvc2l0aW9uID0gc2lnbmFsPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9Pih7IHRvcDogMCwgbGVmdDogMCB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlV2lkdGggPSB0b1NpZ25hbChcbiAgICBjb21iaW5lTGF0ZXN0KFt0b09ic2VydmFibGUodGhpcy5jb2x1bW5zV2l0aENoZWNrYm94ZXMpLCB0b09ic2VydmFibGUodGhpcy5fdGhzV2lkdGhNYXApXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKHsgMDogdmlzaWJsZUNvbHVtbnMsIDE6IGNoYW5nZXMgfSkgPT5cbiAgICAgICAgICBuZXcgTWFwKFsuLi5jaGFuZ2VzLmVudHJpZXMoKV0uZmlsdGVyKChbdGhOYW1lXSkgPT4gdmlzaWJsZUNvbHVtbnMuaW5jbHVkZXModGhOYW1lKSkpXG4gICAgICApLFxuICAgICAgc3dpdGNoTWFwKChjaGFuZ2VzKSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgIFsuLi5jaGFuZ2VzLmVudHJpZXMoKV0ubWFwKCh7IDE6ICR3aWR0aCB9KSA9PlxuICAgICAgICAgICAgJHdpZHRoLmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKCh3aWR0aCkgPT4gd2lkdGgpKVxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcCgod2lkdGhzKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFibGVXaWR0aCA9IHRoaXMuY2hlY2tib3hDb2x1bW4oKSA/IENIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYIDogMDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB3aWR0aCBvZiB3aWR0aHMpIHtcbiAgICAgICAgICAgICAgdGFibGVXaWR0aCArPSB3aWR0aCA/IE51bWJlcih3aWR0aCkgOiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFibGVXaWR0aDtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApO1xuXG4gIHByb3RlY3RlZCBzdGF0ZU9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnN0YXRlO1xuXG4gIHByb3RlY3RlZCB2aXNpYmxlQ29sdW1uc1RyZWUgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuX2ZpbHRlclZpc2libGVDb2x1bW5zKHRoaXMuY29sdW1uc0RhdGEoKSwgdGhpcy5jb2x1bW5zKCkpXG4gICk7XG4gIHByb3RlY3RlZCBtYXhEZXB0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2dldE1heERlcHRoKHRoaXMudmlzaWJsZUNvbHVtbnNUcmVlKCkpKTtcbiAgcHJvdGVjdGVkIGxlYXZlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2dldEZsYXRMZWF2ZXModGhpcy52aXNpYmxlQ29sdW1uc1RyZWUoKSkpO1xuXG4gIHByb3RlY3RlZCBoZWFkZXJSb3dzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1heERlcHRoID0gdGhpcy5tYXhEZXB0aCgpO1xuICAgIGNvbnN0IHJvd3M6IHsgY29sOiBJQ29sdW1uRGF0YTsgcm93c3BhbjogbnVtYmVyOyBjb2xzcGFuOiBudW1iZXIgfVtdW10gPSBBcnJheS5mcm9tKFxuICAgICAgeyBsZW5ndGg6IG1heERlcHRoIH0sXG4gICAgICAoKSA9PiBbXVxuICAgICk7XG5cbiAgICBpZiAobWF4RGVwdGggPT09IDApIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMudmlzaWJsZUNvbHVtbnNUcmVlKCkpIHtcbiAgICAgIHRoaXMuX2J1aWxkSGVhZGVyUmVjdXJzaXZlKGNvbCwgMCwgbWF4RGVwdGgsIHJvd3MpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9KTtcblxuICBwcml2YXRlIF9kZXByZWNhdGVkU2VsZWN0ZWRSb3dzQ291bnRlciA9IHNpZ25hbCgwKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZVpvbmVDaGFuZ2VzJCA9IHRoaXMuZHRzLmlzVGltZVpvbmVDaGFuZ2VkJDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sdW1uT3JkZXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlZ2lzdGVyVGFibGVDZWxsU29ydGVyPGFueT4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGVkSGVhZGVyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9qZWN0ZWRDZWxsc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsaWNrZWRSb3ckID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9ob3ZlcmVkUm93JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bj4obnVsbCk7XG5cbiAgcHJvdGVjdGVkIGxhc3RTZWxlY3RlZFJvdzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZXRTY3JvbGxQb3NpdGlvbkFmdGVyRGF0YUxvYWRpbmcoKTtcbiAgICB0aGlzLl9wcm9qZWN0SGVhZGVyVGVtcGxhdGVzKCk7XG4gICAgdGhpcy5fcHJvamVjdENlbGxUZW1wbGF0ZXMoKTtcbiAgICAvLyBUT0RPINGD0LTQsNC70LjRgtGMINC80LXRgtC+0LQsINC60LDQuiDRgtC+0LvRjNC60L4g0L/QtdGA0LXRgdGC0LDQvdC10YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyBpc192aXNpYmxlINC/0L4g0L/RgNC+0LXQutGC0YNcbiAgICB0aGlzLl9zeW5jUm93VmlzaWJpbGl0eURPTSgpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJvd0RhdGEoKTtcblxuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiAhdGhpcy5sYXN0U2VsZWN0ZWRSb3cpIHtcbiAgICAgICAgW3RoaXMubGFzdFNlbGVjdGVkUm93XSA9IGRhdGE7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRTY3JvbGxQb3NpdGlvbkFmdGVyRGF0YUxvYWRpbmcoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdG9wLCBsZWZ0IH0gPSB0aGlzLnNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsYmFyRWxlbWVudCA9IHRoaXMuc2Nyb2xsYmFyKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoc2Nyb2xsYmFyRWxlbWVudCkge1xuICAgICAgICAgICAgc2Nyb2xsYmFyRWxlbWVudC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgICBzY3JvbGxiYXJFbGVtZW50LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0SGVhZGVyVGVtcGxhdGVzKCk6IHZvaWQge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLl9wcm9qZWN0ZWRIZWFkZXJzTWFwLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRoaXMuaGVhZGVyVGVtcGxhdGVzKCkpIHtcbiAgICAgICAgdGhpcy5fcHJvamVjdGVkSGVhZGVyc01hcC5zZXQodGVtcGxhdGUuaGVhZGVyVGVtcGxhdGVOYW1lKCksIHRlbXBsYXRlLnRwbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0Q2VsbFRlbXBsYXRlcygpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcHJvamVjdGVkQ2VsbHNNYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuX3NldFByb2plY3RlZENlbGxzTWFwKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRQcm9qZWN0ZWRDZWxsc01hcCgpIHtcbiAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRoaXMuY2VsbFRlbXBsYXRlcygpKSB7XG4gICAgICB0aGlzLl9wcm9qZWN0ZWRDZWxsc01hcC5zZXQodGVtcGxhdGUuY2VsbFRlbXBsYXRlTmFtZSwgdGVtcGxhdGUudHBsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zeW5jUm93VmlzaWJpbGl0eURPTSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGlja2VkUm93JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2hvdmVyZWRSb3ckLmNvbXBsZXRlKCk7XG4gICAgZm9yIChjb25zdCBzdWJqZWN0IG9mIHRoaXMuX3Roc1dpZHRoTWFwKCkudmFsdWVzKCkpIHtcbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJvamVjdGlvbkhlYWRlckJ5TmFtZShuYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdGVkSGVhZGVyc01hcC5nZXQobmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJvamVjdGlvbkNlbGxCeU5hbWUobmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLmdldChuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzb3J0Q2hhbmdlKHsgc29ydENvbXBhcmF0b3IgfTogVHVpVGFibGVTb3J0Q2hhbmdlPFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYW55Pj4+KTogdm9pZCB7XG4gICAgaWYgKCFzb3J0Q29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gc29ydENvbXBhcmF0b3Ioe30sIHt9KSBhcyBhbnkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbHVtbk9yZGVyID0gdGhpcy5jb2x1bW5PcmRlcnMuZ2V0KGlkKTtcblxuICAgIGlmICh0aGlzLl9zaGlmdC5pc1ByZXNzZWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVDb2x1bW5PcmRlcihpZCwgY29sdW1uT3JkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbk9yZGVycy5jbGVhcigpO1xuICAgICAgdGhpcy51cGRhdGVDb2x1bW5PcmRlcihpZCwgY29sdW1uT3JkZXIpO1xuICAgIH1cblxuICAgIHRoaXMuc29ydC5lbWl0KFsuLi50aGlzLmNvbHVtbk9yZGVycy52YWx1ZXMoKV0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5PcmRlcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbHVtbk9yZGVyOiBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+IHwgdW5kZWZpbmVkXG4gICk6IHZvaWQge1xuICAgIGlmIChjb2x1bW5PcmRlcikge1xuICAgICAgY29uc3QgeyBvcHRpb25zIH0gPSBjb2x1bW5PcmRlcjtcbiAgICAgIGNvbnN0IHsgb3JkZXIgfSA9IG9wdGlvbnM7XG5cbiAgICAgIGlmIChvcmRlciA9PT0gRU9yZGVyLkRFU0MpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29sdW1uT3JkZXJzLnNldChpZCwgeyBvcHRpb25zOiB7IC4uLm9wdGlvbnMsIG9yZGVyOiBFT3JkZXIuREVTQyB9IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbk9yZGVycy5zZXQoaWQsIHsgb3B0aW9uczogeyBpZCwgb3JkZXI6IEVPcmRlci5BU0MgfSB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VGhOYW1lKHRoTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gKCkgPT4gdGhOYW1lO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQXZhaWxhYmxlQ29sdW1uU29ydGluZyhjb2x1bW5EYXRhOiBJQ29sdW1uRGF0YSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgc29ydGFibGUsIHR5cGUgfSA9IGNvbHVtbkRhdGE7XG4gICAgY29uc3QgYXZhaWxhYmxlU29ydENvbHVtblR5cGVzOiBDb2x1bW5EYXRhVHlwZXNbXSA9IFtcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5URVhULFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLkRBVEUsXG4gICAgICBFQ29sdW1uRGF0YVR5cGUuTlVNLFxuICAgIF07XG5cbiAgICByZXR1cm4gIXRoaXMuc29ydGluZ0Rpc2FibGVkKCkgJiYgc29ydGFibGUgIT09IGZhbHNlICYmIGF2YWlsYWJsZVNvcnRDb2x1bW5UeXBlcy5pbmNsdWRlcyh0eXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1Jlc2l6ZUJsb2NrZWQoY29sdW1uRGF0YTogSUNvbHVtbkRhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXNpemFibGVCbG9ja2VkVHlwZXM6IENvbHVtbkRhdGFUeXBlc1tdID0gW1xuICAgICAgRUNvbHVtbkRhdGFUeXBlLkNIRUNLQk9YLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLklDT04sXG4gICAgICBFQ29sdW1uRGF0YVR5cGUuSUNPTl9TVkcsXG4gICAgXTtcblxuICAgIHJldHVybiBjb2x1bW5EYXRhLmZpeGVkIHx8IHJlc2l6YWJsZUJsb2NrZWRUeXBlcy5pbmNsdWRlcyhjb2x1bW5EYXRhLnR5cGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93SG92ZXIocm93OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faG92ZXJlZFJvdyQubmV4dChyb3cpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrYm94Q29sdW1uKCkpIHtcbiAgICAgIGNvbnN0IGJsdWVIaWdobGlnaHRzU2VsZWN0ZWQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBibHVlSGlnaGxpZ2h0c1NlbGVjdGVkPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZU9iamVjdHMgPSB0aGlzLnN0YXRlT2JqZWN0cz8uKCk7XG5cbiAgICAvLyBUT0RPINC+0YHRgtCw0LLQuNGC0Ywg0YLQvtC70YzQutC+IGlmINC/0L7RgdC70LUgU01BMi0zMTM0XG4gICAgaWYgKHN0YXRlT2JqZWN0cykge1xuICAgICAgY29uc3QgbWF4Um93cyA9IHRoaXMubWF4U2VsZWN0ZWRSb3dzKCk7XG4gICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGVkQ291bnRlcigpO1xuXG4gICAgICBpZiAoaXNEZWZpbmVkKG1heFJvd3MpICYmIHNlbGVjdGVkUm93cyA+PSBtYXhSb3dzKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnNob3dBbGVydChcbiAgICAgICAgICBgXG4gICAgICAgICAg0JLRi9Cx0YDQsNC90L4g0LzQsNC60YHQuNC80LDQu9GM0L3QviDQstC+0LfQvNC+0LbQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5INCyINGA0LXQtdGB0YLRgNC1IOKAlCAke21heFJvd3N9LlxuICAgICAgICAgINCU0LDQu9GM0L3QtdC50YjQuNC5INCy0YvQsdC+0YAg0LfQsNCx0LvQvtC60LjRgNC+0LLQsNC9LlxuICAgICAgICAgIGAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXBwZWFyYW5jZTogQWxlcnRUeXBlLldBUk5JTkcsXG4gICAgICAgICAgICBhdXRvQ2xvc2U6IDEwXzAwMCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZVJhbmdlUm93c1N0YXRlKHN0YXRlT2JqZWN0cywgdGhpcy5sYXN0U2VsZWN0ZWRSb3csIHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgIHRoaXMuX2NoYW5nZU9ubHlSb3dTdGF0ZShzdGF0ZU9iamVjdHMsIHJvdywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY2hhbmdlT25seVJvd1N0YXRlKHN0YXRlT2JqZWN0cywgcm93KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFJvdyA9IHJvdztcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0cyA9IHRoaXMuX3NlbGVjdGVkU2VydmljZT8uc2VsZWN0ZWRWYWx1ZXMoKTtcblxuICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0cykge1xuICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoe1xuICAgICAgICAgIHJvdzogWy4uLnNlbGVjdGVkT2JqZWN0c10sXG4gICAgICAgICAgY291bnQ6IHNlbGVjdGVkT2JqZWN0cy5zaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2xpY2tlZFJvdyQubmV4dChyb3cpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5fc2VsZWN0UmFuZ2VSb3dzKHRoaXMubGFzdFNlbGVjdGVkUm93LCByb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RPbmx5Um93KHJvdywgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZWxlY3RPbmx5Um93KHJvdyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RTZWxlY3RlZFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQocm93KTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoe1xuICAgICAgcm93OiBbLi4udGhpcy5zZWxlY3RlZE9iamVjdHMoKV0sXG4gICAgICBjb3VudDogdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5zaXplLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlT25seVJvd1N0YXRlKFxuICAgIHN0YXRlOiBNYXA8U2NhbGFyVVVJRCwgSVJlZ2lzdGVyT2JqZWN0PixcbiAgICByb3c6IHVua25vd24sXG4gICAgc2F2ZVNlbGVjdGVkPzogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHJvdyAhPT0gJ29iamVjdCcgfHwgIXJvdyB8fCAhKCdpZCcgaW4gcm93KSkge1xuICAgICAgY29uc29sZS5lcnJvcign0J/QvtC70LUgaWQg0L7RgtGB0YPRgtGB0YLQstGD0LXRgiDQsiDRjdC70LXQvNC10L3RgtC1Jywgcm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHJvdy5pZCBhcyBzdHJpbmc7XG4gICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBzdGF0ZS5nZXQoaWQpPy5zdGF0ZSA9PT0gRVJlZ2lzdGVyT2JqZWN0U3RhdGUuU0VMRUNURUQ7XG5cbiAgICBpZiAoc2F2ZVNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoaWQsIHtcbiAgICAgICAgc3RhdGU6IHdhc1NlbGVjdGVkID8gRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCA6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVELFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVPYmplY3RCeUtleShpZCwgeyBzdGF0ZTogRVJlZ2lzdGVyT2JqZWN0U3RhdGUuU0VMRUNURUQgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0T25seVJvdyhyb3c6IHVua25vd24sIHNhdmVTZWxlY3RlZD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHJvdyAhPT0gJ29iamVjdCcgfHwgIXJvdyB8fCAhKCdpZCcgaW4gcm93KSkge1xuICAgICAgY29uc29sZS5lcnJvcign0J/QvtC70LUgaWQg0L7RgtGB0YPRgtGB0YLQstGD0LXRgiDQsiDRjdC70LXQvNC10L3RgtC1Jywgcm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHJvdy5pZCBhcyBzdHJpbmc7XG4gICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSWRzKCkuaGFzKGlkKTtcblxuICAgIGlmIChzYXZlU2VsZWN0ZWQpIHtcbiAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5kZWxldGUocm93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5hZGQoaWQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmFkZChyb3cpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5hZGQoaWQpO1xuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5hZGQocm93KTtcbiAgICB9XG4gICAgdGhpcy5fZW1pdERlcHJlY2F0ZWRTZWxlY3RlZFJvd3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXREZXByZWNhdGVkU2VsZWN0ZWRSb3dzKCk6IHZvaWQge1xuICAgIHRoaXMuX2RlcHJlY2F0ZWRTZWxlY3RlZFJvd3NDb3VudGVyLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlICsgMSk7XG4gIH1cblxuICBwcml2YXRlIF9jaGFuZ2VSYW5nZVJvd3NTdGF0ZShcbiAgICBzdGF0ZU9iamVjdHM6IE1hcDxTY2FsYXJVVUlELCBJUmVnaXN0ZXJPYmplY3Q+LFxuICAgIHByZXZpb3VzUm93OiB1bmtub3duLFxuICAgIGN1cnJlbnRSb3c6IHVua25vd25cbiAgKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVBbGxTdGF0ZU9iamVjdHNCeVN0YXRlKEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURUQpO1xuXG4gICAgbGV0IHByZXZJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2YocHJldmlvdXNSb3cpO1xuICAgIGxldCBjdXJySW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKGN1cnJlbnRSb3cpO1xuXG4gICAgaWYgKHByZXZJbmRleCA+IGN1cnJJbmRleCkge1xuICAgICAgY29uc3QgdGVtcEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgcHJldkluZGV4ID0gY3VyckluZGV4O1xuICAgICAgY3VyckluZGV4ID0gdGVtcEluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGlkc09iamVjdHNTaG91bGRTZWxlY3RlZDogU2V0PFNjYWxhclVVSUQ+ID0gbmV3IFNldChcbiAgICAgIHRoaXMucm93RGF0YSgpXG4gICAgICAgIC5zbGljZShwcmV2SW5kZXggPT09IC0xID8gMCA6IHByZXZJbmRleCwgY3VyckluZGV4ICsgMSlcbiAgICAgICAgLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgKTtcblxuICAgIGNvbnN0IHNsaWNlZFN0YXRlT2JqZWN0cyA9IG5ldyBNYXAoXG4gICAgICBbLi4uc3RhdGVPYmplY3RzXS5maWx0ZXIoKFtrZXldKSA9PiBpZHNPYmplY3RzU2hvdWxkU2VsZWN0ZWQuaGFzKGtleSkpXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIHNsaWNlZFN0YXRlT2JqZWN0cy5rZXlzKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVPYmplY3RCeUtleShrZXksIHsgc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdFJhbmdlUm93cyhwcmV2aW91c1JvdzogdW5rbm93biwgY3VycmVudFJvdzogdW5rbm93bik6IHZvaWQge1xuICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZpb3VzUm93KTtcbiAgICBsZXQgY3VyckluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihjdXJyZW50Um93KTtcblxuICAgIGlmIChwcmV2SW5kZXggPiBjdXJySW5kZXgpIHtcbiAgICAgIGNvbnN0IHRlbXBJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgICAgIGN1cnJJbmRleCA9IHRlbXBJbmRleDtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtc1Nob3VsZFNlbGVjdGVkID0gdGhpcy5yb3dEYXRhKCkuc2xpY2UoXG4gICAgICBwcmV2SW5kZXggPT09IC0xID8gMCA6IHByZXZJbmRleCxcbiAgICAgIGN1cnJJbmRleCArIDFcbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZElkcygpLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5jbGVhcigpO1xuICAgIHRoaXMuX2VtaXREZXByZWNhdGVkU2VsZWN0ZWRSb3dzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXNTaG91bGRTZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmFkZChpdGVtLmlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0aFJlc2l6ZUNoYW5nZXMobmFtZTogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGhXaWR0aENoYW5nZXNFbnRyeSA9IHRoaXMuX3Roc1dpZHRoTWFwKCkuZ2V0KG5hbWUpO1xuXG4gICAgaWYgKHRoV2lkdGhDaGFuZ2VzRW50cnkpIHtcbiAgICAgIGNvbnN0IHZhbGlkV2lkdGggPSB3aWR0aCA+IE1JTl9DT0xfV0lEVEhfUFggPyB3aWR0aCA6IE1JTl9DT0xfV0lEVEhfUFg7XG4gICAgICB0aFdpZHRoQ2hhbmdlc0VudHJ5Lm5leHQodmFsaWRXaWR0aC50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VGhXaWR0aChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRoV2lkdGhDaGFuZ2VzRW50cnkgPSB0aGlzLl90aHNXaWR0aE1hcCgpLmdldChuYW1lKTtcblxuICAgIHJldHVybiB0aFdpZHRoQ2hhbmdlc0VudHJ5Py5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVTY3JvbGxFbmRQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JvbGxiYXJFbGVtZW50ID0gdGhpcy5zY3JvbGxiYXIoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmIChzY3JvbGxiYXJFbGVtZW50ICYmICF0aGlzLmlzTG9hZGluZygpKSB7XG4gICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCB9ID0gc2Nyb2xsYmFyRWxlbWVudDtcblxuICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbi5zZXQoe1xuICAgICAgICB0b3A6IHNjcm9sbFRvcCxcbiAgICAgICAgbGVmdDogc2Nyb2xsTGVmdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVBbGxTdGF0ZU9iamVjdHNCeVN0YXRlKHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkU2VydmljZT8uc2V0QWxsU3RhdGVPYmplY3RzQnlTdGF0ZShzdGF0ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU3RhdGVPYmplY3RCeUtleShrZXk6IFNjYWxhclVVSUQsIHVwZGF0ZXM6IFBhcnRpYWw8SVJlZ2lzdGVyT2JqZWN0Pik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkU2VydmljZT8uc2V0U3RhdGVPYmplY3RCeUtleShrZXksIHVwZGF0ZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtSb3dCZWZvcmVTZWxlY3Qocm93OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2hpZnRQcmVzc2VkID0gdGhpcy5fc2hpZnQuaXNQcmVzc2VkKCk7XG4gICAgY29uc3QgcHJldlJvdyA9IHRoaXMubGFzdFNlbGVjdGVkUm93O1xuICAgIGNvbnN0IGhvdmVyZWRSb3cgPSB0aGlzLl9ob3ZlcmVkUm93JC5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKHNoaWZ0UHJlc3NlZCAmJiBwcmV2Um93ICYmIGhvdmVyZWRSb3cpIHtcbiAgICAgIGxldCBiZWZvcmVJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2YocHJldlJvdyk7XG4gICAgICBsZXQgYWZ0ZXJJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2YoaG92ZXJlZFJvdyk7XG5cbiAgICAgIGlmIChiZWZvcmVJbmRleCA+IGFmdGVySW5kZXgpIHtcbiAgICAgICAgY29uc3QgdGVtcEluZGV4ID0gYmVmb3JlSW5kZXg7XG4gICAgICAgIGJlZm9yZUluZGV4ID0gYWZ0ZXJJbmRleDtcbiAgICAgICAgYWZ0ZXJJbmRleCA9IHRlbXBJbmRleDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihyb3cpO1xuXG4gICAgICByZXR1cm4gYmVmb3JlSW5kZXggPD0gY3VycmVudEluZGV4ICYmIGN1cnJlbnRJbmRleCA8PSBhZnRlckluZGV4O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkSGVhZGVyUmVjdXJzaXZlKFxuICAgIGNvbDogSUNvbHVtbkRhdGEsXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBtYXhEZXB0aDogbnVtYmVyLFxuICAgIHJvd3M6IHsgY29sOiBJQ29sdW1uRGF0YTsgcm93c3BhbjogbnVtYmVyOyBjb2xzcGFuOiBudW1iZXIgfVtdW11cbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5jaGlsZHJlbiB8fCBbXTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBjdXN0b21Sb3dzcGFuID0gY29sLnJvd3NwYW4gfHwgMTtcbiAgICBjb25zdCBuZXh0TGV2ZWwgPSBsZXZlbCArIGN1c3RvbVJvd3NwYW47XG5cbiAgICBsZXQgY29sc3BhbiA9IDA7XG5cbiAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgY29sc3BhbiArPSB0aGlzLl9idWlsZEhlYWRlclJlY3Vyc2l2ZShjaGlsZCwgbmV4dExldmVsLCBtYXhEZXB0aCwgcm93cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHNwYW4gPSAxO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3NwYW4gPSBoYXNDaGlsZHJlbiA/IGN1c3RvbVJvd3NwYW4gOiBtYXhEZXB0aCAtIGxldmVsO1xuXG4gICAgaWYgKHJvd3NbbGV2ZWxdKSB7XG4gICAgICByb3dzW2xldmVsXS5wdXNoKHsgY29sLCByb3dzcGFuLCBjb2xzcGFuIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb2xzcGFuO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RmxhdExlYXZlcyhjb2x1bW5zOiBJQ29sdW1uRGF0YVtdKTogSUNvbHVtbkRhdGFbXSB7XG4gICAgcmV0dXJuIGNvbHVtbnMuZmxhdE1hcCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGbGF0TGVhdmVzKGNvbC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2NvbF07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXJWaXNpYmxlQ29sdW1ucyhjb2x1bW5zOiBJQ29sdW1uRGF0YVtdLCBzaG93ZWROYW1lczogc3RyaW5nW10pOiBJQ29sdW1uRGF0YVtdIHtcbiAgICByZXR1cm4gY29sdW1uc1xuICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgIGlmIChjb2wuY2hpbGRyZW4gJiYgY29sLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlQ2hpbGRyZW4gPSB0aGlzLl9maWx0ZXJWaXNpYmxlQ29sdW1ucyhjb2wuY2hpbGRyZW4sIHNob3dlZE5hbWVzKTtcbiAgICAgICAgICByZXR1cm4geyAuLi5jb2wsIGNoaWxkcmVuOiB2aXNpYmxlQ2hpbGRyZW4gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gc2hvd2VkTmFtZXMuaW5jbHVkZXMoY29sLm5hbWUpIHx8IChjb2wuY2hpbGRyZW4gJiYgY29sLmNoaWxkcmVuLmxlbmd0aCA+IDApKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE1heERlcHRoKGNvbHVtbnM6IElDb2x1bW5EYXRhW10pOiBudW1iZXIge1xuICAgIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEgKyBNYXRoLm1heCguLi5jb2x1bW5zLm1hcCgoYykgPT4gdGhpcy5fZ2V0TWF4RGVwdGgoYy5jaGlsZHJlbiB8fCBbXSkpKTtcbiAgfVxufVxuIiwiPHNlY3Rpb24gY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fc2VjdGlvblwiPlxuICA8dHVpLXNjcm9sbGJhciBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19zY3JvbGxhYmxlXCIgKHNjcm9sbGVuZCk9XCJzYXZlU2Nyb2xsRW5kUG9zaXRpb24oKVwiPlxuICAgIDx0dWktbG9hZGVyIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX2xvYWRlclwiIFtzaG93TG9hZGVyXT1cImlzTG9hZGluZygpIHx8IGZhbHNlXCIgW292ZXJsYXldPVwidHJ1ZVwiPlxuICAgICAgPHRhYmxlXG4gICAgICAgIHR1aVRhYmxlXG4gICAgICAgIGNsYXNzPVwidGFibGVcIlxuICAgICAgICBzdGlja3lSZWxhdGl2ZVxuICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zV2l0aENoZWNrYm94ZXMoKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJ0YWJsZVdpZHRoKClcIlxuICAgICAgICB0dWlTb3J0Qnk9XCJcIlxuICAgICAgICAoc29ydENoYW5nZSk9XCJzb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgQGZvciAoaHJvdyBvZiBoZWFkZXJSb3dzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHRyIHR1aVRoR3JvdXA+XG4gICAgICAgICAgICAgIEBpZiAoJGZpcnN0ICYmIGNoZWNrYm94Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgIHR1aVRoXG4gICAgICAgICAgICAgICAgICAqdHVpSGVhZD1cIkNIRUNLQk9YX1NFTEVDVE9SX0tFWVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX190aC1iYWNrZ3JvdW5kLS10YWJsZS1jZWxsLWJsdWUgcmVnaXN0ZXItdGFibGVfX2NlbGwtaWNvbiByZWdpc3Rlci10YWJsZV9fY2VsbC1jaGVja2JveC1zZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFhcIlxuICAgICAgICAgICAgICAgICAgW3NvcnRlcl09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dTcGFuXT1cIm1heERlcHRoKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcHJvYy1jaGVja2JveC1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRJZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRNYXhWYWx1ZV09XCJtYXhTZWxlY3RlZFJvd3MoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzU2VsZWN0bG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNoZWNrYm94RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkFwcGx5KT1cInNlbGVjdENoYW5nZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChjZWxsIG9mIGhyb3c7IHRyYWNrIGNlbGwuY29sLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBAbGV0IHRoQ2xhc3MgPSBjZWxsLmNvbC5jbGFzcyA/PyAnJztcbiAgICAgICAgICAgICAgICBAbGV0IHRoVHlwZSA9IGNlbGwuY29sLnR5cGU7XG4gICAgICAgICAgICAgICAgQGxldCB0aE5hbWUgPSBjZWxsLmNvbC5uYW1lO1xuICAgICAgICAgICAgICAgIEBsZXQgc29ydGFibGUgPSBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY2VsbC5jb2wpO1xuICAgICAgICAgICAgICAgIEBsZXQgcmVzaXplQmxvY2tlZCA9IGNoZWNrUmVzaXplQmxvY2tlZChjZWxsLmNvbCk7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgdHVpUmVzaXphYmxlXG4gICAgICAgICAgICAgICAgICAqdHVpSGVhZD1cInRoTmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ3JlZ2lzdGVyLXRhYmxlX190aCcsIHRoVHlwZSB8IGNsYXNzQnlUeXBlLCB0aENsYXNzXVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5TGVmdF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lMZWZ0SWRzKCkpXCJcbiAgICAgICAgICAgICAgICAgIFtzdGlja3lSaWdodF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lSaWdodElkcygpKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVzT25TdGlja3ldPVwic3RpY2t5VGhTdHlsZVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY2VsbC5jb2wuaGVhZGVyU3R5bGUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJnZXRUaFdpZHRoKHRoTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbdHVpU29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgW3NvcnRlcl09XCJzb3J0YWJsZSA/IHNldFRoTmFtZSh0aE5hbWUpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJjZWxsLmNvbC50b29sdGlwVGV4dCA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dTcGFuXT1cImNlbGwucm93c3BhblwiXG4gICAgICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjZWxsLmNvbHNwYW5cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIub3JkZXJdPVwiY29sdW1uT3JkZXJzLmdldCh0aE5hbWUpPy5vcHRpb25zPy5vcmRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjZWxsLmNvbC5pc0hlYWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IHRoUHJvamVjdGlvbiA9IGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUodGhOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRoUHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoUHJvamVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNlbGwuY29sLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKHRoVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuSUNPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1pY29uIGNsYXNzPVwicmVnaXN0ZXItdGFibGUtLWljb24tY29sb3JcIiBbaWNvbl09XCJjZWxsLmNvbC52YWx1ZSFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLklDT05fU1ZHKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY2VsbC5jb2wudmFsdWVcIiBbYWx0XT1cInRoTmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuVEVYVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjZWxsLmNvbC5zdmdTcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNlbGwuY29sLnN2Z1NyY1wiIFthbHRdPVwidGhOYW1lXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1vdmVyZmxvdy0tZWxsaXBzaXNcIiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5OVU0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1N0eWxlXT1cImNlbGwuY29sLnRleHRTdHlsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmNvbC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLkRBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1N0eWxlXT1cImNlbGwuY29sLnRleHRTdHlsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmNvbC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLkNIRUNLQk9YKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmNvbC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmICghcmVzaXplQmxvY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fY2VsbC1yZXNpemVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHVpUmVzaXplcl09XCJbMSwgMF1cIlxuICAgICAgICAgICAgICAgICAgICAgICh0dWlTaXplQ2hhbmdlKT1cInRoUmVzaXplQ2hhbmdlcyhjZWxsLmNvbC5uYW1lLCAkZXZlbnRbMF0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICBAbGV0IHJvd3MgPSByb3dEYXRhKCk7XG4gICAgICAgIDx0Ym9keSB0dWlUYm9keT5cbiAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LmlkKSB7XG4gICAgICAgICAgICBAbGV0IHN0YXRlID0gc3RhdGVPYmplY3RzPy4oKTtcbiAgICAgICAgICAgIEBsZXQgdHJTZWxlY3RlZCA9XG4gICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgPyBzdGF0ZS5nZXQocm93LmlkKT8uc3RhdGUgPT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgOiBzZWxlY3RlZElkcygpLmhhcyhyb3cuaWQpO1xuXG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgI2JvZHlSb3dcbiAgICAgICAgICAgICAgdHVpVHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fcm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInRyU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2hpZnQtcHJlc3NlZF09XCJtYXJrUm93QmVmb3JlU2VsZWN0KHJvdylcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvblJvd0hvdmVyKHJvdylcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvblJvd0hvdmVyKG51bGwpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgKGRibGNsaWNrKT1cInJvd0RibENsaWNrLmVtaXQocm93KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoY2hlY2tib3hDb2x1bW4oKSkge1xuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgdHVpVGRcbiAgICAgICAgICAgICAgICAgICp0dWlDZWxsPVwiQ0hFQ0tCT1hfU0VMRUNUT1JfS0VZXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX2NlbGwtY2hlY2tib3gtc2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0clNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNoZWNrYm94RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGZvciAoY29sdW1uRGF0YSBvZiBsZWF2ZXMoKTsgdHJhY2sgY29sdW1uRGF0YS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgQGxldCB0ZFR5cGUgPSBjb2x1bW5EYXRhLnR5cGU7XG4gICAgICAgICAgICAgICAgQGxldCB0ZEtleSA9IGNvbHVtbkRhdGEubmFtZTtcbiAgICAgICAgICAgICAgICBAbGV0IHRkVmFsdWUgPSByb3dbdGRLZXldO1xuICAgICAgICAgICAgICAgIEBsZXQgdGRDbGFzcyA9IGNvbHVtbkRhdGEuY2xhc3NUZCA/PyAnJztcblxuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgdHVpVGRcbiAgICAgICAgICAgICAgICAgICp0dWlDZWxsPVwidGRLZXlcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW3RkVHlwZSB8IGNsYXNzQnlUeXBlOiAndGQnLCB0ZENsYXNzXVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5TGVmdF09XCJ0ZEtleSB8IHN0aWNreUNvbHVtbjogc3RpY2t5TGVmdElkcygpXCJcbiAgICAgICAgICAgICAgICAgIFtzdGlja3lSaWdodF09XCJ0ZEtleSB8IHN0aWNreUNvbHVtbjogc3RpY2t5UmlnaHRJZHMoKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVzT25TdGlja3ldPVwic3RpY2t5VGRTdHlsZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb2x1bW5EYXRhLmlzVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgQGxldCB0ZFByb2plY3Rpb24gPSBnZXRQcm9qZWN0aW9uQ2VsbEJ5TmFtZSh0ZEtleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmICh0ZFByb2plY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZFByb2plY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0ZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1pY29uIGNsYXNzPVwicmVnaXN0ZXItdGFibGUtLWljb24tY29sb3JcIiBbaWNvbl09XCJjb2x1bW5EYXRhLnZhbHVlIVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuSUNPTl9TVkcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodGRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY29sdW1uRGF0YS52YWx1ZVwiIFthbHRdPVwidGRLZXlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLkNIRUNLQk9YKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiISF0ZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5URVhUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbdHVpSGludF09XCJ0ZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRkVmFsdWUgPz8gJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZFZhbHVlID8gY29sdW1uRGF0YS5wb3N0Zml4IDogJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5OVU0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRkVmFsdWUgPz8gJycgfCBudW1iZXI6IGNvbHVtbkRhdGEubnVtYmVyUGlwZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/IGNvbHVtbkRhdGEucG9zdGZpeCA6ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuREFURSkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRkVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm1hdERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRVRpbWV6b25lLlVUQ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2x1bW5EYXRhLmRhdGVQYXR0ZXJuID8/IEVEYXRlUGF0dGVybi5EQVRFX1RJTUVfV0lUSE9VVF9TRUNPTkRTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh0aW1lWm9uZUNoYW5nZXMkIHwgYXN5bmMpKSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRkVmFsdWUgPyBjb2x1bW5EYXRhLnBvc3RmaXggOiAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgPHRyIGNsYXNzPVwiZW1wdHktbGF5ZXJcIj5cbiAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDAlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlcmVkLXRleHRcIj57eyBlbXB0eVRleHQoKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvdHVpLWxvYWRlcj5cbiAgPC90dWktc2Nyb2xsYmFyPlxuXG4gIDxzcHJvYy1wYWdpbmF0b3JcbiAgICBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19wYWdpbmF0b3JcIlxuICAgIFtwYWdlXT1cInBhZ2UoKVwiXG4gICAgW3Jvd3NdPVwibGltaXQoKVwiXG4gICAgW3BhZ2VMaW5rU2l6ZV09XCIxXCJcbiAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICBbdG90YWxOb3RGaWx0ZXJlZF09XCJ0b3RhbE5vdEZpbHRlcmVkKClcIlxuICAgIFtyb3dzQ291bnRPcHRpb25zXT1cIlszMCwgNDAsIDUwXVwiXG4gICAgW3NlbGVjdGVkQ291bnRlcl09XCJzZWxlY3RlZENvdW50ZXIoKVwiXG4gICAgKHBhZ2luYXRvckNoYW5nZSk9XCJwYWdpbmF0b3JDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5hdG9yRGlzYWJsZWQoKVwiXG4gICAgW2lzTG9hZGluZ109XCJpc1BhZ2luYXRvckxvYWRpbmcoKVwiXG4gIC8+XG48L3NlY3Rpb24+XG4iXX0=