@kepler.gl/utils 3.1.0-alpha.1 → 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.
- package/dist/aggregation.d.ts +13 -0
- package/dist/aggregation.js +84 -0
- package/dist/application-config.d.ts +25 -0
- package/dist/application-config.js +52 -0
- package/dist/arrow-data-container.d.ts +62 -0
- package/dist/arrow-data-container.js +331 -0
- package/dist/color-utils.d.ts +108 -0
- package/dist/color-utils.js +443 -0
- package/dist/data-container-interface.d.ts +138 -0
- package/dist/data-container-interface.js +6 -0
- package/dist/data-container-utils.d.ts +30 -0
- package/dist/data-container-utils.js +74 -0
- package/dist/data-row.d.ts +59 -0
- package/dist/data-row.js +110 -0
- package/dist/data-scale-utils.d.ts +120 -0
- package/dist/data-scale-utils.js +340 -0
- package/dist/data-utils.d.ts +98 -0
- package/dist/data-utils.js +436 -0
- package/dist/dataset-utils.d.ts +45 -0
- package/dist/dataset-utils.js +313 -0
- package/dist/dom-to-image.d.ts +73 -0
- package/dist/dom-to-image.js +421 -0
- package/dist/dom-utils.d.ts +23 -0
- package/dist/dom-utils.js +349 -0
- package/dist/effect-utils.d.ts +24 -0
- package/dist/effect-utils.js +166 -0
- package/dist/export-map-html.d.ts +9 -0
- package/dist/export-map-html.js +25 -0
- package/dist/export-utils.d.ts +40 -0
- package/dist/export-utils.js +201 -0
- package/dist/filter-utils.d.ts +331 -0
- package/dist/filter-utils.js +1214 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.js +38 -0
- package/dist/gl-utils.d.ts +1 -0
- package/dist/gl-utils.js +27 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +941 -0
- package/dist/indexed-data-container.d.ts +34 -0
- package/dist/indexed-data-container.js +214 -0
- package/dist/locale-utils.d.ts +2 -0
- package/dist/locale-utils.js +39 -0
- package/dist/map-info-utils.d.ts +1 -0
- package/dist/map-info-utils.js +14 -0
- package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +57 -0
- package/dist/map-style-utils/mapbox-gl-style-editor.js +188 -0
- package/dist/map-style-utils/mapbox-utils.d.ts +14 -0
- package/dist/map-style-utils/mapbox-utils.js +51 -0
- package/dist/map-utils.d.ts +9 -0
- package/dist/map-utils.js +48 -0
- package/dist/mapbox-utils.d.ts +7 -0
- package/dist/mapbox-utils.js +19 -0
- package/dist/noop.d.ts +1 -0
- package/dist/noop.js +13 -0
- package/dist/notifications-utils.d.ts +42 -0
- package/dist/notifications-utils.js +69 -0
- package/dist/observe-dimensions.d.ts +15 -0
- package/dist/observe-dimensions.js +130 -0
- package/dist/plot.d.ts +131 -0
- package/dist/plot.js +615 -0
- package/dist/position-utils.d.ts +6 -0
- package/dist/position-utils.js +26 -0
- package/dist/projection-utils.d.ts +22 -0
- package/dist/projection-utils.js +83 -0
- package/dist/quick-insertion-sort.d.ts +12 -0
- package/dist/quick-insertion-sort.js +132 -0
- package/dist/row-data-container.d.ts +31 -0
- package/dist/row-data-container.js +206 -0
- package/dist/searcher-utils.d.ts +1 -0
- package/dist/searcher-utils.js +25 -0
- package/dist/split-map-utils.d.ts +32 -0
- package/dist/split-map-utils.js +99 -0
- package/dist/strings.d.ts +4 -0
- package/dist/strings.js +16 -0
- package/dist/time.d.ts +54 -0
- package/dist/time.js +325 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.js +6 -0
- package/dist/utils.d.ts +104 -0
- package/dist/utils.js +241 -0
- package/package.json +6 -5
@@ -0,0 +1,340 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
5
|
+
value: true
|
6
|
+
});
|
7
|
+
exports.colorBreaksToColorMap = colorBreaksToColorMap;
|
8
|
+
exports.colorMapToColorBreaks = colorMapToColorBreaks;
|
9
|
+
exports.getDomainStepsbyZoom = getDomainStepsbyZoom;
|
10
|
+
exports.getLayerColorScale = getLayerColorScale;
|
11
|
+
exports.getLegendOfScale = getLegendOfScale;
|
12
|
+
exports.getLinearDomain = getLinearDomain;
|
13
|
+
exports.getLogDomain = getLogDomain;
|
14
|
+
exports.getOrdinalDomain = getOrdinalDomain;
|
15
|
+
exports.getOrdinalLegends = getOrdinalLegends;
|
16
|
+
exports.getQuantLabelFormat = getQuantLabelFormat;
|
17
|
+
exports.getQuantLegends = getQuantLegends;
|
18
|
+
exports.getQuantileDomain = getQuantileDomain;
|
19
|
+
exports.getScaleFunction = getScaleFunction;
|
20
|
+
exports.getThresholdsFromQuantiles = getThresholdsFromQuantiles;
|
21
|
+
exports.getVisualChannelScaleByZoom = getVisualChannelScaleByZoom;
|
22
|
+
exports.initializeLayerColorMap = initializeLayerColorMap;
|
23
|
+
exports.isDomainQuantile = isDomainQuantile;
|
24
|
+
exports.isDomainStops = isDomainStops;
|
25
|
+
exports.isNumericColorBreaks = isNumericColorBreaks;
|
26
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
27
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
28
|
+
var _d3Array = require("d3-array");
|
29
|
+
var _moment = _interopRequireDefault(require("moment"));
|
30
|
+
var _commonUtils = require("@kepler.gl/common-utils");
|
31
|
+
var _constants = require("@kepler.gl/constants");
|
32
|
+
var _colorUtils = require("./color-utils");
|
33
|
+
var _dataUtils = require("./data-utils");
|
34
|
+
var _filterUtils = require("./filter-utils");
|
35
|
+
var _utils = require("./utils");
|
36
|
+
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; }
|
37
|
+
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
|
38
|
+
// Copyright contributors to the kepler.gl project
|
39
|
+
// import {Layer, VisualChannel, VisualChannelDomain} from '@kepler.gl/layers';
|
40
|
+
// TODO isolate types - depends on @kepler.gl/layers
|
41
|
+
|
42
|
+
/**
|
43
|
+
* return quantile domain for an array of data
|
44
|
+
*/
|
45
|
+
function getQuantileDomain(data, valueAccessor, sortFunc) {
|
46
|
+
var values = typeof valueAccessor === 'function' ? data.map(valueAccessor) : data;
|
47
|
+
return values.filter(_commonUtils.notNullorUndefined).sort(sortFunc);
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* return ordinal domain for a data container
|
52
|
+
*/
|
53
|
+
function getOrdinalDomain(dataContainer, valueAccessor) {
|
54
|
+
var values = dataContainer.mapIndex(valueAccessor);
|
55
|
+
return (0, _dataUtils.unique)(values).filter(_commonUtils.notNullorUndefined).sort();
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* return linear domain for an array of data
|
60
|
+
*/
|
61
|
+
function getLinearDomain(data, valueAccessor) {
|
62
|
+
var range = typeof valueAccessor === 'function' ? (0, _d3Array.extent)(data, valueAccessor) : (0, _d3Array.extent)(data);
|
63
|
+
return range.map(function (d, i) {
|
64
|
+
return d === undefined ? i : d;
|
65
|
+
});
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* return linear domain for an array of data. A log scale domain cannot contain 0
|
70
|
+
*/
|
71
|
+
function getLogDomain(data, valueAccessor) {
|
72
|
+
var _getLinearDomain = getLinearDomain(data, valueAccessor),
|
73
|
+
_getLinearDomain2 = (0, _slicedToArray2["default"])(_getLinearDomain, 2),
|
74
|
+
d0 = _getLinearDomain2[0],
|
75
|
+
d1 = _getLinearDomain2[1];
|
76
|
+
return [d0 === 0 ? 1e-5 : d0, d1];
|
77
|
+
}
|
78
|
+
/**
|
79
|
+
* whether field domain is stops
|
80
|
+
*/
|
81
|
+
function isDomainStops(domain) {
|
82
|
+
return (0, _utils.isPlainObject)(domain) && Array.isArray(domain.stops) && Array.isArray(domain.z);
|
83
|
+
}
|
84
|
+
/**
|
85
|
+
* whether field domain is quantiles
|
86
|
+
*/
|
87
|
+
function isDomainQuantile(domain) {
|
88
|
+
return (0, _utils.isPlainObject)(domain) && Array.isArray(domain.quantiles) && Array.isArray(domain.z);
|
89
|
+
}
|
90
|
+
|
91
|
+
/**
|
92
|
+
* get the domain at zoom
|
93
|
+
*/
|
94
|
+
function getThresholdsFromQuantiles(quantiles, buckets) {
|
95
|
+
var thresholds = [];
|
96
|
+
if (!Number.isFinite(buckets) || buckets < 1) {
|
97
|
+
return [quantiles[0], quantiles[quantiles.length - 1]];
|
98
|
+
}
|
99
|
+
for (var i = 1; i < buckets; i++) {
|
100
|
+
// position in sorted array
|
101
|
+
var position = i / buckets;
|
102
|
+
// @ts-ignore
|
103
|
+
thresholds.push((0, _d3Array.quantileSorted)(quantiles, position));
|
104
|
+
}
|
105
|
+
return thresholds;
|
106
|
+
}
|
107
|
+
|
108
|
+
/**
|
109
|
+
* get the domain at zoom
|
110
|
+
*/
|
111
|
+
function getDomainStepsbyZoom(domain, steps, z) {
|
112
|
+
var i = (0, _d3Array.bisectLeft)(steps, z);
|
113
|
+
if (steps[i] === z) {
|
114
|
+
// If z is an integer value exactly matching a step, return the corresponding domain
|
115
|
+
return domain[i];
|
116
|
+
}
|
117
|
+
// Otherwise, return the next coarsest domain
|
118
|
+
return domain[Math.max(i - 1, 0)];
|
119
|
+
}
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Get d3 scale function
|
123
|
+
*/
|
124
|
+
function getScaleFunction(scale, range, domain, fixed) {
|
125
|
+
var scaleFunction = _constants.SCALE_FUNC[fixed ? 'linear' : scale]().domain(domain).range(fixed ? domain : range);
|
126
|
+
scaleFunction.scaleType = fixed ? 'linear' : scale;
|
127
|
+
return scaleFunction;
|
128
|
+
}
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Get threshold scale color labels
|
132
|
+
*/
|
133
|
+
function getThresholdLabels(scale, labelFormat) {
|
134
|
+
var genLength = scale.range().length;
|
135
|
+
return scale.range().map(function (d, i) {
|
136
|
+
var invert = scale.invertExtent(d);
|
137
|
+
var inputs = [i === 0 ? null : (0, _dataUtils.reverseFormatNumber)(labelFormat(invert[0])), i === genLength - 1 ? null : (0, _dataUtils.reverseFormatNumber)(labelFormat(invert[1]))];
|
138
|
+
return {
|
139
|
+
// raw value
|
140
|
+
range: invert,
|
141
|
+
// formatted value
|
142
|
+
inputs: inputs,
|
143
|
+
label: i === 0 ? "Less than ".concat(labelFormat(invert[1])) : i === genLength - 1 ? "".concat(labelFormat(invert[0]), " or more") : "".concat(labelFormat(invert[0]), " to ").concat(labelFormat(invert[1]))
|
144
|
+
};
|
145
|
+
});
|
146
|
+
}
|
147
|
+
|
148
|
+
/**
|
149
|
+
* Get linear / quant scale color labels
|
150
|
+
*/
|
151
|
+
function getScaleLabels(scale, labelFormat) {
|
152
|
+
return scale.range().map(function (d, i) {
|
153
|
+
// @ts-ignore
|
154
|
+
var invert = scale.invertExtent(d);
|
155
|
+
var inputs = [(0, _dataUtils.reverseFormatNumber)(labelFormat(invert[0])), (0, _dataUtils.reverseFormatNumber)(labelFormat(invert[1]))];
|
156
|
+
return {
|
157
|
+
label: "".concat(labelFormat(invert[0]), " to ").concat(labelFormat(invert[1])),
|
158
|
+
// raw value
|
159
|
+
range: invert,
|
160
|
+
// formatted value
|
161
|
+
inputs: inputs
|
162
|
+
};
|
163
|
+
});
|
164
|
+
}
|
165
|
+
var customScaleLabelFormat = function customScaleLabelFormat(n) {
|
166
|
+
return n ? (0, _dataUtils.formatNumber)(n, 'real') : 'no value';
|
167
|
+
};
|
168
|
+
/**
|
169
|
+
* Get linear / quant scale color breaks
|
170
|
+
*/
|
171
|
+
function getQuantLegends(scale, labelFormat) {
|
172
|
+
if (typeof scale.invertExtent !== 'function') {
|
173
|
+
return [];
|
174
|
+
}
|
175
|
+
var labels = scale.scaleType === 'threshold' || scale.scaleType === 'custom' ? getThresholdLabels(scale, scale.scaleType === 'custom' ? customScaleLabelFormat : function (n) {
|
176
|
+
return n ? (0, _dataUtils.formatNumber)(n) : 'no value';
|
177
|
+
}) : getScaleLabels(scale, labelFormat);
|
178
|
+
var data = scale.range();
|
179
|
+
return labels.map(function (label, index) {
|
180
|
+
return _objectSpread({
|
181
|
+
data: Array.isArray(data[index]) ? (0, _colorUtils.rgbToHex)(data[index]) : data[index]
|
182
|
+
}, label);
|
183
|
+
});
|
184
|
+
}
|
185
|
+
|
186
|
+
/**
|
187
|
+
* Get ordinal color scale legends
|
188
|
+
*/
|
189
|
+
function getOrdinalLegends(scale) {
|
190
|
+
var domain = scale.domain();
|
191
|
+
var labels = scale.domain();
|
192
|
+
var data = domain.map(scale);
|
193
|
+
return data.map(function (datum, index) {
|
194
|
+
return {
|
195
|
+
data: (0, _colorUtils.isRgbColor)(datum) ? (0, _colorUtils.rgbToHex)(datum) : datum,
|
196
|
+
label: labels[index]
|
197
|
+
};
|
198
|
+
});
|
199
|
+
}
|
200
|
+
var defaultFormat = function defaultFormat(d) {
|
201
|
+
return d;
|
202
|
+
};
|
203
|
+
var getTimeLabelFormat = function getTimeLabelFormat(domain) {
|
204
|
+
var formatter = (0, _filterUtils.getTimeWidgetHintFormatter)(domain);
|
205
|
+
return function (val) {
|
206
|
+
return _moment["default"].utc(val).format(formatter);
|
207
|
+
};
|
208
|
+
};
|
209
|
+
function getQuantLabelFormat(domain, fieldType) {
|
210
|
+
// quant scale can only be assigned to linear Fields: real, timestamp, integer
|
211
|
+
return fieldType === _constants.ALL_FIELD_TYPES.timestamp ? getTimeLabelFormat(domain) : !fieldType ? defaultFormat : function (n) {
|
212
|
+
return (0, _dataUtils.isNumber)(n) ? (0, _dataUtils.formatNumber)(n, fieldType) : 'no value';
|
213
|
+
};
|
214
|
+
}
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Get legends for scale
|
218
|
+
*/
|
219
|
+
function getLegendOfScale(_ref) {
|
220
|
+
var scale = _ref.scale,
|
221
|
+
scaleType = _ref.scaleType,
|
222
|
+
labelFormat = _ref.labelFormat,
|
223
|
+
fieldType = _ref.fieldType;
|
224
|
+
if (!scale || scale.byZoom) {
|
225
|
+
return [];
|
226
|
+
}
|
227
|
+
if (scaleType === _constants.SCALE_TYPES.ordinal) {
|
228
|
+
return getOrdinalLegends(scale);
|
229
|
+
}
|
230
|
+
var formatLabel = labelFormat || getQuantLabelFormat(scale.domain(), fieldType);
|
231
|
+
return getQuantLegends(scale, formatLabel);
|
232
|
+
}
|
233
|
+
|
234
|
+
/**
|
235
|
+
* Get color scale function
|
236
|
+
*/
|
237
|
+
function getLayerColorScale(_ref2) {
|
238
|
+
var range = _ref2.range,
|
239
|
+
domain = _ref2.domain,
|
240
|
+
scaleType = _ref2.scaleType,
|
241
|
+
layer = _ref2.layer;
|
242
|
+
if (range && domain && scaleType) {
|
243
|
+
return layer.getColorScale(scaleType, domain, range);
|
244
|
+
}
|
245
|
+
return null;
|
246
|
+
}
|
247
|
+
|
248
|
+
/**
|
249
|
+
* Convert colorRange.colorMap into color breaks UI input
|
250
|
+
*/
|
251
|
+
function initializeLayerColorMap(layer, visualChannel) {
|
252
|
+
var domain = layer.config[visualChannel.domain];
|
253
|
+
var range = layer.config.visConfig[visualChannel.range];
|
254
|
+
var scaleType = layer.config[visualChannel.scale];
|
255
|
+
var field = layer.config[visualChannel.field];
|
256
|
+
var scale = getLayerColorScale({
|
257
|
+
range: range,
|
258
|
+
domain: domain,
|
259
|
+
scaleType: scaleType,
|
260
|
+
layer: layer
|
261
|
+
});
|
262
|
+
var colorBreaks = getLegendOfScale({
|
263
|
+
scale: scale !== null && scale !== void 0 && scale.byZoom ? scale(0) : scale,
|
264
|
+
scaleType: scaleType,
|
265
|
+
fieldType: field.type
|
266
|
+
});
|
267
|
+
return colorBreaksToColorMap(colorBreaks);
|
268
|
+
}
|
269
|
+
|
270
|
+
/**
|
271
|
+
* Get visual chanel scale function if it's based on zoom
|
272
|
+
*/
|
273
|
+
function getVisualChannelScaleByZoom(_ref3) {
|
274
|
+
var _scale;
|
275
|
+
var scale = _ref3.scale,
|
276
|
+
layer = _ref3.layer,
|
277
|
+
mapState = _ref3.mapState;
|
278
|
+
if ((_scale = scale) !== null && _scale !== void 0 && _scale.byZoom) {
|
279
|
+
var _layer$meta;
|
280
|
+
var z = (_layer$meta = layer.meta) !== null && _layer$meta !== void 0 && _layer$meta.getZoom ? layer.meta.getZoom(mapState) : mapState === null || mapState === void 0 ? void 0 : mapState.zoom;
|
281
|
+
scale = Number.isFinite(z) ? scale(z) : null;
|
282
|
+
}
|
283
|
+
return scale;
|
284
|
+
}
|
285
|
+
|
286
|
+
/**
|
287
|
+
* Convert color breaks UI input into colorRange.colorMap
|
288
|
+
*/
|
289
|
+
function colorBreaksToColorMap(colorBreaks) {
|
290
|
+
var colorMap = colorBreaks.map(function (colorBreak, i) {
|
291
|
+
// [value, hex]
|
292
|
+
return [colorBreak.inputs ? i === colorBreaks.length - 1 ? null // last
|
293
|
+
: colorBreak.inputs[1] : colorBreak.label, colorBreak.data];
|
294
|
+
});
|
295
|
+
|
296
|
+
// @ts-ignore tuple
|
297
|
+
return colorMap;
|
298
|
+
}
|
299
|
+
|
300
|
+
/**
|
301
|
+
* Convert colorRange.colorMap into color breaks UI input
|
302
|
+
*/
|
303
|
+
function colorMapToColorBreaks(colorMap) {
|
304
|
+
if (!colorMap) {
|
305
|
+
return null;
|
306
|
+
}
|
307
|
+
var colorBreaks = colorMap.map(function (_ref4, i) {
|
308
|
+
var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
|
309
|
+
value = _ref5[0],
|
310
|
+
color = _ref5[1];
|
311
|
+
var range = i === 0 ?
|
312
|
+
// first
|
313
|
+
[-Infinity, value] :
|
314
|
+
// last
|
315
|
+
i === colorMap.length - 1 ? [colorMap[i - 1][0], Infinity] :
|
316
|
+
// else
|
317
|
+
[colorMap[i - 1][0], value];
|
318
|
+
return {
|
319
|
+
data: color,
|
320
|
+
range: range,
|
321
|
+
inputs: range,
|
322
|
+
label:
|
323
|
+
// first
|
324
|
+
i === 0 ? "Less than ".concat(value) :
|
325
|
+
// last
|
326
|
+
i === colorMap.length - 1 ? "".concat(colorMap[i - 1][0], " or more") : "".concat(colorMap[i - 1][0], " to ").concat(value)
|
327
|
+
};
|
328
|
+
});
|
329
|
+
|
330
|
+
// @ts-ignore implement conversion for ordinal
|
331
|
+
return colorBreaks;
|
332
|
+
}
|
333
|
+
|
334
|
+
/**
|
335
|
+
* Whether color breaks is for numeric field
|
336
|
+
*/
|
337
|
+
function isNumericColorBreaks(colorBreaks) {
|
338
|
+
return Array.isArray(colorBreaks) && colorBreaks.length && colorBreaks[0].inputs;
|
339
|
+
}
|
340
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZDNBcnJheSIsInJlcXVpcmUiLCJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb21tb25VdGlscyIsIl9jb25zdGFudHMiLCJfY29sb3JVdGlscyIsIl9kYXRhVXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfdXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImdldFF1YW50aWxlRG9tYWluIiwiZGF0YSIsInZhbHVlQWNjZXNzb3IiLCJzb3J0RnVuYyIsInZhbHVlcyIsIm1hcCIsIm5vdE51bGxvclVuZGVmaW5lZCIsInNvcnQiLCJnZXRPcmRpbmFsRG9tYWluIiwiZGF0YUNvbnRhaW5lciIsIm1hcEluZGV4IiwidW5pcXVlIiwiZ2V0TGluZWFyRG9tYWluIiwicmFuZ2UiLCJleHRlbnQiLCJkIiwiaSIsInVuZGVmaW5lZCIsImdldExvZ0RvbWFpbiIsIl9nZXRMaW5lYXJEb21haW4iLCJfZ2V0TGluZWFyRG9tYWluMiIsIl9zbGljZWRUb0FycmF5MiIsImQwIiwiZDEiLCJpc0RvbWFpblN0b3BzIiwiZG9tYWluIiwiaXNQbGFpbk9iamVjdCIsIkFycmF5IiwiaXNBcnJheSIsInN0b3BzIiwieiIsImlzRG9tYWluUXVhbnRpbGUiLCJxdWFudGlsZXMiLCJnZXRUaHJlc2hvbGRzRnJvbVF1YW50aWxlcyIsImJ1Y2tldHMiLCJ0aHJlc2hvbGRzIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwb3NpdGlvbiIsImQzUXVhbnRpbGUiLCJnZXREb21haW5TdGVwc2J5Wm9vbSIsInN0ZXBzIiwiYmlzZWN0TGVmdCIsIk1hdGgiLCJtYXgiLCJnZXRTY2FsZUZ1bmN0aW9uIiwic2NhbGUiLCJmaXhlZCIsInNjYWxlRnVuY3Rpb24iLCJTQ0FMRV9GVU5DIiwic2NhbGVUeXBlIiwiZ2V0VGhyZXNob2xkTGFiZWxzIiwibGFiZWxGb3JtYXQiLCJnZW5MZW5ndGgiLCJpbnZlcnQiLCJpbnZlcnRFeHRlbnQiLCJpbnB1dHMiLCJyZXZlcnNlRm9ybWF0TnVtYmVyIiwibGFiZWwiLCJjb25jYXQiLCJnZXRTY2FsZUxhYmVscyIsImN1c3RvbVNjYWxlTGFiZWxGb3JtYXQiLCJuIiwiZm9ybWF0TnVtYmVyIiwiZ2V0UXVhbnRMZWdlbmRzIiwibGFiZWxzIiwiaW5kZXgiLCJyZ2JUb0hleCIsImdldE9yZGluYWxMZWdlbmRzIiwiZGF0dW0iLCJpc1JnYkNvbG9yIiwiZGVmYXVsdEZvcm1hdCIsImdldFRpbWVMYWJlbEZvcm1hdCIsImZvcm1hdHRlciIsImdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyIiwidmFsIiwibW9tZW50IiwidXRjIiwiZm9ybWF0IiwiZ2V0UXVhbnRMYWJlbEZvcm1hdCIsImZpZWxkVHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsImlzTnVtYmVyIiwiZ2V0TGVnZW5kT2ZTY2FsZSIsIl9yZWYiLCJieVpvb20iLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJmb3JtYXRMYWJlbCIsImdldExheWVyQ29sb3JTY2FsZSIsIl9yZWYyIiwibGF5ZXIiLCJnZXRDb2xvclNjYWxlIiwiaW5pdGlhbGl6ZUxheWVyQ29sb3JNYXAiLCJ2aXN1YWxDaGFubmVsIiwiY29uZmlnIiwidmlzQ29uZmlnIiwiZmllbGQiLCJjb2xvckJyZWFrcyIsInR5cGUiLCJjb2xvckJyZWFrc1RvQ29sb3JNYXAiLCJnZXRWaXN1YWxDaGFubmVsU2NhbGVCeVpvb20iLCJfcmVmMyIsIl9zY2FsZSIsIm1hcFN0YXRlIiwiX2xheWVyJG1ldGEiLCJtZXRhIiwiZ2V0Wm9vbSIsInpvb20iLCJjb2xvck1hcCIsImNvbG9yQnJlYWsiLCJjb2xvck1hcFRvQ29sb3JCcmVha3MiLCJfcmVmNCIsIl9yZWY1IiwidmFsdWUiLCJjb2xvciIsIkluZmluaXR5IiwiaXNOdW1lcmljQ29sb3JCcmVha3MiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YS1zY2FsZS11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge2Jpc2VjdExlZnQsIHF1YW50aWxlU29ydGVkIGFzIGQzUXVhbnRpbGUsIGV4dGVudH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQge25vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIENvbG9yTWFwLCBDb2xvclJhbmdlLCBTQ0FMRV9GVU5DLCBTQ0FMRV9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuLy8gaW1wb3J0IHtMYXllciwgVmlzdWFsQ2hhbm5lbCwgVmlzdWFsQ2hhbm5lbERvbWFpbn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtIZXhDb2xvciwgTWFwU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge2lzUmdiQ29sb3IsIHJnYlRvSGV4fSBmcm9tICcuL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZX0gZnJvbSAnLi9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnO1xuaW1wb3J0IHtmb3JtYXROdW1iZXIsIGlzTnVtYmVyLCByZXZlcnNlRm9ybWF0TnVtYmVyLCB1bmlxdWV9IGZyb20gJy4vZGF0YS11dGlscyc7XG5pbXBvcnQge2dldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyfSBmcm9tICcuL2ZpbHRlci11dGlscyc7XG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBDb2xvckJyZWFrID0ge1xuICBkYXRhOiBIZXhDb2xvcjtcbiAgbGFiZWw6IHN0cmluZztcbiAgcmFuZ2U6IG51bWJlcltdO1xuICBpbnB1dHM6IG51bWJlcltdO1xufTtcbmV4cG9ydCB0eXBlIENvbG9yQnJlYWtPcmRpbmFsID0ge1xuICBkYXRhOiBIZXhDb2xvcjtcbiAgbGFiZWw6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEQzU2NhbGVGdW5jdGlvbiA9IFJlY29yZDxzdHJpbmcsIGFueT4gJiAoKHg6IGFueSkgPT4gYW55KTtcblxuLy8gVE9ETyBpc29sYXRlIHR5cGVzIC0gZGVwZW5kcyBvbiBAa2VwbGVyLmdsL2xheWVyc1xudHlwZSBMYXllciA9IGFueTtcbnR5cGUgVmlzdWFsQ2hhbm5lbCA9IGFueTtcbnR5cGUgVmlzdWFsQ2hhbm5lbERvbWFpbiA9IGFueTtcblxuZXhwb3J0IHR5cGUgTGFiZWxGb3JtYXQgPSAobjogbnVtYmVyKSA9PiBzdHJpbmc7XG50eXBlIGRhdGFWYWx1ZUFjY2Vzc29yID0gPFQ+KHBhcmFtOiBUKSA9PiBUO1xudHlwZSBkYXRhQ29udGFpbmVyVmFsdWVBY2Nlc3NvciA9IChkOiB7aW5kZXg6IG51bWJlcn0sIGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PiBhbnk7XG50eXBlIHNvcnQgPSAoYTogYW55LCBiOiBhbnkpID0+IGFueTtcbi8qKlxuICogcmV0dXJuIHF1YW50aWxlIGRvbWFpbiBmb3IgYW4gYXJyYXkgb2YgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVhbnRpbGVEb21haW4oXG4gIGRhdGE6IGFueVtdLFxuICB2YWx1ZUFjY2Vzc29yPzogZGF0YVZhbHVlQWNjZXNzb3IsXG4gIHNvcnRGdW5jPzogc29ydFxuKTogbnVtYmVyW10ge1xuICBjb25zdCB2YWx1ZXMgPSB0eXBlb2YgdmFsdWVBY2Nlc3NvciA9PT0gJ2Z1bmN0aW9uJyA/IGRhdGEubWFwKHZhbHVlQWNjZXNzb3IpIDogZGF0YTtcblxuICByZXR1cm4gdmFsdWVzLmZpbHRlcihub3ROdWxsb3JVbmRlZmluZWQpLnNvcnQoc29ydEZ1bmMpO1xufVxuXG4vKipcbiAqIHJldHVybiBvcmRpbmFsIGRvbWFpbiBmb3IgYSBkYXRhIGNvbnRhaW5lclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JkaW5hbERvbWFpbihcbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSxcbiAgdmFsdWVBY2Nlc3NvcjogZGF0YUNvbnRhaW5lclZhbHVlQWNjZXNzb3Jcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzID0gZGF0YUNvbnRhaW5lci5tYXBJbmRleCh2YWx1ZUFjY2Vzc29yKTtcblxuICByZXR1cm4gdW5pcXVlKHZhbHVlcykuZmlsdGVyKG5vdE51bGxvclVuZGVmaW5lZCkuc29ydCgpO1xufVxuXG4vKipcbiAqIHJldHVybiBsaW5lYXIgZG9tYWluIGZvciBhbiBhcnJheSBvZiBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lYXJEb21haW4oXG4gIGRhdGE6IG51bWJlcltdLFxuICB2YWx1ZUFjY2Vzc29yPzogZGF0YVZhbHVlQWNjZXNzb3Jcbik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCByYW5nZSA9IHR5cGVvZiB2YWx1ZUFjY2Vzc29yID09PSAnZnVuY3Rpb24nID8gZXh0ZW50KGRhdGEsIHZhbHVlQWNjZXNzb3IpIDogZXh0ZW50KGRhdGEpO1xuICByZXR1cm4gcmFuZ2UubWFwKChkOiB1bmRlZmluZWQgfCBudW1iZXIsIGk6IG51bWJlcikgPT4gKGQgPT09IHVuZGVmaW5lZCA/IGkgOiBkKSkgYXMgW1xuICAgIG51bWJlcixcbiAgICBudW1iZXJcbiAgXTtcbn1cblxuLyoqXG4gKiByZXR1cm4gbGluZWFyIGRvbWFpbiBmb3IgYW4gYXJyYXkgb2YgZGF0YS4gQSBsb2cgc2NhbGUgZG9tYWluIGNhbm5vdCBjb250YWluIDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ0RvbWFpbihkYXRhOiBhbnlbXSwgdmFsdWVBY2Nlc3NvcjogZGF0YVZhbHVlQWNjZXNzb3IpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgW2QwLCBkMV0gPSBnZXRMaW5lYXJEb21haW4oZGF0YSwgdmFsdWVBY2Nlc3Nvcik7XG4gIHJldHVybiBbZDAgPT09IDAgPyAxZS01IDogZDAsIGQxXTtcbn1cblxuZXhwb3J0IHR5cGUgRG9tYWluU3RvcHMgPSB7XG4gIHN0b3BzOiBudW1iZXJbXTtcbiAgejogbnVtYmVyW107XG59O1xuXG4vKipcbiAqIHdoZXRoZXIgZmllbGQgZG9tYWluIGlzIHN0b3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbWFpblN0b3BzKGRvbWFpbjogdW5rbm93bik6IGRvbWFpbiBpcyBEb21haW5TdG9wcyB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGRvbWFpbikgJiYgQXJyYXkuaXNBcnJheShkb21haW4uc3RvcHMpICYmIEFycmF5LmlzQXJyYXkoZG9tYWluLnopO1xufVxuXG5leHBvcnQgdHlwZSBEb21haW5RdWFudGlsZXMgPSB7XG4gIHF1YW50aWxlczogbnVtYmVyW107XG4gIHo6IG51bWJlcltdO1xufTtcblxuLyoqXG4gKiB3aGV0aGVyIGZpZWxkIGRvbWFpbiBpcyBxdWFudGlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9tYWluUXVhbnRpbGUoZG9tYWluOiBhbnkpOiBkb21haW4gaXMgRG9tYWluUXVhbnRpbGVzIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QoZG9tYWluKSAmJiBBcnJheS5pc0FycmF5KGRvbWFpbi5xdWFudGlsZXMpICYmIEFycmF5LmlzQXJyYXkoZG9tYWluLnopO1xufVxuXG4vKipcbiAqIGdldCB0aGUgZG9tYWluIGF0IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRocmVzaG9sZHNGcm9tUXVhbnRpbGVzKFxuICBxdWFudGlsZXM6IG51bWJlcltdLFxuICBidWNrZXRzOiBudW1iZXJcbik6IChudW1iZXIgfCB1bmRlZmluZWQpW10ge1xuICBjb25zdCB0aHJlc2hvbGRzID0gW107XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGJ1Y2tldHMpIHx8IGJ1Y2tldHMgPCAxKSB7XG4gICAgcmV0dXJuIFtxdWFudGlsZXNbMF0sIHF1YW50aWxlc1txdWFudGlsZXMubGVuZ3RoIC0gMV1dO1xuICB9XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYnVja2V0czsgaSsrKSB7XG4gICAgLy8gcG9zaXRpb24gaW4gc29ydGVkIGFycmF5XG4gICAgY29uc3QgcG9zaXRpb24gPSBpIC8gYnVja2V0cztcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhyZXNob2xkcy5wdXNoKGQzUXVhbnRpbGUocXVhbnRpbGVzLCBwb3NpdGlvbikpO1xuICB9XG5cbiAgcmV0dXJuIHRocmVzaG9sZHM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkb21haW4gYXQgem9vbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluU3RlcHNieVpvb20oZG9tYWluOiBhbnlbXSwgc3RlcHM6IG51bWJlcltdLCB6OiBudW1iZXIpOiBhbnkge1xuICBjb25zdCBpID0gYmlzZWN0TGVmdChzdGVwcywgeik7XG5cbiAgaWYgKHN0ZXBzW2ldID09PSB6KSB7XG4gICAgLy8gSWYgeiBpcyBhbiBpbnRlZ2VyIHZhbHVlIGV4YWN0bHkgbWF0Y2hpbmcgYSBzdGVwLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZG9tYWluXG4gICAgcmV0dXJuIGRvbWFpbltpXTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgbmV4dCBjb2Fyc2VzdCBkb21haW5cbiAgcmV0dXJuIGRvbWFpbltNYXRoLm1heChpIC0gMSwgMCldO1xufVxuXG4vKipcbiAqIEdldCBkMyBzY2FsZSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGdW5jdGlvbihcbiAgc2NhbGU6IHN0cmluZyxcbiAgcmFuZ2U6IGFueVtdIHwgSXRlcmFibGVJdGVyYXRvcjxhbnk+LFxuICBkb21haW46IChudW1iZXIgfCB1bmRlZmluZWQpW10gfCBzdHJpbmdbXSB8IEl0ZXJhYmxlSXRlcmF0b3I8YW55PixcbiAgZml4ZWQ/OiBib29sZWFuXG4pOiBEM1NjYWxlRnVuY3Rpb24ge1xuICBjb25zdCBzY2FsZUZ1bmN0aW9uID0gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdKClcbiAgICAuZG9tYWluKGRvbWFpbilcbiAgICAucmFuZ2UoZml4ZWQgPyBkb21haW4gOiByYW5nZSk7XG4gIHNjYWxlRnVuY3Rpb24uc2NhbGVUeXBlID0gZml4ZWQgPyAnbGluZWFyJyA6IHNjYWxlO1xuICByZXR1cm4gc2NhbGVGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBHZXQgdGhyZXNob2xkIHNjYWxlIGNvbG9yIGxhYmVsc1xuICovXG5mdW5jdGlvbiBnZXRUaHJlc2hvbGRMYWJlbHMoXG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24sXG4gIGxhYmVsRm9ybWF0OiBMYWJlbEZvcm1hdFxuKTogT21pdDxDb2xvckJyZWFrLCAnZGF0YSc+W10ge1xuICBjb25zdCBnZW5MZW5ndGggPSBzY2FsZS5yYW5nZSgpLmxlbmd0aDtcbiAgcmV0dXJuIHNjYWxlLnJhbmdlKCkubWFwKChkLCBpKSA9PiB7XG4gICAgY29uc3QgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0RXh0ZW50KGQpO1xuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIGkgPT09IDAgPyBudWxsIDogcmV2ZXJzZUZvcm1hdE51bWJlcihsYWJlbEZvcm1hdChpbnZlcnRbMF0pKSxcbiAgICAgIGkgPT09IGdlbkxlbmd0aCAtIDEgPyBudWxsIDogcmV2ZXJzZUZvcm1hdE51bWJlcihsYWJlbEZvcm1hdChpbnZlcnRbMV0pKVxuICAgIF07XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIHJhdyB2YWx1ZVxuICAgICAgcmFuZ2U6IGludmVydCxcbiAgICAgIC8vIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAgaW5wdXRzLFxuICAgICAgbGFiZWw6XG4gICAgICAgIGkgPT09IDBcbiAgICAgICAgICA/IGBMZXNzIHRoYW4gJHtsYWJlbEZvcm1hdChpbnZlcnRbMV0pfWBcbiAgICAgICAgICA6IGkgPT09IGdlbkxlbmd0aCAtIDFcbiAgICAgICAgICA/IGAke2xhYmVsRm9ybWF0KGludmVydFswXSl9IG9yIG1vcmVgXG4gICAgICAgICAgOiBgJHtsYWJlbEZvcm1hdChpbnZlcnRbMF0pfSB0byAke2xhYmVsRm9ybWF0KGludmVydFsxXSl9YFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBsaW5lYXIgLyBxdWFudCBzY2FsZSBjb2xvciBsYWJlbHNcbiAqL1xuZnVuY3Rpb24gZ2V0U2NhbGVMYWJlbHMoXG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24sXG4gIGxhYmVsRm9ybWF0OiBMYWJlbEZvcm1hdFxuKTogT21pdDxDb2xvckJyZWFrLCAnZGF0YSc+W10ge1xuICByZXR1cm4gc2NhbGUucmFuZ2UoKS5tYXAoKGQsIGkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0RXh0ZW50KGQpO1xuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHJldmVyc2VGb3JtYXROdW1iZXIobGFiZWxGb3JtYXQoaW52ZXJ0WzBdKSksXG4gICAgICByZXZlcnNlRm9ybWF0TnVtYmVyKGxhYmVsRm9ybWF0KGludmVydFsxXSkpXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYCR7bGFiZWxGb3JtYXQoaW52ZXJ0WzBdKX0gdG8gJHtsYWJlbEZvcm1hdChpbnZlcnRbMV0pfWAsXG4gICAgICAvLyByYXcgdmFsdWVcbiAgICAgIHJhbmdlOiBpbnZlcnQsXG4gICAgICAvLyBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgIGlucHV0c1xuICAgIH07XG4gIH0pO1xufVxuXG5jb25zdCBjdXN0b21TY2FsZUxhYmVsRm9ybWF0ID0gbiA9PiAobiA/IGZvcm1hdE51bWJlcihuLCAncmVhbCcpIDogJ25vIHZhbHVlJyk7XG4vKipcbiAqIEdldCBsaW5lYXIgLyBxdWFudCBzY2FsZSBjb2xvciBicmVha3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFF1YW50TGVnZW5kcyhzY2FsZTogRDNTY2FsZUZ1bmN0aW9uLCBsYWJlbEZvcm1hdDogTGFiZWxGb3JtYXQpOiBDb2xvckJyZWFrW10ge1xuICBpZiAodHlwZW9mIHNjYWxlLmludmVydEV4dGVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBsYWJlbHMgPVxuICAgIHNjYWxlLnNjYWxlVHlwZSA9PT0gJ3RocmVzaG9sZCcgfHwgc2NhbGUuc2NhbGVUeXBlID09PSAnY3VzdG9tJ1xuICAgICAgPyBnZXRUaHJlc2hvbGRMYWJlbHMoXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgc2NhbGUuc2NhbGVUeXBlID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgPyBjdXN0b21TY2FsZUxhYmVsRm9ybWF0XG4gICAgICAgICAgICA6IG4gPT4gKG4gPyBmb3JtYXROdW1iZXIobikgOiAnbm8gdmFsdWUnKVxuICAgICAgICApXG4gICAgICA6IGdldFNjYWxlTGFiZWxzKHNjYWxlLCBsYWJlbEZvcm1hdCk7XG5cbiAgY29uc3QgZGF0YSA9IHNjYWxlLnJhbmdlKCk7XG5cbiAgcmV0dXJuIGxhYmVscy5tYXAoKGxhYmVsLCBpbmRleCkgPT4gKHtcbiAgICBkYXRhOiBBcnJheS5pc0FycmF5KGRhdGFbaW5kZXhdKSA/IHJnYlRvSGV4KGRhdGFbaW5kZXhdKSA6IGRhdGFbaW5kZXhdLFxuICAgIC4uLmxhYmVsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBHZXQgb3JkaW5hbCBjb2xvciBzY2FsZSBsZWdlbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmRpbmFsTGVnZW5kcyhzY2FsZTogRDNTY2FsZUZ1bmN0aW9uKTogQ29sb3JCcmVha09yZGluYWxbXSB7XG4gIGNvbnN0IGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpO1xuICBjb25zdCBsYWJlbHMgPSBzY2FsZS5kb21haW4oKTtcbiAgY29uc3QgZGF0YSA9IGRvbWFpbi5tYXAoc2NhbGUpO1xuXG4gIHJldHVybiBkYXRhLm1hcCgoZGF0dW0sIGluZGV4KSA9PiAoe1xuICAgIGRhdGE6IGlzUmdiQ29sb3IoZGF0dW0pID8gcmdiVG9IZXgoZGF0dW0pIDogZGF0dW0sXG4gICAgbGFiZWw6IGxhYmVsc1tpbmRleF1cbiAgfSkpO1xufVxuXG5jb25zdCBkZWZhdWx0Rm9ybWF0ID0gZCA9PiBkO1xuXG5jb25zdCBnZXRUaW1lTGFiZWxGb3JtYXQgPSBkb21haW4gPT4ge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBnZXRUaW1lV2lkZ2V0SGludEZvcm1hdHRlcihkb21haW4pO1xuICByZXR1cm4gdmFsID0+IG1vbWVudC51dGModmFsKS5mb3JtYXQoZm9ybWF0dGVyKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWFudExhYmVsRm9ybWF0KGRvbWFpbiwgZmllbGRUeXBlKSB7XG4gIC8vIHF1YW50IHNjYWxlIGNhbiBvbmx5IGJlIGFzc2lnbmVkIHRvIGxpbmVhciBGaWVsZHM6IHJlYWwsIHRpbWVzdGFtcCwgaW50ZWdlclxuICByZXR1cm4gZmllbGRUeXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wXG4gICAgPyBnZXRUaW1lTGFiZWxGb3JtYXQoZG9tYWluKVxuICAgIDogIWZpZWxkVHlwZVxuICAgID8gZGVmYXVsdEZvcm1hdFxuICAgIDogbiA9PiAoaXNOdW1iZXIobikgPyBmb3JtYXROdW1iZXIobiwgZmllbGRUeXBlKSA6ICdubyB2YWx1ZScpO1xufVxuXG4vKipcbiAqIEdldCBsZWdlbmRzIGZvciBzY2FsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVnZW5kT2ZTY2FsZSh7XG4gIHNjYWxlLFxuICBzY2FsZVR5cGUsXG4gIGxhYmVsRm9ybWF0LFxuICBmaWVsZFR5cGVcbn06IHtcbiAgc2NhbGU/OiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsO1xuICBzY2FsZVR5cGU6IHN0cmluZztcbiAgbGFiZWxGb3JtYXQ/OiBMYWJlbEZvcm1hdDtcbiAgZmllbGRUeXBlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xufSk6IENvbG9yQnJlYWtbXSB8IENvbG9yQnJlYWtPcmRpbmFsW10ge1xuICBpZiAoIXNjYWxlIHx8IHNjYWxlLmJ5Wm9vbSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoc2NhbGVUeXBlID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsKSB7XG4gICAgcmV0dXJuIGdldE9yZGluYWxMZWdlbmRzKHNjYWxlKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdExhYmVsID0gbGFiZWxGb3JtYXQgfHwgZ2V0UXVhbnRMYWJlbEZvcm1hdChzY2FsZS5kb21haW4oKSwgZmllbGRUeXBlKTtcblxuICByZXR1cm4gZ2V0UXVhbnRMZWdlbmRzKHNjYWxlLCBmb3JtYXRMYWJlbCk7XG59XG5cbi8qKlxuICogR2V0IGNvbG9yIHNjYWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckNvbG9yU2NhbGUoe1xuICByYW5nZSxcbiAgZG9tYWluLFxuICBzY2FsZVR5cGUsXG4gIGxheWVyXG59OiB7XG4gIHJhbmdlOiBDb2xvclJhbmdlIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgZG9tYWluOiBWaXN1YWxDaGFubmVsRG9tYWluO1xuICBzY2FsZVR5cGU6IHN0cmluZztcbiAgbGF5ZXI6IExheWVyO1xuICBpc0ZpeGVkPzogYm9vbGVhbjtcbn0pOiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsIHtcbiAgaWYgKHJhbmdlICYmIGRvbWFpbiAmJiBzY2FsZVR5cGUpIHtcbiAgICByZXR1cm4gbGF5ZXIuZ2V0Q29sb3JTY2FsZShzY2FsZVR5cGUsIGRvbWFpbiwgcmFuZ2UpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY29sb3JSYW5nZS5jb2xvck1hcCBpbnRvIGNvbG9yIGJyZWFrcyBVSSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUxheWVyQ29sb3JNYXAobGF5ZXI6IExheWVyLCB2aXN1YWxDaGFubmVsOiBWaXN1YWxDaGFubmVsKTogQ29sb3JNYXAge1xuICBjb25zdCBkb21haW4gPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5kb21haW5dO1xuICBjb25zdCByYW5nZSA9IGxheWVyLmNvbmZpZy52aXNDb25maWdbdmlzdWFsQ2hhbm5lbC5yYW5nZV07XG4gIGNvbnN0IHNjYWxlVHlwZSA9IGxheWVyLmNvbmZpZ1t2aXN1YWxDaGFubmVsLnNjYWxlXTtcbiAgY29uc3QgZmllbGQgPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG5cbiAgY29uc3Qgc2NhbGUgPSBnZXRMYXllckNvbG9yU2NhbGUoe1xuICAgIHJhbmdlLFxuICAgIGRvbWFpbixcbiAgICBzY2FsZVR5cGUsXG4gICAgbGF5ZXJcbiAgfSk7XG5cbiAgY29uc3QgY29sb3JCcmVha3MgPSBnZXRMZWdlbmRPZlNjYWxlKHtcbiAgICBzY2FsZTogc2NhbGU/LmJ5Wm9vbSA/IHNjYWxlKDApIDogc2NhbGUsXG4gICAgc2NhbGVUeXBlLFxuICAgIGZpZWxkVHlwZTogZmllbGQudHlwZVxuICB9KTtcbiAgcmV0dXJuIGNvbG9yQnJlYWtzVG9Db2xvck1hcChjb2xvckJyZWFrcyk7XG59XG5cbi8qKlxuICogR2V0IHZpc3VhbCBjaGFuZWwgc2NhbGUgZnVuY3Rpb24gaWYgaXQncyBiYXNlZCBvbiB6b29tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaXN1YWxDaGFubmVsU2NhbGVCeVpvb20oe1xuICBzY2FsZSxcbiAgbGF5ZXIsXG4gIG1hcFN0YXRlXG59OiB7XG4gIHNjYWxlOiBEM1NjYWxlRnVuY3Rpb24gfCBudWxsO1xuICBsYXllcjogTGF5ZXI7XG4gIG1hcFN0YXRlPzogTWFwU3RhdGU7XG59KTogRDNTY2FsZUZ1bmN0aW9uIHwgbnVsbCB7XG4gIGlmIChzY2FsZT8uYnlab29tKSB7XG4gICAgY29uc3QgeiA9IGxheWVyLm1ldGE/LmdldFpvb20gPyBsYXllci5tZXRhLmdldFpvb20obWFwU3RhdGUpIDogbWFwU3RhdGU/Lnpvb207XG4gICAgc2NhbGUgPSBOdW1iZXIuaXNGaW5pdGUoeikgPyBzY2FsZSh6KSA6IG51bGw7XG4gIH1cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY29sb3IgYnJlYWtzIFVJIGlucHV0IGludG8gY29sb3JSYW5nZS5jb2xvck1hcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JCcmVha3NUb0NvbG9yTWFwKGNvbG9yQnJlYWtzOiBDb2xvckJyZWFrW10gfCBDb2xvckJyZWFrT3JkaW5hbFtdKTogQ29sb3JNYXAge1xuICBjb25zdCBjb2xvck1hcCA9IGNvbG9yQnJlYWtzLm1hcCgoY29sb3JCcmVhaywgaSkgPT4ge1xuICAgIC8vIFt2YWx1ZSwgaGV4XVxuICAgIHJldHVybiBbXG4gICAgICBjb2xvckJyZWFrLmlucHV0c1xuICAgICAgICA/IGkgPT09IGNvbG9yQnJlYWtzLmxlbmd0aCAtIDFcbiAgICAgICAgICA/IG51bGwgLy8gbGFzdFxuICAgICAgICAgIDogY29sb3JCcmVhay5pbnB1dHNbMV1cbiAgICAgICAgOiBjb2xvckJyZWFrLmxhYmVsLFxuICAgICAgY29sb3JCcmVhay5kYXRhXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gQHRzLWlnbm9yZSB0dXBsZVxuICByZXR1cm4gY29sb3JNYXA7XG59XG5cbi8qKlxuICogQ29udmVydCBjb2xvclJhbmdlLmNvbG9yTWFwIGludG8gY29sb3IgYnJlYWtzIFVJIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvck1hcFRvQ29sb3JCcmVha3MoY29sb3JNYXA/OiBDb2xvck1hcCk6IENvbG9yQnJlYWtbXSB8IG51bGwge1xuICBpZiAoIWNvbG9yTWFwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29sb3JCcmVha3MgPSBjb2xvck1hcC5tYXAoKFt2YWx1ZSwgY29sb3JdLCBpKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPVxuICAgICAgaSA9PT0gMFxuICAgICAgICA/IC8vIGZpcnN0XG4gICAgICAgICAgWy1JbmZpbml0eSwgdmFsdWVdXG4gICAgICAgIDogLy8gbGFzdFxuICAgICAgICBpID09PSBjb2xvck1hcC5sZW5ndGggLSAxXG4gICAgICAgID8gW2NvbG9yTWFwW2kgLSAxXVswXSwgSW5maW5pdHldXG4gICAgICAgIDogLy8gZWxzZVxuICAgICAgICAgIFtjb2xvck1hcFtpIC0gMV1bMF0sIHZhbHVlXTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogY29sb3IsXG4gICAgICByYW5nZSxcbiAgICAgIGlucHV0czogcmFuZ2UsXG4gICAgICBsYWJlbDpcbiAgICAgICAgLy8gZmlyc3RcbiAgICAgICAgaSA9PT0gMFxuICAgICAgICAgID8gYExlc3MgdGhhbiAke3ZhbHVlfWBcbiAgICAgICAgICA6IC8vIGxhc3RcbiAgICAgICAgICBpID09PSBjb2xvck1hcC5sZW5ndGggLSAxXG4gICAgICAgICAgPyBgJHtjb2xvck1hcFtpIC0gMV1bMF19IG9yIG1vcmVgXG4gICAgICAgICAgOiBgJHtjb2xvck1hcFtpIC0gMV1bMF19IHRvICR7dmFsdWV9YFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIEB0cy1pZ25vcmUgaW1wbGVtZW50IGNvbnZlcnNpb24gZm9yIG9yZGluYWxcbiAgcmV0dXJuIGNvbG9yQnJlYWtzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgY29sb3IgYnJlYWtzIGlzIGZvciBudW1lcmljIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNDb2xvckJyZWFrcyhjb2xvckJyZWFrczogdW5rbm93bik6IGNvbG9yQnJlYWtzIGlzIENvbG9yQnJlYWtbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbG9yQnJlYWtzKSAmJiBjb2xvckJyZWFrcy5sZW5ndGggJiYgY29sb3JCcmVha3NbMF0uaW5wdXRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFJQSxJQUFBSyxXQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxVQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFBc0MsU0FBQVMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxD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
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import { TooltipFormat } from '@kepler.gl/constants';
|
2
|
+
import { Field, Millisecond } from '@kepler.gl/types';
|
3
|
+
export declare type FieldFormatter = (value: any) => string;
|
4
|
+
/**
|
5
|
+
* simple getting unique values of an array
|
6
|
+
*
|
7
|
+
* @param values
|
8
|
+
* @returns unique values
|
9
|
+
*/
|
10
|
+
export declare function unique<T>(values: T[]): T[];
|
11
|
+
export declare function getLatLngBounds(points: number[][], idx: number, limit: [number, number]): [number, number] | null;
|
12
|
+
export declare function clamp([min, max]: [number, number], val?: number): number;
|
13
|
+
export declare function getSampleData(data: any, sampleSize?: number, getValue?: (d: any) => any): any[];
|
14
|
+
/**
|
15
|
+
* Convert different time format to unix milliseconds
|
16
|
+
*/
|
17
|
+
export declare function timeToUnixMilli(value: string | number | Date, format: string): Millisecond | null;
|
18
|
+
/**
|
19
|
+
* Whether d is a number, this filtered out NaN as well
|
20
|
+
*/
|
21
|
+
export declare function isNumber(d: unknown): d is number;
|
22
|
+
/**
|
23
|
+
* whether object has property
|
24
|
+
* @param {string} prop
|
25
|
+
* @returns {boolean} - yes or no
|
26
|
+
*/
|
27
|
+
export declare function hasOwnProperty<X extends object, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, unknown>;
|
28
|
+
export declare function numberSort(a: number, b: number): number;
|
29
|
+
export declare function getSortingFunction(fieldType: string): typeof numberSort | undefined;
|
30
|
+
/**
|
31
|
+
* round number with exact number of decimals
|
32
|
+
* return as a string
|
33
|
+
*/
|
34
|
+
export declare function preciseRound(num: number, decimals: number): string;
|
35
|
+
/**
|
36
|
+
* round a giving number at most 4 decimal places
|
37
|
+
* e.g. 10 -> 10, 1.12345 -> 1.2345, 2.0 -> 2
|
38
|
+
*/
|
39
|
+
export declare function roundToFour(num: number): number;
|
40
|
+
/**
|
41
|
+
* get number of decimals to round to for slider from step
|
42
|
+
* @param step
|
43
|
+
* @returns- number of decimal
|
44
|
+
*/
|
45
|
+
export declare function getRoundingDecimalFromStep(step: number): number;
|
46
|
+
/**
|
47
|
+
* If marks is provided, snap to marks, if not normalize to step
|
48
|
+
* @param val
|
49
|
+
* @param minValue
|
50
|
+
* @param step
|
51
|
+
* @param marks
|
52
|
+
*/
|
53
|
+
export declare function normalizeSliderValue(val: number, minValue: number, step: number, marks?: number[] | null): number;
|
54
|
+
/**
|
55
|
+
* round the value to step for the slider
|
56
|
+
* @param minValue
|
57
|
+
* @param step
|
58
|
+
* @param val
|
59
|
+
* @returns - rounded number
|
60
|
+
*/
|
61
|
+
export declare function roundValToStep(minValue: number, step: number, val: number): number;
|
62
|
+
/**
|
63
|
+
* Get the value format based on field and format options
|
64
|
+
* Used in render tooltip value
|
65
|
+
*/
|
66
|
+
export declare const defaultFormatter: FieldFormatter;
|
67
|
+
export declare const floatFormatter: (v: any) => string;
|
68
|
+
export declare const FIELD_DISPLAY_FORMAT: {
|
69
|
+
[key: string]: FieldFormatter;
|
70
|
+
};
|
71
|
+
/**
|
72
|
+
* Parse field value and type and return a string representation
|
73
|
+
*/
|
74
|
+
export declare const parseFieldValue: (value: any, type: string) => string;
|
75
|
+
/**
|
76
|
+
* Get the value format based on field and format options
|
77
|
+
* Used in render tooltip value
|
78
|
+
* @param format
|
79
|
+
* @param field
|
80
|
+
*/
|
81
|
+
export declare function getFormatter(format: string | Record<string, string> | null, field?: Field): FieldFormatter;
|
82
|
+
export declare function getColumnFormatter(field: Pick<Field, 'type'> & Partial<Pick<Field, 'format' | 'displayFormat'>>): FieldFormatter;
|
83
|
+
export declare function applyValueMap(format: any): (v: any) => any;
|
84
|
+
export declare function applyDefaultFormat(tooltipFormat: TooltipFormat): (v: any) => string;
|
85
|
+
export declare function getBooleanFormatter(format: string): FieldFormatter;
|
86
|
+
export declare function applyCustomFormat(format: any, field: {
|
87
|
+
type?: string;
|
88
|
+
}): FieldFormatter;
|
89
|
+
export declare function formatNumber(n: number, type?: string): string;
|
90
|
+
/**
|
91
|
+
* Convert a formatted number from string back to number
|
92
|
+
*/
|
93
|
+
export declare function reverseFormatNumber(str: string): number;
|
94
|
+
/**
|
95
|
+
* Format epoch milliseconds with a format string
|
96
|
+
* @type timezone
|
97
|
+
*/
|
98
|
+
export declare function datetimeFormatter(timezone?: string | null): (format?: string) => (ts: number) => string;
|