@seniorsistemas/data-seniorx-core 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/constants/chips.const.d.ts +1 -0
- package/core/constants/combobox.const.d.ts +1 -1
- package/core/constants/fileupload.const.d.ts +9 -0
- package/core/constants/icon-picker.const.d.ts +1 -0
- package/core/constants/picklist.const.d.ts +1 -0
- package/core/constants/table.const.d.ts +43 -0
- package/core/types/button.type.d.ts +18 -2
- package/core/types/fileupload.type.d.ts +17 -0
- package/core/types/filters.type.d.ts +4 -0
- package/core/types/table-column.type.d.ts +31 -0
- package/core/types/table-options.type.d.ts +90 -0
- package/core/types/table-shared.type.d.ts +13 -0
- package/core/types/table-visual.type.d.ts +23 -0
- package/core/types/table.type.d.ts +4 -113
- package/core/utils/layout.util.d.ts +4 -0
- package/esm2022/core/constants/chips.const.mjs +2 -1
- package/esm2022/core/constants/combobox.const.mjs +2 -2
- package/esm2022/core/constants/fileupload.const.mjs +10 -0
- package/esm2022/core/constants/icon-picker.const.mjs +76 -1
- package/esm2022/core/constants/picklist.const.mjs +2 -1
- package/esm2022/core/constants/table.const.mjs +53 -6
- package/esm2022/core/types/button.type.mjs +1 -1
- package/esm2022/core/types/fileupload.type.mjs +2 -0
- package/esm2022/core/types/filters.type.mjs +1 -1
- package/esm2022/core/types/table-column.type.mjs +2 -0
- package/esm2022/core/types/table-options.type.mjs +2 -0
- package/esm2022/core/types/table-shared.type.mjs +2 -0
- package/esm2022/core/types/table-visual.type.mjs +2 -0
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/utils/combobox.util.mjs +2 -2
- package/esm2022/core/utils/layout.util.mjs +21 -5
- package/esm2022/features/accordion/accordion-item.component.mjs +1 -1
- package/esm2022/features/badge/badge.component.mjs +1 -1
- package/esm2022/features/button/button.component.mjs +76 -11
- package/esm2022/features/button/components/button-menu.component.mjs +81 -0
- package/esm2022/features/card-list/card/card.component.mjs +3 -3
- package/esm2022/features/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/features/chips/chips.component.mjs +8 -5
- package/esm2022/features/color-picker/color-picker.component.mjs +1 -1
- package/esm2022/features/combobox/combobox.component.mjs +17 -4
- package/esm2022/features/fileupload/fileupload.component.mjs +311 -0
- package/esm2022/features/filters/filters.component.mjs +3 -3
- package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
- package/esm2022/features/icon-picker/icon-picker.component.mjs +34 -7
- package/esm2022/features/info-sign/info-sign.component.mjs +1 -1
- package/esm2022/features/mask/mask.component.mjs +1 -1
- package/esm2022/features/modal/modal.component.mjs +1 -1
- package/esm2022/features/number-input/number-input.component.mjs +1 -1
- package/esm2022/features/paginator/paginator.component.mjs +3 -3
- package/esm2022/features/picklist/picklist.component.mjs +33 -6
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/searchbox/searchbox.component.mjs +3 -3
- package/esm2022/features/stats-card/stats-card.component.mjs +1 -1
- package/esm2022/features/switch/switch.component.mjs +3 -2
- package/esm2022/features/table/components/table-actions-menu.component.mjs +86 -0
- package/esm2022/features/table/components/table-cell-content.component.mjs +124 -0
- package/esm2022/features/table/components/table-sort-indicator.component.mjs +65 -0
- package/esm2022/features/table/table.component.mjs +116 -319
- package/esm2022/features/table/utils/table-config.util.mjs +35 -0
- package/esm2022/features/table/utils/table-data.util.mjs +96 -0
- package/esm2022/features/table/utils/table-layout.util.mjs +25 -0
- package/esm2022/features/table/utils/table-truncate.pipe.mjs +19 -0
- package/esm2022/features/table/utils/table-visual.util.mjs +221 -0
- package/esm2022/features/textarea/textarea.component.mjs +1 -1
- package/esm2022/features/textbox/textbox.component.mjs +1 -1
- package/esm2022/features/tooltip/tooltip.component.mjs +12 -3
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
- package/esm2022/locales/en.json +194 -0
- package/esm2022/locales/es-CO.json +187 -1
- package/esm2022/locales/pt.json +194 -0
- package/esm2022/providers/features.provider.mjs +3 -1
- package/esm2022/public-api.mjs +3 -1
- package/features/button/button.component.d.ts +14 -7
- package/features/button/components/button-menu.component.d.ts +25 -0
- package/features/chips/chips.component.d.ts +1 -0
- package/features/combobox/combobox.component.d.ts +4 -1
- package/features/fileupload/fileupload.component.d.ts +66 -0
- package/features/icon-picker/icon-picker.component.d.ts +3 -0
- package/features/modal/modal.component.d.ts +1 -1
- package/features/picklist/picklist.component.d.ts +6 -1
- package/features/table/components/table-actions-menu.component.d.ts +12 -0
- package/features/table/components/table-cell-content.component.d.ts +41 -0
- package/features/table/components/table-sort-indicator.component.d.ts +11 -0
- package/features/table/table.component.d.ts +28 -44
- package/features/table/utils/table-config.util.d.ts +3 -0
- package/features/table/utils/table-data.util.d.ts +10 -0
- package/features/table/utils/table-layout.util.d.ts +4 -0
- package/features/table/utils/table-truncate.pipe.d.ts +12 -0
- package/features/table/utils/table-visual.util.d.ts +21 -0
- package/features/tooltip/tooltip.component.d.ts +3 -1
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +3525 -1848
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +5 -2
- package/src/locales/en.json +194 -0
- package/src/locales/es-CO.json +187 -1
- package/src/locales/pt.json +194 -0
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
2
|
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewEncapsulation, computed, signal } from '@angular/core';
|
|
3
3
|
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { DEFAULT_TABLE_OPTIONS, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX as DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX as DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROW_HEIGHT_PX as DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROW_ID_PREVIEW_LENGTH as DEFAULT_ROW_ID_PREVIEW_LENGTH, TABLE_DEFAULT_ROWS_PER_PAGE as DEFAULT_ROWS_PER_PAGE, TABLE_DISABLED_TAG_VALUES as DISABLED_TAG_VALUES, TABLE_ENABLED_TAG_VALUES as ENABLED_TAG_VALUES, TABLE_HEX_RADIX as HEX_RADIX, TABLE_INDEX_ZERO as INDEX_ZERO, TABLE_MENU_GAP_PX as MENU_GAP_PX, TABLE_RGB_MAX as RGB_MAX, TABLE_TAG_BACKGROUND_ALPHA as TAG_BACKGROUND_ALPHA, TABLE_TAG_FOREGROUND_DARKEN_AMOUNT as TAG_FOREGROUND_DARKEN_AMOUNT } from '../../core/constants/table.const';
|
|
4
|
+
import { getViewportWidth, isMobileViewport } from '../../core/utils/layout.util';
|
|
5
|
+
import { DEFAULT_TABLE_OPTIONS, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX as DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX as DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROW_HEIGHT_PX as DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROWS_PER_PAGE as DEFAULT_ROWS_PER_PAGE, TABLE_INDEX_ZERO as INDEX_ZERO, TABLE_MENU_GAP_PX as MENU_GAP_PX, TABLE_MOBILE_CARD_ESTIMATED_HEIGHT_PX } from '../../core/constants/table.const';
|
|
7
6
|
import { ButtonComponent } from '../button/button.component';
|
|
8
7
|
import { EmptyStateComponent } from '../empty-state/empty-state.component';
|
|
9
8
|
import { PaginatorComponent } from '../paginator/paginator.component';
|
|
10
9
|
import { SearchboxComponent } from '../searchbox/searchbox.component';
|
|
11
10
|
import { LoadingStateComponent } from '../loading-state/loading-state.component';
|
|
11
|
+
import { TableActionsMenuComponent } from './components/table-actions-menu.component';
|
|
12
|
+
import { TableCellContentComponent } from './components/table-cell-content.component';
|
|
13
|
+
import { TableSortIndicatorComponent } from './components/table-sort-indicator.component';
|
|
14
|
+
import { buildTableCellConfigMap, mergeTableOptions } from './utils/table-config.util';
|
|
15
|
+
import { buildRowCheckboxId, filterTableRows, getNestedValue, resolveRowIdentityLabel } from './utils/table-data.util';
|
|
16
|
+
import { getTableColumnMinWidthPx, getTableMinWidthPx, normalizeTableColumnAlignment } from './utils/table-layout.util';
|
|
12
17
|
import * as i0 from "@angular/core";
|
|
13
18
|
import * as i1 from "@angular/common";
|
|
14
19
|
import * as i2 from "@ngx-translate/core";
|
|
@@ -16,9 +21,19 @@ export class TableComponent {
|
|
|
16
21
|
colsSignal = signal([]);
|
|
17
22
|
dataSignal = signal([]);
|
|
18
23
|
loadingSignal = signal(false);
|
|
19
|
-
|
|
24
|
+
viewportWidthSignal = signal(getViewportWidth());
|
|
25
|
+
configSignal = signal(mergeTableOptions(DEFAULT_TABLE_OPTIONS));
|
|
20
26
|
_config = DEFAULT_TABLE_OPTIONS;
|
|
27
|
+
pathPartsCache = new Map();
|
|
28
|
+
rowCheckboxIdCache = new WeakMap();
|
|
21
29
|
openMenuState = signal(null);
|
|
30
|
+
ariaLabelSignal = signal(undefined);
|
|
31
|
+
globalFilter = signal('');
|
|
32
|
+
sortField = signal(null);
|
|
33
|
+
sortOrder = signal(0);
|
|
34
|
+
selection = signal([]);
|
|
35
|
+
first = signal(INDEX_ZERO);
|
|
36
|
+
rows = signal(DEFAULT_ROWS_PER_PAGE);
|
|
22
37
|
set cols(value) {
|
|
23
38
|
this.colsSignal.set(value ?? []);
|
|
24
39
|
}
|
|
@@ -49,9 +64,8 @@ export class TableComponent {
|
|
|
49
64
|
return;
|
|
50
65
|
}
|
|
51
66
|
this._config = next;
|
|
52
|
-
|
|
53
|
-
this.configSignal
|
|
54
|
-
const nextRows = merged.pagination?.rowsPerPage ?? DEFAULT_ROWS_PER_PAGE;
|
|
67
|
+
this.configSignal.set(mergeTableOptions(next));
|
|
68
|
+
const nextRows = this.configSignal().pagination?.rowsPerPage ?? DEFAULT_ROWS_PER_PAGE;
|
|
55
69
|
this.rows.set(nextRows);
|
|
56
70
|
this.first.set(INDEX_ZERO);
|
|
57
71
|
this.pathPartsCache.clear();
|
|
@@ -64,17 +78,16 @@ export class TableComponent {
|
|
|
64
78
|
set ariaLabel(value) {
|
|
65
79
|
this.ariaLabelSignal.set(value);
|
|
66
80
|
}
|
|
67
|
-
action = new EventEmitter();
|
|
68
|
-
lazyLoad = new EventEmitter();
|
|
69
81
|
get ariaLabel() {
|
|
70
82
|
return this.ariaLabelSignal();
|
|
71
83
|
}
|
|
84
|
+
action = new EventEmitter();
|
|
85
|
+
lazyLoad = new EventEmitter();
|
|
72
86
|
get isLoading() {
|
|
73
87
|
return this.loadingSignal();
|
|
74
88
|
}
|
|
75
|
-
isMobile = isMobile();
|
|
76
|
-
ariaLabelSignal = signal(undefined);
|
|
77
89
|
options = computed(() => this.configSignal());
|
|
90
|
+
isMobile = computed(() => isMobileViewport(this.viewportWidthSignal()));
|
|
78
91
|
showSearch = computed(() => this.options().search?.show ?? false);
|
|
79
92
|
showPaginator = computed(() => this.options().pagination?.show ?? false);
|
|
80
93
|
showInitialLoading = computed(() => this.loadingSignal() && this.dataSignal().length === 0);
|
|
@@ -82,69 +95,34 @@ export class TableComponent {
|
|
|
82
95
|
searchPlaceholder = computed(() => this.options().search?.placeholder ?? '');
|
|
83
96
|
triggerMode = computed(() => this.options().search?.type ?? 'auto');
|
|
84
97
|
totalRecordsLabel = computed(() => this.options().table?.totalRecordsLabel ?? '');
|
|
98
|
+
defaultTextOverflow = computed(() => this.options().table?.textOverflow);
|
|
85
99
|
emptyTitle = computed(() => this.options().empty?.title ?? '');
|
|
86
100
|
emptyText = computed(() => this.options().empty?.text ?? '');
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
sortOrder = signal(0);
|
|
90
|
-
selection = signal([]);
|
|
91
|
-
first = signal(INDEX_ZERO);
|
|
92
|
-
rows = signal(DEFAULT_ROWS_PER_PAGE);
|
|
93
|
-
cellsCfg = computed(() => {
|
|
94
|
-
const cells = this.options().cells;
|
|
95
|
-
return {
|
|
96
|
-
checkbox: cells?.checkbox ?? {},
|
|
97
|
-
button: cells?.button ?? {},
|
|
98
|
-
tag: cells?.tag ?? {},
|
|
99
|
-
actions: cells?.actions ?? {},
|
|
100
|
-
'icon-title': cells?.['icon-title'] ?? { iconField: 'icon' }
|
|
101
|
-
};
|
|
102
|
-
});
|
|
103
|
-
filteredData = computed(() => {
|
|
104
|
-
const q = this.globalFilter().trim().toLowerCase();
|
|
105
|
-
const data = this.dataSignal();
|
|
106
|
-
const cols = this.colsSignal();
|
|
107
|
-
if (!q) {
|
|
108
|
-
return data;
|
|
109
|
-
}
|
|
110
|
-
const fields = cols
|
|
111
|
-
.filter((c) => c.searchable ?? true)
|
|
112
|
-
.filter((c) => !!c.field)
|
|
113
|
-
.map((c) => c.field);
|
|
114
|
-
if (fields.length === 0) {
|
|
115
|
-
return data;
|
|
116
|
-
}
|
|
117
|
-
return data.filter((row) => fields.some((field) => {
|
|
118
|
-
const v = this._(row, field);
|
|
119
|
-
if (Array.isArray(v)) {
|
|
120
|
-
return v.join(' ').toLowerCase().includes(q);
|
|
121
|
-
}
|
|
122
|
-
return String(v ?? '').toLowerCase().includes(q);
|
|
123
|
-
}));
|
|
124
|
-
});
|
|
101
|
+
cellsCfg = computed(() => buildTableCellConfigMap(this.options()));
|
|
102
|
+
filteredData = computed(() => filterTableRows(this.dataSignal(), this.colsSignal(), this.globalFilter(), this.resolveValue));
|
|
125
103
|
sortedData = computed(() => {
|
|
126
104
|
const field = this.sortField();
|
|
127
105
|
const order = this.sortOrder();
|
|
128
|
-
const
|
|
106
|
+
const rows = [...this.filteredData()];
|
|
129
107
|
if (!field || order === 0) {
|
|
130
|
-
return
|
|
108
|
+
return rows;
|
|
131
109
|
}
|
|
132
|
-
return
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
if (
|
|
110
|
+
return rows.sort((leftRow, rightRow) => {
|
|
111
|
+
const leftValue = this.resolveValue(leftRow, field);
|
|
112
|
+
const rightValue = this.resolveValue(rightRow, field);
|
|
113
|
+
if (leftValue == null && rightValue == null) {
|
|
136
114
|
return 0;
|
|
137
115
|
}
|
|
138
|
-
if (
|
|
116
|
+
if (leftValue == null) {
|
|
139
117
|
return -order;
|
|
140
118
|
}
|
|
141
|
-
if (
|
|
119
|
+
if (rightValue == null) {
|
|
142
120
|
return order;
|
|
143
121
|
}
|
|
144
|
-
if (typeof
|
|
145
|
-
return (
|
|
122
|
+
if (typeof leftValue === 'number' && typeof rightValue === 'number') {
|
|
123
|
+
return (leftValue - rightValue) * order;
|
|
146
124
|
}
|
|
147
|
-
return String(
|
|
125
|
+
return String(leftValue).localeCompare(String(rightValue)) * order;
|
|
148
126
|
});
|
|
149
127
|
});
|
|
150
128
|
totalRecords = computed(() => this.sortedData().length);
|
|
@@ -169,13 +147,13 @@ export class TableComponent {
|
|
|
169
147
|
const rowsFromConfig = this.options().pagination?.rowsPerPage ?? DEFAULT_ROWS_PER_PAGE;
|
|
170
148
|
const normalizedRows = Number(rowsFromState || rowsFromConfig || DEFAULT_ROWS_PER_PAGE);
|
|
171
149
|
const safeRows = Number.isFinite(normalizedRows) && normalizedRows > 0 ? normalizedRows : DEFAULT_ROWS_PER_PAGE;
|
|
172
|
-
const rowHeight = this.isMobile ?
|
|
150
|
+
const rowHeight = this.isMobile() ? TABLE_MOBILE_CARD_ESTIMATED_HEIGHT_PX : DEFAULT_ROW_HEIGHT_PX;
|
|
173
151
|
const estimatedHeight = safeRows * rowHeight + DEFAULT_LOADING_VERTICAL_PADDING_PX;
|
|
174
152
|
return Math.max(DEFAULT_MIN_LOADING_HEIGHT_PX, estimatedHeight);
|
|
175
153
|
});
|
|
176
154
|
emptyBodyHeightPx = computed(() => this.bodyViewportHeightPx());
|
|
177
|
-
|
|
178
|
-
|
|
155
|
+
tableMinWidthPx = computed(() => getTableMinWidthPx(this.colsSignal()));
|
|
156
|
+
resolveValue = (obj, path) => getNestedValue(obj, path, this.pathPartsCache);
|
|
179
157
|
onDocumentClick() {
|
|
180
158
|
this.closeActionsMenu();
|
|
181
159
|
}
|
|
@@ -183,18 +161,19 @@ export class TableComponent {
|
|
|
183
161
|
this.closeActionsMenu();
|
|
184
162
|
}
|
|
185
163
|
onWindowResize() {
|
|
164
|
+
this.viewportWidthSignal.set(getViewportWidth());
|
|
186
165
|
this.closeActionsMenu();
|
|
187
166
|
}
|
|
188
167
|
onWindowScroll() {
|
|
189
168
|
this.closeActionsMenu();
|
|
190
169
|
}
|
|
191
|
-
onSearchTerm(
|
|
192
|
-
const term = typeof
|
|
170
|
+
onSearchTerm(eventOrValue) {
|
|
171
|
+
const term = typeof eventOrValue === 'string' ? eventOrValue : eventOrValue?.detail ?? '';
|
|
193
172
|
this.globalFilter.set(String(term));
|
|
194
173
|
this.first.set(INDEX_ZERO);
|
|
195
174
|
this.closeActionsMenu();
|
|
196
175
|
}
|
|
197
|
-
onClearSearch(
|
|
176
|
+
onClearSearch() {
|
|
198
177
|
this.globalFilter.set('');
|
|
199
178
|
this.first.set(INDEX_ZERO);
|
|
200
179
|
this.closeActionsMenu();
|
|
@@ -241,152 +220,106 @@ export class TableComponent {
|
|
|
241
220
|
return 'none';
|
|
242
221
|
}
|
|
243
222
|
columnAlignClass(col) {
|
|
244
|
-
const align =
|
|
223
|
+
const align = normalizeTableColumnAlignment(col.align);
|
|
245
224
|
return align ? `sdc-table-td-align-${align}` : null;
|
|
246
225
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
226
|
+
isSortableColumn(col) {
|
|
227
|
+
return col.sortable !== false && !!col.field;
|
|
228
|
+
}
|
|
229
|
+
columnMinWidthPx(col) {
|
|
230
|
+
return getTableColumnMinWidthPx(col);
|
|
231
|
+
}
|
|
232
|
+
mobileFieldLabel(col) {
|
|
233
|
+
if (col.header) {
|
|
234
|
+
return col.header;
|
|
235
|
+
}
|
|
236
|
+
switch (col.type) {
|
|
237
|
+
case 'actions':
|
|
238
|
+
return this.cellsCfg().actions.buttonLabel || 'platform.datacore.accessibility.actions_menu';
|
|
239
|
+
case 'button':
|
|
240
|
+
return this.cellsCfg().button.label
|
|
241
|
+
|| this.cellsCfg().button.tooltip
|
|
242
|
+
|| 'platform.datacore.accessibility.action_button';
|
|
243
|
+
default:
|
|
244
|
+
return '';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
onPageChange(event) {
|
|
248
|
+
const nextFirst = event.first ?? INDEX_ZERO;
|
|
249
|
+
const nextRows = event.rows ?? this.options().pagination?.rowsPerPage ?? DEFAULT_ROWS_PER_PAGE;
|
|
250
250
|
this.first.set(nextFirst);
|
|
251
251
|
this.rows.set(nextRows);
|
|
252
252
|
this.lazyLoad.emit({ first: nextFirst, rows: nextRows });
|
|
253
253
|
this.closeActionsMenu();
|
|
254
254
|
}
|
|
255
|
-
getCheckedValue(event) {
|
|
256
|
-
return event.target.checked;
|
|
257
|
-
}
|
|
258
255
|
onToggleRow(row, checked) {
|
|
259
|
-
const
|
|
256
|
+
const nextSelection = new Set(this.selectionSet());
|
|
260
257
|
if (checked) {
|
|
261
|
-
|
|
258
|
+
nextSelection.add(row);
|
|
262
259
|
}
|
|
263
260
|
else {
|
|
264
|
-
|
|
261
|
+
nextSelection.delete(row);
|
|
265
262
|
}
|
|
266
|
-
this.selection.set([...
|
|
263
|
+
this.selection.set([...nextSelection]);
|
|
267
264
|
}
|
|
268
265
|
isRowSelected(row) {
|
|
269
266
|
return this.selectionSet().has(row);
|
|
270
267
|
}
|
|
271
268
|
toggleSelectPage(checked) {
|
|
272
|
-
const
|
|
273
|
-
this.pageData().forEach((
|
|
269
|
+
const nextSelection = new Set(this.selectionSet());
|
|
270
|
+
this.pageData().forEach((row) => {
|
|
274
271
|
if (checked) {
|
|
275
|
-
|
|
272
|
+
nextSelection.add(row);
|
|
276
273
|
}
|
|
277
274
|
else {
|
|
278
|
-
|
|
275
|
+
nextSelection.delete(row);
|
|
279
276
|
}
|
|
280
277
|
});
|
|
281
|
-
this.selection.set([...
|
|
278
|
+
this.selection.set([...nextSelection]);
|
|
282
279
|
}
|
|
283
280
|
isPageFullySelected() {
|
|
284
281
|
const visibleRows = this.pageData();
|
|
285
282
|
if (visibleRows.length === 0) {
|
|
286
283
|
return false;
|
|
287
284
|
}
|
|
288
|
-
const
|
|
289
|
-
return visibleRows.every((
|
|
285
|
+
const selectedRows = this.selectionSet();
|
|
286
|
+
return visibleRows.every((row) => selectedRows.has(row));
|
|
287
|
+
}
|
|
288
|
+
getCheckedValue(event) {
|
|
289
|
+
return event.target.checked;
|
|
290
290
|
}
|
|
291
291
|
getRowCheckboxId(row) {
|
|
292
|
-
if (row
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const rowId = rowIdentity.id ??
|
|
299
|
-
rowIdentity.name ??
|
|
300
|
-
JSON.stringify(row).substring(INDEX_ZERO, DEFAULT_ROW_ID_PREVIEW_LENGTH);
|
|
301
|
-
const nextId = `checkbox-row-${String(rowId).replace(/[^a-zA-Z0-9]/g, '-')}`;
|
|
302
|
-
this.rowCheckboxIdCache.set(row, nextId);
|
|
303
|
-
return nextId;
|
|
292
|
+
if (!row || typeof row !== 'object') {
|
|
293
|
+
return buildRowCheckboxId(row);
|
|
294
|
+
}
|
|
295
|
+
const cached = this.rowCheckboxIdCache.get(row);
|
|
296
|
+
if (cached) {
|
|
297
|
+
return cached;
|
|
304
298
|
}
|
|
305
|
-
|
|
299
|
+
const nextId = buildRowCheckboxId(row);
|
|
300
|
+
this.rowCheckboxIdCache.set(row, nextId);
|
|
301
|
+
return nextId;
|
|
306
302
|
}
|
|
307
303
|
getRowCheckboxLabel(row) {
|
|
308
|
-
|
|
309
|
-
const label = this.resolveRowIdentityLabel(rowIdentity);
|
|
310
|
-
return String(label);
|
|
304
|
+
return resolveRowIdentityLabel(row);
|
|
311
305
|
}
|
|
312
306
|
tableAriaLabelKey() {
|
|
313
307
|
return this.ariaLabelSignal() ?? 'platform.datacore.accessibility.table_description';
|
|
314
308
|
}
|
|
315
|
-
cellTextValue(row, field) {
|
|
316
|
-
const value = this._(row, field);
|
|
317
|
-
return typeof value === 'string' ? value : String(value ?? '');
|
|
318
|
-
}
|
|
319
|
-
cellCfg(kind) {
|
|
320
|
-
return this.cellsCfg()[kind];
|
|
321
|
-
}
|
|
322
|
-
tagsOf(row, col) {
|
|
323
|
-
if (!col.field) {
|
|
324
|
-
return [];
|
|
325
|
-
}
|
|
326
|
-
const raw = this._(row, col.field);
|
|
327
|
-
const arr = Array.isArray(raw) ? raw : [];
|
|
328
|
-
const maxItems = this.options().cells?.tag?.maxItems;
|
|
329
|
-
const sliced = typeof maxItems === 'number' ? arr.slice(INDEX_ZERO, maxItems) : arr;
|
|
330
|
-
return sliced.map((tag) => String(tag ?? ''));
|
|
331
|
-
}
|
|
332
|
-
isEnabledTag(tag) {
|
|
333
|
-
return ENABLED_TAG_VALUES.has(tag.trim().toLowerCase());
|
|
334
|
-
}
|
|
335
|
-
isDisabledTag(tag) {
|
|
336
|
-
return DISABLED_TAG_VALUES.has(tag.trim().toLowerCase());
|
|
337
|
-
}
|
|
338
|
-
getTagStyles(tag, tagOptions) {
|
|
339
|
-
if (this.isEnabledTag(tag) || this.isDisabledTag(tag)) {
|
|
340
|
-
return null;
|
|
341
|
-
}
|
|
342
|
-
const colors = this.resolveTagColors(tagOptions);
|
|
343
|
-
const styles = this.buildTagStyles(colors.background, colors.border);
|
|
344
|
-
return Object.keys(styles).length > 0 ? styles : null;
|
|
345
|
-
}
|
|
346
|
-
_ = (obj, path) => {
|
|
347
|
-
if (!path) {
|
|
348
|
-
return undefined;
|
|
349
|
-
}
|
|
350
|
-
const parts = this.getPathParts(path);
|
|
351
|
-
let acc = obj;
|
|
352
|
-
for (const part of parts) {
|
|
353
|
-
const next = this.getObjectValue(acc, part);
|
|
354
|
-
if (typeof next === 'undefined') {
|
|
355
|
-
return undefined;
|
|
356
|
-
}
|
|
357
|
-
acc = next;
|
|
358
|
-
}
|
|
359
|
-
return acc;
|
|
360
|
-
};
|
|
361
|
-
formatDate(value, _format = 'shortDate') {
|
|
362
|
-
try {
|
|
363
|
-
return new Intl.DateTimeFormat(undefined).format(new Date(value));
|
|
364
|
-
}
|
|
365
|
-
catch {
|
|
366
|
-
return String(value ?? '');
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
formatCurrency(value, currency = 'BRL') {
|
|
370
|
-
const numericValue = typeof value === 'number' || typeof value === 'string' ? value : null;
|
|
371
|
-
return formatNumericValue(numericValue, {
|
|
372
|
-
style: 'currency',
|
|
373
|
-
currency
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
309
|
toggleActionsMenu(event, row, col, triggerElement) {
|
|
377
310
|
event.stopPropagation();
|
|
378
311
|
if (this.isActionsMenuOpen(row, col)) {
|
|
379
312
|
this.closeActionsMenu();
|
|
380
313
|
return;
|
|
381
314
|
}
|
|
382
|
-
const
|
|
383
|
-
const items = this.actionItemsFor(row,
|
|
315
|
+
const actionsOptions = this.cellCfg('actions');
|
|
316
|
+
const items = this.actionItemsFor(row, actionsOptions);
|
|
384
317
|
const rect = triggerElement.getBoundingClientRect();
|
|
385
318
|
this.openMenuState.set({
|
|
386
319
|
row,
|
|
387
320
|
col,
|
|
388
321
|
items,
|
|
389
|
-
closeOnClick:
|
|
322
|
+
closeOnClick: actionsOptions?.closeOnClick !== false,
|
|
390
323
|
top: rect.bottom + MENU_GAP_PX,
|
|
391
324
|
left: rect.left,
|
|
392
325
|
width: rect.width
|
|
@@ -402,8 +335,8 @@ export class TableComponent {
|
|
|
402
335
|
}
|
|
403
336
|
return menu.row === row && menu.col === col;
|
|
404
337
|
}
|
|
405
|
-
actionItemsFor(row,
|
|
406
|
-
const items =
|
|
338
|
+
actionItemsFor(row, options) {
|
|
339
|
+
const items = options.items ?? [];
|
|
407
340
|
return items.map((item) => ({
|
|
408
341
|
key: item.key,
|
|
409
342
|
label: item.label,
|
|
@@ -411,8 +344,7 @@ export class TableComponent {
|
|
|
411
344
|
disabled: this.resolveActionDisabled(item, row)
|
|
412
345
|
}));
|
|
413
346
|
}
|
|
414
|
-
onPortalActionClick(
|
|
415
|
-
event.stopPropagation();
|
|
347
|
+
onPortalActionClick(item) {
|
|
416
348
|
if (item.disabled) {
|
|
417
349
|
return;
|
|
418
350
|
}
|
|
@@ -430,90 +362,22 @@ export class TableComponent {
|
|
|
430
362
|
return;
|
|
431
363
|
}
|
|
432
364
|
const fieldKey = col.actionField ?? col.field;
|
|
433
|
-
const
|
|
434
|
-
this.action.emit({ row, column: col, value: { action: item, rowValue
|
|
435
|
-
}
|
|
436
|
-
buttonKey(row, col, opt) {
|
|
437
|
-
const actionKey = (col.actionField ?? col.field ?? '');
|
|
438
|
-
const actionValue = actionKey ? String(this._(row, actionKey) ?? '') : '';
|
|
439
|
-
return [
|
|
440
|
-
String(opt?.label ?? ''),
|
|
441
|
-
String(opt?.icon ?? ''),
|
|
442
|
-
String(opt?.priority ?? ''),
|
|
443
|
-
String(opt?.size ?? ''),
|
|
444
|
-
String(opt?.tooltip ?? ''),
|
|
445
|
-
actionValue
|
|
446
|
-
].join('|');
|
|
365
|
+
const rowValue = fieldKey ? this.resolveValue(row, fieldKey) : undefined;
|
|
366
|
+
this.action.emit({ row, column: col, value: { action: item, rowValue } });
|
|
447
367
|
}
|
|
448
368
|
onButtonClick(row, col) {
|
|
449
369
|
const key = col.actionField ?? col.field;
|
|
450
|
-
const value = key ? this.
|
|
370
|
+
const value = key ? this.resolveValue(row, key) : undefined;
|
|
451
371
|
this.action.emit({ row, value, column: col });
|
|
452
372
|
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
const derivedForeground = this.getDerivedTagForeground(baseColor);
|
|
457
|
-
const foreground = this.getTagForeground(explicitForeground, derivedForeground);
|
|
458
|
-
const background = this.getTagBackground(baseColor);
|
|
459
|
-
const border = foreground ?? derivedForeground ?? baseColor;
|
|
460
|
-
return { background, border };
|
|
461
|
-
}
|
|
462
|
-
getTagBaseColor(tagOptions) {
|
|
463
|
-
return this.normalizeHexColor(tagOptions?.backgroundColor) ?? this.normalizeHexColor(tagOptions?.color);
|
|
464
|
-
}
|
|
465
|
-
resolveRowIdentityLabel(rowIdentity) {
|
|
466
|
-
if (rowIdentity.name) {
|
|
467
|
-
return String(rowIdentity.name);
|
|
468
|
-
}
|
|
469
|
-
if (rowIdentity.title) {
|
|
470
|
-
return String(rowIdentity.title);
|
|
471
|
-
}
|
|
472
|
-
if (rowIdentity.label) {
|
|
473
|
-
return String(rowIdentity.label);
|
|
474
|
-
}
|
|
475
|
-
if (rowIdentity.id) {
|
|
476
|
-
return String(rowIdentity.id);
|
|
477
|
-
}
|
|
478
|
-
return 'item';
|
|
479
|
-
}
|
|
480
|
-
getDerivedTagForeground(baseColor) {
|
|
481
|
-
return baseColor ? this.darkenHexColor(baseColor, TAG_FOREGROUND_DARKEN_AMOUNT) : null;
|
|
482
|
-
}
|
|
483
|
-
getTagForeground(explicitForeground, derivedForeground) {
|
|
484
|
-
if (explicitForeground && explicitForeground !== '#ffffff') {
|
|
485
|
-
return explicitForeground;
|
|
486
|
-
}
|
|
487
|
-
return derivedForeground;
|
|
488
|
-
}
|
|
489
|
-
getTagBackground(baseColor) {
|
|
490
|
-
return baseColor ? this.toRgba(baseColor, TAG_BACKGROUND_ALPHA) : null;
|
|
491
|
-
}
|
|
492
|
-
buildTagStyles(background, border) {
|
|
493
|
-
const styles = {};
|
|
494
|
-
if (background) {
|
|
495
|
-
styles['background-color'] = background;
|
|
496
|
-
}
|
|
497
|
-
if (border) {
|
|
498
|
-
styles['border-color'] = border;
|
|
499
|
-
styles['color'] = border;
|
|
500
|
-
}
|
|
501
|
-
return styles;
|
|
502
|
-
}
|
|
503
|
-
getObjectValue(source, key) {
|
|
504
|
-
if (!source || typeof source !== 'object') {
|
|
505
|
-
return undefined;
|
|
373
|
+
resolveCellId(col, row) {
|
|
374
|
+
if (!col.cellId) {
|
|
375
|
+
return null;
|
|
506
376
|
}
|
|
507
|
-
return
|
|
377
|
+
return typeof col.cellId === 'function' ? (col.cellId(row) || null) : (col.cellId || null);
|
|
508
378
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
if (cached) {
|
|
512
|
-
return cached;
|
|
513
|
-
}
|
|
514
|
-
const parts = path.split('.');
|
|
515
|
-
this.pathPartsCache.set(path, parts);
|
|
516
|
-
return parts;
|
|
379
|
+
cellCfg(kind) {
|
|
380
|
+
return this.cellsCfg()[kind];
|
|
517
381
|
}
|
|
518
382
|
clampPage() {
|
|
519
383
|
if (!this.showPaginator()) {
|
|
@@ -537,78 +401,8 @@ export class TableComponent {
|
|
|
537
401
|
}
|
|
538
402
|
return item.disabled === true;
|
|
539
403
|
}
|
|
540
|
-
normalizeHexColor(value) {
|
|
541
|
-
if (typeof value !== 'string') {
|
|
542
|
-
return null;
|
|
543
|
-
}
|
|
544
|
-
const raw = value.trim().replace('#', '');
|
|
545
|
-
if (/^[0-9a-fA-F]{3}$/.test(raw)) {
|
|
546
|
-
return `#${raw
|
|
547
|
-
.split('')
|
|
548
|
-
.map((char) => `${char}${char}`)
|
|
549
|
-
.join('')
|
|
550
|
-
.toLowerCase()}`;
|
|
551
|
-
}
|
|
552
|
-
if (/^[0-9a-fA-F]{6}$/.test(raw)) {
|
|
553
|
-
return `#${raw.toLowerCase()}`;
|
|
554
|
-
}
|
|
555
|
-
return null;
|
|
556
|
-
}
|
|
557
|
-
normalizeColumnAlignment(value) {
|
|
558
|
-
return value === 'left' || value === 'center' || value === 'right' ? value : null;
|
|
559
|
-
}
|
|
560
|
-
hexToRgb(hex) {
|
|
561
|
-
const normalized = this.normalizeHexColor(hex);
|
|
562
|
-
if (!normalized) {
|
|
563
|
-
return null;
|
|
564
|
-
}
|
|
565
|
-
const clean = normalized.slice(1);
|
|
566
|
-
return {
|
|
567
|
-
r: Number.parseInt(clean.slice(0, 2), HEX_RADIX),
|
|
568
|
-
g: Number.parseInt(clean.slice(2, 4), HEX_RADIX),
|
|
569
|
-
b: Number.parseInt(clean.slice(4, 6), HEX_RADIX)
|
|
570
|
-
};
|
|
571
|
-
}
|
|
572
|
-
toRgba(hex, alpha) {
|
|
573
|
-
const rgb = this.hexToRgb(hex);
|
|
574
|
-
if (!rgb) {
|
|
575
|
-
return null;
|
|
576
|
-
}
|
|
577
|
-
return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
|
|
578
|
-
}
|
|
579
|
-
darkenHexColor(hex, amount) {
|
|
580
|
-
const rgb = this.hexToRgb(hex);
|
|
581
|
-
if (!rgb) {
|
|
582
|
-
return null;
|
|
583
|
-
}
|
|
584
|
-
const factor = Math.max(0, Math.min(1, 1 - amount));
|
|
585
|
-
const r = Math.round(rgb.r * factor);
|
|
586
|
-
const g = Math.round(rgb.g * factor);
|
|
587
|
-
const b = Math.round(rgb.b * factor);
|
|
588
|
-
return `#${[r, g, b]
|
|
589
|
-
.map((value) => Math.max(0, Math.min(RGB_MAX, value)).toString(HEX_RADIX).padStart(2, '0'))
|
|
590
|
-
.join('')}`;
|
|
591
|
-
}
|
|
592
|
-
mergeOptions(cfg) {
|
|
593
|
-
const base = DEFAULT_TABLE_OPTIONS;
|
|
594
|
-
const next = cfg ?? DEFAULT_TABLE_OPTIONS;
|
|
595
|
-
return {
|
|
596
|
-
...base,
|
|
597
|
-
...next,
|
|
598
|
-
search: { ...base.search, ...next.search },
|
|
599
|
-
table: { ...base.table, ...next.table },
|
|
600
|
-
empty: { ...base.empty, ...next.empty },
|
|
601
|
-
pagination: { ...base.pagination, ...next.pagination },
|
|
602
|
-
cells: {
|
|
603
|
-
checkbox: { ...(base.cells?.checkbox ?? {}), ...(next.cells?.checkbox ?? {}) },
|
|
604
|
-
button: { ...(base.cells?.button ?? {}), ...(next.cells?.button ?? {}) },
|
|
605
|
-
tag: { ...(base.cells?.tag ?? {}), ...(next.cells?.tag ?? {}) },
|
|
606
|
-
actions: { ...(base.cells?.actions ?? {}), ...(next.cells?.actions ?? {}) }
|
|
607
|
-
}
|
|
608
|
-
};
|
|
609
|
-
}
|
|
610
404
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
611
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", loading: "loading", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", lazyLoad: "lazyLoad" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n >\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div [style.width]=\"isMobile ? '100%' : '20%'\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility.search_field' | translate\n \"\n />\n </div>\n </div>\n }\n\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n (click)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.space)=\"$event.preventDefault(); col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n [class.sdc-table-sortable]=\"col.sortable !== false\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"col.sortable !== false ? 0 : null\"\n [attr.aria-label]=\"\n col.sortable !== false\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"col.sortable !== false\">\n @switch (col.type) {\n @case ('checkbox-selection') {\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n }\n @default {\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n @if (col.sortable !== false) {\n <span\n class=\"sdc-table-sort-icons sdc-table-sort-overlay\"\n aria-hidden=\"true\"\n >\n <ng-container\n [ngTemplateOutlet]=\"sortIconsTpl\"\n [ngTemplateOutletContext]=\"{ col: col }\"\n ></ng-container>\n </span>\n }\n }\n }\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellCfg('checkbox').selectAll ?? true)) {\n <span\n class=\"sdc-table-th-center\"\n >\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n @if (isMobile) {\n <div class=\"sdc-table-td-mobile\">\n <ng-container [ngTemplateOutlet]=\"sortIconsTpl\" [ngTemplateOutletContext]=\"{ col: col }\"></ng-container>\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-mobile-td\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n [attr.tabindex]=\"col.sortable !== false ? 0 : null\"\n (click)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.space)=\"$event.preventDefault(); col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n >\n <div class=\"sdc-table-td-val\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col: col }\"\n ></ng-container>\n </div>\n </td>\n </div>\n } @else {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val\">\n <ng-container [ngTemplateOutlet]=\"cellTpl\" [ngTemplateOutletContext]=\"{ $implicit: row, col: col }\"></ng-container>\n </div>\n </td>\n }\n\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n >\n </sdc-empty-state>\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n\n <ng-template #cellTpl let-row let-col=\"col\">\n @switch (col.type) {\n @case ('checkbox-selection') {\n @if (cellCfg('checkbox'); as checkboxOptions) {\n <div class=\"sdc-table-checkbox\">\n <input\n type=\"checkbox\"\n [id]=\"getRowCheckboxId(row)\"\n [checked]=\"isRowSelected(row)\"\n (change)=\"onToggleRow(row, getCheckedValue($event))\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility.select_row'\n | translate: { name: (getRowCheckboxLabel(row) | translate) }\n \"\n [attr.aria-checked]=\"isRowSelected(row)\"\n />\n <label [attr.for]=\"getRowCheckboxId(row)\" class=\"sr-only\">\n {{\n 'platform.datacore.accessibility.select_row'\n | translate: { name: (getRowCheckboxLabel(row) | translate) }\n }}\n </label>\n </div>\n }\n }\n\n @case ('date') {\n {{ formatDate(_(row, col.field), col.format || 'shortDate') }}\n }\n\n @case ('strong') {\n <div class=\"sdc-table-strong-label\">{{ cellTextValue(row, col.field) | translate }}</div>\n }\n\n @case ('code') {\n <code class=\"sdc-table-code-label\">{{ _(row, col.field) }}</code>\n }\n\n @case ('currency') {\n {{ formatCurrency(_(row, col.field), col.format || 'BRL') }}\n }\n\n @case ('tag') {\n @if (cellCfg('tag'); as tagOptions) {\n <div class=\"sdc-table-tags\">\n @for (tag of tagsOf(row, col); track $index) {\n <span\n class=\"sdc-table-tag\"\n [class.sdc-tag--enabled]=\"isEnabledTag(tag)\"\n [class.sdc-tag--disabled]=\"isDisabledTag(tag)\"\n [ngStyle]=\"getTagStyles(tag, tagOptions)\"\n [attr.title]=\"tagOptions.tooltip ? (tagOptions.tooltip | translate) : null\"\n >\n @if (tagOptions.icon) {\n <i [class]=\"tagOptions.icon\"></i>\n }\n {{ tag | translate }}\n </span>\n }\n </div>\n }\n }\n\n @case ('button') {\n @if (cellCfg('button'); as buttonOptions) {\n <div class=\"sdc-table-button\">\n <sdc-button\n class=\"sdc-table-action-button\"\n [size]=\"buttonOptions.size ?? 'default'\"\n [priority]=\"buttonOptions.priority || 'primary'\"\n [icon]=\"buttonOptions.icon\"\n [label]=\"buttonOptions.label ?? ''\"\n [disabled]=\"buttonOptions.disabled ?? false\"\n [title]=\"buttonOptions.tooltip\"\n [attr.size]=\"buttonOptions.size\"\n [attr.priority]=\"buttonOptions.priority || 'primary'\"\n [attr.severity]=\"buttonOptions.priority || 'primary'\"\n [attr.icon]=\"buttonOptions.icon\"\n [attr.label]=\"buttonOptions.label\"\n [attr.disabled]=\"buttonOptions.disabled ? '' : null\"\n [attr.title]=\"buttonOptions.tooltip || null\"\n [attr.aria-label]=\"\n (\n (buttonOptions.label || buttonOptions.tooltip || 'platform.datacore.accessibility.action_button')\n | translate\n )\n + ' - '\n + (getRowCheckboxLabel(row) | translate)\n \"\n [attr.data-key]=\"buttonKey(row, col, buttonOptions)\"\n (click)=\"buttonOptions.disabled ? null : onButtonClick(row, col)\"\n (keydown.enter)=\"buttonOptions.disabled ? null : onButtonClick(row, col)\"\n (keydown.space)=\"$event.preventDefault(); buttonOptions.disabled ? null : onButtonClick(row, col)\"\n >\n </sdc-button>\n </div>\n }\n }\n\n @case ('actions') {\n @if (cellCfg('actions'); as actionsOpt) {\n <div\n class=\"sdc-table-actions\"\n [class.sdc-table-actions--open]=\"isActionsMenuOpen(row, col)\"\n >\n <button\n #actionsTrigger\n type=\"button\"\n class=\"sdc-table-actions-trigger\"\n [class.sdc-table-actions-trigger--open]=\"isActionsMenuOpen(row, col)\"\n [attr.aria-label]=\"\n ((actionsOpt.buttonLabel || 'platform.datacore.accessibility.actions_menu') | translate)\n + ' - '\n + (getRowCheckboxLabel(row) | translate)\n \"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"isActionsMenuOpen(row, col)\"\n (click)=\"toggleActionsMenu($event, row, col, actionsTrigger)\"\n >\n <span class=\"sdc-table-actions-trigger__label\">\n {{ (actionsOpt.buttonLabel || 'platform.datacore.accessibility.actions_menu') | translate }}\n </span>\n <i class=\"fas fa-chevron-down sdc-table-actions-trigger__icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n\n @case ('icon-title') {\n @if (cellCfg('icon-title'); as iconTitleOptions) {\n <div class=\"sdc-table-icon-title\">\n <i [class]=\"_(row, iconTitleOptions.iconField)\" aria-hidden=\"true\"></i>\n <span>{{ cellTextValue(row, col.field) | translate }}</span>\n </div>\n }\n }\n\n @default {\n {{ cellTextValue(row, col.field) | translate }}\n }\n }\n </ng-template>\n </section>\n @if (openMenuState(); as menu) {\n <div\n class=\"sdc-actions-menu sdc-actions-menu--portal\"\n [style.top.px]=\"menu.top\"\n [style.left.px]=\"menu.left\"\n [style.min-width.px]=\"menu.width\"\n role=\"menu\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (item of menu.items; track item.key + '-' + $index) {\n <button\n type=\"button\"\n class=\"sdc-actions-item\"\n [disabled]=\"item.disabled\"\n [class.sdc-actions-item--disabled]=\"item.disabled\"\n [attr.aria-disabled]=\"item.disabled\"\n (click)=\"onPortalActionClick($event, item)\"\n >\n <span class=\"sdc-actions-item__content\">\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span>{{ item.label | translate }}</span>\n </span>\n </button>\n }\n </div>\n }\n\n <ng-template #sortIconsTpl let-col=\"col\">\n @if (col.sortable !== false && col.type !== 'checkbox-selection') {\n <span\n class=\"sdc-table-sort-indicator\"\n aria-hidden=\"true\"\n >\n @if (sortField() !== col.field) {\n <i class=\"fas fa-sort-alt sdc-table-sort-neutral\" aria-hidden=\"true\"></i>\n }\n @if (sortField() === col.field && sortOrder() === 1) {\n <i class=\"fas fa-sort-amount-up-alt sdc-table-sort-active\" aria-hidden=\"true\"></i>\n }\n @if (sortField() === col.field && sortOrder() === -1) {\n <i class=\"fas fa-sort-amount-down sdc-table-sort-active\" aria-hidden=\"true\"></i>\n }\n </span>\n }\n\n @if (col.sortable === false || col.type === 'checkbox-selection') {\n <span\n class=\"sdc-table-sort-indicator sdc-table-sort-indicator-placeholder\"\n aria-hidden=\"true\"\n ></span>\n }\n </ng-template>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--sdc-tag-width: 7.5rem}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (max-width: 750px){.sdc-table-tag{font-size:.8125rem;padding:.35rem .75rem}.sdc-table-sort-indicator-placeholder{display:none!important;width:0!important;height:0!important;min-width:0!important}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-sort-indicator{gap:.15rem;min-width:1.2rem;position:absolute;left:21px}.sdc-table-sort-indicator i{font-size:.75rem;width:.65rem}.sdc-table-td-val{background:none!important;height:100%;padding:1rem;justify-content:end;border-left:1px solid var(--sdc-formfield-default-border);display:flex;overflow:visible;overflow-wrap:anywhere;word-break:break-word;white-space:normal;min-width:0}.sdc-table-strong-label,.sdc-table-code-label{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}.sdc-table-td-mobile{border-top:1px solid var(--sdc-formfield-default-border);display:flex;align-items:center;padding-left:10px}.sdc-table.sdc-table-stack thead{display:none}.sdc-table.sdc-table-stack .sdc-table-grid,.sdc-table.sdc-table-stack .sdc-table-grid tbody,.sdc-table.sdc-table-stack .sdc-table-grid tr,.sdc-table.sdc-table-stack .sdc-table-grid td{display:block;width:100%;box-sizing:border-box}.sdc-table.sdc-table-stack .sdc-table-grid tr{border-top:1px solid var(--sdc-formfield-default-border);background:var(--sdc-table-bg-card)}.sdc-table.sdc-table-stack .sdc-table-td{position:relative;padding:0;border-bottom:1px solid var(--sdc-table-border-gray);display:grid!important;grid-template-columns:45% 55%;align-items:center;gap:var(--sdc-table-gap-th-inner)}.sdc-table.sdc-table-stack .sdc-table-td:before{content:attr(data-title);font-weight:600;padding:var(--sdc-table-padding-cell) .5rem var(--sdc-table-padding-cell) var(--sdc-table-padding-cell);border-right:0 solid var(--sdc-formfield-default-border);word-break:break-word}.sdc-table.sdc-table-stack .sdc-table-td>*{grid-column:2;min-width:0;max-width:100%}.sdc-table.sdc-table-stack .sdc-table-grid tr .sdc-table-td:last-child{border-bottom:0}.sdc-table.sdc-table-stack .sdc-table-sort-icons{flex-direction:column;line-height:.8}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading{grid-template-columns:100%;min-height:3.75rem}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading:before{content:\"\";padding:0}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading>*{grid-column:1}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading .sdc-table-td-val--initial-loading{border-left:0;justify-content:flex-start;padding:0;min-height:3.75rem}.sdc-table.sdc-table-stack .sdc-actions-menu--portal{min-width:7.5rem!important}.sdc-table.sdc-table-stack .sdc-table-actions-trigger{min-width:4.375rem;height:1.75rem;padding:0 .625rem;font-size:.75rem}::ng-deep .p-paginator .p-paginator-next{border-width:1px 1px 1px 1px!important}}@media (min-width: 750px){.sdc-table-tag{font-size:.875rem;padding:.35rem .875rem}.sdc-table-sort-indicator-placeholder{width:1.4rem;height:1rem;display:inline-block}.sdc-table-grid thead th+th{border-left:1px solid var(--sdc-formfield-default-border)}thead th.sdc-table-th-checkbox,tbody td.sdc-table-td-checkbox{width:84px;min-width:84px;max-width:84px}thead th.sdc-table-th-currency,tbody td.sdc-table-td-currency{width:132px;min-width:132px}thead th.sdc-table-th-button,tbody td.sdc-table-td-button{width:154px;min-width:154px}thead th.sdc-table-th-actions,tbody td.sdc-table-td-actions{width:124px;min-width:124px}}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table .sdc-table-strong-label{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:100%;display:block}.sdc-table .sdc-table-code-label{color:var(--sdc-tab-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;max-width:100%}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:end;display:flex;padding:.75rem 0}.sdc-table-grid{width:100%;border-collapse:collapse;table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff26;position:relative;z-index:1}thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff40}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-sort-neutral{color:var(--sdc-table-sort-neutral)}.sdc-table-sort-active{color:var(--sdc-table-sort-active)}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-icons i{font-size:inherit;transition:color var(--sdc-table-transition-fast),transform var(--sdc-table-transition-fast),opacity var(--sdc-table-transition-fast)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-tags{display:flex;flex-wrap:wrap;gap:.5rem}.sdc-table-tag{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;width:fit-content;min-width:fit-content;max-width:100%;border-radius:9999px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid currentColor;box-sizing:border-box}.sdc-table-tag i{font-size:.75rem;color:inherit;flex:0 0 auto}.sdc-tag--enabled{background:#dcfce7;color:#16a34a;border-color:#16a34a}.sdc-tag--disabled{background:#fee2e2;color:#ef4444;border-color:#ef4444}.sdc-table-sort-indicator{display:inline-flex;align-items:center;justify-content:center;gap:.25rem;min-width:1.7rem;flex:0 0 auto}.sdc-table-sort-indicator i{width:.75rem;text-align:center}.sdc-table-sort-overlay{position:relative;margin-left:auto}.sdc-table-paginator{padding:.5rem 0;border-top:0}.sdc-table-button{display:flex;align-items:center;justify-content:center;min-height:44px;width:100%;min-width:0}.sdc-table-button ::ng-deep sdc-button,.sdc-table-button ::ng-deep button{min-height:unset;min-width:unset;max-width:100%}.sdc-table-action-button{width:100%;max-width:100%;min-width:0}.sdc-table-icon-title{display:flex;align-items:center;gap:8px;min-width:0}.sdc-table-icon-title i{flex-shrink:0}.sdc-table-icon-title span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-checkbox{display:flex;align-items:center;justify-content:center}.sdc-table-checkbox input[type=checkbox]{cursor:pointer}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}thead .sdc-table-th-label,thead th.sdc-table-th-checkbox .sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-td-val{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-td-val>*{min-width:0;max-width:100%}.sdc-table-actions{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0}.sdc-table-actions-trigger{appearance:none;border:1px solid #c9ced6;background:#fff;border-radius:999px;min-width:4.875rem;height:2rem;padding:0 .75rem;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font:inherit;font-size:.8125rem;color:#374151;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.sdc-table-actions-trigger:hover{background:#f9fafb}.sdc-table-actions-trigger:focus-visible,.sdc-table-actions-trigger--open{outline:none;border-color:#9ca3af;box-shadow:0 0 0 2px #1118270a}.sdc-table-actions-trigger__label{line-height:1;white-space:nowrap}.sdc-table-actions-trigger__icon{font-size:.625rem;line-height:1;color:#6b7280}.sdc-actions-menu{background:#fff;border:1px solid #d1d5db;border-radius:0;box-shadow:0 1px 2px #0f172a14;padding:0}.sdc-actions-menu--portal{position:fixed;z-index:2147483647}.sdc-actions-item{width:100%;display:flex;align-items:stretch;justify-content:flex-start;border:0;border-bottom:1px solid #e5e7eb;background:#fff;padding:0;text-align:left;cursor:pointer;font:inherit;color:#374151;min-height:2.25rem;transition:background-color .15s ease,color .15s ease}.sdc-actions-item:last-child{border-bottom:0}.sdc-actions-item__content{display:inline-flex;align-items:center;gap:.5rem;padding:.625rem .875rem;width:100%;font-size:.8125rem;line-height:1.2}.sdc-actions-item:hover:not(:disabled),.sdc-actions-item:focus-visible:not(:disabled){background:#f9fafb;outline:none}.sdc-actions-item:disabled,.sdc-actions-item.sdc-actions-item--disabled,.sdc-actions-item[data-disabled=true]{color:#9ca3af;cursor:not-allowed;background:#fff;pointer-events:none}.sdc-actions-item:disabled .sdc-actions-item__content,.sdc-actions-item.sdc-actions-item--disabled .sdc-actions-item__content,.sdc-actions-item[data-disabled=true] .sdc-actions-item__content{opacity:.55}.sdc-actions-item i{width:.875rem;text-align:center;flex:0 0 .875rem;font-size:.8125rem}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-left .sdc-table-td-val,.sdc-table-td-align-left .sdc-table-tags,.sdc-table-td-align-left .sdc-table-button,.sdc-table-td-align-left .sdc-table-icon-title,.sdc-table-td-align-left .sdc-table-checkbox,.sdc-table-td-align-left .sdc-table-actions{justify-content:flex-start;text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-center .sdc-table-td-val,.sdc-table-td-align-center .sdc-table-tags,.sdc-table-td-align-center .sdc-table-button,.sdc-table-td-align-center .sdc-table-icon-title,.sdc-table-td-align-center .sdc-table-checkbox,.sdc-table-td-align-center .sdc-table-actions{justify-content:center;text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-td-align-right .sdc-table-td-val,.sdc-table-td-align-right .sdc-table-tags,.sdc-table-td-align-right .sdc-table-button,.sdc-table-td-align-right .sdc-table-icon-title,.sdc-table-td-align-right .sdc-table-checkbox,.sdc-table-td-align-right .sdc-table-actions{justify-content:flex-end;text-align:right}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
405
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", loading: "loading", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", lazyLoad: "lazyLoad" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["items", "left", "top", "width"], outputs: ["select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
612
406
|
}
|
|
613
407
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, decorators: [{
|
|
614
408
|
type: Component,
|
|
@@ -619,8 +413,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
619
413
|
ButtonComponent,
|
|
620
414
|
LoadingStateComponent,
|
|
621
415
|
EmptyStateComponent,
|
|
622
|
-
TranslateModule
|
|
623
|
-
], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n >\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div [style.width]=\"isMobile ? '100%' : '20%'\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility.search_field' | translate\n \"\n />\n </div>\n </div>\n }\n\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n (click)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.space)=\"$event.preventDefault(); col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n [class.sdc-table-sortable]=\"col.sortable !== false\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"col.sortable !== false ? 0 : null\"\n [attr.aria-label]=\"\n col.sortable !== false\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"col.sortable !== false\">\n @switch (col.type) {\n @case ('checkbox-selection') {\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n }\n @default {\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n @if (col.sortable !== false) {\n <span\n class=\"sdc-table-sort-icons sdc-table-sort-overlay\"\n aria-hidden=\"true\"\n >\n <ng-container\n [ngTemplateOutlet]=\"sortIconsTpl\"\n [ngTemplateOutletContext]=\"{ col: col }\"\n ></ng-container>\n </span>\n }\n }\n }\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellCfg('checkbox').selectAll ?? true)) {\n <span\n class=\"sdc-table-th-center\"\n >\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n @if (isMobile) {\n <div class=\"sdc-table-td-mobile\">\n <ng-container [ngTemplateOutlet]=\"sortIconsTpl\" [ngTemplateOutletContext]=\"{ col: col }\"></ng-container>\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-mobile-td\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n [attr.tabindex]=\"col.sortable !== false ? 0 : null\"\n (click)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n (keydown.space)=\"$event.preventDefault(); col.field ? toggleSort(col.field, col.sortable !== false) : null\"\n >\n <div class=\"sdc-table-td-val\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col: col }\"\n ></ng-container>\n </div>\n </td>\n </div>\n } @else {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val\">\n <ng-container [ngTemplateOutlet]=\"cellTpl\" [ngTemplateOutletContext]=\"{ $implicit: row, col: col }\"></ng-container>\n </div>\n </td>\n }\n\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n >\n </sdc-empty-state>\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n\n <ng-template #cellTpl let-row let-col=\"col\">\n @switch (col.type) {\n @case ('checkbox-selection') {\n @if (cellCfg('checkbox'); as checkboxOptions) {\n <div class=\"sdc-table-checkbox\">\n <input\n type=\"checkbox\"\n [id]=\"getRowCheckboxId(row)\"\n [checked]=\"isRowSelected(row)\"\n (change)=\"onToggleRow(row, getCheckedValue($event))\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility.select_row'\n | translate: { name: (getRowCheckboxLabel(row) | translate) }\n \"\n [attr.aria-checked]=\"isRowSelected(row)\"\n />\n <label [attr.for]=\"getRowCheckboxId(row)\" class=\"sr-only\">\n {{\n 'platform.datacore.accessibility.select_row'\n | translate: { name: (getRowCheckboxLabel(row) | translate) }\n }}\n </label>\n </div>\n }\n }\n\n @case ('date') {\n {{ formatDate(_(row, col.field), col.format || 'shortDate') }}\n }\n\n @case ('strong') {\n <div class=\"sdc-table-strong-label\">{{ cellTextValue(row, col.field) | translate }}</div>\n }\n\n @case ('code') {\n <code class=\"sdc-table-code-label\">{{ _(row, col.field) }}</code>\n }\n\n @case ('currency') {\n {{ formatCurrency(_(row, col.field), col.format || 'BRL') }}\n }\n\n @case ('tag') {\n @if (cellCfg('tag'); as tagOptions) {\n <div class=\"sdc-table-tags\">\n @for (tag of tagsOf(row, col); track $index) {\n <span\n class=\"sdc-table-tag\"\n [class.sdc-tag--enabled]=\"isEnabledTag(tag)\"\n [class.sdc-tag--disabled]=\"isDisabledTag(tag)\"\n [ngStyle]=\"getTagStyles(tag, tagOptions)\"\n [attr.title]=\"tagOptions.tooltip ? (tagOptions.tooltip | translate) : null\"\n >\n @if (tagOptions.icon) {\n <i [class]=\"tagOptions.icon\"></i>\n }\n {{ tag | translate }}\n </span>\n }\n </div>\n }\n }\n\n @case ('button') {\n @if (cellCfg('button'); as buttonOptions) {\n <div class=\"sdc-table-button\">\n <sdc-button\n class=\"sdc-table-action-button\"\n [size]=\"buttonOptions.size ?? 'default'\"\n [priority]=\"buttonOptions.priority || 'primary'\"\n [icon]=\"buttonOptions.icon\"\n [label]=\"buttonOptions.label ?? ''\"\n [disabled]=\"buttonOptions.disabled ?? false\"\n [title]=\"buttonOptions.tooltip\"\n [attr.size]=\"buttonOptions.size\"\n [attr.priority]=\"buttonOptions.priority || 'primary'\"\n [attr.severity]=\"buttonOptions.priority || 'primary'\"\n [attr.icon]=\"buttonOptions.icon\"\n [attr.label]=\"buttonOptions.label\"\n [attr.disabled]=\"buttonOptions.disabled ? '' : null\"\n [attr.title]=\"buttonOptions.tooltip || null\"\n [attr.aria-label]=\"\n (\n (buttonOptions.label || buttonOptions.tooltip || 'platform.datacore.accessibility.action_button')\n | translate\n )\n + ' - '\n + (getRowCheckboxLabel(row) | translate)\n \"\n [attr.data-key]=\"buttonKey(row, col, buttonOptions)\"\n (click)=\"buttonOptions.disabled ? null : onButtonClick(row, col)\"\n (keydown.enter)=\"buttonOptions.disabled ? null : onButtonClick(row, col)\"\n (keydown.space)=\"$event.preventDefault(); buttonOptions.disabled ? null : onButtonClick(row, col)\"\n >\n </sdc-button>\n </div>\n }\n }\n\n @case ('actions') {\n @if (cellCfg('actions'); as actionsOpt) {\n <div\n class=\"sdc-table-actions\"\n [class.sdc-table-actions--open]=\"isActionsMenuOpen(row, col)\"\n >\n <button\n #actionsTrigger\n type=\"button\"\n class=\"sdc-table-actions-trigger\"\n [class.sdc-table-actions-trigger--open]=\"isActionsMenuOpen(row, col)\"\n [attr.aria-label]=\"\n ((actionsOpt.buttonLabel || 'platform.datacore.accessibility.actions_menu') | translate)\n + ' - '\n + (getRowCheckboxLabel(row) | translate)\n \"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"isActionsMenuOpen(row, col)\"\n (click)=\"toggleActionsMenu($event, row, col, actionsTrigger)\"\n >\n <span class=\"sdc-table-actions-trigger__label\">\n {{ (actionsOpt.buttonLabel || 'platform.datacore.accessibility.actions_menu') | translate }}\n </span>\n <i class=\"fas fa-chevron-down sdc-table-actions-trigger__icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n\n @case ('icon-title') {\n @if (cellCfg('icon-title'); as iconTitleOptions) {\n <div class=\"sdc-table-icon-title\">\n <i [class]=\"_(row, iconTitleOptions.iconField)\" aria-hidden=\"true\"></i>\n <span>{{ cellTextValue(row, col.field) | translate }}</span>\n </div>\n }\n }\n\n @default {\n {{ cellTextValue(row, col.field) | translate }}\n }\n }\n </ng-template>\n </section>\n @if (openMenuState(); as menu) {\n <div\n class=\"sdc-actions-menu sdc-actions-menu--portal\"\n [style.top.px]=\"menu.top\"\n [style.left.px]=\"menu.left\"\n [style.min-width.px]=\"menu.width\"\n role=\"menu\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (item of menu.items; track item.key + '-' + $index) {\n <button\n type=\"button\"\n class=\"sdc-actions-item\"\n [disabled]=\"item.disabled\"\n [class.sdc-actions-item--disabled]=\"item.disabled\"\n [attr.aria-disabled]=\"item.disabled\"\n (click)=\"onPortalActionClick($event, item)\"\n >\n <span class=\"sdc-actions-item__content\">\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span>{{ item.label | translate }}</span>\n </span>\n </button>\n }\n </div>\n }\n\n <ng-template #sortIconsTpl let-col=\"col\">\n @if (col.sortable !== false && col.type !== 'checkbox-selection') {\n <span\n class=\"sdc-table-sort-indicator\"\n aria-hidden=\"true\"\n >\n @if (sortField() !== col.field) {\n <i class=\"fas fa-sort-alt sdc-table-sort-neutral\" aria-hidden=\"true\"></i>\n }\n @if (sortField() === col.field && sortOrder() === 1) {\n <i class=\"fas fa-sort-amount-up-alt sdc-table-sort-active\" aria-hidden=\"true\"></i>\n }\n @if (sortField() === col.field && sortOrder() === -1) {\n <i class=\"fas fa-sort-amount-down sdc-table-sort-active\" aria-hidden=\"true\"></i>\n }\n </span>\n }\n\n @if (col.sortable === false || col.type === 'checkbox-selection') {\n <span\n class=\"sdc-table-sort-indicator sdc-table-sort-indicator-placeholder\"\n aria-hidden=\"true\"\n ></span>\n }\n </ng-template>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--sdc-tag-width: 7.5rem}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (max-width: 750px){.sdc-table-tag{font-size:.8125rem;padding:.35rem .75rem}.sdc-table-sort-indicator-placeholder{display:none!important;width:0!important;height:0!important;min-width:0!important}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-sort-indicator{gap:.15rem;min-width:1.2rem;position:absolute;left:21px}.sdc-table-sort-indicator i{font-size:.75rem;width:.65rem}.sdc-table-td-val{background:none!important;height:100%;padding:1rem;justify-content:end;border-left:1px solid var(--sdc-formfield-default-border);display:flex;overflow:visible;overflow-wrap:anywhere;word-break:break-word;white-space:normal;min-width:0}.sdc-table-strong-label,.sdc-table-code-label{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}.sdc-table-td-mobile{border-top:1px solid var(--sdc-formfield-default-border);display:flex;align-items:center;padding-left:10px}.sdc-table.sdc-table-stack thead{display:none}.sdc-table.sdc-table-stack .sdc-table-grid,.sdc-table.sdc-table-stack .sdc-table-grid tbody,.sdc-table.sdc-table-stack .sdc-table-grid tr,.sdc-table.sdc-table-stack .sdc-table-grid td{display:block;width:100%;box-sizing:border-box}.sdc-table.sdc-table-stack .sdc-table-grid tr{border-top:1px solid var(--sdc-formfield-default-border);background:var(--sdc-table-bg-card)}.sdc-table.sdc-table-stack .sdc-table-td{position:relative;padding:0;border-bottom:1px solid var(--sdc-table-border-gray);display:grid!important;grid-template-columns:45% 55%;align-items:center;gap:var(--sdc-table-gap-th-inner)}.sdc-table.sdc-table-stack .sdc-table-td:before{content:attr(data-title);font-weight:600;padding:var(--sdc-table-padding-cell) .5rem var(--sdc-table-padding-cell) var(--sdc-table-padding-cell);border-right:0 solid var(--sdc-formfield-default-border);word-break:break-word}.sdc-table.sdc-table-stack .sdc-table-td>*{grid-column:2;min-width:0;max-width:100%}.sdc-table.sdc-table-stack .sdc-table-grid tr .sdc-table-td:last-child{border-bottom:0}.sdc-table.sdc-table-stack .sdc-table-sort-icons{flex-direction:column;line-height:.8}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading{grid-template-columns:100%;min-height:3.75rem}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading:before{content:\"\";padding:0}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading>*{grid-column:1}.sdc-table.sdc-table-stack .sdc-table-td--initial-loading .sdc-table-td-val--initial-loading{border-left:0;justify-content:flex-start;padding:0;min-height:3.75rem}.sdc-table.sdc-table-stack .sdc-actions-menu--portal{min-width:7.5rem!important}.sdc-table.sdc-table-stack .sdc-table-actions-trigger{min-width:4.375rem;height:1.75rem;padding:0 .625rem;font-size:.75rem}::ng-deep .p-paginator .p-paginator-next{border-width:1px 1px 1px 1px!important}}@media (min-width: 750px){.sdc-table-tag{font-size:.875rem;padding:.35rem .875rem}.sdc-table-sort-indicator-placeholder{width:1.4rem;height:1rem;display:inline-block}.sdc-table-grid thead th+th{border-left:1px solid var(--sdc-formfield-default-border)}thead th.sdc-table-th-checkbox,tbody td.sdc-table-td-checkbox{width:84px;min-width:84px;max-width:84px}thead th.sdc-table-th-currency,tbody td.sdc-table-td-currency{width:132px;min-width:132px}thead th.sdc-table-th-button,tbody td.sdc-table-td-button{width:154px;min-width:154px}thead th.sdc-table-th-actions,tbody td.sdc-table-td-actions{width:124px;min-width:124px}}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table .sdc-table-strong-label{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:100%;display:block}.sdc-table .sdc-table-code-label{color:var(--sdc-tab-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;max-width:100%}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:end;display:flex;padding:.75rem 0}.sdc-table-grid{width:100%;border-collapse:collapse;table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff26;position:relative;z-index:1}thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff40}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-sort-neutral{color:var(--sdc-table-sort-neutral)}.sdc-table-sort-active{color:var(--sdc-table-sort-active)}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-icons i{font-size:inherit;transition:color var(--sdc-table-transition-fast),transform var(--sdc-table-transition-fast),opacity var(--sdc-table-transition-fast)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-tags{display:flex;flex-wrap:wrap;gap:.5rem}.sdc-table-tag{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;width:fit-content;min-width:fit-content;max-width:100%;border-radius:9999px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid currentColor;box-sizing:border-box}.sdc-table-tag i{font-size:.75rem;color:inherit;flex:0 0 auto}.sdc-tag--enabled{background:#dcfce7;color:#16a34a;border-color:#16a34a}.sdc-tag--disabled{background:#fee2e2;color:#ef4444;border-color:#ef4444}.sdc-table-sort-indicator{display:inline-flex;align-items:center;justify-content:center;gap:.25rem;min-width:1.7rem;flex:0 0 auto}.sdc-table-sort-indicator i{width:.75rem;text-align:center}.sdc-table-sort-overlay{position:relative;margin-left:auto}.sdc-table-paginator{padding:.5rem 0;border-top:0}.sdc-table-button{display:flex;align-items:center;justify-content:center;min-height:44px;width:100%;min-width:0}.sdc-table-button ::ng-deep sdc-button,.sdc-table-button ::ng-deep button{min-height:unset;min-width:unset;max-width:100%}.sdc-table-action-button{width:100%;max-width:100%;min-width:0}.sdc-table-icon-title{display:flex;align-items:center;gap:8px;min-width:0}.sdc-table-icon-title i{flex-shrink:0}.sdc-table-icon-title span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-checkbox{display:flex;align-items:center;justify-content:center}.sdc-table-checkbox input[type=checkbox]{cursor:pointer}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}thead .sdc-table-th-label,thead th.sdc-table-th-checkbox .sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-td-val{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-td-val>*{min-width:0;max-width:100%}.sdc-table-actions{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0}.sdc-table-actions-trigger{appearance:none;border:1px solid #c9ced6;background:#fff;border-radius:999px;min-width:4.875rem;height:2rem;padding:0 .75rem;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font:inherit;font-size:.8125rem;color:#374151;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.sdc-table-actions-trigger:hover{background:#f9fafb}.sdc-table-actions-trigger:focus-visible,.sdc-table-actions-trigger--open{outline:none;border-color:#9ca3af;box-shadow:0 0 0 2px #1118270a}.sdc-table-actions-trigger__label{line-height:1;white-space:nowrap}.sdc-table-actions-trigger__icon{font-size:.625rem;line-height:1;color:#6b7280}.sdc-actions-menu{background:#fff;border:1px solid #d1d5db;border-radius:0;box-shadow:0 1px 2px #0f172a14;padding:0}.sdc-actions-menu--portal{position:fixed;z-index:2147483647}.sdc-actions-item{width:100%;display:flex;align-items:stretch;justify-content:flex-start;border:0;border-bottom:1px solid #e5e7eb;background:#fff;padding:0;text-align:left;cursor:pointer;font:inherit;color:#374151;min-height:2.25rem;transition:background-color .15s ease,color .15s ease}.sdc-actions-item:last-child{border-bottom:0}.sdc-actions-item__content{display:inline-flex;align-items:center;gap:.5rem;padding:.625rem .875rem;width:100%;font-size:.8125rem;line-height:1.2}.sdc-actions-item:hover:not(:disabled),.sdc-actions-item:focus-visible:not(:disabled){background:#f9fafb;outline:none}.sdc-actions-item:disabled,.sdc-actions-item.sdc-actions-item--disabled,.sdc-actions-item[data-disabled=true]{color:#9ca3af;cursor:not-allowed;background:#fff;pointer-events:none}.sdc-actions-item:disabled .sdc-actions-item__content,.sdc-actions-item.sdc-actions-item--disabled .sdc-actions-item__content,.sdc-actions-item[data-disabled=true] .sdc-actions-item__content{opacity:.55}.sdc-actions-item i{width:.875rem;text-align:center;flex:0 0 .875rem;font-size:.8125rem}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-left .sdc-table-td-val,.sdc-table-td-align-left .sdc-table-tags,.sdc-table-td-align-left .sdc-table-button,.sdc-table-td-align-left .sdc-table-icon-title,.sdc-table-td-align-left .sdc-table-checkbox,.sdc-table-td-align-left .sdc-table-actions{justify-content:flex-start;text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-center .sdc-table-td-val,.sdc-table-td-align-center .sdc-table-tags,.sdc-table-td-align-center .sdc-table-button,.sdc-table-td-align-center .sdc-table-icon-title,.sdc-table-td-align-center .sdc-table-checkbox,.sdc-table-td-align-center .sdc-table-actions{justify-content:center;text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-td-align-right .sdc-table-td-val,.sdc-table-td-align-right .sdc-table-tags,.sdc-table-td-align-right .sdc-table-button,.sdc-table-td-align-right .sdc-table-icon-title,.sdc-table-td-align-right .sdc-table-checkbox,.sdc-table-td-align-right .sdc-table-actions{justify-content:flex-end;text-align:right}\n"] }]
|
|
416
|
+
TranslateModule,
|
|
417
|
+
TableSortIndicatorComponent,
|
|
418
|
+
TableCellContentComponent,
|
|
419
|
+
TableActionsMenuComponent
|
|
420
|
+
], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"] }]
|
|
624
421
|
}], propDecorators: { cols: [{
|
|
625
422
|
type: Input,
|
|
626
423
|
args: [{ required: true }]
|
|
@@ -652,4 +449,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
652
449
|
type: HostListener,
|
|
653
450
|
args: ['window:scroll']
|
|
654
451
|
}] } });
|
|
655
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHlDQUF5QyxJQUFJLG1DQUFtQyxFQUNoRixtQ0FBbUMsSUFBSSw2QkFBNkIsRUFDcEUsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQseUJBQXlCLElBQUksbUJBQW1CLEVBQ2hELHdCQUF3QixJQUFJLGtCQUFrQixFQUM5QyxlQUFlLElBQUksU0FBUyxFQUM1QixnQkFBZ0IsSUFBSSxVQUFVLEVBQzlCLGlCQUFpQixJQUFJLFdBQVcsRUFDaEMsYUFBYSxJQUFJLE9BQU8sRUFDeEIsMEJBQTBCLElBQUksb0JBQW9CLEVBQ2xELGtDQUFrQyxJQUFJLDRCQUE0QixFQUNuRSxNQUFNLGtDQUFrQyxDQUFDO0FBbUIxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1B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LGNBQWM7NEZBQWQsY0FBYyxzWkN6RTNCLG95bEJBNFpBLDh5V0RoV0ksWUFBWSx5WEFDWixrQkFBa0Isb1dBQ2xCLGtCQUFrQixnTkFDbEIsZUFBZSw4U0FDZixxQkFBcUIsdUpBQ3JCLG1CQUFtQixrWEFDbkIsZUFBZTs7NEZBT04sY0FBYztrQkFqQjFCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGtCQUFrQjt3QkFDbEIsa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsbUJBQW1CO3dCQUNuQixlQUFlO3FCQUNoQixpQkFHYyxpQkFBaUIsQ0FBQyxRQUFRLG1CQUN4Qix1QkFBdUIsQ0FBQyxNQUFNOzhCQWEzQyxJQUFJO3NCQURQLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVVyQixJQUFJO3NCQURQLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQWFyQixPQUFPO3NCQURWLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2dCQWN0QixNQUFNO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2dCQTBCdEIsU0FBUztzQkFEWixLQUFLO2dCQUtJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQXFKRyxlQUFlO3NCQUR4QixZQUFZO3VCQUFDLGdCQUFnQjtnQkFNcEIsV0FBVztzQkFEcEIsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBTTdCLGNBQWM7c0JBRHZCLFlBQVk7dUJBQUMsZUFBZTtnQkFNbkIsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIHNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBpc01vYmlsZSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvbGF5b3V0LnV0aWwnO1xuaW1wb3J0IHsgZm9ybWF0TnVtZXJpY1ZhbHVlIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9udW1lcmljLnV0aWwnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUJMRV9PUFRJT05TLFxuICBUQUJMRV9ERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCBhcyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCxcbiAgVEFCTEVfREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFggYXMgREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XX0hFSUdIVF9QWCBhcyBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XX0lEX1BSRVZJRVdfTEVOR1RIIGFzIERFRkFVTFRfUk9XX0lEX1BSRVZJRVdfTEVOR1RILFxuICBUQUJMRV9ERUZBVUxUX1JPV1NfUEVSX1BBR0UgYXMgREVGQVVMVF9ST1dTX1BFUl9QQUdFLFxuICBUQUJMRV9ESVNBQkxFRF9UQUdfVkFMVUVTIGFzIERJU0FCTEVEX1RBR19WQUxVRVMsXG4gIFRBQkxFX0VOQUJMRURfVEFHX1ZBTFVFUyBhcyBFTkFCTEVEX1RBR19WQUxVRVMsXG4gIFRBQkxFX0hFWF9SQURJWCBhcyBIRVhfUkFESVgsXG4gIFRBQkxFX0lOREVYX1pFUk8gYXMgSU5ERVhfWkVSTyxcbiAgVEFCTEVfTUVOVV9HQVBfUFggYXMgTUVOVV9HQVBfUFgsXG4gIFRBQkxFX1JHQl9NQVggYXMgUkdCX01BWCxcbiAgVEFCTEVfVEFHX0JBQ0tHUk9VTkRfQUxQSEEgYXMgVEFHX0JBQ0tHUk9VTkRfQUxQSEEsXG4gIFRBQkxFX1RBR19GT1JFR1JPVU5EX0RBUktFTl9BTU9VTlQgYXMgVEFHX0ZPUkVHUk9VTkRfREFSS0VOX0FNT1VOVFxufSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy90YWJsZS5jb25zdCc7XG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRvclN0YXRlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9wYWdpbmF0b3IudHlwZSc7XG5pbXBvcnQgeyB0eXBlIFNlYXJjaFRyaWdnZXJNb2RlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZWFyY2hib3gudHlwZSc7XG5pbXBvcnQge1xuICB0eXBlIEFjdGlvbk1lbnVJdGVtLFxuICB0eXBlIFJvd0Jhc2UsXG4gIHR5cGUgU29ydE9yZGVyLFxuICB0eXBlIFRhYmxlQWN0aW9uTWVudUl0ZW0gYXMgTmF0aXZlQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnLFxuICB0eXBlIFRhYmxlQ2VsbENvbmZpZ0tleSxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWdNYXAsXG4gIHR5cGUgVGFibGVDb2x1bW5BbGlnbm1lbnQsXG4gIHR5cGUgVGFibGVDb2x1bW4sXG4gIHR5cGUgVGFibGVPcGVuTWVudVN0YXRlIGFzIE9wZW5NZW51U3RhdGUsXG4gIHR5cGUgVGFibGVPcHRpb25zLFxuICB0eXBlIFRhYmxlUm93SWRlbnRpdHksXG4gIHR5cGUgVGFibGVTZWFyY2hFdmVudFxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3RhYmxlLnR5cGUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNlYXJjaGJveENvbXBvbmVudCxcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIExvYWRpbmdTdGF0ZUNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZVxuICBdLFxuICBzdHlsZVVybDogJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFJvd0Jhc2UgPSBSb3dCYXNlPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sc1NpZ25hbCA9IHNpZ25hbDxUYWJsZUNvbHVtbjxUPltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNpZ25hbCA9IHNpZ25hbDxUW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NpZ25hbCA9IHNpZ25hbDxUYWJsZU9wdGlvbnM8VD4+KHRoaXMubWVyZ2VPcHRpb25zKERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD4pKTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBUYWJsZU9wdGlvbnM8VD4gPSBERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcGVuTWVudVN0YXRlID0gc2lnbmFsPE9wZW5NZW51U3RhdGU8VD4gfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgY29scyh2YWx1ZTogVGFibGVDb2x1bW48VD5bXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbHNTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgfVxuXG4gIGdldCBjb2xzKCk6IFRhYmxlQ29sdW1uPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLmNvbHNTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBkYXRhKHZhbHVlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5kYXRhU2lnbmFsLnNldCh2YWx1ZSA/PyBbXSk7XG4gICAgdGhpcy5yZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpO1xuICAgIHRoaXMuY2xhbXBQYWdlKCk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBnZXQgZGF0YSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSB9KVxuICBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmxvYWRpbmdTaWduYWwuc2V0KHZhbHVlID09PSB0cnVlKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBjb25maWcodmFsdWU6IFRhYmxlT3B0aW9uczxUPiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gKERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD4pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbmV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZyA9IG5leHQ7XG4gICAgY29uc3QgbWVyZ2VkID0gdGhpcy5tZXJnZU9wdGlvbnMobmV4dCk7XG4gICAgdGhpcy5jb25maWdTaWduYWwuc2V0KG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXh0Um93cyA9IG1lcmdlZC5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgdGhpcy5yb3dzLnNldChuZXh0Um93cyk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG5cbiAgICB0aGlzLnBhdGhQYXJ0c0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKTogVGFibGVPcHRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hcmlhTGFiZWxTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sdW1uOiBUYWJsZUNvbHVtbjxUPjsgcm93OiBUOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGF6eUxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmlyc3Q6IG51bWJlcjsgcm93czogbnVtYmVyIH0+KCk7XG5cbiAgZ2V0IGFyaWFMYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpO1xuICB9XG5cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNNb2JpbGU6IGJvb2xlYW4gPSBpc01vYmlsZSgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXJpYUxhYmVsU2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uczxUPj4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTZWFyY2ggPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnNob3cgPz8gZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1BhZ2luYXRvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnNob3cgPz8gZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0luaXRpYWxMb2FkaW5nID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5sb2FkaW5nU2lnbmFsKCkgJiYgdGhpcy5kYXRhU2lnbmFsKCkubGVuZ3RoID09PSAwKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93c1BlclBhZ2VPcHRpb25zID0gY29tcHV0ZWQ8bnVtYmVyW10+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlT3B0aW9ucyA/PyBbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5wbGFjZWhvbGRlciA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmlnZ2VyTW9kZSA9IGNvbXB1dGVkPFNlYXJjaFRyaWdnZXJNb2RlPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnR5cGUgPz8gJ2F1dG8nKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvdGFsUmVjb3Jkc0xhYmVsID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8udG90YWxSZWNvcmRzTGFiZWwgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlUaXRsZSA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkuZW1wdHk/LnRpdGxlID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5VGV4dCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkuZW1wdHk/LnRleHQgPz8gJycpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxGaWx0ZXIgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0RmllbGQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0T3JkZXIgPSBzaWduYWw8U29ydE9yZGVyPigwKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGlvbiA9IHNpZ25hbDxUW10+KFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0ID0gc2lnbmFsPG51bWJlcj4oSU5ERVhfWkVSTyk7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzID0gc2lnbmFsPG51bWJlcj4oREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2VsbHNDZmcgPSBjb21wdXRlZDxUYWJsZUNlbGxDb25maWdNYXA8VD4+KCgpID0+IHtcbiAgICBjb25zdCBjZWxscyA9IHRoaXMub3B0aW9ucygpLmNlbGxzO1xuICAgIHJldHVybiB7XG4gICAgICBjaGVja2JveDogY2VsbHM/LmNoZWNrYm94ID8/IHt9LFxuICAgICAgYnV0dG9uOiBjZWxscz8uYnV0dG9uID8/IHt9LFxuICAgICAgdGFnOiBjZWxscz8udGFnID8/IHt9LFxuICAgICAgYWN0aW9uczogY2VsbHM/LmFjdGlvbnMgPz8ge30sXG4gICAgICAnaWNvbi10aXRsZSc6IGNlbGxzPy5bJ2ljb24tdGl0bGUnXSA/PyB7IGljb25GaWVsZDogJ2ljb24nIH1cbiAgICB9O1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgY29uc3QgcSA9IHRoaXMuZ2xvYmFsRmlsdGVyKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVNpZ25hbCgpO1xuICAgIGNvbnN0IGNvbHMgPSB0aGlzLmNvbHNTaWduYWwoKTtcblxuICAgIGlmICghcSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRzID0gY29sc1xuICAgICAgLmZpbHRlcigoYykgPT4gYy5zZWFyY2hhYmxlID8/IHRydWUpXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuZmllbGQpXG4gICAgICAubWFwKChjKSA9PiBjLmZpZWxkISkgYXMgc3RyaW5nW107XG5cbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKChyb3cpID0+XG4gICAgICBmaWVsZHMuc29tZSgoZmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuXyhyb3csIGZpZWxkKTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICAgIHJldHVybiB2LmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0cmluZyh2ID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpO1xuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydGVkRGF0YSA9IGNvbXB1dGVkPFRbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5zb3J0RmllbGQoKTtcbiAgICBjb25zdCBvcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG4gICAgY29uc3QgYXJyID0gWy4uLnRoaXMuZmlsdGVyZWREYXRhKCldO1xuXG4gICAgaWYgKCFmaWVsZCB8fCBvcmRlciA9PT0gMCkge1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IHZhID0gdGhpcy5fKGEsIGZpZWxkKTtcbiAgICAgIGNvbnN0IHZiID0gdGhpcy5fKGIsIGZpZWxkKTtcblxuICAgICAgaWYgKHZhID09IG51bGwgJiYgdmIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIC1vcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZiID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9yZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAodmEgLSB2YikgKiBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZyh2YSkubG9jYWxlQ29tcGFyZShTdHJpbmcodmIpKSAqIG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLnNvcnRlZERhdGEoKS5sZW5ndGgpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwYWdlRGF0YSA9IGNvbXB1dGVkPFRbXT4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdG9yKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3QoKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucm93cygpO1xuICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluaXRpYWxMb2FkaW5nUm93cyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB7XG4gICAgY29uc3Qgcm93c0Zyb21TdGF0ZSA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHJvd3NGcm9tQ29uZmlnID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSb3dzID0gTnVtYmVyKHJvd3NGcm9tU3RhdGUgfHwgcm93c0Zyb21Db25maWcgfHwgREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcbiAgICBjb25zdCBzYWZlUm93cyA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkUm93cykgJiYgbm9ybWFsaXplZFJvd3MgPiAwID8gbm9ybWFsaXplZFJvd3MgOiBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogc2FmZVJvd3MgfSwgKF8sIGluZGV4KSA9PiBpbmRleCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3Rpb25TZXQgPSBjb21wdXRlZDxTZXQ8VD4+KCgpID0+IG5ldyBTZXQodGhpcy5zZWxlY3Rpb24oKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib2R5Vmlld3BvcnRIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgY29uc3Qgcm93SGVpZ2h0ID0gdGhpcy5pc01vYmlsZSA/IDY0IDogREVGQVVMVF9ST1dfSEVJR0hUX1BYO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHNhZmVSb3dzICogcm93SGVpZ2h0ICsgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFg7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsIGVzdGltYXRlZEhlaWdodCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eUJvZHlIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5ib2R5Vmlld3BvcnRIZWlnaHRQeCgpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhQYXJ0c0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBwcml2YXRlIHJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgcHJvdGVjdGVkIG9uRXNjYXBlS2V5KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dTY3JvbGwoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWFyY2hUZXJtKGV2T3JWYWw6IFRhYmxlU2VhcmNoRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtID0gdHlwZW9mIGV2T3JWYWwgPT09ICdzdHJpbmcnID8gZXZPclZhbCA6IGV2T3JWYWw/LmRldGFpbCA/PyAnJztcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoU3RyaW5nKHRlcm0pKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsZWFyU2VhcmNoKF9ldj86IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGZpZWxkKSB7XG4gICAgICB0aGlzLnNvcnRGaWVsZC5zZXQoZmllbGQpO1xuICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50T3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgICBpZiAoY3VycmVudE9yZGVyID09PSAxKSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgtMSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRPcmRlciA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDApO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZC5zZXQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBhbGlnbiA9IHRoaXMubm9ybWFsaXplQ29sdW1uQWxpZ25tZW50KGNvbC5hbGlnbik7XG4gICAgcmV0dXJuIGFsaWduID8gYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWAgOiBudWxsO1xuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGU6IFBhZ2luYXRvclN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dEZpcnN0ID0gZS5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZS5yb3dzID8/IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIHRoaXMuZmlyc3Quc2V0KG5leHRGaXJzdCk7XG4gICAgdGhpcy5yb3dzLnNldChuZXh0Um93cyk7XG4gICAgdGhpcy5sYXp5TG9hZC5lbWl0KHsgZmlyc3Q6IG5leHRGaXJzdCwgcm93czogbmV4dFJvd3MgfSk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBnZXRDaGVja2VkVmFsdWUoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvZ2dsZVJvdyhyb3c6IFQsIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICBuZXh0LmFkZChyb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShyb3cpO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uLnNldChbLi4ubmV4dF0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUm93U2VsZWN0ZWQocm93OiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2V0KCkuaGFzKHJvdyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlU2VsZWN0UGFnZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TZXQoKSk7XG5cbiAgICB0aGlzLnBhZ2VEYXRhKCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgbmV4dC5hZGQocik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0LmRlbGV0ZShyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uLnNldChbLi4ubmV4dF0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUGFnZUZ1bGx5U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmlzaWJsZVJvd3MgPSB0aGlzLnBhZ2VEYXRhKCk7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocikgPT4gc2VsZWN0ZWQuaGFzKHIpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveElkKHJvdzogVCk6IHN0cmluZyB7XG4gICAgaWYgKHJvdyAmJiB0eXBlb2Ygcm93ID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuZ2V0KHJvdyBhcyBvYmplY3QpO1xuXG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd0lkZW50aXR5ID0gcm93IGFzIFRhYmxlUm93SWRlbnRpdHk7XG4gICAgICBjb25zdCByb3dJZCA9XG4gICAgICAgIHJvd0lkZW50aXR5LmlkID8/XG4gICAgICAgIHJvd0lkZW50aXR5Lm5hbWUgPz9cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocm93KS5zdWJzdHJpbmcoSU5ERVhfWkVSTywgREVGQVVMVF9ST1dfSURfUFJFVklFV19MRU5HVEgpO1xuXG4gICAgICBjb25zdCBuZXh0SWQgPSBgY2hlY2tib3gtcm93LSR7U3RyaW5nKHJvd0lkKS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgJy0nKX1gO1xuICAgICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuc2V0KHJvdyBhcyBvYmplY3QsIG5leHRJZCk7XG4gICAgICByZXR1cm4gbmV4dElkO1xuICAgIH1cblxuICAgIHJldHVybiBgY2hlY2tib3gtcm93LSR7U3RyaW5nKHJvdyl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgY29uc3Qgcm93SWRlbnRpdHkgPSByb3cgYXMgVGFibGVSb3dJZGVudGl0eTtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzb2x2ZVJvd0lkZW50aXR5TGFiZWwocm93SWRlbnRpdHkpO1xuXG4gICAgcmV0dXJuIFN0cmluZyhsYWJlbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGFibGVBcmlhTGFiZWxLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKSA/PyAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS50YWJsZV9kZXNjcmlwdGlvbic7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2VsbFRleHRWYWx1ZShyb3c6IFQsIGZpZWxkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuXyhyb3csIGZpZWxkKTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjZWxsQ2ZnPEsgZXh0ZW5kcyBUYWJsZUNlbGxDb25maWdLZXk+KGtpbmQ6IEspOiBUYWJsZUNlbGxDb25maWc8VCwgSz4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKClba2luZF07XG4gIH1cblxuICBwcm90ZWN0ZWQgdGFnc09mKHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZ1tdIHtcbiAgICBpZiAoIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHRoaXMuXyhyb3csIGNvbC5maWVsZCk7XG4gICAgY29uc3QgYXJyID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogW107XG4gICAgY29uc3QgbWF4SXRlbXMgPSB0aGlzLm9wdGlvbnMoKS5jZWxscz8udGFnPy5tYXhJdGVtcztcbiAgICBjb25zdCBzbGljZWQgPSB0eXBlb2YgbWF4SXRlbXMgPT09ICdudW1iZXInID8gYXJyLnNsaWNlKElOREVYX1pFUk8sIG1heEl0ZW1zKSA6IGFycjtcblxuICAgIHJldHVybiBzbGljZWQubWFwKCh0YWcpID0+IFN0cmluZyh0YWcgPz8gJycpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0VuYWJsZWRUYWcodGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRU5BQkxFRF9UQUdfVkFMVUVTLmhhcyh0YWcudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWRUYWcodGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRElTQUJMRURfVEFHX1ZBTFVFUy5oYXModGFnLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUYWdTdHlsZXModGFnOiBzdHJpbmcsIHRhZ09wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAndGFnJz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkVGFnKHRhZykgfHwgdGhpcy5pc0Rpc2FibGVkVGFnKHRhZykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMucmVzb2x2ZVRhZ0NvbG9ycyh0YWdPcHRpb25zKTtcbiAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmJ1aWxkVGFnU3R5bGVzKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuYm9yZGVyKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA+IDAgPyBzdHlsZXMgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIF8gPSAob2JqOiBULCBwYXRoPzogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5nZXRQYXRoUGFydHMocGF0aCk7XG4gICAgbGV0IGFjYzogdW5rbm93biA9IG9iajtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUoYWNjLCBwYXJ0KTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBhY2MgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGZvcm1hdERhdGUodmFsdWU6IHVua25vd24sIF9mb3JtYXQgPSAnc2hvcnREYXRlJyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh1bmRlZmluZWQpLmZvcm1hdChuZXcgRGF0ZSh2YWx1ZSBhcyBzdHJpbmcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb3JtYXRDdXJyZW5jeSh2YWx1ZTogdW5rbm93biwgY3VycmVuY3kgPSAnQlJMJyk6IHN0cmluZyB7XG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsO1xuXG4gICAgcmV0dXJuIGZvcm1hdE51bWVyaWNWYWx1ZShudW1lcmljVmFsdWUsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3lcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHQgPSB0aGlzLmNlbGxDZmcoJ2FjdGlvbnMnKTtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuYWN0aW9uSXRlbXNGb3Iocm93LCBhY3Rpb25zT3B0KTtcbiAgICBjb25zdCByZWN0ID0gdHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLm9wZW5NZW51U3RhdGUuc2V0KHtcbiAgICAgIHJvdyxcbiAgICAgIGNvbCxcbiAgICAgIGl0ZW1zLFxuICAgICAgY2xvc2VPbkNsaWNrOiBhY3Rpb25zT3B0Py5jbG9zZU9uQ2xpY2sgIT09IGZhbHNlLFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KCk6IHZvaWQge1xuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQobnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdDogVGFibGVDZWxsQ29uZmlnPFQsICdhY3Rpb25zJz4pOiBOYXRpdmVBY3Rpb25NZW51SXRlbVtdIHtcbiAgICBjb25zdCBpdGVtcyA9IG9wdC5pdGVtcyA/PyBbXTtcblxuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IEFjdGlvbk1lbnVJdGVtPFQ+KSA9PiAoe1xuICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgaWNvbjogaXRlbS5pY29uLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMucmVzb2x2ZUFjdGlvbkRpc2FibGVkKGl0ZW0sIHJvdylcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qb3J0YWxBY3Rpb25DbGljayhldmVudDogRXZlbnQsIGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm9wZW5NZW51U3RhdGUoKTtcblxuICAgIGlmICghbWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25BY3Rpb25TZWxlY3QobWVudS5yb3csIG1lbnUuY29sLCBpdGVtKTtcblxuICAgIGlmIChtZW51LmNsb3NlT25DbGljaykge1xuICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWN0aW9uU2VsZWN0KHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgaXRlbTogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgaWNvbj86IHN0cmluZzsgZGlzYWJsZWQ/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCByb3dWYWwgPSBmaWVsZEtleSA/IHRoaXMuXyhyb3csIGZpZWxkS2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCBjb2x1bW46IGNvbCwgdmFsdWU6IHsgYWN0aW9uOiBpdGVtLCByb3dWYWx1ZTogcm93VmFsIH0gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnV0dG9uS2V5KHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgb3B0OiBUYWJsZUNlbGxDb25maWc8VCwgJ2J1dHRvbic+KTogc3RyaW5nIHtcbiAgICBjb25zdCBhY3Rpb25LZXkgPSAoY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZCA/PyAnJykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gYWN0aW9uS2V5ID8gU3RyaW5nKHRoaXMuXyhyb3csIGFjdGlvbktleSkgPz8gJycpIDogJyc7XG5cbiAgICByZXR1cm4gW1xuICAgICAgU3RyaW5nKG9wdD8ubGFiZWwgPz8gJycpLFxuICAgICAgU3RyaW5nKG9wdD8uaWNvbiA/PyAnJyksXG4gICAgICBTdHJpbmcob3B0Py5wcmlvcml0eSA/PyAnJyksXG4gICAgICBTdHJpbmcob3B0Py5zaXplID8/ICcnKSxcbiAgICAgIFN0cmluZyhvcHQ/LnRvb2x0aXAgPz8gJycpLFxuICAgICAgYWN0aW9uVmFsdWVcbiAgICBdLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJ1dHRvbkNsaWNrKHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGNvbC5hY3Rpb25GaWVsZCA/PyBjb2wuZmllbGQ7XG4gICAgY29uc3QgdmFsdWUgPSBrZXkgPyB0aGlzLl8ocm93LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIHZhbHVlLCBjb2x1bW46IGNvbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVRhZ0NvbG9ycyh0YWdPcHRpb25zOiBUYWJsZUNlbGxDb25maWc8VCwgJ3RhZyc+KTogeyBiYWNrZ3JvdW5kOiBzdHJpbmcgfCBudWxsOyBib3JkZXI6IHN0cmluZyB8IG51bGwgfSB7XG4gICAgY29uc3QgYmFzZUNvbG9yID0gdGhpcy5nZXRUYWdCYXNlQ29sb3IodGFnT3B0aW9ucyk7XG4gICAgY29uc3QgZXhwbGljaXRGb3JlZ3JvdW5kID0gdGhpcy5ub3JtYWxpemVIZXhDb2xvcih0YWdPcHRpb25zPy5jb2xvcik7XG4gICAgY29uc3QgZGVyaXZlZEZvcmVncm91bmQgPSB0aGlzLmdldERlcml2ZWRUYWdGb3JlZ3JvdW5kKGJhc2VDb2xvcik7XG4gICAgY29uc3QgZm9yZWdyb3VuZCA9IHRoaXMuZ2V0VGFnRm9yZWdyb3VuZChleHBsaWNpdEZvcmVncm91bmQsIGRlcml2ZWRGb3JlZ3JvdW5kKTtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRUYWdCYWNrZ3JvdW5kKGJhc2VDb2xvcik7XG4gICAgY29uc3QgYm9yZGVyID0gZm9yZWdyb3VuZCA/PyBkZXJpdmVkRm9yZWdyb3VuZCA/PyBiYXNlQ29sb3I7XG5cbiAgICByZXR1cm4geyBiYWNrZ3JvdW5kLCBib3JkZXIgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFnQmFzZUNvbG9yKHRhZ09wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAndGFnJz4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVIZXhDb2xvcih0YWdPcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IpID8/IHRoaXMubm9ybWFsaXplSGV4Q29sb3IodGFnT3B0aW9ucz8uY29sb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUm93SWRlbnRpdHlMYWJlbChyb3dJZGVudGl0eTogVGFibGVSb3dJZGVudGl0eSk6IHN0cmluZyB7XG4gICAgaWYgKHJvd0lkZW50aXR5Lm5hbWUpIHtcbiAgICAgIHJldHVybiBTdHJpbmcocm93SWRlbnRpdHkubmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHJvd0lkZW50aXR5LnRpdGxlKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHJvd0lkZW50aXR5LnRpdGxlKTtcbiAgICB9XG5cbiAgICBpZiAocm93SWRlbnRpdHkubGFiZWwpIHtcbiAgICAgIHJldHVybiBTdHJpbmcocm93SWRlbnRpdHkubGFiZWwpO1xuICAgIH1cblxuICAgIGlmIChyb3dJZGVudGl0eS5pZCkge1xuICAgICAgcmV0dXJuIFN0cmluZyhyb3dJZGVudGl0eS5pZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICdpdGVtJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVyaXZlZFRhZ0ZvcmVncm91bmQoYmFzZUNvbG9yOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGJhc2VDb2xvciA/IHRoaXMuZGFya2VuSGV4Q29sb3IoYmFzZUNvbG9yLCBUQUdfRk9SRUdST1VORF9EQVJLRU5fQU1PVU5UKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFRhZ0ZvcmVncm91bmQoZXhwbGljaXRGb3JlZ3JvdW5kOiBzdHJpbmcgfCBudWxsLCBkZXJpdmVkRm9yZWdyb3VuZDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChleHBsaWNpdEZvcmVncm91bmQgJiYgZXhwbGljaXRGb3JlZ3JvdW5kICE9PSAnI2ZmZmZmZicpIHtcbiAgICAgIHJldHVybiBleHBsaWNpdEZvcmVncm91bmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcml2ZWRGb3JlZ3JvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWdCYWNrZ3JvdW5kKGJhc2VDb2xvcjogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBiYXNlQ29sb3IgPyB0aGlzLnRvUmdiYShiYXNlQ29sb3IsIFRBR19CQUNLR1JPVU5EX0FMUEhBKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGFnU3R5bGVzKGJhY2tncm91bmQ6IHN0cmluZyB8IG51bGwsIGJvcmRlcjogc3RyaW5nIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgaWYgKGJhY2tncm91bmQpIHtcbiAgICAgIHN0eWxlc1snYmFja2dyb3VuZC1jb2xvciddID0gYmFja2dyb3VuZDtcbiAgICB9XG5cbiAgICBpZiAoYm9yZGVyKSB7XG4gICAgICBzdHlsZXNbJ2JvcmRlci1jb2xvciddID0gYm9yZGVyO1xuICAgICAgc3R5bGVzWydjb2xvciddID0gYm9yZGVyO1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZXM7XG4gIH1cblxuICBwcml2YXRlIGdldE9iamVjdFZhbHVlKHNvdXJjZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF0aFBhcnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnBhdGhQYXJ0c0NhY2hlLmdldChwYXRoKTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgdGhpcy5wYXRoUGFydHNDYWNoZS5zZXQocGF0aCwgcGFydHMpO1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBQYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdG9yKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhGaXJzdCA9IE1hdGgubWF4KElOREVYX1pFUk8sIHRoaXMudG90YWxSZWNvcmRzKCkgLSB0aGlzLnJvd3MoKSk7XG5cbiAgICBpZiAodGhpcy5maXJzdCgpID4gbWF4Rmlyc3QpIHtcbiAgICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVNldCA9IG5ldyBTZXQodGhpcy5kYXRhU2lnbmFsKCkpO1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbigpLmZpbHRlcigocm93KSA9PiBkYXRhU2V0Lmhhcyhyb3cpKTtcblxuICAgIGlmIChuZXh0U2VsZWN0aW9uLmxlbmd0aCAhPT0gdGhpcy5zZWxlY3Rpb24oKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNldChuZXh0U2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBY3Rpb25EaXNhYmxlZChpdGVtOiBBY3Rpb25NZW51SXRlbTxUPiwgcm93OiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlbS5kaXNhYmxlZChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtLmRpc2FibGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVIZXhDb2xvcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgnIycsICcnKTtcblxuICAgIGlmICgvXlswLTlhLWZBLUZdezN9JC8udGVzdChyYXcpKSB7XG4gICAgICByZXR1cm4gYCMke3Jhd1xuICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgIC5tYXAoKGNoYXIpID0+IGAke2NoYXJ9JHtjaGFyfWApXG4gICAgICAgIC5qb2luKCcnKVxuICAgICAgICAudG9Mb3dlckNhc2UoKX1gO1xuICAgIH1cblxuICAgIGlmICgvXlswLTlhLWZBLUZdezZ9JC8udGVzdChyYXcpKSB7XG4gICAgICByZXR1cm4gYCMke3Jhdy50b0xvd2VyQ2FzZSgpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNvbHVtbkFsaWdubWVudCh2YWx1ZTogdW5rbm93bik6IFRhYmxlQ29sdW1uQWxpZ25tZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnbGVmdCcgfHwgdmFsdWUgPT09ICdjZW50ZXInIHx8IHZhbHVlID09PSAncmlnaHQnID8gdmFsdWUgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBoZXhUb1JnYihoZXg6IHN0cmluZyk6IHsgcjogbnVtYmVyOyBnOiBudW1iZXI7IGI6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplSGV4Q29sb3IoaGV4KTtcblxuICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY2xlYW4gPSBub3JtYWxpemVkLnNsaWNlKDEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHI6IE51bWJlci5wYXJzZUludChjbGVhbi5zbGljZSgwLCAyKSwgSEVYX1JBRElYKSxcbiAgICAgIGc6IE51bWJlci5wYXJzZUludChjbGVhbi5zbGljZSgyLCA0KSwgSEVYX1JBRElYKSxcbiAgICAgIGI6IE51bWJlci5wYXJzZUludChjbGVhbi5zbGljZSg0LCA2KSwgSEVYX1JBRElYKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHRvUmdiYShoZXg6IHN0cmluZywgYWxwaGE6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoaGV4KTtcblxuICAgIGlmICghcmdiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYHJnYmEoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSwgJHthbHBoYX0pYDtcbiAgfVxuXG4gIHByaXZhdGUgZGFya2VuSGV4Q29sb3IoaGV4OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXgpO1xuXG4gICAgaWYgKCFyZ2IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIDEgLSBhbW91bnQpKTtcbiAgICBjb25zdCByID0gTWF0aC5yb3VuZChyZ2IuciAqIGZhY3Rvcik7XG4gICAgY29uc3QgZyA9IE1hdGgucm91bmQocmdiLmcgKiBmYWN0b3IpO1xuICAgIGNvbnN0IGIgPSBNYXRoLnJvdW5kKHJnYi5iICogZmFjdG9yKTtcblxuICAgIHJldHVybiBgIyR7W3IsIGcsIGJdXG4gICAgICAubWFwKCh2YWx1ZSkgPT4gTWF0aC5tYXgoMCwgTWF0aC5taW4oUkdCX01BWCwgdmFsdWUpKS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAuam9pbignJyl9YDtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VPcHRpb25zKGNmZzogVGFibGVPcHRpb25zPFQ+KTogVGFibGVPcHRpb25zPFQ+IHtcbiAgICBjb25zdCBiYXNlID0gREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPjtcbiAgICBjb25zdCBuZXh0ID0gY2ZnID8/IChERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgLi4ubmV4dCxcbiAgICAgIHNlYXJjaDogeyAuLi5iYXNlLnNlYXJjaCwgLi4ubmV4dC5zZWFyY2ggfSxcbiAgICAgIHRhYmxlOiB7IC4uLmJhc2UudGFibGUsIC4uLm5leHQudGFibGUgfSxcbiAgICAgIGVtcHR5OiB7IC4uLmJhc2UuZW1wdHksIC4uLm5leHQuZW1wdHkgfSxcbiAgICAgIHBhZ2luYXRpb246IHsgLi4uYmFzZS5wYWdpbmF0aW9uLCAuLi5uZXh0LnBhZ2luYXRpb24gfSxcbiAgICAgIGNlbGxzOiB7XG4gICAgICAgIGNoZWNrYm94OiB7IC4uLihiYXNlLmNlbGxzPy5jaGVja2JveCA/PyB7fSksIC4uLihuZXh0LmNlbGxzPy5jaGVja2JveCA/PyB7fSkgfSxcbiAgICAgICAgYnV0dG9uOiB7IC4uLihiYXNlLmNlbGxzPy5idXR0b24gPz8ge30pLCAuLi4obmV4dC5jZWxscz8uYnV0dG9uID8/IHt9KSB9LFxuICAgICAgICB0YWc6IHsgLi4uKGJhc2UuY2VsbHM/LnRhZyA/PyB7fSksIC4uLihuZXh0LmNlbGxzPy50YWcgPz8ge30pIH0sXG4gICAgICAgIGFjdGlvbnM6IHsgLi4uKGJhc2UuY2VsbHM/LmFjdGlvbnMgPz8ge30pLCAuLi4obmV4dC5jZWxscz8uYWN0aW9ucyA/PyB7fSkgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsIjxzZWN0aW9uXG4gIGNsYXNzPVwic2RjLXRhYmxlXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1zdGFja109XCJpc01vYmlsZVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtZmlsdGVyZWRdPVwiISFnbG9iYWxGaWx0ZXIoKS50cmltKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1sb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWluaXRpYWwtbG9hZGluZ109XCJzaG93SW5pdGlhbExvYWRpbmcoKVwiXG4gID5cbiAgPHNkYy1sb2FkaW5nLXN0YXRlXG4gICAgY2xhc3M9XCJzZGMtdGFibGUtbG9hZGluZy13cmFwXCJcbiAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgIFtibG9ja1dpbmRvd109XCJmYWxzZVwiXG4gICAgW2Jsb2NrRGVsYXlNc109XCIwXCJcbiAgICBbaW5kaWNhdG9yXT1cIidkb3RzJ1wiXG4gICAgPlxuICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtc2hlbGxcIiBbc3R5bGUuLS1zZGMtdGFibGUtYm9keS1oZWlnaHQucHhdPVwiYm9keVZpZXdwb3J0SGVpZ2h0UHgoKVwiPlxuICAgICAgQGlmIChzaG93U2VhcmNoKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiaXNNb2JpbGUgPyAnMTAwJScgOiAnMjAlJ1wiPlxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgICAgW3RyaWdnZXJNb2RlXT1cInRyaWdnZXJNb2RlKClcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2hUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VhcmNoX2ZpZWxkJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPHRhYmxlXG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZ3JpZFwiXG4gICAgICAgICAgcm9sZT1cInRhYmxlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtcm93Y291bnRdPVwidG90YWxSZWNvcmRzKClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY29sLnNvcnRhYmxlICE9PSBmYWxzZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjb2wuc29ydGFibGUgIT09IGZhbHNlKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjb2wuc29ydGFibGUgIT09IGZhbHNlKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZV09XCJjb2wuc29ydGFibGUgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjb2wuc29ydGFibGUgIT09IGZhbHNlID8gMCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICBjb2wuc29ydGFibGUgIT09IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lclwiIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGVdPVwiY29sLnNvcnRhYmxlICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICBAc3dpdGNoIChjb2wudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnY2hlY2tib3gtc2VsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1sYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5zb3J0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1zb3J0LWljb25zIHNkYy10YWJsZS1zb3J0LW92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNvcnRJY29uc1RwbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjb2w6IGNvbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJyAmJiAoY2VsbENmZygnY2hlY2tib3gnKS5zZWxlY3RBbGwgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10aC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3NlbGVjdC1hbGwtY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzUGFnZUZ1bGx5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0UGFnZShnZXRDaGVja2VkVmFsdWUoJGV2ZW50KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNlbGVjdFBhZ2UoIWlzUGFnZUZ1bGx5U2VsZWN0ZWQoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zZWxlY3RfYWxsX3Jvd3MnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCIgY2xhc3M9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnNlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInNkYy10YWJsZS1pbml0aWFsLWxvYWRpbmctcm93XCIgcm9sZT1cInJvd1wiIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiciArIDFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkYyBzZGMtdGFibGUtdGQtLWluaXRpYWwtbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsIHNkYy10YWJsZS10ZC12YWwtLWluaXRpYWwtbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIHJvbGU9XCJyb3dcIiBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLW1vYmlsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNvcnRJY29uc1RwbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbDogY29sIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkYyBzZGMtdGFibGUtbW9iaWxlLXRkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1pcy1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGVdPVwiY29sLmhlYWRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNvbC5zb3J0YWJsZSAhPT0gZmFsc2UgPyAwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjb2wuc29ydGFibGUgIT09IGZhbHNlKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjb2wuc29ydGFibGUgIT09IGZhbHNlKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY29sLnNvcnRhYmxlICE9PSBmYWxzZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCBjb2w6IGNvbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRkIHNkYy10YWJsZS10ZGNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGVdPVwiY29sLmhlYWRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCBjb2w6IGNvbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICAgIEBpZiAoIWlzTG9hZGluZyAmJiBvcHRpb25zKCkuZW1wdHk/LnNob3cgIT09IGZhbHNlICYmIHRvdGFsUmVjb3JkcygpID09PSAwKSB7XG4gICAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgICBpY29uQ2xhc3M9XCJmYSBmYS1pbmJveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1lbXB0eS1zdGF0ZVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKHNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1wYWdpbmF0b3JcIj5cbiAgICAgICAgICAgICAgPHNkYy1wYWdpbmF0b3JcbiAgICAgICAgICAgICAgICBbZmlyc3RdPVwiZmlyc3QoKVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwicm93cygpXCJcbiAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cImlzTW9iaWxlID8gW10gOiByb3dzUGVyUGFnZU9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgW2lzTW9iaWxlXT1cImlzTW9iaWxlXCJcbiAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzTGFiZWxdPVwidG90YWxSZWNvcmRzTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9zZGMtcGFnaW5hdG9yPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2RjLWxvYWRpbmctc3RhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbFRwbCBsZXQtcm93IGxldC1jb2w9XCJjb2xcIj5cbiAgICAgICAgQHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgICAgICBAY2FzZSAoJ2NoZWNrYm94LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICAgIEBpZiAoY2VsbENmZygnY2hlY2tib3gnKTsgYXMgY2hlY2tib3hPcHRpb25zKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlUm93KHJvdywgZ2V0Q2hlY2tlZFZhbHVlKCRldmVudCkpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zZWxlY3Rfcm93J1xuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbmFtZTogKGdldFJvd0NoZWNrYm94TGFiZWwocm93KSB8IHRyYW5zbGF0ZSkgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIFthdHRyLmZvcl09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X3JvdydcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbmFtZTogKGdldFJvd0NoZWNrYm94TGFiZWwocm93KSB8IHRyYW5zbGF0ZSkgfVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAY2FzZSAoJ2RhdGUnKSB7XG4gICAgICAgICAgICAgIHt7IGZvcm1hdERhdGUoXyhyb3csIGNvbC5maWVsZCksIGNvbC5mb3JtYXQgfHwgJ3Nob3J0RGF0ZScpIH19XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBjYXNlICgnc3Ryb25nJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXN0cm9uZy1sYWJlbFwiPnt7IGNlbGxUZXh0VmFsdWUocm93LCBjb2wuZmllbGQpIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBjYXNlICgnY29kZScpIHtcbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJzZGMtdGFibGUtY29kZS1sYWJlbFwiPnt7IF8ocm93LCBjb2wuZmllbGQpIH19PC9jb2RlPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAY2FzZSAoJ2N1cnJlbmN5Jykge1xuICAgICAgICAgICAgICB7eyBmb3JtYXRDdXJyZW5jeShfKHJvdywgY29sLmZpZWxkKSwgY29sLmZvcm1hdCB8fCAnQlJMJykgfX1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGNhc2UgKCd0YWcnKSB7XG4gICAgICAgICAgICAgIEBpZiAoY2VsbENmZygndGFnJyk7IGFzIHRhZ09wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHRhZyBvZiB0YWdzT2Yocm93LCBjb2wpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10YWdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFnLS1lbmFibGVkXT1cImlzRW5hYmxlZFRhZyh0YWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhZy0tZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFRhZyh0YWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRUYWdTdHlsZXModGFnLCB0YWdPcHRpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwidGFnT3B0aW9ucy50b29sdGlwID8gKHRhZ09wdGlvbnMudG9vbHRpcCB8IHRyYW5zbGF0ZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICh0YWdPcHRpb25zLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJ0YWdPcHRpb25zLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRhZyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGNhc2UgKCdidXR0b24nKSB7XG4gICAgICAgICAgICAgIEBpZiAoY2VsbENmZygnYnV0dG9uJyk7IGFzIGJ1dHRvbk9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFtzaXplXT1cImJ1dHRvbk9wdGlvbnMuc2l6ZSA/PyAnZGVmYXVsdCdcIlxuICAgICAgICAgICAgICAgICAgICBbcHJpb3JpdHldPVwiYnV0dG9uT3B0aW9ucy5wcmlvcml0eSB8fCAncHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJidXR0b25PcHRpb25zLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uT3B0aW9ucy5sYWJlbCA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25PcHRpb25zLmRpc2FibGVkID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImJ1dHRvbk9wdGlvbnMudG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnNpemVdPVwiYnV0dG9uT3B0aW9ucy5zaXplXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucHJpb3JpdHldPVwiYnV0dG9uT3B0aW9ucy5wcmlvcml0eSB8fCAncHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zZXZlcml0eV09XCJidXR0b25PcHRpb25zLnByaW9yaXR5IHx8ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmljb25dPVwiYnV0dG9uT3B0aW9ucy5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIubGFiZWxdPVwiYnV0dG9uT3B0aW9ucy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImJ1dHRvbk9wdGlvbnMuZGlzYWJsZWQgPyAnJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJidXR0b25PcHRpb25zLnRvb2x0aXAgfHwgbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgKGJ1dHRvbk9wdGlvbnMubGFiZWwgfHwgYnV0dG9uT3B0aW9ucy50b29sdGlwIHx8ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LmFjdGlvbl9idXR0b24nKVxuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICsgJyAtICdcbiAgICAgICAgICAgICAgICAgICsgKGdldFJvd0NoZWNrYm94TGFiZWwocm93KSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1rZXldPVwiYnV0dG9uS2V5KHJvdywgY29sLCBidXR0b25PcHRpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25PcHRpb25zLmRpc2FibGVkID8gbnVsbCA6IG9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYnV0dG9uT3B0aW9ucy5kaXNhYmxlZCA/IG51bGwgOiBvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBidXR0b25PcHRpb25zLmRpc2FibGVkID8gbnVsbCA6IG9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9zZGMtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBjYXNlICgnYWN0aW9ucycpIHtcbiAgICAgICAgICAgICAgQGlmIChjZWxsQ2ZnKCdhY3Rpb25zJyk7IGFzIGFjdGlvbnNPcHQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1hY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtYWN0aW9ucy0tb3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAjYWN0aW9uc1RyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWFjdGlvbnMtdHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtYWN0aW9ucy10cmlnZ2VyLS1vcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgKChhY3Rpb25zT3B0LmJ1dHRvbkxhYmVsIHx8ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LmFjdGlvbnNfbWVudScpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgKyAnIC0gJ1xuICAgICAgICAgICAgICAgICAgKyAoZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQsIHJvdywgY29sLCBhY3Rpb25zVHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWFjdGlvbnMtdHJpZ2dlcl9fbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAoYWN0aW9uc09wdC5idXR0b25MYWJlbCB8fCAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5hY3Rpb25zX21lbnUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biBzZGMtdGFibGUtYWN0aW9ucy10cmlnZ2VyX19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGNhc2UgKCdpY29uLXRpdGxlJykge1xuICAgICAgICAgICAgICBAaWYgKGNlbGxDZmcoJ2ljb24tdGl0bGUnKTsgYXMgaWNvblRpdGxlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtaWNvbi10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIl8ocm93LCBpY29uVGl0bGVPcHRpb25zLmljb25GaWVsZClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjZWxsVGV4dFZhbHVlKHJvdywgY29sLmZpZWxkKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIHt7IGNlbGxUZXh0VmFsdWUocm93LCBjb2wuZmllbGQpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgQGlmIChvcGVuTWVudVN0YXRlKCk7IGFzIG1lbnUpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLWFjdGlvbnMtbWVudSBzZGMtYWN0aW9ucy1tZW51LS1wb3J0YWxcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwibWVudS50b3BcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIm1lbnUubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJtZW51LndpZHRoXCJcbiAgICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgbWVudS5pdGVtczsgdHJhY2sgaXRlbS5rZXkgKyAnLScgKyAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWFjdGlvbnMtaXRlbVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNkYy1hY3Rpb25zLWl0ZW0tLWRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Qb3J0YWxBY3Rpb25DbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1hY3Rpb25zLWl0ZW1fX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW0uaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPG5nLXRlbXBsYXRlICNzb3J0SWNvbnNUcGwgbGV0LWNvbD1cImNvbFwiPlxuICAgICAgICBAaWYgKGNvbC5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgY29sLnR5cGUgIT09ICdjaGVja2JveC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHNvcnRGaWVsZCgpICE9PSBjb2wuZmllbGQpIHtcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc29ydC1hbHQgc2RjLXRhYmxlLXNvcnQtbmV1dHJhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoc29ydEZpZWxkKCkgPT09IGNvbC5maWVsZCAmJiBzb3J0T3JkZXIoKSA9PT0gMSkge1xuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zb3J0LWFtb3VudC11cC1hbHQgc2RjLXRhYmxlLXNvcnQtYWN0aXZlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkICYmIHNvcnRPcmRlcigpID09PSAtMSkge1xuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zb3J0LWFtb3VudC1kb3duIHNkYy10YWJsZS1zb3J0LWFjdGl2ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yIHNkYy10YWJsZS1zb3J0LWluZGljYXRvci1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
452
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQWlCMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBD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a0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsMkJBQTJCO3dCQUMzQix5QkFBeUI7d0JBQ3pCLHlCQUF5QjtxQkFDMUIsaUJBR2MsaUJBQWlCLENBQUMsUUFBUSxtQkFDeEIsdUJBQXVCLENBQUMsTUFBTTs4QkF5QjNDLElBQUk7c0JBRFAsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBVXJCLElBQUk7c0JBRFAsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBYXJCLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBY3RCLE1BQU07c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBeUJ0QixTQUFTO3NCQURaLEtBQUs7Z0JBU0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBc0dHLGVBQWU7c0JBRHhCLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU1wQixXQUFXO3NCQURwQixZQUFZO3VCQUFDLHlCQUF5QjtnQkFNN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlO2dCQU9uQixjQUFjO3NCQUR2QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IGdldFZpZXdwb3J0V2lkdGgsIGlzTW9iaWxlVmlld3BvcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2xheW91dC51dGlsJztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEFCTEVfT1BUSU9OUyxcbiAgVEFCTEVfREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFggYXMgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFgsXG4gIFRBQkxFX0RFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYIGFzIERFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV19IRUlHSFRfUFggYXMgREVGQVVMVF9ST1dfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV1NfUEVSX1BBR0UgYXMgREVGQVVMVF9ST1dTX1BFUl9QQUdFLFxuICBUQUJMRV9JTkRFWF9aRVJPIGFzIElOREVYX1pFUk8sXG4gIFRBQkxFX01FTlVfR0FQX1BYIGFzIE1FTlVfR0FQX1BYLFxuICBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL3RhYmxlLmNvbnN0JztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdG9yU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3BhZ2luYXRvci50eXBlJztcbmltcG9ydCB7IHR5cGUgU2VhcmNoVHJpZ2dlck1vZGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3NlYXJjaGJveC50eXBlJztcbmltcG9ydCB7XG4gIHR5cGUgQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgUm93QmFzZSxcbiAgdHlwZSBTb3J0T3JkZXIsXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51SXRlbSBhcyBOYXRpdmVBY3Rpb25NZW51SXRlbSxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVJvd0lkZW50aXR5LFxuICB0eXBlIFRhYmxlU2VhcmNoRXZlbnRcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlJztcblxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hib3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hib3gvc2VhcmNoYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkaW5nU3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9sb2FkaW5nLXN0YXRlL2xvYWRpbmctc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWN0aW9uc01lbnVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWN0aW9ucy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUNlbGxDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWNlbGwtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLXNvcnQtaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCwgbWVyZ2VUYWJsZU9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL3RhYmxlLWNvbmZpZy51dGlsJztcbmltcG9ydCB7XG4gIGJ1aWxkUm93Q2hlY2tib3hJZCxcbiAgZmlsdGVyVGFibGVSb3dzLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWxcbn0gZnJvbSAnLi91dGlscy90YWJsZS1kYXRhLnV0aWwnO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4LFxuICBnZXRUYWJsZU1pbldpZHRoUHgsXG4gIG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNlYXJjaGJveENvbXBvbmVudCxcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIExvYWRpbmdTdGF0ZUNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQsXG4gICAgVGFibGVDZWxsQ29udGVudENvbXBvbmVudCxcbiAgICBUYWJsZUFjdGlvbnNNZW51Q29tcG9uZW50XG4gIF0sXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xzU2lnbmFsID0gc2lnbmFsPFRhYmxlQ29sdW1uPFQ+W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU2lnbmFsID0gc2lnbmFsPFRbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0V2lkdGhTaWduYWwgPSBzaWduYWw8bnVtYmVyPihnZXRWaWV3cG9ydFdpZHRoKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2lnbmFsID0gc2lnbmFsPFRhYmxlT3B0aW9uczxUPj4obWVyZ2VUYWJsZU9wdGlvbnMoREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPikpO1xuICBwcml2YXRlIF9jb25maWc6IFRhYmxlT3B0aW9uczxUPiA9IERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoUGFydHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3Blbk1lbnVTdGF0ZSA9IHNpZ25hbDxPcGVuTWVudVN0YXRlPFQ+IHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhcmlhTGFiZWxTaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxGaWx0ZXIgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0RmllbGQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0T3JkZXIgPSBzaWduYWw8U29ydE9yZGVyPigwKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGlvbiA9IHNpZ25hbDxUW10+KFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0ID0gc2lnbmFsPG51bWJlcj4oSU5ERVhfWkVSTyk7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzID0gc2lnbmFsPG51bWJlcj4oREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgY29scyh2YWx1ZTogVGFibGVDb2x1bW48VD5bXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbHNTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgfVxuXG4gIGdldCBjb2xzKCk6IFRhYmxlQ29sdW1uPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLmNvbHNTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBkYXRhKHZhbHVlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5kYXRhU2lnbmFsLnNldCh2YWx1ZSA/PyBbXSk7XG4gICAgdGhpcy5yZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpO1xuICAgIHRoaXMuY2xhbXBQYWdlKCk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBnZXQgZGF0YSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSB9KVxuICBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmxvYWRpbmdTaWduYWwuc2V0KHZhbHVlID09PSB0cnVlKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBjb25maWcodmFsdWU6IFRhYmxlT3B0aW9uczxUPiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gKERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD4pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbmV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZyA9IG5leHQ7XG4gICAgdGhpcy5jb25maWdTaWduYWwuc2V0KG1lcmdlVGFibGVPcHRpb25zKG5leHQpKTtcblxuICAgIGNvbnN0IG5leHRSb3dzID0gdGhpcy5jb25maWdTaWduYWwoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgdGhpcy5yb3dzLnNldChuZXh0Um93cyk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG5cbiAgICB0aGlzLnBhdGhQYXJ0c0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKTogVGFibGVPcHRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hcmlhTGFiZWxTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sdW1uOiBUYWJsZUNvbHVtbjxUPjsgcm93OiBUOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGF6eUxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmlyc3Q6IG51bWJlcjsgcm93czogbnVtYmVyIH0+KCk7XG5cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uczxUPj4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc01vYmlsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IGlzTW9iaWxlVmlld3BvcnQodGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1NlYXJjaCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uc2hvdyA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93UGFnaW5hdG9yID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8uc2hvdyA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93SW5pdGlhbExvYWRpbmcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLmxvYWRpbmdTaWduYWwoKSAmJiB0aGlzLmRhdGFTaWduYWwoKS5sZW5ndGggPT09IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzUGVyUGFnZU9wdGlvbnMgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2VPcHRpb25zID8/IFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaFBsYWNlaG9sZGVyID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnBsYWNlaG9sZGVyID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyaWdnZXJNb2RlID0gY29tcHV0ZWQ8U2VhcmNoVHJpZ2dlck1vZGU+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8udHlwZSA/PyAnYXV0bycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzTGFiZWwgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50b3RhbFJlY29yZHNMYWJlbCA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0VGV4dE92ZXJmbG93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRleHRPdmVyZmxvdyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRpdGxlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGl0bGUgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlUZXh0ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGV4dCA/PyAnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxzQ2ZnID0gY29tcHV0ZWQoKCkgPT4gYnVpbGRUYWJsZUNlbGxDb25maWdNYXAodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PlxuICAgIGZpbHRlclRhYmxlUm93cyh0aGlzLmRhdGFTaWduYWwoKSwgdGhpcy5jb2xzU2lnbmFsKCksIHRoaXMuZ2xvYmFsRmlsdGVyKCksIHRoaXMucmVzb2x2ZVZhbHVlKVxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0ZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLnNvcnRGaWVsZCgpO1xuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMuZmlsdGVyZWREYXRhKCldO1xuXG4gICAgaWYgKCFmaWVsZCB8fCBvcmRlciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3Muc29ydCgobGVmdFJvdywgcmlnaHRSb3cpID0+IHtcbiAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IHRoaXMucmVzb2x2ZVZhbHVlKGxlZnRSb3csIGZpZWxkKTtcbiAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSB0aGlzLnJlc29sdmVWYWx1ZShyaWdodFJvdywgZmllbGQpO1xuXG4gICAgICBpZiAobGVmdFZhbHVlID09IG51bGwgJiYgcmlnaHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAobGVmdFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIC1vcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbGVmdFZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcmlnaHRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIChsZWZ0VmFsdWUgLSByaWdodFZhbHVlKSAqIG9yZGVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU3RyaW5nKGxlZnRWYWx1ZSkubG9jYWxlQ29tcGFyZShTdHJpbmcocmlnaHRWYWx1ZSkpICogb3JkZXI7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0b3RhbFJlY29yZHMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuc29ydGVkRGF0YSgpLmxlbmd0aCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VEYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdCgpO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5yb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5pdGlhbExvYWRpbmdSb3dzID0gY29tcHV0ZWQ8bnVtYmVyW10+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBzYWZlUm93cyB9LCAoXywgaW5kZXgpID0+IGluZGV4KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGlvblNldCA9IGNvbXB1dGVkPFNldDxUPj4oKCkgPT4gbmV3IFNldCh0aGlzLnNlbGVjdGlvbigpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJvZHlWaWV3cG9ydEhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgY29uc3Qgcm93c0Zyb21TdGF0ZSA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHJvd3NGcm9tQ29uZmlnID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSb3dzID0gTnVtYmVyKHJvd3NGcm9tU3RhdGUgfHwgcm93c0Zyb21Db25maWcgfHwgREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcbiAgICBjb25zdCBzYWZlUm93cyA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkUm93cykgJiYgbm9ybWFsaXplZFJvd3MgPiAwID8gbm9ybWFsaXplZFJvd3MgOiBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLmlzTW9iaWxlKCkgPyBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYIDogREVGQVVMVF9ST1dfSEVJR0hUX1BYO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHNhZmVSb3dzICogcm93SGVpZ2h0ICsgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFg7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsIGVzdGltYXRlZEhlaWdodCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eUJvZHlIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5ib2R5Vmlld3BvcnRIZWlnaHRQeCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlTWluV2lkdGhQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gZ2V0VGFibGVNaW5XaWR0aFB4KHRoaXMuY29sc1NpZ25hbCgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVWYWx1ZSA9IChvYmo6IFQsIHBhdGg/OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoLCB0aGlzLnBhdGhQYXJ0c0NhY2hlKTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gIHByb3RlY3RlZCBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIHByb3RlY3RlZCBvbkVzY2FwZUtleSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsLnNldChnZXRWaWV3cG9ydFdpZHRoKCkpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlYXJjaFRlcm0oZXZlbnRPclZhbHVlOiBUYWJsZVNlYXJjaEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGVybSA9IHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdzdHJpbmcnID8gZXZlbnRPclZhbHVlIDogZXZlbnRPclZhbHVlPy5kZXRhaWwgPz8gJyc7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KFN0cmluZyh0ZXJtKSk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGZpZWxkKSB7XG4gICAgICB0aGlzLnNvcnRGaWVsZC5zZXQoZmllbGQpO1xuICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50T3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgICBpZiAoY3VycmVudE9yZGVyID09PSAxKSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgtMSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRPcmRlciA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDApO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZC5zZXQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBhbGlnbiA9IG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50KGNvbC5hbGlnbik7XG4gICAgcmV0dXJuIGFsaWduID8gYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWAgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU29ydGFibGVDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wuc29ydGFibGUgIT09IGZhbHNlICYmICEhY29sLmZpZWxkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbHVtbk1pbldpZHRoUHgoY29sOiBUYWJsZUNvbHVtbjxUPik6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vYmlsZUZpZWxkTGFiZWwoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5oZWFkZXIpIHtcbiAgICAgIHJldHVybiBjb2wuaGVhZGVyO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2FjdGlvbnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmFjdGlvbnMuYnV0dG9uTGFiZWwgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uc19tZW51JztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi50b29sdGlwXG4gICAgICAgICAgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uX2J1dHRvbic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogUGFnaW5hdG9yU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0Rmlyc3QgPSBldmVudC5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICB0aGlzLmZpcnN0LnNldChuZXh0Rmlyc3QpO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IGZpcnN0OiBuZXh0Rmlyc3QsIHJvd3M6IG5leHRSb3dzIH0pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlUm93KHJvdzogVCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXQoKS5oYXMocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTZWxlY3RQYWdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIHRoaXMucGFnZURhdGEoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlRnVsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMucGFnZURhdGEoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoZWNrZWRWYWx1ZShldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94SWQocm93OiBUKTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdyB8fCB0eXBlb2Ygcm93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucm93Q2hlY2tib3hJZENhY2hlLmdldChyb3cgYXMgb2JqZWN0KTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dElkID0gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuc2V0KHJvdyBhcyBvYmplY3QsIG5leHRJZCk7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dJZGVudGl0eUxhYmVsKHJvdyBhcyBUYWJsZVJvd0lkZW50aXR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUFyaWFMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnRhYmxlX2Rlc2NyaXB0aW9uJztcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHRpb25zID0gdGhpcy5jZWxsQ2ZnKCdhY3Rpb25zJyk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmFjdGlvbkl0ZW1zRm9yKHJvdywgYWN0aW9uc09wdGlvbnMpO1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQoe1xuICAgICAgcm93LFxuICAgICAgY29sLFxuICAgICAgaXRlbXMsXG4gICAgICBjbG9zZU9uQ2xpY2s6IGFjdGlvbnNPcHRpb25zPy5jbG9zZU9uQ2xpY2sgIT09IGZhbHNlLFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KCk6IHZvaWQge1xuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQobnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAnYWN0aW9ucyc+KTogTmF0aXZlQWN0aW9uTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLml0ZW1zID8/IFtdO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4pID0+ICh7XG4gICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICBkaXNhYmxlZDogdGhpcy5yZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbSwgcm93KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcnRhbEFjdGlvbkNsaWNrKGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VsZWN0KG1lbnUucm93LCBtZW51LmNvbCwgaXRlbSk7XG5cbiAgICBpZiAobWVudS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkFjdGlvblNlbGVjdChyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4sIGl0ZW06IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGljb24/OiBzdHJpbmc7IGRpc2FibGVkPzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbC5hY3Rpb25GaWVsZCA/PyBjb2wuZmllbGQ7XG4gICAgY29uc3Qgcm93VmFsdWUgPSBmaWVsZEtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywgZmllbGRLZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIGNvbHVtbjogY29sLCB2YWx1ZTogeyBhY3Rpb246IGl0ZW0sIHJvd1ZhbHVlIH0gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CdXR0b25DbGljayhyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0ga2V5ID8gdGhpcy5yZXNvbHZlVmFsdWUocm93LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIHZhbHVlLCBjb2x1bW46IGNvbCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQ2VsbElkKGNvbDogVGFibGVDb2x1bW48VD4sIHJvdzogVCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29sLmNlbGxJZCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIHJldHVybiB0eXBlb2YgY29sLmNlbGxJZCA9PT0gJ2Z1bmN0aW9uJyA/IChjb2wuY2VsbElkKHJvdykgfHwgbnVsbCkgOiAoY29sLmNlbGxJZCB8fCBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2VsbENmZzxLIGV4dGVuZHMgVGFibGVDZWxsQ29uZmlnS2V5PihraW5kOiBLKSB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKVtraW5kXTtcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBQYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdG9yKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhGaXJzdCA9IE1hdGgubWF4KElOREVYX1pFUk8sIHRoaXMudG90YWxSZWNvcmRzKCkgLSB0aGlzLnJvd3MoKSk7XG5cbiAgICBpZiAodGhpcy5maXJzdCgpID4gbWF4Rmlyc3QpIHtcbiAgICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVNldCA9IG5ldyBTZXQodGhpcy5kYXRhU2lnbmFsKCkpO1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbigpLmZpbHRlcigocm93KSA9PiBkYXRhU2V0Lmhhcyhyb3cpKTtcblxuICAgIGlmIChuZXh0U2VsZWN0aW9uLmxlbmd0aCAhPT0gdGhpcy5zZWxlY3Rpb24oKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNldChuZXh0U2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBY3Rpb25EaXNhYmxlZChpdGVtOiBBY3Rpb25NZW51SXRlbTxUPiwgcm93OiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlbS5kaXNhYmxlZChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtLmRpc2FibGVkID09PSB0cnVlO1xuICB9XG59XG4iLCI8c2VjdGlvblxuICBjbGFzcz1cInNkYy10YWJsZVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtc3RhY2tdPVwiaXNNb2JpbGUoKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtZmlsdGVyZWRdPVwiISFnbG9iYWxGaWx0ZXIoKS50cmltKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1sb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWluaXRpYWwtbG9hZGluZ109XCJzaG93SW5pdGlhbExvYWRpbmcoKVwiXG4+XG4gIDxzZGMtbG9hZGluZy1zdGF0ZVxuICAgIGNsYXNzPVwic2RjLXRhYmxlLWxvYWRpbmctd3JhcFwiXG4gICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICBbYmxvY2tXaW5kb3ddPVwiZmFsc2VcIlxuICAgIFtibG9ja0RlbGF5TXNdPVwiMFwiXG4gICAgW2luZGljYXRvcl09XCInZG90cydcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1zaGVsbFwiIFtzdHlsZS4tLXNkYy10YWJsZS1ib2R5LWhlaWdodC5weF09XCJib2R5Vmlld3BvcnRIZWlnaHRQeCgpXCI+XG4gICAgICBAaWYgKHNob3dTZWFyY2goKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWNhcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWNhcHRpb25fX3NlYXJjaFwiPlxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgICAgW3RyaWdnZXJNb2RlXT1cInRyaWdnZXJNb2RlKClcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2hUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnNlYXJjaF9maWVsZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1zY3JvbGxcIiBbc3R5bGUuLS1zZGMtdGFibGUtbWluLXdpZHRoLnB4XT1cInRhYmxlTWluV2lkdGhQeCgpXCI+XG4gICAgICAgICAgPHRhYmxlXG4gICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1ncmlkXCJcbiAgICAgICAgICAgIHJvbGU9XCJ0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3djb3VudF09XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggPz8gKGNvbHVtbk1pbldpZHRoUHgoY29sKSArICdweCcpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9jb2xncm91cD5cblxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1pcy1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldFNvcnRBcmlhQXR0cmlidXRlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbCkgPyAwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNTb3J0YWJsZUNvbHVtbihjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGgtaW5uZXJcIiBbY2xhc3Muc2RjLXRhYmxlLXNvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgY29sLmhlYWRlciB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXNvcnQtb3ZlcmxheVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRmllbGRdPVwiY29sLmZpZWxkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydEZpZWxkXT1cInNvcnRGaWVsZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJyAmJiAoY2VsbHNDZmcoKS5jaGVja2JveC5zZWxlY3RBbGwgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3NlbGVjdC1hbGwtY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQYWdlRnVsbHlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0UGFnZShnZXRDaGVja2VkVmFsdWUoJGV2ZW50KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU2VsZWN0UGFnZSghaXNQYWdlRnVsbHlTZWxlY3RlZCgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X2FsbF9yb3dzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCIgY2xhc3M9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnNlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInNkYy10YWJsZS1pbml0aWFsLWxvYWRpbmctcm93XCIgcm9sZT1cInJvd1wiIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiciArIDFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkYyBzZGMtdGFibGUtdGQtLWluaXRpYWwtbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbCBzZGMtdGFibGUtdGQtdmFsLS1pbml0aWFsLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNvbC5jb2xJZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5jZWxsVGFnID09PSAnc3BhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbC5jZWxsVGFnID09PSAnaScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbC5jZWxsVGFnID09PSAncCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgaWQ9XCJteS1lbXB0eS1zdGF0ZVwiXG4gICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlbXB0eVRleHQoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxpc3RcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGFibGVBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1idXN5XT1cImlzTG9hZGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICBAZm9yIChyb3dJbmRleCBvZiBpbml0aWFsTG9hZGluZ1Jvd3MoKTsgdHJhY2sgcm93SW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWNhcmQgc2RjLXRhYmxlLW1vYmlsZS1jYXJkLS1sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtZmllbGQgc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tbG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbCBzZGMtdGFibGUtbW9iaWxlLWxhYmVsLS1sb2FkaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXNrZWxldG9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtY2FyZFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLWZ1bGwtd2lkdGhdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09ICdidXR0b24nIHx8IGNvbC50eXBlID09PSAnYWN0aW9ucycgfHwgY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLXNvcnRhYmxlXT1cImNvbC5maWVsZCAmJiBpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sLmZpZWxkICYmIHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtb2JpbGVGaWVsZExhYmVsKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5maWVsZCAmJiBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbCBzZGMtdGFibGUtbW9iaWxlLWxhYmVsLS1zb3J0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyAtICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRmllbGRdPVwiY29sLmZpZWxkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydEZpZWxkXT1cInNvcnRGaWVsZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0T3JkZXJdPVwic29ydE9yZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1zb3J0LWluZGljYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtdmFsdWVcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXBhZ2luYXRvclwiPlxuICAgICAgICAgIDxzZGMtcGFnaW5hdG9yXG4gICAgICAgICAgICBbZmlyc3RdPVwiZmlyc3QoKVwiXG4gICAgICAgICAgICBbcm93c109XCJyb3dzKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cImlzTW9iaWxlKCkgPyBbXSA6IHJvd3NQZXJQYWdlT3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtpc01vYmlsZV09XCJpc01vYmlsZSgpXCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNMYWJlbF09XCJ0b3RhbFJlY29yZHNMYWJlbCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zZGMtbG9hZGluZy1zdGF0ZT5cbjwvc2VjdGlvbj5cblxuQGlmIChvcGVuTWVudVN0YXRlKCk7IGFzIG1lbnUpIHtcbiAgPHNkYy10YWJsZS1hY3Rpb25zLW1lbnVcbiAgICBbaXRlbXNdPVwibWVudS5pdGVtc1wiXG4gICAgW3RvcF09XCJtZW51LnRvcFwiXG4gICAgW2xlZnRdPVwibWVudS5sZWZ0XCJcbiAgICBbd2lkdGhdPVwibWVudS53aWR0aFwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
|