@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.
- package/dist/cjs/combined-updaters.js +491 -0
- package/dist/cjs/composer-helpers.js +101 -0
- package/dist/cjs/composers.js +22 -0
- package/dist/cjs/core.js +105 -0
- package/dist/cjs/data-utils.js +53 -0
- package/dist/cjs/export-utils.js +91 -0
- package/dist/{index.js → cjs/index.js} +2 -3
- package/dist/cjs/interaction-utils.js +115 -0
- package/dist/cjs/layer-utils.js +635 -0
- package/dist/cjs/map-state-updaters.js +658 -0
- package/dist/cjs/map-state.js +35 -0
- package/dist/cjs/map-style-updaters.js +659 -0
- package/dist/cjs/map-style.js +33 -0
- package/dist/cjs/merger-handler.js +105 -0
- package/dist/cjs/middleware.js +25 -0
- package/dist/cjs/provider-state-updaters.js +464 -0
- package/dist/cjs/provider-state.js +34 -0
- package/dist/cjs/root.js +207 -0
- package/dist/cjs/ui-state-updaters.js +922 -0
- package/dist/cjs/ui-state.js +36 -0
- package/dist/cjs/vis-state-merger.js +1215 -0
- package/dist/cjs/vis-state-selectors.js +48 -0
- package/dist/cjs/vis-state-updaters.js +5150 -0
- package/dist/cjs/vis-state.js +35 -0
- package/dist/combined-updaters.d.ts +19 -2
- package/dist/composers.d.ts +2 -0
- package/dist/esm/combined-updaters.js +484 -0
- package/dist/esm/composer-helpers.js +85 -0
- package/dist/esm/composers.js +14 -0
- package/dist/esm/core.js +101 -0
- package/dist/esm/data-utils.js +47 -0
- package/dist/esm/export-utils.js +86 -0
- package/dist/esm/index.js +62 -0
- package/dist/esm/interaction-utils.js +106 -0
- package/dist/esm/layer-utils.js +602 -0
- package/dist/esm/map-state-updaters.js +650 -0
- package/dist/esm/map-state.js +29 -0
- package/dist/esm/map-style-updaters.js +652 -0
- package/dist/esm/map-style.js +27 -0
- package/dist/esm/merger-handler.js +96 -0
- package/dist/esm/middleware.js +17 -0
- package/dist/esm/provider-state-updaters.js +458 -0
- package/dist/esm/provider-state.js +28 -0
- package/dist/esm/root.js +201 -0
- package/dist/esm/ui-state-updaters.js +917 -0
- package/dist/esm/ui-state.js +30 -0
- package/dist/esm/vis-state-merger.js +1182 -0
- package/dist/esm/vis-state-selectors.js +42 -0
- package/dist/esm/vis-state-updaters.js +5057 -0
- package/dist/esm/vis-state.js +29 -0
- package/dist/interaction-utils.d.ts +1 -1
- package/dist/layer-utils.d.ts +23 -5
- package/dist/map-state-updaters.d.ts +26 -21
- package/dist/map-state.d.ts +2 -78
- package/dist/map-style-updaters.d.ts +1 -3
- package/dist/middleware.d.ts +2 -2
- package/dist/root.d.ts +1 -1
- package/dist/ui-state-updaters.d.ts +17 -2
- package/dist/vis-state-merger.d.ts +7 -0
- package/dist/vis-state-selectors.d.ts +88 -5
- package/dist/vis-state-updaters.d.ts +127 -4
- package/dist/vis-state.d.ts +8 -4
- package/package.json +37 -32
- package/dist/combined-updaters.js +0 -363
- package/dist/composer-helpers.js +0 -101
- package/dist/composers.js +0 -23
- package/dist/core.js +0 -105
- package/dist/data-utils.js +0 -53
- package/dist/export-utils.js +0 -91
- package/dist/interaction-utils.js +0 -105
- package/dist/layer-utils.js +0 -376
- package/dist/map-state-updaters.js +0 -438
- package/dist/map-state.js +0 -35
- package/dist/map-style-updaters.js +0 -661
- package/dist/map-style.js +0 -34
- package/dist/merger-handler.js +0 -105
- package/dist/middleware.js +0 -27
- package/dist/provider-state-updaters.js +0 -466
- package/dist/provider-state.js +0 -35
- package/dist/root.js +0 -207
- package/dist/ui-state-updaters.js +0 -887
- package/dist/ui-state.js +0 -37
- package/dist/vis-state-merger.js +0 -1032
- package/dist/vis-state-selectors.js +0 -30
- package/dist/vis-state-updaters.js +0 -3859
- 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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
|