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