@kepler.gl/reducers 3.3.0-alpha.17 → 3.3.0-alpha.19
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-updaters.spec.js +116 -3
- package/dist/cjs/combined-updaters.js +28 -9
- package/dist/cjs/dataset-ops-updaters.spec.js +832 -2
- package/dist/cjs/ui-state-updaters.js +44 -9
- package/dist/cjs/vis-state-merger.js +24 -4
- package/dist/cjs/vis-state-updaters.js +444 -263
- package/dist/cjs/vis-state.js +2 -2
- package/dist/combined-updaters.d.ts +14 -4
- package/dist/composers.d.ts +13 -2
- package/dist/esm/column-edit-updaters.spec.js +114 -3
- package/dist/esm/combined-updaters.js +29 -10
- package/dist/esm/dataset-ops-updaters.spec.js +830 -1
- package/dist/esm/ui-state-updaters.js +44 -9
- package/dist/esm/vis-state-merger.js +26 -6
- package/dist/esm/vis-state-updaters.js +445 -265
- package/dist/esm/vis-state.js +2 -2
- package/dist/ui-state-updaters.d.ts +1 -1
- package/dist/vis-state-updaters.d.ts +8 -9
- package/dist/vis-state.d.ts +8 -0
- package/package.json +16 -16
- package/dist/column-edit-updaters.spec.d.ts +0 -1
- package/dist/dataset-ops-updaters.spec.d.ts +0 -1
- package/dist/vis-state-merger-text-label.spec.d.ts +0 -1
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
1
3
|
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
4
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
5
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
6
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
7
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
2
8
|
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; }
|
|
3
9
|
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; }
|
|
4
10
|
// SPDX-License-Identifier: MIT
|
|
@@ -7,8 +13,17 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
7
13
|
import { ALL_FIELD_TYPES } from '@kepler.gl/constants';
|
|
8
14
|
import { VisStateActions } from '@kepler.gl/actions';
|
|
9
15
|
import { KeplerTable } from '@kepler.gl/table';
|
|
16
|
+
import { arrowSchemaToFields, processArrowTable, processCsvData, processFileData, processGeojson, processKeplerglJSON } from '@kepler.gl/processors';
|
|
17
|
+
import { convertGeometryToWKB } from '@loaders.gl/gis';
|
|
18
|
+
import * as arrow from 'apache-arrow';
|
|
19
|
+
import GeoJsonLayer from '../../layers/src/geojson-layer/geojson-layer';
|
|
20
|
+
import { datasetSchema, VERSIONS } from '@kepler.gl/schemas';
|
|
21
|
+
import { datasetToFeatureCollection } from '../../processors/src/export/dataset-to-geojson';
|
|
22
|
+
import { Int64, Table, vectorFromArray } from 'apache-arrow';
|
|
23
|
+
import { exportMapToHTML, exportToJsonString, validateInputData } from '@kepler.gl/utils';
|
|
10
24
|
import SchemaManager from '@kepler.gl/schemas';
|
|
11
25
|
import { drainTasksForTesting, succeedTaskWithValues } from '@kepler.gl/tasks';
|
|
26
|
+
import { Response } from 'node-fetch';
|
|
12
27
|
import visStateReducer from './vis-state';
|
|
13
28
|
import { INITIAL_VIS_STATE } from './vis-state-updaters';
|
|
14
29
|
var reduceVisState = visStateReducer;
|
|
@@ -51,6 +66,13 @@ function flushCreateTableTasks(state) {
|
|
|
51
66
|
}, state);
|
|
52
67
|
}
|
|
53
68
|
describe('dataset ops vis-state', function () {
|
|
69
|
+
var originalResponse = globalThis.Response;
|
|
70
|
+
beforeAll(function () {
|
|
71
|
+
globalThis.Response = Response;
|
|
72
|
+
});
|
|
73
|
+
afterAll(function () {
|
|
74
|
+
globalThis.Response = originalResponse;
|
|
75
|
+
});
|
|
54
76
|
beforeEach(function () {
|
|
55
77
|
drainTasksForTesting();
|
|
56
78
|
});
|
|
@@ -88,6 +110,124 @@ describe('dataset ops vis-state', function () {
|
|
|
88
110
|
});
|
|
89
111
|
expect(state.datasets[resultId].dataContainer.numRows()).toBe(2);
|
|
90
112
|
});
|
|
113
|
+
test.each([false, true])('joined BigInts filter and save after source removal (mixed: %s)', function (mixed) {
|
|
114
|
+
var arrow = new Table({
|
|
115
|
+
key: vectorFromArray(['a', 'b', null]),
|
|
116
|
+
pop: vectorFromArray([10n, 20n, null], new Int64())
|
|
117
|
+
});
|
|
118
|
+
var arrowData = processArrowTable({
|
|
119
|
+
shape: 'arrow-table',
|
|
120
|
+
data: arrow
|
|
121
|
+
});
|
|
122
|
+
if (!arrowData) throw new Error('Invalid Arrow fixture');
|
|
123
|
+
var left = new KeplerTable({
|
|
124
|
+
info: {
|
|
125
|
+
id: 'left'
|
|
126
|
+
},
|
|
127
|
+
color: [0, 0, 0]
|
|
128
|
+
}).updateSchema(mixed ? {
|
|
129
|
+
fields: arrowData.fields,
|
|
130
|
+
rows: [['a', 10n], ['b', 20], [null, 0.5]]
|
|
131
|
+
} : arrowData);
|
|
132
|
+
var right = makeTable('right', [{
|
|
133
|
+
name: 'key',
|
|
134
|
+
type: 'string'
|
|
135
|
+
}], [['a'], ['b']]);
|
|
136
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
137
|
+
datasets: {
|
|
138
|
+
left: left,
|
|
139
|
+
right: right
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
state = reduceVisState(state, VisStateActions.addJoin('left'));
|
|
143
|
+
var op = state.joins[0];
|
|
144
|
+
state = reduceVisState(state, VisStateActions.setJoinConfig(op.id, {
|
|
145
|
+
rightDataId: 'right',
|
|
146
|
+
leftField: 'key',
|
|
147
|
+
rightField: 'key',
|
|
148
|
+
rightColumns: []
|
|
149
|
+
}));
|
|
150
|
+
state = flushCreateTableTasks(reduceVisState(state, VisStateActions.runJoin(op.id)));
|
|
151
|
+
state = reduceVisState(state, VisStateActions.addFilter(op.resultId));
|
|
152
|
+
state = reduceVisState(state, VisStateActions.setFilter(0, 'name', 'pop'));
|
|
153
|
+
expect(state.filters[0].domain).toEqual([10, 20]);
|
|
154
|
+
state = reduceVisState(state, VisStateActions.setFilter(0, 'gpu', false));
|
|
155
|
+
state = reduceVisState(state, VisStateActions.setFilter(0, 'value', [15, 20]));
|
|
156
|
+
expect(state.datasets[op.resultId].filteredIndex).toEqual([1]);
|
|
157
|
+
for (var _i = 0, _arr = [false, true]; _i < _arr.length; _i++) {
|
|
158
|
+
var _exportMapToHTML$matc, _processKeplerglJSON, _reloaded$getColumnFi;
|
|
159
|
+
var removeSources = _arr[_i];
|
|
160
|
+
if (removeSources) {
|
|
161
|
+
state = reduceVisState(state, VisStateActions.removeDataset('left'));
|
|
162
|
+
state = reduceVisState(state, VisStateActions.removeDataset('right'));
|
|
163
|
+
expect(Object.keys(state.datasets)).toEqual([op.resultId]);
|
|
164
|
+
}
|
|
165
|
+
var saved = SchemaManager.save({
|
|
166
|
+
visState: state
|
|
167
|
+
});
|
|
168
|
+
var json = JSON.parse(exportToJsonString(saved));
|
|
169
|
+
var embedded = JSON.parse(((_exportMapToHTML$matc = exportMapToHTML(saved).match(/const datasets = (.*);/)) === null || _exportMapToHTML$matc === void 0 ? void 0 : _exportMapToHTML$matc[1]) || '');
|
|
170
|
+
expect(embedded).toEqual(json.datasets);
|
|
171
|
+
var parsed = (_processKeplerglJSON = processKeplerglJSON(json)) === null || _processKeplerglJSON === void 0 || (_processKeplerglJSON = _processKeplerglJSON.datasets) === null || _processKeplerglJSON === void 0 ? void 0 : _processKeplerglJSON.find(function (dataset) {
|
|
172
|
+
return dataset.info.id === op.resultId;
|
|
173
|
+
});
|
|
174
|
+
if (!parsed) throw new Error('Missing derived dataset after reload');
|
|
175
|
+
var data = validateInputData(parsed.data);
|
|
176
|
+
if (!data) throw new Error('Invalid derived dataset after reload');
|
|
177
|
+
var reloaded = new KeplerTable({
|
|
178
|
+
info: parsed.info,
|
|
179
|
+
metadata: parsed.metadata,
|
|
180
|
+
color: [0, 0, 0]
|
|
181
|
+
}).updateSchema(data);
|
|
182
|
+
expect((_reloaded$getColumnFi = reloaded.getColumnFilterProps('pop')) === null || _reloaded$getColumnFi === void 0 ? void 0 : _reloaded$getColumnFi.domain).toEqual([10, 20]);
|
|
183
|
+
expect(reloaded.dataContainer.flattenData()).toEqual([['a', 10], ['b', 20], [null, null]]);
|
|
184
|
+
expect(state.datasets[op.resultId].dataContainer.flattenData()).toEqual([['a', 10n], ['b', 20n], [null, null]]);
|
|
185
|
+
}
|
|
186
|
+
expect([0, 1, 2].map(function (index) {
|
|
187
|
+
var _arrow$getChild;
|
|
188
|
+
return (_arrow$getChild = arrow.getChild('pop')) === null || _arrow$getChild === void 0 ? void 0 : _arrow$getChild.get(index);
|
|
189
|
+
})).toEqual([10n, 20n, null]);
|
|
190
|
+
expect([0, 1, 2].map(function (index) {
|
|
191
|
+
return left.dataContainer.valueAt(index, 1);
|
|
192
|
+
})).toEqual(mixed ? [10n, 20, 0.5] : [10n, 20n, null]);
|
|
193
|
+
});
|
|
194
|
+
test.each(['minimum', 'maximum'])('runGroupBy selects chronological %s from recognized CSV timestamps', function (technique) {
|
|
195
|
+
var december = '12/31/2025 10:00:00';
|
|
196
|
+
var january = '01/01/2026 10:00:00';
|
|
197
|
+
var data = processCsvData("group,time\nwest,".concat(december, "\nwest,").concat(january, "\neast,").concat(january, "\neast,").concat(december, "\nmissing,"));
|
|
198
|
+
if (!data) throw new Error('CSV import failed');
|
|
199
|
+
expect(data.fields[1]).toMatchObject({
|
|
200
|
+
type: 'timestamp',
|
|
201
|
+
format: 'M/D/YYYY H:m:s'
|
|
202
|
+
});
|
|
203
|
+
var times = makeTable('times', [], []);
|
|
204
|
+
times.updateSchema(data);
|
|
205
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
206
|
+
datasets: {
|
|
207
|
+
times: times
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('times'));
|
|
211
|
+
var op = state.groupBys[0];
|
|
212
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(op.id, {
|
|
213
|
+
fieldName: 'group',
|
|
214
|
+
aggregations: {
|
|
215
|
+
time: technique
|
|
216
|
+
}
|
|
217
|
+
}));
|
|
218
|
+
state = flushCreateTableTasks(reduceVisState(state, VisStateActions.runGroupBy(op.id)));
|
|
219
|
+
var result = state.datasets[op.resultId];
|
|
220
|
+
var expected = technique === 'minimum' ? december : january;
|
|
221
|
+
expect(result.dataContainer.getPlainIndex().map(function (i) {
|
|
222
|
+
return result.dataContainer.rowAsArray(i);
|
|
223
|
+
})).toEqual([['west', expected], ['east', expected], ['missing', null]]);
|
|
224
|
+
expect(result.fields[1]).toMatchObject({
|
|
225
|
+
type: 'timestamp',
|
|
226
|
+
format: data.fields[1].format
|
|
227
|
+
});
|
|
228
|
+
expect(times.dataContainer.valueAt(0, 1)).toBe(december);
|
|
229
|
+
expect(times.dataContainer.valueAt(1, 1)).toBe(january);
|
|
230
|
+
});
|
|
91
231
|
test('delete parent keeps derived child snapshot', function () {
|
|
92
232
|
var cities = makeTable('cities', [{
|
|
93
233
|
name: 'region',
|
|
@@ -163,6 +303,50 @@ describe('dataset ops vis-state', function () {
|
|
|
163
303
|
}));
|
|
164
304
|
expect(state.joins[0].predicate).toBe('within');
|
|
165
305
|
});
|
|
306
|
+
test('spatial joins imported WKT after repeated runs and source reloads without changing it', function () {
|
|
307
|
+
var polygon = 'POLYGON ((-10 -10, 10 -10, 10 10, -10 10, -10 -10))';
|
|
308
|
+
var polys = makeTable('polys', [], []);
|
|
309
|
+
var pts = makeTable('pts', [], []);
|
|
310
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
311
|
+
datasets: {
|
|
312
|
+
polys: polys,
|
|
313
|
+
pts: pts
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
for (var _i2 = 0, _arr2 = [0, 0, 30]; _i2 < _arr2.length; _i2++) {
|
|
317
|
+
var lng = _arr2[_i2];
|
|
318
|
+
var polygonData = processCsvData("geom\n\"".concat(polygon, "\""));
|
|
319
|
+
var point = "POINT (".concat(lng, " 0)");
|
|
320
|
+
var pointData = processCsvData("geom,value\n\"".concat(point, "\",10"));
|
|
321
|
+
if (!polygonData || !pointData) throw new Error('WKT CSV import failed');
|
|
322
|
+
polys.updateSchema(polygonData);
|
|
323
|
+
pts.updateSchema(pointData);
|
|
324
|
+
expect(polys.fields[0].type).toBe(ALL_FIELD_TYPES.geojson);
|
|
325
|
+
expect(pts.fields[0].type).toBe(ALL_FIELD_TYPES.geojson);
|
|
326
|
+
state = reduceVisState(state, VisStateActions.addSpatialJoin('polys'));
|
|
327
|
+
var op = state.joins[0];
|
|
328
|
+
state = reduceVisState(state, VisStateActions.setSpatialJoinConfig(op.id, {
|
|
329
|
+
rightDataId: 'pts',
|
|
330
|
+
leftGeo: {
|
|
331
|
+
kind: 'geojson',
|
|
332
|
+
fieldName: 'geom'
|
|
333
|
+
},
|
|
334
|
+
rightGeo: {
|
|
335
|
+
kind: 'geojson',
|
|
336
|
+
fieldName: 'geom'
|
|
337
|
+
},
|
|
338
|
+
aggregations: {
|
|
339
|
+
value: 'sum'
|
|
340
|
+
}
|
|
341
|
+
}));
|
|
342
|
+
state = reduceVisState(state, VisStateActions.runSpatialJoin(op.id));
|
|
343
|
+
state = flushCreateTableTasks(state);
|
|
344
|
+
expect(state.joins).toHaveLength(0);
|
|
345
|
+
expect(state.datasets[op.resultId].dataContainer.rowAsArray(0)).toEqual([polygon, lng === 0 ? 1 : 0, lng === 0 ? 10 : null]);
|
|
346
|
+
expect(polys.dataContainer.valueAt(0, 0)).toBe(polygon);
|
|
347
|
+
expect(pts.dataContainer.valueAt(0, 0)).toBe(point);
|
|
348
|
+
}
|
|
349
|
+
});
|
|
166
350
|
test('delete spatial join source keeps result snapshot', function () {
|
|
167
351
|
var polygon = {
|
|
168
352
|
type: 'Polygon',
|
|
@@ -378,4 +562,649 @@ describe('suitability vis-state', function () {
|
|
|
378
562
|
expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD2 = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD2 === void 0 ? void 0 : _derivedMeta$derivedD2.type).toBe('suitability');
|
|
379
563
|
});
|
|
380
564
|
});
|
|
381
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsIlNjaGVtYU1hbmFnZXIiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsInZpc1N0YXRlUmVkdWNlciIsIklOSVRJQUxfVklTX1NUQVRFIiwicmVkdWNlVmlzU3RhdGUiLCJtYWtlVGFibGUiLCJpZCIsImZpZWxkcyIsInJvd3MiLCJ0YWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJyZWR1Y2UiLCJuZXh0U3RhdGUiLCJ0YXNrIiwiU3RyaW5nIiwiaW5jbHVkZXMiLCJ0YWJsZXMiLCJBcnJheSIsImlzQXJyYXkiLCJwYXlsb2FkIiwiX29iamVjdFNwcmVhZCIsIm9wdHMiLCJkYXRhIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwidGVzdCIsImNpdGllcyIsInN0cmluZyIsImludGVnZXIiLCJkYXRhc2V0cyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicmVzdWx0SWQiLCJydW5Hcm91cEJ5IiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJPYmplY3QiLCJrZXlzIiwicmVtb3ZlRGF0YXNldCIsInRvQmVVbmRlZmluZWQiLCJyZXN1bHRMYWJlbCIsInRvTWF0Y2giLCJhZGRKb2luIiwiam9pbnMiLCJwb2x5cyIsImdlb2pzb24iLCJhZGRTcGF0aWFsSm9pbiIsInByZWRpY2F0ZSIsImNvbmNhdCIsInNldFNwYXRpYWxKb2luQ29uZmlnIiwicG9seWdvbiIsImNvb3JkaW5hdGVzIiwicHRzIiwicmVhbCIsInJpZ2h0RGF0YUlkIiwibGVmdEdlbyIsImtpbmQiLCJyaWdodEdlbyIsImxhdEZpZWxkIiwibG5nRmllbGQiLCJ2YWx1ZSIsInJ1blNwYXRpYWxKb2luIiwiX2Rlcml2ZWRNZXRhJGRlcml2ZWREIiwiX3NhdmVkJGNvbmZpZyRjb25maWckIiwic2F2ZWQiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIiwic2l0ZVN0YXRlIiwic2l0ZXMiLCJhZGRTdWl0YWJpbGl0eSIsInN1aXRhYmlsaXRpZXMiLCJ3ZWlnaHRzIiwibGF0IiwibG5nIiwiYWNjZXNzIiwiY29zdCIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsIl9sYXllciRjb25maWckY29sb3JGaSIsInNldFN1aXRhYmlsaXR5Q29uZmlnIiwicnVuU3VpdGFiaWxpdHkiLCJyZXN1bHQiLCJ0b0NvbnRhaW4iLCJsYXllciIsImxheWVycyIsIml0ZW0iLCJkYXRhSWQiLCJjb2xvckZpZWxkIiwiZXJyb3IiLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQyIiwibm90IiwidG9IYXZlUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCBTY2hlbWFNYW5hZ2VyLCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2RyYWluVGFza3NGb3JUZXN0aW5nLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuXG5pbXBvcnQgdmlzU3RhdGVSZWR1Y2VyIGZyb20gJy4vdmlzLXN0YXRlJztcbmltcG9ydCB7SU5JVElBTF9WSVNfU1RBVEV9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcblxuY29uc3QgcmVkdWNlVmlzU3RhdGUgPSB2aXNTdGF0ZVJlZHVjZXIgYXMgKHN0YXRlOiBWaXNTdGF0ZSwgYWN0aW9uOiB1bmtub3duKSA9PiBWaXNTdGF0ZTtcblxuZnVuY3Rpb24gbWFrZVRhYmxlKGlkOiBzdHJpbmcsIGZpZWxkczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nfVtdLCByb3dzOiBhbnlbXVtdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgdGFibGUudXBkYXRlU2NoZW1hKHtcbiAgICBmaWVsZHM6IGZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgYW5hbHl6ZXJUeXBlOiBmaWVsZC50eXBlXG4gICAgfSkpLFxuICAgIHJvd3NcbiAgfSk7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuZnVuY3Rpb24gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlOiBWaXNTdGF0ZSkge1xuICBjb25zdCB0YXNrcyA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIHJldHVybiB0YXNrcy5yZWR1Y2UoKG5leHRTdGF0ZSwgdGFzaykgPT4ge1xuICAgIGlmICghU3RyaW5nKHRhc2subGFiZWwgfHwgJycpLmluY2x1ZGVzKCdDUkVBVEVfVEFCTEVfVEFTSycpKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZXMgPSAoQXJyYXkuaXNBcnJheSh0YXNrLnBheWxvYWQpID8gdGFzay5wYXlsb2FkIDogW3Rhc2sucGF5bG9hZF0pLm1hcChwYXlsb2FkID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiBwYXlsb2FkLmluZm8sIGNvbG9yOiBwYXlsb2FkLmNvbG9yLCAuLi5wYXlsb2FkLm9wdHN9KTtcbiAgICAgIHRhYmxlLnVwZGF0ZVNjaGVtYShwYXlsb2FkLmRhdGEpO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH0pO1xuICAgIHJldHVybiByZWR1Y2VWaXNTdGF0ZShuZXh0U3RhdGUsIHN1Y2NlZWRUYXNrV2l0aFZhbHVlcyh0YXNrLCB0YWJsZXMpKTtcbiAgfSwgc3RhdGUpO1xufVxuXG5kZXNjcmliZSgnZGF0YXNldCBvcHMgdmlzLXN0YXRlJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICB0ZXN0KCdydW5Hcm91cEJ5IGFkZHMgYSBkZXJpdmVkIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ3dlc3QnLCAxMF0sXG4gICAgICAgIFsnd2VzdCcsIDIwXSxcbiAgICAgICAgWydlYXN0JywgNDBdXG4gICAgICBdXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcElkID0gc3RhdGUuZ3JvdXBCeXNbMF0uaWQ7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcElkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0SWQgPSBzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRJZDtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcElkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0ubWV0YWRhdGEuZGVyaXZlZERhdGFzZXQpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ2dyb3VwQnknLFxuICAgICAgc291cmNlRGF0YUlkczogWydjaXRpZXMnXSxcbiAgICAgIG9wZXJhdGlvbklkOiBvcElkXG4gICAgfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXS5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgyKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRlIHBhcmVudCBrZWVwcyBkZXJpdmVkIGNoaWxkIHNuYXBzaG90JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKSkudG9IYXZlTGVuZ3RoKDIpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkR3JvdXBCeSB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW3tuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLFxuICAgICAgW1snd2VzdCddXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXmdyb3VwLWJ5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkSm9pbiB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZSgnY2l0aWVzJywgW3tuYW1lOiAnaWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfV0sIFtbJzEnXV0pO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEpvaW4oJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15qb2luLWRhdGFzZXQtXFxkezJ9JC8pO1xuICB9KTtcblxuICB0ZXN0KCdzZXRTcGF0aWFsSm9pbkNvbmZpZyB1cGRhdGVzIHRoZSBwcmVkaWNhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seXMgPSBtYWtlVGFibGUoJ3BvbHlzJywgW3tuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufV0sIFtdKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFNwYXRpYWxKb2luKCdwb2x5cycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zWzBdO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ2ludGVyc2VjdHMnKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvQmUoYHNwYXRpYWwtam9pbi0ke3N0YXRlLmpvaW5zWzBdLnJlc3VsdElkfWApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTcGF0aWFsSm9pbkNvbmZpZyhvcC5pZCwge3ByZWRpY2F0ZTogJ3dpdGhpbid9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnByZWRpY2F0ZSkudG9CZSgnd2l0aGluJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBzcGF0aWFsIGpvaW4gc291cmNlIGtlZXBzIHJlc3VsdCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBwb2x5Z29uID0ge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgW1xuICAgICAgICAgIFstMTAsIC0xMF0sXG4gICAgICAgICAgWzEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgMTBdLFxuICAgICAgICAgIFstMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAtMTBdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICB9O1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKFxuICAgICAgJ3BvbHlzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICduYW1lJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCBwb2x5Z29uXV1cbiAgICApO1xuICAgIGNvbnN0IHB0cyA9IG1ha2VUYWJsZShcbiAgICAgICdwdHMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ2xhdCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgICAge25hbWU6ICdsbmcnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWzAsIDAsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7cG9seXMsIHB0c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtcbiAgICAgICAgcmlnaHREYXRhSWQ6ICdwdHMnLFxuICAgICAgICBsZWZ0R2VvOiB7a2luZDogJ2dlb2pzb24nLCBmaWVsZE5hbWU6ICdnZW9tJ30sXG4gICAgICAgIHJpZ2h0R2VvOiB7a2luZDogJ2xhdGxuZycsIGxhdEZpZWxkOiAnbGF0JywgbG5nRmllbGQ6ICdsbmcnfSxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7dmFsdWU6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TcGF0aWFsSm9pbihvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgncHRzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5wdHMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucG9seXMpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NhdmUvbG9hZCByb3VuZHRyaXAga2VlcHMgdGhlIGRlcml2ZWQgZGF0YXNldCBhbmQgZHJvcHMgdGhlIGZpbmlzaGVkIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBTY2hlbWFNYW5hZ2VyLnNhdmUoe1xuICAgICAgdmlzU3RhdGU6IHN0YXRlLFxuICAgICAgbWFwU3RhdGU6IHt9LFxuICAgICAgbWFwU3R5bGU6IHt9LFxuICAgICAgdWlTdGF0ZToge31cbiAgICB9KTtcbiAgICBjb25zdCBkZXJpdmVkID0gc2F2ZWQuZGF0YXNldHMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YS5pZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGNvbnN0IGRlcml2ZWRNZXRhID0gZGVyaXZlZD8uZGF0YS5tZXRhZGF0YSBhc1xuICAgICAgfCB7ZGVyaXZlZERhdGFzZXQ/OiB7dHlwZT86IHN0cmluZ30gfCBudWxsfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgZXhwZWN0KGRlcml2ZWRNZXRhPy5kZXJpdmVkRGF0YXNldD8udHlwZSkudG9CZSgnZ3JvdXBCeScpO1xuICAgIGV4cGVjdChzYXZlZC5jb25maWcuY29uZmlnLnZpc1N0YXRlLmdyb3VwQnlzID8/IFtdKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdzdWl0YWJpbGl0eSB2aXMtc3RhdGUnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHNpdGVTdGF0ZSgpOiBWaXNTdGF0ZSB7XG4gICAgY29uc3Qgc2l0ZXMgPSBtYWtlVGFibGUoXG4gICAgICAnc2l0ZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ25hbWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ2FjY2VzcycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjb3N0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ2EnLCAwLCAwLCAwLCAxMDBdLFxuICAgICAgICBbJ2InLCAxLCAxLCA1LCAyMDBdLFxuICAgICAgICBbJ2MnLCAyLCAyLCAxMCwgMzAwXVxuICAgICAgXVxuICAgICk7XG4gICAgcmV0dXJuIHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHtzaXRlc319O1xuICB9XG5cbiAgdGVzdCgnYWRkU3VpdGFiaWxpdHkgc2VlZHMgbnVtZXJpYyB3ZWlnaHRzIGFuZCBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgZXhwZWN0KG9wLndlaWdodHMpLnRvRXF1YWwoe2xhdDogMSwgbG5nOiAxLCBhY2Nlc3M6IDEsIGNvc3Q6IDF9KTtcbiAgICBleHBlY3Qob3Aud2VpZ2h0U3RhbmRhcmRpemF0aW9uKS50b0JlKCdub3JtYWxpemUnKTtcbiAgICBleHBlY3Qob3AuZGF0YVN0YW5kYXJkaXphdGlvbikudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qob3Aub3V0cHV0RmllbGROYW1lKS50b0JlKCdzY29yZScpO1xuICAgIGV4cGVjdChvcC5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXnN1aXRhYmlsaXR5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnb3BlbmluZyBhIHN1aXRhYmlsaXR5IG9wIGNsb3NlcyBhbiBvcGVuIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0uaXNDb25maWdBY3RpdmUpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3NpdGVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuU3VpdGFiaWxpdHkgYWRkcyBhIHNjb3JlZCBkYXRhc2V0IGFuZCBhIGRlZmF1bHQgbGF5ZXInLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge2FjY2VzczogMSwgY29zdDogMX19KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3QocmVzdWx0Lm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdzdWl0YWJpbGl0eScsXG4gICAgICBzb3VyY2VEYXRhSWRzOiBbJ3NpdGVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvQ29udGFpbignc2NvcmUnKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZShmYWxzZSk7XG5cbiAgICBjb25zdCBsYXllciA9IHN0YXRlLmxheWVycy5maW5kKGl0ZW0gPT4gaXRlbS5jb25maWcuZGF0YUlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgZXhwZWN0KGxheWVyKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KGxheWVyPy5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnc2NvcmUnKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVubmluZyB3aXRob3V0IGEgd2VpZ2h0ZWQgZmllbGQgc3VyZmFjZXMgYW4gZXJyb3IgaW5zdGVhZCBvZiBhIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge319KSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5lcnJvcikudG9CZSgnU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBzY29yZScpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgdGhlIHNvdXJjZSBkYXRhc2V0IGRyb3BzIHRoZSBvcCBidXQga2VlcHMgdGhlIHNjb3JlZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2l0ZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhlIG9wIGNvbmZpZyBzdGF5cyBvdXQgb2Ygc2F2ZWQgbWFwcyB3aGlsZSB0aGUgZGVyaXZlZCBkYXRhc2V0IHBlcnNpc3RzJywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3VpdGFiaWxpdHkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3VpdGFiaWxpdGllcycpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdzdWl0YWJpbGl0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsZUFBZSxRQUFPLG9CQUFvQjtBQUNsRCxTQUFRQyxXQUFXLFFBQU8sa0JBQWtCO0FBQzVDLE9BQU9DLGFBQWEsTUFBa0Isb0JBQW9CO0FBQzFELFNBQVFDLG9CQUFvQixFQUFFQyxxQkFBcUIsUUFBTyxrQkFBa0I7QUFFNUUsT0FBT0MsZUFBZSxNQUFNLGFBQWE7QUFDekMsU0FBUUMsaUJBQWlCLFFBQU8sc0JBQXNCO0FBRXRELElBQU1DLGNBQWMsR0FBR0YsZUFBaUU7QUFFeEYsU0FBU0csU0FBU0EsQ0FBQ0MsRUFBVSxFQUFFQyxNQUFzQyxFQUFFQyxJQUFhLEVBQUU7RUFDcEYsSUFBTUMsS0FBSyxHQUFHLElBQUlYLFdBQVcsQ0FBQztJQUM1QlksSUFBSSxFQUFFO01BQUNKLEVBQUUsRUFBRkEsRUFBRTtNQUFFSyxLQUFLLEVBQUVMLEVBQUU7TUFBRU0sSUFBSSxFQUFFO0lBQU8sQ0FBQztJQUNwQ0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2pCLENBQUMsQ0FBQztFQUNGSixLQUFLLENBQUNLLFlBQVksQ0FBQztJQUNqQlAsTUFBTSxFQUFFQSxNQUFNLENBQUNRLEdBQUcsQ0FBQyxVQUFBQyxLQUFLO01BQUEsT0FBSztRQUMzQkMsSUFBSSxFQUFFRCxLQUFLLENBQUNDLElBQUk7UUFDaEJMLElBQUksRUFBRUksS0FBSyxDQUFDSixJQUFJO1FBQ2hCTSxZQUFZLEVBQUVGLEtBQUssQ0FBQ0o7TUFDdEIsQ0FBQztJQUFBLENBQUMsQ0FBQztJQUNISixJQUFJLEVBQUpBO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsT0FBT0MsS0FBSztBQUNkO0FBRUEsU0FBU1UscUJBQXFCQSxDQUFDQyxLQUFlLEVBQUU7RUFDOUMsSUFBTUMsS0FBSyxHQUFHckIsb0JBQW9CLENBQUMsQ0FBQztFQUNwQyxPQUFPcUIsS0FBSyxDQUFDQyxNQUFNLENBQUMsVUFBQ0MsU0FBUyxFQUFFQyxJQUFJLEVBQUs7SUFDdkMsSUFBSSxDQUFDQyxNQUFNLENBQUNELElBQUksQ0FBQ2IsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDZSxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRTtNQUMzRCxPQUFPSCxTQUFTO0lBQ2xCO0lBQ0EsSUFBTUksTUFBTSxHQUFHLENBQUNDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDTCxJQUFJLENBQUNNLE9BQU8sQ0FBQyxHQUFHTixJQUFJLENBQUNNLE9BQU8sR0FBRyxDQUFDTixJQUFJLENBQUNNLE9BQU8sQ0FBQyxFQUFFZixHQUFHLENBQUMsVUFBQWUsT0FBTyxFQUFJO01BQzFGLElBQU1yQixLQUFLLEdBQUcsSUFBSVgsV0FBVyxDQUFBaUMsYUFBQTtRQUFFckIsSUFBSSxFQUFFb0IsT0FBTyxDQUFDcEIsSUFBSTtRQUFFRyxLQUFLLEVBQUVpQixPQUFPLENBQUNqQjtNQUFLLEdBQUtpQixPQUFPLENBQUNFLElBQUksQ0FBQyxDQUFDO01BQzFGdkIsS0FBSyxDQUFDSyxZQUFZLENBQUNnQixPQUFPLENBQUNHLElBQUksQ0FBQztNQUNoQyxPQUFPeEIsS0FBSztJQUNkLENBQUMsQ0FBQztJQUNGLE9BQU9MLGNBQWMsQ0FBQ21CLFNBQVMsRUFBRXRCLHFCQUFxQixDQUFDdUIsSUFBSSxFQUFFRyxNQUFNLENBQUMsQ0FBQztFQUN2RSxDQUFDLEVBQUVQLEtBQUssQ0FBQztBQUNYO0FBRUFjLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxZQUFNO0VBQ3RDQyxVQUFVLENBQUMsWUFBTTtJQUNmbkMsb0JBQW9CLENBQUMsQ0FBQztFQUN4QixDQUFDLENBQUM7RUFFRm9DLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxZQUFNO0lBQzlDLElBQU1DLE1BQU0sR0FBR2hDLFNBQVMsQ0FDdEIsUUFBUSxFQUNSLENBQ0U7TUFBQ1ksSUFBSSxFQUFFLFFBQVE7TUFBRUwsSUFBSSxFQUFFaEIsZUFBZSxDQUFDMEM7SUFBTSxDQUFDLEVBQzlDO01BQUNyQixJQUFJLEVBQUUsS0FBSztNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUMyQztJQUFPLENBQUMsQ0FDN0MsRUFDRCxDQUNFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUNaLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUNaLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUVoQixDQUFDO0lBQ0QsSUFBSW5CLEtBQWUsR0FBQVcsYUFBQSxDQUFBQSxhQUFBLEtBQ2Q1QixpQkFBaUI7TUFDcEJxQyxRQUFRLEVBQUU7UUFBQ0gsTUFBTSxFQUFOQTtNQUFNO0lBQUMsRUFDbkI7SUFFRGpCLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQzRDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRUMsTUFBTSxDQUFDdEIsS0FBSyxDQUFDdUIsUUFBUSxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdEMsSUFBTUMsSUFBSSxHQUFHekIsS0FBSyxDQUFDdUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDckMsRUFBRTtJQUVqQ2MsS0FBSyxHQUFHaEIsY0FBYyxDQUNwQmdCLEtBQUssRUFDTHZCLGVBQWUsQ0FBQ2lELGdCQUFnQixDQUFDRCxJQUFJLEVBQUU7TUFDckNFLFNBQVMsRUFBRSxRQUFRO01BQ25CQyxZQUFZLEVBQUU7UUFBQ0MsR0FBRyxFQUFFO01BQUs7SUFDM0IsQ0FBQyxDQUNILENBQUM7SUFDRCxJQUFNQyxRQUFRLEdBQUc5QixLQUFLLENBQUN1QixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUNPLFFBQVE7SUFDM0M5QixLQUFLLEdBQUdoQixjQUFjLENBQUNnQixLQUFLLEVBQUV2QixlQUFlLENBQUNzRCxVQUFVLENBQUNOLElBQUksQ0FBQyxDQUFDO0lBQy9EekIsS0FBSyxHQUFHRCxxQkFBcUIsQ0FBQ0MsS0FBSyxDQUFDO0lBRXBDc0IsTUFBTSxDQUFDdEIsS0FBSyxDQUFDdUIsUUFBUSxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdENGLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ1UsUUFBUSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLENBQUM7SUFDN0NWLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ1UsUUFBUSxDQUFDLENBQUNHLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLENBQUNDLE9BQU8sQ0FBQztNQUMvRDNDLElBQUksRUFBRSxTQUFTO01BQ2Y0QyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7TUFDekJDLFdBQVcsRUFBRVo7SUFDZixDQUFDLENBQUM7SUFDRkgsTUFBTSxDQUFDdEIsS0FBSyxDQUFDb0IsUUFBUSxDQUFDVSxRQUFRLENBQUMsQ0FBQ1EsYUFBYSxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDbEUsQ0FBQyxDQUFDO0VBRUZ4QixJQUFJLENBQUMsNENBQTRDLEVBQUUsWUFBTTtJQUN2RCxJQUFNQyxNQUFNLEdBQUdoQyxTQUFTLENBQ3RCLFFBQVEsRUFDUixDQUNFO01BQUNZLElBQUksRUFBRSxRQUFRO01BQUVMLElBQUksRUFBRWhCLGVBQWUsQ0FBQzBDO0lBQU0sQ0FBQyxFQUM5QztNQUFDckIsSUFBSSxFQUFFLEtBQUs7TUFBRUwsSUFBSSxFQUFFaEIsZUFBZSxDQUFDMkM7SUFBTyxDQUFDLENBQzdDLEVBQ0QsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FDZixDQUFDO0lBQ0QsSUFBSW5CLEtBQWUsR0FBQVcsYUFBQSxDQUFBQSxhQUFBLEtBQ2Q1QixpQkFBaUI7TUFDcEJxQyxRQUFRLEVBQUU7UUFBQ0gsTUFBTSxFQUFOQTtNQUFNO0lBQUMsRUFDbkI7SUFDRGpCLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQzRDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRSxJQUFNb0IsRUFBRSxHQUFHekMsS0FBSyxDQUFDdUIsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1QnZCLEtBQUssR0FBR2hCLGNBQWMsQ0FDcEJnQixLQUFLLEVBQ0x2QixlQUFlLENBQUNpRCxnQkFBZ0IsQ0FBQ2UsRUFBRSxDQUFDdkQsRUFBRSxFQUFFO01BQ3RDeUMsU0FBUyxFQUFFLFFBQVE7TUFDbkJDLFlBQVksRUFBRTtRQUFDQyxHQUFHLEVBQUU7TUFBSztJQUMzQixDQUFDLENBQ0gsQ0FBQztJQUNEN0IsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDc0QsVUFBVSxDQUFDVSxFQUFFLENBQUN2RCxFQUFFLENBQUMsQ0FBQztJQUNoRWMsS0FBSyxHQUFHRCxxQkFBcUIsQ0FBQ0MsS0FBSyxDQUFDO0lBRXBDc0IsTUFBTSxDQUFDdEIsS0FBSyxDQUFDdUIsUUFBUSxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdENGLE1BQU0sQ0FBQ29CLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDM0MsS0FBSyxDQUFDb0IsUUFBUSxDQUFDLENBQUMsQ0FBQ0ksWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuRHhCLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQ21FLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RXRCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ0gsTUFBTSxDQUFDLENBQUM0QixhQUFhLENBQUMsQ0FBQztJQUM3Q3ZCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ3FCLEVBQUUsQ0FBQ1gsUUFBUSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLENBQUM7SUFDaERWLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ3VCLFFBQVEsQ0FBQyxDQUFDQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0VBQ3hDLENBQUMsQ0FBQztFQUVGUixJQUFJLENBQUMsNENBQTRDLEVBQUUsWUFBTTtJQUN2RCxJQUFNQyxNQUFNLEdBQUdoQyxTQUFTLENBQ3RCLFFBQVEsRUFDUixDQUFDO01BQUNZLElBQUksRUFBRSxRQUFRO01BQUVMLElBQUksRUFBRWhCLGVBQWUsQ0FBQzBDO0lBQU0sQ0FBQyxDQUFDLEVBQ2hELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FDWCxDQUFDO0lBQ0QsSUFBSWxCLEtBQWUsR0FBQVcsYUFBQSxDQUFBQSxhQUFBLEtBQ2Q1QixpQkFBaUI7TUFDcEJxQyxRQUFRLEVBQUU7UUFBQ0gsTUFBTSxFQUFOQTtNQUFNO0lBQUMsRUFDbkI7SUFDRGpCLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQzRDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRUMsTUFBTSxDQUFDdEIsS0FBSyxDQUFDdUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDdUIsV0FBVyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztFQUNuRSxDQUFDLENBQUM7RUFFRi9CLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxZQUFNO0lBQ3BELElBQU1DLE1BQU0sR0FBR2hDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztNQUFDWSxJQUFJLEVBQUUsSUFBSTtNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUMwQztJQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLElBQUlsQixLQUFlLEdBQUFXLGFBQUEsQ0FBQUEsYUFBQSxLQUNkNUIsaUJBQWlCO01BQ3BCcUMsUUFBUSxFQUFFO1FBQUNILE1BQU0sRUFBTkE7TUFBTTtJQUFDLEVBQ25CO0lBQ0RqQixLQUFLLEdBQUdoQixjQUFjLENBQUNnQixLQUFLLEVBQUV2QixlQUFlLENBQUN1RSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEUxQixNQUFNLENBQUN0QixLQUFLLENBQUNpRCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNILFdBQVcsQ0FBQyxDQUFDQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7RUFDcEUsQ0FBQyxDQUFDO0VBRUYvQixJQUFJLENBQUMsNENBQTRDLEVBQUUsWUFBTTtJQUN2RCxJQUFNa0MsS0FBSyxHQUFHakUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO01BQUNZLElBQUksRUFBRSxNQUFNO01BQUVMLElBQUksRUFBRWhCLGVBQWUsQ0FBQzJFO0lBQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3JGLElBQUluRCxLQUFlLEdBQUFXLGFBQUEsQ0FBQUEsYUFBQSxLQUNkNUIsaUJBQWlCO01BQ3BCcUMsUUFBUSxFQUFFO1FBQUM4QixLQUFLLEVBQUxBO01BQUs7SUFBQyxFQUNsQjtJQUNEbEQsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDMkUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLElBQU1YLEVBQUUsR0FBR3pDLEtBQUssQ0FBQ2lELEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekIzQixNQUFNLENBQUN0QixLQUFLLENBQUNpRCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNJLFNBQVMsQ0FBQyxDQUFDYixJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ25EbEIsTUFBTSxDQUFDdEIsS0FBSyxDQUFDaUQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDSCxXQUFXLENBQUMsQ0FBQ04sSUFBSSxpQkFBQWMsTUFBQSxDQUFpQnRELEtBQUssQ0FBQ2lELEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ25CLFFBQVEsQ0FBRSxDQUFDO0lBQ2xGOUIsS0FBSyxHQUFHaEIsY0FBYyxDQUNwQmdCLEtBQUssRUFDTHZCLGVBQWUsQ0FBQzhFLG9CQUFvQixDQUFDZCxFQUFFLENBQUN2RCxFQUFFLEVBQUU7TUFBQ21FLFNBQVMsRUFBRTtJQUFRLENBQUMsQ0FDbkUsQ0FBQztJQUNEL0IsTUFBTSxDQUFDdEIsS0FBSyxDQUFDaUQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDSSxTQUFTLENBQUMsQ0FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUNqRCxDQUFDLENBQUM7RUFFRnhCLElBQUksQ0FBQyxrREFBa0QsRUFBRSxZQUFNO0lBQzdELElBQU13QyxPQUFPLEdBQUc7TUFDZGhFLElBQUksRUFBRSxTQUFTO01BQ2ZpRSxXQUFXLEVBQUUsQ0FDWCxDQUNFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDVixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUNULENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUNSLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQ1QsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUNYO0lBRUwsQ0FBQztJQUNELElBQU1QLEtBQUssR0FBR2pFLFNBQVMsQ0FDckIsT0FBTyxFQUNQLENBQ0U7TUFBQ1ksSUFBSSxFQUFFLE1BQU07TUFBRUwsSUFBSSxFQUFFaEIsZUFBZSxDQUFDMEM7SUFBTSxDQUFDLEVBQzVDO01BQUNyQixJQUFJLEVBQUUsTUFBTTtNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUMyRTtJQUFPLENBQUMsQ0FDOUMsRUFDRCxDQUFDLENBQUMsTUFBTSxFQUFFSyxPQUFPLENBQUMsQ0FDcEIsQ0FBQztJQUNELElBQU1FLEdBQUcsR0FBR3pFLFNBQVMsQ0FDbkIsS0FBSyxFQUNMLENBQ0U7TUFBQ1ksSUFBSSxFQUFFLEtBQUs7TUFBRUwsSUFBSSxFQUFFaEIsZUFBZSxDQUFDbUY7SUFBSSxDQUFDLEVBQ3pDO01BQUM5RCxJQUFJLEVBQUUsS0FBSztNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUNtRjtJQUFJLENBQUMsRUFDekM7TUFBQzlELElBQUksRUFBRSxPQUFPO01BQUVMLElBQUksRUFBRWhCLGVBQWUsQ0FBQzJDO0lBQU8sQ0FBQyxDQUMvQyxFQUNELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNiLENBQUM7SUFDRCxJQUFJbkIsS0FBZSxHQUFBVyxhQUFBLENBQUFBLGFBQUEsS0FDZDVCLGlCQUFpQjtNQUNwQnFDLFFBQVEsRUFBRTtRQUFDOEIsS0FBSyxFQUFMQSxLQUFLO1FBQUVRLEdBQUcsRUFBSEE7TUFBRztJQUFDLEVBQ3ZCO0lBQ0QxRCxLQUFLLEdBQUdoQixjQUFjLENBQUNnQixLQUFLLEVBQUV2QixlQUFlLENBQUMyRSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEUsSUFBTVgsRUFBRSxHQUFHekMsS0FBSyxDQUFDaUQsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6QmpELEtBQUssR0FBR2hCLGNBQWMsQ0FDcEJnQixLQUFLLEVBQ0x2QixlQUFlLENBQUM4RSxvQkFBb0IsQ0FBQ2QsRUFBRSxDQUFDdkQsRUFBRSxFQUFFO01BQzFDMEUsV0FBVyxFQUFFLEtBQUs7TUFDbEJDLE9BQU8sRUFBRTtRQUFDQyxJQUFJLEVBQUUsU0FBUztRQUFFbkMsU0FBUyxFQUFFO01BQU0sQ0FBQztNQUM3Q29DLFFBQVEsRUFBRTtRQUFDRCxJQUFJLEVBQUUsUUFBUTtRQUFFRSxRQUFRLEVBQUUsS0FBSztRQUFFQyxRQUFRLEVBQUU7TUFBSyxDQUFDO01BQzVEckMsWUFBWSxFQUFFO1FBQUNzQyxLQUFLLEVBQUU7TUFBSztJQUM3QixDQUFDLENBQ0gsQ0FBQztJQUNEbEUsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDMEYsY0FBYyxDQUFDMUIsRUFBRSxDQUFDdkQsRUFBRSxDQUFDLENBQUM7SUFDcEVjLEtBQUssR0FBR0QscUJBQXFCLENBQUNDLEtBQUssQ0FBQztJQUVwQ3NCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ2lELEtBQUssQ0FBQyxDQUFDekIsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuQ0YsTUFBTSxDQUFDdEIsS0FBSyxDQUFDb0IsUUFBUSxDQUFDcUIsRUFBRSxDQUFDWCxRQUFRLENBQUMsQ0FBQyxDQUFDRSxVQUFVLENBQUMsQ0FBQztJQUNoRGhDLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQ21FLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRXRCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ3NDLEdBQUcsQ0FBQyxDQUFDYixhQUFhLENBQUMsQ0FBQztJQUMxQ3ZCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQzhCLEtBQUssQ0FBQyxDQUFDbEIsVUFBVSxDQUFDLENBQUM7SUFDekNWLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ3FCLEVBQUUsQ0FBQ1gsUUFBUSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLENBQUM7SUFDaERWLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ2lELEtBQUssQ0FBQyxDQUFDekIsWUFBWSxDQUFDLENBQUMsQ0FBQztFQUNyQyxDQUFDLENBQUM7RUFFRlIsSUFBSSxDQUFDLCtFQUErRSxFQUFFLFlBQU07SUFBQSxJQUFBb0QscUJBQUEsRUFBQUMscUJBQUE7SUFDMUYsSUFBTXBELE1BQU0sR0FBR2hDLFNBQVMsQ0FDdEIsUUFBUSxFQUNSLENBQ0U7TUFBQ1ksSUFBSSxFQUFFLFFBQVE7TUFBRUwsSUFBSSxFQUFFaEIsZUFBZSxDQUFDMEM7SUFBTSxDQUFDLEVBQzlDO01BQUNyQixJQUFJLEVBQUUsS0FBSztNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUMyQztJQUFPLENBQUMsQ0FDN0MsRUFDRCxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUNmLENBQUM7SUFDRCxJQUFJbkIsS0FBZSxHQUFBVyxhQUFBLENBQUFBLGFBQUEsS0FDZDVCLGlCQUFpQjtNQUNwQnFDLFFBQVEsRUFBRTtRQUFDSCxNQUFNLEVBQU5BO01BQU07SUFBQyxFQUNuQjtJQUNEakIsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDNEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25FLElBQU1vQixFQUFFLEdBQUd6QyxLQUFLLENBQUN1QixRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVCdkIsS0FBSyxHQUFHaEIsY0FBYyxDQUNwQmdCLEtBQUssRUFDTHZCLGVBQWUsQ0FBQ2lELGdCQUFnQixDQUFDZSxFQUFFLENBQUN2RCxFQUFFLEVBQUU7TUFDdEN5QyxTQUFTLEVBQUUsUUFBUTtNQUNuQkMsWUFBWSxFQUFFO1FBQUNDLEdBQUcsRUFBRTtNQUFLO0lBQzNCLENBQUMsQ0FDSCxDQUFDO0lBQ0Q3QixLQUFLLEdBQUdoQixjQUFjLENBQUNnQixLQUFLLEVBQUV2QixlQUFlLENBQUNzRCxVQUFVLENBQUNVLEVBQUUsQ0FBQ3ZELEVBQUUsQ0FBQyxDQUFDO0lBQ2hFYyxLQUFLLEdBQUdELHFCQUFxQixDQUFDQyxLQUFLLENBQUM7SUFFcEMsSUFBTXNFLEtBQUssR0FBRzNGLGFBQWEsQ0FBQzRGLElBQUksQ0FBQztNQUMvQkMsUUFBUSxFQUFFeEUsS0FBSztNQUNmeUUsUUFBUSxFQUFFLENBQUMsQ0FBQztNQUNaQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO01BQ1pDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDO0lBQ0YsSUFBTUMsT0FBTyxHQUFHTixLQUFLLENBQUNsRCxRQUFRLENBQUN5RCxJQUFJLENBQUMsVUFBQUMsT0FBTztNQUFBLE9BQUlBLE9BQU8sQ0FBQ2pFLElBQUksQ0FBQzNCLEVBQUUsS0FBS3VELEVBQUUsQ0FBQ1gsUUFBUTtJQUFBLEVBQUM7SUFDL0UsSUFBTWlELFdBQVcsR0FBR0gsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUvRCxJQUFJLENBQUNvQixRQUVyQjtJQUNiWCxNQUFNLENBQUN5RCxXQUFXLGFBQVhBLFdBQVcsZ0JBQUFYLHFCQUFBLEdBQVhXLFdBQVcsQ0FBRTdDLGNBQWMsY0FBQWtDLHFCQUFBLHVCQUEzQkEscUJBQUEsQ0FBNkI1RSxJQUFJLENBQUMsQ0FBQ2dELElBQUksQ0FBQyxTQUFTLENBQUM7SUFDekRsQixNQUFNLEVBQUErQyxxQkFBQSxHQUFDQyxLQUFLLENBQUNVLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDUixRQUFRLENBQUNqRCxRQUFRLGNBQUE4QyxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLEVBQUUsQ0FBQyxDQUFDN0MsWUFBWSxDQUFDLENBQUMsQ0FBQztFQUNyRSxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRlYsUUFBUSxDQUFDLHVCQUF1QixFQUFFLFlBQU07RUFDdENDLFVBQVUsQ0FBQyxZQUFNO0lBQ2ZuQyxvQkFBb0IsQ0FBQyxDQUFDO0VBQ3hCLENBQUMsQ0FBQztFQUVGLFNBQVNxRyxTQUFTQSxDQUFBLEVBQWE7SUFDN0IsSUFBTUMsS0FBSyxHQUFHakcsU0FBUyxDQUNyQixPQUFPLEVBQ1AsQ0FDRTtNQUFDWSxJQUFJLEVBQUUsTUFBTTtNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUMwQztJQUFNLENBQUMsRUFDNUM7TUFBQ3JCLElBQUksRUFBRSxLQUFLO01BQUVMLElBQUksRUFBRWhCLGVBQWUsQ0FBQ21GO0lBQUksQ0FBQyxFQUN6QztNQUFDOUQsSUFBSSxFQUFFLEtBQUs7TUFBRUwsSUFBSSxFQUFFaEIsZUFBZSxDQUFDbUY7SUFBSSxDQUFDLEVBQ3pDO01BQUM5RCxJQUFJLEVBQUUsUUFBUTtNQUFFTCxJQUFJLEVBQUVoQixlQUFlLENBQUMyQztJQUFPLENBQUMsRUFDL0M7TUFBQ3RCLElBQUksRUFBRSxNQUFNO01BQUVMLElBQUksRUFBRWhCLGVBQWUsQ0FBQzJDO0lBQU8sQ0FBQyxDQUM5QyxFQUNELENBQ0UsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQ25CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUNuQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FFeEIsQ0FBQztJQUNELE9BQUFSLGFBQUEsQ0FBQUEsYUFBQSxLQUFXNUIsaUJBQWlCO01BQUVxQyxRQUFRLEVBQUU7UUFBQzhELEtBQUssRUFBTEE7TUFBSztJQUFDO0VBQ2pEO0VBRUFsRSxJQUFJLENBQUMscUVBQXFFLEVBQUUsWUFBTTtJQUNoRixJQUFNaEIsS0FBSyxHQUFHaEIsY0FBYyxDQUFDaUcsU0FBUyxDQUFDLENBQUMsRUFBRXhHLGVBQWUsQ0FBQzBHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVsRjdELE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29GLGFBQWEsQ0FBQyxDQUFDNUQsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFNaUIsRUFBRSxHQUFHekMsS0FBSyxDQUFDb0YsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNqQzlELE1BQU0sQ0FBQ21CLEVBQUUsQ0FBQzRDLE9BQU8sQ0FBQyxDQUFDbEQsT0FBTyxDQUFDO01BQUNtRCxHQUFHLEVBQUUsQ0FBQztNQUFFQyxHQUFHLEVBQUUsQ0FBQztNQUFFQyxNQUFNLEVBQUUsQ0FBQztNQUFFQyxJQUFJLEVBQUU7SUFBQyxDQUFDLENBQUM7SUFDaEVuRSxNQUFNLENBQUNtQixFQUFFLENBQUNpRCxxQkFBcUIsQ0FBQyxDQUFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNsRGxCLE1BQU0sQ0FBQ21CLEVBQUUsQ0FBQ2tELG1CQUFtQixDQUFDLENBQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzVDbEIsTUFBTSxDQUFDbUIsRUFBRSxDQUFDbUQsZUFBZSxDQUFDLENBQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hDbEIsTUFBTSxDQUFDbUIsRUFBRSxDQUFDSyxXQUFXLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLHFCQUFxQixDQUFDO0VBQ3ZELENBQUMsQ0FBQztFQUVGL0IsSUFBSSxDQUFDLGtEQUFrRCxFQUFFLFlBQU07SUFDN0QsSUFBSWhCLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2lHLFNBQVMsQ0FBQyxDQUFDLEVBQUV4RyxlQUFlLENBQUM0QyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUVDLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ3VCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ3NFLGNBQWMsQ0FBQyxDQUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQztJQUVuRHhDLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQzBHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RTdELE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ3VCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ3NFLGNBQWMsQ0FBQyxDQUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwRGxCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29GLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQ1MsY0FBYyxDQUFDLENBQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDO0lBRXhEeEMsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDNEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFQyxNQUFNLENBQUN0QixLQUFLLENBQUNvRixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUNTLGNBQWMsQ0FBQyxDQUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUMzRCxDQUFDLENBQUM7RUFFRnhCLElBQUksQ0FBQywwREFBMEQsRUFBRSxZQUFNO0lBQUEsSUFBQThFLHFCQUFBO0lBQ3JFLElBQUk5RixLQUFLLEdBQUdoQixjQUFjLENBQUNpRyxTQUFTLENBQUMsQ0FBQyxFQUFFeEcsZUFBZSxDQUFDMEcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLElBQU0xQyxFQUFFLEdBQUd6QyxLQUFLLENBQUNvRixhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWpDcEYsS0FBSyxHQUFHaEIsY0FBYyxDQUNwQmdCLEtBQUssRUFDTHZCLGVBQWUsQ0FBQ3NILG9CQUFvQixDQUFDdEQsRUFBRSxDQUFDdkQsRUFBRSxFQUFFO01BQUNtRyxPQUFPLEVBQUU7UUFBQ0csTUFBTSxFQUFFLENBQUM7UUFBRUMsSUFBSSxFQUFFO01BQUM7SUFBQyxDQUFDLENBQzdFLENBQUM7SUFDRHpGLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQ3VILGNBQWMsQ0FBQ3ZELEVBQUUsQ0FBQ3ZELEVBQUUsQ0FBQyxDQUFDO0lBQ3BFYyxLQUFLLEdBQUdELHFCQUFxQixDQUFDQyxLQUFLLENBQUM7SUFFcEMsSUFBTWlHLE1BQU0sR0FBR2pHLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ3FCLEVBQUUsQ0FBQ1gsUUFBUSxDQUFDO0lBQzFDUixNQUFNLENBQUMyRSxNQUFNLENBQUMsQ0FBQ2pFLFVBQVUsQ0FBQyxDQUFDO0lBQzNCVixNQUFNLENBQUMyRSxNQUFNLENBQUNoRSxRQUFRLENBQUNDLGNBQWMsQ0FBQyxDQUFDQyxPQUFPLENBQUM7TUFDN0MzQyxJQUFJLEVBQUUsYUFBYTtNQUNuQjRDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQztNQUN4QkMsV0FBVyxFQUFFSSxFQUFFLENBQUN2RDtJQUNsQixDQUFDLENBQUM7SUFDRm9DLE1BQU0sQ0FBQzJFLE1BQU0sQ0FBQzlHLE1BQU0sQ0FBQ1EsR0FBRyxDQUFDLFVBQUFDLEtBQUs7TUFBQSxPQUFJQSxLQUFLLENBQUNDLElBQUk7SUFBQSxFQUFDLENBQUMsQ0FBQ3FHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDakU1RSxNQUFNLENBQUN0QixLQUFLLENBQUNvRixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUNTLGNBQWMsQ0FBQyxDQUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUV6RCxJQUFNMkQsS0FBSyxHQUFHbkcsS0FBSyxDQUFDb0csTUFBTSxDQUFDdkIsSUFBSSxDQUFDLFVBQUF3QixJQUFJO01BQUEsT0FBSUEsSUFBSSxDQUFDckIsTUFBTSxDQUFDc0IsTUFBTSxLQUFLN0QsRUFBRSxDQUFDWCxRQUFRO0lBQUEsRUFBQztJQUMzRVIsTUFBTSxDQUFDNkUsS0FBSyxDQUFDLENBQUNuRSxVQUFVLENBQUMsQ0FBQztJQUMxQlYsTUFBTSxDQUFDNkUsS0FBSyxhQUFMQSxLQUFLLGdCQUFBTCxxQkFBQSxHQUFMSyxLQUFLLENBQUVuQixNQUFNLENBQUN1QixVQUFVLGNBQUFULHFCQUFBLHVCQUF4QkEscUJBQUEsQ0FBMEJqRyxJQUFJLENBQUMsQ0FBQzJDLElBQUksQ0FBQyxPQUFPLENBQUM7RUFDdEQsQ0FBQyxDQUFDO0VBRUZ4QixJQUFJLENBQUMseUVBQXlFLEVBQUUsWUFBTTtJQUNwRixJQUFJaEIsS0FBSyxHQUFHaEIsY0FBYyxDQUFDaUcsU0FBUyxDQUFDLENBQUMsRUFBRXhHLGVBQWUsQ0FBQzBHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixJQUFNMUMsRUFBRSxHQUFHekMsS0FBSyxDQUFDb0YsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVqQ3BGLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQ3NILG9CQUFvQixDQUFDdEQsRUFBRSxDQUFDdkQsRUFBRSxFQUFFO01BQUNtRyxPQUFPLEVBQUUsQ0FBQztJQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pGckYsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDdUgsY0FBYyxDQUFDdkQsRUFBRSxDQUFDdkQsRUFBRSxDQUFDLENBQUM7SUFFcEVvQyxNQUFNLENBQUN0QixLQUFLLENBQUNvRixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUNvQixLQUFLLENBQUMsQ0FBQ2hFLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQztJQUMvRWxCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29GLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQ1MsY0FBYyxDQUFDLENBQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hEbEIsTUFBTSxDQUFDdEIsS0FBSyxDQUFDb0IsUUFBUSxDQUFDcUIsRUFBRSxDQUFDWCxRQUFRLENBQUMsQ0FBQyxDQUFDZSxhQUFhLENBQUMsQ0FBQztFQUNyRCxDQUFDLENBQUM7RUFFRjdCLElBQUksQ0FBQyx3RUFBd0UsRUFBRSxZQUFNO0lBQ25GLElBQUloQixLQUFLLEdBQUdoQixjQUFjLENBQUNpRyxTQUFTLENBQUMsQ0FBQyxFQUFFeEcsZUFBZSxDQUFDMEcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLElBQU0xQyxFQUFFLEdBQUd6QyxLQUFLLENBQUNvRixhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2pDcEYsS0FBSyxHQUFHaEIsY0FBYyxDQUFDZ0IsS0FBSyxFQUFFdkIsZUFBZSxDQUFDdUgsY0FBYyxDQUFDdkQsRUFBRSxDQUFDdkQsRUFBRSxDQUFDLENBQUM7SUFDcEVjLEtBQUssR0FBR0QscUJBQXFCLENBQUNDLEtBQUssQ0FBQztJQUVwQ3NCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ3FCLEVBQUUsQ0FBQ1gsUUFBUSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLENBQUM7SUFDaERoQyxLQUFLLEdBQUdoQixjQUFjLENBQUNnQixLQUFLLEVBQUV2QixlQUFlLENBQUNtRSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckV0QixNQUFNLENBQUN0QixLQUFLLENBQUNvQixRQUFRLENBQUM4RCxLQUFLLENBQUMsQ0FBQ3JDLGFBQWEsQ0FBQyxDQUFDO0lBQzVDdkIsTUFBTSxDQUFDdEIsS0FBSyxDQUFDb0IsUUFBUSxDQUFDcUIsRUFBRSxDQUFDWCxRQUFRLENBQUMsQ0FBQyxDQUFDRSxVQUFVLENBQUMsQ0FBQztJQUNoRFYsTUFBTSxDQUFDdEIsS0FBSyxDQUFDb0YsYUFBYSxDQUFDLENBQUM1RCxZQUFZLENBQUMsQ0FBQyxDQUFDO0VBQzdDLENBQUMsQ0FBQztFQUVGUixJQUFJLENBQUMsMEVBQTBFLEVBQUUsWUFBTTtJQUFBLElBQUF5RixzQkFBQTtJQUNyRixJQUFJekcsS0FBSyxHQUFHaEIsY0FBYyxDQUFDaUcsU0FBUyxDQUFDLENBQUMsRUFBRXhHLGVBQWUsQ0FBQzBHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixJQUFNMUMsRUFBRSxHQUFHekMsS0FBSyxDQUFDb0YsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNqQ3BGLEtBQUssR0FBR2hCLGNBQWMsQ0FBQ2dCLEtBQUssRUFBRXZCLGVBQWUsQ0FBQ3VILGNBQWMsQ0FBQ3ZELEVBQUUsQ0FBQ3ZELEVBQUUsQ0FBQyxDQUFDO0lBQ3BFYyxLQUFLLEdBQUdELHFCQUFxQixDQUFDQyxLQUFLLENBQUM7SUFFcEMsSUFBTXNFLEtBQUssR0FBRzNGLGFBQWEsQ0FBQzRGLElBQUksQ0FBQztNQUMvQkMsUUFBUSxFQUFFeEUsS0FBSztNQUNmeUUsUUFBUSxFQUFFLENBQUMsQ0FBQztNQUNaQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO01BQ1pDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDO0lBRUZyRCxNQUFNLENBQUNnRCxLQUFLLENBQUNVLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDUixRQUFRLENBQUMsQ0FBQ2tDLEdBQUcsQ0FBQ0MsY0FBYyxDQUFDLGVBQWUsQ0FBQztJQUN4RSxJQUFNL0IsT0FBTyxHQUFHTixLQUFLLENBQUNsRCxRQUFRLENBQUN5RCxJQUFJLENBQUMsVUFBQUMsT0FBTztNQUFBLE9BQUlBLE9BQU8sQ0FBQ2pFLElBQUksQ0FBQzNCLEVBQUUsS0FBS3VELEVBQUUsQ0FBQ1gsUUFBUTtJQUFBLEVBQUM7SUFDL0UsSUFBTWlELFdBQVcsR0FBR0gsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUvRCxJQUFJLENBQUNvQixRQUVyQjtJQUNiWCxNQUFNLENBQUN5RCxXQUFXLGFBQVhBLFdBQVcsZ0JBQUEwQixzQkFBQSxHQUFYMUIsV0FBVyxDQUFFN0MsY0FBYyxjQUFBdUUsc0JBQUEsdUJBQTNCQSxzQkFBQSxDQUE2QmpILElBQUksQ0FBQyxDQUFDZ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQztFQUMvRCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
565
|
+
describe('native GeoArrow attribute joins', function () {
|
|
566
|
+
var metadataKey = 'ARROW:extension:name';
|
|
567
|
+
var point = function point(x) {
|
|
568
|
+
return {
|
|
569
|
+
type: 'Point',
|
|
570
|
+
coordinates: [x, x + 1]
|
|
571
|
+
};
|
|
572
|
+
};
|
|
573
|
+
var multi = function multi(x) {
|
|
574
|
+
return {
|
|
575
|
+
type: 'MultiPoint',
|
|
576
|
+
coordinates: [[x, x + 1], [x + 2, x + 3]]
|
|
577
|
+
};
|
|
578
|
+
};
|
|
579
|
+
var pointType = new arrow.FixedSizeList(2, new arrow.Field('xy', new arrow.Float64(), false));
|
|
580
|
+
var list = function list(type) {
|
|
581
|
+
return new arrow.List(new arrow.Field('item', type, true));
|
|
582
|
+
};
|
|
583
|
+
var originalResponse = globalThis.Response;
|
|
584
|
+
beforeAll(function () {
|
|
585
|
+
globalThis.Response = Response;
|
|
586
|
+
});
|
|
587
|
+
afterAll(function () {
|
|
588
|
+
globalThis.Response = originalResponse;
|
|
589
|
+
});
|
|
590
|
+
beforeEach(function () {
|
|
591
|
+
drainTasksForTesting();
|
|
592
|
+
});
|
|
593
|
+
function nativeSource(_x, _x2, _x3, _x4) {
|
|
594
|
+
return _nativeSource.apply(this, arguments);
|
|
595
|
+
}
|
|
596
|
+
function _nativeSource() {
|
|
597
|
+
_nativeSource = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee0(id, encoding, type, coordinates) {
|
|
598
|
+
var keys,
|
|
599
|
+
input,
|
|
600
|
+
decoded,
|
|
601
|
+
_yield$processFileDat3,
|
|
602
|
+
_yield$processFileDat4,
|
|
603
|
+
file,
|
|
604
|
+
dataset,
|
|
605
|
+
_args0 = arguments;
|
|
606
|
+
return _regeneratorRuntime.wrap(function _callee0$(_context0) {
|
|
607
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
608
|
+
case 0:
|
|
609
|
+
keys = _args0.length > 4 && _args0[4] !== undefined ? _args0[4] : coordinates.map(function (_, i) {
|
|
610
|
+
return String(i);
|
|
611
|
+
});
|
|
612
|
+
input = new arrow.Table({
|
|
613
|
+
key: arrow.vectorFromArray(keys),
|
|
614
|
+
geometry: arrow.vectorFromArray(coordinates, type)
|
|
615
|
+
});
|
|
616
|
+
input.schema.fields[1].metadata.set(metadataKey, encoding);
|
|
617
|
+
decoded = arrow.tableFromIPC(arrow.tableToIPC(input, 'stream'));
|
|
618
|
+
_context0.next = 6;
|
|
619
|
+
return processFileData({
|
|
620
|
+
content: {
|
|
621
|
+
fileName: "".concat(id, ".arrow"),
|
|
622
|
+
data: decoded.batches
|
|
623
|
+
},
|
|
624
|
+
fileCache: []
|
|
625
|
+
});
|
|
626
|
+
case 6:
|
|
627
|
+
_yield$processFileDat3 = _context0.sent;
|
|
628
|
+
_yield$processFileDat4 = _slicedToArray(_yield$processFileDat3, 1);
|
|
629
|
+
file = _yield$processFileDat4[0];
|
|
630
|
+
dataset = new KeplerTable({
|
|
631
|
+
info: {
|
|
632
|
+
id: id,
|
|
633
|
+
label: id
|
|
634
|
+
},
|
|
635
|
+
color: [1, 2, 3]
|
|
636
|
+
});
|
|
637
|
+
_context0.next = 12;
|
|
638
|
+
return dataset.importData({
|
|
639
|
+
data: file.data
|
|
640
|
+
});
|
|
641
|
+
case 12:
|
|
642
|
+
return _context0.abrupt("return", dataset);
|
|
643
|
+
case 13:
|
|
644
|
+
case "end":
|
|
645
|
+
return _context0.stop();
|
|
646
|
+
}
|
|
647
|
+
}, _callee0);
|
|
648
|
+
}));
|
|
649
|
+
return _nativeSource.apply(this, arguments);
|
|
650
|
+
}
|
|
651
|
+
function source(id, kind) {
|
|
652
|
+
var keys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ['a', 'b'];
|
|
653
|
+
var values = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [10, 40];
|
|
654
|
+
return nativeSource(id, "geoarrow.".concat(kind.toLowerCase()), kind === 'Point' ? pointType : list(pointType), values.map(function (x) {
|
|
655
|
+
return x === null ? null : (kind === 'Point' ? point(x) : multi(x)).coordinates;
|
|
656
|
+
}), keys);
|
|
657
|
+
}
|
|
658
|
+
function join(left, right) {
|
|
659
|
+
var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
660
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
661
|
+
datasets: _defineProperty(_defineProperty({}, left.id, left), right.id, right)
|
|
662
|
+
});
|
|
663
|
+
state = reduceVisState(state, VisStateActions.addJoin(left.id));
|
|
664
|
+
var op = state.joins[0];
|
|
665
|
+
state = reduceVisState(state, VisStateActions.setJoinConfig(op.id, _objectSpread({
|
|
666
|
+
rightDataId: right.id,
|
|
667
|
+
leftField: 'key',
|
|
668
|
+
rightField: 'key',
|
|
669
|
+
type: 'LEFT'
|
|
670
|
+
}, config)));
|
|
671
|
+
state = reduceVisState(state, VisStateActions.runJoin(op.id));
|
|
672
|
+
state = flushCreateTableTasks(state);
|
|
673
|
+
return {
|
|
674
|
+
state: state,
|
|
675
|
+
result: state.datasets[op.resultId],
|
|
676
|
+
resultId: op.resultId
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
function features(dataset, fieldIndex) {
|
|
680
|
+
var props = GeoJsonLayer.findDefaultLayerProps(dataset).props;
|
|
681
|
+
expect(props.length).toBeGreaterThan(0);
|
|
682
|
+
var layer = new GeoJsonLayer(_objectSpread(_objectSpread({}, props[0]), {}, {
|
|
683
|
+
dataId: dataset.id
|
|
684
|
+
}, fieldIndex === undefined ? {} : {
|
|
685
|
+
columns: {
|
|
686
|
+
geojson: {
|
|
687
|
+
value: dataset.fields[fieldIndex].name,
|
|
688
|
+
fieldIdx: fieldIndex
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
}));
|
|
692
|
+
layer.setInitialLayerConfig(dataset);
|
|
693
|
+
return layer.formatLayerData(_defineProperty({}, dataset.id, dataset), {}).data;
|
|
694
|
+
}
|
|
695
|
+
function rawFingerprint(dataset) {
|
|
696
|
+
var column = dataset.dataContainer.getColumn(1);
|
|
697
|
+
var _bytes = function bytes(data) {
|
|
698
|
+
return {
|
|
699
|
+
type: String(data.type),
|
|
700
|
+
offset: data.offset,
|
|
701
|
+
length: data.length,
|
|
702
|
+
nullCount: data.nullCount,
|
|
703
|
+
buffers: data.buffers.map(function (b) {
|
|
704
|
+
return b ? Array.from(new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) : null;
|
|
705
|
+
}),
|
|
706
|
+
children: data.children.map(_bytes)
|
|
707
|
+
};
|
|
708
|
+
};
|
|
709
|
+
return {
|
|
710
|
+
column: column,
|
|
711
|
+
chunks: column.data.slice(),
|
|
712
|
+
content: JSON.stringify(column.data.map(_bytes)),
|
|
713
|
+
metadata: Array.from(dataset.fields[1].metadata.entries())
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
function assertUnchanged(dataset, before) {
|
|
717
|
+
var after = rawFingerprint(dataset);
|
|
718
|
+
expect(after.column).toBe(before.column);
|
|
719
|
+
after.chunks.forEach(function (chunk, i) {
|
|
720
|
+
return expect(chunk).toBe(before.chunks[i]);
|
|
721
|
+
});
|
|
722
|
+
expect(after.content).toBe(before.content);
|
|
723
|
+
expect(after.metadata).toEqual(before.metadata);
|
|
724
|
+
}
|
|
725
|
+
function roundtrip(dataset) {
|
|
726
|
+
var saved = datasetSchema[VERSIONS.v1].save(dataset);
|
|
727
|
+
var loaded = datasetSchema[VERSIONS.v1].load(JSON.parse(JSON.stringify(saved)));
|
|
728
|
+
return new KeplerTable({
|
|
729
|
+
info: {
|
|
730
|
+
id: "".concat(dataset.id, "-reload")
|
|
731
|
+
},
|
|
732
|
+
color: [1, 2, 3]
|
|
733
|
+
}).updateSchema(loaded.data);
|
|
734
|
+
}
|
|
735
|
+
test.each(['Point', 'MultiPoint'])('preserves imported %s geometry through join actions, layer accessors, export and reload', /*#__PURE__*/function () {
|
|
736
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(kind) {
|
|
737
|
+
var left, before, right, expected, _join, result, state, _i3, _arr3, dataset, data, control;
|
|
738
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
739
|
+
while (1) switch (_context.prev = _context.next) {
|
|
740
|
+
case 0:
|
|
741
|
+
_context.next = 2;
|
|
742
|
+
return source('native', kind);
|
|
743
|
+
case 2:
|
|
744
|
+
left = _context.sent;
|
|
745
|
+
before = rawFingerprint(left);
|
|
746
|
+
right = makeTable('lookup', [{
|
|
747
|
+
name: 'key',
|
|
748
|
+
type: 'string'
|
|
749
|
+
}, {
|
|
750
|
+
name: 'value',
|
|
751
|
+
type: 'real'
|
|
752
|
+
}], [['a', 1], ['b', 2]]);
|
|
753
|
+
expected = [10, 40].map(function (x) {
|
|
754
|
+
return kind === 'Point' ? point(x) : multi(x);
|
|
755
|
+
});
|
|
756
|
+
expect(datasetToFeatureCollection(left.dataContainer, left.fields).features.map(function (f) {
|
|
757
|
+
return f.geometry;
|
|
758
|
+
})).toEqual(expected);
|
|
759
|
+
_join = join(left, right), result = _join.result, state = _join.state;
|
|
760
|
+
expect(state.joins).toHaveLength(0);
|
|
761
|
+
expect(result.dataContainer.constructor.name).toBe('RowDataContainer');
|
|
762
|
+
expect(result.dataContainer.numRows()).toBe(2);
|
|
763
|
+
expect(result.fields[1]).toMatchObject({
|
|
764
|
+
type: 'geojson',
|
|
765
|
+
analyzerType: 'GEOMETRY_FROM_STRING'
|
|
766
|
+
});
|
|
767
|
+
expect(result.fields[1].metadata).toBeUndefined();
|
|
768
|
+
expect(JSON.parse(result.fields[1].valueAccessor({
|
|
769
|
+
index: 0
|
|
770
|
+
}))).toEqual(expected[0]);
|
|
771
|
+
expect(result.fields[3].valueAccessor({
|
|
772
|
+
index: 1
|
|
773
|
+
})).toBe(2);
|
|
774
|
+
expect(state.layers.filter(function (layer) {
|
|
775
|
+
return layer.config.dataId === result.id;
|
|
776
|
+
})).toHaveLength(1);
|
|
777
|
+
for (_i3 = 0, _arr3 = [result, roundtrip(result)]; _i3 < _arr3.length; _i3++) {
|
|
778
|
+
dataset = _arr3[_i3];
|
|
779
|
+
expect(features(dataset).map(function (f) {
|
|
780
|
+
return f.geometry;
|
|
781
|
+
})).toEqual(expected);
|
|
782
|
+
expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features.map(function (f) {
|
|
783
|
+
return f.geometry;
|
|
784
|
+
})).toEqual(expected);
|
|
785
|
+
}
|
|
786
|
+
data = processGeojson({
|
|
787
|
+
type: 'FeatureCollection',
|
|
788
|
+
features: expected.map(function (geometry, i) {
|
|
789
|
+
return {
|
|
790
|
+
type: 'Feature',
|
|
791
|
+
geometry: geometry,
|
|
792
|
+
properties: {
|
|
793
|
+
key: ['a', 'b'][i]
|
|
794
|
+
}
|
|
795
|
+
};
|
|
796
|
+
})
|
|
797
|
+
});
|
|
798
|
+
control = new KeplerTable({
|
|
799
|
+
info: {
|
|
800
|
+
id: 'geojson'
|
|
801
|
+
},
|
|
802
|
+
color: [1, 2, 3]
|
|
803
|
+
}).updateSchema(data);
|
|
804
|
+
expect(features(join(control, right).result).map(function (f) {
|
|
805
|
+
return f.geometry;
|
|
806
|
+
})).toEqual(expected);
|
|
807
|
+
assertUnchanged(left, before);
|
|
808
|
+
case 21:
|
|
809
|
+
case "end":
|
|
810
|
+
return _context.stop();
|
|
811
|
+
}
|
|
812
|
+
}, _callee);
|
|
813
|
+
}));
|
|
814
|
+
return function (_x5) {
|
|
815
|
+
return _ref.apply(this, arguments);
|
|
816
|
+
};
|
|
817
|
+
}());
|
|
818
|
+
test.each(['Point', 'MultiPoint'])('preserves %s on both sides with duplicates, nulls, unmatched rows and empty joins', /*#__PURE__*/function () {
|
|
819
|
+
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(kind) {
|
|
820
|
+
var left, right, beforeLeft, beforeRight, _iterator, _step, _step$value, type, expectedRows, leftFeatures, rightFeatures, _join2, result, _state, _i4, _arr4, dataset, empty;
|
|
821
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
822
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
823
|
+
case 0:
|
|
824
|
+
_context2.next = 2;
|
|
825
|
+
return source('left', kind, ['a', 'b', 'c', null], [10, null, 40, 70]);
|
|
826
|
+
case 2:
|
|
827
|
+
left = _context2.sent;
|
|
828
|
+
_context2.next = 5;
|
|
829
|
+
return source('right', kind, ['a', 'a', 'd', null], [20, null, 50, 80]);
|
|
830
|
+
case 5:
|
|
831
|
+
right = _context2.sent;
|
|
832
|
+
beforeLeft = rawFingerprint(left);
|
|
833
|
+
beforeRight = rawFingerprint(right);
|
|
834
|
+
_iterator = _createForOfIteratorHelper([['LEFT', 5, 4, 1], ['INNER', 2, 2, 1], ['FULL', 7, 4, 3]]);
|
|
835
|
+
try {
|
|
836
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
837
|
+
_step$value = _slicedToArray(_step.value, 4), type = _step$value[0], expectedRows = _step$value[1], leftFeatures = _step$value[2], rightFeatures = _step$value[3];
|
|
838
|
+
_join2 = join(left, right, {
|
|
839
|
+
type: type
|
|
840
|
+
}), result = _join2.result, _state = _join2.state;
|
|
841
|
+
expect(_state.joins).toHaveLength(0);
|
|
842
|
+
expect(result.dataContainer.numRows()).toBe(expectedRows);
|
|
843
|
+
for (_i4 = 0, _arr4 = [result, roundtrip(result)]; _i4 < _arr4.length; _i4++) {
|
|
844
|
+
dataset = _arr4[_i4];
|
|
845
|
+
expect(features(dataset, 1)).toHaveLength(leftFeatures);
|
|
846
|
+
expect(features(dataset, 3)).toHaveLength(rightFeatures);
|
|
847
|
+
}
|
|
848
|
+
expect(result.dataContainer.valueAt(1, 3)).toBeNull();
|
|
849
|
+
if (type !== 'INNER') expect(result.dataContainer.valueAt(2, 1)).toBeNull();
|
|
850
|
+
if (type === 'FULL') expect(result.dataContainer.valueAt(5, 1)).toBeNull();
|
|
851
|
+
}
|
|
852
|
+
} catch (err) {
|
|
853
|
+
_iterator.e(err);
|
|
854
|
+
} finally {
|
|
855
|
+
_iterator.f();
|
|
856
|
+
}
|
|
857
|
+
_context2.t0 = join;
|
|
858
|
+
_context2.t1 = left;
|
|
859
|
+
_context2.next = 14;
|
|
860
|
+
return source('absent', kind, ['none'], [90]);
|
|
861
|
+
case 14:
|
|
862
|
+
_context2.t2 = _context2.sent;
|
|
863
|
+
_context2.t3 = {
|
|
864
|
+
type: 'INNER'
|
|
865
|
+
};
|
|
866
|
+
empty = (0, _context2.t0)(_context2.t1, _context2.t2, _context2.t3).result;
|
|
867
|
+
expect(empty.dataContainer.numRows()).toBe(0);
|
|
868
|
+
expect(features(empty, 1)).toEqual([]);
|
|
869
|
+
assertUnchanged(left, beforeLeft);
|
|
870
|
+
assertUnchanged(right, beforeRight);
|
|
871
|
+
case 21:
|
|
872
|
+
case "end":
|
|
873
|
+
return _context2.stop();
|
|
874
|
+
}
|
|
875
|
+
}, _callee2);
|
|
876
|
+
}));
|
|
877
|
+
return function (_x6) {
|
|
878
|
+
return _ref2.apply(this, arguments);
|
|
879
|
+
};
|
|
880
|
+
}());
|
|
881
|
+
test.each([3, 4])('preserves precision and all %i native coordinate ordinates', /*#__PURE__*/function () {
|
|
882
|
+
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(dimensions) {
|
|
883
|
+
var coordinates, type, left, right, _join3, result, _i5, _arr5, dataset;
|
|
884
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
885
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
886
|
+
case 0:
|
|
887
|
+
coordinates = [-122.41234567890123, 37.81234567890123, 123.4567890123, 99.125].slice(0, dimensions);
|
|
888
|
+
type = new arrow.FixedSizeList(dimensions, new arrow.Field('coordinate', new arrow.Float64(), false));
|
|
889
|
+
_context3.next = 4;
|
|
890
|
+
return nativeSource('native', 'geoarrow.point', type, [coordinates]);
|
|
891
|
+
case 4:
|
|
892
|
+
left = _context3.sent;
|
|
893
|
+
right = makeTable('lookup', [{
|
|
894
|
+
name: 'key',
|
|
895
|
+
type: 'string'
|
|
896
|
+
}], [['0']]);
|
|
897
|
+
_join3 = join(left, right), result = _join3.result;
|
|
898
|
+
for (_i5 = 0, _arr5 = [result, roundtrip(result)]; _i5 < _arr5.length; _i5++) {
|
|
899
|
+
dataset = _arr5[_i5];
|
|
900
|
+
expect(features(dataset)[0].geometry).toEqual({
|
|
901
|
+
type: 'Point',
|
|
902
|
+
coordinates: coordinates
|
|
903
|
+
});
|
|
904
|
+
expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features[0].geometry).toEqual({
|
|
905
|
+
type: 'Point',
|
|
906
|
+
coordinates: coordinates
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
case 8:
|
|
910
|
+
case "end":
|
|
911
|
+
return _context3.stop();
|
|
912
|
+
}
|
|
913
|
+
}, _callee3);
|
|
914
|
+
}));
|
|
915
|
+
return function (_x7) {
|
|
916
|
+
return _ref3.apply(this, arguments);
|
|
917
|
+
};
|
|
918
|
+
}());
|
|
919
|
+
test('preserves empty native Points separately from null geometry', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
920
|
+
var left, before, right, _join4, result, state, expected, _i6, _arr6, dataset;
|
|
921
|
+
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
922
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
923
|
+
case 0:
|
|
924
|
+
_context4.next = 2;
|
|
925
|
+
return nativeSource('native', 'geoarrow.point', pointType, [[10, 11], [NaN, NaN], null]);
|
|
926
|
+
case 2:
|
|
927
|
+
left = _context4.sent;
|
|
928
|
+
before = rawFingerprint(left);
|
|
929
|
+
right = makeTable('lookup', [{
|
|
930
|
+
name: 'key',
|
|
931
|
+
type: 'string'
|
|
932
|
+
}], [['0'], ['1'], ['2']]);
|
|
933
|
+
_join4 = join(left, right), result = _join4.result, state = _join4.state;
|
|
934
|
+
expect(state.joins).toHaveLength(0);
|
|
935
|
+
expected = [point(10), {
|
|
936
|
+
type: 'Point',
|
|
937
|
+
coordinates: []
|
|
938
|
+
}, null];
|
|
939
|
+
for (_i6 = 0, _arr6 = [result, roundtrip(result)]; _i6 < _arr6.length; _i6++) {
|
|
940
|
+
dataset = _arr6[_i6];
|
|
941
|
+
expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features.map(function (f) {
|
|
942
|
+
return f.geometry;
|
|
943
|
+
})).toEqual(expected);
|
|
944
|
+
expect(features(dataset).map(function (f) {
|
|
945
|
+
return f.geometry;
|
|
946
|
+
})).toEqual(expected.slice(0, 2));
|
|
947
|
+
}
|
|
948
|
+
assertUnchanged(left, before);
|
|
949
|
+
case 10:
|
|
950
|
+
case "end":
|
|
951
|
+
return _context4.stop();
|
|
952
|
+
}
|
|
953
|
+
}, _callee4);
|
|
954
|
+
})));
|
|
955
|
+
test.each([['LineString', 1, [[10, 11], [12, 13]]], ['Polygon', 2, [[[10, 11], [12, 11], [12, 13], [10, 11]]]], ['MultiPoint', 1, [[10, 11], [12, 13]]], ['MultiLineString', 2, [[[10, 11], [12, 13]]]], ['MultiPolygon', 3, [[[[10, 11], [12, 11], [12, 13], [10, 11]]]]]])('retains %s coordinates and empty geometries', /*#__PURE__*/function () {
|
|
956
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(kind, depth, coordinates) {
|
|
957
|
+
var type, i, left, before, right, _join5, result, state, expected, _i7, _arr7, dataset;
|
|
958
|
+
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
959
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
960
|
+
case 0:
|
|
961
|
+
type = pointType;
|
|
962
|
+
for (i = 0; i < Number(depth); i++) type = list(type);
|
|
963
|
+
_context5.next = 4;
|
|
964
|
+
return nativeSource('native', "geoarrow.".concat(String(kind).toLowerCase()), type, [coordinates, [], null]);
|
|
965
|
+
case 4:
|
|
966
|
+
left = _context5.sent;
|
|
967
|
+
before = rawFingerprint(left);
|
|
968
|
+
right = makeTable('lookup', [{
|
|
969
|
+
name: 'key',
|
|
970
|
+
type: 'string'
|
|
971
|
+
}], [['0'], ['1'], ['2']]);
|
|
972
|
+
_join5 = join(left, right), result = _join5.result, state = _join5.state;
|
|
973
|
+
expect(state.joins).toHaveLength(0);
|
|
974
|
+
expected = [{
|
|
975
|
+
type: kind,
|
|
976
|
+
coordinates: coordinates
|
|
977
|
+
}, {
|
|
978
|
+
type: kind,
|
|
979
|
+
coordinates: []
|
|
980
|
+
}, null];
|
|
981
|
+
for (_i7 = 0, _arr7 = [result, roundtrip(result)]; _i7 < _arr7.length; _i7++) {
|
|
982
|
+
dataset = _arr7[_i7];
|
|
983
|
+
expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features.map(function (f) {
|
|
984
|
+
return f.geometry;
|
|
985
|
+
})).toEqual(expected);
|
|
986
|
+
expect(features(dataset)[0].geometry).toEqual(expected[0]);
|
|
987
|
+
}
|
|
988
|
+
assertUnchanged(left, before);
|
|
989
|
+
case 12:
|
|
990
|
+
case "end":
|
|
991
|
+
return _context5.stop();
|
|
992
|
+
}
|
|
993
|
+
}, _callee5);
|
|
994
|
+
}));
|
|
995
|
+
return function (_x8, _x9, _x0) {
|
|
996
|
+
return _ref5.apply(this, arguments);
|
|
997
|
+
};
|
|
998
|
+
}());
|
|
999
|
+
test.each([['geoarrow.point', pointType, [[10, Infinity]]], ['geoarrow.point', pointType, [[10, NaN]]], ['geoarrow.point', new arrow.Struct([new arrow.Field('x', new arrow.Float64(), false), new arrow.Field('y', new arrow.Float64(), false)]), [{
|
|
1000
|
+
x: 10,
|
|
1001
|
+
y: 11
|
|
1002
|
+
}]], ['geoarrow.point', new arrow.FixedSizeList(1, new arrow.Field('x', new arrow.Float64(), false)), [[10]]], ['geoarrow.multipoint', list(pointType), [[[10, 11], null]]], ['geoarrow.unknown', pointType, [[10, 11]]]])('surfaces invalid or unsupported %s instead of creating corrupt output', /*#__PURE__*/function () {
|
|
1003
|
+
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(encoding, type, coordinates) {
|
|
1004
|
+
var left, right, before, _join6, state, result;
|
|
1005
|
+
return _regeneratorRuntime.wrap(function _callee6$(_context6) {
|
|
1006
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
1007
|
+
case 0:
|
|
1008
|
+
_context6.next = 2;
|
|
1009
|
+
return nativeSource('native', encoding, type, coordinates);
|
|
1010
|
+
case 2:
|
|
1011
|
+
left = _context6.sent;
|
|
1012
|
+
right = makeTable('lookup', [{
|
|
1013
|
+
name: 'key',
|
|
1014
|
+
type: 'string'
|
|
1015
|
+
}], [['0']]);
|
|
1016
|
+
before = rawFingerprint(left);
|
|
1017
|
+
_join6 = join(left, right), state = _join6.state, result = _join6.result;
|
|
1018
|
+
expect(result).toBeUndefined();
|
|
1019
|
+
expect(state.joins[0].error).toMatch(/geometry.*row 1/i);
|
|
1020
|
+
assertUnchanged(left, before);
|
|
1021
|
+
// Omitted geometry and nonmatching INNER rows must not be converted eagerly.
|
|
1022
|
+
expect(join(left, right, {
|
|
1023
|
+
leftColumns: ['key']
|
|
1024
|
+
}).result.dataContainer.rowAsArray(0)).toEqual(['0', '0']);
|
|
1025
|
+
expect(join(left, makeTable('absent', [{
|
|
1026
|
+
name: 'key',
|
|
1027
|
+
type: 'string'
|
|
1028
|
+
}], [['absent']]), {
|
|
1029
|
+
type: 'INNER'
|
|
1030
|
+
}).result.dataContainer.numRows()).toBe(0);
|
|
1031
|
+
case 11:
|
|
1032
|
+
case "end":
|
|
1033
|
+
return _context6.stop();
|
|
1034
|
+
}
|
|
1035
|
+
}, _callee6);
|
|
1036
|
+
}));
|
|
1037
|
+
return function (_x1, _x10, _x11) {
|
|
1038
|
+
return _ref6.apply(this, arguments);
|
|
1039
|
+
};
|
|
1040
|
+
}());
|
|
1041
|
+
test.each(['wkb', 'wkt'])('preserves %s geometry through chained attribute joins', /*#__PURE__*/function () {
|
|
1042
|
+
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(encoding) {
|
|
1043
|
+
var geometry, value, original, right, left, run, _join7, _state2, result;
|
|
1044
|
+
return _regeneratorRuntime.wrap(function _callee7$(_context7) {
|
|
1045
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
1046
|
+
case 0:
|
|
1047
|
+
geometry = {
|
|
1048
|
+
type: 'Point',
|
|
1049
|
+
coordinates: [10, 11]
|
|
1050
|
+
};
|
|
1051
|
+
value = encoding === 'wkb' ? new Uint8Array(convertGeometryToWKB(geometry)) : 'POINT (10 11)';
|
|
1052
|
+
_context7.next = 4;
|
|
1053
|
+
return nativeSource('source', "geoarrow.".concat(encoding), encoding === 'wkb' ? new arrow.Binary() : new arrow.Utf8(), [value, null], ['a', 'b']);
|
|
1054
|
+
case 4:
|
|
1055
|
+
original = _context7.sent;
|
|
1056
|
+
right = makeTable('lookup', [{
|
|
1057
|
+
name: 'key',
|
|
1058
|
+
type: 'string'
|
|
1059
|
+
}], [['a'], ['b']]);
|
|
1060
|
+
left = original;
|
|
1061
|
+
for (run = 0; run < 2; run++) {
|
|
1062
|
+
_join7 = join(left, right, {
|
|
1063
|
+
rightColumns: []
|
|
1064
|
+
}), _state2 = _join7.state, result = _join7.result;
|
|
1065
|
+
expect(_state2.joins).toHaveLength(0);
|
|
1066
|
+
expect(datasetToFeatureCollection(result.dataContainer, result.fields).features.map(function (feature) {
|
|
1067
|
+
return feature.geometry;
|
|
1068
|
+
})).toEqual([geometry, null]);
|
|
1069
|
+
expect(features(result).map(function (feature) {
|
|
1070
|
+
return feature.geometry;
|
|
1071
|
+
})).toEqual([geometry]);
|
|
1072
|
+
left = result;
|
|
1073
|
+
}
|
|
1074
|
+
expect(original.dataContainer.valueAt(0, 1)).toEqual(value);
|
|
1075
|
+
expect(original.dataContainer.valueAt(1, 1)).toBeNull();
|
|
1076
|
+
case 10:
|
|
1077
|
+
case "end":
|
|
1078
|
+
return _context7.stop();
|
|
1079
|
+
}
|
|
1080
|
+
}, _callee7);
|
|
1081
|
+
}));
|
|
1082
|
+
return function (_x12) {
|
|
1083
|
+
return _ref7.apply(this, arguments);
|
|
1084
|
+
};
|
|
1085
|
+
}());
|
|
1086
|
+
test('joins unannotated WKB identified as GEOMETRY', function () {
|
|
1087
|
+
var geometry = {
|
|
1088
|
+
type: 'Point',
|
|
1089
|
+
coordinates: [10, 11]
|
|
1090
|
+
};
|
|
1091
|
+
var values = arrow.vectorFromArray([new Uint8Array(convertGeometryToWKB(geometry)), null], new arrow.Binary());
|
|
1092
|
+
var keys = arrow.vectorFromArray(['a', 'b']);
|
|
1093
|
+
var input = new arrow.Table({
|
|
1094
|
+
key: keys,
|
|
1095
|
+
geometry: values
|
|
1096
|
+
});
|
|
1097
|
+
var left = new KeplerTable({
|
|
1098
|
+
info: {
|
|
1099
|
+
id: 'source'
|
|
1100
|
+
},
|
|
1101
|
+
color: [1, 2, 3]
|
|
1102
|
+
}).updateSchema({
|
|
1103
|
+
fields: arrowSchemaToFields(input, {
|
|
1104
|
+
geometry: 'GEOMETRY'
|
|
1105
|
+
}),
|
|
1106
|
+
cols: [keys, values],
|
|
1107
|
+
rows: []
|
|
1108
|
+
});
|
|
1109
|
+
var right = makeTable('lookup', [{
|
|
1110
|
+
name: 'key',
|
|
1111
|
+
type: 'string'
|
|
1112
|
+
}], [['a'], ['b']]);
|
|
1113
|
+
var _join8 = join(left, right, {
|
|
1114
|
+
rightColumns: []
|
|
1115
|
+
}),
|
|
1116
|
+
state = _join8.state,
|
|
1117
|
+
result = _join8.result;
|
|
1118
|
+
expect(state.joins).toHaveLength(0);
|
|
1119
|
+
expect(datasetToFeatureCollection(result.dataContainer, result.fields).features.map(function (feature) {
|
|
1120
|
+
return feature.geometry;
|
|
1121
|
+
})).toEqual([geometry, null]);
|
|
1122
|
+
expect(features(result).map(function (feature) {
|
|
1123
|
+
return feature.geometry;
|
|
1124
|
+
})).toEqual([geometry]);
|
|
1125
|
+
});
|
|
1126
|
+
test('joins ordinary Arrow attributes after JSON save/reload without changing values', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8() {
|
|
1127
|
+
var input, _yield$processFileDat, _yield$processFileDat2, file, original, restored, right;
|
|
1128
|
+
return _regeneratorRuntime.wrap(function _callee8$(_context8) {
|
|
1129
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
1130
|
+
case 0:
|
|
1131
|
+
input = new arrow.Table({
|
|
1132
|
+
key: arrow.vectorFromArray(['a', 'b']),
|
|
1133
|
+
value: arrow.vectorFromArray([1.25, 2.5])
|
|
1134
|
+
});
|
|
1135
|
+
_context8.next = 3;
|
|
1136
|
+
return processFileData({
|
|
1137
|
+
content: {
|
|
1138
|
+
fileName: 'ordinary.arrow',
|
|
1139
|
+
data: input.batches
|
|
1140
|
+
},
|
|
1141
|
+
fileCache: []
|
|
1142
|
+
});
|
|
1143
|
+
case 3:
|
|
1144
|
+
_yield$processFileDat = _context8.sent;
|
|
1145
|
+
_yield$processFileDat2 = _slicedToArray(_yield$processFileDat, 1);
|
|
1146
|
+
file = _yield$processFileDat2[0];
|
|
1147
|
+
original = new KeplerTable({
|
|
1148
|
+
info: {
|
|
1149
|
+
id: 'ordinary'
|
|
1150
|
+
},
|
|
1151
|
+
color: [1, 2, 3]
|
|
1152
|
+
}).updateSchema(file.data);
|
|
1153
|
+
restored = roundtrip(original);
|
|
1154
|
+
right = makeTable('lookup', [{
|
|
1155
|
+
name: 'key',
|
|
1156
|
+
type: 'string'
|
|
1157
|
+
}], [['a'], ['b']]);
|
|
1158
|
+
expect(join(restored, right).result.dataContainer.flattenData()).toEqual([['a', 1.25, 'a'], ['b', 2.5, 'b']]);
|
|
1159
|
+
case 10:
|
|
1160
|
+
case "end":
|
|
1161
|
+
return _context8.stop();
|
|
1162
|
+
}
|
|
1163
|
+
}, _callee8);
|
|
1164
|
+
})));
|
|
1165
|
+
test('reads geometry once per emitted source row and does not retain a stale cache across joins', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
|
|
1166
|
+
var left, right, read, first, replacement, second;
|
|
1167
|
+
return _regeneratorRuntime.wrap(function _callee9$(_context9) {
|
|
1168
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
1169
|
+
case 0:
|
|
1170
|
+
_context9.next = 2;
|
|
1171
|
+
return source('left', 'Point');
|
|
1172
|
+
case 2:
|
|
1173
|
+
left = _context9.sent;
|
|
1174
|
+
right = makeTable('lookup', [{
|
|
1175
|
+
name: 'key',
|
|
1176
|
+
type: 'string'
|
|
1177
|
+
}], [['a'], ['a'], ['a']]);
|
|
1178
|
+
read = jest.spyOn(left.dataContainer, 'valueAt');
|
|
1179
|
+
first = join(left, right, {
|
|
1180
|
+
type: 'INNER'
|
|
1181
|
+
}).result;
|
|
1182
|
+
expect(first.dataContainer.numRows()).toBe(3);
|
|
1183
|
+
expect(read.mock.calls.filter(function (_ref0) {
|
|
1184
|
+
var _ref1 = _slicedToArray(_ref0, 2),
|
|
1185
|
+
fieldIndex = _ref1[1];
|
|
1186
|
+
return fieldIndex === 1;
|
|
1187
|
+
})).toEqual([[0, 1]]);
|
|
1188
|
+
read.mockRestore();
|
|
1189
|
+
_context9.next = 11;
|
|
1190
|
+
return source('replacement', 'Point', ['a', 'b'], [50, 60]);
|
|
1191
|
+
case 11:
|
|
1192
|
+
replacement = _context9.sent;
|
|
1193
|
+
left.updateSchema({
|
|
1194
|
+
fields: replacement.fields,
|
|
1195
|
+
rows: [],
|
|
1196
|
+
cols: [replacement.dataContainer.getColumn(0), replacement.dataContainer.getColumn(1)]
|
|
1197
|
+
});
|
|
1198
|
+
second = join(left, right, {
|
|
1199
|
+
type: 'INNER'
|
|
1200
|
+
}).result;
|
|
1201
|
+
expect(JSON.parse(second.dataContainer.valueAt(0, 1))).toEqual(point(50));
|
|
1202
|
+
expect(JSON.parse(first.dataContainer.valueAt(0, 1))).toEqual(point(10));
|
|
1203
|
+
case 16:
|
|
1204
|
+
case "end":
|
|
1205
|
+
return _context9.stop();
|
|
1206
|
+
}
|
|
1207
|
+
}, _callee9);
|
|
1208
|
+
})));
|
|
1209
|
+
});
|
|
1210
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsImFycm93U2NoZW1hVG9GaWVsZHMiLCJwcm9jZXNzQXJyb3dUYWJsZSIsInByb2Nlc3NDc3ZEYXRhIiwicHJvY2Vzc0ZpbGVEYXRhIiwicHJvY2Vzc0dlb2pzb24iLCJwcm9jZXNzS2VwbGVyZ2xKU09OIiwiY29udmVydEdlb21ldHJ5VG9XS0IiLCJhcnJvdyIsIkdlb0pzb25MYXllciIsImRhdGFzZXRTY2hlbWEiLCJWRVJTSU9OUyIsImRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uIiwiSW50NjQiLCJUYWJsZSIsInZlY3RvckZyb21BcnJheSIsImV4cG9ydE1hcFRvSFRNTCIsImV4cG9ydFRvSnNvblN0cmluZyIsInZhbGlkYXRlSW5wdXREYXRhIiwiU2NoZW1hTWFuYWdlciIsImRyYWluVGFza3NGb3JUZXN0aW5nIiwic3VjY2VlZFRhc2tXaXRoVmFsdWVzIiwiUmVzcG9uc2UiLCJ2aXNTdGF0ZVJlZHVjZXIiLCJJTklUSUFMX1ZJU19TVEFURSIsInJlZHVjZVZpc1N0YXRlIiwibWFrZVRhYmxlIiwiaWQiLCJmaWVsZHMiLCJyb3dzIiwidGFibGUiLCJpbmZvIiwibGFiZWwiLCJ0eXBlIiwiY29sb3IiLCJ1cGRhdGVTY2hlbWEiLCJtYXAiLCJmaWVsZCIsIm5hbWUiLCJhbmFseXplclR5cGUiLCJmbHVzaENyZWF0ZVRhYmxlVGFza3MiLCJzdGF0ZSIsInRhc2tzIiwicmVkdWNlIiwibmV4dFN0YXRlIiwidGFzayIsIlN0cmluZyIsImluY2x1ZGVzIiwidGFibGVzIiwiQXJyYXkiLCJpc0FycmF5IiwicGF5bG9hZCIsIl9vYmplY3RTcHJlYWQiLCJvcHRzIiwiZGF0YSIsImRlc2NyaWJlIiwib3JpZ2luYWxSZXNwb25zZSIsImdsb2JhbFRoaXMiLCJiZWZvcmVBbGwiLCJhZnRlckFsbCIsImJlZm9yZUVhY2giLCJ0ZXN0IiwiY2l0aWVzIiwic3RyaW5nIiwiaW50ZWdlciIsImRhdGFzZXRzIiwiYWRkR3JvdXBCeSIsImV4cGVjdCIsImdyb3VwQnlzIiwidG9IYXZlTGVuZ3RoIiwib3BJZCIsInNldEdyb3VwQnlDb25maWciLCJmaWVsZE5hbWUiLCJhZ2dyZWdhdGlvbnMiLCJwb3AiLCJyZXN1bHRJZCIsInJ1bkdyb3VwQnkiLCJ0b0JlVHJ1dGh5IiwibWV0YWRhdGEiLCJkZXJpdmVkRGF0YXNldCIsInRvRXF1YWwiLCJzb3VyY2VEYXRhSWRzIiwib3BlcmF0aW9uSWQiLCJkYXRhQ29udGFpbmVyIiwibnVtUm93cyIsInRvQmUiLCJlYWNoIiwibWl4ZWQiLCJrZXkiLCJhcnJvd0RhdGEiLCJzaGFwZSIsIkVycm9yIiwibGVmdCIsInJpZ2h0IiwiYWRkSm9pbiIsIm9wIiwiam9pbnMiLCJzZXRKb2luQ29uZmlnIiwicmlnaHREYXRhSWQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwicmlnaHRDb2x1bW5zIiwicnVuSm9pbiIsImFkZEZpbHRlciIsInNldEZpbHRlciIsImZpbHRlcnMiLCJkb21haW4iLCJmaWx0ZXJlZEluZGV4IiwiX2kiLCJfYXJyIiwibGVuZ3RoIiwiX2V4cG9ydE1hcFRvSFRNTCRtYXRjIiwiX3Byb2Nlc3NLZXBsZXJnbEpTT04iLCJfcmVsb2FkZWQkZ2V0Q29sdW1uRmkiLCJyZW1vdmVTb3VyY2VzIiwicmVtb3ZlRGF0YXNldCIsIk9iamVjdCIsImtleXMiLCJzYXZlZCIsInNhdmUiLCJ2aXNTdGF0ZSIsImpzb24iLCJKU09OIiwicGFyc2UiLCJlbWJlZGRlZCIsIm1hdGNoIiwicGFyc2VkIiwiZmluZCIsImRhdGFzZXQiLCJyZWxvYWRlZCIsImdldENvbHVtbkZpbHRlclByb3BzIiwiZmxhdHRlbkRhdGEiLCJpbmRleCIsIl9hcnJvdyRnZXRDaGlsZCIsImdldENoaWxkIiwiZ2V0IiwidmFsdWVBdCIsInRlY2huaXF1ZSIsImRlY2VtYmVyIiwiamFudWFyeSIsImNvbmNhdCIsInRvTWF0Y2hPYmplY3QiLCJmb3JtYXQiLCJ0aW1lcyIsInRpbWUiLCJyZXN1bHQiLCJleHBlY3RlZCIsImdldFBsYWluSW5kZXgiLCJpIiwicm93QXNBcnJheSIsInRvQmVVbmRlZmluZWQiLCJyZXN1bHRMYWJlbCIsInRvTWF0Y2giLCJwb2x5cyIsImdlb2pzb24iLCJhZGRTcGF0aWFsSm9pbiIsInByZWRpY2F0ZSIsInNldFNwYXRpYWxKb2luQ29uZmlnIiwicG9seWdvbiIsInB0cyIsIl9pMiIsIl9hcnIyIiwibG5nIiwicG9seWdvbkRhdGEiLCJwb2ludCIsInBvaW50RGF0YSIsImxlZnRHZW8iLCJraW5kIiwicmlnaHRHZW8iLCJ2YWx1ZSIsInJ1blNwYXRpYWxKb2luIiwiY29vcmRpbmF0ZXMiLCJyZWFsIiwibGF0RmllbGQiLCJsbmdGaWVsZCIsIl9kZXJpdmVkTWV0YSRkZXJpdmVkRCIsIl9zYXZlZCRjb25maWckY29uZmlnJCIsIm1hcFN0YXRlIiwibWFwU3R5bGUiLCJ1aVN0YXRlIiwiZGVyaXZlZCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIiwic2l0ZVN0YXRlIiwic2l0ZXMiLCJhZGRTdWl0YWJpbGl0eSIsInN1aXRhYmlsaXRpZXMiLCJ3ZWlnaHRzIiwibGF0IiwiYWNjZXNzIiwiY29zdCIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsIl9sYXllciRjb25maWckY29sb3JGaSIsInNldFN1aXRhYmlsaXR5Q29uZmlnIiwicnVuU3VpdGFiaWxpdHkiLCJ0b0NvbnRhaW4iLCJsYXllciIsImxheWVycyIsIml0ZW0iLCJkYXRhSWQiLCJjb2xvckZpZWxkIiwiZXJyb3IiLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQyIiwibm90IiwidG9IYXZlUHJvcGVydHkiLCJtZXRhZGF0YUtleSIsIngiLCJtdWx0aSIsInBvaW50VHlwZSIsIkZpeGVkU2l6ZUxpc3QiLCJGaWVsZCIsIkZsb2F0NjQiLCJsaXN0IiwiTGlzdCIsIm5hdGl2ZVNvdXJjZSIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX25hdGl2ZVNvdXJjZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUwIiwiZW5jb2RpbmciLCJpbnB1dCIsImRlY29kZWQiLCJfeWllbGQkcHJvY2Vzc0ZpbGVEYXQzIiwiX3lpZWxkJHByb2Nlc3NGaWxlRGF0NCIsImZpbGUiLCJfYXJnczAiLCJ3cmFwIiwiX2NhbGxlZTAkIiwiX2NvbnRleHQwIiwicHJldiIsIm5leHQiLCJ1bmRlZmluZWQiLCJfIiwiZ2VvbWV0cnkiLCJzY2hlbWEiLCJzZXQiLCJ0YWJsZUZyb21JUEMiLCJ0YWJsZVRvSVBDIiwiY29udGVudCIsImZpbGVOYW1lIiwiYmF0Y2hlcyIsImZpbGVDYWNoZSIsInNlbnQiLCJfc2xpY2VkVG9BcnJheSIsImltcG9ydERhdGEiLCJhYnJ1cHQiLCJzdG9wIiwic291cmNlIiwidmFsdWVzIiwidG9Mb3dlckNhc2UiLCJqb2luIiwiX2RlZmluZVByb3BlcnR5IiwiZmVhdHVyZXMiLCJmaWVsZEluZGV4IiwicHJvcHMiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJ0b0JlR3JlYXRlclRoYW4iLCJjb2x1bW5zIiwiZmllbGRJZHgiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJmb3JtYXRMYXllckRhdGEiLCJyYXdGaW5nZXJwcmludCIsImNvbHVtbiIsImdldENvbHVtbiIsImJ5dGVzIiwib2Zmc2V0IiwibnVsbENvdW50IiwiYnVmZmVycyIsImIiLCJmcm9tIiwiVWludDhBcnJheSIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiY2hpbGRyZW4iLCJjaHVua3MiLCJzbGljZSIsInN0cmluZ2lmeSIsImVudHJpZXMiLCJhc3NlcnRVbmNoYW5nZWQiLCJiZWZvcmUiLCJhZnRlciIsImZvckVhY2giLCJjaHVuayIsInJvdW5kdHJpcCIsInYxIiwibG9hZGVkIiwibG9hZCIsIl9yZWYiLCJfY2FsbGVlIiwiX2pvaW4iLCJfaTMiLCJfYXJyMyIsImNvbnRyb2wiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZiIsImNvbnN0cnVjdG9yIiwidmFsdWVBY2Nlc3NvciIsImZpbHRlciIsInByb3BlcnRpZXMiLCJfeDUiLCJfcmVmMiIsIl9jYWxsZWUyIiwiYmVmb3JlTGVmdCIsImJlZm9yZVJpZ2h0IiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJfc3RlcCR2YWx1ZSIsImV4cGVjdGVkUm93cyIsImxlZnRGZWF0dXJlcyIsInJpZ2h0RmVhdHVyZXMiLCJfam9pbjIiLCJfc3RhdGUiLCJfaTQiLCJfYXJyNCIsImVtcHR5IiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJzIiwibiIsImRvbmUiLCJ0b0JlTnVsbCIsImVyciIsImUiLCJ0MCIsInQxIiwidDIiLCJ0MyIsIl94NiIsIl9yZWYzIiwiX2NhbGxlZTMiLCJkaW1lbnNpb25zIiwiX2pvaW4zIiwiX2k1IiwiX2FycjUiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJfeDciLCJfY2FsbGVlNCIsIl9qb2luNCIsIl9pNiIsIl9hcnI2IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwiTmFOIiwiX3JlZjUiLCJfY2FsbGVlNSIsImRlcHRoIiwiX2pvaW41IiwiX2k3IiwiX2FycjciLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJOdW1iZXIiLCJfeDgiLCJfeDkiLCJfeDAiLCJJbmZpbml0eSIsIlN0cnVjdCIsInkiLCJfcmVmNiIsIl9jYWxsZWU2IiwiX2pvaW42IiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwibGVmdENvbHVtbnMiLCJfeDEiLCJfeDEwIiwiX3gxMSIsIl9yZWY3IiwiX2NhbGxlZTciLCJvcmlnaW5hbCIsInJ1biIsIl9qb2luNyIsIl9zdGF0ZTIiLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJCaW5hcnkiLCJVdGY4IiwiZmVhdHVyZSIsIl94MTIiLCJjb2xzIiwiX2pvaW44IiwiX2NhbGxlZTgiLCJfeWllbGQkcHJvY2Vzc0ZpbGVEYXQiLCJfeWllbGQkcHJvY2Vzc0ZpbGVEYXQyIiwicmVzdG9yZWQiLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJfY2FsbGVlOSIsInJlYWQiLCJmaXJzdCIsInJlcGxhY2VtZW50Iiwic2Vjb25kIiwiX2NhbGxlZTkkIiwiX2NvbnRleHQ5IiwiamVzdCIsInNweU9uIiwibW9jayIsImNhbGxzIiwiX3JlZjAiLCJfcmVmMSIsIm1vY2tSZXN0b3JlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFzZXQtb3BzLXVwZGF0ZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge1xuICBhcnJvd1NjaGVtYVRvRmllbGRzLFxuICBwcm9jZXNzQXJyb3dUYWJsZSxcbiAgcHJvY2Vzc0NzdkRhdGEsXG4gIHByb2Nlc3NGaWxlRGF0YSxcbiAgcHJvY2Vzc0dlb2pzb24sXG4gIHByb2Nlc3NLZXBsZXJnbEpTT05cbn0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7Y29udmVydEdlb21ldHJ5VG9XS0J9IGZyb20gJ0Bsb2FkZXJzLmdsL2dpcyc7XG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IEdlb0pzb25MYXllciBmcm9tICcuLi8uLi9sYXllcnMvc3JjL2dlb2pzb24tbGF5ZXIvZ2VvanNvbi1sYXllcic7XG5pbXBvcnQge2RhdGFzZXRTY2hlbWEsIFZFUlNJT05TfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSAnLi4vLi4vcHJvY2Vzc29ycy9zcmMvZXhwb3J0L2RhdGFzZXQtdG8tZ2VvanNvbic7XG5pbXBvcnQge0ludDY0LCBUYWJsZSwgdmVjdG9yRnJvbUFycmF5fSBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtleHBvcnRNYXBUb0hUTUwsIGV4cG9ydFRvSnNvblN0cmluZywgdmFsaWRhdGVJbnB1dERhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IFNjaGVtYU1hbmFnZXIsIHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7ZHJhaW5UYXNrc0ZvclRlc3RpbmcsIHN1Y2NlZWRUYXNrV2l0aFZhbHVlc30gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICdub2RlLWZldGNoJztcblxuaW1wb3J0IHZpc1N0YXRlUmVkdWNlciBmcm9tICcuL3Zpcy1zdGF0ZSc7XG5pbXBvcnQge0lOSVRJQUxfVklTX1NUQVRFfSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5cbmNvbnN0IHJlZHVjZVZpc1N0YXRlID0gdmlzU3RhdGVSZWR1Y2VyIGFzIChzdGF0ZTogVmlzU3RhdGUsIGFjdGlvbjogdW5rbm93bikgPT4gVmlzU3RhdGU7XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZShpZDogc3RyaW5nLCBmaWVsZHM6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZ31bXSwgcm93czogYW55W11bXSkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkLCBsYWJlbDogaWQsIHR5cGU6ICdsb2NhbCd9LFxuICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgfSk7XG4gIHRhYmxlLnVwZGF0ZVNjaGVtYSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGZpZWxkID0+ICh7XG4gICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGFuYWx5emVyVHlwZTogZmllbGQudHlwZVxuICAgIH0pKSxcbiAgICByb3dzXG4gIH0pO1xuICByZXR1cm4gdGFibGU7XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZTogVmlzU3RhdGUpIHtcbiAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICByZXR1cm4gdGFza3MucmVkdWNlKChuZXh0U3RhdGUsIHRhc2spID0+IHtcbiAgICBpZiAoIVN0cmluZyh0YXNrLmxhYmVsIHx8ICcnKS5pbmNsdWRlcygnQ1JFQVRFX1RBQkxFX1RBU0snKSkge1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gICAgY29uc3QgdGFibGVzID0gKEFycmF5LmlzQXJyYXkodGFzay5wYXlsb2FkKSA/IHRhc2sucGF5bG9hZCA6IFt0YXNrLnBheWxvYWRdKS5tYXAocGF5bG9hZCA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7aW5mbzogcGF5bG9hZC5pbmZvLCBjb2xvcjogcGF5bG9hZC5jb2xvciwgLi4ucGF5bG9hZC5vcHRzfSk7XG4gICAgICB0YWJsZS51cGRhdGVTY2hlbWEocGF5bG9hZC5kYXRhKTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVkdWNlVmlzU3RhdGUobmV4dFN0YXRlLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXModGFzaywgdGFibGVzKSk7XG4gIH0sIHN0YXRlKTtcbn1cblxuZGVzY3JpYmUoJ2RhdGFzZXQgb3BzIHZpcy1zdGF0ZScsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxSZXNwb25zZSA9IGdsb2JhbFRoaXMuUmVzcG9uc2U7XG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IFJlc3BvbnNlIGFzIGFueTtcbiAgfSk7XG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBnbG9iYWxUaGlzLlJlc3BvbnNlID0gb3JpZ2luYWxSZXNwb25zZTtcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuR3JvdXBCeSBhZGRzIGEgZGVyaXZlZCBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWyd3ZXN0JywgMTBdLFxuICAgICAgICBbJ3dlc3QnLCAyMF0sXG4gICAgICAgIFsnZWFzdCcsIDQwXVxuICAgICAgXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3BJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLmlkO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3BJZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdElkID0gc3RhdGUuZ3JvdXBCeXNbMF0ucmVzdWx0SWQ7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3BJZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5cykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbcmVzdWx0SWRdLm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdncm91cEJ5JyxcbiAgICAgIHNvdXJjZURhdGFJZHM6IFsnY2l0aWVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3BJZFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIHRlc3QuZWFjaChbZmFsc2UsIHRydWVdKShcbiAgICAnam9pbmVkIEJpZ0ludHMgZmlsdGVyIGFuZCBzYXZlIGFmdGVyIHNvdXJjZSByZW1vdmFsIChtaXhlZDogJXMpJyxcbiAgICBtaXhlZCA9PiB7XG4gICAgICBjb25zdCBhcnJvdyA9IG5ldyBUYWJsZSh7XG4gICAgICAgIGtleTogdmVjdG9yRnJvbUFycmF5KFsnYScsICdiJywgbnVsbF0pLFxuICAgICAgICBwb3A6IHZlY3RvckZyb21BcnJheShbMTBuLCAyMG4sIG51bGxdLCBuZXcgSW50NjQoKSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXJyb3dEYXRhID0gcHJvY2Vzc0Fycm93VGFibGUoe3NoYXBlOiAnYXJyb3ctdGFibGUnLCBkYXRhOiBhcnJvd30pO1xuICAgICAgaWYgKCFhcnJvd0RhdGEpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBcnJvdyBmaXh0dXJlJyk7XG4gICAgICBjb25zdCBsZWZ0ID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQ6ICdsZWZ0J30sIGNvbG9yOiBbMCwgMCwgMF19KS51cGRhdGVTY2hlbWEoXG4gICAgICAgIG1peGVkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZpZWxkczogYXJyb3dEYXRhLmZpZWxkcyxcbiAgICAgICAgICAgICAgcm93czogW1xuICAgICAgICAgICAgICAgIFsnYScsIDEwbl0sXG4gICAgICAgICAgICAgICAgWydiJywgMjBdLFxuICAgICAgICAgICAgICAgIFtudWxsLCAwLjVdXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGFycm93RGF0YVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdyaWdodCcsIFt7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfV0sIFtbJ2EnXSwgWydiJ11dKTtcbiAgICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7bGVmdCwgcmlnaHR9fTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRKb2luKCdsZWZ0JykpO1xuICAgICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0Sm9pbkNvbmZpZyhvcC5pZCwge1xuICAgICAgICAgIHJpZ2h0RGF0YUlkOiAncmlnaHQnLFxuICAgICAgICAgIGxlZnRGaWVsZDogJ2tleScsXG4gICAgICAgICAgcmlnaHRGaWVsZDogJ2tleScsXG4gICAgICAgICAgcmlnaHRDb2x1bW5zOiBbXVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuSm9pbihvcC5pZCkpKTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRGaWx0ZXIob3AucmVzdWx0SWQpKTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgJ25hbWUnLCAncG9wJykpO1xuICAgICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZG9tYWluKS50b0VxdWFsKFsxMCwgMjBdKTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgJ2dwdScsIGZhbHNlKSk7XG4gICAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICd2YWx1ZScsIFsxNSwgMjBdKSk7XG4gICAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdLmZpbHRlcmVkSW5kZXgpLnRvRXF1YWwoWzFdKTtcblxuICAgICAgZm9yIChjb25zdCByZW1vdmVTb3VyY2VzIG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgICAgaWYgKHJlbW92ZVNvdXJjZXMpIHtcbiAgICAgICAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnbGVmdCcpKTtcbiAgICAgICAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgncmlnaHQnKSk7XG4gICAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKSkudG9FcXVhbChbb3AucmVzdWx0SWRdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7dmlzU3RhdGU6IHN0YXRlfSk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGV4cG9ydFRvSnNvblN0cmluZyhzYXZlZCkpO1xuICAgICAgICBjb25zdCBlbWJlZGRlZCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgZXhwb3J0TWFwVG9IVE1MKHNhdmVkKS5tYXRjaCgvY29uc3QgZGF0YXNldHMgPSAoLiopOy8pPy5bMV0gfHwgJydcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KGVtYmVkZGVkKS50b0VxdWFsKGpzb24uZGF0YXNldHMpO1xuICAgICAgICBjb25zdCBwYXJzZWQ6IFByb3RvRGF0YXNldCB8IHVuZGVmaW5lZCA9IHByb2Nlc3NLZXBsZXJnbEpTT04oanNvbik/LmRhdGFzZXRzPy5maW5kKFxuICAgICAgICAgIGRhdGFzZXQgPT4gZGF0YXNldC5pbmZvLmlkID09PSBvcC5yZXN1bHRJZFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRlcml2ZWQgZGF0YXNldCBhZnRlciByZWxvYWQnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHZhbGlkYXRlSW5wdXREYXRhKHBhcnNlZC5kYXRhKTtcbiAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZlZCBkYXRhc2V0IGFmdGVyIHJlbG9hZCcpO1xuICAgICAgICBjb25zdCByZWxvYWRlZCA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgICAgICAgaW5mbzogcGFyc2VkLmluZm8sXG4gICAgICAgICAgbWV0YWRhdGE6IHBhcnNlZC5tZXRhZGF0YSxcbiAgICAgICAgICBjb2xvcjogWzAsIDAsIDBdXG4gICAgICAgIH0pLnVwZGF0ZVNjaGVtYShkYXRhKTtcbiAgICAgICAgZXhwZWN0KHJlbG9hZGVkLmdldENvbHVtbkZpbHRlclByb3BzKCdwb3AnKT8uZG9tYWluKS50b0VxdWFsKFsxMCwgMjBdKTtcbiAgICAgICAgZXhwZWN0KHJlbG9hZGVkLmRhdGFDb250YWluZXIuZmxhdHRlbkRhdGEoKSkudG9FcXVhbChbXG4gICAgICAgICAgWydhJywgMTBdLFxuICAgICAgICAgIFsnYicsIDIwXSxcbiAgICAgICAgICBbbnVsbCwgbnVsbF1cbiAgICAgICAgXSk7XG4gICAgICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5mbGF0dGVuRGF0YSgpKS50b0VxdWFsKFtcbiAgICAgICAgICBbJ2EnLCAxMG5dLFxuICAgICAgICAgIFsnYicsIDIwbl0sXG4gICAgICAgICAgW251bGwsIG51bGxdXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgZXhwZWN0KFswLCAxLCAyXS5tYXAoaW5kZXggPT4gYXJyb3cuZ2V0Q2hpbGQoJ3BvcCcpPy5nZXQoaW5kZXgpKSkudG9FcXVhbChbMTBuLCAyMG4sIG51bGxdKTtcbiAgICAgIGV4cGVjdChbMCwgMSwgMl0ubWFwKGluZGV4ID0+IGxlZnQuZGF0YUNvbnRhaW5lci52YWx1ZUF0KGluZGV4LCAxKSkpLnRvRXF1YWwoXG4gICAgICAgIG1peGVkID8gWzEwbiwgMjAsIDAuNV0gOiBbMTBuLCAyMG4sIG51bGxdXG4gICAgICApO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0LmVhY2goWydtaW5pbXVtJywgJ21heGltdW0nXSBhcyBjb25zdCkoXG4gICAgJ3J1bkdyb3VwQnkgc2VsZWN0cyBjaHJvbm9sb2dpY2FsICVzIGZyb20gcmVjb2duaXplZCBDU1YgdGltZXN0YW1wcycsXG4gICAgdGVjaG5pcXVlID0+IHtcbiAgICAgIGNvbnN0IGRlY2VtYmVyID0gJzEyLzMxLzIwMjUgMTA6MDA6MDAnO1xuICAgICAgY29uc3QgamFudWFyeSA9ICcwMS8wMS8yMDI2IDEwOjAwOjAwJztcbiAgICAgIGNvbnN0IGRhdGEgPSBwcm9jZXNzQ3N2RGF0YShcbiAgICAgICAgYGdyb3VwLHRpbWVcXG53ZXN0LCR7ZGVjZW1iZXJ9XFxud2VzdCwke2phbnVhcnl9XFxuZWFzdCwke2phbnVhcnl9XFxuZWFzdCwke2RlY2VtYmVyfVxcbm1pc3NpbmcsYFxuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdDU1YgaW1wb3J0IGZhaWxlZCcpO1xuICAgICAgZXhwZWN0KGRhdGEuZmllbGRzWzFdKS50b01hdGNoT2JqZWN0KHt0eXBlOiAndGltZXN0YW1wJywgZm9ybWF0OiAnTS9EL1lZWVkgSDptOnMnfSk7XG4gICAgICBjb25zdCB0aW1lcyA9IG1ha2VUYWJsZSgndGltZXMnLCBbXSwgW10pO1xuICAgICAgdGltZXMudXBkYXRlU2NoZW1hKGRhdGEpO1xuICAgICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHt0aW1lc319O1xuICAgICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3RpbWVzJykpO1xuICAgICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICAgIGZpZWxkTmFtZTogJ2dyb3VwJyxcbiAgICAgICAgICBhZ2dyZWdhdGlvbnM6IHt0aW1lOiB0ZWNobmlxdWV9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3MocmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB0ZWNobmlxdWUgPT09ICdtaW5pbXVtJyA/IGRlY2VtYmVyIDogamFudWFyeTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzdWx0LmRhdGFDb250YWluZXIuZ2V0UGxhaW5JbmRleCgpLm1hcChpID0+IHJlc3VsdC5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoaSkpXG4gICAgICApLnRvRXF1YWwoW1xuICAgICAgICBbJ3dlc3QnLCBleHBlY3RlZF0sXG4gICAgICAgIFsnZWFzdCcsIGV4cGVjdGVkXSxcbiAgICAgICAgWydtaXNzaW5nJywgbnVsbF1cbiAgICAgIF0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5maWVsZHNbMV0pLnRvTWF0Y2hPYmplY3Qoe3R5cGU6ICd0aW1lc3RhbXAnLCBmb3JtYXQ6IGRhdGEuZmllbGRzWzFdLmZvcm1hdH0pO1xuICAgICAgZXhwZWN0KHRpbWVzLmRhdGFDb250YWluZXIudmFsdWVBdCgwLCAxKSkudG9CZShkZWNlbWJlcik7XG4gICAgICBleHBlY3QodGltZXMuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDEsIDEpKS50b0JlKGphbnVhcnkpO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0KCdkZWxldGUgcGFyZW50IGtlZXBzIGRlcml2ZWQgY2hpbGQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1snd2VzdCcsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmdyb3VwQnlzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRHcm91cEJ5Q29uZmlnKG9wLmlkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3QoT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpKS50b0hhdmVMZW5ndGgoMik7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5cykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdhZGRHcm91cEJ5IHVzZXMgYSBzaG9ydCByYW5kb20gcmVzdWx0IG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbe25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfV0sXG4gICAgICBbWyd3ZXN0J11dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLnJlc3VsdExhYmVsKS50b01hdGNoKC9eZ3JvdXAtYnktXFxkezJ9JC8pO1xuICB9KTtcblxuICB0ZXN0KCdhZGRKb2luIHVzZXMgYSBzaG9ydCByYW5kb20gcmVzdWx0IG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKCdjaXRpZXMnLCBbe25hbWU6ICdpZCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSwgW1snMSddXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkSm9pbignY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXmpvaW4tZGF0YXNldC1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NldFNwYXRpYWxKb2luQ29uZmlnIHVwZGF0ZXMgdGhlIHByZWRpY2F0ZScsICgpID0+IHtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZSgncG9seXMnLCBbe25hbWU6ICdnZW9tJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb259XSwgW10pO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7cG9seXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnByZWRpY2F0ZSkudG9CZSgnaW50ZXJzZWN0cycpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5yZXN1bHRMYWJlbCkudG9CZShgc3BhdGlhbC1qb2luLSR7c3RhdGUuam9pbnNbMF0ucmVzdWx0SWR9YCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7cHJlZGljYXRlOiAnd2l0aGluJ30pXG4gICAgKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucHJlZGljYXRlKS50b0JlKCd3aXRoaW4nKTtcbiAgfSk7XG5cbiAgdGVzdCgnc3BhdGlhbCBqb2lucyBpbXBvcnRlZCBXS1QgYWZ0ZXIgcmVwZWF0ZWQgcnVucyBhbmQgc291cmNlIHJlbG9hZHMgd2l0aG91dCBjaGFuZ2luZyBpdCcsICgpID0+IHtcbiAgICBjb25zdCBwb2x5Z29uID0gJ1BPTFlHT04gKCgtMTAgLTEwLCAxMCAtMTAsIDEwIDEwLCAtMTAgMTAsIC0xMCAtMTApKSc7XG4gICAgY29uc3QgcG9seXMgPSBtYWtlVGFibGUoJ3BvbHlzJywgW10sIFtdKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoJ3B0cycsIFtdLCBbXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHtwb2x5cywgcHRzfX07XG5cbiAgICBmb3IgKGNvbnN0IGxuZyBvZiBbMCwgMCwgMzBdKSB7XG4gICAgICBjb25zdCBwb2x5Z29uRGF0YSA9IHByb2Nlc3NDc3ZEYXRhKGBnZW9tXFxuXCIke3BvbHlnb259XCJgKTtcbiAgICAgIGNvbnN0IHBvaW50ID0gYFBPSU5UICgke2xuZ30gMClgO1xuICAgICAgY29uc3QgcG9pbnREYXRhID0gcHJvY2Vzc0NzdkRhdGEoYGdlb20sdmFsdWVcXG5cIiR7cG9pbnR9XCIsMTBgKTtcbiAgICAgIGlmICghcG9seWdvbkRhdGEgfHwgIXBvaW50RGF0YSkgdGhyb3cgbmV3IEVycm9yKCdXS1QgQ1NWIGltcG9ydCBmYWlsZWQnKTtcbiAgICAgIHBvbHlzLnVwZGF0ZVNjaGVtYShwb2x5Z29uRGF0YSk7XG4gICAgICBwdHMudXBkYXRlU2NoZW1hKHBvaW50RGF0YSk7XG4gICAgICBleHBlY3QocG9seXMuZmllbGRzWzBdLnR5cGUpLnRvQmUoQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24pO1xuICAgICAgZXhwZWN0KHB0cy5maWVsZHNbMF0udHlwZSkudG9CZShBTExfRklFTERfVFlQRVMuZ2VvanNvbik7XG5cbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zWzBdO1xuICAgICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTcGF0aWFsSm9pbkNvbmZpZyhvcC5pZCwge1xuICAgICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgICBsZWZ0R2VvOiB7a2luZDogJ2dlb2pzb24nLCBmaWVsZE5hbWU6ICdnZW9tJ30sXG4gICAgICAgICAgcmlnaHRHZW86IHtraW5kOiAnZ2VvanNvbicsIGZpZWxkTmFtZTogJ2dlb20nfSxcbiAgICAgICAgICBhZ2dyZWdhdGlvbnM6IHt2YWx1ZTogJ3N1bSd9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blNwYXRpYWxKb2luKG9wLmlkKSk7XG4gICAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXS5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMCkpLnRvRXF1YWwoW1xuICAgICAgICBwb2x5Z29uLFxuICAgICAgICBsbmcgPT09IDAgPyAxIDogMCxcbiAgICAgICAgbG5nID09PSAwID8gMTAgOiBudWxsXG4gICAgICBdKTtcbiAgICAgIGV4cGVjdChwb2x5cy5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMCwgMCkpLnRvQmUocG9seWdvbik7XG4gICAgICBleHBlY3QocHRzLmRhdGFDb250YWluZXIudmFsdWVBdCgwLCAwKSkudG9CZShwb2ludCk7XG4gICAgfVxuICB9KTtcblxuICB0ZXN0KCdkZWxldGUgc3BhdGlhbCBqb2luIHNvdXJjZSBrZWVwcyByZXN1bHQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seWdvbiA9IHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgIFtcbiAgICAgICAgICBbLTEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgLTEwXSxcbiAgICAgICAgICBbMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAxMF0sXG4gICAgICAgICAgWy0xMCwgLTEwXVxuICAgICAgICBdXG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZShcbiAgICAgICdwb2x5cycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAnbmFtZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgcG9seWdvbl1dXG4gICAgKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoXG4gICAgICAncHRzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1swLCAwLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzLCBwdHN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7XG4gICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgbGVmdEdlbzoge2tpbmQ6ICdnZW9qc29uJywgZmllbGROYW1lOiAnZ2VvbSd9LFxuICAgICAgICByaWdodEdlbzoge2tpbmQ6ICdsYXRsbmcnLCBsYXRGaWVsZDogJ2xhdCcsIGxuZ0ZpZWxkOiAnbG5nJ30sXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3ZhbHVlOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3BhdGlhbEpvaW4ob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuam9pbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ3B0cycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucHRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnBvbHlzKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdzYXZlL2xvYWQgcm91bmR0cmlwIGtlZXBzIHRoZSBkZXJpdmVkIGRhdGFzZXQgYW5kIGRyb3BzIHRoZSBmaW5pc2hlZCBncm91cCBieScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgMTBdXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3AuaWQsIHtcbiAgICAgICAgZmllbGROYW1lOiAncmVnaW9uJyxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7cG9wOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGNvbnN0IHNhdmVkID0gU2NoZW1hTWFuYWdlci5zYXZlKHtcbiAgICAgIHZpc1N0YXRlOiBzdGF0ZSxcbiAgICAgIG1hcFN0YXRlOiB7fSxcbiAgICAgIG1hcFN0eWxlOiB7fSxcbiAgICAgIHVpU3RhdGU6IHt9XG4gICAgfSk7XG4gICAgY29uc3QgZGVyaXZlZCA9IHNhdmVkLmRhdGFzZXRzLmZpbmQoZGF0YXNldCA9PiBkYXRhc2V0LmRhdGEuaWQgPT09IG9wLnJlc3VsdElkKTtcbiAgICBjb25zdCBkZXJpdmVkTWV0YSA9IGRlcml2ZWQ/LmRhdGEubWV0YWRhdGEgYXNcbiAgICAgIHwge2Rlcml2ZWREYXRhc2V0Pzoge3R5cGU/OiBzdHJpbmd9IHwgbnVsbH1cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGV4cGVjdChkZXJpdmVkTWV0YT8uZGVyaXZlZERhdGFzZXQ/LnR5cGUpLnRvQmUoJ2dyb3VwQnknKTtcbiAgICBleHBlY3Qoc2F2ZWQuY29uZmlnLmNvbmZpZy52aXNTdGF0ZS5ncm91cEJ5cyA/PyBbXSkudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnc3VpdGFiaWxpdHkgdmlzLXN0YXRlJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICBmdW5jdGlvbiBzaXRlU3RhdGUoKTogVmlzU3RhdGUge1xuICAgIGNvbnN0IHNpdGVzID0gbWFrZVRhYmxlKFxuICAgICAgJ3NpdGVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICduYW1lJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAnbGF0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ2xuZycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgICAge25hbWU6ICdhY2Nlc3MnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn0sXG4gICAgICAgIHtuYW1lOiAnY29zdCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWydhJywgMCwgMCwgMCwgMTAwXSxcbiAgICAgICAgWydiJywgMSwgMSwgNSwgMjAwXSxcbiAgICAgICAgWydjJywgMiwgMiwgMTAsIDMwMF1cbiAgICAgIF1cbiAgICApO1xuICAgIHJldHVybiB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7c2l0ZXN9fTtcbiAgfVxuXG4gIHRlc3QoJ2FkZFN1aXRhYmlsaXR5IHNlZWRzIG51bWVyaWMgd2VpZ2h0cyBhbmQgYSBzaG9ydCByYW5kb20gcmVzdWx0IG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcblxuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuICAgIGV4cGVjdChvcC53ZWlnaHRzKS50b0VxdWFsKHtsYXQ6IDEsIGxuZzogMSwgYWNjZXNzOiAxLCBjb3N0OiAxfSk7XG4gICAgZXhwZWN0KG9wLndlaWdodFN0YW5kYXJkaXphdGlvbikudG9CZSgnbm9ybWFsaXplJyk7XG4gICAgZXhwZWN0KG9wLmRhdGFTdGFuZGFyZGl6YXRpb24pLnRvQmUoJ3JhbmdlJyk7XG4gICAgZXhwZWN0KG9wLm91dHB1dEZpZWxkTmFtZSkudG9CZSgnc2NvcmUnKTtcbiAgICBleHBlY3Qob3AucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15zdWl0YWJpbGl0eS1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ29wZW5pbmcgYSBzdWl0YWJpbGl0eSBvcCBjbG9zZXMgYW4gb3BlbiBncm91cCBieScsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3NpdGVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5c1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZSh0cnVlKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZSh0cnVlKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3J1blN1aXRhYmlsaXR5IGFkZHMgYSBzY29yZWQgZGF0YXNldCBhbmQgYSBkZWZhdWx0IGxheWVyJywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTdWl0YWJpbGl0eUNvbmZpZyhvcC5pZCwge3dlaWdodHM6IHthY2Nlc3M6IDEsIGNvc3Q6IDF9fSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TdWl0YWJpbGl0eShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHJlc3VsdC5tZXRhZGF0YS5kZXJpdmVkRGF0YXNldCkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnc3VpdGFiaWxpdHknLFxuICAgICAgc291cmNlRGF0YUlkczogWydzaXRlcyddLFxuICAgICAgb3BlcmF0aW9uSWQ6IG9wLmlkXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpKS50b0NvbnRhaW4oJ3Njb3JlJyk7XG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXNbMF0uaXNDb25maWdBY3RpdmUpLnRvQmUoZmFsc2UpO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChpdGVtID0+IGl0ZW0uY29uZmlnLmRhdGFJZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGV4cGVjdChsYXllcikudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChsYXllcj8uY29uZmlnLmNvbG9yRmllbGQ/Lm5hbWUpLnRvQmUoJ3Njb3JlJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3J1bm5pbmcgd2l0aG91dCBhIHdlaWdodGVkIGZpZWxkIHN1cmZhY2VzIGFuIGVycm9yIGluc3RlYWQgb2YgYSBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRTdWl0YWJpbGl0eUNvbmZpZyhvcC5pZCwge3dlaWdodHM6IHt9fSkpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TdWl0YWJpbGl0eShvcC5pZCkpO1xuXG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXNbMF0uZXJyb3IpLnRvQmUoJ1NlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgdG8gc2NvcmUnKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0aW5nIHRoZSBzb3VyY2UgZGF0YXNldCBkcm9wcyB0aGUgb3AgYnV0IGtlZXBzIHRoZSBzY29yZWQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TdWl0YWJpbGl0eShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnNpdGVzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3RoZSBvcCBjb25maWcgc3RheXMgb3V0IG9mIHNhdmVkIG1hcHMgd2hpbGUgdGhlIGRlcml2ZWQgZGF0YXNldCBwZXJzaXN0cycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBTY2hlbWFNYW5hZ2VyLnNhdmUoe1xuICAgICAgdmlzU3RhdGU6IHN0YXRlLFxuICAgICAgbWFwU3RhdGU6IHt9LFxuICAgICAgbWFwU3R5bGU6IHt9LFxuICAgICAgdWlTdGF0ZToge31cbiAgICB9KTtcblxuICAgIGV4cGVjdChzYXZlZC5jb25maWcuY29uZmlnLnZpc1N0YXRlKS5ub3QudG9IYXZlUHJvcGVydHkoJ3N1aXRhYmlsaXRpZXMnKTtcbiAgICBjb25zdCBkZXJpdmVkID0gc2F2ZWQuZGF0YXNldHMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YS5pZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGNvbnN0IGRlcml2ZWRNZXRhID0gZGVyaXZlZD8uZGF0YS5tZXRhZGF0YSBhc1xuICAgICAgfCB7ZGVyaXZlZERhdGFzZXQ/OiB7dHlwZT86IHN0cmluZ30gfCBudWxsfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgZXhwZWN0KGRlcml2ZWRNZXRhPy5kZXJpdmVkRGF0YXNldD8udHlwZSkudG9CZSgnc3VpdGFiaWxpdHknKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ25hdGl2ZSBHZW9BcnJvdyBhdHRyaWJ1dGUgam9pbnMnLCAoKSA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhS2V5ID0gJ0FSUk9XOmV4dGVuc2lvbjpuYW1lJztcbiAgY29uc3QgcG9pbnQgPSAoeDogbnVtYmVyKSA9PiAoe3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzOiBbeCwgeCArIDFdfSk7XG4gIGNvbnN0IG11bHRpID0gKHg6IG51bWJlcikgPT4gKHtcbiAgICB0eXBlOiAnTXVsdGlQb2ludCcsXG4gICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgIFt4LCB4ICsgMV0sXG4gICAgICBbeCArIDIsIHggKyAzXVxuICAgIF1cbiAgfSk7XG4gIGNvbnN0IHBvaW50VHlwZSA9IG5ldyBhcnJvdy5GaXhlZFNpemVMaXN0KDIsIG5ldyBhcnJvdy5GaWVsZCgneHknLCBuZXcgYXJyb3cuRmxvYXQ2NCgpLCBmYWxzZSkpO1xuICBjb25zdCBsaXN0ID0gKHR5cGU6IGFycm93LkRhdGFUeXBlKSA9PiBuZXcgYXJyb3cuTGlzdChuZXcgYXJyb3cuRmllbGQoJ2l0ZW0nLCB0eXBlLCB0cnVlKSk7XG4gIGNvbnN0IG9yaWdpbmFsUmVzcG9uc2UgPSBnbG9iYWxUaGlzLlJlc3BvbnNlO1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGdsb2JhbFRoaXMuUmVzcG9uc2UgPSBSZXNwb25zZSBhcyBhbnk7XG4gIH0pO1xuICBhZnRlckFsbCgoKSA9PiB7XG4gICAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IG9yaWdpbmFsUmVzcG9uc2U7XG4gIH0pO1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBuYXRpdmVTb3VyY2UoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBlbmNvZGluZzogc3RyaW5nLFxuICAgIHR5cGU6IGFycm93LkRhdGFUeXBlLFxuICAgIGNvb3JkaW5hdGVzOiBhbnlbXSxcbiAgICBrZXlzID0gY29vcmRpbmF0ZXMubWFwKChfLCBpKSA9PiBTdHJpbmcoaSkpXG4gICkge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IGFycm93LlRhYmxlKHtcbiAgICAgIGtleTogYXJyb3cudmVjdG9yRnJvbUFycmF5KGtleXMpLFxuICAgICAgZ2VvbWV0cnk6IGFycm93LnZlY3RvckZyb21BcnJheShjb29yZGluYXRlcywgdHlwZSlcbiAgICB9KTtcbiAgICBpbnB1dC5zY2hlbWEuZmllbGRzWzFdLm1ldGFkYXRhLnNldChtZXRhZGF0YUtleSwgZW5jb2RpbmcpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBhcnJvdy50YWJsZUZyb21JUEMoYXJyb3cudGFibGVUb0lQQyhpbnB1dCwgJ3N0cmVhbScpKTtcbiAgICBjb25zdCBbZmlsZV0gPSBhd2FpdCBwcm9jZXNzRmlsZURhdGEoe1xuICAgICAgY29udGVudDoge2ZpbGVOYW1lOiBgJHtpZH0uYXJyb3dgLCBkYXRhOiBkZWNvZGVkLmJhdGNoZXN9LFxuICAgICAgZmlsZUNhY2hlOiBbXVxuICAgIH0gYXMgYW55KTtcbiAgICBjb25zdCBkYXRhc2V0ID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQsIGxhYmVsOiBpZH0sIGNvbG9yOiBbMSwgMiwgM119KTtcbiAgICBhd2FpdCBkYXRhc2V0LmltcG9ydERhdGEoe2RhdGE6IGZpbGUuZGF0YSBhcyBhbnl9KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNvdXJjZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGtpbmQ6ICdQb2ludCcgfCAnTXVsdGlQb2ludCcsXG4gICAga2V5cyA9IFsnYScsICdiJ10sXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSA9IFsxMCwgNDBdXG4gICkge1xuICAgIHJldHVybiBuYXRpdmVTb3VyY2UoXG4gICAgICBpZCxcbiAgICAgIGBnZW9hcnJvdy4ke2tpbmQudG9Mb3dlckNhc2UoKX1gLFxuICAgICAga2luZCA9PT0gJ1BvaW50JyA/IHBvaW50VHlwZSA6IGxpc3QocG9pbnRUeXBlKSxcbiAgICAgIHZhbHVlcy5tYXAoeCA9PiAoeCA9PT0gbnVsbCA/IG51bGwgOiAoa2luZCA9PT0gJ1BvaW50JyA/IHBvaW50KHgpIDogbXVsdGkoeCkpLmNvb3JkaW5hdGVzKSksXG4gICAgICBrZXlzXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGpvaW4obGVmdDogS2VwbGVyVGFibGUsIHJpZ2h0OiBLZXBsZXJUYWJsZSwgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pIHtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge1tsZWZ0LmlkXTogbGVmdCwgW3JpZ2h0LmlkXTogcmlnaHR9fTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkSm9pbihsZWZ0LmlkKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0Sm9pbkNvbmZpZyhvcC5pZCwge1xuICAgICAgICByaWdodERhdGFJZDogcmlnaHQuaWQsXG4gICAgICAgIGxlZnRGaWVsZDogJ2tleScsXG4gICAgICAgIHJpZ2h0RmllbGQ6ICdrZXknLFxuICAgICAgICB0eXBlOiAnTEVGVCcsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Kb2luKG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuICAgIHJldHVybiB7c3RhdGUsIHJlc3VsdDogc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdLCByZXN1bHRJZDogb3AucmVzdWx0SWR9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmVhdHVyZXMoZGF0YXNldDogS2VwbGVyVGFibGUsIGZpZWxkSW5kZXg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwcm9wcyA9IEdlb0pzb25MYXllci5maW5kRGVmYXVsdExheWVyUHJvcHMoZGF0YXNldCkucHJvcHM7XG4gICAgZXhwZWN0KHByb3BzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIGNvbnN0IGxheWVyID0gbmV3IEdlb0pzb25MYXllcih7XG4gICAgICAuLi5wcm9wc1swXSxcbiAgICAgIGRhdGFJZDogZGF0YXNldC5pZCxcbiAgICAgIC4uLihmaWVsZEluZGV4ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7fVxuICAgICAgICA6IHtjb2x1bW5zOiB7Z2VvanNvbjoge3ZhbHVlOiBkYXRhc2V0LmZpZWxkc1tmaWVsZEluZGV4XS5uYW1lLCBmaWVsZElkeDogZmllbGRJbmRleH19fSlcbiAgICB9IGFzIGFueSk7XG4gICAgbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnKGRhdGFzZXQpO1xuICAgIHJldHVybiAobGF5ZXIuZm9ybWF0TGF5ZXJEYXRhKHtbZGF0YXNldC5pZF06IGRhdGFzZXR9LCB7fSkgYXMgYW55KS5kYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gcmF3RmluZ2VycHJpbnQoZGF0YXNldDogS2VwbGVyVGFibGUpIHtcbiAgICBjb25zdCBjb2x1bW4gPSAoZGF0YXNldC5kYXRhQ29udGFpbmVyIGFzIGFueSkuZ2V0Q29sdW1uKDEpO1xuICAgIGNvbnN0IGJ5dGVzID0gKGRhdGE6IGFueSk6IGFueSA9PiAoe1xuICAgICAgdHlwZTogU3RyaW5nKGRhdGEudHlwZSksXG4gICAgICBvZmZzZXQ6IGRhdGEub2Zmc2V0LFxuICAgICAgbGVuZ3RoOiBkYXRhLmxlbmd0aCxcbiAgICAgIG51bGxDb3VudDogZGF0YS5udWxsQ291bnQsXG4gICAgICBidWZmZXJzOiBkYXRhLmJ1ZmZlcnMubWFwKChiOiBhbnkpID0+XG4gICAgICAgIGIgPyBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGIuYnVmZmVyLCBiLmJ5dGVPZmZzZXQsIGIuYnl0ZUxlbmd0aCkpIDogbnVsbFxuICAgICAgKSxcbiAgICAgIGNoaWxkcmVuOiBkYXRhLmNoaWxkcmVuLm1hcChieXRlcylcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uLFxuICAgICAgY2h1bmtzOiBjb2x1bW4uZGF0YS5zbGljZSgpLFxuICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoY29sdW1uLmRhdGEubWFwKGJ5dGVzKSksXG4gICAgICBtZXRhZGF0YTogQXJyYXkuZnJvbShkYXRhc2V0LmZpZWxkc1sxXS5tZXRhZGF0YSEuZW50cmllcygpKVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRVbmNoYW5nZWQoZGF0YXNldDogS2VwbGVyVGFibGUsIGJlZm9yZTogUmV0dXJuVHlwZTx0eXBlb2YgcmF3RmluZ2VycHJpbnQ+KSB7XG4gICAgY29uc3QgYWZ0ZXIgPSByYXdGaW5nZXJwcmludChkYXRhc2V0KTtcbiAgICBleHBlY3QoYWZ0ZXIuY29sdW1uKS50b0JlKGJlZm9yZS5jb2x1bW4pO1xuICAgIGFmdGVyLmNodW5rcy5mb3JFYWNoKChjaHVuazogYW55LCBpOiBudW1iZXIpID0+IGV4cGVjdChjaHVuaykudG9CZShiZWZvcmUuY2h1bmtzW2ldKSk7XG4gICAgZXhwZWN0KGFmdGVyLmNvbnRlbnQpLnRvQmUoYmVmb3JlLmNvbnRlbnQpO1xuICAgIGV4cGVjdChhZnRlci5tZXRhZGF0YSkudG9FcXVhbChiZWZvcmUubWV0YWRhdGEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcm91bmR0cmlwKGRhdGFzZXQ6IEtlcGxlclRhYmxlKSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBkYXRhc2V0U2NoZW1hW1ZFUlNJT05TLnYxXS5zYXZlKGRhdGFzZXQpO1xuICAgIGNvbnN0IGxvYWRlZCA9IGRhdGFzZXRTY2hlbWFbVkVSU0lPTlMudjFdLmxvYWQoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzYXZlZCkpKTtcbiAgICByZXR1cm4gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQ6IGAke2RhdGFzZXQuaWR9LXJlbG9hZGB9LCBjb2xvcjogWzEsIDIsIDNdfSkudXBkYXRlU2NoZW1hKFxuICAgICAgbG9hZGVkLmRhdGFcbiAgICApO1xuICB9XG5cbiAgdGVzdC5lYWNoKFsnUG9pbnQnLCAnTXVsdGlQb2ludCddIGFzIGNvbnN0KShcbiAgICAncHJlc2VydmVzIGltcG9ydGVkICVzIGdlb21ldHJ5IHRocm91Z2ggam9pbiBhY3Rpb25zLCBsYXllciBhY2Nlc3NvcnMsIGV4cG9ydCBhbmQgcmVsb2FkJyxcbiAgICBhc3luYyBraW5kID0+IHtcbiAgICAgIGNvbnN0IGxlZnQgPSBhd2FpdCBzb3VyY2UoJ25hdGl2ZScsIGtpbmQpO1xuICAgICAgY29uc3QgYmVmb3JlID0gcmF3RmluZ2VycHJpbnQobGVmdCk7XG4gICAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZShcbiAgICAgICAgJ2xvb2t1cCcsXG4gICAgICAgIFtcbiAgICAgICAgICB7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfSxcbiAgICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ3JlYWwnfVxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgWydhJywgMV0sXG4gICAgICAgICAgWydiJywgMl1cbiAgICAgICAgXVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gWzEwLCA0MF0ubWFwKHggPT4gKGtpbmQgPT09ICdQb2ludCcgPyBwb2ludCh4KSA6IG11bHRpKHgpKSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uKGxlZnQuZGF0YUNvbnRhaW5lciwgbGVmdC5maWVsZHMpLmZlYXR1cmVzLm1hcChmID0+IGYuZ2VvbWV0cnkpXG4gICAgICApLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgY29uc3Qge3Jlc3VsdCwgc3RhdGV9ID0gam9pbihsZWZ0LCByaWdodCk7XG4gICAgICBleHBlY3Qoc3RhdGUuam9pbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZGF0YUNvbnRhaW5lci5jb25zdHJ1Y3Rvci5uYW1lKS50b0JlKCdSb3dEYXRhQ29udGFpbmVyJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmRhdGFDb250YWluZXIubnVtUm93cygpKS50b0JlKDIpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5maWVsZHNbMV0pLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAgIGFuYWx5emVyVHlwZTogJ0dFT01FVFJZX0ZST01fU1RSSU5HJ1xuICAgICAgfSk7XG4gICAgICBleHBlY3QocmVzdWx0LmZpZWxkc1sxXS5tZXRhZGF0YSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KEpTT04ucGFyc2UocmVzdWx0LmZpZWxkc1sxXS52YWx1ZUFjY2Vzc29yKHtpbmRleDogMH0pKSkudG9FcXVhbChleHBlY3RlZFswXSk7XG4gICAgICBleHBlY3QocmVzdWx0LmZpZWxkc1szXS52YWx1ZUFjY2Vzc29yKHtpbmRleDogMX0pKS50b0JlKDIpO1xuICAgICAgZXhwZWN0KHN0YXRlLmxheWVycy5maWx0ZXIobGF5ZXIgPT4gbGF5ZXIuY29uZmlnLmRhdGFJZCA9PT0gcmVzdWx0LmlkKSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIFtyZXN1bHQsIHJvdW5kdHJpcChyZXN1bHQpXSkge1xuICAgICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldCkubWFwKChmOiBhbnkpID0+IGYuZ2VvbWV0cnkpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIGRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uKGRhdGFzZXQuZGF0YUNvbnRhaW5lciwgZGF0YXNldC5maWVsZHMpLmZlYXR1cmVzLm1hcChcbiAgICAgICAgICAgIGYgPT4gZi5nZW9tZXRyeVxuICAgICAgICAgIClcbiAgICAgICAgKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBwcm9jZXNzR2VvanNvbih7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgIGZlYXR1cmVzOiBleHBlY3RlZC5tYXAoKGdlb21ldHJ5LCBpKSA9PiAoe1xuICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICBnZW9tZXRyeSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7a2V5OiBbJ2EnLCAnYiddW2ldfVxuICAgICAgICB9KSlcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgS2VwbGVyVGFibGUoe2luZm86IHtpZDogJ2dlb2pzb24nfSwgY29sb3I6IFsxLCAyLCAzXX0pLnVwZGF0ZVNjaGVtYShcbiAgICAgICAgZGF0YSFcbiAgICAgICk7XG4gICAgICBleHBlY3QoZmVhdHVyZXMoam9pbihjb250cm9sLCByaWdodCkucmVzdWx0KS5tYXAoKGY6IGFueSkgPT4gZi5nZW9tZXRyeSkpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgYXNzZXJ0VW5jaGFuZ2VkKGxlZnQsIGJlZm9yZSk7XG4gICAgfVxuICApO1xuXG4gIHRlc3QuZWFjaChbJ1BvaW50JywgJ011bHRpUG9pbnQnXSBhcyBjb25zdCkoXG4gICAgJ3ByZXNlcnZlcyAlcyBvbiBib3RoIHNpZGVzIHdpdGggZHVwbGljYXRlcywgbnVsbHMsIHVubWF0Y2hlZCByb3dzIGFuZCBlbXB0eSBqb2lucycsXG4gICAgYXN5bmMga2luZCA9PiB7XG4gICAgICBjb25zdCBsZWZ0ID0gYXdhaXQgc291cmNlKCdsZWZ0Jywga2luZCwgWydhJywgJ2InLCAnYycsIG51bGxdIGFzIGFueSwgWzEwLCBudWxsLCA0MCwgNzBdKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gYXdhaXQgc291cmNlKCdyaWdodCcsIGtpbmQsIFsnYScsICdhJywgJ2QnLCBudWxsXSBhcyBhbnksIFsyMCwgbnVsbCwgNTAsIDgwXSk7XG4gICAgICBjb25zdCBiZWZvcmVMZWZ0ID0gcmF3RmluZ2VycHJpbnQobGVmdCk7XG4gICAgICBjb25zdCBiZWZvcmVSaWdodCA9IHJhd0ZpbmdlcnByaW50KHJpZ2h0KTtcbiAgICAgIGZvciAoY29uc3QgW3R5cGUsIGV4cGVjdGVkUm93cywgbGVmdEZlYXR1cmVzLCByaWdodEZlYXR1cmVzXSBvZiBbXG4gICAgICAgIFsnTEVGVCcsIDUsIDQsIDFdLFxuICAgICAgICBbJ0lOTkVSJywgMiwgMiwgMV0sXG4gICAgICAgIFsnRlVMTCcsIDcsIDQsIDNdXG4gICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgIGNvbnN0IHtyZXN1bHQsIHN0YXRlfSA9IGpvaW4obGVmdCwgcmlnaHQsIHt0eXBlfSk7XG4gICAgICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgICAgICBleHBlY3QocmVzdWx0LmRhdGFDb250YWluZXIubnVtUm93cygpKS50b0JlKGV4cGVjdGVkUm93cyk7XG4gICAgICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBbcmVzdWx0LCByb3VuZHRyaXAocmVzdWx0KV0pIHtcbiAgICAgICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldCwgMSkpLnRvSGF2ZUxlbmd0aChsZWZ0RmVhdHVyZXMpO1xuICAgICAgICAgIGV4cGVjdChmZWF0dXJlcyhkYXRhc2V0LCAzKSkudG9IYXZlTGVuZ3RoKHJpZ2h0RmVhdHVyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDEsIDMpKS50b0JlTnVsbCgpO1xuICAgICAgICBpZiAodHlwZSAhPT0gJ0lOTkVSJykgZXhwZWN0KHJlc3VsdC5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMiwgMSkpLnRvQmVOdWxsKCk7XG4gICAgICAgIGlmICh0eXBlID09PSAnRlVMTCcpIGV4cGVjdChyZXN1bHQuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDUsIDEpKS50b0JlTnVsbCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgZW1wdHkgPSBqb2luKGxlZnQsIGF3YWl0IHNvdXJjZSgnYWJzZW50Jywga2luZCwgWydub25lJ10sIFs5MF0pLCB7XG4gICAgICAgIHR5cGU6ICdJTk5FUidcbiAgICAgIH0pLnJlc3VsdDtcbiAgICAgIGV4cGVjdChlbXB0eS5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgwKTtcbiAgICAgIGV4cGVjdChmZWF0dXJlcyhlbXB0eSwgMSkpLnRvRXF1YWwoW10pO1xuICAgICAgYXNzZXJ0VW5jaGFuZ2VkKGxlZnQsIGJlZm9yZUxlZnQpO1xuICAgICAgYXNzZXJ0VW5jaGFuZ2VkKHJpZ2h0LCBiZWZvcmVSaWdodCk7XG4gICAgfVxuICApO1xuXG4gIHRlc3QuZWFjaChbMywgNF0pKFxuICAgICdwcmVzZXJ2ZXMgcHJlY2lzaW9uIGFuZCBhbGwgJWkgbmF0aXZlIGNvb3JkaW5hdGUgb3JkaW5hdGVzJyxcbiAgICBhc3luYyBkaW1lbnNpb25zID0+IHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gWy0xMjIuNDEyMzQ1Njc4OTAxMjMsIDM3LjgxMjM0NTY3ODkwMTIzLCAxMjMuNDU2Nzg5MDEyMywgOTkuMTI1XS5zbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgZGltZW5zaW9uc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBuZXcgYXJyb3cuRml4ZWRTaXplTGlzdChcbiAgICAgICAgZGltZW5zaW9ucyxcbiAgICAgICAgbmV3IGFycm93LkZpZWxkKCdjb29yZGluYXRlJywgbmV3IGFycm93LkZsb2F0NjQoKSwgZmFsc2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbGVmdCA9IGF3YWl0IG5hdGl2ZVNvdXJjZSgnbmF0aXZlJywgJ2dlb2Fycm93LnBvaW50JywgdHlwZSwgW2Nvb3JkaW5hdGVzXSk7XG4gICAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZSgnbG9va3VwJywgW3tuYW1lOiAna2V5JywgdHlwZTogJ3N0cmluZyd9XSwgW1snMCddXSk7XG4gICAgICBjb25zdCB7cmVzdWx0fSA9IGpvaW4obGVmdCwgcmlnaHQpO1xuICAgICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIFtyZXN1bHQsIHJvdW5kdHJpcChyZXN1bHQpXSkge1xuICAgICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldClbMF0uZ2VvbWV0cnkpLnRvRXF1YWwoe3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzfSk7XG4gICAgICAgIGV4cGVjdChcbiAgICAgICAgICBkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbihkYXRhc2V0LmRhdGFDb250YWluZXIsIGRhdGFzZXQuZmllbGRzKS5mZWF0dXJlc1swXS5nZW9tZXRyeVxuICAgICAgICApLnRvRXF1YWwoe3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzfSk7XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIHRlc3QoJ3ByZXNlcnZlcyBlbXB0eSBuYXRpdmUgUG9pbnRzIHNlcGFyYXRlbHkgZnJvbSBudWxsIGdlb21ldHJ5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxlZnQgPSBhd2FpdCBuYXRpdmVTb3VyY2UoJ25hdGl2ZScsICdnZW9hcnJvdy5wb2ludCcsIHBvaW50VHlwZSwgW1xuICAgICAgWzEwLCAxMV0sXG4gICAgICBbTmFOLCBOYU5dLFxuICAgICAgbnVsbFxuICAgIF0pO1xuICAgIGNvbnN0IGJlZm9yZSA9IHJhd0ZpbmdlcnByaW50KGxlZnQpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWycwJ10sIFsnMSddLCBbJzInXV0pO1xuICAgIGNvbnN0IHtyZXN1bHQsIHN0YXRlfSA9IGpvaW4obGVmdCwgcmlnaHQpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW3BvaW50KDEwKSwge3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzOiBbXX0sIG51bGxdO1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBbcmVzdWx0LCByb3VuZHRyaXAocmVzdWx0KV0pIHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgZGF0YXNldFRvRmVhdHVyZUNvbGxlY3Rpb24oZGF0YXNldC5kYXRhQ29udGFpbmVyLCBkYXRhc2V0LmZpZWxkcykuZmVhdHVyZXMubWFwKFxuICAgICAgICAgIGYgPT4gZi5nZW9tZXRyeVxuICAgICAgICApXG4gICAgICApLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgZXhwZWN0KGZlYXR1cmVzKGRhdGFzZXQpLm1hcCgoZjogYW55KSA9PiBmLmdlb21ldHJ5KSkudG9FcXVhbChleHBlY3RlZC5zbGljZSgwLCAyKSk7XG4gICAgfVxuICAgIGFzc2VydFVuY2hhbmdlZChsZWZ0LCBiZWZvcmUpO1xuICB9KTtcblxuICB0ZXN0LmVhY2goW1xuICAgIFtcbiAgICAgICdMaW5lU3RyaW5nJyxcbiAgICAgIDEsXG4gICAgICBbXG4gICAgICAgIFsxMCwgMTFdLFxuICAgICAgICBbMTIsIDEzXVxuICAgICAgXVxuICAgIF0sXG4gICAgW1xuICAgICAgJ1BvbHlnb24nLFxuICAgICAgMixcbiAgICAgIFtcbiAgICAgICAgW1xuICAgICAgICAgIFsxMCwgMTFdLFxuICAgICAgICAgIFsxMiwgMTFdLFxuICAgICAgICAgIFsxMiwgMTNdLFxuICAgICAgICAgIFsxMCwgMTFdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICBdLFxuICAgIFtcbiAgICAgICdNdWx0aVBvaW50JyxcbiAgICAgIDEsXG4gICAgICBbXG4gICAgICAgIFsxMCwgMTFdLFxuICAgICAgICBbMTIsIDEzXVxuICAgICAgXVxuICAgIF0sXG4gICAgW1xuICAgICAgJ011bHRpTGluZVN0cmluZycsXG4gICAgICAyLFxuICAgICAgW1xuICAgICAgICBbXG4gICAgICAgICAgWzEwLCAxMV0sXG4gICAgICAgICAgWzEyLCAxM11cbiAgICAgICAgXVxuICAgICAgXVxuICAgIF0sXG4gICAgW1xuICAgICAgJ011bHRpUG9seWdvbicsXG4gICAgICAzLFxuICAgICAgW1xuICAgICAgICBbXG4gICAgICAgICAgW1xuICAgICAgICAgICAgWzEwLCAxMV0sXG4gICAgICAgICAgICBbMTIsIDExXSxcbiAgICAgICAgICAgIFsxMiwgMTNdLFxuICAgICAgICAgICAgWzEwLCAxMV1cbiAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICBdXG4gIF0pKCdyZXRhaW5zICVzIGNvb3JkaW5hdGVzIGFuZCBlbXB0eSBnZW9tZXRyaWVzJywgYXN5bmMgKGtpbmQsIGRlcHRoLCBjb29yZGluYXRlcykgPT4ge1xuICAgIGxldCB0eXBlOiBhcnJvdy5EYXRhVHlwZSA9IHBvaW50VHlwZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE51bWJlcihkZXB0aCk7IGkrKykgdHlwZSA9IGxpc3QodHlwZSk7XG4gICAgY29uc3QgbGVmdCA9IGF3YWl0IG5hdGl2ZVNvdXJjZSgnbmF0aXZlJywgYGdlb2Fycm93LiR7U3RyaW5nKGtpbmQpLnRvTG93ZXJDYXNlKCl9YCwgdHlwZSwgW1xuICAgICAgY29vcmRpbmF0ZXMsXG4gICAgICBbXSxcbiAgICAgIG51bGxcbiAgICBdKTtcbiAgICBjb25zdCBiZWZvcmUgPSByYXdGaW5nZXJwcmludChsZWZ0KTtcbiAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZSgnbG9va3VwJywgW3tuYW1lOiAna2V5JywgdHlwZTogJ3N0cmluZyd9XSwgW1snMCddLCBbJzEnXSwgWycyJ11dKTtcbiAgICBjb25zdCB7cmVzdWx0LCBzdGF0ZX0gPSBqb2luKGxlZnQsIHJpZ2h0KTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFt7dHlwZToga2luZCwgY29vcmRpbmF0ZXN9LCB7dHlwZToga2luZCwgY29vcmRpbmF0ZXM6IFtdfSwgbnVsbF07XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIFtyZXN1bHQsIHJvdW5kdHJpcChyZXN1bHQpXSkge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbihkYXRhc2V0LmRhdGFDb250YWluZXIsIGRhdGFzZXQuZmllbGRzKS5mZWF0dXJlcy5tYXAoXG4gICAgICAgICAgZiA9PiBmLmdlb21ldHJ5XG4gICAgICAgIClcbiAgICAgICkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldClbMF0uZ2VvbWV0cnkpLnRvRXF1YWwoZXhwZWN0ZWRbMF0pO1xuICAgIH1cbiAgICBhc3NlcnRVbmNoYW5nZWQobGVmdCwgYmVmb3JlKTtcbiAgfSk7XG5cbiAgdGVzdC5lYWNoKFtcbiAgICBbJ2dlb2Fycm93LnBvaW50JywgcG9pbnRUeXBlLCBbWzEwLCBJbmZpbml0eV1dXSxcbiAgICBbJ2dlb2Fycm93LnBvaW50JywgcG9pbnRUeXBlLCBbWzEwLCBOYU5dXV0sXG4gICAgW1xuICAgICAgJ2dlb2Fycm93LnBvaW50JyxcbiAgICAgIG5ldyBhcnJvdy5TdHJ1Y3QoW1xuICAgICAgICBuZXcgYXJyb3cuRmllbGQoJ3gnLCBuZXcgYXJyb3cuRmxvYXQ2NCgpLCBmYWxzZSksXG4gICAgICAgIG5ldyBhcnJvdy5GaWVsZCgneScsIG5ldyBhcnJvdy5GbG9hdDY0KCksIGZhbHNlKVxuICAgICAgXSksXG4gICAgICBbe3g6IDEwLCB5OiAxMX1dXG4gICAgXSxcbiAgICBbXG4gICAgICAnZ2VvYXJyb3cucG9pbnQnLFxuICAgICAgbmV3IGFycm93LkZpeGVkU2l6ZUxpc3QoMSwgbmV3IGFycm93LkZpZWxkKCd4JywgbmV3IGFycm93LkZsb2F0NjQoKSwgZmFsc2UpKSxcbiAgICAgIFtbMTBdXVxuICAgIF0sXG4gICAgWydnZW9hcnJvdy5tdWx0aXBvaW50JywgbGlzdChwb2ludFR5cGUpLCBbW1sxMCwgMTFdLCBudWxsXV1dLFxuICAgIFsnZ2VvYXJyb3cudW5rbm93bicsIHBvaW50VHlwZSwgW1sxMCwgMTFdXV1cbiAgXSkoXG4gICAgJ3N1cmZhY2VzIGludmFsaWQgb3IgdW5zdXBwb3J0ZWQgJXMgaW5zdGVhZCBvZiBjcmVhdGluZyBjb3JydXB0IG91dHB1dCcsXG4gICAgYXN5bmMgKGVuY29kaW5nLCB0eXBlLCBjb29yZGluYXRlcykgPT4ge1xuICAgICAgY29uc3QgbGVmdCA9IGF3YWl0IG5hdGl2ZVNvdXJjZShcbiAgICAgICAgJ25hdGl2ZScsXG4gICAgICAgIGVuY29kaW5nIGFzIHN0cmluZyxcbiAgICAgICAgdHlwZSBhcyBhcnJvdy5EYXRhVHlwZSxcbiAgICAgICAgY29vcmRpbmF0ZXMgYXMgYW55W11cbiAgICAgICk7XG4gICAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZSgnbG9va3VwJywgW3tuYW1lOiAna2V5JywgdHlwZTogJ3N0cmluZyd9XSwgW1snMCddXSk7XG4gICAgICBjb25zdCBiZWZvcmUgPSByYXdGaW5nZXJwcmludChsZWZ0KTtcbiAgICAgIGNvbnN0IHtzdGF0ZSwgcmVzdWx0fSA9IGpvaW4obGVmdCwgcmlnaHQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLmVycm9yKS50b01hdGNoKC9nZW9tZXRyeS4qcm93IDEvaSk7XG4gICAgICBhc3NlcnRVbmNoYW5nZWQobGVmdCwgYmVmb3JlKTtcbiAgICAgIC8vIE9taXR0ZWQgZ2VvbWV0cnkgYW5kIG5vbm1hdGNoaW5nIElOTkVSIHJvd3MgbXVzdCBub3QgYmUgY29udmVydGVkIGVhZ2VybHkuXG4gICAgICBleHBlY3Qoam9pbihsZWZ0LCByaWdodCwge2xlZnRDb2x1bW5zOiBbJ2tleSddfSkucmVzdWx0LmRhdGFDb250YWluZXIucm93QXNBcnJheSgwKSkudG9FcXVhbChbXG4gICAgICAgICcwJyxcbiAgICAgICAgJzAnXG4gICAgICBdKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgam9pbihsZWZ0LCBtYWtlVGFibGUoJ2Fic2VudCcsIFt7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfV0sIFtbJ2Fic2VudCddXSksIHtcbiAgICAgICAgICB0eXBlOiAnSU5ORVInXG4gICAgICAgIH0pLnJlc3VsdC5kYXRhQ29udGFpbmVyLm51bVJvd3MoKVxuICAgICAgKS50b0JlKDApO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0LmVhY2goWyd3a2InLCAnd2t0J10gYXMgY29uc3QpKFxuICAgICdwcmVzZXJ2ZXMgJXMgZ2VvbWV0cnkgdGhyb3VnaCBjaGFpbmVkIGF0dHJpYnV0ZSBqb2lucycsXG4gICAgYXN5bmMgZW5jb2RpbmcgPT4ge1xuICAgICAgY29uc3QgZ2VvbWV0cnkgPSB7dHlwZTogJ1BvaW50JyBhcyBjb25zdCwgY29vcmRpbmF0ZXM6IFsxMCwgMTFdfTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgZW5jb2RpbmcgPT09ICd3a2InID8gbmV3IFVpbnQ4QXJyYXkoY29udmVydEdlb21ldHJ5VG9XS0IoZ2VvbWV0cnkpKSA6ICdQT0lOVCAoMTAgMTEpJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYXdhaXQgbmF0aXZlU291cmNlKFxuICAgICAgICAnc291cmNlJyxcbiAgICAgICAgYGdlb2Fycm93LiR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd3a2InID8gbmV3IGFycm93LkJpbmFyeSgpIDogbmV3IGFycm93LlV0ZjgoKSxcbiAgICAgICAgW3ZhbHVlLCBudWxsXSxcbiAgICAgICAgWydhJywgJ2InXVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWydhJ10sIFsnYiddXSk7XG4gICAgICBsZXQgbGVmdCA9IG9yaWdpbmFsO1xuICAgICAgZm9yIChsZXQgcnVuID0gMDsgcnVuIDwgMjsgcnVuKyspIHtcbiAgICAgICAgY29uc3Qge3N0YXRlLCByZXN1bHR9ID0gam9pbihsZWZ0LCByaWdodCwge3JpZ2h0Q29sdW1uczogW119KTtcbiAgICAgICAgZXhwZWN0KHN0YXRlLmpvaW5zKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgICAgIGV4cGVjdChcbiAgICAgICAgICBkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbihyZXN1bHQuZGF0YUNvbnRhaW5lciwgcmVzdWx0LmZpZWxkcykuZmVhdHVyZXMubWFwKFxuICAgICAgICAgICAgZmVhdHVyZSA9PiBmZWF0dXJlLmdlb21ldHJ5XG4gICAgICAgICAgKVxuICAgICAgICApLnRvRXF1YWwoW2dlb21ldHJ5LCBudWxsXSk7XG4gICAgICAgIGV4cGVjdChmZWF0dXJlcyhyZXN1bHQpLm1hcCgoZmVhdHVyZTogYW55KSA9PiBmZWF0dXJlLmdlb21ldHJ5KSkudG9FcXVhbChbZ2VvbWV0cnldKTtcbiAgICAgICAgbGVmdCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGV4cGVjdChvcmlnaW5hbC5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMCwgMSkpLnRvRXF1YWwodmFsdWUpO1xuICAgICAgZXhwZWN0KG9yaWdpbmFsLmRhdGFDb250YWluZXIudmFsdWVBdCgxLCAxKSkudG9CZU51bGwoKTtcbiAgICB9XG4gICk7XG5cbiAgdGVzdCgnam9pbnMgdW5hbm5vdGF0ZWQgV0tCIGlkZW50aWZpZWQgYXMgR0VPTUVUUlknLCAoKSA9PiB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSB7dHlwZTogJ1BvaW50JyBhcyBjb25zdCwgY29vcmRpbmF0ZXM6IFsxMCwgMTFdfTtcbiAgICBjb25zdCB2YWx1ZXMgPSBhcnJvdy52ZWN0b3JGcm9tQXJyYXkoXG4gICAgICBbbmV3IFVpbnQ4QXJyYXkoY29udmVydEdlb21ldHJ5VG9XS0IoZ2VvbWV0cnkpKSwgbnVsbF0sXG4gICAgICBuZXcgYXJyb3cuQmluYXJ5KClcbiAgICApO1xuICAgIGNvbnN0IGtleXMgPSBhcnJvdy52ZWN0b3JGcm9tQXJyYXkoWydhJywgJ2InXSk7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgYXJyb3cuVGFibGUoe2tleToga2V5cywgZ2VvbWV0cnk6IHZhbHVlc30pO1xuICAgIGNvbnN0IGxlZnQgPSBuZXcgS2VwbGVyVGFibGUoe2luZm86IHtpZDogJ3NvdXJjZSd9LCBjb2xvcjogWzEsIDIsIDNdfSkudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogYXJyb3dTY2hlbWFUb0ZpZWxkcyhpbnB1dCwge2dlb21ldHJ5OiAnR0VPTUVUUlknfSksXG4gICAgICBjb2xzOiBba2V5cywgdmFsdWVzXSxcbiAgICAgIHJvd3M6IFtdXG4gICAgfSk7XG4gICAgY29uc3QgcmlnaHQgPSBtYWtlVGFibGUoJ2xvb2t1cCcsIFt7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfV0sIFtbJ2EnXSwgWydiJ11dKTtcbiAgICBjb25zdCB7c3RhdGUsIHJlc3VsdH0gPSBqb2luKGxlZnQsIHJpZ2h0LCB7cmlnaHRDb2x1bW5zOiBbXX0pO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChcbiAgICAgIGRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3VsdC5kYXRhQ29udGFpbmVyLCByZXN1bHQuZmllbGRzKS5mZWF0dXJlcy5tYXAoXG4gICAgICAgIGZlYXR1cmUgPT4gZmVhdHVyZS5nZW9tZXRyeVxuICAgICAgKVxuICAgICkudG9FcXVhbChbZ2VvbWV0cnksIG51bGxdKTtcbiAgICBleHBlY3QoZmVhdHVyZXMocmVzdWx0KS5tYXAoKGZlYXR1cmU6IGFueSkgPT4gZmVhdHVyZS5nZW9tZXRyeSkpLnRvRXF1YWwoW2dlb21ldHJ5XSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2pvaW5zIG9yZGluYXJ5IEFycm93IGF0dHJpYnV0ZXMgYWZ0ZXIgSlNPTiBzYXZlL3JlbG9hZCB3aXRob3V0IGNoYW5naW5nIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBhcnJvdy5UYWJsZSh7XG4gICAgICBrZXk6IGFycm93LnZlY3RvckZyb21BcnJheShbJ2EnLCAnYiddKSxcbiAgICAgIHZhbHVlOiBhcnJvdy52ZWN0b3JGcm9tQXJyYXkoWzEuMjUsIDIuNV0pXG4gICAgfSk7XG4gICAgY29uc3QgW2ZpbGVdID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgIGNvbnRlbnQ6IHtmaWxlTmFtZTogJ29yZGluYXJ5LmFycm93JywgZGF0YTogaW5wdXQuYmF0Y2hlc30sXG4gICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgfSBhcyBhbnkpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQ6ICdvcmRpbmFyeSd9LCBjb2xvcjogWzEsIDIsIDNdfSkudXBkYXRlU2NoZW1hKFxuICAgICAgZmlsZS5kYXRhIGFzIGFueVxuICAgICk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSByb3VuZHRyaXAob3JpZ2luYWwpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWydhJ10sIFsnYiddXSk7XG4gICAgZXhwZWN0KGpvaW4ocmVzdG9yZWQsIHJpZ2h0KS5yZXN1bHQuZGF0YUNvbnRhaW5lci5mbGF0dGVuRGF0YSgpKS50b0VxdWFsKFtcbiAgICAgIFsnYScsIDEuMjUsICdhJ10sXG4gICAgICBbJ2InLCAyLjUsICdiJ11cbiAgICBdKTtcbiAgfSk7XG5cbiAgdGVzdCgncmVhZHMgZ2VvbWV0cnkgb25jZSBwZXIgZW1pdHRlZCBzb3VyY2Ugcm93IGFuZCBkb2VzIG5vdCByZXRhaW4gYSBzdGFsZSBjYWNoZSBhY3Jvc3Mgam9pbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVmdCA9IGF3YWl0IHNvdXJjZSgnbGVmdCcsICdQb2ludCcpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWydhJ10sIFsnYSddLCBbJ2EnXV0pO1xuICAgIGNvbnN0IHJlYWQgPSBqZXN0LnNweU9uKGxlZnQuZGF0YUNvbnRhaW5lciwgJ3ZhbHVlQXQnKTtcbiAgICBjb25zdCBmaXJzdCA9IGpvaW4obGVmdCwgcmlnaHQsIHt0eXBlOiAnSU5ORVInfSkucmVzdWx0O1xuICAgIGV4cGVjdChmaXJzdC5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgzKTtcbiAgICBleHBlY3QocmVhZC5tb2NrLmNhbGxzLmZpbHRlcigoWywgZmllbGRJbmRleF0pID0+IGZpZWxkSW5kZXggPT09IDEpKS50b0VxdWFsKFtbMCwgMV1dKTtcbiAgICByZWFkLm1vY2tSZXN0b3JlKCk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBhd2FpdCBzb3VyY2UoJ3JlcGxhY2VtZW50JywgJ1BvaW50JywgWydhJywgJ2InXSwgWzUwLCA2MF0pO1xuICAgIGxlZnQudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogcmVwbGFjZW1lbnQuZmllbGRzLFxuICAgICAgcm93czogW10sXG4gICAgICBjb2xzOiBbXG4gICAgICAgIChyZXBsYWNlbWVudC5kYXRhQ29udGFpbmVyIGFzIGFueSkuZ2V0Q29sdW1uKDApLFxuICAgICAgICAocmVwbGFjZW1lbnQuZGF0YUNvbnRhaW5lciBhcyBhbnkpLmdldENvbHVtbigxKVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IHNlY29uZCA9IGpvaW4obGVmdCwgcmlnaHQsIHt0eXBlOiAnSU5ORVInfSkucmVzdWx0O1xuICAgIGV4cGVjdChKU09OLnBhcnNlKHNlY29uZC5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMCwgMSkpKS50b0VxdWFsKHBvaW50KDUwKSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoZmlyc3QuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDAsIDEpKSkudG9FcXVhbChwb2ludCgxMCkpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsZUFBZSxRQUFPLG9CQUFvQjtBQUNsRCxTQUFRQyxXQUFXLFFBQU8sa0JBQWtCO0FBQzVDLFNBQ0VDLG1CQUFtQixFQUNuQkMsaUJBQWlCLEVBQ2pCQyxjQUFjLEVBQ2RDLGVBQWUsRUFDZkMsY0FBYyxFQUNkQyxtQkFBbUIsUUFDZCx1QkFBdUI7QUFDOUIsU0FBUUMsb0JBQW9CLFFBQU8saUJBQWlCO0FBQ3BELE9BQU8sS0FBS0MsS0FBSyxNQUFNLGNBQWM7QUFDckMsT0FBT0MsWUFBWSxNQUFNLDhDQUE4QztBQUN2RSxTQUFRQyxhQUFhLEVBQUVDLFFBQVEsUUFBTyxvQkFBb0I7QUFDMUQsU0FBUUMsMEJBQTBCLFFBQU8sZ0RBQWdEO0FBQ3pGLFNBQVFDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxlQUFlLFFBQU8sY0FBYztBQUUxRCxTQUFRQyxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxpQkFBaUIsUUFBTyxrQkFBa0I7QUFDdkYsT0FBT0MsYUFBYSxNQUFrQixvQkFBb0I7QUFDMUQsU0FBUUMsb0JBQW9CLEVBQUVDLHFCQUFxQixRQUFPLGtCQUFrQjtBQUM1RSxTQUFRQyxRQUFRLFFBQU8sWUFBWTtBQUVuQyxPQUFPQyxlQUFlLE1BQU0sYUFBYTtBQUN6QyxTQUFRQyxpQkFBaUIsUUFBTyxzQkFBc0I7QUFFdEQsSUFBTUMsY0FBYyxHQUFHRixlQUFpRTtBQUV4RixTQUFTRyxTQUFTQSxDQUFDQyxFQUFVLEVBQUVDLE1BQXNDLEVBQUVDLElBQWEsRUFBRTtFQUNwRixJQUFNQyxLQUFLLEdBQUcsSUFBSTlCLFdBQVcsQ0FBQztJQUM1QitCLElBQUksRUFBRTtNQUFDSixFQUFFLEVBQUZBLEVB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
|