@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.11

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 (86) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +2 -3
  8. package/dist/cjs/interaction-utils.js +115 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +659 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +25 -0
  16. package/dist/cjs/provider-state-updaters.js +464 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +922 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1215 -0
  22. package/dist/cjs/vis-state-selectors.js +48 -0
  23. package/dist/cjs/vis-state-updaters.js +5150 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +19 -2
  26. package/dist/composers.d.ts +2 -0
  27. package/dist/esm/combined-updaters.js +484 -0
  28. package/dist/esm/composer-helpers.js +85 -0
  29. package/dist/esm/composers.js +14 -0
  30. package/dist/esm/core.js +101 -0
  31. package/dist/esm/data-utils.js +47 -0
  32. package/dist/esm/export-utils.js +86 -0
  33. package/dist/esm/index.js +62 -0
  34. package/dist/esm/interaction-utils.js +106 -0
  35. package/dist/esm/layer-utils.js +602 -0
  36. package/dist/esm/map-state-updaters.js +650 -0
  37. package/dist/esm/map-state.js +29 -0
  38. package/dist/esm/map-style-updaters.js +652 -0
  39. package/dist/esm/map-style.js +27 -0
  40. package/dist/esm/merger-handler.js +96 -0
  41. package/dist/esm/middleware.js +17 -0
  42. package/dist/esm/provider-state-updaters.js +458 -0
  43. package/dist/esm/provider-state.js +28 -0
  44. package/dist/esm/root.js +201 -0
  45. package/dist/esm/ui-state-updaters.js +917 -0
  46. package/dist/esm/ui-state.js +30 -0
  47. package/dist/esm/vis-state-merger.js +1182 -0
  48. package/dist/esm/vis-state-selectors.js +42 -0
  49. package/dist/esm/vis-state-updaters.js +5057 -0
  50. package/dist/esm/vis-state.js +29 -0
  51. package/dist/interaction-utils.d.ts +1 -1
  52. package/dist/layer-utils.d.ts +23 -5
  53. package/dist/map-state-updaters.d.ts +26 -21
  54. package/dist/map-state.d.ts +2 -78
  55. package/dist/map-style-updaters.d.ts +1 -3
  56. package/dist/middleware.d.ts +2 -2
  57. package/dist/root.d.ts +1 -1
  58. package/dist/ui-state-updaters.d.ts +17 -2
  59. package/dist/vis-state-merger.d.ts +7 -0
  60. package/dist/vis-state-selectors.d.ts +88 -5
  61. package/dist/vis-state-updaters.d.ts +127 -4
  62. package/dist/vis-state.d.ts +8 -4
  63. package/package.json +37 -32
  64. package/dist/combined-updaters.js +0 -363
  65. package/dist/composer-helpers.js +0 -101
  66. package/dist/composers.js +0 -23
  67. package/dist/core.js +0 -105
  68. package/dist/data-utils.js +0 -53
  69. package/dist/export-utils.js +0 -91
  70. package/dist/interaction-utils.js +0 -105
  71. package/dist/layer-utils.js +0 -376
  72. package/dist/map-state-updaters.js +0 -438
  73. package/dist/map-state.js +0 -35
  74. package/dist/map-style-updaters.js +0 -661
  75. package/dist/map-style.js +0 -34
  76. package/dist/merger-handler.js +0 -105
  77. package/dist/middleware.js +0 -27
  78. package/dist/provider-state-updaters.js +0 -466
  79. package/dist/provider-state.js +0 -35
  80. package/dist/root.js +0 -207
  81. package/dist/ui-state-updaters.js +0 -887
  82. package/dist/ui-state.js +0 -37
  83. package/dist/vis-state-merger.js +0 -1032
  84. package/dist/vis-state-selectors.js +0 -30
  85. package/dist/vis-state-updaters.js +0 -3859
  86. package/dist/vis-state.js +0 -36
