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