@kepler.gl/reducers 3.3.0-alpha.16 → 3.3.0-alpha.18

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 (42) hide show
  1. package/dist/cjs/column-edit-reconcile.js +100 -0
  2. package/dist/cjs/column-edit-updaters.spec.js +840 -0
  3. package/dist/cjs/combined-updaters.js +28 -9
  4. package/dist/cjs/dataset-ops-updaters.js +101 -15
  5. package/dist/cjs/dataset-ops-updaters.spec.js +129 -4
  6. package/dist/cjs/export-utils.js +118 -46
  7. package/dist/cjs/interaction-utils.js +11 -3
  8. package/dist/cjs/layer-utils.js +3 -2
  9. package/dist/cjs/ui-state-updaters.js +70 -26
  10. package/dist/cjs/ui-state.js +2 -2
  11. package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
  12. package/dist/cjs/vis-state-merger.js +65 -22
  13. package/dist/cjs/vis-state-updaters.js +811 -298
  14. package/dist/cjs/vis-state.js +2 -2
  15. package/dist/column-edit-reconcile.d.ts +4 -0
  16. package/dist/column-edit-updaters.spec.d.ts +1 -0
  17. package/dist/combined-updaters.d.ts +14 -4
  18. package/dist/composers.d.ts +13 -2
  19. package/dist/dataset-ops-updaters.d.ts +3 -0
  20. package/dist/esm/column-edit-reconcile.js +95 -0
  21. package/dist/esm/column-edit-updaters.spec.js +839 -0
  22. package/dist/esm/combined-updaters.js +29 -10
  23. package/dist/esm/dataset-ops-updaters.js +99 -16
  24. package/dist/esm/dataset-ops-updaters.spec.js +129 -4
  25. package/dist/esm/export-utils.js +117 -45
  26. package/dist/esm/interaction-utils.js +10 -3
  27. package/dist/esm/layer-utils.js +3 -2
  28. package/dist/esm/ui-state-updaters.js +69 -25
  29. package/dist/esm/ui-state.js +2 -2
  30. package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
  31. package/dist/esm/vis-state-merger.js +66 -24
  32. package/dist/esm/vis-state-updaters.js +801 -306
  33. package/dist/esm/vis-state.js +2 -2
  34. package/dist/export-utils.d.ts +2 -2
  35. package/dist/interaction-utils.d.ts +4 -1
  36. package/dist/layer-utils.d.ts +1 -0
  37. package/dist/ui-state-updaters.d.ts +10 -0
  38. package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
  39. package/dist/vis-state-merger.d.ts +10 -2
  40. package/dist/vis-state-updaters.d.ts +31 -9
  41. package/dist/vis-state.d.ts +4 -0
  42. package/package.json +17 -17
