@kepler.gl/utils 3.0.0-alpha.0 → 3.0.0-alpha.1
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/aggregate-utils.js +2 -2
- package/dist/color-utils.d.ts +4 -0
- package/dist/color-utils.js +28 -3
- package/dist/data-container-interface.js +1 -1
- package/dist/data-container-utils.js +2 -2
- package/dist/data-row.js +2 -2
- package/dist/data-scale-utils.js +4 -4
- package/dist/data-utils.d.ts +10 -12
- package/dist/data-utils.js +120 -44
- package/dist/dataset-utils.d.ts +12 -1
- package/dist/dataset-utils.js +74 -9
- package/dist/dom-to-image.d.ts +14 -14
- package/dist/dom-to-image.js +23 -69
- package/dist/dom-utils.d.ts +3 -0
- package/dist/dom-utils.js +29 -3
- package/dist/effect-utils.d.ts +13 -0
- package/dist/effect-utils.js +129 -0
- package/dist/export-map-html.js +2 -2
- package/dist/export-utils.js +13 -4
- package/dist/filter-utils.d.ts +11 -9
- package/dist/filter-utils.js +66 -36
- package/dist/format.d.ts +1 -0
- package/dist/format.js +33 -0
- package/dist/gl-utils.js +2 -2
- package/dist/h3-utils.d.ts +2 -1
- package/dist/h3-utils.js +5 -4
- package/dist/index.d.ts +14 -9
- package/dist/index.js +230 -555
- package/dist/indexed-data-container.js +2 -2
- package/dist/locale-utils.js +2 -2
- package/dist/map-info-utils.js +2 -2
- package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +2 -1
- package/dist/map-style-utils/mapbox-gl-style-editor.js +9 -3
- package/dist/map-style-utils/mapbox-utils.js +2 -2
- package/dist/map-utils.d.ts +8 -2
- package/dist/map-utils.js +24 -7
- package/dist/mapbox-utils.js +2 -2
- package/dist/noop.d.ts +1 -0
- package/dist/noop.js +29 -0
- package/dist/notifications-utils.d.ts +14 -26
- package/dist/notifications-utils.js +9 -11
- package/dist/observe-dimensions.js +10 -6
- package/dist/plot.d.ts +6 -0
- package/dist/plot.js +46 -0
- package/dist/projection-utils.d.ts +9 -0
- package/dist/projection-utils.js +36 -2
- package/dist/row-data-container.js +2 -2
- package/dist/searcher-utils.js +2 -2
- package/dist/split-map-utils.d.ts +4 -1
- package/dist/split-map-utils.js +10 -4
- package/dist/time.d.ts +16 -0
- package/dist/time.js +105 -0
- package/dist/utils.d.ts +36 -10
- package/dist/utils.js +38 -6
- package/package.json +11 -11
package/dist/data-utils.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright (c)
|
1
|
+
// Copyright (c) 2023 Uber Technologies, Inc.
|
2
2
|
//
|
3
3
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
// of this software and associated documentation files (the "Software"), to deal
|
@@ -32,21 +32,25 @@ exports.getSampleData = getSampleData;
|
|
32
32
|
exports.timeToUnixMilli = timeToUnixMilli;
|
33
33
|
exports.notNullorUndefined = notNullorUndefined;
|
34
34
|
exports.isNumber = isNumber;
|
35
|
-
exports.isPlainObject = isPlainObject;
|
36
35
|
exports.hasOwnProperty = hasOwnProperty;
|
37
36
|
exports.numberSort = numberSort;
|
38
37
|
exports.getSortingFunction = getSortingFunction;
|
39
38
|
exports.preciseRound = preciseRound;
|
39
|
+
exports.roundToFour = roundToFour;
|
40
40
|
exports.getRoundingDecimalFromStep = getRoundingDecimalFromStep;
|
41
|
-
exports.snapToMarks = snapToMarks;
|
42
41
|
exports.normalizeSliderValue = normalizeSliderValue;
|
43
42
|
exports.roundValToStep = roundValToStep;
|
44
43
|
exports.getFormatter = getFormatter;
|
44
|
+
exports.getColumnFormatter = getColumnFormatter;
|
45
|
+
exports.applyValueMap = applyValueMap;
|
45
46
|
exports.applyDefaultFormat = applyDefaultFormat;
|
46
47
|
exports.getBooleanFormatter = getBooleanFormatter;
|
47
48
|
exports.applyCustomFormat = applyCustomFormat;
|
49
|
+
exports.formatNumber = formatNumber;
|
48
50
|
exports.datetimeFormatter = datetimeFormatter;
|
49
|
-
exports.arrayMove = exports.parseFieldValue = exports.FIELD_DISPLAY_FORMAT = exports.defaultFormatter = void 0;
|
51
|
+
exports.arrayMove = exports.parseFieldValue = exports.FIELD_DISPLAY_FORMAT = exports.floatFormatter = exports.defaultFormatter = void 0;
|
52
|
+
|
53
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
50
54
|
|
51
55
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
52
56
|
|
@@ -54,14 +58,16 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
|
|
54
58
|
|
55
59
|
var _assert = _interopRequireDefault(require("assert"));
|
56
60
|
|
57
|
-
var _constants = require("@kepler.gl/constants");
|
58
|
-
|
59
61
|
var _d3Format = require("d3-format");
|
60
62
|
|
61
|
-
var _d3Array = require("d3-array");
|
62
|
-
|
63
63
|
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
|
64
64
|
|
65
|
+
var _constants = require("@kepler.gl/constants");
|
66
|
+
|
67
|
+
var _plot = require("./plot");
|
68
|
+
|
69
|
+
var _utils = require("./utils");
|
70
|
+
|
65
71
|
var _FIELD_DISPLAY_FORMAT;
|
66
72
|
|
67
73
|
/**
|
@@ -155,15 +161,6 @@ function notNullorUndefined(d) {
|
|
155
161
|
function isNumber(d) {
|
156
162
|
return Number.isFinite(d);
|
157
163
|
}
|
158
|
-
/**
|
159
|
-
* whether is an object
|
160
|
-
* @returns {boolean} - yes or no
|
161
|
-
*/
|
162
|
-
|
163
|
-
|
164
|
-
function isPlainObject(obj) {
|
165
|
-
return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj);
|
166
|
-
}
|
167
164
|
/**
|
168
165
|
* whether object has property
|
169
166
|
* @param {string} prop
|
@@ -200,6 +197,16 @@ function preciseRound(num, decimals) {
|
|
200
197
|
var t = Math.pow(10, decimals);
|
201
198
|
return (Math.round(num * t + (decimals > 0 ? 1 : 0) * (Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
|
202
199
|
}
|
200
|
+
/**
|
201
|
+
* round a giving number at most 4 decimal places
|
202
|
+
* e.g. 10 -> 10, 1.12345 -> 1.2345, 2.0 -> 2
|
203
|
+
*/
|
204
|
+
|
205
|
+
|
206
|
+
function roundToFour(num) {
|
207
|
+
// @ts-expect-error
|
208
|
+
return Number("".concat(Math.round("".concat(num, "e+4")), "e-4"));
|
209
|
+
}
|
203
210
|
/**
|
204
211
|
* get number of decimals to round to for slider from step
|
205
212
|
* @param step
|
@@ -213,33 +220,23 @@ function getRoundingDecimalFromStep(step) {
|
|
213
220
|
(0, _assert["default"])(step);
|
214
221
|
}
|
215
222
|
|
216
|
-
var
|
223
|
+
var stepStr = step.toString(); // in case the step is a very small number e.g. 1e-7, return decimal e.g. 7 directly
|
217
224
|
|
218
|
-
|
219
|
-
return 0;
|
220
|
-
}
|
221
|
-
|
222
|
-
return splitZero[1].length;
|
223
|
-
}
|
224
|
-
/**
|
225
|
-
* Use in slider, given a number and an array of numbers, return the nears number from the array
|
226
|
-
* @param value
|
227
|
-
* @param marks
|
228
|
-
*/
|
225
|
+
var splitExponential = stepStr.split('e-');
|
229
226
|
|
227
|
+
if (splitExponential.length === 2) {
|
228
|
+
var coeffZero = splitExponential[0].split('.');
|
229
|
+
var coeffDecimal = coeffZero.length === 1 ? 0 : coeffZero[1].length;
|
230
|
+
return parseInt(splitExponential[1], 10) + coeffDecimal;
|
231
|
+
}
|
230
232
|
|
231
|
-
|
232
|
-
// always use bin x0
|
233
|
-
var i = (0, _d3Array.bisectLeft)(marks, value);
|
233
|
+
var splitZero = stepStr.split('.');
|
234
234
|
|
235
|
-
if (
|
236
|
-
return
|
237
|
-
} else if (i === marks.length) {
|
238
|
-
return marks[i - 1];
|
235
|
+
if (splitZero.length === 1) {
|
236
|
+
return 0;
|
239
237
|
}
|
240
238
|
|
241
|
-
|
242
|
-
return marks[idx];
|
239
|
+
return splitZero[1].length;
|
243
240
|
}
|
244
241
|
/**
|
245
242
|
* If marks is provided, snap to marks, if not normalize to step
|
@@ -252,7 +249,8 @@ function snapToMarks(value, marks) {
|
|
252
249
|
|
253
250
|
function normalizeSliderValue(val, minValue, step, marks) {
|
254
251
|
if (marks && marks.length) {
|
255
|
-
|
252
|
+
// Use in slider, given a number and an array of numbers, return the nears number from the array
|
253
|
+
return (0, _plot.snapToMarks)(val, marks);
|
256
254
|
}
|
257
255
|
|
258
256
|
return roundValToStep(minValue, step, val);
|
@@ -301,9 +299,15 @@ var defaultFormatter = function defaultFormatter(v) {
|
|
301
299
|
};
|
302
300
|
|
303
301
|
exports.defaultFormatter = defaultFormatter;
|
302
|
+
|
303
|
+
var floatFormatter = function floatFormatter(v) {
|
304
|
+
return isNumber(v) ? String(roundToFour(v)) : '';
|
305
|
+
};
|
306
|
+
|
307
|
+
exports.floatFormatter = floatFormatter;
|
304
308
|
var FIELD_DISPLAY_FORMAT = (_FIELD_DISPLAY_FORMAT = {}, (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.string, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.timestamp, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.integer, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.real, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES["boolean"], defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.date, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.geojson, function (d) {
|
305
|
-
return typeof d === 'string' ? d : isPlainObject(d) ? JSON.stringify(d) : Array.isArray(d) ? "[".concat(String(d), "]") : '';
|
306
|
-
}), _FIELD_DISPLAY_FORMAT);
|
309
|
+
return typeof d === 'string' ? d : (0, _utils.isPlainObject)(d) ? JSON.stringify(d) : Array.isArray(d) ? "[".concat(String(d), "]") : '';
|
310
|
+
}), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.object, JSON.stringify), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.array, JSON.stringify), _FIELD_DISPLAY_FORMAT);
|
307
311
|
/**
|
308
312
|
* Parse field value and type and return a string representation
|
309
313
|
*/
|
@@ -364,6 +368,35 @@ function getFormatter(format, field) {
|
|
364
368
|
return defaultFormatter;
|
365
369
|
}
|
366
370
|
|
371
|
+
function getColumnFormatter(colMeta) {
|
372
|
+
var format = colMeta.format,
|
373
|
+
displayFormat = colMeta.displayFormat;
|
374
|
+
|
375
|
+
if (!format && !displayFormat) {
|
376
|
+
return FIELD_DISPLAY_FORMAT[colMeta.type];
|
377
|
+
}
|
378
|
+
|
379
|
+
var tooltipFormat = Object.values(_constants.TOOLTIP_FORMATS).find(function (f) {
|
380
|
+
return f[_constants.TOOLTIP_KEY] === displayFormat;
|
381
|
+
});
|
382
|
+
|
383
|
+
if (tooltipFormat) {
|
384
|
+
return applyDefaultFormat(tooltipFormat);
|
385
|
+
} else if (typeof displayFormat === 'string' && colMeta) {
|
386
|
+
return applyCustomFormat(displayFormat, colMeta);
|
387
|
+
} else if ((0, _typeof2["default"])(displayFormat) === 'object') {
|
388
|
+
return applyValueMap(displayFormat);
|
389
|
+
}
|
390
|
+
|
391
|
+
return defaultFormatter;
|
392
|
+
}
|
393
|
+
|
394
|
+
function applyValueMap(format) {
|
395
|
+
return function (v) {
|
396
|
+
return format[v];
|
397
|
+
};
|
398
|
+
}
|
399
|
+
|
367
400
|
function applyDefaultFormat(tooltipFormat) {
|
368
401
|
if (!tooltipFormat || !tooltipFormat.format) {
|
369
402
|
return defaultFormatter;
|
@@ -424,6 +457,48 @@ function applyCustomFormat(format, field) {
|
|
424
457
|
};
|
425
458
|
}
|
426
459
|
}
|
460
|
+
|
461
|
+
function formatLargeNumber(n) {
|
462
|
+
// SI-prefix with 4 significant digits
|
463
|
+
return (0, _d3Format.format)('.4~s')(n);
|
464
|
+
}
|
465
|
+
|
466
|
+
function formatNumber(n, type) {
|
467
|
+
switch (type) {
|
468
|
+
case _constants.ALL_FIELD_TYPES.integer:
|
469
|
+
if (n < 0) {
|
470
|
+
return "-".concat(formatNumber(-n, 'integer'));
|
471
|
+
}
|
472
|
+
|
473
|
+
if (n < 1000) {
|
474
|
+
return "".concat(Math.round(n));
|
475
|
+
}
|
476
|
+
|
477
|
+
if (n < 10 * 1000) {
|
478
|
+
return (0, _d3Format.format)(',')(Math.round(n));
|
479
|
+
}
|
480
|
+
|
481
|
+
return formatLargeNumber(n);
|
482
|
+
|
483
|
+
case _constants.ALL_FIELD_TYPES.real:
|
484
|
+
if (n < 0) {
|
485
|
+
return "-".concat(formatNumber(-n, 'number'));
|
486
|
+
}
|
487
|
+
|
488
|
+
if (n < 1000) {
|
489
|
+
return (0, _d3Format.format)('.4~r')(n);
|
490
|
+
}
|
491
|
+
|
492
|
+
if (n < 10 * 1000) {
|
493
|
+
return (0, _d3Format.format)(',.2~f')(n);
|
494
|
+
}
|
495
|
+
|
496
|
+
return formatLargeNumber(n);
|
497
|
+
|
498
|
+
default:
|
499
|
+
return formatNumber(n, 'real');
|
500
|
+
}
|
501
|
+
}
|
427
502
|
/**
|
428
503
|
* Format epoch milliseconds with a format string
|
429
504
|
* @type timezone
|
@@ -435,10 +510,11 @@ function datetimeFormatter(timezone) {
|
|
435
510
|
return function (ts) {
|
436
511
|
return _momentTimezone["default"].utc(ts).tz(timezone).format(format);
|
437
512
|
};
|
438
|
-
} :
|
513
|
+
} : // return empty string instead of 'Invalid date' if ts is undefined/null
|
514
|
+
function (format) {
|
439
515
|
return function (ts) {
|
440
|
-
return _momentTimezone["default"].utc(ts).format(format);
|
516
|
+
return ts ? _momentTimezone["default"].utc(ts).format(format) : '';
|
441
517
|
};
|
442
518
|
};
|
443
519
|
}
|
444
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXV0aWxzLnRzIl0sIm5hbWVzIjpbInVuaXF1ZSIsInZhbHVlcyIsInJlc3VsdHMiLCJ1bmlxdWVTZXQiLCJTZXQiLCJmb3JFYWNoIiwidiIsIm5vdE51bGxvclVuZGVmaW5lZCIsInB1c2giLCJnZXRMYXRMbmdCb3VuZHMiLCJwb2ludHMiLCJpZHgiLCJsaW1pdCIsImxhdHMiLCJtYXAiLCJkIiwiTnVtYmVyIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNGaW5pdGUiLCJzb3J0IiwibnVtYmVyU29ydCIsImxlbmd0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjbGFtcCIsInZhbCIsImdldFNhbXBsZURhdGEiLCJkYXRhIiwic2FtcGxlU2l6ZSIsImdldFZhbHVlIiwic2FtcGxlU3RlcCIsImZsb29yIiwib3V0cHV0IiwiaSIsInRpbWVUb1VuaXhNaWxsaSIsInZhbHVlIiwiZm9ybWF0IiwibW9tZW50IiwidXRjIiwidmFsdWVPZiIsIkRhdGUiLCJ1bmRlZmluZWQiLCJpc051bWJlciIsImlzUGxhaW5PYmplY3QiLCJvYmoiLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3AiLCJhIiwiYiIsImdldFNvcnRpbmdGdW5jdGlvbiIsImZpZWxkVHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInJlYWwiLCJpbnRlZ2VyIiwidGltZXN0YW1wIiwicHJlY2lzZVJvdW5kIiwibnVtIiwiZGVjaW1hbHMiLCJ0IiwicG93Iiwicm91bmQiLCJzaWduIiwidG9GaXhlZCIsImdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwIiwic3RlcCIsImlzTmFOIiwic3BsaXRaZXJvIiwidG9TdHJpbmciLCJzcGxpdCIsInNuYXBUb01hcmtzIiwibWFya3MiLCJub3JtYWxpemVTbGlkZXJWYWx1ZSIsIm1pblZhbHVlIiwicm91bmRWYWxUb1N0ZXAiLCJkZWNpbWFsIiwic3RlcHMiLCJyZW1haW4iLCJjbG9zZXN0Iiwicm91bmRlZCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJTdHJpbmciLCJGSUVMRF9ESVNQTEFZX0ZPUk1BVCIsInN0cmluZyIsImRhdGUiLCJnZW9qc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlRmllbGRWYWx1ZSIsInR5cGUiLCJhcnJheU1vdmVNdXRhdGUiLCJhcnJheSIsImZyb20iLCJ0byIsInNwbGljZSIsImFycmF5TW92ZSIsInNsaWNlIiwiZ2V0Rm9ybWF0dGVyIiwiZmllbGQiLCJ0b29sdGlwRm9ybWF0IiwiVE9PTFRJUF9GT1JNQVRTIiwiZmluZCIsImYiLCJUT09MVElQX0tFWSIsImFwcGx5RGVmYXVsdEZvcm1hdCIsImFwcGx5Q3VzdG9tRm9ybWF0IiwiVE9PTFRJUF9GT1JNQVRfVFlQRVMiLCJERUNJTUFMIiwiREFURSIsIkRBVEVfVElNRSIsImRhdGV0aW1lRm9ybWF0dGVyIiwiUEVSQ0VOVEFHRSIsIkRFQ0lNQUxfREVDSU1BTF9GSVhFRF8yIiwiQk9PTEVBTiIsImdldEJvb2xlYW5Gb3JtYXR0ZXIiLCJ0aW1lem9uZSIsInRzIiwidHoiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBT0E7O0FBQ0E7O0FBQ0E7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQW1CQyxNQUFuQixFQUFnQztBQUNyQyxNQUFNQyxPQUFZLEdBQUcsRUFBckI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxNQUFSLENBQWxCO0FBQ0FFLEVBQUFBLFNBQVMsQ0FBQ0UsT0FBVixDQUFrQixVQUFBQyxDQUFDLEVBQUk7QUFDckIsUUFBSUMsa0JBQWtCLENBQUNELENBQUQsQ0FBdEIsRUFBMkI7QUFDekJKLE1BQUFBLE9BQU8sQ0FBQ00sSUFBUixDQUFhRixDQUFiO0FBQ0Q7QUFDRixHQUpEO0FBS0EsU0FBT0osT0FBUDtBQUNEOztBQUVNLFNBQVNPLGVBQVQsQ0FDTEMsTUFESyxFQUVMQyxHQUZLLEVBR0xDLEtB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TUFBZixDQUFzQkEsTUFBdEIsQ0FBSjtBQUFBLEtBQU47QUFBQSxHQU5WO0FBT0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVMsXG4gIFRPT0xUSVBfS0VZLFxuICBUb29sdGlwRm9ybWF0XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Zm9ybWF0IGFzIGQzRm9ybWF0fSBmcm9tICdkMy1mb3JtYXQnO1xuaW1wb3J0IHtiaXNlY3RMZWZ0fSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5cbmltcG9ydCB7TWlsbGlzZWNvbmQsIEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXR0ZXIgPSAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIHNpbXBsZSBnZXR0aW5nIHVuaXF1ZSB2YWx1ZXMgb2YgYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4odmFsdWVzOiBUW10pIHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGNvbnN0IHVuaXF1ZVNldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgdW5pcXVlU2V0LmZvckVhY2godiA9PiB7XG4gICAgaWYgKG5vdE51bGxvclVuZGVmaW5lZCh2KSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0TG5nQm91bmRzKFxuICBwb2ludHM6IG51bWJlcltdW10sXG4gIGlkeDogbnVtYmVyLFxuICBsaW1pdDogW251bWJlciwgbnVtYmVyXVxuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICBjb25zdCBsYXRzID0gcG9pbnRzXG4gICAgLm1hcChkID0+IE51bWJlcihBcnJheS5pc0FycmF5KGQpKSAmJiBkW2lkeF0pXG4gICAgLmZpbHRlcihOdW1iZXIuaXNGaW5pdGUpXG4gICAgLnNvcnQobnVtYmVyU29ydCk7XG5cbiAgaWYgKCFsYXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2xhbXAgdG8gbGltaXRcbiAgcmV0dXJuIFtNYXRoLm1heChsYXRzWzBdLCBsaW1pdFswXSksIE1hdGgubWluKGxhdHNbbGF0cy5sZW5ndGggLSAxXSwgbGltaXRbMV0pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKFttaW4sIG1heF06IFtudW1iZXIsIG51bWJlcl0sIHZhbDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiB2YWwgPD0gbWluID8gbWluIDogdmFsID49IG1heCA/IG1heCA6IHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbXBsZURhdGEoZGF0YSwgc2FtcGxlU2l6ZSA9IDUwMCwgZ2V0VmFsdWUgPSBkID0+IGQpIHtcbiAgY29uc3Qgc2FtcGxlU3RlcCA9IE1hdGgubWF4KE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyBzYW1wbGVTaXplKSwgMSk7XG4gIGNvbnN0IG91dHB1dDogYW55W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBzYW1wbGVTdGVwKSB7XG4gICAgb3V0cHV0LnB1c2goZ2V0VmFsdWUoZGF0YVtpXSkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRpZmZlcmVudCB0aW1lIGZvcm1hdCB0byB1bml4IG1pbGxpc2Vjb25kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRvVW5peE1pbGxpKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IE1pbGxpc2Vjb25kIHwgbnVsbCB7XG4gIGlmIChub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtb21lbnQudXRjKHZhbHVlLCBmb3JtYXQpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPT09ICd4JyA/IHZhbHVlICogMTAwMCA6IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIG51bGwgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3ROdWxsb3JVbmRlZmluZWQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPGFueT4+KGQ6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgIT09IHVuZGVmaW5lZCAmJiBkICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZCBpcyBhIG51bWJlciwgdGhpcyBmaWx0ZXJlZCBvdXQgTmFOIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKGQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGQpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgaXMgYW4gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgb2JqZWN0IGhhcyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIHt9LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFgsXG4gIHByb3A6IFlcbik6IG9iaiBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclNvcnQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGRUeXBlOiBzdHJpbmcpOiB0eXBlb2YgbnVtYmVyU29ydCB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBudW1iZXJTb3J0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogcm91bmQgbnVtYmVyIHdpdGggZXhhY3QgbnVtYmVyIG9mIGRlY2ltYWxzXG4gKiByZXR1cm4gYXMgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2VSb3VuZChudW06IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICByZXR1cm4gKFxuICAgIE1hdGgucm91bmQoXG4gICAgICBudW0gKiB0ICsgKGRlY2ltYWxzID4gMCA/IDEgOiAwKSAqIChNYXRoLnNpZ24obnVtKSAqICgxMCAvIE1hdGgucG93KDEwMCwgZGVjaW1hbHMpKSlcbiAgICApIC8gdFxuICApLnRvRml4ZWQoZGVjaW1hbHMpO1xufVxuXG4vKipcbiAqIGdldCBudW1iZXIgb2YgZGVjaW1hbHMgdG8gcm91bmQgdG8gZm9yIHNsaWRlciBmcm9tIHN0ZXBcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcmV0dXJucy0gbnVtYmVyIG9mIGRlY2ltYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpc05hTihzdGVwKSkge1xuICAgIGFzc2VydCgnc3RlcCBpcyBub3QgYSBudW1iZXInKTtcbiAgICBhc3NlcnQoc3RlcCk7XG4gIH1cblxuICBjb25zdCBzcGxpdFplcm8gPSBzdGVwLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgaWYgKHNwbGl0WmVyby5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3BsaXRaZXJvWzFdLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBVc2UgaW4gc2xpZGVyLCBnaXZlbiBhIG51bWJlciBhbmQgYW4gYXJyYXkgb2YgbnVtYmVycywgcmV0dXJuIHRoZSBuZWFycyBudW1iZXIgZnJvbSB0aGUgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIG1hcmtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmFwVG9NYXJrcyh2YWx1ZTogbnVtYmVyLCBtYXJrczogbnVtYmVyW10pOiBudW1iZXIge1xuICAvLyBhbHdheXMgdXNlIGJpbiB4MFxuICBjb25zdCBpID0gYmlzZWN0TGVmdChtYXJrcywgdmFsdWUpO1xuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBtYXJrc1tpXTtcbiAgfSBlbHNlIGlmIChpID09PSBtYXJrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbWFya3NbaSAtIDFdO1xuICB9XG4gIGNvbnN0IGlkeCA9IG1hcmtzW2ldIC0gdmFsdWUgPCB2YWx1ZSAtIG1hcmtzW2kgLSAxXSA/IGkgOiBpIC0gMTtcbiAgcmV0dXJuIG1hcmtzW2lkeF07XG59XG5cbi8qKlxuICogSWYgbWFya3MgaXMgcHJvdmlkZWQsIHNuYXAgdG8gbWFya3MsIGlmIG5vdCBub3JtYWxpemUgdG8gc3RlcFxuICogQHBhcmFtIHZhbFxuICogQHBhcmFtIG1pblZhbHVlXG4gKiBAcGFyYW0gc3RlcFxuICogQHBhcmFtIG1hcmtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTbGlkZXJWYWx1ZShcbiAgdmFsOiBudW1iZXIsXG4gIG1pblZhbHVlOiBudW1iZXIsXG4gIHN0ZXA6IG51bWJlcixcbiAgbWFya3M/OiBudW1iZXJbXVxuKTogbnVtYmVyIHtcbiAgaWYgKG1hcmtzICYmIG1hcmtzLmxlbmd0aCkge1xuICAgIHJldHVybiBzbmFwVG9NYXJrcyh2YWwsIG1hcmtzKTtcbiAgfVxuXG4gIHJldHVybiByb3VuZFZhbFRvU3RlcChtaW5WYWx1ZSwgc3RlcCwgdmFsKTtcbn1cblxuLyoqXG4gKiByb3VuZCB0aGUgdmFsdWUgdG8gc3RlcCBmb3IgdGhlIHNsaWRlclxuICogQHBhcmFtIG1pblZhbHVlXG4gKiBAcGFyYW0gc3RlcFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMgLSByb3VuZGVkIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRWYWxUb1N0ZXAobWluVmFsdWU6IG51bWJlciwgc3RlcDogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghaXNOdW1iZXIoc3RlcCkgfHwgIWlzTnVtYmVyKG1pblZhbHVlKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBjb25zdCBkZWNpbWFsID0gZ2V0Um91bmRpbmdEZWNpbWFsRnJvbVN0ZXAoc3RlcCk7XG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5mbG9vcigodmFsIC0gbWluVmFsdWUpIC8gc3RlcCk7XG4gIGxldCByZW1haW4gPSB2YWwgLSAoc3RlcHMgKiBzdGVwICsgbWluVmFsdWUpO1xuXG4gIC8vIGhhcyB0byByb3VuZCBiZWNhdXNlIGphdmFzY3JpcHQgdHVybnMgMC4xIGludG8gMC45OTk5OTk5OTk5OTk5OTg3XG4gIHJlbWFpbiA9IE51bWJlcihwcmVjaXNlUm91bmQocmVtYWluLCA4KSk7XG5cbiAgbGV0IGNsb3Nlc3Q6IG51bWJlcjtcbiAgaWYgKHJlbWFpbiA9PT0gMCkge1xuICAgIGNsb3Nlc3QgPSB2YWw7XG4gIH0gZWxzZSBpZiAocmVtYWluIDwgc3RlcCAvIDIpIHtcbiAgICBjbG9zZXN0ID0gc3RlcHMgKiBzdGVwICsgbWluVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2xvc2VzdCA9IChzdGVwcyArIDEpICogc3RlcCArIG1pblZhbHVlO1xuICB9XG5cbiAgLy8gcHJlY2lzZSByb3VuZCByZXR1cm4gYSBzdHJpbmcgcm91bmRlZCB0byB0aGUgZGVmaW5lZCBkZWNpbWFsXG4gIGNvbnN0IHJvdW5kZWQgPSBwcmVjaXNlUm91bmQoY2xvc2VzdCwgZGVjaW1hbCk7XG5cbiAgcmV0dXJuIE51bWJlcihyb3VuZGVkKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvcm1hdCBiYXNlZCBvbiBmaWVsZCBhbmQgZm9ybWF0IG9wdGlvbnNcbiAqIFVzZWQgaW4gcmVuZGVyIHRvb2x0aXAgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGb3JtYXR0ZXI6IEZpZWxkRm9ybWF0dGVyID0gdiA9PiAobm90TnVsbG9yVW5kZWZpbmVkKHYpID8gU3RyaW5nKHYpIDogJycpO1xuXG5leHBvcnQgY29uc3QgRklFTERfRElTUExBWV9GT1JNQVQ6IHtcbiAgW2tleTogc3RyaW5nXTogRmllbGRGb3JtYXR0ZXI7XG59ID0ge1xuICBbQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ106IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9qc29uXTogZCA9PlxuICAgIHR5cGVvZiBkID09PSAnc3RyaW5nJ1xuICAgICAgPyBkXG4gICAgICA6IGlzUGxhaW5PYmplY3QoZClcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShkKVxuICAgICAgPyBgWyR7U3RyaW5nKGQpfV1gXG4gICAgICA6ICcnXG59O1xuXG4vKipcbiAqIFBhcnNlIGZpZWxkIHZhbHVlIGFuZCB0eXBlIGFuZCByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlRmllbGRWYWx1ZSA9ICh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gRklFTERfRElTUExBWV9GT1JNQVRbdHlwZV0gPyBGSUVMRF9ESVNQTEFZX0ZPUk1BVFt0eXBlXSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICogQHBhcmFtIGZyb21cbiAqIEBwYXJhbSB0b1xuICovXG5leHBvcnQgY29uc3QgYXJyYXlNb3ZlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gIGFycmF5TW92ZU11dGF0ZShhcnJheSwgZnJvbSwgdG8pO1xuICByZXR1cm4gYXJyYXk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9ybWF0IGJhc2VkIG9uIGZpZWxkIGFuZCBmb3JtYXQgb3B0aW9uc1xuICogVXNlZCBpbiByZW5kZXIgdG9vbHRpcCB2YWx1ZVxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoXG4gIGZvcm1hdDogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZmllbGQ/OiBGaWVsZFxuKTogRmllbGRGb3JtYXR0ZXIge1xuICBpZiAoIWZvcm1hdCkge1xuICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG4gIGNvbnN0IHRvb2x0aXBGb3JtYXQgPSBPYmplY3QudmFsdWVzKFRPT0xUSVBfRk9STUFUUykuZmluZChmID0+IGZbVE9PTFRJUF9LRVldID09PSBmb3JtYXQpO1xuXG4gIGlmICh0b29sdGlwRm9ybWF0KSB7XG4gICAgcmV0dXJuIGFwcGx5RGVmYXVsdEZvcm1hdCh0b29sdGlwRm9ybWF0IGFzIFRvb2x0aXBGb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmIGZpZWxkKSB7XG4gICAgcmV0dXJuIGFwcGx5Q3VzdG9tRm9ybWF0KGZvcm1hdCwgZmllbGQpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRGb3JtYXQodG9vbHRpcEZvcm1hdDogVG9vbHRpcEZvcm1hdCk6ICh2OiBhbnkpID0+IHN0cmluZyB7XG4gIGlmICghdG9vbHRpcEZvcm1hdCB8fCAhdG9vbHRpcEZvcm1hdC5mb3JtYXQpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbiAgfVxuXG4gIHN3aXRjaCAodG9vbHRpcEZvcm1hdC50eXBlKSB7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5ERUNJTUFMOlxuICAgICAgcmV0dXJuIGQzRm9ybWF0KHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEU6XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5EQVRFX1RJTUU6XG4gICAgICByZXR1cm4gZGF0ZXRpbWVGb3JtYXR0ZXIobnVsbCkodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuUEVSQ0VOVEFHRTpcbiAgICAgIHJldHVybiB2ID0+IGAke2QzRm9ybWF0KFRPT0xUSVBfRk9STUFUUy5ERUNJTUFMX0RFQ0lNQUxfRklYRURfMi5mb3JtYXQpKHYpfSVgO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuQk9PTEVBTjpcbiAgICAgIHJldHVybiBnZXRCb29sZWFuRm9ybWF0dGVyKHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5Gb3JtYXR0ZXIoZm9ybWF0OiBzdHJpbmcpOiBGaWVsZEZvcm1hdHRlciB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnMDEnOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICcxJyA6ICcwJyk7XG4gICAgY2FzZSAneW4nOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICd5ZXMnIDogJ25vJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG59XG4vLyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgY3VzdG9tIHRvb2x0aXAgZm9ybWF0IHZpYSBjb25maWdcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUN1c3RvbUZvcm1hdChmb3JtYXQsIGZpZWxkKTogRmllbGRGb3JtYXR0ZXIge1xuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI6XG4gICAgICByZXR1cm4gZDNGb3JtYXQoZm9ybWF0KTtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5kYXRlOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBkYXRldGltZUZvcm1hdHRlcihudWxsKShmb3JtYXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdiA9PiB2O1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGVwb2NoIG1pbGxpc2Vjb25kcyB3aXRoIGEgZm9ybWF0IHN0cmluZ1xuICogQHR5cGUgdGltZXpvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lRm9ybWF0dGVyKFxuICB0aW1lem9uZT86IHN0cmluZyB8IG51bGxcbik6IChmb3JtYXQ/OiBzdHJpbmcpID0+ICh0czogbnVtYmVyKSA9PiBzdHJpbmcge1xuICByZXR1cm4gdGltZXpvbmVcbiAgICA/IGZvcm1hdCA9PiB0cyA9PlxuICAgICAgICBtb21lbnRcbiAgICAgICAgICAudXRjKHRzKVxuICAgICAgICAgIC50eih0aW1lem9uZSlcbiAgICAgICAgICAuZm9ybWF0KGZvcm1hdClcbiAgICA6IGZvcm1hdCA9PiB0cyA9PiBtb21lbnQudXRjKHRzKS5mb3JtYXQoZm9ybWF0KTtcbn1cbiJdfQ==
|
520
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXV0aWxzLnRzIl0sIm5hbWVzIjpbInVuaXF1ZSIsInZhbHVlcyIsInJlc3VsdHMiLCJ1bmlxdWVTZXQiLCJTZXQiLCJmb3JFYWNoIiwidiIsIm5vdE51bGxvclVuZGVmaW5lZCIsInB1c2giLCJnZXRMYXRMbmdCb3VuZHMiLCJwb2ludHMiLCJpZHgiLCJsaW1pdCIsImxhdHMiLCJtYXAiLCJkIiwiTnVtYmVyIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNGaW5pdGUiLCJzb3J0IiwibnVtYmVyU29ydCIsImxlbmd0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjbGFtcCIsInZhbCIsImdldFNhbXBsZURhdGEiLCJkYXRhIiwic2FtcGxlU2l6ZSIsImdldFZhbHVlIiwic2FtcGxlU3RlcCIsImZsb29yIiwib3V0cHV0IiwiaSIsInRpbWVUb1VuaXhNaWxsaSIsInZhbHVlIiwiZm9ybWF0IiwibW9tZW50IiwidXRjIiwidmFsdWVPZiIsIkRhdGUiLCJ1bmRlZmluZWQiLCJpc051bWJlciIsImhhc093blByb3BlcnR5Iiwib2JqIiwicHJvcCIsImEiLCJiIiwiZ2V0U29ydGluZ0Z1bmN0aW9uIiwiZmllbGRUeXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsImludGVnZXIiLCJ0aW1lc3RhbXAiLCJwcmVjaXNlUm91bmQiLCJudW0iLCJkZWNpbWFscyIsInQiLCJwb3ciLCJyb3VuZCIsInNpZ24iLCJ0b0ZpeGVkIiwicm91bmRUb0ZvdXIiLCJnZXRSb3VuZGluZ0RlY2ltYWxGcm9tU3RlcCIsInN0ZXAiLCJpc05hTiIsInN0ZXBTdHIiLCJ0b1N0cmluZyIsInNwbGl0RXhwb25lbnRpYWwiLCJzcGxpdCIsImNvZWZmWmVybyIsImNvZWZmRGVjaW1hbCIsInBhcnNlSW50Iiwic3BsaXRaZXJvIiwibm9ybWFsaXplU2xpZGVyVmFsdWUiLCJtaW5WYWx1ZSIsIm1hcmtzIiwicm91bmRWYWxUb1N0ZXAiLCJkZWNpbWFsIiwic3RlcHMiLCJyZW1haW4iLCJjbG9zZXN0Iiwicm91bmRlZCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJTdHJpbmciLCJmbG9hdEZvcm1hdHRlciIsIkZJRUxEX0RJU1BMQVlfRk9STUFUIiwic3RyaW5nIiwiZGF0ZSIsImdlb2pzb24iLCJKU09OIiwic3RyaW5naWZ5Iiwib2JqZWN0IiwiYXJyYXkiLCJwYXJzZUZpZWxkVmFsdWUiLCJ0eXBlIiwiYXJyYXlNb3ZlTXV0YXRlIiwiZnJvbSIsInRvIiwic3BsaWNlIiwiYXJyYXlNb3ZlIiwic2xpY2UiLCJnZXRGb3JtYXR0ZXIiLCJmaWVsZCIsInRvb2x0aXBGb3JtYXQiLCJPYmplY3QiLCJUT09MVElQX0ZPUk1BVFMiLCJmaW5kIiwiZiIsIlRPT0xUSVBfS0VZIiwiYXBwbHlEZWZhdWx0Rm9ybWF0IiwiYXBwbHlDdXN0b21Gb3JtYXQiLCJnZXRDb2x1bW5Gb3JtYXR0ZXIiLCJjb2xNZXRhIiwiZGlzcGxheUZvcm1hdCIsImFwcGx5VmFsdWVNYXAiLCJUT09MVElQX0ZPUk1BVF9UWVBFUyIsIkRFQ0lNQUwiLCJEQVRFIiwiREFURV9USU1FIiwiZGF0ZXRpbWVGb3JtYXR0ZXIiLCJQRVJDRU5UQUdFIiwiREVDSU1BTF9ERUNJTUFMX0ZJWEVEXzIiLCJCT09MRUFOIiwiZ2V0Qm9vbGVhbkZvcm1hdHRlciIsImZvcm1hdExhcmdlTnVtYmVyIiwibiIsImZvcm1hdE51bWJlciIsInRpbWV6b25lIiwidHMiLCJ0eiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBU0E7O0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQW1CQyxNQUFuQixFQUFnQztBQUNyQyxNQUFNQyxPQUFZLEdBQUcsRUFBckI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxNQUFSLENBQWxCO0FBQ0FFLEVBQUFBLFNBQVMsQ0FBQ0UsT0FB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QUZOLEVBR0c1RixNQUhILENBR1VBLE1BSFYsQ0FEVTtBQUFBLEtBQU47QUFBQSxHQURLLEdBTVg7QUFDQSxZQUFBQSxNQUFNO0FBQUEsV0FBSSxVQUFBNkYsRUFBRTtBQUFBLGFBQUtBLEVBQUUsR0FBRzVGLDJCQUFPQyxHQUFQLENBQVcyRixFQUFYLEVBQWU3RixNQUFmLENBQXNCQSxNQUF0QixDQUFILEdBQW1DLEVBQTFDO0FBQUEsS0FBTjtBQUFBLEdBUFY7QUFRRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7Zm9ybWF0IGFzIGQzRm9ybWF0fSBmcm9tICdkMy1mb3JtYXQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVMsXG4gIFRPT0xUSVBfS0VZLFxuICBUb29sdGlwRm9ybWF0XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TWlsbGlzZWNvbmQsIEZpZWxkLCBDb2xNZXRhUHJvcHN9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge3NuYXBUb01hcmtzfSBmcm9tICcuL3Bsb3QnO1xuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXR0ZXIgPSAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIHNpbXBsZSBnZXR0aW5nIHVuaXF1ZSB2YWx1ZXMgb2YgYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4odmFsdWVzOiBUW10pIHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGNvbnN0IHVuaXF1ZVNldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgdW5pcXVlU2V0LmZvckVhY2godiA9PiB7XG4gICAgaWYgKG5vdE51bGxvclVuZGVmaW5lZCh2KSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0TG5nQm91bmRzKFxuICBwb2ludHM6IG51bWJlcltdW10sXG4gIGlkeDogbnVtYmVyLFxuICBsaW1pdDogW251bWJlciwgbnVtYmVyXVxuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICBjb25zdCBsYXRzID0gcG9pbnRzXG4gICAgLm1hcChkID0+IE51bWJlcihBcnJheS5pc0FycmF5KGQpKSAmJiBkW2lkeF0pXG4gICAgLmZpbHRlcihOdW1iZXIuaXNGaW5pdGUpXG4gICAgLnNvcnQobnVtYmVyU29ydCk7XG5cbiAgaWYgKCFsYXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2xhbXAgdG8gbGltaXRcbiAgcmV0dXJuIFtNYXRoLm1heChsYXRzWzBdLCBsaW1pdFswXSksIE1hdGgubWluKGxhdHNbbGF0cy5sZW5ndGggLSAxXSwgbGltaXRbMV0pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKFttaW4sIG1heF06IFtudW1iZXIsIG51bWJlcl0sIHZhbDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiB2YWwgPD0gbWluID8gbWluIDogdmFsID49IG1heCA/IG1heCA6IHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbXBsZURhdGEoZGF0YSwgc2FtcGxlU2l6ZSA9IDUwMCwgZ2V0VmFsdWUgPSBkID0+IGQpIHtcbiAgY29uc3Qgc2FtcGxlU3RlcCA9IE1hdGgubWF4KE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyBzYW1wbGVTaXplKSwgMSk7XG4gIGNvbnN0IG91dHB1dDogYW55W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBzYW1wbGVTdGVwKSB7XG4gICAgb3V0cHV0LnB1c2goZ2V0VmFsdWUoZGF0YVtpXSkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRpZmZlcmVudCB0aW1lIGZvcm1hdCB0byB1bml4IG1pbGxpc2Vjb25kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRvVW5peE1pbGxpKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IE1pbGxpc2Vjb25kIHwgbnVsbCB7XG4gIGlmIChub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtb21lbnQudXRjKHZhbHVlLCBmb3JtYXQpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPT09ICd4JyA/IHZhbHVlICogMTAwMCA6IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIG51bGwgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3ROdWxsb3JVbmRlZmluZWQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPGFueT4+KGQ6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgIT09IHVuZGVmaW5lZCAmJiBkICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZCBpcyBhIG51bWJlciwgdGhpcyBmaWx0ZXJlZCBvdXQgTmFOIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKGQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGQpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgb2JqZWN0IGhhcyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIHt9LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFgsXG4gIHByb3A6IFlcbik6IG9iaiBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclNvcnQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGRUeXBlOiBzdHJpbmcpOiB0eXBlb2YgbnVtYmVyU29ydCB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBudW1iZXJTb3J0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogcm91bmQgbnVtYmVyIHdpdGggZXhhY3QgbnVtYmVyIG9mIGRlY2ltYWxzXG4gKiByZXR1cm4gYXMgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2VSb3VuZChudW06IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICByZXR1cm4gKFxuICAgIE1hdGgucm91bmQoXG4gICAgICBudW0gKiB0ICsgKGRlY2ltYWxzID4gMCA/IDEgOiAwKSAqIChNYXRoLnNpZ24obnVtKSAqICgxMCAvIE1hdGgucG93KDEwMCwgZGVjaW1hbHMpKSlcbiAgICApIC8gdFxuICApLnRvRml4ZWQoZGVjaW1hbHMpO1xufVxuXG4vKipcbiAqIHJvdW5kIGEgZ2l2aW5nIG51bWJlciBhdCBtb3N0IDQgZGVjaW1hbCBwbGFjZXNcbiAqIGUuZy4gMTAgLT4gMTAsIDEuMTIzNDUgLT4gMS4yMzQ1LCAyLjAgLT4gMlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRUb0ZvdXIobnVtOiBudW1iZXIpOiBudW1iZXIge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIHJldHVybiBOdW1iZXIoYCR7TWF0aC5yb3VuZChgJHtudW19ZSs0YCl9ZS00YCk7XG59XG4vKipcbiAqIGdldCBudW1iZXIgb2YgZGVjaW1hbHMgdG8gcm91bmQgdG8gZm9yIHNsaWRlciBmcm9tIHN0ZXBcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcmV0dXJucy0gbnVtYmVyIG9mIGRlY2ltYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpc05hTihzdGVwKSkge1xuICAgIGFzc2VydCgnc3RlcCBpcyBub3QgYSBudW1iZXInKTtcbiAgICBhc3NlcnQoc3RlcCk7XG4gIH1cblxuICBjb25zdCBzdGVwU3RyID0gc3RlcC50b1N0cmluZygpO1xuXG4gIC8vIGluIGNhc2UgdGhlIHN0ZXAgaXMgYSB2ZXJ5IHNtYWxsIG51bWJlciBlLmcuIDFlLTcsIHJldHVybiBkZWNpbWFsIGUuZy4gNyBkaXJlY3RseVxuICBjb25zdCBzcGxpdEV4cG9uZW50aWFsID0gc3RlcFN0ci5zcGxpdCgnZS0nKTtcbiAgaWYgKHNwbGl0RXhwb25lbnRpYWwubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgY29lZmZaZXJvID0gc3BsaXRFeHBvbmVudGlhbFswXS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGNvZWZmRGVjaW1hbCA9IGNvZWZmWmVyby5sZW5ndGggPT09IDEgPyAwIDogY29lZmZaZXJvWzFdLmxlbmd0aDtcbiAgICByZXR1cm4gcGFyc2VJbnQoc3BsaXRFeHBvbmVudGlhbFsxXSwgMTApICsgY29lZmZEZWNpbWFsO1xuICB9XG5cbiAgY29uc3Qgc3BsaXRaZXJvID0gc3RlcFN0ci5zcGxpdCgnLicpO1xuICBpZiAoc3BsaXRaZXJvLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzcGxpdFplcm9bMV0ubGVuZ3RoO1xufVxuXG4vKipcbiAqIElmIG1hcmtzIGlzIHByb3ZpZGVkLCBzbmFwIHRvIG1hcmtzLCBpZiBub3Qgbm9ybWFsaXplIHRvIHN0ZXBcbiAqIEBwYXJhbSB2YWxcbiAqIEBwYXJhbSBtaW5WYWx1ZVxuICogQHBhcmFtIHN0ZXBcbiAqIEBwYXJhbSBtYXJrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2xpZGVyVmFsdWUoXG4gIHZhbDogbnVtYmVyLFxuICBtaW5WYWx1ZTogbnVtYmVyLFxuICBzdGVwOiBudW1iZXIsXG4gIG1hcmtzPzogbnVtYmVyW11cbik6IG51bWJlciB7XG4gIGlmIChtYXJrcyAmJiBtYXJrcy5sZW5ndGgpIHtcbiAgICAvLyBVc2UgaW4gc2xpZGVyLCBnaXZlbiBhIG51bWJlciBhbmQgYW4gYXJyYXkgb2YgbnVtYmVycywgcmV0dXJuIHRoZSBuZWFycyBudW1iZXIgZnJvbSB0aGUgYXJyYXlcbiAgICByZXR1cm4gc25hcFRvTWFya3ModmFsLCBtYXJrcyk7XG4gIH1cblxuICByZXR1cm4gcm91bmRWYWxUb1N0ZXAobWluVmFsdWUsIHN0ZXAsIHZhbCk7XG59XG5cbi8qKlxuICogcm91bmQgdGhlIHZhbHVlIHRvIHN0ZXAgZm9yIHRoZSBzbGlkZXJcbiAqIEBwYXJhbSBtaW5WYWx1ZVxuICogQHBhcmFtIHN0ZXBcbiAqIEBwYXJhbSB2YWxcbiAqIEByZXR1cm5zIC0gcm91bmRlZCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kVmFsVG9TdGVwKG1pblZhbHVlOiBudW1iZXIsIHN0ZXA6IG51bWJlciwgdmFsOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIWlzTnVtYmVyKHN0ZXApIHx8ICFpc051bWJlcihtaW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgY29uc3QgZGVjaW1hbCA9IGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXApO1xuICBjb25zdCBzdGVwcyA9IE1hdGguZmxvb3IoKHZhbCAtIG1pblZhbHVlKSAvIHN0ZXApO1xuICBsZXQgcmVtYWluID0gdmFsIC0gKHN0ZXBzICogc3RlcCArIG1pblZhbHVlKTtcblxuICAvLyBoYXMgdG8gcm91bmQgYmVjYXVzZSBqYXZhc2NyaXB0IHR1cm5zIDAuMSBpbnRvIDAuOTk5OTk5OTk5OTk5OTk4N1xuICByZW1haW4gPSBOdW1iZXIocHJlY2lzZVJvdW5kKHJlbWFpbiwgOCkpO1xuXG4gIGxldCBjbG9zZXN0OiBudW1iZXI7XG4gIGlmIChyZW1haW4gPT09IDApIHtcbiAgICBjbG9zZXN0ID0gdmFsO1xuICB9IGVsc2UgaWYgKHJlbWFpbiA8IHN0ZXAgLyAyKSB7XG4gICAgY2xvc2VzdCA9IHN0ZXBzICogc3RlcCArIG1pblZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNsb3Nlc3QgPSAoc3RlcHMgKyAxKSAqIHN0ZXAgKyBtaW5WYWx1ZTtcbiAgfVxuXG4gIC8vIHByZWNpc2Ugcm91bmQgcmV0dXJuIGEgc3RyaW5nIHJvdW5kZWQgdG8gdGhlIGRlZmluZWQgZGVjaW1hbFxuICBjb25zdCByb3VuZGVkID0gcHJlY2lzZVJvdW5kKGNsb3Nlc3QsIGRlY2ltYWwpO1xuXG4gIHJldHVybiBOdW1iZXIocm91bmRlZCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3JtYXQgYmFzZWQgb24gZmllbGQgYW5kIGZvcm1hdCBvcHRpb25zXG4gKiBVc2VkIGluIHJlbmRlciB0b29sdGlwIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0Rm9ybWF0dGVyOiBGaWVsZEZvcm1hdHRlciA9IHYgPT4gKG5vdE51bGxvclVuZGVmaW5lZCh2KSA/IFN0cmluZyh2KSA6ICcnKTtcblxuZXhwb3J0IGNvbnN0IGZsb2F0Rm9ybWF0dGVyID0gdiA9PiAoaXNOdW1iZXIodikgPyBTdHJpbmcocm91bmRUb0ZvdXIodikpIDogJycpO1xuXG5leHBvcnQgY29uc3QgRklFTERfRElTUExBWV9GT1JNQVQ6IHtcbiAgW2tleTogc3RyaW5nXTogRmllbGRGb3JtYXR0ZXI7XG59ID0ge1xuICBbQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ106IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9qc29uXTogZCA9PlxuICAgIHR5cGVvZiBkID09PSAnc3RyaW5nJ1xuICAgICAgPyBkXG4gICAgICA6IGlzUGxhaW5PYmplY3QoZClcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShkKVxuICAgICAgPyBgWyR7U3RyaW5nKGQpfV1gXG4gICAgICA6ICcnLFxuICBbQUxMX0ZJRUxEX1RZUEVTLm9iamVjdF06IEpTT04uc3RyaW5naWZ5LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmFycmF5XTogSlNPTi5zdHJpbmdpZnlcbn07XG5cbi8qKlxuICogUGFyc2UgZmllbGQgdmFsdWUgYW5kIHR5cGUgYW5kIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICovXG5leHBvcnQgY29uc3QgcGFyc2VGaWVsZFZhbHVlID0gKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gRklFTERfRElTUExBWV9GT1JNQVRbdHlwZV0gPyBGSUVMRF9ESVNQTEFZX0ZPUk1BVFt0eXBlXSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICogQHBhcmFtIGZyb21cbiAqIEBwYXJhbSB0b1xuICovXG5leHBvcnQgY29uc3QgYXJyYXlNb3ZlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFRbXSA9PiB7XG4gIGFycmF5ID0gYXJyYXkuc2xpY2UoKTtcbiAgYXJyYXlNb3ZlTXV0YXRlKGFycmF5LCBmcm9tLCB0byk7XG4gIHJldHVybiBhcnJheTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3JtYXQgYmFzZWQgb24gZmllbGQgYW5kIGZvcm1hdCBvcHRpb25zXG4gKiBVc2VkIGluIHJlbmRlciB0b29sdGlwIHZhbHVlXG4gKiBAcGFyYW0gZm9ybWF0XG4gKiBAcGFyYW0gZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlcihcbiAgZm9ybWF0OiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBmaWVsZD86IEZpZWxkXG4pOiBGaWVsZEZvcm1hdHRlciB7XG4gIGlmICghZm9ybWF0KSB7XG4gICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbiAgY29uc3QgdG9vbHRpcEZvcm1hdCA9IE9iamVjdC52YWx1ZXMoVE9PTFRJUF9GT1JNQVRTKS5maW5kKGYgPT4gZltUT09MVElQX0tFWV0gPT09IGZvcm1hdCk7XG5cbiAgaWYgKHRvb2x0aXBGb3JtYXQpIHtcbiAgICByZXR1cm4gYXBwbHlEZWZhdWx0Rm9ybWF0KHRvb2x0aXBGb3JtYXQgYXMgVG9vbHRpcEZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiYgZmllbGQpIHtcbiAgICByZXR1cm4gYXBwbHlDdXN0b21Gb3JtYXQoZm9ybWF0LCBmaWVsZCk7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbkZvcm1hdHRlcihjb2xNZXRhOiBDb2xNZXRhUHJvcHMpOiBGaWVsZEZvcm1hdHRlciB7XG4gIGNvbnN0IHtmb3JtYXQsIGRpc3BsYXlGb3JtYXR9ID0gY29sTWV0YTtcblxuICBpZiAoIWZvcm1hdCAmJiAhZGlzcGxheUZvcm1hdCkge1xuICAgIHJldHVybiBGSUVMRF9ESVNQTEFZX0ZPUk1BVFtjb2xNZXRhLnR5cGVdO1xuICB9XG4gIGNvbnN0IHRvb2x0aXBGb3JtYXQgPSBPYmplY3QudmFsdWVzKFRPT0xUSVBfRk9STUFUUykuZmluZChmID0+IGZbVE9PTFRJUF9LRVldID09PSBkaXNwbGF5Rm9ybWF0KTtcblxuICBpZiAodG9vbHRpcEZvcm1hdCkge1xuICAgIHJldHVybiBhcHBseURlZmF1bHRGb3JtYXQodG9vbHRpcEZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRpc3BsYXlGb3JtYXQgPT09ICdzdHJpbmcnICYmIGNvbE1ldGEpIHtcbiAgICByZXR1cm4gYXBwbHlDdXN0b21Gb3JtYXQoZGlzcGxheUZvcm1hdCwgY29sTWV0YSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRpc3BsYXlGb3JtYXQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGFwcGx5VmFsdWVNYXAoZGlzcGxheUZvcm1hdCk7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VmFsdWVNYXAoZm9ybWF0KSB7XG4gIHJldHVybiB2ID0+IGZvcm1hdFt2XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdEZvcm1hdCh0b29sdGlwRm9ybWF0OiBUb29sdGlwRm9ybWF0KTogKHY6IGFueSkgPT4gc3RyaW5nIHtcbiAgaWYgKCF0b29sdGlwRm9ybWF0IHx8ICF0b29sdGlwRm9ybWF0LmZvcm1hdCkge1xuICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG5cbiAgc3dpdGNoICh0b29sdGlwRm9ybWF0LnR5cGUpIHtcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRFQ0lNQUw6XG4gICAgICByZXR1cm4gZDNGb3JtYXQodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuREFURTpcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEVfVElNRTpcbiAgICAgIHJldHVybiBkYXRldGltZUZvcm1hdHRlcihudWxsKSh0b29sdGlwRm9ybWF0LmZvcm1hdCk7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5QRVJDRU5UQUdFOlxuICAgICAgcmV0dXJuIHYgPT4gYCR7ZDNGb3JtYXQoVE9PTFRJUF9GT1JNQVRTLkRFQ0lNQUxfREVDSU1BTF9GSVhFRF8yLmZvcm1hdCkodil9JWA7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5CT09MRUFOOlxuICAgICAgcmV0dXJuIGdldEJvb2xlYW5Gb3JtYXR0ZXIodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vbGVhbkZvcm1hdHRlcihmb3JtYXQ6IHN0cmluZyk6IEZpZWxkRm9ybWF0dGVyIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlICcwMSc6XG4gICAgICByZXR1cm4gKHY6IEJvb2xlYW4pID0+ICh2ID8gJzEnIDogJzAnKTtcbiAgICBjYXNlICd5bic6XG4gICAgICByZXR1cm4gKHY6IEJvb2xlYW4pID0+ICh2ID8gJ3llcycgOiAnbm8nKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbn1cbi8vIEFsbG93IHVzZXIgdG8gc3BlY2lmeSBjdXN0b20gdG9vbHRpcCBmb3JtYXQgdmlhIGNvbmZpZ1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Q3VzdG9tRm9ybWF0KGZvcm1hdCwgZmllbGQpOiBGaWVsZEZvcm1hdHRlciB7XG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICAgIHJldHVybiBkM0Zvcm1hdChmb3JtYXQpO1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmRhdGU6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wOlxuICAgICAgcmV0dXJuIGRhdGV0aW1lRm9ybWF0dGVyKG51bGwpKGZvcm1hdCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2ID0+IHY7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0TGFyZ2VOdW1iZXIobikge1xuICAvLyBTSS1wcmVmaXggd2l0aCA0IHNpZ25pZmljYW50IGRpZ2l0c1xuICByZXR1cm4gZDNGb3JtYXQoJy40fnMnKShuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcihuOiBudW1iZXIsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgIHJldHVybiBgLSR7Zm9ybWF0TnVtYmVyKC1uLCAnaW50ZWdlcicpfWA7XG4gICAgICB9XG4gICAgICBpZiAobiA8IDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChuIDwgMTAgKiAxMDAwKSB7XG4gICAgICAgIHJldHVybiBkM0Zvcm1hdCgnLCcpKE1hdGgucm91bmQobikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG4pO1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgICBpZiAobiA8IDApIHtcbiAgICAgICAgcmV0dXJuIGAtJHtmb3JtYXROdW1iZXIoLW4sICdudW1iZXInKX1gO1xuICAgICAgfVxuICAgICAgaWYgKG4gPCAxMDAwKSB7XG4gICAgICAgIHJldHVybiBkM0Zvcm1hdCgnLjR+cicpKG4pO1xuICAgICAgfVxuICAgICAgaWYgKG4gPCAxMCAqIDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGQzRm9ybWF0KCcsLjJ+ZicpKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG4pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXROdW1iZXIobiwgJ3JlYWwnKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdCBlcG9jaCBtaWxsaXNlY29uZHMgd2l0aCBhIGZvcm1hdCBzdHJpbmdcbiAqIEB0eXBlIHRpbWV6b25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRldGltZUZvcm1hdHRlcihcbiAgdGltZXpvbmU/OiBzdHJpbmcgfCBudWxsXG4pOiAoZm9ybWF0Pzogc3RyaW5nKSA9PiAodHM6IG51bWJlcikgPT4gc3RyaW5nIHtcbiAgcmV0dXJuIHRpbWV6b25lXG4gICAgPyBmb3JtYXQgPT4gdHMgPT5cbiAgICAgICAgbW9tZW50XG4gICAgICAgICAgLnV0Yyh0cylcbiAgICAgICAgICAudHoodGltZXpvbmUpXG4gICAgICAgICAgLmZvcm1hdChmb3JtYXQpXG4gICAgOiAvLyByZXR1cm4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgJ0ludmFsaWQgZGF0ZScgaWYgdHMgaXMgdW5kZWZpbmVkL251bGxcbiAgICAgIGZvcm1hdCA9PiB0cyA9PiAodHMgPyBtb21lbnQudXRjKHRzKS5mb3JtYXQoZm9ybWF0KSA6ICcnKTtcbn1cbiJdfQ==
|
package/dist/dataset-utils.d.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
import { ProcessorResult, RGBColor, RowData, Field, FieldPair } from '@kepler.gl/types';
|
1
|
+
import { ProcessorResult, RGBColor, RowData, Field, FieldPair, TooltipFields } from '@kepler.gl/types';
|
2
|
+
import { TooltipFormat } from '@kepler.gl/constants';
|
2
3
|
export declare const datasetColorMaker: Generator<RGBColor, any, unknown>;
|
3
4
|
/**
|
4
5
|
* Choose a field to use as the default color field of a layer.
|
@@ -43,6 +44,14 @@ export declare function getSampleForTypeAnalyze({ fields, rows, sampleCount }: {
|
|
43
44
|
rows: unknown[][];
|
44
45
|
sampleCount?: number;
|
45
46
|
}): RowData;
|
47
|
+
/**
|
48
|
+
* Check if string is a valid Well-known binary (WKB) in HEX format
|
49
|
+
* https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
|
50
|
+
*
|
51
|
+
* @param str input string
|
52
|
+
* @returns true if string is a valid WKB in HEX format
|
53
|
+
*/
|
54
|
+
export declare function isHexWkb(str: string | null): boolean;
|
46
55
|
/**
|
47
56
|
* Analyze field types from data in `string` format, e.g. uploaded csv.
|
48
57
|
* Assign `type`, `fieldIdx` and `format` (timestamp only) to each field
|
@@ -103,3 +112,5 @@ export declare function renameDuplicateFields(fieldOrder: string[]): {
|
|
103
112
|
* @returns corresponding type in `ALL_FIELD_TYPES`
|
104
113
|
*/
|
105
114
|
export declare function analyzerTypeToFieldType(aType: string): string;
|
115
|
+
export declare function getFieldFormatLabels(fieldType?: string): TooltipFormat[];
|
116
|
+
export declare function getFormatLabels(fields: TooltipFields[], fieldName: string): TooltipFormat[];
|