@kepler.gl/deckgl-layers 3.1.0-alpha.1 → 3.1.0-alpha.3
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/3d-building-layer/3d-building-layer.d.ts +16 -0
- package/dist/3d-building-layer/3d-building-layer.js +69 -0
- package/dist/3d-building-layer/3d-building-utils.d.ts +9 -0
- package/dist/3d-building-layer/3d-building-utils.js +166 -0
- package/dist/3d-building-layer/types.d.ts +51 -0
- package/dist/3d-building-layer/types.js +6 -0
- package/dist/cluster-layer/cluster-layer.d.ts +44 -0
- package/dist/cluster-layer/cluster-layer.js +297 -0
- package/dist/column-layer/enhanced-column-layer.d.ts +12 -0
- package/dist/column-layer/enhanced-column-layer.js +131 -0
- package/dist/deckgl-extensions/filter-arrow-layer.d.ts +42 -0
- package/dist/deckgl-extensions/filter-arrow-layer.js +76 -0
- package/dist/deckgl-extensions/filter-shader-module.d.ts +16 -0
- package/dist/deckgl-extensions/filter-shader-module.js +27 -0
- package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +7 -0
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +67 -0
- package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +7 -0
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +67 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +109 -0
- package/dist/layer-utils/cluster-utils.d.ts +22 -0
- package/dist/layer-utils/cluster-utils.js +93 -0
- package/dist/layer-utils/cpu-aggregator.d.ts +93 -0
- package/dist/layer-utils/cpu-aggregator.js +582 -0
- package/dist/layer-utils/shader-utils.d.ts +1 -0
- package/dist/layer-utils/shader-utils.js +29 -0
- package/dist/line-layer/line-layer.d.ts +12 -0
- package/dist/line-layer/line-layer.js +87 -0
- package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +9 -0
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +57 -0
- package/dist/svg-icon-layer/svg-icon-layer.d.ts +22 -0
- package/dist/svg-icon-layer/svg-icon-layer.js +102 -0
- package/package.json +6 -5
@@ -0,0 +1,582 @@
|
|
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 _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
16
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
17
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
18
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
19
|
+
var _aggregationLayers = require("@deck.gl/aggregation-layers");
|
20
|
+
var _window = require("global/window");
|
21
|
+
var _utils = require("@kepler.gl/utils");
|
22
|
+
var _constants = require("@kepler.gl/constants");
|
23
|
+
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; }
|
24
|
+
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
|
25
|
+
// Copyright contributors to the kepler.gl project
|
26
|
+
/* eslint-disable guard-for-in */
|
27
|
+
var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _aggregationLayers.AGGREGATION_OPERATION.SUM, _constants.AGGREGATION_TYPES.sum), _aggregationLayers.AGGREGATION_OPERATION.MEAN, _constants.AGGREGATION_TYPES.average), _aggregationLayers.AGGREGATION_OPERATION.MIN, _constants.AGGREGATION_TYPES.minimum), _aggregationLayers.AGGREGATION_OPERATION.MAX, _constants.AGGREGATION_TYPES.maximum);
|
28
|
+
function getValueFunc(aggregation, accessor) {
|
29
|
+
if (!aggregation || !_aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
|
30
|
+
_window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
|
31
|
+
}
|
32
|
+
var op = _aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()] || _aggregationLayers.AGGREGATION_OPERATION.SUM;
|
33
|
+
var keplerOp = DECK_AGGREGATION_MAP[op];
|
34
|
+
return function (pts) {
|
35
|
+
return (0, _utils.aggregate)(pts.map(accessor), keplerOp);
|
36
|
+
};
|
37
|
+
}
|
38
|
+
function getScaleFunctor(scaleType) {
|
39
|
+
if (!scaleType || !_constants.SCALE_FUNC[scaleType]) {
|
40
|
+
_window.console.warn("Scale ".concat(scaleType, " is not supported"));
|
41
|
+
}
|
42
|
+
return _constants.SCALE_FUNC[scaleType] || _constants.SCALE_FUNC.quantize;
|
43
|
+
}
|
44
|
+
function nop() {
|
45
|
+
return;
|
46
|
+
}
|
47
|
+
function getGetValue(step, props, dimensionUpdater) {
|
48
|
+
var key = dimensionUpdater.key;
|
49
|
+
var _step$triggers = step.triggers,
|
50
|
+
value = _step$triggers.value,
|
51
|
+
weight = _step$triggers.weight,
|
52
|
+
aggregation = _step$triggers.aggregation;
|
53
|
+
var getValue = props[value.prop];
|
54
|
+
if (getValue === null) {
|
55
|
+
// If `getValue` is not provided from props, build it with aggregation and weight.
|
56
|
+
getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
|
57
|
+
}
|
58
|
+
if (getValue) {
|
59
|
+
this._setDimensionState(key, {
|
60
|
+
getValue: getValue
|
61
|
+
});
|
62
|
+
}
|
63
|
+
}
|
64
|
+
function getDimensionSortedBins(step, props, dimensionUpdater) {
|
65
|
+
var key = dimensionUpdater.key;
|
66
|
+
var getValue = this.state.dimensions[key].getValue;
|
67
|
+
// @ts-expect-error
|
68
|
+
var sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
|
69
|
+
getValue: getValue,
|
70
|
+
filterData: props._filterData
|
71
|
+
});
|
72
|
+
this._setDimensionState(key, {
|
73
|
+
sortedBins: sortedBins
|
74
|
+
});
|
75
|
+
}
|
76
|
+
function getDimensionValueDomain(step, props, dimensionUpdater) {
|
77
|
+
var key = dimensionUpdater.key;
|
78
|
+
var _step$triggers2 = step.triggers,
|
79
|
+
lowerPercentile = _step$triggers2.lowerPercentile,
|
80
|
+
upperPercentile = _step$triggers2.upperPercentile,
|
81
|
+
scaleType = _step$triggers2.scaleType;
|
82
|
+
if (!this.state.dimensions[key].sortedBins) {
|
83
|
+
// the previous step should set sortedBins, if not, something went wrong
|
84
|
+
return;
|
85
|
+
}
|
86
|
+
|
87
|
+
// for log and sqrt scale, returns linear domain by default
|
88
|
+
// TODO: support other scale function domain in bin sorter
|
89
|
+
var valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
|
90
|
+
this._setDimensionState(key, {
|
91
|
+
valueDomain: valueDomain
|
92
|
+
});
|
93
|
+
}
|
94
|
+
function getDimensionScale(step, props, dimensionUpdater) {
|
95
|
+
var key = dimensionUpdater.key;
|
96
|
+
var _step$triggers3 = step.triggers,
|
97
|
+
domain = _step$triggers3.domain,
|
98
|
+
range = _step$triggers3.range,
|
99
|
+
scaleType = _step$triggers3.scaleType,
|
100
|
+
fixed = _step$triggers3.fixed;
|
101
|
+
var onSet = step.onSet;
|
102
|
+
if (!this.state.dimensions[key].valueDomain) {
|
103
|
+
// the previous step should set valueDomain, if not, something went wrong
|
104
|
+
return;
|
105
|
+
}
|
106
|
+
var dimensionRange = props[range.prop];
|
107
|
+
var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
|
108
|
+
var dimensionFixed = Boolean(fixed && props[fixed.prop]);
|
109
|
+
var scaleFunctor = getScaleFunctor(scaleType && props[scaleType.prop])();
|
110
|
+
var scaleFunc = scaleFunctor.domain(dimensionDomain).range(dimensionFixed ? dimensionDomain : dimensionRange);
|
111
|
+
if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
|
112
|
+
props[onSet.props](scaleFunc.domain());
|
113
|
+
}
|
114
|
+
this._setDimensionState(key, {
|
115
|
+
scaleFunc: scaleFunc
|
116
|
+
});
|
117
|
+
}
|
118
|
+
function normalizeResult() {
|
119
|
+
var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
120
|
+
// support previous hexagonAggregator API
|
121
|
+
if (result.hexagons) {
|
122
|
+
return Object.assign({
|
123
|
+
data: result.hexagons
|
124
|
+
}, result);
|
125
|
+
} else if (result.layerData) {
|
126
|
+
return Object.assign({
|
127
|
+
data: result.layerData
|
128
|
+
}, result);
|
129
|
+
}
|
130
|
+
return result;
|
131
|
+
}
|
132
|
+
function getAggregatedData(step, props, aggregation, aggregationParams) {
|
133
|
+
var aggr = step.triggers.aggregator;
|
134
|
+
var aggregator = props[aggr.prop];
|
135
|
+
|
136
|
+
// result should contain a data array and other props
|
137
|
+
// result = {data: [], ...other props}
|
138
|
+
var result = aggregator(props, aggregationParams);
|
139
|
+
this.setState({
|
140
|
+
layerData: normalizeResult(result)
|
141
|
+
});
|
142
|
+
}
|
143
|
+
var defaultAggregation = exports.defaultAggregation = {
|
144
|
+
key: 'position',
|
145
|
+
updateSteps: [{
|
146
|
+
key: 'aggregate',
|
147
|
+
triggers: {
|
148
|
+
cellSize: {
|
149
|
+
prop: 'cellSize'
|
150
|
+
},
|
151
|
+
position: {
|
152
|
+
prop: 'getPosition',
|
153
|
+
updateTrigger: 'getPosition'
|
154
|
+
},
|
155
|
+
aggregator: {
|
156
|
+
prop: 'gridAggregator'
|
157
|
+
}
|
158
|
+
},
|
159
|
+
updater: getAggregatedData
|
160
|
+
}]
|
161
|
+
};
|
162
|
+
function getSubLayerAccessor(dimensionState, dimension) {
|
163
|
+
return function (cell) {
|
164
|
+
var sortedBins = dimensionState.sortedBins,
|
165
|
+
scaleFunc = dimensionState.scaleFunc;
|
166
|
+
var bin = sortedBins.binMap[cell.index];
|
167
|
+
if (bin && bin.counts === 0) {
|
168
|
+
// no points left in bin after filtering
|
169
|
+
return dimension.nullValue;
|
170
|
+
}
|
171
|
+
var cv = bin && bin.value;
|
172
|
+
var domain = scaleFunc.domain();
|
173
|
+
var isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];
|
174
|
+
|
175
|
+
// if cell value is outside domain, set alpha to 0
|
176
|
+
return isValueInDomain ? scaleFunc(cv) : dimension.nullValue;
|
177
|
+
};
|
178
|
+
}
|
179
|
+
var defaultColorDimension = exports.defaultColorDimension = {
|
180
|
+
key: 'fillColor',
|
181
|
+
accessor: 'getFillColor',
|
182
|
+
getPickingInfo: function getPickingInfo(dimensionState, cell) {
|
183
|
+
if (!cell) {
|
184
|
+
return {};
|
185
|
+
}
|
186
|
+
var sortedBins = dimensionState.sortedBins;
|
187
|
+
var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
|
188
|
+
return {
|
189
|
+
colorValue: colorValue
|
190
|
+
};
|
191
|
+
},
|
192
|
+
nullValue: [0, 0, 0, 0],
|
193
|
+
updateSteps: [{
|
194
|
+
key: 'getValue',
|
195
|
+
triggers: {
|
196
|
+
value: {
|
197
|
+
prop: 'getColorValue',
|
198
|
+
updateTrigger: 'getColorValue'
|
199
|
+
},
|
200
|
+
weight: {
|
201
|
+
prop: 'getColorWeight',
|
202
|
+
updateTrigger: 'getColorWeight'
|
203
|
+
},
|
204
|
+
aggregation: {
|
205
|
+
prop: 'colorAggregation'
|
206
|
+
}
|
207
|
+
},
|
208
|
+
updater: getGetValue
|
209
|
+
}, {
|
210
|
+
key: 'getBins',
|
211
|
+
triggers: {
|
212
|
+
_filterData: {
|
213
|
+
prop: '_filterData',
|
214
|
+
updateTrigger: '_filterData'
|
215
|
+
}
|
216
|
+
},
|
217
|
+
updater: getDimensionSortedBins
|
218
|
+
}, {
|
219
|
+
key: 'getDomain',
|
220
|
+
triggers: {
|
221
|
+
lowerPercentile: {
|
222
|
+
prop: 'lowerPercentile'
|
223
|
+
},
|
224
|
+
upperPercentile: {
|
225
|
+
prop: 'upperPercentile'
|
226
|
+
},
|
227
|
+
scaleType: {
|
228
|
+
prop: 'colorScaleType'
|
229
|
+
}
|
230
|
+
},
|
231
|
+
updater: getDimensionValueDomain
|
232
|
+
}, {
|
233
|
+
key: 'getScaleFunc',
|
234
|
+
triggers: {
|
235
|
+
domain: {
|
236
|
+
prop: 'colorDomain'
|
237
|
+
},
|
238
|
+
range: {
|
239
|
+
prop: 'colorRange'
|
240
|
+
},
|
241
|
+
scaleType: {
|
242
|
+
prop: 'colorScaleType'
|
243
|
+
}
|
244
|
+
},
|
245
|
+
onSet: {
|
246
|
+
props: 'onSetColorDomain'
|
247
|
+
},
|
248
|
+
updater: getDimensionScale
|
249
|
+
}],
|
250
|
+
getSubLayerAccessor: getSubLayerAccessor
|
251
|
+
};
|
252
|
+
var defaultElevationDimension = exports.defaultElevationDimension = {
|
253
|
+
key: 'elevation',
|
254
|
+
accessor: 'getElevation',
|
255
|
+
getPickingInfo: function getPickingInfo(dimensionState, cell) {
|
256
|
+
if (!cell) {
|
257
|
+
return {};
|
258
|
+
}
|
259
|
+
var sortedBins = dimensionState.sortedBins;
|
260
|
+
var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
|
261
|
+
return {
|
262
|
+
elevationValue: elevationValue
|
263
|
+
};
|
264
|
+
},
|
265
|
+
nullValue: -1,
|
266
|
+
updateSteps: [{
|
267
|
+
key: 'getValue',
|
268
|
+
triggers: {
|
269
|
+
value: {
|
270
|
+
prop: 'getElevationValue',
|
271
|
+
updateTrigger: 'getElevationValue'
|
272
|
+
},
|
273
|
+
weight: {
|
274
|
+
prop: 'getElevationWeight',
|
275
|
+
updateTrigger: 'getElevationWeight'
|
276
|
+
},
|
277
|
+
aggregation: {
|
278
|
+
prop: 'elevationAggregation'
|
279
|
+
}
|
280
|
+
},
|
281
|
+
updater: getGetValue
|
282
|
+
}, {
|
283
|
+
key: 'getBins',
|
284
|
+
triggers: {
|
285
|
+
_filterData: {
|
286
|
+
prop: '_filterData',
|
287
|
+
updateTrigger: '_filterData'
|
288
|
+
}
|
289
|
+
},
|
290
|
+
updater: getDimensionSortedBins
|
291
|
+
}, {
|
292
|
+
key: 'getDomain',
|
293
|
+
triggers: {
|
294
|
+
lowerPercentile: {
|
295
|
+
prop: 'elevationLowerPercentile'
|
296
|
+
},
|
297
|
+
upperPercentile: {
|
298
|
+
prop: 'elevationUpperPercentile'
|
299
|
+
},
|
300
|
+
scaleType: {
|
301
|
+
prop: 'elevationScaleType'
|
302
|
+
}
|
303
|
+
},
|
304
|
+
updater: getDimensionValueDomain
|
305
|
+
}, {
|
306
|
+
key: 'getScaleFunc',
|
307
|
+
triggers: {
|
308
|
+
fixed: {
|
309
|
+
prop: 'elevationFixed'
|
310
|
+
},
|
311
|
+
domain: {
|
312
|
+
prop: 'elevationDomain'
|
313
|
+
},
|
314
|
+
range: {
|
315
|
+
prop: 'elevationRange'
|
316
|
+
},
|
317
|
+
scaleType: {
|
318
|
+
prop: 'elevationScaleType'
|
319
|
+
}
|
320
|
+
},
|
321
|
+
onSet: {
|
322
|
+
props: 'onSetElevationDomain'
|
323
|
+
},
|
324
|
+
updater: getDimensionScale
|
325
|
+
}],
|
326
|
+
getSubLayerAccessor: getSubLayerAccessor
|
327
|
+
};
|
328
|
+
var _defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
|
329
|
+
var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
330
|
+
function CPUAggregator() {
|
331
|
+
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
332
|
+
(0, _classCallCheck2["default"])(this, CPUAggregator);
|
333
|
+
(0, _defineProperty2["default"])(this, "state", void 0);
|
334
|
+
(0, _defineProperty2["default"])(this, "dimensionUpdaters", void 0);
|
335
|
+
(0, _defineProperty2["default"])(this, "aggregationUpdater", void 0);
|
336
|
+
this.state = _objectSpread({
|
337
|
+
layerData: {},
|
338
|
+
dimensions: {
|
339
|
+
// color: {
|
340
|
+
// getValue: null,
|
341
|
+
// domain: null,
|
342
|
+
// sortedBins: null,
|
343
|
+
// scaleFunc: nop
|
344
|
+
// },
|
345
|
+
// elevation: {
|
346
|
+
// getValue: null,
|
347
|
+
// domain: null,
|
348
|
+
// sortedBins: null,
|
349
|
+
// scaleFunc: nop
|
350
|
+
// }
|
351
|
+
}
|
352
|
+
}, opts.initialState);
|
353
|
+
this.dimensionUpdaters = {};
|
354
|
+
this.aggregationUpdater = opts.aggregation || defaultAggregation;
|
355
|
+
this._addDimension(opts.dimensions || _defaultDimensions);
|
356
|
+
}
|
357
|
+
return (0, _createClass2["default"])(CPUAggregator, [{
|
358
|
+
key: "updateAllDimensions",
|
359
|
+
value: function updateAllDimensions(props) {
|
360
|
+
var dimensionChanges = [];
|
361
|
+
// update all dimensions
|
362
|
+
for (var dim in this.dimensionUpdaters) {
|
363
|
+
var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
|
364
|
+
dimensionChanges = dimensionChanges.concat(updaters);
|
365
|
+
}
|
366
|
+
dimensionChanges.forEach(function (f) {
|
367
|
+
return typeof f === 'function' && f();
|
368
|
+
});
|
369
|
+
}
|
370
|
+
}, {
|
371
|
+
key: "updateAggregation",
|
372
|
+
value: function updateAggregation(props, aggregationParams) {
|
373
|
+
var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
|
374
|
+
updaters.forEach(function (f) {
|
375
|
+
return typeof f === 'function' && f(aggregationParams);
|
376
|
+
});
|
377
|
+
}
|
378
|
+
}, {
|
379
|
+
key: "updateState",
|
380
|
+
value: function updateState(opts, aggregationParams) {
|
381
|
+
var oldProps = opts.oldProps,
|
382
|
+
props = opts.props,
|
383
|
+
changeFlags = opts.changeFlags;
|
384
|
+
var dimensionChanges = [];
|
385
|
+
if (changeFlags.dataChanged) {
|
386
|
+
// if data changed update everything
|
387
|
+
this.updateAggregation(props, aggregationParams);
|
388
|
+
this.updateAllDimensions(props);
|
389
|
+
return this.state;
|
390
|
+
}
|
391
|
+
var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
|
392
|
+
if (aggregationChanges && aggregationChanges.length) {
|
393
|
+
// get aggregatedData
|
394
|
+
aggregationChanges.forEach(function (f) {
|
395
|
+
return typeof f === 'function' && f(aggregationParams);
|
396
|
+
});
|
397
|
+
this.updateAllDimensions(props);
|
398
|
+
} else {
|
399
|
+
// only update dimensions
|
400
|
+
dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
|
401
|
+
dimensionChanges.forEach(function (f) {
|
402
|
+
return typeof f === 'function' && f();
|
403
|
+
});
|
404
|
+
}
|
405
|
+
return this.state;
|
406
|
+
}
|
407
|
+
|
408
|
+
// Update private state
|
409
|
+
}, {
|
410
|
+
key: "setState",
|
411
|
+
value: function setState(updateObject) {
|
412
|
+
this.state = Object.assign({}, this.state, updateObject);
|
413
|
+
}
|
414
|
+
|
415
|
+
// Update private state.dimensions
|
416
|
+
}, {
|
417
|
+
key: "_setDimensionState",
|
418
|
+
value: function _setDimensionState(key, updateObject) {
|
419
|
+
this.setState({
|
420
|
+
dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
|
421
|
+
});
|
422
|
+
}
|
423
|
+
}, {
|
424
|
+
key: "_addAggregation",
|
425
|
+
value: function _addAggregation(aggregation) {
|
426
|
+
this.aggregationUpdater = aggregation;
|
427
|
+
}
|
428
|
+
}, {
|
429
|
+
key: "_addDimension",
|
430
|
+
value: function _addDimension() {
|
431
|
+
var _this = this;
|
432
|
+
var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
433
|
+
dimensions.forEach(function (dimension) {
|
434
|
+
var key = dimension.key;
|
435
|
+
_this.dimensionUpdaters[key] = dimension;
|
436
|
+
});
|
437
|
+
}
|
438
|
+
}, {
|
439
|
+
key: "_needUpdateStep",
|
440
|
+
value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
|
441
|
+
// whether need to update current dimension step
|
442
|
+
// dimension step is the value, domain, scaleFunction of each dimension
|
443
|
+
// each step is an object with properties links to layer prop and whether the prop is
|
444
|
+
// controlled by updateTriggers
|
445
|
+
return Object.values(dimensionStep.triggers).some(function (item) {
|
446
|
+
if (item.updateTrigger) {
|
447
|
+
// check based on updateTriggers change first
|
448
|
+
return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
|
449
|
+
}
|
450
|
+
// fallback to direct comparison
|
451
|
+
return oldProps[item.prop] !== props[item.prop];
|
452
|
+
});
|
453
|
+
}
|
454
|
+
}, {
|
455
|
+
key: "_accumulateUpdaters",
|
456
|
+
value: function _accumulateUpdaters(step, props, dimension) {
|
457
|
+
var updaters = [];
|
458
|
+
for (var i = step; i < dimension.updateSteps.length; i++) {
|
459
|
+
var updater = dimension.updateSteps[i].updater;
|
460
|
+
if (typeof updater === 'function') {
|
461
|
+
updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
|
462
|
+
}
|
463
|
+
}
|
464
|
+
return updaters;
|
465
|
+
}
|
466
|
+
}, {
|
467
|
+
key: "_getAllUpdaters",
|
468
|
+
value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
|
469
|
+
var _this2 = this;
|
470
|
+
var updaters = [];
|
471
|
+
var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
|
472
|
+
return _this2._needUpdateStep(step, oldProps, props, changeFlags);
|
473
|
+
});
|
474
|
+
if (needUpdateStep > -1) {
|
475
|
+
updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
|
476
|
+
}
|
477
|
+
return updaters;
|
478
|
+
}
|
479
|
+
}, {
|
480
|
+
key: "_getAggregationChanges",
|
481
|
+
value: function _getAggregationChanges(oldProps, props, changeFlags) {
|
482
|
+
var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
|
483
|
+
return updaters.length ? updaters : null;
|
484
|
+
}
|
485
|
+
}, {
|
486
|
+
key: "_getDimensionChanges",
|
487
|
+
value: function _getDimensionChanges(oldProps, props, changeFlags) {
|
488
|
+
var updaters = [];
|
489
|
+
|
490
|
+
// get dimension to be updated
|
491
|
+
for (var key in this.dimensionUpdaters) {
|
492
|
+
// return the first triggered updater for each dimension
|
493
|
+
var dimension = this.dimensionUpdaters[key];
|
494
|
+
var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
|
495
|
+
updaters = updaters.concat(dimensionUpdaters);
|
496
|
+
}
|
497
|
+
return updaters.length ? updaters : null;
|
498
|
+
}
|
499
|
+
}, {
|
500
|
+
key: "getUpdateTriggers",
|
501
|
+
value: function getUpdateTriggers(props) {
|
502
|
+
var _this3 = this;
|
503
|
+
var _updateTriggers = props.updateTriggers || {};
|
504
|
+
var updateTriggers = {};
|
505
|
+
var _loop = function _loop() {
|
506
|
+
var _this3$dimensionUpdat = _this3.dimensionUpdaters[key],
|
507
|
+
accessor = _this3$dimensionUpdat.accessor,
|
508
|
+
updateSteps = _this3$dimensionUpdat.updateSteps;
|
509
|
+
// fold dimension triggers into each accessor
|
510
|
+
updateTriggers[accessor] = {};
|
511
|
+
updateSteps.forEach(function (step) {
|
512
|
+
Object.values(step.triggers || []).forEach(function (_ref) {
|
513
|
+
var prop = _ref.prop,
|
514
|
+
updateTrigger = _ref.updateTrigger;
|
515
|
+
if (updateTrigger) {
|
516
|
+
// if prop is based on updateTrigger e.g. getColorValue, getColorWeight
|
517
|
+
// and updateTriggers is passed in from layer prop
|
518
|
+
// fold the updateTriggers into accessor
|
519
|
+
var fromProp = _updateTriggers[updateTrigger];
|
520
|
+
if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
|
521
|
+
// if updateTrigger is an object spread it
|
522
|
+
Object.assign(updateTriggers[accessor], fromProp);
|
523
|
+
} else if (fromProp !== undefined) {
|
524
|
+
updateTriggers[accessor][prop] = fromProp;
|
525
|
+
}
|
526
|
+
} else {
|
527
|
+
// if prop is not based on updateTrigger
|
528
|
+
updateTriggers[accessor][prop] = props[prop];
|
529
|
+
}
|
530
|
+
});
|
531
|
+
});
|
532
|
+
};
|
533
|
+
for (var key in this.dimensionUpdaters) {
|
534
|
+
_loop();
|
535
|
+
}
|
536
|
+
return updateTriggers;
|
537
|
+
}
|
538
|
+
}, {
|
539
|
+
key: "getPickingInfo",
|
540
|
+
value: function getPickingInfo(_ref2, layerProps) {
|
541
|
+
var info = _ref2.info;
|
542
|
+
var isPicked = info.picked && info.index > -1;
|
543
|
+
var object = null;
|
544
|
+
var cell = isPicked ? this.state.layerData.data[info.index] : null;
|
545
|
+
if (cell) {
|
546
|
+
var binInfo = {};
|
547
|
+
for (var key in this.dimensionUpdaters) {
|
548
|
+
var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
|
549
|
+
if (typeof _getPickingInfo === 'function') {
|
550
|
+
binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
|
551
|
+
}
|
552
|
+
}
|
553
|
+
object = Object.assign(binInfo, cell, {
|
554
|
+
points: cell.filteredPoints || cell.points
|
555
|
+
});
|
556
|
+
}
|
557
|
+
|
558
|
+
// add bin and to info
|
559
|
+
return Object.assign(info, {
|
560
|
+
picked: Boolean(object),
|
561
|
+
// override object with picked cell
|
562
|
+
object: object
|
563
|
+
});
|
564
|
+
}
|
565
|
+
}, {
|
566
|
+
key: "getAccessor",
|
567
|
+
value: function getAccessor(dimensionKey, layerProps) {
|
568
|
+
if (!Object.prototype.hasOwnProperty.call(this.dimensionUpdaters, dimensionKey)) {
|
569
|
+
return nop;
|
570
|
+
}
|
571
|
+
return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
|
572
|
+
}
|
573
|
+
}], [{
|
574
|
+
key: "defaultDimensions",
|
575
|
+
value: function defaultDimensions() {
|
576
|
+
return _defaultDimensions;
|
577
|
+
}
|
578
|
+
}]);
|
579
|
+
}();
|
580
|
+
(0, _defineProperty2["default"])(CPUAggregator, "getDimensionScale", void 0);
|
581
|
+
CPUAggregator.getDimensionScale = getDimensionScale;
|
582
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl91dGlscyIsIl9jb25zdGFudHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiZXhwb3J0cyIsIkFHR1JFR0FUSU9OX09QRVJBVElPTiIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0Iiwib3AiLCJrZXBsZXJPcCIsInB0cyIsImFnZ3JlZ2F0ZSIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsIl9zdGVwJHRyaWdnZXJzIiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwiX3N0ZXAkdHJpZ2dlcnMyIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJnZXREaW1lbnNpb25TY2FsZSIsIl9zdGVwJHRyaWdnZXJzMyIsImRvbWFpbiIsInJhbmdlIiwiZml4ZWQiLCJvblNldCIsImRpbWVuc2lvblJhbmdlIiwiZGltZW5zaW9uRG9tYWluIiwiZGltZW5zaW9uRml4ZWQiLCJCb29sZWFuIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwiX3R5cGVvZjIiLCJub3JtYWxpemVSZXN1bHQiLCJyZXN1bHQiLCJ1bmRlZmluZWQiLCJoZXhhZ29ucyIsImFzc2lnbiIsImdldEFnZ3JlZ2F0ZWREYXRhIiwiYWdncmVnYXRpb25QYXJhbXMiLCJhZ2dyIiwiYWdncmVnYXRvciIsInNldFN0YXRlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RlcHMiLCJjZWxsU2l6ZSIsInBvc2l0aW9uIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRTdWJMYXllckFjY2Vzc29yIiwiZGltZW5zaW9uU3RhdGUiLCJkaW1lbnNpb24iLCJjZWxsIiwiYmluIiwiYmluTWFwIiwiaW5kZXgiLCJjb3VudHMiLCJudWxsVmFsdWUiLCJjdiIsImlzVmFsdWVJbkRvbWFpbiIsImRlZmF1bHRDb2xvckRpbWVuc2lvbiIsImdldFBpY2tpbmdJbmZvIiwiY29sb3JWYWx1ZSIsImRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb24iLCJlbGV2YXRpb25WYWx1ZSIsImRlZmF1bHREaW1lbnNpb25zIiwiQ1BVQWdncmVnYXRvciIsIm9wdHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiaW5pdGlhbFN0YXRlIiwiZGltZW5zaW9uVXBkYXRlcnMiLCJhZ2dyZWdhdGlvblVwZGF0ZXIiLCJfYWRkRGltZW5zaW9uIiwiX2NyZWF0ZUNsYXNzMiIsInVwZGF0ZUFsbERpbWVuc2lvbnMiLCJkaW1lbnNpb25DaGFuZ2VzIiwiZGltIiwidXBkYXRlcnMiLCJfYWNjdW11bGF0ZVVwZGF0ZXJzIiwiZiIsInVwZGF0ZUFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RhdGUiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwiZGF0YUNoYW5nZWQiLCJhZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0QWdncmVnYXRpb25DaGFuZ2VzIiwiX2dldERpbWVuc2lvbkNoYW5nZXMiLCJ1cGRhdGVPYmplY3QiLCJfYWRkQWdncmVnYXRpb24iLCJfdGhpcyIsIl9uZWVkVXBkYXRlU3RlcCIsImRpbWVuc2lvblN0ZXAiLCJ2YWx1ZXMiLCJzb21lIiwiaXRlbSIsInVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCIsImFsbCIsImkiLCJiaW5kIiwiX2dldEFsbFVwZGF0ZXJzIiwiX3RoaXMyIiwibmVlZFVwZGF0ZVN0ZXAiLCJmaW5kSW5kZXgiLCJnZXRVcGRhdGVUcmlnZ2VycyIsIl90aGlzMyIsIl91cGRhdGVUcmlnZ2VycyIsInVwZGF0ZVRyaWdnZXJzIiwiX2xvb3AiLCJfdGhpczMkZGltZW5zaW9uVXBkYXQiLCJfcmVmIiwiZnJvbVByb3AiLCJBcnJheSIsImlzQXJyYXkiLCJfcmVmMiIsImxheWVyUHJvcHMiLCJpbmZvIiwiaXNQaWNrZWQiLCJwaWNrZWQiLCJvYmplY3QiLCJiaW5JbmZvIiwicG9pbnRzIiwiZmlsdGVyZWRQb2ludHMiLCJnZXRBY2Nlc3NvciIsImRpbWVuc2lvbktleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB7QUdHUkVHQVRJT05fT1BFUkFUSU9OLCBfQmluU29ydGVyIGFzIEJpblNvcnRlcn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtBR0dSRUdBVElPTl9UWVBFUywgU0NBTEVfRlVOQ30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtSR0JBQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyVHlwZSA9ICh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZFVwZGF0ZXJUeXBlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChcbiAgdGhpczogQ1BVQWdncmVnYXRvcixcbiAgc3RlcCxcbiAgcHJvcHMsXG4gIGFnZ3JlZ2F0aW9uLFxuICBhZ2dyZWdhdGlvblBhcmFtc1xuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlID0gKGFnZ3JlZ2F0aW9uUGFyYW1zKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25TZXQ/OiB7XG4gICAgcHJvcHM6IHN0cmluZztcbiAgfTtcbiAgdXBkYXRlcjogVXBkYXRlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEaW1lbnNpb25UeXBlPFZhbHVlVHlwZSA9IGFueT4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsLCBsYXllclByb3BzPykgPT4gYW55O1xuICBudWxsVmFsdWU6IFZhbHVlVHlwZTtcbiAgdXBkYXRlU3RlcHM6IFVwZGF0ZVN0ZXBzVHlwZVtdO1xuICBnZXRTdWJMYXllckFjY2Vzc29yO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgdXBkYXRlcjogQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdXBkYXRlU3RlcHM6IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlW107XG59O1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVAgPSB7XG4gIFtBR0dSRUdBVElPTl9PUEVSQVRJT04uU1VNXTogQUdHUkVHQVRJT05fVFlQRVMuc3VtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1FQU5dOiBBR0dSRUdBVElPTl9UWVBFUy5hdmVyYWdlLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1JTl06IEFHR1JFR0FUSU9OX1RZUEVTLm1pbmltdW0sXG4gIFtBR0dSRUdBVElPTl9PUEVSQVRJT04uTUFYXTogQUdHUkVHQVRJT05fVFlQRVMubWF4aW11bVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRnVuYyhhZ2dyZWdhdGlvbiwgYWNjZXNzb3IpIHtcbiAgaWYgKCFhZ2dyZWdhdGlvbiB8fCAhQUdHUkVHQVRJT05fT1BFUkFUSU9OW2FnZ3JlZ2F0aW9uLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgQ29uc29sZS53YXJuKGBBZ2dyZWdhdGlvbiAke2FnZ3JlZ2F0aW9ufSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBvcCA9IEFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSB8fCBBR0dSRUdBVElPTl9PUEVSQVRJT04uU1VNO1xuICBjb25zdCBrZXBsZXJPcCA9IERFQ0tfQUdHUkVHQVRJT05fTUFQW29wXTtcblxuICByZXR1cm4gcHRzID0+IGFnZ3JlZ2F0ZShwdHMubWFwKGFjY2Vzc29yKSwga2VwbGVyT3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGdW5jdG9yKHNjYWxlVHlwZSkge1xuICBpZiAoIXNjYWxlVHlwZSB8fCAhU0NBTEVfRlVOQ1tzY2FsZVR5cGVdKSB7XG4gICAgQ29uc29sZS53YXJuKGBTY2FsZSAke3NjYWxlVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlVHlwZV0gfHwgU0NBTEVfRlVOQy5xdWFudGl6ZTtcbn1cblxuZnVuY3Rpb24gbm9wKCkge1xuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3Qgc29ydGVkQmlucyA9IG5ldyBCaW5Tb3J0ZXIodGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YSB8fCBbXSwge1xuICAgIGdldFZhbHVlLFxuICAgIGZpbHRlckRhdGE6IHByb3BzLl9maWx0ZXJEYXRhXG4gIH0pO1xuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzb3J0ZWRCaW5zfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25WYWx1ZURvbWFpbih0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtcbiAgICB0cmlnZ2Vyczoge2xvd2VyUGVyY2VudGlsZSwgdXBwZXJQZXJjZW50aWxlLCBzY2FsZVR5cGV9XG4gIH0gPSBzdGVwO1xuXG4gIGlmICghdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucykge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgc29ydGVkQmlucywgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGZvciBsb2cgYW5kIHNxcnQgc2NhbGUsIHJldHVybnMgbGluZWFyIGRvbWFpbiBieSBkZWZhdWx0XG4gIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2NhbGUgZnVuY3Rpb24gZG9tYWluIGluIGJpbiBzb3J0ZXJcbiAgY29uc3QgdmFsdWVEb21haW4gPSB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zLmdldFZhbHVlRG9tYWluQnlTY2FsZShcbiAgICBwcm9wc1tzY2FsZVR5cGUucHJvcF0sXG4gICAgW3Byb3BzW2xvd2VyUGVyY2VudGlsZS5wcm9wXSwgcHJvcHNbdXBwZXJQZXJjZW50aWxlLnByb3BdXVxuICApO1xuXG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3ZhbHVlRG9tYWlufSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25TY2FsZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtkb21haW4sIHJhbmdlLCBzY2FsZVR5cGUsIGZpeGVkfSA9IHN0ZXAudHJpZ2dlcnM7XG4gIGNvbnN0IHtvblNldH0gPSBzdGVwO1xuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCB2YWx1ZURvbWFpbiwgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvblJhbmdlID0gcHJvcHNbcmFuZ2UucHJvcF07XG4gIGNvbnN0IGRpbWVuc2lvbkRvbWFpbiA9IHByb3BzW2RvbWFpbi5wcm9wXSB8fCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbjtcbiAgY29uc3QgZGltZW5zaW9uRml4ZWQgPSBCb29sZWFuKGZpeGVkICYmIHByb3BzW2ZpeGVkLnByb3BdKTtcblxuICBjb25zdCBzY2FsZUZ1bmN0b3IgPSBnZXRTY2FsZUZ1bmN0b3Ioc2NhbGVUeXBlICYmIHByb3BzW3NjYWxlVHlwZS5wcm9wXSkoKTtcblxuICBjb25zdCBzY2FsZUZ1bmMgPSBzY2FsZUZ1bmN0b3JcbiAgICAuZG9tYWluKGRpbWVuc2lvbkRvbWFpbilcbiAgICAucmFuZ2UoZGltZW5zaW9uRml4ZWQgPyBkaW1lbnNpb25Eb21haW4gOiBkaW1lbnNpb25SYW5nZSk7XG5cbiAgaWYgKHR5cGVvZiBvblNldCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb3BzW29uU2V0LnByb3BzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3BzW29uU2V0LnByb3BzXShzY2FsZUZ1bmMuZG9tYWluKCkpO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbikge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGNvbG9yVmFsdWUgPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XSAmJiBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XS52YWx1ZTtcbiAgICByZXR1cm4ge2NvbG9yVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IFswLCAwLCAwLCAwXSxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdnZXRWYWx1ZScsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvclZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JWYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yV2VpZ2h0JyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JXZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2NvbG9yQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdsb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICd1cHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uVmFsdWVEb21haW5cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldFNjYWxlRnVuYycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBkb21haW46IHtwcm9wOiAnY29sb3JEb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnY29sb3JSYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIG9uU2V0OiB7XG4gICAgICAgIHByb3BzOiAnb25TZXRDb2xvckRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb246IERpbWVuc2lvblR5cGU8bnVtYmVyPiA9IHtcbiAga2V5OiAnZWxldmF0aW9uJyxcbiAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtlbGV2YXRpb25WYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogLTEsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0RWxldmF0aW9uVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25WYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvbldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldEVsZXZhdGlvbldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25Mb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25VcHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdlbGV2YXRpb25TY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZml4ZWQ6IHtwcm9wOiAnZWxldmF0aW9uRml4ZWQnfSxcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2VsZXZhdGlvbkRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdlbGV2YXRpb25SYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0RWxldmF0aW9uRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpbWVuc2lvbnMgPSBbZGVmYXVsdENvbG9yRGltZW5zaW9uLCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uXTtcblxuZXhwb3J0IHR5cGUgQ1BVQWdncmVnYXRvclN0YXRlID0ge1xuICBsYXllckRhdGE6IHtkYXRhP307XG4gIGRpbWVuc2lvbnM6IG9iamVjdDtcbiAgZ2VvSlNPTj87XG4gIGNsdXN0ZXJCdWlsZGVyPztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENQVUFnZ3JlZ2F0b3Ige1xuICBzdGF0aWMgZ2V0RGltZW5zaW9uU2NhbGU6IGFueTtcbiAgc3RhdGU6IENQVUFnZ3JlZ2F0b3JTdGF0ZTtcbiAgZGltZW5zaW9uVXBkYXRlcnM6IHtba2V5OiBzdHJpbmddOiBEaW1lbnNpb25UeXBlfTtcbiAgYWdncmVnYXRpb25VcGRhdGVyOiBBZ2dyZWdhdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0czoge1xuICAgICAgaW5pdGlhbFN0YXRlPzogQ1BVQWdncmVnYXRvclN0YXRlO1xuICAgICAgZGltZW5zaW9ucz86IERpbWVuc2lvblR5cGVbXTtcbiAgICAgIGFnZ3JlZ2F0aW9uPzogQWdncmVnYXRpb25UeXBlO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbGF5ZXJEYXRhOiB7fSxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgLy8gY29sb3I6IHtcbiAgICAgICAgLy8gICBnZXRWYWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBkb21haW46IG51bGwsXG4gICAgICAgIC8vICAgc29ydGVkQmluczogbnVsbCxcbiAgICAgICAgLy8gICBzY2FsZUZ1bmM6IG5vcFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBlbGV2YXRpb246IHtcbiAgICAgICAgLy8gICBnZXRWYWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBkb21haW46IG51bGwsXG4gICAgICAgIC8vICAgc29ydGVkQmluczogbnVsbCxcbiAgICAgICAgLy8gICBzY2FsZUZ1bmM6IG5vcFxuICAgICAgICAvLyB9XG4gICAgICB9LFxuICAgICAgLi4ub3B0cy5pbml0aWFsU3RhdGVcbiAgICB9O1xuXG4gICAgdGhpcy5kaW1lbnNpb25VcGRhdGVycyA9IHt9O1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gb3B0cy5hZ2dyZWdhdGlvbiB8fCBkZWZhdWx0QWdncmVnYXRpb247XG5cbiAgICB0aGlzLl9hZGREaW1lbnNpb24ob3B0cy5kaW1lbnNpb25zIHx8IGRlZmF1bHREaW1lbnNpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyBkZWZhdWx0RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gZGVmYXVsdERpbWVuc2lvbnM7XG4gIH1cblxuICB1cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKSB7XG4gICAgbGV0IGRpbWVuc2lvbkNoYW5nZXM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICAvLyB1cGRhdGUgYWxsIGRpbWVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGRpbSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB1cGRhdGVycyA9IHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycygwLCBwcm9wcywgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1dKTtcbiAgICAgIGRpbWVuc2lvbkNoYW5nZXMgPSBkaW1lbnNpb25DaGFuZ2VzLmNvbmNhdCh1cGRhdGVycyk7XG4gICAgfVxuXG4gICAgZGltZW5zaW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZigpKTtcbiAgfVxuXG4gIHVwZGF0ZUFnZ3JlZ2F0aW9uKHByb3BzLCBhZ2dyZWdhdGlvblBhcmFtcykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlcik7XG4gICAgdXBkYXRlcnMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoYWdncmVnYXRpb25QYXJhbXMpKTtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKG9wdHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3Qge29sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3N9ID0gb3B0cztcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICAvLyBpZiBkYXRhIGNoYW5nZWQgdXBkYXRlIGV2ZXJ5dGhpbmdcbiAgICAgIHRoaXMudXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgICAgIHRoaXMudXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wcyk7XG5cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ2hhbmdlcyA9IHRoaXMuX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKTtcblxuICAgIGlmIChhZ2dyZWdhdGlvbkNoYW5nZXMgJiYgYWdncmVnYXRpb25DaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgLy8gZ2V0IGFnZ3JlZ2F0ZWREYXRhXG4gICAgICBhZ2dyZWdhdGlvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoYWdncmVnYXRpb25QYXJhbXMpKTtcbiAgICAgIHRoaXMudXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9ubHkgdXBkYXRlIGRpbWVuc2lvbnNcbiAgICAgIGRpbWVuc2lvbkNoYW5nZXMgPSB0aGlzLl9nZXREaW1lbnNpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpIHx8IFtdO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcml2YXRlIHN0YXRlXG4gIHNldFN0YXRlKHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLCB1cGRhdGVPYmplY3QpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGUuZGltZW5zaW9uc1xuICBfc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB1cGRhdGVPYmplY3QpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRpbWVuc2lvbnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUuZGltZW5zaW9ucywge1xuICAgICAgICBba2V5XTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIHVwZGF0ZU9iamVjdClcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBfYWRkQWdncmVnYXRpb24oYWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gYWdncmVnYXRpb247XG4gIH1cblxuICBfYWRkRGltZW5zaW9uKGRpbWVuc2lvbnM6IERpbWVuc2lvblR5cGVbXSA9IFtdKSB7XG4gICAgZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG4gICAgICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvbjtcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XSA9IGRpbWVuc2lvbjtcbiAgICB9KTtcbiAgfVxuXG4gIF9uZWVkVXBkYXRlU3RlcChcbiAgICBkaW1lbnNpb25TdGVwOiBVcGRhdGVTdGVwc1R5cGUgfCBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICAvLyB3aGV0aGVyIG5lZWQgdG8gdXBkYXRlIGN1cnJlbnQgZGltZW5zaW9uIHN0ZXBcbiAgICAvLyBkaW1lbnNpb24gc3RlcCBpcyB0aGUgdmFsdWUsIGRvbWFpbiwgc2NhbGVGdW5jdGlvbiBvZiBlYWNoIGRpbWVuc2lvblxuICAgIC8vIGVhY2ggc3RlcCBpcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGxpbmtzIHRvIGxheWVyIHByb3AgYW5kIHdoZXRoZXIgdGhlIHByb3AgaXNcbiAgICAvLyBjb250cm9sbGVkIGJ5IHVwZGF0ZVRyaWdnZXJzXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZGltZW5zaW9uU3RlcC50cmlnZ2Vycykuc29tZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLnVwZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgLy8gY2hlY2sgYmFzZWQgb24gdXBkYXRlVHJpZ2dlcnMgY2hhbmdlIGZpcnN0XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkICYmXG4gICAgICAgICAgKGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZC5hbGwgfHxcbiAgICAgICAgICAgIGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZFtpdGVtLnVwZGF0ZVRyaWdnZXJdKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZmFsbGJhY2sgdG8gZGlyZWN0IGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBvbGRQcm9wc1tpdGVtLnByb3BdICE9PSBwcm9wc1tpdGVtLnByb3BdO1xuICAgIH0pO1xuICB9XG5cbiAgX2FjY3VtdWxhdGVVcGRhdGVyczxVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGUgfCBBZ2dyZWdhdGlvblR5cGU+KFxuICAgIHN0ZXAsXG4gICAgcHJvcHMsXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZVxuICApIHtcbiAgICB0eXBlIExvY2FsVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gc3RlcDsgaSA8IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXS51cGRhdGVyO1xuICAgICAgaWYgKHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZXJzLnB1c2goXG4gICAgICAgICAgdXBkYXRlci5iaW5kKHRoaXMsIGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXSwgcHJvcHMsIGRpbWVuc2lvbikgYXMgTG9jYWxVcGRhdGVyVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBbGxVcGRhdGVyczxVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGUgfCBBZ2dyZWdhdGlvblR5cGU+KFxuICAgIGRpbWVuc2lvbjogVXBkYXRlck9iamVjdFR5cGUsXG4gICAgb2xkUHJvcHMsXG4gICAgcHJvcHMsXG4gICAgY2hhbmdlRmxhZ3NcbiAgKSB7XG4gICAgdHlwZSBMb2NhbFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IExvY2FsVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIGNvbnN0IG5lZWRVcGRhdGVTdGVwID0gZGltZW5zaW9uLnVwZGF0ZVN0ZXBzLmZpbmRJbmRleChzdGVwID0+XG4gICAgICB0aGlzLl9uZWVkVXBkYXRlU3RlcChzdGVwLCBvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKVxuICAgICk7XG5cbiAgICBpZiAobmVlZFVwZGF0ZVN0ZXAgPiAtMSkge1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQodGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKG5lZWRVcGRhdGVTdGVwLCBwcm9wcywgZGltZW5zaW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyh0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIF9nZXREaW1lbnNpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpIHtcbiAgICBsZXQgdXBkYXRlcnM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcblxuICAgIC8vIGdldCBkaW1lbnNpb24gdG8gYmUgdXBkYXRlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgdHJpZ2dlcmVkIHVwZGF0ZXIgZm9yIGVhY2ggZGltZW5zaW9uXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICBjb25zdCBkaW1lbnNpb25VcGRhdGVycyA9IHRoaXMuX2dldEFsbFVwZGF0ZXJzKGRpbWVuc2lvbiwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgICB1cGRhdGVycyA9IHVwZGF0ZXJzLmNvbmNhdChkaW1lbnNpb25VcGRhdGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIGdldFVwZGF0ZVRyaWdnZXJzKHByb3BzKSB7XG4gICAgY29uc3QgX3VwZGF0ZVRyaWdnZXJzID0gcHJvcHMudXBkYXRlVHJpZ2dlcnMgfHwge307XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHthY2Nlc3NvciwgdXBkYXRlU3RlcHN9OiB7YWNjZXNzb3I7IHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXX0gPVxuICAgICAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAvLyBmb2xkIGRpbWVuc2lvbiB0cmlnZ2VycyBpbnRvIGVhY2ggYWNjZXNzb3JcbiAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSA9IHt9O1xuXG4gICAgICB1cGRhdGVTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICBPYmplY3QudmFsdWVzKHN0ZXAudHJpZ2dlcnMgfHwgW10pLmZvckVhY2goKHtwcm9wLCB1cGRhdGVUcmlnZ2VyfSkgPT4ge1xuICAgICAgICAgIGlmICh1cGRhdGVUcmlnZ2VyKSB7XG4gICAgICAgICAgICAvLyBpZiBwcm9wIGlzIGJhc2VkIG9uIHVwZGF0ZVRyaWdnZXIgZS5nLiBnZXRDb2xvclZhbHVlLCBnZXRDb2xvcldlaWdodFxuICAgICAgICAgICAgLy8gYW5kIHVwZGF0ZVRyaWdnZXJzIGlzIHBhc3NlZCBpbiBmcm9tIGxheWVyIHByb3BcbiAgICAgICAgICAgIC8vIGZvbGQgdGhlIHVwZGF0ZVRyaWdnZXJzIGludG8gYWNjZXNzb3JcbiAgICAgICAgICAgIGNvbnN0IGZyb21Qcm9wID0gX3VwZGF0ZVRyaWdnZXJzW3VwZGF0ZVRyaWdnZXJdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmcm9tUHJvcCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZnJvbVByb3ApKSB7XG4gICAgICAgICAgICAgIC8vIGlmIHVwZGF0ZVRyaWdnZXIgaXMgYW4gb2JqZWN0IHNwcmVhZCBpdFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSwgZnJvbVByb3ApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmcm9tUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXVtwcm9wXSA9IGZyb21Qcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBwcm9wIGlzIG5vdCBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVRyaWdnZXJzO1xuICB9XG5cbiAgZ2V0UGlja2luZ0luZm8oe2luZm99LCBsYXllclByb3BzKSB7XG4gICAgY29uc3QgaXNQaWNrZWQgPSBpbmZvLnBpY2tlZCAmJiBpbmZvLmluZGV4ID4gLTE7XG4gICAgbGV0IG9iamVjdCA9IG51bGw7XG4gICAgY29uc3QgY2VsbCA9IGlzUGlja2VkID8gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XSA6IG51bGw7XG4gICAgaWYgKGNlbGwpIHtcbiAgICAgIGxldCBiaW5JbmZvID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAgIGNvbnN0IHtnZXRQaWNraW5nSW5mb30gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0UGlja2luZ0luZm8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBiaW5JbmZvID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgYmluSW5mbyxcbiAgICAgICAgICAgIGdldFBpY2tpbmdJbmZvKHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLCBjZWxsLCBsYXllclByb3BzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2JqZWN0ID0gT2JqZWN0LmFzc2lnbihiaW5JbmZvLCBjZWxsLCB7XG4gICAgICAgIHBvaW50czogY2VsbC5maWx0ZXJlZFBvaW50cyB8fCBjZWxsLnBvaW50c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGJpbiAgYW5kICB0byBpbmZvXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5mbywge1xuICAgICAgcGlja2VkOiBCb29sZWFuKG9iamVjdCksXG4gICAgICAvLyBvdmVycmlkZSBvYmplY3Qgd2l0aCBwaWNrZWQgY2VsbFxuICAgICAgb2JqZWN0XG4gICAgfSk7XG4gIH1cblxuICBnZXRBY2Nlc3NvcihkaW1lbnNpb25LZXksIGxheWVyUHJvcHMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmRpbWVuc2lvblVwZGF0ZXJzLCBkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsa0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUFtRSxTQUFBSSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFB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
|