@kepler.gl/deckgl-layers 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/3d-building-layer/3d-building-layer.d.ts +11 -0
  2. package/dist/3d-building-layer/3d-building-layer.js +109 -0
  3. package/dist/3d-building-layer/3d-building-utils.d.ts +7 -0
  4. package/dist/3d-building-layer/3d-building-utils.js +212 -0
  5. package/dist/3d-building-layer/types.d.ts +37 -0
  6. package/dist/3d-building-layer/types.js +26 -0
  7. package/dist/cluster-layer/cluster-layer.d.ts +42 -0
  8. package/dist/cluster-layer/cluster-layer.js +349 -0
  9. package/dist/column-layer/enhanced-column-layer.d.ts +7 -0
  10. package/dist/column-layer/enhanced-column-layer.js +98 -0
  11. package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +7 -0
  12. package/dist/grid-layer/enhanced-cpu-grid-layer.js +105 -0
  13. package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +7 -0
  14. package/dist/hexagon-layer/enhanced-hexagon-layer.js +105 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.js +135 -0
  17. package/dist/layer-utils/cluster-utils.d.ts +22 -0
  18. package/dist/layer-utils/cluster-utils.js +120 -0
  19. package/dist/layer-utils/cpu-aggregator.d.ts +93 -0
  20. package/dist/layer-utils/cpu-aggregator.js +669 -0
  21. package/dist/layer-utils/shader-utils.d.ts +1 -0
  22. package/dist/layer-utils/shader-utils.js +48 -0
  23. package/dist/line-layer/line-layer.d.ts +12 -0
  24. package/dist/line-layer/line-layer.js +132 -0
  25. package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +9 -0
  26. package/dist/svg-icon-layer/scatterplot-icon-layer.js +99 -0
  27. package/dist/svg-icon-layer/svg-icon-layer.d.ts +22 -0
  28. package/dist/svg-icon-layer/svg-icon-layer.js +147 -0
  29. package/package.json +71 -0
