@onecx/angular-accelerator 5.37.0 → 6.0.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/de.json +3 -3
- package/assets/i18n/en.json +3 -3
- package/assets/i18n/primeng/de.json +1 -1
- package/assets/i18n/primeng/en.json +1 -1
- package/assets/styles.scss +0 -4
- package/fesm2022/onecx-angular-accelerator-testing.mjs +90 -28
- package/fesm2022/onecx-angular-accelerator-testing.mjs.map +1 -1
- package/fesm2022/onecx-angular-accelerator.mjs +777 -398
- package/fesm2022/onecx-angular-accelerator.mjs.map +1 -1
- package/index.d.ts +8 -0
- package/lib/angular-accelerator-primeng.module.d.ts +6 -4
- package/lib/angular-accelerator.module.d.ts +26 -20
- package/lib/components/content/content.component.d.ts +13 -0
- package/lib/components/content-container/content-container.component.d.ts +19 -0
- package/lib/components/custom-group-column-selector/custom-group-column-selector.component.d.ts +0 -2
- package/lib/components/data-list-grid/data-list-grid.component.d.ts +9 -19
- package/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.d.ts +2 -2
- package/lib/components/data-table/data-table.component.d.ts +8 -18
- package/lib/components/data-view/data-view.component.d.ts +10 -8
- package/lib/components/diagram/diagram.component.d.ts +0 -2
- package/lib/components/filter-view/filter-view.component.d.ts +2 -2
- package/lib/components/group-by-count-diagram/group-by-count-diagram.component.d.ts +0 -2
- package/lib/components/interactive-data-view/interactive-data-view.component.d.ts +10 -6
- package/lib/components/lifecycle/lifecycle.component.d.ts +12 -0
- package/lib/components/page-header/page-header.component.d.ts +1 -4
- package/lib/components/search-header/search-header.component.d.ts +3 -4
- package/lib/directives/advanced.directive.d.ts +5 -6
- package/lib/directives/content-container.directive.d.ts +23 -0
- package/lib/directives/content.directive.d.ts +21 -0
- package/lib/directives/if-breakpoint.directive.d.ts +3 -4
- package/lib/directives/if-permission.directive.d.ts +6 -8
- package/lib/directives/src.directive.d.ts +2 -3
- package/lib/directives/template.directive.d.ts +9 -0
- package/lib/directives/tooltipOnOverflow.directive.d.ts +2 -3
- package/lib/model/filter.model.d.ts +16 -4
- package/lib/pipes/dynamic.pipe.d.ts +2 -2
- package/lib/pipes/ocxtimeago.pipe.d.ts +3 -3
- package/lib/services/breadcrumb.service.d.ts +2 -4
- package/lib/services/translation-connection.service.d.ts +10 -0
- package/lib/utils/criteria.utils.d.ts +3 -3
- package/lib/utils/data-operation-strategy.d.ts +20 -0
- package/lib/utils/dateutils.d.ts +0 -1
- package/lib/utils/provide-connection-service.d.ts +6 -0
- package/migrations.json +26 -0
- package/package.json +21 -20
- package/testing/column-group-selection.harness.d.ts +2 -2
- package/testing/content-container.harness.d.ts +7 -0
- package/testing/content.harness.d.ts +10 -0
- package/testing/data-layout-selection.harness.d.ts +7 -6
- package/testing/index.d.ts +3 -0
- package/testing/interactive-data-view.harness.d.ts +5 -3
- package/testing/lifecycle.harness.d.ts +6 -0
- package/esm2022/index.mjs +0 -63
- package/esm2022/lib/angular-accelerator-primeng.module.mjs +0 -146
- package/esm2022/lib/angular-accelerator.module.mjs +0 -209
- package/esm2022/lib/components/column-group-selection/column-group-selection.component.mjs +0 -90
- package/esm2022/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +0 -184
- package/esm2022/lib/components/data-layout-selection/data-layout-selection.component.mjs +0 -73
- package/esm2022/lib/components/data-list-grid/data-list-grid.component.mjs +0 -615
- package/esm2022/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +0 -107
- package/esm2022/lib/components/data-loading-error/data-loading-error.component.mjs +0 -28
- package/esm2022/lib/components/data-sort-base/data-sort-base.mjs +0 -134
- package/esm2022/lib/components/data-table/data-table.component.mjs +0 -840
- package/esm2022/lib/components/data-view/data-view.component.mjs +0 -672
- package/esm2022/lib/components/diagram/diagram.component.mjs +0 -183
- package/esm2022/lib/components/filter-view/filter-view.component.mjs +0 -263
- package/esm2022/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +0 -133
- package/esm2022/lib/components/interactive-data-view/interactive-data-view.component.mjs +0 -724
- package/esm2022/lib/components/page-header/page-header.component.mjs +0 -238
- package/esm2022/lib/components/search-header/search-header.component.mjs +0 -199
- package/esm2022/lib/directives/advanced.directive.mjs +0 -36
- package/esm2022/lib/directives/if-breakpoint.directive.mjs +0 -47
- package/esm2022/lib/directives/if-permission.directive.mjs +0 -95
- package/esm2022/lib/directives/src.directive.mjs +0 -65
- package/esm2022/lib/directives/tooltipOnOverflow.directive.mjs +0 -48
- package/esm2022/lib/functions/at-least-one-field-filled-validator.mjs +0 -7
- package/esm2022/lib/functions/flatten-object.mjs +0 -20
- package/esm2022/lib/injection-tokens/has-permission-checker.mjs +0 -10
- package/esm2022/lib/model/breadcrumb-menu-item.model.mjs +0 -2
- package/esm2022/lib/model/column-type.model.mjs +0 -16
- package/esm2022/lib/model/data-action.mjs +0 -2
- package/esm2022/lib/model/data-column-name-id.model.mjs +0 -2
- package/esm2022/lib/model/data-sort-direction.mjs +0 -2
- package/esm2022/lib/model/data-table-column.model.mjs +0 -2
- package/esm2022/lib/model/diagram-column.mjs +0 -2
- package/esm2022/lib/model/diagram-data.mjs +0 -2
- package/esm2022/lib/model/diagram-type.mjs +0 -2
- package/esm2022/lib/model/filter.model.mjs +0 -6
- package/esm2022/lib/pipes/dynamic.pipe.mjs +0 -58
- package/esm2022/lib/pipes/ocxtimeago.pipe.mjs +0 -107
- package/esm2022/lib/services/breadcrumb.service.mjs +0 -128
- package/esm2022/lib/services/translation-cache.service.mjs +0 -44
- package/esm2022/lib/utils/async-translate-loader.utils.mjs +0 -15
- package/esm2022/lib/utils/caching-translate-loader.utils.mjs +0 -18
- package/esm2022/lib/utils/colorutils.mjs +0 -19
- package/esm2022/lib/utils/create-remote-component-and-mfe-translate-loader.utils.mjs +0 -12
- package/esm2022/lib/utils/create-remote-component-translate-loader.utils.mjs +0 -25
- package/esm2022/lib/utils/create-translate-loader.utils.mjs +0 -30
- package/esm2022/lib/utils/criteria.utils.mjs +0 -28
- package/esm2022/lib/utils/dateutils.mjs +0 -38
- package/esm2022/lib/utils/dynamic-locale-id.mjs +0 -21
- package/esm2022/lib/utils/enum-to-dropdown-options.utils.mjs +0 -8
- package/esm2022/lib/utils/filter.utils.mjs +0 -6
- package/esm2022/lib/utils/objectutils.mjs +0 -30
- package/esm2022/lib/utils/primeicon.utils.mjs +0 -2
- package/esm2022/lib/utils/rxjs-utils.mjs +0 -13
- package/esm2022/lib/utils/string-and-array-helper-functions.utils.mjs +0 -22
- package/esm2022/lib/utils/template.utils.mjs +0 -11
- package/esm2022/lib/utils/translate.combined.loader.mjs +0 -42
- package/esm2022/onecx-angular-accelerator.mjs +0 -5
- package/esm2022/testing/column-group-selection.harness.mjs +0 -10
- package/esm2022/testing/custom-group-column-selector.harness.mjs +0 -31
- package/esm2022/testing/data-layout-selection.harness.mjs +0 -32
- package/esm2022/testing/data-list-grid.harness.mjs +0 -51
- package/esm2022/testing/data-table.harness.mjs +0 -69
- package/esm2022/testing/data-view.harness.mjs +0 -12
- package/esm2022/testing/default-grid-item.harness.mjs +0 -24
- package/esm2022/testing/default-list-item.harness.mjs +0 -26
- package/esm2022/testing/diagram.harness.mjs +0 -22
- package/esm2022/testing/filter-view.harness.mjs +0 -18
- package/esm2022/testing/group-by-count-diagram.harness.mjs +0 -10
- package/esm2022/testing/index.mjs +0 -23
- package/esm2022/testing/interactive-data-view.harness.mjs +0 -21
- package/esm2022/testing/more-actions-menu-button.harness.mjs +0 -35
- package/esm2022/testing/onecx-angular-accelerator-testing.mjs +0 -5
- package/esm2022/testing/page-header.harness.mjs +0 -81
- package/esm2022/testing/search-header.harness.mjs +0 -36
- package/esm2022/testing/slot.harness.mjs +0 -5
|
@@ -1,840 +0,0 @@
|
|
|
1
|
-
import { formatDate } from '@angular/common';
|
|
2
|
-
import { Component, ContentChild, ContentChildren, EventEmitter, Inject, Injector, Input, LOCALE_ID, Output, ViewChildren, } from '@angular/core';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { isValidDate } from '@onecx/accelerator';
|
|
6
|
-
import { UserService } from '@onecx/angular-integration-interface';
|
|
7
|
-
import { PrimeTemplate } from 'primeng/api';
|
|
8
|
-
import { BehaviorSubject, combineLatest, debounceTime, filter, first, map, mergeMap, of, withLatestFrom, } from 'rxjs';
|
|
9
|
-
import { ColumnType } from '../../model/column-type.model';
|
|
10
|
-
import { FilterType } from '../../model/filter.model';
|
|
11
|
-
import { ObjectUtils } from '../../utils/objectutils';
|
|
12
|
-
import { findTemplate } from '../../utils/template.utils';
|
|
13
|
-
import { DataSortBase } from '../data-sort-base/data-sort-base';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@ngx-translate/core";
|
|
16
|
-
import * as i2 from "@angular/router";
|
|
17
|
-
import * as i3 from "@onecx/angular-integration-interface";
|
|
18
|
-
import * as i4 from "@angular/common";
|
|
19
|
-
import * as i5 from "primeng/tooltip";
|
|
20
|
-
import * as i6 from "primeng/api";
|
|
21
|
-
import * as i7 from "primeng/checkbox";
|
|
22
|
-
import * as i8 from "primeng/button";
|
|
23
|
-
import * as i9 from "primeng/table";
|
|
24
|
-
import * as i10 from "primeng/menu";
|
|
25
|
-
import * as i11 from "primeng/multiselect";
|
|
26
|
-
import * as i12 from "primeng/skeleton";
|
|
27
|
-
import * as i13 from "@angular/forms";
|
|
28
|
-
import * as i14 from "../../directives/if-permission.directive";
|
|
29
|
-
import * as i15 from "../../pipes/ocxtimeago.pipe";
|
|
30
|
-
export var TemplateType;
|
|
31
|
-
(function (TemplateType) {
|
|
32
|
-
TemplateType["CELL"] = "CELL";
|
|
33
|
-
TemplateType["FILTERCELL"] = "FILTERCELL";
|
|
34
|
-
})(TemplateType || (TemplateType = {}));
|
|
35
|
-
export class DataTableComponent extends DataSortBase {
|
|
36
|
-
get rows() {
|
|
37
|
-
return this._rows$.getValue();
|
|
38
|
-
}
|
|
39
|
-
set rows(value) {
|
|
40
|
-
!this._rows$.getValue().length ?? this.resetPage();
|
|
41
|
-
this._rows$.next(value);
|
|
42
|
-
}
|
|
43
|
-
set selectedRows(value) {
|
|
44
|
-
this._selectionIds$.next(value.map((row) => {
|
|
45
|
-
if (typeof row === 'object') {
|
|
46
|
-
return row.id;
|
|
47
|
-
}
|
|
48
|
-
return row;
|
|
49
|
-
}));
|
|
50
|
-
}
|
|
51
|
-
get filters() {
|
|
52
|
-
return this._filters$.getValue();
|
|
53
|
-
}
|
|
54
|
-
set filters(value) {
|
|
55
|
-
!this._filters$.getValue().length ?? this.resetPage();
|
|
56
|
-
this._filters$.next(value);
|
|
57
|
-
}
|
|
58
|
-
get sortDirection() {
|
|
59
|
-
return this._sortDirection$.getValue();
|
|
60
|
-
}
|
|
61
|
-
set sortDirection(value) {
|
|
62
|
-
this._sortDirection$.next(value);
|
|
63
|
-
}
|
|
64
|
-
get sortColumn() {
|
|
65
|
-
return this?._sortColumn$.getValue();
|
|
66
|
-
}
|
|
67
|
-
set sortColumn(value) {
|
|
68
|
-
this?._sortColumn$.next(value);
|
|
69
|
-
}
|
|
70
|
-
get columns() {
|
|
71
|
-
return this._columns$.getValue();
|
|
72
|
-
}
|
|
73
|
-
set columns(value) {
|
|
74
|
-
this._columns$.next(value);
|
|
75
|
-
const obs = value.map((c) => this.getTemplate(c, TemplateType.CELL));
|
|
76
|
-
const filterObs = value.map((c) => this.getTemplate(c, TemplateType.FILTERCELL));
|
|
77
|
-
this.columnTemplates$ = combineLatest(obs).pipe(map((values) => Object.fromEntries(value.map((c, i) => [c.id, values[i]]))), debounceTime(50));
|
|
78
|
-
this.columnFilterTemplates$ = combineLatest(filterObs).pipe(map((values) => Object.fromEntries(value.map((c, i) => [c.id, values[i]]))));
|
|
79
|
-
}
|
|
80
|
-
get pageSizes() {
|
|
81
|
-
return this._pageSizes$.getValue();
|
|
82
|
-
}
|
|
83
|
-
set pageSizes(value) {
|
|
84
|
-
this._pageSizes$.next(value);
|
|
85
|
-
}
|
|
86
|
-
get pageSize() {
|
|
87
|
-
return this._pageSize$.getValue();
|
|
88
|
-
}
|
|
89
|
-
set pageSize(value) {
|
|
90
|
-
this._pageSize$.next(value);
|
|
91
|
-
}
|
|
92
|
-
set showAllOption(value) {
|
|
93
|
-
this._showAllOption$.next(value);
|
|
94
|
-
}
|
|
95
|
-
get totalRecordsOnServer() {
|
|
96
|
-
return this.params['totalRecordsOnServer'] ? Number(this.params['totalRecordsOnServer']) : undefined;
|
|
97
|
-
}
|
|
98
|
-
set totalRecordsOnServer(value) {
|
|
99
|
-
this.params['totalRecordsOnServer'] = value?.toString() ?? '0';
|
|
100
|
-
}
|
|
101
|
-
get _stringCell() {
|
|
102
|
-
return this.stringCellTemplate || this.stringCellChildTemplate;
|
|
103
|
-
}
|
|
104
|
-
get _numberCell() {
|
|
105
|
-
return this.numberCellTemplate || this.numberCellChildTemplate;
|
|
106
|
-
}
|
|
107
|
-
get _customCell() {
|
|
108
|
-
return this.customCellTemplate || this.customCellChildTemplate;
|
|
109
|
-
}
|
|
110
|
-
get _dateCell() {
|
|
111
|
-
return this.dateCellTemplate || this.dateCellChildTemplate;
|
|
112
|
-
}
|
|
113
|
-
get _relativeDateCell() {
|
|
114
|
-
return this.relativeDateCellTemplate || this.relativeDateCellChildTemplate;
|
|
115
|
-
}
|
|
116
|
-
get _cell() {
|
|
117
|
-
return this.cellTemplate || this.cellChildTemplate;
|
|
118
|
-
}
|
|
119
|
-
get _translationKeyCell() {
|
|
120
|
-
return this.translationKeyCellTemplate || this.translationKeyCellChildTemplate;
|
|
121
|
-
}
|
|
122
|
-
get _stringFilterCell() {
|
|
123
|
-
return this.stringFilterCellTemplate || this.stringFilterCellChildTemplate;
|
|
124
|
-
}
|
|
125
|
-
get _numberFilterCell() {
|
|
126
|
-
return this.numberFilterCellTemplate || this.numberFilterCellChildTemplate;
|
|
127
|
-
}
|
|
128
|
-
get _customFilterCell() {
|
|
129
|
-
return this.customFilterCellTemplate || this.customFilterCellChildTemplate;
|
|
130
|
-
}
|
|
131
|
-
get _dateFilterCell() {
|
|
132
|
-
return this.dateFilterCellTemplate || this.dateFilterCellChildTemplate;
|
|
133
|
-
}
|
|
134
|
-
get _relativeDateFilterCell() {
|
|
135
|
-
return this.relativeDateFilterCellTemplate || this.relativeDateFilterCellChildTemplate;
|
|
136
|
-
}
|
|
137
|
-
get _filterCell() {
|
|
138
|
-
return this.filterCellTemplate || this.filterCellChildTemplate;
|
|
139
|
-
}
|
|
140
|
-
get _translationKeyFilterCell() {
|
|
141
|
-
return this.translationKeyFilterCellTemplate || this.translationKeyFilterCellChildTemplate;
|
|
142
|
-
}
|
|
143
|
-
get additionalActions() {
|
|
144
|
-
return this._additionalActions$.getValue();
|
|
145
|
-
}
|
|
146
|
-
set additionalActions(value) {
|
|
147
|
-
this._additionalActions$.next(value);
|
|
148
|
-
}
|
|
149
|
-
set templates(value) {
|
|
150
|
-
this.templates$.next(value);
|
|
151
|
-
}
|
|
152
|
-
set viewTemplates(value) {
|
|
153
|
-
this.viewTemplates$.next(value);
|
|
154
|
-
}
|
|
155
|
-
set parentTemplates(value) {
|
|
156
|
-
this.parentTemplates$.next(value);
|
|
157
|
-
}
|
|
158
|
-
get viewTableRowObserved() {
|
|
159
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
160
|
-
return dv?.viewItemObserved || dv?.viewItem.observed || this.viewTableRow.observed;
|
|
161
|
-
}
|
|
162
|
-
get editTableRowObserved() {
|
|
163
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
164
|
-
return dv?.editItemObserved || dv?.editItem.observed || this.editTableRow.observed;
|
|
165
|
-
}
|
|
166
|
-
get deleteTableRowObserved() {
|
|
167
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
168
|
-
return dv?.deleteItemObserved || dv?.deleteItem.observed || this.deleteTableRow.observed;
|
|
169
|
-
}
|
|
170
|
-
get anyRowActionObserved() {
|
|
171
|
-
return this.viewTableRowObserved || this.editTableRowObserved || this.deleteTableRowObserved;
|
|
172
|
-
}
|
|
173
|
-
get selectionChangedObserved() {
|
|
174
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
175
|
-
return dv?.selectionChangedObserved || dv?.selectionChanged.observed || this.selectionChanged.observed;
|
|
176
|
-
}
|
|
177
|
-
constructor(locale, translateService, router, injector, userService) {
|
|
178
|
-
super(locale, translateService);
|
|
179
|
-
this.router = router;
|
|
180
|
-
this.injector = injector;
|
|
181
|
-
this.userService = userService;
|
|
182
|
-
this.FilterType = FilterType;
|
|
183
|
-
this.TemplateType = TemplateType;
|
|
184
|
-
this.checked = true;
|
|
185
|
-
this._rows$ = new BehaviorSubject([]);
|
|
186
|
-
this._selectionIds$ = new BehaviorSubject([]);
|
|
187
|
-
this._filters$ = new BehaviorSubject([]);
|
|
188
|
-
this._sortDirection$ = new BehaviorSubject("NONE" /* DataSortDirection.NONE */);
|
|
189
|
-
this._sortColumn$ = new BehaviorSubject('');
|
|
190
|
-
this._columns$ = new BehaviorSubject([]);
|
|
191
|
-
this.clientSideFiltering = true;
|
|
192
|
-
this.clientSideSorting = true;
|
|
193
|
-
this.sortStates = ["ASCENDING" /* DataSortDirection.ASCENDING */, "DESCENDING" /* DataSortDirection.DESCENDING */];
|
|
194
|
-
this._pageSizes$ = new BehaviorSubject([10, 25, 50]);
|
|
195
|
-
this._pageSize$ = new BehaviorSubject(undefined);
|
|
196
|
-
this._showAllOption$ = new BehaviorSubject(false);
|
|
197
|
-
this.name = '';
|
|
198
|
-
this.allowSelectAll = true;
|
|
199
|
-
this.paginator = true;
|
|
200
|
-
this.page = 0;
|
|
201
|
-
this.currentPageShowingKey = 'OCX_DATA_TABLE.SHOWING';
|
|
202
|
-
this.currentPageShowingWithTotalOnServerKey = 'OCX_DATA_TABLE.SHOWING_WITH_TOTAL_ON_SERVER';
|
|
203
|
-
this.params = {
|
|
204
|
-
currentPage: '{currentPage}',
|
|
205
|
-
totalPages: '{totalPages}',
|
|
206
|
-
rows: '{rows}',
|
|
207
|
-
first: '{first}',
|
|
208
|
-
last: '{last}',
|
|
209
|
-
totalRecords: '{totalRecords}',
|
|
210
|
-
};
|
|
211
|
-
this._additionalActions$ = new BehaviorSubject([]);
|
|
212
|
-
this.frozenActionColumn = false;
|
|
213
|
-
this.actionColumnPosition = 'right';
|
|
214
|
-
this.filtered = new EventEmitter();
|
|
215
|
-
this.sorted = new EventEmitter();
|
|
216
|
-
this.viewTableRow = new EventEmitter();
|
|
217
|
-
this.editTableRow = new EventEmitter();
|
|
218
|
-
this.deleteTableRow = new EventEmitter();
|
|
219
|
-
this.selectionChanged = new EventEmitter();
|
|
220
|
-
this.pageChanged = new EventEmitter();
|
|
221
|
-
this.pageSizeChanged = new EventEmitter();
|
|
222
|
-
this.componentStateChanged = new EventEmitter();
|
|
223
|
-
this.currentFilterColumn$ = new BehaviorSubject(null);
|
|
224
|
-
this.truthyFilterOptions = [
|
|
225
|
-
{
|
|
226
|
-
key: 'OCX_DATA_TABLE.FILTER_YES',
|
|
227
|
-
value: true,
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
key: 'OCX_DATA_TABLE.FILTER_NO',
|
|
231
|
-
value: false,
|
|
232
|
-
},
|
|
233
|
-
];
|
|
234
|
-
this.currentMenuRow$ = new BehaviorSubject(null);
|
|
235
|
-
this.templates$ = new BehaviorSubject(undefined);
|
|
236
|
-
this.viewTemplates$ = new BehaviorSubject(undefined);
|
|
237
|
-
this.parentTemplates$ = new BehaviorSubject(undefined);
|
|
238
|
-
this.templatesObservables = {};
|
|
239
|
-
this.cellTemplatesData = {
|
|
240
|
-
templatesObservables: {},
|
|
241
|
-
idSuffix: ['IdTableCell', 'IdCell'],
|
|
242
|
-
templateNames: {
|
|
243
|
-
[ColumnType.DATE]: ['dateCell', 'dateTableCell', 'defaultDateCell'],
|
|
244
|
-
[ColumnType.NUMBER]: ['numberCell', 'numberTableCell', 'defaultNumberCell'],
|
|
245
|
-
[ColumnType.RELATIVE_DATE]: ['relativeDateCell', 'relativeDateTableCell', 'defaultRelativeDateCell'],
|
|
246
|
-
[ColumnType.TRANSLATION_KEY]: ['translationKeyCell', 'translationKeyTableCell', 'defaultTranslationKeyCell'],
|
|
247
|
-
[ColumnType.CUSTOM]: ['customCell', 'customTableCell', 'defaultCustomCell'],
|
|
248
|
-
[ColumnType.STRING]: ['stringCell', 'stringTableCell', 'defaultStringCell'],
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
this.filterTemplatesData = {
|
|
252
|
-
templatesObservables: {},
|
|
253
|
-
idSuffix: ['IdTableFilterCell', 'IdFilterCell', 'IdTableCell', 'IdCell'],
|
|
254
|
-
templateNames: {
|
|
255
|
-
[ColumnType.DATE]: ['dateFilterCell', 'dateTableFilterCell', 'dateCell', 'dateTableCell', 'defaultDateCell'],
|
|
256
|
-
[ColumnType.NUMBER]: [
|
|
257
|
-
'numberFilterCell',
|
|
258
|
-
'numberTableFilterCell',
|
|
259
|
-
'numberCell',
|
|
260
|
-
'numberTableCell',
|
|
261
|
-
'defaultNumberCell',
|
|
262
|
-
],
|
|
263
|
-
[ColumnType.RELATIVE_DATE]: [
|
|
264
|
-
'relativeDateFilterCell',
|
|
265
|
-
'relativeDateTableFilterCell',
|
|
266
|
-
'relativeDateCell',
|
|
267
|
-
'relativeDateTableCell',
|
|
268
|
-
'defaultRelativeDateCell',
|
|
269
|
-
],
|
|
270
|
-
[ColumnType.TRANSLATION_KEY]: [
|
|
271
|
-
'translationKeyFilterCell',
|
|
272
|
-
'translationKeyTableFilterCell',
|
|
273
|
-
'defaultTranslationKeyCell',
|
|
274
|
-
'translationKeyCell',
|
|
275
|
-
'translationKeyTableCell',
|
|
276
|
-
],
|
|
277
|
-
[ColumnType.CUSTOM]: [
|
|
278
|
-
'customFilterCell',
|
|
279
|
-
'customTableFilterCell',
|
|
280
|
-
'customCell',
|
|
281
|
-
'customTableCell',
|
|
282
|
-
'defaultCustomCell',
|
|
283
|
-
],
|
|
284
|
-
[ColumnType.STRING]: [
|
|
285
|
-
'stringFilterCell',
|
|
286
|
-
'stringTableFilterCell',
|
|
287
|
-
'stringCell',
|
|
288
|
-
'stringTableCell',
|
|
289
|
-
'defaultStringCell',
|
|
290
|
-
],
|
|
291
|
-
},
|
|
292
|
-
};
|
|
293
|
-
this.templatesDataMap = {
|
|
294
|
-
[TemplateType.CELL]: this.cellTemplatesData,
|
|
295
|
-
[TemplateType.FILTERCELL]: this.filterTemplatesData,
|
|
296
|
-
};
|
|
297
|
-
this.name = this.name || this.router.url.replace(/[^A-Za-z0-9]/, '_');
|
|
298
|
-
this.displayedPageSizes$ = combineLatest([
|
|
299
|
-
this._pageSizes$,
|
|
300
|
-
this.translateService.get('OCX_DATA_TABLE.ALL'),
|
|
301
|
-
this._showAllOption$,
|
|
302
|
-
]).pipe(map(([pageSizes, translation, showAllOption]) => showAllOption ? pageSizes.concat({ showAll: translation }) : pageSizes));
|
|
303
|
-
this.displayedPageSize$ = combineLatest([this._pageSize$, this._pageSizes$]).pipe(map(([pageSize, pageSizes]) => pageSize ?? pageSizes.find((val) => typeof val === 'number') ?? 50));
|
|
304
|
-
this.overflowActions$ = this._additionalActions$.pipe(map((actions) => actions.filter((action) => action.showAsOverflow)));
|
|
305
|
-
this.inlineActions$ = this._additionalActions$.pipe(map((actions) => actions.filter((action) => !action.showAsOverflow)));
|
|
306
|
-
this.overflowMenuItems$ = combineLatest([this.overflowActions$, this.currentMenuRow$]).pipe(mergeMap(([actions, row]) => this.translateService.get([...actions.map((a) => a.labelKey || '')]).pipe(map((translations) => {
|
|
307
|
-
return actions
|
|
308
|
-
.filter((a) => this.userService.hasPermission(a.permission))
|
|
309
|
-
.map((a) => ({
|
|
310
|
-
label: translations[a.labelKey || ''],
|
|
311
|
-
icon: a.icon,
|
|
312
|
-
styleClass: (a.classes || []).join(' '),
|
|
313
|
-
disabled: a.disabled || (!!a.actionEnabledField && !this.fieldIsTruthy(row, a.actionEnabledField)),
|
|
314
|
-
visible: !a.actionVisibleField || this.fieldIsTruthy(row, a.actionVisibleField),
|
|
315
|
-
command: () => a.callback(row),
|
|
316
|
-
}));
|
|
317
|
-
}))));
|
|
318
|
-
this.rowSelectable = this.rowSelectable.bind(this);
|
|
319
|
-
}
|
|
320
|
-
ngOnInit() {
|
|
321
|
-
this.displayedRows$ = combineLatest([this._rows$, this._filters$, this._sortColumn$, this._sortDirection$]).pipe(mergeMap((params) => this.translateItems(params, this.columns, this.clientSideFiltering, this.clientSideSorting)), map((params) => this.filterItems(params, this.clientSideFiltering)), map((params) => this.sortItems(params, this.columns, this.clientSideSorting)), map(([rows]) => this.flattenItems(rows)));
|
|
322
|
-
this.currentTruthySelectedFilters$ = combineLatest([this._filters$, this.currentFilterColumn$]).pipe(map(([filters, currentFilterColumn]) => {
|
|
323
|
-
return filters
|
|
324
|
-
.filter((filter) => filter.columnId === currentFilterColumn?.id && currentFilterColumn.filterType === FilterType.TRUTHY)
|
|
325
|
-
.map((filter) => filter.value);
|
|
326
|
-
}));
|
|
327
|
-
this.currentEqualSelectedFilters$ = combineLatest([this._filters$, this.currentFilterColumn$]).pipe(map(([filters, currentFilterColumn]) => {
|
|
328
|
-
return filters
|
|
329
|
-
.filter((filter) => filter.columnId === currentFilterColumn?.id &&
|
|
330
|
-
(!currentFilterColumn.filterType || currentFilterColumn.filterType === FilterType.EQUAL))
|
|
331
|
-
.map((filter) => filter.value);
|
|
332
|
-
}));
|
|
333
|
-
this.currentEqualFilterOptions$ = combineLatest([this._rows$, this.currentFilterColumn$, this._filters$]).pipe(filter(([_, currentFilterColumn, __]) => !currentFilterColumn?.filterType || currentFilterColumn.filterType === FilterType.EQUAL), mergeMap(([rows, currentFilterColumn, filters]) => {
|
|
334
|
-
if (!currentFilterColumn?.id) {
|
|
335
|
-
return of({ options: [], column: undefined });
|
|
336
|
-
}
|
|
337
|
-
const currentFilters = filters
|
|
338
|
-
.filter((filter) => filter.columnId === currentFilterColumn?.id &&
|
|
339
|
-
(!currentFilterColumn.filterType || currentFilterColumn.filterType === FilterType.EQUAL))
|
|
340
|
-
.map((filter) => filter.value);
|
|
341
|
-
const columnValues = rows.map((row) => row[currentFilterColumn?.id]);
|
|
342
|
-
if (currentFilterColumn.columnType === ColumnType.DATE) {
|
|
343
|
-
return of({
|
|
344
|
-
options: columnValues.map((c) => ({
|
|
345
|
-
label: c,
|
|
346
|
-
value: c,
|
|
347
|
-
toFilterBy: formatDate(`${c}`, currentFilterColumn.dateFormat ?? 'medium', this.locale),
|
|
348
|
-
})),
|
|
349
|
-
column: currentFilterColumn,
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
const translateObservable = this.columns.find((c) => c.id === currentFilterColumn?.id)?.columnType === ColumnType.TRANSLATION_KEY
|
|
353
|
-
? this.translateColumnValues(columnValues)
|
|
354
|
-
: of(Object.fromEntries(columnValues.map((cv) => [cv, cv])));
|
|
355
|
-
return translateObservable.pipe(map((translatedValues) => {
|
|
356
|
-
return Object.values(translatedValues)
|
|
357
|
-
.concat(currentFilters)
|
|
358
|
-
.filter((value, index, self) => self.indexOf(value) === index && value != null)
|
|
359
|
-
.map((filterOption) => ({
|
|
360
|
-
label: filterOption,
|
|
361
|
-
value: filterOption,
|
|
362
|
-
toFilterBy: filterOption
|
|
363
|
-
}));
|
|
364
|
-
}), map((options) => {
|
|
365
|
-
return {
|
|
366
|
-
options: options,
|
|
367
|
-
column: currentFilterColumn,
|
|
368
|
-
};
|
|
369
|
-
}));
|
|
370
|
-
}));
|
|
371
|
-
this.filterAmounts$ = this._filters$.pipe(map((filters) => filters
|
|
372
|
-
.map((filter) => filter.columnId)
|
|
373
|
-
.map((columnId) => [columnId, filters.filter((filter) => filter.columnId === columnId).length])), map((amounts) => Object.fromEntries(amounts)));
|
|
374
|
-
this.mapSelectionToRows();
|
|
375
|
-
this.emitComponentStateChanged();
|
|
376
|
-
}
|
|
377
|
-
translateColumnValues(columnValues) {
|
|
378
|
-
return columnValues.length ? this.translateService.get(columnValues) : of({});
|
|
379
|
-
}
|
|
380
|
-
emitComponentStateChanged(state = {}) {
|
|
381
|
-
this.displayedPageSize$
|
|
382
|
-
.pipe(withLatestFrom(this._selectionIds$, this._rows$), first())
|
|
383
|
-
.subscribe(([pageSize, selectedIds, rows]) => {
|
|
384
|
-
this.componentStateChanged.emit({
|
|
385
|
-
filters: this.filters,
|
|
386
|
-
sorting: {
|
|
387
|
-
sortColumn: this.sortColumn,
|
|
388
|
-
sortDirection: this.sortDirection,
|
|
389
|
-
},
|
|
390
|
-
pageSize,
|
|
391
|
-
activePage: this.page,
|
|
392
|
-
selectedRows: rows.filter((row) => selectedIds.includes(row.id)),
|
|
393
|
-
...state,
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
ngAfterContentInit() {
|
|
398
|
-
this.templates$.value?.forEach((item) => {
|
|
399
|
-
switch (item.getType()) {
|
|
400
|
-
case 'stringCell':
|
|
401
|
-
this.stringCellChildTemplate = item.template;
|
|
402
|
-
break;
|
|
403
|
-
case 'numberCell':
|
|
404
|
-
this.numberCellChildTemplate = item.template;
|
|
405
|
-
break;
|
|
406
|
-
case 'customCell':
|
|
407
|
-
this.customCellChildTemplate = item.template;
|
|
408
|
-
break;
|
|
409
|
-
case 'dateCell':
|
|
410
|
-
this.dateCellChildTemplate = item.template;
|
|
411
|
-
break;
|
|
412
|
-
case 'relativeDateCell':
|
|
413
|
-
this.relativeDateCellChildTemplate = item.template;
|
|
414
|
-
break;
|
|
415
|
-
case 'cellTemplate':
|
|
416
|
-
this.cellChildTemplate = item.template;
|
|
417
|
-
break;
|
|
418
|
-
case 'translationKeyCell':
|
|
419
|
-
this.translationKeyCellChildTemplate = item.template;
|
|
420
|
-
break;
|
|
421
|
-
case 'stringFilterCell':
|
|
422
|
-
this.stringFilterCellChildTemplate = item.template;
|
|
423
|
-
break;
|
|
424
|
-
case 'numberFilterCell':
|
|
425
|
-
this.numberFilterCellChildTemplate = item.template;
|
|
426
|
-
break;
|
|
427
|
-
case 'customFilterCell':
|
|
428
|
-
this.customFilterCellChildTemplate = item.template;
|
|
429
|
-
break;
|
|
430
|
-
case 'dateFilterCell':
|
|
431
|
-
this.dateFilterCellChildTemplate = item.template;
|
|
432
|
-
break;
|
|
433
|
-
case 'relativeDateFilterCell':
|
|
434
|
-
this.relativeDateFilterCellChildTemplate = item.template;
|
|
435
|
-
break;
|
|
436
|
-
case 'filterCellTemplate':
|
|
437
|
-
this.filterCellChildTemplate = item.template;
|
|
438
|
-
break;
|
|
439
|
-
case 'translationKeyFilterCell':
|
|
440
|
-
this.translationKeyFilterCellChildTemplate = item.template;
|
|
441
|
-
break;
|
|
442
|
-
}
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
onSortColumnClick(sortColumn) {
|
|
446
|
-
const newSortDirection = this.columnNextSortDirection(sortColumn);
|
|
447
|
-
this._sortColumn$.next(sortColumn);
|
|
448
|
-
this._sortDirection$.next(newSortDirection);
|
|
449
|
-
this.sorted.emit({ sortColumn: sortColumn, sortDirection: newSortDirection });
|
|
450
|
-
this.emitComponentStateChanged({
|
|
451
|
-
sorting: {
|
|
452
|
-
sortColumn: sortColumn,
|
|
453
|
-
sortDirection: newSortDirection,
|
|
454
|
-
},
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
columnNextSortDirection(sortColumn) {
|
|
458
|
-
return sortColumn !== this.sortColumn
|
|
459
|
-
? this.sortStates[0]
|
|
460
|
-
: this.sortStates[(this.sortStates.indexOf(this.sortDirection) + 1) % this.sortStates.length];
|
|
461
|
-
}
|
|
462
|
-
onDeleteRow(selectedTableRow) {
|
|
463
|
-
this.deleteTableRow.emit(selectedTableRow);
|
|
464
|
-
}
|
|
465
|
-
onViewRow(selectedTableRow) {
|
|
466
|
-
this.viewTableRow.emit(selectedTableRow);
|
|
467
|
-
}
|
|
468
|
-
onEditRow(selectedTableRow) {
|
|
469
|
-
this.editTableRow.emit(selectedTableRow);
|
|
470
|
-
}
|
|
471
|
-
onFilterChosen(column) {
|
|
472
|
-
this.currentFilterColumn$.next(column);
|
|
473
|
-
}
|
|
474
|
-
onMultiselectFilterChange(column, event) {
|
|
475
|
-
const filters = this.filters
|
|
476
|
-
.filter((filter) => filter.columnId !== column.id)
|
|
477
|
-
.concat(event.value.map((value) => ({
|
|
478
|
-
columnId: column.id,
|
|
479
|
-
value,
|
|
480
|
-
filterType: column.filterType,
|
|
481
|
-
})));
|
|
482
|
-
if (this.clientSideFiltering) {
|
|
483
|
-
this.filters = filters;
|
|
484
|
-
}
|
|
485
|
-
this.filtered.emit(filters);
|
|
486
|
-
this.emitComponentStateChanged({
|
|
487
|
-
filters,
|
|
488
|
-
});
|
|
489
|
-
this.resetPage();
|
|
490
|
-
}
|
|
491
|
-
getSelectedFilters(columnId) {
|
|
492
|
-
return this.filters.filter((filter) => filter.columnId === columnId).map((filter) => filter.value);
|
|
493
|
-
}
|
|
494
|
-
sortIconTitle(sortColumn) {
|
|
495
|
-
return this.sortDirectionToTitle(sortColumn !== this.sortDirection
|
|
496
|
-
? "NONE" /* DataSortDirection.NONE */
|
|
497
|
-
: this.sortStates[this.sortStates.indexOf(this.sortDirection) % this.sortStates.length]);
|
|
498
|
-
}
|
|
499
|
-
sortDirectionToTitle(sortDirection) {
|
|
500
|
-
switch (sortDirection) {
|
|
501
|
-
case "ASCENDING" /* DataSortDirection.ASCENDING */:
|
|
502
|
-
return 'OCX_DATA_TABLE.TOGGLE_BUTTON.ASCENDING_TITLE';
|
|
503
|
-
case "DESCENDING" /* DataSortDirection.DESCENDING */:
|
|
504
|
-
return 'OCX_DATA_TABLE.TOGGLE_BUTTON.DESCENDING_TITLE';
|
|
505
|
-
default:
|
|
506
|
-
return 'OCX_DATA_TABLE.TOGGLE_BUTTON.DEFAULT_TITLE';
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
mapSelectionToRows() {
|
|
510
|
-
this.selectedRows$ = combineLatest([this._selectionIds$, this._rows$]).pipe(map(([selectedRowIds, rows]) => {
|
|
511
|
-
return selectedRowIds.map((rowId) => {
|
|
512
|
-
return rows.find((r) => r.id === rowId);
|
|
513
|
-
});
|
|
514
|
-
}));
|
|
515
|
-
}
|
|
516
|
-
isRowSelectionDisabled(rowObject) {
|
|
517
|
-
return !!this.selectionEnabledField && !this.fieldIsTruthy(rowObject, this.selectionEnabledField);
|
|
518
|
-
}
|
|
519
|
-
rowSelectable(event) {
|
|
520
|
-
return !this.isRowSelectionDisabled(event.data);
|
|
521
|
-
}
|
|
522
|
-
onSelectionChange(selection) {
|
|
523
|
-
let newSelectionIds = selection.map((row) => row.id);
|
|
524
|
-
const rows = this._rows$.getValue();
|
|
525
|
-
if (this.selectionEnabledField) {
|
|
526
|
-
const disabledRowIds = rows.filter((r) => !this.fieldIsTruthy(r, this.selectionEnabledField)).map((row) => row.id);
|
|
527
|
-
if (disabledRowIds.length > 0) {
|
|
528
|
-
newSelectionIds = this.mergeWithDisabledKeys(newSelectionIds, disabledRowIds);
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
this._selectionIds$.next(newSelectionIds);
|
|
532
|
-
this.selectionChanged.emit(this._rows$.getValue().filter((row) => newSelectionIds.includes(row.id)));
|
|
533
|
-
this.emitComponentStateChanged();
|
|
534
|
-
}
|
|
535
|
-
mergeWithDisabledKeys(newSelectionIds, disabledRowIds) {
|
|
536
|
-
const previousSelectionIds = this._selectionIds$.getValue();
|
|
537
|
-
const previouslySelectedAndDisabled = previousSelectionIds.filter((id) => disabledRowIds.includes(id));
|
|
538
|
-
const disabledAndPreviouslyDeselected = disabledRowIds.filter((id) => !previousSelectionIds.includes(id));
|
|
539
|
-
const updatedSelection = [...newSelectionIds];
|
|
540
|
-
previouslySelectedAndDisabled.forEach((id) => {
|
|
541
|
-
if (!updatedSelection.includes(id)) {
|
|
542
|
-
updatedSelection.push(id);
|
|
543
|
-
}
|
|
544
|
-
});
|
|
545
|
-
disabledAndPreviouslyDeselected.forEach((id) => {
|
|
546
|
-
const index = updatedSelection.indexOf(id);
|
|
547
|
-
if (index > -1) {
|
|
548
|
-
updatedSelection.splice(index, 1);
|
|
549
|
-
}
|
|
550
|
-
});
|
|
551
|
-
return updatedSelection;
|
|
552
|
-
}
|
|
553
|
-
isSelected(row) {
|
|
554
|
-
return this._selectionIds$.getValue().includes(row.id);
|
|
555
|
-
}
|
|
556
|
-
onPageChange(event) {
|
|
557
|
-
const page = event.first / event.rows;
|
|
558
|
-
this.page = page;
|
|
559
|
-
this.pageSize = event.rows;
|
|
560
|
-
this.pageChanged.emit(page);
|
|
561
|
-
this.pageSizeChanged.emit(event.rows);
|
|
562
|
-
this.emitComponentStateChanged({
|
|
563
|
-
activePage: page,
|
|
564
|
-
pageSize: event.rows,
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
resetPage() {
|
|
568
|
-
this.page = 0;
|
|
569
|
-
this.pageChanged.emit(this.page);
|
|
570
|
-
this.emitComponentStateChanged();
|
|
571
|
-
}
|
|
572
|
-
fieldIsTruthy(object, key) {
|
|
573
|
-
return !!ObjectUtils.resolveFieldData(object, key);
|
|
574
|
-
}
|
|
575
|
-
toggleOverflowMenu(event, menu, row) {
|
|
576
|
-
this.currentMenuRow$.next(row);
|
|
577
|
-
menu.toggle(event);
|
|
578
|
-
}
|
|
579
|
-
hasVisibleOverflowMenuItems(row) {
|
|
580
|
-
return this.overflowActions$.pipe(map((actions) => actions.some((a) => !a.actionVisibleField ||
|
|
581
|
-
(this.fieldIsTruthy(row, a.actionVisibleField) && this.userService.hasPermission(a.permission)))));
|
|
582
|
-
}
|
|
583
|
-
isDate(value) {
|
|
584
|
-
if (value instanceof Date) {
|
|
585
|
-
return true;
|
|
586
|
-
}
|
|
587
|
-
const d = new Date(value);
|
|
588
|
-
return isValidDate(d);
|
|
589
|
-
}
|
|
590
|
-
getColumnTypeTemplate(templates, columnType, templateType) {
|
|
591
|
-
let template;
|
|
592
|
-
switch (templateType) {
|
|
593
|
-
case TemplateType.CELL:
|
|
594
|
-
switch (columnType) {
|
|
595
|
-
case ColumnType.DATE:
|
|
596
|
-
template = this._dateCell;
|
|
597
|
-
break;
|
|
598
|
-
case ColumnType.NUMBER:
|
|
599
|
-
template = this._numberCell;
|
|
600
|
-
break;
|
|
601
|
-
case ColumnType.RELATIVE_DATE:
|
|
602
|
-
template = this._relativeDateCell;
|
|
603
|
-
break;
|
|
604
|
-
case ColumnType.TRANSLATION_KEY:
|
|
605
|
-
template = this._translationKeyCell;
|
|
606
|
-
break;
|
|
607
|
-
case ColumnType.CUSTOM:
|
|
608
|
-
template = this._customCell;
|
|
609
|
-
break;
|
|
610
|
-
default:
|
|
611
|
-
template = this._stringCell;
|
|
612
|
-
}
|
|
613
|
-
break;
|
|
614
|
-
case TemplateType.FILTERCELL:
|
|
615
|
-
switch (columnType) {
|
|
616
|
-
case ColumnType.DATE:
|
|
617
|
-
template = this._dateFilterCell;
|
|
618
|
-
break;
|
|
619
|
-
case ColumnType.NUMBER:
|
|
620
|
-
template = this._numberFilterCell;
|
|
621
|
-
break;
|
|
622
|
-
case ColumnType.RELATIVE_DATE:
|
|
623
|
-
template = this._relativeDateFilterCell;
|
|
624
|
-
break;
|
|
625
|
-
case ColumnType.TRANSLATION_KEY:
|
|
626
|
-
template = this._translationKeyFilterCell;
|
|
627
|
-
break;
|
|
628
|
-
case ColumnType.CUSTOM:
|
|
629
|
-
template = this._customFilterCell;
|
|
630
|
-
break;
|
|
631
|
-
default:
|
|
632
|
-
template = this._stringFilterCell;
|
|
633
|
-
}
|
|
634
|
-
break;
|
|
635
|
-
}
|
|
636
|
-
return (template ??
|
|
637
|
-
findTemplate(templates, this.templatesDataMap[templateType].templateNames[columnType])?.template ??
|
|
638
|
-
null);
|
|
639
|
-
}
|
|
640
|
-
getTemplate(column, templateType) {
|
|
641
|
-
const templatesData = this.templatesDataMap[templateType];
|
|
642
|
-
if (!templatesData.templatesObservables[column.id]) {
|
|
643
|
-
templatesData.templatesObservables[column.id] = combineLatest([
|
|
644
|
-
this.templates$,
|
|
645
|
-
this.viewTemplates$,
|
|
646
|
-
this.parentTemplates$,
|
|
647
|
-
]).pipe(map(([t, vt, pt]) => {
|
|
648
|
-
const templates = [...(t ?? []), ...(vt ?? []), ...(pt ?? [])];
|
|
649
|
-
const columnTemplate = findTemplate(templates, templatesData.idSuffix.map((suffix) => column.id + suffix))?.template;
|
|
650
|
-
if (columnTemplate) {
|
|
651
|
-
return columnTemplate;
|
|
652
|
-
}
|
|
653
|
-
return this.getColumnTypeTemplate(templates, column.columnType, templateType);
|
|
654
|
-
}));
|
|
655
|
-
}
|
|
656
|
-
return templatesData.templatesObservables[column.id];
|
|
657
|
-
}
|
|
658
|
-
resolveFieldData(object, key) {
|
|
659
|
-
return ObjectUtils.resolveFieldData(object, key);
|
|
660
|
-
}
|
|
661
|
-
getRowObjectFromMultiselectItem(value, column) {
|
|
662
|
-
return {
|
|
663
|
-
[column.id]: value.label,
|
|
664
|
-
};
|
|
665
|
-
}
|
|
666
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.Router }, { token: i0.Injector }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
667
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", showAllOption: "showAllOption", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", allowSelectAll: "allowSelectAll", paginator: "paginator", page: "page", tableStyle: "tableStyle", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-viewButton\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-editButton\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-deleteButton\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-{{action.id ? action.id.concat('ActionButton') : 'inlineActionButton'}}\"\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [style]=\"tableStyle\"\n paginatorDropdownAppendTo=\"body\"\n [rowSelectable]=\"rowSelectable\"\n tableStyleClass=\"h-full\"\n >\n <ng-template pTemplate=\"header\">\n <tr style=\"vertical-align: top\">\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n pTooltip=\"{{'OCX_DATA_TABLE.SELECT_ALL_TOOLTIP' | translate}}\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div\n class=\"table-header-wrapper flex flex-column justify-content-between align-items-start\"\n style=\"height: 100%\"\n >\n <span class=\"flex\" id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"flex icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton pl-0\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <ng-container *ngIf=\"currentEqualFilterOptions$ | async as equalFilterOptions\">\n <ng-container *ngIf=\"columnFilterTemplates$ | async as columnFilterTemplates\">\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && (!column.filterType || column.filterType === FilterType.EQUAL)\"\n [options]=\"equalFilterOptions.column?.id === column.id ? equalFilterOptions.options : []\"\n [ngModel]=\"(currentEqualSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n filterBy=\"toFilterBy\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnFilterTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </ng-container>\n </ng-container>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && column.filterType === FilterType.TRUTHY\"\n [options]=\"truthyFilterOptions\"\n [ngModel]=\"(currentTruthySelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value> {{value.key | translate}} </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr *ngIf=\"columnTemplates\">\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"isRowSelectionDisabled(rowObject) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"isRowSelectionDisabled(rowObject)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n @defer(on viewport){\n <ng-container\n *ngIf=\"columnTemplates[column.id]\"\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n >\n </ng-container>\n } @placeholder {\n <p-skeleton width=\"3rem\" />\n }\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i9.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i9.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i9.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i10.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i11.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i12.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i14.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.OcxTimeAgoPipe, name: "timeago" }], deferBlockDependencies: [() => [i4.NgIf, i4.NgTemplateOutlet]] }); }
|
|
668
|
-
}
|
|
669
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableComponent, decorators: [{
|
|
670
|
-
type: Component,
|
|
671
|
-
args: [{ selector: 'ocx-data-table', template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-viewButton\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-editButton\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-deleteButton\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n id=\"{{resolveFieldData(rowObject, 'id')}}-{{action.id ? action.id.concat('ActionButton') : 'inlineActionButton'}}\"\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [style]=\"tableStyle\"\n paginatorDropdownAppendTo=\"body\"\n [rowSelectable]=\"rowSelectable\"\n tableStyleClass=\"h-full\"\n >\n <ng-template pTemplate=\"header\">\n <tr style=\"vertical-align: top\">\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n pTooltip=\"{{'OCX_DATA_TABLE.SELECT_ALL_TOOLTIP' | translate}}\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div\n class=\"table-header-wrapper flex flex-column justify-content-between align-items-start\"\n style=\"height: 100%\"\n >\n <span class=\"flex\" id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"flex icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton pl-0\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <ng-container *ngIf=\"currentEqualFilterOptions$ | async as equalFilterOptions\">\n <ng-container *ngIf=\"columnFilterTemplates$ | async as columnFilterTemplates\">\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && (!column.filterType || column.filterType === FilterType.EQUAL)\"\n [options]=\"equalFilterOptions.column?.id === column.id ? equalFilterOptions.options : []\"\n [ngModel]=\"(currentEqualSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n filterBy=\"toFilterBy\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnFilterTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </ng-container>\n </ng-container>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && column.filterType === FilterType.TRUTHY\"\n [options]=\"truthyFilterOptions\"\n [ngModel]=\"(currentTruthySelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value> {{value.key | translate}} </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr *ngIf=\"columnTemplates\">\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"isRowSelectionDisabled(rowObject) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"isRowSelectionDisabled(rowObject)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n @defer(on viewport){\n <ng-container\n *ngIf=\"columnTemplates[column.id]\"\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n >\n </ng-container>\n } @placeholder {\n <p-skeleton width=\"3rem\" />\n }\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"] }]
|
|
672
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
673
|
-
type: Inject,
|
|
674
|
-
args: [LOCALE_ID]
|
|
675
|
-
}] }, { type: i1.TranslateService }, { type: i2.Router }, { type: i0.Injector }, { type: i3.UserService }], propDecorators: { rows: [{
|
|
676
|
-
type: Input
|
|
677
|
-
}], selectedRows: [{
|
|
678
|
-
type: Input
|
|
679
|
-
}], filters: [{
|
|
680
|
-
type: Input
|
|
681
|
-
}], sortDirection: [{
|
|
682
|
-
type: Input
|
|
683
|
-
}], sortColumn: [{
|
|
684
|
-
type: Input
|
|
685
|
-
}], columns: [{
|
|
686
|
-
type: Input
|
|
687
|
-
}], clientSideFiltering: [{
|
|
688
|
-
type: Input
|
|
689
|
-
}], clientSideSorting: [{
|
|
690
|
-
type: Input
|
|
691
|
-
}], sortStates: [{
|
|
692
|
-
type: Input
|
|
693
|
-
}], pageSizes: [{
|
|
694
|
-
type: Input
|
|
695
|
-
}], pageSize: [{
|
|
696
|
-
type: Input
|
|
697
|
-
}], showAllOption: [{
|
|
698
|
-
type: Input
|
|
699
|
-
}], emptyResultsMessage: [{
|
|
700
|
-
type: Input
|
|
701
|
-
}], name: [{
|
|
702
|
-
type: Input
|
|
703
|
-
}], deletePermission: [{
|
|
704
|
-
type: Input
|
|
705
|
-
}], viewPermission: [{
|
|
706
|
-
type: Input
|
|
707
|
-
}], editPermission: [{
|
|
708
|
-
type: Input
|
|
709
|
-
}], deleteActionVisibleField: [{
|
|
710
|
-
type: Input
|
|
711
|
-
}], deleteActionEnabledField: [{
|
|
712
|
-
type: Input
|
|
713
|
-
}], viewActionVisibleField: [{
|
|
714
|
-
type: Input
|
|
715
|
-
}], viewActionEnabledField: [{
|
|
716
|
-
type: Input
|
|
717
|
-
}], editActionVisibleField: [{
|
|
718
|
-
type: Input
|
|
719
|
-
}], editActionEnabledField: [{
|
|
720
|
-
type: Input
|
|
721
|
-
}], selectionEnabledField: [{
|
|
722
|
-
type: Input
|
|
723
|
-
}], allowSelectAll: [{
|
|
724
|
-
type: Input
|
|
725
|
-
}], paginator: [{
|
|
726
|
-
type: Input
|
|
727
|
-
}], page: [{
|
|
728
|
-
type: Input
|
|
729
|
-
}], tableStyle: [{
|
|
730
|
-
type: Input
|
|
731
|
-
}], totalRecordsOnServer: [{
|
|
732
|
-
type: Input
|
|
733
|
-
}], currentPageShowingKey: [{
|
|
734
|
-
type: Input
|
|
735
|
-
}], currentPageShowingWithTotalOnServerKey: [{
|
|
736
|
-
type: Input
|
|
737
|
-
}], stringCellTemplate: [{
|
|
738
|
-
type: Input
|
|
739
|
-
}], stringCellChildTemplate: [{
|
|
740
|
-
type: ContentChild,
|
|
741
|
-
args: ['stringCell']
|
|
742
|
-
}], numberCellTemplate: [{
|
|
743
|
-
type: Input
|
|
744
|
-
}], numberCellChildTemplate: [{
|
|
745
|
-
type: ContentChild,
|
|
746
|
-
args: ['numberCell']
|
|
747
|
-
}], customCellTemplate: [{
|
|
748
|
-
type: Input
|
|
749
|
-
}], customCellChildTemplate: [{
|
|
750
|
-
type: ContentChild,
|
|
751
|
-
args: ['customCell']
|
|
752
|
-
}], dateCellTemplate: [{
|
|
753
|
-
type: Input
|
|
754
|
-
}], dateCellChildTemplate: [{
|
|
755
|
-
type: ContentChild,
|
|
756
|
-
args: ['dateCell']
|
|
757
|
-
}], relativeDateCellTemplate: [{
|
|
758
|
-
type: Input
|
|
759
|
-
}], relativeDateCellChildTemplate: [{
|
|
760
|
-
type: ContentChild,
|
|
761
|
-
args: ['relativeDateCell']
|
|
762
|
-
}], cellTemplate: [{
|
|
763
|
-
type: Input
|
|
764
|
-
}], cellChildTemplate: [{
|
|
765
|
-
type: ContentChild,
|
|
766
|
-
args: ['cell']
|
|
767
|
-
}], translationKeyCellTemplate: [{
|
|
768
|
-
type: Input
|
|
769
|
-
}], translationKeyCellChildTemplate: [{
|
|
770
|
-
type: ContentChild,
|
|
771
|
-
args: ['translationKeyCell']
|
|
772
|
-
}], stringFilterCellTemplate: [{
|
|
773
|
-
type: Input
|
|
774
|
-
}], stringFilterCellChildTemplate: [{
|
|
775
|
-
type: ContentChild,
|
|
776
|
-
args: ['stringFilterCell']
|
|
777
|
-
}], numberFilterCellTemplate: [{
|
|
778
|
-
type: Input
|
|
779
|
-
}], numberFilterCellChildTemplate: [{
|
|
780
|
-
type: ContentChild,
|
|
781
|
-
args: ['numberFilterCell']
|
|
782
|
-
}], customFilterCellTemplate: [{
|
|
783
|
-
type: Input
|
|
784
|
-
}], customFilterCellChildTemplate: [{
|
|
785
|
-
type: ContentChild,
|
|
786
|
-
args: ['customFilterCell']
|
|
787
|
-
}], dateFilterCellTemplate: [{
|
|
788
|
-
type: Input
|
|
789
|
-
}], dateFilterCellChildTemplate: [{
|
|
790
|
-
type: ContentChild,
|
|
791
|
-
args: ['dateFilterCell']
|
|
792
|
-
}], relativeDateFilterCellTemplate: [{
|
|
793
|
-
type: Input
|
|
794
|
-
}], relativeDateFilterCellChildTemplate: [{
|
|
795
|
-
type: ContentChild,
|
|
796
|
-
args: ['relativeDateFilterCell']
|
|
797
|
-
}], filterCellTemplate: [{
|
|
798
|
-
type: Input
|
|
799
|
-
}], filterCellChildTemplate: [{
|
|
800
|
-
type: ContentChild,
|
|
801
|
-
args: ['filterCell']
|
|
802
|
-
}], translationKeyFilterCellTemplate: [{
|
|
803
|
-
type: Input
|
|
804
|
-
}], translationKeyFilterCellChildTemplate: [{
|
|
805
|
-
type: ContentChild,
|
|
806
|
-
args: ['translationKeyFilterCell']
|
|
807
|
-
}], additionalActions: [{
|
|
808
|
-
type: Input
|
|
809
|
-
}], frozenActionColumn: [{
|
|
810
|
-
type: Input
|
|
811
|
-
}], actionColumnPosition: [{
|
|
812
|
-
type: Input
|
|
813
|
-
}], filtered: [{
|
|
814
|
-
type: Output
|
|
815
|
-
}], sorted: [{
|
|
816
|
-
type: Output
|
|
817
|
-
}], viewTableRow: [{
|
|
818
|
-
type: Output
|
|
819
|
-
}], editTableRow: [{
|
|
820
|
-
type: Output
|
|
821
|
-
}], deleteTableRow: [{
|
|
822
|
-
type: Output
|
|
823
|
-
}], selectionChanged: [{
|
|
824
|
-
type: Output
|
|
825
|
-
}], pageChanged: [{
|
|
826
|
-
type: Output
|
|
827
|
-
}], pageSizeChanged: [{
|
|
828
|
-
type: Output
|
|
829
|
-
}], componentStateChanged: [{
|
|
830
|
-
type: Output
|
|
831
|
-
}], templates: [{
|
|
832
|
-
type: ContentChildren,
|
|
833
|
-
args: [PrimeTemplate]
|
|
834
|
-
}], viewTemplates: [{
|
|
835
|
-
type: ViewChildren,
|
|
836
|
-
args: [PrimeTemplate]
|
|
837
|
-
}], parentTemplates: [{
|
|
838
|
-
type: Input
|
|
839
|
-
}] } });
|
|
840
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUdOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUNsRSxPQUFPLEVBQVksYUFBYSxFQUFjLE1BQU0sYUFBYSxDQUFBO0FBR2pFLE9BQU8sRUFDTCxlQUFlLEVBRWYsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsRUFBRSxFQUNGLGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQTtBQUNiLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUkxRCxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFD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WTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBOEJILFNBQVM7c0JBRFosZUFBZTt1QkFBQyxhQUFhO2dCQVMxQixhQUFhO3NCQURoQixZQUFZO3VCQUFDLGFBQWE7Z0JBU3ZCLGVBQWU7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSB9IGZyb20gJ0BvbmVjeC9hY2NlbGVyYXRvcidcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lVGVtcGxhdGUsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnXG5pbXBvcnQgeyBNdWx0aVNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0J1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIG9mLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcydcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9jb2x1bW4tdHlwZS5tb2RlbCdcbmltcG9ydCB7IERhdGFBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLWFjdGlvbidcbmltcG9ydCB7IERhdGFTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1zb3J0LWRpcmVjdGlvbidcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtdGFibGUtY29sdW1uLm1vZGVsJ1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZmlsdGVyLm1vZGVsJ1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3R1dGlscydcbmltcG9ydCB7IGZpbmRUZW1wbGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RlbXBsYXRlLnV0aWxzJ1xuaW1wb3J0IHsgRGF0YVNvcnRCYXNlIH0gZnJvbSAnLi4vZGF0YS1zb3J0LWJhc2UvZGF0YS1zb3J0LWJhc2UnXG5cbmV4cG9ydCB0eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBiaWdpbnQgfCBEYXRlXG5leHBvcnQgdHlwZSBSb3cgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgW2NvbHVtbklkOiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBlbnVtIFRlbXBsYXRlVHlwZSB7XG4gIENFTEwgPSAnQ0VMTCcsXG4gIEZJTFRFUkNFTEwgPSAnRklMVEVSQ0VMTCcsXG59XG5cbmludGVyZmFjZSBUZW1wbGF0ZXNEYXRhIHtcbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PlxuICBpZFN1ZmZpeDogQXJyYXk8c3RyaW5nPlxuICB0ZW1wbGF0ZU5hbWVzOiBSZWNvcmQ8Q29sdW1uVHlwZSwgQXJyYXk8c3RyaW5nPj5cbn1cblxuZXhwb3J0IHR5cGUgU29ydCA9IHsgc29ydENvbHVtbjogc3RyaW5nOyBzb3J0RGlyZWN0aW9uOiBEYXRhU29ydERpcmVjdGlvbiB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUge1xuICBmaWx0ZXJzPzogRmlsdGVyW11cbiAgc29ydGluZz86IFNvcnRcbiAgc2VsZWN0ZWRSb3dzPzogUm93W11cbiAgYWN0aXZlUGFnZT86IG51bWJlclxuICBwYWdlU2l6ZT86IG51bWJlclxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhU29ydEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuICBGaWx0ZXJUeXBlID0gRmlsdGVyVHlwZVxuICBUZW1wbGF0ZVR5cGUgPSBUZW1wbGF0ZVR5cGVcbiAgY2hlY2tlZCA9IHRydWVcbiAgX3Jvd3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3dbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCByb3dzKHZhbHVlOiBSb3dbXSkge1xuICAgICF0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fcm93cyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2VsZWN0aW9uSWRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KHN0cmluZyB8IG51bWJlcilbXT4oW10pXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZFJvd3ModmFsdWU6IFJvd1tdIHwgc3RyaW5nW10gfCBudW1iZXJbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbklkcyQubmV4dChcbiAgICAgIHZhbHVlLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygcm93ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiByb3cuaWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIF9maWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgZmlsdGVycygpOiBGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgZmlsdGVycyh2YWx1ZTogRmlsdGVyW10pIHtcbiAgICAhdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKS5sZW5ndGggPz8gdGhpcy5yZXNldFBhZ2UoKVxuICAgIHRoaXMuX2ZpbHRlcnMkLm5leHQodmFsdWUpXG4gIH1cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydENvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIEBJbnB1dCgpXG4gIGdldCBzb3J0Q29sdW1uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0Q29sdW1uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnRDb2x1bW4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXM/Ll9zb3J0Q29sdW1uJC5uZXh0KHZhbHVlKVxuICB9XG4gIGNvbHVtblRlbXBsYXRlcyQ6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PiB8IHVuZGVmaW5lZFxuICBjb2x1bW5GaWx0ZXJUZW1wbGF0ZXMkOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPj4gfCB1bmRlZmluZWRcbiAgX2NvbHVtbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhVGFibGVDb2x1bW5bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBjb2x1bW5zKCk6IERhdGFUYWJsZUNvbHVtbltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBjb2x1bW5zKHZhbHVlOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIHRoaXMuX2NvbHVtbnMkLm5leHQodmFsdWUpXG4gICAgY29uc3Qgb2JzID0gdmFsdWUubWFwKChjKSA9PiB0aGlzLmdldFRlbXBsYXRlKGMsIFRlbXBsYXRlVHlwZS5DRUxMKSlcbiAgICBjb25zdCBmaWx0ZXJPYnMgPSB2YWx1ZS5tYXAoKGMpID0+IHRoaXMuZ2V0VGVtcGxhdGUoYywgVGVtcGxhdGVUeXBlLkZJTFRFUkNFTEwpKVxuICAgIHRoaXMuY29sdW1uVGVtcGxhdGVzJCA9IGNvbWJpbmVMYXRlc3Qob2JzKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZXMpID0+IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZS5tYXAoKGMsIGkpID0+IFtjLmlkLCB2YWx1ZXNbaV1dKSkpLFxuICAgICAgZGVib3VuY2VUaW1lKDUwKVxuICAgIClcbiAgICB0aGlzLmNvbHVtbkZpbHRlclRlbXBsYXRlcyQgPSBjb21iaW5lTGF0ZXN0KGZpbHRlck9icykucGlwZShcbiAgICAgIG1hcCgodmFsdWVzKSA9PiBPYmplY3QuZnJvbUVudHJpZXModmFsdWUubWFwKChjLCBpKSA9PiBbYy5pZCwgdmFsdWVzW2ldXSkpKVxuICAgIClcbiAgfVxuICBASW5wdXQoKSBjbGllbnRTaWRlRmlsdGVyaW5nID0gdHJ1ZVxuICBASW5wdXQoKSBjbGllbnRTaWRlU29ydGluZyA9IHRydWVcbiAgQElucHV0KCkgc29ydFN0YXRlczogRGF0YVNvcnREaXJlY3Rpb25bXSA9IFtEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkcsIERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkddXG5cbiAgZGlzcGxheWVkUGFnZVNpemVzJDogT2JzZXJ2YWJsZTwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT5cbiAgX3BhZ2VTaXplcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPihbMTAsIDI1LCA1MF0pXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZXMoKTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZXMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemVzKHZhbHVlOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSkge1xuICAgIHRoaXMuX3BhZ2VTaXplcyQubmV4dCh2YWx1ZSlcbiAgfVxuICBkaXNwbGF5ZWRQYWdlU2l6ZSQ6IE9ic2VydmFibGU8bnVtYmVyPlxuICBfcGFnZVNpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2hvd0FsbE9wdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuICBASW5wdXQoKVxuICBzZXQgc2hvd0FsbE9wdGlvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dBbGxPcHRpb24kLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBlbXB0eVJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgbmFtZSA9ICcnXG4gIEBJbnB1dCgpIGRlbGV0ZVBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdQZXJtaXNzaW9uOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0UGVybWlzc2lvbjogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGFsbG93U2VsZWN0QWxsID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdpbmF0b3IgPSB0cnVlXG4gIEBJbnB1dCgpIHBhZ2UgPSAwXG4gIEBJbnB1dCgpIHRhYmxlU3R5bGU6IHsgW2tsYXNzOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZFxuICBASW5wdXQoKVxuICBnZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPyBOdW1iZXIodGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10pIDogdW5kZWZpbmVkXG4gIH1cbiAgc2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA9IHZhbHVlPy50b1N0cmluZygpID8/ICcwJ1xuICB9XG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ0tleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HJ1xuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HX1dJVEhfVE9UQUxfT05fU0VSVkVSJ1xuICBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY3VycmVudFBhZ2U6ICd7Y3VycmVudFBhZ2V9JyxcbiAgICB0b3RhbFBhZ2VzOiAne3RvdGFsUGFnZXN9JyxcbiAgICByb3dzOiAne3Jvd3N9JyxcbiAgICBmaXJzdDogJ3tmaXJzdH0nLFxuICAgIGxhc3Q6ICd7bGFzdH0nLFxuICAgIHRvdGFsUmVjb3JkczogJ3t0b3RhbFJlY29yZHN9JyxcbiAgfVxuXG4gIEBJbnB1dCgpIHN0cmluZ0NlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdzdHJpbmdDZWxsJykgc3RyaW5nQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9zdHJpbmdDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ0NlbGxUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBudW1iZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyQ2VsbCcpIG51bWJlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBhbmQgaW5zdGVhZCB0byBjaGFuZ2UgdGhlIHRlbXBsYXRlIG9mIGEgc3BlY2lmaWMgY29sdW1uXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZENlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkQ2VsbFwiXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21DZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBhbmQgaW5zdGVhZCB0byBjaGFuZ2UgdGhlIHRlbXBsYXRlIG9mIGEgc3BlY2lmaWMgY29sdW1uXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZENlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkQ2VsbFwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21DZWxsJykgY3VzdG9tQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9jdXN0b21DZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUNlbGxUZW1wbGF0ZSB8fCB0aGlzLmN1c3RvbUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBkYXRlQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2RhdGVDZWxsJykgZGF0ZUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZGF0ZUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZUNlbGxUZW1wbGF0ZSB8fCB0aGlzLmRhdGVDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgcmVsYXRpdmVEYXRlQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3JlbGF0aXZlRGF0ZUNlbGwnKSByZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3JlbGF0aXZlRGF0ZUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpdmVEYXRlQ2VsbFRlbXBsYXRlIHx8IHRoaXMucmVsYXRpdmVEYXRlQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdjZWxsJykgY2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9jZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNlbGxUZW1wbGF0ZSB8fCB0aGlzLmNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgdHJhbnNsYXRpb25LZXlDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlDZWxsJykgdHJhbnNsYXRpb25LZXlDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3RyYW5zbGF0aW9uS2V5Q2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUNlbGxUZW1wbGF0ZSB8fCB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBzdHJpbmdGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnc3RyaW5nRmlsdGVyQ2VsbCcpIHN0cmluZ0ZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfc3RyaW5nRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5zdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIG51bWJlckZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdudW1iZXJGaWx0ZXJDZWxsJykgbnVtYmVyRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9udW1iZXJGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm51bWJlckZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLm51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBhbmQgaW5zdGVhZCB0byBjaGFuZ2UgdGhlIHRlbXBsYXRlIG9mIGEgc3BlY2lmaWMgY29sdW1uIGZpbHRlclxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRGaWx0ZXJDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZEZpbHRlckNlbGxcIlxuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtbiBmaWx0ZXJcbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkRmlsdGVyQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRGaWx0ZXJDZWxsXCJcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoJ2N1c3RvbUZpbHRlckNlbGwnKSBjdXN0b21GaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2N1c3RvbUZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBkYXRlRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2RhdGVGaWx0ZXJDZWxsJykgZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZGF0ZUZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmRhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHJlbGF0aXZlRGF0ZUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdyZWxhdGl2ZURhdGVGaWx0ZXJDZWxsJykgcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aXZlRGF0ZUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgZmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2ZpbHRlckNlbGwnKSBmaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2ZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuZmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSB0cmFuc2xhdGlvbktleUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCd0cmFuc2xhdGlvbktleUZpbHRlckNlbGwnKSB0cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMudHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgX2FkZGl0aW9uYWxBY3Rpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YUFjdGlvbltdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGFkZGl0aW9uYWxBY3Rpb25zKCk6IERhdGFBY3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGFkZGl0aW9uYWxBY3Rpb25zKHZhbHVlOiBEYXRhQWN0aW9uW10pIHtcbiAgICB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQubmV4dCh2YWx1ZSlcbiAgfVxuICBASW5wdXQoKSBmcm96ZW5BY3Rpb25Db2x1bW4gPSBmYWxzZVxuICBASW5wdXQoKSBhY3Rpb25Db2x1bW5Qb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCdcblxuICBAT3V0cHV0KCkgZmlsdGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlcltdPigpXG4gIEBPdXRwdXQoKSBzb3J0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KClcbiAgQE91dHB1dCgpIHZpZXdUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBlZGl0VGFibGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJvdz4oKVxuICBAT3V0cHV0KCkgZGVsZXRlVGFibGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJvdz4oKVxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Um93W10+KClcbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KClcbiAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG4gIEBPdXRwdXQoKSBjb21wb25lbnRTdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbXBvbmVudFN0YXRlPigpXG5cbiAgZGlzcGxheWVkUm93cyQ6IE9ic2VydmFibGU8dW5rbm93bltdPiB8IHVuZGVmaW5lZFxuICBzZWxlY3RlZFJvd3MkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcblxuICBjdXJyZW50RmlsdGVyQ29sdW1uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVRhYmxlQ29sdW1uIHwgbnVsbD4obnVsbClcbiAgY3VycmVudEVxdWFsRmlsdGVyT3B0aW9ucyQ6IE9ic2VydmFibGU8eyBvcHRpb25zOiBTZWxlY3RJdGVtW107IGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIH0+IHwgdW5kZWZpbmVkXG4gIGN1cnJlbnRFcXVhbFNlbGVjdGVkRmlsdGVycyQ6IE9ic2VydmFibGU8dW5rbm93bltdPiB8IHVuZGVmaW5lZFxuICB0cnV0aHlGaWx0ZXJPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGtleTogJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9ZRVMnLFxuICAgICAgdmFsdWU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdPQ1hfREFUQV9UQUJMRS5GSUxURVJfTk8nLFxuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgIH0sXG4gIF1cbiAgY3VycmVudFRydXRoeVNlbGVjdGVkRmlsdGVycyQ6IE9ic2VydmFibGU8dW5rbm93bltdPiB8IHVuZGVmaW5lZFxuICBmaWx0ZXJBbW91bnRzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB8IHVuZGVmaW5lZFxuXG4gIG92ZXJmbG93QWN0aW9ucyQ6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPlxuICBpbmxpbmVBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIG92ZXJmbG93TWVudUl0ZW1zJDogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPlxuICBjdXJyZW50TWVudVJvdyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvdyB8IG51bGw+KG51bGwpXG5cbiAgdGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQENvbnRlbnRDaGlsZHJlbihQcmltZVRlbXBsYXRlKVxuICBzZXQgdGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnRlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIHZpZXdUZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBAVmlld0NoaWxkcmVuKFByaW1lVGVtcGxhdGUpXG4gIHNldCB2aWV3VGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnZpZXdUZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICBwYXJlbnRUZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBJbnB1dCgpXG4gIHNldCBwYXJlbnRUZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnBhcmVudFRlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIGdldCB2aWV3VGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py52aWV3SXRlbU9ic2VydmVkIHx8IGR2Py52aWV3SXRlbS5vYnNlcnZlZCB8fCB0aGlzLnZpZXdUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBlZGl0VGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5lZGl0SXRlbU9ic2VydmVkIHx8IGR2Py5lZGl0SXRlbS5vYnNlcnZlZCB8fCB0aGlzLmVkaXRUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBkZWxldGVUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmRlbGV0ZUl0ZW1PYnNlcnZlZCB8fCBkdj8uZGVsZXRlSXRlbS5vYnNlcnZlZCB8fCB0aGlzLmRlbGV0ZVRhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGFueVJvd0FjdGlvbk9ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdUYWJsZVJvd09ic2VydmVkIHx8IHRoaXMuZWRpdFRhYmxlUm93T2JzZXJ2ZWQgfHwgdGhpcy5kZWxldGVUYWJsZVJvd09ic2VydmVkXG4gIH1cblxuICBnZXQgc2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LnNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZCB8fCBkdj8uc2VsZWN0aW9uQ2hhbmdlZC5vYnNlcnZlZCB8fCB0aGlzLnNlbGVjdGlvbkNoYW5nZWQub2JzZXJ2ZWRcbiAgfVxuXG4gIHRlbXBsYXRlc09ic2VydmFibGVzOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPj4gPSB7fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTE9DQUxFX0lEKSBsb2NhbGU6IHN0cmluZyxcbiAgICB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIobG9jYWxlLCB0cmFuc2xhdGVTZXJ2aWNlKVxuICAgIHRoaXMubmFtZSA9IHRoaXMubmFtZSB8fCB0aGlzLnJvdXRlci51cmwucmVwbGFjZSgvW15BLVphLXowLTldLywgJ18nKVxuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5fcGFnZVNpemVzJCxcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ09DWF9EQVRBX1RBQkxFLkFMTCcpLFxuICAgICAgdGhpcy5fc2hvd0FsbE9wdGlvbiQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3BhZ2VTaXplcywgdHJhbnNsYXRpb24sIHNob3dBbGxPcHRpb25dKSA9PlxuICAgICAgICBzaG93QWxsT3B0aW9uID8gcGFnZVNpemVzLmNvbmNhdCh7IHNob3dBbGw6IHRyYW5zbGF0aW9uIH0pIDogcGFnZVNpemVzXG4gICAgICApXG4gICAgKVxuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcGFnZVNpemUkLCB0aGlzLl9wYWdlU2l6ZXMkXSkucGlwZShcbiAgICAgIG1hcCgoW3BhZ2VTaXplLCBwYWdlU2l6ZXNdKSA9PiBwYWdlU2l6ZSA/PyBwYWdlU2l6ZXMuZmluZCgodmFsKTogdmFsIGlzIG51bWJlciA9PiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgPz8gNTApXG4gICAgKVxuICAgIHRoaXMub3ZlcmZsb3dBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpKVxuICAgIClcbiAgICB0aGlzLmlubGluZUFjdGlvbnMkID0gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+ICFhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpKVxuICAgIClcbiAgICB0aGlzLm92ZXJmbG93TWVudUl0ZW1zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3ZlcmZsb3dBY3Rpb25zJCwgdGhpcy5jdXJyZW50TWVudVJvdyRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFthY3Rpb25zLCByb3ddKSA9PlxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFsuLi5hY3Rpb25zLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyldKS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uc1xuICAgICAgICAgICAgICAuZmlsdGVyKChhKSA9PiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKSlcbiAgICAgICAgICAgICAgLm1hcCgoYSkgPT4gKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdHJhbnNsYXRpb25zW2EubGFiZWxLZXkgfHwgJyddLFxuICAgICAgICAgICAgICAgIGljb246IGEuaWNvbixcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzOiAoYS5jbGFzc2VzIHx8IFtdKS5qb2luKCcgJyksXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGEuZGlzYWJsZWQgfHwgKCEhYS5hY3Rpb25FbmFibGVkRmllbGQgJiYgIXRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uRW5hYmxlZEZpZWxkKSksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogIWEuYWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiBhLmNhbGxiYWNrKHJvdyksXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICAgdGhpcy5yb3dTZWxlY3RhYmxlID0gdGhpcy5yb3dTZWxlY3RhYmxlLmJpbmQodGhpcylcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5fZmlsdGVycyQsIHRoaXMuX3NvcnRDb2x1bW4kLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW3Jvd3NdKSA9PiB0aGlzLmZsYXR0ZW5JdGVtcyhyb3dzKSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50VHJ1dGh5U2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgIGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQgJiYgY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLlRSVVRIWVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEVxdWFsU2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgIGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQgJiZcbiAgICAgICAgICAgICAgKCFjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgfHwgY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLkVRVUFMKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEVxdWFsRmlsdGVyT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJCwgdGhpcy5fZmlsdGVycyRdKS5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAoW18sIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIF9fXSkgPT5cbiAgICAgICAgICAhY3VycmVudEZpbHRlckNvbHVtbj8uZmlsdGVyVHlwZSB8fCBjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRVFVQUxcbiAgICAgICksXG4gICAgICBtZXJnZU1hcCgoW3Jvd3MsIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudEZpbHRlckNvbHVtbj8uaWQpIHtcbiAgICAgICAgICByZXR1cm4gb2YoeyBvcHRpb25zOiBbXSwgY29sdW1uOiB1bmRlZmluZWQgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXJzID0gZmlsdGVyc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoZmlsdGVyKSA9PlxuICAgICAgICAgICAgICBmaWx0ZXIuY29sdW1uSWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkICYmXG4gICAgICAgICAgICAgICghY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlIHx8IGN1cnJlbnRGaWx0ZXJDb2x1bW4uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5FUVVBTClcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIudmFsdWUpXG5cbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWVzID0gcm93cy5tYXAoKHJvdykgPT4gcm93W2N1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkXSlcblxuICAgICAgICBpZiAoY3VycmVudEZpbHRlckNvbHVtbi5jb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlLkRBVEUpIHtcbiAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgb3B0aW9uczogY29sdW1uVmFsdWVzLm1hcChcbiAgICAgICAgICAgICAgKGMpID0+XG4gICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBjLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGMsXG4gICAgICAgICAgICAgICAgICB0b0ZpbHRlckJ5OiBmb3JtYXREYXRlKGAke2N9YCwgY3VycmVudEZpbHRlckNvbHVtbi5kYXRlRm9ybWF0ID8/ICdtZWRpdW0nLCB0aGlzLmxvY2FsZSksXG4gICAgICAgICAgICAgICAgfSkgYXMgU2VsZWN0SXRlbVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvbHVtbjogY3VycmVudEZpbHRlckNvbHVtbixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlT2JzZXJ2YWJsZSA9XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoKGMpID0+IGMuaWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKT8uY29sdW1uVHlwZSA9PT0gQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVlcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVDb2x1bW5WYWx1ZXMoY29sdW1uVmFsdWVzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgICAgOiBvZihPYmplY3QuZnJvbUVudHJpZXMoY29sdW1uVmFsdWVzLm1hcCgoY3YpID0+IFtjdiwgY3ZdKSkpXG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVPYnNlcnZhYmxlLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGVkVmFsdWVzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0cmFuc2xhdGVkVmFsdWVzKVxuICAgICAgICAgICAgICAuY29uY2F0KGN1cnJlbnRGaWx0ZXJzKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4ICYmIHZhbHVlICE9IG51bGwpXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKGZpbHRlck9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWx0ZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHRvRmlsdGVyQnk6IGZpbHRlck9wdGlvblxuICAgICAgICAgICAgICAgICAgfSkgYXMgU2VsZWN0SXRlbVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgICBjb2x1bW46IGN1cnJlbnRGaWx0ZXJDb2x1bW4sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5maWx0ZXJBbW91bnRzJCA9IHRoaXMuX2ZpbHRlcnMkLnBpcGUoXG4gICAgICBtYXAoKGZpbHRlcnMpID0+XG4gICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZClcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4gW2NvbHVtbklkLCBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5sZW5ndGhdKVxuICAgICAgKSxcbiAgICAgIG1hcCgoYW1vdW50cykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGFtb3VudHMpKVxuICAgIClcbiAgICB0aGlzLm1hcFNlbGVjdGlvblRvUm93cygpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIHRyYW5zbGF0ZUNvbHVtblZhbHVlcyhjb2x1bW5WYWx1ZXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gY29sdW1uVmFsdWVzLmxlbmd0aCA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoY29sdW1uVmFsdWVzIGFzIHN0cmluZ1tdKSA6IG9mKHt9KVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkXG4gICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLl9zZWxlY3Rpb25JZHMkLCB0aGlzLl9yb3dzJCksIGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFnZVNpemUsIHNlbGVjdGVkSWRzLCByb3dzXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgc29ydGluZzoge1xuICAgICAgICAgICAgc29ydENvbHVtbjogdGhpcy5zb3J0Q29sdW1uLFxuICAgICAgICAgICAgc29ydERpcmVjdGlvbjogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgYWN0aXZlUGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgIHNlbGVjdGVkUm93czogcm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMocm93LmlkKSksXG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC52YWx1ZT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICBjYXNlICdzdHJpbmdDZWxsJzpcbiAgICAgICAgICB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckNlbGwnOlxuICAgICAgICAgIHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY3VzdG9tQ2VsbCc6XG4gICAgICAgICAgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmVsYXRpdmVEYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjZWxsVGVtcGxhdGUnOlxuICAgICAgICAgIHRoaXMuY2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlDZWxsJzpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3RyaW5nRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdudW1iZXJGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLm51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmlsdGVyQ2VsbFRlbXBsYXRlJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU29ydENvbHVtbkNsaWNrKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1NvcnREaXJlY3Rpb24gPSB0aGlzLmNvbHVtbk5leHRTb3J0RGlyZWN0aW9uKHNvcnRDb2x1bW4pXG5cbiAgICB0aGlzLl9zb3J0Q29sdW1uJC5uZXh0KHNvcnRDb2x1bW4pXG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dChuZXdTb3J0RGlyZWN0aW9uKVxuXG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7IHNvcnRDb2x1bW46IHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb246IG5ld1NvcnREaXJlY3Rpb24gfSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgc29ydGluZzoge1xuICAgICAgICBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydENvbHVtblxuICAgICAgPyB0aGlzLnNvcnRTdGF0ZXNbMF1cbiAgICAgIDogdGhpcy5zb3J0U3RhdGVzWyh0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICsgMSkgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICB9XG5cbiAgb25EZWxldGVSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5kZWxldGVUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvblZpZXdSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy52aWV3VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25FZGl0Um93KHNlbGVjdGVkVGFibGVSb3c6IFJvdykge1xuICAgIHRoaXMuZWRpdFRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uRmlsdGVyQ2hvc2VuKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJC5uZXh0KGNvbHVtbilcbiAgfVxuXG4gIG9uTXVsdGlzZWxlY3RGaWx0ZXJDaGFuZ2UoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCAhPT0gY29sdW1uLmlkKVxuICAgICAgLmNvbmNhdChcbiAgICAgICAgZXZlbnQudmFsdWUubWFwKCh2YWx1ZTogUHJpbWl0aXZlKSA9PiAoe1xuICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZmlsdGVyVHlwZTogY29sdW1uLmZpbHRlclR5cGUsXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnNcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZC5lbWl0KGZpbHRlcnMpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGZpbHRlcnMsXG4gICAgfSlcbiAgICB0aGlzLnJlc2V0UGFnZSgpXG4gIH1cblxuICBnZXRTZWxlY3RlZEZpbHRlcnMoY29sdW1uSWQ6IHN0cmluZyk6IHVua25vd25bXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjb2x1bW5JZCkubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgfVxuXG4gIHNvcnRJY29uVGl0bGUoc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvblRvVGl0bGUoXG4gICAgICBzb3J0Q29sdW1uICE9PSB0aGlzLnNvcnREaXJlY3Rpb25cbiAgICAgICAgPyBEYXRhU29ydERpcmVjdGlvbi5OT05FXG4gICAgICAgIDogdGhpcy5zb3J0U3RhdGVzW3RoaXMuc29ydFN0YXRlcy5pbmRleE9mKHRoaXMuc29ydERpcmVjdGlvbikgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICAgIClcbiAgfVxuXG4gIHNvcnREaXJlY3Rpb25Ub1RpdGxlKHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChzb3J0RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFTQ0VORElOR19USVRMRSdcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkRFU0NFTkRJTkdfVElUTEUnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uREVGQVVMVF9USVRMRSdcbiAgICB9XG4gIH1cblxuICBtYXBTZWxlY3Rpb25Ub1Jvd3MoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MkID0gY29tYmluZUxhdGVzdChbdGhpcy5fc2VsZWN0aW9uSWRzJCwgdGhpcy5fcm93cyRdKS5waXBlKFxuICAgICAgbWFwKChbc2VsZWN0ZWRSb3dJZHMsIHJvd3NdKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkcy5tYXAoKHJvd0lkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvd3MuZmluZCgocikgPT4gci5pZCA9PT0gcm93SWQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIGlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93T2JqZWN0OiBSb3cpIHtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHJvd09iamVjdCwgdGhpcy5zZWxlY3Rpb25FbmFibGVkRmllbGQpXG4gIH1cblxuICByb3dTZWxlY3RhYmxlKGV2ZW50OiBhbnkpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChldmVudC5kYXRhKVxuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uOiBSb3dbXSkge1xuICAgIGxldCBuZXdTZWxlY3Rpb25JZHMgPSBzZWxlY3Rpb24ubWFwKChyb3cpID0+IHJvdy5pZClcbiAgICBjb25zdCByb3dzID0gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRW5hYmxlZEZpZWxkKSB7XG4gICAgICBjb25zdCBkaXNhYmxlZFJvd0lkcyA9IHJvd3MuZmlsdGVyKChyKSA9PiAhdGhpcy5maWVsZElzVHJ1dGh5KHIsIHRoaXMuc2VsZWN0aW9uRW5hYmxlZEZpZWxkKSkubWFwKChyb3cpID0+IHJvdy5pZClcbiAgICAgIGlmIChkaXNhYmxlZFJvd0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbklkcyA9IHRoaXMubWVyZ2VXaXRoRGlzYWJsZWRLZXlzKG5ld1NlbGVjdGlvbklkcywgZGlzYWJsZWRSb3dJZHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0aW9uSWRzJC5uZXh0KG5ld1NlbGVjdGlvbklkcylcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpLmZpbHRlcigocm93KSA9PiBuZXdTZWxlY3Rpb25JZHMuaW5jbHVkZXMocm93LmlkKSkpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIG1lcmdlV2l0aERpc2FibGVkS2V5cyhuZXdTZWxlY3Rpb25JZHM6IChzdHJpbmcgfCBudW1iZXIpW10sIGRpc2FibGVkUm93SWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKSB7XG4gICAgY29uc3QgcHJldmlvdXNTZWxlY3Rpb25JZHMgPSB0aGlzLl9zZWxlY3Rpb25JZHMkLmdldFZhbHVlKClcbiAgICBjb25zdCBwcmV2aW91c2x5U2VsZWN0ZWRBbmREaXNhYmxlZCA9IHByZXZpb3VzU2VsZWN0aW9uSWRzLmZpbHRlcigoaWQpID0+IGRpc2FibGVkUm93SWRzLmluY2x1ZGVzKGlkKSlcbiAgICBjb25zdCBkaXNhYmxlZEFuZFByZXZpb3VzbHlEZXNlbGVjdGVkID0gZGlzYWJsZWRSb3dJZHMuZmlsdGVyKChpZCkgPT4gIXByZXZpb3VzU2VsZWN0aW9uSWRzLmluY2x1ZGVzKGlkKSlcbiAgICBjb25zdCB1cGRhdGVkU2VsZWN0aW9uID0gWy4uLm5ld1NlbGVjdGlvbklkc11cblxuICAgIHByZXZpb3VzbHlTZWxlY3RlZEFuZERpc2FibGVkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBpZiAoIXVwZGF0ZWRTZWxlY3Rpb24uaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgIHVwZGF0ZWRTZWxlY3Rpb24ucHVzaChpZClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZGlzYWJsZWRBbmRQcmV2aW91c2x5RGVzZWxlY3RlZC5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB1cGRhdGVkU2VsZWN0aW9uLmluZGV4T2YoaWQpXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB1cGRhdGVkU2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHVwZGF0ZWRTZWxlY3Rpb25cbiAgfVxuXG4gIGlzU2VsZWN0ZWQocm93OiBSb3cpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uSWRzJC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHJvdy5pZClcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgcGFnZSA9IGV2ZW50LmZpcnN0IC8gZXZlbnQucm93c1xuICAgIHRoaXMucGFnZSA9IHBhZ2VcbiAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnQucm93c1xuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChwYWdlKVxuICAgIHRoaXMucGFnZVNpemVDaGFuZ2VkLmVtaXQoZXZlbnQucm93cylcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgYWN0aXZlUGFnZTogcGFnZSxcbiAgICAgIHBhZ2VTaXplOiBldmVudC5yb3dzLFxuICAgIH0pXG4gIH1cblxuICByZXNldFBhZ2UoKSB7XG4gICAgdGhpcy5wYWdlID0gMFxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh0aGlzLnBhZ2UpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIGZpZWxkSXNUcnV0aHkob2JqZWN0OiBhbnksIGtleTogYW55KSB7XG4gICAgcmV0dXJuICEhT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShvYmplY3QsIGtleSlcbiAgfVxuXG4gIHRvZ2dsZU92ZXJmbG93TWVudShldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudSwgcm93OiBSb3cpIHtcbiAgICB0aGlzLmN1cnJlbnRNZW51Um93JC5uZXh0KHJvdylcbiAgICBtZW51LnRvZ2dsZShldmVudClcbiAgfVxuXG4gIGhhc1Zpc2libGVPdmVyZmxvd01lbnVJdGVtcyhyb3c6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm92ZXJmbG93QWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT5cbiAgICAgICAgYWN0aW9ucy5zb21lKFxuICAgICAgICAgIChhKSA9PlxuICAgICAgICAgICAgIWEuYWN0aW9uVmlzaWJsZUZpZWxkIHx8XG4gICAgICAgICAgICAodGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25WaXNpYmxlRmllbGQpICYmIHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhLnBlcm1pc3Npb24pKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgaXNEYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKVxuICAgIHJldHVybiBpc1ZhbGlkRGF0ZShkKVxuICB9XG5cbiAgY2VsbFRlbXBsYXRlc0RhdGE6IFRlbXBsYXRlc0RhdGEgPSB7XG4gICAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IHt9LFxuICAgIGlkU3VmZml4OiBbJ0lkVGFibGVDZWxsJywgJ0lkQ2VsbCddLFxuICAgIHRlbXBsYXRlTmFtZXM6IHtcbiAgICAgIFtDb2x1bW5UeXBlLkRBVEVdOiBbJ2RhdGVDZWxsJywgJ2RhdGVUYWJsZUNlbGwnLCAnZGVmYXVsdERhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5OVU1CRVJdOiBbJ251bWJlckNlbGwnLCAnbnVtYmVyVGFibGVDZWxsJywgJ2RlZmF1bHROdW1iZXJDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFXTogWydyZWxhdGl2ZURhdGVDZWxsJywgJ3JlbGF0aXZlRGF0ZVRhYmxlQ2VsbCcsICdkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXTogWyd0cmFuc2xhdGlvbktleUNlbGwnLCAndHJhbnNsYXRpb25LZXlUYWJsZUNlbGwnLCAnZGVmYXVsdFRyYW5zbGF0aW9uS2V5Q2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuQ1VTVE9NXTogWydjdXN0b21DZWxsJywgJ2N1c3RvbVRhYmxlQ2VsbCcsICdkZWZhdWx0Q3VzdG9tQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuU1RSSU5HXTogWydzdHJpbmdDZWxsJywgJ3N0cmluZ1RhYmxlQ2VsbCcsICdkZWZhdWx0U3RyaW5nQ2VsbCddLFxuICAgIH0sXG4gIH1cblxuICBmaWx0ZXJUZW1wbGF0ZXNEYXRhOiBUZW1wbGF0ZXNEYXRhID0ge1xuICAgIHRlbXBsYXRlc09ic2VydmFibGVzOiB7fSxcbiAgICBpZFN1ZmZpeDogWydJZFRhYmxlRmlsdGVyQ2VsbCcsICdJZEZpbHRlckNlbGwnLCAnSWRUYWJsZUNlbGwnLCAnSWRDZWxsJ10sXG4gICAgdGVtcGxhdGVOYW1lczoge1xuICAgICAgW0NvbHVtblR5cGUuREFURV06IFsnZGF0ZUZpbHRlckNlbGwnLCAnZGF0ZVRhYmxlRmlsdGVyQ2VsbCcsICdkYXRlQ2VsbCcsICdkYXRlVGFibGVDZWxsJywgJ2RlZmF1bHREYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuTlVNQkVSXTogW1xuICAgICAgICAnbnVtYmVyRmlsdGVyQ2VsbCcsXG4gICAgICAgICdudW1iZXJUYWJsZUZpbHRlckNlbGwnLFxuICAgICAgICAnbnVtYmVyQ2VsbCcsXG4gICAgICAgICdudW1iZXJUYWJsZUNlbGwnLFxuICAgICAgICAnZGVmYXVsdE51bWJlckNlbGwnLFxuICAgICAgXSxcbiAgICAgIFtDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEVdOiBbXG4gICAgICAgICdyZWxhdGl2ZURhdGVGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ3JlbGF0aXZlRGF0ZVRhYmxlRmlsdGVyQ2VsbCcsXG4gICAgICAgICdyZWxhdGl2ZURhdGVDZWxsJyxcbiAgICAgICAgJ3JlbGF0aXZlRGF0ZVRhYmxlQ2VsbCcsXG4gICAgICAgICdkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbCcsXG4gICAgICBdLFxuICAgICAgW0NvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXTogW1xuICAgICAgICAndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ3RyYW5zbGF0aW9uS2V5VGFibGVGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ2RlZmF1bHRUcmFuc2xhdGlvbktleUNlbGwnLFxuICAgICAgICAndHJhbnNsYXRpb25LZXlDZWxsJyxcbiAgICAgICAgJ3RyYW5zbGF0aW9uS2V5VGFibGVDZWxsJyxcbiAgICAgIF0sXG4gICAgICBbQ29sdW1uVHlwZS5DVVNUT01dOiBbXG4gICAgICAgICdjdXN0b21GaWx0ZXJDZWxsJyxcbiAgICAgICAgJ2N1c3RvbVRhYmxlRmlsdGVyQ2VsbCcsXG4gICAgICAgICdjdXN0b21DZWxsJyxcbiAgICAgICAgJ2N1c3RvbVRhYmxlQ2VsbCcsXG4gICAgICAgICdkZWZhdWx0Q3VzdG9tQ2VsbCcsXG4gICAgICBdLFxuICAgICAgW0NvbHVtblR5cGUuU1RSSU5HXTogW1xuICAgICAgICAnc3RyaW5nRmlsdGVyQ2VsbCcsXG4gICAgICAgICdzdHJpbmdUYWJsZUZpbHRlckNlbGwnLFxuICAgICAgICAnc3RyaW5nQ2VsbCcsXG4gICAgICAgICdzdHJpbmdUYWJsZUNlbGwnLFxuICAgICAgICAnZGVmYXVsdFN0cmluZ0NlbGwnLFxuICAgICAgXSxcbiAgICB9LFxuICB9XG5cbiAgdGVtcGxhdGVzRGF0YU1hcDogUmVjb3JkPFRlbXBsYXRlVHlwZSwgVGVtcGxhdGVzRGF0YT4gPSB7XG4gICAgW1RlbXBsYXRlVHlwZS5DRUxMXTogdGhpcy5jZWxsVGVtcGxhdGVzRGF0YSxcbiAgICBbVGVtcGxhdGVUeXBlLkZJTFRFUkNFTExdOiB0aGlzLmZpbHRlclRlbXBsYXRlc0RhdGEsXG4gIH1cblxuICBnZXRDb2x1bW5UeXBlVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIGNvbHVtblR5cGU6IENvbHVtblR5cGUsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKSB7XG4gICAgbGV0IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuICAgICAgY2FzZSBUZW1wbGF0ZVR5cGUuQ0VMTDpcbiAgICAgICAgc3dpdGNoIChjb2x1bW5UeXBlKSB7XG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkRBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2RhdGVDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX251bWJlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3JlbGF0aXZlRGF0ZUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fdHJhbnNsYXRpb25LZXlDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5DVVNUT006XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2N1c3RvbUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fc3RyaW5nQ2VsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFRlbXBsYXRlVHlwZS5GSUxURVJDRUxMOlxuICAgICAgICBzd2l0Y2ggKGNvbHVtblR5cGUpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fZGF0ZUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fbnVtYmVyRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuUkVMQVRJVkVfREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl90cmFuc2xhdGlvbktleUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fY3VzdG9tRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9zdHJpbmdGaWx0ZXJDZWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGVtcGxhdGUgPz9cbiAgICAgIGZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZXMsIHRoaXMudGVtcGxhdGVzRGF0YU1hcFt0ZW1wbGF0ZVR5cGVdLnRlbXBsYXRlTmFtZXNbY29sdW1uVHlwZV0pPy50ZW1wbGF0ZSA/P1xuICAgICAgbnVsbFxuICAgIClcbiAgfVxuXG4gIGdldFRlbXBsYXRlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uLCB0ZW1wbGF0ZVR5cGU6IFRlbXBsYXRlVHlwZSk6IE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXNEYXRhID0gdGhpcy50ZW1wbGF0ZXNEYXRhTWFwW3RlbXBsYXRlVHlwZV1cblxuICAgIGlmICghdGVtcGxhdGVzRGF0YS50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdKSB7XG4gICAgICB0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF0gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMkLFxuICAgICAgICB0aGlzLnZpZXdUZW1wbGF0ZXMkLFxuICAgICAgICB0aGlzLnBhcmVudFRlbXBsYXRlcyQsXG4gICAgICBdKS5waXBlKFxuICAgICAgICBtYXAoKFt0LCB2dCwgcHRdKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gWy4uLih0ID8/IFtdKSwgLi4uKHZ0ID8/IFtdKSwgLi4uKHB0ID8/IFtdKV1cbiAgICAgICAgICBjb25zdCBjb2x1bW5UZW1wbGF0ZSA9IGZpbmRUZW1wbGF0ZShcbiAgICAgICAgICAgIHRlbXBsYXRlcyxcbiAgICAgICAgICAgIHRlbXBsYXRlc0RhdGEuaWRTdWZmaXgubWFwKChzdWZmaXgpID0+IGNvbHVtbi5pZCArIHN1ZmZpeClcbiAgICAgICAgICApPy50ZW1wbGF0ZVxuICAgICAgICAgIGlmIChjb2x1bW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtblRlbXBsYXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbHVtblR5cGVUZW1wbGF0ZSh0ZW1wbGF0ZXMsIGNvbHVtbi5jb2x1bW5UeXBlLCB0ZW1wbGF0ZVR5cGUpXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF1cbiAgfVxuXG4gIHJlc29sdmVGaWVsZERhdGEob2JqZWN0OiBhbnksIGtleTogYW55KSB7XG4gICAgcmV0dXJuIE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICBnZXRSb3dPYmplY3RGcm9tTXVsdGlzZWxlY3RJdGVtKHZhbHVlOiBNdWx0aVNlbGVjdEl0ZW0sIGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtjb2x1bW4uaWRdOiB2YWx1ZS5sYWJlbCxcbiAgICB9XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjYWN0aW9uQ29sdW1uIGxldC1yb3dPYmplY3Q9XCJsb2NhbFJvd09iamVjdFwiPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhbnlSb3dBY3Rpb25PYnNlcnZlZCB8fCB0aGlzLmFkZGl0aW9uYWxBY3Rpb25zLmxlbmd0aCA+IDAgfHwgKCh0aGlzLm92ZXJmbG93QWN0aW9ucyQgfCBhc3luYykgPz8gW10pLmxlbmd0aCA+IDBcIlxuICA+XG4gICAgPHRkXG4gICAgICBjbGFzcz1cImFjdGlvbnNcIlxuICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgW2Zyb3plbl09XCJmcm96ZW5BY3Rpb25Db2x1bW5cIlxuICAgICAgW2FsaWduRnJvemVuXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uXCJcbiAgICAgIFthdHRyLm5hbWVdPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JyA/ICdhY3Rpb24tY29sdW1uLWxlZnQnIDogJ2FjdGlvbi1jb2x1bW4tcmlnaHQnXCJcbiAgICAgIFtuZ0NsYXNzXT1cIihmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JykgPyAnYm9yZGVyLXJpZ2h0LTEnIDogKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JykgPyAnYm9yZGVyLWxlZnQtMScgOiAnJ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImljb24tYnV0dG9uLXJvdy13cmFwcGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cInZpZXdUYWJsZVJvd09ic2VydmVkICYmICghdmlld0FjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgdmlld0FjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlkPVwie3tyZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgJ2lkJyl9fS12aWV3QnV0dG9uXCJcbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJ2aWV3UGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISF2aWV3QWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgdmlld0FjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgdmlld1RhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuVklFVycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5WSUVXJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZXllXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblZpZXdSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJlZGl0VGFibGVSb3dPYnNlcnZlZCAmJiAoIWVkaXRBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGVkaXRBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBpZD1cInt7cmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsICdpZCcpfX0tZWRpdEJ1dHRvblwiXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZWRpdFBlcm1pc3Npb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhZWRpdEFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGVkaXRBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IGVkaXRUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkVESVQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuRURJVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25FZGl0Um93KHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiZGVsZXRlVGFibGVSb3dPYnNlcnZlZCAmJiAoIWRlbGV0ZUFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWQ9XCJ7e3Jlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCAnaWQnKX19LWRlbGV0ZUJ1dHRvblwiXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZGVsZXRlUGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFkZWxldGVBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBkZWxldGVUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5ERUxFVEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaW5saW5lQWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQpKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBpZD1cInt7cmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsICdpZCcpfX0te3thY3Rpb24uaWQgPyBhY3Rpb24uaWQuY29uY2F0KCdBY3Rpb25CdXR0b24nKSA6ICdpbmxpbmVBY3Rpb25CdXR0b24nfX1cIlxuICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiYWN0aW9uLnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uLmNsYXNzZXNcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24uY2FsbGJhY2socm93T2JqZWN0KVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCAoISFhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgYWN0aW9uLmFjdGlvbkVuYWJsZWRGaWVsZCkpXCJcbiAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVmlzaWJsZU92ZXJmbG93TWVudUl0ZW1zKHJvd09iamVjdCkgfCBhc3luY1wiPlxuICAgICAgICAgIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cIihvdmVyZmxvd01lbnVJdGVtcyQgfCBhc3luYykgfHwgW11cIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgIFtpY29uXT1cIidwaSBwaS1lbGxpcHNpcy12J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3ZlcmZsb3dNZW51KCRldmVudCwgbWVudSwgcm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhY3Rpb25Db2x1bW5IZWFkZXI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCAgfHwgKCh0aGlzLm92ZXJmbG93QWN0aW9ucyQgfCBhc3luYykgPz8gW10pLmxlbmd0aCA+IDBcIlxuICA+XG4gICAgPHRoXG4gICAgICBwRnJvemVuQ29sdW1uXG4gICAgICBbZnJvemVuXT1cImZyb3plbkFjdGlvbkNvbHVtblwiXG4gICAgICBbYWxpZ25Gcm96ZW5dPVwiYWN0aW9uQ29sdW1uUG9zaXRpb25cIlxuICAgICAgW25nQ2xhc3NdPVwiKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnKSA/ICdib3JkZXItcmlnaHQtMScgOiAoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdib3JkZXItbGVmdC0xJyA6ICcnXCJcbiAgICAgIFthdHRyLm5hbWVdPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JyA/ICdhY3Rpb24tY29sdW1uLWhlYWRlci1sZWZ0JyA6ICdhY3Rpb24tY29sdW1uLWhlYWRlci1yaWdodCdcIlxuICAgID5cbiAgICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TX0NPTFVNTl9OQU1FJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvdGg+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIihkaXNwbGF5ZWRQYWdlU2l6ZSQgfCBhc3luYykgYXMgZGlzcGxheWVkUGFnZVNpemVcIj5cbiAgPHAtdGFibGVcbiAgICAqbmdJZj1cIihjb2x1bW5UZW1wbGF0ZXMkIHwgYXN5bmMpID8/IHt9IGFzIGNvbHVtblRlbXBsYXRlc1wiXG4gICAgW3ZhbHVlXT1cIihkaXNwbGF5ZWRSb3dzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgW3BhZ2luYXRvcl09XCJwYWdpbmF0b3JcIlxuICAgIFtmaXJzdF09XCJwYWdlICogZGlzcGxheWVkUGFnZVNpemVcIlxuICAgIChvblBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgIFtyb3dzXT1cImRpc3BsYXllZFBhZ2VTaXplXCJcbiAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAodG90YWxSZWNvcmRzT25TZXJ2ZXIgPyBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA6IGN1cnJlbnRQYWdlU2hvd2luZ0tleSkgfCB0cmFuc2xhdGU6cGFyYW1zIH19XCJcbiAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIihkaXNwbGF5ZWRQYWdlU2l6ZXMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICBpZD1cImRhdGFUYWJsZV97e25hbWV9fVwiXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICBbc2VsZWN0aW9uXT1cIihzZWxlY3RlZFJvd3MkIHwgYXN5bmMpID8/IFtdXCJcbiAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBzY3JvbGxIZWlnaHQ9XCJmbGV4XCJcbiAgICBbc3R5bGVdPVwidGFibGVTdHlsZVwiXG4gICAgcGFnaW5hdG9yRHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxuICAgIFtyb3dTZWxlY3RhYmxlXT1cInJvd1NlbGVjdGFibGVcIlxuICAgIHRhYmxlU3R5bGVDbGFzcz1cImgtZnVsbFwiXG4gID5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICA8dHIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogdG9wXCI+XG4gICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0cmVtXCIgc2NvcGU9XCJjb2xcIiAqbmdJZj1cInNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZFwiPlxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3hcbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dTZWxlY3RBbGxcIlxuICAgICAgICAgICAgcFRvb2x0aXA9XCJ7eydPQ1hfREFUQV9UQUJMRS5TRUxFQ1RfQUxMX1RPT0xUSVAnIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgYXJpYUxhYmVsPVwie3snT0NYX0RBVEFfVEFCTEUuU0VMRUNUX0FMTF9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICA+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgPHRoICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlIHx8IGNvbHVtbi5maWx0ZXJhYmxlOyBlbHNlIHNpbXBsZUhlYWRlclwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtaGVhZGVyLXdyYXBwZXIgZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4XCIgaWQ9XCJ7e2NvbHVtbi5pZH19LWhlYWRlci1uYW1lXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBpY29uLWJ1dHRvbi1oZWFkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgc29ydEJ1dHRvbiBwbC0wXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFsdF09XCIoY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnTk9ORScpIHx8IGNvbHVtbj8uaWQgIT09IHNvcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LXVwXT1cImNvbHVtbj8uaWQgPT09IHNvcnRDb2x1bW4gJiYgc29ydERpcmVjdGlvbiA9PT0gJ0FTQ0VORElORydcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LWRvd25dPVwiY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnREVTQ0VORElORydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU29ydENvbHVtbkNsaWNrKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihzb3J0SWNvblRpdGxlKGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKCdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGNvbHVtbjogKGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlKSwgZGlyZWN0aW9uOiAoc29ydERpcmVjdGlvblRvVGl0bGUoY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oY29sdW1uLmlkKSkgfCB0cmFuc2xhdGUpfSlcIlxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudEVxdWFsRmlsdGVyT3B0aW9ucyQgfCBhc3luYyBhcyBlcXVhbEZpbHRlck9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXMkIHwgYXN5bmMgYXMgY29sdW1uRmlsdGVyVGVtcGxhdGVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXJNdWx0aVNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZSAmJiAoIWNvbHVtbi5maWx0ZXJUeXBlIHx8IGNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLkVRVUFMKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZXF1YWxGaWx0ZXJPcHRpb25zLmNvbHVtbj8uaWQgPT09IGNvbHVtbi5pZCA/IGVxdWFsRmlsdGVyT3B0aW9ucy5vcHRpb25zIDogW11cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihjdXJyZW50RXF1YWxTZWxlY3RlZEZpbHRlcnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuRU1QVFlfRklMVEVSX01FU1NBR0UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXNldEZpbHRlck9uSGlkZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25NdWx0aXNlbGVjdEZpbHRlckNoYW5nZShjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJCeT1cInRvRmlsdGVyQnlcIlxuICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRmlsdGVyQ2hvc2VuKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuRklMVEVSX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQ09MVU1OX0ZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FyaWFGaWx0ZXJMYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBjb2x1bW46IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlfSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbXNcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyXT1cIiEoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlci1maWxsXT1cIigoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF0gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbkZpbHRlclRlbXBsYXRlc1tjb2x1bW4uaWRdIGFzIHRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgIHJvd09iamVjdDogZ2V0Um93T2JqZWN0RnJvbU11bHRpc2VsZWN0SXRlbSh2YWx1ZSwgY29sdW1uKSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXJNdWx0aVNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlICYmIGNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLlRSVVRIWVwiXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ0cnV0aHlGaWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihjdXJyZW50VHJ1dGh5U2VsZWN0ZWRGaWx0ZXJzJCB8IGFzeW5jKSB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5FTVBUWV9GSUxURVJfTUVTU0FHRScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlTZWxlY3RlZExhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtyZXNldEZpbHRlck9uSGlkZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbk11bHRpc2VsZWN0RmlsdGVyQ2hhbmdlKGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkljb25cIlxuICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRmlsdGVyQ2hvc2VuKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidPQ1hfREFUQV9UQUJMRS5GSUxURVJfVElUTEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkNPTFVNTl9GSUxURVJfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2FyaWFGaWx0ZXJMYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBjb2x1bW46IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlfSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1zXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlcl09XCIhKChmaWx0ZXJBbW91bnRzJCB8IGFzeW5jKSB8fCB7fSlbY29sdW1uLmlkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlci1maWxsXT1cIigoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF0gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LXZhbHVlPiB7e3ZhbHVlLmtleSB8IHRyYW5zbGF0ZX19IDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2ltcGxlSGVhZGVyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCc7XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dPYmplY3Q+XG4gICAgICA8dHIgKm5nSWY9XCJjb2x1bW5UZW1wbGF0ZXNcIj5cbiAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkXCI+XG4gICAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICAgICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3dPYmplY3QpICYmIGlzU2VsZWN0ZWQocm93T2JqZWN0KTsgZWxzZSBkZWZhdWx0Q2hlY2tib3hcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGVja2VkXCJcbiAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5TRUxFQ1RfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsga2V5OiByb3dPYmplY3QuaWR9XCJcbiAgICAgICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENoZWNrYm94PlxuICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveFxuICAgICAgICAgICAgICBbdmFsdWVdPVwicm93T2JqZWN0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93T2JqZWN0KVwiXG4gICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLlNFTEVDVF9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBrZXk6IHJvd09iamVjdC5pZH1cIlxuICAgICAgICAgICAgPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxuICAgICAgICAgIEBkZWZlcihvbiB2aWV3cG9ydCl7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgICAgICBfY2VsbCA/IF9jZWxsOiBjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIzcmVtXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgPHRyPlxuICAgICAgICA8dGQgW2NvbFNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoKGFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCkgPyAxIDogMClcIj5cbiAgICAgICAgICB7eyBlbXB0eVJlc3VsdHNNZXNzYWdlIHx8IChcIk9DWF9EQVRBX1RBQkxFLkVNUFRZX1JFU1VMVFwiIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRTdHJpbmdDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCl9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0TnVtYmVyQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgbnVtYmVyIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRDdXN0b21DZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj4gPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHREYXRlQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgZGF0ZTogY29sdW1uLmRhdGVGb3JtYXQgPz8gJ21lZGl1bScgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPlxuICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5FRElURUQnIHwgdHJhbnNsYXRlIH19IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgdGltZWFnbyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|