@kepler.gl/reducers 3.0.0-alpha.0

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/combined-updaters.d.ts +50 -0
  2. package/dist/combined-updaters.js +212 -0
  3. package/dist/composer-helpers.d.ts +21 -0
  4. package/dist/composer-helpers.js +133 -0
  5. package/dist/composers.d.ts +12 -0
  6. package/dist/composers.js +47 -0
  7. package/dist/core.d.ts +64 -0
  8. package/dist/core.js +149 -0
  9. package/dist/data-utils.d.ts +8 -0
  10. package/dist/data-utils.js +60 -0
  11. package/dist/export-utils.d.ts +21 -0
  12. package/dist/export-utils.js +124 -0
  13. package/dist/index.d.ts +36 -0
  14. package/dist/index.js +372 -0
  15. package/dist/interaction-utils.d.ts +35 -0
  16. package/dist/interaction-utils.js +149 -0
  17. package/dist/layer-utils.d.ts +66 -0
  18. package/dist/layer-utils.js +289 -0
  19. package/dist/map-state-updaters.d.ts +62 -0
  20. package/dist/map-state-updaters.js +250 -0
  21. package/dist/map-state.d.ts +3 -0
  22. package/dist/map-state.js +67 -0
  23. package/dist/map-style-updaters.d.ts +173 -0
  24. package/dist/map-style-updaters.js +538 -0
  25. package/dist/map-style.d.ts +4 -0
  26. package/dist/map-style.js +66 -0
  27. package/dist/middleware.d.ts +8 -0
  28. package/dist/middleware.js +46 -0
  29. package/dist/provider-state-updaters.d.ts +42 -0
  30. package/dist/provider-state-updaters.js +512 -0
  31. package/dist/provider-state.d.ts +4 -0
  32. package/dist/provider-state.js +66 -0
  33. package/dist/root.d.ts +31 -0
  34. package/dist/root.js +235 -0
  35. package/dist/ui-state-updaters.d.ts +355 -0
  36. package/dist/ui-state-updaters.js +866 -0
  37. package/dist/ui-state.d.ts +3 -0
  38. package/dist/ui-state.js +68 -0
  39. package/dist/vis-state-merger.d.ts +102 -0
  40. package/dist/vis-state-merger.js +635 -0
  41. package/dist/vis-state-selectors.d.ts +2 -0
  42. package/dist/vis-state-selectors.js +53 -0
  43. package/dist/vis-state-updaters.d.ts +419 -0
  44. package/dist/vis-state-updaters.js +2472 -0
  45. package/dist/vis-state.d.ts +3 -0
  46. package/dist/vis-state.js +66 -0
  47. package/package.json +83 -0