@@ -0,0 +1,669 @@
1
+ // Copyright (c) 2022 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ "use strict";
22
+
23
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
24
+
25
+ Object.defineProperty(exports, "__esModule", {
26
+ value: true
27
+ });
28
+ exports.getValueFunc = getValueFunc;
29
+ exports.getScaleFunctor = getScaleFunctor;
30
+ exports.getGetValue = getGetValue;
31
+ exports.getDimensionSortedBins = getDimensionSortedBins;
32
+ exports.getDimensionValueDomain = getDimensionValueDomain;
33
+ exports.getDimensionScale = getDimensionScale;
34
+ exports.getAggregatedData = getAggregatedData;
35
+ exports["default"] = exports.defaultDimensions = exports.defaultElevationDimension = exports.defaultColorDimension = exports.defaultAggregation = exports.DECK_AGGREGATION_MAP = void 0;
36
+
37
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
38
+
39
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
40
+
41
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
42
+
43
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
44
+
45
+ var _aggregationLayers = require("@deck.gl/aggregation-layers");
46
+
47
+ var _window = require("global/window");
48
+
49
+ var _utils = require("@kepler.gl/utils");
50
+
51
+ var _constants = require("@kepler.gl/constants");
52
+
53
+ var _DECK_AGGREGATION_MAP;
54
+
55
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
56
+
57
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
58
+
59
+ var DECK_AGGREGATION_MAP = (_DECK_AGGREGATION_MAP = {}, (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.SUM, _constants.AGGREGATION_TYPES.sum), (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.MEAN, _constants.AGGREGATION_TYPES.average), (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.MIN, _constants.AGGREGATION_TYPES.minimum), (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.MAX, _constants.AGGREGATION_TYPES.maximum), _DECK_AGGREGATION_MAP);
60
+ exports.DECK_AGGREGATION_MAP = DECK_AGGREGATION_MAP;
61
+
62
+ function getValueFunc(aggregation, accessor) {
63
+ if (!aggregation || !_aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
64
+ _window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
65
+ }
66
+
67
+ var op = _aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()] || _aggregationLayers.AGGREGATION_OPERATION.SUM;
68
+
69
+ var keplerOp = DECK_AGGREGATION_MAP[op];
70
+ return function (pts) {
71
+ return (0, _utils.aggregate)(pts.map(accessor), keplerOp);
72
+ };
73
+ }
74
+
75
+ function getScaleFunctor(scaleType) {
76
+ if (!scaleType || !_constants.SCALE_FUNC[scaleType]) {
77
+ _window.console.warn("Scale ".concat(scaleType, " is not supported"));
78
+ }
79
+
80
+ return _constants.SCALE_FUNC[scaleType] || _constants.SCALE_FUNC.quantize;
81
+ }
82
+
83
+ function nop() {}
84
+
85
+ function getGetValue(step, props, dimensionUpdater) {
86
+ var key = dimensionUpdater.key;
87
+ var _step$triggers = step.triggers,
88
+ value = _step$triggers.value,
89
+ weight = _step$triggers.weight,
90
+ aggregation = _step$triggers.aggregation;
91
+ var getValue = props[value.prop];
92
+
93
+ if (getValue === null) {
94
+ // If `getValue` is not provided from props, build it with aggregation and weight.
95
+ getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
96
+ }
97
+
98
+ if (getValue) {
99
+ this._setDimensionState(key, {
100
+ getValue: getValue
101
+ });
102
+ }
103
+ }
104
+
105
+ function getDimensionSortedBins(step, props, dimensionUpdater) {
106
+ var key = dimensionUpdater.key;
107
+ var getValue = this.state.dimensions[key].getValue; // @ts-expect-error
108
+
109
+ var sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
110
+ getValue: getValue,
111
+ filterData: props._filterData
112
+ });
113
+
114
+ this._setDimensionState(key, {
115
+ sortedBins: sortedBins
116
+ });
117
+ }
118
+
119
+ function getDimensionValueDomain(step, props, dimensionUpdater) {
120
+ var key = dimensionUpdater.key;
121
+ var _step$triggers2 = step.triggers,
122
+ lowerPercentile = _step$triggers2.lowerPercentile,
123
+ upperPercentile = _step$triggers2.upperPercentile,
124
+ scaleType = _step$triggers2.scaleType;
125
+
126
+ if (!this.state.dimensions[key].sortedBins) {
127
+ // the previous step should set sortedBins, if not, something went wrong
128
+ return;
129
+ } // for log and sqrt scale, returns linear domain by default
130
+ // TODO: support other scale function domain in bin sorter
131
+
132
+
133
+ var valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
134
+
135
+ this._setDimensionState(key, {
136
+ valueDomain: valueDomain
137
+ });
138
+ }
139
+
140
+ function getDimensionScale(step, props, dimensionUpdater) {
141
+ var key = dimensionUpdater.key;
142
+ var _step$triggers3 = step.triggers,
143
+ domain = _step$triggers3.domain,
144
+ range = _step$triggers3.range,
145
+ scaleType = _step$triggers3.scaleType;
146
+ var onSet = step.onSet;
147
+
148
+ if (!this.state.dimensions[key].valueDomain) {
149
+ // the previous step should set valueDomain, if not, something went wrong
150
+ return;
151
+ }
152
+
153
+ var dimensionRange = props[range.prop];
154
+ var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
155
+ var scaleFunctor = getScaleFunctor(scaleType && props[scaleType.prop])();
156
+ var scaleFunc = scaleFunctor.domain(dimensionDomain).range(dimensionRange);
157
+
158
+ if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
159
+ props[onSet.props](scaleFunc.domain());
160
+ }
161
+
162
+ this._setDimensionState(key, {
163
+ scaleFunc: scaleFunc
164
+ });
165
+ }
166
+
167
+ function normalizeResult() {
168
+ var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
169
+
170
+ // support previous hexagonAggregator API
171
+ if (result.hexagons) {
172
+ return Object.assign({
173
+ data: result.hexagons
174
+ }, result);
175
+ } else if (result.layerData) {
176
+ return Object.assign({
177
+ data: result.layerData
178
+ }, result);
179
+ }
180
+
181
+ return result;
182
+ }
183
+
184
+ function getAggregatedData(step, props, aggregation, aggregationParams) {
185
+ var aggr = step.triggers.aggregator;
186
+ var aggregator = props[aggr.prop]; // result should contain a data array and other props
187
+ // result = {data: [], ...other props}
188
+
189
+ var result = aggregator(props, aggregationParams);
190
+ this.setState({
191
+ layerData: normalizeResult(result)
192
+ });
193
+ }
194
+
195
+ var defaultAggregation = {
196
+ key: 'position',
197
+ updateSteps: [{
198
+ key: 'aggregate',
199
+ triggers: {
200
+ cellSize: {
201
+ prop: 'cellSize'
202
+ },
203
+ position: {
204
+ prop: 'getPosition',
205
+ updateTrigger: 'getPosition'
206
+ },
207
+ aggregator: {
208
+ prop: 'gridAggregator'
209
+ }
210
+ },
211
+ updater: getAggregatedData
212
+ }]
213
+ };
214
+ exports.defaultAggregation = defaultAggregation;
215
+
216
+ function getSubLayerAccessor(dimensionState, dimension, layerProps) {
217
+ return function (cell) {
218
+ var sortedBins = dimensionState.sortedBins,
219
+ scaleFunc = dimensionState.scaleFunc;
220
+ var bin = sortedBins.binMap[cell.index];
221
+
222
+ if (bin && bin.counts === 0) {
223
+ // no points left in bin after filtering
224
+ return dimension.nullValue;
225
+ }
226
+
227
+ var cv = bin && bin.value;
228
+ var domain = scaleFunc.domain();
229
+ var isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1]; // if cell value is outside domain, set alpha to 0
230
+
231
+ return isValueInDomain ? scaleFunc(cv) : dimension.nullValue;
232
+ };
233
+ }
234
+
235
+ var defaultColorDimension = {
236
+ key: 'fillColor',
237
+ accessor: 'getFillColor',
238
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
239
+ if (!cell) {
240
+ return {};
241
+ }
242
+
243
+ var sortedBins = dimensionState.sortedBins;
244
+ var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
245
+ return {
246
+ colorValue: colorValue
247
+ };
248
+ },
249
+ nullValue: [0, 0, 0, 0],
250
+ updateSteps: [{
251
+ key: 'getValue',
252
+ triggers: {
253
+ value: {
254
+ prop: 'getColorValue',
255
+ updateTrigger: 'getColorValue'
256
+ },
257
+ weight: {
258
+ prop: 'getColorWeight',
259
+ updateTrigger: 'getColorWeight'
260
+ },
261
+ aggregation: {
262
+ prop: 'colorAggregation'
263
+ }
264
+ },
265
+ updater: getGetValue
266
+ }, {
267
+ key: 'getBins',
268
+ triggers: {
269
+ _filterData: {
270
+ prop: '_filterData',
271
+ updateTrigger: '_filterData'
272
+ }
273
+ },
274
+ updater: getDimensionSortedBins
275
+ }, {
276
+ key: 'getDomain',
277
+ triggers: {
278
+ lowerPercentile: {
279
+ prop: 'lowerPercentile'
280
+ },
281
+ upperPercentile: {
282
+ prop: 'upperPercentile'
283
+ },
284
+ scaleType: {
285
+ prop: 'colorScaleType'
286
+ }
287
+ },
288
+ updater: getDimensionValueDomain
289
+ }, {
290
+ key: 'getScaleFunc',
291
+ triggers: {
292
+ domain: {
293
+ prop: 'colorDomain'
294
+ },
295
+ range: {
296
+ prop: 'colorRange'
297
+ },
298
+ scaleType: {
299
+ prop: 'colorScaleType'
300
+ }
301
+ },
302
+ onSet: {
303
+ props: 'onSetColorDomain'
304
+ },
305
+ updater: getDimensionScale
306
+ }],
307
+ getSubLayerAccessor: getSubLayerAccessor
308
+ };
309
+ exports.defaultColorDimension = defaultColorDimension;
310
+ var defaultElevationDimension = {
311
+ key: 'elevation',
312
+ accessor: 'getElevation',
313
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
314
+ if (!cell) {
315
+ return {};
316
+ }
317
+
318
+ var sortedBins = dimensionState.sortedBins;
319
+ var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
320
+ return {
321
+ elevationValue: elevationValue
322
+ };
323
+ },
324
+ nullValue: -1,
325
+ updateSteps: [{
326
+ key: 'getValue',
327
+ triggers: {
328
+ value: {
329
+ prop: 'getElevationValue',
330
+ updateTrigger: 'getElevationValue'
331
+ },
332
+ weight: {
333
+ prop: 'getElevationWeight',
334
+ updateTrigger: 'getElevationWeight'
335
+ },
336
+ aggregation: {
337
+ prop: 'elevationAggregation'
338
+ }
339
+ },
340
+ updater: getGetValue
341
+ }, {
342
+ key: 'getBins',
343
+ triggers: {
344
+ _filterData: {
345
+ prop: '_filterData',
346
+ updateTrigger: '_filterData'
347
+ }
348
+ },
349
+ updater: getDimensionSortedBins
350
+ }, {
351
+ key: 'getDomain',
352
+ triggers: {
353
+ lowerPercentile: {
354
+ prop: 'elevationLowerPercentile'
355
+ },
356
+ upperPercentile: {
357
+ prop: 'elevationUpperPercentile'
358
+ },
359
+ scaleType: {
360
+ prop: 'elevationScaleType'
361
+ }
362
+ },
363
+ updater: getDimensionValueDomain
364
+ }, {
365
+ key: 'getScaleFunc',
366
+ triggers: {
367
+ domain: {
368
+ prop: 'elevationDomain'
369
+ },
370
+ range: {
371
+ prop: 'elevationRange'
372
+ },
373
+ scaleType: {
374
+ prop: 'elevationScaleType'
375
+ }
376
+ },
377
+ onSet: {
378
+ props: 'onSetElevationDomain'
379
+ },
380
+ updater: getDimensionScale
381
+ }],
382
+ getSubLayerAccessor: getSubLayerAccessor
383
+ };
384
+ exports.defaultElevationDimension = defaultElevationDimension;
385
+ var _defaultDimensions = [defaultColorDimension, defaultElevationDimension];
386
+ exports.defaultDimensions = _defaultDimensions;
387
+
388
+ var CPUAggregator = /*#__PURE__*/function () {
389
+ function CPUAggregator() {
390
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
391
+ (0, _classCallCheck2["default"])(this, CPUAggregator);
392
+ this.state = _objectSpread({
393
+ layerData: {},
394
+ dimensions: {// color: {
395
+ // getValue: null,
396
+ // domain: null,
397
+ // sortedBins: null,
398
+ // scaleFunc: nop
399
+ // },
400
+ // elevation: {
401
+ // getValue: null,
402
+ // domain: null,
403
+ // sortedBins: null,
404
+ // scaleFunc: nop
405
+ // }
406
+ }
407
+ }, opts.initialState);
408
+ this.dimensionUpdaters = {};
409
+ this.aggregationUpdater = opts.aggregation || defaultAggregation;
410
+
411
+ this._addDimension(opts.dimensions || _defaultDimensions);
412
+ }
413
+
414
+ (0, _createClass2["default"])(CPUAggregator, [{
415
+ key: "updateAllDimensions",
416
+ value: function updateAllDimensions(props) {
417
+ var dimensionChanges = []; // update all dimensions
418
+
419
+ for (var dim in this.dimensionUpdaters) {
420
+ var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
421
+
422
+ dimensionChanges = dimensionChanges.concat(updaters);
423
+ }
424
+
425
+ dimensionChanges.forEach(function (f) {
426
+ return typeof f === 'function' && f();
427
+ });
428
+ }
429
+ }, {
430
+ key: "updateAggregation",
431
+ value: function updateAggregation(props, aggregationParams) {
432
+ var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
433
+
434
+ updaters.forEach(function (f) {
435
+ return typeof f === 'function' && f(aggregationParams);
436
+ });
437
+ }
438
+ }, {
439
+ key: "updateState",
440
+ value: function updateState(opts, aggregationParams) {
441
+ var oldProps = opts.oldProps,
442
+ props = opts.props,
443
+ changeFlags = opts.changeFlags;
444
+ var dimensionChanges = [];
445
+
446
+ if (changeFlags.dataChanged) {
447
+ // if data changed update everything
448
+ this.updateAggregation(props, aggregationParams);
449
+ this.updateAllDimensions(props);
450
+ return this.state;
451
+ }
452
+
453
+ var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
454
+
455
+ if (aggregationChanges && aggregationChanges.length) {
456
+ // get aggregatedData
457
+ aggregationChanges.forEach(function (f) {
458
+ return typeof f === 'function' && f(aggregationParams);
459
+ });
460
+ this.updateAllDimensions(props);
461
+ } else {
462
+ // only update dimensions
463
+ dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
464
+ dimensionChanges.forEach(function (f) {
465
+ return typeof f === 'function' && f();
466
+ });
467
+ }
468
+
469
+ return this.state;
470
+ } // Update private state
471
+
472
+ }, {
473
+ key: "setState",
474
+ value: function setState(updateObject) {
475
+ this.state = Object.assign({}, this.state, updateObject);
476
+ } // Update private state.dimensions
477
+
478
+ }, {
479
+ key: "_setDimensionState",
480
+ value: function _setDimensionState(key, updateObject) {
481
+ this.setState({
482
+ dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
483
+ });
484
+ }
485
+ }, {
486
+ key: "_addAggregation",
487
+ value: function _addAggregation(aggregation) {
488
+ this.aggregationUpdater = aggregation;
489
+ }
490
+ }, {
491
+ key: "_addDimension",
492
+ value: function _addDimension() {
493
+ var _this = this;
494
+
495
+ var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
496
+ dimensions.forEach(function (dimension) {
497
+ var key = dimension.key;
498
+ _this.dimensionUpdaters[key] = dimension;
499
+ });
500
+ }
501
+ }, {
502
+ key: "_needUpdateStep",
503
+ value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
504
+ // whether need to update current dimension step
505
+ // dimension step is the value, domain, scaleFunction of each dimension
506
+ // each step is an object with properties links to layer prop and whether the prop is
507
+ // controlled by updateTriggers
508
+ return Object.values(dimensionStep.triggers).some(function (item) {
509
+ if (item.updateTrigger) {
510
+ // check based on updateTriggers change first
511
+ return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
512
+ } // fallback to direct comparison
513
+
514
+
515
+ return oldProps[item.prop] !== props[item.prop];
516
+ });
517
+ }
518
+ }, {
519
+ key: "_accumulateUpdaters",
520
+ value: function _accumulateUpdaters(step, props, dimension) {
521
+ var updaters = [];
522
+
523
+ for (var i = step; i < dimension.updateSteps.length; i++) {
524
+ var updater = dimension.updateSteps[i].updater;
525
+
526
+ if (typeof updater === 'function') {
527
+ updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
528
+ }
529
+ }
530
+
531
+ return updaters;
532
+ }
533
+ }, {
534
+ key: "_getAllUpdaters",
535
+ value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
536
+ var _this2 = this;
537
+
538
+ var updaters = [];
539
+ var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
540
+ return _this2._needUpdateStep(step, oldProps, props, changeFlags);
541
+ });
542
+
543
+ if (needUpdateStep > -1) {
544
+ updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
545
+ }
546
+
547
+ return updaters;
548
+ }
549
+ }, {
550
+ key: "_getAggregationChanges",
551
+ value: function _getAggregationChanges(oldProps, props, changeFlags) {
552
+ var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
553
+
554
+ return updaters.length ? updaters : null;
555
+ }
556
+ }, {
557
+ key: "_getDimensionChanges",
558
+ value: function _getDimensionChanges(oldProps, props, changeFlags) {
559
+ var updaters = []; // get dimension to be updated
560
+
561
+ for (var _key in this.dimensionUpdaters) {
562
+ // return the first triggered updater for each dimension
563
+ var dimension = this.dimensionUpdaters[_key];
564
+
565
+ var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
566
+
567
+ updaters = updaters.concat(dimensionUpdaters);
568
+ }
569
+
570
+ return updaters.length ? updaters : null;
571
+ }
572
+ }, {
573
+ key: "getUpdateTriggers",
574
+ value: function getUpdateTriggers(props) {
575
+ var _this3 = this;
576
+
577
+ var _updateTriggers = props.updateTriggers || {};
578
+
579
+ var updateTriggers = {};
580
+
581
+ var _loop = function _loop(_key2) {
582
+ var _this3$dimensionUpdat = _this3.dimensionUpdaters[_key2],
583
+ accessor = _this3$dimensionUpdat.accessor,
584
+ updateSteps = _this3$dimensionUpdat.updateSteps; // fold dimension triggers into each accessor
585
+
586
+ updateTriggers[accessor] = {};
587
+ updateSteps.forEach(function (step) {
588
+ Object.values(step.triggers || []).forEach(function (_ref) {
589
+ var prop = _ref.prop,
590
+ updateTrigger = _ref.updateTrigger;
591
+
592
+ if (updateTrigger) {
593
+ // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
594
+ // and updateTriggers is passed in from layer prop
595
+ // fold the updateTriggers into accessor
596
+ var fromProp = _updateTriggers[updateTrigger];
597
+
598
+ if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
599
+ // if updateTrigger is an object spread it
600
+ Object.assign(updateTriggers[accessor], fromProp);
601
+ } else if (fromProp !== undefined) {
602
+ updateTriggers[accessor][prop] = fromProp;
603
+ }
604
+ } else {
605
+ // if prop is not based on updateTrigger
606
+ updateTriggers[accessor][prop] = props[prop];
607
+ }
608
+ });
609
+ });
610
+ };
611
+
612
+ for (var _key2 in this.dimensionUpdaters) {
613
+ _loop(_key2);
614
+ }
615
+
616
+ return updateTriggers;
617
+ }
618
+ }, {
619
+ key: "getPickingInfo",
620
+ value: function getPickingInfo(_ref2, layerProps) {
621
+ var info = _ref2.info;
622
+ var isPicked = info.picked && info.index > -1;
623
+ var object = null;
624
+ var cell = isPicked ? this.state.layerData.data[info.index] : null;
625
+
626
+ if (cell) {
627
+ var binInfo = {};
628
+
629
+ for (var _key3 in this.dimensionUpdaters) {
630
+ var getPickingInfo = this.dimensionUpdaters[_key3].getPickingInfo;
631
+
632
+ if (typeof getPickingInfo === 'function') {
633
+ binInfo = Object.assign({}, binInfo, getPickingInfo(this.state.dimensions[_key3], cell, layerProps));
634
+ }
635
+ }
636
+
637
+ object = Object.assign(binInfo, cell, {
638
+ points: cell.filteredPoints || cell.points
639
+ });
640
+ } // add bin and to info
641
+
642
+
643
+ return Object.assign(info, {
644
+ picked: Boolean(object),
645
+ // override object with picked cell
646
+ object: object
647
+ });
648
+ }
649
+ }, {
650
+ key: "getAccessor",
651
+ value: function getAccessor(dimensionKey, layerProps) {
652
+ if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
653
+ return nop;
654
+ }
655
+
656
+ return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
657
+ }
658
+ }], [{
659
+ key: "defaultDimensions",
660
+ value: function defaultDimensions() {
661
+ return _defaultDimensions;
662
+ }
663
+ }]);
664
+ return CPUAggregator;
665
+ }();
666
+
667
+ exports["default"] = CPUAggregator;
668
+ CPUAggregator.getDimensionScale = getDimensionScale;
669
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJuYW1lcyI6WyJERUNLX0FHR1JFR0FUSU9OX01BUCIsIkFHR1JFR0FUSU9OX09QRVJBVElPTiIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwib3AiLCJrZXBsZXJPcCIsInB0cyIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsInRyaWdnZXJzIiwidmFsdWUiLCJ3ZWlnaHQiLCJnZXRWYWx1ZSIsInByb3AiLCJfc2V0RGltZW5zaW9uU3RhdGUiLCJnZXREaW1lbnNpb25Tb3J0ZWRCaW5zIiwic3RhdGUiLCJkaW1lbnNpb25zIiwic29ydGVkQmlucyIsIkJpblNvcnRlciIsImxheWVyRGF0YSIsImRhdGEiLCJmaWx0ZXJEYXRhIiwiX2ZpbHRlckRhdGEiLCJnZXREaW1lbnNpb25WYWx1ZURvbWFpbiIsImxvd2VyUGVyY2VudGlsZSIsInVwcGVyUGVyY2VudGlsZSIsInZhbHVlRG9tYWluIiwiZ2V0VmFsdWVEb21haW5CeVNjYWxlIiwiZ2V0RGltZW5zaW9uU2NhbGUiLCJkb21haW4iLCJyYW5nZSIsIm9uU2V0IiwiZGltZW5zaW9uUmFuZ2UiLCJkaW1lbnNpb25Eb21haW4iLCJzY2FsZUZ1bmN0b3IiLCJzY2FsZUZ1bmMiLCJub3JtYWxpemVSZXN1bHQiLCJyZXN1bHQiLCJoZXhhZ29ucyIsIk9iamVjdCIsImFzc2lnbiIsImdldEFnZ3JlZ2F0ZWREYXRhIiwiYWdncmVnYXRpb25QYXJhbXMiLCJhZ2dyIiwiYWdncmVnYXRvciIsInNldFN0YXRlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RlcHMiLCJjZWxsU2l6ZSIsInBvc2l0aW9uIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRTdWJMYXllckFjY2Vzc29yIiwiZGltZW5zaW9uU3RhdGUiLCJkaW1lbnNpb24iLCJsYXllclByb3BzIiwiY2VsbCIsImJpbiIsImJpbk1hcCIsImluZGV4IiwiY291bnRzIiwibnVsbFZhbHVlIiwiY3YiLCJpc1ZhbHVlSW5Eb21haW4iLCJsZW5ndGgiLCJkZWZhdWx0Q29sb3JEaW1lbnNpb24iLCJnZXRQaWNraW5nSW5mbyIsImNvbG9yVmFsdWUiLCJkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uIiwiZWxldmF0aW9uVmFsdWUiLCJkZWZhdWx0RGltZW5zaW9ucyIsIkNQVUFnZ3JlZ2F0b3IiLCJvcHRzIiwiaW5pdGlhbFN0YXRlIiwiZGltZW5zaW9uVXBkYXRlcnMiLCJhZ2dyZWdhdGlvblVwZGF0ZXIiLCJfYWRkRGltZW5zaW9uIiwiZGltZW5zaW9uQ2hhbmdlcyIsImRpbSIsInVwZGF0ZXJzIiwiX2FjY3VtdWxhdGVVcGRhdGVycyIsImNvbmNhdCIsImZvckVhY2giLCJmIiwib2xkUHJvcHMiLCJjaGFuZ2VGbGFncyIsImRhdGFDaGFuZ2VkIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVBbGxEaW1lbnNpb25zIiwiYWdncmVnYXRpb25DaGFuZ2VzIiwiX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXREaW1lbnNpb25DaGFuZ2VzIiwidXBkYXRlT2JqZWN0IiwiZGltZW5zaW9uU3RlcCIsInZhbHVlcyIsInNvbWUiLCJpdGVtIiwidXBkYXRlVHJpZ2dlcnNDaGFuZ2VkIiwiYWxsIiwiaSIsInB1c2giLCJiaW5kIiwibmVlZFVwZGF0ZVN0ZXAiLCJmaW5kSW5kZXgiLCJfbmVlZFVwZGF0ZVN0ZXAiLCJfZ2V0QWxsVXBkYXRlcnMiLCJfdXBkYXRlVHJpZ2dlcnMiLCJ1cGRhdGVUcmlnZ2VycyIsImZyb21Qcm9wIiwiQXJyYXkiLCJpc0FycmF5IiwidW5kZWZpbmVkIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImRpbWVuc2lvbktleSIsImhhc093blByb3BlcnR5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7O0FBcURPLElBQU1BLG9CQUFvQix3RkFDOUJDLHlDQUFzQkMsR0FEUSxFQUNGQyw2QkFBa0JDLEdBRGhCLDJEQUU5QkgseUNBQXNCSSxJQUZRLEVBRURGLDZCQUFrQkcsT0FGakIsMkRBRzlCTCx5Q0FBc0JNLEdBSFEsRUFHRkosNkJBQWtCSyxPQUhoQiwyREFJOUJQLHlDQUFzQlEsR0FKUSxFQUlGTiw2QkFBa0JPLE9BSmhCLHlCQUExQjs7O0FBT0EsU0FBU0MsWUFBVCxDQUFzQkMsV0FBdEIsRUFBbUNDLFFBQW5DLEVBQTZDO0FBQ2xELE1BQUksQ0FBQ0QsV0FBRCxJQUFnQixDQUFDWCx5Q0FBc0JXLFdBQVcsQ0FBQ0UsV0FBWixFQUF0QixDQUFyQixFQUF1RTtBQUNyRUMsb0JBQVFDLElBQVIsdUJBQTRCSixXQUE1QjtBQUNEOztBQUVELE1BQU1LLEVBQUUsR0FBR2hCLHlDQUFzQlcsV0FBVyxDQUFDRSxXQUFaLEVBQXRCLEtBQW9EYix5Q0FBc0JDLEdBQXJGOztBQUNBLE1BQU1nQixRQUFRLEdBQUdsQixvQkFBb0IsQ0FBQ2lCLEVBQUQsQ0FBckM7QUFFQSxTQUFPLFVBQUFFLEdBQUc7QUFBQSxXQUFJLHNCQUFVQSxHQUFHLENBQUNDLEdBQUosQ0FBUVAsUUFBUixDQUFWLEVBQTZCSyxRQUE3QixDQUFKO0FBQUEsR0FBVjtBQUNEOztBQUVNLFNBQVNHLGVBQVQsQ0FBeUJDLFNBQXpCLEVBQW9DO0FBQ3pDLE1BQUksQ0FBQ0EsU0FBRCxJQUFjLENBQUNDLHNCQUFXRCxTQUFYLENBQW5CLEVBQTBDO0FBQ3hDUCxvQkFBUUMsSUFBUixpQkFBc0JNLFNBQXRCO0FBQ0Q7O0FBQ0QsU0FBT0Msc0JBQVdELFNBQVgsS0FBeUJDLHNCQUFXQyxRQUEzQztBQUNEOztBQUVELFNBQVNDLEdBQVQsR0FBZSxDQUFFOztBQUVWLFNBQVNDLFdBQVQsQ0FBMENDLElBQTFDLEVBQWdEQyxLQUFoRCxFQUF1REMsZ0JBQXZELEVBQXlFO0FBQUEsTUFDdkVDLEdBRHVFLEdBQ2hFRCxnQkFEZ0UsQ0FDdkVDLEdBRHVFO0FBQUEsdUJBRXpDSCxJQUFJLENBQUNJLFFBRm9DO0FBQUEsTUFFdkVDLEtBRnVFLGtCQUV2RUEsS0FGdUU7QUFBQSxNQUVoRUMsTUFGZ0Usa0JBRWhFQSxNQUZnRTtBQUFBLE1BRXhEckIsV0FGd0Qsa0JBRXhEQSxXQUZ3RDtBQUk5RSxNQUFJc0IsUUFBUSxHQUFHTixLQUFLLENBQUNJLEtBQUssQ0FBQ0csSUFBUCxDQUFwQjs7QUFFQSxNQUFJRCxRQUFRLEtBQUssSUFBakIsRUFBdUI7QUFDckI7QUFDQUEsSUFBQUEsUUFBUSxHQUFHdkIsWUFBWSxDQUFDaUIsS0FBSyxDQUFDaEIsV0FBVyxDQUFDdUIsSUFBYixDQUFOLEVBQTBCUCxLQUFLLENBQUNLLE1BQU0sQ0FBQ0UsSUFBUixDQUEvQixDQUF2QjtBQUNEOztBQUVELE1BQUlELFFBQUosRUFBYztBQUNaLFNBQUtFLGtCQUFMLENBQXdCTixHQUF4QixFQUE2QjtBQUFDSSxNQUFBQSxRQUFRLEVBQVJBO0FBQUQsS0FBN0I7QUFDRDtBQUNGOztBQUVNLFNBQVNHLHNCQUFULENBQXFEVixJQUFyRCxFQUEyREMsS0FBM0QsRUFBa0VDLGdCQUFsRSxFQUFvRjtBQUFBLE1BQ2xGQyxHQURrRixHQUMzRUQsZ0JBRDJFLENBQ2xGQyxHQURrRjtBQUFBLE1BRWxGSSxRQUZrRixHQUV0RSxLQUFLSSxLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEdBQXRCLENBRnNFLENBRWxGSSxRQUZrRixFQUd6Rjs7QUFDQSxNQUFNTSxVQUFVLEdBQUcsSUFBSUMsNkJBQUosQ0FBYyxLQUFLSCxLQUFMLENBQVdJLFNBQVgsQ0FBcUJDLElBQXJCLElBQTZCLEVBQTNDLEVBQStDO0FBQ2hFVCxJQUFBQSxRQUFRLEVBQVJBLFFBRGdFO0FBRWhFVSxJQUFBQSxVQUFVLEVBQUVoQixLQUFLLENBQUNpQjtBQUY4QyxHQUEvQyxDQUFuQjs7QUFJQSxPQUFLVCxrQkFBTCxDQUF3Qk4sR0FBeEIsRUFBNkI7QUFBQ1UsSUFBQUEsVUFBVSxFQUFWQTtBQUFELEdBQTdCO0FBQ0Q7O0FBRU0sU0FBU00sdUJBQVQsQ0FBc0RuQixJQUF0RCxFQUE0REMsS0FBNUQsRUFBbUVDLGdCQUFuRSxFQUFxRjtBQUFBLE1BQ25GQyxHQURtRixHQUM1RUQsZ0JBRDRFLENBQ25GQyxHQURtRjtBQUFBLHdCQUl0RkgsSUFKc0YsQ0FHeEZJLFFBSHdGO0FBQUEsTUFHN0VnQixlQUg2RSxtQkFHN0VBLGVBSDZFO0FBQUEsTUFHNURDLGVBSDRELG1CQUc1REEsZUFINEQ7QUFBQSxNQUczQzFCLFNBSDJDLG1CQUczQ0EsU0FIMkM7O0FBTTFGLE1BQUksQ0FBQyxLQUFLZ0IsS0FBTCxDQUFXQyxVQUFYLENBQXNCVCxHQUF0QixFQUEyQlUsVUFBaEMsRUFBNEM7QUFDMUM7QUFDQTtBQUNELEdBVHlGLENBVzFGO0FBQ0E7OztBQUNBLE1BQU1TLFdBQVcsR0FBRyxLQUFLWCxLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEdBQXRCLEVBQTJCVSxVQUEzQixDQUFzQ1UscUJBQXRDLENBQ2xCdEIsS0FBSyxDQUFDTixTQUFTLENBQUNhLElBQVgsQ0FEYSxFQUVsQixDQUFDUCxLQUFLLENBQUNtQixlQUFlLENBQUNaLElBQWpCLENBQU4sRUFBOEJQLEtBQUssQ0FBQ29CLGVBQWUsQ0FBQ2IsSUFBakIsQ0FBbkMsQ0FGa0IsQ0FBcEI7O0FBS0EsT0FBS0Msa0JBQUwsQ0FBd0JOLEdBQXhCLEVBQTZCO0FBQUNtQixJQUFBQSxXQUFXLEVBQVhBO0FBQUQsR0FBN0I7QUFDRDs7QUFFTSxTQUFTRSxpQkFBVCxDQUFnRHhCLElBQWhELEVBQXNEQyxLQUF0RCxFQUE2REMsZ0JBQTdELEVBQStFO0FBQUEsTUFDN0VDLEdBRDZFLEdBQ3RFRCxnQkFEc0UsQ0FDN0VDLEdBRDZFO0FBQUEsd0JBRWpESCxJQUFJLENBQUNJLFFBRjRDO0FBQUEsTUFFN0VxQixNQUY2RSxtQkFFN0VBLE1BRjZFO0FBQUEsTUFFckVDLEtBRnFFLG1CQUVyRUEsS0FGcUU7QUFBQSxNQUU5RC9CLFNBRjhELG1CQUU5REEsU0FGOEQ7QUFBQSxNQUc3RWdDLEtBSDZFLEdBR3BFM0IsSUFIb0UsQ0FHN0UyQixLQUg2RTs7QUFJcEYsTUFBSSxDQUFDLEtBQUtoQixLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEdBQXRCLEVBQTJCbUIsV0FBaEMsRUFBNkM7QUFDM0M7QUFDQTtBQUNEOztBQUVELE1BQU1NLGNBQWMsR0FBRzNCLEtBQUssQ0FBQ3lCLEtBQUssQ0FBQ2xCLElBQVAsQ0FBNUI7QUFDQSxNQUFNcUIsZUFBZSxHQUFHNUIsS0FBSyxDQUFDd0IsTUFBTSxDQUFDakIsSUFBUixDQUFMLElBQXNCLEtBQUtHLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQlQsR0FBdEIsRUFBMkJtQixXQUF6RTtBQUVBLE1BQU1RLFlBQVksR0FBR3BDLGVBQWUsQ0FBQ0MsU0FBUyxJQUFJTSxLQUFLLENBQUNOLFNBQVMsQ0FBQ2EsSUFBWCxDQUFuQixDQUFmLEVBQXJCO0FBRUEsTUFBTXVCLFNBQVMsR0FBR0QsWUFBWSxDQUFDTCxNQUFiLENBQW9CSSxlQUFwQixFQUFxQ0gsS0FBckMsQ0FBMkNFLGNBQTNDLENBQWxCOztBQUVBLE1BQUkseUJBQU9ELEtBQVAsTUFBaUIsUUFBakIsSUFBNkIsT0FBTzFCLEtBQUssQ0FBQzBCLEtBQUssQ0FBQzFCLEtBQVAsQ0FBWixLQUE4QixVQUEvRCxFQUEyRTtBQUN6RUEsSUFBQUEsS0FBSyxDQUFDMEIsS0FBSyxDQUFDMUIsS0FBUCxDQUFMLENBQW1COEIsU0FBUyxDQUFDTixNQUFWLEVBQW5CO0FBQ0Q7O0FBQ0QsT0FBS2hCLGtCQUFMLENBQXdCTixHQUF4QixFQUE2QjtBQUFDNEIsSUFBQUEsU0FBUyxFQUFUQTtBQUFELEdBQTdCO0FBQ0Q7O0FBRUQsU0FBU0MsZUFBVCxHQUErRDtBQUFBLE1BQXRDQyxNQUFzQyx1RUFBSixFQUFJOztBQUM3RDtBQUNBLE1BQUlBLE1BQU0sQ0FBQ0MsUUFBWCxFQUFxQjtBQUNuQixXQUFPQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFDcEIsTUFBQUEsSUFBSSxFQUFFaUIsTUFBTSxDQUFDQztBQUFkLEtBQWQsRUFBdUNELE1BQXZDLENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSUEsTUFBTSxDQUFDbEIsU0FBWCxFQUFzQjtBQUMzQixXQUFPb0IsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQ3BCLE1BQUFBLElBQUksRUFBRWlCLE1BQU0sQ0FBQ2xCO0FBQWQsS0FBZCxFQUF3Q2tCLE1BQXhDLENBQVA7QUFDRDs7QUFFRCxTQUFPQSxNQUFQO0FBQ0Q7O0FBRU0sU0FBU0ksaUJBQVQsQ0FFTHJDLElBRkssRUFHTEMsS0FISyxFQUlMaEIsV0FKSyxFQUtMcUQsaUJBTEssRUFNTDtBQUFBLE1BRXlCQyxJQUZ6QixHQUdJdkMsSUFISixDQUVFSSxRQUZGLENBRWFvQyxVQUZiO0FBSUEsTUFBTUEsVUFBVSxHQUFHdkMsS0FBSyxDQUFDc0MsSUFBSSxDQUFDL0IsSUFBTixDQUF4QixDQUpBLENBTUE7QUFDQTs7QUFDQSxNQUFNeUIsTUFBTSxHQUFHTyxVQUFVLENBQUN2QyxLQUFELEVBQVFxQyxpQkFBUixDQUF6QjtBQUNBLE9BQUtHLFFBQUwsQ0FBYztBQUNaMUIsSUFBQUEsU0FBUyxFQUFFaUIsZUFBZSxDQUFDQyxNQUFEO0FBRGQsR0FBZDtBQUdEOztBQUVNLElBQU1TLGtCQUFtQyxHQUFHO0FBQ2pEdkMsRUFBQUEsR0FBRyxFQUFFLFVBRDRDO0FBRWpEd0MsRUFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRXhDLElBQUFBLEdBQUcsRUFBRSxXQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNSd0MsTUFBQUEsUUFBUSxFQUFFO0FBQ1JwQyxRQUFBQSxJQUFJLEVBQUU7QUFERSxPQURGO0FBSVJxQyxNQUFBQSxRQUFRLEVBQUU7QUFDUnJDLFFBQUFBLElBQUksRUFBRSxhQURFO0FBRVJzQyxRQUFBQSxhQUFhLEVBQUU7QUFGUCxPQUpGO0FBUVJOLE1BQUFBLFVBQVUsRUFBRTtBQUNWaEMsUUFBQUEsSUFBSSxFQUFFO0FBREk7QUFSSixLQUZaO0FBY0V1QyxJQUFBQSxPQUFPLEVBQUVWO0FBZFgsR0FEVztBQUZvQyxDQUE1Qzs7O0FBc0JQLFNBQVNXLG1CQUFULENBQTZCQyxjQUE3QixFQUE2Q0MsU0FBN0MsRUFBd0RDLFVBQXhELEVBQW9FO0FBQ2xFLFNBQU8sVUFBQUMsSUFBSSxFQUFJO0FBQUEsUUFDTnZDLFVBRE0sR0FDbUJvQyxjQURuQixDQUNOcEMsVUFETTtBQUFBLFFBQ01rQixTQUROLEdBQ21Ca0IsY0FEbkIsQ0FDTWxCLFNBRE47QUFFYixRQUFNc0IsR0FBRyxHQUFHeEMsVUFBVSxDQUFDeUMsTUFBWCxDQUFrQkYsSUFBSSxDQUFDRyxLQUF2QixDQUFaOztBQUVBLFFBQUlGLEdBQUcsSUFBSUEsR0FBRyxDQUFDRyxNQUFKLEtBQWUsQ0FBMUIsRUFBNkI7QUFDM0I7QUFDQSxhQUFPTixTQUFTLENBQUNPLFNBQWpCO0FBQ0Q7O0FBRUQsUUFBTUMsRUFBRSxHQUFHTCxHQUFHLElBQUlBLEdBQUcsQ0FBQ2hELEtBQXRCO0FBQ0EsUUFBTW9CLE1BQU0sR0FBR00sU0FBUyxDQUFDTixNQUFWLEVBQWY7QUFFQSxRQUFNa0MsZUFBZSxHQUFHRCxFQUFFLElBQUlqQyxNQUFNLENBQUMsQ0FBRCxDQUFaLElBQW1CaUMsRUFBRSxJQUFJakMsTUFBTSxDQUFDQSxNQUFNLENBQUNtQyxNQUFQLEdBQWdCLENBQWpCLENBQXZELENBWmEsQ0FjYjs7QUFDQSxXQUFPRCxlQUFlLEdBQUc1QixTQUFTLENBQUMyQixFQUFELENBQVosR0FBbUJSLFNBQVMsQ0FBQ08sU0FBbkQ7QUFDRCxHQWhCRDtBQWlCRDs7QUFFTSxJQUFNSSxxQkFBK0MsR0FBRztBQUM3RDFELEVBQUFBLEdBQUcsRUFBRSxXQUR3RDtBQUU3RGpCLEVBQUFBLFFBQVEsRUFBRSxjQUZtRDtBQUc3RDRFLEVBQUFBLGNBQWMsRUFBRSx3QkFBQ2IsY0FBRCxFQUFpQkcsSUFBakIsRUFBMEI7QUFDeEMsUUFBSSxDQUFDQSxJQUFMLEVBQVc7QUFDVCxhQUFPLEVBQVA7QUFDRDs7QUFIdUMsUUFJakN2QyxVQUppQyxHQUluQm9DLGNBSm1CLENBSWpDcEMsVUFKaUM7QUFLeEMsUUFBTWtELFVBQVUsR0FBR2xELFVBQVUsQ0FBQ3lDLE1BQVgsQ0FBa0JGLElBQUksQ0FBQ0csS0FBdkIsS0FBaUMxQyxVQUFVLENBQUN5QyxNQUFYLENBQWtCRixJQUFJLENBQUNHLEtBQXZCLEVBQThCbEQsS0FBbEY7QUFDQSxXQUFPO0FBQUMwRCxNQUFBQSxVQUFVLEVBQVZBO0FBQUQsS0FBUDtBQUNELEdBVjREO0FBVzdETixFQUFBQSxTQUFTLEVBQUUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBWGtEO0FBWTdEZCxFQUFBQSxXQUFXLEVBQUUsQ0FDWDtBQUNFeEMsSUFBQUEsR0FBRyxFQUFFLFVBRFA7QUFFRUMsSUFBQUEsUUFBUSxFQUFFO0FBQ1JDLE1BQUFBLEtBQUssRUFBRTtBQUNMRyxRQUFBQSxJQUFJLEVBQUUsZUFERDtBQUVMc0MsUUFBQUEsYUFBYSxFQUFFO0FBRlYsT0FEQztBQUtSeEMsTUFBQUEsTUFBTSxFQUFFO0FBQ05FLFFBQUFBLElBQUksRUFBRSxnQkFEQTtBQUVOc0MsUUFBQUEsYUFBYSxFQUFFO0FBRlQsT0FMQTtBQVNSN0QsTUFBQUEsV0FBVyxFQUFFO0FBQ1h1QixRQUFBQSxJQUFJLEVBQUU7QUFESztBQVRMLEtBRlo7QUFlRXVDLElBQUFBLE9BQU8sRUFBRWhEO0FBZlgsR0FEVyxFQWtCWDtBQUNFSSxJQUFBQSxHQUFHLEVBQUUsU0FEUDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFDUmMsTUFBQUEsV0FBVyxFQUFFO0FBQ1hWLFFBQUFBLElBQUksRUFBRSxhQURLO0FBRVhzQyxRQUFBQSxhQUFhLEVBQUU7QUFGSjtBQURMLEtBRlo7QUFRRUMsSUFBQUEsT0FBTyxFQUFFckM7QUFSWCxHQWxCVyxFQTRCWDtBQUNFUCxJQUFBQSxHQUFHLEVBQUUsV0FEUDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFDUmdCLE1BQUFBLGVBQWUsRUFBRTtBQUNmWixRQUFBQSxJQUFJLEVBQUU7QUFEUyxPQURUO0FBSVJhLE1BQUFBLGVBQWUsRUFBRTtBQUNmYixRQUFBQSxJQUFJLEVBQUU7QUFEUyxPQUpUO0FBT1JiLE1BQUFBLFNBQVMsRUFBRTtBQUFDYSxRQUFBQSxJQUFJLEVBQUU7QUFBUDtBQVBILEtBRlo7QUFXRXVDLElBQUFBLE9BQU8sRUFBRTVCO0FBWFgsR0E1QlcsRUF5Q1g7QUFDRWhCLElBQUFBLEdBQUcsRUFBRSxjQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNScUIsTUFBQUEsTUFBTSxFQUFFO0FBQUNqQixRQUFBQSxJQUFJLEVBQUU7QUFBUCxPQURBO0FBRVJrQixNQUFBQSxLQUFLLEVBQUU7QUFBQ2xCLFFBQUFBLElBQUksRUFBRTtBQUFQLE9BRkM7QUFHUmIsTUFBQUEsU0FBUyxFQUFFO0FBQUNhLFFBQUFBLElBQUksRUFBRTtBQUFQO0FBSEgsS0FGWjtBQU9FbUIsSUFBQUEsS0FBSyxFQUFFO0FBQ0wxQixNQUFBQSxLQUFLLEVBQUU7QUFERixLQVBUO0FBVUU4QyxJQUFBQSxPQUFPLEVBQUV2QjtBQVZYLEdBekNXLENBWmdEO0FBa0U3RHdCLEVBQUFBLG1CQUFtQixFQUFuQkE7QUFsRTZELENBQXhEOztBQXFFQSxJQUFNZ0IseUJBQWdELEdBQUc7QUFDOUQ3RCxFQUFBQSxHQUFHLEVBQUUsV0FEeUQ7QUFFOURqQixFQUFBQSxRQUFRLEVBQUUsY0FGb0Q7QUFHOUQ0RSxFQUFBQSxjQUFjLEVBQUUsd0JBQUNiLGNBQUQsRUFBaUJHLElBQWpCLEVBQTBCO0FBQ3hDLFFBQUksQ0FBQ0EsSUFBTCxFQUFXO0FBQ1QsYUFBTyxFQUFQO0FBQ0Q7O0FBSHVDLFFBSWpDdkMsVUFKaUMsR0FJbkJvQyxjQUptQixDQUlqQ3BDLFVBSmlDO0FBS3hDLFFBQU1vRCxjQUFjLEdBQUdwRCxVQUFVLENBQUN5QyxNQUFYLENBQWtCRixJQUFJLENBQUNHLEtBQXZCLEtBQWlDMUMsVUFBVSxDQUFDeUMsTUFBWCxDQUFrQkYsSUFBSSxDQUFDRyxLQUF2QixFQUE4QmxELEtBQXRGO0FBQ0EsV0FBTztBQUFDNEQsTUFBQUEsY0FBYyxFQUFkQTtBQUFELEtBQVA7QUFDRCxHQVY2RDtBQVc5RFIsRUFBQUEsU0FBUyxFQUFFLENBQUMsQ0FYa0Q7QUFZOURkLEVBQUFBLFdBQVcsRUFBRSxDQUNYO0FBQ0V4QyxJQUFBQSxHQUFHLEVBQUUsVUFEUDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFDUkMsTUFBQUEsS0FBSyxFQUFFO0FBQ0xHLFFBQUFBLElBQUksRUFBRSxtQkFERDtBQUVMc0MsUUFBQUEsYUFBYSxFQUFFO0FBRlYsT0FEQztBQUtSeEMsTUFBQUEsTUFBTSxFQUFFO0FBQ05FLFFBQUFBLElBQUksRUFBRSxvQkFEQTtBQUVOc0MsUUFBQUEsYUFBYSxFQUFFO0FBRlQsT0FMQTtBQVNSN0QsTUFBQUEsV0FBVyxFQUFFO0FBQ1h1QixRQUFBQSxJQUFJLEVBQUU7QUFESztBQVRMLEtBRlo7QUFlRXVDLElBQUFBLE9BQU8sRUFBRWhEO0FBZlgsR0FEVyxFQWtCWDtBQUNFSSxJQUFBQSxHQUFHLEVBQUUsU0FEUDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFDUmMsTUFBQUEsV0FBVyxFQUFFO0FBQ1hWLFFBQUFBLElBQUksRUFBRSxhQURLO0FBRVhzQyxRQUFBQSxhQUFhLEVBQUU7QUFGSjtBQURMLEtBRlo7QUFRRUMsSUFBQUEsT0FBTyxFQUFFckM7QUFSWCxHQWxCVyxFQTRCWDtBQUNFUCxJQUFBQSxHQUFHLEVBQUUsV0FEUDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFDUmdCLE1BQUFBLGVBQWUsRUFBRTtBQUNmWixRQUFBQSxJQUFJLEVBQUU7QUFEUyxPQURUO0FBSVJhLE1BQUFBLGVBQWUsRUFBRTtBQUNmYixRQUFBQSxJQUFJLEVBQUU7QUFEUyxPQUpUO0FBT1JiLE1BQUFBLFNBQVMsRUFBRTtBQUFDYSxRQUFBQSxJQUFJLEVBQUU7QUFBUDtBQVBILEtBRlo7QUFXRXVDLElBQUFBLE9BQU8sRUFBRTVCO0FBWFgsR0E1QlcsRUF5Q1g7QUFDRWhCLElBQUFBLEdBQUcsRUFBRSxjQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNScUIsTUFBQUEsTUFBTSxFQUFFO0FBQUNqQixRQUFBQSxJQUFJLEVBQUU7QUFBUCxPQURBO0FBRVJrQixNQUFBQSxLQUFLLEVBQUU7QUFBQ2xCLFFBQUFBLElBQUksRUFBRTtBQUFQLE9BRkM7QUFHUmIsTUFBQUEsU0FBUyxFQUFFO0FBQUNhLFFBQUFBLElBQUksRUFBRTtBQUFQO0FBSEgsS0FGWjtBQU9FbUIsSUFBQUEsS0FBSyxFQUFFO0FBQ0wxQixNQUFBQSxLQUFLLEVBQUU7QUFERixLQVBUO0FBVUU4QyxJQUFBQSxPQUFPLEVBQUV2QjtBQVZYLEdBekNXLENBWmlEO0FBa0U5RHdCLEVBQUFBLG1CQUFtQixFQUFuQkE7QUFsRThELENBQXpEOztBQXFFQSxJQUFNa0Isa0JBQWlCLEdBQUcsQ0FBQ0wscUJBQUQsRUFBd0JHLHlCQUF4QixDQUExQjs7O0lBSWNHLGE7QUFNbkIsMkJBTUU7QUFBQSxRQUxBQyxJQUtBLHVFQURJLEVBQ0o7QUFBQTtBQUNBLFNBQUt6RCxLQUFMO0FBQ0VJLE1BQUFBLFNBQVMsRUFBRSxFQURiO0FBRUVILE1BQUFBLFVBQVUsRUFBRSxDQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpVO0FBRmQsT0FnQkt3RCxJQUFJLENBQUNDLFlBaEJWO0FBbUJBLFNBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsU0FBS0Msa0JBQUwsR0FBMEJILElBQUksQ0FBQ25GLFdBQUwsSUFBb0J5RCxrQkFBOUM7O0FBRUEsU0FBSzhCLGFBQUwsQ0FBbUJKLElBQUksQ0FBQ3hELFVBQUwsSUFBbUJzRCxrQkFBdEM7QUFDRDs7OztXQU1ELDZCQUFvQmpFLEtBQXBCLEVBQTJCO0FBQ3pCLFVBQUl3RSxnQkFBcUMsR0FBRyxFQUE1QyxDQUR5QixDQUV6Qjs7QUFDQSxXQUFLLElBQU1DLEdBQVgsSUFBa0IsS0FBS0osaUJBQXZCLEVBQTBDO0FBQ3hDLFlBQU1LLFFBQVEsR0FBRyxLQUFLQyxtQkFBTCxDQUF5QixDQUF6QixFQUE0QjNFLEtBQTVCLEVBQW1DLEtBQUtxRSxpQkFBTCxDQUF1QkksR0FBdkIsQ0FBbkMsQ0FBakI7O0FBQ0FELFFBQUFBLGdCQUFnQixHQUFHQSxnQkFBZ0IsQ0FBQ0ksTUFBakIsQ0FBd0JGLFFBQXhCLENBQW5CO0FBQ0Q7O0FBRURGLE1BQUFBLGdCQUFnQixDQUFDSyxPQUFqQixDQUF5QixVQUFBQyxDQUFDO0FBQUEsZUFBSSxPQUFPQSxDQUFQLEtBQWEsVUFBYixJQUEyQkEsQ0FBQyxFQUFoQztBQUFBLE9BQTFCO0FBQ0Q7OztXQUVELDJCQUFrQjlFLEtBQWxCLEVBQXlCcUMsaUJBQXpCLEVBQTRDO0FBQzFDLFVBQU1xQyxRQUFRLEdBQUcsS0FBS0MsbUJBQUwsQ0FBeUIsQ0FBekIsRUFBNEIzRSxLQUE1QixFQUFtQyxLQUFLc0Usa0JBQXhDLENBQWpCOztBQUNBSSxNQUFBQSxRQUFRLENBQUNHLE9BQVQsQ0FBaUIsVUFBQUMsQ0FBQztBQUFBLGVBQUksT0FBT0EsQ0FBUCxLQUFhLFVBQWIsSUFBMkJBLENBQUMsQ0FBQ3pDLGlCQUFELENBQWhDO0FBQUEsT0FBbEI7QUFDRDs7O1dBRUQscUJBQVk4QixJQUFaLEVBQWtCOUIsaUJBQWxCLEVBQXFDO0FBQUEsVUFDNUIwQyxRQUQ0QixHQUNJWixJQURKLENBQzVCWSxRQUQ0QjtBQUFBLFVBQ2xCL0UsS0FEa0IsR0FDSW1FLElBREosQ0FDbEJuRSxLQURrQjtBQUFBLFVBQ1hnRixXQURXLEdBQ0liLElBREosQ0FDWGEsV0FEVztBQUVuQyxVQUFJUixnQkFBcUMsR0FBRyxFQUE1Qzs7QUFFQSxVQUFJUSxXQUFXLENBQUNDLFdBQWhCLEVBQTZCO0FBQzNCO0FBQ0EsYUFBS0MsaUJBQUwsQ0FBdUJsRixLQUF2QixFQUE4QnFDLGlCQUE5QjtBQUNBLGFBQUs4QyxtQkFBTCxDQUF5Qm5GLEtBQXpCO0FBRUEsZUFBTyxLQUFLVSxLQUFaO0FBQ0Q7O0FBRUQsVUFBTTBFLGtCQUFrQixHQUFHLEtBQUtDLHNCQUFMLENBQTRCTixRQUE1QixFQUFzQy9FLEtBQXRDLEVBQTZDZ0YsV0FBN0MsQ0FBM0I7O0FBRUEsVUFBSUksa0JBQWtCLElBQUlBLGtCQUFrQixDQUFDekIsTUFBN0MsRUFBcUQ7QUFDbkQ7QUFDQXlCLFFBQUFBLGtCQUFrQixDQUFDUCxPQUFuQixDQUEyQixVQUFBQyxDQUFDO0FBQUEsaUJBQUksT0FBT0EsQ0FBUCxLQUFhLFVBQWIsSUFBMkJBLENBQUMsQ0FBQ3pDLGlCQUFELENBQWhDO0FBQUEsU0FBNUI7QUFDQSxhQUFLOEMsbUJBQUwsQ0FBeUJuRixLQUF6QjtBQUNELE9BSkQsTUFJTztBQUNMO0FBQ0F3RSxRQUFBQSxnQkFBZ0IsR0FBRyxLQUFLYyxvQkFBTCxDQUEwQlAsUUFBMUIsRUFBb0MvRSxLQUFwQyxFQUEyQ2dGLFdBQTNDLEtBQTJELEVBQTlFO0FBQ0FSLFFBQUFBLGdCQUFnQixDQUFDSyxPQUFqQixDQUF5QixVQUFBQyxDQUFDO0FBQUEsaUJBQUksT0FBT0EsQ0FBUCxLQUFhLFVBQWIsSUFBMkJBLENBQUMsRUFBaEM7QUFBQSxTQUExQjtBQUNEOztBQUVELGFBQU8sS0FBS3BFLEtBQVo7QUFDRCxLLENBRUQ7Ozs7V0FDQSxrQkFBUzZFLFlBQVQsRUFBdUI7QUFDckIsV0FBSzdFLEtBQUwsR0FBYXdCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IsS0FBS3pCLEtBQXZCLEVBQThCNkUsWUFBOUIsQ0FBYjtBQUNELEssQ0FFRDs7OztXQUNBLDRCQUFtQnJGLEdBQW5CLEVBQXdCcUYsWUFBeEIsRUFBc0M7QUFDcEMsV0FBSy9DLFFBQUwsQ0FBYztBQUNaN0IsUUFBQUEsVUFBVSxFQUFFdUIsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLekIsS0FBTCxDQUFXQyxVQUE3Qix1Q0FDVFQsR0FEUyxFQUNIZ0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLekIsS0FBTCxDQUFXQyxVQUFYLENBQXNCVCxHQUF0QixDQUFsQixFQUE4Q3FGLFlBQTlDLENBREc7QUFEQSxPQUFkO0FBS0Q7OztXQUVELHlCQUFnQnZHLFdBQWhCLEVBQThDO0FBQzVDLFdBQUtzRixrQkFBTCxHQUEwQnRGLFdBQTFCO0FBQ0Q7OztXQUVELHlCQUFnRDtBQUFBOztBQUFBLFVBQWxDMkIsVUFBa0MsdUVBQUosRUFBSTtBQUM5Q0EsTUFBQUEsVUFBVSxDQUFDa0UsT0FBWCxDQUFtQixVQUFBNUIsU0FBUyxFQUFJO0FBQUEsWUFDdkIvQyxHQUR1QixHQUNoQitDLFNBRGdCLENBQ3ZCL0MsR0FEdUI7QUFFOUIsUUFBQSxLQUFJLENBQUNtRSxpQkFBTCxDQUF1Qm5FLEdBQXZCLElBQThCK0MsU0FBOUI7QUFDRCxPQUhEO0FBSUQ7OztXQUVELHlCQUNFdUMsYUFERixFQUVFVCxRQUZGLEVBR0UvRSxLQUhGLEVBSUVnRixXQUpGLEVBS0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQU85QyxNQUFNLENBQUN1RCxNQUFQLENBQWNELGFBQWEsQ0FBQ3JGLFFBQTVCLEVBQXNDdUYsSUFBdEMsQ0FBMkMsVUFBQUMsSUFBSSxFQUFJO0FBQ3hELFlBQUlBLElBQUksQ0FBQzlDLGFBQVQsRUFBd0I7QUFDdEI7QUFDQSxpQkFDRW1DLFdBQVcsQ0FBQ1kscUJBQVosS0FDQ1osV0FBVyxDQUFDWSxxQkFBWixDQUFrQ0MsR0FBbEMsSUFDQ2IsV0FBVyxDQUFDWSxxQkFBWixDQUFrQ0QsSUFBSSxDQUFDOUMsYUFBdkMsQ0FGRixDQURGO0FBS0QsU0FSdUQsQ0FTeEQ7OztBQUNBLGVBQU9rQyxRQUFRLENBQUNZLElBQUksQ0FBQ3BGLElBQU4sQ0FBUixLQUF3QlAsS0FBSyxDQUFDMkYsSUFBSSxDQUFDcEYsSUFBTixDQUFwQztBQUNELE9BWE0sQ0FBUDtBQVlEOzs7V0FFRCw2QkFDRVIsSUFERixFQUVFQyxLQUZGLEVBR0VpRCxTQUhGLEVBSUU7QUFJQSxVQUFNeUIsUUFBNEIsR0FBRyxFQUFyQzs7QUFDQSxXQUFLLElBQUlvQixDQUFDLEdBQUcvRixJQUFiLEVBQW1CK0YsQ0FBQyxHQUFHN0MsU0FBUyxDQUFDUCxXQUFWLENBQXNCaUIsTUFBN0MsRUFBcURtQyxDQUFDLEVBQXRELEVBQTBEO0FBQ3hELFlBQU1oRCxPQUFPLEdBQUdHLFNBQVMsQ0FBQ1AsV0FBVixDQUFzQm9ELENBQXRCLEVBQXlCaEQsT0FBekM7O0FBQ0EsWUFBSSxPQUFPQSxPQUFQLEtBQW1CLFVBQXZCLEVBQW1DO0FBQ2pDNEIsVUFBQUEsUUFBUSxDQUFDcUIsSUFBVCxDQUNFakQsT0FBTyxDQUFDa0QsSUFBUixDQUFhLElBQWIsRUFBbUIvQyxTQUFTLENBQUNQLFdBQVYsQ0FBc0JvRCxDQUF0QixDQUFuQixFQUE2QzlGLEtBQTdDLEVBQW9EaUQsU0FBcEQsQ0FERjtBQUdEO0FBQ0Y7O0FBRUQsYUFBT3lCLFFBQVA7QUFDRDs7O1dBRUQseUJBQ0V6QixTQURGLEVBRUU4QixRQUZGLEVBR0UvRSxLQUhGLEVBSUVnRixXQUpGLEVBS0U7QUFBQTs7QUFJQSxVQUFJTixRQUE0QixHQUFHLEVBQW5DO0FBQ0EsVUFBTXVCLGNBQWMsR0FBR2hELFNBQVMsQ0FBQ1AsV0FBVixDQUFzQndELFNBQXRCLENBQWdDLFVBQUFuRyxJQUFJO0FBQUEsZUFDekQsTUFBSSxDQUFDb0csZUFBTCxDQUFxQnBHLElBQXJCLEVBQTJCZ0YsUUFBM0IsRUFBcUMvRSxLQUFyQyxFQUE0Q2dGLFdBQTVDLENBRHlEO0FBQUEsT0FBcEMsQ0FBdkI7O0FBSUEsVUFBSWlCLGNBQWMsR0FBRyxDQUFDLENBQXRCLEVBQXlCO0FBQ3ZCdkIsUUFBQUEsUUFBUSxHQUFHQSxRQUFRLENBQUNFLE1BQVQsQ0FBZ0IsS0FBS0QsbUJBQUwsQ0FBeUJzQixjQUF6QixFQUF5Q2pHLEtBQXpDLEVBQWdEaUQsU0FBaEQsQ0FBaEIsQ0FBWDtBQUNEOztBQUVELGFBQU95QixRQUFQO0FBQ0Q7OztXQUVELGdDQUF1QkssUUFBdkIsRUFBaUMvRSxLQUFqQyxFQUF3Q2dGLFdBQXhDLEVBQXFEO0FBQ25ELFVBQU1OLFFBQVEsR0FBRyxLQUFLMEIsZUFBTCxDQUFxQixLQUFLOUIsa0JBQTFCLEVBQThDUyxRQUE5QyxFQUF3RC9FLEtBQXhELEVBQStEZ0YsV0FBL0QsQ0FBakI7O0FBQ0EsYUFBT04sUUFBUSxDQUFDZixNQUFULEdBQWtCZSxRQUFsQixHQUE2QixJQUFwQztBQUNEOzs7V0FFRCw4QkFBcUJLLFFBQXJCLEVBQStCL0UsS0FBL0IsRUFBc0NnRixXQUF0QyxFQUFtRDtBQUNqRCxVQUFJTixRQUE2QixHQUFHLEVBQXBDLENBRGlELENBR2pEOztBQUNBLFdBQUssSUFBTXhFLElBQVgsSUFBa0IsS0FBS21FLGlCQUF2QixFQUEwQztBQUN4QztBQUNBLFlBQU1wQixTQUFTLEdBQUcsS0FBS29CLGlCQUFMLENBQXVCbkUsSUFBdkIsQ0FBbEI7O0FBQ0EsWUFBTW1FLGlCQUFpQixHQUFHLEtBQUsrQixlQUFMLENBQXFCbkQsU0FBckIsRUFBZ0M4QixRQUFoQyxFQUEwQy9FLEtBQTFDLEVBQWlEZ0YsV0FBakQsQ0FBMUI7O0FBQ0FOLFFBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxNQUFULENBQWdCUCxpQkFBaEIsQ0FBWDtBQUNEOztBQUVELGFBQU9LLFFBQVEsQ0FBQ2YsTUFBVCxHQUFrQmUsUUFBbEIsR0FBNkIsSUFBcEM7QUFDRDs7O1dBRUQsMkJBQWtCMUUsS0FBbEIsRUFBeUI7QUFBQTs7QUFDdkIsVUFBTXFHLGVBQWUsR0FBR3JHLEtBQUssQ0FBQ3NHLGNBQU4sSUFBd0IsRUFBaEQ7O0FBQ0EsVUFBTUEsY0FBYyxHQUFHLEVBQXZCOztBQUZ1QixpQ0FJWnBHLEtBSlk7QUFBQSxvQ0FRMkIsTUFBSSxDQUFDbUUsaUJBQUwsQ0FBdUJuRSxLQUF2QixDQVIzQjtBQUFBLFlBTW5CakIsUUFObUIseUJBTW5CQSxRQU5tQjtBQUFBLFlBT25CeUQsV0FQbUIseUJBT25CQSxXQVBtQixFQVNyQjs7QUFDQTRELFFBQUFBLGNBQWMsQ0FBQ3JILFFBQUQsQ0FBZCxHQUEyQixFQUEzQjtBQUVBeUQsUUFBQUEsV0FBVyxDQUFDbUMsT0FBWixDQUFvQixVQUFBOUUsSUFBSSxFQUFJO0FBQzFCbUMsVUFBQUEsTUFBTSxDQUFDdUQsTUFBUCxDQUFjMUYsSUFBSSxDQUFDSSxRQUFMLElBQWlCLEVBQS9CLEVBQW1DMEUsT0FBbkMsQ0FBMkMsZ0JBQTJCO0FBQUEsZ0JBQXpCdEUsSUFBeUIsUUFBekJBLElBQXlCO0FBQUEsZ0JBQW5Cc0MsYUFBbUIsUUFBbkJBLGFBQW1COztBQUNwRSxnQkFBSUEsYUFBSixFQUFtQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxrQkFBTTBELFFBQVEsR0FBR0YsZUFBZSxDQUFDeEQsYUFBRCxDQUFoQzs7QUFDQSxrQkFBSSx5QkFBTzBELFFBQVAsTUFBb0IsUUFBcEIsSUFBZ0MsQ0FBQ0MsS0FBSyxDQUFDQyxPQUFOLENBQWNGLFFBQWQsQ0FBckMsRUFBOEQ7QUFDNUQ7QUFDQXJFLGdCQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBY21FLGNBQWMsQ0FBQ3JILFFBQUQsQ0FBNUIsRUFBd0NzSCxRQUF4QztBQUNELGVBSEQsTUFHTyxJQUFJQSxRQUFRLEtBQUtHLFNBQWpCLEVBQTRCO0FBQ2pDSixnQkFBQUEsY0FBYyxDQUFDckgsUUFBRCxDQUFkLENBQXlCc0IsSUFBekIsSUFBaUNnRyxRQUFqQztBQUNEO0FBQ0YsYUFYRCxNQVdPO0FBQ0w7QUFDQUQsY0FBQUEsY0FBYyxDQUFDckgsUUFBRCxDQUFkLENBQXlCc0IsSUFBekIsSUFBaUNQLEtBQUssQ0FBQ08sSUFBRCxDQUF0QztBQUNEO0FBQ0YsV0FoQkQ7QUFpQkQsU0FsQkQ7QUFacUI7O0FBSXZCLFdBQUssSUFBTUwsS0FBWCxJQUFrQixLQUFLbUUsaUJBQXZCLEVBQTBDO0FBQUEsY0FBL0JuRSxLQUErQjtBQTJCekM7O0FBRUQsYUFBT29HLGNBQVA7QUFDRDs7O1dBRUQsK0JBQXVCcEQsVUFBdkIsRUFBbUM7QUFBQSxVQUFuQnlELElBQW1CLFNBQW5CQSxJQUFtQjtBQUNqQyxVQUFNQyxRQUFRLEdBQUdELElBQUksQ0FBQ0UsTUFBTCxJQUFlRixJQUFJLENBQUNyRCxLQUFMLEdBQWEsQ0FBQyxDQUE5QztBQUNBLFVBQUl3RCxNQUFNLEdBQUcsSUFBYjtBQUNBLFVBQU0zRCxJQUFJLEdBQUd5RCxRQUFRLEdBQUcsS0FBS2xHLEtBQUwsQ0FBV0ksU0FBWCxDQUFxQkMsSUFBckIsQ0FBMEI0RixJQUFJLENBQUNyRCxLQUEvQixDQUFILEdBQTJDLElBQWhFOztBQUNBLFVBQUlILElBQUosRUFBVTtBQUNSLFlBQUk0RCxPQUFPLEdBQUcsRUFBZDs7QUFDQSxhQUFLLElBQU03RyxLQUFYLElBQWtCLEtBQUttRSxpQkFBdkIsRUFBMEM7QUFBQSxjQUNqQ1IsY0FEaUMsR0FDZixLQUFLUSxpQkFBTCxDQUF1Qm5FLEtBQXZCLENBRGUsQ0FDakMyRCxjQURpQzs7QUFFeEMsY0FBSSxPQUFPQSxjQUFQLEtBQTBCLFVBQTlCLEVBQTBDO0FBQ3hDa0QsWUFBQUEsT0FBTyxHQUFHN0UsTUFBTSxDQUFDQyxNQUFQLENBQ1IsRUFEUSxFQUVSNEUsT0FGUSxFQUdSbEQsY0FBYyxDQUFDLEtBQUtuRCxLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEtBQXRCLENBQUQsRUFBNkJpRCxJQUE3QixFQUFtQ0QsVUFBbkMsQ0FITixDQUFWO0FBS0Q7QUFDRjs7QUFFRDRELFFBQUFBLE1BQU0sR0FBRzVFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjNEUsT0FBZCxFQUF1QjVELElBQXZCLEVBQTZCO0FBQ3BDNkQsVUFBQUEsTUFBTSxFQUFFN0QsSUFBSSxDQUFDOEQsY0FBTCxJQUF1QjlELElBQUksQ0FBQzZEO0FBREEsU0FBN0IsQ0FBVDtBQUdELE9BcEJnQyxDQXNCakM7OztBQUNBLGFBQU85RSxNQUFNLENBQUNDLE1BQVAsQ0FBY3dFLElBQWQsRUFBb0I7QUFDekJFLFFBQUFBLE1BQU0sRUFBRUssT0FBTyxDQUFDSixNQUFELENBRFU7QUFFekI7QUFDQUEsUUFBQUEsTUFBTSxFQUFOQTtBQUh5QixPQUFwQixDQUFQO0FBS0Q7OztXQUVELHFCQUFZSyxZQUFaLEVBQTBCakUsVUFBMUIsRUFBc0M7QUFDcEMsVUFBSSxDQUFDLEtBQUttQixpQkFBTCxDQUF1QitDLGNBQXZCLENBQXNDRCxZQUF0QyxDQUFMLEVBQTBEO0FBQ3hELGVBQU90SCxHQUFQO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFLd0UsaUJBQUwsQ0FBdUI4QyxZQUF2QixFQUFxQ3BFLG1CQUFyQyxDQUNMLEtBQUtyQyxLQUFMLENBQVdDLFVBQVgsQ0FBc0J3RyxZQUF0QixDQURLLEVBRUwsS0FBSzlDLGlCQUFMLENBQXVCOEMsWUFBdkIsQ0FGSyxFQUdMakUsVUFISyxDQUFQO0FBS0Q7OztXQXhPRCw2QkFBMkI7QUFDekIsYUFBT2Usa0JBQVA7QUFDRDs7Ozs7O0FBeU9IQyxhQUFhLENBQUMzQyxpQkFBZCxHQUFrQ0EsaUJBQWxDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLyogZXNsaW50LWRpc2FibGUgZ3VhcmQtZm9yLWluICovXG5pbXBvcnQge0FHR1JFR0FUSU9OX09QRVJBVElPTiwgX0JpblNvcnRlciBhcyBCaW5Tb3J0ZXJ9IGZyb20gJ0BkZWNrLmdsL2FnZ3JlZ2F0aW9uLWxheWVycyc7XG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmltcG9ydCB7YWdncmVnYXRlfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7QUdHUkVHQVRJT05fVFlQRVMsIFNDQUxFX0ZVTkN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UkdCQUNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgVXBkYXRlclR5cGUgPSAodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBCaW5kZWRVcGRhdGVyVHlwZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVkVXBkYXRlclR5cGUgPSAoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChhZ2dyZWdhdGlvblBhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIG9uU2V0Pzoge1xuICAgIHByb3BzOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZXI6IFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRGltZW5zaW9uVHlwZTxWYWx1ZVR5cGUgPSBhbnk+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgYWNjZXNzb3I6IHN0cmluZztcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcz8pID0+IGFueTtcbiAgbnVsbFZhbHVlOiBWYWx1ZVR5cGU7XG4gIHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXTtcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIHVwZGF0ZXI6IEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHVwZGF0ZVN0ZXBzOiBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IERFQ0tfQUdHUkVHQVRJT05fTUFQID0ge1xuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTV06IEFHR1JFR0FUSU9OX1RZUEVTLnN1bSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NRUFOXTogQUdHUkVHQVRJT05fVFlQRVMuYXZlcmFnZSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NSU5dOiBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1BWF06IEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZ1bmMoYWdncmVnYXRpb24sIGFjY2Vzc29yKSB7XG4gIGlmICghYWdncmVnYXRpb24gfHwgIUFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBBR0dSRUdBVElPTl9PUEVSQVRJT05bYWdncmVnYXRpb24udG9VcHBlckNhc2UoKV0gfHwgQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTTtcbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcF07XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3Qgc29ydGVkQmlucyA9IG5ldyBCaW5Tb3J0ZXIodGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YSB8fCBbXSwge1xuICAgIGdldFZhbHVlLFxuICAgIGZpbHRlckRhdGE6IHByb3BzLl9maWx0ZXJEYXRhXG4gIH0pO1xuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzb3J0ZWRCaW5zfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25WYWx1ZURvbWFpbih0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtcbiAgICB0cmlnZ2Vyczoge2xvd2VyUGVyY2VudGlsZSwgdXBwZXJQZXJjZW50aWxlLCBzY2FsZVR5cGV9XG4gIH0gPSBzdGVwO1xuXG4gIGlmICghdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucykge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgc29ydGVkQmlucywgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGZvciBsb2cgYW5kIHNxcnQgc2NhbGUsIHJldHVybnMgbGluZWFyIGRvbWFpbiBieSBkZWZhdWx0XG4gIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2NhbGUgZnVuY3Rpb24gZG9tYWluIGluIGJpbiBzb3J0ZXJcbiAgY29uc3QgdmFsdWVEb21haW4gPSB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zLmdldFZhbHVlRG9tYWluQnlTY2FsZShcbiAgICBwcm9wc1tzY2FsZVR5cGUucHJvcF0sXG4gICAgW3Byb3BzW2xvd2VyUGVyY2VudGlsZS5wcm9wXSwgcHJvcHNbdXBwZXJQZXJjZW50aWxlLnByb3BdXVxuICApO1xuXG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3ZhbHVlRG9tYWlufSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25TY2FsZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtkb21haW4sIHJhbmdlLCBzY2FsZVR5cGV9ID0gc3RlcC50cmlnZ2VycztcbiAgY29uc3Qge29uU2V0fSA9IHN0ZXA7XG4gIGlmICghdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHZhbHVlRG9tYWluLCBpZiBub3QsIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGltZW5zaW9uUmFuZ2UgPSBwcm9wc1tyYW5nZS5wcm9wXTtcbiAgY29uc3QgZGltZW5zaW9uRG9tYWluID0gcHJvcHNbZG9tYWluLnByb3BdIHx8IHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluO1xuXG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUgJiYgcHJvcHNbc2NhbGVUeXBlLnByb3BdKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3Rvci5kb21haW4oZGltZW5zaW9uRG9tYWluKS5yYW5nZShkaW1lbnNpb25SYW5nZSk7XG5cbiAgaWYgKHR5cGVvZiBvblNldCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb3BzW29uU2V0LnByb3BzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3BzW29uU2V0LnByb3BzXShzY2FsZUZ1bmMuZG9tYWluKCkpO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGNvbG9yVmFsdWUgPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XSAmJiBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XS52YWx1ZTtcbiAgICByZXR1cm4ge2NvbG9yVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IFswLCAwLCAwLCAwXSxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdnZXRWYWx1ZScsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvclZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JWYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yV2VpZ2h0JyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JXZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2NvbG9yQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdsb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICd1cHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uVmFsdWVEb21haW5cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldFNjYWxlRnVuYycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBkb21haW46IHtwcm9wOiAnY29sb3JEb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnY29sb3JSYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIG9uU2V0OiB7XG4gICAgICAgIHByb3BzOiAnb25TZXRDb2xvckRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb246IERpbWVuc2lvblR5cGU8bnVtYmVyPiA9IHtcbiAga2V5OiAnZWxldmF0aW9uJyxcbiAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtlbGV2YXRpb25WYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogLTEsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0RWxldmF0aW9uVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25WYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvbldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldEVsZXZhdGlvbldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25Mb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25VcHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdlbGV2YXRpb25TY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2VsZXZhdGlvbkRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdlbGV2YXRpb25SYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0RWxldmF0aW9uRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpbWVuc2lvbnMgPSBbZGVmYXVsdENvbG9yRGltZW5zaW9uLCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uXTtcblxuZXhwb3J0IHR5cGUgQ1BVQWdncmVnYXRvclN0YXRlID0ge2xheWVyRGF0YToge2RhdGE/fTsgZGltZW5zaW9uczoge307IGdlb0pTT04/OyBjbHVzdGVyQnVpbGRlcj99O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDUFVBZ2dyZWdhdG9yIHtcbiAgc3RhdGljIGdldERpbWVuc2lvblNjYWxlOiBhbnk7XG4gIHN0YXRlOiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gIGRpbWVuc2lvblVwZGF0ZXJzOiB7W2tleTogc3RyaW5nXTogRGltZW5zaW9uVHlwZX07XG4gIGFnZ3JlZ2F0aW9uVXBkYXRlcjogQWdncmVnYXRpb25UeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdHM6IHtcbiAgICAgIGluaXRpYWxTdGF0ZT86IENQVUFnZ3JlZ2F0b3JTdGF0ZTtcbiAgICAgIGRpbWVuc2lvbnM/OiBEaW1lbnNpb25UeXBlW107XG4gICAgICBhZ2dyZWdhdGlvbj86IEFnZ3JlZ2F0aW9uVHlwZTtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxheWVyRGF0YToge30sXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIC8vIGNvbG9yOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gZWxldmF0aW9uOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdHMuaW5pdGlhbFN0YXRlXG4gICAgfTtcblxuICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMgPSB7fTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IG9wdHMuYWdncmVnYXRpb24gfHwgZGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXG4gICAgdGhpcy5fYWRkRGltZW5zaW9uKG9wdHMuZGltZW5zaW9ucyB8fCBkZWZhdWx0RGltZW5zaW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHREaW1lbnNpb25zO1xuICB9XG5cbiAgdXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wcykge1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG4gICAgLy8gdXBkYXRlIGFsbCBkaW1lbnNpb25zXG4gICAgZm9yIChjb25zdCBkaW0gaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltXSk7XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzID0gZGltZW5zaW9uQ2hhbmdlcy5jb25jYXQodXBkYXRlcnMpO1xuICAgIH1cblxuICAgIGRpbWVuc2lvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoKSk7XG4gIH1cblxuICB1cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB1cGRhdGVycyA9IHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycygwLCBwcm9wcywgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIpO1xuICAgIHVwZGF0ZXJzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKGFnZ3JlZ2F0aW9uUGFyYW1zKSk7XG4gIH1cblxuICB1cGRhdGVTdGF0ZShvcHRzLCBhZ2dyZWdhdGlvblBhcmFtcykge1xuICAgIGNvbnN0IHtvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzfSA9IG9wdHM7XG4gICAgbGV0IGRpbWVuc2lvbkNoYW5nZXM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcblxuICAgIGlmIChjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCkge1xuICAgICAgLy8gaWYgZGF0YSBjaGFuZ2VkIHVwZGF0ZSBldmVyeXRoaW5nXG4gICAgICB0aGlzLnVwZGF0ZUFnZ3JlZ2F0aW9uKHByb3BzLCBhZ2dyZWdhdGlvblBhcmFtcyk7XG4gICAgICB0aGlzLnVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpO1xuXG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNoYW5nZXMgPSB0aGlzLl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG5cbiAgICBpZiAoYWdncmVnYXRpb25DaGFuZ2VzICYmIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgIC8vIGdldCBhZ2dyZWdhdGVkRGF0YVxuICAgICAgYWdncmVnYXRpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKGFnZ3JlZ2F0aW9uUGFyYW1zKSk7XG4gICAgICB0aGlzLnVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHVwZGF0ZSBkaW1lbnNpb25zXG4gICAgICBkaW1lbnNpb25DaGFuZ2VzID0gdGhpcy5fZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB8fCBbXTtcbiAgICAgIGRpbWVuc2lvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZVxuICBzZXRTdGF0ZSh1cGRhdGVPYmplY3QpIHtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZSwgdXBkYXRlT2JqZWN0KTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcml2YXRlIHN0YXRlLmRpbWVuc2lvbnNcbiAgX3NldERpbWVuc2lvblN0YXRlKGtleSwgdXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkaW1lbnNpb25zOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnMsIHtcbiAgICAgICAgW2tleV06IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLCB1cGRhdGVPYmplY3QpXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgX2FkZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvblR5cGUpIHtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IGFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgX2FkZERpbWVuc2lvbihkaW1lbnNpb25zOiBEaW1lbnNpb25UeXBlW10gPSBbXSkge1xuICAgIGRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuICAgICAgY29uc3Qge2tleX0gPSBkaW1lbnNpb247XG4gICAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV0gPSBkaW1lbnNpb247XG4gICAgfSk7XG4gIH1cblxuICBfbmVlZFVwZGF0ZVN0ZXAoXG4gICAgZGltZW5zaW9uU3RlcDogVXBkYXRlU3RlcHNUeXBlIHwgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUsXG4gICAgb2xkUHJvcHMsXG4gICAgcHJvcHMsXG4gICAgY2hhbmdlRmxhZ3NcbiAgKSB7XG4gICAgLy8gd2hldGhlciBuZWVkIHRvIHVwZGF0ZSBjdXJyZW50IGRpbWVuc2lvbiBzdGVwXG4gICAgLy8gZGltZW5zaW9uIHN0ZXAgaXMgdGhlIHZhbHVlLCBkb21haW4sIHNjYWxlRnVuY3Rpb24gb2YgZWFjaCBkaW1lbnNpb25cbiAgICAvLyBlYWNoIHN0ZXAgaXMgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBsaW5rcyB0byBsYXllciBwcm9wIGFuZCB3aGV0aGVyIHRoZSBwcm9wIGlzXG4gICAgLy8gY29udHJvbGxlZCBieSB1cGRhdGVUcmlnZ2Vyc1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGRpbWVuc2lvblN0ZXAudHJpZ2dlcnMpLnNvbWUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbS51cGRhdGVUcmlnZ2VyKSB7XG4gICAgICAgIC8vIGNoZWNrIGJhc2VkIG9uIHVwZGF0ZVRyaWdnZXJzIGNoYW5nZSBmaXJzdFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCAmJlxuICAgICAgICAgIChjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQuYWxsIHx8XG4gICAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWRbaXRlbS51cGRhdGVUcmlnZ2VyXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIGZhbGxiYWNrIHRvIGRpcmVjdCBjb21wYXJpc29uXG4gICAgICByZXR1cm4gb2xkUHJvcHNbaXRlbS5wcm9wXSAhPT0gcHJvcHNbaXRlbS5wcm9wXTtcbiAgICB9KTtcbiAgfVxuXG4gIF9hY2N1bXVsYXRlVXBkYXRlcnM8VXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlIHwgQWdncmVnYXRpb25UeXBlPihcbiAgICBzdGVwLFxuICAgIHByb3BzLFxuICAgIGRpbWVuc2lvbjogVXBkYXRlck9iamVjdFR5cGVcbiAgKSB7XG4gICAgdHlwZSBMb2NhbFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBjb25zdCB1cGRhdGVyczogTG9jYWxVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIExvY2FsVXBkYXRlclR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlcnM7XG4gIH1cblxuICBfZ2V0QWxsVXBkYXRlcnM8VXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlIHwgQWdncmVnYXRpb25UeXBlPihcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIHR5cGUgTG9jYWxVcGRhdGVyVHlwZSA9IFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZVxuICAgICAgPyBCaW5kZWRVcGRhdGVyVHlwZVxuICAgICAgOiBCaW5kZWRBZ2dyZWdhdGVkVXBkYXRlclR5cGU7XG4gICAgbGV0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuICAgIGNvbnN0IGNlbGwgPSBpc1BpY2tlZCA/IHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGFbaW5mby5pbmRleF0gOiBudWxsO1xuICAgIGlmIChjZWxsKSB7XG4gICAgICBsZXQgYmluSW5mbyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgICBjb25zdCB7Z2V0UGlja2luZ0luZm99ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIGdldFBpY2tpbmdJbmZvID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgYmluSW5mbyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIGJpbkluZm8sXG4gICAgICAgICAgICBnZXRQaWNraW5nSW5mbyh0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgY2VsbCwgbGF5ZXJQcm9wcylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9iamVjdCA9IE9iamVjdC5hc3NpZ24oYmluSW5mbywgY2VsbCwge1xuICAgICAgICBwb2ludHM6IGNlbGwuZmlsdGVyZWRQb2ludHMgfHwgY2VsbC5wb2ludHNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGFkZCBiaW4gIGFuZCAgdG8gaW5mb1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGluZm8sIHtcbiAgICAgIHBpY2tlZDogQm9vbGVhbihvYmplY3QpLFxuICAgICAgLy8gb3ZlcnJpZGUgb2JqZWN0IHdpdGggcGlja2VkIGNlbGxcbiAgICAgIG9iamVjdFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QWNjZXNzb3IoZGltZW5zaW9uS2V5LCBsYXllclByb3BzKSB7XG4gICAgaWYgKCF0aGlzLmRpbWVuc2lvblVwZGF0ZXJzLmhhc093blByb3BlcnR5KGRpbWVuc2lvbktleSkpIHtcbiAgICAgIHJldHVybiBub3A7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbWVuc2lvbktleV0uZ2V0U3ViTGF5ZXJBY2Nlc3NvcihcbiAgICAgIHRoaXMuc3RhdGUuZGltZW5zaW9uc1tkaW1lbnNpb25LZXldLFxuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLFxuICAgICAgbGF5ZXJQcm9wc1xuICAgICk7XG4gIH1cbn1cblxuQ1BVQWdncmVnYXRvci5nZXREaW1lbnNpb25TY2FsZSA9IGdldERpbWVuc2lvblNjYWxlO1xuIl19