@@ -0,0 +1,839 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ // SPDX-License-Identifier: MIT
7
+ // Copyright contributors to the kepler.gl project
8
+
9
+ import { ALL_FIELD_TYPES, ANIMATION_WINDOW, FILTER_TYPES, PLOT_TYPES, SORT_ORDER } from '@kepler.gl/constants';
10
+ import { VisStateActions } from '@kepler.gl/actions';
11
+ import { KeplerTable } from '@kepler.gl/table';
12
+ import SchemaManager from '@kepler.gl/schemas';
13
+ import { drainTasksForTesting, errorTaskInTest, succeedTaskInTest } from '@kepler.gl/tasks';
14
+ import visStateReducer from './vis-state';
15
+ import { INITIAL_VIS_STATE } from './vis-state-updaters';
16
+ var reduceVisState = visStateReducer;
17
+ function makeTable(id, data) {
18
+ var table = new KeplerTable({
19
+ info: {
20
+ id: id,
21
+ label: id,
22
+ type: 'local'
23
+ },
24
+ color: [0, 0, 0]
25
+ });
26
+ return table.updateSchema(data);
27
+ }
28
+ function withTables() {
29
+ for (var _len = arguments.length, tables = new Array(_len), _key = 0; _key < _len; _key++) {
30
+ tables[_key] = arguments[_key];
31
+ }
32
+ return _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
33
+ datasets: Object.fromEntries(tables.map(function (table) {
34
+ return [table.id, table];
35
+ }))
36
+ });
37
+ }
38
+ function withFilter(state, dataId, column) {
39
+ return reduceVisState(state, VisStateActions.createOrUpdateFilter(undefined, dataId, column));
40
+ }
41
+ function withSyncedFilter(primary, secondary, column) {
42
+ return reduceVisState(withFilter(withTables(primary, secondary), primary.id, column), VisStateActions.setFilter(0, ['dataId', 'name'], [secondary.id, column], 1));
43
+ }
44
+ function changeType(state, dataId, column, type) {
45
+ return reduceVisState(state, VisStateActions.changeTableColumnType(dataId, column, type));
46
+ }
47
+ function makeCities() {
48
+ var table = new KeplerTable({
49
+ info: {
50
+ id: 'cities',
51
+ label: 'cities',
52
+ type: 'local'
53
+ },
54
+ color: [0, 0, 0]
55
+ });
56
+ table.updateSchema({
57
+ fields: [{
58
+ name: 'lat',
59
+ type: ALL_FIELD_TYPES.real
60
+ }, {
61
+ name: 'lng',
62
+ type: ALL_FIELD_TYPES.real
63
+ }, {
64
+ name: 'region',
65
+ type: ALL_FIELD_TYPES.string
66
+ }, {
67
+ name: 'pop',
68
+ type: ALL_FIELD_TYPES.integer
69
+ }],
70
+ rows: [[37.7, -122.4, 'west', 10], [40.7, -74.0, 'east', 40]]
71
+ });
72
+ return table;
73
+ }
74
+ function withCities() {
75
+ var cities = makeCities();
76
+ var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
77
+ datasets: {
78
+ cities: cities
79
+ },
80
+ interactionConfig: _objectSpread(_objectSpread({}, INITIAL_VIS_STATE.interactionConfig), {}, {
81
+ tooltip: _objectSpread(_objectSpread({}, INITIAL_VIS_STATE.interactionConfig.tooltip), {}, {
82
+ config: _objectSpread(_objectSpread({}, INITIAL_VIS_STATE.interactionConfig.tooltip.config), {}, {
83
+ fieldsToShow: {
84
+ cities: [{
85
+ name: 'region',
86
+ format: null
87
+ }]
88
+ }
89
+ })
90
+ })
91
+ })
92
+ });
93
+ state = reduceVisState(state, VisStateActions.addLayer({
94
+ id: 'cities-layer',
95
+ type: 'point',
96
+ config: {
97
+ dataId: 'cities',
98
+ label: 'cities',
99
+ color: [255, 0, 0],
100
+ columns: {
101
+ lat: 'lat',
102
+ lng: 'lng'
103
+ },
104
+ colorField: {
105
+ name: 'region',
106
+ type: 'string'
107
+ },
108
+ textLabel: [{
109
+ field: {
110
+ name: 'region',
111
+ type: 'string'
112
+ }
113
+ }]
114
+ }
115
+ }));
116
+ state = reduceVisState(state, VisStateActions.createOrUpdateFilter(undefined, 'cities', 'region'));
117
+ state = reduceVisState(state, VisStateActions.addChart({
118
+ id: 'region-chart',
119
+ title: 'Regions',
120
+ type: 'barChart',
121
+ dataId: 'cities',
122
+ applyFilters: true,
123
+ display: {},
124
+ chartDisplay: {},
125
+ xAxis: {
126
+ field: {
127
+ name: 'region',
128
+ type: 'string'
129
+ },
130
+ aggregation: null,
131
+ title: 'region'
132
+ },
133
+ yAxis: {
134
+ field: {
135
+ name: 'pop',
136
+ type: 'integer'
137
+ },
138
+ aggregation: 'sum',
139
+ title: 'Population'
140
+ },
141
+ crossFilter: {
142
+ enabled: false,
143
+ filterId: 'region-chart-filter',
144
+ fieldNames: {
145
+ xAxis: 'region'
146
+ },
147
+ value: {}
148
+ }
149
+ }));
150
+ return state;
151
+ }
152
+ describe('column edits', function () {
153
+ beforeEach(function () {
154
+ drainTasksForTesting();
155
+ });
156
+ test('rename changes the field identity stored in layers, filters, and saved maps', function () {
157
+ var _layer$config$colorFi, _layer$config$textLab, _state$charts$0$xAxis, _state$charts$0$yAxis, _state$charts$0$cross, _savedVisState$layers, _savedVisState$layers2, _savedVisState$layers3, _savedVisState$charts;
158
+ var state = withCities();
159
+ state.datasets.cities.hiddenColumns = ['region', 'pop'];
160
+ expect(state.layers).toHaveLength(1);
161
+ expect(state.filters[0].name).toEqual(['region']);
162
+ state = reduceVisState(state, VisStateActions.renameTableColumn('cities', 'region', 'area'));
163
+ var region = state.datasets.cities.fields.find(function (field) {
164
+ return field.name === 'area';
165
+ });
166
+ expect(region === null || region === void 0 ? void 0 : region.name).toBe('area');
167
+ expect(region === null || region === void 0 ? void 0 : region.id).toBe('area');
168
+ expect(region === null || region === void 0 ? void 0 : region.displayName).toBe('area');
169
+ expect(state.datasets.cities.fields.map(function (field) {
170
+ return field.name;
171
+ })).toEqual(['lat', 'lng', 'area', 'pop']);
172
+ expect(state.datasets.cities.dataContainer.rowAsArray(0)[2]).toBe('west');
173
+ var layer = state.layers[0];
174
+ expect(layer.config.columns.lat.value).toBe('lat');
175
+ expect(layer.config.columns.lng.value).toBe('lng');
176
+ expect((_layer$config$colorFi = layer.config.colorField) === null || _layer$config$colorFi === void 0 ? void 0 : _layer$config$colorFi.name).toBe('area');
177
+ expect((_layer$config$textLab = layer.config.textLabel[0].field) === null || _layer$config$textLab === void 0 ? void 0 : _layer$config$textLab.name).toBe('area');
178
+ expect(state.filters[0].name).toEqual(['area']);
179
+ expect((_state$charts$0$xAxis = state.charts[0].xAxis) === null || _state$charts$0$xAxis === void 0 || (_state$charts$0$xAxis = _state$charts$0$xAxis.field) === null || _state$charts$0$xAxis === void 0 ? void 0 : _state$charts$0$xAxis.name).toBe('area');
180
+ expect((_state$charts$0$yAxis = state.charts[0].yAxis) === null || _state$charts$0$yAxis === void 0 || (_state$charts$0$yAxis = _state$charts$0$yAxis.field) === null || _state$charts$0$yAxis === void 0 ? void 0 : _state$charts$0$yAxis.name).toBe('pop');
181
+ expect((_state$charts$0$cross = state.charts[0].crossFilter) === null || _state$charts$0$cross === void 0 ? void 0 : _state$charts$0$cross.fieldNames).toEqual({
182
+ xAxis: 'area'
183
+ });
184
+ expect(state.interactionConfig.tooltip.config.fieldsToShow.cities[0].name).toBe('area');
185
+ expect(state.datasets.cities.hiddenColumns).toEqual(['area', 'pop']);
186
+ var saved = SchemaManager.save({
187
+ visState: state,
188
+ mapState: {},
189
+ mapStyle: {},
190
+ uiState: {}
191
+ });
192
+ var savedVisState = saved.config.config.visState;
193
+ expect((_savedVisState$layers = savedVisState.layers) === null || _savedVisState$layers === void 0 || (_savedVisState$layers = _savedVisState$layers[0].visualChannels) === null || _savedVisState$layers === void 0 ? void 0 : _savedVisState$layers.colorField).toEqual({
194
+ name: 'area',
195
+ type: 'string'
196
+ });
197
+ expect((_savedVisState$layers2 = savedVisState.layers) === null || _savedVisState$layers2 === void 0 ? void 0 : _savedVisState$layers2[0].config.columns.lat).toBe('lat');
198
+ expect((_savedVisState$layers3 = savedVisState.layers) === null || _savedVisState$layers3 === void 0 || (_savedVisState$layers3 = _savedVisState$layers3[0].config.textLabel) === null || _savedVisState$layers3 === void 0 || (_savedVisState$layers3 = _savedVisState$layers3[0].field) === null || _savedVisState$layers3 === void 0 ? void 0 : _savedVisState$layers3.name).toBe('area');
199
+ expect(JSON.stringify(savedVisState.filters)).toContain('area');
200
+ expect(JSON.stringify(savedVisState.filters)).not.toContain('region');
201
+ expect((_savedVisState$charts = savedVisState.charts) === null || _savedVisState$charts === void 0 || (_savedVisState$charts = _savedVisState$charts[0].xAxis) === null || _savedVisState$charts === void 0 || (_savedVisState$charts = _savedVisState$charts.field) === null || _savedVisState$charts === void 0 ? void 0 : _savedVisState$charts.name).toBe('area');
202
+ });
203
+ test('delete drops references and refuses the last column', function () {
204
+ var _state$charts$0$yAxis2;
205
+ var state = withCities();
206
+ state.datasets.cities.hiddenColumns = ['region', 'pop'];
207
+ state = reduceVisState(state, VisStateActions.deleteTableColumn('cities', 'pop'));
208
+ expect(state.datasets.cities.fields.map(function (field) {
209
+ return field.name;
210
+ })).toEqual(['lat', 'lng', 'region']);
211
+ expect(state.layers).toHaveLength(1);
212
+ expect(state.filters).toHaveLength(1);
213
+ expect((_state$charts$0$yAxis2 = state.charts[0].yAxis) === null || _state$charts$0$yAxis2 === void 0 ? void 0 : _state$charts$0$yAxis2.field).toBeNull();
214
+ expect(state.datasets.cities.hiddenColumns).toEqual(['region']);
215
+ state = reduceVisState(state, VisStateActions.deleteTableColumn('cities', 'lat'));
216
+ expect(state.layers).toHaveLength(0);
217
+ expect(state.datasets.cities.fields.map(function (field) {
218
+ return field.name;
219
+ })).toEqual(['lng', 'region']);
220
+ var only = new KeplerTable({
221
+ info: {
222
+ id: 'only',
223
+ label: 'only',
224
+ type: 'local'
225
+ },
226
+ color: [0, 0, 0]
227
+ });
228
+ only.updateSchema({
229
+ fields: [{
230
+ name: 'region',
231
+ type: ALL_FIELD_TYPES.string
232
+ }],
233
+ rows: [['west']]
234
+ });
235
+ var single = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
236
+ datasets: {
237
+ only: only
238
+ }
239
+ });
240
+ var kept = reduceVisState(single, VisStateActions.deleteTableColumn('only', 'region'));
241
+ expect(kept.datasets.only.fields.map(function (field) {
242
+ return field.name;
243
+ })).toEqual(['region']);
244
+ });
245
+ test('deleting an unrelated column preserves an inverted numeric histogram', function () {
246
+ var table = makeTable('data', {
247
+ fields: [{
248
+ name: 'unused',
249
+ type: ALL_FIELD_TYPES.string
250
+ }, {
251
+ name: 'value',
252
+ type: ALL_FIELD_TYPES.integer
253
+ }, {
254
+ name: 'category',
255
+ type: ALL_FIELD_TYPES.string
256
+ }],
257
+ rows: [['x', 1, 'A'], ['x', 2, 'B'], ['x', 3, 'A']]
258
+ });
259
+ var state = withFilter(withTables(table), 'data', 'category');
260
+ state = reduceVisState(state, VisStateActions.setFilter(0, 'value', ['A']));
261
+ state = withFilter(state, 'data', 'value');
262
+ state = reduceVisState(state, VisStateActions.setFilter(1, 'value', [2, 2]));
263
+ state = reduceVisState(state, VisStateActions.setFilter(1, 'inverted', true));
264
+ var histogramCount = function histogramCount() {
265
+ var _bins;
266
+ return (_bins = state.filters[1].bins) === null || _bins === void 0 || (_bins = _bins.data) === null || _bins === void 0 ? void 0 : _bins.reduce(function (sum, bin) {
267
+ return sum + bin.count;
268
+ }, 0);
269
+ };
270
+ expect(histogramCount()).toBe(2);
271
+ state = reduceVisState(state, VisStateActions.deleteTableColumn('data', 'unused'));
272
+ expect(histogramCount()).toBe(2);
273
+ expect(state.datasets.data.filteredIndex).toEqual([0, 2]);
274
+ expect(state.datasets.data.fields.map(function (field) {
275
+ return field.type;
276
+ })).toEqual([ALL_FIELD_TYPES.integer, ALL_FIELD_TYPES.string]);
277
+ });
278
+ test('type change converts values and reconciles incompatible references', function () {
279
+ var _state$layers$find, _state$layers$find2, _state$charts$0$yAxis3;
280
+ var state = withCities();
281
+ state = reduceVisState(state, VisStateActions.addLayer({
282
+ id: 'cities-heatmap',
283
+ type: 'heatmap',
284
+ config: {
285
+ dataId: 'cities',
286
+ label: 'cities heatmap',
287
+ color: [255, 0, 0],
288
+ columns: {
289
+ lat: 'lat',
290
+ lng: 'lng'
291
+ },
292
+ weightField: {
293
+ name: 'pop',
294
+ type: 'integer'
295
+ },
296
+ textLabel: [{
297
+ field: {
298
+ name: 'pop',
299
+ type: 'integer'
300
+ }
301
+ }]
302
+ }
303
+ }));
304
+ state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
305
+ var pop = state.datasets.cities.fields.find(function (field) {
306
+ return field.name === 'pop';
307
+ });
308
+ expect(pop).toMatchObject({
309
+ type: ALL_FIELD_TYPES.string,
310
+ analyzerType: 'STRING',
311
+ format: ''
312
+ });
313
+ expect(state.datasets.cities.dataContainer.rowAsArray(0)[3]).toBe('10');
314
+ expect(state.layers).toHaveLength(2);
315
+ expect(((_state$layers$find = state.layers.find(function (layer) {
316
+ return layer.id === 'cities-heatmap';
317
+ })) === null || _state$layers$find === void 0 ? void 0 : _state$layers$find.config).weightField).toBeNull();
318
+ expect((_state$layers$find2 = state.layers.find(function (layer) {
319
+ return layer.id === 'cities-heatmap';
320
+ })) === null || _state$layers$find2 === void 0 ? void 0 : _state$layers$find2.config.textLabel[0].field).toMatchObject({
321
+ name: 'pop',
322
+ type: 'string'
323
+ });
324
+ expect((_state$charts$0$yAxis3 = state.charts[0].yAxis) === null || _state$charts$0$yAxis3 === void 0 ? void 0 : _state$charts$0$yAxis3.field).toEqual({
325
+ name: 'pop',
326
+ type: 'string'
327
+ });
328
+ });
329
+ test('type change preserves polygon filters targeting the dataset', function () {
330
+ var _state$datasets$citie, _state$datasets$citie2;
331
+ var state = withCities();
332
+ var polygonFilter = {
333
+ id: 'polygon-filter',
334
+ dataId: ['cities'],
335
+ enabled: true,
336
+ fixedDomain: true,
337
+ view: 'side',
338
+ isAnimating: false,
339
+ speed: 1,
340
+ name: [],
341
+ type: FILTER_TYPES.polygon,
342
+ fieldIdx: [],
343
+ domain: null,
344
+ value: {
345
+ type: 'Feature',
346
+ id: 'polygon-selection',
347
+ properties: {
348
+ filterId: 'polygon-filter'
349
+ },
350
+ geometry: {
351
+ type: 'Polygon',
352
+ coordinates: [[[-123, 37], [-122, 37], [-122, 38], [-123, 37]]]
353
+ }
354
+ },
355
+ plotType: {
356
+ type: PLOT_TYPES.histogram
357
+ },
358
+ yAxis: null,
359
+ layerId: ['cities-layer'],
360
+ gpu: false
361
+ };
362
+ state = _objectSpread(_objectSpread({}, state), {}, {
363
+ filters: [].concat(_toConsumableArray(state.filters), [polygonFilter])
364
+ });
365
+ state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
366
+ expect(state.filters.find(function (filter) {
367
+ return filter.id === polygonFilter.id;
368
+ })).toBe(polygonFilter);
369
+ state = reduceVisState(state, VisStateActions.deleteTableColumn('cities', 'lat'));
370
+ expect(state.layers).toHaveLength(0);
371
+ expect(state.filters.find(function (filter) {
372
+ return filter.id === polygonFilter.id;
373
+ })).toBeUndefined();
374
+ expect((_state$datasets$citie = state.datasets.cities.filterRecord) === null || _state$datasets$citie === void 0 ? void 0 : _state$datasets$citie.gpu).not.toContainEqual(expect.objectContaining({
375
+ id: polygonFilter.id
376
+ }));
377
+ expect((_state$datasets$citie2 = state.datasets.cities.filterRecord) === null || _state$datasets$citie2 === void 0 ? void 0 : _state$datasets$citie2.cpu).not.toContainEqual(expect.objectContaining({
378
+ id: polygonFilter.id
379
+ }));
380
+ });
381
+ test('type change preserves an existing sort on another column', function () {
382
+ var state = withCities();
383
+ state = reduceVisState(state, VisStateActions.sortTableColumn('cities', 'region', SORT_ORDER.ASCENDING));
384
+ expect(state.datasets.cities.sortColumn).toEqual({
385
+ region: SORT_ORDER.ASCENDING
386
+ });
387
+ expect(state.datasets.cities.sortOrder).toEqual([1, 0]);
388
+ state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
389
+ expect(state.datasets.cities.sortColumn).toEqual({
390
+ region: SORT_ORDER.ASCENDING
391
+ });
392
+ expect(state.datasets.cities.sortOrder).toEqual([1, 0]);
393
+ });
394
+ test('type change clears timeline state when a time filter becomes non-time', function () {
395
+ var events = makeTable('events', {
396
+ fields: [{
397
+ name: 'start',
398
+ type: ALL_FIELD_TYPES.timestamp,
399
+ analyzerType: 'DATETIME'
400
+ }, {
401
+ name: 'amount',
402
+ type: ALL_FIELD_TYPES.integer
403
+ }],
404
+ rows: [['2024-01-01T00:00:00Z', 10], ['2024-01-02T00:00:00Z', 20]]
405
+ });
406
+ var state = withFilter(withTables(events), 'events', 'start');
407
+ state = _objectSpread(_objectSpread({}, state), {}, {
408
+ filters: [_objectSpread(_objectSpread({}, state.filters[0]), {}, {
409
+ syncedWithLayerTimeline: true,
410
+ syncTimelineMode: 1,
411
+ isAnimating: true,
412
+ animationWindow: ANIMATION_WINDOW.interval,
413
+ timeBins: {
414
+ events: {
415
+ day: []
416
+ }
417
+ },
418
+ lineChart: {
419
+ series: [],
420
+ yDomain: [0, 1],
421
+ xDomain: [0, 1],
422
+ aggregation: 'sum',
423
+ interval: 'day',
424
+ yAxis: 'amount'
425
+ },
426
+ timezone: 'UTC',
427
+ invertTrendColor: true,
428
+ showTimeDisplay: true,
429
+ yAxis: state.datasets.events.fields[1],
430
+ plotType: {
431
+ type: PLOT_TYPES.lineChart,
432
+ interval: 'day',
433
+ aggregation: 'sum'
434
+ }
435
+ })]
436
+ });
437
+ state = changeType(state, 'events', 'start', ALL_FIELD_TYPES.string);
438
+ var filter = state.filters[0];
439
+ expect(filter.type).toBe('multiSelect');
440
+ expect(filter).not.toHaveProperty('syncedWithLayerTimeline');
441
+ expect(filter).not.toHaveProperty('syncTimelineMode');
442
+ expect(filter).not.toHaveProperty('timeBins');
443
+ expect(filter).not.toHaveProperty('lineChart');
444
+ expect(filter).not.toHaveProperty('timezone');
445
+ expect(filter).not.toHaveProperty('invertTrendColor');
446
+ expect(filter).not.toHaveProperty('showTimeDisplay');
447
+ expect(filter).toMatchObject({
448
+ fixedDomain: false,
449
+ isAnimating: false,
450
+ animationWindow: ANIMATION_WINDOW.free,
451
+ yAxis: null,
452
+ plotType: {
453
+ type: PLOT_TYPES.histogram
454
+ }
455
+ });
456
+ });
457
+ test('type change detaches an incompatible synced filter member and refilters its dataset', function () {
458
+ var _state$datasets$secon;
459
+ var primary = makeTable('primary', {
460
+ fields: [{
461
+ name: 'value',
462
+ type: ALL_FIELD_TYPES.integer
463
+ }],
464
+ rows: [[1], [2]]
465
+ });
466
+ var secondary = makeTable('secondary', {
467
+ fields: [{
468
+ name: 'value',
469
+ type: ALL_FIELD_TYPES.integer
470
+ }],
471
+ rows: [[1], [3]]
472
+ });
473
+ var state = withSyncedFilter(primary, secondary, 'value');
474
+ expect(state.filters[0].dataId).toEqual(['primary', 'secondary']);
475
+ expect((_state$datasets$secon = state.datasets.secondary.filterRecord) === null || _state$datasets$secon === void 0 ? void 0 : _state$datasets$secon.gpu).toHaveLength(1);
476
+ state = changeType(state, 'secondary', 'value', ALL_FIELD_TYPES.string);
477
+ expect(state.filters[0].dataId).toEqual(['primary']);
478
+ expect(state.filters[0].name).toEqual(['value']);
479
+ expect(state.filters[0].type).toBe('range');
480
+ expect(state.datasets.secondary.filterRecord).toMatchObject({
481
+ dynamicDomain: [],
482
+ fixedDomain: [],
483
+ cpu: [],
484
+ gpu: []
485
+ });
486
+ });
487
+ test('changing a synced secondary dataset does not reconcile the primary plot axis', function () {
488
+ var makeEvents = function makeEvents(id) {
489
+ return makeTable(id, {
490
+ fields: [{
491
+ name: 'start',
492
+ type: ALL_FIELD_TYPES.timestamp,
493
+ analyzerType: 'TIME',
494
+ format: 'x'
495
+ }, {
496
+ name: 'amount',
497
+ type: ALL_FIELD_TYPES.integer
498
+ }],
499
+ rows: [[1700000000, 10], [1700000020, 20]]
500
+ });
501
+ };
502
+ var primary = makeEvents('primary');
503
+ var secondary = makeEvents('secondary');
504
+ var state = withSyncedFilter(primary, secondary, 'start');
505
+ state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
506
+ yAxis: state.datasets.primary.fields[1]
507
+ }));
508
+ state = changeType(state, 'secondary', 'amount', ALL_FIELD_TYPES.string);
509
+ expect(state.filters[0].dataId).toEqual(['primary', 'secondary']);
510
+ expect(state.filters[0].yAxis).toMatchObject({
511
+ name: 'amount',
512
+ type: 'integer'
513
+ });
514
+ expect(state.filters[0].plotType.type).toBe('lineChart');
515
+ });
516
+ test('detaching a synced primary dataset rebuilds the plot for the new primary', function () {
517
+ var primary = makeTable('primary', {
518
+ fields: [{
519
+ name: 'start',
520
+ type: ALL_FIELD_TYPES.timestamp,
521
+ analyzerType: 'TIME',
522
+ format: 'x'
523
+ }, {
524
+ name: 'amount',
525
+ type: ALL_FIELD_TYPES.integer
526
+ }],
527
+ rows: [[1700000000, 10], [1700000020, 20]]
528
+ });
529
+ var secondary = makeTable('secondary', {
530
+ fields: [{
531
+ name: 'start',
532
+ type: ALL_FIELD_TYPES.timestamp,
533
+ analyzerType: 'TIME',
534
+ format: 'x'
535
+ }],
536
+ rows: [[1700000040], [1700000060]]
537
+ });
538
+ var state = withSyncedFilter(primary, secondary, 'start');
539
+ state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
540
+ yAxis: state.datasets.primary.fields[1]
541
+ }));
542
+ expect(state.filters[0].lineChart).toBeDefined();
543
+ state = changeType(state, 'primary', 'start', ALL_FIELD_TYPES.string);
544
+ expect(state.filters[0].dataId).toEqual(['secondary']);
545
+ expect(state.filters[0].name).toEqual(['start']);
546
+ expect(state.filters[0].type).toBe('timeRange');
547
+ expect(state.filters[0].yAxis).toBeNull();
548
+ expect(state.filters[0].plotType.type).toBe('histogram');
549
+ expect(state.filters[0].lineChart).toBeUndefined();
550
+ });
551
+ test('grouped timeline series survive a rename and rebuild when group values collapse', function () {
552
+ var _state$filters$0$line, _state$filters$0$line2, _state$filters$0$line3;
553
+ var events = makeTable('events', {
554
+ fields: [{
555
+ name: 'start',
556
+ type: ALL_FIELD_TYPES.timestamp,
557
+ analyzerType: 'TIME',
558
+ format: 'x'
559
+ }, {
560
+ name: 'group',
561
+ type: ALL_FIELD_TYPES.string
562
+ }, {
563
+ name: 'amount',
564
+ type: ALL_FIELD_TYPES.integer
565
+ }],
566
+ rows: [[1700000000, '01', 10], [1700000020, '1', 20]]
567
+ });
568
+ var state = withFilter(withTables(events), 'events', 'start');
569
+ state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
570
+ yAxis: state.datasets.events.fields[2]
571
+ }));
572
+ state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
573
+ plotType: {
574
+ groupBy: {
575
+ fieldName: 'group',
576
+ numGroups: 'ALL',
577
+ groupOthers: false
578
+ }
579
+ }
580
+ }));
581
+ var seriesBefore = (_state$filters$0$line = state.filters[0].lineChart) === null || _state$filters$0$line === void 0 ? void 0 : _state$filters$0$line.series;
582
+ expect(new Set(seriesBefore.names)).toEqual(new Set(['01', '1']));
583
+ state = reduceVisState(state, VisStateActions.renameTableColumn('events', 'group', 'category'));
584
+ expect((_state$filters$0$line2 = state.filters[0].lineChart) === null || _state$filters$0$line2 === void 0 ? void 0 : _state$filters$0$line2.series).toEqual(seriesBefore);
585
+ expect(state.filters[0].plotType.groupBy.fieldName).toBe('category');
586
+ expect(state.datasets.events.fields[1].type).toBe(ALL_FIELD_TYPES.string);
587
+ state = changeType(state, 'events', 'category', ALL_FIELD_TYPES.integer);
588
+ var namesAfter = ((_state$filters$0$line3 = state.filters[0].lineChart) === null || _state$filters$0$line3 === void 0 ? void 0 : _state$filters$0$line3.series).names;
589
+ expect(new Set(namesAfter)).toEqual(new Set(['1']));
590
+ });
591
+ test('type change clears an interval end field that is no longer a timestamp', function () {
592
+ var _state$filters$0$yAxi, _timeFilter$timeBins, _timeFilter$timeBins2, _state$charts$0$xAxis2;
593
+ var events = makeTable('events', {
594
+ fields: [{
595
+ name: 'start',
596
+ type: ALL_FIELD_TYPES.timestamp,
597
+ analyzerType: 'TIME',
598
+ format: 'x'
599
+ }, {
600
+ name: 'end',
601
+ type: ALL_FIELD_TYPES.timestamp,
602
+ analyzerType: 'TIME',
603
+ format: 'x'
604
+ }, {
605
+ name: 'value',
606
+ type: ALL_FIELD_TYPES.integer
607
+ }],
608
+ rows: [[1700000000, 1700086400, 10], [1700000020, 1700172800, 20]]
609
+ });
610
+ var state = withTables(events);
611
+ state = reduceVisState(state, VisStateActions.addChart({
612
+ id: 'events-chart',
613
+ title: 'Events',
614
+ type: 'barChart',
615
+ dataId: 'events',
616
+ applyFilters: true,
617
+ display: {},
618
+ chartDisplay: {},
619
+ xAxis: {
620
+ field: {
621
+ name: 'end',
622
+ type: 'timestamp'
623
+ },
624
+ aggregation: 'timeBin',
625
+ interval: 'day',
626
+ title: 'end'
627
+ },
628
+ yAxis: {
629
+ field: {
630
+ name: 'value',
631
+ type: 'integer'
632
+ },
633
+ aggregation: 'sum',
634
+ title: 'value'
635
+ }
636
+ }));
637
+ state = withFilter(state, 'events', 'start');
638
+ state = reduceVisState(state, VisStateActions.setFilter(0, 'endName', 'end', 0));
639
+ state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
640
+ yAxis: state.datasets.events.fields[2]
641
+ }));
642
+ expect(state.filters[0].endName).toEqual(['end']);
643
+ expect((_state$filters$0$yAxi = state.filters[0].yAxis) === null || _state$filters$0$yAxi === void 0 ? void 0 : _state$filters$0$yAxi.name).toBe('value');
644
+ state = changeType(state, 'events', 'value', ALL_FIELD_TYPES.string);
645
+ expect(state.filters[0].yAxis).toBeNull();
646
+ expect(state.filters[0].plotType.type).toBe('histogram');
647
+ expect(state.filters[0].endName).toEqual(['end']);
648
+ expect(state.charts[0].yAxis).toMatchObject({
649
+ field: {
650
+ name: 'value',
651
+ type: 'string'
652
+ },
653
+ aggregation: 'sum'
654
+ });
655
+ var timeFilter = state.filters[0];
656
+ var interval = timeFilter.plotType.interval;
657
+ var intervalBins = (_timeFilter$timeBins = timeFilter.timeBins) === null || _timeFilter$timeBins === void 0 || (_timeFilter$timeBins = _timeFilter$timeBins.events) === null || _timeFilter$timeBins === void 0 ? void 0 : _timeFilter$timeBins[interval];
658
+ expect(intervalBins === null || intervalBins === void 0 ? void 0 : intervalBins.reduce(function (sum, bin) {
659
+ return sum + bin.count;
660
+ }, 0)).toBeGreaterThan(2);
661
+ state = changeType(state, 'events', 'end', ALL_FIELD_TYPES.string);
662
+ expect(state.filters[0].type).toBe('timeRange');
663
+ expect(state.filters[0].endName).toBeUndefined();
664
+ expect(state.filters[0].endFieldIdx).toBeUndefined();
665
+ timeFilter = state.filters[0];
666
+ var bins = (_timeFilter$timeBins2 = timeFilter.timeBins) === null || _timeFilter$timeBins2 === void 0 || (_timeFilter$timeBins2 = _timeFilter$timeBins2.events) === null || _timeFilter$timeBins2 === void 0 ? void 0 : _timeFilter$timeBins2[interval];
667
+ expect(bins === null || bins === void 0 ? void 0 : bins.reduce(function (sum, bin) {
668
+ return sum + bin.count;
669
+ }, 0)).toBe(2);
670
+ expect(state.charts[0].xAxis).toMatchObject({
671
+ field: {
672
+ name: 'end',
673
+ type: 'string'
674
+ },
675
+ aggregation: 'uniqueBin'
676
+ });
677
+ expect((_state$charts$0$xAxis2 = state.charts[0].xAxis) === null || _state$charts$0$xAxis2 === void 0 ? void 0 : _state$charts$0$xAxis2.interval).toBeUndefined();
678
+ });
679
+ test('invalid type change is atomic and schedules a precise error', function () {
680
+ var _next$datasets$cities;
681
+ var state = withCities();
682
+ var next = changeType(state, 'cities', 'region', ALL_FIELD_TYPES.integer);
683
+ expect(next.datasets.cities).toBe(state.datasets.cities);
684
+ expect((_next$datasets$cities = next.datasets.cities.fields.find(function (field) {
685
+ return field.name === 'region';
686
+ })) === null || _next$datasets$cities === void 0 ? void 0 : _next$datasets$cities.type).toBe(ALL_FIELD_TYPES.string);
687
+ expect(next.datasets.cities.dataContainer.rowAsArray(0)[2]).toBe('west');
688
+ var tasks = drainTasksForTesting();
689
+ expect(tasks).toHaveLength(1);
690
+ var notification = succeedTaskInTest(tasks[0], undefined);
691
+ expect(notification.payload.message).toContain('Cannot change “region” to integer: row 1 value “west” is not a safe integer');
692
+ expect(notification.payload.message).toContain('No values were changed.');
693
+ });
694
+ test('late column statistics cannot overwrite a changed column', function () {
695
+ var _state$datasets$citie3;
696
+ var state = withCities();
697
+ state = reduceVisState(state, VisStateActions.loadColumnStats('cities', 'pop'));
698
+ var requestRevision = state.datasets.cities.dataRevision;
699
+ var _drainTasksForTesting = drainTasksForTesting(),
700
+ _drainTasksForTesting2 = _slicedToArray(_drainTasksForTesting, 1),
701
+ task = _drainTasksForTesting2[0];
702
+ var result = {
703
+ type: 'numeric',
704
+ mean: 25
705
+ };
706
+ var staleSuccess = succeedTaskInTest(task, {
707
+ result: result,
708
+ filterProps: {
709
+ type: FILTER_TYPES.range
710
+ }
711
+ });
712
+ expect(staleSuccess).toMatchObject({
713
+ fieldType: ALL_FIELD_TYPES.integer
714
+ });
715
+ state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
716
+ expect(state.datasets.cities.dataRevision).toBe(requestRevision + 1);
717
+ var changedState = state;
718
+ state = reduceVisState(state, staleSuccess);
719
+ expect(state).toBe(changedState);
720
+ var changedField = state.datasets.cities.fields.find(function (field) {
721
+ return field.name === 'pop';
722
+ });
723
+ expect(changedField).toMatchObject({
724
+ type: ALL_FIELD_TYPES.string
725
+ });
726
+ expect(changedField).not.toHaveProperty('isLoadingStats');
727
+ expect((_state$datasets$citie3 = state.datasets.cities.fields.find(function (field) {
728
+ return field.name === 'pop';
729
+ })) === null || _state$datasets$citie3 === void 0 || (_state$datasets$citie3 = _state$datasets$citie3.filterProps) === null || _state$datasets$citie3 === void 0 ? void 0 : _state$datasets$citie3.columnStats).not.toBe(result);
730
+ });
731
+ test.each(['refresh', 'append'])('pending statistics complete after a normal %s', function (update) {
732
+ var state = withCities();
733
+ var types = state.datasets.cities.fields.map(function (field) {
734
+ return field.type;
735
+ });
736
+ state = reduceVisState(state, VisStateActions.loadColumnStats('cities', 'pop'));
737
+ var _drainTasksForTesting3 = drainTasksForTesting(),
738
+ _drainTasksForTesting4 = _slicedToArray(_drainTasksForTesting3, 1),
739
+ task = _drainTasksForTesting4[0];
740
+ state = reduceVisState(state, VisStateActions.pinTableColumn('cities', 'region'));
741
+ var row = [41, -75, 'north', 50];
742
+ state = reduceVisState(state, update === 'refresh' ? VisStateActions.refreshDatasetSuccess('cities', {
743
+ notModified: false,
744
+ data: {
745
+ fields: state.datasets.cities.fields,
746
+ rows: [row]
747
+ }
748
+ }) : VisStateActions.addToDataset('cities', [row]));
749
+ var result = {
750
+ type: 'numeric',
751
+ mean: 25
752
+ };
753
+ var successState = reduceVisState(state, succeedTaskInTest(task, {
754
+ result: result,
755
+ filterProps: {
756
+ type: FILTER_TYPES.range
757
+ }
758
+ }));
759
+ var logError = jest.spyOn(console, 'error').mockImplementation(function () {
760
+ return undefined;
761
+ });
762
+ var errorState = reduceVisState(state, errorTaskInTest(task, new Error('stats failed')));
763
+ logError.mockRestore();
764
+ expect(state.datasets.cities.fields.map(function (field) {
765
+ return field.type;
766
+ })).toEqual(types);
767
+ expect(successState.datasets.cities.fields[3]).toMatchObject({
768
+ isLoadingStats: false,
769
+ filterProps: {
770
+ columnStats: result
771
+ }
772
+ });
773
+ expect(errorState.datasets.cities.fields[3].isLoadingStats).toBe(false);
774
+ expect(state.datasets.cities.dataContainer.rowAsArray(update === 'refresh' ? 0 : 2)).toEqual(row);
775
+ });
776
+ test('duplicate rename and non-tabular datasets are ignored', function () {
777
+ var state = withCities();
778
+ var duplicate = reduceVisState(state, VisStateActions.renameTableColumn('cities', 'region', 'pop'));
779
+ expect(duplicate).toBe(state);
780
+ var tiles = new KeplerTable({
781
+ info: {
782
+ id: 'tiles',
783
+ label: 'tiles',
784
+ type: 'vector-tile'
785
+ },
786
+ color: [0, 0, 0]
787
+ });
788
+ tiles.updateSchema({
789
+ fields: [{
790
+ name: 'region',
791
+ type: ALL_FIELD_TYPES.string
792
+ }, {
793
+ name: 'pop',
794
+ type: ALL_FIELD_TYPES.integer
795
+ }],
796
+ rows: [['west', 1]]
797
+ });
798
+ var tiled = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
799
+ datasets: {
800
+ tiles: tiles
801
+ }
802
+ });
803
+ var unchanged = reduceVisState(tiled, VisStateActions.renameTableColumn('tiles', 'region', 'area'));
804
+ expect(unchanged).toBe(tiled);
805
+ expect(reduceVisState(tiled, VisStateActions.deleteTableColumn('tiles', 'pop'))).toBe(tiled);
806
+ expect(changeType(tiled, 'tiles', 'pop', ALL_FIELD_TYPES.string)).toBe(tiled);
807
+ });
808
+ test('externally hosted datasets ignore rename and delete', function () {
809
+ var remote = new KeplerTable({
810
+ info: {
811
+ id: 'remote',
812
+ label: 'remote',
813
+ type: 'externally-hosted'
814
+ },
815
+ color: [0, 0, 0]
816
+ });
817
+ remote.updateSchema({
818
+ fields: [{
819
+ name: 'region',
820
+ type: ALL_FIELD_TYPES.string,
821
+ displayName: 'Region'
822
+ }, {
823
+ name: 'pop',
824
+ type: ALL_FIELD_TYPES.integer
825
+ }],
826
+ rows: [['west', 1]]
827
+ });
828
+ var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
829
+ datasets: {
830
+ remote: remote
831
+ }
832
+ });
833
+ expect(reduceVisState(state, VisStateActions.renameTableColumn('remote', 'region', 'area'))).toBe(state);
834
+ expect(reduceVisState(state, VisStateActions.deleteTableColumn('remote', 'pop'))).toBe(state);
835
+ expect(changeType(state, 'remote', 'pop', ALL_FIELD_TYPES.string)).toBe(state);
836
+ expect(state.datasets.remote.fields[0].displayName).toBe('Region');
837
+ });
838
+ });
839
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJBTklNQVRJT05fV0lORE9XIiwiRklMVEVSX1RZUEVTIiwiUExPVF9UWVBFUyIsIlNPUlRfT1JERVIiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsIlNjaGVtYU1hbmFnZXIiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsImVycm9yVGFza0luVGVzdCIsInN1Y2NlZWRUYXNrSW5UZXN0IiwidmlzU3RhdGVSZWR1Y2VyIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJyZWR1Y2VWaXNTdGF0ZSIsIm1ha2VUYWJsZSIsImlkIiwiZGF0YSIsInRhYmxlIiwiaW5mbyIsImxhYmVsIiwidHlwZSIsImNvbG9yIiwidXBkYXRlU2NoZW1hIiwid2l0aFRhYmxlcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ0YWJsZXMiLCJBcnJheSIsIl9rZXkiLCJfb2JqZWN0U3ByZWFkIiwiZGF0YXNldHMiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsIm1hcCIsIndpdGhGaWx0ZXIiLCJzdGF0ZSIsImRhdGFJZCIsImNvbHVtbiIsImNyZWF0ZU9yVXBkYXRlRmlsdGVyIiwidW5kZWZpbmVkIiwid2l0aFN5bmNlZEZpbHRlciIsInByaW1hcnkiLCJzZWNvbmRhcnkiLCJzZXRGaWx0ZXIiLCJjaGFuZ2VUeXBlIiwiY2hhbmdlVGFibGVDb2x1bW5UeXBlIiwibWFrZUNpdGllcyIsImZpZWxkcyIsIm5hbWUiLCJyZWFsIiwic3RyaW5nIiwiaW50ZWdlciIsInJvd3MiLCJ3aXRoQ2l0aWVzIiwiY2l0aWVzIiwiaW50ZXJhY3Rpb25Db25maWciLCJ0b29sdGlwIiwiY29uZmlnIiwiZmllbGRzVG9TaG93IiwiZm9ybWF0IiwiYWRkTGF5ZXIiLCJjb2x1bW5zIiwibGF0IiwibG5nIiwiY29sb3JGaWVsZCIsInRleHRMYWJlbCIsImZpZWxkIiwiYWRkQ2hhcnQiLCJ0aXRsZSIsImFwcGx5RmlsdGVycyIsImRpc3BsYXkiLCJjaGFydERpc3BsYXkiLCJ4QXhpcyIsImFnZ3JlZ2F0aW9uIiwieUF4aXMiLCJjcm9zc0ZpbHRlciIsImVuYWJsZWQiLCJmaWx0ZXJJZCIsImZpZWxkTmFtZXMiLCJ2YWx1ZSIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsInRlc3QiLCJfbGF5ZXIkY29uZmlnJGNvbG9yRmkiLCJfbGF5ZXIkY29uZmlnJHRleHRMYWIiLCJfc3RhdGUkY2hhcnRzJDAkeEF4aXMiLCJfc3RhdGUkY2hhcnRzJDAkeUF4aXMiLCJfc3RhdGUkY2hhcnRzJDAkY3Jvc3MiLCJfc2F2ZWRWaXNTdGF0ZSRsYXllcnMiLCJfc2F2ZWRWaXNTdGF0ZSRsYXllcnMyIiwiX3NhdmVkVmlzU3RhdGUkbGF5ZXJzMyIsIl9zYXZlZFZpc1N0YXRlJGNoYXJ0cyIsImhpZGRlbkNvbHVtbnMiLCJleHBlY3QiLCJsYXllcnMiLCJ0b0hhdmVMZW5ndGgiLCJmaWx0ZXJzIiwidG9FcXVhbCIsInJlbmFtZVRhYmxlQ29sdW1uIiwicmVnaW9uIiwiZmluZCIsInRvQmUiLCJkaXNwbGF5TmFtZSIsImRhdGFDb250YWluZXIiLCJyb3dBc0FycmF5IiwibGF5ZXIiLCJjaGFydHMiLCJzYXZlZCIsInNhdmUiLCJ2aXNTdGF0ZSIsIm1hcFN0YXRlIiwibWFwU3R5bGUiLCJ1aVN0YXRlIiwic2F2ZWRWaXNTdGF0ZSIsInZpc3VhbENoYW5uZWxzIiwiSlNPTiIsInN0cmluZ2lmeSIsInRvQ29udGFpbiIsIm5vdCIsIl9zdGF0ZSRjaGFydHMkMCR5QXhpczIiLCJkZWxldGVUYWJsZUNvbHVtbiIsInRvQmVOdWxsIiwib25seSIsInNpbmdsZSIsImtlcHQiLCJoaXN0b2dyYW1Db3VudCIsIl9iaW5zIiwiYmlucyIsInJlZHVjZSIsInN1bSIsImJpbiIsImNvdW50IiwiZmlsdGVyZWRJbmRleCIsIl9zdGF0ZSRsYXllcnMkZmluZCIsIl9zdGF0ZSRsYXllcnMkZmluZDIiLCJfc3RhdGUkY2hhcnRzJDAkeUF4aXMzIiwid2VpZ2h0RmllbGQiLCJwb3AiLCJ0b01hdGNoT2JqZWN0IiwiYW5hbHl6ZXJUeXBlIiwiX3N0YXRlJGRhdGFzZXRzJGNpdGllIiwiX3N0YXRlJGRhdGFzZXRzJGNpdGllMiIsInBvbHlnb25GaWx0ZXIiLCJmaXhlZERvbWFpbiIsInZpZXciLCJpc0FuaW1hdGluZyIsInNwZWVkIiwicG9seWdvbiIsImZpZWxkSWR4IiwiZG9tYWluIiwicHJvcGVydGllcyIsImdlb21ldHJ5IiwiY29vcmRpbmF0ZXMiLCJwbG90VHlwZSIsImhpc3RvZ3JhbSIsImxheWVySWQiLCJncHUiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmaWx0ZXIiLCJ0b0JlVW5kZWZpbmVkIiwiZmlsdGVyUmVjb3JkIiwidG9Db250YWluRXF1YWwiLCJvYmplY3RDb250YWluaW5nIiwiY3B1Iiwic29ydFRhYmxlQ29sdW1uIiwiQVNDRU5ESU5HIiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsImV2ZW50cyIsInRpbWVzdGFtcCIsInN5bmNlZFdpdGhMYXllclRpbWVsaW5lIiwic3luY1RpbWVsaW5lTW9kZSIsImFuaW1hdGlvbldpbmRvdyIsImludGVydmFsIiwidGltZUJpbnMiLCJkYXkiLCJsaW5lQ2hhcnQiLCJzZXJpZXMiLCJ5RG9tYWluIiwieERvbWFpbiIsInRpbWV6b25lIiwiaW52ZXJ0VHJlbmRDb2xvciIsInNob3dUaW1lRGlzcGxheSIsInRvSGF2ZVByb3BlcnR5IiwiZnJlZSIsIl9zdGF0ZSRkYXRhc2V0cyRzZWNvbiIsImR5bmFtaWNEb21haW4iLCJtYWtlRXZlbnRzIiwic2V0RmlsdGVyUGxvdCIsInRvQmVEZWZpbmVkIiwiX3N0YXRlJGZpbHRlcnMkMCRsaW5lIiwiX3N0YXRlJGZpbHRlcnMkMCRsaW5lMiIsIl9zdGF0ZSRmaWx0ZXJzJDAkbGluZTMiLCJncm91cEJ5IiwiZmllbGROYW1lIiwibnVtR3JvdXBzIiwiZ3JvdXBPdGhlcnMiLCJzZXJpZXNCZWZvcmUiLCJTZXQiLCJuYW1lcyIsIm5hbWVzQWZ0ZXIiLCJfc3RhdGUkZmlsdGVycyQwJHlBeGkiLCJfdGltZUZpbHRlciR0aW1lQmlucyIsIl90aW1lRmlsdGVyJHRpbWVCaW5zMiIsIl9zdGF0ZSRjaGFydHMkMCR4QXhpczIiLCJlbmROYW1lIiwidGltZUZpbHRlciIsImludGVydmFsQmlucyIsInRvQmVHcmVhdGVyVGhhbiIsImVuZEZpZWxkSWR4IiwiX25leHQkZGF0YXNldHMkY2l0aWVzIiwibmV4dCIsInRhc2tzIiwibm90aWZpY2F0aW9uIiwicGF5bG9hZCIsIm1lc3NhZ2UiLCJfc3RhdGUkZGF0YXNldHMkY2l0aWUzIiwibG9hZENvbHVtblN0YXRzIiwicmVxdWVzdFJldmlzaW9uIiwiZGF0YVJldmlzaW9uIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nMiIsIl9zbGljZWRUb0FycmF5IiwidGFzayIsInJlc3VsdCIsIm1lYW4iLCJzdGFsZVN1Y2Nlc3MiLCJmaWx0ZXJQcm9wcyIsInJhbmdlIiwiZmllbGRUeXBlIiwiY2hhbmdlZFN0YXRlIiwiY2hhbmdlZEZpZWxkIiwiY29sdW1uU3RhdHMiLCJlYWNoIiwidXBkYXRlIiwidHlwZXMiLCJfZHJhaW5UYXNrc0ZvclRlc3RpbmczIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nNCIsInBpblRhYmxlQ29sdW1uIiwicm93IiwicmVmcmVzaERhdGFzZXRTdWNjZXNzIiwibm90TW9kaWZpZWQiLCJhZGRUb0RhdGFzZXQiLCJzdWNjZXNzU3RhdGUiLCJsb2dFcnJvciIsImplc3QiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJlcnJvclN0YXRlIiwiRXJyb3IiLCJtb2NrUmVzdG9yZSIsImlzTG9hZGluZ1N0YXRzIiwiZHVwbGljYXRlIiwidGlsZXMiLCJ0aWxlZCIsInVuY2hhbmdlZCIsInJlbW90ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2x1bW4tZWRpdC11cGRhdGVycy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7XG4gIEFMTF9GSUVMRF9UWVBFUyxcbiAgQU5JTUFUSU9OX1dJTkRPVyxcbiAgRklMVEVSX1RZUEVTLFxuICBQTE9UX1RZUEVTLFxuICBTT1JUX09SREVSXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQgU2NoZW1hTWFuYWdlciwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkcmFpblRhc2tzRm9yVGVzdGluZywgZXJyb3JUYXNrSW5UZXN0LCBzdWNjZWVkVGFza0luVGVzdH0gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG5pbXBvcnQgdHlwZSB7UG9seWdvbkZpbHRlciwgUmFuZ2VGaWx0ZXIsIFRpbWVSYW5nZUZpbHRlcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmltcG9ydCB2aXNTdGF0ZVJlZHVjZXIgZnJvbSAnLi92aXMtc3RhdGUnO1xuaW1wb3J0IHtJTklUSUFMX1ZJU19TVEFURX0gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuXG5jb25zdCByZWR1Y2VWaXNTdGF0ZSA9IHZpc1N0YXRlUmVkdWNlciBhcyAoc3RhdGU6IFZpc1N0YXRlLCBhY3Rpb246IHVua25vd24pID0+IFZpc1N0YXRlO1xuXG5mdW5jdGlvbiBtYWtlVGFibGUoaWQ6IHN0cmluZywgZGF0YTogUGFyYW1ldGVyczxLZXBsZXJUYWJsZVsndXBkYXRlU2NoZW1hJ10+WzBdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgcmV0dXJuIHRhYmxlLnVwZGF0ZVNjaGVtYShkYXRhKTtcbn1cblxuZnVuY3Rpb24gd2l0aFRhYmxlcyguLi50YWJsZXM6IEtlcGxlclRhYmxlW10pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgZGF0YXNldHM6IE9iamVjdC5mcm9tRW50cmllcyh0YWJsZXMubWFwKHRhYmxlID0+IFt0YWJsZS5pZCwgdGFibGVdKSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2l0aEZpbHRlcihzdGF0ZTogVmlzU3RhdGUsIGRhdGFJZDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuY3JlYXRlT3JVcGRhdGVGaWx0ZXIodW5kZWZpbmVkLCBkYXRhSWQsIGNvbHVtbikpO1xufVxuXG5mdW5jdGlvbiB3aXRoU3luY2VkRmlsdGVyKHByaW1hcnk6IEtlcGxlclRhYmxlLCBzZWNvbmRhcnk6IEtlcGxlclRhYmxlLCBjb2x1bW46IHN0cmluZyk6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHJlZHVjZVZpc1N0YXRlKFxuICAgIHdpdGhGaWx0ZXIod2l0aFRhYmxlcyhwcmltYXJ5LCBzZWNvbmRhcnkpLCBwcmltYXJ5LmlkLCBjb2x1bW4pLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgWydkYXRhSWQnLCAnbmFtZSddLCBbc2Vjb25kYXJ5LmlkLCBjb2x1bW5dLCAxKVxuICApO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VUeXBlKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBWaXNTdGF0ZSB7XG4gIHJldHVybiByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmNoYW5nZVRhYmxlQ29sdW1uVHlwZShkYXRhSWQsIGNvbHVtbiwgdHlwZSkpO1xufVxuXG5mdW5jdGlvbiBtYWtlQ2l0aWVzKCkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkOiAnY2l0aWVzJywgbGFiZWw6ICdjaXRpZXMnLCB0eXBlOiAnbG9jYWwnfSxcbiAgICBjb2xvcjogWzAsIDAsIDBdXG4gIH0pO1xuICB0YWJsZS51cGRhdGVTY2hlbWEoe1xuICAgIGZpZWxkczogW1xuICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICB7bmFtZTogJ2xuZycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgIF0sXG4gICAgcm93czogW1xuICAgICAgWzM3LjcsIC0xMjIuNCwgJ3dlc3QnLCAxMF0sXG4gICAgICBbNDAuNywgLTc0LjAsICdlYXN0JywgNDBdXG4gICAgXVxuICB9KTtcbiAgcmV0dXJuIHRhYmxlO1xufVxuXG5mdW5jdGlvbiB3aXRoQ2l0aWVzKCk6IFZpc1N0YXRlIHtcbiAgY29uc3QgY2l0aWVzID0gbWFrZUNpdGllcygpO1xuICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgIGRhdGFzZXRzOiB7Y2l0aWVzfSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLFxuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgY2l0aWVzOiBbe25hbWU6ICdyZWdpb24nLCBmb3JtYXQ6IG51bGx9XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgIHN0YXRlLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5hZGRMYXllcih7XG4gICAgICBpZDogJ2NpdGllcy1sYXllcicsXG4gICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGRhdGFJZDogJ2NpdGllcycsXG4gICAgICAgIGxhYmVsOiAnY2l0aWVzJyxcbiAgICAgICAgY29sb3I6IFsyNTUsIDAsIDBdLFxuICAgICAgICBjb2x1bW5zOiB7bGF0OiAnbGF0JywgbG5nOiAnbG5nJ30sXG4gICAgICAgIGNvbG9yRmllbGQ6IHtuYW1lOiAncmVnaW9uJywgdHlwZTogJ3N0cmluZyd9LFxuICAgICAgICB0ZXh0TGFiZWw6IFt7ZmllbGQ6IHtuYW1lOiAncmVnaW9uJywgdHlwZTogJ3N0cmluZyd9fV1cbiAgICAgIH1cbiAgICB9KVxuICApO1xuICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgIHN0YXRlLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5jcmVhdGVPclVwZGF0ZUZpbHRlcih1bmRlZmluZWQsICdjaXRpZXMnLCAncmVnaW9uJylcbiAgKTtcbiAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICBzdGF0ZSxcbiAgICBWaXNTdGF0ZUFjdGlvbnMuYWRkQ2hhcnQoe1xuICAgICAgaWQ6ICdyZWdpb24tY2hhcnQnLFxuICAgICAgdGl0bGU6ICdSZWdpb25zJyxcbiAgICAgIHR5cGU6ICdiYXJDaGFydCcsXG4gICAgICBkYXRhSWQ6ICdjaXRpZXMnLFxuICAgICAgYXBwbHlGaWx0ZXJzOiB0cnVlLFxuICAgICAgZGlzcGxheToge30sXG4gICAgICBjaGFydERpc3BsYXk6IHt9LFxuICAgICAgeEF4aXM6IHtmaWVsZDoge25hbWU6ICdyZWdpb24nLCB0eXBlOiAnc3RyaW5nJ30sIGFnZ3JlZ2F0aW9uOiBudWxsLCB0aXRsZTogJ3JlZ2lvbid9LFxuICAgICAgeUF4aXM6IHtmaWVsZDoge25hbWU6ICdwb3AnLCB0eXBlOiAnaW50ZWdlcid9LCBhZ2dyZWdhdGlvbjogJ3N1bScsIHRpdGxlOiAnUG9wdWxhdGlvbid9LFxuICAgICAgY3Jvc3NGaWx0ZXI6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIGZpbHRlcklkOiAncmVnaW9uLWNoYXJ0LWZpbHRlcicsXG4gICAgICAgIGZpZWxkTmFtZXM6IHt4QXhpczogJ3JlZ2lvbid9LFxuICAgICAgICB2YWx1ZToge31cbiAgICAgIH1cbiAgICB9KVxuICApO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmRlc2NyaWJlKCdjb2x1bW4gZWRpdHMnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JlbmFtZSBjaGFuZ2VzIHRoZSBmaWVsZCBpZGVudGl0eSBzdG9yZWQgaW4gbGF5ZXJzLCBmaWx0ZXJzLCBhbmQgc2F2ZWQgbWFwcycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMgPSBbJ3JlZ2lvbicsICdwb3AnXTtcbiAgICBleHBlY3Qoc3RhdGUubGF5ZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubmFtZSkudG9FcXVhbChbJ3JlZ2lvbiddKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW5hbWVUYWJsZUNvbHVtbignY2l0aWVzJywgJ3JlZ2lvbicsICdhcmVhJykpO1xuXG4gICAgY29uc3QgcmVnaW9uID0gc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICdhcmVhJyk7XG4gICAgZXhwZWN0KHJlZ2lvbj8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChyZWdpb24/LmlkKS50b0JlKCdhcmVhJyk7XG4gICAgZXhwZWN0KHJlZ2lvbj8uZGlzcGxheU5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvRXF1YWwoW1xuICAgICAgJ2xhdCcsXG4gICAgICAnbG5nJyxcbiAgICAgICdhcmVhJyxcbiAgICAgICdwb3AnXG4gICAgXSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMClbMl0pLnRvQmUoJ3dlc3QnKTtcblxuICAgIGNvbnN0IGxheWVyID0gc3RhdGUubGF5ZXJzWzBdO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sdW1ucy5sYXQudmFsdWUpLnRvQmUoJ2xhdCcpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sdW1ucy5sbmcudmFsdWUpLnRvQmUoJ2xuZycpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcudGV4dExhYmVsWzBdLmZpZWxkPy5uYW1lKS50b0JlKCdhcmVhJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubmFtZSkudG9FcXVhbChbJ2FyZWEnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS54QXhpcz8uZmllbGQ/Lm5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnlBeGlzPy5maWVsZD8ubmFtZSkudG9CZSgncG9wJyk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS5jcm9zc0ZpbHRlcj8uZmllbGROYW1lcykudG9FcXVhbCh7eEF4aXM6ICdhcmVhJ30pO1xuICAgIGV4cGVjdChzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3cuY2l0aWVzWzBdLm5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMpLnRvRXF1YWwoWydhcmVhJywgJ3BvcCddKTtcblxuICAgIGNvbnN0IHNhdmVkID0gU2NoZW1hTWFuYWdlci5zYXZlKHtcbiAgICAgIHZpc1N0YXRlOiBzdGF0ZSxcbiAgICAgIG1hcFN0YXRlOiB7fSxcbiAgICAgIG1hcFN0eWxlOiB7fSxcbiAgICAgIHVpU3RhdGU6IHt9XG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGU7XG4gICAgZXhwZWN0KHNhdmVkVmlzU3RhdGUubGF5ZXJzPy5bMF0udmlzdWFsQ2hhbm5lbHM/LmNvbG9yRmllbGQpLnRvRXF1YWwoe1xuICAgICAgbmFtZTogJ2FyZWEnLFxuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9KTtcbiAgICBleHBlY3Qoc2F2ZWRWaXNTdGF0ZS5sYXllcnM/LlswXS5jb25maWcuY29sdW1ucy5sYXQpLnRvQmUoJ2xhdCcpO1xuICAgIGV4cGVjdChzYXZlZFZpc1N0YXRlLmxheWVycz8uWzBdLmNvbmZpZy50ZXh0TGFiZWw/LlswXS5maWVsZD8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShzYXZlZFZpc1N0YXRlLmZpbHRlcnMpKS50b0NvbnRhaW4oJ2FyZWEnKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoc2F2ZWRWaXNTdGF0ZS5maWx0ZXJzKSkubm90LnRvQ29udGFpbigncmVnaW9uJyk7XG4gICAgZXhwZWN0KHNhdmVkVmlzU3RhdGUuY2hhcnRzPy5bMF0ueEF4aXM/LmZpZWxkPy5uYW1lKS50b0JlKCdhcmVhJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBkcm9wcyByZWZlcmVuY2VzIGFuZCByZWZ1c2VzIHRoZSBsYXN0IGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMgPSBbJ3JlZ2lvbicsICdwb3AnXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2NpdGllcycsICdwb3AnKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvRXF1YWwoWydsYXQnLCAnbG5nJywgJ3JlZ2lvbiddKTtcbiAgICBleHBlY3Qoc3RhdGUubGF5ZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnlBeGlzPy5maWVsZCkudG9CZU51bGwoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMpLnRvRXF1YWwoWydyZWdpb24nXSk7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2NpdGllcycsICdsYXQnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKSkudG9FcXVhbChbJ2xuZycsICdyZWdpb24nXSk7XG5cbiAgICBjb25zdCBvbmx5ID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICAgIGluZm86IHtpZDogJ29ubHknLCBsYWJlbDogJ29ubHknLCB0eXBlOiAnbG9jYWwnfSxcbiAgICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgICB9KTtcbiAgICBvbmx5LnVwZGF0ZVNjaGVtYSh7XG4gICAgICBmaWVsZHM6IFt7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSxcbiAgICAgIHJvd3M6IFtbJ3dlc3QnXV1cbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge29ubHl9fTtcbiAgICBjb25zdCBrZXB0ID0gcmVkdWNlVmlzU3RhdGUoc2luZ2xlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ29ubHknLCAncmVnaW9uJykpO1xuICAgIGV4cGVjdChrZXB0LmRhdGFzZXRzLm9ubHkuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKSkudG9FcXVhbChbJ3JlZ2lvbiddKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgYW4gdW5yZWxhdGVkIGNvbHVtbiBwcmVzZXJ2ZXMgYW4gaW52ZXJ0ZWQgbnVtZXJpYyBoaXN0b2dyYW0nLCAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBtYWtlVGFibGUoJ2RhdGEnLCB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge25hbWU6ICd1bnVzZWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICd2YWx1ZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjYXRlZ29yeScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XG4gICAgICBdLFxuICAgICAgcm93czogW1xuICAgICAgICBbJ3gnLCAxLCAnQSddLFxuICAgICAgICBbJ3gnLCAyLCAnQiddLFxuICAgICAgICBbJ3gnLCAzLCAnQSddXG4gICAgICBdXG4gICAgfSk7XG4gICAgbGV0IHN0YXRlID0gd2l0aEZpbHRlcih3aXRoVGFibGVzKHRhYmxlKSwgJ2RhdGEnLCAnY2F0ZWdvcnknKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICd2YWx1ZScsIFsnQSddKSk7XG4gICAgc3RhdGUgPSB3aXRoRmlsdGVyKHN0YXRlLCAnZGF0YScsICd2YWx1ZScpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMSwgJ3ZhbHVlJywgWzIsIDJdKSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlcigxLCAnaW52ZXJ0ZWQnLCB0cnVlKSk7XG4gICAgY29uc3QgaGlzdG9ncmFtQ291bnQgPSAoKSA9PlxuICAgICAgKHN0YXRlLmZpbHRlcnNbMV0gYXMgUmFuZ2VGaWx0ZXIpLmJpbnM/LmRhdGE/LnJlZHVjZSgoc3VtLCBiaW4pID0+IHN1bSArIGJpbi5jb3VudCwgMCk7XG4gICAgZXhwZWN0KGhpc3RvZ3JhbUNvdW50KCkpLnRvQmUoMik7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2RhdGEnLCAndW51c2VkJykpO1xuXG4gICAgZXhwZWN0KGhpc3RvZ3JhbUNvdW50KCkpLnRvQmUoMik7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmRhdGEuZmlsdGVyZWRJbmRleCkudG9FcXVhbChbMCwgMl0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5kYXRhLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQudHlwZSkpLnRvRXF1YWwoW1xuICAgICAgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXIsXG4gICAgICBBTExfRklFTERfVFlQRVMuc3RyaW5nXG4gICAgXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGNvbnZlcnRzIHZhbHVlcyBhbmQgcmVjb25jaWxlcyBpbmNvbXBhdGlibGUgcmVmZXJlbmNlcycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLmFkZExheWVyKHtcbiAgICAgICAgaWQ6ICdjaXRpZXMtaGVhdG1hcCcsXG4gICAgICAgIHR5cGU6ICdoZWF0bWFwJyxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgZGF0YUlkOiAnY2l0aWVzJyxcbiAgICAgICAgICBsYWJlbDogJ2NpdGllcyBoZWF0bWFwJyxcbiAgICAgICAgICBjb2xvcjogWzI1NSwgMCwgMF0sXG4gICAgICAgICAgY29sdW1uczoge2xhdDogJ2xhdCcsIGxuZzogJ2xuZyd9LFxuICAgICAgICAgIHdlaWdodEZpZWxkOiB7bmFtZTogJ3BvcCcsIHR5cGU6ICdpbnRlZ2VyJ30sXG4gICAgICAgICAgdGV4dExhYmVsOiBbe2ZpZWxkOiB7bmFtZTogJ3BvcCcsIHR5cGU6ICdpbnRlZ2VyJ319XVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnY2l0aWVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgY29uc3QgcG9wID0gc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICdwb3AnKTtcbiAgICBleHBlY3QocG9wKS50b01hdGNoT2JqZWN0KHt0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nLCBhbmFseXplclR5cGU6ICdTVFJJTkcnLCBmb3JtYXQ6ICcnfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMClbM10pLnRvQmUoJzEwJyk7XG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDIpO1xuICAgIGV4cGVjdChcbiAgICAgIChzdGF0ZS5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gJ2NpdGllcy1oZWF0bWFwJyk/LmNvbmZpZyBhcyB7d2VpZ2h0RmllbGQ/OiB1bmtub3dufSlcbiAgICAgICAgLndlaWdodEZpZWxkXG4gICAgKS50b0JlTnVsbCgpO1xuICAgIGV4cGVjdChcbiAgICAgIHN0YXRlLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSAnY2l0aWVzLWhlYXRtYXAnKT8uY29uZmlnLnRleHRMYWJlbFswXS5maWVsZFxuICAgICkudG9NYXRjaE9iamVjdCh7bmFtZTogJ3BvcCcsIHR5cGU6ICdzdHJpbmcnfSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS55QXhpcz8uZmllbGQpLnRvRXF1YWwoe25hbWU6ICdwb3AnLCB0eXBlOiAnc3RyaW5nJ30pO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBwcmVzZXJ2ZXMgcG9seWdvbiBmaWx0ZXJzIHRhcmdldGluZyB0aGUgZGF0YXNldCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgY29uc3QgcG9seWdvbkZpbHRlcjogUG9seWdvbkZpbHRlciA9IHtcbiAgICAgIGlkOiAncG9seWdvbi1maWx0ZXInLFxuICAgICAgZGF0YUlkOiBbJ2NpdGllcyddLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGZpeGVkRG9tYWluOiB0cnVlLFxuICAgICAgdmlldzogJ3NpZGUnLFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgc3BlZWQ6IDEsXG4gICAgICBuYW1lOiBbXSxcbiAgICAgIHR5cGU6IEZJTFRFUl9UWVBFUy5wb2x5Z29uLFxuICAgICAgZmllbGRJZHg6IFtdLFxuICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogJ3BvbHlnb24tc2VsZWN0aW9uJyxcbiAgICAgICAgcHJvcGVydGllczoge2ZpbHRlcklkOiAncG9seWdvbi1maWx0ZXInfSxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgWy0xMjMsIDM3XSxcbiAgICAgICAgICAgICAgWy0xMjIsIDM3XSxcbiAgICAgICAgICAgICAgWy0xMjIsIDM4XSxcbiAgICAgICAgICAgICAgWy0xMjMsIDM3XVxuICAgICAgICAgICAgXVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5oaXN0b2dyYW19LFxuICAgICAgeUF4aXM6IG51bGwsXG4gICAgICBsYXllcklkOiBbJ2NpdGllcy1sYXllciddLFxuICAgICAgZ3B1OiBmYWxzZVxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHsuLi5zdGF0ZSwgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIHBvbHlnb25GaWx0ZXJdfTtcbiAgICBzdGF0ZSA9IGNoYW5nZVR5cGUoc3RhdGUsICdjaXRpZXMnLCAncG9wJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIuaWQgPT09IHBvbHlnb25GaWx0ZXIuaWQpKS50b0JlKHBvbHlnb25GaWx0ZXIpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmRlbGV0ZVRhYmxlQ29sdW1uKCdjaXRpZXMnLCAnbGF0JykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzLmZpbmQoZmlsdGVyID0+IGZpbHRlci5pZCA9PT0gcG9seWdvbkZpbHRlci5pZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpbHRlclJlY29yZD8uZ3B1KS5ub3QudG9Db250YWluRXF1YWwoXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7aWQ6IHBvbHlnb25GaWx0ZXIuaWR9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWx0ZXJSZWNvcmQ/LmNwdSkubm90LnRvQ29udGFpbkVxdWFsKFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe2lkOiBwb2x5Z29uRmlsdGVyLmlkfSlcbiAgICApO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBwcmVzZXJ2ZXMgYW4gZXhpc3Rpbmcgc29ydCBvbiBhbm90aGVyIGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNvcnRUYWJsZUNvbHVtbignY2l0aWVzJywgJ3JlZ2lvbicsIFNPUlRfT1JERVIuQVNDRU5ESU5HKVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5zb3J0Q29sdW1uKS50b0VxdWFsKHtyZWdpb246IFNPUlRfT1JERVIuQVNDRU5ESU5HfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5zb3J0T3JkZXIpLnRvRXF1YWwoWzEsIDBdKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2NpdGllcycsICdwb3AnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuc29ydENvbHVtbikudG9FcXVhbCh7cmVnaW9uOiBTT1JUX09SREVSLkFTQ0VORElOR30pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuc29ydE9yZGVyKS50b0VxdWFsKFsxLCAwXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGNsZWFycyB0aW1lbGluZSBzdGF0ZSB3aGVuIGEgdGltZSBmaWx0ZXIgYmVjb21lcyBub24tdGltZScsICgpID0+IHtcbiAgICBjb25zdCBldmVudHMgPSBtYWtlVGFibGUoJ2V2ZW50cycsIHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7bmFtZTogJ3N0YXJ0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCwgYW5hbHl6ZXJUeXBlOiAnREFURVRJTUUnfSxcbiAgICAgICAge25hbWU6ICdhbW91bnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsnMjAyNC0wMS0wMVQwMDowMDowMFonLCAxMF0sXG4gICAgICAgIFsnMjAyNC0wMS0wMlQwMDowMDowMFonLCAyMF1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoRmlsdGVyKHdpdGhUYWJsZXMoZXZlbnRzKSwgJ2V2ZW50cycsICdzdGFydCcpO1xuICAgIHN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4oc3RhdGUuZmlsdGVyc1swXSBhcyBUaW1lUmFuZ2VGaWx0ZXIpLFxuICAgICAgICAgIHN5bmNlZFdpdGhMYXllclRpbWVsaW5lOiB0cnVlLFxuICAgICAgICAgIHN5bmNUaW1lbGluZU1vZGU6IDEgYXMgY29uc3QsXG4gICAgICAgICAgaXNBbmltYXRpbmc6IHRydWUsXG4gICAgICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmludGVydmFsLFxuICAgICAgICAgIHRpbWVCaW5zOiB7ZXZlbnRzOiB7ZGF5OiBbXX19LFxuICAgICAgICAgIGxpbmVDaGFydDoge1xuICAgICAgICAgICAgc2VyaWVzOiBbXSxcbiAgICAgICAgICAgIHlEb21haW46IFswLCAxXSxcbiAgICAgICAgICAgIHhEb21haW46IFswLCAxXSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgICAgICAgICAgIGludGVydmFsOiAnZGF5JyxcbiAgICAgICAgICAgIHlBeGlzOiAnYW1vdW50J1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZXpvbmU6ICdVVEMnLFxuICAgICAgICAgIGludmVydFRyZW5kQ29sb3I6IHRydWUsXG4gICAgICAgICAgc2hvd1RpbWVEaXNwbGF5OiB0cnVlLFxuICAgICAgICAgIHlBeGlzOiBzdGF0ZS5kYXRhc2V0cy5ldmVudHMuZmllbGRzWzFdLFxuICAgICAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5saW5lQ2hhcnQsIGludGVydmFsOiAnZGF5JywgYWdncmVnYXRpb246ICdzdW0nfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2V2ZW50cycsICdzdGFydCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1swXTtcbiAgICBleHBlY3QoZmlsdGVyLnR5cGUpLnRvQmUoJ211bHRpU2VsZWN0Jyk7XG4gICAgZXhwZWN0KGZpbHRlcikubm90LnRvSGF2ZVByb3BlcnR5KCdzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3luY1RpbWVsaW5lTW9kZScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgndGltZUJpbnMnKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ2xpbmVDaGFydCcpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgndGltZXpvbmUnKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ2ludmVydFRyZW5kQ29sb3InKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ3Nob3dUaW1lRGlzcGxheScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgZml4ZWREb21haW46IGZhbHNlLFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmZyZWUsXG4gICAgICB5QXhpczogbnVsbCxcbiAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5oaXN0b2dyYW19XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGRldGFjaGVzIGFuIGluY29tcGF0aWJsZSBzeW5jZWQgZmlsdGVyIG1lbWJlciBhbmQgcmVmaWx0ZXJzIGl0cyBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IHByaW1hcnkgPSBtYWtlVGFibGUoJ3ByaW1hcnknLCB7XG4gICAgICBmaWVsZHM6IFt7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XSxcbiAgICAgIHJvd3M6IFtbMV0sIFsyXV1cbiAgICB9KTtcbiAgICBjb25zdCBzZWNvbmRhcnkgPSBtYWtlVGFibGUoJ3NlY29uZGFyeScsIHtcbiAgICAgIGZpZWxkczogW3tuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1dLFxuICAgICAgcm93czogW1sxXSwgWzNdXVxuICAgIH0pO1xuXG4gICAgbGV0IHN0YXRlID0gd2l0aFN5bmNlZEZpbHRlcihwcmltYXJ5LCBzZWNvbmRhcnksICd2YWx1ZScpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5zZWNvbmRhcnkuZmlsdGVyUmVjb3JkPy5ncHUpLnRvSGF2ZUxlbmd0aCgxKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3NlY29uZGFyeScsICd2YWx1ZScsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZGF0YUlkKS50b0VxdWFsKFsncHJpbWFyeSddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5uYW1lKS50b0VxdWFsKFsndmFsdWUnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2Vjb25kYXJ5LmZpbHRlclJlY29yZCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBkeW5hbWljRG9tYWluOiBbXSxcbiAgICAgIGZpeGVkRG9tYWluOiBbXSxcbiAgICAgIGNwdTogW10sXG4gICAgICBncHU6IFtdXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NoYW5naW5nIGEgc3luY2VkIHNlY29uZGFyeSBkYXRhc2V0IGRvZXMgbm90IHJlY29uY2lsZSB0aGUgcHJpbWFyeSBwbG90IGF4aXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFrZUV2ZW50cyA9IChpZDogc3RyaW5nKSA9PlxuICAgICAgbWFrZVRhYmxlKGlkLCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICAgIHtuYW1lOiAnYW1vdW50JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICAgIF0sXG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICBbMV83MDBfMDAwXzAwMCwgMTBdLFxuICAgICAgICAgIFsxXzcwMF8wMDBfMDIwLCAyMF1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgY29uc3QgcHJpbWFyeSA9IG1ha2VFdmVudHMoJ3ByaW1hcnknKTtcbiAgICBjb25zdCBzZWNvbmRhcnkgPSBtYWtlRXZlbnRzKCdzZWNvbmRhcnknKTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoU3luY2VkRmlsdGVyKHByaW1hcnksIHNlY29uZGFyeSwgJ3N0YXJ0Jyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlclBsb3QoMCwge3lBeGlzOiBzdGF0ZS5kYXRhc2V0cy5wcmltYXJ5LmZpZWxkc1sxXX0pXG4gICAgKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3NlY29uZGFyeScsICdhbW91bnQnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnlBeGlzKS50b01hdGNoT2JqZWN0KHtuYW1lOiAnYW1vdW50JywgdHlwZTogJ2ludGVnZXInfSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ucGxvdFR5cGUudHlwZSkudG9CZSgnbGluZUNoYXJ0Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RldGFjaGluZyBhIHN5bmNlZCBwcmltYXJ5IGRhdGFzZXQgcmVidWlsZHMgdGhlIHBsb3QgZm9yIHRoZSBuZXcgcHJpbWFyeScsICgpID0+IHtcbiAgICBjb25zdCBwcmltYXJ5ID0gbWFrZVRhYmxlKCdwcmltYXJ5Jywge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICB7bmFtZTogJ2Ftb3VudCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIHJvd3M6IFtcbiAgICAgICAgWzFfNzAwXzAwMF8wMDAsIDEwXSxcbiAgICAgICAgWzFfNzAwXzAwMF8wMjAsIDIwXVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IHNlY29uZGFyeSA9IG1ha2VUYWJsZSgnc2Vjb25kYXJ5Jywge1xuICAgICAgZmllbGRzOiBbe25hbWU6ICdzdGFydCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J31dLFxuICAgICAgcm93czogW1sxXzcwMF8wMDBfMDQwXSwgWzFfNzAwXzAwMF8wNjBdXVxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IHdpdGhTeW5jZWRGaWx0ZXIocHJpbWFyeSwgc2Vjb25kYXJ5LCAnc3RhcnQnKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyUGxvdCgwLCB7eUF4aXM6IHN0YXRlLmRhdGFzZXRzLnByaW1hcnkuZmllbGRzWzFdfSlcbiAgICApO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmxpbmVDaGFydCkudG9CZURlZmluZWQoKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3ByaW1hcnknLCAnc3RhcnQnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3NlY29uZGFyeSddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5uYW1lKS50b0VxdWFsKFsnc3RhcnQnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgndGltZVJhbmdlJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ueUF4aXMpLnRvQmVOdWxsKCk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ucGxvdFR5cGUudHlwZSkudG9CZSgnaGlzdG9ncmFtJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0KS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dyb3VwZWQgdGltZWxpbmUgc2VyaWVzIHN1cnZpdmUgYSByZW5hbWUgYW5kIHJlYnVpbGQgd2hlbiBncm91cCB2YWx1ZXMgY29sbGFwc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgZXZlbnRzID0gbWFrZVRhYmxlKCdldmVudHMnLCB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge25hbWU6ICdzdGFydCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J30sXG4gICAgICAgIHtuYW1lOiAnZ3JvdXAnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdhbW91bnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsxXzcwMF8wMDBfMDAwLCAnMDEnLCAxMF0sXG4gICAgICAgIFsxXzcwMF8wMDBfMDIwLCAnMScsIDIwXVxuICAgICAgXVxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IHdpdGhGaWx0ZXIod2l0aFRhYmxlcyhldmVudHMpLCAnZXZlbnRzJywgJ3N0YXJ0Jyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlclBsb3QoMCwge3lBeGlzOiBzdGF0ZS5kYXRhc2V0cy5ldmVudHMuZmllbGRzWzJdfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJQbG90KDAsIHtcbiAgICAgICAgcGxvdFR5cGU6IHtncm91cEJ5OiB7ZmllbGROYW1lOiAnZ3JvdXAnLCBudW1Hcm91cHM6ICdBTEwnLCBncm91cE90aGVyczogZmFsc2V9fVxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHNlcmllc0JlZm9yZSA9IHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0Py5zZXJpZXMgYXMge25hbWVzPzogc3RyaW5nW119O1xuICAgIGV4cGVjdChuZXcgU2V0KHNlcmllc0JlZm9yZS5uYW1lcykpLnRvRXF1YWwobmV3IFNldChbJzAxJywgJzEnXSkpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbmFtZVRhYmxlQ29sdW1uKCdldmVudHMnLCAnZ3JvdXAnLCAnY2F0ZWdvcnknKSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0Py5zZXJpZXMpLnRvRXF1YWwoc2VyaWVzQmVmb3JlKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5wbG90VHlwZS5ncm91cEJ5LmZpZWxkTmFtZSkudG9CZSgnY2F0ZWdvcnknKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuZXZlbnRzLmZpZWxkc1sxXS50eXBlKS50b0JlKEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnZXZlbnRzJywgJ2NhdGVnb3J5JywgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXIpO1xuXG4gICAgY29uc3QgbmFtZXNBZnRlciA9IChzdGF0ZS5maWx0ZXJzWzBdLmxpbmVDaGFydD8uc2VyaWVzIGFzIHtuYW1lcz86IHN0cmluZ1tdfSkubmFtZXM7XG4gICAgZXhwZWN0KG5ldyBTZXQobmFtZXNBZnRlcikpLnRvRXF1YWwobmV3IFNldChbJzEnXSkpO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBjbGVhcnMgYW4gaW50ZXJ2YWwgZW5kIGZpZWxkIHRoYXQgaXMgbm8gbG9uZ2VyIGEgdGltZXN0YW1wJywgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50cyA9IG1ha2VUYWJsZSgnZXZlbnRzJywge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICB7bmFtZTogJ2VuZCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J30sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsxXzcwMF8wMDBfMDAwLCAxXzcwMF8wODZfNDAwLCAxMF0sXG4gICAgICAgIFsxXzcwMF8wMDBfMDIwLCAxXzcwMF8xNzJfODAwLCAyMF1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoVGFibGVzKGV2ZW50cyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLmFkZENoYXJ0KHtcbiAgICAgICAgaWQ6ICdldmVudHMtY2hhcnQnLFxuICAgICAgICB0aXRsZTogJ0V2ZW50cycsXG4gICAgICAgIHR5cGU6ICdiYXJDaGFydCcsXG4gICAgICAgIGRhdGFJZDogJ2V2ZW50cycsXG4gICAgICAgIGFwcGx5RmlsdGVyczogdHJ1ZSxcbiAgICAgICAgZGlzcGxheToge30sXG4gICAgICAgIGNoYXJ0RGlzcGxheToge30sXG4gICAgICAgIHhBeGlzOiB7XG4gICAgICAgICAgZmllbGQ6IHtuYW1lOiAnZW5kJywgdHlwZTogJ3RpbWVzdGFtcCd9LFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiAndGltZUJpbicsXG4gICAgICAgICAgaW50ZXJ2YWw6ICdkYXknLFxuICAgICAgICAgIHRpdGxlOiAnZW5kJ1xuICAgICAgICB9LFxuICAgICAgICB5QXhpczoge2ZpZWxkOiB7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ2ludGVnZXInfSwgYWdncmVnYXRpb246ICdzdW0nLCB0aXRsZTogJ3ZhbHVlJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHdpdGhGaWx0ZXIoc3RhdGUsICdldmVudHMnLCAnc3RhcnQnKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICdlbmROYW1lJywgJ2VuZCcsIDApKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyUGxvdCgwLCB7eUF4aXM6IHN0YXRlLmRhdGFzZXRzLmV2ZW50cy5maWVsZHNbMl19KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZW5kTmFtZSkudG9FcXVhbChbJ2VuZCddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS55QXhpcz8ubmFtZSkudG9CZSgndmFsdWUnKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2V2ZW50cycsICd2YWx1ZScsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnlBeGlzKS50b0JlTnVsbCgpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnBsb3RUeXBlLnR5cGUpLnRvQmUoJ2hpc3RvZ3JhbScpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmVuZE5hbWUpLnRvRXF1YWwoWydlbmQnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS55QXhpcykudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWVsZDoge25hbWU6ICd2YWx1ZScsIHR5cGU6ICdzdHJpbmcnfSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJ1xuICAgIH0pO1xuICAgIGxldCB0aW1lRmlsdGVyID0gc3RhdGUuZmlsdGVyc1swXSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSB0aW1lRmlsdGVyLnBsb3RUeXBlLmludGVydmFsO1xuICAgIGNvbnN0IGludGVydmFsQmlucyA9IHRpbWVGaWx0ZXIudGltZUJpbnM/LmV2ZW50cz8uW2ludGVydmFsXTtcbiAgICBleHBlY3QoaW50ZXJ2YWxCaW5zPy5yZWR1Y2UoKHN1bSwgYmluKSA9PiBzdW0gKyBiaW4uY291bnQsIDApKS50b0JlR3JlYXRlclRoYW4oMik7XG5cbiAgICBzdGF0ZSA9IGNoYW5nZVR5cGUoc3RhdGUsICdldmVudHMnLCAnZW5kJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgndGltZVJhbmdlJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZW5kTmFtZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmVuZEZpZWxkSWR4KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgdGltZUZpbHRlciA9IHN0YXRlLmZpbHRlcnNbMF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IGJpbnMgPSB0aW1lRmlsdGVyLnRpbWVCaW5zPy5ldmVudHM/LltpbnRlcnZhbF07XG4gICAgZXhwZWN0KGJpbnM/LnJlZHVjZSgoc3VtLCBiaW4pID0+IHN1bSArIGJpbi5jb3VudCwgMCkpLnRvQmUoMik7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS54QXhpcykudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWVsZDoge25hbWU6ICdlbmQnLCB0eXBlOiAnc3RyaW5nJ30sXG4gICAgICBhZ2dyZWdhdGlvbjogJ3VuaXF1ZUJpbidcbiAgICB9KTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnhBeGlzPy5pbnRlcnZhbCkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICB0ZXN0KCdpbnZhbGlkIHR5cGUgY2hhbmdlIGlzIGF0b21pYyBhbmQgc2NoZWR1bGVzIGEgcHJlY2lzZSBlcnJvcicsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHdpdGhDaXRpZXMoKTtcbiAgICBjb25zdCBuZXh0ID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2NpdGllcycsICdyZWdpb24nLCBBTExfRklFTERfVFlQRVMuaW50ZWdlcik7XG5cbiAgICBleHBlY3QobmV4dC5kYXRhc2V0cy5jaXRpZXMpLnRvQmUoc3RhdGUuZGF0YXNldHMuY2l0aWVzKTtcbiAgICBleHBlY3QobmV4dC5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3JlZ2lvbicpPy50eXBlKS50b0JlKFxuICAgICAgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ1xuICAgICk7XG4gICAgZXhwZWN0KG5leHQuZGF0YXNldHMuY2l0aWVzLmRhdGFDb250YWluZXIucm93QXNBcnJheSgwKVsyXSkudG9CZSgnd2VzdCcpO1xuXG4gICAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICAgIGV4cGVjdCh0YXNrcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHN1Y2NlZWRUYXNrSW5UZXN0KHRhc2tzWzBdLCB1bmRlZmluZWQpO1xuICAgIGV4cGVjdChub3RpZmljYXRpb24ucGF5bG9hZC5tZXNzYWdlKS50b0NvbnRhaW4oXG4gICAgICAnQ2Fubm90IGNoYW5nZSDigJxyZWdpb27igJ0gdG8gaW50ZWdlcjogcm93IDEgdmFsdWUg4oCcd2VzdOKAnSBpcyBub3QgYSBzYWZlIGludGVnZXInXG4gICAgKTtcbiAgICBleHBlY3Qobm90aWZpY2F0aW9uLnBheWxvYWQubWVzc2FnZSkudG9Db250YWluKCdObyB2YWx1ZXMgd2VyZSBjaGFuZ2VkLicpO1xuICB9KTtcblxuICB0ZXN0KCdsYXRlIGNvbHVtbiBzdGF0aXN0aWNzIGNhbm5vdCBvdmVyd3JpdGUgYSBjaGFuZ2VkIGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmxvYWRDb2x1bW5TdGF0cygnY2l0aWVzJywgJ3BvcCcpKTtcbiAgICBjb25zdCByZXF1ZXN0UmV2aXNpb24gPSBzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZGF0YVJldmlzaW9uO1xuICAgIGNvbnN0IFt0YXNrXSA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gICAgY29uc3QgcmVzdWx0ID0ge3R5cGU6ICdudW1lcmljJywgbWVhbjogMjV9O1xuICAgIGNvbnN0IHN0YWxlU3VjY2VzcyA9IHN1Y2NlZWRUYXNrSW5UZXN0KHRhc2ssIHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIGZpbHRlclByb3BzOiB7dHlwZTogRklMVEVSX1RZUEVTLnJhbmdlfVxuICAgIH0pO1xuICAgIGV4cGVjdChzdGFsZVN1Y2Nlc3MpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgZmllbGRUeXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlclxuICAgIH0pO1xuXG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnY2l0aWVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZGF0YVJldmlzaW9uKS50b0JlKHJlcXVlc3RSZXZpc2lvbiArIDEpO1xuICAgIGNvbnN0IGNoYW5nZWRTdGF0ZSA9IHN0YXRlO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgc3RhbGVTdWNjZXNzKTtcblxuICAgIGV4cGVjdChzdGF0ZSkudG9CZShjaGFuZ2VkU3RhdGUpO1xuICAgIGNvbnN0IGNoYW5nZWRGaWVsZCA9IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lID09PSAncG9wJyk7XG4gICAgZXhwZWN0KGNoYW5nZWRGaWVsZCkudG9NYXRjaE9iamVjdCh7dHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30pO1xuICAgIGV4cGVjdChjaGFuZ2VkRmllbGQpLm5vdC50b0hhdmVQcm9wZXJ0eSgnaXNMb2FkaW5nU3RhdHMnKTtcbiAgICBleHBlY3QoXG4gICAgICBzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3BvcCcpPy5maWx0ZXJQcm9wcz8uY29sdW1uU3RhdHNcbiAgICApLm5vdC50b0JlKHJlc3VsdCk7XG4gIH0pO1xuXG4gIHRlc3QuZWFjaChbJ3JlZnJlc2gnLCAnYXBwZW5kJ10pKCdwZW5kaW5nIHN0YXRpc3RpY3MgY29tcGxldGUgYWZ0ZXIgYSBub3JtYWwgJXMnLCB1cGRhdGUgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHdpdGhDaXRpZXMoKTtcbiAgICBjb25zdCB0eXBlcyA9IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLnR5cGUpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5sb2FkQ29sdW1uU3RhdHMoJ2NpdGllcycsICdwb3AnKSk7XG4gICAgY29uc3QgW3Rhc2tdID0gZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucGluVGFibGVDb2x1bW4oJ2NpdGllcycsICdyZWdpb24nKSk7XG4gICAgY29uc3Qgcm93ID0gWzQxLCAtNzUsICdub3J0aCcsIDUwXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICB1cGRhdGUgPT09ICdyZWZyZXNoJ1xuICAgICAgICA/IFZpc1N0YXRlQWN0aW9ucy5yZWZyZXNoRGF0YXNldFN1Y2Nlc3MoJ2NpdGllcycsIHtcbiAgICAgICAgICAgIG5vdE1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRhdGE6IHtmaWVsZHM6IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMsIHJvd3M6IFtyb3ddfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogVmlzU3RhdGVBY3Rpb25zLmFkZFRvRGF0YXNldCgnY2l0aWVzJywgW3Jvd10pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt0eXBlOiAnbnVtZXJpYycsIG1lYW46IDI1fTtcbiAgICBjb25zdCBzdWNjZXNzU3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgc3VjY2VlZFRhc2tJblRlc3QodGFzaywge3Jlc3VsdCwgZmlsdGVyUHJvcHM6IHt0eXBlOiBGSUxURVJfVFlQRVMucmFuZ2V9fSlcbiAgICApO1xuICAgIGNvbnN0IGxvZ0Vycm9yID0gamVzdC5zcHlPbihjb25zb2xlLCAnZXJyb3InKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlcnJvclN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIGVycm9yVGFza0luVGVzdCh0YXNrLCBuZXcgRXJyb3IoJ3N0YXRzIGZhaWxlZCcpKSk7XG4gICAgbG9nRXJyb3IubW9ja1Jlc3RvcmUoKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC50eXBlKSkudG9FcXVhbCh0eXBlcyk7XG4gICAgZXhwZWN0KHN1Y2Nlc3NTdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzWzNdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGlzTG9hZGluZ1N0YXRzOiBmYWxzZSxcbiAgICAgIGZpbHRlclByb3BzOiB7Y29sdW1uU3RhdHM6IHJlc3VsdH1cbiAgICB9KTtcbiAgICBleHBlY3QoZXJyb3JTdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzWzNdLmlzTG9hZGluZ1N0YXRzKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmRhdGFDb250YWluZXIucm93QXNBcnJheSh1cGRhdGUgPT09ICdyZWZyZXNoJyA/IDAgOiAyKSkudG9FcXVhbChcbiAgICAgIHJvd1xuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ2R1cGxpY2F0ZSByZW5hbWUgYW5kIG5vbi10YWJ1bGFyIGRhdGFzZXRzIGFyZSBpZ25vcmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gd2l0aENpdGllcygpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMucmVuYW1lVGFibGVDb2x1bW4oJ2NpdGllcycsICdyZWdpb24nLCAncG9wJylcbiAgICApO1xuICAgIGV4cGVjdChkdXBsaWNhdGUpLnRvQmUoc3RhdGUpO1xuXG4gICAgY29uc3QgdGlsZXMgPSBuZXcgS2VwbGVyVGFibGUoe1xuICAgICAgaW5mbzoge2lkOiAndGlsZXMnLCBsYWJlbDogJ3RpbGVzJywgdHlwZTogJ3ZlY3Rvci10aWxlJ30sXG4gICAgICBjb2xvcjogWzAsIDAsIDBdXG4gICAgfSk7XG4gICAgdGlsZXMudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIHJvd3M6IFtbJ3dlc3QnLCAxXV1cbiAgICB9KTtcbiAgICBjb25zdCB0aWxlZDogVmlzU3RhdGUgPSB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7dGlsZXN9fTtcbiAgICBjb25zdCB1bmNoYW5nZWQgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHRpbGVkLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnJlbmFtZVRhYmxlQ29sdW1uKCd0aWxlcycsICdyZWdpb24nLCAnYXJlYScpXG4gICAgKTtcbiAgICBleHBlY3QodW5jaGFuZ2VkKS50b0JlKHRpbGVkKTtcbiAgICBleHBlY3QocmVkdWNlVmlzU3RhdGUodGlsZWQsIFZpc1N0YXRlQWN0aW9ucy5kZWxldGVUYWJsZUNvbHVtbigndGlsZXMnLCAncG9wJykpKS50b0JlKHRpbGVkKTtcbiAgICBleHBlY3QoY2hhbmdlVHlwZSh0aWxlZCwgJ3RpbGVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpKS50b0JlKHRpbGVkKTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZXJuYWxseSBob3N0ZWQgZGF0YXNldHMgaWdub3JlIHJlbmFtZSBhbmQgZGVsZXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlbW90ZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgICBpbmZvOiB7aWQ6ICdyZW1vdGUnLCBsYWJlbDogJ3JlbW90ZScsIHR5cGU6ICdleHRlcm5hbGx5LWhvc3RlZCd9LFxuICAgICAgY29sb3I6IFswLCAwLCAwXVxuICAgIH0pO1xuICAgIHJlbW90ZS51cGRhdGVTY2hlbWEoe1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZywgZGlzcGxheU5hbWU6ICdSZWdpb24nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbWyd3ZXN0JywgMV1dXG4gICAgfSk7XG4gICAgY29uc3Qgc3RhdGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge3JlbW90ZX19O1xuXG4gICAgZXhwZWN0KFxuICAgICAgcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW5hbWVUYWJsZUNvbHVtbigncmVtb3RlJywgJ3JlZ2lvbicsICdhcmVhJykpXG4gICAgKS50b0JlKHN0YXRlKTtcbiAgICBleHBlY3QocmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5kZWxldGVUYWJsZUNvbHVtbigncmVtb3RlJywgJ3BvcCcpKSkudG9CZShzdGF0ZSk7XG4gICAgZXhwZWN0KGNoYW5nZVR5cGUoc3RhdGUsICdyZW1vdGUnLCAncG9wJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZykpLnRvQmUoc3RhdGUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5yZW1vdGUuZmllbGRzWzBdLmRpc3BsYXlOYW1lKS50b0JlKCdSZWdpb24nKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQ0VBLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsVUFBVSxRQUNMLHNCQUFzQjtBQUM3QixTQUFRQyxlQUFlLFFBQU8sb0JBQW9CO0FBQ2xELFNBQVFDLFdBQVcsUUFBTyxrQkFBa0I7QUFDNUMsT0FBT0MsYUFBYSxNQUFrQixvQkFBb0I7QUFDMUQsU0FBUUMsb0JBQW9CLEVBQUVDLGVBQWUsRUFBRUMsaUJBQWlCLFFBQU8sa0JBQWtCO0FBR3pGLE9BQU9DLGVBQWUsTUFBTSxhQUFhO0FBQ3pDLFNBQVFDLGlCQUFpQixRQUFPLHNCQUFzQjtBQUV0RCxJQUFNQyxjQUFjLEdBQUdGLGVBQWlFO0FBRXhGLFNBQVNHLFNBQVNBLENBQUNDLEVBQVUsRUFBRUMsSUFBZ0QsRUFBRTtFQUMvRSxJQUFNQyxLQUFLLEdBQUcsSUFBSVgsV0FBVyxDQUFDO0lBQzVCWSxJQUFJLEVBQUU7TUFBQ0gsRUFBRSxFQUFGQSxFQUFFO01BQUVJLEtBQUssRUFBRUosRUFBRTtNQUFFSyxJQUFJLEVBQUU7SUFBTyxDQUFDO0lBQ3BDQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDakIsQ0FBQyxDQUFDO0VBQ0YsT0FBT0osS0FBSyxDQUFDSyxZQUFZLENBQUNOLElBQUksQ0FBQztBQUNqQztBQUVBLFNBQVNPLFVBQVVBLENBQUEsRUFBcUM7RUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxFQUFqQ0MsTUFBTSxPQUFBQyxLQUFBLENBQUFKLElBQUEsR0FBQUssSUFBQSxNQUFBQSxJQUFBLEdBQUFMLElBQUEsRUFBQUssSUFBQTtJQUFORixNQUFNLENBQUFFLElBQUEsSUFBQUosU0FBQSxDQUFBSSxJQUFBO0VBQUE7RUFDM0IsT0FB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