@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.
Files changed (47) hide show
  1. package/dist/cjs/column-edit-reconcile.js +100 -0
  2. package/dist/cjs/column-edit-updaters.spec.js +840 -0
  3. package/dist/cjs/combined-updaters.js +166 -8
  4. package/dist/cjs/composers.js +4 -5
  5. package/dist/cjs/dataset-ops-updaters.js +375 -0
  6. package/dist/cjs/dataset-ops-updaters.spec.js +382 -0
  7. package/dist/cjs/export-utils.js +118 -46
  8. package/dist/cjs/interaction-utils.js +166 -6
  9. package/dist/cjs/layer-utils.js +135 -9
  10. package/dist/cjs/ui-state-updaters.js +134 -51
  11. package/dist/cjs/ui-state.js +2 -2
  12. package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
  13. package/dist/cjs/vis-state-merger.js +99 -25
  14. package/dist/cjs/vis-state-selectors.js +5 -4
  15. package/dist/cjs/vis-state-updaters.js +1077 -256
  16. package/dist/cjs/vis-state.js +2 -2
  17. package/dist/column-edit-reconcile.d.ts +4 -0
  18. package/dist/column-edit-updaters.spec.d.ts +1 -0
  19. package/dist/combined-updaters.d.ts +21 -1
  20. package/dist/composers.d.ts +3 -0
  21. package/dist/dataset-ops-updaters.d.ts +21 -0
  22. package/dist/dataset-ops-updaters.spec.d.ts +1 -0
  23. package/dist/esm/column-edit-reconcile.js +95 -0
  24. package/dist/esm/column-edit-updaters.spec.js +839 -0
  25. package/dist/esm/combined-updaters.js +166 -8
  26. package/dist/esm/composers.js +3 -2
  27. package/dist/esm/dataset-ops-updaters.js +357 -0
  28. package/dist/esm/dataset-ops-updaters.spec.js +381 -0
  29. package/dist/esm/export-utils.js +117 -45
  30. package/dist/esm/interaction-utils.js +159 -3
  31. package/dist/esm/layer-utils.js +133 -9
  32. package/dist/esm/ui-state-updaters.js +133 -50
  33. package/dist/esm/ui-state.js +2 -2
  34. package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
  35. package/dist/esm/vis-state-merger.js +99 -26
  36. package/dist/esm/vis-state-selectors.js +5 -4
  37. package/dist/esm/vis-state-updaters.js +1020 -263
  38. package/dist/esm/vis-state.js +2 -2
  39. package/dist/export-utils.d.ts +2 -2
  40. package/dist/interaction-utils.d.ts +25 -2
  41. package/dist/layer-utils.d.ts +17 -0
  42. package/dist/ui-state-updaters.d.ts +30 -0
  43. package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
  44. package/dist/vis-state-merger.d.ts +10 -2
  45. package/dist/vis-state-updaters.d.ts +61 -15
  46. package/dist/vis-state.d.ts +20 -0
  47. 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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