@kepler.gl/reducers 3.3.0-alpha.15 → 3.3.0-alpha.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/column-edit-reconcile.js +100 -0
- package/dist/cjs/column-edit-updaters.spec.js +840 -0
- package/dist/cjs/combined-updaters.js +166 -8
- package/dist/cjs/composers.js +4 -5
- package/dist/cjs/dataset-ops-updaters.js +375 -0
- package/dist/cjs/dataset-ops-updaters.spec.js +382 -0
- package/dist/cjs/export-utils.js +118 -46
- package/dist/cjs/interaction-utils.js +166 -6
- package/dist/cjs/layer-utils.js +135 -9
- package/dist/cjs/ui-state-updaters.js +134 -51
- package/dist/cjs/ui-state.js +2 -2
- package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
- package/dist/cjs/vis-state-merger.js +99 -25
- package/dist/cjs/vis-state-selectors.js +5 -4
- package/dist/cjs/vis-state-updaters.js +1077 -256
- package/dist/cjs/vis-state.js +2 -2
- package/dist/column-edit-reconcile.d.ts +4 -0
- package/dist/column-edit-updaters.spec.d.ts +1 -0
- package/dist/combined-updaters.d.ts +21 -1
- package/dist/composers.d.ts +3 -0
- package/dist/dataset-ops-updaters.d.ts +21 -0
- package/dist/dataset-ops-updaters.spec.d.ts +1 -0
- package/dist/esm/column-edit-reconcile.js +95 -0
- package/dist/esm/column-edit-updaters.spec.js +839 -0
- package/dist/esm/combined-updaters.js +166 -8
- package/dist/esm/composers.js +3 -2
- package/dist/esm/dataset-ops-updaters.js +357 -0
- package/dist/esm/dataset-ops-updaters.spec.js +381 -0
- package/dist/esm/export-utils.js +117 -45
- package/dist/esm/interaction-utils.js +159 -3
- package/dist/esm/layer-utils.js +133 -9
- package/dist/esm/ui-state-updaters.js +133 -50
- package/dist/esm/ui-state.js +2 -2
- package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
- package/dist/esm/vis-state-merger.js +99 -26
- package/dist/esm/vis-state-selectors.js +5 -4
- package/dist/esm/vis-state-updaters.js +1020 -263
- package/dist/esm/vis-state.js +2 -2
- package/dist/export-utils.d.ts +2 -2
- package/dist/interaction-utils.d.ts +25 -2
- package/dist/layer-utils.d.ts +17 -0
- package/dist/ui-state-updaters.d.ts +30 -0
- package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
- package/dist/vis-state-merger.d.ts +10 -2
- package/dist/vis-state-updaters.d.ts +61 -15
- package/dist/vis-state.d.ts +20 -0
- package/package.json +17 -17
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
3
|
+
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; }
|
|
4
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
|
+
// SPDX-License-Identifier: MIT
|
|
6
|
+
// Copyright contributors to the kepler.gl project
|
|
7
|
+
|
|
8
|
+
import { generateHashId } from '@kepler.gl/common-utils';
|
|
9
|
+
import { defaultAggregationsForFields, defaultSuitabilityWeights, groupByDataset, isTabularDatasetForOps, joinDatasets, spatialJoinDatasets, suggestSpatialGeo, suitabilityDataset, DEFAULT_SUITABILITY_SCORE_FIELD } from '@kepler.gl/table';
|
|
10
|
+
function deactivateOps(ops) {
|
|
11
|
+
return ops.map(function (op) {
|
|
12
|
+
return _objectSpread(_objectSpread({}, op), {}, {
|
|
13
|
+
isConfigActive: false
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function randomTwoDigitSuffix() {
|
|
18
|
+
return String(Math.floor(Math.random() * 100)).padStart(2, '0');
|
|
19
|
+
}
|
|
20
|
+
function defaultGroupByLabel() {
|
|
21
|
+
return "group-by-".concat(randomTwoDigitSuffix());
|
|
22
|
+
}
|
|
23
|
+
function defaultJoinLabel() {
|
|
24
|
+
return "join-dataset-".concat(randomTwoDigitSuffix());
|
|
25
|
+
}
|
|
26
|
+
function defaultSpatialJoinLabel(resultId) {
|
|
27
|
+
return "spatial-join-".concat(resultId);
|
|
28
|
+
}
|
|
29
|
+
function defaultSuitabilityLabel() {
|
|
30
|
+
return "suitability-".concat(randomTwoDigitSuffix());
|
|
31
|
+
}
|
|
32
|
+
export function addGroupByUpdater(state, action) {
|
|
33
|
+
var dataset = state.datasets[action.dataId];
|
|
34
|
+
if (!isTabularDatasetForOps(dataset)) {
|
|
35
|
+
return state;
|
|
36
|
+
}
|
|
37
|
+
var id = generateHashId(6);
|
|
38
|
+
var resultId = generateHashId(6);
|
|
39
|
+
var op = {
|
|
40
|
+
id: id,
|
|
41
|
+
dataId: action.dataId,
|
|
42
|
+
fieldName: null,
|
|
43
|
+
aggregations: defaultAggregationsForFields(dataset.fields),
|
|
44
|
+
resultId: resultId,
|
|
45
|
+
resultLabel: defaultGroupByLabel(),
|
|
46
|
+
isConfigActive: true,
|
|
47
|
+
error: null
|
|
48
|
+
};
|
|
49
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
50
|
+
groupBys: [].concat(_toConsumableArray(deactivateOps(state.groupBys)), [op]),
|
|
51
|
+
joins: deactivateOps(state.joins),
|
|
52
|
+
suitabilities: deactivateOps(state.suitabilities)
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function setGroupByConfigUpdater(state, action) {
|
|
56
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
57
|
+
groupBys: state.groupBys.map(function (op) {
|
|
58
|
+
var _action$config$error;
|
|
59
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
60
|
+
error: (_action$config$error = action.config.error) !== null && _action$config$error !== void 0 ? _action$config$error : null
|
|
61
|
+
}) : op;
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export function executeGroupBy(state, action) {
|
|
66
|
+
var op = state.groupBys.find(function (item) {
|
|
67
|
+
return item.id === action.id;
|
|
68
|
+
});
|
|
69
|
+
var dataset = op ? state.datasets[op.dataId] : undefined;
|
|
70
|
+
if (!op || !dataset || !op.fieldName) {
|
|
71
|
+
return {
|
|
72
|
+
state: setGroupByConfigUpdater(state, {
|
|
73
|
+
id: action.id,
|
|
74
|
+
config: {
|
|
75
|
+
error: 'Select a grouping field'
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
var proto = groupByDataset(dataset, {
|
|
82
|
+
fieldName: op.fieldName,
|
|
83
|
+
aggregations: op.aggregations,
|
|
84
|
+
label: op.resultLabel,
|
|
85
|
+
resultId: op.resultId,
|
|
86
|
+
operationId: op.id
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
90
|
+
groupBys: state.groupBys.filter(function (item) {
|
|
91
|
+
return item.id !== op.id;
|
|
92
|
+
})
|
|
93
|
+
}),
|
|
94
|
+
proto: proto
|
|
95
|
+
};
|
|
96
|
+
} catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
state: setGroupByConfigUpdater(state, {
|
|
99
|
+
id: action.id,
|
|
100
|
+
config: {
|
|
101
|
+
error: error instanceof Error ? error.message : String(error)
|
|
102
|
+
}
|
|
103
|
+
})
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function addJoinUpdater(state, action) {
|
|
108
|
+
var dataset = state.datasets[action.dataId];
|
|
109
|
+
if (!isTabularDatasetForOps(dataset)) {
|
|
110
|
+
return state;
|
|
111
|
+
}
|
|
112
|
+
var implementation = action.implementation || 'simple';
|
|
113
|
+
var id = generateHashId(6);
|
|
114
|
+
var resultId = generateHashId(6);
|
|
115
|
+
var op = {
|
|
116
|
+
id: id,
|
|
117
|
+
implementation: implementation,
|
|
118
|
+
leftDataId: action.dataId,
|
|
119
|
+
rightDataId: null,
|
|
120
|
+
leftField: null,
|
|
121
|
+
rightField: null,
|
|
122
|
+
type: 'LEFT',
|
|
123
|
+
aggregations: {},
|
|
124
|
+
leftGeo: implementation === 'spatial' ? suggestSpatialGeo(dataset.fields) : null,
|
|
125
|
+
rightGeo: null,
|
|
126
|
+
predicate: implementation === 'spatial' ? 'intersects' : undefined,
|
|
127
|
+
resultId: resultId,
|
|
128
|
+
resultLabel: implementation === 'spatial' ? defaultSpatialJoinLabel(resultId) : defaultJoinLabel(),
|
|
129
|
+
isConfigActive: true,
|
|
130
|
+
error: null
|
|
131
|
+
};
|
|
132
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
133
|
+
joins: [].concat(_toConsumableArray(deactivateOps(state.joins)), [op]),
|
|
134
|
+
groupBys: deactivateOps(state.groupBys),
|
|
135
|
+
suitabilities: deactivateOps(state.suitabilities)
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export function setJoinConfigUpdater(state, action) {
|
|
139
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
140
|
+
joins: state.joins.map(function (op) {
|
|
141
|
+
var _action$config$error2;
|
|
142
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
143
|
+
error: (_action$config$error2 = action.config.error) !== null && _action$config$error2 !== void 0 ? _action$config$error2 : null
|
|
144
|
+
}) : op;
|
|
145
|
+
})
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
export function executeJoin(state, action) {
|
|
149
|
+
var op = state.joins.find(function (item) {
|
|
150
|
+
return item.id === action.id && item.implementation !== 'spatial';
|
|
151
|
+
});
|
|
152
|
+
var left = op ? state.datasets[op.leftDataId] : undefined;
|
|
153
|
+
var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
|
|
154
|
+
if (!op || !left || !right || !op.leftField || !op.rightField) {
|
|
155
|
+
return {
|
|
156
|
+
state: setJoinConfigUpdater(state, {
|
|
157
|
+
id: action.id,
|
|
158
|
+
config: {
|
|
159
|
+
error: 'Select datasets and join keys'
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
var proto = joinDatasets(left, right, {
|
|
166
|
+
leftField: op.leftField,
|
|
167
|
+
rightField: op.rightField,
|
|
168
|
+
type: op.type,
|
|
169
|
+
leftColumns: op.leftColumns,
|
|
170
|
+
rightColumns: op.rightColumns,
|
|
171
|
+
label: op.resultLabel,
|
|
172
|
+
resultId: op.resultId,
|
|
173
|
+
operationId: op.id
|
|
174
|
+
});
|
|
175
|
+
return {
|
|
176
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
177
|
+
joins: state.joins.filter(function (item) {
|
|
178
|
+
return item.id !== op.id;
|
|
179
|
+
})
|
|
180
|
+
}),
|
|
181
|
+
proto: proto
|
|
182
|
+
};
|
|
183
|
+
} catch (error) {
|
|
184
|
+
return {
|
|
185
|
+
state: setJoinConfigUpdater(state, {
|
|
186
|
+
id: action.id,
|
|
187
|
+
config: {
|
|
188
|
+
error: error instanceof Error ? error.message : String(error)
|
|
189
|
+
}
|
|
190
|
+
})
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export function addSpatialJoinUpdater(state, action) {
|
|
195
|
+
return addJoinUpdater(state, {
|
|
196
|
+
dataId: action.dataId,
|
|
197
|
+
implementation: 'spatial'
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
export function setSpatialJoinConfigUpdater(state, action) {
|
|
201
|
+
return setJoinConfigUpdater(state, action);
|
|
202
|
+
}
|
|
203
|
+
export function executeSpatialJoin(state, action) {
|
|
204
|
+
var op = state.joins.find(function (item) {
|
|
205
|
+
return item.id === action.id && item.implementation === 'spatial';
|
|
206
|
+
});
|
|
207
|
+
var left = op ? state.datasets[op.leftDataId] : undefined;
|
|
208
|
+
var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
|
|
209
|
+
if (!op || !left || !right || !op.leftGeo || !op.rightGeo) {
|
|
210
|
+
return {
|
|
211
|
+
state: setJoinConfigUpdater(state, {
|
|
212
|
+
id: action.id,
|
|
213
|
+
config: {
|
|
214
|
+
error: 'Select datasets and geometry fields'
|
|
215
|
+
}
|
|
216
|
+
})
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
var proto = spatialJoinDatasets(left, right, {
|
|
221
|
+
leftGeo: op.leftGeo,
|
|
222
|
+
rightGeo: op.rightGeo,
|
|
223
|
+
aggregations: op.aggregations,
|
|
224
|
+
leftColumns: op.leftColumns,
|
|
225
|
+
predicate: op.predicate || 'intersects',
|
|
226
|
+
label: op.resultLabel,
|
|
227
|
+
resultId: op.resultId,
|
|
228
|
+
operationId: op.id
|
|
229
|
+
});
|
|
230
|
+
return {
|
|
231
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
232
|
+
joins: state.joins.filter(function (item) {
|
|
233
|
+
return item.id !== op.id;
|
|
234
|
+
})
|
|
235
|
+
}),
|
|
236
|
+
proto: proto
|
|
237
|
+
};
|
|
238
|
+
} catch (error) {
|
|
239
|
+
return {
|
|
240
|
+
state: setJoinConfigUpdater(state, {
|
|
241
|
+
id: action.id,
|
|
242
|
+
config: {
|
|
243
|
+
error: error instanceof Error ? error.message : String(error)
|
|
244
|
+
}
|
|
245
|
+
})
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
export function addSuitabilityUpdater(state, action) {
|
|
250
|
+
var dataset = state.datasets[action.dataId];
|
|
251
|
+
if (!isTabularDatasetForOps(dataset)) {
|
|
252
|
+
return state;
|
|
253
|
+
}
|
|
254
|
+
var op = {
|
|
255
|
+
id: generateHashId(6),
|
|
256
|
+
dataId: action.dataId,
|
|
257
|
+
weights: defaultSuitabilityWeights(dataset.fields),
|
|
258
|
+
weightStandardization: 'normalize',
|
|
259
|
+
dataStandardization: 'range',
|
|
260
|
+
outputFieldName: DEFAULT_SUITABILITY_SCORE_FIELD,
|
|
261
|
+
resultId: generateHashId(6),
|
|
262
|
+
resultLabel: defaultSuitabilityLabel(),
|
|
263
|
+
isConfigActive: true,
|
|
264
|
+
error: null
|
|
265
|
+
};
|
|
266
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
267
|
+
suitabilities: [].concat(_toConsumableArray(deactivateOps(state.suitabilities)), [op]),
|
|
268
|
+
groupBys: deactivateOps(state.groupBys),
|
|
269
|
+
joins: deactivateOps(state.joins)
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
export function setSuitabilityConfigUpdater(state, action) {
|
|
273
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
274
|
+
suitabilities: state.suitabilities.map(function (op) {
|
|
275
|
+
var _action$config$error3;
|
|
276
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
277
|
+
error: (_action$config$error3 = action.config.error) !== null && _action$config$error3 !== void 0 ? _action$config$error3 : null
|
|
278
|
+
}) : op;
|
|
279
|
+
})
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
export function executeSuitability(state, action) {
|
|
283
|
+
var op = state.suitabilities.find(function (item) {
|
|
284
|
+
return item.id === action.id;
|
|
285
|
+
});
|
|
286
|
+
var dataset = op ? state.datasets[op.dataId] : undefined;
|
|
287
|
+
if (!op || !dataset || !Object.keys(op.weights).length) {
|
|
288
|
+
return {
|
|
289
|
+
state: setSuitabilityConfigUpdater(state, {
|
|
290
|
+
id: action.id,
|
|
291
|
+
config: {
|
|
292
|
+
error: 'Select at least one field to score'
|
|
293
|
+
}
|
|
294
|
+
})
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
var proto = suitabilityDataset(dataset, {
|
|
299
|
+
weights: op.weights,
|
|
300
|
+
weightStandardization: op.weightStandardization,
|
|
301
|
+
dataStandardization: op.dataStandardization,
|
|
302
|
+
outputFieldName: op.outputFieldName,
|
|
303
|
+
columns: op.columns,
|
|
304
|
+
label: op.resultLabel,
|
|
305
|
+
resultId: op.resultId,
|
|
306
|
+
operationId: op.id
|
|
307
|
+
});
|
|
308
|
+
return {
|
|
309
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
310
|
+
suitabilities: state.suitabilities.map(function (item) {
|
|
311
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
312
|
+
isConfigActive: false,
|
|
313
|
+
error: null
|
|
314
|
+
}) : item;
|
|
315
|
+
})
|
|
316
|
+
}),
|
|
317
|
+
proto: proto
|
|
318
|
+
};
|
|
319
|
+
} catch (error) {
|
|
320
|
+
return {
|
|
321
|
+
state: setSuitabilityConfigUpdater(state, {
|
|
322
|
+
id: action.id,
|
|
323
|
+
config: {
|
|
324
|
+
error: error instanceof Error ? error.message : String(error)
|
|
325
|
+
}
|
|
326
|
+
})
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
export function removeDatasetOpUpdater(state, action) {
|
|
331
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
332
|
+
groupBys: state.groupBys.filter(function (op) {
|
|
333
|
+
return op.id !== action.id;
|
|
334
|
+
}),
|
|
335
|
+
joins: state.joins.filter(function (op) {
|
|
336
|
+
return op.id !== action.id;
|
|
337
|
+
}),
|
|
338
|
+
suitabilities: state.suitabilities.filter(function (op) {
|
|
339
|
+
return op.id !== action.id;
|
|
340
|
+
})
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
export function removeOpsForDatasets(state, dataIds) {
|
|
344
|
+
var ids = new Set(dataIds);
|
|
345
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
346
|
+
groupBys: state.groupBys.filter(function (op) {
|
|
347
|
+
return !ids.has(op.dataId) && !ids.has(op.resultId);
|
|
348
|
+
}),
|
|
349
|
+
joins: state.joins.filter(function (op) {
|
|
350
|
+
return !ids.has(op.leftDataId) && !(op.rightDataId && ids.has(op.rightDataId)) && !ids.has(op.resultId);
|
|
351
|
+
}),
|
|
352
|
+
suitabilities: state.suitabilities.filter(function (op) {
|
|
353
|
+
return !ids.has(op.dataId) && !ids.has(op.resultId);
|
|
354
|
+
})
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZW5lcmF0ZUhhc2hJZCIsImRlZmF1bHRBZ2dyZWdhdGlvbnNGb3JGaWVsZHMiLCJkZWZhdWx0U3VpdGFiaWxpdHlXZWlnaHRzIiwiZ3JvdXBCeURhdGFzZXQiLCJpc1RhYnVsYXJEYXRhc2V0Rm9yT3BzIiwiam9pbkRhdGFzZXRzIiwic3BhdGlhbEpvaW5EYXRhc2V0cyIsInN1Z2dlc3RTcGF0aWFsR2VvIiwic3VpdGFiaWxpdHlEYXRhc2V0IiwiREVGQVVMVF9TVUlUQUJJTElUWV9TQ09SRV9GSUVMRCIsImRlYWN0aXZhdGVPcHMiLCJvcHMiLCJtYXAiLCJvcCIsIl9vYmplY3RTcHJlYWQiLCJpc0NvbmZpZ0FjdGl2ZSIsInJhbmRvbVR3b0RpZ2l0U3VmZml4IiwiU3RyaW5nIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwicGFkU3RhcnQiLCJkZWZhdWx0R3JvdXBCeUxhYmVsIiwiY29uY2F0IiwiZGVmYXVsdEpvaW5MYWJlbCIsImRlZmF1bHRTcGF0aWFsSm9pbkxhYmVsIiwicmVzdWx0SWQiLCJkZWZhdWx0U3VpdGFiaWxpdHlMYWJlbCIsImFkZEdyb3VwQnlVcGRhdGVyIiwic3RhdGUiLCJhY3Rpb24iLCJkYXRhc2V0IiwiZGF0YXNldHMiLCJkYXRhSWQiLCJpZCIsImZpZWxkTmFtZSIsImFnZ3JlZ2F0aW9ucyIsImZpZWxkcyIsInJlc3VsdExhYmVsIiwiZXJyb3IiLCJncm91cEJ5cyIsIl90b0NvbnN1bWFibGVBcnJheSIsImpvaW5zIiwic3VpdGFiaWxpdGllcyIsInNldEdyb3VwQnlDb25maWdVcGRhdGVyIiwiX2FjdGlvbiRjb25maWckZXJyb3IiLCJjb25maWciLCJleGVjdXRlR3JvdXBCeSIsImZpbmQiLCJpdGVtIiwidW5kZWZpbmVkIiwicHJvdG8iLCJsYWJlbCIsIm9wZXJhdGlvbklkIiwiZmlsdGVyIiwiRXJyb3IiLCJtZXNzYWdlIiwiYWRkSm9pblVwZGF0ZXIiLCJpbXBsZW1lbnRhdGlvbiIsImxlZnREYXRhSWQiLCJyaWdodERhdGFJZCIsImxlZnRGaWVsZCIsInJpZ2h0RmllbGQiLCJ0eXBlIiwibGVmdEdlbyIsInJpZ2h0R2VvIiwicHJlZGljYXRlIiwic2V0Sm9pbkNvbmZpZ1VwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyRlcnJvcjIiLCJleGVjdXRlSm9pbiIsImxlZnQiLCJyaWdodCIsImxlZnRDb2x1bW5zIiwicmlnaHRDb2x1bW5zIiwiYWRkU3BhdGlhbEpvaW5VcGRhdGVyIiwic2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyIiwiZXhlY3V0ZVNwYXRpYWxKb2luIiwiYWRkU3VpdGFiaWxpdHlVcGRhdGVyIiwid2VpZ2h0cyIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJzZXRTdWl0YWJpbGl0eUNvbmZpZ1VwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyRlcnJvcjMiLCJleGVjdXRlU3VpdGFiaWxpdHkiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiY29sdW1ucyIsInJlbW92ZURhdGFzZXRPcFVwZGF0ZXIiLCJyZW1vdmVPcHNGb3JEYXRhc2V0cyIsImRhdGFJZHMiLCJpZHMiLCJTZXQiLCJoYXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdEFnZ3JlZ2F0aW9uc0ZvckZpZWxkcyxcbiAgZGVmYXVsdFN1aXRhYmlsaXR5V2VpZ2h0cyxcbiAgZ3JvdXBCeURhdGFzZXQsXG4gIGlzVGFidWxhckRhdGFzZXRGb3JPcHMsXG4gIGpvaW5EYXRhc2V0cyxcbiAgc3BhdGlhbEpvaW5EYXRhc2V0cyxcbiAgc3VnZ2VzdFNwYXRpYWxHZW8sXG4gIHN1aXRhYmlsaXR5RGF0YXNldCxcbiAgREVGQVVMVF9TVUlUQUJJTElUWV9TQ09SRV9GSUVMRCxcbiAgR3JvdXBCeU9wLFxuICBKb2luT3AsXG4gIFN1aXRhYmlsaXR5T3Bcbn0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge1Byb3RvRGF0YXNldH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1Zpc1N0YXRlQWN0aW9uc30gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5cbmV4cG9ydCB0eXBlIERlcml2ZWREYXRhc2V0T3BSZXN1bHQgPSB7XG4gIHN0YXRlOiBWaXNTdGF0ZTtcbiAgcHJvdG8/OiBQcm90b0RhdGFzZXQ7XG59O1xuXG5mdW5jdGlvbiBkZWFjdGl2YXRlT3BzPFQgZXh0ZW5kcyB7aXNDb25maWdBY3RpdmU/OiBib29sZWFufT4ob3BzOiBUW10pOiBUW10ge1xuICByZXR1cm4gb3BzLm1hcChvcCA9PiAoey4uLm9wLCBpc0NvbmZpZ0FjdGl2ZTogZmFsc2V9KSk7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbVR3b0RpZ2l0U3VmZml4KCk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKSkucGFkU3RhcnQoMiwgJzAnKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEdyb3VwQnlMYWJlbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYGdyb3VwLWJ5LSR7cmFuZG9tVHdvRGlnaXRTdWZmaXgoKX1gO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Sm9pbkxhYmVsKCk6IHN0cmluZyB7XG4gIHJldHVybiBgam9pbi1kYXRhc2V0LSR7cmFuZG9tVHdvRGlnaXRTdWZmaXgoKX1gO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U3BhdGlhbEpvaW5MYWJlbChyZXN1bHRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBzcGF0aWFsLWpvaW4tJHtyZXN1bHRJZH1gO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U3VpdGFiaWxpdHlMYWJlbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYHN1aXRhYmlsaXR5LSR7cmFuZG9tVHdvRGlnaXRTdWZmaXgoKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkR3JvdXBCeVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkR3JvdXBCeVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2FjdGlvbi5kYXRhSWRdO1xuICBpZiAoIWlzVGFidWxhckRhdGFzZXRGb3JPcHMoZGF0YXNldCkpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgaWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3QgcmVzdWx0SWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3Qgb3A6IEdyb3VwQnlPcCA9IHtcbiAgICBpZCxcbiAgICBkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsXG4gICAgZmllbGROYW1lOiBudWxsLFxuICAgIGFnZ3JlZ2F0aW9uczogZGVmYXVsdEFnZ3JlZ2F0aW9uc0ZvckZpZWxkcyhkYXRhc2V0LmZpZWxkcyksXG4gICAgcmVzdWx0SWQsXG4gICAgcmVzdWx0TGFiZWw6IGRlZmF1bHRHcm91cEJ5TGFiZWwoKSxcbiAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZSxcbiAgICBlcnJvcjogbnVsbFxuICB9O1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGdyb3VwQnlzOiBbLi4uZGVhY3RpdmF0ZU9wcyhzdGF0ZS5ncm91cEJ5cyksIG9wXSxcbiAgICBqb2luczogZGVhY3RpdmF0ZU9wcyhzdGF0ZS5qb2lucyksXG4gICAgc3VpdGFiaWxpdGllczogZGVhY3RpdmF0ZU9wcyhzdGF0ZS5zdWl0YWJpbGl0aWVzKVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogc3RhdGUuZ3JvdXBCeXMubWFwKG9wID0+XG4gICAgICBvcC5pZCA9PT0gYWN0aW9uLmlkID8gey4uLm9wLCAuLi5hY3Rpb24uY29uZmlnLCBlcnJvcjogYWN0aW9uLmNvbmZpZy5lcnJvciA/PyBudWxsfSA6IG9wXG4gICAgKVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUdyb3VwQnkoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUnVuR3JvdXBCeVVwZGF0ZXJBY3Rpb25cbik6IERlcml2ZWREYXRhc2V0T3BSZXN1bHQge1xuICBjb25zdCBvcCA9IHN0YXRlLmdyb3VwQnlzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBhY3Rpb24uaWQpO1xuICBjb25zdCBkYXRhc2V0ID0gb3AgPyBzdGF0ZS5kYXRhc2V0c1tvcC5kYXRhSWRdIDogdW5kZWZpbmVkO1xuICBpZiAoIW9wIHx8ICFkYXRhc2V0IHx8ICFvcC5maWVsZE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEdyb3VwQnlDb25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGEgZ3JvdXBpbmcgZmllbGQnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IGdyb3VwQnlEYXRhc2V0KGRhdGFzZXQsIHtcbiAgICAgIGZpZWxkTmFtZTogb3AuZmllbGROYW1lLFxuICAgICAgYWdncmVnYXRpb25zOiBvcC5hZ2dyZWdhdGlvbnMsXG4gICAgICBsYWJlbDogb3AucmVzdWx0TGFiZWwsXG4gICAgICByZXN1bHRJZDogb3AucmVzdWx0SWQsXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGdyb3VwQnlzOiBzdGF0ZS5ncm91cEJ5cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBvcC5pZClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRKb2luVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbYWN0aW9uLmRhdGFJZF07XG4gIGlmICghaXNUYWJ1bGFyRGF0YXNldEZvck9wcyhkYXRhc2V0KSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IGFjdGlvbi5pbXBsZW1lbnRhdGlvbiB8fCAnc2ltcGxlJztcbiAgY29uc3QgaWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3QgcmVzdWx0SWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3Qgb3A6IEpvaW5PcCA9IHtcbiAgICBpZCxcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBsZWZ0RGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIHJpZ2h0RGF0YUlkOiBudWxsLFxuICAgIGxlZnRGaWVsZDogbnVsbCxcbiAgICByaWdodEZpZWxkOiBudWxsLFxuICAgIHR5cGU6ICdMRUZUJyxcbiAgICBhZ2dyZWdhdGlvbnM6IHt9LFxuICAgIGxlZnRHZW86IGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBzdWdnZXN0U3BhdGlhbEdlbyhkYXRhc2V0LmZpZWxkcykgOiBudWxsLFxuICAgIHJpZ2h0R2VvOiBudWxsLFxuICAgIHByZWRpY2F0ZTogaW1wbGVtZW50YXRpb24gPT09ICdzcGF0aWFsJyA/ICdpbnRlcnNlY3RzJyA6IHVuZGVmaW5lZCxcbiAgICByZXN1bHRJZCxcbiAgICByZXN1bHRMYWJlbDpcbiAgICAgIGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBkZWZhdWx0U3BhdGlhbEpvaW5MYWJlbChyZXN1bHRJZCkgOiBkZWZhdWx0Sm9pbkxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBqb2luczogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpLCBvcF0sXG4gICAgZ3JvdXBCeXM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpLFxuICAgIHN1aXRhYmlsaXRpZXM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuc3VpdGFiaWxpdGllcylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEpvaW5Db25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEpvaW5Db25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgam9pbnM6IHN0YXRlLmpvaW5zLm1hcChvcCA9PlxuICAgICAgb3AuaWQgPT09IGFjdGlvbi5pZCA/IHsuLi5vcCwgLi4uYWN0aW9uLmNvbmZpZywgZXJyb3I6IGFjdGlvbi5jb25maWcuZXJyb3IgPz8gbnVsbH0gOiBvcFxuICAgIClcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVKb2luKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJ1bkpvaW5VcGRhdGVyQWN0aW9uXG4pOiBEZXJpdmVkRGF0YXNldE9wUmVzdWx0IHtcbiAgY29uc3Qgb3AgPSBzdGF0ZS5qb2lucy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gYWN0aW9uLmlkICYmIGl0ZW0uaW1wbGVtZW50YXRpb24gIT09ICdzcGF0aWFsJyk7XG4gIGNvbnN0IGxlZnQgPSBvcCA/IHN0YXRlLmRhdGFzZXRzW29wLmxlZnREYXRhSWRdIDogdW5kZWZpbmVkO1xuICBjb25zdCByaWdodCA9IG9wPy5yaWdodERhdGFJZCA/IHN0YXRlLmRhdGFzZXRzW29wLnJpZ2h0RGF0YUlkXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvcCB8fCAhbGVmdCB8fCAhcmlnaHQgfHwgIW9wLmxlZnRGaWVsZCB8fCAhb3AucmlnaHRGaWVsZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogc2V0Sm9pbkNvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgaWQ6IGFjdGlvbi5pZCxcbiAgICAgICAgY29uZmlnOiB7ZXJyb3I6ICdTZWxlY3QgZGF0YXNldHMgYW5kIGpvaW4ga2V5cyd9XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHByb3RvID0gam9pbkRhdGFzZXRzKGxlZnQsIHJpZ2h0LCB7XG4gICAgICBsZWZ0RmllbGQ6IG9wLmxlZnRGaWVsZCxcbiAgICAgIHJpZ2h0RmllbGQ6IG9wLnJpZ2h0RmllbGQsXG4gICAgICB0eXBlOiBvcC50eXBlLFxuICAgICAgbGVmdENvbHVtbnM6IG9wLmxlZnRDb2x1bW5zLFxuICAgICAgcmlnaHRDb2x1bW5zOiBvcC5yaWdodENvbHVtbnMsXG4gICAgICBsYWJlbDogb3AucmVzdWx0TGFiZWwsXG4gICAgICByZXN1bHRJZDogb3AucmVzdWx0SWQsXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBvcC5pZClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTcGF0aWFsSm9pblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkU3BhdGlhbEpvaW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiBhZGRKb2luVXBkYXRlcihzdGF0ZSwge2RhdGFJZDogYWN0aW9uLmRhdGFJZCwgaW1wbGVtZW50YXRpb246ICdzcGF0aWFsJ30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldFNwYXRpYWxKb2luQ29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4gc2V0Sm9pbkNvbmZpZ1VwZGF0ZXIoc3RhdGUsIGFjdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlU3BhdGlhbEpvaW4oXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUnVuU3BhdGlhbEpvaW5VcGRhdGVyQWN0aW9uXG4pOiBEZXJpdmVkRGF0YXNldE9wUmVzdWx0IHtcbiAgY29uc3Qgb3AgPSBzdGF0ZS5qb2lucy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gYWN0aW9uLmlkICYmIGl0ZW0uaW1wbGVtZW50YXRpb24gPT09ICdzcGF0aWFsJyk7XG4gIGNvbnN0IGxlZnQgPSBvcCA/IHN0YXRlLmRhdGFzZXRzW29wLmxlZnREYXRhSWRdIDogdW5kZWZpbmVkO1xuICBjb25zdCByaWdodCA9IG9wPy5yaWdodERhdGFJZCA/IHN0YXRlLmRhdGFzZXRzW29wLnJpZ2h0RGF0YUlkXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvcCB8fCAhbGVmdCB8fCAhcmlnaHQgfHwgIW9wLmxlZnRHZW8gfHwgIW9wLnJpZ2h0R2VvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogJ1NlbGVjdCBkYXRhc2V0cyBhbmQgZ2VvbWV0cnkgZmllbGRzJ31cbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG8gPSBzcGF0aWFsSm9pbkRhdGFzZXRzKGxlZnQsIHJpZ2h0LCB7XG4gICAgICBsZWZ0R2VvOiBvcC5sZWZ0R2VvLFxuICAgICAgcmlnaHRHZW86IG9wLnJpZ2h0R2VvLFxuICAgICAgYWdncmVnYXRpb25zOiBvcC5hZ2dyZWdhdGlvbnMsXG4gICAgICBsZWZ0Q29sdW1uczogb3AubGVmdENvbHVtbnMsXG4gICAgICBwcmVkaWNhdGU6IG9wLnByZWRpY2F0ZSB8fCAnaW50ZXJzZWN0cycsXG4gICAgICBsYWJlbDogb3AucmVzdWx0TGFiZWwsXG4gICAgICByZXN1bHRJZDogb3AucmVzdWx0SWQsXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBvcC5pZClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdWl0YWJpbGl0eVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkU3VpdGFiaWxpdHlVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1thY3Rpb24uZGF0YUlkXTtcbiAgaWYgKCFpc1RhYnVsYXJEYXRhc2V0Rm9yT3BzKGRhdGFzZXQpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IG9wOiBTdWl0YWJpbGl0eU9wID0ge1xuICAgIGlkOiBnZW5lcmF0ZUhhc2hJZCg2KSxcbiAgICBkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsXG4gICAgd2VpZ2h0czogZGVmYXVsdFN1aXRhYmlsaXR5V2VpZ2h0cyhkYXRhc2V0LmZpZWxkcyksXG4gICAgd2VpZ2h0U3RhbmRhcmRpemF0aW9uOiAnbm9ybWFsaXplJyxcbiAgICBkYXRhU3RhbmRhcmRpemF0aW9uOiAncmFuZ2UnLFxuICAgIG91dHB1dEZpZWxkTmFtZTogREVGQVVMVF9TVUlUQUJJTElUWV9TQ09SRV9GSUVMRCxcbiAgICByZXN1bHRJZDogZ2VuZXJhdGVIYXNoSWQoNiksXG4gICAgcmVzdWx0TGFiZWw6IGRlZmF1bHRTdWl0YWJpbGl0eUxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzdWl0YWJpbGl0aWVzOiBbLi4uZGVhY3RpdmF0ZU9wcyhzdGF0ZS5zdWl0YWJpbGl0aWVzKSwgb3BdLFxuICAgIGdyb3VwQnlzOiBkZWFjdGl2YXRlT3BzKHN0YXRlLmdyb3VwQnlzKSxcbiAgICBqb2luczogZGVhY3RpdmF0ZU9wcyhzdGF0ZS5qb2lucylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFN1aXRhYmlsaXR5Q29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRTdWl0YWJpbGl0eUNvbmZpZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzdWl0YWJpbGl0aWVzOiBzdGF0ZS5zdWl0YWJpbGl0aWVzLm1hcChvcCA9PlxuICAgICAgb3AuaWQgPT09IGFjdGlvbi5pZCA/IHsuLi5vcCwgLi4uYWN0aW9uLmNvbmZpZywgZXJyb3I6IGFjdGlvbi5jb25maWcuZXJyb3IgPz8gbnVsbH0gOiBvcFxuICAgIClcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVTdWl0YWJpbGl0eShcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5TdWl0YWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IERlcml2ZWREYXRhc2V0T3BSZXN1bHQge1xuICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCk7XG4gIGNvbnN0IGRhdGFzZXQgPSBvcCA/IHN0YXRlLmRhdGFzZXRzW29wLmRhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWRhdGFzZXQgfHwgIU9iamVjdC5rZXlzKG9wLndlaWdodHMpLmxlbmd0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogc2V0U3VpdGFiaWxpdHlDb25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBzY29yZSd9XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHByb3RvID0gc3VpdGFiaWxpdHlEYXRhc2V0KGRhdGFzZXQsIHtcbiAgICAgIHdlaWdodHM6IG9wLndlaWdodHMsXG4gICAgICB3ZWlnaHRTdGFuZGFyZGl6YXRpb246IG9wLndlaWdodFN0YW5kYXJkaXphdGlvbixcbiAgICAgIGRhdGFTdGFuZGFyZGl6YXRpb246IG9wLmRhdGFTdGFuZGFyZGl6YXRpb24sXG4gICAgICBvdXRwdXRGaWVsZE5hbWU6IG9wLm91dHB1dEZpZWxkTmFtZSxcbiAgICAgIGNvbHVtbnM6IG9wLmNvbHVtbnMsXG4gICAgICBsYWJlbDogb3AucmVzdWx0TGFiZWwsXG4gICAgICByZXN1bHRJZDogb3AucmVzdWx0SWQsXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHN1aXRhYmlsaXRpZXM6IHN0YXRlLnN1aXRhYmlsaXRpZXMubWFwKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBvcC5pZCA/IHsuLi5pdGVtLCBpc0NvbmZpZ0FjdGl2ZTogZmFsc2UsIGVycm9yOiBudWxsfSA6IGl0ZW1cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHByb3RvXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldFN1aXRhYmlsaXR5Q29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0T3BVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZURhdGFzZXRPcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogc3RhdGUuZ3JvdXBCeXMuZmlsdGVyKG9wID0+IG9wLmlkICE9PSBhY3Rpb24uaWQpLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5maWx0ZXIob3AgPT4gb3AuaWQgIT09IGFjdGlvbi5pZCksXG4gICAgc3VpdGFiaWxpdGllczogc3RhdGUuc3VpdGFiaWxpdGllcy5maWx0ZXIob3AgPT4gb3AuaWQgIT09IGFjdGlvbi5pZClcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9wc0ZvckRhdGFzZXRzKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkczogc3RyaW5nW10pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoZGF0YUlkcyk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLmZpbHRlcihvcCA9PiAhaWRzLmhhcyhvcC5kYXRhSWQpICYmICFpZHMuaGFzKG9wLnJlc3VsdElkKSksXG4gICAgam9pbnM6IHN0YXRlLmpvaW5zLmZpbHRlcihcbiAgICAgIG9wID0+XG4gICAgICAgICFpZHMuaGFzKG9wLmxlZnREYXRhSWQpICYmXG4gICAgICAgICEob3AucmlnaHREYXRhSWQgJiYgaWRzLmhhcyhvcC5yaWdodERhdGFJZCkpICYmXG4gICAgICAgICFpZHMuaGFzKG9wLnJlc3VsdElkKVxuICAgICksXG4gICAgc3VpdGFiaWxpdGllczogc3RhdGUuc3VpdGFiaWxpdGllcy5maWx0ZXIob3AgPT4gIWlkcy5oYXMob3AuZGF0YUlkKSAmJiAhaWRzLmhhcyhvcC5yZXN1bHRJZCkpXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGNBQWMsUUFBTyx5QkFBeUI7QUFDdEQsU0FDRUMsNEJBQTRCLEVBQzVCQyx5QkFBeUIsRUFDekJDLGNBQWMsRUFDZEMsc0JBQXNCLEVBQ3RCQyxZQUFZLEVBQ1pDLG1CQUFtQixFQUNuQkMsaUJBQWlCLEVBQ2pCQyxrQkFBa0IsRUFDbEJDLCtCQUErQixRQUkxQixrQkFBa0I7QUFVekIsU0FBU0MsYUFBYUEsQ0FBdUNDLEdBQVEsRUFBTztFQUMxRSxPQUFPQSxHQUFHLENBQUNDLEdBQUcsQ0FBQyxVQUFBQyxFQUFFO0lBQUEsT0FBQUMsYUFBQSxDQUFBQSxhQUFBLEtBQVNELEVBQUU7TUFBRUUsY0FBYyxFQUFFO0lBQUs7RUFBQSxDQUFFLENBQUM7QUFDeEQ7QUFFQSxTQUFTQyxvQkFBb0JBLENBQUEsRUFBVztFQUN0QyxPQUFPQyxNQUFNLENBQUNDLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7QUFDakU7QUFFQSxTQUFTQyxtQkFBbUJBLENBQUEsRUFBVztFQUNyQyxtQkFBQUMsTUFBQSxDQUFtQlAsb0JBQW9CLENBQUMsQ0FBQztBQUMzQztBQUVBLFNBQVNRLGdCQUFnQkEsQ0FBQSxFQUFXO0VBQ2xDLHVCQUFBRCxNQUFBLENBQXVCUCxvQkFBb0IsQ0FBQyxDQUFDO0FBQy9DO0FBRUEsU0FBU1MsdUJBQXVCQSxDQUFDQyxRQUFnQixFQUFVO0VBQ3pELHVCQUFBSCxNQUFBLENBQXVCRyxRQUFR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
|