@@ -0,0 +1,1215 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.VIS_STATE_MERGERS = void 0;
9
+ exports.createLayerFromConfig = createLayerFromConfig;
10
+ exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
11
+ exports.isSavedLayerConfigV1 = isSavedLayerConfigV1;
12
+ exports.mergeAnimationConfig = mergeAnimationConfig;
13
+ exports.mergeAnnotations = mergeAnnotations;
14
+ exports.mergeDatasetsByOrder = mergeDatasetsByOrder;
15
+ exports.mergeEditor = mergeEditor;
16
+ exports.mergeEffects = mergeEffects;
17
+ exports.mergeFilters = mergeFilters;
18
+ exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
19
+ exports.mergeInteractions = mergeInteractions;
20
+ exports.mergeLayerBlending = mergeLayerBlending;
21
+ exports.mergeLayerOrder = mergeLayerOrder;
22
+ exports.mergeLayers = mergeLayers;
23
+ exports.mergeOverlayBlending = mergeOverlayBlending;
24
+ exports.mergeSplitMaps = mergeSplitMaps;
25
+ exports.parseLayerConfig = parseLayerConfig;
26
+ exports.replaceFilterDatasetIds = replaceFilterDatasetIds;
27
+ exports.serializeEffect = serializeEffect;
28
+ exports.serializeFilter = serializeFilter;
29
+ exports.serializeLayer = serializeLayer;
30
+ exports.serializeVisState = serializeVisState;
31
+ exports.validateColumn = validateColumn;
32
+ exports.validateLayerWithData = validateLayerWithData;
33
+ exports.validateLayersByDatasets = validateLayersByDatasets;
34
+ exports.validateSavedLayerColumns = validateSavedLayerColumns;
35
+ exports.validateSavedTextLabel = validateSavedTextLabel;
36
+ exports.validateSavedVisualChannels = validateSavedVisualChannels;
37
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
38
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
39
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
40
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
41
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
42
+ var _uniq = _interopRequireDefault(require("es-toolkit/compat/uniq"));
43
+ var _pick = _interopRequireDefault(require("es-toolkit/compat/pick"));
44
+ var _flattenDeep = _interopRequireDefault(require("es-toolkit/compat/flattenDeep"));
45
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
46
+ var _utils = require("@kepler.gl/utils");
47
+ var _effects = require("@kepler.gl/effects");
48
+ var _commonUtils = require("@kepler.gl/common-utils");
49
+ var _constants = require("@kepler.gl/constants");
50
+ var _schemas = require("@kepler.gl/schemas");
51
+ var _table = require("@kepler.gl/table");
52
+ var _layerUtils = require("./layer-utils");
53
+ var _excluded = ["enabled"];
54
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
55
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
56
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
57
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof3(i) ? i : i + ""; }
58
+ function _toPrimitive(t, r) { if ("object" != _typeof3(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof3(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
59
+ 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; }
60
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
61
+ // Copyright contributors to the kepler.gl project
62
+ /**
63
+ * Merge loaded filters with current state, if no fields or data are loaded
64
+ * save it for later
65
+ *
66
+ */
67
+ function mergeFilters(state, filtersToMerge, fromConfig) {
68
+ var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
69
+ return l.id;
70
+ }) : state.preserveFilterOrder;
71
+ if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
72
+ return state;
73
+ }
74
+ var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
75
+ validated = _validateFiltersUpdat.validated,
76
+ failed = _validateFiltersUpdat.failed,
77
+ updatedDatasets = _validateFiltersUpdat.updatedDatasets;
78
+ var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder);
79
+
80
+ // merge filter with existing
81
+ updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
82
+ updatedFilters = (0, _table.assignGpuChannels)(updatedFilters);
83
+ // filter data
84
+ var datasetsToFilter = (0, _uniq["default"])((0, _flattenDeep["default"])(validated.map(function (f) {
85
+ return f.dataId;
86
+ })));
87
+ var filtered = (0, _utils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
88
+ return _objectSpread(_objectSpread({}, state), {}, {
89
+ filters: updatedFilters,
90
+ datasets: filtered,
91
+ preserveFilterOrder: preserveFilterOrder,
92
+ filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
93
+ });
94
+ }
95
+
96
+ // replace dataId in saved Filter
97
+ function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
98
+ var replaced = [];
99
+ savedFilter.forEach(function (filter) {
100
+ if (filter.dataId.includes(dataId)) {
101
+ var _filter$plotType;
102
+ var newDataId = filter.dataId.map(function (d) {
103
+ return d === dataId ? dataIdToUse : d;
104
+ });
105
+ var plotType;
106
+ // TODO: more generic approach to save plotType.colorsByDataId
107
+ if ((_filter$plotType = filter.plotType) !== null && _filter$plotType !== void 0 && (_filter$plotType = _filter$plotType.colorsByDataId) !== null && _filter$plotType !== void 0 && _filter$plotType[dataId]) {
108
+ var _filter$plotType2;
109
+ // replace colorByDataId in filter.plotType
110
+ var _ref = ((_filter$plotType2 = filter.plotType) === null || _filter$plotType2 === void 0 ? void 0 : _filter$plotType2.colorsByDataId) || {},
111
+ color = _ref[dataId],
112
+ rest = (0, _objectWithoutProperties2["default"])(_ref, [dataId].map(_toPropertyKey));
113
+ plotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
114
+ colorsByDataId: _objectSpread(_objectSpread({}, rest), {}, (0, _defineProperty2["default"])({}, dataIdToUse, color))
115
+ });
116
+ }
117
+ replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
118
+ dataId: newDataId
119
+ }, plotType ? {
120
+ plotType: plotType
121
+ } : {}));
122
+ }
123
+ });
124
+ return replaced.length ? replaced : null;
125
+ }
126
+ function isSavedLayerConfigV1(layerConfig) {
127
+ // exported layer configuration contains visualChannels property
128
+ return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
129
+ }
130
+ function parseLayerConfig(schema, layerConfig) {
131
+ var _schema$parseSavedCon;
132
+ // assume the layer config is current version
133
+ var savedConfig = {
134
+ version: _schemas.CURRENT_VERSION,
135
+ config: {
136
+ visState: {
137
+ layers: [layerConfig],
138
+ layerOrder: [layerConfig.id]
139
+ }
140
+ }
141
+ };
142
+ return (_schema$parseSavedCon = schema.parseSavedConfig(savedConfig)) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.visState) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.layers) === null || _schema$parseSavedCon === void 0 ? void 0 : _schema$parseSavedCon[0];
143
+ }
144
+ function insertItemBasedOnPreservedOrder(currentItems, items) {
145
+ var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
146
+ var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
147
+ var newItems = (0, _toConsumableArray2["default"])(currentItems);
148
+ var _iterator = _createForOfIteratorHelper(items),
149
+ _step;
150
+ try {
151
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
152
+ var item = _step.value;
153
+ var expectedIdx = preservedOrder.indexOf(item.id);
154
+ // insertAt the end by default
155
+ var insertAt = defaultStart ? 0 : newItems.length;
156
+ if (expectedIdx > 0) {
157
+ // look for layer to insert after
158
+ var i = expectedIdx + 1;
159
+ var preceedIdx = -1;
160
+ var _loop = function _loop() {
161
+ // keep looking for preceed layer that is already loaded
162
+ var preceedItemId = preservedOrder[i - 1];
163
+ preceedIdx = newItems.findIndex(function (d) {
164
+ return d.id === preceedItemId;
165
+ });
166
+ };
167
+ while (i-- > 0 && preceedIdx < 0) {
168
+ _loop();
169
+ }
170
+ if (preceedIdx > -1) {
171
+ // if found
172
+ insertAt = preceedIdx + 1;
173
+ }
174
+ }
175
+ newItems = (0, _utils.arrayInsert)(newItems, insertAt, item);
176
+ }
177
+ } catch (err) {
178
+ _iterator.e(err);
179
+ } finally {
180
+ _iterator.f();
181
+ }
182
+ return newItems;
183
+ }
184
+ function createLayerFromConfig(state, layerConfig) {
185
+ // check if the layer config is parsed
186
+ var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
187
+ if (!parsedLayerConfig) {
188
+ return null;
189
+ }
190
+ // first validate config against dataset
191
+ var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
192
+ allowEmptyColumn: true
193
+ }),
194
+ validated = _validateLayersByData.validated,
195
+ failed = _validateLayersByData.failed;
196
+ if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
197
+ // failed
198
+ return null;
199
+ }
200
+ var newLayer = validated[0];
201
+ newLayer.updateLayerDomain(state.datasets);
202
+ return newLayer;
203
+ }
204
+
205
+ /**
206
+ * Get loaded filter from state
207
+ */
208
+ function serializeFilter(newFilter, schema) {
209
+ var _serializedVisState$f;
210
+ var serializedVisState = serializeVisState({
211
+ filters: [newFilter]
212
+ }, schema);
213
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$f = serializedVisState.filters) === null || _serializedVisState$f === void 0 ? void 0 : _serializedVisState$f[0];
214
+ }
215
+
216
+ /**
217
+ * Get loaded layer from state
218
+ */
219
+ function serializeLayer(newLayer, schema) {
220
+ var _serializedVisState$l;
221
+ var serializedVisState = serializeVisState({
222
+ layers: [newLayer],
223
+ layerOrder: [newLayer.id]
224
+ }, schema);
225
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
226
+ }
227
+
228
+ /**
229
+ * Get loaded effect from state
230
+ */
231
+ function serializeEffect(newEffect, schema) {
232
+ var _serializedVisState$e;
233
+ var serializedVisState = serializeVisState({
234
+ effects: [newEffect],
235
+ effectOrder: [newEffect.id]
236
+ }, schema);
237
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$e = serializedVisState.effects) === null || _serializedVisState$e === void 0 ? void 0 : _serializedVisState$e[0];
238
+ }
239
+
240
+ /**
241
+ * Get vis state config
242
+ */
243
+ function serializeVisState(visState, schema) {
244
+ var _schema$parseSavedCon2;
245
+ var savedState = schema.getConfigToSave({
246
+ visState: visState
247
+ });
248
+ return savedState ? (_schema$parseSavedCon2 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon2 === void 0 ? void 0 : _schema$parseSavedCon2.visState : undefined;
249
+ }
250
+ /**
251
+ * Merge layers from de-serialized state, if no fields or data are loaded
252
+ * save it for later
253
+ *
254
+ */
255
+ function mergeLayers(state) {
256
+ var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
257
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
258
+ var preserveLayerOrder = fromConfig ? (0, _layerUtils.getLayerOrderFromLayers)(layersToMerge) : state.preserveLayerOrder;
259
+ if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
260
+ return state;
261
+ }
262
+ // don't merge layer if dataset is being merged
263
+ var unmerged = [];
264
+ var toMerge = [];
265
+ layersToMerge.forEach(function (l) {
266
+ var _l$config;
267
+ if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
268
+ unmerged.push(l);
269
+ } else {
270
+ toMerge.push(l);
271
+ }
272
+ });
273
+ var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
274
+ mergedLayer = _validateLayersByData2.validated,
275
+ failed = _validateLayersByData2.failed;
276
+ unmerged.push.apply(unmerged, (0, _toConsumableArray2["default"])(failed));
277
+ // put new layers in front of current layers
278
+ var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
279
+ newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
280
+ newLayers = _insertLayerAtRightOr.newLayers;
281
+ var mergedState = _objectSpread(_objectSpread({}, state), {}, {
282
+ layers: newLayers,
283
+ layerOrder: newLayerOrder,
284
+ preserveLayerOrder: preserveLayerOrder,
285
+ layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), unmerged)
286
+ });
287
+
288
+ // Apply pending layerOrder with groups if layers are now available
289
+ if (mergedState.layerOrderToBeMerged && mergedState.layers.length > 0) {
290
+ var savedOrder = mergedState.layerOrderToBeMerged;
291
+ mergedState = mergeLayerOrder(mergedState, savedOrder);
292
+ // Keep savedLayerOrder available for future deferred layers
293
+ if (mergedState.layerToBeMerged.length > 0) {
294
+ mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
295
+ layerOrderToBeMerged: savedOrder
296
+ });
297
+ }
298
+ }
299
+ return mergedState;
300
+ }
301
+ function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
302
+ var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
303
+ if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
304
+ return {
305
+ newLayers: currentLayers,
306
+ newLayerOrder: currentOrder
307
+ };
308
+ }
309
+ var currentLayerQueue = currentOrder.filter(function (entry) {
310
+ return typeof entry === 'string';
311
+ }).map(function (id) {
312
+ return (0, _utils.findById)(id)(currentLayers);
313
+ }).filter(function (layer) {
314
+ return Boolean(layer);
315
+ });
316
+ var newLayers = currentLayers.concat(layersToInsert);
317
+ var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true);
318
+ var newFlatLayerOrder = (0, _layerUtils.getLayerOrderFromLayers)(newLayerOrderQueue);
319
+
320
+ // If no groups exist in current order, just use the new flat order
321
+ var hasGroups = currentOrder.some(function (entry) {
322
+ return (0, _utils.isPlainObject)(entry);
323
+ });
324
+ if (!hasGroups) {
325
+ return {
326
+ newLayerOrder: newFlatLayerOrder,
327
+ newLayers: newLayers
328
+ };
329
+ }
330
+
331
+ // Rebuild layerOrder preserving groups in their relative positions.
332
+ // Replace each string entry with its updated position from newFlatLayerOrder,
333
+ // and keep groups as-is.
334
+ var existingFlatIds = new Set(currentOrder.filter(function (entry) {
335
+ return typeof entry === 'string';
336
+ }));
337
+ var newInsertedIds = newFlatLayerOrder.filter(function (id) {
338
+ return !existingFlatIds.has(id);
339
+ });
340
+
341
+ // Rebuild: walk through currentOrder, replace string entries with their
342
+ // new position equivalents from newFlatLayerOrder, then append any newly inserted layers
343
+ var result = [];
344
+ var flatQueue = (0, _toConsumableArray2["default"])(newFlatLayerOrder.filter(function (id) {
345
+ return existingFlatIds.has(id);
346
+ }));
347
+ var flatIdx = 0;
348
+ var _iterator2 = _createForOfIteratorHelper(currentOrder),
349
+ _step2;
350
+ try {
351
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
352
+ var entry = _step2.value;
353
+ if ((0, _utils.isPlainObject)(entry)) {
354
+ result.push(entry);
355
+ } else {
356
+ // Replace with corresponding entry from reordered flat list
357
+ if (flatIdx < flatQueue.length) {
358
+ result.push(flatQueue[flatIdx]);
359
+ flatIdx++;
360
+ }
361
+ }
362
+ }
363
+
364
+ // Append any newly inserted layers at the front (they are new)
365
+ } catch (err) {
366
+ _iterator2.e(err);
367
+ } finally {
368
+ _iterator2.f();
369
+ }
370
+ return {
371
+ newLayerOrder: [].concat((0, _toConsumableArray2["default"])(newInsertedIds), result),
372
+ newLayers: newLayers
373
+ };
374
+ }
375
+
376
+ /**
377
+ * Merge saved layerOrder with current state to restore layer groups.
378
+ * Called after layers have been merged. If the saved config contains a layerOrder
379
+ * with groups, this replaces the flat layerOrder with the saved hierarchical one,
380
+ * filtering out any layer IDs that don't exist in the current state.
381
+ */
382
+ function mergeLayerOrder(state, savedLayerOrder, fromConfig) {
383
+ if (!savedLayerOrder || !Array.isArray(savedLayerOrder) || savedLayerOrder.length === 0) {
384
+ return state;
385
+ }
386
+
387
+ // Check if the saved layerOrder contains any groups
388
+ var hasGroups = savedLayerOrder.some(function (entry) {
389
+ return (0, _utils.isPlainObject)(entry);
390
+ });
391
+ if (!hasGroups) {
392
+ // No groups - the layer merger already handled ordering via preserveLayerOrder
393
+ return state;
394
+ }
395
+
396
+ // If layers haven't been merged yet, store for later
397
+ if (state.layers.length === 0) {
398
+ return _objectSpread(_objectSpread({}, state), {}, {
399
+ layerOrderToBeMerged: savedLayerOrder
400
+ });
401
+ }
402
+
403
+ // Build a set of valid layer IDs from current state
404
+ var validLayerIds = new Set(state.layers.map(function (l) {
405
+ return l.id;
406
+ }));
407
+
408
+ // Recursively filter the saved layerOrder to only include valid layers
409
+ function filterLayerOrder(order) {
410
+ var result = [];
411
+ var _iterator3 = _createForOfIteratorHelper(order),
412
+ _step3;
413
+ try {
414
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
415
+ var entry = _step3.value;
416
+ if ((0, _utils.isPlainObject)(entry)) {
417
+ var group = entry;
418
+ var filteredGroupOrder = filterLayerOrder(group.layerOrder);
419
+ // Keep the group even if empty (user may want the empty group)
420
+ result.push(_objectSpread(_objectSpread({}, group), {}, {
421
+ layerOrder: filteredGroupOrder
422
+ }));
423
+ } else if (typeof entry === 'string' && validLayerIds.has(entry)) {
424
+ result.push(entry);
425
+ }
426
+ }
427
+ } catch (err) {
428
+ _iterator3.e(err);
429
+ } finally {
430
+ _iterator3.f();
431
+ }
432
+ return result;
433
+ }
434
+ var restoredLayerOrder = filterLayerOrder(savedLayerOrder);
435
+
436
+ // Find any layers in the current state that aren't in the restored order
437
+ // (could happen if layers were added between save and load)
438
+ var layerIdsInRestored = new Set();
439
+ function collectIds(order) {
440
+ var _iterator4 = _createForOfIteratorHelper(order),
441
+ _step4;
442
+ try {
443
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
444
+ var entry = _step4.value;
445
+ if ((0, _utils.isPlainObject)(entry)) {
446
+ collectIds(entry.layerOrder);
447
+ } else if (typeof entry === 'string') {
448
+ layerIdsInRestored.add(entry);
449
+ }
450
+ }
451
+ } catch (err) {
452
+ _iterator4.e(err);
453
+ } finally {
454
+ _iterator4.f();
455
+ }
456
+ }
457
+ collectIds(restoredLayerOrder);
458
+
459
+ // Add any missing layers at the top
460
+ var missingLayers = state.layers.filter(function (l) {
461
+ return !layerIdsInRestored.has(l.id);
462
+ }).map(function (l) {
463
+ return l.id;
464
+ });
465
+ return _objectSpread(_objectSpread({}, state), {}, {
466
+ layerOrder: [].concat((0, _toConsumableArray2["default"])(missingLayers), (0, _toConsumableArray2["default"])(restoredLayerOrder)),
467
+ layerOrderToBeMerged: null
468
+ });
469
+ }
470
+
471
+ /**
472
+ * Merge interactions with saved config
473
+ *
474
+ */
475
+ function mergeInteractions(state, interactionToBeMerged) {
476
+ var merged = {};
477
+ var unmerged = {};
478
+ if (interactionToBeMerged) {
479
+ Object.keys(interactionToBeMerged).forEach(function (key) {
480
+ if (!state.interactionConfig[key]) {
481
+ return;
482
+ }
483
+ var currentConfig = key === 'tooltip' || key === 'brush' || key === 'geocoder' ? state.interactionConfig[key].config : null;
484
+ var _ref2 = interactionToBeMerged[key] || {},
485
+ enabled = _ref2.enabled,
486
+ configSaved = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
487
+ var configToMerge = configSaved;
488
+ if (key === 'tooltip') {
489
+ var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
490
+ mergedTooltip = _mergeInteractionTool.mergedTooltip,
491
+ unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
492
+
493
+ // merge new dataset tooltips with original dataset tooltips
494
+ configToMerge = {
495
+ fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
496
+ };
497
+ if (Object.keys(unmergedTooltip).length) {
498
+ // @ts-expect-error
499
+ unmerged.tooltip = {
500
+ fieldsToShow: unmergedTooltip,
501
+ enabled: Boolean(enabled)
502
+ };
503
+ }
504
+ }
505
+ merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
506
+ enabled: Boolean(enabled)
507
+ }, currentConfig ? {
508
+ config: (0, _pick["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
509
+ } : {});
510
+ });
511
+ }
512
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
513
+ interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
514
+ interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
515
+ });
516
+ return nextState;
517
+ }
518
+ function combineInteractionConfigs(configs) {
519
+ var combined = _objectSpread({}, configs[0]);
520
+ // handle each property key of an `InteractionConfig`, e.g. tooltip, geocoder, brush, coordinate
521
+ // by combining values for each among all passed in configs
522
+ var _loop2 = function _loop2(key) {
523
+ var toBeCombinedProps = configs.map(function (c) {
524
+ return c[key];
525
+ });
526
+
527
+ // all of these have an enabled boolean
528
+ combined[key] = {
529
+ // are any of the configs' enabled values true?
530
+ enabled: toBeCombinedProps.some(function (p) {
531
+ return p === null || p === void 0 ? void 0 : p.enabled;
532
+ })
533
+ };
534
+ if (key === 'tooltip') {
535
+ // are any of the configs' compareMode values true?
536
+ combined[key].compareMode = toBeCombinedProps.some(function (p) {
537
+ return p === null || p === void 0 ? void 0 : p.compareMode;
538
+ });
539
+
540
+ // return the compare type mode, it will be either absolute or relative
541
+ combined[key].compareType = getValueWithHighestOccurrence(toBeCombinedProps.map(function (p) {
542
+ return p.compareType;
543
+ }));
544
+
545
+ // combine fieldsToShow among all dataset ids
546
+ combined[key].fieldsToShow = toBeCombinedProps.map(function (p) {
547
+ return p.fieldsToShow;
548
+ }).reduce(function (acc, nextFieldsToShow) {
549
+ var _loop3 = function _loop3(nextDataIdKey) {
550
+ var nextTooltipFields = nextFieldsToShow[nextDataIdKey];
551
+ if (!acc[nextDataIdKey]) {
552
+ // if the dataset id is not present in the accumulator
553
+ // then add it with its tooltip fields
554
+ acc[nextDataIdKey] = nextTooltipFields;
555
+ } else {
556
+ // otherwise the dataset id is already present in the accumulator
557
+ // so only add the next tooltip fields for this dataset's array if they are not already present,
558
+ // using the tooltipField.name property for uniqueness
559
+ nextTooltipFields.forEach(function (nextTF) {
560
+ if (!acc[nextDataIdKey].find(function (_ref3) {
561
+ var name = _ref3.name;
562
+ return nextTF.name === name;
563
+ })) {
564
+ acc[nextDataIdKey].push(nextTF);
565
+ }
566
+ });
567
+ }
568
+ };
569
+ for (var nextDataIdKey in nextFieldsToShow) {
570
+ _loop3(nextDataIdKey);
571
+ }
572
+ return acc;
573
+ }, {});
574
+ }
575
+ if (key === 'brush') {
576
+ var _aggregate;
577
+ // keep the biggest brush size
578
+ combined[key].size = (_aggregate = (0, _utils.aggregate)(toBeCombinedProps, _constants.AGGREGATION_TYPES.maximum, function (p) {
579
+ return p.size;
580
+ })) !== null && _aggregate !== void 0 ? _aggregate : null;
581
+ }
582
+ if (key === 'geocoder') {
583
+ combined[key].limitSearch = toBeCombinedProps.some(function (p) {
584
+ return p === null || p === void 0 ? void 0 : p.limitSearch;
585
+ });
586
+ }
587
+ };
588
+ for (var key in combined) {
589
+ _loop2(key);
590
+ }
591
+ return combined;
592
+ }
593
+ function savedUnmergedInteraction(state, unmerged) {
594
+ var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _unmerged$tooltip3;
595
+ if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
596
+ return state.interactionToBeMerged;
597
+ }
598
+ return {
599
+ tooltip: _objectSpread(_objectSpread(_objectSpread({}, state.interactionToBeMerged.tooltip), typeof (unmerged === null || unmerged === void 0 || (_unmerged$tooltip2 = unmerged.tooltip) === null || _unmerged$tooltip2 === void 0 ? void 0 : _unmerged$tooltip2.enabled) === 'boolean' ? {
600
+ enabled: unmerged.tooltip.enabled
601
+ } : {}), {}, {
602
+ fieldsToShow: _objectSpread(_objectSpread({}, (_state$interactionToB = state.interactionToBeMerged) === null || _state$interactionToB === void 0 || (_state$interactionToB = _state$interactionToB.tooltip) === null || _state$interactionToB === void 0 ? void 0 : _state$interactionToB.fieldsToShow), unmerged === null || unmerged === void 0 || (_unmerged$tooltip3 = unmerged.tooltip) === null || _unmerged$tooltip3 === void 0 ? void 0 : _unmerged$tooltip3.fieldsToShow)
603
+ })
604
+ };
605
+ }
606
+ function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
607
+ var _interactionConfig$to;
608
+ if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
609
+ var _interactionConfig$to2;
610
+ return _objectSpread(_objectSpread({}, interactionConfig), {}, {
611
+ tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
612
+ fieldsToShow: (0, _defineProperty2["default"])({}, dataIdToReplace, interactionConfig === null || interactionConfig === void 0 || (_interactionConfig$to2 = interactionConfig.tooltip) === null || _interactionConfig$to2 === void 0 ? void 0 : _interactionConfig$to2.fieldsToShow[dataId])
613
+ })
614
+ });
615
+ }
616
+ return null;
617
+ }
618
+
619
+ /**
620
+ * Merge splitMaps config with current visStete.
621
+ * 1. if current map is split, but splitMap DOESNOT contain maps
622
+ * : don't merge anything
623
+ * 2. if current map is NOT split, but splitMaps contain maps
624
+ * : add to splitMaps, and add current layers to splitMaps
625
+ */
626
+ function mergeSplitMaps(state) {
627
+ var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
628
+ var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
629
+ var unmerged = [];
630
+ splitMaps.forEach(function (sm, i) {
631
+ var entries = Object.entries(sm.layers);
632
+ if (entries.length > 0) {
633
+ entries.forEach(function (_ref4) {
634
+ var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
635
+ id = _ref5[0],
636
+ value = _ref5[1];
637
+ // check if layer exists
638
+ var pushTo = state.layers.find(function (l) {
639
+ return l.id === id;
640
+ }) ? merged : unmerged;
641
+
642
+ // create map panel if current map is not split
643
+ pushTo[i] = pushTo[i] || _objectSpread(_objectSpread({}, sm), {}, {
644
+ layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
645
+ });
646
+ pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
647
+ });
648
+ } else {
649
+ // We are merging if there are no layers in both split map
650
+ merged.push(sm);
651
+ }
652
+ });
653
+ return _objectSpread(_objectSpread({}, state), {}, {
654
+ splitMaps: merged,
655
+ splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
656
+ });
657
+ }
658
+
659
+ /**
660
+ * Merge effects with saved config
661
+ */
662
+ function mergeEffects(state, effects, fromConfig) {
663
+ var newEffects = [].concat((0, _toConsumableArray2["default"])(state.effects), (0, _toConsumableArray2["default"])((effects || []).map(function (effect) {
664
+ return fromConfig ? (0, _effects.createEffect)(_deepmerge["default"].all([effect, {
665
+ // collapse all panels when loading effects
666
+ isConfigActive: false
667
+ }])) : effect;
668
+ }).filter(function (effect) {
669
+ return Boolean(effect && effect.isValidToSave());
670
+ })));
671
+ return _objectSpread(_objectSpread({}, state), {}, {
672
+ effects: newEffects,
673
+ effectOrder: newEffects.map(function (effect) {
674
+ return effect.id;
675
+ })
676
+ });
677
+ }
678
+
679
+ /**
680
+ * Merge annotations with saved config
681
+ */
682
+ function mergeAnnotations(state, annotations) {
683
+ if (!annotations || !annotations.length) {
684
+ return state;
685
+ }
686
+ var existingIds = new Set(state.annotations.map(function (a) {
687
+ return a.id;
688
+ }));
689
+ var validAnnotations = annotations.filter(function (a) {
690
+ return a && a.id && !existingIds.has(a.id) && (0, _constants.isAnnotationKind)(a.kind) && Array.isArray(a.anchorPoint) && a.anchorPoint.length === 2;
691
+ }).map(function (a) {
692
+ return _objectSpread({
693
+ isVisible: true,
694
+ autoSize: true,
695
+ autoSizeY: true,
696
+ label: '',
697
+ lineColor: _constants.INITIAL_ANNOTATION_LINE_COLOR,
698
+ lineWidth: _constants.INITIAL_ANNOTATION_LINE_WIDTH,
699
+ textWidth: 0,
700
+ textHeight: 0
701
+ }, a);
702
+ });
703
+ if (!validAnnotations.length) {
704
+ return state;
705
+ }
706
+ return _objectSpread(_objectSpread({}, state), {}, {
707
+ annotations: [].concat((0, _toConsumableArray2["default"])(state.annotations), (0, _toConsumableArray2["default"])(validAnnotations))
708
+ });
709
+ }
710
+
711
+ /**
712
+ * Merge interactionConfig.tooltip with saved config,
713
+ * validate fieldsToShow
714
+ *
715
+ * @param state
716
+ * @param tooltipConfig
717
+ * @return - {mergedTooltip: {}, unmergedTooltip: {}}
718
+ */
719
+ function mergeInteractionTooltipConfig(state) {
720
+ var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
721
+ var unmergedTooltip = {};
722
+ var mergedTooltip = {};
723
+ if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
724
+ return {
725
+ mergedTooltip: mergedTooltip,
726
+ unmergedTooltip: unmergedTooltip
727
+ };
728
+ }
729
+ var _loop4 = function _loop4() {
730
+ if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
731
+ // is not yet loaded
732
+ unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
733
+ } else {
734
+ // if dataset is loaded
735
+ var allFields = state.datasets[dataId].fields.map(function (d) {
736
+ return d.name;
737
+ });
738
+ var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
739
+ return allFields.includes(field.name);
740
+ });
741
+ mergedTooltip[dataId] = foundFieldsToShow;
742
+ }
743
+ };
744
+ for (var dataId in tooltipConfig.fieldsToShow) {
745
+ _loop4();
746
+ }
747
+ return {
748
+ mergedTooltip: mergedTooltip,
749
+ unmergedTooltip: unmergedTooltip
750
+ };
751
+ }
752
+ /**
753
+ * Merge layerBlending with saved
754
+ *
755
+ */
756
+ function mergeLayerBlending(state, layerBlending) {
757
+ if (layerBlending && _constants.LAYER_BLENDINGS[layerBlending]) {
758
+ return _objectSpread(_objectSpread({}, state), {}, {
759
+ layerBlending: layerBlending
760
+ });
761
+ }
762
+ return state;
763
+ }
764
+
765
+ /**
766
+ * Combines multiple layer blending configs into a single string
767
+ * by returning the one with the highest occurrence
768
+ */
769
+ function combineLayerBlendingConfigs(configs) {
770
+ // return the mode of the layer blending type
771
+ return getValueWithHighestOccurrence(configs);
772
+ }
773
+
774
+ /**
775
+ * Merge overlayBlending with saved
776
+ */
777
+ function mergeOverlayBlending(state, overlayBlending) {
778
+ if (overlayBlending && _constants.OVERLAY_BLENDINGS[overlayBlending]) {
779
+ return _objectSpread(_objectSpread({}, state), {}, {
780
+ overlayBlending: overlayBlending
781
+ });
782
+ }
783
+ return state;
784
+ }
785
+
786
+ /**
787
+ * Combines multiple overlay blending configs into a single string
788
+ * by returning the one with the highest occurrence
789
+ **/
790
+ function combineOverlayBlendingConfigs(configs) {
791
+ // return the mode of the overlay blending type
792
+ return getValueWithHighestOccurrence(configs);
793
+ }
794
+
795
+ /**
796
+ * Merge animation config
797
+ */
798
+ function mergeAnimationConfig(state, animation) {
799
+ if (animation && animation.currentTime) {
800
+ return _objectSpread(_objectSpread({}, state), {}, {
801
+ animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
802
+ domain: null
803
+ })
804
+ });
805
+ }
806
+ return state;
807
+ }
808
+ function combineAnimationConfigs(configs) {
809
+ var _aggregate2, _aggregate3;
810
+ // get the smallest values of currentTime and speed among all configs
811
+ return {
812
+ currentTime: (_aggregate2 = (0, _utils.aggregate)(configs, _constants.AGGREGATION_TYPES.minimum, function (c) {
813
+ return c.currentTime;
814
+ })) !== null && _aggregate2 !== void 0 ? _aggregate2 : null,
815
+ speed: (_aggregate3 = (0, _utils.aggregate)(configs, _constants.AGGREGATION_TYPES.minimum, function (c) {
816
+ return c.speed;
817
+ })) !== null && _aggregate3 !== void 0 ? _aggregate3 : null
818
+ };
819
+ }
820
+
821
+ /**
822
+ * Validate saved layer columns with new data,
823
+ * update fieldIdx based on new fields
824
+ *
825
+ * @param fields
826
+ * @param savedCols
827
+ * @param emptyCols
828
+ * @param options
829
+ * @return - validated columns or null
830
+ */
831
+
832
+ function validateSavedLayerColumns(fields) {
833
+ var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
834
+ var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
835
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
836
+ // Prepare columns for the validator
837
+ var columns = {};
838
+ var _loop5 = function _loop5() {
839
+ var key = _Object$keys[_i];
840
+ columns[key] = _objectSpread({}, emptyCols[key]);
841
+ var saved = savedCols[key];
842
+ if (saved) {
843
+ var fieldIdx = fields.findIndex(function (_ref6) {
844
+ var name = _ref6.name;
845
+ return name === saved;
846
+ });
847
+ if (fieldIdx > -1) {
848
+ // update found columns
849
+ columns[key].fieldIdx = fieldIdx;
850
+ columns[key].value = saved;
851
+ }
852
+ }
853
+ };
854
+ for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
855
+ _loop5();
856
+ }
857
+
858
+ // find actual column fieldIdx, in case it has changed
859
+ var allColFound = Object.keys(columns).every(function (key) {
860
+ return validateColumn(columns[key], columns, fields);
861
+ });
862
+ var rv = allColFound ? columns : null;
863
+ if (options.throwOnError) {
864
+ var requiredColumns = Object.keys(emptyCols).filter(function (k) {
865
+ return !emptyCols[k].optional;
866
+ });
867
+ var missingColumns = requiredColumns.filter(function (k) {
868
+ return !(columns !== null && columns !== void 0 && columns[k].value);
869
+ });
870
+ if (missingColumns.length) {
871
+ throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
872
+ }
873
+ var configColumns = Object.keys(savedCols);
874
+ var invalidColumns = configColumns.filter(function (k) {
875
+ var _columns$k;
876
+ return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
877
+ });
878
+ if (invalidColumns.length) {
879
+ throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
880
+ }
881
+ }
882
+ return rv;
883
+ }
884
+
885
+ /**
886
+ * Validate layer column
887
+ */
888
+ function validateColumn(column, columns, allFields) {
889
+ if (column.optional || column.value) {
890
+ return true;
891
+ }
892
+ if (column.validator) {
893
+ return column.validator(column, columns, allFields);
894
+ }
895
+ return false;
896
+ }
897
+
898
+ /**
899
+ * Validate saved text label config with new data
900
+ * refer to vis-state-schema.js TextLabelSchemaV1
901
+ *
902
+ * @param {Array<Object>} fields
903
+ * @param {Object} savedTextLabel
904
+ * @param {Object} options
905
+ * @return {Object} - validated textlabel
906
+ */
907
+ function validateSavedTextLabel(fields, _ref7, savedTextLabel) {
908
+ var _ref8 = (0, _slicedToArray2["default"])(_ref7, 1),
909
+ layerTextLabel = _ref8[0];
910
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
911
+ var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
912
+
913
+ // validate field
914
+ return savedTextLabels.map(function (textLabel) {
915
+ var field = textLabel.field ? fields.find(function (fd) {
916
+ return Object.keys(textLabel.field).every(function (key) {
917
+ return textLabel.field[key] === fd[key];
918
+ });
919
+ }) : null;
920
+ if (field === undefined && options.throwOnError) {
921
+ throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
922
+ }
923
+ return Object.keys(layerTextLabel).reduce(function (accu, key) {
924
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
925
+ }, {});
926
+ });
927
+ }
928
+
929
+ /**
930
+ * Saved visual channel field/scale may live in any of:
931
+ * - `config[key]` after schema parse (VisualChannelSchemaV1 folds channels into config)
932
+ * - `visualChannels[key]` as a sibling of `config` (unparsed addDataToMap payload)
933
+ * - `config.visualChannels[key]` (common mistake of nesting visualChannels inside config)
934
+ *
935
+ * Without this lookup, programmatic GeoJSON strokeColorField never binds and
936
+ * strokeColorDomain stays at the default `[0, 1]` (kepler.gl #3061).
937
+ */
938
+ function getSavedVisualChannelValue(savedLayer, key) {
939
+ var config = savedLayer.config;
940
+ if (config && config[key] !== undefined) {
941
+ return config[key];
942
+ }
943
+ var channels = savedLayer.visualChannels || config && config.visualChannels;
944
+ if (channels && (0, _typeof2["default"])(channels) === 'object' && channels[key] !== undefined) {
945
+ return channels[key];
946
+ }
947
+ return undefined;
948
+ }
949
+
950
+ /**
951
+ * Validate saved visual channels config with new data,
952
+ * refer to vis-state-schema.js VisualChannelSchemaV1
953
+ */
954
+ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
955
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
956
+ Object.values(newLayer.visualChannels).forEach(function (_ref9) {
957
+ var field = _ref9.field,
958
+ scale = _ref9.scale,
959
+ key = _ref9.key;
960
+ var savedField = getSavedVisualChannelValue(savedLayer, field);
961
+ var savedScale = getSavedVisualChannelValue(savedLayer, scale);
962
+ var foundField;
963
+ if (savedField !== null && savedField !== void 0 && savedField.name) {
964
+ foundField = fields.find(function (fd) {
965
+ return fd.name === savedField.name;
966
+ });
967
+ }
968
+ var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, foundField) : {}), savedScale ? (0, _defineProperty2["default"])({}, scale, savedScale) : {});
969
+ if (Object.keys(foundChannel).length) {
970
+ newLayer.updateLayerConfig(foundChannel);
971
+ }
972
+ newLayer.validateVisualChannel(key);
973
+ if (options.throwOnError) {
974
+ var _newLayer$config$fiel;
975
+ var fieldName = savedField === null || savedField === void 0 ? void 0 : savedField.name;
976
+ if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
977
+ throw new Error("Layer has invalid visual channel field: ".concat(field));
978
+ }
979
+ }
980
+ });
981
+ return newLayer;
982
+ }
983
+ function validateLayersByDatasets(datasets, layerClasses) {
984
+ var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
985
+ var options = arguments.length > 3 ? arguments[3] : undefined;
986
+ var validated = [];
987
+ var failed = [];
988
+ layers.forEach(function (layer) {
989
+ var _layer$config;
990
+ var validateLayer = null;
991
+ if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
992
+ if (datasets[layer.config.dataId]) {
993
+ // datasets are already loaded
994
+ validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
995
+ }
996
+ }
997
+ if (validateLayer) {
998
+ validated.push(validateLayer);
999
+ } else {
1000
+ // datasets not yet loaded
1001
+ failed.push(layer);
1002
+ }
1003
+ });
1004
+ return {
1005
+ validated: validated,
1006
+ failed: failed
1007
+ };
1008
+ }
1009
+
1010
+ /**
1011
+ * Get required columns for validation based on column mode
1012
+ */
1013
+ function _getColumnConfigForValidation(newLayer) {
1014
+ // find column fieldIdx
1015
+ var columnConfig = newLayer.getLayerColumns();
1016
+ // if columnMode is defined, find column mode config
1017
+ var colModeConfig = newLayer.config.columnMode ? (newLayer.supportedColumnModes || []).find(function (colMode) {
1018
+ return colMode.key === newLayer.config.columnMode;
1019
+ }) : null;
1020
+ if (colModeConfig) {
1021
+ // only validate columns in column mode
1022
+ columnConfig = [].concat((0, _toConsumableArray2["default"])(colModeConfig.requiredColumns || []), (0, _toConsumableArray2["default"])(colModeConfig.optionalColumns || [])).reduce(function (accu, key) {
1023
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnConfig[key]));
1024
+ }, {});
1025
+ }
1026
+ return columnConfig;
1027
+ }
1028
+
1029
+ /**
1030
+ * Validate saved layer config with new data,
1031
+ * update fieldIdx based on new fields
1032
+ */
1033
+ // eslint-disable-next-line complexity
1034
+ function validateLayerWithData(dataset, savedLayer, layerClasses) {
1035
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
1036
+ var fields = dataset.fields,
1037
+ dataId = dataset.id;
1038
+ var type = savedLayer.type;
1039
+ var throwOnError = options.throwOnError;
1040
+ // layer doesnt have a valid type
1041
+ if (!type || !Object.prototype.hasOwnProperty.call(layerClasses, type) || !savedLayer.config) {
1042
+ if (throwOnError) {
1043
+ throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
1044
+ }
1045
+ return null;
1046
+ }
1047
+ var newLayer = new layerClasses[type]({
1048
+ id: savedLayer.id,
1049
+ dataId: dataId,
1050
+ label: savedLayer.config.label,
1051
+ color: savedLayer.config.color,
1052
+ isVisible: savedLayer.config.isVisible,
1053
+ hidden: savedLayer.config.hidden,
1054
+ columnMode: savedLayer.config.columnMode,
1055
+ highlightColor: savedLayer.config.highlightColor
1056
+ });
1057
+ var columnConfig = _getColumnConfigForValidation(newLayer);
1058
+ if (Object.keys(columnConfig)) {
1059
+ var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
1060
+ if (columns) {
1061
+ newLayer.updateLayerConfig({
1062
+ columns: _objectSpread(_objectSpread({}, newLayer.config.columns), columns)
1063
+ });
1064
+ } else if (!options.allowEmptyColumn) {
1065
+ return null;
1066
+ }
1067
+ }
1068
+ var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel;
1069
+
1070
+ // copy visConfig over to emptyLayer to make sure it has all the props
1071
+ var copiedVisConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
1072
+ shallowCopy: ['colorRange', 'strokeColorRange']
1073
+ });
1074
+
1075
+ // call layer methods to validate visConfig when switching dataset
1076
+ var visConfig = newLayer.validateVisConfig ? newLayer.validateVisConfig(dataset, copiedVisConfig) : copiedVisConfig;
1077
+ newLayer.updateLayerConfig({
1078
+ visConfig: visConfig,
1079
+ textLabel: textLabel
1080
+ });
1081
+
1082
+ // visual channel field is saved to be {name, type}
1083
+ // find visual channel field by matching both name and type
1084
+ // refer to vis-state-schema.js VisualChannelSchemaV1
1085
+ newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
1086
+ if (throwOnError) {
1087
+ if (!newLayer.isValidToSave()) {
1088
+ throw new Error("Layer is not valid to save: ".concat(newLayer.id));
1089
+ }
1090
+ }
1091
+ return newLayer;
1092
+ }
1093
+ function mergeEditor(state, savedEditor) {
1094
+ var _savedEditor$visible;
1095
+ if (!savedEditor) {
1096
+ return state;
1097
+ }
1098
+ return _objectSpread(_objectSpread({}, state), {}, {
1099
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
1100
+ features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), (0, _toConsumableArray2["default"])(savedEditor.features || [])),
1101
+ // if savedEditor.visible is undefined keep state.editor.visible
1102
+ visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
1103
+ })
1104
+ });
1105
+ }
1106
+ function combineEditorConfigs(configs) {
1107
+ return configs.reduce(function (acc, nextConfig) {
1108
+ return _objectSpread(_objectSpread({}, acc), {}, {
1109
+ features: [].concat((0, _toConsumableArray2["default"])(acc.features), (0, _toConsumableArray2["default"])(nextConfig.features || []))
1110
+ });
1111
+ }, {
1112
+ // start with:
1113
+ // - empty array for features accumulation
1114
+ // - and are any of the configs' visible values true?
1115
+ features: [],
1116
+ visible: configs.some(function (c) {
1117
+ return c === null || c === void 0 ? void 0 : c.visible;
1118
+ })
1119
+ });
1120
+ }
1121
+
1122
+ /**
1123
+ * Validate saved layer config with new data,
1124
+ * update fieldIdx based on new fields
1125
+ */
1126
+ function mergeDatasetsByOrder(state, newDataEntries) {
1127
+ var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
1128
+ if (Array.isArray(state.preserveDatasetOrder)) {
1129
+ // preserveDatasetOrder might not include the new datasets
1130
+ var newDatasetIds = Object.keys(merged).filter(function (id) {
1131
+ var _state$preserveDatase;
1132
+ return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
1133
+ });
1134
+ return [].concat((0, _toConsumableArray2["default"])(state.preserveDatasetOrder), (0, _toConsumableArray2["default"])(newDatasetIds)).reduce(function (accu, dataId) {
1135
+ return _objectSpread(_objectSpread({}, accu), merged[dataId] ? (0, _defineProperty2["default"])({}, dataId, merged[dataId]) : {});
1136
+ }, {});
1137
+ }
1138
+ return merged;
1139
+ }
1140
+
1141
+ /**
1142
+ * Simliar purpose to aggregation utils `getMode` function,
1143
+ * but returns the mode in the same value type without coercing to a string.
1144
+ * It ignores `undefined` or `null` values, but returns `null` if no mode could be calculated.
1145
+ */
1146
+ function getValueWithHighestOccurrence(arr) {
1147
+ var _ref11;
1148
+ var tallys = new Map();
1149
+ arr.forEach(function (value) {
1150
+ if ((0, _commonUtils.notNullorUndefined)(value)) {
1151
+ if (!tallys.has(value)) {
1152
+ tallys.set(value, 1);
1153
+ } else {
1154
+ tallys.set(value, tallys.get(value) + 1);
1155
+ }
1156
+ }
1157
+ });
1158
+ // return the value with the highest total occurrence count
1159
+ if (tallys.size === 0) {
1160
+ return null;
1161
+ }
1162
+ return (_ref11 = (0, _toConsumableArray2["default"])(tallys.entries())) === null || _ref11 === void 0 ? void 0 : _ref11.reduce(function (acc, next) {
1163
+ return next[1] > acc[1] ? next : acc;
1164
+ })[0];
1165
+ }
1166
+ var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
1167
+ merge: mergeLayers,
1168
+ prop: 'layers',
1169
+ toMergeProp: 'layerToBeMerged',
1170
+ preserveOrder: 'preserveLayerOrder'
1171
+ }, {
1172
+ merge: mergeLayerOrder,
1173
+ prop: 'layerOrder'
1174
+ }, {
1175
+ merge: mergeFilters,
1176
+ prop: 'filters',
1177
+ toMergeProp: 'filterToBeMerged',
1178
+ preserveOrder: 'preserveFilterOrder',
1179
+ replaceParentDatasetIds: replaceFilterDatasetIds
1180
+ }, {
1181
+ merge: mergeEffects,
1182
+ prop: 'effects'
1183
+ }, {
1184
+ merge: mergeAnnotations,
1185
+ prop: 'annotations',
1186
+ toMergeProp: 'annotationsToBeMerged'
1187
+ }, {
1188
+ merge: mergeInteractions,
1189
+ prop: 'interactionConfig',
1190
+ toMergeProp: 'interactionToBeMerged',
1191
+ replaceParentDatasetIds: replaceInteractionDatasetIds,
1192
+ saveUnmerged: savedUnmergedInteraction,
1193
+ combineConfigs: combineInteractionConfigs
1194
+ }, {
1195
+ merge: mergeLayerBlending,
1196
+ prop: 'layerBlending',
1197
+ combineConfigs: combineLayerBlendingConfigs
1198
+ }, {
1199
+ merge: mergeOverlayBlending,
1200
+ prop: 'overlayBlending',
1201
+ combineConfigs: combineOverlayBlendingConfigs
1202
+ }, {
1203
+ merge: mergeSplitMaps,
1204
+ prop: 'splitMaps',
1205
+ toMergeProp: 'splitMapsToBeMerged'
1206
+ }, {
1207
+ merge: mergeAnimationConfig,
1208
+ prop: 'animationConfig',
1209
+ combineConfigs: combineAnimationConfigs
1210
+ }, {
1211
+ merge: mergeEditor,
1212
+ prop: 'editor',
1213
+ combineConfigs: combineEditorConfigs
1214
+ }];
1215
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BpY2siLCJfZmxhdHRlbkRlZXAiLCJfZGVlcG1lcmdlIiwiX3V0aWxzIiwiX2VmZmVjdHMiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3NjaGVtYXMiLCJfdGFibGUiLCJfbGF5ZXJVdGlscyIsIl9leGNsdWRlZCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX3RvUHJvcGVydHlLZXkiLCJpIiwiX3RvUHJpbWl0aXZlIiwiX3R5cGVvZjMiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJtZXJnZUZpbHRlcnMiLCJzdGF0ZSIsImZpbHRlcnNUb01lcmdlIiwiZnJvbUNvbmZpZyIsInByZXNlcnZlRmlsdGVyT3JkZXIiLCJtYXAiLCJsIiwiaWQiLCJfdmFsaWRhdGVGaWx0ZXJzVXBkYXQiLCJ2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyIsInZhbGlkYXRlZCIsImZhaWxlZCIsInVwZGF0ZWREYXRhc2V0cyIsInVwZGF0ZWRGaWx0ZXJzIiwiaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlciIsImZpbHRlcnMiLCJyZXNldEZpbHRlckdwdU1vZGUiLCJhc3NpZ25HcHVDaGFubmVscyIsImRhdGFzZXRzVG9GaWx0ZXIiLCJ1bmlxIiwiZmxhdHRlbkRlZXAiLCJkYXRhSWQiLCJmaWx0ZXJlZCIsImFwcGx5RmlsdGVyc1RvRGF0YXNldHMiLCJsYXllcnMiLCJkYXRhc2V0cyIsImZpbHRlclRvQmVNZXJnZWQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmVwbGFjZUZpbHRlckRhdGFzZXRJZHMiLCJzYXZlZEZpbHRlciIsImRhdGFJZFRvVXNlIiwicmVwbGFjZWQiLCJpbmNsdWRlcyIsIl9maWx0ZXIkcGxvdFR5cGUiLCJuZXdEYXRhSWQiLCJkIiwicGxvdFR5cGUiLCJjb2xvcnNCeURhdGFJZCIsIl9maWx0ZXIkcGxvdFR5cGUyIiwiX3JlZiIsImNvbG9yIiwicmVzdCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJpc1NhdmVkTGF5ZXJDb25maWdWMSIsImxheWVyQ29uZmlnIiwidmlzdWFsQ2hhbm5lbHMiLCJwYXJzZUxheWVyQ29uZmlnIiwic2NoZW1hIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uIiwic2F2ZWRDb25maWciLCJ2ZXJzaW9uIiwiQ1VSUkVOVF9WRVJTSU9OIiwiY29uZmlnIiwidmlzU3RhdGUiLCJsYXllck9yZGVyIiwicGFyc2VTYXZlZENvbmZpZyIsImN1cnJlbnRJdGVtcyIsIml0ZW1zIiwicHJlc2VydmVkT3JkZXIiLCJ1bmRlZmluZWQiLCJkZWZhdWx0U3RhcnQiLCJuZXdJdGVtcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiaXRlbSIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwicHJlY2VlZElkeCIsIl9sb29wIiwicHJlY2VlZEl0ZW1JZCIsImZpbmRJbmRleCIsImFycmF5SW5zZXJ0IiwiZXJyIiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwicGFyc2VkTGF5ZXJDb25maWciLCJfdmFsaWRhdGVMYXllcnNCeURhdGEiLCJ2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJhbGxvd0VtcHR5Q29sdW1uIiwibmV3TGF5ZXIiLCJ1cGRhdGVMYXllckRvbWFpbiIsInNlcmlhbGl6ZUZpbHRlciIsIm5ld0ZpbHRlciIsIl9zZXJpYWxpemVkVmlzU3RhdGUkZiIsInNlcmlhbGl6ZWRWaXNTdGF0ZSIsInNlcmlhbGl6ZVZpc1N0YXRlIiwic2VyaWFsaXplTGF5ZXIiLCJfc2VyaWFsaXplZFZpc1N0YXRlJGwiLCJzZXJpYWxpemVFZmZlY3QiLCJuZXdFZmZlY3QiLCJfc2VyaWFsaXplZFZpc1N0YXRlJGUiLCJlZmZlY3RzIiwiZWZmZWN0T3JkZXIiLCJfc2NoZW1hJHBhcnNlU2F2ZWRDb24yIiwic2F2ZWRTdGF0ZSIsImdldENvbmZpZ1RvU2F2ZSIsIm1lcmdlTGF5ZXJzIiwibGF5ZXJzVG9NZXJnZSIsInByZXNlcnZlTGF5ZXJPcmRlciIsImdldExheWVyT3JkZXJGcm9tTGF5ZXJzIiwidW5tZXJnZWQiLCJ0b01lcmdlIiwiX2wkY29uZmlnIiwiaXNNZXJnaW5nRGF0YXNldHMiLCJfdmFsaWRhdGVMYXllcnNCeURhdGEyIiwibWVyZ2VkTGF5ZXIiLCJfaW5zZXJ0TGF5ZXJBdFJpZ2h0T3IiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJtZXJnZWRTdGF0ZSIsImxheWVyVG9CZU1lcmdlZCIsImxheWVyT3JkZXJUb0JlTWVyZ2VkIiwic2F2ZWRPcmRlciIsIm1lcmdlTGF5ZXJPcmRlciIsImN1cnJlbnRMYXllcnMiLCJsYXllcnNUb0luc2VydCIsImN1cnJlbnRPcmRlciIsImN1cnJlbnRMYXllclF1ZXVlIiwiZW50cnkiLCJmaW5kQnlJZCIsImxheWVyIiwiQm9vbGVhbiIsIm5ld0xheWVyT3JkZXJRdWV1ZSIsIm5ld0ZsYXRMYXllck9yZGVyIiwiaGFzR3JvdXBzIiwic29tZSIsImlzUGxhaW5PYmplY3QiLCJleGlzdGluZ0ZsYXRJZHMiLCJTZXQiLCJuZXdJbnNlcnRlZElkcyIsImhhcyIsInJlc3VsdCIsImZsYXRRdWV1ZSIsImZsYXRJZHgiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwic2F2ZWRMYXllck9yZGVyIiwidmFsaWRMYXllcklkcyIsImZpbHRlckxheWVyT3JkZXIiLCJvcmRlciIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJncm91cCIsImZpbHRlcmVkR3JvdXBPcmRlciIsInJlc3RvcmVkTGF5ZXJPcmRlciIsImxheWVySWRzSW5SZXN0b3JlZCIsImNvbGxlY3RJZHMiLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwiYWRkIiwibWlzc2luZ0xheWVycyIsIm1lcmdlSW50ZXJhY3Rpb25zIiwiaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkIiwibWVyZ2VkIiwia2V5IiwiaW50ZXJhY3Rpb25Db25maWciLCJjdXJyZW50Q29uZmlnIiwiX3JlZjIiLCJlbmFibGVkIiwiY29uZmlnU2F2ZWQiLCJjb25maWdUb01lcmdlIiwiX21lcmdlSW50ZXJhY3Rpb25Ub29sIiwibWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWciLCJtZXJnZWRUb29sdGlwIiwidW5tZXJnZWRUb29sdGlwIiwiZmllbGRzVG9TaG93IiwidG9vbHRpcCIsInBpY2siLCJuZXh0U3RhdGUiLCJzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24iLCJjb21iaW5lSW50ZXJhY3Rpb25Db25maWdzIiwiY29uZmlncyIsImNvbWJpbmVkIiwiX2xvb3AyIiwidG9CZUNvbWJpbmVkUHJvcHMiLCJjIiwicCIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJnZXRWYWx1ZVdpdGhIaWdoZXN0T2NjdXJyZW5jZSIsInJlZHVjZSIsImFjYyIsIm5leHRGaWVsZHNUb1Nob3ciLCJfbG9vcDMiLCJuZXh0RGF0YUlkS2V5IiwibmV4dFRvb2x0aXBGaWVsZHMiLCJuZXh0VEYiLCJmaW5kIiwiX3JlZjMiLCJfYWdncmVnYXRlIiwic2l6ZSIsImFnZ3JlZ2F0ZSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwibWF4aW11bSIsImxpbWl0U2VhcmNoIiwiX3VubWVyZ2VkJHRvb2x0aXAiLCJfdW5tZXJnZWQkdG9vbHRpcDIiLCJfc3RhdGUkaW50ZXJhY3Rpb25Ub0IiLCJfdW5tZXJnZWQkdG9vbHRpcDMiLCJyZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzIiwiZGF0YUlkVG9SZXBsYWNlIiwiX2ludGVyYWN0aW9uQ29uZmlnJHRvIiwiX2ludGVyYWN0aW9uQ29uZmlnJHRvMiIsIm1lcmdlU3BsaXRNYXBzIiwic3BsaXRNYXBzIiwic20iLCJlbnRyaWVzIiwiX3JlZjQiLCJfcmVmNSIsIl9zbGljZWRUb0FycmF5MiIsInB1c2hUbyIsImdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcCIsInNwbGl0TWFwc1RvQmVNZXJnZWQiLCJtZXJnZUVmZmVjdHMiLCJuZXdFZmZlY3RzIiwiZWZmZWN0IiwiY3JlYXRlRWZmZWN0IiwiZGVlcG1lcmdlIiwiYWxsIiwiaXNDb25maWdBY3RpdmUiLCJpc1ZhbGlkVG9TYXZlIiwibWVyZ2VBbm5vdGF0aW9ucyIsImFubm90YXRpb25zIiwiZXhpc3RpbmdJZHMiLCJ2YWxpZEFubm90YXRpb25zIiwiaXNBbm5vdGF0aW9uS2luZCIsImtpbmQiLCJhbmNob3JQb2ludCIsImlzVmlzaWJsZSIsImF1dG9TaXplIiwiYXV0b1NpemVZIiwibGFiZWwiLCJsaW5lQ29sb3IiLCJJTklUSUFMX0FOTk9UQVRJT05fTElORV9DT0xPUiIsImxpbmVXaWR0aCIsIklOSVRJQUxfQU5OT1RBVElPTl9MSU5FX1dJRFRIIiwidGV4dFdpZHRoIiwidGV4dEhlaWdodCIsInRvb2x0aXBDb25maWciLCJfbG9vcDQiLCJhbGxGaWVsZHMiLCJmaWVsZHMiLCJmb3VuZEZpZWxkc1RvU2hvdyIsImZpZWxkIiwibWVyZ2VMYXllckJsZW5kaW5nIiwibGF5ZXJCbGVuZGluZyIsIkxBWUVSX0JMRU5ESU5HUyIsImNvbWJpbmVMYXllckJsZW5kaW5nQ29uZmlncyIsIm1lcmdlT3ZlcmxheUJsZW5kaW5nIiwib3ZlcmxheUJsZW5kaW5nIiwiT1ZFUkxBWV9CTEVORElOR1MiLCJjb21iaW5lT3ZlcmxheUJsZW5kaW5nQ29uZmlncyIsIm1lcmdlQW5pbWF0aW9uQ29uZmlnIiwiYW5pbWF0aW9uIiwiY3VycmVudFRpbWUiLCJhbmltYXRpb25Db25maWciLCJkb21haW4iLCJjb21iaW5lQW5pbWF0aW9uQ29uZmlncyIsIl9hZ2dyZWdhdGUyIiwiX2FnZ3JlZ2F0ZTMiLCJtaW5pbXVtIiwic3BlZWQiLCJ2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zIiwic2F2ZWRDb2xzIiwiZW1wdHlDb2xzIiwib3B0aW9ucyIsImNvbHVtbnMiLCJfbG9vcDUiLCJfT2JqZWN0JGtleXMiLCJfaSIsInNhdmVkIiwiZmllbGRJZHgiLCJfcmVmNiIsImFsbENvbEZvdW5kIiwiZXZlcnkiLCJ2YWxpZGF0ZUNvbHVtbiIsInJ2IiwidGhyb3dPbkVycm9yIiwicmVxdWlyZWRDb2x1bW5zIiwiayIsIm9wdGlvbmFsIiwibWlzc2luZ0NvbHVtbnMiLCJFcnJvciIsImpvaW4iLCJjb25maWdDb2x1bW5zIiwiaW52YWxpZENvbHVtbnMiLCJfY29sdW1ucyRrIiwiY29sdW1uIiwidmFsaWRhdG9yIiwidmFsaWRhdGVTYXZlZFRleHRMYWJlbCIsIl9yZWY3Iiwic2F2ZWRUZXh0TGFiZWwiLCJfcmVmOCIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJKU09OIiwic3RyaW5naWZ5IiwiYWNjdSIsImdldFNhdmVkVmlzdWFsQ2hhbm5lbFZhbHVlIiwic2F2ZWRMYXllciIsImNoYW5uZWxzIiwiX3R5cGVvZjIiLCJ2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMiLCJ2YWx1ZXMiLCJfcmVmOSIsInNjYWxlIiwic2F2ZWRGaWVsZCIsInNhdmVkU2NhbGUiLCJmb3VuZEZpZWxkIiwiZm91bmRDaGFubmVsIiwidXBkYXRlTGF5ZXJDb25maWciLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJfbmV3TGF5ZXIkY29uZmlnJGZpZWwiLCJmaWVsZE5hbWUiLCJfbGF5ZXIkY29uZmlnIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsIl9nZXRDb2x1bW5Db25maWdGb3JWYWxpZGF0aW9uIiwiY29sdW1uQ29uZmlnIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiY29sTW9kZUNvbmZpZyIsImNvbHVtbk1vZGUiLCJzdXBwb3J0ZWRDb2x1bW5Nb2RlcyIsImNvbE1vZGUiLCJvcHRpb25hbENvbHVtbnMiLCJkYXRhc2V0IiwidHlwZSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJjb3BpZWRWaXNDb25maWciLCJjb3B5TGF5ZXJDb25maWciLCJ2aXNDb25maWciLCJzaGFsbG93Q29weSIsInZhbGlkYXRlVmlzQ29uZmlnIiwibWVyZ2VFZGl0b3IiLCJzYXZlZEVkaXRvciIsIl9zYXZlZEVkaXRvciR2aXNpYmxlIiwiZWRpdG9yIiwiZmVhdHVyZXMiLCJ2aXNpYmxlIiwiY29tYmluZUVkaXRvckNvbmZpZ3MiLCJuZXh0Q29uZmlnIiwibWVyZ2VEYXRhc2V0c0J5T3JkZXIiLCJuZXdEYXRhRW50cmllcyIsInByZXNlcnZlRGF0YXNldE9yZGVyIiwibmV3RGF0YXNldElkcyIsIl9zdGF0ZSRwcmVzZXJ2ZURhdGFzZSIsImFyciIsIl9yZWYxMSIsInRhbGx5cyIsIk1hcCIsIm5vdE51bGxvclVuZGVmaW5lZCIsInNldCIsImdldCIsIlZJU19TVEFURV9NRVJHRVJTIiwiZXhwb3J0cyIsIm1lcmdlIiwicHJvcCIsInRvTWVyZ2VQcm9wIiwicHJlc2VydmVPcmRlciIsInJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIiwic2F2ZVVubWVyZ2VkIiwiY29tYmluZUNvbmZpZ3MiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdW5pcSBmcm9tICdlcy10b29sa2l0L2NvbXBhdC91bmlxJztcbmltcG9ydCBwaWNrIGZyb20gJ2VzLXRvb2xraXQvY29tcGF0L3BpY2snO1xuaW1wb3J0IGZsYXR0ZW5EZWVwIGZyb20gJ2VzLXRvb2xraXQvY29tcGF0L2ZsYXR0ZW5EZWVwJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7XG4gIGFycmF5SW5zZXJ0LFxuICBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAsXG4gIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMsXG4gIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzLFxuICBmaW5kQnlJZCxcbiAgYWdncmVnYXRlLFxuICBpc1BsYWluT2JqZWN0XG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge2NyZWF0ZUVmZmVjdH0gZnJvbSAnQGtlcGxlci5nbC9lZmZlY3RzJztcbmltcG9ydCB7bm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge1xuICBBR0dSRUdBVElPTl9UWVBFUyxcbiAgTEFZRVJfQkxFTkRJTkdTLFxuICBPVkVSTEFZX0JMRU5ESU5HUyxcbiAgaXNBbm5vdGF0aW9uS2luZCxcbiAgSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gIElOSVRJQUxfQU5OT1RBVElPTl9MSU5FX1dJRFRIXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q1VSUkVOVF9WRVJTSU9OLCBWaXNTdGF0ZSwgVmlzU3RhdGVNZXJnZXJzLCBLZXBsZXJHTFNjaGVtYUNsYXNzfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBQYXJzZWRMYXllcixcbiAgUGFyc2VkVmlzU3RhdGUsXG4gIFNhdmVkSW50ZXJhY3Rpb25Db25maWcsXG4gIFRvb2x0aXBJbmZvLFxuICBTYXZlZEVkaXRvcixcbiAgUGFyc2VkQ29uZmlnLFxuICBGaWx0ZXIsXG4gIEVmZmVjdCBhcyBFZmZlY3RUeXBlLFxuICBQYXJzZWRFZmZlY3QsXG4gIExheWVyQ29sdW1ucyxcbiAgTGF5ZXJDb2x1bW4sXG4gIFBhcnNlZEZpbHRlcixcbiAgTmVzdGVkUGFydGlhbCxcbiAgU2F2ZWRBbmltYXRpb25Db25maWcsXG4gIExheWVyT3JkZXIsXG4gIExheWVyT3JkZXJHcm91cFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7S2VwbGVyVGFibGUsIERhdGFzZXRzLCBhc3NpZ25HcHVDaGFubmVscywgcmVzZXRGaWx0ZXJHcHVNb2RlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcblxuaW1wb3J0IHtnZXRMYXllck9yZGVyRnJvbUxheWVyc30gZnJvbSAnLi9sYXllci11dGlscyc7XG5cbi8qKlxuICogTWVyZ2UgbG9hZGVkIGZpbHRlcnMgd2l0aCBjdXJyZW50IHN0YXRlLCBpZiBubyBmaWVsZHMgb3IgZGF0YSBhcmUgbG9hZGVkXG4gKiBzYXZlIGl0IGZvciBsYXRlclxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRmlsdGVyczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZmlsdGVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2ZpbHRlcnMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBwcmVzZXJ2ZUZpbHRlck9yZGVyID0gZnJvbUNvbmZpZ1xuICAgID8gZmlsdGVyc1RvTWVyZ2U/Lm1hcChsID0+IGwuaWQpXG4gICAgOiBzdGF0ZS5wcmVzZXJ2ZUZpbHRlck9yZGVyO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzVG9NZXJnZSkgfHwgIWZpbHRlcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZCwgdXBkYXRlZERhdGFzZXRzfSA9IHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKHN0YXRlLCBmaWx0ZXJzVG9NZXJnZSk7XG4gIGxldCB1cGRhdGVkRmlsdGVycyA9IGluc2VydEl0ZW1CYXNlZE9uUHJlc2VydmVkT3JkZXIoXG4gICAgc3RhdGUuZmlsdGVycyxcbiAgICB2YWxpZGF0ZWQsXG4gICAgcHJlc2VydmVGaWx0ZXJPcmRlclxuICApO1xuXG4gIC8vIG1lcmdlIGZpbHRlciB3aXRoIGV4aXN0aW5nXG4gIHVwZGF0ZWRGaWx0ZXJzID0gcmVzZXRGaWx0ZXJHcHVNb2RlKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgdXBkYXRlZEZpbHRlcnMgPSBhc3NpZ25HcHVDaGFubmVscyh1cGRhdGVkRmlsdGVycyk7XG4gIC8vIGZpbHRlciBkYXRhXG4gIGNvbnN0IGRhdGFzZXRzVG9GaWx0ZXIgPSB1bmlxKGZsYXR0ZW5EZWVwKHZhbGlkYXRlZC5tYXAoZiA9PiBmLmRhdGFJZCkpKTtcblxuICBjb25zdCBmaWx0ZXJlZCA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoXG4gICAgZGF0YXNldHNUb0ZpbHRlcixcbiAgICB1cGRhdGVkRGF0YXNldHMsXG4gICAgdXBkYXRlZEZpbHRlcnMsXG4gICAgc3RhdGUubGF5ZXJzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiB1cGRhdGVkRmlsdGVycyxcbiAgICBkYXRhc2V0czogZmlsdGVyZWQsXG4gICAgcHJlc2VydmVGaWx0ZXJPcmRlcixcbiAgICBmaWx0ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuZmlsdGVyVG9CZU1lcmdlZCwgLi4uZmFpbGVkXVxuICB9O1xufVxuXG4vLyByZXBsYWNlIGRhdGFJZCBpbiBzYXZlZCBGaWx0ZXJcbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlRmlsdGVyRGF0YXNldElkcyhcbiAgc2F2ZWRGaWx0ZXI6IEZpbHRlcltdLFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHJlcGxhY2VkOiBGaWx0ZXJbXSA9IFtdO1xuICBzYXZlZEZpbHRlci5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgaWYgKGZpbHRlci5kYXRhSWQuaW5jbHVkZXMoZGF0YUlkKSkge1xuICAgICAgY29uc3QgbmV3RGF0YUlkID0gZmlsdGVyLmRhdGFJZC5tYXAoZCA9PiAoZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9Vc2UgOiBkKSk7XG4gICAgICBsZXQgcGxvdFR5cGU7XG4gICAgICAvLyBUT0RPOiBtb3JlIGdlbmVyaWMgYXBwcm9hY2ggdG8gc2F2ZSBwbG90VHlwZS5jb2xvcnNCeURhdGFJZFxuICAgICAgaWYgKGZpbHRlci5wbG90VHlwZT8uY29sb3JzQnlEYXRhSWQ/LltkYXRhSWRdKSB7XG4gICAgICAgIC8vIHJlcGxhY2UgY29sb3JCeURhdGFJZCBpbiBmaWx0ZXIucGxvdFR5cGVcbiAgICAgICAgY29uc3Qge1tkYXRhSWRdOiBjb2xvciwgLi4ucmVzdH0gPSBmaWx0ZXIucGxvdFR5cGU/LmNvbG9yc0J5RGF0YUlkIHx8IHt9O1xuICAgICAgICBwbG90VHlwZSA9IHtcbiAgICAgICAgICAuLi5maWx0ZXIucGxvdFR5cGUsXG4gICAgICAgICAgY29sb3JzQnlEYXRhSWQ6IHtcbiAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICBbZGF0YUlkVG9Vc2VdOiBjb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJlcGxhY2VkLnB1c2goe1xuICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIGRhdGFJZDogbmV3RGF0YUlkLFxuICAgICAgICAuLi4ocGxvdFR5cGUgPyB7cGxvdFR5cGV9IDoge30pXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZWQubGVuZ3RoID8gcmVwbGFjZWQgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYXZlZExheWVyQ29uZmlnVjEobGF5ZXJDb25maWc6IGFueSk6IGJvb2xlYW4ge1xuICAvLyBleHBvcnRlZCBsYXllciBjb25maWd1cmF0aW9uIGNvbnRhaW5zIHZpc3VhbENoYW5uZWxzIHByb3BlcnR5XG4gIHJldHVybiBsYXllckNvbmZpZz8udmlzdWFsQ2hhbm5lbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyQ29uZmlnKFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3MsXG4gIGxheWVyQ29uZmlnOiBhbnlcbik6IFBhcnNlZExheWVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gYXNzdW1lIHRoZSBsYXllciBjb25maWcgaXMgY3VycmVudCB2ZXJzaW9uXG4gIGNvbnN0IHNhdmVkQ29uZmlnID0ge1xuICAgIHZlcnNpb246IENVUlJFTlRfVkVSU0lPTixcbiAgICBjb25maWc6IHtcbiAgICAgIHZpc1N0YXRlOiB7bGF5ZXJzOiBbbGF5ZXJDb25maWddLCBsYXllck9yZGVyOiBbbGF5ZXJDb25maWcuaWRdfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2NoZW1hLnBhcnNlU2F2ZWRDb25maWcoc2F2ZWRDb25maWcpPy52aXNTdGF0ZT8ubGF5ZXJzPy5bMF07XG59XG5cbmZ1bmN0aW9uIGluc2VydEl0ZW1CYXNlZE9uUHJlc2VydmVkT3JkZXIoXG4gIGN1cnJlbnRJdGVtczogRmlsdGVyW10sXG4gIGl0ZW1zOiBGaWx0ZXJbXSxcbiAgcHJlc2VydmVkT3JkZXI6IGFueVtdID0gW10sXG4gIGRlZmF1bHRTdGFydD86IGJvb2xlYW5cbikge1xuICBsZXQgbmV3SXRlbXMgPSBbLi4uY3VycmVudEl0ZW1zXTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCBleHBlY3RlZElkeCA9IHByZXNlcnZlZE9yZGVyLmluZGV4T2YoaXRlbS5pZCk7XG4gICAgLy8gaW5zZXJ0QXQgdGhlIGVuZCBieSBkZWZhdWx0XG4gICAgbGV0IGluc2VydEF0ID0gZGVmYXVsdFN0YXJ0ID8gMCA6IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICBpZiAoZXhwZWN0ZWRJZHggPiAwKSB7XG4gICAgICAvLyBsb29rIGZvciBsYXllciB0byBpbnNlcnQgYWZ0ZXJcbiAgICAgIGxldCBpID0gZXhwZWN0ZWRJZHggKyAxO1xuICAgICAgbGV0IHByZWNlZWRJZHggPSAtMTtcbiAgICAgIHdoaWxlIChpLS0gPiAwICYmIHByZWNlZWRJZHggPCAwKSB7XG4gICAgICAgIC8vIGtlZXAgbG9va2luZyBmb3IgcHJlY2VlZCBsYXllciB0aGF0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGNvbnN0IHByZWNlZWRJdGVtSWQgPSBwcmVzZXJ2ZWRPcmRlcltpIC0gMV07XG4gICAgICAgIHByZWNlZWRJZHggPSBuZXdJdGVtcy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBwcmVjZWVkSXRlbUlkKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVjZWVkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gaWYgZm91bmRcbiAgICAgICAgaW5zZXJ0QXQgPSBwcmVjZWVkSWR4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgbmV3SXRlbXMgPSBhcnJheUluc2VydChuZXdJdGVtcywgaW5zZXJ0QXQsIGl0ZW0pO1xuICB9XG4gIHJldHVybiBuZXdJdGVtcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheWVyRnJvbUNvbmZpZyhzdGF0ZTogVmlzU3RhdGUsIGxheWVyQ29uZmlnOiBhbnkpOiBMYXllciB8IG51bGwge1xuICAvLyBjaGVjayBpZiB0aGUgbGF5ZXIgY29uZmlnIGlzIHBhcnNlZFxuICBjb25zdCBwYXJzZWRMYXllckNvbmZpZyA9IGlzU2F2ZWRMYXllckNvbmZpZ1YxKGxheWVyQ29uZmlnKVxuICAgID8gcGFyc2VMYXllckNvbmZpZyhzdGF0ZS5zY2hlbWEsIGxheWVyQ29uZmlnKVxuICAgIDogbGF5ZXJDb25maWc7XG5cbiAgaWYgKCFwYXJzZWRMYXllckNvbmZpZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGZpcnN0IHZhbGlkYXRlIGNvbmZpZyBhZ2FpbnN0IGRhdGFzZXRcbiAgY29uc3Qge3ZhbGlkYXRlZCwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgICBzdGF0ZS5kYXRhc2V0cyxcbiAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgW3BhcnNlZExheWVyQ29uZmlnXSxcbiAgICB7YWxsb3dFbXB0eUNvbHVtbjogdHJ1ZX1cbiAgKTtcblxuICBpZiAoZmFpbGVkPy5sZW5ndGggfHwgIXZhbGlkYXRlZC5sZW5ndGgpIHtcbiAgICAvLyBmYWlsZWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG5ld0xheWVyID0gdmFsaWRhdGVkWzBdO1xuICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIHJldHVybiBuZXdMYXllcjtcbn1cblxuLyoqXG4gKiBHZXQgbG9hZGVkIGZpbHRlciBmcm9tIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVGaWx0ZXIoXG4gIG5ld0ZpbHRlcjogRmlsdGVyLFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZEZpbHRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHtmaWx0ZXJzOiBbbmV3RmlsdGVyXX0sIHNjaGVtYSk7XG4gIHJldHVybiBzZXJpYWxpemVkVmlzU3RhdGU/LmZpbHRlcnM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgbG9hZGVkIGxheWVyIGZyb20gc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUxheWVyKFxuICBuZXdMYXllcjogTGF5ZXIsXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzc1xuKTogUGFyc2VkTGF5ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJpYWxpemVkVmlzU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZShcbiAgICB7bGF5ZXJzOiBbbmV3TGF5ZXJdLCBsYXllck9yZGVyOiBbbmV3TGF5ZXIuaWRdfSxcbiAgICBzY2hlbWFcbiAgKTtcbiAgcmV0dXJuIHNlcmlhbGl6ZWRWaXNTdGF0ZT8ubGF5ZXJzPy5bMF07XG59XG5cbi8qKlxuICogR2V0IGxvYWRlZCBlZmZlY3QgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplRWZmZWN0KFxuICBuZXdFZmZlY3Q6IEVmZmVjdFR5cGUsXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzc1xuKTogUGFyc2VkRWZmZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VyaWFsaXplZFZpc1N0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoXG4gICAge2VmZmVjdHM6IFtuZXdFZmZlY3RdLCBlZmZlY3RPcmRlcjogW25ld0VmZmVjdC5pZF19LFxuICAgIHNjaGVtYVxuICApO1xuICByZXR1cm4gc2VyaWFsaXplZFZpc1N0YXRlPy5lZmZlY3RzPy5bMF07XG59XG5cbi8qKlxuICogR2V0IHZpcyBzdGF0ZSBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVZpc1N0YXRlKFxuICB2aXNTdGF0ZTogUGFydGlhbDxWaXNTdGF0ZT4sXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzc1xuKTogUGFyc2VkVmlzU3RhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBzYXZlZFN0YXRlID0gc2NoZW1hLmdldENvbmZpZ1RvU2F2ZSh7XG4gICAgdmlzU3RhdGVcbiAgfSk7XG4gIHJldHVybiBzYXZlZFN0YXRlID8gc2NoZW1hLnBhcnNlU2F2ZWRDb25maWcoc2F2ZWRTdGF0ZSk/LnZpc1N0YXRlIDogdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBNZXJnZSBsYXllcnMgZnJvbSBkZS1zZXJpYWxpemVkIHN0YXRlLCBpZiBubyBmaWVsZHMgb3IgZGF0YSBhcmUgbG9hZGVkXG4gKiBzYXZlIGl0IGZvciBsYXRlclxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBsYXllcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGNvbnN0IHByZXNlcnZlTGF5ZXJPcmRlciA9IGZyb21Db25maWdcbiAgICA/IGdldExheWVyT3JkZXJGcm9tTGF5ZXJzKGxheWVyc1RvTWVyZ2UpXG4gICAgOiBzdGF0ZS5wcmVzZXJ2ZUxheWVyT3JkZXI7XG4gIGlmICghQXJyYXkuaXNBcnJheShsYXllcnNUb01lcmdlKSB8fCAhbGF5ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gZG9uJ3QgbWVyZ2UgbGF5ZXIgaWYgZGF0YXNldCBpcyBiZWluZyBtZXJnZWRcbiAgY29uc3QgdW5tZXJnZWQ6IFBhcnNlZExheWVyW10gPSBbXTtcbiAgY29uc3QgdG9NZXJnZTogUGFyc2VkTGF5ZXJbXSA9IFtdO1xuICBsYXllcnNUb01lcmdlLmZvckVhY2goKGw6IFBhcnNlZExheWVyKSA9PiB7XG4gICAgaWYgKGw/LmNvbmZpZz8uZGF0YUlkICYmIHN0YXRlLmlzTWVyZ2luZ0RhdGFzZXRzW2wuY29uZmlnLmRhdGFJZF0pIHtcbiAgICAgIHVubWVyZ2VkLnB1c2gobCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvTWVyZ2UucHVzaChsKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHt2YWxpZGF0ZWQ6IG1lcmdlZExheWVyLCBmYWlsZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICB0b01lcmdlXG4gICk7XG4gIHVubWVyZ2VkLnB1c2goLi4uZmFpbGVkKTtcbiAgLy8gcHV0IG5ldyBsYXllcnMgaW4gZnJvbnQgb2YgY3VycmVudCBsYXllcnNcbiAgY29uc3Qge25ld0xheWVyT3JkZXIsIG5ld0xheWVyc30gPSBpbnNlcnRMYXllckF0UmlnaHRPcmRlcihcbiAgICBzdGF0ZS5sYXllcnMsXG4gICAgbWVyZ2VkTGF5ZXIsXG4gICAgc3RhdGUubGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXJcbiAgKTtcblxuICBsZXQgbWVyZ2VkU3RhdGU6IFMgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdMYXllcnMsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcblxuICAvLyBBcHBseSBwZW5kaW5nIGxheWVyT3JkZXIgd2l0aCBncm91cHMgaWYgbGF5ZXJzIGFyZSBub3cgYXZhaWxhYmxlXG4gIGlmIChtZXJnZWRTdGF0ZS5sYXllck9yZGVyVG9CZU1lcmdlZCAmJiBtZXJnZWRTdGF0ZS5sYXllcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNhdmVkT3JkZXIgPSBtZXJnZWRTdGF0ZS5sYXllck9yZGVyVG9CZU1lcmdlZDtcbiAgICBtZXJnZWRTdGF0ZSA9IG1lcmdlTGF5ZXJPcmRlcihtZXJnZWRTdGF0ZSwgc2F2ZWRPcmRlcik7XG4gICAgLy8gS2VlcCBzYXZlZExheWVyT3JkZXIgYXZhaWxhYmxlIGZvciBmdXR1cmUgZGVmZXJyZWQgbGF5ZXJzXG4gICAgaWYgKG1lcmdlZFN0YXRlLmxheWVyVG9CZU1lcmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICBtZXJnZWRTdGF0ZSA9IHsuLi5tZXJnZWRTdGF0ZSwgbGF5ZXJPcmRlclRvQmVNZXJnZWQ6IHNhdmVkT3JkZXJ9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIGlmICghbGF5ZXJzVG9JbnNlcnQ/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7bmV3TGF5ZXJzOiBjdXJyZW50TGF5ZXJzLCBuZXdMYXllck9yZGVyOiBjdXJyZW50T3JkZXJ9O1xuICB9XG5cbiAgY29uc3QgY3VycmVudExheWVyUXVldWUgPSBjdXJyZW50T3JkZXJcbiAgICAuZmlsdGVyKGVudHJ5ID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpXG4gICAgLm1hcChpZCA9PiBmaW5kQnlJZChpZCkoY3VycmVudExheWVycykpXG4gICAgLmZpbHRlcihsYXllciA9PiBCb29sZWFuKGxheWVyKSk7XG4gIGNvbnN0IG5ld0xheWVycyA9IGN1cnJlbnRMYXllcnMuY29uY2F0KGxheWVyc1RvSW5zZXJ0KTtcbiAgY29uc3QgbmV3TGF5ZXJPcmRlclF1ZXVlID0gaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlcihcbiAgICBjdXJyZW50TGF5ZXJRdWV1ZSxcbiAgICBsYXllcnNUb0luc2VydCxcbiAgICBwcmVzZXJ2ZWRPcmRlcixcbiAgICB0cnVlXG4gICk7XG5cbiAgY29uc3QgbmV3RmxhdExheWVyT3JkZXIgPSBnZXRMYXllck9yZGVyRnJvbUxheWVycyhuZXdMYXllck9yZGVyUXVldWUpO1xuXG4gIC8vIElmIG5vIGdyb3VwcyBleGlzdCBpbiBjdXJyZW50IG9yZGVyLCBqdXN0IHVzZSB0aGUgbmV3IGZsYXQgb3JkZXJcbiAgY29uc3QgaGFzR3JvdXBzID0gY3VycmVudE9yZGVyLnNvbWUoZW50cnkgPT4gaXNQbGFpbk9iamVjdChlbnRyeSkpO1xuICBpZiAoIWhhc0dyb3Vwcykge1xuICAgIHJldHVybiB7XG4gICAgICBuZXdMYXllck9yZGVyOiBuZXdGbGF0TGF5ZXJPcmRlcixcbiAgICAgIG5ld0xheWVyc1xuICAgIH07XG4gIH1cblxuICAvLyBSZWJ1aWxkIGxheWVyT3JkZXIgcHJlc2VydmluZyBncm91cHMgaW4gdGhlaXIgcmVsYXRpdmUgcG9zaXRpb25zLlxuICAvLyBSZXBsYWNlIGVhY2ggc3RyaW5nIGVudHJ5IHdpdGggaXRzIHVwZGF0ZWQgcG9zaXRpb24gZnJvbSBuZXdGbGF0TGF5ZXJPcmRlcixcbiAgLy8gYW5kIGtlZXAgZ3JvdXBzIGFzLWlzLlxuICBjb25zdCBleGlzdGluZ0ZsYXRJZHMgPSBuZXcgU2V0KFxuICAgIGN1cnJlbnRPcmRlci5maWx0ZXIoZW50cnkgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykgYXMgc3RyaW5nW11cbiAgKTtcbiAgY29uc3QgbmV3SW5zZXJ0ZWRJZHMgPSBuZXdGbGF0TGF5ZXJPcmRlci5maWx0ZXIoaWQgPT4gIWV4aXN0aW5nRmxhdElkcy5oYXMoaWQpKTtcblxuICAvLyBSZWJ1aWxkOiB3YWxrIHRocm91Z2ggY3VycmVudE9yZGVyLCByZXBsYWNlIHN0cmluZyBlbnRyaWVzIHdpdGggdGhlaXJcbiAgLy8gbmV3IHBvc2l0aW9uIGVxdWl2YWxlbnRzIGZyb20gbmV3RmxhdExheWVyT3JkZXIsIHRoZW4gYXBwZW5kIGFueSBuZXdseSBpbnNlcnRlZCBsYXllcnNcbiAgY29uc3QgcmVzdWx0OiBMYXllck9yZGVyID0gW107XG4gIGNvbnN0IGZsYXRRdWV1ZSA9IFsuLi5uZXdGbGF0TGF5ZXJPcmRlci5maWx0ZXIoaWQgPT4gZXhpc3RpbmdGbGF0SWRzLmhhcyhpZCkpXTtcbiAgbGV0IGZsYXRJZHggPSAwO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgY3VycmVudE9yZGVyKSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICByZXN1bHQucHVzaChlbnRyeSBhcyBMYXllck9yZGVyR3JvdXApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXBsYWNlIHdpdGggY29ycmVzcG9uZGluZyBlbnRyeSBmcm9tIHJlb3JkZXJlZCBmbGF0IGxpc3RcbiAgICAgIGlmIChmbGF0SWR4IDwgZmxhdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQucHVzaChmbGF0UXVldWVbZmxhdElkeF0pO1xuICAgICAgICBmbGF0SWR4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIGFueSBuZXdseSBpbnNlcnRlZCBsYXllcnMgYXQgdGhlIGZyb250ICh0aGV5IGFyZSBuZXcpXG4gIHJldHVybiB7XG4gICAgbmV3TGF5ZXJPcmRlcjogWy4uLm5ld0luc2VydGVkSWRzLCAuLi5yZXN1bHRdLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIHNhdmVkIGxheWVyT3JkZXIgd2l0aCBjdXJyZW50IHN0YXRlIHRvIHJlc3RvcmUgbGF5ZXIgZ3JvdXBzLlxuICogQ2FsbGVkIGFmdGVyIGxheWVycyBoYXZlIGJlZW4gbWVyZ2VkLiBJZiB0aGUgc2F2ZWQgY29uZmlnIGNvbnRhaW5zIGEgbGF5ZXJPcmRlclxuICogd2l0aCBncm91cHMsIHRoaXMgcmVwbGFjZXMgdGhlIGZsYXQgbGF5ZXJPcmRlciB3aXRoIHRoZSBzYXZlZCBoaWVyYXJjaGljYWwgb25lLFxuICogZmlsdGVyaW5nIG91dCBhbnkgbGF5ZXIgSURzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyT3JkZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHNhdmVkTGF5ZXJPcmRlcj86IGFueVtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmICghc2F2ZWRMYXllck9yZGVyIHx8ICFBcnJheS5pc0FycmF5KHNhdmVkTGF5ZXJPcmRlcikgfHwgc2F2ZWRMYXllck9yZGVyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBzYXZlZCBsYXllck9yZGVyIGNvbnRhaW5zIGFueSBncm91cHNcbiAgY29uc3QgaGFzR3JvdXBzID0gc2F2ZWRMYXllck9yZGVyLnNvbWUoZW50cnkgPT4gaXNQbGFpbk9iamVjdChlbnRyeSkpO1xuICBpZiAoIWhhc0dyb3Vwcykge1xuICAgIC8vIE5vIGdyb3VwcyAtIHRoZSBsYXllciBtZXJnZXIgYWxyZWFkeSBoYW5kbGVkIG9yZGVyaW5nIHZpYSBwcmVzZXJ2ZUxheWVyT3JkZXJcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBJZiBsYXllcnMgaGF2ZW4ndCBiZWVuIG1lcmdlZCB5ZXQsIHN0b3JlIGZvciBsYXRlclxuICBpZiAoc3RhdGUubGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyT3JkZXJUb0JlTWVyZ2VkOiBzYXZlZExheWVyT3JkZXJcbiAgICB9O1xuICB9XG5cbiAgLy8gQnVpbGQgYSBzZXQgb2YgdmFsaWQgbGF5ZXIgSURzIGZyb20gY3VycmVudCBzdGF0ZVxuICBjb25zdCB2YWxpZExheWVySWRzID0gbmV3IFNldChzdGF0ZS5sYXllcnMubWFwKGwgPT4gbC5pZCkpO1xuXG4gIC8vIFJlY3Vyc2l2ZWx5IGZpbHRlciB0aGUgc2F2ZWQgbGF5ZXJPcmRlciB0byBvbmx5IGluY2x1ZGUgdmFsaWQgbGF5ZXJzXG4gIGZ1bmN0aW9uIGZpbHRlckxheWVyT3JkZXIob3JkZXI6IGFueVtdKTogTGF5ZXJPcmRlciB7XG4gICAgY29uc3QgcmVzdWx0OiBMYXllck9yZGVyID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvcmRlcikge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gZW50cnkgYXMgTGF5ZXJPcmRlckdyb3VwO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEdyb3VwT3JkZXIgPSBmaWx0ZXJMYXllck9yZGVyKGdyb3VwLmxheWVyT3JkZXIpO1xuICAgICAgICAvLyBLZWVwIHRoZSBncm91cCBldmVuIGlmIGVtcHR5ICh1c2VyIG1heSB3YW50IHRoZSBlbXB0eSBncm91cClcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgIGxheWVyT3JkZXI6IGZpbHRlcmVkR3JvdXBPcmRlclxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyAmJiB2YWxpZExheWVySWRzLmhhcyhlbnRyeSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29uc3QgcmVzdG9yZWRMYXllck9yZGVyID0gZmlsdGVyTGF5ZXJPcmRlcihzYXZlZExheWVyT3JkZXIpO1xuXG4gIC8vIEZpbmQgYW55IGxheWVycyBpbiB0aGUgY3VycmVudCBzdGF0ZSB0aGF0IGFyZW4ndCBpbiB0aGUgcmVzdG9yZWQgb3JkZXJcbiAgLy8gKGNvdWxkIGhhcHBlbiBpZiBsYXllcnMgd2VyZSBhZGRlZCBiZXR3ZWVuIHNhdmUgYW5kIGxvYWQpXG4gIGNvbnN0IGxheWVySWRzSW5SZXN0b3JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmdW5jdGlvbiBjb2xsZWN0SWRzKG9yZGVyOiBhbnlbXSkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb3JkZXIpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgICBjb2xsZWN0SWRzKChlbnRyeSBhcyBMYXllck9yZGVyR3JvdXApLmxheWVyT3JkZXIpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxheWVySWRzSW5SZXN0b3JlZC5hZGQoZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2xsZWN0SWRzKHJlc3RvcmVkTGF5ZXJPcmRlcik7XG5cbiAgLy8gQWRkIGFueSBtaXNzaW5nIGxheWVycyBhdCB0aGUgdG9wXG4gIGNvbnN0IG1pc3NpbmdMYXllcnMgPSBzdGF0ZS5sYXllcnMuZmlsdGVyKGwgPT4gIWxheWVySWRzSW5SZXN0b3JlZC5oYXMobC5pZCkpLm1hcChsID0+IGwuaWQpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJPcmRlcjogWy4uLm1pc3NpbmdMYXllcnMsIC4uLnJlc3RvcmVkTGF5ZXJPcmRlcl0sXG4gICAgbGF5ZXJPcmRlclRvQmVNZXJnZWQ6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBpbnRlcmFjdGlvbnMgd2l0aCBzYXZlZCBjb25maWdcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUludGVyYWN0aW9uczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+IHwgdW5kZWZpbmVkXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkOiBOZXN0ZWRQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnIHx8IGtleSA9PT0gJ2dlb2NvZGVyJ1xuICAgICAgICAgID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWdcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHtlbmFibGVkLCAuLi5jb25maWdTYXZlZH0gPSBpbnRlcmFjdGlvblRvQmVNZXJnZWRba2V5XSB8fCB7fTtcblxuICAgICAgbGV0IGNvbmZpZ1RvTWVyZ2UgPSBjb25maWdTYXZlZDtcblxuICAgICAgaWYgKGtleSA9PT0gJ3Rvb2x0aXAnKSB7XG4gICAgICAgIGNvbnN0IHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9ID0gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29uZmlnU2F2ZWQgYXMgU2F2ZWRJbnRlcmFjdGlvbkNvbmZpZ1sndG9vbHRpcCddXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gbWVyZ2UgbmV3IGRhdGFzZXQgdG9vbHRpcHMgd2l0aCBvcmlnaW5hbCBkYXRhc2V0IHRvb2x0aXBzXG4gICAgICAgIGNvbmZpZ1RvTWVyZ2UgPSB7XG4gICAgICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgICAgICAuLi4oY3VycmVudENvbmZpZyBhcyBUb29sdGlwSW5mb1snY29uZmlnJ10pLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIC4uLm1lcmdlZFRvb2x0aXBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVubWVyZ2VkVG9vbHRpcCkubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIHVubWVyZ2VkLnRvb2x0aXAgPSB7ZmllbGRzVG9TaG93OiB1bm1lcmdlZFRvb2x0aXAsIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCl9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lcmdlZFtrZXldID0ge1xuICAgICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldLFxuICAgICAgICBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpLFxuICAgICAgICAuLi4oY3VycmVudENvbmZpZ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25maWc6IHBpY2soXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4uY3VycmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgIC4uLmNvbmZpZ1RvTWVyZ2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uKHN0YXRlLCB1bm1lcmdlZClcbiAgfTtcbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUludGVyYWN0aW9uQ29uZmlncyhjb25maWdzOiBTYXZlZEludGVyYWN0aW9uQ29uZmlnW10pOiBTYXZlZEludGVyYWN0aW9uQ29uZmlnIHtcbiAgY29uc3QgY29tYmluZWQgPSB7Li4uY29uZmlnc1swXX07XG4gIC8vIGhhbmRsZSBlYWNoIHByb3BlcnR5IGtleSBvZiBhbiBgSW50ZXJhY3Rpb25Db25maWdgLCBlLmcuIHRvb2x0aXAsIGdlb2NvZGVyLCBicnVzaCwgY29vcmRpbmF0ZVxuICAvLyBieSBjb21iaW5pbmcgdmFsdWVzIGZvciBlYWNoIGFtb25nIGFsbCBwYXNzZWQgaW4gY29uZmlnc1xuXG4gIGZvciAoY29uc3Qga2V5IGluIGNvbWJpbmVkKSB7XG4gICAgY29uc3QgdG9CZUNvbWJpbmVkUHJvcHMgPSBjb25maWdzLm1hcChjID0+IGNba2V5XSk7XG5cbiAgICAvLyBhbGwgb2YgdGhlc2UgaGF2ZSBhbiBlbmFibGVkIGJvb2xlYW5cbiAgICBjb21iaW5lZFtrZXldID0ge1xuICAgICAgLy8gYXJlIGFueSBvZiB0aGUgY29uZmlncycgZW5hYmxlZCB2YWx1ZXMgdHJ1ZT9cbiAgICAgIGVuYWJsZWQ6IHRvQmVDb21iaW5lZFByb3BzLnNvbWUocCA9PiBwPy5lbmFibGVkKVxuICAgIH07XG5cbiAgICBpZiAoa2V5ID09PSAndG9vbHRpcCcpIHtcbiAgICAgIC8vIGFyZSBhbnkgb2YgdGhlIGNvbmZpZ3MnIGNvbXBhcmVNb2RlIHZhbHVlcyB0cnVlP1xuICAgICAgY29tYmluZWRba2V5XS5jb21wYXJlTW9kZSA9IHRvQmVDb21iaW5lZFByb3BzLnNvbWUocCA9PiBwPy5jb21wYXJlTW9kZSk7XG5cbiAgICAgIC8vIHJldHVybiB0aGUgY29tcGFyZSB0eXBlIG1vZGUsIGl0IHdpbGwgYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlXG4gICAgICBjb21iaW5lZFtrZXldLmNvbXBhcmVUeXBlID0gZ2V0VmFsdWVXaXRoSGlnaGVzdE9jY3VycmVuY2UoXG4gICAgICAgIHRvQmVDb21iaW5lZFByb3BzLm1hcChwID0+IHAuY29tcGFyZVR5cGUpXG4gICAgICApO1xuXG4gICAgICAvLyBjb21iaW5lIGZpZWxkc1RvU2hvdyBhbW9uZyBhbGwgZGF0YXNldCBpZHNcbiAgICAgIGNvbWJpbmVkW2tleV0uZmllbGRzVG9TaG93ID0gdG9CZUNvbWJpbmVkUHJvcHNcbiAgICAgICAgLm1hcChwID0+IHAuZmllbGRzVG9TaG93KVxuICAgICAgICAucmVkdWNlKChhY2MsIG5leHRGaWVsZHNUb1Nob3cpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5leHREYXRhSWRLZXkgaW4gbmV4dEZpZWxkc1RvU2hvdykge1xuICAgICAgICAgICAgY29uc3QgbmV4dFRvb2x0aXBGaWVsZHMgPSBuZXh0RmllbGRzVG9TaG93W25leHREYXRhSWRLZXldO1xuICAgICAgICAgICAgaWYgKCFhY2NbbmV4dERhdGFJZEtleV0pIHtcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGFzZXQgaWQgaXMgbm90IHByZXNlbnQgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAgICAgICAgICAgIC8vIHRoZW4gYWRkIGl0IHdpdGggaXRzIHRvb2x0aXAgZmllbGRzXG4gICAgICAgICAgICAgIGFjY1tuZXh0RGF0YUlkS2V5XSA9IG5leHRUb29sdGlwRmllbGRzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBkYXRhc2V0IGlkIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICAgICAgICAgICAgLy8gc28gb25seSBhZGQgdGhlIG5leHQgdG9vbHRpcCBmaWVsZHMgZm9yIHRoaXMgZGF0YXNldCdzIGFycmF5IGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHByZXNlbnQsXG4gICAgICAgICAgICAgIC8vIHVzaW5nIHRoZSB0b29sdGlwRmllbGQubmFtZSBwcm9wZXJ0eSBmb3IgdW5pcXVlbmVzc1xuICAgICAgICAgICAgICBuZXh0VG9vbHRpcEZpZWxkcy5mb3JFYWNoKG5leHRURiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NbbmV4dERhdGFJZEtleV0uZmluZCgoe25hbWV9KSA9PiBuZXh0VEYubmFtZSA9PT0gbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgIGFjY1tuZXh0RGF0YUlkS2V5XS5wdXNoKG5leHRURik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdicnVzaCcpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGJpZ2dlc3QgYnJ1c2ggc2l6ZVxuICAgICAgY29tYmluZWRba2V5XS5zaXplID1cbiAgICAgICAgYWdncmVnYXRlKHRvQmVDb21iaW5lZFByb3BzLCBBR0dSRUdBVElPTl9UWVBFUy5tYXhpbXVtLCBwID0+IHAuc2l6ZSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZ2VvY29kZXInKSB7XG4gICAgICBjb21iaW5lZFtrZXldLmxpbWl0U2VhcmNoID0gdG9CZUNvbWJpbmVkUHJvcHMuc29tZShwID0+IHA/LmxpbWl0U2VhcmNoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29tYmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvbjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgdW5tZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz5cbikge1xuICBpZiAoIXVubWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3cpIHtcbiAgICByZXR1cm4gc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbHRpcDoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkLnRvb2x0aXAsXG4gICAgICAuLi4odHlwZW9mIHVubWVyZ2VkPy50b29sdGlwPy5lbmFibGVkID09PSAnYm9vbGVhbidcbiAgICAgICAgPyB7ZW5hYmxlZDogdW5tZXJnZWQudG9vbHRpcC5lbmFibGVkfVxuICAgICAgICA6IHt9KSxcbiAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvdyxcbiAgICAgICAgLi4udW5tZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUludGVyYWN0aW9uRGF0YXNldElkcyhpbnRlcmFjdGlvbkNvbmZpZywgZGF0YUlkOiBzdHJpbmcsIGRhdGFJZFRvUmVwbGFjZTogc3RyaW5nKSB7XG4gIGlmIChpbnRlcmFjdGlvbkNvbmZpZz8udG9vbHRpcD8uZmllbGRzVG9TaG93W2RhdGFJZF0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAsXG4gICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgIFtkYXRhSWRUb1JlcGxhY2VdOiBpbnRlcmFjdGlvbkNvbmZpZz8udG9vbHRpcD8uZmllbGRzVG9TaG93W2RhdGFJZF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogTWVyZ2Ugc3BsaXRNYXBzIGNvbmZpZyB3aXRoIGN1cnJlbnQgdmlzU3RldGUuXG4gKiAxLiBpZiBjdXJyZW50IG1hcCBpcyBzcGxpdCwgYnV0IHNwbGl0TWFwIERPRVNOT1QgY29udGFpbiBtYXBzXG4gKiAgICA6IGRvbid0IG1lcmdlIGFueXRoaW5nXG4gKiAyLiBpZiBjdXJyZW50IG1hcCBpcyBOT1Qgc3BsaXQsIGJ1dCBzcGxpdE1hcHMgY29udGFpbiBtYXBzXG4gKiAgICA6IGFkZCB0byBzcGxpdE1hcHMsIGFuZCBhZGQgY3VycmVudCBsYXllcnMgdG8gc3BsaXRNYXBzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVNwbGl0TWFwczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgc3BsaXRNYXBzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydzcGxpdE1hcHMnXSA9IFtdXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkID0gWy4uLnN0YXRlLnNwbGl0TWFwc107XG4gIGNvbnN0IHVubWVyZ2VkID0gW107XG4gIHNwbGl0TWFwcy5mb3JFYWNoKChzbSwgaSkgPT4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhzbS5sYXllcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgLy8gY2hlY2sgaWYgbGF5ZXIgZXhpc3RzXG4gICAgICAgIGNvbnN0IHB1c2hUbyA9IHN0YXRlLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gaWQpID8gbWVyZ2VkIDogdW5tZXJnZWQ7XG5cbiAgICAgICAgLy8gY3JlYXRlIG1hcCBwYW5lbCBpZiBjdXJyZW50IG1hcCBpcyBub3Qgc3BsaXRcbiAgICAgICAgcHVzaFRvW2ldID0gcHVzaFRvW2ldIHx8IHtcbiAgICAgICAgICAvLyBrZWVwIGlkXG4gICAgICAgICAgLi4uc20sXG4gICAgICAgICAgbGF5ZXJzOiBwdXNoVG8gPT09IG1lcmdlZCA/IGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcChzdGF0ZS5sYXllcnMpIDogW11cbiAgICAgICAgfTtcbiAgICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgICAuLi5wdXNoVG9baV0ubGF5ZXJzLFxuICAgICAgICAgIFtpZF06IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgYXJlIG1lcmdpbmcgaWYgdGhlcmUgYXJlIG5vIGxheWVycyBpbiBib3RoIHNwbGl0IG1hcFxuICAgICAgbWVyZ2VkLnB1c2goc20pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzcGxpdE1hcHM6IG1lcmdlZCxcbiAgICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuc3BsaXRNYXBzVG9CZU1lcmdlZCwgLi4udW5tZXJnZWRdXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgZWZmZWN0cyB3aXRoIHNhdmVkIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VFZmZlY3RzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBlZmZlY3RzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydlZmZlY3RzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgbmV3RWZmZWN0cyA9IFtcbiAgICAuLi5zdGF0ZS5lZmZlY3RzLFxuICAgIC4uLihlZmZlY3RzIHx8IFtdKVxuICAgICAgLm1hcChlZmZlY3QgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbUNvbmZpZ1xuICAgICAgICAgID8gY3JlYXRlRWZmZWN0KFxuICAgICAgICAgICAgICBkZWVwbWVyZ2UuYWxsKFtcbiAgICAgICAgICAgICAgICBlZmZlY3QsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLy8gY29sbGFwc2UgYWxsIHBhbmVscyB3aGVuIGxvYWRpbmcgZWZmZWN0c1xuICAgICAgICAgICAgICAgICAgaXNDb25maWdBY3RpdmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogKGVmZmVjdCBhcyBFZmZlY3RUeXBlKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKGVmZmVjdCA9PiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGVmZmVjdCAmJiBlZmZlY3QuaXNWYWxpZFRvU2F2ZSgpKTtcbiAgICAgIH0pXG4gIF07XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0czogbmV3RWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlcjogbmV3RWZmZWN0cy5tYXAoZWZmZWN0ID0+IGVmZmVjdC5pZClcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBhbm5vdGF0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbm5vdGF0aW9uczxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBhbm5vdGF0aW9uczogYW55W10pOiBTIHtcbiAgaWYgKCFhbm5vdGF0aW9ucyB8fCAhYW5ub3RhdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChzdGF0ZS5hbm5vdGF0aW9ucy5tYXAoYSA9PiBhLmlkKSk7XG4gIGNvbnN0IHZhbGlkQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc1xuICAgIC5maWx0ZXIoXG4gICAgICBhID0+XG4gICAgICAgIGEgJiZcbiAgICAgICAgYS5pZCAmJlxuICAgICAgICAhZXhpc3RpbmdJZHMuaGFzKGEuaWQpICYmXG4gICAgICAgIGlzQW5ub3RhdGlvbktpbmQoYS5raW5kKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGEuYW5jaG9yUG9pbnQpICYmXG4gICAgICAgIGEuYW5jaG9yUG9pbnQubGVuZ3RoID09PSAyXG4gICAgKVxuICAgIC5tYXAoYSA9PiAoe1xuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgYXV0b1NpemU6IHRydWUsXG4gICAgICBhdXRvU2l6ZVk6IHRydWUsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBsaW5lQ29sb3I6IElOSVRJQUxfQU5OT1RBVElPTl9MSU5FX0NPTE9SLFxuICAgICAgbGluZVdpZHRoOiBJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCxcbiAgICAgIHRleHRXaWR0aDogMCxcbiAgICAgIHRleHRIZWlnaHQ6IDAsXG4gICAgICAuLi5hXG4gICAgfSkpO1xuICBpZiAoIXZhbGlkQW5ub3RhdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IFsuLi5zdGF0ZS5hbm5vdGF0aW9ucywgLi4udmFsaWRBbm5vdGF0aW9uc11cbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBpbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwIHdpdGggc2F2ZWQgY29uZmlnLFxuICogdmFsaWRhdGUgZmllbGRzVG9TaG93XG4gKlxuICogQHBhcmFtIHN0YXRlXG4gKiBAcGFyYW0gdG9vbHRpcENvbmZpZ1xuICogQHJldHVybiAtIHttZXJnZWRUb29sdGlwOiB7fSwgdW5tZXJnZWRUb29sdGlwOiB7fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHRvb2x0aXBDb25maWc6IFBpY2s8VG9vbHRpcEluZm9bJ2NvbmZpZyddLCAnZmllbGRzVG9TaG93Jz4gfCBudWxsID0gbnVsbFxuKSB7XG4gIGNvbnN0IHVubWVyZ2VkVG9vbHRpcDogVG9vbHRpcEluZm9bJ2NvbmZpZyddWydmaWVsZHNUb1Nob3cnXSA9IHt9O1xuICBjb25zdCBtZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG5cbiAgaWYgKFxuICAgICF0b29sdGlwQ29uZmlnIHx8XG4gICAgIXRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93IHx8XG4gICAgIU9iamVjdC5rZXlzKHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93KS5sZW5ndGhcbiAgKSB7XG4gICAgcmV0dXJuIHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9O1xuICB9XG5cbiAgZm9yIChjb25zdCBkYXRhSWQgaW4gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpIHtcbiAgICBpZiAoIXN0YXRlLmRhdGFzZXRzW2RhdGFJZF0gfHwgc3RhdGUuaXNNZXJnaW5nRGF0YXNldHNbZGF0YUlkXSkge1xuICAgICAgLy8gaXMgbm90IHlldCBsb2FkZWRcbiAgICAgIHVubWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgZGF0YXNldCBpcyBsb2FkZWRcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uZmllbGRzLm1hcChkID0+IGQubmFtZSk7XG4gICAgICBjb25zdCBmb3VuZEZpZWxkc1RvU2hvdyA9IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0uZmlsdGVyKGZpZWxkID0+XG4gICAgICAgIGFsbEZpZWxkcy5pbmNsdWRlcyhmaWVsZC5uYW1lKVxuICAgICAgKTtcblxuICAgICAgbWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gZm91bmRGaWVsZHNUb1Nob3c7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9O1xufVxuLyoqXG4gKiBNZXJnZSBsYXllckJsZW5kaW5nIHdpdGggc2F2ZWRcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyQmxlbmRpbmc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyQmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVyQmxlbmRpbmcnXVxuKTogUyB7XG4gIGlmIChsYXllckJsZW5kaW5nICYmIExBWUVSX0JMRU5ESU5HU1tsYXllckJsZW5kaW5nXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyQmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIG11bHRpcGxlIGxheWVyIGJsZW5kaW5nIGNvbmZpZ3MgaW50byBhIHNpbmdsZSBzdHJpbmdcbiAqIGJ5IHJldHVybmluZyB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3Qgb2NjdXJyZW5jZVxuICovXG5mdW5jdGlvbiBjb21iaW5lTGF5ZXJCbGVuZGluZ0NvbmZpZ3MoY29uZmlnczogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBsYXllciBibGVuZGluZyB0eXBlXG4gIHJldHVybiBnZXRWYWx1ZVdpdGhIaWdoZXN0T2NjdXJyZW5jZShjb25maWdzKTtcbn1cblxuLyoqXG4gKiBNZXJnZSBvdmVybGF5QmxlbmRpbmcgd2l0aCBzYXZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPdmVybGF5QmxlbmRpbmc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIG92ZXJsYXlCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnb3ZlcmxheUJsZW5kaW5nJ11cbik6IFMge1xuICBpZiAob3ZlcmxheUJsZW5kaW5nICYmIE9WRVJMQVlfQkxFTkRJTkdTW292ZXJsYXlCbGVuZGluZ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIG11bHRpcGxlIG92ZXJsYXkgYmxlbmRpbmcgY29uZmlncyBpbnRvIGEgc2luZ2xlIHN0cmluZ1xuICogYnkgcmV0dXJuaW5nIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBvY2N1cnJlbmNlXG4gKiovXG5mdW5jdGlvbiBjb21iaW5lT3ZlcmxheUJsZW5kaW5nQ29uZmlncyhjb25maWdzOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICAvLyByZXR1cm4gdGhlIG1vZGUgb2YgdGhlIG92ZXJsYXkgYmxlbmRpbmcgdHlwZVxuICByZXR1cm4gZ2V0VmFsdWVXaXRoSGlnaGVzdE9jY3VycmVuY2UoY29uZmlncyk7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5pbWF0aW9uIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbmltYXRpb25Db25maWc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFuaW1hdGlvbjogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnYW5pbWF0aW9uQ29uZmlnJ11cbik6IFMge1xuICBpZiAoYW5pbWF0aW9uICYmIGFuaW1hdGlvbi5jdXJyZW50VGltZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgICAgIC4uLmFuaW1hdGlvbixcbiAgICAgICAgZG9tYWluOiBudWxsXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUFuaW1hdGlvbkNvbmZpZ3MoY29uZmlnczogU2F2ZWRBbmltYXRpb25Db25maWdbXSk6IFNhdmVkQW5pbWF0aW9uQ29uZmlnIHtcbiAgLy8gZ2V0IHRoZSBzbWFsbGVzdCB2YWx1ZXMgb2YgY3VycmVudFRpbWUgYW5kIHNwZWVkIGFtb25nIGFsbCBjb25maWdzXG4gIHJldHVybiB7XG4gICAgY3VycmVudFRpbWU6IGFnZ3JlZ2F0ZShjb25maWdzLCBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLCBjID0+IGMuY3VycmVudFRpbWUpID8/IG51bGwsXG4gICAgc3BlZWQ6IGFnZ3JlZ2F0ZShjb25maWdzLCBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLCBjID0+IGMuc3BlZWQpID8/IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCBsYXllciBjb2x1bW5zIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICpcbiAqIEBwYXJhbSBmaWVsZHNcbiAqIEBwYXJhbSBzYXZlZENvbHNcbiAqIEBwYXJhbSBlbXB0eUNvbHNcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuIC0gdmFsaWRhdGVkIGNvbHVtbnMgb3IgbnVsbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgc2F2ZWRDb2xzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge30sXG4gIGVtcHR5Q29sczogTGF5ZXJDb2x1bW5zLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKSB7XG4gIC8vIFByZXBhcmUgY29sdW1ucyBmb3IgdGhlIHZhbGlkYXRvclxuICBjb25zdCBjb2x1bW5zOiB0eXBlb2YgZW1wdHlDb2xzID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVtcHR5Q29scykpIHtcbiAgICBjb2x1bW5zW2tleV0gPSB7Li4uZW1wdHlDb2xzW2tleV19O1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBzYXZlZENvbHNba2V5XTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleCgoe25hbWV9KSA9PiBuYW1lID09PSBzYXZlZCk7XG5cbiAgICAgIGlmIChmaWVsZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBmb3VuZCBjb2x1bW5zXG4gICAgICAgIGNvbHVtbnNba2V5XS5maWVsZElkeCA9IGZpZWxkSWR4O1xuICAgICAgICBjb2x1bW5zW2tleV0udmFsdWUgPSBzYXZlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIGFjdHVhbCBjb2x1bW4gZmllbGRJZHgsIGluIGNhc2UgaXQgaGFzIGNoYW5nZWRcbiAgY29uc3QgYWxsQ29sRm91bmQgPSBPYmplY3Qua2V5cyhjb2x1bW5zKS5ldmVyeShrZXkgPT5cbiAgICB2YWxpZGF0ZUNvbHVtbihjb2x1bW5zW2tleV0sIGNvbHVtbnMsIGZpZWxkcylcbiAgKTtcblxuICBjb25zdCBydiA9IGFsbENvbEZvdW5kID8gY29sdW1ucyA6IG51bGw7XG4gIGlmIChvcHRpb25zLnRocm93T25FcnJvcikge1xuICAgIGNvbnN0IHJlcXVpcmVkQ29sdW1ucyA9IE9iamVjdC5rZXlzKGVtcHR5Q29scykuZmlsdGVyKGsgPT4gIWVtcHR5Q29sc1trXS5vcHRpb25hbCk7XG4gICAgY29uc3QgbWlzc2luZ0NvbHVtbnMgPSByZXF1aXJlZENvbHVtbnMuZmlsdGVyKGsgPT4gIWNvbHVtbnM/LltrXS52YWx1ZSk7XG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgbWlzc2luZyBvciBpbnZhbGlkIGNvbHVtbnM6ICR7bWlzc2luZ0NvbHVtbnMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnQ29sdW1ucyA9IE9iamVjdC5rZXlzKHNhdmVkQ29scyk7XG4gICAgY29uc3QgaW52YWxpZENvbHVtbnMgPSBjb25maWdDb2x1bW5zLmZpbHRlcihrID0+ICFjb2x1bW5zPy5ba10/LnZhbHVlKTtcbiAgICBpZiAoaW52YWxpZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIGNvbHVtbnM6ICR7aW52YWxpZENvbHVtbnMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnY7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgbGF5ZXIgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbHVtbihcbiAgY29sdW1uOiBMYXllckNvbHVtbiAmIHt2YWxpZGF0b3I/OiB0eXBlb2YgdmFsaWRhdGVDb2x1bW59LFxuICBjb2x1bW5zOiBMYXllckNvbHVtbnMsXG4gIGFsbEZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddXG4pOiBib29sZWFuIHtcbiAgaWYgKGNvbHVtbi5vcHRpb25hbCB8fCBjb2x1bW4udmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoY29sdW1uLnZhbGlkYXRvcikge1xuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdG9yKGNvbHVtbiwgY29sdW1ucywgYWxsRmllbGRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdGV4dCBsYWJlbCBjb25maWcgd2l0aCBuZXcgZGF0YVxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBUZXh0TGFiZWxTY2hlbWFWMVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZmllbGRzXG4gKiBAcGFyYW0ge09iamVjdH0gc2F2ZWRUZXh0TGFiZWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gdmFsaWRhdGVkIHRleHRsYWJlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChcbiAgZmllbGRzLFxuICBbbGF5ZXJUZXh0TGFiZWxdLFxuICBzYXZlZFRleHRMYWJlbCxcbiAgb3B0aW9uczoge3Rocm93T25FcnJvcj86IGJvb2xlYW59ID0ge31cbikge1xuICBjb25zdCBzYXZlZFRleHRMYWJlbHMgPSBBcnJheS5pc0FycmF5KHNhdmVkVGV4dExhYmVsKSA/IHNhdmVkVGV4dExhYmVsIDogW3NhdmVkVGV4dExhYmVsXTtcblxuICAvLyB2YWxpZGF0ZSBmaWVsZFxuICByZXR1cm4gc2F2ZWRUZXh0TGFiZWxzLm1hcCh0ZXh0TGFiZWwgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGV4dExhYmVsLmZpZWxkXG4gICAgICA/IGZpZWxkcy5maW5kKGZkID0+XG4gICAgICAgICAgT2JqZWN0LmtleXModGV4dExhYmVsLmZpZWxkKS5ldmVyeShrZXkgPT4gdGV4dExhYmVsLmZpZWxkW2tleV0gPT09IGZkW2tleV0pXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkICYmIG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIHRleHQgbGFiZWwgZmllbGQ6ICR7SlNPTi5zdHJpbmdpZnkodGV4dExhYmVsLmZpZWxkKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGF5ZXJUZXh0TGFiZWwpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBrZXkgPT09ICdmaWVsZCcgPyBmaWVsZCA6IHRleHRMYWJlbFtrZXldIHx8IGxheWVyVGV4dExhYmVsW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTYXZlZCB2aXN1YWwgY2hhbm5lbCBmaWVsZC9zY2FsZSBtYXkgbGl2ZSBpbiBhbnkgb2Y6XG4gKiAtIGBjb25maWdba2V5XWAgYWZ0ZXIgc2NoZW1hIHBhcnNlIChWaXN1YWxDaGFubmVsU2NoZW1hVjEgZm9sZHMgY2hhbm5lbHMgaW50byBjb25maWcpXG4gKiAtIGB2aXN1YWxDaGFubmVsc1trZXldYCBhcyBhIHNpYmxpbmcgb2YgYGNvbmZpZ2AgKHVucGFyc2VkIGFkZERhdGFUb01hcCBwYXlsb2FkKVxuICogLSBgY29uZmlnLnZpc3VhbENoYW5uZWxzW2tleV1gIChjb21tb24gbWlzdGFrZSBvZiBuZXN0aW5nIHZpc3VhbENoYW5uZWxzIGluc2lkZSBjb25maWcpXG4gKlxuICogV2l0aG91dCB0aGlzIGxvb2t1cCwgcHJvZ3JhbW1hdGljIEdlb0pTT04gc3Ryb2tlQ29sb3JGaWVsZCBuZXZlciBiaW5kcyBhbmRcbiAqIHN0cm9rZUNvbG9yRG9tYWluIHN0YXlzIGF0IHRoZSBkZWZhdWx0IGBbMCwgMV1gIChrZXBsZXIuZ2wgIzMwNjEpLlxuICovXG5mdW5jdGlvbiBnZXRTYXZlZFZpc3VhbENoYW5uZWxWYWx1ZShzYXZlZExheWVyOiBQYXJzZWRMYXllciwga2V5OiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBjb25maWcgPSBzYXZlZExheWVyLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICBpZiAoY29uZmlnICYmIGNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29uZmlnW2tleV07XG4gIH1cbiAgY29uc3QgY2hhbm5lbHMgPVxuICAgIChzYXZlZExheWVyIGFzIHt2aXN1YWxDaGFubmVscz86IFJlY29yZDxzdHJpbmcsIGFueT59KS52aXN1YWxDaGFubmVscyB8fFxuICAgIChjb25maWcgJiYgY29uZmlnLnZpc3VhbENoYW5uZWxzKTtcbiAgaWYgKGNoYW5uZWxzICYmIHR5cGVvZiBjaGFubmVscyA9PT0gJ29iamVjdCcgJiYgY2hhbm5lbHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNoYW5uZWxzW2tleV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB2aXN1YWwgY2hhbm5lbHMgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllcixcbiAgb3B0aW9uczoge3Rocm93T25FcnJvcj86IGJvb2xlYW59ID0ge31cbik6IG51bGwgfCBMYXllciB7XG4gIE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goKHtmaWVsZCwgc2NhbGUsIGtleX0pID0+IHtcbiAgICBjb25zdCBzYXZlZEZpZWxkID0gZ2V0U2F2ZWRWaXN1YWxDaGFubmVsVmFsdWUoc2F2ZWRMYXllciwgZmllbGQpO1xuICAgIGNvbnN0IHNhdmVkU2NhbGUgPSBnZXRTYXZlZFZpc3VhbENoYW5uZWxWYWx1ZShzYXZlZExheWVyLCBzY2FsZSk7XG4gICAgbGV0IGZvdW5kRmllbGQ7XG4gICAgaWYgKHNhdmVkRmllbGQ/Lm5hbWUpIHtcbiAgICAgIGZvdW5kRmllbGQgPSBmaWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBzYXZlZEZpZWxkLm5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvdW5kQ2hhbm5lbCA9IHtcbiAgICAgIC4uLihmb3VuZEZpZWxkID8ge1tmaWVsZF06IGZvdW5kRmllbGR9IDoge30pLFxuICAgICAgLi4uKHNhdmVkU2NhbGUgPyB7W3NjYWxlXTogc2F2ZWRTY2FsZX0gOiB7fSlcbiAgICB9O1xuICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoZm91bmRDaGFubmVsKTtcbiAgICB9XG5cbiAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICBpZiAob3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNhdmVkRmllbGQ/Lm5hbWU7XG4gICAgICBpZiAoZmllbGROYW1lICYmIGZpZWxkTmFtZSAhPT0gbmV3TGF5ZXIuY29uZmlnW2ZpZWxkXT8ubmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIHZpc3VhbCBjaGFubmVsIGZpZWxkOiAke2ZpZWxkfWApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBuZXdMYXllcjtcbn1cblxudHlwZSBWYWxpZGF0ZUxheWVyT3B0aW9uID0ge1xuICBhbGxvd0VtcHR5Q29sdW1uPzogYm9vbGVhbjtcbiAgdGhyb3dPbkVycm9yPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXSxcbiAgb3B0aW9ucz86IFZhbGlkYXRlTGF5ZXJPcHRpb25cbikge1xuICBjb25zdCB2YWxpZGF0ZWQ6IExheWVyW10gPSBbXTtcbiAgY29uc3QgZmFpbGVkOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdO1xuXG4gIGxheWVycy5mb3JFYWNoKGxheWVyID0+IHtcbiAgICBsZXQgdmFsaWRhdGVMYXllcjogTGF5ZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChsYXllcj8uY29uZmlnPy5kYXRhSWQpIHtcbiAgICAgIGlmIChkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXSkge1xuICAgICAgICAvLyBkYXRhc2V0cyBhcmUgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgdmFsaWRhdGVMYXllciA9IHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShcbiAgICAgICAgICBkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXSxcbiAgICAgICAgICBsYXllcixcbiAgICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZUxheWVyKSB7XG4gICAgICB2YWxpZGF0ZWQucHVzaCh2YWxpZGF0ZUxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGF0YXNldHMgbm90IHlldCBsb2FkZWRcbiAgICAgIGZhaWxlZC5wdXNoKGxheWVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7dmFsaWRhdGVkLCBmYWlsZWR9O1xufVxuXG4vKipcbiAqIEdldCByZXF1aXJlZCBjb2x1bW5zIGZvciB2YWxpZGF0aW9uIGJhc2VkIG9uIGNvbHVtbiBtb2RlXG4gKi9cbmZ1bmN0aW9uIF9nZXRDb2x1bW5Db25maWdGb3JWYWxpZGF0aW9uKG5ld0xheWVyKSB7XG4gIC8vIGZpbmQgY29sdW1uIGZpZWxkSWR4XG4gIGxldCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgLy8gaWYgY29sdW1uTW9kZSBpcyBkZWZpbmVkLCBmaW5kIGNvbHVtbiBtb2RlIGNvbmZpZ1xuICBjb25zdCBjb2xNb2RlQ29uZmlnID0gbmV3TGF5ZXIuY29uZmlnLmNvbHVtbk1vZGVcbiAgICA/IChuZXdMYXllci5zdXBwb3J0ZWRDb2x1bW5Nb2RlcyB8fCBbXSkuZmluZChcbiAgICAgICAgY29sTW9kZSA9PiBjb2xNb2RlLmtleSA9PT0gbmV3TGF5ZXIuY29uZmlnLmNvbHVtbk1vZGVcbiAgICAgIClcbiAgICA6IG51bGw7XG5cbiAgaWYgKGNvbE1vZGVDb25maWcpIHtcbiAgICAvLyBvbmx5IHZhbGlkYXRlIGNvbHVtbnMgaW4gY29sdW1uIG1vZGVcbiAgICBjb2x1bW5Db25maWcgPSBbXG4gICAgICAuLi4oY29sTW9kZUNvbmZpZy5yZXF1aXJlZENvbHVtbnMgfHwgW10pLFxuICAgICAgLi4uKGNvbE1vZGVDb25maWcub3B0aW9uYWxDb2x1bW5zIHx8IFtdKVxuICAgIF0ucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtbkNvbmZpZ1trZXldXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjb2x1bW5Db25maWc7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShcbiAgZGF0YXNldDogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczogVmFsaWRhdGVMYXllck9wdGlvbiA9IHt9XG4pOiBMYXllciB8IG51bGwge1xuICBjb25zdCB7ZmllbGRzLCBpZDogZGF0YUlkfSA9IGRhdGFzZXQ7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIGNvbnN0IHt0aHJvd09uRXJyb3J9ID0gb3B0aW9ucztcbiAgLy8gbGF5ZXIgZG9lc250IGhhdmUgYSB2YWxpZCB0eXBlXG4gIGlmICghdHlwZSB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGxheWVyQ2xhc3NlcywgdHlwZSkgfHwgIXNhdmVkTGF5ZXIuY29uZmlnKSB7XG4gICAgaWYgKHRocm93T25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgaW52YWxpZCB0eXBlIFwiJHt0eXBlfVwiIG9yIGNvbmZpZyBpcyBtaXNzaW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IG5ld0xheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1t0eXBlXSh7XG4gICAgaWQ6IHNhdmVkTGF5ZXIuaWQsXG4gICAgZGF0YUlkLFxuICAgIGxhYmVsOiBzYXZlZExheWVyLmNvbmZpZy5sYWJlbCxcbiAgICBjb2xvcjogc2F2ZWRMYXllci5jb25maWcuY29sb3IsXG4gICAgaXNWaXNpYmxlOiBzYXZlZExheWVyLmNvbmZpZy5pc1Zpc2libGUsXG4gICAgaGlkZGVuOiBzYXZlZExheWVyLmNvbmZpZy5oaWRkZW4sXG4gICAgY29sdW1uTW9kZTogc2F2ZWRMYXllci5jb25maWcuY29sdW1uTW9kZSxcbiAgICBoaWdobGlnaHRDb2xvcjogc2F2ZWRMYXllci5jb25maWcuaGlnaGxpZ2h0Q29sb3JcbiAgfSk7XG5cbiAgY29uc3QgY29sdW1uQ29uZmlnID0gX2dldENvbHVtbkNvbmZpZ0ZvclZhbGlkYXRpb24obmV3TGF5ZXIpO1xuXG4gIGlmIChPYmplY3Qua2V5cyhjb2x1bW5Db25maWcpKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoXG4gICAgICBmaWVsZHMsXG4gICAgICBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgY29sdW1uQ29uZmlnLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gICAgaWYgKGNvbHVtbnMpIHtcbiAgICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgY29sdW1uczoge1xuICAgICAgICAgIC4uLm5ld0xheWVyLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgICAgIC4uLmNvbHVtbnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghb3B0aW9ucy5hbGxvd0VtcHR5Q29sdW1uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0ZXh0TGFiZWwgPVxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbCAmJiBuZXdMYXllci5jb25maWcudGV4dExhYmVsXG4gICAgICA/IHZhbGlkYXRlU2F2ZWRUZXh0TGFiZWwoXG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsXG4gICAgICAgICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKVxuICAgICAgOiBuZXdMYXllci5jb25maWcudGV4dExhYmVsO1xuXG4gIC8vIGNvcHkgdmlzQ29uZmlnIG92ZXIgdG8gZW1wdHlMYXllciB0byBtYWtlIHN1cmUgaXQgaGFzIGFsbCB0aGUgcHJvcHNcbiAgY29uc3QgY29waWVkVmlzQ29uZmlnID0gbmV3TGF5ZXIuY29weUxheWVyQ29uZmlnKFxuICAgIG5ld0xheWVyLmNvbmZpZy52aXNDb25maWcsXG4gICAgc2F2ZWRMYXllci5jb25maWcudmlzQ29uZmlnIHx8IHt9LFxuICAgIHtcbiAgICAgIHNoYWxsb3dDb3B5OiBbJ2NvbG9yUmFuZ2UnLCAnc3Ryb2tlQ29sb3JSYW5nZSddXG4gICAgfVxuICApO1xuXG4gIC8vIGNhbGwgbGF5ZXIgbWV0aG9kcyB0byB2YWxpZGF0ZSB2aXNDb25maWcgd2hlbiBzd2l0Y2hpbmcgZGF0YXNldFxuICBjb25zdCB2aXNDb25maWcgPSBuZXdMYXllci52YWxpZGF0ZVZpc0NvbmZpZ1xuICAgID8gbmV3TGF5ZXIudmFsaWRhdGVWaXNDb25maWcoZGF0YXNldCwgY29waWVkVmlzQ29uZmlnKVxuICAgIDogY29waWVkVmlzQ29uZmlnO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICB2aXNDb25maWcsXG4gICAgdGV4dExhYmVsXG4gIH0pO1xuXG4gIC8vIHZpc3VhbCBjaGFubmVsIGZpZWxkIGlzIHNhdmVkIHRvIGJlIHtuYW1lLCB0eXBlfVxuICAvLyBmaW5kIHZpc3VhbCBjaGFubmVsIGZpZWxkIGJ5IG1hdGNoaW5nIGJvdGggbmFtZSBhbmQgdHlwZVxuICAvLyByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICBuZXdMYXllciA9IHZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyhmaWVsZHMsIG5ld0xheWVyLCBzYXZlZExheWVyLCBvcHRpb25zKTtcblxuICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgaWYgKCFuZXdMYXllci5pc1ZhbGlkVG9TYXZlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaXMgbm90IHZhbGlkIHRvIHNhdmU6ICR7bmV3TGF5ZXIuaWR9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VFZGl0b3I8UyBleHRlbmRzIFZpc1N0YXRlPihzdGF0ZTogUywgc2F2ZWRFZGl0b3I6IFNhdmVkRWRpdG9yKSB7XG4gIGlmICghc2F2ZWRFZGl0b3IpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIGZlYXR1cmVzOiBbLi4uc3RhdGUuZWRpdG9yLmZlYXR1cmVzLCAuLi4oc2F2ZWRFZGl0b3IuZmVhdHVyZXMgfHwgW10pXSxcbiAgICAgIC8vIGlmIHNhdmVkRWRpdG9yLnZpc2libGUgaXMgdW5kZWZpbmVkIGtlZXAgc3RhdGUuZWRpdG9yLnZpc2libGVcbiAgICAgIHZpc2libGU6IHNhdmVkRWRpdG9yLnZpc2libGUgPz8gc3RhdGUuZWRpdG9yLnZpc2libGVcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVFZGl0b3JDb25maWdzKGNvbmZpZ3M6IFNhdmVkRWRpdG9yW10pOiBTYXZlZEVkaXRvciB7XG4gIHJldHVybiBjb25maWdzLnJlZHVjZShcbiAgICAoYWNjLCBuZXh0Q29uZmlnKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIGZlYXR1cmVzOiBbLi4uYWNjLmZlYXR1cmVzLCAuLi4obmV4dENvbmZpZy5mZWF0dXJlcyB8fCBbXSldXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgLy8gc3RhcnQgd2l0aDpcbiAgICAgIC8vIC0gZW1wdHkgYXJyYXkgZm9yIGZlYXR1cmVzIGFjY3VtdWxhdGlvblxuICAgICAgLy8gLSBhbmQgYXJlIGFueSBvZiB0aGUgY29uZmlncycgdmlzaWJsZSB2YWx1ZXMgdHJ1ZT9cbiAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgIHZpc2libGU6IGNvbmZpZ3Muc29tZShjID0+IGM/LnZpc2libGUpXG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGF0YXNldHNCeU9yZGVyKHN0YXRlOiBWaXNTdGF0ZSwgbmV3RGF0YUVudHJpZXM6IERhdGFzZXRzKTogRGF0YXNldHMge1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuZGF0YXNldHMsXG4gICAgLi4ubmV3RGF0YUVudHJpZXNcbiAgfTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlcikpIHtcbiAgICAvLyBwcmVzZXJ2ZURhdGFzZXRPcmRlciAgbWlnaHQgbm90IGluY2x1ZGUgdGhlICBuZXcgZGF0YXNldHNcbiAgICBjb25zdCBuZXdEYXRhc2V0SWRzID0gT2JqZWN0LmtleXMobWVyZ2VkKS5maWx0ZXIoXG4gICAgICBpZCA9PiAhc3RhdGUucHJlc2VydmVEYXRhc2V0T3JkZXI/LmluY2x1ZGVzKGlkKVxuICAgICk7XG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlciwgLi4ubmV3RGF0YXNldElkc10ucmVkdWNlKFxuICAgICAgKGFjY3UsIGRhdGFJZCkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4uKG1lcmdlZFtkYXRhSWRdID8ge1tkYXRhSWRdOiBtZXJnZWRbZGF0YUlkXX0gOiB7fSlcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyoqXG4gKiBTaW1saWFyIHB1cnBvc2UgdG8gYWdncmVnYXRpb24gdXRpbHMgYGdldE1vZGVgIGZ1bmN0aW9uLFxuICogYnV0IHJldHVybnMgdGhlIG1vZGUgaW4gdGhlIHNhbWUgdmFsdWUgdHlwZSB3aXRob3V0IGNvZXJjaW5nIHRvIGEgc3RyaW5nLlxuICogSXQgaWdub3JlcyBgdW5kZWZpbmVkYCBvciBgbnVsbGAgdmFsdWVzLCBidXQgcmV0dXJucyBgbnVsbGAgaWYgbm8gbW9kZSBjb3VsZCBiZSBjYWxjdWxhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZVdpdGhIaWdoZXN0T2NjdXJyZW5jZTxUPihhcnI6IFRbXSk6IFQgfCBudWxsIHtcbiAgY29uc3QgdGFsbHlzID0gbmV3IE1hcCgpO1xuICBhcnIuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgaWYgKG5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGlmICghdGFsbHlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgdGFsbHlzLnNldCh2YWx1ZSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWxseXMuc2V0KHZhbHVlLCB0YWxseXMuZ2V0KHZhbHVlKSArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIC8vIHJldHVybiB0aGUgdmFsdWUgd2l0aCB0aGUgaGlnaGVzdCB0b3RhbCBvY2N1cnJlbmNlIGNvdW50XG4gIGlmICh0YWxseXMuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBbLi4udGFsbHlzLmVudHJpZXMoKV0/LnJlZHVjZSgoYWNjLCBuZXh0KSA9PiAobmV4dFsxXSA+IGFjY1sxXSA/IG5leHQgOiBhY2MpKVswXTtcbn1cblxuZXhwb3J0IGNvbnN0IFZJU19TVEFURV9NRVJHRVJTOiBWaXNTdGF0ZU1lcmdlcnM8YW55PiA9IFtcbiAge1xuICAgIG1lcmdlOiBtZXJnZUxheWVycyxcbiAgICBwcm9wOiAnbGF5ZXJzJyxcbiAgICB0b01lcmdlUHJvcDogJ2xheWVyVG9CZU1lcmdlZCcsXG4gICAgcHJlc2VydmVPcmRlcjogJ3ByZXNlcnZlTGF5ZXJPcmRlcidcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUxheWVyT3JkZXIsXG4gICAgcHJvcDogJ2xheWVyT3JkZXInXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VGaWx0ZXJzLFxuICAgIHByb3A6ICdmaWx0ZXJzJyxcbiAgICB0b01lcmdlUHJvcDogJ2ZpbHRlclRvQmVNZXJnZWQnLFxuICAgIHByZXNlcnZlT3JkZXI6ICdwcmVzZXJ2ZUZpbHRlck9yZGVyJyxcbiAgICByZXBsYWNlUGFyZW50RGF0YXNldElkczogcmVwbGFjZUZpbHRlckRhdGFzZXRJZHNcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUVmZmVjdHMsXG4gICAgcHJvcDogJ2VmZmVjdHMnXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VBbm5vdGF0aW9ucyxcbiAgICBwcm9wOiAnYW5ub3RhdGlvbnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnYW5ub3RhdGlvbnNUb0JlTWVyZ2VkJ1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlSW50ZXJhY3Rpb25zLFxuICAgIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsXG4gICAgdG9NZXJnZVByb3A6ICdpbnRlcmFjdGlvblRvQmVNZXJnZWQnLFxuICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzOiByZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzLFxuICAgIHNhdmVVbm1lcmdlZDogc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uLFxuICAgIGNvbWJpbmVDb25maWdzOiBjb21iaW5lSW50ZXJhY3Rpb25Db25maWdzXG4gIH0sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZycsIGNvbWJpbmVDb25maWdzOiBjb21iaW5lTGF5ZXJCbGVuZGluZ0NvbmZpZ3N9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlT3ZlcmxheUJsZW5kaW5nLFxuICAgIHByb3A6ICdvdmVybGF5QmxlbmRpbmcnLFxuICAgIGNvbWJpbmVDb25maWdzOiBjb21iaW5lT3ZlcmxheUJsZW5kaW5nQ29uZmlnc1xuICB9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnLCBjb21iaW5lQ29uZmlnczogY29tYmluZUFuaW1hdGlvbkNvbmZpZ3N9LFxuICB7bWVyZ2U6IG1lcmdlRWRpdG9yLCBwcm9wOiAnZWRpdG9yJywgY29tYmluZUNvbmZpZ3M6IGNvbWJpbmVFZGl0b3JDb25maWdzfVxuXTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFXQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxVQUFBLEdBQUFQLE9BQUE7QUFRQSxJQUFBUSxRQUFBLEdBQUFSLE9BQUE7QUFvQkEsSUFBQVMsTUFBQSxHQUFBVCxPQUFBO0FBRUEsSUFBQVUsV0FBQSxHQUFBVixPQUFBO0FBQXNELElBQUFXLFNBQUE7QUFBQSxTQUFBQywyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEseUJBQUFDLE1BQUEsSUFBQUgsQ0FBQSxDQUFBRyxNQUFBLENBQUFDLFFBQUEsS0FBQUosQ0FBQSxxQkFBQUUsQ0FBQSxRQUFBRyxLQUFBLENBQUFDLE9BQUEsQ0FBQU4sQ0FBQSxNQUFBRSxDQUFBLEdBQUFLLDJCQUFBLENBQUFQLENBQUEsTUFBQUMsQ0FBQSxJQUFBRCxDQUFBLHVCQUFBQSxDQUFBLENBQUFRLE1BQUEsSUFBQU4sQ0FBQSxLQUFBRixDQUFBLEdBQUFFLENBQUEsT0FBQU8sRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUEsRUFBQSxXQUFBSCxFQUFBLElBQUFULENBQUEsQ0FBQVEsTUFBQSxLQUFBSyxJQUFBLFdBQUFBLElBQUEsTUFBQUMsS0FBQSxFQUFBZCxDQUFBLENBQUFTLEVB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