@skyux/grids 4.0.6 → 5.0.1

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