@@ -0,0 +1,635 @@
1
+ // Copyright (c) 2022 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ "use strict";
22
+
23
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
24
+
25
+ Object.defineProperty(exports, "__esModule", {
26
+ value: true
27
+ });
28
+ exports.mergeFilters = mergeFilters;
29
+ exports.createLayerFromConfig = createLayerFromConfig;
30
+ exports.serializeLayer = serializeLayer;
31
+ exports.mergeLayers = mergeLayers;
32
+ exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
33
+ exports.mergeInteractions = mergeInteractions;
34
+ exports.mergeSplitMaps = mergeSplitMaps;
35
+ exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
36
+ exports.mergeLayerBlending = mergeLayerBlending;
37
+ exports.mergeAnimationConfig = mergeAnimationConfig;
38
+ exports.validateSavedLayerColumns = validateSavedLayerColumns;
39
+ exports.validateColumn = validateColumn;
40
+ exports.validateSavedTextLabel = validateSavedTextLabel;
41
+ exports.validateSavedVisualChannels = validateSavedVisualChannels;
42
+ exports.validateLayersByDatasets = validateLayersByDatasets;
43
+ exports.validateLayerWithData = validateLayerWithData;
44
+ exports.isValidMerger = isValidMerger;
45
+ exports.VIS_STATE_MERGERS = void 0;
46
+
47
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
48
+
49
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
50
+
51
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
52
+
53
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
54
+
55
+ var _lodash = _interopRequireDefault(require("lodash.uniq"));
56
+
57
+ var _lodash2 = _interopRequireDefault(require("lodash.pick"));
58
+
59
+ var _lodash3 = _interopRequireDefault(require("lodash.flattendeep"));
60
+
61
+ var _utils = require("@kepler.gl/utils");
62
+
63
+ var _constants = require("@kepler.gl/constants");
64
+
65
+ var _schemas = require("@kepler.gl/schemas");
66
+
67
+ var _table = require("@kepler.gl/table");
68
+
69
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
70
+
71
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
72
+
73
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
74
+
75
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
76
+
77
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
78
+
79
+ /**
80
+ * Merge loaded filters with current state, if no fields or data are loaded
81
+ * save it for later
82
+ *
83
+ */
84
+ function mergeFilters(state, filtersToMerge, fromConfig) {
85
+ if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
86
+ return state;
87
+ }
88
+
89
+ var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
90
+ validated = _validateFiltersUpdat.validated,
91
+ failed = _validateFiltersUpdat.failed,
92
+ updatedDatasets = _validateFiltersUpdat.updatedDatasets; // merge filter with existing
93
+
94
+
95
+ var updatedFilters = [].concat((0, _toConsumableArray2["default"])(state.filters || []), (0, _toConsumableArray2["default"])(validated));
96
+ updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
97
+ updatedFilters = (0, _table.assignGpuChannels)(updatedFilters); // filter data
98
+
99
+ var datasetsToFilter = (0, _lodash["default"])((0, _lodash3["default"])(validated.map(function (f) {
100
+ return f.dataId;
101
+ })));
102
+ var filtered = (0, _utils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
103
+ return _objectSpread(_objectSpread({}, state), {}, {
104
+ filters: updatedFilters,
105
+ datasets: filtered,
106
+ filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
107
+ });
108
+ }
109
+
110
+ function createLayerFromConfig(state, layerConfig) {
111
+ // first validate config against dataset
112
+ var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [layerConfig]),
113
+ validated = _validateLayersByData.validated,
114
+ failed = _validateLayersByData.failed;
115
+
116
+ if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
117
+ // failed
118
+ return null;
119
+ }
120
+
121
+ var newLayer = validated[0];
122
+ newLayer.updateLayerDomain(state.datasets);
123
+ return newLayer;
124
+ }
125
+
126
+ function serializeLayer(newLayer) {
127
+ var _visStateSchema$CURRE, _visStateSchema$CURRE2;
128
+
129
+ var savedVisState = _schemas.visStateSchema[_schemas.CURRENT_VERSION].save( // @ts-expect-error not all expected properties are provided
130
+ {
131
+ layers: [newLayer],
132
+ layerOrder: [0]
133
+ }).visState;
134
+
135
+ var loadedLayer = (_visStateSchema$CURRE = _schemas.visStateSchema[_schemas.CURRENT_VERSION].load(savedVisState).visState) === null || _visStateSchema$CURRE === void 0 ? void 0 : (_visStateSchema$CURRE2 = _visStateSchema$CURRE.layers) === null || _visStateSchema$CURRE2 === void 0 ? void 0 : _visStateSchema$CURRE2[0]; // @ts-expect-error
136
+
137
+ return loadedLayer;
138
+ }
139
+ /**
140
+ * Merge layers from de-serialized state, if no fields or data are loaded
141
+ * save it for later
142
+ *
143
+ */
144
+
145
+
146
+ function mergeLayers(state) {
147
+ var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
148
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
149
+ var preserveLayerOrder = fromConfig ? layersToMerge.map(function (l) {
150
+ return l.id;
151
+ }) : state.preserveLayerOrder;
152
+
153
+ if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
154
+ return state;
155
+ }
156
+
157
+ var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, layersToMerge),
158
+ mergedLayer = _validateLayersByData2.validated,
159
+ unmerged = _validateLayersByData2.failed; // put new layers in front of current layers
160
+
161
+
162
+ var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, // @ts-expect-error
163
+ preserveLayerOrder),
164
+ newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
165
+ newLayers = _insertLayerAtRightOr.newLayers;
166
+
167
+ return _objectSpread(_objectSpread({}, state), {}, {
168
+ layers: newLayers,
169
+ layerOrder: newLayerOrder,
170
+ preserveLayerOrder: preserveLayerOrder,
171
+ layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), (0, _toConsumableArray2["default"])(unmerged))
172
+ });
173
+ }
174
+
175
+ function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
176
+ var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
177
+ // perservedOrder ['a', 'b', 'c'];
178
+ // layerOrder [1, 0, 3]
179
+ // layerOrderMap ['a', 'c']
180
+ var layerOrderQueue = currentOrder.map(function (i) {
181
+ return currentLayers[i].id;
182
+ });
183
+ var newLayers = currentLayers;
184
+
185
+ var _iterator = _createForOfIteratorHelper(layersToInsert),
186
+ _step;
187
+
188
+ try {
189
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
190
+ var newLayer = _step.value;
191
+ // find where to insert it
192
+ var expectedIdx = preservedOrder.indexOf(newLayer.id); // if cant find place to insert, insert at the front
193
+
194
+ var insertAt = 0;
195
+
196
+ if (expectedIdx > 0) {
197
+ // look for layer to insert after
198
+ var i = expectedIdx + 1;
199
+ var preceedIdx = -1;
200
+
201
+ while (i-- > 0 && preceedIdx < 0) {
202
+ // keep looking for preceed layer that is already loaded
203
+ var preceedLayer = preservedOrder[i - 1];
204
+ preceedIdx = layerOrderQueue.indexOf(preceedLayer);
205
+ }
206
+
207
+ if (preceedIdx > -1) {
208
+ // if found
209
+ insertAt = preceedIdx + 1;
210
+ }
211
+ }
212
+
213
+ layerOrderQueue = (0, _utils.arrayInsert)(layerOrderQueue, insertAt, newLayer.id);
214
+ newLayers = newLayers.concat(newLayer);
215
+ } // reconstruct layerOrder after insert
216
+
217
+ } catch (err) {
218
+ _iterator.e(err);
219
+ } finally {
220
+ _iterator.f();
221
+ }
222
+
223
+ var newLayerOrder = layerOrderQueue.map(function (id) {
224
+ return newLayers.findIndex(function (l) {
225
+ return l.id === id;
226
+ });
227
+ });
228
+ return {
229
+ newLayerOrder: newLayerOrder,
230
+ newLayers: newLayers
231
+ };
232
+ }
233
+ /**
234
+ * Merge interactions with saved config
235
+ *
236
+ */
237
+
238
+
239
+ function mergeInteractions(state, interactionToBeMerged, fromConfig) {
240
+ var merged = {};
241
+ var unmerged = {};
242
+
243
+ if (interactionToBeMerged) {
244
+ Object.keys(interactionToBeMerged).forEach(function (key) {
245
+ if (!state.interactionConfig[key]) {
246
+ return;
247
+ }
248
+
249
+ var currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
250
+
251
+ var _ref = interactionToBeMerged[key] || {},
252
+ enabled = _ref.enabled,
253
+ configSaved = (0, _objectWithoutProperties2["default"])(_ref, ["enabled"]);
254
+
255
+ var configToMerge = configSaved;
256
+
257
+ if (key === 'tooltip') {
258
+ var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
259
+ mergedTooltip = _mergeInteractionTool.mergedTooltip,
260
+ unmergedTooltip = _mergeInteractionTool.unmergedTooltip; // merge new dataset tooltips with original dataset tooltips
261
+
262
+
263
+ configToMerge = {
264
+ fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
265
+ };
266
+
267
+ if (Object.keys(unmergedTooltip).length) {
268
+ // @ts-expect-error
269
+ unmerged.tooltip = {
270
+ fieldsToShow: unmergedTooltip,
271
+ enabled: Boolean(enabled)
272
+ };
273
+ }
274
+ }
275
+
276
+ merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
277
+ enabled: Boolean(enabled)
278
+ }, currentConfig ? {
279
+ config: (0, _lodash2["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
280
+ } : {});
281
+ });
282
+ }
283
+
284
+ return _objectSpread(_objectSpread({}, state), {}, {
285
+ interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
286
+ interactionToBeMerged: unmerged
287
+ });
288
+ }
289
+ /**
290
+ * Merge splitMaps config with current visStete.
291
+ * 1. if current map is split, but splitMap DOESNOT contain maps
292
+ * : don't merge anything
293
+ * 2. if current map is NOT split, but splitMaps contain maps
294
+ * : add to splitMaps, and add current layers to splitMaps
295
+ */
296
+
297
+
298
+ function mergeSplitMaps(state) {
299
+ var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
300
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
301
+ var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
302
+ var unmerged = [];
303
+ splitMaps.forEach(function (sm, i) {
304
+ Object.entries(sm.layers).forEach(function (_ref2) {
305
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
306
+ id = _ref3[0],
307
+ value = _ref3[1];
308
+
309
+ // check if layer exists
310
+ var pushTo = state.layers.find(function (l) {
311
+ return l.id === id;
312
+ }) ? merged : unmerged; // create map panel if current map is not split
313
+
314
+ pushTo[i] = pushTo[i] || {
315
+ layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
316
+ };
317
+ pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
318
+ });
319
+ });
320
+ return _objectSpread(_objectSpread({}, state), {}, {
321
+ splitMaps: merged,
322
+ splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
323
+ });
324
+ }
325
+ /**
326
+ * Merge interactionConfig.tooltip with saved config,
327
+ * validate fieldsToShow
328
+ *
329
+ * @param state
330
+ * @param tooltipConfig
331
+ * @return - {mergedTooltip: {}, unmergedTooltip: {}}
332
+ */
333
+
334
+
335
+ function mergeInteractionTooltipConfig(state) {
336
+ var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
337
+ var unmergedTooltip = {};
338
+ var mergedTooltip = {};
339
+
340
+ if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
341
+ return {
342
+ mergedTooltip: mergedTooltip,
343
+ unmergedTooltip: unmergedTooltip
344
+ };
345
+ }
346
+
347
+ for (var dataId in tooltipConfig.fieldsToShow) {
348
+ if (!state.datasets[dataId]) {
349
+ // is not yet loaded
350
+ unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
351
+ } else {
352
+ (function () {
353
+ // if dataset is loaded
354
+ var allFields = state.datasets[dataId].fields.map(function (d) {
355
+ return d.name;
356
+ });
357
+ var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
358
+ return allFields.includes(field.name);
359
+ });
360
+ mergedTooltip[dataId] = foundFieldsToShow;
361
+ })();
362
+ }
363
+ }
364
+
365
+ return {
366
+ mergedTooltip: mergedTooltip,
367
+ unmergedTooltip: unmergedTooltip
368
+ };
369
+ }
370
+ /**
371
+ * Merge layerBlending with saved
372
+ *
373
+ */
374
+
375
+
376
+ function mergeLayerBlending(state, layerBlending, fromConfig) {
377
+ if (layerBlending && _constants.LAYER_BLENDINGS[layerBlending]) {
378
+ return _objectSpread(_objectSpread({}, state), {}, {
379
+ layerBlending: layerBlending
380
+ });
381
+ }
382
+
383
+ return state;
384
+ }
385
+ /**
386
+ * Merge animation config
387
+ */
388
+
389
+
390
+ function mergeAnimationConfig(state, animation, fromConfig) {
391
+ if (animation && animation.currentTime) {
392
+ return _objectSpread(_objectSpread({}, state), {}, {
393
+ animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
394
+ domain: null
395
+ })
396
+ });
397
+ }
398
+
399
+ return state;
400
+ }
401
+ /**
402
+ * Validate saved layer columns with new data,
403
+ * update fieldIdx based on new fields
404
+ *
405
+ * @param fields
406
+ * @param savedCols
407
+ * @param emptyCols
408
+ * @return - validated columns or null
409
+ */
410
+
411
+
412
+ function validateSavedLayerColumns(fields) {
413
+ var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
414
+ var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
415
+ // Prepare columns for the validator
416
+ var columns = {};
417
+
418
+ var _loop = function _loop() {
419
+ var key = _Object$keys[_i];
420
+ columns[key] = _objectSpread({}, emptyCols[key]);
421
+ var saved = savedCols[key];
422
+
423
+ if (saved) {
424
+ var fieldIdx = fields.findIndex(function (_ref4) {
425
+ var name = _ref4.name;
426
+ return name === saved;
427
+ });
428
+
429
+ if (fieldIdx > -1) {
430
+ // update found columns
431
+ columns[key].fieldIdx = fieldIdx;
432
+ columns[key].value = saved;
433
+ }
434
+ }
435
+ };
436
+
437
+ for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
438
+ _loop();
439
+ } // find actual column fieldIdx, in case it has changed
440
+
441
+
442
+ var allColFound = Object.keys(columns).every(function (key) {
443
+ return validateColumn(columns[key], columns, fields);
444
+ });
445
+
446
+ if (allColFound) {
447
+ return columns;
448
+ }
449
+
450
+ return null;
451
+ }
452
+
453
+ function validateColumn(column, columns, allFields) {
454
+ if (column.optional || column.value) {
455
+ return true;
456
+ }
457
+
458
+ if (column.validator) {
459
+ return column.validator(column, columns, allFields);
460
+ }
461
+
462
+ return false;
463
+ }
464
+ /**
465
+ * Validate saved text label config with new data
466
+ * refer to vis-state-schema.js TextLabelSchemaV1
467
+ *
468
+ * @param {Array<Object>} fields
469
+ * @param {Object} savedTextLabel
470
+ * @return {Object} - validated textlabel
471
+ */
472
+
473
+
474
+ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
475
+ var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
476
+ layerTextLabel = _ref6[0];
477
+
478
+ var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel]; // validate field
479
+
480
+ return savedTextLabels.map(function (textLabel) {
481
+ var field = textLabel.field ? fields.find(function (fd) {
482
+ return Object.keys(textLabel.field).every(function (key) {
483
+ return textLabel.field[key] === fd[key];
484
+ });
485
+ }) : null;
486
+ return Object.keys(layerTextLabel).reduce(function (accu, key) {
487
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
488
+ }, {});
489
+ });
490
+ }
491
+ /**
492
+ * Validate saved visual channels config with new data,
493
+ * refer to vis-state-schema.js VisualChannelSchemaV1
494
+ */
495
+
496
+
497
+ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
498
+ Object.values(newLayer.visualChannels).forEach(function (_ref7) {
499
+ var field = _ref7.field,
500
+ scale = _ref7.scale,
501
+ key = _ref7.key;
502
+ var foundField;
503
+
504
+ if (savedLayer.config) {
505
+ if (savedLayer.config[field]) {
506
+ foundField = fields.find(function (fd) {
507
+ return savedLayer.config && fd.name === savedLayer.config[field].name;
508
+ });
509
+ }
510
+
511
+ var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, foundField) : {}), savedLayer.config[scale] ? (0, _defineProperty2["default"])({}, scale, savedLayer.config[scale]) : {});
512
+
513
+ if (Object.keys(foundChannel).length) {
514
+ newLayer.updateLayerConfig(foundChannel);
515
+ }
516
+
517
+ newLayer.validateVisualChannel(key);
518
+ }
519
+ });
520
+ return newLayer;
521
+ }
522
+
523
+ function validateLayersByDatasets(datasets, layerClasses) {
524
+ var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
525
+ var validated = [];
526
+ var failed = [];
527
+ layers.forEach(function (layer) {
528
+ var _layer$config;
529
+
530
+ var validateLayer = null;
531
+
532
+ if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
533
+ if (datasets[layer.config.dataId]) {
534
+ // datasets are already loaded
535
+ validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses);
536
+ }
537
+ }
538
+
539
+ if (validateLayer) {
540
+ validated.push(validateLayer);
541
+ } else {
542
+ // datasets not yet loaded
543
+ failed.push(layer);
544
+ }
545
+ });
546
+ return {
547
+ validated: validated,
548
+ failed: failed
549
+ };
550
+ }
551
+ /**
552
+ * Validate saved layer config with new data,
553
+ * update fieldIdx based on new fields
554
+ */
555
+
556
+
557
+ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
558
+ var fields = _ref10.fields,
559
+ dataId = _ref10.id;
560
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
561
+ var type = savedLayer.type; // layer doesnt have a valid type
562
+
563
+ if (!type || !layerClasses.hasOwnProperty(type) || !savedLayer.config) {
564
+ return null;
565
+ }
566
+
567
+ var newLayer = new layerClasses[type]({
568
+ id: savedLayer.id,
569
+ dataId: dataId,
570
+ label: savedLayer.config.label,
571
+ color: savedLayer.config.color,
572
+ isVisible: savedLayer.config.isVisible,
573
+ hidden: savedLayer.config.hidden,
574
+ highlightColor: savedLayer.config.highlightColor
575
+ }); // find column fieldIdx
576
+
577
+ var columnConfig = newLayer.getLayerColumns();
578
+
579
+ if (Object.keys(columnConfig).length) {
580
+ var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig);
581
+
582
+ if (columns) {
583
+ newLayer.updateLayerConfig({
584
+ columns: columns
585
+ });
586
+ } else if (!options.allowEmptyColumn) {
587
+ return null;
588
+ }
589
+ } // visual channel field is saved to be {name, type}
590
+ // find visual channel field by matching both name and type
591
+ // refer to vis-state-schema.js VisualChannelSchemaV1
592
+
593
+
594
+ newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer);
595
+ var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel) : newLayer.config.textLabel; // copy visConfig over to emptyLayer to make sure it has all the props
596
+
597
+ var visConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
598
+ shallowCopy: ['colorRange', 'strokeColorRange']
599
+ });
600
+ newLayer.updateLayerConfig({
601
+ visConfig: visConfig,
602
+ textLabel: textLabel
603
+ });
604
+ return newLayer;
605
+ }
606
+
607
+ function isValidMerger(merger) {
608
+ return (0, _utils.isObject)(merger) && typeof merger.merge === 'function' && typeof merger.prop === 'string';
609
+ }
610
+
611
+ var VIS_STATE_MERGERS = [{
612
+ merge: mergeLayers,
613
+ prop: 'layers',
614
+ toMergeProp: 'layerToBeMerged'
615
+ }, {
616
+ merge: mergeFilters,
617
+ prop: 'filters',
618
+ toMergeProp: 'filterToBeMerged'
619
+ }, {
620
+ merge: mergeInteractions,
621
+ prop: 'interactionConfig',
622
+ toMergeProp: 'interactionToBeMerged'
623
+ }, {
624
+ merge: mergeLayerBlending,
625
+ prop: 'layerBlending'
626
+ }, {
627
+ merge: mergeSplitMaps,
628
+ prop: 'splitMaps',
629
+ toMergeProp: 'splitMapsToBeMerged'
630
+ }, {
631
+ merge: mergeAnimationConfig,
632
+ prop: 'animationConfig'
633
+ }];
634
+ exports.VIS_STATE_MERGERS = VIS_STATE_MERGERS;
635
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtbWVyZ2VyLnRzIl0sIm5hbWVzIjpbIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidmFsaWRhdGVkIiwiZmFpbGVkIiwidXBkYXRlZERhdGFzZXRzIiwidXBkYXRlZEZpbHRlcnMiLCJmaWx0ZXJzIiwiZGF0YXNldHNUb0ZpbHRlciIsIm1hcCIsImYiLCJkYXRhSWQiLCJmaWx0ZXJlZCIsImxheWVycyIsImRhdGFzZXRzIiwiZmlsdGVyVG9CZU1lcmdlZCIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsImxheWVyQ29uZmlnIiwidmFsaWRhdGVMYXllcnNCeURhdGFzZXRzIiwibGF5ZXJDbGFzc2VzIiwibmV3TGF5ZXIiLCJ1cGRhdGVMYXllckRvbWFpbiIsInNlcmlhbGl6ZUxheWVyIiwic2F2ZWRWaXNTdGF0ZSIsInZpc1N0YXRlU2NoZW1hIiwiQ1VSUkVOVF9WRVJTSU9OIiwic2F2ZSIsImxheWVyT3JkZXIiLCJ2aXNTdGF0ZSIsImxvYWRlZExheWVyIiwibG9hZCIsIm1lcmdlTGF5ZXJzIiwibGF5ZXJzVG9NZXJnZSIsInByZXNlcnZlTGF5ZXJPcmRlciIsImwiLCJpZCIsIm1lcmdlZExheWVyIiwidW5tZXJnZWQiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJsYXllclRvQmVNZXJnZWQiLCJjdXJyZW50TGF5ZXJzIiwibGF5ZXJzVG9JbnNlcnQiLCJjdXJyZW50T3JkZXIiLCJwcmVzZXJ2ZWRPcmRlciIsImxheWVyT3JkZXJRdWV1ZSIsImkiLCJleHBlY3RlZElkeCIsImluZGV4T2YiLCJpbnNlcnRBdCIsInByZWNlZWRJZHgiLCJwcmVjZWVkTGF5ZXIiLCJjb25jYXQiLCJmaW5kSW5kZXgiLCJtZXJnZUludGVyYWN0aW9ucyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsIm1lcmdlZCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiaW50ZXJhY3Rpb25Db25maWciLCJjdXJyZW50Q29uZmlnIiwiY29uZmlnIiwiZW5hYmxlZCIsImNvbmZpZ1NhdmVkIiwiY29uZmlnVG9NZXJnZSIsIm1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnIiwibWVyZ2VkVG9vbHRpcCIsInVubWVyZ2VkVG9vbHRpcCIsImZpZWxkc1RvU2hvdyIsInRvb2x0aXAiLCJCb29sZWFuIiwibWVyZ2VTcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJzbSIsImVudHJpZXMiLCJ2YWx1ZSIsInB1c2hUbyIsImZpbmQiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwidG9vbHRpcENvbmZpZyIsImFsbEZpZWxkcyIsImZpZWxkcyIsImQiLCJuYW1lIiwiZm91bmRGaWVsZHNUb1Nob3ciLCJmaWx0ZXIiLCJmaWVsZCIsImluY2x1ZGVzIiwibWVyZ2VMYXllckJsZW5kaW5nIiwibGF5ZXJCbGVuZGluZyIsIkxBWUVSX0JMRU5ESU5HUyIsIm1lcmdlQW5pbWF0aW9uQ29uZmlnIiwiYW5pbWF0aW9uIiwiY3VycmVudFRpbWUiLCJhbmltYXRpb25Db25maWciLCJkb21haW4iLCJ2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zIiwic2F2ZWRDb2xzIiwiZW1wdHlDb2xzIiwiY29sdW1ucyIsInNhdmVkIiwiZmllbGRJZHgiLCJhbGxDb2xGb3VuZCIsImV2ZXJ5IiwidmFsaWRhdGVDb2x1bW4iLCJjb2x1bW4iLCJvcHRpb25hbCIsInZhbGlkYXRvciIsInZhbGlkYXRlU2F2ZWRUZXh0TGFiZWwiLCJzYXZlZFRleHRMYWJlbCIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwic2NhbGUiLCJmb3VuZEZpZWxkIiwiZm91bmRDaGFubmVsIiwidXBkYXRlTGF5ZXJDb25maWciLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJsYXllciIsInZhbGlkYXRlTGF5ZXIiLCJ2YWxpZGF0ZUxheWVyV2l0aERhdGEiLCJwdXNoIiwib3B0aW9ucyIsInR5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImxhYmVsIiwiY29sb3IiLCJpc1Zpc2libGUiLCJoaWRkZW4iLCJoaWdobGlnaHRDb2xvciIsImNvbHVtbkNvbmZpZyIsImdldExheWVyQ29sdW1ucyIsImFsbG93RW1wdHlDb2x1bW4iLCJ2aXNDb25maWciLCJjb3B5TGF5ZXJDb25maWciLCJzaGFsbG93Q29weSIsImlzVmFsaWRNZXJnZXIiLCJtZXJnZXIiLCJtZXJnZSIsInByb3AiLCJWSVNfU1RBVEVfTUVSR0VSUyIsInRvTWVyZ2VQcm9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQVNBOztBQUNBOztBQVVBOzs7Ozs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsWUFBVCxDQUNMQyxLQURLLEVBRUxDLGNBRkssRUFHTEMsVUFISyxFQUlGO0FBQ0gsTUFBSSxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0gsY0FBZCxDQUFELElBQWtDLENBQUNBLGNBQWMsQ0FBQ0ksTUFBdEQsRUFBOEQ7QUFDNUQsV0FBT0wsS0FBUDtBQUNEOztBQUhFLDhCQUswQywwQ0FBOEJBLEtBQTlCLEVBQXFDQyxjQUFyQyxDQUwxQztBQUFBLE1BS0lLLFNBTEoseUJBS0lBLFNBTEo7QUFBQSxNQUtlQyxNQUxmLHlCQUtlQSxNQUxmO0FBQUEsTUFLdUJDLGVBTHZCLHlCQUt1QkEsZUFMdkIsRUFPSDs7O0FBQ0EsTUFBSUMsY0FBYyxpREFBUVQsS0FBSyxDQUFDVSxPQUFOLElBQWlCLEVBQXpCLHVDQUFpQ0osU0FBakMsRUFBbEI7QUFDQUcsRUFBQUEsY0FBYyxHQUFHLCtCQUFtQkEsY0FBbkIs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UyxFQUFUQTtBQUZ5QixHQUEzQjtBQUtBLFNBQU8vRixRQUFQO0FBQ0Q7O0FBRU0sU0FBUzhILGFBQVQsQ0FBdUJDLE1BQXZCLEVBQWdEO0FBQ3JELFNBQU8scUJBQVNBLE1BQVQsS0FBb0IsT0FBT0EsTUFBTSxDQUFDQyxLQUFkLEtBQXdCLFVBQTVDLElBQTBELE9BQU9ELE1BQU0sQ0FBQ0UsSUFBZCxLQUF1QixRQUF4RjtBQUNEOztBQUVNLElBQU1DLGlCQUFrQyxHQUFHLENBQ2hEO0FBQUNGLEVBQUFBLEtBQUssRUFBRXJILFdBQVI7QUFBcUJzSCxFQUFBQSxJQUFJLEVBQUUsUUFBM0I7QUFBcUNFLEVBQUFBLFdBQVcsRUFBRTtBQUFsRCxDQURnRCxFQUVoRDtBQUFDSCxFQUFBQSxLQUFLLEVBQUV4SixZQUFSO0FBQXNCeUosRUFBQUEsSUFBSSxFQUFFLFNBQTVCO0FBQXVDRSxFQUFBQSxXQUFXLEVBQUU7QUFBcEQsQ0FGZ0QsRUFHaEQ7QUFBQ0gsRUFBQUEsS0FBSyxFQUFFN0YsaUJBQVI7QUFBMkI4RixFQUFBQSxJQUFJLEVBQUUsbUJBQWpDO0FBQXNERSxFQUFBQSxXQUFXLEVBQUU7QUFBbkUsQ0FIZ0QsRUFJaEQ7QUFBQ0gsRUFBQUEsS0FBSyxFQUFFekQsa0JBQVI7QUFBNEIwRCxFQUFBQSxJQUFJLEVBQUU7QUFBbEMsQ0FKZ0QsRUFLaEQ7QUFBQ0QsRUFBQUEsS0FBSyxFQUFFMUUsY0FBUjtBQUF3QjJFLEVBQUFBLElBQUksRUFBRSxXQUE5QjtBQUEyQ0UsRUFBQUEsV0FBVyxFQUFFO0FBQXhELENBTGdELEVBTWhEO0FBQUNILEVBQUFBLEtBQUssRUFBRXRELG9CQUFSO0FBQThCdUQsRUFBQUEsSUFBSSxFQUFFO0FBQXBDLENBTmdELENBQTNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoLnBpY2snO1xuaW1wb3J0IGZsYXR0ZW5EZWVwIGZyb20gJ2xvZGFzaC5mbGF0dGVuZGVlcCc7XG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgYXJyYXlJbnNlcnQsXG4gIGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcCxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgdmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHNcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7TGF5ZXJDb2x1bW5zLCBMYXllckNvbHVtbiwgTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7TEFZRVJfQkxFTkRJTkdTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDVVJSRU5UX1ZFUlNJT04sXG4gIE1lcmdlcixcbiAgVmlzU3RhdGUsXG4gIFZpc1N0YXRlTWVyZ2VycyxcbiAgdmlzU3RhdGVTY2hlbWEsXG4gIFBhcnNlZENvbmZpZ1xufSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1BhcnNlZExheWVyLCBTYXZlZEludGVyYWN0aW9uQ29uZmlnLCBUb29sdGlwSW5mb30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlLCBEYXRhc2V0cywgYXNzaWduR3B1Q2hhbm5lbHMsIHJlc2V0RmlsdGVyR3B1TW9kZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbi8qKlxuICogTWVyZ2UgbG9hZGVkIGZpbHRlcnMgd2l0aCBjdXJyZW50IHN0YXRlLCBpZiBubyBmaWVsZHMgb3IgZGF0YSBhcmUgbG9hZGVkXG4gKiBzYXZlIGl0IGZvciBsYXRlclxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRmlsdGVyczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZmlsdGVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2ZpbHRlcnMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyc1RvTWVyZ2UpIHx8ICFmaWx0ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c30gPSB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyhzdGF0ZSwgZmlsdGVyc1RvTWVyZ2UpO1xuXG4gIC8vIG1lcmdlIGZpbHRlciB3aXRoIGV4aXN0aW5nXG4gIGxldCB1cGRhdGVkRmlsdGVycyA9IFsuLi4oc3RhdGUuZmlsdGVycyB8fCBbXSksIC4uLnZhbGlkYXRlZF07XG4gIHVwZGF0ZWRGaWx0ZXJzID0gcmVzZXRGaWx0ZXJHcHVNb2RlKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgdXBkYXRlZEZpbHRlcnMgPSBhc3NpZ25HcHVDaGFubmVscyh1cGRhdGVkRmlsdGVycyk7XG4gIC8vIGZpbHRlciBkYXRhXG4gIGNvbnN0IGRhdGFzZXRzVG9GaWx0ZXIgPSB1bmlxKGZsYXR0ZW5EZWVwKHZhbGlkYXRlZC5tYXAoZiA9PiBmLmRhdGFJZCkpKTtcblxuICBjb25zdCBmaWx0ZXJlZCA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoXG4gICAgZGF0YXNldHNUb0ZpbHRlcixcbiAgICB1cGRhdGVkRGF0YXNldHMsXG4gICAgdXBkYXRlZEZpbHRlcnMsXG4gICAgc3RhdGUubGF5ZXJzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiB1cGRhdGVkRmlsdGVycyxcbiAgICBkYXRhc2V0czogZmlsdGVyZWQsXG4gICAgZmlsdGVyVG9CZU1lcmdlZDogWy4uLnN0YXRlLmZpbHRlclRvQmVNZXJnZWQsIC4uLmZhaWxlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheWVyRnJvbUNvbmZpZyhzdGF0ZTogVmlzU3RhdGUsIGxheWVyQ29uZmlnOiBhbnkpOiBMYXllciB8IG51bGwge1xuICAvLyBmaXJzdCB2YWxpZGF0ZSBjb25maWcgYWdhaW5zdCBkYXRhc2V0XG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoc3RhdGUuZGF0YXNldHMsIHN0YXRlLmxheWVyQ2xhc3NlcywgW1xuICAgIGxheWVyQ29uZmlnXG4gIF0pO1xuXG4gIGlmIChmYWlsZWQ/Lmxlbmd0aCB8fCAhdmFsaWRhdGVkLmxlbmd0aCkge1xuICAgIC8vIGZhaWxlZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZWRbMF07XG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTGF5ZXIobmV3TGF5ZXIpOiBQYXJzZWRMYXllciB7XG4gIGNvbnN0IHNhdmVkVmlzU3RhdGUgPSB2aXNTdGF0ZVNjaGVtYVtDVVJSRU5UX1ZFUlNJT05dLnNhdmUoXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub3QgYWxsIGV4cGVjdGVkIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkXG4gICAge1xuICAgICAgbGF5ZXJzOiBbbmV3TGF5ZXJdLFxuICAgICAgbGF5ZXJPcmRlcjogWzBdXG4gICAgfVxuICApLnZpc1N0YXRlO1xuICBjb25zdCBsb2FkZWRMYXllciA9IHZpc1N0YXRlU2NoZW1hW0NVUlJFTlRfVkVSU0lPTl0ubG9hZChzYXZlZFZpc1N0YXRlKS52aXNTdGF0ZT8ubGF5ZXJzPy5bMF07XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIGxvYWRlZExheWVyO1xufVxuXG4vKipcbiAqIE1lcmdlIGxheWVycyBmcm9tIGRlLXNlcmlhbGl6ZWQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gZnJvbUNvbmZpZyA/IGxheWVyc1RvTWVyZ2UubWFwKGwgPT4gbC5pZCkgOiBzdGF0ZS5wcmVzZXJ2ZUxheWVyT3JkZXI7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGxheWVyc1RvTWVyZ2UpIHx8ICFsYXllcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQ6IG1lcmdlZExheWVyLCBmYWlsZWQ6IHVubWVyZ2VkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgICBzdGF0ZS5kYXRhc2V0cyxcbiAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgbGF5ZXJzVG9NZXJnZVxuICApO1xuXG4gIC8vIHB1dCBuZXcgbGF5ZXJzIGluIGZyb250IG9mIGN1cnJlbnQgbGF5ZXJzXG4gIGNvbnN0IHtuZXdMYXllck9yZGVyLCBuZXdMYXllcnN9ID0gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gICAgc3RhdGUubGF5ZXJzLFxuICAgIG1lcmdlZExheWVyLFxuICAgIHN0YXRlLmxheWVyT3JkZXIsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHByZXNlcnZlTGF5ZXJPcmRlclxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdMYXllcnMsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbMSwgMCwgM11cbiAgLy8gbGF5ZXJPcmRlck1hcCBbJ2EnLCAnYyddXG4gIGxldCBsYXllck9yZGVyUXVldWUgPSBjdXJyZW50T3JkZXIubWFwKGkgPT4gY3VycmVudExheWVyc1tpXS5pZCk7XG4gIGxldCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzO1xuXG4gIGZvciAoY29uc3QgbmV3TGF5ZXIgb2YgbGF5ZXJzVG9JbnNlcnQpIHtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIGluc2VydCBpdFxuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihuZXdMYXllci5pZCk7XG4gICAgLy8gaWYgY2FudCBmaW5kIHBsYWNlIHRvIGluc2VydCwgaW5zZXJ0IGF0IHRoZSBmcm9udFxuICAgIGxldCBpbnNlcnRBdCA9IDA7XG5cbiAgICBpZiAoZXhwZWN0ZWRJZHggPiAwKSB7XG4gICAgICAvLyBsb29rIGZvciBsYXllciB0byBpbnNlcnQgYWZ0ZXJcbiAgICAgIGxldCBpID0gZXhwZWN0ZWRJZHggKyAxO1xuICAgICAgbGV0IHByZWNlZWRJZHggPSAtMTtcbiAgICAgIHdoaWxlIChpLS0gPiAwICYmIHByZWNlZWRJZHggPCAwKSB7XG4gICAgICAgIC8vIGtlZXAgbG9va2luZyBmb3IgcHJlY2VlZCBsYXllciB0aGF0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGNvbnN0IHByZWNlZWRMYXllciA9IHByZXNlcnZlZE9yZGVyW2kgLSAxXTtcbiAgICAgICAgcHJlY2VlZElkeCA9IGxheWVyT3JkZXJRdWV1ZS5pbmRleE9mKHByZWNlZWRMYXllcik7XG4gICAgICB9XG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIGlmIGZvdW5kXG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJPcmRlclF1ZXVlID0gYXJyYXlJbnNlcnQobGF5ZXJPcmRlclF1ZXVlLCBpbnNlcnRBdCwgbmV3TGF5ZXIuaWQpO1xuICAgIG5ld0xheWVycyA9IG5ld0xheWVycy5jb25jYXQobmV3TGF5ZXIpO1xuICB9XG5cbiAgLy8gcmVjb25zdHJ1Y3QgbGF5ZXJPcmRlciBhZnRlciBpbnNlcnRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXJRdWV1ZS5tYXAoaWQgPT4gbmV3TGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gfCB1bmRlZmluZWQsXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIC4uLm1lcmdlZFxuICAgIH0sXG4gICAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB1bm1lcmdlZFxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIHNwbGl0TWFwcyBjb25maWcgd2l0aCBjdXJyZW50IHZpc1N0ZXRlLlxuICogMS4gaWYgY3VycmVudCBtYXAgaXMgc3BsaXQsIGJ1dCBzcGxpdE1hcCBET0VTTk9UIGNvbnRhaW4gbWFwc1xuICogICAgOiBkb24ndCBtZXJnZSBhbnl0aGluZ1xuICogMi4gaWYgY3VycmVudCBtYXAgaXMgTk9UIHNwbGl0LCBidXQgc3BsaXRNYXBzIGNvbnRhaW4gbWFwc1xuICogICAgOiBhZGQgdG8gc3BsaXRNYXBzLCBhbmQgYWRkIGN1cnJlbnQgbGF5ZXJzIHRvIHNwbGl0TWFwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VTcGxpdE1hcHM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBtZXJnZWQgPSBbLi4uc3RhdGUuc3BsaXRNYXBzXTtcbiAgY29uc3QgdW5tZXJnZWQgPSBbXTtcbiAgc3BsaXRNYXBzLmZvckVhY2goKHNtLCBpKSA9PiB7XG4gICAgT2JqZWN0LmVudHJpZXMoc20ubGF5ZXJzKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgbGF5ZXIgZXhpc3RzXG4gICAgICBjb25zdCBwdXNoVG8gPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGlkKSA/IG1lcmdlZCA6IHVubWVyZ2VkO1xuXG4gICAgICAvLyBjcmVhdGUgbWFwIHBhbmVsIGlmIGN1cnJlbnQgbWFwIGlzIG5vdCBzcGxpdFxuICAgICAgcHVzaFRvW2ldID0gcHVzaFRvW2ldIHx8IHtcbiAgICAgICAgbGF5ZXJzOiBwdXNoVG8gPT09IG1lcmdlZCA/IGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcChzdGF0ZS5sYXllcnMpIDogW11cbiAgICAgIH07XG4gICAgICBwdXNoVG9baV0ubGF5ZXJzID0ge1xuICAgICAgICAuLi5wdXNoVG9baV0ubGF5ZXJzLFxuICAgICAgICBbaWRdOiB2YWx1ZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzcGxpdE1hcHM6IG1lcmdlZCxcbiAgICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuc3BsaXRNYXBzVG9CZU1lcmdlZCwgLi4udW5tZXJnZWRdXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcCB3aXRoIHNhdmVkIGNvbmZpZyxcbiAqIHZhbGlkYXRlIGZpZWxkc1RvU2hvd1xuICpcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHBhcmFtIHRvb2x0aXBDb25maWdcbiAqIEByZXR1cm4gLSB7bWVyZ2VkVG9vbHRpcDoge30sIHVubWVyZ2VkVG9vbHRpcDoge319XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB0b29sdGlwQ29uZmlnOiBQaWNrPFRvb2x0aXBJbmZvWydjb25maWcnXSwgJ2ZpZWxkc1RvU2hvdyc+IHwgbnVsbCA9IG51bGxcbikge1xuICBjb25zdCB1bm1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcbiAgY29uc3QgbWVyZ2VkVG9vbHRpcDogVG9vbHRpcEluZm9bJ2NvbmZpZyddWydmaWVsZHNUb1Nob3cnXSA9IHt9O1xuXG4gIGlmIChcbiAgICAhdG9vbHRpcENvbmZpZyB8fFxuICAgICF0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdyB8fFxuICAgICFPYmplY3Qua2V5cyh0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykubGVuZ3RoXG4gICkge1xuICAgIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZGF0YUlkIGluIHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93KSB7XG4gICAgaWYgKCFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAvLyBpcyBub3QgeWV0IGxvYWRlZFxuICAgICAgdW5tZXJnZWRUb29sdGlwW2RhdGFJZF0gPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGxvYWRlZFxuICAgICAgY29uc3QgYWxsRmllbGRzID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5maWVsZHMubWFwKGQgPT4gZC5uYW1lKTtcbiAgICAgIGNvbnN0IGZvdW5kRmllbGRzVG9TaG93ID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXS5maWx0ZXIoZmllbGQgPT5cbiAgICAgICAgYWxsRmllbGRzLmluY2x1ZGVzKGZpZWxkLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBtZXJnZWRUb29sdGlwW2RhdGFJZF0gPSBmb3VuZEZpZWxkc1RvU2hvdztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG59XG4vKipcbiAqIE1lcmdlIGxheWVyQmxlbmRpbmcgd2l0aCBzYXZlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJCbGVuZGluZyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmIChsYXllckJsZW5kaW5nICYmIExBWUVSX0JMRU5ESU5HU1tsYXllckJsZW5kaW5nXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyQmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIE1lcmdlIGFuaW1hdGlvbiBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQW5pbWF0aW9uQ29uZmlnPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhbmltYXRpb246IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2FuaW1hdGlvbkNvbmZpZyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmIChhbmltYXRpb24gJiYgYW5pbWF0aW9uLmN1cnJlbnRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uYW5pbWF0aW9uLFxuICAgICAgICBkb21haW46IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbHVtbnMgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHBhcmFtIHNhdmVkQ29sc1xuICogQHBhcmFtIGVtcHR5Q29sc1xuICogQHJldHVybiAtIHZhbGlkYXRlZCBjb2x1bW5zIG9yIG51bGxcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyhcbiAgZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10sXG4gIHNhdmVkQ29sczoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfSA9IHt9LFxuICBlbXB0eUNvbHM6IExheWVyQ29sdW1uc1xuKSB7XG4gIC8vIFByZXBhcmUgY29sdW1ucyBmb3IgdGhlIHZhbGlkYXRvclxuICBjb25zdCBjb2x1bW5zOiB0eXBlb2YgZW1wdHlDb2xzID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVtcHR5Q29scykpIHtcbiAgICBjb2x1bW5zW2tleV0gPSB7Li4uZW1wdHlDb2xzW2tleV19O1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBzYXZlZENvbHNba2V5XTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleCgoe25hbWV9KSA9PiBuYW1lID09PSBzYXZlZCk7XG5cbiAgICAgIGlmIChmaWVsZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBmb3VuZCBjb2x1bW5zXG4gICAgICAgIGNvbHVtbnNba2V5XS5maWVsZElkeCA9IGZpZWxkSWR4O1xuICAgICAgICBjb2x1bW5zW2tleV0udmFsdWUgPSBzYXZlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIGFjdHVhbCBjb2x1bW4gZmllbGRJZHgsIGluIGNhc2UgaXQgaGFzIGNoYW5nZWRcbiAgY29uc3QgYWxsQ29sRm91bmQgPSBPYmplY3Qua2V5cyhjb2x1bW5zKS5ldmVyeShrZXkgPT5cbiAgICB2YWxpZGF0ZUNvbHVtbihjb2x1bW5zW2tleV0sIGNvbHVtbnMsIGZpZWxkcylcbiAgKTtcblxuICBpZiAoYWxsQ29sRm91bmQpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb2x1bW4oXG4gIGNvbHVtbjogTGF5ZXJDb2x1bW4gJiB7dmFsaWRhdG9yPzogdHlwZW9mIHZhbGlkYXRlQ29sdW1ufSxcbiAgY29sdW1uczogTGF5ZXJDb2x1bW5zLFxuICBhbGxGaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXVxuKTogYm9vbGVhbiB7XG4gIGlmIChjb2x1bW4ub3B0aW9uYWwgfHwgY29sdW1uLnZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGNvbHVtbi52YWxpZGF0b3IpIHtcbiAgICByZXR1cm4gY29sdW1uLnZhbGlkYXRvcihjb2x1bW4sIGNvbHVtbnMsIGFsbEZpZWxkcyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHRleHQgbGFiZWwgY29uZmlnIHdpdGggbmV3IGRhdGFcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVGV4dExhYmVsU2NoZW1hVjFcbiAqXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZpZWxkc1xuICogQHBhcmFtIHtPYmplY3R9IHNhdmVkVGV4dExhYmVsXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gdmFsaWRhdGVkIHRleHRsYWJlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIFtsYXllclRleHRMYWJlbF0sIHNhdmVkVGV4dExhYmVsKSB7XG4gIGNvbnN0IHNhdmVkVGV4dExhYmVscyA9IEFycmF5LmlzQXJyYXkoc2F2ZWRUZXh0TGFiZWwpID8gc2F2ZWRUZXh0TGFiZWwgOiBbc2F2ZWRUZXh0TGFiZWxdO1xuXG4gIC8vIHZhbGlkYXRlIGZpZWxkXG4gIHJldHVybiBzYXZlZFRleHRMYWJlbHMubWFwKHRleHRMYWJlbCA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0ZXh0TGFiZWwuZmllbGRcbiAgICAgID8gZmllbGRzLmZpbmQoZmQgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyh0ZXh0TGFiZWwuZmllbGQpLmV2ZXJ5KGtleSA9PiB0ZXh0TGFiZWwuZmllbGRba2V5XSA9PT0gZmRba2V5XSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxheWVyVGV4dExhYmVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XToga2V5ID09PSAnZmllbGQnID8gZmllbGQgOiB0ZXh0TGFiZWxba2V5XSB8fCBsYXllclRleHRMYWJlbFtrZXldXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdmlzdWFsIGNoYW5uZWxzIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBWaXN1YWxDaGFubmVsU2NoZW1hVjFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyhcbiAgZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10sXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2F2ZWRMYXllcjogUGFyc2VkTGF5ZXJcbik6IG51bGwgfCBMYXllciB7XG4gIE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goKHtmaWVsZCwgc2NhbGUsIGtleX0pID0+IHtcbiAgICBsZXQgZm91bmRGaWVsZDtcbiAgICBpZiAoc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICAgIGlmIChzYXZlZExheWVyLmNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgICAgZm91bmRGaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5uYW1lXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvdW5kQ2hhbm5lbCA9IHtcbiAgICAgICAgLi4uKGZvdW5kRmllbGQgPyB7W2ZpZWxkXTogZm91bmRGaWVsZH0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXVxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLCBsYXllciwgbGF5ZXJDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICB7ZmllbGRzLCBpZDogZGF0YUlkfTogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczoge1xuICAgIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB9ID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIWxheWVyQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvclxuICB9KTtcblxuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBjb25zdCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoZmllbGRzLCBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLCBjb2x1bW5Db25maWcpO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7c2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ119XG4gICk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lcmdlcihtZXJnZXI6IE1lcmdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPYmplY3QobWVyZ2VyKSAmJiB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzID0gW1xuICB7bWVyZ2U6IG1lcmdlTGF5ZXJzLCBwcm9wOiAnbGF5ZXJzJywgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUZpbHRlcnMsIHByb3A6ICdmaWx0ZXJzJywgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfVxuXTtcbiJdfQ==