@kepler.gl/utils 3.1.0-alpha.0 → 3.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/aggregation.d.ts +13 -0
  2. package/dist/aggregation.js +84 -0
  3. package/dist/application-config.d.ts +25 -0
  4. package/dist/application-config.js +52 -0
  5. package/dist/arrow-data-container.d.ts +62 -0
  6. package/dist/arrow-data-container.js +331 -0
  7. package/dist/color-utils.d.ts +108 -0
  8. package/dist/color-utils.js +443 -0
  9. package/dist/data-container-interface.d.ts +138 -0
  10. package/dist/data-container-interface.js +6 -0
  11. package/dist/data-container-utils.d.ts +30 -0
  12. package/dist/data-container-utils.js +74 -0
  13. package/dist/data-row.d.ts +59 -0
  14. package/dist/data-row.js +110 -0
  15. package/dist/data-scale-utils.d.ts +120 -0
  16. package/dist/data-scale-utils.js +340 -0
  17. package/dist/data-utils.d.ts +98 -0
  18. package/dist/data-utils.js +436 -0
  19. package/dist/dataset-utils.d.ts +45 -0
  20. package/dist/dataset-utils.js +313 -0
  21. package/dist/dom-to-image.d.ts +73 -0
  22. package/dist/dom-to-image.js +421 -0
  23. package/dist/dom-utils.d.ts +23 -0
  24. package/dist/dom-utils.js +349 -0
  25. package/dist/effect-utils.d.ts +24 -0
  26. package/dist/effect-utils.js +166 -0
  27. package/dist/export-map-html.d.ts +9 -0
  28. package/dist/export-map-html.js +25 -0
  29. package/dist/export-utils.d.ts +40 -0
  30. package/dist/export-utils.js +201 -0
  31. package/dist/filter-utils.d.ts +331 -0
  32. package/dist/filter-utils.js +1214 -0
  33. package/dist/format.d.ts +3 -0
  34. package/dist/format.js +38 -0
  35. package/dist/gl-utils.d.ts +1 -0
  36. package/dist/gl-utils.js +27 -0
  37. package/dist/index.d.ts +41 -0
  38. package/dist/index.js +941 -0
  39. package/dist/indexed-data-container.d.ts +34 -0
  40. package/dist/indexed-data-container.js +214 -0
  41. package/dist/locale-utils.d.ts +2 -0
  42. package/dist/locale-utils.js +39 -0
  43. package/dist/map-info-utils.d.ts +1 -0
  44. package/dist/map-info-utils.js +14 -0
  45. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +57 -0
  46. package/dist/map-style-utils/mapbox-gl-style-editor.js +188 -0
  47. package/dist/map-style-utils/mapbox-utils.d.ts +14 -0
  48. package/dist/map-style-utils/mapbox-utils.js +51 -0
  49. package/dist/map-utils.d.ts +9 -0
  50. package/dist/map-utils.js +48 -0
  51. package/dist/mapbox-utils.d.ts +7 -0
  52. package/dist/mapbox-utils.js +19 -0
  53. package/dist/noop.d.ts +1 -0
  54. package/dist/noop.js +13 -0
  55. package/dist/notifications-utils.d.ts +42 -0
  56. package/dist/notifications-utils.js +69 -0
  57. package/dist/observe-dimensions.d.ts +15 -0
  58. package/dist/observe-dimensions.js +130 -0
  59. package/dist/plot.d.ts +131 -0
  60. package/dist/plot.js +615 -0
  61. package/dist/position-utils.d.ts +6 -0
  62. package/dist/position-utils.js +26 -0
  63. package/dist/projection-utils.d.ts +22 -0
  64. package/dist/projection-utils.js +83 -0
  65. package/dist/quick-insertion-sort.d.ts +12 -0
  66. package/dist/quick-insertion-sort.js +132 -0
  67. package/dist/row-data-container.d.ts +31 -0
  68. package/dist/row-data-container.js +206 -0
  69. package/dist/searcher-utils.d.ts +1 -0
  70. package/dist/searcher-utils.js +25 -0
  71. package/dist/split-map-utils.d.ts +32 -0
  72. package/dist/split-map-utils.js +99 -0
  73. package/dist/strings.d.ts +4 -0
  74. package/dist/strings.js +16 -0
  75. package/dist/time.d.ts +54 -0
  76. package/dist/time.js +325 -0
  77. package/dist/types.d.ts +18 -0
  78. package/dist/types.js +6 -0
  79. package/dist/utils.d.ts +104 -0
  80. package/dist/utils.js +241 -0
  81. package/package.json +6 -5
@@ -0,0 +1,108 @@
1
+ import { CategoricalPalette, ColorMap, ColorPalette, ColorRange } from '@kepler.gl/constants';
2
+ import { ColorRangeConfig, HexColor, RGBColor } from '@kepler.gl/types';
3
+ /**
4
+ * get r g b from hex code
5
+ *
6
+ * @param hex
7
+ * @returns array of r g bs
8
+ */
9
+ export declare function hexToRgb(hex: string): RGBColor;
10
+ export declare function isHexColor(hex: string): RegExpExecArray | null;
11
+ /**
12
+ * get hex from r g b
13
+ *
14
+ * @param rgb
15
+ * @returns hex string
16
+ */
17
+ export declare function rgbToHex([r, g, b]: RGBColor): HexColor;
18
+ /**
19
+ * Whether color range has custom color map
20
+ */
21
+ export declare function hasColorMap(colorRange: ColorRange): boolean;
22
+ /**
23
+ * given a list of rgb arrays it will generate a linear gradient css rule
24
+ * @param direction
25
+ * @param colors
26
+ * @return
27
+ */
28
+ export declare function createLinearGradient(direction: string, colors: RGBColor[]): string;
29
+ /**
30
+ * Convert color to RGB
31
+ */
32
+ export declare function colorMaybeToRGB(color: unknown): RGBColor | null;
33
+ /**
34
+ * Whether color is rgb
35
+ * @returns
36
+ */
37
+ export declare function isRgbColor(color: unknown): boolean;
38
+ /**
39
+ * Take color values in 0-255 range and map to [0, 1]
40
+ */
41
+ export declare function normalizeColor(color: number[]): number[];
42
+ /**
43
+ * Convert color to Hex
44
+ */
45
+ export declare function colorMaybeToHex(color: unknown): HexColor;
46
+ /**
47
+ * Convert color to Hex
48
+ */
49
+ export declare function interpolateHex(hex1: HexColor, hex2: HexColor): HexColor;
50
+ export declare function addNewQuantativeColorBreakAtIndex(colorMap: any, index: any, newColors: any): any;
51
+ /**
52
+ * Add a new color to custom palette
53
+ */
54
+ export declare function addCustomPaletteColor(customPalette: ColorRange, index: number): ColorRange;
55
+ /**
56
+ * Sort custom palette
57
+ */
58
+ export declare function sortCustomPaletteColor(customPalette: ColorRange, oldIndex: number, newIndex: number): ColorRange;
59
+ /**
60
+ * remove a color in custom palette at index
61
+ */
62
+ export declare function removeCustomPaletteColor(customPalette: ColorRange, index: number): ColorRange;
63
+ /**
64
+ * Update a color in custom palette at index
65
+ */
66
+ export declare function updateCustomPaletteColor(customPalette: ColorRange, index: number, newValue: HexColor): ColorRange;
67
+ /**
68
+ * Get a reversed colorRange
69
+ */
70
+ export declare function reverseColorRange(reversed: boolean, colorRange: ColorRange): ColorRange;
71
+ /**
72
+ * Whether palette matches current ColorBlindSafe config
73
+ */
74
+ export declare function paletteIsColorBlindSafe(palette: ColorPalette, colorBlindSafe: boolean): boolean;
75
+ /**
76
+ * Whether palette matches current steps config
77
+ */
78
+ export declare function isQuaPalette(palette: ColorPalette): palette is CategoricalPalette;
79
+ /**
80
+ * Whether palette matches current steps config
81
+ */
82
+ export declare function paletteIsSteps(palette: ColorPalette, steps: number): boolean;
83
+ /**
84
+ * Whether palette matches current type config
85
+ */
86
+ export declare function paletteIsType(palette: ColorPalette, type: string): boolean;
87
+ /**
88
+ * Find best match palette based on config, update color range by it
89
+ */
90
+ export declare function updateColorRangeByMatchingPalette(currentColorRange: ColorRange, config: ColorRangeConfig): ColorRange;
91
+ /**
92
+ * Update custom palette when reverse the colors in custom palette, since changing 'steps',
93
+ * 'colorBindSafe', 'type' should fall back to predefined palette.
94
+ */
95
+ export declare function updateCustomColorRangeByColorUI(oldColorRange: ColorRange, colorConfig: ColorRangeConfig): ColorRange;
96
+ /**
97
+ * Update color range after selecting a palette from color range selectoer
98
+ * Copy over colorMap and colorLegends
99
+ */
100
+ export declare function updateColorRangeBySelectedPalette(oldColorRange: any, colorPalette: any, colorConfig: any): any;
101
+ /**
102
+ * convert saved colorRange to colorPalette objevt type/name/category/isColorBlind
103
+ */
104
+ export declare function colorRangeBackwardCompatibility(colorRange: ColorRange): ColorRange;
105
+ /**
106
+ * Initialize custom palette from current standard color range object
107
+ */
108
+ export declare function initializeCustomPalette(colorRange: ColorRange, colorMap?: ColorMap): ColorRange;
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.addCustomPaletteColor = addCustomPaletteColor;
8
+ exports.addNewQuantativeColorBreakAtIndex = addNewQuantativeColorBreakAtIndex;
9
+ exports.colorMaybeToHex = colorMaybeToHex;
10
+ exports.colorMaybeToRGB = colorMaybeToRGB;
11
+ exports.colorRangeBackwardCompatibility = colorRangeBackwardCompatibility;
12
+ exports.createLinearGradient = createLinearGradient;
13
+ exports.hasColorMap = hasColorMap;
14
+ exports.hexToRgb = hexToRgb;
15
+ exports.initializeCustomPalette = initializeCustomPalette;
16
+ exports.interpolateHex = interpolateHex;
17
+ exports.isHexColor = isHexColor;
18
+ exports.isQuaPalette = isQuaPalette;
19
+ exports.isRgbColor = isRgbColor;
20
+ exports.normalizeColor = normalizeColor;
21
+ exports.paletteIsColorBlindSafe = paletteIsColorBlindSafe;
22
+ exports.paletteIsSteps = paletteIsSteps;
23
+ exports.paletteIsType = paletteIsType;
24
+ exports.removeCustomPaletteColor = removeCustomPaletteColor;
25
+ exports.reverseColorRange = reverseColorRange;
26
+ exports.rgbToHex = rgbToHex;
27
+ exports.sortCustomPaletteColor = sortCustomPaletteColor;
28
+ exports.updateColorRangeByMatchingPalette = updateColorRangeByMatchingPalette;
29
+ exports.updateColorRangeBySelectedPalette = updateColorRangeBySelectedPalette;
30
+ exports.updateCustomColorRangeByColorUI = updateCustomColorRangeByColorUI;
31
+ exports.updateCustomPaletteColor = updateCustomPaletteColor;
32
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
33
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
34
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
35
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
36
+ var _constants = require("@kepler.gl/constants");
37
+ var _d3Color = require("d3-color");
38
+ var _d3Interpolate = require("d3-interpolate");
39
+ var _utils = require("./utils");
40
+ var _console = _interopRequireDefault(require("global/console"));
41
+ var _excluded = ["colors"];
42
+ 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; }
43
+ 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
44
+ // Copyright contributors to the kepler.gl project
45
+ /**
46
+ * get r g b from hex code
47
+ *
48
+ * @param hex
49
+ * @returns array of r g bs
50
+ */
51
+ function hexToRgb(hex) {
52
+ var result = isHexColor(hex);
53
+ if (!result) {
54
+ return [0, 0, 0];
55
+ }
56
+ var r = parseInt(result[1], 16);
57
+ var g = parseInt(result[2], 16);
58
+ var b = parseInt(result[3], 16);
59
+ return [r, g, b];
60
+ }
61
+ function isHexColor(hex) {
62
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
63
+ return result;
64
+ }
65
+ function PadNum(c) {
66
+ var hex = c.toString(16);
67
+ return hex.length === 1 ? "0".concat(hex) : hex;
68
+ }
69
+
70
+ /**
71
+ * get hex from r g b
72
+ *
73
+ * @param rgb
74
+ * @returns hex string
75
+ */
76
+ function rgbToHex(_ref) {
77
+ var _ref2 = (0, _slicedToArray2["default"])(_ref, 3),
78
+ r = _ref2[0],
79
+ g = _ref2[1],
80
+ b = _ref2[2];
81
+ return "#".concat([r, g, b].map(function (n) {
82
+ return PadNum(n);
83
+ }).join('')).toUpperCase();
84
+ }
85
+
86
+ /**
87
+ * Whether color range has custom color map
88
+ */
89
+ function hasColorMap(colorRange) {
90
+ return Array.isArray(colorRange.colorMap) && Boolean(colorRange.colorMap.length);
91
+ }
92
+
93
+ /**
94
+ * given a list of rgb arrays it will generate a linear gradient css rule
95
+ * @param direction
96
+ * @param colors
97
+ * @return
98
+ */
99
+ function createLinearGradient(direction, colors) {
100
+ var step = parseFloat((100.0 / colors.length).toFixed(2));
101
+ var bands = colors.map(function (rgb, index) {
102
+ return "rgba(".concat(rgb.join(','), ", 1) ").concat(step * index, "%, rgba(").concat(rgb.join(','), ", 1) ").concat(step * (index + 1), "%");
103
+ });
104
+ return "linear-gradient(to ".concat(direction, ", ").concat(bands.join(','), ")");
105
+ }
106
+
107
+ /**
108
+ * Convert color to RGB
109
+ */
110
+ function colorMaybeToRGB(color) {
111
+ if (isRgbColor(color)) {
112
+ return color;
113
+ }
114
+ if (typeof color === 'string') {
115
+ var rgbObj = (0, _d3Color.rgb)(color);
116
+ if (Number.isFinite(rgbObj === null || rgbObj === void 0 ? void 0 : rgbObj.r) && Number.isFinite(rgbObj === null || rgbObj === void 0 ? void 0 : rgbObj.g) && Number.isFinite(rgbObj === null || rgbObj === void 0 ? void 0 : rgbObj.b)) {
117
+ return [rgbObj.r, rgbObj.g, rgbObj.b];
118
+ }
119
+ }
120
+ return null;
121
+ }
122
+
123
+ /**
124
+ * Whether color is rgb
125
+ * @returns
126
+ */
127
+ function isRgbColor(color) {
128
+ return Boolean(color && Array.isArray(color) && color.length === 3 && color.every(function (n) {
129
+ return Number.isFinite(n) && n <= 255 && n >= 0;
130
+ }));
131
+ }
132
+
133
+ /**
134
+ * Take color values in 0-255 range and map to [0, 1]
135
+ */
136
+ function normalizeColor(color) {
137
+ return color.map(function (component) {
138
+ return component / 255.0;
139
+ });
140
+ }
141
+
142
+ /**
143
+ * Convert color to Hex
144
+ */
145
+ function colorMaybeToHex(color) {
146
+ var rgbColor = colorMaybeToRGB(color);
147
+ if (rgbColor) return rgbToHex(rgbColor);
148
+ return '#000000';
149
+ }
150
+
151
+ /**
152
+ * Convert color to Hex
153
+ */
154
+
155
+ function interpolateHex(hex1, hex2) {
156
+ return (0, _d3Color.rgb)((0, _d3Interpolate.interpolate)(hex1, hex2)(0.5)).hex().toUpperCase();
157
+ }
158
+ function addNewQuantativeColorBreakAtIndex(colorMap, index, newColors) {
159
+ if (!Array.isArray(colorMap) || !colorMap.length) {
160
+ return colorMap;
161
+ }
162
+ if (colorMap.length < 2) {
163
+ // less then 2, add 1 at end
164
+ // however shouldn't allow delete when there are 2
165
+ return newColors.map(function (c, i) {
166
+ return i === 0 ? colorMap[i] : [null, c];
167
+ });
168
+ }
169
+
170
+ // breaks should be 1 less than colors
171
+ var breaks = colorMap.map(function (cm) {
172
+ return cm[0];
173
+ }).slice(0, colorMap.length - 1);
174
+
175
+ // insert new break
176
+ var newValue = index >= breaks.length - 1 ? breaks[breaks.length - 1] + (breaks.length > 1 ? breaks[breaks.length - 1] - breaks[breaks.length - 2] : 0) : (breaks[index] + breaks[index + 1]) / 2;
177
+ var newBreaks = (0, _utils.arrayInsert)(breaks, index + 1, newValue);
178
+
179
+ // asign breaks to color
180
+ return newColors.map(function (c, i) {
181
+ return i === newColors.length - 1 ? [null, c] : [newBreaks[i] === undefined ? null : newBreaks[i], c];
182
+ });
183
+ }
184
+
185
+ /**
186
+ * Add a new color to custom palette
187
+ */
188
+ function addCustomPaletteColor(customPalette, index) {
189
+ var colors = customPalette.colors,
190
+ colorMap = customPalette.colorMap;
191
+ var update = {};
192
+ var newColor = index === colors.length - 1 ? colors[index] : interpolateHex(colors[index], colors[index + 1]);
193
+ update.colors = (0, _utils.arrayInsert)(colors, index + 1, newColor);
194
+
195
+ // add color to colorMap
196
+ if (colorMap) {
197
+ update.colorMap = addNewQuantativeColorBreakAtIndex(colorMap, index, update.colors);
198
+ }
199
+ return _objectSpread(_objectSpread({}, customPalette), update);
200
+ }
201
+ function replaceColorsInColorRange(colorRange, newColors) {
202
+ var oldColors = colorRange.colors;
203
+ var updated = _objectSpread(_objectSpread({}, colorRange), {}, {
204
+ colors: newColors
205
+ });
206
+
207
+ // update color map
208
+ // keep value, replace color
209
+ if (Array.isArray(updated.colorMap)) {
210
+ updated.colorMap = updated.colorMap.map(function (cm, i) {
211
+ return [cm[0], newColors[i]];
212
+ });
213
+ }
214
+ // update colorlegends
215
+ // keep value, replace color
216
+ if (updated.colorLegends) {
217
+ updated.colorLegends = Object.keys(updated.colorLegends).reduce(function (accu, key) {
218
+ var colorIdx = oldColors.findIndex(function (c) {
219
+ return c === key;
220
+ });
221
+ var newColor = newColors[colorIdx];
222
+ return newColor ? _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, newColor, updated.colorLegends[key])) : accu;
223
+ }, {});
224
+ }
225
+ return updated;
226
+ }
227
+
228
+ /**
229
+ * Sort custom palette
230
+ */
231
+ function sortCustomPaletteColor(customPalette, oldIndex, newIndex) {
232
+ var colors = customPalette.colors;
233
+ var newColors = (0, _utils.arrayMove)(colors, oldIndex, newIndex);
234
+ var update = replaceColorsInColorRange(customPalette, newColors);
235
+
236
+ // @ts-ignore
237
+ return _objectSpread(_objectSpread({}, customPalette), update);
238
+ }
239
+
240
+ /**
241
+ * remove a color in custom palette at index
242
+ */
243
+ function removeCustomPaletteColor(customPalette, index) {
244
+ var colors = customPalette.colors,
245
+ colorMap = customPalette.colorMap,
246
+ colorLegends = customPalette.colorLegends;
247
+ var oldValue = colors[index];
248
+ var update = {};
249
+ update.colors = (0, _toConsumableArray2["default"])(colors);
250
+ if (update.colors.length > 1) {
251
+ update.colors.splice(index, 1);
252
+ }
253
+ // update color map
254
+ if (Array.isArray(colorMap)) {
255
+ // find colorMap index
256
+ var colorMapIndex = colorMap.findIndex(function (cm) {
257
+ return cm[1] === oldValue;
258
+ });
259
+ if (colorMapIndex >= 0) {
260
+ update.colorMap = (0, _toConsumableArray2["default"])(colorMap);
261
+ update.colorMap.splice(colorMapIndex, 1);
262
+ }
263
+ }
264
+ // update color legend
265
+ if (colorLegends !== null && colorLegends !== void 0 && colorLegends[oldValue]) {
266
+ update.colorLegends = _objectSpread({}, colorLegends);
267
+ delete update.colorLegends[oldValue];
268
+ }
269
+ return _objectSpread(_objectSpread({}, customPalette), update);
270
+ }
271
+
272
+ /**
273
+ * Update a color in custom palette at index
274
+ */
275
+ function updateCustomPaletteColor(customPalette, index, newValue) {
276
+ var colors = customPalette.colors;
277
+ var hex = newValue.toUpperCase();
278
+ var newColors = (0, _toConsumableArray2["default"])(colors);
279
+ newColors[index] = hex;
280
+ var update = replaceColorsInColorRange(customPalette, newColors);
281
+
282
+ // @ts-ignore
283
+ return _objectSpread(_objectSpread({}, customPalette), update);
284
+ }
285
+
286
+ /**
287
+ * Get a reversed colorRange
288
+ */
289
+ function reverseColorRange(reversed, colorRange) {
290
+ var newColors = colorRange === null || colorRange === void 0 ? void 0 : colorRange.colors.slice().reverse();
291
+ var updated = replaceColorsInColorRange(colorRange, newColors);
292
+ updated.reversed = reversed;
293
+ return updated;
294
+ }
295
+
296
+ /**
297
+ * Whether palette matches current ColorBlindSafe config
298
+ */
299
+ function paletteIsColorBlindSafe(palette, colorBlindSafe) {
300
+ return !colorBlindSafe || colorBlindSafe && palette.colorBlindSafe;
301
+ }
302
+
303
+ /**
304
+ * Whether palette matches current steps config
305
+ */
306
+ function isQuaPalette(palette) {
307
+ return palette.type === _constants.PALETTE_TYPES.QUA;
308
+ }
309
+
310
+ /**
311
+ * Whether palette matches current steps config
312
+ */
313
+ function paletteIsSteps(palette, steps) {
314
+ return !isQuaPalette(palette) || palette.maxStep >= steps;
315
+ }
316
+
317
+ /**
318
+ * Whether palette matches current type config
319
+ */
320
+ function paletteIsType(palette, type) {
321
+ return type === 'all' || type === palette.type;
322
+ }
323
+ /**
324
+ * Find best match palette based on config, update color range by it
325
+ */
326
+ function updateColorRangeByMatchingPalette(currentColorRange, config) {
327
+ var steps = config.steps,
328
+ colorBlindSafe = config.colorBlindSafe,
329
+ type = config.type;
330
+ var matchingPalette = _constants.KEPLER_COLOR_PALETTES.filter(function (palette) {
331
+ return (
332
+ // palette match type
333
+ paletteIsType(palette, type) &&
334
+ // palette has same step
335
+ paletteIsSteps(palette, steps) &&
336
+ // palette is colorBlindSafe
337
+ paletteIsColorBlindSafe(palette, colorBlindSafe)
338
+ );
339
+ });
340
+ var bestMatch = matchingPalette.length ? matchingPalette.find(function (p) {
341
+ return p.name === currentColorRange.name;
342
+ }) || matchingPalette[0] : null;
343
+ if (bestMatch) {
344
+ return updateColorRangeBySelectedPalette(currentColorRange, bestMatch, config);
345
+ }
346
+ // we do nothing
347
+ _console["default"].warn("we cant find any preset palette matches requirments: steps=".concat(steps, " && colorBlindSafe=").concat(colorBlindSafe));
348
+ return currentColorRange;
349
+ }
350
+
351
+ /**
352
+ * Update custom palette when reverse the colors in custom palette, since changing 'steps',
353
+ * 'colorBindSafe', 'type' should fall back to predefined palette.
354
+ */
355
+ function updateCustomColorRangeByColorUI(oldColorRange, colorConfig) {
356
+ var reversed = colorConfig.reversed;
357
+ var colors = oldColorRange.colors;
358
+ // for custom palette, one can only 'reverse' the colors in custom palette.
359
+ colors.reverse();
360
+ var colorRange = _objectSpread(_objectSpread(_objectSpread({
361
+ name: oldColorRange.name,
362
+ type: oldColorRange.type,
363
+ category: oldColorRange.category,
364
+ colors: colors
365
+ }, reversed ? {
366
+ reversed: reversed
367
+ } : {}), oldColorRange.colorMap ? {
368
+ colorMap: oldColorRange.colorMap
369
+ } : {}), oldColorRange.colorLegends ? {
370
+ colorLegends: oldColorRange.colorLegends
371
+ } : {});
372
+ return replaceColorsInColorRange(colorRange, colorRange.colors);
373
+ }
374
+
375
+ /**
376
+ * Update color range after selecting a palette from color range selectoer
377
+ * Copy over colorMap and colorLegends
378
+ */
379
+ function updateColorRangeBySelectedPalette(oldColorRange, colorPalette, colorConfig) {
380
+ var _colorPaletteToColorR = (0, _constants.colorPaletteToColorRange)(colorPalette, colorConfig),
381
+ newColors = _colorPaletteToColorR.colors,
382
+ newColorRange = (0, _objectWithoutProperties2["default"])(_colorPaletteToColorR, _excluded);
383
+ var colorRange = _objectSpread(_objectSpread(_objectSpread({
384
+ colors: oldColorRange.colors
385
+ }, newColorRange), oldColorRange.colorMap ? {
386
+ colorMap: oldColorRange.colorMap
387
+ } : {}), oldColorRange.colorLegends ? {
388
+ colorLegends: oldColorRange.colorLegends
389
+ } : {});
390
+ return replaceColorsInColorRange(colorRange, newColors);
391
+ }
392
+ var UberNameRegex = new RegExp(/^([A-Za-z ])+/g);
393
+ var ColorBrewerRegex = new RegExp(/^ColorBrewer ([A-Za-z1-9])+/g);
394
+
395
+ /**
396
+ * convert saved colorRange to colorPalette objevt type/name/category/isColorBlind
397
+ */
398
+ function colorRangeBackwardCompatibility(colorRange) {
399
+ if (!colorRange || colorRange.type === 'custom' || colorRange.colorMap) {
400
+ // don't do anything to custom color palette, or palette with custom breaks
401
+ return colorRange;
402
+ }
403
+ var trimName;
404
+ if (colorRange.category === 'Uber') {
405
+ var _colorRange$name;
406
+ var matchName = ((_colorRange$name = colorRange.name) !== null && _colorRange$name !== void 0 ? _colorRange$name : '').match(UberNameRegex);
407
+ trimName = matchName ? matchName[0].trim() : null;
408
+ // match Uber Viz Qualitative 1.4 -> Uber Viz Qualitative
409
+ } else if (colorRange.category === 'ColorBrewer') {
410
+ var _colorRange$name2;
411
+ var _matchName = ((_colorRange$name2 = colorRange.name) !== null && _colorRange$name2 !== void 0 ? _colorRange$name2 : '').match(ColorBrewerRegex);
412
+ trimName = _matchName ? _matchName[0].replace('ColorBrewer ', '').trim() : null;
413
+ }
414
+ if (trimName) {
415
+ var matchingPalette = _constants.KEPLER_COLOR_PALETTES.find(function (p) {
416
+ return p.name === trimName;
417
+ });
418
+ if (matchingPalette) {
419
+ return _objectSpread(_objectSpread({}, colorRange), {}, {
420
+ name: trimName,
421
+ type: matchingPalette === null || matchingPalette === void 0 ? void 0 : matchingPalette.type,
422
+ category: matchingPalette.category
423
+ });
424
+ }
425
+ }
426
+ return colorRange;
427
+ }
428
+
429
+ /**
430
+ * Initialize custom palette from current standard color range object
431
+ */
432
+ function initializeCustomPalette(colorRange, colorMap) {
433
+ // TODO: check on `isReversed` key, whether we can remove it here
434
+ var customPalette = _objectSpread(_objectSpread({}, colorRange), {}, {
435
+ name: _constants.DEFAULT_CUSTOM_PALETTE.name,
436
+ type: _constants.DEFAULT_CUSTOM_PALETTE.type,
437
+ category: _constants.DEFAULT_CUSTOM_PALETTE.category
438
+ }, colorMap ? {
439
+ colorMap: colorMap
440
+ } : {});
441
+ return customPalette;
442
+ }
443
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9kM0NvbG9yIiwiX2QzSW50ZXJwb2xhdGUiLCJfdXRpbHMiLCJfY29uc29sZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZXhjbHVkZWQiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImhleFRvUmdiIiwiaGV4IiwicmVzdWx0IiwiaXNIZXhDb2xvciIsInBhcnNlSW50IiwiZyIsImIiLCJleGVjIiwiUGFkTnVtIiwiYyIsInRvU3RyaW5nIiwiY29uY2F0IiwicmdiVG9IZXgiLCJfcmVmIiwiX3JlZjIiLCJfc2xpY2VkVG9BcnJheTIiLCJtYXAiLCJuIiwiam9pbiIsInRvVXBwZXJDYXNlIiwiaGFzQ29sb3JNYXAiLCJjb2xvclJhbmdlIiwiQXJyYXkiLCJpc0FycmF5IiwiY29sb3JNYXAiLCJCb29sZWFuIiwiY3JlYXRlTGluZWFyR3JhZGllbnQiLCJkaXJlY3Rpb24iLCJjb2xvcnMiLCJzdGVwIiwicGFyc2VGbG9hdCIsInRvRml4ZWQiLCJiYW5kcyIsInJnYiIsImluZGV4IiwiY29sb3JNYXliZVRvUkdCIiwiY29sb3IiLCJpc1JnYkNvbG9yIiwicmdiT2JqIiwiZDNSZ2IiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImV2ZXJ5Iiwibm9ybWFsaXplQ29sb3IiLCJjb21wb25lbnQiLCJjb2xvck1heWJlVG9IZXgiLCJyZ2JDb2xvciIsImludGVycG9sYXRlSGV4IiwiaGV4MSIsImhleDIiLCJpbnRlcnBvbGF0ZSIsImFkZE5ld1F1YW50YXRpdmVDb2xvckJyZWFrQXRJbmRleCIsIm5ld0NvbG9ycyIsImkiLCJicmVha3MiLCJjbSIsInNsaWNlIiwibmV3VmFsdWUiLCJuZXdCcmVha3MiLCJhcnJheUluc2VydCIsInVuZGVmaW5lZCIsImFkZEN1c3RvbVBhbGV0dGVDb2xvciIsImN1c3RvbVBhbGV0dGUiLCJ1cGRhdGUiLCJuZXdDb2xvciIsInJlcGxhY2VDb2xvcnNJbkNvbG9yUmFuZ2UiLCJvbGRDb2xvcnMiLCJ1cGRhdGVkIiwiY29sb3JMZWdlbmRzIiwicmVkdWNlIiwiYWNjdSIsImtleSIsImNvbG9ySWR4IiwiZmluZEluZGV4Iiwic29ydEN1c3RvbVBhbGV0dGVDb2xvciIsIm9sZEluZGV4IiwibmV3SW5kZXgiLCJhcnJheU1vdmUiLCJyZW1vdmVDdXN0b21QYWxldHRlQ29sb3IiLCJvbGRWYWx1ZSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzcGxpY2UiLCJjb2xvck1hcEluZGV4IiwidXBkYXRlQ3VzdG9tUGFsZXR0ZUNvbG9yIiwicmV2ZXJzZUNvbG9yUmFuZ2UiLCJyZXZlcnNlZCIsInJldmVyc2UiLCJwYWxldHRlSXNDb2xvckJsaW5kU2FmZSIsInBhbGV0dGUiLCJjb2xvckJsaW5kU2FmZSIsImlzUXVhUGFsZXR0ZSIsInR5cGUiLCJQQUxFVFRFX1RZUEVTIiwiUVVBIiwicGFsZXR0ZUlzU3RlcHMiLCJzdGVwcyIsIm1heFN0ZXAiLCJwYWxldHRlSXNUeXBlIiwidXBkYXRlQ29sb3JSYW5nZUJ5TWF0Y2hpbmdQYWxldHRlIiwiY3VycmVudENvbG9yUmFuZ2UiLCJjb25maWciLCJtYXRjaGluZ1BhbGV0dGUiLCJLRVBMRVJfQ09MT1JfUEFMRVRURVMiLCJiZXN0TWF0Y2giLCJmaW5kIiwicCIsIm5hbWUiLCJ1cGRhdGVDb2xvclJhbmdlQnlTZWxlY3RlZFBhbGV0dGUiLCJDb25zb2xlIiwid2FybiIsInVwZGF0ZUN1c3RvbUNvbG9yUmFuZ2VCeUNvbG9yVUkiLCJvbGRDb2xvclJhbmdlIiwiY29sb3JDb25maWciLCJjYXRlZ29yeSIsImNvbG9yUGFsZXR0ZSIsIl9jb2xvclBhbGV0dGVUb0NvbG9yUiIsImNvbG9yUGFsZXR0ZVRvQ29sb3JSYW5nZSIsIm5ld0NvbG9yUmFuZ2UiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiVWJlck5hbWVSZWdleCIsIlJlZ0V4cCIsIkNvbG9yQnJld2VyUmVnZXgiLCJjb2xvclJhbmdlQmFja3dhcmRDb21wYXRpYmlsaXR5IiwidHJpbU5hbWUiLCJfY29sb3JSYW5nZSRuYW1lIiwibWF0Y2hOYW1lIiwibWF0Y2giLCJ0cmltIiwiX2NvbG9yUmFuZ2UkbmFtZTIiLCJyZXBsYWNlIiwiaW5pdGlhbGl6ZUN1c3RvbVBhbGV0dGUiLCJERUZBVUxUX0NVU1RPTV9QQUxFVFRFIl0sInNvdXJjZXMiOlsiLi4vc3JjL2NvbG9yLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsUGFsZXR0ZSxcbiAgQ29sb3JNYXAsXG4gIENvbG9yUGFsZXR0ZSxcbiAgQ29sb3JSYW5nZSxcbiAgREVGQVVMVF9DVVNUT01fUEFMRVRURSxcbiAgY29sb3JQYWxldHRlVG9Db2xvclJhbmdlXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q29sb3JSYW5nZUNvbmZpZywgSGV4Q29sb3IsIFJHQkNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7cmdiIGFzIGQzUmdifSBmcm9tICdkMy1jb2xvcic7XG5pbXBvcnQge2ludGVycG9sYXRlfSBmcm9tICdkMy1pbnRlcnBvbGF0ZSc7XG5pbXBvcnQge2FycmF5SW5zZXJ0LCBhcnJheU1vdmV9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IENvbnNvbGUgZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuaW1wb3J0IHtLRVBMRVJfQ09MT1JfUEFMRVRURVMsIFBBTEVUVEVfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuLyoqXG4gKiBnZXQgciBnIGIgZnJvbSBoZXggY29kZVxuICpcbiAqIEBwYXJhbSBoZXhcbiAqIEByZXR1cm5zIGFycmF5IG9mIHIgZyBic1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9SZ2IoaGV4OiBzdHJpbmcpOiBSR0JDb2xvciB7XG4gIGNvbnN0IHJlc3VsdCA9IGlzSGV4Q29sb3IoaGV4KTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBbMCwgMCwgMF07XG4gIH1cblxuICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KHJlc3VsdFszXSwgMTYpO1xuXG4gIHJldHVybiBbciwgZywgYl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hleENvbG9yKGhleDogc3RyaW5nKTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCB7XG4gIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFBhZE51bShjKSB7XG4gIGNvbnN0IGhleCA9IGMudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/IGAwJHtoZXh9YCA6IGhleDtcbn1cblxuLyoqXG4gKiBnZXQgaGV4IGZyb20gciBnIGJcbiAqXG4gKiBAcGFyYW0gcmdiXG4gKiBAcmV0dXJucyBoZXggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hleChbciwgZywgYl06IFJHQkNvbG9yKTogSGV4Q29sb3Ige1xuICByZXR1cm4gYCMke1tyLCBnLCBiXS5tYXAobiA9PiBQYWROdW0obikpLmpvaW4oJycpfWAudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGNvbG9yIHJhbmdlIGhhcyBjdXN0b20gY29sb3IgbWFwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb2xvck1hcChjb2xvclJhbmdlOiBDb2xvclJhbmdlKTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbG9yUmFuZ2UuY29sb3JNYXApICYmIEJvb2xlYW4oY29sb3JSYW5nZS5jb2xvck1hcC5sZW5ndGgpO1xufVxuXG4vKipcbiAqIGdpdmVuIGEgbGlzdCBvZiByZ2IgYXJyYXlzIGl0IHdpbGwgZ2VuZXJhdGUgYSBsaW5lYXIgZ3JhZGllbnQgY3NzIHJ1bGVcbiAqIEBwYXJhbSBkaXJlY3Rpb25cbiAqIEBwYXJhbSBjb2xvcnNcbiAqIEByZXR1cm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmVhckdyYWRpZW50KGRpcmVjdGlvbjogc3RyaW5nLCBjb2xvcnM6IFJHQkNvbG9yW10pOiBzdHJpbmcge1xuICBjb25zdCBzdGVwID0gcGFyc2VGbG9hdCgoMTAwLjAgLyBjb2xvcnMubGVuZ3RoKS50b0ZpeGVkKDIpKTtcbiAgY29uc3QgYmFuZHMgPSBjb2xvcnMubWFwKChyZ2IsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGByZ2JhKCR7cmdiLmpvaW4oJywnKX0sIDEpICR7c3RlcCAqIGluZGV4fSUsIHJnYmEoJHtyZ2Iuam9pbignLCcpfSwgMSkgJHtcbiAgICAgIHN0ZXAgKiAoaW5kZXggKyAxKVxuICAgIH0lYDtcbiAgfSk7XG5cbiAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQodG8gJHtkaXJlY3Rpb259LCAke2JhbmRzLmpvaW4oJywnKX0pYDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGNvbG9yIHRvIFJHQlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JNYXliZVRvUkdCKGNvbG9yOiB1bmtub3duKTogUkdCQ29sb3IgfCBudWxsIHtcbiAgaWYgKGlzUmdiQ29sb3IoY29sb3IpKSB7XG4gICAgcmV0dXJuIGNvbG9yIGFzIFJHQkNvbG9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCByZ2JPYmogPSBkM1JnYihjb2xvcik7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShyZ2JPYmo/LnIpICYmIE51bWJlci5pc0Zpbml0ZShyZ2JPYmo/LmcpICYmIE51bWJlci5pc0Zpbml0ZShyZ2JPYmo/LmIpKSB7XG4gICAgICByZXR1cm4gW3JnYk9iai5yLCByZ2JPYmouZywgcmdiT2JqLmJdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgY29sb3IgaXMgcmdiXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZ2JDb2xvcihjb2xvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBjb2xvciAmJlxuICAgICAgQXJyYXkuaXNBcnJheShjb2xvcikgJiZcbiAgICAgIGNvbG9yLmxlbmd0aCA9PT0gMyAmJlxuICAgICAgY29sb3IuZXZlcnkobiA9PiBOdW1iZXIuaXNGaW5pdGUobikgJiYgbiA8PSAyNTUgJiYgbiA+PSAwKVxuICApO1xufVxuXG4vKipcbiAqIFRha2UgY29sb3IgdmFsdWVzIGluIDAtMjU1IHJhbmdlIGFuZCBtYXAgdG8gWzAsIDFdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb2xvcihjb2xvcjogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjb2xvci5tYXAoY29tcG9uZW50ID0+IGNvbXBvbmVudCAvIDI1NS4wKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGNvbG9yIHRvIEhleFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JNYXliZVRvSGV4KGNvbG9yOiB1bmtub3duKTogSGV4Q29sb3Ige1xuICBjb25zdCByZ2JDb2xvciA9IGNvbG9yTWF5YmVUb1JHQihjb2xvcik7XG4gIGlmIChyZ2JDb2xvcikgcmV0dXJuIHJnYlRvSGV4KHJnYkNvbG9yKTtcbiAgcmV0dXJuICcjMDAwMDAwJztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGNvbG9yIHRvIEhleFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUhleChoZXgxOiBIZXhDb2xvciwgaGV4MjogSGV4Q29sb3IpOiBIZXhDb2xvciB7XG4gIHJldHVybiBkM1JnYihpbnRlcnBvbGF0ZShoZXgxLCBoZXgyKSgwLjUpKS5oZXgoKS50b1VwcGVyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3UXVhbnRhdGl2ZUNvbG9yQnJlYWtBdEluZGV4KGNvbG9yTWFwLCBpbmRleCwgbmV3Q29sb3JzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShjb2xvck1hcCkgfHwgIWNvbG9yTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBjb2xvck1hcDtcbiAgfVxuXG4gIGlmIChjb2xvck1hcC5sZW5ndGggPCAyKSB7XG4gICAgLy8gbGVzcyB0aGVuIDIsIGFkZCAxIGF0IGVuZFxuICAgIC8vIGhvd2V2ZXIgc2hvdWxkbid0IGFsbG93IGRlbGV0ZSB3aGVuIHRoZXJlIGFyZSAyXG4gICAgcmV0dXJuIG5ld0NvbG9ycy5tYXAoKGMsIGkpID0+IChpID09PSAwID8gY29sb3JNYXBbaV0gOiBbbnVsbCwgY10pKTtcbiAgfVxuXG4gIC8vIGJyZWFrcyBzaG91bGQgYmUgMSBsZXNzIHRoYW4gY29sb3JzXG4gIGNvbnN0IGJyZWFrcyA9IGNvbG9yTWFwLm1hcChjbSA9PiBjbVswXSkuc2xpY2UoMCwgY29sb3JNYXAubGVuZ3RoIC0gMSk7XG5cbiAgLy8gaW5zZXJ0IG5ldyBicmVha1xuICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgaW5kZXggPj0gYnJlYWtzLmxlbmd0aCAtIDFcbiAgICAgID8gYnJlYWtzW2JyZWFrcy5sZW5ndGggLSAxXSArXG4gICAgICAgIChicmVha3MubGVuZ3RoID4gMSA/IGJyZWFrc1ticmVha3MubGVuZ3RoIC0gMV0gLSBicmVha3NbYnJlYWtzLmxlbmd0aCAtIDJdIDogMClcbiAgICAgIDogKGJyZWFrc1tpbmRleF0gKyBicmVha3NbaW5kZXggKyAxXSkgLyAyO1xuXG4gIGNvbnN0IG5ld0JyZWFrcyA9IGFycmF5SW5zZXJ0KGJyZWFrcywgaW5kZXggKyAxLCBuZXdWYWx1ZSk7XG5cbiAgLy8gYXNpZ24gYnJlYWtzIHRvIGNvbG9yXG4gIHJldHVybiBuZXdDb2xvcnMubWFwKChjLCBpKSA9PlxuICAgIGkgPT09IG5ld0NvbG9ycy5sZW5ndGggLSAxID8gW251bGwsIGNdIDogW25ld0JyZWFrc1tpXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG5ld0JyZWFrc1tpXSwgY11cbiAgKTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgY29sb3IgdG8gY3VzdG9tIHBhbGV0dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEN1c3RvbVBhbGV0dGVDb2xvcihjdXN0b21QYWxldHRlOiBDb2xvclJhbmdlLCBpbmRleDogbnVtYmVyKTogQ29sb3JSYW5nZSB7XG4gIGNvbnN0IHtjb2xvcnMsIGNvbG9yTWFwfSA9IGN1c3RvbVBhbGV0dGU7XG4gIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxDb2xvclJhbmdlPiA9IHt9O1xuXG4gIGNvbnN0IG5ld0NvbG9yID1cbiAgICBpbmRleCA9PT0gY29sb3JzLmxlbmd0aCAtIDEgPyBjb2xvcnNbaW5kZXhdIDogaW50ZXJwb2xhdGVIZXgoY29sb3JzW2luZGV4XSwgY29sb3JzW2luZGV4ICsgMV0pO1xuXG4gIHVwZGF0ZS5jb2xvcnMgPSBhcnJheUluc2VydChjb2xvcnMsIGluZGV4ICsgMSwgbmV3Q29sb3IpO1xuXG4gIC8vIGFkZCBjb2xvciB0byBjb2xvck1hcFxuICBpZiAoY29sb3JNYXApIHtcbiAgICB1cGRhdGUuY29sb3JNYXAgPSBhZGROZXdRdWFudGF0aXZlQ29sb3JCcmVha0F0SW5kZXgoY29sb3JNYXAsIGluZGV4LCB1cGRhdGUuY29sb3JzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uY3VzdG9tUGFsZXR0ZSxcbiAgICAuLi51cGRhdGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNvbG9yc0luQ29sb3JSYW5nZShjb2xvclJhbmdlLCBuZXdDb2xvcnMpIHtcbiAgY29uc3Qgb2xkQ29sb3JzID0gY29sb3JSYW5nZS5jb2xvcnM7XG4gIGNvbnN0IHVwZGF0ZWQgPSB7XG4gICAgLi4uY29sb3JSYW5nZSxcbiAgICBjb2xvcnM6IG5ld0NvbG9yc1xuICB9O1xuXG4gIC8vIHVwZGF0ZSBjb2xvciBtYXBcbiAgLy8ga2VlcCB2YWx1ZSwgcmVwbGFjZSBjb2xvclxuICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkLmNvbG9yTWFwKSkge1xuICAgIHVwZGF0ZWQuY29sb3JNYXAgPSB1cGRhdGVkLmNvbG9yTWFwLm1hcCgoY20sIGkpID0+IFtjbVswXSwgbmV3Q29sb3JzW2ldXSk7XG4gIH1cbiAgLy8gdXBkYXRlIGNvbG9ybGVnZW5kc1xuICAvLyBrZWVwIHZhbHVlLCByZXBsYWNlIGNvbG9yXG4gIGlmICh1cGRhdGVkLmNvbG9yTGVnZW5kcykge1xuICAgIHVwZGF0ZWQuY29sb3JMZWdlbmRzID0gT2JqZWN0LmtleXModXBkYXRlZC5jb2xvckxlZ2VuZHMpLnJlZHVjZSgoYWNjdSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBjb2xvcklkeCA9IG9sZENvbG9ycy5maW5kSW5kZXgoYyA9PiBjID09PSBrZXkpO1xuICAgICAgY29uc3QgbmV3Q29sb3IgPSBuZXdDb2xvcnNbY29sb3JJZHhdO1xuXG4gICAgICByZXR1cm4gbmV3Q29sb3JcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgICAgW25ld0NvbG9yXTogdXBkYXRlZC5jb2xvckxlZ2VuZHNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgOiBhY2N1O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVkO1xufVxuXG4vKipcbiAqIFNvcnQgY3VzdG9tIHBhbGV0dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRDdXN0b21QYWxldHRlQ29sb3IoXG4gIGN1c3RvbVBhbGV0dGU6IENvbG9yUmFuZ2UsXG4gIG9sZEluZGV4OiBudW1iZXIsXG4gIG5ld0luZGV4OiBudW1iZXJcbik6IENvbG9yUmFuZ2Uge1xuICBjb25zdCB7Y29sb3JzfSA9IGN1c3RvbVBhbGV0dGU7XG5cbiAgY29uc3QgbmV3Q29sb3JzID0gYXJyYXlNb3ZlKGNvbG9ycywgb2xkSW5kZXgsIG5ld0luZGV4KTtcbiAgY29uc3QgdXBkYXRlID0gcmVwbGFjZUNvbG9yc0luQ29sb3JSYW5nZShjdXN0b21QYWxldHRlLCBuZXdDb2xvcnMpO1xuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHtcbiAgICAuLi5jdXN0b21QYWxldHRlLFxuICAgIC4uLnVwZGF0ZVxuICB9O1xufVxuXG4vKipcbiAqIHJlbW92ZSBhIGNvbG9yIGluIGN1c3RvbSBwYWxldHRlIGF0IGluZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDdXN0b21QYWxldHRlQ29sb3IoY3VzdG9tUGFsZXR0ZTogQ29sb3JSYW5nZSwgaW5kZXg6IG51bWJlcik6IENvbG9yUmFuZ2Uge1xuICBjb25zdCB7Y29sb3JzLCBjb2xvck1hcCwgY29sb3JMZWdlbmRzfSA9IGN1c3RvbVBhbGV0dGU7XG4gIGNvbnN0IG9sZFZhbHVlID0gY29sb3JzW2luZGV4XTtcbiAgY29uc3QgdXBkYXRlOiBQYXJ0aWFsPENvbG9yUmFuZ2U+ID0ge307XG4gIHVwZGF0ZS5jb2xvcnMgPSBbLi4uY29sb3JzXTtcblxuICBpZiAodXBkYXRlLmNvbG9ycy5sZW5ndGggPiAxKSB7XG4gICAgdXBkYXRlLmNvbG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIC8vIHVwZGF0ZSBjb2xvciBtYXBcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JNYXApKSB7XG4gICAgLy8gZmluZCBjb2xvck1hcCBpbmRleFxuICAgIGNvbnN0IGNvbG9yTWFwSW5kZXggPSBjb2xvck1hcC5maW5kSW5kZXgoY20gPT4gY21bMV0gPT09IG9sZFZhbHVlKTtcbiAgICBpZiAoY29sb3JNYXBJbmRleCA+PSAwKSB7XG4gICAgICB1cGRhdGUuY29sb3JNYXAgPSBbLi4uY29sb3JNYXBdO1xuICAgICAgdXBkYXRlLmNvbG9yTWFwLnNwbGljZShjb2xvck1hcEluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgLy8gdXBkYXRlIGNvbG9yIGxlZ2VuZFxuICBpZiAoY29sb3JMZWdlbmRzPy5bb2xkVmFsdWVdKSB7XG4gICAgdXBkYXRlLmNvbG9yTGVnZW5kcyA9IHsuLi5jb2xvckxlZ2VuZHN9O1xuICAgIGRlbGV0ZSB1cGRhdGUuY29sb3JMZWdlbmRzW29sZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uY3VzdG9tUGFsZXR0ZSxcbiAgICAuLi51cGRhdGVcbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYSBjb2xvciBpbiBjdXN0b20gcGFsZXR0ZSBhdCBpbmRleFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ3VzdG9tUGFsZXR0ZUNvbG9yKFxuICBjdXN0b21QYWxldHRlOiBDb2xvclJhbmdlLFxuICBpbmRleDogbnVtYmVyLFxuICBuZXdWYWx1ZTogSGV4Q29sb3Jcbik6IENvbG9yUmFuZ2Uge1xuICBjb25zdCB7Y29sb3JzfSA9IGN1c3RvbVBhbGV0dGU7XG4gIGNvbnN0IGhleCA9IG5ld1ZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5ld0NvbG9ycyA9IFsuLi5jb2xvcnNdO1xuICBuZXdDb2xvcnNbaW5kZXhdID0gaGV4O1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHJlcGxhY2VDb2xvcnNJbkNvbG9yUmFuZ2UoY3VzdG9tUGFsZXR0ZSwgbmV3Q29sb3JzKTtcblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiB7XG4gICAgLi4uY3VzdG9tUGFsZXR0ZSxcbiAgICAuLi51cGRhdGVcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZXZlcnNlZCBjb2xvclJhbmdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlQ29sb3JSYW5nZShyZXZlcnNlZDogYm9vbGVhbiwgY29sb3JSYW5nZTogQ29sb3JSYW5nZSk6IENvbG9yUmFuZ2Uge1xuICBjb25zdCBuZXdDb2xvcnMgPSBjb2xvclJhbmdlPy5jb2xvcnMuc2xpY2UoKS5yZXZlcnNlKCk7XG4gIGNvbnN0IHVwZGF0ZWQgPSByZXBsYWNlQ29sb3JzSW5Db2xvclJhbmdlKGNvbG9yUmFuZ2UsIG5ld0NvbG9ycyk7XG4gIHVwZGF0ZWQucmV2ZXJzZWQgPSByZXZlcnNlZDtcblxuICByZXR1cm4gdXBkYXRlZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHBhbGV0dGUgbWF0Y2hlcyBjdXJyZW50IENvbG9yQmxpbmRTYWZlIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFsZXR0ZUlzQ29sb3JCbGluZFNhZmUocGFsZXR0ZTogQ29sb3JQYWxldHRlLCBjb2xvckJsaW5kU2FmZTogYm9vbGVhbikge1xuICByZXR1cm4gIWNvbG9yQmxpbmRTYWZlIHx8IChjb2xvckJsaW5kU2FmZSAmJiBwYWxldHRlLmNvbG9yQmxpbmRTYWZlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHBhbGV0dGUgbWF0Y2hlcyBjdXJyZW50IHN0ZXBzIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNRdWFQYWxldHRlKHBhbGV0dGU6IENvbG9yUGFsZXR0ZSk6IHBhbGV0dGUgaXMgQ2F0ZWdvcmljYWxQYWxldHRlIHtcbiAgcmV0dXJuIHBhbGV0dGUudHlwZSA9PT0gUEFMRVRURV9UWVBFUy5RVUE7XG59XG5cbi8qKlxuICogV2hldGhlciBwYWxldHRlIG1hdGNoZXMgY3VycmVudCBzdGVwcyBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhbGV0dGVJc1N0ZXBzKHBhbGV0dGU6IENvbG9yUGFsZXR0ZSwgc3RlcHM6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gIWlzUXVhUGFsZXR0ZShwYWxldHRlKSB8fCBwYWxldHRlLm1heFN0ZXAgPj0gc3RlcHM7XG59XG5cbi8qKlxuICogV2hldGhlciBwYWxldHRlIG1hdGNoZXMgY3VycmVudCB0eXBlIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFsZXR0ZUlzVHlwZShwYWxldHRlOiBDb2xvclBhbGV0dGUsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSA9PT0gJ2FsbCcgfHwgdHlwZSA9PT0gcGFsZXR0ZS50eXBlO1xufVxuLyoqXG4gKiBGaW5kIGJlc3QgbWF0Y2ggcGFsZXR0ZSBiYXNlZCBvbiBjb25maWcsIHVwZGF0ZSBjb2xvciByYW5nZSBieSBpdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29sb3JSYW5nZUJ5TWF0Y2hpbmdQYWxldHRlKFxuICBjdXJyZW50Q29sb3JSYW5nZTogQ29sb3JSYW5nZSxcbiAgY29uZmlnOiBDb2xvclJhbmdlQ29uZmlnXG4pOiBDb2xvclJhbmdlIHtcbiAgY29uc3Qge3N0ZXBzLCBjb2xvckJsaW5kU2FmZSwgdHlwZX0gPSBjb25maWc7XG5cbiAgY29uc3QgbWF0Y2hpbmdQYWxldHRlID0gS0VQTEVSX0NPTE9SX1BBTEVUVEVTLmZpbHRlcihcbiAgICBwYWxldHRlID0+XG4gICAgICAvLyBwYWxldHRlIG1hdGNoIHR5cGVcbiAgICAgIHBhbGV0dGVJc1R5cGUocGFsZXR0ZSwgdHlwZSkgJiZcbiAgICAgIC8vIHBhbGV0dGUgaGFzIHNhbWUgc3RlcFxuICAgICAgcGFsZXR0ZUlzU3RlcHMocGFsZXR0ZSwgc3RlcHMpICYmXG4gICAgICAvLyBwYWxldHRlIGlzIGNvbG9yQmxpbmRTYWZlXG4gICAgICBwYWxldHRlSXNDb2xvckJsaW5kU2FmZShwYWxldHRlLCBjb2xvckJsaW5kU2FmZSlcbiAgKTtcblxuICBjb25zdCBiZXN0TWF0Y2ggPSBtYXRjaGluZ1BhbGV0dGUubGVuZ3RoXG4gICAgPyBtYXRjaGluZ1BhbGV0dGUuZmluZChwID0+IHAubmFtZSA9PT0gY3VycmVudENvbG9yUmFuZ2UubmFtZSkgfHwgbWF0Y2hpbmdQYWxldHRlWzBdXG4gICAgOiBudWxsO1xuXG4gIGlmIChiZXN0TWF0Y2gpIHtcbiAgICByZXR1cm4gdXBkYXRlQ29sb3JSYW5nZUJ5U2VsZWN0ZWRQYWxldHRlKGN1cnJlbnRDb2xvclJhbmdlLCBiZXN0TWF0Y2gsIGNvbmZpZyk7XG4gIH1cbiAgLy8gd2UgZG8gbm90aGluZ1xuICBDb25zb2xlLndhcm4oXG4gICAgYHdlIGNhbnQgZmluZCBhbnkgcHJlc2V0IHBhbGV0dGUgbWF0Y2hlcyByZXF1aXJtZW50czogc3RlcHM9JHtzdGVwc30gJiYgY29sb3JCbGluZFNhZmU9JHtjb2xvckJsaW5kU2FmZX1gXG4gICk7XG5cbiAgcmV0dXJuIGN1cnJlbnRDb2xvclJhbmdlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBjdXN0b20gcGFsZXR0ZSB3aGVuIHJldmVyc2UgdGhlIGNvbG9ycyBpbiBjdXN0b20gcGFsZXR0ZSwgc2luY2UgY2hhbmdpbmcgJ3N0ZXBzJyxcbiAqICdjb2xvckJpbmRTYWZlJywgJ3R5cGUnIHNob3VsZCBmYWxsIGJhY2sgdG8gcHJlZGVmaW5lZCBwYWxldHRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ3VzdG9tQ29sb3JSYW5nZUJ5Q29sb3JVSShcbiAgb2xkQ29sb3JSYW5nZTogQ29sb3JSYW5nZSxcbiAgY29sb3JDb25maWc6IENvbG9yUmFuZ2VDb25maWdcbik6IENvbG9yUmFuZ2Uge1xuICBjb25zdCB7cmV2ZXJzZWR9ID0gY29sb3JDb25maWc7XG4gIGNvbnN0IGNvbG9ycyA9IG9sZENvbG9yUmFuZ2UuY29sb3JzO1xuICAvLyBmb3IgY3VzdG9tIHBhbGV0dGUsIG9uZSBjYW4gb25seSAncmV2ZXJzZScgdGhlIGNvbG9ycyBpbiBjdXN0b20gcGFsZXR0ZS5cbiAgY29sb3JzLnJldmVyc2UoKTtcblxuICBjb25zdCBjb2xvclJhbmdlID0ge1xuICAgIG5hbWU6IG9sZENvbG9yUmFuZ2UubmFtZSxcbiAgICB0eXBlOiBvbGRDb2xvclJhbmdlLnR5cGUsXG4gICAgY2F0ZWdvcnk6IG9sZENvbG9yUmFuZ2UuY2F0ZWdvcnksXG4gICAgY29sb3JzLFxuICAgIC4uLihyZXZlcnNlZCA/IHtyZXZlcnNlZH0gOiB7fSksXG4gICAgLi4uKG9sZENvbG9yUmFuZ2UuY29sb3JNYXAgPyB7Y29sb3JNYXA6IG9sZENvbG9yUmFuZ2UuY29sb3JNYXB9IDoge30pLFxuICAgIC4uLihvbGRDb2xvclJhbmdlLmNvbG9yTGVnZW5kcyA/IHtjb2xvckxlZ2VuZHM6IG9sZENvbG9yUmFuZ2UuY29sb3JMZWdlbmRzfSA6IHt9KVxuICB9O1xuXG4gIHJldHVybiByZXBsYWNlQ29sb3JzSW5Db2xvclJhbmdlKGNvbG9yUmFuZ2UsIGNvbG9yUmFuZ2UuY29sb3JzKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgY29sb3IgcmFuZ2UgYWZ0ZXIgc2VsZWN0aW5nIGEgcGFsZXR0ZSBmcm9tIGNvbG9yIHJhbmdlIHNlbGVjdG9lclxuICogQ29weSBvdmVyIGNvbG9yTWFwIGFuZCBjb2xvckxlZ2VuZHNcbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDb2xvclJhbmdlQnlTZWxlY3RlZFBhbGV0dGUob2xkQ29sb3JSYW5nZSwgY29sb3JQYWxldHRlLCBjb2xvckNvbmZpZykge1xuICBjb25zdCB7Y29sb3JzOiBuZXdDb2xvcnMsIC4uLm5ld0NvbG9yUmFuZ2V9ID0gY29sb3JQYWxldHRlVG9Db2xvclJhbmdlKGNvbG9yUGFsZXR0ZSwgY29sb3JDb25maWcpO1xuXG4gIGNvbnN0IGNvbG9yUmFuZ2UgPSB7XG4gICAgY29sb3JzOiBvbGRDb2xvclJhbmdlLmNvbG9ycyxcbiAgICAuLi5uZXdDb2xvclJhbmdlLFxuICAgIC4uLihvbGRDb2xvclJhbmdlLmNvbG9yTWFwID8ge2NvbG9yTWFwOiBvbGRDb2xvclJhbmdlLmNvbG9yTWFwfSA6IHt9KSxcbiAgICAuLi4ob2xkQ29sb3JSYW5nZS5jb2xvckxlZ2VuZHMgPyB7Y29sb3JMZWdlbmRzOiBvbGRDb2xvclJhbmdlLmNvbG9yTGVnZW5kc30gOiB7fSlcbiAgfTtcblxuICByZXR1cm4gcmVwbGFjZUNvbG9yc0luQ29sb3JSYW5nZShjb2xvclJhbmdlLCBuZXdDb2xvcnMpO1xufVxuXG5jb25zdCBVYmVyTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCgvXihbQS1aYS16IF0pKy9nKTtcbmNvbnN0IENvbG9yQnJld2VyUmVnZXggPSBuZXcgUmVnRXhwKC9eQ29sb3JCcmV3ZXIgKFtBLVphLXoxLTldKSsvZyk7XG5cbi8qKlxuICogY29udmVydCBzYXZlZCBjb2xvclJhbmdlIHRvIGNvbG9yUGFsZXR0ZSBvYmpldnQgdHlwZS9uYW1lL2NhdGVnb3J5L2lzQ29sb3JCbGluZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JSYW5nZUJhY2t3YXJkQ29tcGF0aWJpbGl0eShjb2xvclJhbmdlOiBDb2xvclJhbmdlKTogQ29sb3JSYW5nZSB7XG4gIGlmICghY29sb3JSYW5nZSB8fCBjb2xvclJhbmdlLnR5cGUgPT09ICdjdXN0b20nIHx8IGNvbG9yUmFuZ2UuY29sb3JNYXApIHtcbiAgICAvLyBkb24ndCBkbyBhbnl0aGluZyB0byBjdXN0b20gY29sb3IgcGFsZXR0ZSwgb3IgcGFsZXR0ZSB3aXRoIGN1c3RvbSBicmVha3NcbiAgICByZXR1cm4gY29sb3JSYW5nZTtcbiAgfVxuICBsZXQgdHJpbU5hbWU7XG4gIGlmIChjb2xvclJhbmdlLmNhdGVnb3J5ID09PSAnVWJlcicpIHtcbiAgICBjb25zdCBtYXRjaE5hbWUgPSAoY29sb3JSYW5nZS5uYW1lID8/ICcnKS5tYXRjaChVYmVyTmFtZVJlZ2V4KTtcbiAgICB0cmltTmFtZSA9IG1hdGNoTmFtZSA/IG1hdGNoTmFtZVswXS50cmltKCkgOiBudWxsO1xuICAgIC8vIG1hdGNoIFViZXIgVml6IFF1YWxpdGF0aXZlIDEuNCAtPiBVYmVyIFZpeiBRdWFsaXRhdGl2ZVxuICB9IGVsc2UgaWYgKGNvbG9yUmFuZ2UuY2F0ZWdvcnkgPT09ICdDb2xvckJyZXdlcicpIHtcbiAgICBjb25zdCBtYXRjaE5hbWUgPSAoY29sb3JSYW5nZS5uYW1lID8/ICcnKS5tYXRjaChDb2xvckJyZXdlclJlZ2V4KTtcbiAgICB0cmltTmFtZSA9IG1hdGNoTmFtZSA/IG1hdGNoTmFtZVswXS5yZXBsYWNlKCdDb2xvckJyZXdlciAnLCAnJykudHJpbSgpIDogbnVsbDtcbiAgfVxuXG4gIGlmICh0cmltTmFtZSkge1xuICAgIGNvbnN0IG1hdGNoaW5nUGFsZXR0ZSA9IEtFUExFUl9DT0xPUl9QQUxFVFRFUy5maW5kKHAgPT4gcC5uYW1lID09PSB0cmltTmFtZSk7XG4gICAgaWYgKG1hdGNoaW5nUGFsZXR0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgICAgbmFtZTogdHJpbU5hbWUsXG4gICAgICAgIHR5cGU6IG1hdGNoaW5nUGFsZXR0ZT8udHlwZSxcbiAgICAgICAgY2F0ZWdvcnk6IG1hdGNoaW5nUGFsZXR0ZS5jYXRlZ29yeVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29sb3JSYW5nZTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGN1c3RvbSBwYWxldHRlIGZyb20gY3VycmVudCBzdGFuZGFyZCBjb2xvciByYW5nZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVDdXN0b21QYWxldHRlKGNvbG9yUmFuZ2U6IENvbG9yUmFuZ2UsIGNvbG9yTWFwPzogQ29sb3JNYXApOiBDb2xvclJhbmdlIHtcbiAgLy8gVE9ETzogY2hlY2sgb24gYGlzUmV2ZXJzZWRgIGtleSwgd2hldGhlciB3ZSBjYW4gcmVtb3ZlIGl0IGhlcmVcbiAgY29uc3QgY3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAuLi5jb2xvclJhbmdlLFxuICAgIG5hbWU6IERFRkFVTFRfQ1VTVE9NX1BBTEVUVEUubmFtZSxcbiAgICB0eXBlOiBERUZBVUxUX0NVU1RPTV9QQUxFVFRFLnR5cGUsXG4gICAgY2F0ZWdvcnk6IERFRkFVTFRfQ1VTVE9NX1BBTEVUVEUuY2F0ZWdvcnksXG4gICAgLi4uKGNvbG9yTWFwID8ge2NvbG9yTWFwfSA6IHt9KVxuICB9O1xuXG4gIHJldHVybiBjdXN0b21QYWxldHRlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQVNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUFxQyxJQUFBTSxTQUFBO0FBQUEsU0FBQUMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEs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