@skyux/list-builder-view-grids 5.7.2 → 6.0.0-beta.2

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 (101) hide show
  1. package/documentation.json +2 -2
  2. package/esm2020/index.mjs +21 -0
  3. package/esm2020/lib/modules/column-selector/column-selector-context.mjs +9 -0
  4. package/esm2020/lib/modules/column-selector/column-selector-modal.component.mjs +38 -0
  5. package/esm2020/lib/modules/column-selector/column-selector-modal.module.mjs +40 -0
  6. package/esm2020/lib/modules/list-column-selector-action/list-column-selector-action.component.mjs +133 -0
  7. package/esm2020/lib/modules/list-column-selector-action/list-column-selector-action.module.mjs +47 -0
  8. package/esm2020/lib/modules/list-column-selector-action/list-column-selector-button.component.mjs +13 -0
  9. package/esm2020/lib/modules/list-view-grid/list-view-grid.component.mjs +460 -0
  10. package/esm2020/lib/modules/list-view-grid/list-view-grid.module.mjs +42 -0
  11. package/esm2020/lib/modules/list-view-grid/state/columns/columns.orchestrator.mjs +22 -0
  12. package/esm2020/lib/modules/list-view-grid/state/columns/load.action.mjs +10 -0
  13. package/esm2020/lib/modules/list-view-grid/state/displayed-columns/displayed-columns.orchestrator.mjs +22 -0
  14. package/esm2020/lib/modules/list-view-grid/state/displayed-columns/load.action.mjs +10 -0
  15. package/esm2020/lib/modules/list-view-grid/state/grid-state-action.type.mjs +2 -0
  16. package/esm2020/lib/modules/list-view-grid/state/grid-state.model.mjs +11 -0
  17. package/esm2020/lib/modules/list-view-grid/state/grid-state.rxstate.mjs +19 -0
  18. package/esm2020/lib/modules/list-view-grid/state/grid-state.state-node.mjs +27 -0
  19. package/esm2020/lib/modules/list-view-grid/types/list-view-grid-message-type.mjs +15 -0
  20. package/esm2020/lib/modules/list-view-grid/types/list-view-grid-message.mjs +2 -0
  21. package/esm2020/lib/modules/list-view-grid/types/list-view-grid-row-delete-cancel-args.mjs +2 -0
  22. package/esm2020/lib/modules/list-view-grid/types/list-view-grid-row-delete-confirm-args.mjs +2 -0
  23. package/esm2020/lib/modules/shared/sky-list-builder-view-grids-resources.module.mjs +56 -0
  24. package/esm2020/skyux-list-builder-view-grids.mjs +5 -0
  25. package/esm2020/testing/list-view-grid-fixture-cell.mjs +2 -0
  26. package/esm2020/testing/list-view-grid-fixture-header.mjs +2 -0
  27. package/esm2020/testing/list-view-grid-fixture-row.mjs +2 -0
  28. package/esm2020/testing/list-view-grid-fixture.mjs +66 -0
  29. package/esm2020/testing/public-api.mjs +5 -0
  30. package/esm2020/testing/skyux-list-builder-view-grids-testing.mjs +5 -0
  31. package/fesm2015/{skyux-list-builder-view-grids-testing.js → skyux-list-builder-view-grids-testing.mjs} +1 -1
  32. package/fesm2015/skyux-list-builder-view-grids-testing.mjs.map +1 -0
  33. package/fesm2015/skyux-list-builder-view-grids.mjs +905 -0
  34. package/fesm2015/skyux-list-builder-view-grids.mjs.map +1 -0
  35. package/{esm2015/testing/list-view-grid-fixture.js → fesm2020/skyux-list-builder-view-grids-testing.mjs} +9 -2
  36. package/fesm2020/skyux-list-builder-view-grids-testing.mjs.map +1 -0
  37. package/{fesm2015/skyux-list-builder-view-grids.js → fesm2020/skyux-list-builder-view-grids.mjs} +40 -57
  38. package/fesm2020/skyux-list-builder-view-grids.mjs.map +1 -0
  39. package/package.json +42 -18
  40. package/testing/package.json +5 -5
  41. package/bundles/skyux-list-builder-view-grids-testing.umd.js +0 -81
  42. package/bundles/skyux-list-builder-view-grids.umd.js +0 -1359
  43. package/esm2015/index.js +0 -21
  44. package/esm2015/index.js.map +0 -1
  45. package/esm2015/lib/modules/column-selector/column-selector-context.js +0 -9
  46. package/esm2015/lib/modules/column-selector/column-selector-context.js.map +0 -1
  47. package/esm2015/lib/modules/column-selector/column-selector-modal.component.js +0 -41
  48. package/esm2015/lib/modules/column-selector/column-selector-modal.component.js.map +0 -1
  49. package/esm2015/lib/modules/column-selector/column-selector-modal.module.js +0 -41
  50. package/esm2015/lib/modules/column-selector/column-selector-modal.module.js.map +0 -1
  51. package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.component.js +0 -136
  52. package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.component.js.map +0 -1
  53. package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.module.js +0 -47
  54. package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.module.js.map +0 -1
  55. package/esm2015/lib/modules/list-column-selector-action/list-column-selector-button.component.js +0 -17
  56. package/esm2015/lib/modules/list-column-selector-action/list-column-selector-button.component.js.map +0 -1
  57. package/esm2015/lib/modules/list-view-grid/list-view-grid.component.js +0 -466
  58. package/esm2015/lib/modules/list-view-grid/list-view-grid.component.js.map +0 -1
  59. package/esm2015/lib/modules/list-view-grid/list-view-grid.module.js +0 -42
  60. package/esm2015/lib/modules/list-view-grid/list-view-grid.module.js.map +0 -1
  61. package/esm2015/lib/modules/list-view-grid/state/columns/columns.orchestrator.js +0 -22
  62. package/esm2015/lib/modules/list-view-grid/state/columns/columns.orchestrator.js.map +0 -1
  63. package/esm2015/lib/modules/list-view-grid/state/columns/load.action.js +0 -10
  64. package/esm2015/lib/modules/list-view-grid/state/columns/load.action.js.map +0 -1
  65. package/esm2015/lib/modules/list-view-grid/state/displayed-columns/displayed-columns.orchestrator.js +0 -22
  66. package/esm2015/lib/modules/list-view-grid/state/displayed-columns/displayed-columns.orchestrator.js.map +0 -1
  67. package/esm2015/lib/modules/list-view-grid/state/displayed-columns/load.action.js +0 -10
  68. package/esm2015/lib/modules/list-view-grid/state/displayed-columns/load.action.js.map +0 -1
  69. package/esm2015/lib/modules/list-view-grid/state/grid-state-action.type.js +0 -2
  70. package/esm2015/lib/modules/list-view-grid/state/grid-state-action.type.js.map +0 -1
  71. package/esm2015/lib/modules/list-view-grid/state/grid-state.model.js +0 -11
  72. package/esm2015/lib/modules/list-view-grid/state/grid-state.model.js.map +0 -1
  73. package/esm2015/lib/modules/list-view-grid/state/grid-state.rxstate.js +0 -19
  74. package/esm2015/lib/modules/list-view-grid/state/grid-state.rxstate.js.map +0 -1
  75. package/esm2015/lib/modules/list-view-grid/state/grid-state.state-node.js +0 -27
  76. package/esm2015/lib/modules/list-view-grid/state/grid-state.state-node.js.map +0 -1
  77. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message-type.js +0 -15
  78. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message-type.js.map +0 -1
  79. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message.js +0 -2
  80. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message.js.map +0 -1
  81. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-cancel-args.js +0 -2
  82. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-cancel-args.js.map +0 -1
  83. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-confirm-args.js +0 -2
  84. package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-confirm-args.js.map +0 -1
  85. package/esm2015/lib/modules/shared/sky-list-builder-view-grids-resources.module.js +0 -56
  86. package/esm2015/lib/modules/shared/sky-list-builder-view-grids-resources.module.js.map +0 -1
  87. package/esm2015/skyux-list-builder-view-grids.js +0 -5
  88. package/esm2015/skyux-list-builder-view-grids.js.map +0 -1
  89. package/esm2015/testing/list-view-grid-fixture-cell.js +0 -2
  90. package/esm2015/testing/list-view-grid-fixture-cell.js.map +0 -1
  91. package/esm2015/testing/list-view-grid-fixture-header.js +0 -2
  92. package/esm2015/testing/list-view-grid-fixture-header.js.map +0 -1
  93. package/esm2015/testing/list-view-grid-fixture-row.js +0 -2
  94. package/esm2015/testing/list-view-grid-fixture-row.js.map +0 -1
  95. package/esm2015/testing/list-view-grid-fixture.js.map +0 -1
  96. package/esm2015/testing/public-api.js +0 -5
  97. package/esm2015/testing/public-api.js.map +0 -1
  98. package/esm2015/testing/skyux-list-builder-view-grids-testing.js +0 -5
  99. package/esm2015/testing/skyux-list-builder-view-grids-testing.js.map +0 -1
  100. package/fesm2015/skyux-list-builder-view-grids-testing.js.map +0 -1
  101. package/fesm2015/skyux-list-builder-view-grids.js.map +0 -1
@@ -0,0 +1,460 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, QueryList, ViewChild, forwardRef, } from '@angular/core';
2
+ import { SkyGridColumnComponent, SkyGridColumnModel, SkyGridComponent, SkyGridMessageType, SkyGridSelectedRowsSource, } from '@skyux/grids';
3
+ import { ListSearchModel, ListState, ListStateDispatcher, ListViewComponent, } from '@skyux/list-builder';
4
+ import { getValue } from '@skyux/list-builder-common';
5
+ import { getData, isObservable, } from '@skyux/list-builder-common';
6
+ import { Subject, of as observableOf } from 'rxjs';
7
+ import { distinctUntilChanged, map as observableMap, scan, take, takeUntil, } from 'rxjs/operators';
8
+ import { ListViewGridColumnsLoadAction } from './state/columns/load.action';
9
+ import { ListViewDisplayedGridColumnsLoadAction } from './state/displayed-columns/load.action';
10
+ import { GridStateModel } from './state/grid-state.model';
11
+ import { GridStateDispatcher } from './state/grid-state.rxstate';
12
+ import { GridState } from './state/grid-state.state-node';
13
+ import { SkyListViewGridMessageType } from './types/list-view-grid-message-type';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@skyux/list-builder";
16
+ import * as i2 from "./state/grid-state.state-node";
17
+ import * as i3 from "./state/grid-state.rxstate";
18
+ import * as i4 from "@skyux/grids";
19
+ import * as i5 from "@skyux/indicators";
20
+ import * as i6 from "@angular/common";
21
+ /**
22
+ * Displays a grid for a
23
+ * [SKY UX-themed list of data](https://developer.blackbaud.com/skyux/components/list/overview)
24
+ * using the [grid component](https://developer.blackbaud.com/skyux/components/grid).
25
+ * You must install `SkyListModule` as a dependency.
26
+ */
27
+ export class SkyListViewGridComponent extends ListViewComponent {
28
+ constructor(state, dispatcher, gridState, gridDispatcher) {
29
+ super(state, 'Grid View');
30
+ this.dispatcher = dispatcher;
31
+ this.gridState = gridState;
32
+ this.gridDispatcher = gridDispatcher;
33
+ /**
34
+ * Specifies how the grid fits to its parent. `"width"` fits the grid to the parent's full
35
+ * width, and `"scroll"` allows the grid to exceed the parent's width. If the grid does not have
36
+ * enough columns to fill the parent's width, it always stretches to the parent's full width.
37
+ * @default "width"
38
+ */
39
+ this.fit = 'width';
40
+ /**
41
+ * Indicates whether to highlight search text within the grid.
42
+ * @default true
43
+ */
44
+ this.highlightSearchText = true;
45
+ /**
46
+ * Indicates whether to enable the multiselect feature to display a column of checkboxes
47
+ * on the left side of the grid. Multiselect also displays an action bar with buttons to
48
+ * select and clear all checkboxes. Multiselect defaults to the `id` property on the list's
49
+ * `data` object.
50
+ * @default false
51
+ */
52
+ this.enableMultiselect = false;
53
+ /**
54
+ * Fires when users cancel the deletion of a row.
55
+ */
56
+ this.rowDeleteCancel = new EventEmitter();
57
+ /**
58
+ * Fires when users confirm the deletion of a row.
59
+ */
60
+ this.rowDeleteConfirm = new EventEmitter();
61
+ /**
62
+ * Fires when columns change. This includes changes to the displayed columns and changes
63
+ * to the order of columns. The event emits an array of IDs for the displayed columns that
64
+ * reflects the column order.
65
+ */
66
+ this.selectedColumnIdsChange = new EventEmitter();
67
+ /**
68
+ * Message stream for communicating with the internal grid instance
69
+ * @interal
70
+ */
71
+ this.gridMessageStream = new Subject();
72
+ this.multiselectSelectedIds = [];
73
+ this.ngUnsubscribe = new Subject();
74
+ this._messageStream = new Subject();
75
+ }
76
+ /**
77
+ * Specifies the name of the view.
78
+ * @required
79
+ */
80
+ set name(value) {
81
+ this.viewName = value;
82
+ }
83
+ /**
84
+ * Provides an observable to send commands to the grid.
85
+ * The commands should respect the `SkyListViewGridMessage` type.
86
+ */
87
+ set messageStream(stream) {
88
+ /* istanbul ignore else */
89
+ if (this._messageStream) {
90
+ this._messageStream.unsubscribe();
91
+ }
92
+ this._messageStream = stream;
93
+ this.initInlineDeleteMessages();
94
+ }
95
+ get messageStream() {
96
+ return this._messageStream;
97
+ }
98
+ get gridHeight() {
99
+ /* istanbul ignore next */
100
+ return typeof this.height === 'number'
101
+ ? observableOf(this.height)
102
+ : this.height;
103
+ }
104
+ get gridWidth() {
105
+ /* istanbul ignore next */
106
+ return typeof this.width === 'number'
107
+ ? observableOf(this.width)
108
+ : this.width;
109
+ }
110
+ ngAfterContentInit() {
111
+ // Watch for selection changes and update multiselectSelectedIds for local comparison.
112
+ this.state
113
+ .pipe(observableMap((s) => s.selected.item), takeUntil(this.ngUnsubscribe), distinctUntilChanged(this.selectedMapEqual))
114
+ .subscribe((items) => {
115
+ const selectedIds = [];
116
+ items.selectedIdMap.forEach((isSelected, id) => {
117
+ if (items.selectedIdMap.get(id) === true) {
118
+ selectedIds.push(id);
119
+ }
120
+ });
121
+ this.multiselectSelectedIds = selectedIds;
122
+ });
123
+ /* istanbul ignore next */
124
+ if (this.columnComponents.length === 0) {
125
+ throw new Error('Grid view requires at least one sky-grid-column to render.');
126
+ }
127
+ const columnModels = this.columnComponents.map((columnComponent) => {
128
+ return new SkyGridColumnModel(columnComponent.template, columnComponent);
129
+ });
130
+ if (this.width && !isObservable(this.width)) {
131
+ this.width = observableOf(this.width);
132
+ }
133
+ if (this.height && !isObservable(this.height)) {
134
+ this.height = observableOf(this.height);
135
+ }
136
+ // Setup Observables for template
137
+ this.columns = this.gridState.pipe(observableMap((s) => s.columns.items), distinctUntilChanged(this.arraysEqual), takeUntil(this.ngUnsubscribe));
138
+ this.selectedColumnIds = this.getSelectedIds();
139
+ this.items = this.getGridItems();
140
+ this.loading = this.state.pipe(observableMap((s) => {
141
+ return s.items.loading;
142
+ }), distinctUntilChanged(), takeUntil(this.ngUnsubscribe));
143
+ this.sortField = this.state.pipe(observableMap((s) => {
144
+ /* istanbul ignore else */
145
+ /* sanity check */
146
+ if (s.sort && s.sort.fieldSelectors) {
147
+ return s.sort.fieldSelectors[0];
148
+ }
149
+ /* istanbul ignore next */
150
+ /* sanity check */
151
+ return undefined;
152
+ }), distinctUntilChanged(), takeUntil(this.ngUnsubscribe));
153
+ this.gridState
154
+ .pipe(observableMap((s) => s.columns.items), takeUntil(this.ngUnsubscribe), distinctUntilChanged(this.arraysEqual))
155
+ .subscribe((columns) => {
156
+ /* istanbul ignore else */
157
+ if (this.hiddenColumns) {
158
+ getValue(this.hiddenColumns, (hiddenColumns) => {
159
+ this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(columns.filter((x) => {
160
+ /* istanbul ignore next */
161
+ /* sanity check */
162
+ const id = x.id || x.field;
163
+ return hiddenColumns.indexOf(id) === -1;
164
+ }), true));
165
+ });
166
+ }
167
+ else if (this.displayedColumns) {
168
+ /* istanbul ignore next */
169
+ getValue(this.displayedColumns, (displayedColumns) => {
170
+ this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(columns.filter((x) => displayedColumns.indexOf(x.id || x.field) !== -1), true));
171
+ });
172
+ }
173
+ else {
174
+ this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(columns.filter((x) => !x.hidden), true));
175
+ }
176
+ });
177
+ this.currentSearchText = this.state.pipe(observableMap((s) => s.search.searchText), distinctUntilChanged(), takeUntil(this.ngUnsubscribe));
178
+ this.gridDispatcher.next(new ListViewGridColumnsLoadAction(columnModels, true));
179
+ this.handleColumnChange();
180
+ if (this.enableMultiselect) {
181
+ this.dispatcher.toolbarShowMultiselectToolbar(true);
182
+ }
183
+ this.initInlineDeleteMessages();
184
+ }
185
+ ngOnDestroy() {
186
+ this.ngUnsubscribe.next();
187
+ this.ngUnsubscribe.complete();
188
+ }
189
+ /**
190
+ * If user makes selection, tell list-builder to update the list state.
191
+ * This logic should only run on user interaction - NOT programmatic updates.
192
+ */
193
+ onMultiselectSelectionChange(event) {
194
+ if (event.source === SkyGridSelectedRowsSource.CheckboxChange ||
195
+ event.source === SkyGridSelectedRowsSource.RowClick) {
196
+ this.state
197
+ .pipe(observableMap((s) => s.items.items), take(1))
198
+ .subscribe((items) => {
199
+ const newItemIds = this.arrayIntersection(items.map((i) => i.id), this.multiselectSelectedIds);
200
+ const newIds = items.filter((i) => i.isSelected).map((i) => i.id);
201
+ // Check for deselected ids & send message to dispatcher.
202
+ const deselectedIds = this.arrayDiff(newItemIds, newIds);
203
+ if (deselectedIds.length > 0) {
204
+ this.dispatcher.setSelected(deselectedIds, false);
205
+ }
206
+ // Check for selected ids & send message to dispatcher.
207
+ const selectedIds = this.arrayDiff(newIds, newItemIds);
208
+ if (selectedIds.length > 0) {
209
+ this.dispatcher.setSelected(selectedIds, true);
210
+ }
211
+ });
212
+ }
213
+ }
214
+ columnIdsChanged(selectedColumnIds) {
215
+ this.selectedColumnIds.pipe(take(1)).subscribe((currentIds) => {
216
+ if (!this.arraysEqual(selectedColumnIds, currentIds)) {
217
+ this.gridState
218
+ .pipe(observableMap((s) => s.columns.items), take(1))
219
+ .subscribe((columns) => {
220
+ const displayedColumns = selectedColumnIds.map((columnId) => columns.filter((c) => c.id === columnId)[0]);
221
+ this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(displayedColumns, true));
222
+ });
223
+ }
224
+ });
225
+ }
226
+ cancelRowDelete(args) {
227
+ this.rowDeleteCancel.emit(args);
228
+ }
229
+ confirmRowDelete(args) {
230
+ this.rowDeleteConfirm.emit(args);
231
+ }
232
+ sortFieldChanged(sortField) {
233
+ this.dispatcher.sortSetFieldSelectors([sortField]);
234
+ }
235
+ onViewActive() {
236
+ /*
237
+ Ran into problem where state updates were consumed out of order. For example, on search text
238
+ update, the searchText update was consumed after the resulting list item update. Scanning the
239
+ previous value of items lastUpdate ensures that we only receive the latest items.
240
+ */
241
+ this.gridState
242
+ .pipe(takeUntil(this.ngUnsubscribe), scan((previousValue, newValue) => {
243
+ if (previousValue.displayedColumns.lastUpdate >
244
+ newValue.displayedColumns.lastUpdate) {
245
+ return previousValue;
246
+ }
247
+ else {
248
+ return newValue;
249
+ }
250
+ }), observableMap((s) => s.displayedColumns.items), distinctUntilChanged(this.arraysEqual))
251
+ .subscribe((displayedColumns) => {
252
+ const setFunctions = this.searchFunction !== undefined
253
+ ? [this.searchFunction]
254
+ : displayedColumns
255
+ .map((column) => (data, searchText) => column.searchFunction(getData(data, column.field), searchText))
256
+ .filter((c) => c !== undefined);
257
+ this.state.pipe(take(1)).subscribe((s) => {
258
+ this.dispatcher.searchSetOptions(new ListSearchModel({
259
+ searchText: s.search.searchText,
260
+ functions: setFunctions,
261
+ fieldSelectors: displayedColumns.map((d) => d.field),
262
+ }));
263
+ });
264
+ });
265
+ }
266
+ initInlineDeleteMessages() {
267
+ /* istanbul ignore next */
268
+ if (this.messageStream) {
269
+ this.messageStream.subscribe((message) => {
270
+ if (message.type === SkyListViewGridMessageType.AbortDeleteRow) {
271
+ this.gridMessageStream.next({
272
+ type: SkyGridMessageType.AbortDeleteRow,
273
+ data: {
274
+ abortDeleteRow: message.data.abortDeleteRow,
275
+ },
276
+ });
277
+ }
278
+ else if (message.type === SkyListViewGridMessageType.PromptDeleteRow) {
279
+ this.gridMessageStream.next({
280
+ type: SkyGridMessageType.PromptDeleteRow,
281
+ data: {
282
+ promptDeleteRow: message.data.promptDeleteRow,
283
+ },
284
+ });
285
+ }
286
+ });
287
+ }
288
+ }
289
+ handleColumnChange() {
290
+ // watch for changes in column components
291
+ this.columnComponents.changes
292
+ .pipe(takeUntil(this.ngUnsubscribe))
293
+ .subscribe((columnComponents) => {
294
+ const columnModels = this.columnComponents.map((column) => {
295
+ return new SkyGridColumnModel(column.template, column);
296
+ });
297
+ this.gridDispatcher.next(new ListViewGridColumnsLoadAction(columnModels, true));
298
+ });
299
+ // Watch for column heading changes:
300
+ this.columnComponents.forEach((comp) => {
301
+ comp.headingModelChanges
302
+ .pipe(takeUntil(this.ngUnsubscribe))
303
+ .subscribe((change) => {
304
+ this.gridComponent.updateColumnHeading(change);
305
+ });
306
+ comp.descriptionModelChanges
307
+ .pipe(takeUntil(this.ngUnsubscribe))
308
+ .subscribe((change) => {
309
+ this.gridComponent.updateColumnDescription(change);
310
+ });
311
+ });
312
+ }
313
+ getGridItems() {
314
+ /*
315
+ Same problem as above. We should move from having a state object observable with a bunch of
316
+ static properties to a static state object with observable properties that you can subscribe
317
+ to.
318
+ */
319
+ return this.state.pipe(observableMap((s) => {
320
+ return s.items;
321
+ }), scan((previousValue, newValue) => {
322
+ if (previousValue.lastUpdate > newValue.lastUpdate) {
323
+ return previousValue;
324
+ }
325
+ else {
326
+ return newValue;
327
+ }
328
+ }), observableMap((result) => {
329
+ return result.items;
330
+ }), distinctUntilChanged());
331
+ }
332
+ getSelectedIds() {
333
+ /*
334
+ Same problem as above. We should move from having a state object observable with a bunch of
335
+ static properties to a static state object with observable properties that you can subscribe
336
+ to.
337
+ */
338
+ return this.gridState.pipe(observableMap((s) => s.displayedColumns), scan((previousValue, newValue) => {
339
+ if (previousValue.lastUpdate > newValue.lastUpdate) {
340
+ return previousValue;
341
+ }
342
+ else {
343
+ return newValue;
344
+ }
345
+ }), observableMap((result) => {
346
+ /* istanbul ignore next */
347
+ /* sanity check */
348
+ return result.items.map((column) => {
349
+ return column.id || column.field;
350
+ });
351
+ }), distinctUntilChanged((previousValue, newValue) => {
352
+ return this.haveColumnIdsChanged(previousValue, newValue);
353
+ }));
354
+ }
355
+ haveColumnIdsChanged(previousValue, newValue) {
356
+ if (previousValue.length !== newValue.length) {
357
+ this.selectedColumnIdsChange.emit(newValue);
358
+ return false;
359
+ }
360
+ for (let i = 0; i < previousValue.length; i++) {
361
+ /* istanbul ignore if */
362
+ if (previousValue[i] !== newValue[i]) {
363
+ this.selectedColumnIdsChange.emit(newValue);
364
+ return false;
365
+ }
366
+ }
367
+ return true;
368
+ }
369
+ selectedMapEqual(prev, next) {
370
+ if (prev.selectedIdMap.size !== next.selectedIdMap.size) {
371
+ return false;
372
+ }
373
+ const keys = [];
374
+ next.selectedIdMap.forEach((value, key) => {
375
+ keys.push(key);
376
+ });
377
+ for (let i = 0; i < keys.length; i++) {
378
+ const key = keys[i];
379
+ const value = next.selectedIdMap.get(key);
380
+ if (value !== prev.selectedIdMap.get(key)) {
381
+ return false;
382
+ }
383
+ }
384
+ return true;
385
+ }
386
+ arrayDiff(arrA, arrB) {
387
+ return arrA.filter((i) => arrB.indexOf(i) < 0);
388
+ }
389
+ arrayIntersection(arrA, arrB) {
390
+ return arrA.filter((value) => -1 !== arrB.indexOf(value));
391
+ }
392
+ arraysEqual(arrayA, arrayB) {
393
+ return (arrayA.length === arrayB.length &&
394
+ arrayA.every((value, index) => value === arrayB[index]));
395
+ }
396
+ }
397
+ SkyListViewGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridComponent, deps: [{ token: i1.ListState }, { token: i1.ListStateDispatcher }, { token: i2.GridState }, { token: i3.GridStateDispatcher }], target: i0.ɵɵFactoryTarget.Component });
398
+ SkyListViewGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyListViewGridComponent, selector: "sky-list-view-grid", inputs: { name: "name", displayedColumns: "displayedColumns", hiddenColumns: "hiddenColumns", fit: "fit", width: "width", height: "height", highlightSearchText: "highlightSearchText", messageStream: "messageStream", rowHighlightedId: "rowHighlightedId", enableMultiselect: "enableMultiselect", settingsKey: "settingsKey", searchFunction: ["search", "searchFunction"] }, outputs: { rowDeleteCancel: "rowDeleteCancel", rowDeleteConfirm: "rowDeleteConfirm", selectedColumnIdsChange: "selectedColumnIdsChange" }, providers: [
399
+ /* tslint:disable */
400
+ {
401
+ provide: ListViewComponent,
402
+ useExisting: forwardRef(() => SkyListViewGridComponent),
403
+ },
404
+ /* tslint:enable */
405
+ GridState,
406
+ GridStateDispatcher,
407
+ GridStateModel,
408
+ ], queries: [{ propertyName: "columnComponents", predicate: SkyGridColumnComponent }], viewQueries: [{ propertyName: "gridComponent", first: true, predicate: SkyGridComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"active | async\">\n <sky-grid\n [columns]=\"columns | async\"\n [data]=\"items | async\"\n [enableMultiselect]=\"enableMultiselect\"\n [fit]=\"fit\"\n [height]=\"gridHeight | async\"\n [highlightText]=\"\n highlightSearchText ? (currentSearchText | async) : undefined\n \"\n [rowHighlightedId]=\"rowHighlightedId\"\n [messageStream]=\"gridMessageStream\"\n [selectedColumnIds]=\"selectedColumnIds | async\"\n [selectedRowIds]=\"multiselectSelectedIds\"\n [settingsKey]=\"settingsKey\"\n [sortField]=\"sortField | async\"\n [width]=\"gridWidth | async\"\n (multiselectSelectionChange)=\"onMultiselectSelectionChange($event)\"\n (rowDeleteCancel)=\"cancelRowDelete($event)\"\n (rowDeleteConfirm)=\"confirmRowDelete($event)\"\n (selectedColumnIdsChange)=\"columnIdsChanged($event)\"\n (sortFieldChange)=\"sortFieldChanged($event)\"\n #skyGrid\n >\n </sky-grid>\n <sky-wait [isWaiting]=\"loading | async\"> </sky-wait>\n</div>\n", styles: [":host ::ng-deep .sky-grid-heading{border-top:0!important}\n"], components: [{ type: i4.SkyGridComponent, selector: "sky-grid", inputs: ["columns", "data", "enableMultiselect", "fit", "hasToolbar", "height", "highlightText", "messageStream", "multiselectRowId", "rowHighlightedId", "selectedColumnIds", "selectedRowIds", "settingsKey", "sortField", "width"], outputs: ["columnWidthChange", "multiselectSelectionChange", "rowDeleteCancel", "rowDeleteConfirm", "selectedColumnIdsChange", "sortFieldChange"] }, { type: i5.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i6.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridComponent, decorators: [{
410
+ type: Component,
411
+ args: [{ selector: 'sky-list-view-grid', providers: [
412
+ /* tslint:disable */
413
+ {
414
+ provide: ListViewComponent,
415
+ useExisting: forwardRef(() => SkyListViewGridComponent),
416
+ },
417
+ /* tslint:enable */
418
+ GridState,
419
+ GridStateDispatcher,
420
+ GridStateModel,
421
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"active | async\">\n <sky-grid\n [columns]=\"columns | async\"\n [data]=\"items | async\"\n [enableMultiselect]=\"enableMultiselect\"\n [fit]=\"fit\"\n [height]=\"gridHeight | async\"\n [highlightText]=\"\n highlightSearchText ? (currentSearchText | async) : undefined\n \"\n [rowHighlightedId]=\"rowHighlightedId\"\n [messageStream]=\"gridMessageStream\"\n [selectedColumnIds]=\"selectedColumnIds | async\"\n [selectedRowIds]=\"multiselectSelectedIds\"\n [settingsKey]=\"settingsKey\"\n [sortField]=\"sortField | async\"\n [width]=\"gridWidth | async\"\n (multiselectSelectionChange)=\"onMultiselectSelectionChange($event)\"\n (rowDeleteCancel)=\"cancelRowDelete($event)\"\n (rowDeleteConfirm)=\"confirmRowDelete($event)\"\n (selectedColumnIdsChange)=\"columnIdsChanged($event)\"\n (sortFieldChange)=\"sortFieldChanged($event)\"\n #skyGrid\n >\n </sky-grid>\n <sky-wait [isWaiting]=\"loading | async\"> </sky-wait>\n</div>\n", styles: [":host ::ng-deep .sky-grid-heading{border-top:0!important}\n"] }]
422
+ }], ctorParameters: function () { return [{ type: i1.ListState }, { type: i1.ListStateDispatcher }, { type: i2.GridState }, { type: i3.GridStateDispatcher }]; }, propDecorators: { name: [{
423
+ type: Input
424
+ }], displayedColumns: [{
425
+ type: Input
426
+ }], hiddenColumns: [{
427
+ type: Input
428
+ }], fit: [{
429
+ type: Input
430
+ }], width: [{
431
+ type: Input
432
+ }], height: [{
433
+ type: Input
434
+ }], highlightSearchText: [{
435
+ type: Input
436
+ }], messageStream: [{
437
+ type: Input
438
+ }], rowHighlightedId: [{
439
+ type: Input
440
+ }], enableMultiselect: [{
441
+ type: Input
442
+ }], settingsKey: [{
443
+ type: Input
444
+ }], rowDeleteCancel: [{
445
+ type: Output
446
+ }], rowDeleteConfirm: [{
447
+ type: Output
448
+ }], selectedColumnIdsChange: [{
449
+ type: Output
450
+ }], gridComponent: [{
451
+ type: ViewChild,
452
+ args: [SkyGridComponent]
453
+ }], searchFunction: [{
454
+ type: Input,
455
+ args: ['search']
456
+ }], columnComponents: [{
457
+ type: ContentChildren,
458
+ args: [SkyGridColumnComponent]
459
+ }] } });
460
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3QtYnVpbGRlci12aWV3LWdyaWRzL3NyYy9saWIvbW9kdWxlcy9saXN0LXZpZXctZ3JpZC9saXN0LXZpZXctZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbGlzdC1idWlsZGVyLXZpZXctZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2xpc3Qtdmlldy1ncmlkL2xpc3Qtdmlldy1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEVBR3RCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFFaEIsa0JBQWtCLEVBRWxCLHlCQUF5QixHQUMxQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQ0wsZUFBZSxFQUVmLFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFhLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFHTCxPQUFPLEVBQ1AsWUFBWSxHQUNiLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsR0FBRyxJQUFJLGFBQWEsRUFDcEIsSUFBSSxFQUNKLElBQUksRUFDSixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTFELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7OztBQUlqRjs7Ozs7R0FLRztBQWtCSCxNQUFNLE9BQU8sd0JBQ1gsU0FBUSxpQkFBaUI7SUE2S3pCLFlBQ0UsS0FBZ0IsRUFDUixVQUErQixFQUNoQyxTQUFvQixFQUNwQixjQUFtQztRQUUxQyxLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBSmxCLGVBQVUsR0FBVixVQUFVLENBQXFCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsbUJBQWMsR0FBZCxjQUFjLENBQXFCO1FBeko1Qzs7Ozs7V0FLRztRQUVJLFFBQUcsR0FBRyxPQUFPLENBQUM7UUFjckI7OztXQUdHO1FBRUksd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBK0JsQzs7Ozs7O1dBTUc7UUFFSSxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFXakM7O1dBRUc7UUFFSSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFzQyxDQUFDO1FBRWhGOztXQUVHO1FBRUkscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFFbEY7Ozs7V0FJRztRQUVJLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBeUJuRTs7O1dBR0c7UUFDSSxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQztRQVFsRCwyQkFBc0IsR0FBYSxFQUFFLENBQUM7UUFjckMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlCLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7SUFTL0QsQ0FBQztJQWpMRDs7O09BR0c7SUFDSCxJQUNXLElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUEwQ0Q7OztPQUdHO0lBQ0gsSUFDVyxhQUFhLENBQUMsTUFBdUM7UUFDOUQsMEJBQTBCO1FBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFFN0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQXFERCxJQUFXLFVBQVU7UUFDbkIsMEJBQTBCO1FBQzFCLE9BQU8sT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVE7WUFDcEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsMEJBQTBCO1FBQzFCLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUErQ00sa0JBQWtCO1FBQ3ZCLHNGQUFzRjtRQUN0RixJQUFJLENBQUMsS0FBSzthQUNQLElBQUksQ0FDSCxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ3JDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQzdCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUM1QzthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUN0QyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7WUFFakMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUN4QyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVMLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNERBQTRELENBQzdELENBQUM7U0FDSDtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNqRSxPQUFPLElBQUksa0JBQWtCLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekM7UUFFRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDaEMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUNyQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3RDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQzlCLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRS9DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRWpDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzVCLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDekIsQ0FBQyxDQUFDLEVBQ0Ysb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FDOUIsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzlCLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xCLDBCQUEwQjtZQUMxQixrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNuQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pDO1lBQ0QsMEJBQTBCO1lBQzFCLGtCQUFrQjtZQUNsQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsRUFDRixvQkFBb0IsRUFBRSxFQUN0QixTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUM5QixDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVM7YUFDWCxJQUFJLENBQ0gsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUNyQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUM3QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ3ZDO2FBQ0EsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDckIsMEJBQTBCO1lBQzFCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxhQUF1QixFQUFFLEVBQUU7b0JBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN0QixJQUFJLHNDQUFzQyxDQUN4QyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ25CLDBCQUEwQjt3QkFDMUIsa0JBQWtCO3dCQUNsQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQzNCLE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDMUMsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUNMLENBQ0YsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNoQywwQkFBMEI7Z0JBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBMEIsRUFBRSxFQUFFO29CQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSxzQ0FBc0MsQ0FDeEMsT0FBTyxDQUFDLE1BQU0sQ0FDWixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUN4RCxFQUNELElBQUksQ0FDTCxDQUNGLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSxzQ0FBc0MsQ0FDeEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQ2hDLElBQUksQ0FDTCxDQUNGLENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUN0QyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQ3pDLG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQzlCLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQ3RELENBQUM7UUFFRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSw0QkFBNEIsQ0FDakMsS0FBcUM7UUFFckMsSUFDRSxLQUFLLENBQUMsTUFBTSxLQUFLLHlCQUF5QixDQUFDLGNBQWM7WUFDekQsS0FBSyxDQUFDLE1BQU0sS0FBSyx5QkFBeUIsQ0FBQyxRQUFRLEVBQ25EO1lBQ0EsSUFBSSxDQUFDLEtBQUs7aUJBQ1AsSUFBSSxDQUNILGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDbkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUN2QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FDNUIsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRWxFLHlEQUF5RDtnQkFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDbkQ7Z0JBRUQsdURBQXVEO2dCQUN2RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNoRDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsaUJBQWdDO1FBQ3RELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxTQUFTO3FCQUNYLElBQUksQ0FDSCxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDUjtxQkFDQSxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDckIsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQzVDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxRCxDQUFDO29CQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN0QixJQUFJLHNDQUFzQyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUNuRSxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxlQUFlLENBQUMsSUFBd0M7UUFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLElBQXlDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFNBQXFDO1FBQzNELElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxZQUFZO1FBQ2pCOzs7O1VBSUU7UUFDRixJQUFJLENBQUMsU0FBUzthQUNYLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUM3QixJQUFJLENBQUMsQ0FBQyxhQUE2QixFQUFFLFFBQXdCLEVBQUUsRUFBRTtZQUMvRCxJQUNFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO2dCQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUNwQztnQkFDQSxPQUFPLGFBQWEsQ0FBQzthQUN0QjtpQkFBTTtnQkFDTCxPQUFPLFFBQVEsQ0FBQzthQUNqQjtRQUNILENBQUMsQ0FBQyxFQUNGLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUM5QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ3ZDO2FBQ0EsU0FBUyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUM5QixNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTO2dCQUMvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUN2QixDQUFDLENBQUMsZ0JBQWdCO3FCQUNiLEdBQUcsQ0FDRixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFTLEVBQUUsVUFBa0IsRUFBRSxFQUFFLENBQzVDLE1BQU0sQ0FBQyxjQUFjLENBQ25CLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUMzQixVQUFVLENBQ1gsQ0FDSjtxQkFDQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUV4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FDOUIsSUFBSSxlQUFlLENBQUM7b0JBQ2xCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVU7b0JBQy9CLFNBQVMsRUFBRSxZQUFZO29CQUN2QixjQUFjLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNyRCxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUErQixFQUFFLEVBQUU7Z0JBQy9ELElBQUksT0FBTyxDQUFDLElBQUksS0FBSywwQkFBMEIsQ0FBQyxjQUFjLEVBQUU7b0JBQzlELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7d0JBQzFCLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxjQUFjO3dCQUN2QyxJQUFJLEVBQUU7NEJBQ0osY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYzt5QkFDNUM7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNLElBQ0wsT0FBTyxDQUFDLElBQUksS0FBSywwQkFBMEIsQ0FBQyxlQUFlLEVBQzNEO29CQUNBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7d0JBQzFCLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxlQUFlO3dCQUN4QyxJQUFJLEVBQUU7NEJBQ0osZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZTt5QkFDOUM7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPO2FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN4RCxPQUFPLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN0QixJQUFJLDZCQUE2QixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FDdEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUwsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsbUJBQW1CO2lCQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDbkMsU0FBUyxDQUFDLENBQUMsTUFBdUMsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLHVCQUF1QjtpQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ25DLFNBQVMsQ0FBQyxDQUFDLE1BQTJDLEVBQUUsRUFBRTtnQkFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFlBQVk7UUFDbEI7Ozs7VUFJRTtRQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ3BCLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsRUFDRixJQUFJLENBQ0YsQ0FDRSxhQUF1QyxFQUN2QyxRQUFrQyxFQUNsQyxFQUFFO1lBQ0YsSUFBSSxhQUFhLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xELE9BQU8sYUFBYSxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNMLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1FBQ0gsQ0FBQyxDQUNGLEVBQ0QsYUFBYSxDQUFDLENBQUMsTUFBZ0MsRUFBRSxFQUFFO1lBQ2pELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsRUFDRixvQkFBb0IsRUFBRSxDQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWM7UUFDcEI7Ozs7VUFJRTtRQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3hCLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQ3hDLElBQUksQ0FDRixDQUNFLGFBQTRDLEVBQzVDLFFBQXVDLEVBQ3ZDLEVBQUU7WUFDRixJQUFJLGFBQWEsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDbEQsT0FBTyxhQUFhLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsT0FBTyxRQUFRLENBQUM7YUFDakI7UUFDSCxDQUFDLENBQ0YsRUFDRCxhQUFhLENBQUMsQ0FBQyxNQUFxQyxFQUFFLEVBQUU7WUFDdEQsMEJBQTBCO1lBQzFCLGtCQUFrQjtZQUNsQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBMEIsRUFBRSxFQUFFO2dCQUNyRCxPQUFPLE1BQU0sQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxFQUNGLG9CQUFvQixDQUFDLENBQUMsYUFBdUIsRUFBRSxRQUFrQixFQUFFLEVBQUU7WUFDbkUsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sb0JBQW9CLENBQUMsYUFBdUIsRUFBRSxRQUFrQjtRQUN0RSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUM1QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3Qyx3QkFBd0I7WUFDeEIsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsSUFBdUIsRUFDdkIsSUFBdUI7UUFFdkIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtZQUN2RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3pDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFnQixFQUFFLElBQWdCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBZ0IsRUFBRSxJQUFnQjtRQUMxRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQWEsRUFBRSxNQUFhO1FBQzlDLE9BQU8sQ0FDTCxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDOztxSEFubUJVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDBpQkFieEI7UUFDVCxvQkFBb0I7UUFDcEI7WUFDRSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7U0FDeEQ7UUFDRCxtQkFBbUI7UUFDbkIsU0FBUztRQUNULG1CQUFtQjtRQUNuQixjQUFjO0tBQ2YsMkRBMEtnQixzQkFBc0IsNEVBOUM1QixnQkFBZ0IsdUVDMU03QixnL0JBMkJBOzJGRHNEYSx3QkFBd0I7a0JBakJwQyxTQUFTOytCQUNFLG9CQUFvQixhQUduQjt3QkFDVCxvQkFBb0I7d0JBQ3BCOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDO3lCQUN4RDt3QkFDRCxtQkFBbUI7d0JBQ25CLFNBQVM7d0JBQ1QsbUJBQW1CO3dCQUNuQixjQUFjO3FCQUNmLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzRMQVdwQyxJQUFJO3NCQURkLEtBQUs7Z0JBU0MsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUs7Z0JBVUMsR0FBRztzQkFEVCxLQUFLO2dCQU9DLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxNQUFNO3NCQURaLEtBQUs7Z0JBUUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQVFLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBdUJDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFXQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBVUMsV0FBVztzQkFEakIsS0FBSztnQkFPQyxlQUFlO3NCQURyQixNQUFNO2dCQU9BLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFTQSx1QkFBdUI7c0JBRDdCLE1BQU07Z0JBSUEsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBNENwQixjQUFjO3NCQURwQixLQUFLO3VCQUFDLFFBQVE7Z0JBSVAsZ0JBQWdCO3NCQUR2QixlQUFlO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUdyaWRDb2x1bW5Db21wb25lbnQsXG4gIFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlLFxuICBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlLFxuICBTa3lHcmlkQ29sdW1uTW9kZWwsXG4gIFNreUdyaWRDb21wb25lbnQsXG4gIFNreUdyaWRNZXNzYWdlLFxuICBTa3lHcmlkTWVzc2FnZVR5cGUsXG4gIFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZSxcbiAgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSxcbn0gZnJvbSAnQHNreXV4L2dyaWRzJztcbmltcG9ydCB7XG4gIExpc3RTZWFyY2hNb2RlbCxcbiAgTGlzdFNlbGVjdGVkTW9kZWwsXG4gIExpc3RTdGF0ZSxcbiAgTGlzdFN0YXRlRGlzcGF0Y2hlcixcbiAgTGlzdFZpZXdDb21wb25lbnQsXG59IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXInO1xuaW1wb3J0IHsgQXN5bmNMaXN0LCBnZXRWYWx1ZSB9IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXItY29tbW9uJztcbmltcG9ydCB7XG4gIExpc3RJdGVtTW9kZWwsXG4gIExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsLFxuICBnZXREYXRhLFxuICBpc09ic2VydmFibGUsXG59IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXItY29tbW9uJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwIGFzIG9ic2VydmFibGVNYXAsXG4gIHNjYW4sXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbiB9IGZyb20gJy4vc3RhdGUvY29sdW1ucy9sb2FkLmFjdGlvbic7XG5pbXBvcnQgeyBMaXN0Vmlld0Rpc3BsYXllZEdyaWRDb2x1bW5zTG9hZEFjdGlvbiB9IGZyb20gJy4vc3RhdGUvZGlzcGxheWVkLWNvbHVtbnMvbG9hZC5hY3Rpb24nO1xuaW1wb3J0IHsgR3JpZFN0YXRlTW9kZWwgfSBmcm9tICcuL3N0YXRlL2dyaWQtc3RhdGUubW9kZWwnO1xuaW1wb3J0IHsgR3JpZFN0YXRlRGlzcGF0Y2hlciB9IGZyb20gJy4vc3RhdGUvZ3JpZC1zdGF0ZS5yeHN0YXRlJztcbmltcG9ydCB7IEdyaWRTdGF0ZSB9IGZyb20gJy4vc3RhdGUvZ3JpZC1zdGF0ZS5zdGF0ZS1ub2RlJztcbmltcG9ydCB7IFNreUxpc3RWaWV3R3JpZE1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzL2xpc3Qtdmlldy1ncmlkLW1lc3NhZ2UnO1xuaW1wb3J0IHsgU2t5TGlzdFZpZXdHcmlkTWVzc2FnZVR5cGUgfSBmcm9tICcuL3R5cGVzL2xpc3Qtdmlldy1ncmlkLW1lc3NhZ2UtdHlwZSc7XG5pbXBvcnQgeyBTa3lMaXN0Vmlld0dyaWRSb3dEZWxldGVDYW5jZWxBcmdzIH0gZnJvbSAnLi90eXBlcy9saXN0LXZpZXctZ3JpZC1yb3ctZGVsZXRlLWNhbmNlbC1hcmdzJztcbmltcG9ydCB7IFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzIH0gZnJvbSAnLi90eXBlcy9saXN0LXZpZXctZ3JpZC1yb3ctZGVsZXRlLWNvbmZpcm0tYXJncyc7XG5cbi8qKlxuICogRGlzcGxheXMgYSBncmlkIGZvciBhXG4gKiBbU0tZIFVYLXRoZW1lZCBsaXN0IG9mIGRhdGFdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9saXN0L292ZXJ2aWV3KVxuICogdXNpbmcgdGhlIFtncmlkIGNvbXBvbmVudF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2dyaWQpLlxuICogWW91IG11c3QgaW5zdGFsbCBgU2t5TGlzdE1vZHVsZWAgYXMgYSBkZXBlbmRlbmN5LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktbGlzdC12aWV3LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC12aWV3LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXctZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IExpc3RWaWV3Q29tcG9uZW50LFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5TGlzdFZpZXdHcmlkQ29tcG9uZW50KSxcbiAgICB9LFxuICAgIC8qIHRzbGludDplbmFibGUgKi9cbiAgICBHcmlkU3RhdGUsXG4gICAgR3JpZFN0YXRlRGlzcGF0Y2hlcixcbiAgICBHcmlkU3RhdGVNb2RlbCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUxpc3RWaWV3R3JpZENvbXBvbmVudFxuICBleHRlbmRzIExpc3RWaWV3Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHZpZXcuXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZpZXdOYW1lID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgYnkgZGVmYXVsdCBiYXNlZCBvbiB0aGUgSUQgb3IgZmllbGQgb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzcGxheWVkQ29sdW1uczogQXJyYXk8c3RyaW5nPiB8IE9ic2VydmFibGU8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29sdW1ucyB0byBoaWRlIGJ5IGRlZmF1bHQgYmFzZWQgb24gdGhlIElEIG9yIGZpZWxkIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpZGRlbkNvbHVtbnM6IEFycmF5PHN0cmluZz4gfCBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBncmlkIGZpdHMgdG8gaXRzIHBhcmVudC4gYFwid2lkdGhcImAgZml0cyB0aGUgZ3JpZCB0byB0aGUgcGFyZW50J3MgZnVsbFxuICAgKiB3aWR0aCwgYW5kIGBcInNjcm9sbFwiYCBhbGxvd3MgdGhlIGdyaWQgdG8gZXhjZWVkIHRoZSBwYXJlbnQncyB3aWR0aC4gSWYgdGhlIGdyaWQgZG9lcyBub3QgaGF2ZVxuICAgKiBlbm91Z2ggY29sdW1ucyB0byBmaWxsIHRoZSBwYXJlbnQncyB3aWR0aCwgaXQgYWx3YXlzIHN0cmV0Y2hlcyB0byB0aGUgcGFyZW50J3MgZnVsbCB3aWR0aC5cbiAgICogQGRlZmF1bHQgXCJ3aWR0aFwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZml0ID0gJ3dpZHRoJztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyIHwgT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoZWlnaHQ6IG51bWJlciB8IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gaGlnaGxpZ2h0IHNlYXJjaCB0ZXh0IHdpdGhpbiB0aGUgZ3JpZC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpZ2hsaWdodFNlYXJjaFRleHQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBvYnNlcnZhYmxlIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIGdyaWQuXG4gICAqIFRoZSBjb21tYW5kcyBzaG91bGQgcmVzcGVjdCB0aGUgYFNreUxpc3RWaWV3R3JpZE1lc3NhZ2VgIHR5cGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1lc3NhZ2VTdHJlYW0oc3RyZWFtOiBTdWJqZWN0PFNreUxpc3RWaWV3R3JpZE1lc3NhZ2U+KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5fbWVzc2FnZVN0cmVhbSkge1xuICAgICAgdGhpcy5fbWVzc2FnZVN0cmVhbS51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX21lc3NhZ2VTdHJlYW0gPSBzdHJlYW07XG5cbiAgICB0aGlzLmluaXRJbmxpbmVEZWxldGVNZXNzYWdlcygpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5TGlzdFZpZXdHcmlkTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgSUQgb2YgdGhlIHJvdyB0byBoaWdobGlnaHQuIFRoZSBJRCBtYXRjaGVzIHRoZSBgaWRgIHByb3BlcnR5IG9mXG4gICAqIHRoZSBgZGF0YWAgb2JqZWN0LiBUeXBpY2FsbHksIHRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICAgKiBbZmx5b3V0IGNvbXBvbmVudF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2ZseW91dCkgdG9cbiAgICogaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3cuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcm93SGlnaGxpZ2h0ZWRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBlbmFibGUgdGhlIG11bHRpc2VsZWN0IGZlYXR1cmUgdG8gZGlzcGxheSBhIGNvbHVtbiBvZiBjaGVja2JveGVzXG4gICAqIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdyaWQuIE11bHRpc2VsZWN0IGFsc28gZGlzcGxheXMgYW4gYWN0aW9uIGJhciB3aXRoIGJ1dHRvbnMgdG9cbiAgICogc2VsZWN0IGFuZCBjbGVhciBhbGwgY2hlY2tib3hlcy4gTXVsdGlzZWxlY3QgZGVmYXVsdHMgdG8gdGhlIGBpZGAgcHJvcGVydHkgb24gdGhlIGxpc3Qnc1xuICAgKiBgZGF0YWAgb2JqZWN0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVuYWJsZU11bHRpc2VsZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHVuaXF1ZSBrZXkgZm9yIHRoZSBVSSBDb25maWcgU2VydmljZSB0byByZXRyaWV2ZSBzdG9yZWQgc2V0dGluZ3MgZnJvbVxuICAgKiBhIGRhdGFiYXNlLiBUaGUgc2VydmljZSBzYXZlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB1c2VycyBhbmQgcmV0dXJucyBgc2VsZWN0ZWRDb2x1bW5JZHNgXG4gICAqIGZvciB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGFuZCB0aGUgcHJlZmVycmVkIGNvbHVtbiBvcmRlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGVcbiAgICogW3N0aWNreSBzZXR0aW5ncyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2dldC1zdGFydGVkL2FkdmFuY2VkL3N0aWNreS1zZXR0aW5ncykuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0dGluZ3NLZXk6IHN0cmluZztcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjYW5jZWwgdGhlIGRlbGV0aW9uIG9mIGEgcm93LlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByb3dEZWxldGVDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgY29uZmlybSB0aGUgZGVsZXRpb24gb2YgYSByb3cuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGNvbHVtbnMgY2hhbmdlLiBUaGlzIGluY2x1ZGVzIGNoYW5nZXMgdG8gdGhlIGRpc3BsYXllZCBjb2x1bW5zIGFuZCBjaGFuZ2VzXG4gICAqIHRvIHRoZSBvcmRlciBvZiBjb2x1bW5zLiBUaGUgZXZlbnQgZW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgZGlzcGxheWVkIGNvbHVtbnMgdGhhdFxuICAgKiByZWZsZWN0cyB0aGUgY29sdW1uIG9yZGVyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZENvbHVtbklkc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8c3RyaW5nPj4oKTtcblxuICBAVmlld0NoaWxkKFNreUdyaWRDb21wb25lbnQpXG4gIHB1YmxpYyBncmlkQ29tcG9uZW50OiBTa3lHcmlkQ29tcG9uZW50O1xuXG4gIHB1YmxpYyBnZXQgZ3JpZEhlaWdodCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmhlaWdodCA9PT0gJ251bWJlcidcbiAgICAgID8gb2JzZXJ2YWJsZU9mKHRoaXMuaGVpZ2h0KVxuICAgICAgOiB0aGlzLmhlaWdodDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ3JpZFdpZHRoKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdHlwZW9mIHRoaXMud2lkdGggPT09ICdudW1iZXInXG4gICAgICA/IG9ic2VydmFibGVPZih0aGlzLndpZHRoKVxuICAgICAgOiB0aGlzLndpZHRoO1xuICB9XG5cbiAgcHVibGljIGNvbHVtbnM6IE9ic2VydmFibGU8QXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPj47XG5cbiAgcHVibGljIHNlbGVjdGVkQ29sdW1uSWRzOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xuXG4gIHB1YmxpYyBpdGVtczogT2JzZXJ2YWJsZTxMaXN0SXRlbU1vZGVsW10+O1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIHN0cmVhbSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBpbnRlcm5hbCBncmlkIGluc3RhbmNlXG4gICAqIEBpbnRlcmFsXG4gICAqL1xuICBwdWJsaWMgZ3JpZE1lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lHcmlkTWVzc2FnZT4oKTtcblxuICBwdWJsaWMgbG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwdWJsaWMgc29ydEZpZWxkOiBPYnNlcnZhYmxlPExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPjtcblxuICBwdWJsaWMgY3VycmVudFNlYXJjaFRleHQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBwdWJsaWMgbXVsdGlzZWxlY3RTZWxlY3RlZElkczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgc2VhcmNoIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIHRoZSB2aWV3IGRhdGEuXG4gICAqIEBwYXJhbSBkYXRhIFNwZWNpZmllcyB0aGUgZGF0YSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSBzZWFyY2hUZXh0IFNwZWNpZmllcyBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ3NlYXJjaCcpXG4gIHB1YmxpYyBzZWFyY2hGdW5jdGlvbjogKGRhdGE6IGFueSwgc2VhcmNoVGV4dDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5R3JpZENvbHVtbkNvbXBvbmVudClcbiAgcHJpdmF0ZSBjb2x1bW5Db21wb25lbnRzOiBRdWVyeUxpc3Q8U2t5R3JpZENvbHVtbkNvbXBvbmVudD47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIF9tZXNzYWdlU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5TGlzdFZpZXdHcmlkTWVzc2FnZT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGF0ZTogTGlzdFN0YXRlLFxuICAgIHByaXZhdGUgZGlzcGF0Y2hlcjogTGlzdFN0YXRlRGlzcGF0Y2hlcixcbiAgICBwdWJsaWMgZ3JpZFN0YXRlOiBHcmlkU3RhdGUsXG4gICAgcHVibGljIGdyaWREaXNwYXRjaGVyOiBHcmlkU3RhdGVEaXNwYXRjaGVyXG4gICkge1xuICAgIHN1cGVyKHN0YXRlLCAnR3JpZCBWaWV3Jyk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIC8vIFdhdGNoIGZvciBzZWxlY3Rpb24gY2hhbmdlcyBhbmQgdXBkYXRlIG11bHRpc2VsZWN0U2VsZWN0ZWRJZHMgZm9yIGxvY2FsIGNvbXBhcmlzb24uXG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuc2VsZWN0ZWQuaXRlbSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCh0aGlzLnNlbGVjdGVkTWFwRXF1YWwpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChpdGVtczogTGlzdFNlbGVjdGVkTW9kZWwpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaXRlbXMuc2VsZWN0ZWRJZE1hcC5mb3JFYWNoKChpc1NlbGVjdGVkLCBpZCkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtcy5zZWxlY3RlZElkTWFwLmdldChpZCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkSWRzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdGVkSWRzID0gc2VsZWN0ZWRJZHM7XG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dyaWQgdmlldyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgc2t5LWdyaWQtY29sdW1uIHRvIHJlbmRlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbk1vZGVscyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoKGNvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uQ29tcG9uZW50LnRlbXBsYXRlLCBjb2x1bW5Db21wb25lbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMud2lkdGggJiYgIWlzT2JzZXJ2YWJsZSh0aGlzLndpZHRoKSkge1xuICAgICAgdGhpcy53aWR0aCA9IG9ic2VydmFibGVPZih0aGlzLndpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZWlnaHQgJiYgIWlzT2JzZXJ2YWJsZSh0aGlzLmhlaWdodCkpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gb2JzZXJ2YWJsZU9mKHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBPYnNlcnZhYmxlcyBmb3IgdGVtcGxhdGVcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmdyaWRTdGF0ZS5waXBlKFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4gcy5jb2x1bW5zLml0ZW1zKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKHRoaXMuYXJyYXlzRXF1YWwpLFxuICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSlcbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbklkcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKTtcblxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmdldEdyaWRJdGVtcygpO1xuXG4gICAgdGhpcy5sb2FkaW5nID0gdGhpcy5zdGF0ZS5waXBlKFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4ge1xuICAgICAgICByZXR1cm4gcy5pdGVtcy5sb2FkaW5nO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSlcbiAgICApO1xuXG4gICAgdGhpcy5zb3J0RmllbGQgPSB0aGlzLnN0YXRlLnBpcGUoXG4gICAgICBvYnNlcnZhYmxlTWFwKChzKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICBpZiAocy5zb3J0ICYmIHMuc29ydC5maWVsZFNlbGVjdG9ycykge1xuICAgICAgICAgIHJldHVybiBzLnNvcnQuZmllbGRTZWxlY3RvcnNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKVxuICAgICk7XG5cbiAgICB0aGlzLmdyaWRTdGF0ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuY29sdW1ucy5pdGVtcyksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCh0aGlzLmFycmF5c0VxdWFsKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY29sdW1ucykgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5oaWRkZW5Db2x1bW5zKSB7XG4gICAgICAgICAgZ2V0VmFsdWUodGhpcy5oaWRkZW5Db2x1bW5zLCAoaGlkZGVuQ29sdW1uczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERpc3BhdGNoZXIubmV4dChcbiAgICAgICAgICAgICAgbmV3IExpc3RWaWV3RGlzcGxheWVkR3JpZENvbHVtbnNMb2FkQWN0aW9uKFxuICAgICAgICAgICAgICAgIGNvbHVtbnMuZmlsdGVyKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHguaWQgfHwgeC5maWVsZDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBoaWRkZW5Db2x1bW5zLmluZGV4T2YoaWQpID09PSAtMTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBnZXRWYWx1ZSh0aGlzLmRpc3BsYXllZENvbHVtbnMsIChkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmlkRGlzcGF0Y2hlci5uZXh0KFxuICAgICAgICAgICAgICBuZXcgTGlzdFZpZXdEaXNwbGF5ZWRHcmlkQ29sdW1uc0xvYWRBY3Rpb24oXG4gICAgICAgICAgICAgICAgY29sdW1ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAoeCkgPT4gZGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKHguaWQgfHwgeC5maWVsZCkgIT09IC0xXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGF0Y2hlci5uZXh0KFxuICAgICAgICAgICAgbmV3IExpc3RWaWV3RGlzcGxheWVkR3JpZENvbHVtbnNMb2FkQWN0aW9uKFxuICAgICAgICAgICAgICBjb2x1bW5zLmZpbHRlcigoeCkgPT4gIXguaGlkZGVuKSxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50U2VhcmNoVGV4dCA9IHRoaXMuc3RhdGUucGlwZShcbiAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuc2VhcmNoLnNlYXJjaFRleHQpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpXG4gICAgKTtcblxuICAgIHRoaXMuZ3JpZERpc3BhdGNoZXIubmV4dChcbiAgICAgIG5ldyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbihjb2x1bW5Nb2RlbHMsIHRydWUpXG4gICAgKTtcblxuICAgIHRoaXMuaGFuZGxlQ29sdW1uQ2hhbmdlKCk7XG5cbiAgICBpZiAodGhpcy5lbmFibGVNdWx0aXNlbGVjdCkge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnRvb2xiYXJTaG93TXVsdGlzZWxlY3RUb29sYmFyKHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdElubGluZURlbGV0ZU1lc3NhZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB1c2VyIG1ha2VzIHNlbGVjdGlvbiwgdGVsbCBsaXN0LWJ1aWxkZXIgdG8gdXBkYXRlIHRoZSBsaXN0IHN0YXRlLlxuICAgKiBUaGlzIGxvZ2ljIHNob3VsZCBvbmx5IHJ1biBvbiB1c2VyIGludGVyYWN0aW9uIC0gTk9UIHByb2dyYW1tYXRpYyB1cGRhdGVzLlxuICAgKi9cbiAgcHVibGljIG9uTXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UoXG4gICAgZXZlbnQ6IFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZVxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5zb3VyY2UgPT09IFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2hlY2tib3hDaGFuZ2UgfHxcbiAgICAgIGV2ZW50LnNvdXJjZSA9PT0gU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5Sb3dDbGlja1xuICAgICkge1xuICAgICAgdGhpcy5zdGF0ZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBvYnNlcnZhYmxlTWFwKChzKSA9PiBzLml0ZW1zLml0ZW1zKSxcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoaXRlbXM6IExpc3RJdGVtTW9kZWxbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0l0ZW1JZHMgPSB0aGlzLmFycmF5SW50ZXJzZWN0aW9uKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpKSA9PiBpLmlkKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3RlZElkc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbmV3SWRzID0gaXRlbXMuZmlsdGVyKChpKSA9PiBpLmlzU2VsZWN0ZWQpLm1hcCgoaSkgPT4gaS5pZCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBmb3IgZGVzZWxlY3RlZCBpZHMgJiBzZW5kIG1lc3NhZ2UgdG8gZGlzcGF0Y2hlci5cbiAgICAgICAgICBjb25zdCBkZXNlbGVjdGVkSWRzID0gdGhpcy5hcnJheURpZmYobmV3SXRlbUlkcywgbmV3SWRzKTtcbiAgICAgICAgICBpZiAoZGVzZWxlY3RlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2V0U2VsZWN0ZWQoZGVzZWxlY3RlZElkcywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGZvciBzZWxlY3RlZCBpZHMgJiBzZW5kIG1lc3NhZ2UgdG8gZGlzcGF0Y2hlci5cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMuYXJyYXlEaWZmKG5ld0lkcywgbmV3SXRlbUlkcyk7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZXRTZWxlY3RlZChzZWxlY3RlZElkcywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29sdW1uSWRzQ2hhbmdlZChzZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGN1cnJlbnRJZHMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcnJheXNFcXVhbChzZWxlY3RlZENvbHVtbklkcywgY3VycmVudElkcykpIHtcbiAgICAgICAgdGhpcy5ncmlkU3RhdGVcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuY29sdW1ucy5pdGVtcyksXG4gICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGNvbHVtbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZENvbHVtbnMgPSBzZWxlY3RlZENvbHVtbklkcy5tYXAoXG4gICAgICAgICAgICAgIChjb2x1bW5JZCkgPT4gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMuaWQgPT09IGNvbHVtbklkKVswXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERpc3BhdGNoZXIubmV4dChcbiAgICAgICAgICAgICAgbmV3IExpc3RWaWV3RGlzcGxheWVkR3JpZENvbHVtbnNMb2FkQWN0aW9uKGRpc3BsYXllZENvbHVtbnMsIHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbFJvd0RlbGV0ZShhcmdzOiBTa3lMaXN0Vmlld0dyaWRSb3dEZWxldGVDYW5jZWxBcmdzKTogdm9pZCB7XG4gICAgdGhpcy5yb3dEZWxldGVDYW5jZWwuZW1pdChhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUm93RGVsZXRlKGFyZ3M6IFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzKTogdm9pZCB7XG4gICAgdGhpcy5yb3dEZWxldGVDb25maXJtLmVtaXQoYXJncyk7XG4gIH1cblxuICBwdWJsaWMgc29ydEZpZWxkQ2hhbmdlZChzb3J0RmllbGQ6IExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsKSB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLnNvcnRTZXRGaWVsZFNlbGVjdG9ycyhbc29ydEZpZWxkXSk7XG4gIH1cblxuICBwdWJsaWMgb25WaWV3QWN0aXZlKCkge1xuICAgIC8qXG4gICAgICBSYW4gaW50byBwcm9ibGVtIHdoZXJlIHN0YXRlIHVwZGF0ZXMgd2VyZSBjb25zdW1lZCBvdXQgb2Ygb3JkZXIuIEZvciBleGFtcGxlLCBvbiBzZWFyY2ggdGV4dFxuICAgICAgdXBkYXRlLCB0aGUgc2VhcmNoVGV4dCB1cGRhdGUgd2FzIGNvbnN1bWVkIGFmdGVyIHRoZSByZXN1bHRpbmcgbGlzdCBpdGVtIHVwZGF0ZS4gU2Nhbm5pbmcgdGhlXG4gICAgICBwcmV2aW91cyB2YWx1ZSBvZiBpdGVtcyBsYXN0VXBkYXRlIGVuc3VyZXMgdGhhdCB3ZSBvbmx5IHJlY2VpdmUgdGhlIGxhdGVzdCBpdGVtcy5cbiAgICAqL1xuICAgIHRoaXMuZ3JpZFN0YXRlXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgIHNjYW4oKHByZXZpb3VzVmFsdWU6IEdyaWRTdGF0ZU1vZGVsLCBuZXdWYWx1ZTogR3JpZFN0YXRlTW9kZWwpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlLmRpc3BsYXllZENvbHVtbnMubGFzdFVwZGF0ZSA+XG4gICAgICAgICAgICBuZXdWYWx1ZS5kaXNwbGF5ZWRDb2x1bW5zLmxhc3RVcGRhdGVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4gcy5kaXNwbGF5ZWRDb2x1bW5zLml0ZW1zKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQodGhpcy5hcnJheXNFcXVhbClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRpc3BsYXllZENvbHVtbnMpID0+IHtcbiAgICAgICAgY29uc3Qgc2V0RnVuY3Rpb25zID1cbiAgICAgICAgICB0aGlzLnNlYXJjaEZ1bmN0aW9uICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gW3RoaXMuc2VhcmNoRnVuY3Rpb25dXG4gICAgICAgICAgICA6IGRpc3BsYXllZENvbHVtbnNcbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT4gKGRhdGE6IGFueSwgc2VhcmNoVGV4dDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc2VhcmNoRnVuY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YShkYXRhLCBjb2x1bW4uZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKHMpID0+IHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VhcmNoU2V0T3B0aW9ucyhcbiAgICAgICAgICAgIG5ldyBMaXN0U2VhcmNoTW9kZWwoe1xuICAgICAgICAgICAgICBzZWFyY2hUZXh0OiBzLnNlYXJjaC5zZWFyY2hUZXh0LFxuICAgICAgICAgICAgICBmdW5jdGlvbnM6IHNldEZ1bmN0aW9ucyxcbiAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcnM6IGRpc3BsYXllZENvbHVtbnMubWFwKChkKSA9PiBkLmZpZWxkKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdElubGluZURlbGV0ZU1lc3NhZ2VzKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMubWVzc2FnZVN0cmVhbSkge1xuICAgICAgdGhpcy5tZXNzYWdlU3RyZWFtLnN1YnNjcmliZSgobWVzc2FnZTogU2t5TGlzdFZpZXdHcmlkTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSBTa3lMaXN0Vmlld0dyaWRNZXNzYWdlVHlwZS5BYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMuZ3JpZE1lc3NhZ2VTdHJlYW0ubmV4dCh7XG4gICAgICAgICAgICB0eXBlOiBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3csXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGFib3J0RGVsZXRlUm93OiBtZXNzYWdlLmRhdGEuYWJvcnREZWxldGVSb3csXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIG1lc3NhZ2UudHlwZSA9PT0gU2t5TGlzdFZpZXdHcmlkTWVzc2FnZVR5cGUuUHJvbXB0RGVsZXRlUm93XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZ3JpZE1lc3NhZ2VTdHJlYW0ubmV4dCh7XG4gICAgICAgICAgICB0eXBlOiBTa3lHcmlkTWVzc2FnZVR5cGUuUHJvbXB0RGVsZXRlUm93LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBwcm9tcHREZWxldGVSb3c6IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3csXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbHVtbkNoYW5nZSgpIHtcbiAgICAvLyB3YXRjaCBmb3IgY2hhbmdlcyBpbiBjb2x1bW4gY29tcG9uZW50c1xuICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvbHVtbkNvbXBvbmVudHMpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uTW9kZWxzID0gdGhpcy5jb2x1bW5Db21wb25lbnRzLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uLnRlbXBsYXRlLCBjb2x1bW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmlkRGlzcGF0Y2hlci5uZXh0KFxuICAgICAgICAgIG5ldyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbihjb2x1bW5Nb2RlbHMsIHRydWUpXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjb2x1bW4gaGVhZGluZyBjaGFuZ2VzOlxuICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5mb3JFYWNoKChjb21wKSA9PiB7XG4gICAgICBjb21wLmhlYWRpbmdNb2RlbENoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogU2t5R3JpZENvbHVtbkhlYWRpbmdNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZENvbXBvbmVudC51cGRhdGVDb2x1bW5IZWFkaW5nKGNoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgY29tcC5kZXNjcmlwdGlvbk1vZGVsQ2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBTa3lHcmlkQ29sdW1uRGVzY3JpcHRpb25Nb2RlbENoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZENvbXBvbmVudC51cGRhdGVDb2x1bW5EZXNjcmlwdGlvbihjaGFuZ2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JpZEl0ZW1zKCk6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW1Nb2RlbD4+IHtcbiAgICAvKlxuICAgICAgU2FtZSBwcm9ibGVtIGFzIGFib3ZlLiBXZSBzaG91bGQgbW92ZSBmcm9tIGhhdmluZyBhIHN0YXRlIG9iamVjdCBvYnNlcnZhYmxlIHdpdGggYSBidW5jaCBvZlxuICAgICAgc3RhdGljIHByb3BlcnRpZXMgdG8gYSBzdGF0aWMgc3RhdGUgb2JqZWN0IHdpdGggb2JzZXJ2YWJsZSBwcm9wZXJ0aWVzIHRoYXQgeW91IGNhbiBzdWJzY3JpYmVcbiAgICAgIHRvLlxuICAgICovXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUucGlwZShcbiAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHtcbiAgICAgICAgcmV0dXJuIHMuaXRlbXM7XG4gICAgICB9KSxcbiAgICAgIHNjYW4oXG4gICAgICAgIChcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBBc3luY0xpc3Q8TGlzdEl0ZW1Nb2RlbD4sXG4gICAgICAgICAgbmV3VmFsdWU6IEFzeW5jTGlzdDxMaXN0SXRlbU1vZGVsPlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZS5sYXN0VXBkYXRlID4gbmV3VmFsdWUubGFzdFVwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBvYnNlcnZhYmxlTWFwKChyZXN1bHQ6IEFzeW5jTGlzdDxMaXN0SXRlbU1vZGVsPikgPT4ge1xuICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZW1zO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJZHMoKTogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgLypcbiAgICAgIFNhbWUgcHJvYmxlbSBhcyBhYm92ZS4gV2Ugc2hvdWxkIG1vdmUgZnJvbSBoYXZpbmcgYSBzdGF0ZSBvYmplY3Qgb2JzZXJ2YWJsZSB3aXRoIGEgYnVuY2ggb2ZcbiAgICAgIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIGEgc3RhdGljIHN0YXRlIG9iamVjdCB3aXRoIG9ic2VydmFibGUgcHJvcGVydGllcyB0aGF0IHlvdSBjYW4gc3Vic2NyaWJlXG4gICAgICB0by5cbiAgICAqL1xuICAgIHJldHVybiB0aGlzLmdyaWRTdGF0ZS5waXBlKFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4gcy5kaXNwbGF5ZWRDb2x1bW5zKSxcbiAgICAgIHNjYW4oXG4gICAgICAgIChcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPixcbiAgICAgICAgICBuZXdWYWx1ZTogQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD5cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUubGFzdFVwZGF0ZSA+IG5ld1ZhbHVlLmxhc3RVcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocmVzdWx0OiBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPikgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbi5pZCB8fCBjb2x1bW4uZmllbGQ7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldmlvdXNWYWx1ZTogc3RyaW5nW10sIG5ld1ZhbHVlOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXZlQ29sdW1uSWRzQ2hhbmdlZChwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhdmVDb2x1bW5JZHNDaGFuZ2VkKHByZXZpb3VzVmFsdWU6IHN0cmluZ1tdLCBuZXdWYWx1ZTogc3RyaW5nW10pIHtcbiAgICBpZiAocHJldmlvdXNWYWx1ZS5sZW5ndGggIT09IG5ld1ZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc0NoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHByZXZpb3VzVmFsdWVbaV0gIT09IG5ld1ZhbHVlW2ldKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdGVkTWFwRXF1YWwoXG4gICAgcHJldjogTGlzdFNlbGVjdGVkTW9kZWwsXG4gICAgbmV4dDogTGlzdFNlbGVjdGVkTW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHByZXYuc2VsZWN0ZWRJZE1hcC5zaXplICE9PSBuZXh0LnNlbGVjdGVkSWRNYXAuc2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgbmV4dC5zZWxlY3RlZElkTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IG5leHQuc2VsZWN0ZWRJZE1hcC5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gcHJldi5zZWxlY3RlZElkTWFwLmdldChrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXJyYXlEaWZmKGFyckE6IEFycmF5PGFueT4sIGFyckI6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gYXJyQS5maWx0ZXIoKGkpID0+IGFyckIuaW5kZXhPZihpKSA8IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcnJheUludGVyc2VjdGlvbihhcnJBOiBBcnJheTxhbnk+LCBhcnJCOiBBcnJheTxhbnk+KTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIGFyckEuZmlsdGVyKCh2YWx1ZSkgPT4gLTEgIT09IGFyckIuaW5kZXhPZih2YWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcnJheXNFcXVhbChhcnJheUE6IGFueVtdLCBhcnJheUI6IGFueVtdKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFycmF5QS5sZW5ndGggPT09IGFycmF5Qi5sZW5ndGggJiZcbiAgICAgIGFycmF5QS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gYXJyYXlCW2luZGV4XSlcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiYWN0aXZlIHwgYXN5bmNcIj5cbiAgPHNreS1ncmlkXG4gICAgW2NvbHVtbnNdPVwiY29sdW1ucyB8IGFzeW5jXCJcbiAgICBbZGF0YV09XCJpdGVtcyB8IGFzeW5jXCJcbiAgICBbZW5hYmxlTXVsdGlzZWxlY3RdPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgIFtmaXRdPVwiZml0XCJcbiAgICBbaGVpZ2h0XT1cImdyaWRIZWlnaHQgfCBhc3luY1wiXG4gICAgW2hpZ2hsaWdodFRleHRdPVwiXG4gICAgICBoaWdobGlnaHRTZWFyY2hUZXh0ID8gKGN1cnJlbnRTZWFyY2hUZXh0IHwgYXN5bmMpIDogdW5kZWZpbmVkXG4gICAgXCJcbiAgICBbcm93SGlnaGxpZ2h0ZWRJZF09XCJyb3dIaWdobGlnaHRlZElkXCJcbiAgICBbbWVzc2FnZVN0cmVhbV09XCJncmlkTWVzc2FnZVN0cmVhbVwiXG4gICAgW3NlbGVjdGVkQ29sdW1uSWRzXT1cInNlbGVjdGVkQ29sdW1uSWRzIHwgYXN5bmNcIlxuICAgIFtzZWxlY3RlZFJvd0lkc109XCJtdWx0aXNlbGVjdFNlbGVjdGVkSWRzXCJcbiAgICBbc2V0dGluZ3NLZXldPVwic2V0dGluZ3NLZXlcIlxuICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkIHwgYXN5bmNcIlxuICAgIFt3aWR0aF09XCJncmlkV2lkdGggfCBhc3luY1wiXG4gICAgKG11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlKT1cIm9uTXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHJvd0RlbGV0ZUNhbmNlbCk9XCJjYW5jZWxSb3dEZWxldGUoJGV2ZW50KVwiXG4gICAgKHJvd0RlbGV0ZUNvbmZpcm0pPVwiY29uZmlybVJvd0RlbGV0ZSgkZXZlbnQpXCJcbiAgICAoc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UpPVwiY29sdW1uSWRzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAoc29ydEZpZWxkQ2hhbmdlKT1cInNvcnRGaWVsZENoYW5nZWQoJGV2ZW50KVwiXG4gICAgI3NreUdyaWRcbiAgPlxuICA8L3NreS1ncmlkPlxuICA8c2t5LXdhaXQgW2lzV2FpdGluZ109XCJsb2FkaW5nIHwgYXN5bmNcIj4gPC9za3ktd2FpdD5cbjwvZGl2PlxuIl19
@@ -0,0 +1,42 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { SkyGridModule } from '@skyux/grids';
4
+ import { SkyWaitModule } from '@skyux/indicators';
5
+ import { SkyListColumnSelectorActionModule } from '../list-column-selector-action/list-column-selector-action.module';
6
+ import { SkyListBuilderViewGridsResourcesModule } from '../shared/sky-list-builder-view-grids-resources.module';
7
+ import { SkyListViewGridComponent } from './list-view-grid.component';
8
+ import * as i0 from "@angular/core";
9
+ export class SkyListViewGridModule {
10
+ }
11
+ SkyListViewGridModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ SkyListViewGridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, declarations: [SkyListViewGridComponent], imports: [CommonModule,
13
+ SkyWaitModule,
14
+ SkyGridModule,
15
+ SkyListBuilderViewGridsResourcesModule], exports: [SkyListViewGridComponent,
16
+ SkyListColumnSelectorActionModule,
17
+ SkyGridModule] });
18
+ SkyListViewGridModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, imports: [[
19
+ CommonModule,
20
+ SkyWaitModule,
21
+ SkyGridModule,
22
+ SkyListBuilderViewGridsResourcesModule,
23
+ ], SkyListColumnSelectorActionModule,
24
+ SkyGridModule] });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, decorators: [{
26
+ type: NgModule,
27
+ args: [{
28
+ declarations: [SkyListViewGridComponent],
29
+ imports: [
30
+ CommonModule,
31
+ SkyWaitModule,
32
+ SkyGridModule,
33
+ SkyListBuilderViewGridsResourcesModule,
34
+ ],
35
+ exports: [
36
+ SkyListViewGridComponent,
37
+ SkyListColumnSelectorActionModule,
38
+ SkyGridModule,
39
+ ],
40
+ }]
41
+ }] });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWdyaWQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3QtYnVpbGRlci12aWV3LWdyaWRzL3NyYy9saWIvbW9kdWxlcy9saXN0LXZpZXctZ3JpZC9saXN0LXZpZXctZ3JpZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFDdEgsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFaEgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBZ0J0RSxNQUFNLE9BQU8scUJBQXFCOztrSEFBckIscUJBQXFCO21IQUFyQixxQkFBcUIsaUJBYmpCLHdCQUF3QixhQUVyQyxZQUFZO1FBQ1osYUFBYTtRQUNiLGFBQWE7UUFDYixzQ0FBc0MsYUFHdEMsd0JBQXdCO1FBQ3hCLGlDQUFpQztRQUNqQyxhQUFhO21IQUdKLHFCQUFxQixZQVp2QjtZQUNQLFlBQVk7WUFDWixhQUFhO1lBQ2IsYUFBYTtZQUNiLHNDQUFzQztTQUN2QyxFQUdDLGlDQUFpQztRQUNqQyxhQUFhOzJGQUdKLHFCQUFxQjtrQkFkakMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDeEMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixhQUFhO3dCQUNiLHNDQUFzQztxQkFDdkM7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHdCQUF3Qjt3QkFDeEIsaUNBQWlDO3dCQUNqQyxhQUFhO3FCQUNkO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lHcmlkTW9kdWxlIH0gZnJvbSAnQHNreXV4L2dyaWRzJztcbmltcG9ydCB7IFNreVdhaXRNb2R1bGUgfSBmcm9tICdAc2t5dXgvaW5kaWNhdG9ycyc7XG5cbmltcG9ydCB7IFNreUxpc3RDb2x1bW5TZWxlY3RvckFjdGlvbk1vZHVsZSB9IGZyb20gJy4uL2xpc3QtY29sdW1uLXNlbGVjdG9yLWFjdGlvbi9saXN0LWNvbHVtbi1zZWxlY3Rvci1hY3Rpb24ubW9kdWxlJztcbmltcG9ydCB7IFNreUxpc3RCdWlsZGVyVmlld0dyaWRzUmVzb3VyY2VzTW9kdWxlIH0gZnJvbSAnLi4vc2hhcmVkL3NreS1saXN0LWJ1aWxkZXItdmlldy1ncmlkcy1yZXNvdXJjZXMubW9kdWxlJztcblxuaW1wb3J0IHsgU2t5TGlzdFZpZXdHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9saXN0LXZpZXctZ3JpZC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtTa3lMaXN0Vmlld0dyaWRDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNreVdhaXRNb2R1bGUsXG4gICAgU2t5R3JpZE1vZHVsZSxcbiAgICBTa3lMaXN0QnVpbGRlclZpZXdHcmlkc1Jlc291cmNlc01vZHVsZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIFNreUxpc3RWaWV3R3JpZENvbXBvbmVudCxcbiAgICBTa3lMaXN0Q29sdW1uU2VsZWN0b3JBY3Rpb25Nb2R1bGUsXG4gICAgU2t5R3JpZE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5TGlzdFZpZXdHcmlkTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { SkyGridColumnModel } from '@skyux/grids';
2
+ import { AsyncList } from '@skyux/list-builder-common';
3
+ import { GridStateOrchestrator } from '../grid-state.rxstate';
4
+ import { ListViewGridColumnsLoadAction } from './load.action';
5
+ /**
6
+ * @internal
7
+ */
8
+ export class ListViewGridColumnsOrchestrator extends GridStateOrchestrator {
9
+ /* istanbul ignore next */
10
+ constructor() {
11
+ super();
12
+ this.register(ListViewGridColumnsLoadAction, this.load);
13
+ }
14
+ load(state, action) {
15
+ const newColumns = action.columns.map((g) => new SkyGridColumnModel(g.template, g));
16
+ if (action.refresh) {
17
+ return new AsyncList([...newColumns], new Date());
18
+ }
19
+ return new AsyncList([...state.items, ...newColumns], new Date());
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1ucy5vcmNoZXN0cmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbGlzdC1idWlsZGVyLXZpZXctZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2xpc3Qtdmlldy1ncmlkL3N0YXRlL2NvbHVtbnMvY29sdW1ucy5vcmNoZXN0cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEscUJBRXBEO0lBQ0MsMEJBQTBCO0lBQzFCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU8sSUFBSSxDQUNWLEtBQW9DLEVBQ3BDLE1BQXFDO1FBRXJDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNuQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUM3QyxDQUFDO1FBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxTQUFTLENBQXFCLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7U0FDdkU7UUFFRCxPQUFPLElBQUksU0FBUyxDQUNsQixDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUMvQixJQUFJLElBQUksRUFBRSxDQUNYLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTa3lHcmlkQ29sdW1uTW9kZWwgfSBmcm9tICdAc2t5dXgvZ3JpZHMnO1xuaW1wb3J0IHsgQXN5bmNMaXN0IH0gZnJvbSAnQHNreXV4L2xpc3QtYnVpbGRlci1jb21tb24nO1xuXG5pbXBvcnQgeyBHcmlkU3RhdGVPcmNoZXN0cmF0b3IgfSBmcm9tICcuLi9ncmlkLXN0YXRlLnJ4c3RhdGUnO1xuXG5pbXBvcnQgeyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbiB9IGZyb20gJy4vbG9hZC5hY3Rpb24nO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTGlzdFZpZXdHcmlkQ29sdW1uc09yY2hlc3RyYXRvciBleHRlbmRzIEdyaWRTdGF0ZU9yY2hlc3RyYXRvcjxcbiAgQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD5cbj4ge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbiwgdGhpcy5sb2FkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZChcbiAgICBzdGF0ZTogQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD4sXG4gICAgYWN0aW9uOiBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvblxuICApOiBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPiB7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IGFjdGlvbi5jb2x1bW5zLm1hcChcbiAgICAgIChnKSA9PiBuZXcgU2t5R3JpZENvbHVtbk1vZGVsKGcudGVtcGxhdGUsIGcpXG4gICAgKTtcblxuICAgIGlmIChhY3Rpb24ucmVmcmVzaCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPihbLi4ubmV3Q29sdW1uc10sIG5ldyBEYXRlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD4oXG4gICAgICBbLi4uc3RhdGUuaXRlbXMsIC4uLm5ld0NvbHVtbnNdLFxuICAgICAgbmV3IERhdGUoKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==