@kepler.gl/deckgl-layers 3.3.0-alpha.5 → 3.3.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
- package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
- package/dist/cjs/3d-building-layer/types.js +6 -0
- package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
- package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
- package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
- package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
- package/dist/cjs/globe/atmosphere-layer.js +220 -0
- package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
- package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
- package/dist/cjs/globe/globe-layers.js +569 -0
- package/dist/cjs/globe/globe-stars-layer.js +69 -0
- package/dist/cjs/globe/globe-view.js +407 -0
- package/dist/{globe → cjs/globe}/index.js +1 -1
- package/dist/cjs/globe/mvt-label-layer.js +190 -0
- package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
- package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
- package/dist/cjs/layer-utils/cluster-utils.js +93 -0
- package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
- package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
- package/dist/cjs/layer-utils/shader-utils.js +38 -0
- package/dist/cjs/line-layer/line-layer.js +95 -0
- package/dist/cjs/raster/images.js +271 -0
- package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
- package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
- package/dist/cjs/raster/raster-mesh-layer/matrix.js +18 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
- package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
- package/dist/cjs/raster/types.js +6 -0
- package/dist/cjs/raster/util.js +139 -0
- package/dist/cjs/raster/webgl/color/colormap.js +45 -0
- package/dist/cjs/raster/webgl/color/filter.js +58 -0
- package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
- package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
- package/dist/cjs/raster/webgl/color/saturation.js +42 -0
- package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
- package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
- package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
- package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
- package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
- package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
- package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
- package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
- package/dist/cjs/raster/webgl/texture/mask.js +50 -0
- package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
- package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
- package/dist/cjs/raster/webgl/types.js +6 -0
- package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
- package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
- package/dist/cjs/wms/wms-layer.js +624 -0
- package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
- package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
- package/dist/esm/3d-building-layer/types.js +3 -0
- package/dist/esm/cluster-layer/cluster-layer.js +286 -0
- package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
- package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
- package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
- package/dist/esm/globe/atmosphere-layer.js +214 -0
- package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
- package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
- package/dist/esm/globe/globe-layers.js +561 -0
- package/dist/esm/globe/globe-stars-layer.js +63 -0
- package/dist/esm/globe/globe-view.js +401 -0
- package/dist/esm/globe/index.js +26 -0
- package/dist/esm/globe/mvt-label-layer.js +187 -0
- package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
- package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/layer-utils/aggregation-utils.js +172 -0
- package/dist/esm/layer-utils/cluster-utils.js +86 -0
- package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
- package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
- package/dist/esm/layer-utils/shader-utils.js +32 -0
- package/dist/esm/line-layer/line-layer.js +91 -0
- package/dist/esm/raster/images.js +267 -0
- package/dist/esm/raster/pipeline-validation-patch.js +94 -0
- package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
- package/dist/esm/raster/raster-mesh-layer/matrix.js +12 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
- package/dist/esm/raster/raster-processing-uniforms.js +118 -0
- package/dist/esm/raster/types.js +3 -0
- package/dist/esm/raster/util.js +134 -0
- package/dist/esm/raster/webgl/color/colormap.js +39 -0
- package/dist/esm/raster/webgl/color/filter.js +52 -0
- package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
- package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
- package/dist/esm/raster/webgl/color/saturation.js +36 -0
- package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
- package/dist/esm/raster/webgl/index.js +26 -0
- package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
- package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
- package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
- package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
- package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
- package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
- package/dist/esm/raster/webgl/texture/mask.js +44 -0
- package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
- package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
- package/dist/esm/raster/webgl/types.js +3 -0
- package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
- package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
- package/dist/esm/wms/wms-layer.js +619 -0
- package/dist/wms/wms-layer.d.ts +8 -0
- package/package.json +17 -8
- package/dist/3d-building-layer/3d-building-layer.js +0 -66
- package/dist/3d-building-layer/3d-building-utils.js +0 -166
- package/dist/3d-building-layer/types.js +0 -6
- package/dist/cluster-layer/cluster-layer.js +0 -292
- package/dist/column-layer/enhanced-column-layer.js +0 -160
- package/dist/deckgl-extensions/filter-shader-module.js +0 -26
- package/dist/globe/atmosphere-layer.js +0 -220
- package/dist/globe/enhanced-multi-icon-layer.js +0 -63
- package/dist/globe/globe-depth-disk-layer.js +0 -145
- package/dist/globe/globe-layers.js +0 -569
- package/dist/globe/globe-stars-layer.js +0 -69
- package/dist/globe/globe-view.js +0 -404
- package/dist/globe/mvt-label-layer.js +0 -190
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
- package/dist/layer-utils/aggregation-utils.js +0 -181
- package/dist/layer-utils/cluster-utils.js +0 -93
- package/dist/layer-utils/cpu-aggregator.js +0 -798
- package/dist/layer-utils/globe-cell-utils.js +0 -173
- package/dist/layer-utils/shader-utils.js +0 -38
- package/dist/line-layer/line-layer.js +0 -95
- package/dist/raster/images.js +0 -271
- package/dist/raster/pipeline-validation-patch.js +0 -101
- package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
- package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer.js +0 -287
- package/dist/raster/raster-mesh-layer/matrix.js +0 -18
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -321
- package/dist/raster/raster-processing-uniforms.js +0 -124
- package/dist/raster/types.js +0 -6
- package/dist/raster/util.js +0 -139
- package/dist/raster/webgl/color/colormap.js +0 -45
- package/dist/raster/webgl/color/filter.js +0 -58
- package/dist/raster/webgl/color/gamma-contrast.js +0 -68
- package/dist/raster/webgl/color/linear-rescale.js +0 -35
- package/dist/raster/webgl/color/saturation.js +0 -42
- package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
- package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
- package/dist/raster/webgl/spectral-indices/evi.js +0 -26
- package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
- package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
- package/dist/raster/webgl/spectral-indices/savi.js +0 -21
- package/dist/raster/webgl/texture/combine-bands.js +0 -65
- package/dist/raster/webgl/texture/mask.js +0 -50
- package/dist/raster/webgl/texture/reorder-bands.js +0 -72
- package/dist/raster/webgl/texture/rgba-image.js +0 -34
- package/dist/raster/webgl/types.js +0 -6
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
- package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
- package/dist/wms/wms-layer.js +0 -594
|
@@ -1,798 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports["default"] = exports.DECK_AGGREGATION_MAP = void 0;
|
|
8
|
-
exports.getAggregatedData = getAggregatedData;
|
|
9
|
-
exports.getDimensionScale = getDimensionScale;
|
|
10
|
-
exports.getDimensionSortedBins = getDimensionSortedBins;
|
|
11
|
-
exports.getDimensionValueDomain = getDimensionValueDomain;
|
|
12
|
-
exports.getGetValue = getGetValue;
|
|
13
|
-
exports.getScaleFunctor = getScaleFunctor;
|
|
14
|
-
exports.getValueFunc = getValueFunc;
|
|
15
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
16
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
17
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
18
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
20
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
21
|
-
var _window = require("global/window");
|
|
22
|
-
var _utils = require("@kepler.gl/utils");
|
|
23
|
-
var _constants = require("@kepler.gl/constants");
|
|
24
|
-
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; }
|
|
25
|
-
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; }
|
|
26
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
27
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
28
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
|
|
29
|
-
// Copyright contributors to the kepler.gl project
|
|
30
|
-
/* eslint-disable guard-for-in */
|
|
31
|
-
var AGGREGATION_OPERATION = {
|
|
32
|
-
SUM: 'SUM',
|
|
33
|
-
MEAN: 'MEAN',
|
|
34
|
-
MIN: 'MIN',
|
|
35
|
-
MAX: 'MAX',
|
|
36
|
-
COUNT: 'COUNT'
|
|
37
|
-
};
|
|
38
|
-
var MAX_32_BIT_FLOAT = 3.402823466e38;
|
|
39
|
-
var defaultGetValue = function defaultGetValue(points) {
|
|
40
|
-
return points.length;
|
|
41
|
-
};
|
|
42
|
-
var defaultGetPoints = function defaultGetPoints(bin) {
|
|
43
|
-
return bin.points;
|
|
44
|
-
};
|
|
45
|
-
var defaultGetIndex = function defaultGetIndex(bin) {
|
|
46
|
-
return bin.index;
|
|
47
|
-
};
|
|
48
|
-
var ascending = function ascending(a, b) {
|
|
49
|
-
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
|
|
50
|
-
};
|
|
51
|
-
function clamp(value, min, max) {
|
|
52
|
-
return Math.max(min, Math.min(max, value));
|
|
53
|
-
}
|
|
54
|
-
function getQuantileDomain(data, valueAccessor) {
|
|
55
|
-
return data.map(valueAccessor).sort(ascending);
|
|
56
|
-
}
|
|
57
|
-
function getOrdinalDomain(data, valueAccessor) {
|
|
58
|
-
return (0, _toConsumableArray2["default"])(new Set(data.map(valueAccessor)));
|
|
59
|
-
}
|
|
60
|
-
var BinSorter = /*#__PURE__*/function () {
|
|
61
|
-
function BinSorter() {
|
|
62
|
-
var bins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
63
|
-
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
64
|
-
(0, _classCallCheck2["default"])(this, BinSorter);
|
|
65
|
-
(0, _defineProperty2["default"])(this, "maxCount", void 0);
|
|
66
|
-
(0, _defineProperty2["default"])(this, "maxValue", void 0);
|
|
67
|
-
(0, _defineProperty2["default"])(this, "minValue", void 0);
|
|
68
|
-
(0, _defineProperty2["default"])(this, "totalCount", void 0);
|
|
69
|
-
(0, _defineProperty2["default"])(this, "aggregatedBins", void 0);
|
|
70
|
-
(0, _defineProperty2["default"])(this, "sortedBins", void 0);
|
|
71
|
-
(0, _defineProperty2["default"])(this, "binMap", void 0);
|
|
72
|
-
this.aggregatedBins = this._getAggregatedBins(bins, props);
|
|
73
|
-
this._updateMinMaxValues();
|
|
74
|
-
this.binMap = this._getBinMap();
|
|
75
|
-
}
|
|
76
|
-
return (0, _createClass2["default"])(BinSorter, [{
|
|
77
|
-
key: "_getAggregatedBins",
|
|
78
|
-
value: function _getAggregatedBins(bins, props) {
|
|
79
|
-
var _props$getValue = props.getValue,
|
|
80
|
-
getValue = _props$getValue === void 0 ? defaultGetValue : _props$getValue,
|
|
81
|
-
_props$getPoints = props.getPoints,
|
|
82
|
-
getPoints = _props$getPoints === void 0 ? defaultGetPoints : _props$getPoints,
|
|
83
|
-
_props$getIndex = props.getIndex,
|
|
84
|
-
getIndex = _props$getIndex === void 0 ? defaultGetIndex : _props$getIndex,
|
|
85
|
-
filterData = props.filterData;
|
|
86
|
-
var hasFilter = typeof filterData === 'function';
|
|
87
|
-
var aggregatedBins = [];
|
|
88
|
-
var index = 0;
|
|
89
|
-
for (var binIndex = 0; binIndex < bins.length; binIndex++) {
|
|
90
|
-
var bin = bins[binIndex];
|
|
91
|
-
var points = getPoints(bin);
|
|
92
|
-
var i = getIndex(bin);
|
|
93
|
-
var filteredPoints = hasFilter ? points.filter(filterData) : points;
|
|
94
|
-
bin.filteredPoints = hasFilter ? filteredPoints : null;
|
|
95
|
-
var value = filteredPoints.length ? getValue(filteredPoints) : null;
|
|
96
|
-
if (value !== null && value !== undefined) {
|
|
97
|
-
aggregatedBins[index] = {
|
|
98
|
-
i: Number.isFinite(i) ? i : binIndex,
|
|
99
|
-
value: value,
|
|
100
|
-
counts: filteredPoints.length
|
|
101
|
-
};
|
|
102
|
-
index++;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return aggregatedBins;
|
|
106
|
-
}
|
|
107
|
-
}, {
|
|
108
|
-
key: "_updateMinMaxValues",
|
|
109
|
-
value: function _updateMinMaxValues() {
|
|
110
|
-
var maxCount = 0;
|
|
111
|
-
var maxValue = -MAX_32_BIT_FLOAT;
|
|
112
|
-
var minValue = MAX_32_BIT_FLOAT;
|
|
113
|
-
var totalCount = 0;
|
|
114
|
-
var _iterator = _createForOfIteratorHelper(this.aggregatedBins),
|
|
115
|
-
_step;
|
|
116
|
-
try {
|
|
117
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
118
|
-
var x = _step.value;
|
|
119
|
-
maxCount = maxCount > x.counts ? maxCount : x.counts;
|
|
120
|
-
maxValue = maxValue > x.value ? maxValue : x.value;
|
|
121
|
-
minValue = minValue < x.value ? minValue : x.value;
|
|
122
|
-
totalCount += x.counts;
|
|
123
|
-
}
|
|
124
|
-
} catch (err) {
|
|
125
|
-
_iterator.e(err);
|
|
126
|
-
} finally {
|
|
127
|
-
_iterator.f();
|
|
128
|
-
}
|
|
129
|
-
if (this.aggregatedBins.length === 0) {
|
|
130
|
-
maxValue = 0;
|
|
131
|
-
minValue = 0;
|
|
132
|
-
}
|
|
133
|
-
this.maxCount = maxCount;
|
|
134
|
-
this.maxValue = maxValue;
|
|
135
|
-
this.minValue = minValue;
|
|
136
|
-
this.totalCount = totalCount;
|
|
137
|
-
}
|
|
138
|
-
}, {
|
|
139
|
-
key: "_getBinMap",
|
|
140
|
-
value: function _getBinMap() {
|
|
141
|
-
var binMap = {};
|
|
142
|
-
var _iterator2 = _createForOfIteratorHelper(this.aggregatedBins),
|
|
143
|
-
_step2;
|
|
144
|
-
try {
|
|
145
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
146
|
-
var bin = _step2.value;
|
|
147
|
-
binMap[bin.i] = bin;
|
|
148
|
-
}
|
|
149
|
-
} catch (err) {
|
|
150
|
-
_iterator2.e(err);
|
|
151
|
-
} finally {
|
|
152
|
-
_iterator2.f();
|
|
153
|
-
}
|
|
154
|
-
return binMap;
|
|
155
|
-
}
|
|
156
|
-
}, {
|
|
157
|
-
key: "_percentileToIndex",
|
|
158
|
-
value: function _percentileToIndex(percentileRange) {
|
|
159
|
-
var len = this.sortedBins.length;
|
|
160
|
-
if (len < 2) return [0, 0];
|
|
161
|
-
var _percentileRange$map = percentileRange.map(function (n) {
|
|
162
|
-
return clamp(n, 0, 100);
|
|
163
|
-
}),
|
|
164
|
-
_percentileRange$map2 = (0, _slicedToArray2["default"])(_percentileRange$map, 2),
|
|
165
|
-
lower = _percentileRange$map2[0],
|
|
166
|
-
upper = _percentileRange$map2[1];
|
|
167
|
-
return [Math.ceil(lower / 100 * (len - 1)), Math.floor(upper / 100 * (len - 1))];
|
|
168
|
-
}
|
|
169
|
-
}, {
|
|
170
|
-
key: "getValueDomainByScale",
|
|
171
|
-
value: function getValueDomainByScale(scale) {
|
|
172
|
-
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [],
|
|
173
|
-
_ref2 = (0, _slicedToArray2["default"])(_ref, 2),
|
|
174
|
-
_ref2$ = _ref2[0],
|
|
175
|
-
lower = _ref2$ === void 0 ? 0 : _ref2$,
|
|
176
|
-
_ref2$2 = _ref2[1],
|
|
177
|
-
upper = _ref2$2 === void 0 ? 100 : _ref2$2;
|
|
178
|
-
if (!this.sortedBins) {
|
|
179
|
-
this.sortedBins = this.aggregatedBins.sort(function (a, b) {
|
|
180
|
-
return ascending(a.value, b.value);
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
if (!this.sortedBins.length) return [];
|
|
184
|
-
var indexEdge = this._percentileToIndex([lower, upper]);
|
|
185
|
-
return this._getScaleDomain(scale, indexEdge);
|
|
186
|
-
}
|
|
187
|
-
}, {
|
|
188
|
-
key: "_getScaleDomain",
|
|
189
|
-
value: function _getScaleDomain(scaleType, _ref3) {
|
|
190
|
-
var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
|
|
191
|
-
lowerIdx = _ref4[0],
|
|
192
|
-
upperIdx = _ref4[1];
|
|
193
|
-
var bins = this.sortedBins;
|
|
194
|
-
switch (scaleType) {
|
|
195
|
-
case 'quantize':
|
|
196
|
-
case 'linear':
|
|
197
|
-
return [bins[lowerIdx].value, bins[upperIdx].value];
|
|
198
|
-
case 'quantile':
|
|
199
|
-
return getQuantileDomain(bins.slice(lowerIdx, upperIdx + 1), function (d) {
|
|
200
|
-
return d.value;
|
|
201
|
-
});
|
|
202
|
-
case 'ordinal':
|
|
203
|
-
return getOrdinalDomain(bins, function (d) {
|
|
204
|
-
return d.value;
|
|
205
|
-
});
|
|
206
|
-
default:
|
|
207
|
-
return [bins[lowerIdx].value, bins[upperIdx].value];
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}, {
|
|
211
|
-
key: "getValueRange",
|
|
212
|
-
value: function getValueRange(percentileRange) {
|
|
213
|
-
if (!this.sortedBins) {
|
|
214
|
-
this.sortedBins = this.aggregatedBins.sort(function (a, b) {
|
|
215
|
-
return ascending(a.value, b.value);
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
if (!this.sortedBins.length) return [];
|
|
219
|
-
var lowerIdx = 0;
|
|
220
|
-
var upperIdx = this.sortedBins.length - 1;
|
|
221
|
-
if (Array.isArray(percentileRange)) {
|
|
222
|
-
var idxRange = this._percentileToIndex(percentileRange);
|
|
223
|
-
lowerIdx = idxRange[0];
|
|
224
|
-
upperIdx = idxRange[1];
|
|
225
|
-
}
|
|
226
|
-
return [this.sortedBins[lowerIdx].value, this.sortedBins[upperIdx].value];
|
|
227
|
-
}
|
|
228
|
-
}]);
|
|
229
|
-
}();
|
|
230
|
-
var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, AGGREGATION_OPERATION.SUM, _constants.AGGREGATION_TYPES.sum), AGGREGATION_OPERATION.MEAN, _constants.AGGREGATION_TYPES.average), AGGREGATION_OPERATION.MIN, _constants.AGGREGATION_TYPES.minimum), AGGREGATION_OPERATION.MAX, _constants.AGGREGATION_TYPES.maximum);
|
|
231
|
-
function getValueFunc(aggregation, accessor) {
|
|
232
|
-
if (!aggregation || !AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
|
|
233
|
-
_window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
|
|
234
|
-
}
|
|
235
|
-
var op = AGGREGATION_OPERATION[aggregation.toUpperCase()] || AGGREGATION_OPERATION.SUM;
|
|
236
|
-
var keplerOp = DECK_AGGREGATION_MAP[op];
|
|
237
|
-
return function (pts) {
|
|
238
|
-
return (0, _utils.aggregate)(pts.map(accessor), keplerOp);
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
function getScaleFunctor(scaleType) {
|
|
242
|
-
if (!scaleType || !_constants.SCALE_FUNC[scaleType]) {
|
|
243
|
-
_window.console.warn("Scale ".concat(scaleType, " is not supported"));
|
|
244
|
-
}
|
|
245
|
-
return _constants.SCALE_FUNC[scaleType] || _constants.SCALE_FUNC.quantize;
|
|
246
|
-
}
|
|
247
|
-
function nop() {
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
function getGetValue(step, props, dimensionUpdater) {
|
|
251
|
-
var key = dimensionUpdater.key;
|
|
252
|
-
var _step$triggers = step.triggers,
|
|
253
|
-
value = _step$triggers.value,
|
|
254
|
-
weight = _step$triggers.weight,
|
|
255
|
-
aggregation = _step$triggers.aggregation;
|
|
256
|
-
var getValue = props[value.prop];
|
|
257
|
-
if (getValue === null) {
|
|
258
|
-
// If `getValue` is not provided from props, build it with aggregation and weight.
|
|
259
|
-
getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
|
|
260
|
-
}
|
|
261
|
-
if (getValue) {
|
|
262
|
-
this._setDimensionState(key, {
|
|
263
|
-
getValue: getValue
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
function getDimensionSortedBins(step, props, dimensionUpdater) {
|
|
268
|
-
var key = dimensionUpdater.key;
|
|
269
|
-
var getValue = this.state.dimensions[key].getValue;
|
|
270
|
-
var sortedBins = new BinSorter(this.state.layerData.data || [], {
|
|
271
|
-
getValue: getValue,
|
|
272
|
-
filterData: props._filterData
|
|
273
|
-
});
|
|
274
|
-
this._setDimensionState(key, {
|
|
275
|
-
sortedBins: sortedBins
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
function getDimensionValueDomain(step, props, dimensionUpdater) {
|
|
279
|
-
var key = dimensionUpdater.key;
|
|
280
|
-
var _step$triggers2 = step.triggers,
|
|
281
|
-
lowerPercentile = _step$triggers2.lowerPercentile,
|
|
282
|
-
upperPercentile = _step$triggers2.upperPercentile,
|
|
283
|
-
scaleType = _step$triggers2.scaleType;
|
|
284
|
-
if (!this.state.dimensions[key].sortedBins) {
|
|
285
|
-
// the previous step should set sortedBins, if not, something went wrong
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
var valueDomain =
|
|
289
|
-
// for log and sqrt scale, returns linear domain by default
|
|
290
|
-
// TODO: support other scale function domain in bin sorter
|
|
291
|
-
this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
|
|
292
|
-
if (props.colorScaleType === 'custom' && props.colorMap) {
|
|
293
|
-
// for custom scale, return custom breaks as value domain directly
|
|
294
|
-
valueDomain = props.colorMap.reduce(function (prev, cur) {
|
|
295
|
-
return Number.isFinite(cur[0]) ? prev.concat(cur[0]) : prev;
|
|
296
|
-
}, []);
|
|
297
|
-
}
|
|
298
|
-
this._setDimensionState(key, {
|
|
299
|
-
valueDomain: valueDomain
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
function getDimensionScale(step, props, dimensionUpdater) {
|
|
303
|
-
var key = dimensionUpdater.key;
|
|
304
|
-
var _step$triggers3 = step.triggers,
|
|
305
|
-
domain = _step$triggers3.domain,
|
|
306
|
-
range = _step$triggers3.range,
|
|
307
|
-
scaleType = _step$triggers3.scaleType,
|
|
308
|
-
fixed = _step$triggers3.fixed;
|
|
309
|
-
var onSet = step.onSet;
|
|
310
|
-
if (!this.state.dimensions[key].valueDomain) {
|
|
311
|
-
// the previous step should set valueDomain, if not, something went wrong
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
var dimensionRange = props[range.prop];
|
|
315
|
-
var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
|
|
316
|
-
var dimensionFixed = Boolean(fixed && props[fixed.prop]);
|
|
317
|
-
var scaleFunctor = getScaleFunctor(scaleType && props[scaleType.prop])();
|
|
318
|
-
var scaleFunc = scaleFunctor.domain(dimensionDomain).range(dimensionFixed ? dimensionDomain : dimensionRange);
|
|
319
|
-
scaleFunc.scaleType = props.colorScaleType;
|
|
320
|
-
if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
|
|
321
|
-
var sortedBins = this.state.dimensions[key].sortedBins;
|
|
322
|
-
if (sortedBins) {
|
|
323
|
-
props[onSet.props]({
|
|
324
|
-
domain: scaleFunc.domain(),
|
|
325
|
-
aggregatedBins: sortedBins.binMap
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
this._setDimensionState(key, {
|
|
330
|
-
scaleFunc: scaleFunc
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
function normalizeResult() {
|
|
334
|
-
var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
335
|
-
// support previous hexagonAggregator API
|
|
336
|
-
if (result.hexagons) {
|
|
337
|
-
return Object.assign({
|
|
338
|
-
data: result.hexagons
|
|
339
|
-
}, result);
|
|
340
|
-
} else if (result.layerData) {
|
|
341
|
-
return Object.assign({
|
|
342
|
-
data: result.layerData
|
|
343
|
-
}, result);
|
|
344
|
-
}
|
|
345
|
-
return result;
|
|
346
|
-
}
|
|
347
|
-
function getAggregatedData(step, props, aggregation, aggregationParams) {
|
|
348
|
-
var aggr = step.triggers.aggregator;
|
|
349
|
-
var aggregator = props[aggr.prop];
|
|
350
|
-
|
|
351
|
-
// result should contain a data array and other props
|
|
352
|
-
// result = {data: [], ...other props}
|
|
353
|
-
var result = aggregator(props, aggregationParams);
|
|
354
|
-
this.setState({
|
|
355
|
-
layerData: normalizeResult(result)
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
var defaultAggregation = exports.defaultAggregation = {
|
|
359
|
-
key: 'position',
|
|
360
|
-
updateSteps: [{
|
|
361
|
-
key: 'aggregate',
|
|
362
|
-
triggers: {
|
|
363
|
-
cellSize: {
|
|
364
|
-
prop: 'cellSize'
|
|
365
|
-
},
|
|
366
|
-
position: {
|
|
367
|
-
prop: 'getPosition',
|
|
368
|
-
updateTrigger: 'getPosition'
|
|
369
|
-
},
|
|
370
|
-
aggregator: {
|
|
371
|
-
prop: 'gridAggregator'
|
|
372
|
-
}
|
|
373
|
-
},
|
|
374
|
-
updater: getAggregatedData
|
|
375
|
-
}]
|
|
376
|
-
};
|
|
377
|
-
function getSubLayerAccessor(dimensionState, dimension) {
|
|
378
|
-
return function (cell) {
|
|
379
|
-
var sortedBins = dimensionState.sortedBins,
|
|
380
|
-
scaleFunc = dimensionState.scaleFunc;
|
|
381
|
-
var bin = sortedBins.binMap[cell.index];
|
|
382
|
-
if (bin && bin.counts === 0) {
|
|
383
|
-
// no points left in bin after filtering
|
|
384
|
-
return dimension.nullValue;
|
|
385
|
-
}
|
|
386
|
-
var cv = bin && bin.value;
|
|
387
|
-
var domain = scaleFunc.domain();
|
|
388
|
-
var isValueInDomain = scaleFunc.scaleType === 'custom' ? cv >= sortedBins.minValue && cv <= sortedBins.maxValue : cv >= domain[0] && cv <= domain[domain.length - 1];
|
|
389
|
-
|
|
390
|
-
// if cell value is outside domain, set alpha to 0
|
|
391
|
-
return isValueInDomain ? scaleFunc(cv) : dimension.nullValue;
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
var defaultColorDimension = exports.defaultColorDimension = {
|
|
395
|
-
key: 'fillColor',
|
|
396
|
-
accessor: 'getFillColor',
|
|
397
|
-
getPickingInfo: function getPickingInfo(dimensionState, cell) {
|
|
398
|
-
if (!cell) {
|
|
399
|
-
return {};
|
|
400
|
-
}
|
|
401
|
-
var sortedBins = dimensionState.sortedBins;
|
|
402
|
-
var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
|
|
403
|
-
return {
|
|
404
|
-
colorValue: colorValue
|
|
405
|
-
};
|
|
406
|
-
},
|
|
407
|
-
nullValue: [0, 0, 0, 0],
|
|
408
|
-
updateSteps: [{
|
|
409
|
-
key: 'getValue',
|
|
410
|
-
triggers: {
|
|
411
|
-
value: {
|
|
412
|
-
prop: 'getColorValue',
|
|
413
|
-
updateTrigger: 'getColorValue'
|
|
414
|
-
},
|
|
415
|
-
weight: {
|
|
416
|
-
prop: 'getColorWeight',
|
|
417
|
-
updateTrigger: 'getColorWeight'
|
|
418
|
-
},
|
|
419
|
-
aggregation: {
|
|
420
|
-
prop: 'colorAggregation'
|
|
421
|
-
}
|
|
422
|
-
},
|
|
423
|
-
updater: getGetValue
|
|
424
|
-
}, {
|
|
425
|
-
key: 'getBins',
|
|
426
|
-
triggers: {
|
|
427
|
-
_filterData: {
|
|
428
|
-
prop: '_filterData',
|
|
429
|
-
updateTrigger: '_filterData'
|
|
430
|
-
}
|
|
431
|
-
},
|
|
432
|
-
updater: getDimensionSortedBins
|
|
433
|
-
}, {
|
|
434
|
-
key: 'getDomain',
|
|
435
|
-
triggers: {
|
|
436
|
-
lowerPercentile: {
|
|
437
|
-
prop: 'lowerPercentile'
|
|
438
|
-
},
|
|
439
|
-
upperPercentile: {
|
|
440
|
-
prop: 'upperPercentile'
|
|
441
|
-
},
|
|
442
|
-
scaleType: {
|
|
443
|
-
prop: 'colorScaleType'
|
|
444
|
-
}
|
|
445
|
-
},
|
|
446
|
-
updater: getDimensionValueDomain
|
|
447
|
-
}, {
|
|
448
|
-
key: 'getScaleFunc',
|
|
449
|
-
triggers: {
|
|
450
|
-
domain: {
|
|
451
|
-
prop: 'colorDomain'
|
|
452
|
-
},
|
|
453
|
-
range: {
|
|
454
|
-
prop: 'colorRange'
|
|
455
|
-
},
|
|
456
|
-
scaleType: {
|
|
457
|
-
prop: 'colorScaleType'
|
|
458
|
-
}
|
|
459
|
-
},
|
|
460
|
-
onSet: {
|
|
461
|
-
props: 'onSetColorDomain'
|
|
462
|
-
},
|
|
463
|
-
updater: getDimensionScale
|
|
464
|
-
}],
|
|
465
|
-
getSubLayerAccessor: getSubLayerAccessor
|
|
466
|
-
};
|
|
467
|
-
var defaultElevationDimension = exports.defaultElevationDimension = {
|
|
468
|
-
key: 'elevation',
|
|
469
|
-
accessor: 'getElevation',
|
|
470
|
-
getPickingInfo: function getPickingInfo(dimensionState, cell) {
|
|
471
|
-
if (!cell) {
|
|
472
|
-
return {};
|
|
473
|
-
}
|
|
474
|
-
var sortedBins = dimensionState.sortedBins;
|
|
475
|
-
var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
|
|
476
|
-
return {
|
|
477
|
-
elevationValue: elevationValue
|
|
478
|
-
};
|
|
479
|
-
},
|
|
480
|
-
nullValue: -1,
|
|
481
|
-
updateSteps: [{
|
|
482
|
-
key: 'getValue',
|
|
483
|
-
triggers: {
|
|
484
|
-
value: {
|
|
485
|
-
prop: 'getElevationValue',
|
|
486
|
-
updateTrigger: 'getElevationValue'
|
|
487
|
-
},
|
|
488
|
-
weight: {
|
|
489
|
-
prop: 'getElevationWeight',
|
|
490
|
-
updateTrigger: 'getElevationWeight'
|
|
491
|
-
},
|
|
492
|
-
aggregation: {
|
|
493
|
-
prop: 'elevationAggregation'
|
|
494
|
-
}
|
|
495
|
-
},
|
|
496
|
-
updater: getGetValue
|
|
497
|
-
}, {
|
|
498
|
-
key: 'getBins',
|
|
499
|
-
triggers: {
|
|
500
|
-
_filterData: {
|
|
501
|
-
prop: '_filterData',
|
|
502
|
-
updateTrigger: '_filterData'
|
|
503
|
-
}
|
|
504
|
-
},
|
|
505
|
-
updater: getDimensionSortedBins
|
|
506
|
-
}, {
|
|
507
|
-
key: 'getDomain',
|
|
508
|
-
triggers: {
|
|
509
|
-
lowerPercentile: {
|
|
510
|
-
prop: 'elevationLowerPercentile'
|
|
511
|
-
},
|
|
512
|
-
upperPercentile: {
|
|
513
|
-
prop: 'elevationUpperPercentile'
|
|
514
|
-
},
|
|
515
|
-
scaleType: {
|
|
516
|
-
prop: 'elevationScaleType'
|
|
517
|
-
}
|
|
518
|
-
},
|
|
519
|
-
updater: getDimensionValueDomain
|
|
520
|
-
}, {
|
|
521
|
-
key: 'getScaleFunc',
|
|
522
|
-
triggers: {
|
|
523
|
-
fixed: {
|
|
524
|
-
prop: 'elevationFixed'
|
|
525
|
-
},
|
|
526
|
-
domain: {
|
|
527
|
-
prop: 'elevationDomain'
|
|
528
|
-
},
|
|
529
|
-
range: {
|
|
530
|
-
prop: 'elevationRange'
|
|
531
|
-
},
|
|
532
|
-
scaleType: {
|
|
533
|
-
prop: 'elevationScaleType'
|
|
534
|
-
}
|
|
535
|
-
},
|
|
536
|
-
onSet: {
|
|
537
|
-
props: 'onSetElevationDomain'
|
|
538
|
-
},
|
|
539
|
-
updater: getDimensionScale
|
|
540
|
-
}],
|
|
541
|
-
getSubLayerAccessor: getSubLayerAccessor
|
|
542
|
-
};
|
|
543
|
-
var _defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
|
|
544
|
-
var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
545
|
-
function CPUAggregator() {
|
|
546
|
-
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
547
|
-
(0, _classCallCheck2["default"])(this, CPUAggregator);
|
|
548
|
-
(0, _defineProperty2["default"])(this, "state", void 0);
|
|
549
|
-
(0, _defineProperty2["default"])(this, "dimensionUpdaters", void 0);
|
|
550
|
-
(0, _defineProperty2["default"])(this, "aggregationUpdater", void 0);
|
|
551
|
-
this.state = _objectSpread({
|
|
552
|
-
layerData: {},
|
|
553
|
-
dimensions: {
|
|
554
|
-
// color: {
|
|
555
|
-
// getValue: null,
|
|
556
|
-
// domain: null,
|
|
557
|
-
// sortedBins: null,
|
|
558
|
-
// scaleFunc: nop
|
|
559
|
-
// },
|
|
560
|
-
// elevation: {
|
|
561
|
-
// getValue: null,
|
|
562
|
-
// domain: null,
|
|
563
|
-
// sortedBins: null,
|
|
564
|
-
// scaleFunc: nop
|
|
565
|
-
// }
|
|
566
|
-
}
|
|
567
|
-
}, opts.initialState);
|
|
568
|
-
this.dimensionUpdaters = {};
|
|
569
|
-
this.aggregationUpdater = opts.aggregation || defaultAggregation;
|
|
570
|
-
this._addDimension(opts.dimensions || _defaultDimensions);
|
|
571
|
-
}
|
|
572
|
-
return (0, _createClass2["default"])(CPUAggregator, [{
|
|
573
|
-
key: "updateAllDimensions",
|
|
574
|
-
value: function updateAllDimensions(props) {
|
|
575
|
-
var dimensionChanges = [];
|
|
576
|
-
// update all dimensions
|
|
577
|
-
for (var dim in this.dimensionUpdaters) {
|
|
578
|
-
var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
|
|
579
|
-
dimensionChanges = dimensionChanges.concat(updaters);
|
|
580
|
-
}
|
|
581
|
-
dimensionChanges.forEach(function (f) {
|
|
582
|
-
return typeof f === 'function' && f();
|
|
583
|
-
});
|
|
584
|
-
}
|
|
585
|
-
}, {
|
|
586
|
-
key: "updateAggregation",
|
|
587
|
-
value: function updateAggregation(props, aggregationParams) {
|
|
588
|
-
var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
|
|
589
|
-
updaters.forEach(function (f) {
|
|
590
|
-
return typeof f === 'function' && f(aggregationParams);
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
}, {
|
|
594
|
-
key: "updateState",
|
|
595
|
-
value: function updateState(opts, aggregationParams) {
|
|
596
|
-
var oldProps = opts.oldProps,
|
|
597
|
-
props = opts.props,
|
|
598
|
-
changeFlags = opts.changeFlags;
|
|
599
|
-
var dimensionChanges = [];
|
|
600
|
-
if (changeFlags.dataChanged) {
|
|
601
|
-
// if data changed update everything
|
|
602
|
-
this.updateAggregation(props, aggregationParams);
|
|
603
|
-
this.updateAllDimensions(props);
|
|
604
|
-
return this.state;
|
|
605
|
-
}
|
|
606
|
-
var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
|
|
607
|
-
if (aggregationChanges && aggregationChanges.length) {
|
|
608
|
-
// get aggregatedData
|
|
609
|
-
aggregationChanges.forEach(function (f) {
|
|
610
|
-
return typeof f === 'function' && f(aggregationParams);
|
|
611
|
-
});
|
|
612
|
-
this.updateAllDimensions(props);
|
|
613
|
-
} else {
|
|
614
|
-
// only update dimensions
|
|
615
|
-
dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
|
|
616
|
-
dimensionChanges.forEach(function (f) {
|
|
617
|
-
return typeof f === 'function' && f();
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
return this.state;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
// Update private state
|
|
624
|
-
}, {
|
|
625
|
-
key: "setState",
|
|
626
|
-
value: function setState(updateObject) {
|
|
627
|
-
this.state = Object.assign({}, this.state, updateObject);
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
// Update private state.dimensions
|
|
631
|
-
}, {
|
|
632
|
-
key: "_setDimensionState",
|
|
633
|
-
value: function _setDimensionState(key, updateObject) {
|
|
634
|
-
this.setState({
|
|
635
|
-
dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
}, {
|
|
639
|
-
key: "_addAggregation",
|
|
640
|
-
value: function _addAggregation(aggregation) {
|
|
641
|
-
this.aggregationUpdater = aggregation;
|
|
642
|
-
}
|
|
643
|
-
}, {
|
|
644
|
-
key: "_addDimension",
|
|
645
|
-
value: function _addDimension() {
|
|
646
|
-
var _this = this;
|
|
647
|
-
var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
648
|
-
dimensions.forEach(function (dimension) {
|
|
649
|
-
var key = dimension.key;
|
|
650
|
-
_this.dimensionUpdaters[key] = dimension;
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
}, {
|
|
654
|
-
key: "_needUpdateStep",
|
|
655
|
-
value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
|
|
656
|
-
// whether need to update current dimension step
|
|
657
|
-
// dimension step is the value, domain, scaleFunction of each dimension
|
|
658
|
-
// each step is an object with properties links to layer prop and whether the prop is
|
|
659
|
-
// controlled by updateTriggers
|
|
660
|
-
return Object.values(dimensionStep.triggers).some(function (item) {
|
|
661
|
-
if (item.updateTrigger) {
|
|
662
|
-
// check based on updateTriggers change first
|
|
663
|
-
return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
|
|
664
|
-
}
|
|
665
|
-
// fallback to direct comparison
|
|
666
|
-
return oldProps[item.prop] !== props[item.prop];
|
|
667
|
-
});
|
|
668
|
-
}
|
|
669
|
-
}, {
|
|
670
|
-
key: "_accumulateUpdaters",
|
|
671
|
-
value: function _accumulateUpdaters(step, props, dimension) {
|
|
672
|
-
var updaters = [];
|
|
673
|
-
for (var i = step; i < dimension.updateSteps.length; i++) {
|
|
674
|
-
var updater = dimension.updateSteps[i].updater;
|
|
675
|
-
if (typeof updater === 'function') {
|
|
676
|
-
updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
return updaters;
|
|
680
|
-
}
|
|
681
|
-
}, {
|
|
682
|
-
key: "_getAllUpdaters",
|
|
683
|
-
value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
|
|
684
|
-
var _this2 = this;
|
|
685
|
-
var updaters = [];
|
|
686
|
-
var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
|
|
687
|
-
return _this2._needUpdateStep(step, oldProps, props, changeFlags);
|
|
688
|
-
});
|
|
689
|
-
if (needUpdateStep > -1) {
|
|
690
|
-
updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
|
|
691
|
-
}
|
|
692
|
-
return updaters;
|
|
693
|
-
}
|
|
694
|
-
}, {
|
|
695
|
-
key: "_getAggregationChanges",
|
|
696
|
-
value: function _getAggregationChanges(oldProps, props, changeFlags) {
|
|
697
|
-
var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
|
|
698
|
-
return updaters.length ? updaters : null;
|
|
699
|
-
}
|
|
700
|
-
}, {
|
|
701
|
-
key: "_getDimensionChanges",
|
|
702
|
-
value: function _getDimensionChanges(oldProps, props, changeFlags) {
|
|
703
|
-
var updaters = [];
|
|
704
|
-
|
|
705
|
-
// get dimension to be updated
|
|
706
|
-
for (var key in this.dimensionUpdaters) {
|
|
707
|
-
// return the first triggered updater for each dimension
|
|
708
|
-
var dimension = this.dimensionUpdaters[key];
|
|
709
|
-
var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
|
|
710
|
-
updaters = updaters.concat(dimensionUpdaters);
|
|
711
|
-
}
|
|
712
|
-
return updaters.length ? updaters : null;
|
|
713
|
-
}
|
|
714
|
-
}, {
|
|
715
|
-
key: "getUpdateTriggers",
|
|
716
|
-
value: function getUpdateTriggers(props) {
|
|
717
|
-
var _this3 = this;
|
|
718
|
-
var _updateTriggers = props.updateTriggers || {};
|
|
719
|
-
var updateTriggers = {};
|
|
720
|
-
var _loop = function _loop() {
|
|
721
|
-
var _this3$dimensionUpdat = _this3.dimensionUpdaters[key],
|
|
722
|
-
accessor = _this3$dimensionUpdat.accessor,
|
|
723
|
-
updateSteps = _this3$dimensionUpdat.updateSteps;
|
|
724
|
-
// fold dimension triggers into each accessor
|
|
725
|
-
updateTriggers[accessor] = {};
|
|
726
|
-
updateSteps.forEach(function (step) {
|
|
727
|
-
Object.values(step.triggers || []).forEach(function (_ref5) {
|
|
728
|
-
var prop = _ref5.prop,
|
|
729
|
-
updateTrigger = _ref5.updateTrigger;
|
|
730
|
-
if (updateTrigger) {
|
|
731
|
-
// if prop is based on updateTrigger e.g. getColorValue, getColorWeight
|
|
732
|
-
// and updateTriggers is passed in from layer prop
|
|
733
|
-
// fold the updateTriggers into accessor
|
|
734
|
-
var fromProp = _updateTriggers[updateTrigger];
|
|
735
|
-
if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
|
|
736
|
-
// if updateTrigger is an object spread it
|
|
737
|
-
Object.assign(updateTriggers[accessor], fromProp);
|
|
738
|
-
} else if (fromProp !== undefined) {
|
|
739
|
-
updateTriggers[accessor][prop] = fromProp;
|
|
740
|
-
}
|
|
741
|
-
} else {
|
|
742
|
-
// if prop is not based on updateTrigger
|
|
743
|
-
updateTriggers[accessor][prop] = props[prop];
|
|
744
|
-
}
|
|
745
|
-
});
|
|
746
|
-
});
|
|
747
|
-
};
|
|
748
|
-
for (var key in this.dimensionUpdaters) {
|
|
749
|
-
_loop();
|
|
750
|
-
}
|
|
751
|
-
return updateTriggers;
|
|
752
|
-
}
|
|
753
|
-
}, {
|
|
754
|
-
key: "getPickingInfo",
|
|
755
|
-
value: function getPickingInfo(_ref6, layerProps) {
|
|
756
|
-
var _this$state$layerData;
|
|
757
|
-
var info = _ref6.info;
|
|
758
|
-
var isPicked = info.picked && info.index > -1;
|
|
759
|
-
var object = null;
|
|
760
|
-
var cell = isPicked ? (_this$state$layerData = this.state.layerData.data) === null || _this$state$layerData === void 0 ? void 0 : _this$state$layerData[info.index] : null;
|
|
761
|
-
if (cell) {
|
|
762
|
-
var binInfo = {};
|
|
763
|
-
for (var key in this.dimensionUpdaters) {
|
|
764
|
-
var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
|
|
765
|
-
if (typeof _getPickingInfo === 'function') {
|
|
766
|
-
binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
object = Object.assign(binInfo, cell, {
|
|
770
|
-
points: cell.filteredPoints || cell.points
|
|
771
|
-
});
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
// add bin and to info
|
|
775
|
-
return Object.assign(info, {
|
|
776
|
-
picked: Boolean(object),
|
|
777
|
-
// override object with picked cell
|
|
778
|
-
object: object
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}, {
|
|
782
|
-
key: "getAccessor",
|
|
783
|
-
value: function getAccessor(dimensionKey, layerProps) {
|
|
784
|
-
if (!Object.prototype.hasOwnProperty.call(this.dimensionUpdaters, dimensionKey)) {
|
|
785
|
-
return nop;
|
|
786
|
-
}
|
|
787
|
-
return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
|
|
788
|
-
}
|
|
789
|
-
}], [{
|
|
790
|
-
key: "defaultDimensions",
|
|
791
|
-
value: function defaultDimensions() {
|
|
792
|
-
return _defaultDimensions;
|
|
793
|
-
}
|
|
794
|
-
}]);
|
|
795
|
-
}();
|
|
796
|
-
(0, _defineProperty2["default"])(CPUAggregator, "getDimensionScale", void 0);
|
|
797
|
-
CPUAggregator.getDimensionScale = getDimensionScale;
|
|
798
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl91dGlscyIsIl9jb25zdGFudHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJBR0dSRUdBVElPTl9PUEVSQVRJT04iLCJTVU0iLCJNRUFOIiwiTUlOIiwiTUFYIiwiQ09VTlQiLCJNQVhfMzJfQklUX0ZMT0FUIiwiZGVmYXVsdEdldFZhbHVlIiwicG9pbnRzIiwiZGVmYXVsdEdldFBvaW50cyIsImJpbiIsImRlZmF1bHRHZXRJbmRleCIsImluZGV4IiwiYXNjZW5kaW5nIiwiYiIsIk5hTiIsImNsYW1wIiwibWluIiwibWF4IiwiTWF0aCIsImdldFF1YW50aWxlRG9tYWluIiwiZGF0YSIsInZhbHVlQWNjZXNzb3IiLCJtYXAiLCJzb3J0IiwiZ2V0T3JkaW5hbERvbWFpbiIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJTZXQiLCJCaW5Tb3J0ZXIiLCJiaW5zIiwidW5kZWZpbmVkIiwicHJvcHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiYWdncmVnYXRlZEJpbnMiLCJfZ2V0QWdncmVnYXRlZEJpbnMiLCJfdXBkYXRlTWluTWF4VmFsdWVzIiwiYmluTWFwIiwiX2dldEJpbk1hcCIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJfcHJvcHMkZ2V0VmFsdWUiLCJnZXRWYWx1ZSIsIl9wcm9wcyRnZXRQb2ludHMiLCJnZXRQb2ludHMiLCJfcHJvcHMkZ2V0SW5kZXgiLCJnZXRJbmRleCIsImZpbHRlckRhdGEiLCJoYXNGaWx0ZXIiLCJiaW5JbmRleCIsImkiLCJmaWx0ZXJlZFBvaW50cyIsIk51bWJlciIsImlzRmluaXRlIiwiY291bnRzIiwibWF4Q291bnQiLCJtYXhWYWx1ZSIsIm1pblZhbHVlIiwidG90YWxDb3VudCIsIl9pdGVyYXRvciIsIl9zdGVwIiwieCIsImVyciIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfcGVyY2VudGlsZVRvSW5kZXgiLCJwZXJjZW50aWxlUmFuZ2UiLCJsZW4iLCJzb3J0ZWRCaW5zIiwiX3BlcmNlbnRpbGVSYW5nZSRtYXAiLCJfcGVyY2VudGlsZVJhbmdlJG1hcDIiLCJfc2xpY2VkVG9BcnJheTIiLCJsb3dlciIsInVwcGVyIiwiY2VpbCIsImZsb29yIiwiZ2V0VmFsdWVEb21haW5CeVNjYWxlIiwic2NhbGUiLCJfcmVmIiwiX3JlZjIiLCJfcmVmMiQiLCJfcmVmMiQyIiwiaW5kZXhFZGdlIiwiX2dldFNjYWxlRG9tYWluIiwic2NhbGVUeXBlIiwiX3JlZjMiLCJfcmVmNCIsImxvd2VySWR4IiwidXBwZXJJZHgiLCJkIiwiZ2V0VmFsdWVSYW5nZSIsImlkeFJhbmdlIiwiREVDS19BR0dSRUdBVElPTl9NQVAiLCJleHBvcnRzIiwiQUdHUkVHQVRJT05fVFlQRVMiLCJzdW0iLCJhdmVyYWdlIiwibWluaW11bSIsIm1heGltdW0iLCJnZXRWYWx1ZUZ1bmMiLCJhZ2dyZWdhdGlvbiIsImFjY2Vzc29yIiwidG9VcHBlckNhc2UiLCJDb25zb2xlIiwid2FybiIsImNvbmNhdCIsIm9wIiwia2VwbGVyT3AiLCJwdHMiLCJhZ2dyZWdhdGUiLCJnZXRTY2FsZUZ1bmN0b3IiLCJTQ0FMRV9GVU5DIiwicXVhbnRpemUiLCJub3AiLCJnZXRHZXRWYWx1ZSIsInN0ZXAiLCJkaW1lbnNpb25VcGRhdGVyIiwiX3N0ZXAkdHJpZ2dlcnMiLCJ0cmlnZ2VycyIsIndlaWdodCIsInByb3AiLCJfc2V0RGltZW5zaW9uU3RhdGUiLCJnZXREaW1lbnNpb25Tb3J0ZWRCaW5zIiwic3RhdGUiLCJkaW1lbnNpb25zIiwibGF5ZXJEYXRhIiwiX2ZpbHRlckRhdGEiLCJnZXREaW1lbnNpb25WYWx1ZURvbWFpbiIsIl9zdGVwJHRyaWdnZXJzMiIsImxvd2VyUGVyY2VudGlsZSIsInVwcGVyUGVyY2VudGlsZSIsInZhbHVlRG9tYWluIiwiY29sb3JTY2FsZVR5cGUiLCJjb2xvck1hcCIsInJlZHVjZSIsInByZXYiLCJjdXIiLCJnZXREaW1lbnNpb25TY2FsZSIsIl9zdGVwJHRyaWdnZXJzMyIsImRvbWFpbiIsInJhbmdlIiwiZml4ZWQiLCJvblNldCIsImRpbWVuc2lvblJhbmdlIiwiZGltZW5zaW9uRG9tYWluIiwiZGltZW5zaW9uRml4ZWQiLCJCb29sZWFuIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwiX3R5cGVvZjIiLCJub3JtYWxpemVSZXN1bHQiLCJyZXN1bHQiLCJoZXhhZ29ucyIsImFzc2lnbiIsImdldEFnZ3JlZ2F0ZWREYXRhIiwiYWdncmVnYXRpb25QYXJhbXMiLCJhZ2dyIiwiYWdncmVnYXRvciIsInNldFN0YXRlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RlcHMiLCJjZWxsU2l6ZSIsInBvc2l0aW9uIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRTdWJMYXllckFjY2Vzc29yIiwiZGltZW5zaW9uU3RhdGUiLCJkaW1lbnNpb24iLCJjZWxsIiwibnVsbFZhbHVlIiwiY3YiLCJpc1ZhbHVlSW5Eb21haW4iLCJkZWZhdWx0Q29sb3JEaW1lbnNpb24iLCJnZXRQaWNraW5nSW5mbyIsImNvbG9yVmFsdWUiLCJkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uIiwiZWxldmF0aW9uVmFsdWUiLCJkZWZhdWx0RGltZW5zaW9ucyIsIkNQVUFnZ3JlZ2F0b3IiLCJvcHRzIiwiaW5pdGlhbFN0YXRlIiwiZGltZW5zaW9uVXBkYXRlcnMiLCJhZ2dyZWdhdGlvblVwZGF0ZXIiLCJfYWRkRGltZW5zaW9uIiwidXBkYXRlQWxsRGltZW5zaW9ucyIsImRpbWVuc2lvbkNoYW5nZXMiLCJkaW0iLCJ1cGRhdGVycyIsIl9hY2N1bXVsYXRlVXBkYXRlcnMiLCJ1cGRhdGVBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0YXRlIiwib2xkUHJvcHMiLCJjaGFuZ2VGbGFncyIsImRhdGFDaGFuZ2VkIiwiYWdncmVnYXRpb25DaGFuZ2VzIiwiX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXREaW1lbnNpb25DaGFuZ2VzIiwidXBkYXRlT2JqZWN0IiwiX2FkZEFnZ3JlZ2F0aW9uIiwiX3RoaXMiLCJfbmVlZFVwZGF0ZVN0ZXAiLCJkaW1lbnNpb25TdGVwIiwidmFsdWVzIiwic29tZSIsIml0ZW0iLCJ1cGRhdGVUcmlnZ2Vyc0NoYW5nZWQiLCJhbGwiLCJiaW5kIiwiX2dldEFsbFVwZGF0ZXJzIiwiX3RoaXMyIiwibmVlZFVwZGF0ZVN0ZXAiLCJmaW5kSW5kZXgiLCJnZXRVcGRhdGVUcmlnZ2VycyIsIl90aGlzMyIsIl91cGRhdGVUcmlnZ2VycyIsInVwZGF0ZVRyaWdnZXJzIiwiX2xvb3AiLCJfdGhpczMkZGltZW5zaW9uVXBkYXQiLCJfcmVmNSIsImZyb21Qcm9wIiwiX3JlZjYiLCJsYXllclByb3BzIiwiX3RoaXMkc3RhdGUkbGF5ZXJEYXRhIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbGF5ZXItdXRpbHMvY3B1LWFnZ3JlZ2F0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyogZXNsaW50LWRpc2FibGUgZ3VhcmQtZm9yLWluICovXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmltcG9ydCB7YWdncmVnYXRlfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7QUdHUkVHQVRJT05fVFlQRVMsIFNDQUxFX0ZVTkN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UkdCQUNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB0eXBlIENsdXN0ZXJCdWlsZGVyIGZyb20gJy4vY2x1c3Rlci11dGlscyc7XG5cbmNvbnN0IEFHR1JFR0FUSU9OX09QRVJBVElPTiA9IHtcbiAgU1VNOiAnU1VNJyBhcyBjb25zdCxcbiAgTUVBTjogJ01FQU4nIGFzIGNvbnN0LFxuICBNSU46ICdNSU4nIGFzIGNvbnN0LFxuICBNQVg6ICdNQVgnIGFzIGNvbnN0LFxuICBDT1VOVDogJ0NPVU5UJyBhcyBjb25zdFxufTtcblxuY29uc3QgTUFYXzMyX0JJVF9GTE9BVCA9IDMuNDAyODIzNDY2ZTM4O1xuXG5pbnRlcmZhY2UgQmluIHtcbiAgcG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICBmaWx0ZXJlZFBvaW50cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfCBudWxsO1xuICBpbmRleD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEFnZ3JlZ2F0ZWRCaW4ge1xuICBpOiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGNvdW50czogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0R2V0VmFsdWUgPSAocG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA9PiBwb2ludHMubGVuZ3RoO1xuY29uc3QgZGVmYXVsdEdldFBvaW50cyA9IChiaW46IEJpbikgPT4gYmluLnBvaW50cztcbmNvbnN0IGRlZmF1bHRHZXRJbmRleCA9IChiaW46IEJpbikgPT4gYmluLmluZGV4O1xuY29uc3QgYXNjZW5kaW5nID0gKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU4pO1xuXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRRdWFudGlsZURvbWFpbihkYXRhOiBBZ2dyZWdhdGVkQmluW10sIHZhbHVlQWNjZXNzb3I6IChkOiBBZ2dyZWdhdGVkQmluKSA9PiBudW1iZXIpIHtcbiAgcmV0dXJuIGRhdGEubWFwKHZhbHVlQWNjZXNzb3IpLnNvcnQoYXNjZW5kaW5nKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JkaW5hbERvbWFpbihkYXRhOiBBZ2dyZWdhdGVkQmluW10sIHZhbHVlQWNjZXNzb3I6IChkOiBBZ2dyZWdhdGVkQmluKSA9PiBudW1iZXIpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGRhdGEubWFwKHZhbHVlQWNjZXNzb3IpKV07XG59XG5cbmNsYXNzIEJpblNvcnRlciB7XG4gIG1heENvdW50ITogbnVtYmVyO1xuICBtYXhWYWx1ZSE6IG51bWJlcjtcbiAgbWluVmFsdWUhOiBudW1iZXI7XG4gIHRvdGFsQ291bnQhOiBudW1iZXI7XG4gIGFnZ3JlZ2F0ZWRCaW5zOiBBZ2dyZWdhdGVkQmluW107XG4gIHNvcnRlZEJpbnMhOiBBZ2dyZWdhdGVkQmluW107XG4gIGJpbk1hcDogUmVjb3JkPG51bWJlciwgQWdncmVnYXRlZEJpbj47XG5cbiAgY29uc3RydWN0b3IoYmluczogQmluW10gPSBbXSwgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSkge1xuICAgIHRoaXMuYWdncmVnYXRlZEJpbnMgPSB0aGlzLl9nZXRBZ2dyZWdhdGVkQmlucyhiaW5zLCBwcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlTWluTWF4VmFsdWVzKCk7XG4gICAgdGhpcy5iaW5NYXAgPSB0aGlzLl9nZXRCaW5NYXAoKTtcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGVkQmlucyhiaW5zOiBCaW5bXSwgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBBZ2dyZWdhdGVkQmluW10ge1xuICAgIGNvbnN0IHtcbiAgICAgIGdldFZhbHVlID0gZGVmYXVsdEdldFZhbHVlLFxuICAgICAgZ2V0UG9pbnRzID0gZGVmYXVsdEdldFBvaW50cyxcbiAgICAgIGdldEluZGV4ID0gZGVmYXVsdEdldEluZGV4LFxuICAgICAgZmlsdGVyRGF0YVxuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBoYXNGaWx0ZXIgPSB0eXBlb2YgZmlsdGVyRGF0YSA9PT0gJ2Z1bmN0aW9uJztcbiAgICBjb25zdCBhZ2dyZWdhdGVkQmluczogQWdncmVnYXRlZEJpbltdID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBiaW5JbmRleCA9IDA7IGJpbkluZGV4IDwgYmlucy5sZW5ndGg7IGJpbkluZGV4KyspIHtcbiAgICAgIGNvbnN0IGJpbiA9IGJpbnNbYmluSW5kZXhdO1xuICAgICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKGJpbik7XG4gICAgICBjb25zdCBpID0gZ2V0SW5kZXgoYmluKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkUG9pbnRzID0gaGFzRmlsdGVyID8gcG9pbnRzLmZpbHRlcihmaWx0ZXJEYXRhKSA6IHBvaW50cztcbiAgICAgIGJpbi5maWx0ZXJlZFBvaW50cyA9IGhhc0ZpbHRlciA/IGZpbHRlcmVkUG9pbnRzIDogbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyZWRQb2ludHMubGVuZ3RoID8gZ2V0VmFsdWUoZmlsdGVyZWRQb2ludHMpIDogbnVsbDtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZ3JlZ2F0ZWRCaW5zW2luZGV4XSA9IHtcbiAgICAgICAgICBpOiBOdW1iZXIuaXNGaW5pdGUoaSkgPyBpIDogYmluSW5kZXgsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgY291bnRzOiBmaWx0ZXJlZFBvaW50cy5sZW5ndGhcbiAgICAgICAgfTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZWRCaW5zO1xuICB9XG5cbiAgX3VwZGF0ZU1pbk1heFZhbHVlcygpIHtcbiAgICBsZXQgbWF4Q291bnQgPSAwO1xuICAgIGxldCBtYXhWYWx1ZSA9IC1NQVhfMzJfQklUX0ZMT0FUO1xuICAgIGxldCBtaW5WYWx1ZSA9IE1BWF8zMl9CSVRfRkxPQVQ7XG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLmFnZ3JlZ2F0ZWRCaW5zKSB7XG4gICAgICBtYXhDb3VudCA9IG1heENvdW50ID4geC5jb3VudHMgPyBtYXhDb3VudCA6IHguY291bnRzO1xuICAgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA+IHgudmFsdWUgPyBtYXhWYWx1ZSA6IHgudmFsdWU7XG4gICAgICBtaW5WYWx1ZSA9IG1pblZhbHVlIDwgeC52YWx1ZSA/IG1pblZhbHVlIDogeC52YWx1ZTtcbiAgICAgIHRvdGFsQ291bnQgKz0geC5jb3VudHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmFnZ3JlZ2F0ZWRCaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4VmFsdWUgPSAwO1xuICAgICAgbWluVmFsdWUgPSAwO1xuICAgIH1cbiAgICB0aGlzLm1heENvdW50ID0gbWF4Q291bnQ7XG4gICAgdGhpcy5tYXhWYWx1ZSA9IG1heFZhbHVlO1xuICAgIHRoaXMubWluVmFsdWUgPSBtaW5WYWx1ZTtcbiAgICB0aGlzLnRvdGFsQ291bnQgPSB0b3RhbENvdW50O1xuICB9XG5cbiAgX2dldEJpbk1hcCgpIHtcbiAgICBjb25zdCBiaW5NYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGJpbiBvZiB0aGlzLmFnZ3JlZ2F0ZWRCaW5zKSB7XG4gICAgICBiaW5NYXBbYmluLmldID0gYmluO1xuICAgIH1cbiAgICByZXR1cm4gYmluTWFwO1xuICB9XG5cbiAgX3BlcmNlbnRpbGVUb0luZGV4KHBlcmNlbnRpbGVSYW5nZTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBsZW4gPSB0aGlzLnNvcnRlZEJpbnMubGVuZ3RoO1xuICAgIGlmIChsZW4gPCAyKSByZXR1cm4gWzAsIDBdO1xuICAgIGNvbnN0IFtsb3dlciwgdXBwZXJdID0gcGVyY2VudGlsZVJhbmdlLm1hcChuID0+IGNsYW1wKG4sIDAsIDEwMCkpO1xuICAgIHJldHVybiBbTWF0aC5jZWlsKChsb3dlciAvIDEwMCkgKiAobGVuIC0gMSkpLCBNYXRoLmZsb29yKCh1cHBlciAvIDEwMCkgKiAobGVuIC0gMSkpXTtcbiAgfVxuXG4gIGdldFZhbHVlRG9tYWluQnlTY2FsZShzY2FsZTogc3RyaW5nLCBbbG93ZXIgPSAwLCB1cHBlciA9IDEwMF06IG51bWJlcltdID0gW10pIHtcbiAgICBpZiAoIXRoaXMuc29ydGVkQmlucykge1xuICAgICAgdGhpcy5zb3J0ZWRCaW5zID0gdGhpcy5hZ2dyZWdhdGVkQmlucy5zb3J0KChhLCBiKSA9PiBhc2NlbmRpbmcoYS52YWx1ZSwgYi52YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc29ydGVkQmlucy5sZW5ndGgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpbmRleEVkZ2UgPSB0aGlzLl9wZXJjZW50aWxlVG9JbmRleChbbG93ZXIsIHVwcGVyXSk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNjYWxlRG9tYWluKHNjYWxlLCBpbmRleEVkZ2UpO1xuICB9XG5cbiAgX2dldFNjYWxlRG9tYWluKHNjYWxlVHlwZTogc3RyaW5nLCBbbG93ZXJJZHgsIHVwcGVySWR4XTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBiaW5zID0gdGhpcy5zb3J0ZWRCaW5zO1xuICAgIHN3aXRjaCAoc2NhbGVUeXBlKSB7XG4gICAgICBjYXNlICdxdWFudGl6ZSc6XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gW2JpbnNbbG93ZXJJZHhdLnZhbHVlLCBiaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gICAgICBjYXNlICdxdWFudGlsZSc6XG4gICAgICAgIHJldHVybiBnZXRRdWFudGlsZURvbWFpbihiaW5zLnNsaWNlKGxvd2VySWR4LCB1cHBlcklkeCArIDEpLCBkID0+IGQudmFsdWUpO1xuICAgICAgY2FzZSAnb3JkaW5hbCc6XG4gICAgICAgIHJldHVybiBnZXRPcmRpbmFsRG9tYWluKGJpbnMsIGQgPT4gZC52YWx1ZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW2JpbnNbbG93ZXJJZHhdLnZhbHVlLCBiaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsdWVSYW5nZShwZXJjZW50aWxlUmFuZ2U/OiBudW1iZXJbXSkge1xuICAgIGlmICghdGhpcy5zb3J0ZWRCaW5zKSB7XG4gICAgICB0aGlzLnNvcnRlZEJpbnMgPSB0aGlzLmFnZ3JlZ2F0ZWRCaW5zLnNvcnQoKGEsIGIpID0+IGFzY2VuZGluZyhhLnZhbHVlLCBiLnZhbHVlKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zb3J0ZWRCaW5zLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGxldCBsb3dlcklkeCA9IDA7XG4gICAgbGV0IHVwcGVySWR4ID0gdGhpcy5zb3J0ZWRCaW5zLmxlbmd0aCAtIDE7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGVyY2VudGlsZVJhbmdlKSkge1xuICAgICAgY29uc3QgaWR4UmFuZ2UgPSB0aGlzLl9wZXJjZW50aWxlVG9JbmRleChwZXJjZW50aWxlUmFuZ2UpO1xuICAgICAgbG93ZXJJZHggPSBpZHhSYW5nZVswXTtcbiAgICAgIHVwcGVySWR4ID0gaWR4UmFuZ2VbMV07XG4gICAgfVxuICAgIHJldHVybiBbdGhpcy5zb3J0ZWRCaW5zW2xvd2VySWR4XS52YWx1ZSwgdGhpcy5zb3J0ZWRCaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVXBkYXRlclR5cGUgPSAodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBCaW5kZWRVcGRhdGVyVHlwZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVkVXBkYXRlclR5cGUgPSAoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChhZ2dyZWdhdGlvblBhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIG9uU2V0Pzoge1xuICAgIHByb3BzOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZXI6IFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRGltZW5zaW9uVHlwZTxWYWx1ZVR5cGUgPSBhbnk+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgYWNjZXNzb3I6IHN0cmluZztcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcz8pID0+IGFueTtcbiAgbnVsbFZhbHVlOiBWYWx1ZVR5cGU7XG4gIHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXTtcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIHVwZGF0ZXI6IEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHVwZGF0ZVN0ZXBzOiBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IERFQ0tfQUdHUkVHQVRJT05fTUFQID0ge1xuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTV06IEFHR1JFR0FUSU9OX1RZUEVTLnN1bSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NRUFOXTogQUdHUkVHQVRJT05fVFlQRVMuYXZlcmFnZSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NSU5dOiBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1BWF06IEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZ1bmMoXG4gIGFnZ3JlZ2F0aW9uOiBzdHJpbmcsXG4gIGFjY2Vzc29yOiAoZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IG51bWJlclxuKSB7XG4gIGlmICghYWdncmVnYXRpb24gfHwgIUFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBBR0dSRUdBVElPTl9PUEVSQVRJT05bYWdncmVnYXRpb24udG9VcHBlckNhc2UoKV0gfHwgQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTTtcbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcF07XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGU6IHN0cmluZykge1xuICBpZiAoIXNjYWxlVHlwZSB8fCAhU0NBTEVfRlVOQ1tzY2FsZVR5cGVdKSB7XG4gICAgQ29uc29sZS53YXJuKGBTY2FsZSAke3NjYWxlVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlVHlwZV0gfHwgU0NBTEVfRlVOQy5xdWFudGl6ZTtcbn1cblxuZnVuY3Rpb24gbm9wKCkge1xuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKCh0aGlzLnN0YXRlLmxheWVyRGF0YS5kYXRhIHx8IFtdKSBhcyB1bmtub3duIGFzIEJpbltdLCB7XG4gICAgZ2V0VmFsdWUsXG4gICAgZmlsdGVyRGF0YTogcHJvcHMuX2ZpbHRlckRhdGFcbiAgfSk7XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NvcnRlZEJpbnN9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblZhbHVlRG9tYWluKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7bG93ZXJQZXJjZW50aWxlLCB1cHBlclBlcmNlbnRpbGUsIHNjYWxlVHlwZX1cbiAgfSA9IHN0ZXA7XG5cbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCBzb3J0ZWRCaW5zLCBpZiBub3QsIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHZhbHVlRG9tYWluID1cbiAgICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2NhbGUgZnVuY3Rpb24gZG9tYWluIGluIGJpbiBzb3J0ZXJcbiAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zLmdldFZhbHVlRG9tYWluQnlTY2FsZShwcm9wc1tzY2FsZVR5cGUucHJvcF0sIFtcbiAgICAgIHByb3BzW2xvd2VyUGVyY2VudGlsZS5wcm9wXSxcbiAgICAgIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXVxuICAgIF0pO1xuXG4gIGlmIChwcm9wcy5jb2xvclNjYWxlVHlwZSA9PT0gJ2N1c3RvbScgJiYgcHJvcHMuY29sb3JNYXApIHtcbiAgICAvLyBmb3IgY3VzdG9tIHNjYWxlLCByZXR1cm4gY3VzdG9tIGJyZWFrcyBhcyB2YWx1ZSBkb21haW4gZGlyZWN0bHlcbiAgICB2YWx1ZURvbWFpbiA9IHByb3BzLmNvbG9yTWFwLnJlZHVjZShcbiAgICAgIChwcmV2LCBjdXIpID0+IChOdW1iZXIuaXNGaW5pdGUoY3VyWzBdKSA/IHByZXYuY29uY2F0KGN1clswXSkgOiBwcmV2KSxcbiAgICAgIFtdXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3ZhbHVlRG9tYWlufSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25TY2FsZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtkb21haW4sIHJhbmdlLCBzY2FsZVR5cGUsIGZpeGVkfSA9IHN0ZXAudHJpZ2dlcnM7XG4gIGNvbnN0IHtvblNldH0gPSBzdGVwO1xuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCB2YWx1ZURvbWFpbiwgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvblJhbmdlID0gcHJvcHNbcmFuZ2UucHJvcF07XG4gIGNvbnN0IGRpbWVuc2lvbkRvbWFpbiA9IHByb3BzW2RvbWFpbi5wcm9wXSB8fCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbjtcbiAgY29uc3QgZGltZW5zaW9uRml4ZWQgPSBCb29sZWFuKGZpeGVkICYmIHByb3BzW2ZpeGVkLnByb3BdKTtcblxuICBjb25zdCBzY2FsZUZ1bmN0b3IgPSBnZXRTY2FsZUZ1bmN0b3Ioc2NhbGVUeXBlICYmIHByb3BzW3NjYWxlVHlwZS5wcm9wXSkoKTtcblxuICBjb25zdCBzY2FsZUZ1bmMgPSBzY2FsZUZ1bmN0b3JcbiAgICAuZG9tYWluKGRpbWVuc2lvbkRvbWFpbilcbiAgICAucmFuZ2UoZGltZW5zaW9uRml4ZWQgPyBkaW1lbnNpb25Eb21haW4gOiBkaW1lbnNpb25SYW5nZSk7XG4gIHNjYWxlRnVuYy5zY2FsZVR5cGUgPSBwcm9wcy5jb2xvclNjYWxlVHlwZTtcblxuICBpZiAodHlwZW9mIG9uU2V0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvcHNbb25TZXQucHJvcHNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgc29ydGVkQmlucyA9IHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnM7XG4gICAgaWYgKHNvcnRlZEJpbnMpIHtcbiAgICAgIHByb3BzW29uU2V0LnByb3BzXSh7ZG9tYWluOiBzY2FsZUZ1bmMuZG9tYWluKCksIGFnZ3JlZ2F0ZWRCaW5zOiBzb3J0ZWRCaW5zLmJpbk1hcH0pO1xuICAgIH1cbiAgfVxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzY2FsZUZ1bmN9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVzdWx0KFxuICByZXN1bHQ6IHtcbiAgICBoZXhhZ29ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gICAgbGF5ZXJEYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgfSA9IHt9XG4pIHtcbiAgLy8gc3VwcG9ydCBwcmV2aW91cyBoZXhhZ29uQWdncmVnYXRvciBBUElcbiAgaWYgKHJlc3VsdC5oZXhhZ29ucykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtkYXRhOiByZXN1bHQuaGV4YWdvbnN9LCByZXN1bHQpO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5sYXllckRhdGEpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmxheWVyRGF0YX0sIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdncmVnYXRlZERhdGEoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikge1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHthZ2dyZWdhdG9yOiBhZ2dyfVxuICB9ID0gc3RlcDtcbiAgY29uc3QgYWdncmVnYXRvciA9IHByb3BzW2FnZ3IucHJvcF07XG5cbiAgLy8gcmVzdWx0IHNob3VsZCBjb250YWluIGEgZGF0YSBhcnJheSBhbmQgb3RoZXIgcHJvcHNcbiAgLy8gcmVzdWx0ID0ge2RhdGE6IFtdLCAuLi5vdGhlciBwcm9wc31cbiAgY29uc3QgcmVzdWx0ID0gYWdncmVnYXRvcihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICB0aGlzLnNldFN0YXRlKHtcbiAgICBsYXllckRhdGE6IG5vcm1hbGl6ZVJlc3VsdChyZXN1bHQpXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvblR5cGUgPSB7XG4gIGtleTogJ3Bvc2l0aW9uJyxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdhZ2dyZWdhdGUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgY2VsbFNpemU6IHtcbiAgICAgICAgICBwcm9wOiAnY2VsbFNpemUnXG4gICAgICAgIH0sXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2dldFBvc2l0aW9uJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0UG9zaXRpb24nXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0b3I6IHtcbiAgICAgICAgICBwcm9wOiAnZ3JpZEFnZ3JlZ2F0b3InXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRBZ2dyZWdhdGVkRGF0YVxuICAgIH1cbiAgXVxufTtcblxuZnVuY3Rpb24gZ2V0U3ViTGF5ZXJBY2Nlc3NvcihcbiAgZGltZW5zaW9uU3RhdGU6IHtzb3J0ZWRCaW5zOiBCaW5Tb3J0ZXI7IHNjYWxlRnVuYzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2NhbGVGdW5jdG9yPn0sXG4gIGRpbWVuc2lvbjogRGltZW5zaW9uVHlwZVxuKSB7XG4gIHJldHVybiAoY2VsbDoge2luZGV4OiBudW1iZXJ9KSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9XG4gICAgICBzY2FsZUZ1bmMuc2NhbGVUeXBlID09PSAnY3VzdG9tJ1xuICAgICAgICA/IGN2ID49IHNvcnRlZEJpbnMubWluVmFsdWUgJiYgY3YgPD0gc29ydGVkQmlucy5tYXhWYWx1ZVxuICAgICAgICA6IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGNvbG9yVmFsdWUgPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XSAmJiBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XS52YWx1ZTtcbiAgICByZXR1cm4ge2NvbG9yVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IFswLCAwLCAwLCAwXSxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdnZXRWYWx1ZScsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvclZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JWYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yV2VpZ2h0JyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JXZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2NvbG9yQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdsb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICd1cHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uVmFsdWVEb21haW5cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldFNjYWxlRnVuYycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBkb21haW46IHtwcm9wOiAnY29sb3JEb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnY29sb3JSYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIG9uU2V0OiB7XG4gICAgICAgIHByb3BzOiAnb25TZXRDb2xvckRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb246IERpbWVuc2lvblR5cGU8bnVtYmVyPiA9IHtcbiAga2V5OiAnZWxldmF0aW9uJyxcbiAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtlbGV2YXRpb25WYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogLTEsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0RWxldmF0aW9uVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25WYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvbldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldEVsZXZhdGlvbldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25Mb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25VcHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdlbGV2YXRpb25TY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZml4ZWQ6IHtwcm9wOiAnZWxldmF0aW9uRml4ZWQnfSxcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2VsZXZhdGlvbkRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdlbGV2YXRpb25SYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0RWxldmF0aW9uRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpbWVuc2lvbnMgPSBbZGVmYXVsdENvbG9yRGltZW5zaW9uLCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uXTtcblxuZXhwb3J0IHR5cGUgQ1BVQWdncmVnYXRvclN0YXRlID0ge1xuICBsYXllckRhdGE6IHtkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXX07XG4gIGRpbWVuc2lvbnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgZ2V0VmFsdWU/OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBudW1iZXI7XG4gICAgICBzb3J0ZWRCaW5zPzogQmluU29ydGVyO1xuICAgICAgdmFsdWVEb21haW4/OiBudW1iZXJbXTtcbiAgICAgIHNjYWxlRnVuYz86ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSAmIHtkb21haW46ICgpID0+IG51bWJlcltdOyBzY2FsZVR5cGU/OiBzdHJpbmd9O1xuICAgIH1cbiAgPjtcbiAgZ2VvSlNPTj86IEdlb0pTT04uRmVhdHVyZUNvbGxlY3Rpb247XG4gIGNsdXN0ZXJCdWlsZGVyPzogQ2x1c3RlckJ1aWxkZXI7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDUFVBZ2dyZWdhdG9yIHtcbiAgc3RhdGljIGdldERpbWVuc2lvblNjYWxlOiBhbnk7XG4gIHN0YXRlOiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gIGRpbWVuc2lvblVwZGF0ZXJzOiB7W2tleTogc3RyaW5nXTogRGltZW5zaW9uVHlwZX07XG4gIGFnZ3JlZ2F0aW9uVXBkYXRlcjogQWdncmVnYXRpb25UeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdHM6IHtcbiAgICAgIGluaXRpYWxTdGF0ZT86IENQVUFnZ3JlZ2F0b3JTdGF0ZTtcbiAgICAgIGRpbWVuc2lvbnM/OiBEaW1lbnNpb25UeXBlW107XG4gICAgICBhZ2dyZWdhdGlvbj86IEFnZ3JlZ2F0aW9uVHlwZTtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxheWVyRGF0YToge30sXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIC8vIGNvbG9yOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gZWxldmF0aW9uOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdHMuaW5pdGlhbFN0YXRlXG4gICAgfTtcblxuICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMgPSB7fTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IG9wdHMuYWdncmVnYXRpb24gfHwgZGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXG4gICAgdGhpcy5fYWRkRGltZW5zaW9uKG9wdHMuZGltZW5zaW9ucyB8fCBkZWZhdWx0RGltZW5zaW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHREaW1lbnNpb25zO1xuICB9XG5cbiAgdXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG4gICAgLy8gdXBkYXRlIGFsbCBkaW1lbnNpb25zXG4gICAgZm9yIChjb25zdCBkaW0gaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltXSk7XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzID0gZGltZW5zaW9uQ2hhbmdlcy5jb25jYXQodXBkYXRlcnMpO1xuICAgIH1cblxuICAgIGRpbWVuc2lvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoKSk7XG4gIH1cblxuICB1cGRhdGVBZ2dyZWdhdGlvbihwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiwgYWdncmVnYXRpb25QYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCB1cGRhdGVycyA9IHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycygwLCBwcm9wcywgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIpO1xuICAgIHVwZGF0ZXJzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKGFnZ3JlZ2F0aW9uUGFyYW1zKSk7XG4gIH1cblxuICB1cGRhdGVTdGF0ZShcbiAgICBvcHRzOiB7XG4gICAgICBvbGRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgY2hhbmdlRmxhZ3M6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfSxcbiAgICBhZ2dyZWdhdGlvblBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PlxuICApIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0OiBQYXJ0aWFsPENQVUFnZ3JlZ2F0b3JTdGF0ZT4pIHtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZSwgdXBkYXRlT2JqZWN0KTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcml2YXRlIHN0YXRlLmRpbWVuc2lvbnNcbiAgX3NldERpbWVuc2lvblN0YXRlKGtleTogc3RyaW5nLCB1cGRhdGVPYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRpbWVuc2lvbnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUuZGltZW5zaW9ucywge1xuICAgICAgICBba2V5XTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIHVwZGF0ZU9iamVjdClcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBfYWRkQWdncmVnYXRpb24oYWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gYWdncmVnYXRpb247XG4gIH1cblxuICBfYWRkRGltZW5zaW9uKGRpbWVuc2lvbnM6IERpbWVuc2lvblR5cGVbXSA9IFtdKSB7XG4gICAgZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG4gICAgICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvbjtcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XSA9IGRpbWVuc2lvbjtcbiAgICB9KTtcbiAgfVxuXG4gIF9uZWVkVXBkYXRlU3RlcChcbiAgICBkaW1lbnNpb25TdGVwOiBVcGRhdGVTdGVwc1R5cGUgfCBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICAvLyB3aGV0aGVyIG5lZWQgdG8gdXBkYXRlIGN1cnJlbnQgZGltZW5zaW9uIHN0ZXBcbiAgICAvLyBkaW1lbnNpb24gc3RlcCBpcyB0aGUgdmFsdWUsIGRvbWFpbiwgc2NhbGVGdW5jdGlvbiBvZiBlYWNoIGRpbWVuc2lvblxuICAgIC8vIGVhY2ggc3RlcCBpcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGxpbmtzIHRvIGxheWVyIHByb3AgYW5kIHdoZXRoZXIgdGhlIHByb3AgaXNcbiAgICAvLyBjb250cm9sbGVkIGJ5IHVwZGF0ZVRyaWdnZXJzXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZGltZW5zaW9uU3RlcC50cmlnZ2Vycykuc29tZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLnVwZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgLy8gY2hlY2sgYmFzZWQgb24gdXBkYXRlVHJpZ2dlcnMgY2hhbmdlIGZpcnN0XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkICYmXG4gICAgICAgICAgKGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZC5hbGwgfHxcbiAgICAgICAgICAgIGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZFtpdGVtLnVwZGF0ZVRyaWdnZXJdKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZmFsbGJhY2sgdG8gZGlyZWN0IGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBvbGRQcm9wc1tpdGVtLnByb3BdICE9PSBwcm9wc1tpdGVtLnByb3BdO1xuICAgIH0pO1xuICB9XG5cbiAgX2FjY3VtdWxhdGVVcGRhdGVyczxVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGUgfCBBZ2dyZWdhdGlvblR5cGU+KFxuICAgIHN0ZXAsXG4gICAgcHJvcHMsXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZVxuICApIHtcbiAgICB0eXBlIExvY2FsVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gc3RlcDsgaSA8IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXS51cGRhdGVyO1xuICAgICAgaWYgKHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZXJzLnB1c2goXG4gICAgICAgICAgKHVwZGF0ZXIgYXMgVXBkYXRlclR5cGUpLmJpbmQoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgZGltZW5zaW9uLnVwZGF0ZVN0ZXBzW2ldLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBkaW1lbnNpb25cbiAgICAgICAgICApIGFzIExvY2FsVXBkYXRlclR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlcnM7XG4gIH1cblxuICBfZ2V0QWxsVXBkYXRlcnM8VXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlIHwgQWdncmVnYXRpb25UeXBlPihcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIHR5cGUgTG9jYWxVcGRhdGVyVHlwZSA9IFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZVxuICAgICAgPyBCaW5kZWRVcGRhdGVyVHlwZVxuICAgICAgOiBCaW5kZWRBZ2dyZWdhdGVkVXBkYXRlclR5cGU7XG4gICAgbGV0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMoXG4gICAgb2xkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2hhbmdlRmxhZ3M6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyh0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIF9nZXREaW1lbnNpb25DaGFuZ2VzKFxuICAgIG9sZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNoYW5nZUZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIGxldCB1cGRhdGVyczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuXG4gICAgLy8gZ2V0IGRpbWVuc2lvbiB0byBiZSB1cGRhdGVkXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgLy8gcmV0dXJuIHRoZSBmaXJzdCB0cmlnZ2VyZWQgdXBkYXRlciBmb3IgZWFjaCBkaW1lbnNpb25cbiAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgIGNvbnN0IGRpbWVuc2lvblVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnMoZGltZW5zaW9uLCBvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKTtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KGRpbWVuc2lvblVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlcnMubGVuZ3RoID8gdXBkYXRlcnMgOiBudWxsO1xuICB9XG5cbiAgZ2V0VXBkYXRlVHJpZ2dlcnMocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCBfdXBkYXRlVHJpZ2dlcnMgPSBwcm9wcy51cGRhdGVUcmlnZ2VycyB8fCB7fTtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgY29uc3Qge2FjY2Vzc29yLCB1cGRhdGVTdGVwc306IHthY2Nlc3Nvcjogc3RyaW5nOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID1cbiAgICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfToge2luZm86IFJlY29yZDxzdHJpbmcsIGFueT59LCBsYXllclByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgaXNQaWNrZWQgPSBpbmZvLnBpY2tlZCAmJiBpbmZvLmluZGV4ID4gLTE7XG4gICAgbGV0IG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNlbGwgPSBpc1BpY2tlZCA/IHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGE/LltpbmZvLmluZGV4XSA6IG51bGw7XG4gICAgaWYgKGNlbGwpIHtcbiAgICAgIGxldCBiaW5JbmZvID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAgIGNvbnN0IHtnZXRQaWNraW5nSW5mb30gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0UGlja2luZ0luZm8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBiaW5JbmZvID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgYmluSW5mbyxcbiAgICAgICAgICAgIGdldFBpY2tpbmdJbmZvKHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLCBjZWxsLCBsYXllclByb3BzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2JqZWN0ID0gT2JqZWN0LmFzc2lnbihiaW5JbmZvLCBjZWxsLCB7XG4gICAgICAgIHBvaW50czogY2VsbC5maWx0ZXJlZFBvaW50cyB8fCBjZWxsLnBvaW50c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGJpbiAgYW5kICB0byBpbmZvXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5mbywge1xuICAgICAgcGlja2VkOiBCb29sZWFuKG9iamVjdCksXG4gICAgICAvLyBvdmVycmlkZSBvYmplY3Qgd2l0aCBwaWNrZWQgY2VsbFxuICAgICAgb2JqZWN0XG4gICAgfSk7XG4gIH1cblxuICBnZXRBY2Nlc3NvcihkaW1lbnNpb25LZXk6IHN0cmluZywgbGF5ZXJQcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZGltZW5zaW9uVXBkYXRlcnMsIGRpbWVuc2lvbktleSkpIHtcbiAgICAgIHJldHVybiBub3A7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbWVuc2lvbktleV0uZ2V0U3ViTGF5ZXJBY2Nlc3NvcihcbiAgICAgIHRoaXMuc3RhdGUuZGltZW5zaW9uc1tkaW1lbnNpb25LZXldLFxuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLFxuICAgICAgbGF5ZXJQcm9wc1xuICAgICk7XG4gIH1cbn1cblxuQ1BVQWdncmVnYXRvci5nZXREaW1lbnNpb25TY2FsZSA9IGdldERpbWVuc2lvblNjYWxlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUFtRSxTQUFBRyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxnQkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxNQUFBLENBQUFjLHlCQUFBLENBQUFmLENBQUEsS0FBQUgsT0FBQSxDQUFBSSxNQUFBLENBQUFE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
|