@skyux/grids 11.30.1 → 12.0.0-alpha.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/documentation.json +313 -313
- package/fesm2022/skyux-grids.mjs +23 -22
- package/fesm2022/skyux-grids.mjs.map +1 -1
- package/package.json +14 -16
- package/esm2022/index.mjs +0 -9
- package/esm2022/lib/modules/grid/grid-adapter.service.mjs +0 -87
- package/esm2022/lib/modules/grid/grid-cell.component.mjs +0 -42
- package/esm2022/lib/modules/grid/grid-column.component.mjs +0 -116
- package/esm2022/lib/modules/grid/grid-column.model.mjs +0 -26
- package/esm2022/lib/modules/grid/grid.component.mjs +0 -1038
- package/esm2022/lib/modules/grid/grid.module.mjs +0 -71
- package/esm2022/lib/modules/grid/types/grid-column-alignment.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-column-description-model-change.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-column-heading-model-change.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-column-inline-help-popover-model-change.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-column-width-model-change.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-message-type.mjs +0 -23
- package/esm2022/lib/modules/grid/types/grid-message.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-row-delete-cancel-args.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-row-delete-config.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-row-delete-confirm-args.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-row-delete-contents.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-selected-rows-model-change.mjs +0 -2
- package/esm2022/lib/modules/grid/types/grid-selected-rows-source.mjs +0 -13
- package/esm2022/lib/modules/grid/types/grid-ui-config.mjs +0 -2
- package/esm2022/lib/modules/shared/sky-grids-resources.module.mjs +0 -29
- package/esm2022/skyux-grids.mjs +0 -5
|
@@ -1,1038 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, EnvironmentInjector, EventEmitter, HostListener, Input, Output, TemplateRef, ViewChild, ViewChildren, inject, } from '@angular/core';
|
|
2
|
-
import { SkyAffixAutoFitContext, } from '@skyux/core';
|
|
3
|
-
import { ListItemModel, } from '@skyux/list-builder-common';
|
|
4
|
-
import { DragulaService } from 'ng2-dragula';
|
|
5
|
-
import { BehaviorSubject, Subject, fromEvent, merge, } from 'rxjs';
|
|
6
|
-
import { distinctUntilChanged, map, take, takeUntil, takeWhile, } from 'rxjs/operators';
|
|
7
|
-
import { SkyGridAdapterService } from './grid-adapter.service';
|
|
8
|
-
import { SkyGridColumnComponent } from './grid-column.component';
|
|
9
|
-
import { SkyGridColumnModel } from './grid-column.model';
|
|
10
|
-
import { SkyGridMessageType } from './types/grid-message-type';
|
|
11
|
-
import { SkyGridSelectedRowsSource } from './types/grid-selected-rows-source';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@skyux/core";
|
|
14
|
-
import * as i2 from "ng2-dragula";
|
|
15
|
-
import * as i3 from "./grid-adapter.service";
|
|
16
|
-
import * as i4 from "@angular/common";
|
|
17
|
-
import * as i5 from "@angular/forms";
|
|
18
|
-
import * as i6 from "@skyux/forms";
|
|
19
|
-
import * as i7 from "@skyux/help-inline";
|
|
20
|
-
import * as i8 from "@skyux/icon";
|
|
21
|
-
import * as i9 from "@skyux/layout";
|
|
22
|
-
import * as i10 from "@skyux/popovers";
|
|
23
|
-
import * as i11 from "@skyux/indicators";
|
|
24
|
-
import * as i12 from "./grid-cell.component";
|
|
25
|
-
import * as i13 from "@skyux/i18n";
|
|
26
|
-
let nextId = 0;
|
|
27
|
-
/**
|
|
28
|
-
* @deprecated `SkyGridComponent` and its features are deprecated. We recommend using the data grid instead. For more information, see https://developer.blackbaud.com/skyux/components/data-grid
|
|
29
|
-
*/
|
|
30
|
-
export class SkyGridComponent {
|
|
31
|
-
/**
|
|
32
|
-
* Columns and column properties for the grid.
|
|
33
|
-
*/
|
|
34
|
-
set columns(newColumns) {
|
|
35
|
-
const oldColumns = this.columns;
|
|
36
|
-
this._columns = newColumns;
|
|
37
|
-
if (oldColumns) {
|
|
38
|
-
this.transferColumnWidths(oldColumns, this.columns);
|
|
39
|
-
this.isResized = false;
|
|
40
|
-
this.setDisplayedColumns(true);
|
|
41
|
-
}
|
|
42
|
-
this.changeDetector.markForCheck();
|
|
43
|
-
}
|
|
44
|
-
get columns() {
|
|
45
|
-
return this._columns;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* The columns to display in the grid based on the `id` or `field` properties
|
|
49
|
-
* of the columns. If no columns are specified, then the grid displays all columns.
|
|
50
|
-
*/
|
|
51
|
-
set selectedColumnIds(value) {
|
|
52
|
-
const currentIds = this._selectedColumnIds;
|
|
53
|
-
this._selectedColumnIds = value;
|
|
54
|
-
if (this.columns) {
|
|
55
|
-
this.setDisplayedColumns();
|
|
56
|
-
}
|
|
57
|
-
// Ensure that the ids have changed.
|
|
58
|
-
if (!currentIds || !value || !this.arraysEqual(value, currentIds)) {
|
|
59
|
-
// This variable ensures that we do not set user config options or fire the change event
|
|
60
|
-
// on the first time that the columns are set up
|
|
61
|
-
if (this.selectedColumnIdsSet) {
|
|
62
|
-
this.setUserConfig({
|
|
63
|
-
selectedColumnIds: value,
|
|
64
|
-
});
|
|
65
|
-
this.selectedColumnIdsChange.emit(this._selectedColumnIds);
|
|
66
|
-
if (this.isResized) {
|
|
67
|
-
this.resetTableWidth();
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
this.selectedColumnIdsSet = true;
|
|
72
|
-
}
|
|
73
|
-
get selectedColumnIds() {
|
|
74
|
-
return this._selectedColumnIds;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* The set of IDs for the rows to select in a multiselect grid.
|
|
78
|
-
* The IDs match the `id` properties of the `data` objects.
|
|
79
|
-
* Rows with IDs that are not included are de-selected in the grid.
|
|
80
|
-
*/
|
|
81
|
-
set selectedRowIds(value) {
|
|
82
|
-
if (value) {
|
|
83
|
-
this._selectedRowIds = value;
|
|
84
|
-
this.applySelectedRows();
|
|
85
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.SelectedRowIdsChange);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
get selectedRowIds() {
|
|
89
|
-
return this._selectedRowIds;
|
|
90
|
-
}
|
|
91
|
-
get tableWidth() {
|
|
92
|
-
return this.tableElementRef.nativeElement.offsetWidth;
|
|
93
|
-
}
|
|
94
|
-
#environmentInjector;
|
|
95
|
-
constructor(affixService, changeDetector, dragulaService, gridAdapter, overlayService, skyWindow, uiConfigService, logger) {
|
|
96
|
-
this.affixService = affixService;
|
|
97
|
-
this.changeDetector = changeDetector;
|
|
98
|
-
this.dragulaService = dragulaService;
|
|
99
|
-
this.gridAdapter = gridAdapter;
|
|
100
|
-
this.overlayService = overlayService;
|
|
101
|
-
this.skyWindow = skyWindow;
|
|
102
|
-
this.uiConfigService = uiConfigService;
|
|
103
|
-
/**
|
|
104
|
-
* Whether to enable the multiselect feature to display a column of
|
|
105
|
-
* checkboxes on the left side of the grid. You can specify a unique ID with
|
|
106
|
-
* the `multiselectRowId` property, but multiselect defaults to the `id` property on
|
|
107
|
-
* the `data` object.
|
|
108
|
-
* @default false
|
|
109
|
-
*/
|
|
110
|
-
this.enableMultiselect = false;
|
|
111
|
-
/**
|
|
112
|
-
* How the grid fits to its parent. The valid options are `width`,
|
|
113
|
-
* which fits the grid to the parent's full width, and `scroll`, which allows the grid
|
|
114
|
-
* to exceed the parent's width. If the grid does not have enough columns to fill
|
|
115
|
-
* the parent's width, it always stretches to the parent's full width.
|
|
116
|
-
* @default "width"
|
|
117
|
-
*/
|
|
118
|
-
this.fit = 'width';
|
|
119
|
-
/**
|
|
120
|
-
* Whether to display a toolbar with the grid.
|
|
121
|
-
*/
|
|
122
|
-
this.hasToolbar = false;
|
|
123
|
-
/**
|
|
124
|
-
* The observable to send commands to the grid.
|
|
125
|
-
*/
|
|
126
|
-
this.messageStream = new Subject();
|
|
127
|
-
/**
|
|
128
|
-
* Fires when the width of a column changes.
|
|
129
|
-
*/
|
|
130
|
-
this.columnWidthChange = new EventEmitter();
|
|
131
|
-
/**
|
|
132
|
-
* Fires when the selection of multiselect checkboxes changes.
|
|
133
|
-
* Emits an array of IDs for the selected rows based on the `multiselectRowId` property
|
|
134
|
-
* that the consumer provides.
|
|
135
|
-
*/
|
|
136
|
-
this.multiselectSelectionChange = new EventEmitter();
|
|
137
|
-
/**
|
|
138
|
-
* @internal
|
|
139
|
-
*/
|
|
140
|
-
this.rowDeleteCancel = new EventEmitter();
|
|
141
|
-
/**
|
|
142
|
-
* @internal
|
|
143
|
-
*/
|
|
144
|
-
this.rowDeleteConfirm = new EventEmitter();
|
|
145
|
-
/**
|
|
146
|
-
* Fires when the columns to display in the grid change or when the order of the columns changes.
|
|
147
|
-
* The event emits an array of IDs for the displayed columns that reflects the column order.
|
|
148
|
-
*/
|
|
149
|
-
this.selectedColumnIdsChange = new EventEmitter();
|
|
150
|
-
/**
|
|
151
|
-
* Fires when the active sort field changes.
|
|
152
|
-
*/
|
|
153
|
-
this.sortFieldChange = new EventEmitter();
|
|
154
|
-
this.columnResizeStep = 10;
|
|
155
|
-
this.gridId = ++nextId;
|
|
156
|
-
this.rowDeleteConfigs = [];
|
|
157
|
-
this.maxColWidth = 9999; // This is an arbitrary number, as the input range picker won't work without a value.
|
|
158
|
-
this.minColWidth = 50;
|
|
159
|
-
this.showResizeBar = false;
|
|
160
|
-
this.showTopScroll = false;
|
|
161
|
-
this.isDraggingResizeHandle = false;
|
|
162
|
-
this.isResized = false;
|
|
163
|
-
this.ngUnsubscribe = new Subject();
|
|
164
|
-
this.rowDeleteContents = {};
|
|
165
|
-
this.subscriptions = [];
|
|
166
|
-
this.scrollTriggered = false;
|
|
167
|
-
this.selectedColumnIdsSet = false;
|
|
168
|
-
this.#environmentInjector = inject(EnvironmentInjector);
|
|
169
|
-
logger.deprecated('SkyGridComponent', {
|
|
170
|
-
deprecationMajorVersion: 6,
|
|
171
|
-
moreInfoUrl: 'https://developer.blackbaud.com/skyux/components/data-grid',
|
|
172
|
-
replacementRecommendation: 'Use data grid instead.',
|
|
173
|
-
});
|
|
174
|
-
this.displayedColumns = new Array();
|
|
175
|
-
this.items = new Array();
|
|
176
|
-
this.currentSortField = new BehaviorSubject({
|
|
177
|
-
fieldSelector: '',
|
|
178
|
-
descending: false,
|
|
179
|
-
});
|
|
180
|
-
this.dragulaGroupName = `sky-grids-group-${this.gridId}`;
|
|
181
|
-
}
|
|
182
|
-
ngOnInit() {
|
|
183
|
-
this.messageStream
|
|
184
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
185
|
-
.subscribe((message) => {
|
|
186
|
-
this.handleIncomingMessages(message);
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
ngAfterContentInit() {
|
|
190
|
-
if (this.settingsKey) {
|
|
191
|
-
this.applyUserConfig().then(() => {
|
|
192
|
-
this.initColumns();
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this.initColumns();
|
|
197
|
-
}
|
|
198
|
-
// Setup column drag-and-drop.
|
|
199
|
-
this.gridAdapter.initializeDragAndDrop(this.dragulaGroupName, this.dragulaService, (selectedColumnIds) => {
|
|
200
|
-
this.onHeaderDrop(selectedColumnIds);
|
|
201
|
-
});
|
|
202
|
-
this.applySelectedRows();
|
|
203
|
-
}
|
|
204
|
-
ngAfterViewInit() {
|
|
205
|
-
this.checkUserColumnWidthsForScroll();
|
|
206
|
-
}
|
|
207
|
-
ngOnChanges(changes) {
|
|
208
|
-
if (changes['columns'] && this.columns) {
|
|
209
|
-
if (this.selectedColumnIds) {
|
|
210
|
-
this.selectedColumnIds = this.selectedColumnIds.filter((columnId) => {
|
|
211
|
-
return this.columns.find((column) => column.id === columnId);
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
this.setDisplayedColumns(true);
|
|
215
|
-
}
|
|
216
|
-
if (changes['data'] && this.data) {
|
|
217
|
-
this.transformData();
|
|
218
|
-
// This set timeout is necessary to ensure the data has rendered in the grid
|
|
219
|
-
setTimeout(() => {
|
|
220
|
-
// This cleans up any lingering row deletes for items that have been removed.
|
|
221
|
-
Object.keys(this.rowDeleteContents).forEach((id) => {
|
|
222
|
-
if (!this.data.find((item) => item.id === id)) {
|
|
223
|
-
this.destroyRowDelete(id);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
// The rows re-render thus messing up the affixers. We must reaffix them so that things
|
|
227
|
-
// continue to render correctly.
|
|
228
|
-
const rowElement = this.tableElementRef.nativeElement.querySelector('[sky-cmp-id="' + id + '"]');
|
|
229
|
-
this.rowDeleteContents[id].affixer.affixTo(rowElement, {
|
|
230
|
-
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
231
|
-
isSticky: true,
|
|
232
|
-
placement: 'above',
|
|
233
|
-
verticalAlignment: 'top',
|
|
234
|
-
horizontalAlignment: 'left',
|
|
235
|
-
enableAutoFit: false,
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
this.checkUserColumnWidthsForScroll();
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
if (changes['sortField']) {
|
|
243
|
-
this.setSortHeaders();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
ngOnDestroy() {
|
|
247
|
-
this.subscriptions.forEach((subscription) => {
|
|
248
|
-
subscription.unsubscribe();
|
|
249
|
-
});
|
|
250
|
-
this.multiselectSelectionChange.complete();
|
|
251
|
-
this.ngUnsubscribe.next();
|
|
252
|
-
this.ngUnsubscribe.complete();
|
|
253
|
-
Object.keys(this.rowDeleteContents).forEach((id) => {
|
|
254
|
-
this.destroyRowDelete(id);
|
|
255
|
-
});
|
|
256
|
-
this.dragulaService.destroy(this.dragulaGroupName);
|
|
257
|
-
}
|
|
258
|
-
onWindowResize() {
|
|
259
|
-
this.checkUserColumnWidthsForScroll();
|
|
260
|
-
}
|
|
261
|
-
getTopScrollWidth() {
|
|
262
|
-
return this.tableElementRef.nativeElement.scrollWidth;
|
|
263
|
-
}
|
|
264
|
-
getTableClassNames() {
|
|
265
|
-
const classNames = [];
|
|
266
|
-
if (this.fit !== 'scroll') {
|
|
267
|
-
classNames.push('sky-grid-fit');
|
|
268
|
-
}
|
|
269
|
-
if (this.hasToolbar) {
|
|
270
|
-
classNames.push('sky-grid-has-toolbar');
|
|
271
|
-
}
|
|
272
|
-
return this.addDelimiter(classNames, ' ');
|
|
273
|
-
}
|
|
274
|
-
getTableHeaderClassNames(column) {
|
|
275
|
-
const classNames = [];
|
|
276
|
-
if (column && column.locked) {
|
|
277
|
-
classNames.push('sky-grid-header-locked');
|
|
278
|
-
}
|
|
279
|
-
return this.addDelimiter(classNames, ' ');
|
|
280
|
-
}
|
|
281
|
-
getCaretIconNames(column) {
|
|
282
|
-
const iconNames = [];
|
|
283
|
-
this.getSortDirection(column.field).subscribe((sortDir) => {
|
|
284
|
-
if (sortDir === 'asc') {
|
|
285
|
-
iconNames.push('caret-up');
|
|
286
|
-
}
|
|
287
|
-
if (sortDir === 'desc') {
|
|
288
|
-
iconNames.push('caret-down');
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
return this.addDelimiter(iconNames, ' ');
|
|
292
|
-
}
|
|
293
|
-
onKeydown(event, column) {
|
|
294
|
-
const key = event.key.toLowerCase();
|
|
295
|
-
if (key === 'enter' || key === ' ') {
|
|
296
|
-
this.sortByColumn(column);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
sortByColumn(column) {
|
|
300
|
-
if (!this.isDraggingResizeHandle && column.isSortable) {
|
|
301
|
-
this.currentSortField
|
|
302
|
-
.pipe(take(1), map((field) => {
|
|
303
|
-
let selector = {
|
|
304
|
-
fieldSelector: column.field,
|
|
305
|
-
descending: true,
|
|
306
|
-
};
|
|
307
|
-
if (field &&
|
|
308
|
-
field.fieldSelector === column.field &&
|
|
309
|
-
field.descending) {
|
|
310
|
-
selector = {
|
|
311
|
-
fieldSelector: column.field,
|
|
312
|
-
descending: false,
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
this.sortFieldChange.emit(selector);
|
|
316
|
-
this.currentSortField.next(selector);
|
|
317
|
-
}))
|
|
318
|
-
.subscribe();
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
getSortDirection(columnField) {
|
|
322
|
-
return this.currentSortField.pipe(distinctUntilChanged(), map((field) => {
|
|
323
|
-
return field.fieldSelector === columnField
|
|
324
|
-
? field.descending
|
|
325
|
-
? 'desc'
|
|
326
|
-
: 'asc'
|
|
327
|
-
: undefined;
|
|
328
|
-
}));
|
|
329
|
-
}
|
|
330
|
-
getAriaSortDirection(column) {
|
|
331
|
-
return this.currentSortField.pipe(distinctUntilChanged(), map((field) => {
|
|
332
|
-
return field.fieldSelector === column.field
|
|
333
|
-
? field.descending
|
|
334
|
-
? 'descending'
|
|
335
|
-
: 'ascending'
|
|
336
|
-
: column.isSortable
|
|
337
|
-
? 'none'
|
|
338
|
-
: undefined;
|
|
339
|
-
}));
|
|
340
|
-
}
|
|
341
|
-
getCaretVisibility(columnField) {
|
|
342
|
-
return this.currentSortField.pipe(distinctUntilChanged(), map((field) => {
|
|
343
|
-
return field.fieldSelector === columnField ? 'visible' : 'hidden';
|
|
344
|
-
}));
|
|
345
|
-
}
|
|
346
|
-
getHelpInlineClass(columnField) {
|
|
347
|
-
return this.getCaretVisibility(columnField).pipe(map((visibility) => {
|
|
348
|
-
return visibility === 'hidden';
|
|
349
|
-
}));
|
|
350
|
-
}
|
|
351
|
-
onMultiselectCheckboxChange() {
|
|
352
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.CheckboxChange);
|
|
353
|
-
}
|
|
354
|
-
updateColumnHeading(change) {
|
|
355
|
-
const foundColumnModel = this.columns.find((column) => {
|
|
356
|
-
return ((change.id !== undefined && change.id === column.id) ||
|
|
357
|
-
(change.field !== undefined && change.field === column.field));
|
|
358
|
-
});
|
|
359
|
-
/* istanbul ignore else */
|
|
360
|
-
if (foundColumnModel) {
|
|
361
|
-
foundColumnModel.heading = change.value;
|
|
362
|
-
this.changeDetector.markForCheck();
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
updateInlineHelpPopover(change) {
|
|
366
|
-
const foundColumnModel = this.columns.find((column) => {
|
|
367
|
-
return ((change.id !== undefined && change.id === column.id) ||
|
|
368
|
-
(change.field !== undefined && change.field === column.field));
|
|
369
|
-
});
|
|
370
|
-
/* istanbul ignore else */
|
|
371
|
-
if (foundColumnModel) {
|
|
372
|
-
foundColumnModel.inlineHelpPopover = change.value;
|
|
373
|
-
this.changeDetector.markForCheck();
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
updateColumnDescription(change) {
|
|
377
|
-
const foundColumnModel = this.columns.find((column) => {
|
|
378
|
-
return ((change.id !== undefined && change.id === column.id) ||
|
|
379
|
-
(change.field !== undefined && change.field === column.field));
|
|
380
|
-
});
|
|
381
|
-
/* istanbul ignore else */
|
|
382
|
-
if (foundColumnModel) {
|
|
383
|
-
foundColumnModel.description = change.value;
|
|
384
|
-
this.changeDetector.markForCheck();
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
onResizeColumnStart(event) {
|
|
388
|
-
// If this table hasn't been resized, initialize all the resize widths.
|
|
389
|
-
if (!this.isResized) {
|
|
390
|
-
this.initColumnWidths();
|
|
391
|
-
this.isResized = true;
|
|
392
|
-
}
|
|
393
|
-
this.initializeResizeColumn(event);
|
|
394
|
-
this.isDraggingResizeHandle = true;
|
|
395
|
-
this.xPosStart = event.pageX;
|
|
396
|
-
this.showResizeBar = true;
|
|
397
|
-
// Show visual indicator of where mouse is dragging (resizeBar).
|
|
398
|
-
this.changeDetector.detectChanges();
|
|
399
|
-
this.setResizeBarPosition(event.pageX);
|
|
400
|
-
event.preventDefault();
|
|
401
|
-
event.stopPropagation();
|
|
402
|
-
const mouseMoveEvent = fromEvent(document, 'mousemove');
|
|
403
|
-
const touchMoveEvent = fromEvent(document, 'touchmove');
|
|
404
|
-
merge(mouseMoveEvent, touchMoveEvent)
|
|
405
|
-
.pipe(takeWhile(() => {
|
|
406
|
-
return this.isDraggingResizeHandle;
|
|
407
|
-
}))
|
|
408
|
-
.subscribe((moveEvent) => {
|
|
409
|
-
this.onResizeHandleMove(moveEvent);
|
|
410
|
-
});
|
|
411
|
-
const mouseUpEvent = fromEvent(document, 'mouseup');
|
|
412
|
-
const touchEndEvent = fromEvent(document, 'touchend');
|
|
413
|
-
merge(mouseUpEvent, touchEndEvent)
|
|
414
|
-
.pipe(takeWhile(() => {
|
|
415
|
-
return this.isDraggingResizeHandle;
|
|
416
|
-
}))
|
|
417
|
-
.subscribe((endEvent) => {
|
|
418
|
-
this.onResizeHandleRelease(endEvent);
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
onKeydownResizeCol(event) {
|
|
422
|
-
// If this table hasn't been resized, initialize all the resize widths.
|
|
423
|
-
if (!this.isResized) {
|
|
424
|
-
this.initColumnWidths();
|
|
425
|
-
this.isResized = true;
|
|
426
|
-
}
|
|
427
|
-
this.initializeResizeColumn(event);
|
|
428
|
-
}
|
|
429
|
-
onInputChangeResizeCol(event) {
|
|
430
|
-
const input = event.target;
|
|
431
|
-
const newValue = Number(input.value);
|
|
432
|
-
const deltaX = newValue - this.startColumnWidth;
|
|
433
|
-
this.resizeColumnByIndex(this.activeResizeColumnIndex, newValue, deltaX);
|
|
434
|
-
const left = input.getBoundingClientRect().left;
|
|
435
|
-
this.setResizeBarPosition(left);
|
|
436
|
-
}
|
|
437
|
-
onResizeHandleMove(event) {
|
|
438
|
-
const deltaX = event.pageX - this.xPosStart;
|
|
439
|
-
const newColWidth = this.startColumnWidth + deltaX;
|
|
440
|
-
if (newColWidth <= this.minColWidth) {
|
|
441
|
-
event.stopPropagation();
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
const max = this.getMaxRangeByIndex(this.activeResizeColumnIndex);
|
|
445
|
-
if (this.fit === 'width' && newColWidth > max) {
|
|
446
|
-
event.stopPropagation();
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
this.setResizeBarPosition(event.pageX);
|
|
450
|
-
}
|
|
451
|
-
onResizeHandleBlur() {
|
|
452
|
-
this.showResizeBar = false;
|
|
453
|
-
}
|
|
454
|
-
onResizeHandleFocus(event) {
|
|
455
|
-
this.showResizeBar = true;
|
|
456
|
-
this.changeDetector.detectChanges();
|
|
457
|
-
const target = event.target;
|
|
458
|
-
const left = target.getBoundingClientRect().left;
|
|
459
|
-
this.setResizeBarPosition(left);
|
|
460
|
-
}
|
|
461
|
-
onResizeHandleRelease(event) {
|
|
462
|
-
this.showResizeBar = false;
|
|
463
|
-
const deltaX = event.pageX - this.xPosStart;
|
|
464
|
-
const newColWidth = this.startColumnWidth + deltaX;
|
|
465
|
-
this.resizeColumnByIndex(this.activeResizeColumnIndex, newColWidth, deltaX);
|
|
466
|
-
this.isDraggingResizeHandle = false;
|
|
467
|
-
this.activeResizeColumnIndex = undefined;
|
|
468
|
-
event.stopPropagation();
|
|
469
|
-
this.changeDetector.markForCheck();
|
|
470
|
-
}
|
|
471
|
-
onRowClick(event, selectedItem) {
|
|
472
|
-
/* istanbul ignore else */
|
|
473
|
-
if (this.enableMultiselect) {
|
|
474
|
-
if (event.target === event.currentTarget ||
|
|
475
|
-
!this.isInteractiveElement(event)) {
|
|
476
|
-
selectedItem.isSelected = !selectedItem.isSelected;
|
|
477
|
-
this.changeDetector.markForCheck();
|
|
478
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.RowClick);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
isRowHighlighted(id) {
|
|
483
|
-
if (this.rowHighlightedId) {
|
|
484
|
-
return id === this.rowHighlightedId;
|
|
485
|
-
}
|
|
486
|
-
return false;
|
|
487
|
-
}
|
|
488
|
-
getRowHeight(index) {
|
|
489
|
-
return this.gridAdapter.getRowHeight(this.tableElementRef, index);
|
|
490
|
-
}
|
|
491
|
-
cancelRowDelete(id) {
|
|
492
|
-
this.rowDeleteConfigs = this.rowDeleteConfigs.filter((config) => config.id !== id);
|
|
493
|
-
this.rowDeleteCancel.emit({ id: id });
|
|
494
|
-
this.destroyRowDelete(id);
|
|
495
|
-
}
|
|
496
|
-
confirmRowDelete(id) {
|
|
497
|
-
this.rowDeleteConfigs.find((config) => config.id === id).pending = true;
|
|
498
|
-
this.rowDeleteConfirm.emit({ id: id });
|
|
499
|
-
}
|
|
500
|
-
getRowDeleteItem(id) {
|
|
501
|
-
return this.rowDeleteConfigs.find((rowDelete) => rowDelete.id === id);
|
|
502
|
-
}
|
|
503
|
-
// Prevent touch devices from inadvertently scrolling grid while dragging columns.
|
|
504
|
-
onTouchMove(event) {
|
|
505
|
-
event.preventDefault();
|
|
506
|
-
}
|
|
507
|
-
onTopScroll(event) {
|
|
508
|
-
/* sanity check */
|
|
509
|
-
/* istanbul ignore else */
|
|
510
|
-
if (this.tableContainerElementRef) {
|
|
511
|
-
if (this.scrollTriggered) {
|
|
512
|
-
this.scrollTriggered = false;
|
|
513
|
-
this.tableContainerElementRef.nativeElement.scrollLeft =
|
|
514
|
-
this.topScrollContainerElementRef.nativeElement.scrollLeft;
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
this.scrollTriggered = true;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
onGridScroll(event) {
|
|
522
|
-
/* sanity check */
|
|
523
|
-
/* istanbul ignore else */
|
|
524
|
-
if (this.topScrollContainerElementRef) {
|
|
525
|
-
if (this.scrollTriggered) {
|
|
526
|
-
this.scrollTriggered = false;
|
|
527
|
-
this.topScrollContainerElementRef.nativeElement.scrollLeft =
|
|
528
|
-
this.tableContainerElementRef.nativeElement.scrollLeft;
|
|
529
|
-
}
|
|
530
|
-
else {
|
|
531
|
-
this.scrollTriggered = true;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
checkUserColumnWidthsForScroll() {
|
|
536
|
-
if (!this.showTopScroll &&
|
|
537
|
-
this.columnElementRefs &&
|
|
538
|
-
this.columnElementRefs.length > 0) {
|
|
539
|
-
let columnsWidthTotal = 0;
|
|
540
|
-
const windowSize = this.skyWindow.nativeWindow.innerWidth;
|
|
541
|
-
this.columnElementRefs.forEach((col) => {
|
|
542
|
-
if (!this.showTopScroll) {
|
|
543
|
-
const computedWidth = parseFloat(window.getComputedStyle(col.nativeElement).width);
|
|
544
|
-
const offsetWidth = col.nativeElement.offsetWidth;
|
|
545
|
-
const width = Math.max(computedWidth || offsetWidth, this.minColWidth);
|
|
546
|
-
columnsWidthTotal = columnsWidthTotal + width;
|
|
547
|
-
if (columnsWidthTotal > windowSize) {
|
|
548
|
-
this.showTopScroll = true;
|
|
549
|
-
setTimeout(() => {
|
|
550
|
-
this.changeDetector.markForCheck();
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
multiselectSelectAll() {
|
|
558
|
-
for (const item of this.items) {
|
|
559
|
-
item.isSelected = true;
|
|
560
|
-
}
|
|
561
|
-
this.changeDetector.markForCheck();
|
|
562
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.SelectAll);
|
|
563
|
-
}
|
|
564
|
-
multiselectClearAll() {
|
|
565
|
-
for (const item of this.items) {
|
|
566
|
-
item.isSelected = false;
|
|
567
|
-
}
|
|
568
|
-
this.changeDetector.markForCheck();
|
|
569
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.ClearAll);
|
|
570
|
-
}
|
|
571
|
-
handleIncomingMessages(message) {
|
|
572
|
-
switch (message.type) {
|
|
573
|
-
case SkyGridMessageType.SelectAll:
|
|
574
|
-
this.multiselectSelectAll();
|
|
575
|
-
break;
|
|
576
|
-
case SkyGridMessageType.ClearAll:
|
|
577
|
-
this.multiselectClearAll();
|
|
578
|
-
break;
|
|
579
|
-
case SkyGridMessageType.PromptDeleteRow:
|
|
580
|
-
/* sanity check */
|
|
581
|
-
/* istanbul ignore else */
|
|
582
|
-
if (message.data && message.data.promptDeleteRow) {
|
|
583
|
-
const existingConfig = this.rowDeleteConfigs.find((config) => config.id === message.data.promptDeleteRow.id);
|
|
584
|
-
if (existingConfig) {
|
|
585
|
-
existingConfig.pending = false;
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
this.rowDeleteConfigs.push({
|
|
589
|
-
id: message.data.promptDeleteRow.id,
|
|
590
|
-
pending: false,
|
|
591
|
-
});
|
|
592
|
-
const overlay = this.overlayService.create({
|
|
593
|
-
enableScroll: true,
|
|
594
|
-
showBackdrop: false,
|
|
595
|
-
closeOnNavigation: true,
|
|
596
|
-
enableClose: false,
|
|
597
|
-
enablePointerEvents: true,
|
|
598
|
-
environmentInjector: this.#environmentInjector,
|
|
599
|
-
});
|
|
600
|
-
overlay.attachTemplate(this.inlineDeleteTemplateRef, {
|
|
601
|
-
$implicit: this.data.find((item) => item.id === message.data.promptDeleteRow.id),
|
|
602
|
-
});
|
|
603
|
-
/**
|
|
604
|
-
* We are manually setting the z-index here because overlays will always be on top of
|
|
605
|
-
* the omnibar. This manual setting is 1 less than the omnibar's z-index of 1000. We
|
|
606
|
-
* discussed changing the overlay service to allow for this but decided against that
|
|
607
|
-
* change at this time due to its niche nature.
|
|
608
|
-
*/
|
|
609
|
-
overlay.componentRef.instance.zIndex = '999';
|
|
610
|
-
setTimeout(() => {
|
|
611
|
-
const inlineDeleteRef = this.inlineDeleteRefs
|
|
612
|
-
.toArray()
|
|
613
|
-
.find((elRef) => {
|
|
614
|
-
return (elRef.nativeElement.id ===
|
|
615
|
-
'row-delete-ref-' + message.data.promptDeleteRow.id);
|
|
616
|
-
});
|
|
617
|
-
const affixer = this.affixService.createAffixer(inlineDeleteRef);
|
|
618
|
-
const rowElement = this.tableElementRef.nativeElement.querySelector('[sky-cmp-id="' + message.data.promptDeleteRow.id + '"]');
|
|
619
|
-
affixer.affixTo(rowElement, {
|
|
620
|
-
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
621
|
-
isSticky: true,
|
|
622
|
-
placement: 'above',
|
|
623
|
-
verticalAlignment: 'top',
|
|
624
|
-
horizontalAlignment: 'left',
|
|
625
|
-
enableAutoFit: false,
|
|
626
|
-
});
|
|
627
|
-
this.rowDeleteContents[message.data.promptDeleteRow.id] = {
|
|
628
|
-
affixer: affixer,
|
|
629
|
-
overlay: overlay,
|
|
630
|
-
};
|
|
631
|
-
});
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
break;
|
|
635
|
-
case SkyGridMessageType.AbortDeleteRow:
|
|
636
|
-
/* sanity check */
|
|
637
|
-
/* istanbul ignore else */
|
|
638
|
-
if (message.data && message.data.abortDeleteRow) {
|
|
639
|
-
this.rowDeleteConfigs = this.rowDeleteConfigs.filter((config) => config.id !== message.data.abortDeleteRow.id);
|
|
640
|
-
this.destroyRowDelete(message.data.abortDeleteRow.id);
|
|
641
|
-
}
|
|
642
|
-
break;
|
|
643
|
-
}
|
|
644
|
-
this.changeDetector.markForCheck();
|
|
645
|
-
}
|
|
646
|
-
onHeaderDrop(newColumnIds) {
|
|
647
|
-
// update selected columnIds
|
|
648
|
-
this.selectedColumnIdsSet = true;
|
|
649
|
-
this.selectedColumnIds = newColumnIds;
|
|
650
|
-
// mark for check because we are using ChangeDetectionStrategy.onPush
|
|
651
|
-
this.changeDetector.markForCheck();
|
|
652
|
-
}
|
|
653
|
-
setDisplayedColumns(respectHidden = false) {
|
|
654
|
-
/* sanity check */
|
|
655
|
-
/* istanbul ignore else */
|
|
656
|
-
if (this.columns) {
|
|
657
|
-
if (this.selectedColumnIds !== undefined) {
|
|
658
|
-
// setup displayed columns
|
|
659
|
-
this.displayedColumns = this.selectedColumnIds
|
|
660
|
-
.filter((columnId) => {
|
|
661
|
-
return this.columns.find((column) => column.id === columnId);
|
|
662
|
-
})
|
|
663
|
-
.map((columnId) => {
|
|
664
|
-
return this.columns.filter((column) => column.id === columnId)[0];
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
else if (respectHidden) {
|
|
668
|
-
this.displayedColumns = this.columns.filter((column) => {
|
|
669
|
-
return !column.hidden;
|
|
670
|
-
});
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
this.displayedColumns = this.columns;
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
transformData() {
|
|
678
|
-
// Transform data into object with id and data properties
|
|
679
|
-
if (this.data &&
|
|
680
|
-
this.data.length > 0 &&
|
|
681
|
-
this.data[0].id &&
|
|
682
|
-
!this.data[0].data) {
|
|
683
|
-
if (this.multiselectRowId) {
|
|
684
|
-
this.items = this.getGridDataWithSelectedRows();
|
|
685
|
-
}
|
|
686
|
-
else {
|
|
687
|
-
this.items = this.data.map((item) => new ListItemModel(item.id, item));
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
else {
|
|
691
|
-
this.items = this.data;
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
getGridDataWithSelectedRows() {
|
|
695
|
-
const selectedRows = this.getSelectedRows();
|
|
696
|
-
return this.data.map((item) => {
|
|
697
|
-
let checked;
|
|
698
|
-
if (Object.prototype.hasOwnProperty.call(item, this.multiselectRowId)) {
|
|
699
|
-
checked = selectedRows.indexOf(item[this.multiselectRowId]) > -1;
|
|
700
|
-
}
|
|
701
|
-
else {
|
|
702
|
-
checked = selectedRows.indexOf(item.id) > -1;
|
|
703
|
-
}
|
|
704
|
-
return new ListItemModel(item.id, item, checked);
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
applySelectedRows() {
|
|
708
|
-
if (this.items && this.items.length > 0 && this.selectedRowIds) {
|
|
709
|
-
for (const item of this.items) {
|
|
710
|
-
item.isSelected = this.selectedRowIds.indexOf(item.id) > -1;
|
|
711
|
-
}
|
|
712
|
-
this.changeDetector.markForCheck();
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
setSortHeaders() {
|
|
716
|
-
this.currentSortField.next(this.sortField || { fieldSelector: '', descending: false });
|
|
717
|
-
}
|
|
718
|
-
getColumnsFromComponent() {
|
|
719
|
-
this.columns = this.columnComponents.map((columnComponent) => {
|
|
720
|
-
return new SkyGridColumnModel(columnComponent.template, columnComponent);
|
|
721
|
-
});
|
|
722
|
-
}
|
|
723
|
-
updateColumns() {
|
|
724
|
-
this.getColumnsFromComponent();
|
|
725
|
-
// This set timeout is necessary to ensure the columns have rendered in the grid
|
|
726
|
-
setTimeout(() => {
|
|
727
|
-
this.checkUserColumnWidthsForScroll();
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
resizeColumnByIndex(columnIndex, newColWidth, deltaX) {
|
|
731
|
-
const column = this.getColumnModelByIndex(columnIndex);
|
|
732
|
-
// Prevent accidental shrinkage below minimum width.
|
|
733
|
-
if (newColWidth <= this.minColWidth) {
|
|
734
|
-
deltaX = deltaX + this.minColWidth - newColWidth;
|
|
735
|
-
newColWidth = this.minColWidth;
|
|
736
|
-
}
|
|
737
|
-
// fit=width adds/removes width from the last column
|
|
738
|
-
// fit=scroll adds/removes width from the table
|
|
739
|
-
if (this.fit === 'width') {
|
|
740
|
-
const lastColumn = this.getLastDisplayedColumn();
|
|
741
|
-
// Prevent accidental growth that would bump last column off screen.
|
|
742
|
-
const max = this.getMaxRangeByIndex(columnIndex);
|
|
743
|
-
if (newColWidth > max) {
|
|
744
|
-
newColWidth = max;
|
|
745
|
-
deltaX = max - this.startColumnWidth;
|
|
746
|
-
}
|
|
747
|
-
column.width = newColWidth;
|
|
748
|
-
lastColumn.width = lastColumn.width - deltaX;
|
|
749
|
-
this.updateMaxRange();
|
|
750
|
-
}
|
|
751
|
-
else {
|
|
752
|
-
this.gridAdapter.setStyle(this.tableElementRef, 'width', `${this.tableWidth + deltaX}px`);
|
|
753
|
-
column.width = newColWidth;
|
|
754
|
-
}
|
|
755
|
-
this.changeDetector.detectChanges();
|
|
756
|
-
this.columnWidthChange.emit(this.getColumnWidthModelChange());
|
|
757
|
-
}
|
|
758
|
-
initColumnWidths() {
|
|
759
|
-
// Establish table width.
|
|
760
|
-
this.showTopScroll = true;
|
|
761
|
-
// Set column widths based on the width initially given by the browser.
|
|
762
|
-
// computedWidth prevents accidental overflow for browsers with sub-pixel widths.
|
|
763
|
-
this.columnElementRefs.forEach((col, index) => {
|
|
764
|
-
const computedWidth = parseFloat(window.getComputedStyle(col.nativeElement).width);
|
|
765
|
-
const offsetWidth = col.nativeElement.offsetWidth;
|
|
766
|
-
/* istanbul ignore next */
|
|
767
|
-
this.getColumnModelByIndex(index).width = Math.max(computedWidth || offsetWidth, this.minColWidth);
|
|
768
|
-
});
|
|
769
|
-
// 'scroll' tables should be allowed to expand outside of their constraints.
|
|
770
|
-
if (this.fit === 'scroll') {
|
|
771
|
-
this.gridAdapter.setStyle(this.tableElementRef, 'min-width', 'auto');
|
|
772
|
-
}
|
|
773
|
-
// Update max limits for input ranges.
|
|
774
|
-
if (this.fit === 'width') {
|
|
775
|
-
this.updateMaxRange();
|
|
776
|
-
}
|
|
777
|
-
this.changeDetector.detectChanges();
|
|
778
|
-
}
|
|
779
|
-
transferColumnWidths(oldColumns, newColumns) {
|
|
780
|
-
/* sanity check */
|
|
781
|
-
/* istanbul ignore else */
|
|
782
|
-
if (oldColumns && newColumns) {
|
|
783
|
-
for (const oldColumn of oldColumns) {
|
|
784
|
-
if (oldColumn.width) {
|
|
785
|
-
const matchingColumn = newColumns.find((newColumn) => oldColumn.id === newColumn.id);
|
|
786
|
-
if (matchingColumn && !matchingColumn.width) {
|
|
787
|
-
matchingColumn.width = oldColumn.width;
|
|
788
|
-
}
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
this.changeDetector.markForCheck();
|
|
793
|
-
}
|
|
794
|
-
getColumnWidthModelChange() {
|
|
795
|
-
const columnWidthModelChange = new Array();
|
|
796
|
-
this.columns.forEach((column) => {
|
|
797
|
-
columnWidthModelChange.push({
|
|
798
|
-
id: column.id,
|
|
799
|
-
field: column.field,
|
|
800
|
-
width: column.width,
|
|
801
|
-
});
|
|
802
|
-
});
|
|
803
|
-
return columnWidthModelChange;
|
|
804
|
-
}
|
|
805
|
-
updateMaxRange() {
|
|
806
|
-
const leftoverWidth = this.getLastDisplayedColumn().width - this.minColWidth;
|
|
807
|
-
this.displayedColumns.forEach((column, index) => {
|
|
808
|
-
const newMaxRange = column.width + leftoverWidth;
|
|
809
|
-
const rangeInput = this.getRangeInputByIndex(index);
|
|
810
|
-
rangeInput.nativeElement.max = newMaxRange;
|
|
811
|
-
rangeInput.nativeElement.setAttribute('aria-valuemax', newMaxRange);
|
|
812
|
-
});
|
|
813
|
-
}
|
|
814
|
-
initializeResizeColumn(event) {
|
|
815
|
-
const clickTarget = event.target;
|
|
816
|
-
this.activeResizeColumnIndex = clickTarget.getAttribute('sky-cmp-index');
|
|
817
|
-
const column = this.getColumnModelByIndex(this.activeResizeColumnIndex);
|
|
818
|
-
this.startColumnWidth = column.width;
|
|
819
|
-
}
|
|
820
|
-
resetTableWidth() {
|
|
821
|
-
this.skyWindow.nativeWindow.setTimeout(() => {
|
|
822
|
-
this.gridAdapter.setStyle(this.tableElementRef, 'width', `auto`);
|
|
823
|
-
this.changeDetector.detectChanges();
|
|
824
|
-
this.gridAdapter.setStyle(this.tableElementRef, 'width', `${this.tableWidth}px`);
|
|
825
|
-
this.changeDetector.detectChanges();
|
|
826
|
-
});
|
|
827
|
-
}
|
|
828
|
-
getRangeInputByIndex(index) {
|
|
829
|
-
return this.columnRangeInputElementRefs.find((input) => input.nativeElement.getAttribute('sky-cmp-index') === index.toString());
|
|
830
|
-
}
|
|
831
|
-
getColumnModelByIndex(index) {
|
|
832
|
-
return this.displayedColumns[Number(index)];
|
|
833
|
-
}
|
|
834
|
-
getMaxRangeByIndex(index) {
|
|
835
|
-
const columnElementRef = this.columnElementRefs.find((th) => th.nativeElement.getAttribute('sky-cmp-index') === index);
|
|
836
|
-
const rangeInput = columnElementRef.nativeElement.querySelector('.sky-grid-column-input-aria-only');
|
|
837
|
-
return Number(rangeInput.max);
|
|
838
|
-
}
|
|
839
|
-
getLastDisplayedColumn() {
|
|
840
|
-
return this.getColumnModelByIndex(this.displayedColumns.length - 1);
|
|
841
|
-
}
|
|
842
|
-
addDelimiter(text, delimiter) {
|
|
843
|
-
return text.filter((val) => val).join(delimiter);
|
|
844
|
-
}
|
|
845
|
-
destroyRowDelete(id) {
|
|
846
|
-
const rowDeleteContents = this.rowDeleteContents[id];
|
|
847
|
-
/* istanbul ignore else */
|
|
848
|
-
if (rowDeleteContents) {
|
|
849
|
-
rowDeleteContents.affixer.destroy();
|
|
850
|
-
this.overlayService.close(rowDeleteContents.overlay);
|
|
851
|
-
delete this.rowDeleteContents[id];
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
emitSelectedRows(source) {
|
|
855
|
-
const selectedRows = {
|
|
856
|
-
selectedRowIds: this.getSelectedRows(),
|
|
857
|
-
source: source,
|
|
858
|
-
};
|
|
859
|
-
this.multiselectSelectionChange.emit(selectedRows);
|
|
860
|
-
}
|
|
861
|
-
getSelectedRows() {
|
|
862
|
-
return this.items
|
|
863
|
-
.filter((item) => {
|
|
864
|
-
return item.isSelected;
|
|
865
|
-
})
|
|
866
|
-
.map((item) => {
|
|
867
|
-
if (Object.prototype.hasOwnProperty.call(item.data, this.multiselectRowId)) {
|
|
868
|
-
return item.data[this.multiselectRowId];
|
|
869
|
-
}
|
|
870
|
-
return item.id;
|
|
871
|
-
});
|
|
872
|
-
}
|
|
873
|
-
isInteractiveElement(event) {
|
|
874
|
-
const interactiveElSelectors = `
|
|
875
|
-
a,
|
|
876
|
-
button,
|
|
877
|
-
input,
|
|
878
|
-
label,
|
|
879
|
-
option,
|
|
880
|
-
select,
|
|
881
|
-
textarea,
|
|
882
|
-
details,
|
|
883
|
-
dialog,
|
|
884
|
-
menu,
|
|
885
|
-
menuitem,
|
|
886
|
-
summary`;
|
|
887
|
-
return event.target.closest(interactiveElSelectors);
|
|
888
|
-
}
|
|
889
|
-
setResizeBarPosition(xPosition) {
|
|
890
|
-
const parentScroll = this.tableContainerElementRef.nativeElement.scrollLeft;
|
|
891
|
-
const resizeBarX = xPosition -
|
|
892
|
-
this.tableElementRef.nativeElement.getBoundingClientRect().left -
|
|
893
|
-
parentScroll;
|
|
894
|
-
this.gridAdapter.setStyle(this.resizeBar, 'left', resizeBarX + 'px');
|
|
895
|
-
}
|
|
896
|
-
applyUserConfig() {
|
|
897
|
-
return new Promise((resolve) => {
|
|
898
|
-
this.uiConfigService
|
|
899
|
-
.getConfig(this.settingsKey)
|
|
900
|
-
.pipe(take(1))
|
|
901
|
-
.subscribe((config) => {
|
|
902
|
-
/* istanbul ignore else */
|
|
903
|
-
if (config && config.selectedColumnIds) {
|
|
904
|
-
// Remove any columnIds that don't exist in the current data set.
|
|
905
|
-
this.selectedColumnIds = config.selectedColumnIds.filter((id) => this.columns.find((column) => column.id === id));
|
|
906
|
-
this.changeDetector.markForCheck();
|
|
907
|
-
}
|
|
908
|
-
resolve();
|
|
909
|
-
}, () => {
|
|
910
|
-
resolve();
|
|
911
|
-
});
|
|
912
|
-
});
|
|
913
|
-
}
|
|
914
|
-
setUserConfig(config) {
|
|
915
|
-
if (!this.settingsKey) {
|
|
916
|
-
return;
|
|
917
|
-
}
|
|
918
|
-
this.uiConfigService
|
|
919
|
-
.setConfig(this.settingsKey, config)
|
|
920
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
921
|
-
.subscribe(
|
|
922
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
923
|
-
() => { }, (err) => {
|
|
924
|
-
console.warn('Could not save grid settings.');
|
|
925
|
-
console.warn(err);
|
|
926
|
-
});
|
|
927
|
-
}
|
|
928
|
-
initColumns() {
|
|
929
|
-
/* istanbul ignore else */
|
|
930
|
-
if (this.columnComponents.length !== 0 || this.columns !== undefined) {
|
|
931
|
-
/* istanbul ignore else */
|
|
932
|
-
/* sanity check */
|
|
933
|
-
if (this.columnComponents.length > 0) {
|
|
934
|
-
this.getColumnsFromComponent();
|
|
935
|
-
}
|
|
936
|
-
this.transformData();
|
|
937
|
-
this.setDisplayedColumns(true);
|
|
938
|
-
this.changeDetector.markForCheck();
|
|
939
|
-
}
|
|
940
|
-
// Watch for added/removed columns:
|
|
941
|
-
this.subscriptions.push(this.columnComponents.changes.subscribe(() => this.updateColumns()));
|
|
942
|
-
// Watch for column heading changes:
|
|
943
|
-
this.columnComponents.forEach((comp) => {
|
|
944
|
-
this.subscriptions.push(comp.headingModelChanges.subscribe((change) => {
|
|
945
|
-
this.updateColumnHeading(change);
|
|
946
|
-
}));
|
|
947
|
-
this.subscriptions.push(comp.descriptionModelChanges.subscribe((change) => {
|
|
948
|
-
this.updateColumnDescription(change);
|
|
949
|
-
}));
|
|
950
|
-
this.subscriptions.push(comp.inlineHelpPopoverModelChanges.subscribe((change) => {
|
|
951
|
-
this.updateInlineHelpPopover(change);
|
|
952
|
-
}));
|
|
953
|
-
});
|
|
954
|
-
}
|
|
955
|
-
arraysEqual(arrayA, arrayB) {
|
|
956
|
-
return (arrayA.length === arrayB.length &&
|
|
957
|
-
arrayA.every((value, index) => value === arrayB[index]));
|
|
958
|
-
}
|
|
959
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyGridComponent, deps: [{ token: i1.SkyAffixService }, { token: i0.ChangeDetectorRef }, { token: i2.DragulaService }, { token: i3.SkyGridAdapterService }, { token: i1.SkyOverlayService }, { token: i1.SkyAppWindowRef }, { token: i1.SkyUIConfigService }, { token: i1.SkyLogService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
960
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SkyGridComponent, selector: "sky-grid", inputs: { columns: "columns", data: "data", enableMultiselect: "enableMultiselect", fit: "fit", hasToolbar: "hasToolbar", height: "height", highlightText: "highlightText", messageStream: "messageStream", multiselectRowId: "multiselectRowId", rowHighlightedId: "rowHighlightedId", selectedColumnIds: "selectedColumnIds", selectedRowIds: "selectedRowIds", settingsKey: "settingsKey", sortField: "sortField", width: "width" }, outputs: { columnWidthChange: "columnWidthChange", multiselectSelectionChange: "multiselectSelectionChange", rowDeleteCancel: "rowDeleteCancel", rowDeleteConfirm: "rowDeleteConfirm", selectedColumnIdsChange: "selectedColumnIdsChange", sortFieldChange: "sortFieldChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, providers: [SkyGridAdapterService], queries: [{ propertyName: "columnComponents", predicate: SkyGridColumnComponent }], viewQueries: [{ propertyName: "inlineDeleteTemplateRef", first: true, predicate: ["inlineDeleteTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "tableContainerElementRef", first: true, predicate: ["gridContainer"], descendants: true }, { propertyName: "tableElementRef", first: true, predicate: ["gridTable"], descendants: true }, { propertyName: "topScrollContainerElementRef", first: true, predicate: ["topScrollContainer"], descendants: true }, { propertyName: "resizeBar", first: true, predicate: ["resizeBar"], descendants: true }, { propertyName: "columnElementRefs", predicate: ["gridCol"], descendants: true }, { propertyName: "columnRangeInputElementRefs", predicate: ["colSizeRange"], descendants: true }, { propertyName: "inlineDeleteRefs", predicate: ["inlineDeleteRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sky-grid\">\n <div\n *ngIf=\"showTopScroll\"\n #topScrollContainer\n class=\"sky-grid-top-scroll-container\"\n (scroll)=\"onTopScroll($event)\"\n >\n <div\n class=\"sky-grid-top-scroll\"\n [style.width.px]=\"getTopScrollWidth()\"\n ></div>\n </div>\n <div\n #gridContainer\n class=\"sky-grid-table-container\"\n [style.height.px]=\"height\"\n [style.width.px]=\"width\"\n (scroll)=\"onGridScroll($event)\"\n >\n <table #gridTable class=\"sky-grid-table\" [ngClass]=\"getTableClassNames()\">\n <thead>\n <tr [dragula]=\"dragulaGroupName\">\n <th\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-heading sky-grid-multiselect-cell sky-grid-header-locked\"\n scope=\"col\"\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <span class=\"screen-reader-only\">\n {{ 'skyux_grid_multiselect_select_row' | skyLibResources }}\n </span>\n </th>\n <th\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n #gridCol\n class=\"sky-grid-heading sky-field-label\"\n scope=\"col\"\n [attr.sky-cmp-index]=\"i\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n [attr.aria-sort]=\"getAriaSortDirection(column) | async\"\n [id]=\"'sky-grid-' + gridId + '-column-' + i\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n [tabIndex]=\"column.isSortable ? 0 : -1\"\n (mouseup)=\"sortByColumn(column)\"\n (keydown)=\"onKeydown($event, column)\"\n (touchmove)=\"onTouchMove($event)\"\n >\n <div\n class=\"overflow\"\n [ngClass]=\"getTableHeaderClassNames(column)\"\n [style.max-width.px]=\"column.width - 1\"\n [style.width.px]=\"column.width - 1\"\n >\n <span\n *ngIf=\"(getCaretVisibility(column.field) | async) === 'hidden'\"\n class=\"sky-grid-header-caret-hidden-spacing\"\n ></span>\n <!-- The no spacing here is intentional to avoid extra spaces due to these being inline elements -->\n <span class=\"sky-grid-header-text\">{{\n column.heading?.trim()\n }}</span>\n <sky-icon\n class=\"sky-grid-heading-sort\"\n [ngClass]=\"\n 'sky-grid-heading-sort-' +\n (getCaretVisibility(column.field) | async)\n \"\n [icon]=\"getCaretIconNames(column)\"\n />\n <sky-help-inline\n *ngIf=\"column.inlineHelpPopover\"\n [ngClass]=\"{\n 'sky-grid-help-inline-sort-hidden':\n getHelpInlineClass(column.field) | async\n }\"\n [skyPopover]=\"column.inlineHelpPopover\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (mouseup)=\"$event.stopPropagation()\"\n />\n </div>\n <span\n *ngIf=\"(fit === 'width' && !last) || fit === 'scroll'\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-handle\"\n tabindex=\"-1\"\n [attr.sky-cmp-index]=\"i\"\n (mousedown)=\"onResizeColumnStart($event)\"\n (touchstart)=\"onResizeColumnStart($event)\"\n >\n </span>\n <input\n #colSizeRange\n aria-label=\"Width of column\"\n class=\"sky-grid-column-input-aria-only\"\n role=\"slider\"\n type=\"range\"\n [attr.aria-controls]=\"'sky-grid-' + gridId + '-column-' + i\"\n [attr.aria-valuemin]=\"minColWidth\"\n [attr.aria-valuemax]=\"maxColWidth\"\n [attr.aria-valuenow]=\"column.width\"\n [attr.sky-cmp-index]=\"i\"\n [min]=\"minColWidth\"\n [max]=\"maxColWidth\"\n [step]=\"columnResizeStep\"\n [(ngModel)]=\"column.width\"\n (blur)=\"onResizeHandleBlur()\"\n (focus)=\"onResizeHandleFocus($event)\"\n (keydown)=\"onKeydownResizeCol($event)\"\n (change)=\"onInputChangeResizeCol($event)\"\n />\n </th>\n </tr>\n </thead>\n <tbody class=\"sky-grid-tbody\">\n <tr\n *ngFor=\"let item of items; let i = index\"\n class=\"sky-grid-row\"\n [attr.aria-current]=\"isRowHighlighted(item.id) ? true : null\"\n [attr.sky-cmp-id]=\"item.id\"\n [ngClass]=\"{\n 'sky-grid-multiselect-selected-row': item.isSelected,\n 'sky-grid-multiselect-row': enableMultiselect,\n 'sky-grid-row-highlight': isRowHighlighted(item.id)\n }\"\n (click)=\"onRowClick($event, item)\"\n >\n <td\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-multiselect-cell sky-grid-header-locked\"\n >\n <div\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <sky-checkbox\n [label]=\"'skyux_grid_multiselect_select_row' | skyLibResources\"\n [(ngModel)]=\"item.isSelected\"\n (change)=\"onMultiselectCheckboxChange()\"\n />\n </div>\n </td>\n <td\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-cell\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n >\n <sky-grid-cell\n [skyHighlight]=\"\n !column.excludeFromHighlighting ? highlightText : undefined\n \"\n [template]=\"column.template || defaultCellTemplate\"\n [fieldSelector]=\"column.field\"\n [item]=\"item\"\n [columnId]=\"column.id\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n />\n </td>\n </tr>\n </tbody>\n </table>\n <div\n *ngIf=\"showResizeBar\"\n #resizeBar\n aria-hidden=\"true\"\n class=\"sky-grid-resize-bar\"\n tabindex=\"-1\"\n ></div>\n </div>\n</div>\n\n<ng-template #defaultCellTemplate let-row=\"row\" let-value=\"value\">{{\n value\n}}</ng-template>\n\n<ng-template #inlineDeleteTemplateRef let-item>\n <div\n #inlineDeleteRef\n [id]=\"'row-delete-ref-' + item.id\"\n [ngStyle]=\"{\n height: getRowHeight(0),\n position: 'fixed',\n width: tableWidth + 'px'\n }\"\n >\n <sky-inline-delete\n [pending]=\"getRowDeleteItem(item.id).pending\"\n (cancelTriggered)=\"cancelRowDelete(item.id)\"\n (deleteTriggered)=\"confirmRowDelete(item.id)\"\n />\n </div>\n</ng-template>\n", styles: [".sky-grid{position:relative;display:block}.sky-grid-table-container{overflow:auto}.sky-grid-table{position:relative;table-layout:fixed;border-collapse:collapse;margin:0;font-size:15px;min-width:100%}.sky-grid-table.sky-grid-fit{max-width:100%;width:100%}.sky-grid-tbody{background-color:#fff}.sky-grid-row{border-bottom:1px dotted #cdcfd2}.sky-grid-row:nth-child(odd){background-color:#fbfbfb}.sky-grid-row.sky-grid-row-highlight{border-top:1px solid #0974a1;box-shadow:0 0 0 3px inset #0974a1}.sky-grid-row .sky-grid-cell{padding:0;min-width:10px}.sky-grid-heading{position:relative;border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;border-right-width:0px;padding:0;cursor:pointer;background-color:#fff;overflow:visible;background-clip:padding-box;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;-moz-user-select:none;-ms-user-select:none;user-select:none}.sky-grid-heading:first-child{border-left:1px solid transparent}.sky-grid-heading.sky-grid-header-dragging{background-color:#eeeeef}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-heading-sort,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-heading-sort{width:14px}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-help-inline-sort-hidden,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-help-inline-sort-hidden{margin-left:-14px;margin-right:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-header-caret-hidden-spacing{padding-left:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-heading-sort-visible{width:14px}.sky-grid-heading div{padding:8px}.sky-grid-heading .overflow{text-overflow:ellipsis;white-space:nowrap;position:relative;z-index:1;overflow:hidden;min-width:100%}.sky-grid-heading .sky-grid-column-input-aria-only{-webkit-appearance:none;-moz-appearance:none;height:100%;width:5px;position:absolute;display:block;top:0;bottom:0;right:0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-track{background:transparent}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-ms-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only:focus{background-color:#00b4f1}.sky-grid-column-alignment-left{text-align:left}.sky-grid-column-alignment-center{text-align:center}.sky-grid-column-alignment-right{text-align:right}.sky-grid-multiselect-cell{padding:0;text-align:center}.sky-grid-multiselect-cell ::ng-deep .sky-switch-control{margin:0 auto}th.sky-grid-multiselect-cell{cursor:default}th.sky-grid-multiselect-cell .screen-reader-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);outline:none;white-space:nowrap}@-moz-document url-prefix(){.sky-grid-multiselect-row td{border-left:0px solid transparent;border-right:0px solid transparent}}.sky-grid-multiselect-row:hover{background-color:#e9e4f1}.sky-grid-multiselect-row:hover:nth-child(odd){background:#e9e4f1}.sky-grid-multiselect-selected-row{background:#f1eef6;border-top:1px solid #dadbf6;border-bottom:1px solid #dadbf6}.sky-grid-multiselect-selected-row:nth-child(odd){background:#f1eef6}.sky-grid-has-toolbar .sky-grid-heading{border-top-width:0px}.sky-grid-heading-sort.sky-grid-heading-sort-hidden{visibility:hidden}.sky-grid-heading-sort.sky-grid-heading-sort-visible{visibility:visible;padding-left:5px}.sky-grid-resize-handle{position:absolute;right:0;top:0;bottom:0;width:30px;z-index:2;min-height:20px;height:100%!important;vertical-align:middle;cursor:col-resize}.sky-grid-resize-handle:hover:after{background-color:#00b4f1}.sky-grid-resize-handle:after{position:absolute;right:0;top:0;bottom:0;width:5px;height:100%;content:\"\"}.sky-grid-resize-bar{position:absolute;top:0;left:0;z-index:99;height:100%;width:5px;background:#00b4f1;opacity:.6}tr{position:relative}.sky-grid-top-scroll-container{overflow:auto}.sky-grid-top-scroll{height:1px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "helpPopoverContent", "helpPopoverTitle", "icon", "checkboxType", "checked", "indeterminate", "required", "labelText", "labelHidden", "hintText", "stacked", "helpKey"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i7.λ1, selector: "sky-help-inline", inputs: ["ariaControls", "ariaExpanded", "ariaLabel", "helpKey", "labelledBy", "labelText", "popoverContent", "popoverTitle"], outputs: ["actionClick"] }, { kind: "component", type: i8.λ1, selector: "sky-icon", inputs: ["icon", "iconName", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i9.λ8, selector: "sky-inline-delete", inputs: ["pending"], outputs: ["cancelTriggered", "deleteTriggered"] }, { kind: "directive", type: i10.λ7, selector: "[skyPopover]", inputs: ["skyPopover", "skyPopoverAlignment", "skyPopoverMessageStream", "skyPopoverPlacement", "skyPopoverTrigger"] }, { kind: "directive", type: i11.SkyTextHighlightDirective, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { kind: "component", type: i12.SkyGridCellComponent, selector: "sky-grid-cell", inputs: ["item", "columnId", "template", "fieldSelector"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i13.SkyLibResourcesPipe, name: "skyLibResources" }], viewProviders: [DragulaService], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
961
|
-
}
|
|
962
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyGridComponent, decorators: [{
|
|
963
|
-
type: Component,
|
|
964
|
-
args: [{ selector: 'sky-grid', viewProviders: [DragulaService], providers: [SkyGridAdapterService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-grid\">\n <div\n *ngIf=\"showTopScroll\"\n #topScrollContainer\n class=\"sky-grid-top-scroll-container\"\n (scroll)=\"onTopScroll($event)\"\n >\n <div\n class=\"sky-grid-top-scroll\"\n [style.width.px]=\"getTopScrollWidth()\"\n ></div>\n </div>\n <div\n #gridContainer\n class=\"sky-grid-table-container\"\n [style.height.px]=\"height\"\n [style.width.px]=\"width\"\n (scroll)=\"onGridScroll($event)\"\n >\n <table #gridTable class=\"sky-grid-table\" [ngClass]=\"getTableClassNames()\">\n <thead>\n <tr [dragula]=\"dragulaGroupName\">\n <th\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-heading sky-grid-multiselect-cell sky-grid-header-locked\"\n scope=\"col\"\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <span class=\"screen-reader-only\">\n {{ 'skyux_grid_multiselect_select_row' | skyLibResources }}\n </span>\n </th>\n <th\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n #gridCol\n class=\"sky-grid-heading sky-field-label\"\n scope=\"col\"\n [attr.sky-cmp-index]=\"i\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n [attr.aria-sort]=\"getAriaSortDirection(column) | async\"\n [id]=\"'sky-grid-' + gridId + '-column-' + i\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n [tabIndex]=\"column.isSortable ? 0 : -1\"\n (mouseup)=\"sortByColumn(column)\"\n (keydown)=\"onKeydown($event, column)\"\n (touchmove)=\"onTouchMove($event)\"\n >\n <div\n class=\"overflow\"\n [ngClass]=\"getTableHeaderClassNames(column)\"\n [style.max-width.px]=\"column.width - 1\"\n [style.width.px]=\"column.width - 1\"\n >\n <span\n *ngIf=\"(getCaretVisibility(column.field) | async) === 'hidden'\"\n class=\"sky-grid-header-caret-hidden-spacing\"\n ></span>\n <!-- The no spacing here is intentional to avoid extra spaces due to these being inline elements -->\n <span class=\"sky-grid-header-text\">{{\n column.heading?.trim()\n }}</span>\n <sky-icon\n class=\"sky-grid-heading-sort\"\n [ngClass]=\"\n 'sky-grid-heading-sort-' +\n (getCaretVisibility(column.field) | async)\n \"\n [icon]=\"getCaretIconNames(column)\"\n />\n <sky-help-inline\n *ngIf=\"column.inlineHelpPopover\"\n [ngClass]=\"{\n 'sky-grid-help-inline-sort-hidden':\n getHelpInlineClass(column.field) | async\n }\"\n [skyPopover]=\"column.inlineHelpPopover\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (mouseup)=\"$event.stopPropagation()\"\n />\n </div>\n <span\n *ngIf=\"(fit === 'width' && !last) || fit === 'scroll'\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-handle\"\n tabindex=\"-1\"\n [attr.sky-cmp-index]=\"i\"\n (mousedown)=\"onResizeColumnStart($event)\"\n (touchstart)=\"onResizeColumnStart($event)\"\n >\n </span>\n <input\n #colSizeRange\n aria-label=\"Width of column\"\n class=\"sky-grid-column-input-aria-only\"\n role=\"slider\"\n type=\"range\"\n [attr.aria-controls]=\"'sky-grid-' + gridId + '-column-' + i\"\n [attr.aria-valuemin]=\"minColWidth\"\n [attr.aria-valuemax]=\"maxColWidth\"\n [attr.aria-valuenow]=\"column.width\"\n [attr.sky-cmp-index]=\"i\"\n [min]=\"minColWidth\"\n [max]=\"maxColWidth\"\n [step]=\"columnResizeStep\"\n [(ngModel)]=\"column.width\"\n (blur)=\"onResizeHandleBlur()\"\n (focus)=\"onResizeHandleFocus($event)\"\n (keydown)=\"onKeydownResizeCol($event)\"\n (change)=\"onInputChangeResizeCol($event)\"\n />\n </th>\n </tr>\n </thead>\n <tbody class=\"sky-grid-tbody\">\n <tr\n *ngFor=\"let item of items; let i = index\"\n class=\"sky-grid-row\"\n [attr.aria-current]=\"isRowHighlighted(item.id) ? true : null\"\n [attr.sky-cmp-id]=\"item.id\"\n [ngClass]=\"{\n 'sky-grid-multiselect-selected-row': item.isSelected,\n 'sky-grid-multiselect-row': enableMultiselect,\n 'sky-grid-row-highlight': isRowHighlighted(item.id)\n }\"\n (click)=\"onRowClick($event, item)\"\n >\n <td\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-multiselect-cell sky-grid-header-locked\"\n >\n <div\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <sky-checkbox\n [label]=\"'skyux_grid_multiselect_select_row' | skyLibResources\"\n [(ngModel)]=\"item.isSelected\"\n (change)=\"onMultiselectCheckboxChange()\"\n />\n </div>\n </td>\n <td\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-cell\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n >\n <sky-grid-cell\n [skyHighlight]=\"\n !column.excludeFromHighlighting ? highlightText : undefined\n \"\n [template]=\"column.template || defaultCellTemplate\"\n [fieldSelector]=\"column.field\"\n [item]=\"item\"\n [columnId]=\"column.id\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n />\n </td>\n </tr>\n </tbody>\n </table>\n <div\n *ngIf=\"showResizeBar\"\n #resizeBar\n aria-hidden=\"true\"\n class=\"sky-grid-resize-bar\"\n tabindex=\"-1\"\n ></div>\n </div>\n</div>\n\n<ng-template #defaultCellTemplate let-row=\"row\" let-value=\"value\">{{\n value\n}}</ng-template>\n\n<ng-template #inlineDeleteTemplateRef let-item>\n <div\n #inlineDeleteRef\n [id]=\"'row-delete-ref-' + item.id\"\n [ngStyle]=\"{\n height: getRowHeight(0),\n position: 'fixed',\n width: tableWidth + 'px'\n }\"\n >\n <sky-inline-delete\n [pending]=\"getRowDeleteItem(item.id).pending\"\n (cancelTriggered)=\"cancelRowDelete(item.id)\"\n (deleteTriggered)=\"confirmRowDelete(item.id)\"\n />\n </div>\n</ng-template>\n", styles: [".sky-grid{position:relative;display:block}.sky-grid-table-container{overflow:auto}.sky-grid-table{position:relative;table-layout:fixed;border-collapse:collapse;margin:0;font-size:15px;min-width:100%}.sky-grid-table.sky-grid-fit{max-width:100%;width:100%}.sky-grid-tbody{background-color:#fff}.sky-grid-row{border-bottom:1px dotted #cdcfd2}.sky-grid-row:nth-child(odd){background-color:#fbfbfb}.sky-grid-row.sky-grid-row-highlight{border-top:1px solid #0974a1;box-shadow:0 0 0 3px inset #0974a1}.sky-grid-row .sky-grid-cell{padding:0;min-width:10px}.sky-grid-heading{position:relative;border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;border-right-width:0px;padding:0;cursor:pointer;background-color:#fff;overflow:visible;background-clip:padding-box;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;-moz-user-select:none;-ms-user-select:none;user-select:none}.sky-grid-heading:first-child{border-left:1px solid transparent}.sky-grid-heading.sky-grid-header-dragging{background-color:#eeeeef}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-heading-sort,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-heading-sort{width:14px}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-help-inline-sort-hidden,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-help-inline-sort-hidden{margin-left:-14px;margin-right:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-header-caret-hidden-spacing{padding-left:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-heading-sort-visible{width:14px}.sky-grid-heading div{padding:8px}.sky-grid-heading .overflow{text-overflow:ellipsis;white-space:nowrap;position:relative;z-index:1;overflow:hidden;min-width:100%}.sky-grid-heading .sky-grid-column-input-aria-only{-webkit-appearance:none;-moz-appearance:none;height:100%;width:5px;position:absolute;display:block;top:0;bottom:0;right:0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-track{background:transparent}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-ms-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only:focus{background-color:#00b4f1}.sky-grid-column-alignment-left{text-align:left}.sky-grid-column-alignment-center{text-align:center}.sky-grid-column-alignment-right{text-align:right}.sky-grid-multiselect-cell{padding:0;text-align:center}.sky-grid-multiselect-cell ::ng-deep .sky-switch-control{margin:0 auto}th.sky-grid-multiselect-cell{cursor:default}th.sky-grid-multiselect-cell .screen-reader-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);outline:none;white-space:nowrap}@-moz-document url-prefix(){.sky-grid-multiselect-row td{border-left:0px solid transparent;border-right:0px solid transparent}}.sky-grid-multiselect-row:hover{background-color:#e9e4f1}.sky-grid-multiselect-row:hover:nth-child(odd){background:#e9e4f1}.sky-grid-multiselect-selected-row{background:#f1eef6;border-top:1px solid #dadbf6;border-bottom:1px solid #dadbf6}.sky-grid-multiselect-selected-row:nth-child(odd){background:#f1eef6}.sky-grid-has-toolbar .sky-grid-heading{border-top-width:0px}.sky-grid-heading-sort.sky-grid-heading-sort-hidden{visibility:hidden}.sky-grid-heading-sort.sky-grid-heading-sort-visible{visibility:visible;padding-left:5px}.sky-grid-resize-handle{position:absolute;right:0;top:0;bottom:0;width:30px;z-index:2;min-height:20px;height:100%!important;vertical-align:middle;cursor:col-resize}.sky-grid-resize-handle:hover:after{background-color:#00b4f1}.sky-grid-resize-handle:after{position:absolute;right:0;top:0;bottom:0;width:5px;height:100%;content:\"\"}.sky-grid-resize-bar{position:absolute;top:0;left:0;z-index:99;height:100%;width:5px;background:#00b4f1;opacity:.6}tr{position:relative}.sky-grid-top-scroll-container{overflow:auto}.sky-grid-top-scroll{height:1px}\n"] }]
|
|
965
|
-
}], ctorParameters: () => [{ type: i1.SkyAffixService }, { type: i0.ChangeDetectorRef }, { type: i2.DragulaService }, { type: i3.SkyGridAdapterService }, { type: i1.SkyOverlayService }, { type: i1.SkyAppWindowRef }, { type: i1.SkyUIConfigService }, { type: i1.SkyLogService }], propDecorators: { columns: [{
|
|
966
|
-
type: Input
|
|
967
|
-
}], data: [{
|
|
968
|
-
type: Input
|
|
969
|
-
}], enableMultiselect: [{
|
|
970
|
-
type: Input
|
|
971
|
-
}], fit: [{
|
|
972
|
-
type: Input
|
|
973
|
-
}], hasToolbar: [{
|
|
974
|
-
type: Input
|
|
975
|
-
}], height: [{
|
|
976
|
-
type: Input
|
|
977
|
-
}], highlightText: [{
|
|
978
|
-
type: Input
|
|
979
|
-
}], messageStream: [{
|
|
980
|
-
type: Input
|
|
981
|
-
}], multiselectRowId: [{
|
|
982
|
-
type: Input
|
|
983
|
-
}], rowHighlightedId: [{
|
|
984
|
-
type: Input
|
|
985
|
-
}], selectedColumnIds: [{
|
|
986
|
-
type: Input
|
|
987
|
-
}], selectedRowIds: [{
|
|
988
|
-
type: Input
|
|
989
|
-
}], settingsKey: [{
|
|
990
|
-
type: Input
|
|
991
|
-
}], sortField: [{
|
|
992
|
-
type: Input
|
|
993
|
-
}], width: [{
|
|
994
|
-
type: Input
|
|
995
|
-
}], columnWidthChange: [{
|
|
996
|
-
type: Output
|
|
997
|
-
}], multiselectSelectionChange: [{
|
|
998
|
-
type: Output
|
|
999
|
-
}], rowDeleteCancel: [{
|
|
1000
|
-
type: Output
|
|
1001
|
-
}], rowDeleteConfirm: [{
|
|
1002
|
-
type: Output
|
|
1003
|
-
}], selectedColumnIdsChange: [{
|
|
1004
|
-
type: Output
|
|
1005
|
-
}], sortFieldChange: [{
|
|
1006
|
-
type: Output
|
|
1007
|
-
}], columnComponents: [{
|
|
1008
|
-
type: ContentChildren,
|
|
1009
|
-
args: [SkyGridColumnComponent]
|
|
1010
|
-
}], columnElementRefs: [{
|
|
1011
|
-
type: ViewChildren,
|
|
1012
|
-
args: ['gridCol']
|
|
1013
|
-
}], columnRangeInputElementRefs: [{
|
|
1014
|
-
type: ViewChildren,
|
|
1015
|
-
args: ['colSizeRange']
|
|
1016
|
-
}], inlineDeleteRefs: [{
|
|
1017
|
-
type: ViewChildren,
|
|
1018
|
-
args: ['inlineDeleteRef']
|
|
1019
|
-
}], inlineDeleteTemplateRef: [{
|
|
1020
|
-
type: ViewChild,
|
|
1021
|
-
args: ['inlineDeleteTemplateRef', { read: TemplateRef }]
|
|
1022
|
-
}], tableContainerElementRef: [{
|
|
1023
|
-
type: ViewChild,
|
|
1024
|
-
args: ['gridContainer']
|
|
1025
|
-
}], tableElementRef: [{
|
|
1026
|
-
type: ViewChild,
|
|
1027
|
-
args: ['gridTable']
|
|
1028
|
-
}], topScrollContainerElementRef: [{
|
|
1029
|
-
type: ViewChild,
|
|
1030
|
-
args: ['topScrollContainer']
|
|
1031
|
-
}], resizeBar: [{
|
|
1032
|
-
type: ViewChild,
|
|
1033
|
-
args: ['resizeBar']
|
|
1034
|
-
}], onWindowResize: [{
|
|
1035
|
-
type: HostListener,
|
|
1036
|
-
args: ['window:resize']
|
|
1037
|
-
}] } });
|
|
1038
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHNCQUFzQixHQU12QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxHQUVkLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxTQUFTLEVBQ1QsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU16RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU0vRCxPQUFPLEVB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ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QXBwV2luZG93UmVmLFxuICBTa3lMb2dTZXJ2aWNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbiAgU2t5VUlDb25maWdTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQge1xuICBMaXN0SXRlbU1vZGVsLFxuICBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbCxcbn0gZnJvbSAnQHNreXV4L2xpc3QtYnVpbGRlci1jb21tb24nO1xuXG5pbXBvcnQgeyBEcmFndWxhU2VydmljZSB9IGZyb20gJ25nMi1kcmFndWxhJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFrZVdoaWxlLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUdyaWRBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vZ3JpZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5Nb2RlbCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLWRlc2NyaXB0aW9uLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi1oZWFkaW5nLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1jb2x1bW4taW5saW5lLWhlbHAtcG9wb3Zlci1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLXdpZHRoLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlJztcbmltcG9ydCB7IFNreUdyaWRNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlLXR5cGUnO1xuaW1wb3J0IHsgU2t5R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3MgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jYW5jZWwtYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY29uZmlnJztcbmltcG9ydCB7IFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncyB9IGZyb20gJy4vdHlwZXMvZ3JpZC1yb3ctZGVsZXRlLWNvbmZpcm0tYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29udGVudHMgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jb250ZW50cyc7XG5pbXBvcnQgeyBTa3lHcmlkU2VsZWN0ZWRSb3dzTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtc2VsZWN0ZWQtcm93cy1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1zZWxlY3RlZC1yb3dzLXNvdXJjZSc7XG5pbXBvcnQgeyBTa3lHcmlkVUlDb25maWcgfSBmcm9tICcuL3R5cGVzL2dyaWQtdWktY29uZmlnJztcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgYFNreUdyaWRDb21wb25lbnRgIGFuZCBpdHMgZmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgZGF0YSBncmlkIGluc3RlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2RhdGEtZ3JpZFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbRHJhZ3VsYVNlcnZpY2VdLFxuICBwcm92aWRlcnM6IFtTa3lHcmlkQWRhcHRlclNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5R3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIENvbHVtbnMgYW5kIGNvbHVtbiBwcm9wZXJ0aWVzIGZvciB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29sdW1ucyhuZXdDb2x1bW5zOiBTa3lHcmlkQ29sdW1uTW9kZWxbXSkge1xuICAgIGNvbnN0IG9sZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgdGhpcy5fY29sdW1ucyA9IG5ld0NvbHVtbnM7XG4gICAgaWYgKG9sZENvbHVtbnMpIHtcbiAgICAgIHRoaXMudHJhbnNmZXJDb2x1bW5XaWR0aHMob2xkQ29sdW1ucywgdGhpcy5jb2x1bW5zKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnModHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogU2t5R3JpZENvbHVtbk1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZvciB0aGUgZ3JpZC4gRWFjaCBpdGVtIHJlcXVpcmVzIGFuIGBpZGAgYW5kIGEgcHJvcGVydHkgdGhhdCBtYXBzXG4gICAqIHRvIHRoZSBgZmllbGRgIG9yIGBpZGAgcHJvcGVydHkgb2YgZWFjaCBjb2x1bW4gaW4gdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGF0YTogYW55W107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBtdWx0aXNlbGVjdCBmZWF0dXJlIHRvIGRpc3BsYXkgYSBjb2x1bW4gb2ZcbiAgICogY2hlY2tib3hlcyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBncmlkLiBZb3UgY2FuIHNwZWNpZnkgYSB1bmlxdWUgSUQgd2l0aFxuICAgKiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5LCBidXQgbXVsdGlzZWxlY3QgZGVmYXVsdHMgdG8gdGhlIGBpZGAgcHJvcGVydHkgb25cbiAgICogdGhlIGBkYXRhYCBvYmplY3QuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlTXVsdGlzZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogSG93IHRoZSBncmlkIGZpdHMgdG8gaXRzIHBhcmVudC4gVGhlIHZhbGlkIG9wdGlvbnMgYXJlIGB3aWR0aGAsXG4gICAqIHdoaWNoIGZpdHMgdGhlIGdyaWQgdG8gdGhlIHBhcmVudCdzIGZ1bGwgd2lkdGgsIGFuZCBgc2Nyb2xsYCwgd2hpY2ggYWxsb3dzIHRoZSBncmlkXG4gICAqIHRvIGV4Y2VlZCB0aGUgcGFyZW50J3Mgd2lkdGguIElmIHRoZSBncmlkIGRvZXMgbm90IGhhdmUgZW5vdWdoIGNvbHVtbnMgdG8gZmlsbFxuICAgKiB0aGUgcGFyZW50J3Mgd2lkdGgsIGl0IGFsd2F5cyBzdHJldGNoZXMgdG8gdGhlIHBhcmVudCdzIGZ1bGwgd2lkdGguXG4gICAqIEBkZWZhdWx0IFwid2lkdGhcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpdCA9ICd3aWR0aCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSBhIHRvb2xiYXIgd2l0aCB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoYXNUb29sYmFyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRleHQgdG8gaGlnaGxpZ2h0IHdpdGhpbiB0aGUgZ3JpZC5cbiAgICogVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzZWFyY2guXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlnaGxpZ2h0VGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YWJsZSB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lHcmlkTWVzc2FnZT4oKTtcblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IG1hdGNoZXMgYSBwcm9wZXJ0eSBvbiB0aGUgYGRhdGFgIG9iamVjdC5cbiAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSB1c2VzIHRoZSBgaWRgIHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG11bHRpc2VsZWN0Um93SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3cgdG8gaGlnaGxpZ2h0LiBUaGUgSUQgbWF0Y2hlcyB0aGUgYGlkYCBwcm9wZXJ0eVxuICAgKiBvZiB0aGUgYGRhdGFgIG9iamVjdC4gVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiB0aGUgZmx5b3V0IGNvbXBvbmVudCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dIaWdobGlnaHRlZElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQgYmFzZWQgb24gdGhlIGBpZGAgb3IgYGZpZWxkYCBwcm9wZXJ0aWVzXG4gICAqIG9mIHRoZSBjb2x1bW5zLiBJZiBubyBjb2x1bW5zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIGdyaWQgZGlzcGxheXMgYWxsIGNvbHVtbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkQ29sdW1uSWRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSB0aGlzLl9zZWxlY3RlZENvbHVtbklkcztcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbklkcyA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIGlkcyBoYXZlIGNoYW5nZWQuXG4gICAgaWYgKCFjdXJyZW50SWRzIHx8ICF2YWx1ZSB8fCAhdGhpcy5hcnJheXNFcXVhbCh2YWx1ZSwgY3VycmVudElkcykpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgZW5zdXJlcyB0aGF0IHdlIGRvIG5vdCBzZXQgdXNlciBjb25maWcgb3B0aW9ucyBvciBmaXJlIHRoZSBjaGFuZ2UgZXZlbnRcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCB0aW1lIHRoYXQgdGhlIGNvbHVtbnMgYXJlIHNldCB1cFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQpIHtcbiAgICAgICAgdGhpcy5zZXRVc2VyQ29uZmlnKHtcbiAgICAgICAgICBzZWxlY3RlZENvbHVtbklkczogdmFsdWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZENvbHVtbklkcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXNpemVkKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFRhYmxlV2lkdGgoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvbHVtbklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXQgb2YgSURzIGZvciB0aGUgcm93cyB0byBzZWxlY3QgaW4gYSBtdWx0aXNlbGVjdCBncmlkLlxuICAgKiBUaGUgSURzIG1hdGNoIHRoZSBgaWRgIHByb3BlcnRpZXMgb2YgdGhlIGBkYXRhYCBvYmplY3RzLlxuICAgKiBSb3dzIHdpdGggSURzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBhcmUgZGUtc2VsZWN0ZWQgaW4gdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkUm93SWRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB2YWx1ZTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlNlbGVjdGVkUm93SWRzQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSb3dJZHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBrZXkgZm9yIHRoZSBVSSBDb25maWcgU2VydmljZSB0byByZXRyaWV2ZSBzdG9yZWQgc2V0dGluZ3MgZnJvbSBhIGRhdGFiYXNlLlxuICAgKiBUaGUgVUkgQ29uZmlnIFNlcnZpY2Ugc2F2ZXMgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdXNlcnMgYW5kIHJldHVybnNcbiAgICogYHNlbGVjdGVkQ29sdW1uSWRzYCB0byBwcmVzZXJ2ZSB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGFuZCB0aGUgcHJlZmVycmVkIGNvbHVtbiBvcmRlci4gWW91ICBtdXN0IHByb3ZpZGUgYGlkYCB2YWx1ZXMgZm9yIHlvdXIgYHNreS1ncmlkLWNvbHVtbmAgZWxlbWVudHMgYmVjYXVzZSB0aGUgVUkgQ29uZmlnIFNlcnZpY2UgZGVwZW5kcyBvbiB0aG9zZSB2YWx1ZXMgdG8gb3JnYW5pemUgY29sdW1ucyBiYXNlZCBvbiB1c2VyIHNldHRpbmdzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVUkgQ29uZmlnIFNlcnZpY2UsIHNlZSBbdGhlIHN0aWNreSBzZXR0aW5ncyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2RldmVsb3Avc3RpY2t5LXNldHRpbmdzKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXR0aW5nc0tleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhIGNhcmV0IGluIHRoZSBjb2x1bW4gdGhhdCB3YXMgdXNlZCB0byBzb3J0IHRoZSBncmlkLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWxcbiAgICogd2hlbiB5b3UgcHJvZ3JhbW1hdGljYWxseSBzb3J0IGRhdGEgYW5kIHdhbnQgdG8gdmlzdWFsbHkgaW5kaWNhdGUgaG93IHRoZSBncmlkIHdhcyBzb3J0ZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBhIGBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbGAgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqIC0gYGZpZWxkU2VsZWN0b3JgIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc29ydCBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGBzdHJpbmdgIHZhbHVlcy5cbiAgICogLSBgZGVzY2VuZGluZ2AgSW5kaWNhdGVzIHdoZXRoZXIgdG8gc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyLiBUaGUgY2FyZXQgdGhhdCB2aXN1YWxseVxuICAgKiBpbmRpY2F0ZXMgdGhlIHNvcnQgb3JkZXIgcG9pbnRzIGRvd24gZm9yIGRlc2NlbmRpbmcgb3JkZXIgYW5kIHVwIGZvciBhc2NlbmRpbmcgb3JkZXIuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBgYm9vbGVhbmAgdmFsdWVzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkOiBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbDtcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBncmlkIGluIHBpeGVscy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB3aWR0aCBvZiBhIGNvbHVtbiBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjb2x1bW5XaWR0aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2VbXVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHNlbGVjdGlvbiBvZiBtdWx0aXNlbGVjdCBjaGVja2JveGVzIGNoYW5nZXMuXG4gICAqIEVtaXRzIGFuIGFycmF5IG9mIElEcyBmb3IgdGhlIHNlbGVjdGVkIHJvd3MgYmFzZWQgb24gdGhlIGBtdWx0aXNlbGVjdFJvd0lkYCBwcm9wZXJ0eVxuICAgKiB0aGF0IHRoZSBjb25zdW1lciBwcm92aWRlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgbXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UgPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8U2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcm93RGVsZXRlQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lHcmlkUm93RGVsZXRlQ2FuY2VsQXJncz4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkIGNoYW5nZSBvciB3aGVuIHRoZSBvcmRlciBvZiB0aGUgY29sdW1ucyBjaGFuZ2VzLlxuICAgKiBUaGUgZXZlbnQgZW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgZGlzcGxheWVkIGNvbHVtbnMgdGhhdCByZWZsZWN0cyB0aGUgY29sdW1uIG9yZGVyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZENvbHVtbklkc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGFjdGl2ZSBzb3J0IGZpZWxkIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNvcnRGaWVsZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdFNvcnRGaWVsZFNlbGVjdG9yTW9kZWw+KCk7XG5cbiAgcHVibGljIGNvbHVtblJlc2l6ZVN0ZXAgPSAxMDtcbiAgcHVibGljIGN1cnJlbnRTb3J0RmllbGQ6IEJlaGF2aW9yU3ViamVjdDxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD47XG4gIHB1YmxpYyBkaXNwbGF5ZWRDb2x1bW5zOiBTa3lHcmlkQ29sdW1uTW9kZWxbXTtcbiAgcHVibGljIGRyYWd1bGFHcm91cE5hbWU6IHN0cmluZztcbiAgcHVibGljIGdyaWRJZDogbnVtYmVyID0gKytuZXh0SWQ7XG4gIHB1YmxpYyByb3dEZWxldGVDb25maWdzOiBTa3lHcmlkUm93RGVsZXRlQ29uZmlnW10gPSBbXTtcbiAgcHVibGljIGl0ZW1zOiBhbnlbXTtcbiAgcHVibGljIG1heENvbFdpZHRoID0gOTk5OTsgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyLCBhcyB0aGUgaW5wdXQgcmFuZ2UgcGlja2VyIHdvbid0IHdvcmsgd2l0aG91dCBhIHZhbHVlLlxuICBwdWJsaWMgbWluQ29sV2lkdGggPSA1MDtcbiAgcHVibGljIHNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgcHVibGljIHNob3dUb3BTY3JvbGwgPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IHRhYmxlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKFNreUdyaWRDb2x1bW5Db21wb25lbnQpXG4gIHByaXZhdGUgY29sdW1uQ29tcG9uZW50czogUXVlcnlMaXN0PFNreUdyaWRDb2x1bW5Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ2dyaWRDb2wnKVxuICBwcml2YXRlIGNvbHVtbkVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2NvbFNpemVSYW5nZScpXG4gIHByaXZhdGUgY29sdW1uUmFuZ2VJbnB1dEVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2lubGluZURlbGV0ZVJlZicpXG4gIHByaXZhdGUgaW5saW5lRGVsZXRlUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZicsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHJpdmF0ZSBpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInKVxuICBwcml2YXRlIHRhYmxlQ29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZ3JpZFRhYmxlJylcbiAgcHJpdmF0ZSB0YWJsZUVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RvcFNjcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgdG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncmVzaXplQmFyJylcbiAgcHJpdmF0ZSByZXNpemVCYXI6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBhY3RpdmVSZXNpemVDb2x1bW5JbmRleDogc3RyaW5nO1xuICBwcml2YXRlIGlzRHJhZ2dpbmdSZXNpemVIYW5kbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1Jlc2l6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByb3dEZWxldGVDb250ZW50czogUmVjb3JkPHN0cmluZywgU2t5R3JpZFJvd0RlbGV0ZUNvbnRlbnRzPiA9IHt9O1xuICBwcml2YXRlIHN0YXJ0Q29sdW1uV2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIHNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICBwcml2YXRlIHNlbGVjdGVkQ29sdW1uSWRzU2V0ID0gZmFsc2U7XG4gIHByaXZhdGUgeFBvc1N0YXJ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfY29sdW1uczogU2t5R3JpZENvbHVtbk1vZGVsW107XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uSWRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IHN0cmluZ1tdO1xuXG4gIHJlYWRvbmx5ICNlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWZmaXhTZXJ2aWNlOiBTa3lBZmZpeFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBkcmFndWxhU2VydmljZTogRHJhZ3VsYVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBncmlkQWRhcHRlcjogU2t5R3JpZEFkYXB0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3ZlcmxheVNlcnZpY2U6IFNreU92ZXJsYXlTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2t5V2luZG93OiBTa3lBcHBXaW5kb3dSZWYsXG4gICAgcHJpdmF0ZSB1aUNvbmZpZ1NlcnZpY2U6IFNreVVJQ29uZmlnU2VydmljZSxcbiAgICBsb2dnZXI6IFNreUxvZ1NlcnZpY2UsXG4gICkge1xuICAgIGxvZ2dlci5kZXByZWNhdGVkKCdTa3lHcmlkQ29tcG9uZW50Jywge1xuICAgICAgZGVwcmVjYXRpb25NYWpvclZlcnNpb246IDYsXG4gICAgICBtb3JlSW5mb1VybDogJ2h0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9kYXRhLWdyaWQnLFxuICAgICAgcmVwbGFjZW1lbnRSZWNvbW1lbmRhdGlvbjogJ1VzZSBkYXRhIGdyaWQgaW5zdGVhZC4nLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gbmV3IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD4oKTtcbiAgICB0aGlzLml0ZW1zID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPih7XG4gICAgICBmaWVsZFNlbGVjdG9yOiAnJyxcbiAgICAgIGRlc2NlbmRpbmc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuZHJhZ3VsYUdyb3VwTmFtZSA9IGBza3ktZ3JpZHMtZ3JvdXAtJHt0aGlzLmdyaWRJZH1gO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMubWVzc2FnZVN0cmVhbVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBTa3lHcmlkTWVzc2FnZSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3NLZXkpIHtcbiAgICAgIHRoaXMuYXBwbHlVc2VyQ29uZmlnKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgY29sdW1uIGRyYWctYW5kLWRyb3AuXG4gICAgdGhpcy5ncmlkQWRhcHRlci5pbml0aWFsaXplRHJhZ0FuZERyb3AoXG4gICAgICB0aGlzLmRyYWd1bGFHcm91cE5hbWUsXG4gICAgICB0aGlzLmRyYWd1bGFTZXJ2aWNlLFxuICAgICAgKHNlbGVjdGVkQ29sdW1uSWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLm9uSGVhZGVyRHJvcChzZWxlY3RlZENvbHVtbklkcyk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLmFwcGx5U2VsZWN0ZWRSb3dzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydjb2x1bW5zJ10gJiYgdGhpcy5jb2x1bW5zKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbklkcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gdGhpcy5zZWxlY3RlZENvbHVtbklkcy5maWx0ZXIoKGNvbHVtbklkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucyh0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmIHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG5cbiAgICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgZGF0YSBoYXMgcmVuZGVyZWQgaW4gdGhlIGdyaWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBUaGlzIGNsZWFucyB1cCBhbnkgbGluZ2VyaW5nIHJvdyBkZWxldGVzIGZvciBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLlxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHJvd3MgcmUtcmVuZGVyIHRodXMgbWVzc2luZyB1cCB0aGUgYWZmaXhlcnMuIFdlIG11c3QgcmVhZmZpeCB0aGVtIHNvIHRoYXQgdGhpbmdzXG4gICAgICAgICAgICAvLyBjb250aW51ZSB0byByZW5kZXIgY29ycmVjdGx5LlxuICAgICAgICAgICAgY29uc3Qgcm93RWxlbWVudDogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgJ1tza3ktY21wLWlkPVwiJyArIGlkICsgJ1wiXScsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdLmFmZml4ZXIuYWZmaXhUbyhyb3dFbGVtZW50LCB7XG4gICAgICAgICAgICAgIGF1dG9GaXRDb250ZXh0OiBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LlZpZXdwb3J0LFxuICAgICAgICAgICAgICBpc1N0aWNreTogdHJ1ZSxcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiAnYWJvdmUnLFxuICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogJ3RvcCcsXG4gICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdsZWZ0JyxcbiAgICAgICAgICAgICAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snc29ydEZpZWxkJ10pIHtcbiAgICAgIHRoaXMuc2V0U29ydEhlYWRlcnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLm11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5yb3dEZWxldGVDb250ZW50cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIHRoaXMuZGVzdHJveVJvd0RlbGV0ZShpZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRyYWd1bGFTZXJ2aWNlLmRlc3Ryb3kodGhpcy5kcmFndWxhR3JvdXBOYW1lKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb3BTY3JvbGxXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICB9XG5cbiAgcHVibGljIGdldFRhYmxlQ2xhc3NOYW1lcygpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZml0ICE9PSAnc2Nyb2xsJykge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1maXQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNUb29sYmFyKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3NreS1ncmlkLWhhcy10b29sYmFyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkRGVsaW1pdGVyKGNsYXNzTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFibGVIZWFkZXJDbGFzc05hbWVzKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxvY2tlZCkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1oZWFkZXItbG9ja2VkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkRGVsaW1pdGVyKGNsYXNzTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FyZXRJY29uTmFtZXMoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBjb25zdCBpY29uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0aGlzLmdldFNvcnREaXJlY3Rpb24oY29sdW1uLmZpZWxkKS5zdWJzY3JpYmUoKHNvcnREaXIpID0+IHtcbiAgICAgIGlmIChzb3J0RGlyID09PSAnYXNjJykge1xuICAgICAgICBpY29uTmFtZXMucHVzaCgnY2FyZXQtdXAnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0RGlyID09PSAnZGVzYycpIHtcbiAgICAgICAgaWNvbk5hbWVzLnB1c2goJ2NhcmV0LWRvd24nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZERlbGltaXRlcihpY29uTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChrZXkgPT09ICdlbnRlcicgfHwga2V5ID09PSAnICcpIHtcbiAgICAgIHRoaXMuc29ydEJ5Q29sdW1uKGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNvcnRCeUNvbHVtbihjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlICYmIGNvbHVtbi5pc1NvcnRhYmxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICBtYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgIGZpZWxkU2VsZWN0b3I6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgZGVzY2VuZGluZzogdHJ1ZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQgJiZcbiAgICAgICAgICAgICAgZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkICYmXG4gICAgICAgICAgICAgIGZpZWxkLmRlc2NlbmRpbmdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZFNlbGVjdG9yOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgZGVzY2VuZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvcnRGaWVsZENoYW5nZS5lbWl0KHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZC5uZXh0KHNlbGVjdG9yKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb24oY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbkZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgICAgOiAnYXNjJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcmlhU29ydERpcmVjdGlvbihjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbi5maWVsZFxuICAgICAgICAgID8gZmllbGQuZGVzY2VuZGluZ1xuICAgICAgICAgICAgPyAnZGVzY2VuZGluZydcbiAgICAgICAgICAgIDogJ2FzY2VuZGluZydcbiAgICAgICAgICA6IGNvbHVtbi5pc1NvcnRhYmxlXG4gICAgICAgICAgICA/ICdub25lJ1xuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uRmllbGQgPyAndmlzaWJsZScgOiAnaGlkZGVuJztcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGVscElubGluZUNsYXNzKGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYXJldFZpc2liaWxpdHkoY29sdW1uRmllbGQpLnBpcGUoXG4gICAgICBtYXAoKHZpc2liaWxpdHk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gdmlzaWJpbGl0eSA9PT0gJ2hpZGRlbic7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uTXVsdGlzZWxlY3RDaGVja2JveENoYW5nZSgpIHtcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5DaGVja2JveENoYW5nZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uSGVhZGluZyhjaGFuZ2U6IFNreUdyaWRDb2x1bW5IZWFkaW5nTW9kZWxDaGFuZ2UpIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbk1vZGVsID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY2hhbmdlLmlkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmlkID09PSBjb2x1bW4uaWQpIHx8XG4gICAgICAgIChjaGFuZ2UuZmllbGQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuZmllbGQgPT09IGNvbHVtbi5maWVsZClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChmb3VuZENvbHVtbk1vZGVsKSB7XG4gICAgICBmb3VuZENvbHVtbk1vZGVsLmhlYWRpbmcgPSBjaGFuZ2UudmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJbmxpbmVIZWxwUG9wb3ZlcihcbiAgICBjaGFuZ2U6IFNreUdyaWRDb2x1bW5JbmxpbmVIZWxwUG9wb3Zlck1vZGVsQ2hhbmdlLFxuICApIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbk1vZGVsID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY2hhbmdlLmlkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmlkID09PSBjb2x1bW4uaWQpIHx8XG4gICAgICAgIChjaGFuZ2UuZmllbGQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuZmllbGQgPT09IGNvbHVtbi5maWVsZClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChmb3VuZENvbHVtbk1vZGVsKSB7XG4gICAgICBmb3VuZENvbHVtbk1vZGVsLmlubGluZUhlbHBQb3BvdmVyID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uRGVzY3JpcHRpb24oY2hhbmdlOiBTa3lHcmlkQ29sdW1uRGVzY3JpcHRpb25Nb2RlbENoYW5nZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjaGFuZ2UuaWQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuaWQgPT09IGNvbHVtbi5pZCkgfHxcbiAgICAgICAgKGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGZvdW5kQ29sdW1uTW9kZWwpIHtcbiAgICAgIGZvdW5kQ29sdW1uTW9kZWwuZGVzY3JpcHRpb24gPSBjaGFuZ2UudmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUNvbHVtblN0YXJ0KGV2ZW50OiB7XG4gICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB2b2lkO1xuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB2b2lkO1xuICAgIHBhZ2VYPzogbnVtYmVyO1xuICB9KTogdm9pZCB7XG4gICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiByZXNpemVkLCBpbml0aWFsaXplIGFsbCB0aGUgcmVzaXplIHdpZHRocy5cbiAgICBpZiAoIXRoaXMuaXNSZXNpemVkKSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5XaWR0aHMoKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQpO1xuXG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gdHJ1ZTtcbiAgICB0aGlzLnhQb3NTdGFydCA9IGV2ZW50LnBhZ2VYO1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG5cbiAgICAvLyBTaG93IHZpc3VhbCBpbmRpY2F0b3Igb2Ygd2hlcmUgbW91c2UgaXMgZHJhZ2dpbmcgKHJlc2l6ZUJhcikuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihldmVudC5wYWdlWCk7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbW91c2VNb3ZlRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcbiAgICBjb25zdCB0b3VjaE1vdmVFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNobW92ZScpO1xuXG4gICAgbWVyZ2UobW91c2VNb3ZlRXZlbnQsIHRvdWNoTW92ZUV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChtb3ZlRXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uUmVzaXplSGFuZGxlTW92ZShtb3ZlRXZlbnQpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBtb3VzZVVwRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZXVwJyk7XG4gICAgY29uc3QgdG91Y2hFbmRFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNoZW5kJyk7XG5cbiAgICBtZXJnZShtb3VzZVVwRXZlbnQsIHRvdWNoRW5kRXZlbnQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGVuZEV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblJlc2l6ZUhhbmRsZVJlbGVhc2UoZW5kRXZlbnQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25LZXlkb3duUmVzaXplQ29sKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiByZXNpemVkLCBpbml0aWFsaXplIGFsbCB0aGUgcmVzaXplIHdpZHRocy5cbiAgICBpZiAoIXRoaXMuaXNSZXNpemVkKSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5XaWR0aHMoKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uSW5wdXRDaGFuZ2VSZXNpemVDb2woZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IE51bWJlcihpbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgZGVsdGFYID0gbmV3VmFsdWUgLSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGg7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5CeUluZGV4KHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXgsIG5ld1ZhbHVlLCBkZWx0YVgpO1xuICAgIGNvbnN0IGxlZnQgPSBpbnB1dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24obGVmdCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQucGFnZVggLSB0aGlzLnhQb3NTdGFydDtcbiAgICBjb25zdCBuZXdDb2xXaWR0aCA9IHRoaXMuc3RhcnRDb2x1bW5XaWR0aCArIGRlbHRhWDtcblxuICAgIGlmIChuZXdDb2xXaWR0aCA8PSB0aGlzLm1pbkNvbFdpZHRoKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSB0aGlzLmdldE1heFJhbmdlQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4KTtcbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcgJiYgbmV3Q29sV2lkdGggPiBtYXgpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24oZXZlbnQucGFnZVgpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlQmx1cigpIHtcbiAgICB0aGlzLnNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZUZvY3VzKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBsZWZ0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihsZWZ0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZVJlbGVhc2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5wYWdlWCAtIHRoaXMueFBvc1N0YXJ0O1xuICAgIGNvbnN0IG5ld0NvbFdpZHRoID0gdGhpcy5zdGFydENvbHVtbldpZHRoICsgZGVsdGFYO1xuICAgIHRoaXMucmVzaXplQ29sdW1uQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4LCBuZXdDb2xXaWR0aCwgZGVsdGFYKTtcbiAgICB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4ID0gdW5kZWZpbmVkO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJvd0NsaWNrKGV2ZW50OiBhbnksIHNlbGVjdGVkSXRlbTogTGlzdEl0ZW1Nb2RlbCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuZW5hYmxlTXVsdGlzZWxlY3QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0IHx8XG4gICAgICAgICF0aGlzLmlzSW50ZXJhY3RpdmVFbGVtZW50KGV2ZW50KVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbS5pc1NlbGVjdGVkID0gIXNlbGVjdGVkSXRlbS5pc1NlbGVjdGVkO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5Sb3dDbGljayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzUm93SGlnaGxpZ2h0ZWQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnJvd0hpZ2hsaWdodGVkSWQpIHtcbiAgICAgIHJldHVybiBpZCA9PT0gdGhpcy5yb3dIaWdobGlnaHRlZElkO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93SGVpZ2h0KGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdyaWRBZGFwdGVyLmdldFJvd0hlaWdodCh0aGlzLnRhYmxlRWxlbWVudFJlZiwgaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbFJvd0RlbGV0ZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5yb3dEZWxldGVDb25maWdzID0gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbHRlcihcbiAgICAgIChjb25maWcpID0+IGNvbmZpZy5pZCAhPT0gaWQsXG4gICAgKTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNhbmNlbC5lbWl0KHsgaWQ6IGlkIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUm93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IGlkKS5wZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpcm0uZW1pdCh7IGlkOiBpZCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dEZWxldGVJdGVtKGlkOiBzdHJpbmcpOiBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoKHJvd0RlbGV0ZSkgPT4gcm93RGVsZXRlLmlkID09PSBpZCk7XG4gIH1cblxuICAvLyBQcmV2ZW50IHRvdWNoIGRldmljZXMgZnJvbSBpbmFkdmVydGVudGx5IHNjcm9sbGluZyBncmlkIHdoaWxlIGRyYWdnaW5nIGNvbHVtbnMuXG4gIHB1YmxpYyBvblRvdWNoTW92ZShldmVudDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvcFNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRyaWdnZXJlZCkge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPVxuICAgICAgICAgIHRoaXMudG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uR3JpZFNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxUcmlnZ2VyZWQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9XG4gICAgICAgICAgdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNob3dUb3BTY3JvbGwgJiZcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMgJiZcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGV0IGNvbHVtbnNXaWR0aFRvdGFsID0gMDtcbiAgICAgIGNvbnN0IHdpbmRvd1NpemUgPSB0aGlzLnNreVdpbmRvdy5uYXRpdmVXaW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zaG93VG9wU2Nyb2xsKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRXaWR0aCA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb2wubmF0aXZlRWxlbWVudCkud2lkdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGNvbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBjb21wdXRlZFdpZHRoIHx8IG9mZnNldFdpZHRoLFxuICAgICAgICAgICAgdGhpcy5taW5Db2xXaWR0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbHVtbnNXaWR0aFRvdGFsID0gY29sdW1uc1dpZHRoVG90YWwgKyB3aWR0aDtcbiAgICAgICAgICBpZiAoY29sdW1uc1dpZHRoVG90YWwgPiB3aW5kb3dTaXplKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dUb3BTY3JvbGwgPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXVsdGlzZWxlY3RTZWxlY3RBbGwoKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuU2VsZWN0QWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgbXVsdGlzZWxlY3RDbGVhckFsbCgpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgaXRlbS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2xlYXJBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2U6IFNreUdyaWRNZXNzYWdlKSB7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlNlbGVjdEFsbDpcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdEFsbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQ2xlYXJBbGw6XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RDbGVhckFsbCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlByb21wdERlbGV0ZVJvdzpcbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgJiYgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdykge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdDb25maWcpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nQ29uZmlnLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3dEZWxldGVDb25maWdzLnB1c2goe1xuICAgICAgICAgICAgICBpZDogbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZCxcbiAgICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgIGVuYWJsZVNjcm9sbDogdHJ1ZSxcbiAgICAgICAgICAgICAgc2hvd0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICAgICAgY2xvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICAgIGVuYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogdHJ1ZSxcbiAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy4jZW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBvdmVybGF5LmF0dGFjaFRlbXBsYXRlKHRoaXMuaW5saW5lRGVsZXRlVGVtcGxhdGVSZWYsIHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmRhdGEuZmluZChcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5pZCA9PT0gbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdlIGFyZSBtYW51YWxseSBzZXR0aW5nIHRoZSB6LWluZGV4IGhlcmUgYmVjYXVzZSBvdmVybGF5cyB3aWxsIGFsd2F5cyBiZSBvbiB0b3Agb2ZcbiAgICAgICAgICAgICAqIHRoZSBvbW5pYmFyLiBUaGlzIG1hbnVhbCBzZXR0aW5nIGlzIDEgbGVzcyB0aGFuIHRoZSBvbW5pYmFyJ3Mgei1pbmRleCBvZiAxMDAwLiBXZVxuICAgICAgICAgICAgICogZGlzY3Vzc2VkIGNoYW5naW5nIHRoZSBvdmVybGF5IHNlcnZpY2UgdG8gYWxsb3cgZm9yIHRoaXMgYnV0IGRlY2lkZWQgYWdhaW5zdCB0aGF0XG4gICAgICAgICAgICAgKiBjaGFuZ2UgYXQgdGhpcyB0aW1lIGR1ZSB0byBpdHMgbmljaGUgbmF0dXJlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvdmVybGF5LmNvbXBvbmVudFJlZi5pbnN0YW5jZS56SW5kZXggPSAnOTk5JztcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlubGluZURlbGV0ZVJlZiA9IHRoaXMuaW5saW5lRGVsZXRlUmVmc1xuICAgICAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgICAgICAuZmluZCgoZWxSZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGVsUmVmLm5hdGl2ZUVsZW1lbnQuaWQgPT09XG4gICAgICAgICAgICAgICAgICAgICdyb3ctZGVsZXRlLXJlZi0nICsgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgYWZmaXhlciA9IHRoaXMuYWZmaXhTZXJ2aWNlLmNyZWF0ZUFmZml4ZXIoaW5saW5lRGVsZXRlUmVmKTtcblxuICAgICAgICAgICAgICBjb25zdCByb3dFbGVtZW50OiBIVE1MRWxlbWVudCA9XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgJ1tza3ktY21wLWlkPVwiJyArIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQgKyAnXCJdJyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGFmZml4ZXIuYWZmaXhUbyhyb3dFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgYXV0b0ZpdENvbnRleHQ6IFNreUFmZml4QXV0b0ZpdENvbnRleHQuVmlld3BvcnQsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiAnYWJvdmUnLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiAndG9wJyxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29udGVudHNbbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZF0gPSB7XG4gICAgICAgICAgICAgICAgYWZmaXhlcjogYWZmaXhlcixcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3c6XG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICYmIG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdy5pZCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdy5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9uSGVhZGVyRHJvcChuZXdDb2x1bW5JZHM6IHN0cmluZ1tdKSB7XG4gICAgLy8gdXBkYXRlIHNlbGVjdGVkIGNvbHVtbklkc1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgPSBuZXdDb2x1bW5JZHM7XG5cbiAgICAvLyBtYXJrIGZvciBjaGVjayBiZWNhdXNlIHdlIGFyZSB1c2luZyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5vblB1c2hcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREaXNwbGF5ZWRDb2x1bW5zKHJlc3BlY3RIaWRkZW4gPSBmYWxzZSkge1xuICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBzZXR1cCBkaXNwbGF5ZWQgY29sdW1uc1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzXG4gICAgICAgICAgLmZpbHRlcigoY29sdW1uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4uaWQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKGNvbHVtbklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uaWQgPT09IGNvbHVtbklkKVswXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcGVjdEhpZGRlbikge1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IHtcbiAgICAgICAgICByZXR1cm4gIWNvbHVtbi5oaWRkZW47XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtRGF0YSgpIHtcbiAgICAvLyBUcmFuc2Zvcm0gZGF0YSBpbnRvIG9iamVjdCB3aXRoIGlkIGFuZCBkYXRhIHByb3BlcnRpZXNcbiAgICBpZiAoXG4gICAgICB0aGlzLmRhdGEgJiZcbiAgICAgIHRoaXMuZGF0YS5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmRhdGFbMF0uaWQgJiZcbiAgICAgICF0aGlzLmRhdGFbMF0uZGF0YVxuICAgICkge1xuICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3RSb3dJZCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5nZXRHcmlkRGF0YVdpdGhTZWxlY3RlZFJvd3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGEubWFwKChpdGVtKSA9PiBuZXcgTGlzdEl0ZW1Nb2RlbChpdGVtLmlkLCBpdGVtKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YVdpdGhTZWxlY3RlZFJvd3MoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgbGV0IGNoZWNrZWQ7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZW0sIHRoaXMubXVsdGlzZWxlY3RSb3dJZCkpIHtcbiAgICAgICAgY2hlY2tlZCA9IHNlbGVjdGVkUm93cy5pbmRleE9mKGl0ZW1bdGhpcy5tdWx0aXNlbGVjdFJvd0lkXSkgPiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrZWQgPSBzZWxlY3RlZFJvd3MuaW5kZXhPZihpdGVtLmlkKSA+IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMaXN0SXRlbU1vZGVsKGl0ZW0uaWQsIGl0ZW0sIGNoZWNrZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdGVkUm93cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcykge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFJvd0lkcy5pbmRleE9mKGl0ZW0uaWQpID4gLTE7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0U29ydEhlYWRlcnMoKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkLm5leHQoXG4gICAgICB0aGlzLnNvcnRGaWVsZCB8fCB7IGZpZWxkU2VsZWN0b3I6ICcnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbnNGcm9tQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoKGNvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uQ29tcG9uZW50LnRlbXBsYXRlLCBjb2x1bW5Db21wb25lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcblxuICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgY29sdW1ucyBoYXZlIHJlbmRlcmVkIGluIHRoZSBncmlkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5CeUluZGV4KFxuICAgIGNvbHVtbkluZGV4OiBzdHJpbmcsXG4gICAgbmV3Q29sV2lkdGg6IG51bWJlcixcbiAgICBkZWx0YVg6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuXG4gICAgLy8gUHJldmVudCBhY2NpZGVudGFsIHNocmlua2FnZSBiZWxvdyBtaW5pbXVtIHdpZHRoLlxuICAgIGlmIChuZXdDb2xXaWR0aCA8PSB0aGlzLm1pbkNvbFdpZHRoKSB7XG4gICAgICBkZWx0YVggPSBkZWx0YVggKyB0aGlzLm1pbkNvbFdpZHRoIC0gbmV3Q29sV2lkdGg7XG4gICAgICBuZXdDb2xXaWR0aCA9IHRoaXMubWluQ29sV2lkdGg7XG4gICAgfVxuXG4gICAgLy8gZml0PXdpZHRoIGFkZHMvcmVtb3ZlcyB3aWR0aCBmcm9tIHRoZSBsYXN0IGNvbHVtblxuICAgIC8vIGZpdD1zY3JvbGwgYWRkcy9yZW1vdmVzIHdpZHRoIGZyb20gdGhlIHRhYmxlXG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnKSB7XG4gICAgICBjb25zdCBsYXN0Q29sdW1uID0gdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCk7XG5cbiAgICAgIC8vIFByZXZlbnQgYWNjaWRlbnRhbCBncm93dGggdGhhdCB3b3VsZCBidW1wIGxhc3QgY29sdW1uIG9mZiBzY3JlZW4uXG4gICAgICBjb25zdCBtYXggPSB0aGlzLmdldE1heFJhbmdlQnlJbmRleChjb2x1bW5JbmRleCk7XG4gICAgICBpZiAobmV3Q29sV2lkdGggPiBtYXgpIHtcbiAgICAgICAgbmV3Q29sV2lkdGggPSBtYXg7XG4gICAgICAgIGRlbHRhWCA9IG1heCAtIHRoaXMuc3RhcnRDb2x1bW5XaWR0aDtcbiAgICAgIH1cbiAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbFdpZHRoO1xuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IGxhc3RDb2x1bW4ud2lkdGggLSBkZWx0YVg7XG4gICAgICB0aGlzLnVwZGF0ZU1heFJhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICBgJHt0aGlzLnRhYmxlV2lkdGggKyBkZWx0YVh9cHhgLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbFdpZHRoO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuY29sdW1uV2lkdGhDaGFuZ2UuZW1pdCh0aGlzLmdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5XaWR0aHMoKSB7XG4gICAgLy8gRXN0YWJsaXNoIHRhYmxlIHdpZHRoLlxuICAgIHRoaXMuc2hvd1RvcFNjcm9sbCA9IHRydWU7XG5cbiAgICAvLyBTZXQgY29sdW1uIHdpZHRocyBiYXNlZCBvbiB0aGUgd2lkdGggaW5pdGlhbGx5IGdpdmVuIGJ5IHRoZSBicm93c2VyLlxuICAgIC8vIGNvbXB1dGVkV2lkdGggcHJldmVudHMgYWNjaWRlbnRhbCBvdmVyZmxvdyBmb3IgYnJvd3NlcnMgd2l0aCBzdWItcGl4ZWwgd2lkdGhzLlxuICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY29tcHV0ZWRXaWR0aCA9IHBhcnNlRmxvYXQoXG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbC5uYXRpdmVFbGVtZW50KS53aWR0aCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGNvbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRoaXMuZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4KS53aWR0aCA9IE1hdGgubWF4KFxuICAgICAgICBjb21wdXRlZFdpZHRoIHx8IG9mZnNldFdpZHRoLFxuICAgICAgICB0aGlzLm1pbkNvbFdpZHRoLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vICdzY3JvbGwnIHRhYmxlcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBhbmQgb3V0c2lkZSBvZiB0aGVpciBjb25zdHJhaW50cy5cbiAgICBpZiAodGhpcy5maXQgPT09ICdzY3JvbGwnKSB7XG4gICAgICB0aGlzLmdyaWRBZGFwdGVyLnNldFN0eWxlKHRoaXMudGFibGVFbGVtZW50UmVmLCAnbWluLXdpZHRoJywgJ2F1dG8nKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWF4IGxpbWl0cyBmb3IgaW5wdXQgcmFuZ2VzLlxuICAgIGlmICh0aGlzLmZpdCA9PT0gJ3dpZHRoJykge1xuICAgICAgdGhpcy51cGRhdGVNYXhSYW5nZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2ZlckNvbHVtbldpZHRocyhcbiAgICBvbGRDb2x1bW5zOiBTa3lHcmlkQ29sdW1uTW9kZWxbXSxcbiAgICBuZXdDb2x1bW5zOiBTa3lHcmlkQ29sdW1uTW9kZWxbXSxcbiAgKSB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAob2xkQ29sdW1ucyAmJiBuZXdDb2x1bW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZENvbHVtbiBvZiBvbGRDb2x1bW5zKSB7XG4gICAgICAgIGlmIChvbGRDb2x1bW4ud2lkdGgpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ0NvbHVtbiA9IG5ld0NvbHVtbnMuZmluZChcbiAgICAgICAgICAgIChuZXdDb2x1bW4pID0+IG9sZENvbHVtbi5pZCA9PT0gbmV3Q29sdW1uLmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nQ29sdW1uICYmICFtYXRjaGluZ0NvbHVtbi53aWR0aCkge1xuICAgICAgICAgICAgbWF0Y2hpbmdDb2x1bW4ud2lkdGggPSBvbGRDb2x1bW4ud2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSB7XG4gICAgY29uc3QgY29sdW1uV2lkdGhNb2RlbENoYW5nZSA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uV2lkdGhNb2RlbENoYW5nZT4oKTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb2x1bW5XaWR0aE1vZGVsQ2hhbmdlLnB1c2goe1xuICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoTW9kZWxDaGFuZ2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1heFJhbmdlKCkge1xuICAgIGNvbnN0IGxlZnRvdmVyV2lkdGggPVxuICAgICAgdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCkud2lkdGggLSB0aGlzLm1pbkNvbFdpZHRoO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXhSYW5nZSA9IGNvbHVtbi53aWR0aCArIGxlZnRvdmVyV2lkdGg7XG4gICAgICBjb25zdCByYW5nZUlucHV0ID0gdGhpcy5nZXRSYW5nZUlucHV0QnlJbmRleChpbmRleCk7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQubWF4ID0gbmV3TWF4UmFuZ2U7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWF4JywgbmV3TWF4UmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4ID0gY2xpY2tUYXJnZXQuZ2V0QXR0cmlidXRlKCdza3ktY21wLWluZGV4Jyk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgdGhpcy5zdGFydENvbHVtbldpZHRoID0gY29sdW1uLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhYmxlV2lkdGgoKSB7XG4gICAgdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ3dpZHRoJywgYGF1dG9gKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aH1weGAsXG4gICAgICApO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJhbmdlSW5wdXRCeUluZGV4KGluZGV4OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5SYW5nZUlucHV0RWxlbWVudFJlZnMuZmluZChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NreS1jbXAtaW5kZXgnKSA9PT0gaW5kZXgudG9TdHJpbmcoKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5Nb2RlbEJ5SW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNbTnVtYmVyKGluZGV4KV07XG4gIH1cblxuICBwcml2YXRlIGdldE1heFJhbmdlQnlJbmRleChpbmRleDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uRWxlbWVudFJlZiA9IHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZmluZChcbiAgICAgICh0aCkgPT4gdGgubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NreS1jbXAtaW5kZXgnKSA9PT0gaW5kZXgsXG4gICAgKTtcbiAgICBjb25zdCByYW5nZUlucHV0ID0gY29sdW1uRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLnNreS1ncmlkLWNvbHVtbi1pbnB1dC1hcmlhLW9ubHknLFxuICAgICk7XG4gICAgcmV0dXJuIE51bWJlcihyYW5nZUlucHV0Lm1heCk7XG4gIH1cblxuICBwcml2YXRlIGdldExhc3REaXNwbGF5ZWRDb2x1bW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uTW9kZWxCeUluZGV4KHRoaXMuZGlzcGxheWVkQ29sdW1ucy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVsaW1pdGVyKHRleHQ6IHN0cmluZ1tdLCBkZWxpbWl0ZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0ZXh0LmZpbHRlcigodmFsKSA9PiB2YWwpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVJvd0RlbGV0ZShpZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgcm93RGVsZXRlQ29udGVudHMgPSB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChyb3dEZWxldGVDb250ZW50cykge1xuICAgICAgcm93RGVsZXRlQ29udGVudHMuYWZmaXhlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlKHJvd0RlbGV0ZUNvbnRlbnRzLm92ZXJsYXkpO1xuICAgICAgZGVsZXRlIHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGVkUm93cyhzb3VyY2U6IFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZSA9IHtcbiAgICAgIHNlbGVjdGVkUm93SWRzOiB0aGlzLmdldFNlbGVjdGVkUm93cygpLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgfTtcbiAgICB0aGlzLm11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRSb3dzKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmlzU2VsZWN0ZWQ7XG4gICAgICB9KVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZW0uZGF0YSwgdGhpcy5tdWx0aXNlbGVjdFJvd0lkKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5kYXRhW3RoaXMubXVsdGlzZWxlY3RSb3dJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnRlcmFjdGl2ZUVsZW1lbnQoZXZlbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgaW50ZXJhY3RpdmVFbFNlbGVjdG9ycyA9IGBcbiAgICAgIGEsXG4gICAgICBidXR0b24sXG4gICAgICBpbnB1dCxcbiAgICAgIGxhYmVsLFxuICAgICAgb3B0aW9uLFxuICAgICAgc2VsZWN0LFxuICAgICAgdGV4dGFyZWEsXG4gICAgICBkZXRhaWxzLFxuICAgICAgZGlhbG9nLFxuICAgICAgbWVudSxcbiAgICAgIG1lbnVpdGVtLFxuICAgICAgc3VtbWFyeWA7XG4gICAgcmV0dXJuIGV2ZW50LnRhcmdldC5jbG9zZXN0KGludGVyYWN0aXZlRWxTZWxlY3RvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXNpemVCYXJQb3NpdGlvbih4UG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFNjcm9sbCA9IHRoaXMudGFibGVDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCByZXNpemVCYXJYID1cbiAgICAgIHhQb3NpdGlvbiAtXG4gICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuICAgICAgcGFyZW50U2Nyb2xsO1xuICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUodGhpcy5yZXNpemVCYXIsICdsZWZ0JywgcmVzaXplQmFyWCArICdweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVVzZXJDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnVpQ29uZmlnU2VydmljZVxuICAgICAgICAuZ2V0Q29uZmlnKHRoaXMuc2V0dGluZ3NLZXkpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNvbmZpZzogU2t5R3JpZFVJQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2VsZWN0ZWRDb2x1bW5JZHMpIHtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBjb2x1bW5JZHMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgY3VycmVudCBkYXRhIHNldC5cbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkcyA9IGNvbmZpZy5zZWxlY3RlZENvbHVtbklkcy5maWx0ZXIoKGlkKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5pZCA9PT0gaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckNvbmZpZyhjb25maWc6IFNreUdyaWRVSUNvbmZpZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5nc0tleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAuc2V0Q29uZmlnKHRoaXMuc2V0dGluZ3NLZXksIGNvbmZpZylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHNhdmUgZ3JpZCBzZXR0aW5ncy4nKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5zKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggIT09IDAgfHwgdGhpcy5jb2x1bW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgIGlmICh0aGlzLmNvbHVtbkNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdldENvbHVtbnNGcm9tQ29tcG9uZW50KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhbnNmb3JtRGF0YSgpO1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKHRydWUpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyBXYXRjaCBmb3IgYWRkZWQvcmVtb3ZlZCBjb2x1bW5zOlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jb2x1bW5Db21wb25lbnRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlQ29sdW1ucygpKSxcbiAgICApO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNvbHVtbiBoZWFkaW5nIGNoYW5nZXM6XG4gICAgdGhpcy5jb2x1bW5Db21wb25lbnRzLmZvckVhY2goKGNvbXA6IFNreUdyaWRDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICBjb21wLmhlYWRpbmdNb2RlbENoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgICAgIChjaGFuZ2U6IFNreUdyaWRDb2x1bW5IZWFkaW5nTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uSGVhZGluZyhjaGFuZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbXAuZGVzY3JpcHRpb25Nb2RlbENoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgICAgIChjaGFuZ2U6IFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbkRlc2NyaXB0aW9uKGNoYW5nZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5pbmxpbmVIZWxwUG9wb3Zlck1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5saW5lSGVscFBvcG92ZXIoY2hhbmdlKTtcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXJyYXlzRXF1YWwoYXJyYXlBOiBhbnlbXSwgYXJyYXlCOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhcnJheUEubGVuZ3RoID09PSBhcnJheUIubGVuZ3RoICYmXG4gICAgICBhcnJheUEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGFycmF5QltpbmRleF0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNreS1ncmlkXCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dUb3BTY3JvbGxcIlxuICAgICN0b3BTY3JvbGxDb250YWluZXJcbiAgICBjbGFzcz1cInNreS1ncmlkLXRvcC1zY3JvbGwtY29udGFpbmVyXCJcbiAgICAoc2Nyb2xsKT1cIm9uVG9wU2Nyb2xsKCRldmVudClcIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJza3ktZ3JpZC10b3Atc2Nyb2xsXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJnZXRUb3BTY3JvbGxXaWR0aCgpXCJcbiAgICA+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgI2dyaWRDb250YWluZXJcbiAgICBjbGFzcz1cInNreS1ncmlkLXRhYmxlLWNvbnRhaW5lclwiXG4gICAgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHRcIlxuICAgIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiXG4gICAgKHNjcm9sbCk9XCJvbkdyaWRTY3JvbGwoJGV2ZW50KVwiXG4gID5cbiAgICA8dGFibGUgI2dyaWRUYWJsZSBjbGFzcz1cInNreS1ncmlkLXRhYmxlXCIgW25nQ2xhc3NdPVwiZ2V0VGFibGVDbGFzc05hbWVzKClcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIFtkcmFndWxhXT1cImRyYWd1bGFHcm91cE5hbWVcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1oZWFkaW5nIHNreS1ncmlkLW11bHRpc2VsZWN0LWNlbGwgc2t5LWdyaWQtaGVhZGVyLWxvY2tlZFwiXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAge3sgJ3NreXV4X2dyaWRfbXVsdGlzZWxlY3Rfc2VsZWN0X3JvdycgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBjb2x1bW4gb2YgZGlzcGxheWVkQ29sdW1ucztcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSBsYXN0O1xuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgI2dyaWRDb2xcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGluZyBza3ktZmllbGQtbGFiZWxcIlxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pbmRleF09XCJpXCJcbiAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnREaXJlY3Rpb24oY29sdW1uKSB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtpZF09XCInc2t5LWdyaWQtJyArIGdyaWRJZCArICctY29sdW1uLScgKyBpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIidza3ktZ3JpZC1jb2x1bW4tYWxpZ25tZW50LScgKyBjb2x1bW4uYWxpZ25tZW50XCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3RhYkluZGV4XT1cImNvbHVtbi5pc1NvcnRhYmxlID8gMCA6IC0xXCJcbiAgICAgICAgICAgIChtb3VzZXVwKT1cInNvcnRCeUNvbHVtbihjb2x1bW4pXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJvblRvdWNoTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwib3ZlcmZsb3dcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRUYWJsZUhlYWRlckNsYXNzTmFtZXMoY29sdW1uKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uLndpZHRoIC0gMVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGggLSAxXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cIihnZXRDYXJldFZpc2liaWxpdHkoY29sdW1uLmZpZWxkKSB8IGFzeW5jKSA9PT0gJ2hpZGRlbidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGVyLWNhcmV0LWhpZGRlbi1zcGFjaW5nXCJcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPCEtLSBUaGUgbm8gc3BhY2luZyBoZXJlIGlzIGludGVudGlvbmFsIHRvIGF2b2lkIGV4dHJhIHNwYWNlcyBkdWUgdG8gdGhlc2UgYmVpbmcgaW5saW5lIGVsZW1lbnRzIC0tPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNreS1ncmlkLWhlYWRlci10ZXh0XCI+e3tcbiAgICAgICAgICAgICAgICBjb2x1bW4uaGVhZGluZz8udHJpbSgpXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c2t5LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWhlYWRpbmctc29ydFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAnc2t5LWdyaWQtaGVhZGluZy1zb3J0LScgK1xuICAgICAgICAgICAgICAgICAgKGdldENhcmV0VmlzaWJpbGl0eShjb2x1bW4uZmllbGQpIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJnZXRDYXJldEljb25OYW1lcyhjb2x1bW4pXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNreS1oZWxwLWlubGluZVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAnc2t5LWdyaWQtaGVscC1pbmxpbmUtc29ydC1oaWRkZW4nOlxuICAgICAgICAgICAgICAgICAgICBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uLmZpZWxkKSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3NreVBvcG92ZXJdPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiKGZpdCA9PT0gJ3dpZHRoJyAmJiAhbGFzdCkgfHwgZml0ID09PSAnc2Nyb2xsJ1wiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2NvbFNpemVSYW5nZVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiV2lkdGggb2YgY29sdW1uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1jb2x1bW4taW5wdXQtYXJpYS1vbmx5XCJcbiAgICAgICAgICAgICAgcm9sZT1cInNsaWRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3NreS1ncmlkLScgKyBncmlkSWQgKyAnLWNvbHVtbi0nICsgaVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtaW5dPVwibWluQ29sV2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWF4XT1cIm1heENvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW5vd109XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgICBbbWluXT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW21heF09XCJtYXhDb2xXaWR0aFwiXG4gICAgICAgICAgICAgIFtzdGVwXT1cImNvbHVtblJlc2l6ZVN0ZXBcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uUmVzaXplSGFuZGxlQmx1cigpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uUmVzaXplSGFuZGxlRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93blJlc2l6ZUNvbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlUmVzaXplQ29sKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInNreS1ncmlkLXRib2R5XCI+XG4gICAgICAgIDx0clxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLXJvd1wiXG4gICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzUm93SGlnaGxpZ2h0ZWQoaXRlbS5pZCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuc2t5LWNtcC1pZF09XCJpdGVtLmlkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc2t5LWdyaWQtbXVsdGlzZWxlY3Qtc2VsZWN0ZWQtcm93JzogaXRlbS5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgJ3NreS1ncmlkLW11bHRpc2VsZWN0LXJvdyc6IGVuYWJsZU11bHRpc2VsZWN0LFxuICAgICAgICAgICAgJ3NreS1ncmlkLXJvdy1oaWdobGlnaHQnOiBpc1Jvd0hpZ2hsaWdodGVkKGl0ZW0uaWQpXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1tdWx0aXNlbGVjdC1jZWxsIHNreS1ncmlkLWhlYWRlci1sb2NrZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3NreXV4X2dyaWRfbXVsdGlzZWxlY3Rfc2VsZWN0X3JvdycgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uTXVsdGlzZWxlY3RDaGVja2JveENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBkaXNwbGF5ZWRDb2x1bW5zO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWNlbGxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3NreS1ncmlkLWNvbHVtbi1hbGlnbm1lbnQtJyArIGNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNreS1ncmlkLWNlbGxcbiAgICAgICAgICAgICAgW3NreUhpZ2hsaWdodF09XCJcbiAgICAgICAgICAgICAgICAhY29sdW1uLmV4Y2x1ZGVGcm9tSGlnaGxpZ2h0aW5nID8gaGlnaGxpZ2h0VGV4dCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLnRlbXBsYXRlIHx8IGRlZmF1bHRDZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbZmllbGRTZWxlY3Rvcl09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW2NvbHVtbklkXT1cImNvbHVtbi5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJzaG93UmVzaXplQmFyXCJcbiAgICAgICNyZXNpemVCYXJcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICBjbGFzcz1cInNreS1ncmlkLXJlc2l6ZS1iYXJcIlxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsVGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+e3tcbiAgdmFsdWVcbn19PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZiBsZXQtaXRlbT5cbiAgPGRpdlxuICAgICNpbmxpbmVEZWxldGVSZWZcbiAgICBbaWRdPVwiJ3Jvdy1kZWxldGUtcmVmLScgKyBpdGVtLmlkXCJcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICBoZWlnaHQ6IGdldFJvd0hlaWdodCgwKSxcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgd2lkdGg6IHRhYmxlV2lkdGggKyAncHgnXG4gICAgfVwiXG4gID5cbiAgICA8c2t5LWlubGluZS1kZWxldGVcbiAgICAgIFtwZW5kaW5nXT1cImdldFJvd0RlbGV0ZUl0ZW0oaXRlbS5pZCkucGVuZGluZ1wiXG4gICAgICAoY2FuY2VsVHJpZ2dlcmVkKT1cImNhbmNlbFJvd0RlbGV0ZShpdGVtLmlkKVwiXG4gICAgICAoZGVsZXRlVHJpZ2dlcmVkKT1cImNvbmZpcm1Sb3dEZWxldGUoaXRlbS5pZClcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|