@seniorsistemas/angular-components 17.16.4 → 17.16.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/seniorsistemas-angular-components.umd.js +192 -194
- package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
- package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
- package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
- package/components/panel/panel.component.d.ts +2 -2
- package/components/slider/slider.component.d.ts +19 -17
- package/esm2015/components/panel/panel.component.js +7 -7
- package/esm2015/components/slider/slider.component.js +180 -187
- package/esm5/components/panel/panel.component.js +7 -7
- package/esm5/components/slider/slider.component.js +188 -190
- package/fesm2015/seniorsistemas-angular-components.js +185 -192
- package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
- package/fesm5/seniorsistemas-angular-components.js +192 -194
- package/fesm5/seniorsistemas-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/seniorsistemas-angular-components.metadata.json +1 -1
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild
|
|
1
|
+
import { __decorate, __read } from "tslib";
|
|
2
|
+
import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from "@angular/core";
|
|
3
3
|
import { NG_VALUE_ACCESSOR } from "@angular/forms";
|
|
4
4
|
var SliderComponent = /** @class */ (function () {
|
|
5
5
|
function SliderComponent() {
|
|
6
6
|
var _this = this;
|
|
7
|
+
this.MAX_RANGE_VALUE = 100;
|
|
8
|
+
this.MIN_RANGE_VALUE = 0;
|
|
7
9
|
this.multiple = false;
|
|
8
10
|
this.value = 0;
|
|
9
11
|
this.valueChange = new EventEmitter();
|
|
10
12
|
this.step = 1;
|
|
11
13
|
this.hiddenThumb = false;
|
|
12
14
|
this.disabled = false;
|
|
13
|
-
this.min =
|
|
14
|
-
this.max =
|
|
15
|
+
this.min = this.MIN_RANGE_VALUE;
|
|
16
|
+
this.max = this.MAX_RANGE_VALUE;
|
|
15
17
|
this.tabindex = 0;
|
|
16
18
|
this.startValue = 0;
|
|
17
19
|
this.endValue = 0;
|
|
@@ -30,13 +32,11 @@ var SliderComponent = /** @class */ (function () {
|
|
|
30
32
|
* @example
|
|
31
33
|
* with min = -10 and max = 10 will have this map.
|
|
32
34
|
* {
|
|
33
|
-
* -10: {
|
|
34
|
-
* -9: {
|
|
35
|
+
* -10: { 0 },
|
|
36
|
+
* -9: { 10 },
|
|
35
37
|
* ...
|
|
36
|
-
* 10: {
|
|
38
|
+
* 10: { 10 }
|
|
37
39
|
* }
|
|
38
|
-
* the left value represent value for startValue, the right value represent value for endValue
|
|
39
|
-
* left and right values are used when applying percentages in the slider
|
|
40
40
|
*/
|
|
41
41
|
this.mapRangeValuesForSlider = new Map();
|
|
42
42
|
this.activeMouseDown = false;
|
|
@@ -49,16 +49,16 @@ var SliderComponent = /** @class */ (function () {
|
|
|
49
49
|
(_this.multiple && _this.draggingThumb === "end" && newPosition < _this.startValue)) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
var positionInUserRange = _this.
|
|
52
|
+
var positionInUserRange = _this.getValueFromMapByValue(newPosition);
|
|
53
53
|
if (_this.multiple) {
|
|
54
54
|
if (_this.draggingThumb === "start") {
|
|
55
55
|
_this.startValue = _this.needParseValues
|
|
56
|
-
? _this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
56
|
+
? _this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
57
57
|
: newPosition;
|
|
58
58
|
}
|
|
59
59
|
else if (_this.draggingThumb === "end") {
|
|
60
60
|
_this.endValue = _this.needParseValues
|
|
61
|
-
? _this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
61
|
+
? _this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
62
62
|
: newPosition;
|
|
63
63
|
}
|
|
64
64
|
_this.setValue([_this.startValue, _this.endValue]);
|
|
@@ -71,18 +71,15 @@ var SliderComponent = /** @class */ (function () {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
|
-
var
|
|
75
|
-
var
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
else if (pickRightValue) {
|
|
82
|
-
_this.endValue = _this.needParseValues
|
|
83
|
-
? _this.mapRangeValuesForSlider.get(positionInUserRange).right
|
|
84
|
-
: newPosition;
|
|
74
|
+
var currentValue = _this.value;
|
|
75
|
+
var _value = _this.needParseValues ? positionInUserRange : newPosition;
|
|
76
|
+
var isAtSameValue = _this.needParseValues ? positionInUserRange === _this.value : false;
|
|
77
|
+
var hasStep = _this.step !== 0;
|
|
78
|
+
var newValueIsValidByStep = hasStep ? currentValue + _this.step === _value || currentValue - _this.step === _value : false;
|
|
79
|
+
if (isAtSameValue && !newValueIsValidByStep) {
|
|
80
|
+
return;
|
|
85
81
|
}
|
|
82
|
+
_this.endValue = _this.needParseValues ? _this.mapRangeValuesForSlider.get(positionInUserRange) : newPosition;
|
|
86
83
|
_this.startValue = _this.endValue;
|
|
87
84
|
_this.setValue(_this.endValue);
|
|
88
85
|
}
|
|
@@ -103,20 +100,20 @@ var SliderComponent = /** @class */ (function () {
|
|
|
103
100
|
var startValueBeforeEvent = _this.startValueBeforeProgressBarEvent;
|
|
104
101
|
var range = _this.rangeBetweenElementsBeforeProgressBarEvent;
|
|
105
102
|
var _a = calculateNewRange(startValueBeforeEvent, startValueBeforeEvent + range, startPositionBeforeEvent, newCenter), newStart = _a.newStart, newEnd = _a.newEnd;
|
|
106
|
-
if (newStart <
|
|
103
|
+
if (newStart < _this.MIN_RANGE_VALUE || newEnd > _this.MAX_RANGE_VALUE) {
|
|
107
104
|
return;
|
|
108
105
|
}
|
|
109
106
|
if (_this.needParseValues) {
|
|
110
|
-
var startValueBeforeEventUserRange = _this.
|
|
111
|
-
var startPositionBeforeEventUserRange = _this.
|
|
112
|
-
var centerUserRange = _this.
|
|
107
|
+
var startValueBeforeEventUserRange = _this.getValueFromMapByValue(startValueBeforeEvent);
|
|
108
|
+
var startPositionBeforeEventUserRange = _this.getValueFromMapByValue(startPositionBeforeEvent);
|
|
109
|
+
var centerUserRange = _this.getValueFromMapByValue(newCenter);
|
|
113
110
|
var valueRange = _this.totalRangeBeforeProgressBarEvent;
|
|
114
111
|
var _b = calculateNewRange(startValueBeforeEventUserRange, startValueBeforeEventUserRange + valueRange, startPositionBeforeEventUserRange, centerUserRange), newStart_1 = _b.newStart, newEnd_1 = _b.newEnd;
|
|
115
112
|
if (newStart_1 < _this.min || newEnd_1 > _this.max) {
|
|
116
113
|
return;
|
|
117
114
|
}
|
|
118
|
-
_this.startValue = _this.mapRangeValuesForSlider.get(newStart_1)
|
|
119
|
-
_this.endValue = _this.mapRangeValuesForSlider.get(newEnd_1)
|
|
115
|
+
_this.startValue = _this.mapRangeValuesForSlider.get(newStart_1);
|
|
116
|
+
_this.endValue = _this.mapRangeValuesForSlider.get(newEnd_1);
|
|
120
117
|
}
|
|
121
118
|
else {
|
|
122
119
|
_this.startValue = newStart;
|
|
@@ -139,8 +136,15 @@ var SliderComponent = /** @class */ (function () {
|
|
|
139
136
|
}
|
|
140
137
|
SliderComponent_1 = SliderComponent;
|
|
141
138
|
SliderComponent.prototype.ngOnInit = function () {
|
|
142
|
-
|
|
139
|
+
this.setUserRangeMapValues();
|
|
140
|
+
};
|
|
141
|
+
SliderComponent.prototype.ngOnChanges = function (changes) {
|
|
142
|
+
var hasChangesOnMin = changes.min && !changes.min.firstChange;
|
|
143
|
+
var hasChangesOnMax = changes.max && !changes.max.firstChange;
|
|
144
|
+
var hasChanges = hasChangesOnMin || hasChangesOnMax;
|
|
145
|
+
if (hasChanges) {
|
|
143
146
|
this.setUserRangeMapValues();
|
|
147
|
+
this.setRangeValues();
|
|
144
148
|
}
|
|
145
149
|
};
|
|
146
150
|
SliderComponent.prototype.ngAfterViewInit = function () {
|
|
@@ -163,14 +167,16 @@ var SliderComponent = /** @class */ (function () {
|
|
|
163
167
|
};
|
|
164
168
|
Object.defineProperty(SliderComponent.prototype, "tooltipStartText", {
|
|
165
169
|
get: function () {
|
|
166
|
-
|
|
170
|
+
var _a, _b;
|
|
171
|
+
return Array.isArray(this.value) ? (_a = this.value[0]) === null || _a === void 0 ? void 0 : _a.toString() : (_b = this.value) === null || _b === void 0 ? void 0 : _b.toString();
|
|
167
172
|
},
|
|
168
173
|
enumerable: true,
|
|
169
174
|
configurable: true
|
|
170
175
|
});
|
|
171
176
|
Object.defineProperty(SliderComponent.prototype, "tooltipEndText", {
|
|
172
177
|
get: function () {
|
|
173
|
-
|
|
178
|
+
var _a, _b;
|
|
179
|
+
return Array.isArray(this.value) ? (_a = this.value[1]) === null || _a === void 0 ? void 0 : _a.toString() : (_b = this.value) === null || _b === void 0 ? void 0 : _b.toString();
|
|
174
180
|
},
|
|
175
181
|
enumerable: true,
|
|
176
182
|
configurable: true
|
|
@@ -199,11 +205,11 @@ var SliderComponent = /** @class */ (function () {
|
|
|
199
205
|
return;
|
|
200
206
|
}
|
|
201
207
|
var trackClickPercentage = this.getPercentageByEvent(evt);
|
|
202
|
-
var trackClickToUserRange = this.
|
|
208
|
+
var trackClickToUserRange = this.getValueFromMapByValue(trackClickPercentage);
|
|
203
209
|
var _trackClickValid = this.needParseValues ? trackClickToUserRange : trackClickPercentage;
|
|
204
210
|
var _setEndValue = function () {
|
|
205
|
-
var _endValueUserValue = _this.
|
|
206
|
-
var _endValue = _this.needParseValues ? _this.mapRangeValuesForSlider.get(trackClickToUserRange)
|
|
211
|
+
var _endValueUserValue = _this.getValueFromMapByValue(_this.endValue);
|
|
212
|
+
var _endValue = _this.needParseValues ? _this.mapRangeValuesForSlider.get(trackClickToUserRange) : trackClickPercentage;
|
|
207
213
|
if (_this.needParseValues && _endValueUserValue !== trackClickToUserRange) {
|
|
208
214
|
_this.endValue = _endValue;
|
|
209
215
|
}
|
|
@@ -212,10 +218,10 @@ var SliderComponent = /** @class */ (function () {
|
|
|
212
218
|
}
|
|
213
219
|
};
|
|
214
220
|
var _setStartValue = function () {
|
|
215
|
-
var _startValueUserValue = _this.
|
|
221
|
+
var _startValueUserValue = _this.getValueFromMapByValue(_this.startValue);
|
|
216
222
|
if (_this.needParseValues && _startValueUserValue !== trackClickToUserRange) {
|
|
217
223
|
var _startValue = _this.needParseValues
|
|
218
|
-
? _this.mapRangeValuesForSlider.get(trackClickToUserRange)
|
|
224
|
+
? _this.mapRangeValuesForSlider.get(trackClickToUserRange)
|
|
219
225
|
: trackClickPercentage;
|
|
220
226
|
_this.startValue = _startValue;
|
|
221
227
|
}
|
|
@@ -225,8 +231,8 @@ var SliderComponent = /** @class */ (function () {
|
|
|
225
231
|
};
|
|
226
232
|
if (this.multiple) {
|
|
227
233
|
var _a = __read(this.value, 2), start = _a[0], end = _a[1];
|
|
228
|
-
var validStart_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(start)
|
|
229
|
-
var validEnd_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(end)
|
|
234
|
+
var validStart_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(start) : start;
|
|
235
|
+
var validEnd_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(end) : end;
|
|
230
236
|
var _updateStart = function () {
|
|
231
237
|
_setStartValue();
|
|
232
238
|
_this.setValue([trackClickPercentage, validEnd_1]);
|
|
@@ -289,11 +295,15 @@ var SliderComponent = /** @class */ (function () {
|
|
|
289
295
|
document.addEventListener("mouseup", this.onMouseUp);
|
|
290
296
|
};
|
|
291
297
|
SliderComponent.prototype.setRangeValues = function () {
|
|
298
|
+
var _this = this;
|
|
299
|
+
var _setStartAndEndValue = function (startValue, endValue) {
|
|
300
|
+
_this.startValue = _this.getClosestValueFromMapSlider(startValue);
|
|
301
|
+
_this.endValue = _this.getClosestValueFromMapSlider(endValue);
|
|
302
|
+
};
|
|
292
303
|
if (Array.isArray(this.value) && !this.multiple) {
|
|
293
304
|
throw new Error('You must use "multiple" with value as array');
|
|
294
305
|
}
|
|
295
|
-
|
|
296
|
-
if (this.multiple && Array.isArray(this.value) && !hasRangeValues) {
|
|
306
|
+
if (this.multiple && Array.isArray(this.value)) {
|
|
297
307
|
this.startValue = this.value[0];
|
|
298
308
|
this.endValue = this.value[1];
|
|
299
309
|
}
|
|
@@ -305,13 +315,40 @@ var SliderComponent = /** @class */ (function () {
|
|
|
305
315
|
this.endValue = this.value;
|
|
306
316
|
}
|
|
307
317
|
if (this.needParseValues) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
318
|
+
_setStartAndEndValue(this.startValue, this.endValue);
|
|
319
|
+
if (this.multiple) {
|
|
320
|
+
var _a = __read(this.value, 2), _startValue = _a[0], _endValue = _a[1];
|
|
321
|
+
var difference = getDifference(_endValue, _startValue);
|
|
322
|
+
var endValueIsGreatherThanMax = _endValue > this.max;
|
|
323
|
+
var startValueIsLessThanMin = _startValue < this.min;
|
|
324
|
+
var needUpdateValues = endValueIsGreatherThanMax || startValueIsLessThanMin;
|
|
325
|
+
if (endValueIsGreatherThanMax) {
|
|
326
|
+
_endValue = this.max;
|
|
327
|
+
_startValue = _endValue - difference;
|
|
328
|
+
}
|
|
329
|
+
else if (startValueIsLessThanMin) {
|
|
330
|
+
_startValue = this.min;
|
|
331
|
+
_endValue = _startValue + difference;
|
|
332
|
+
}
|
|
333
|
+
if (needUpdateValues) {
|
|
334
|
+
_setStartAndEndValue(_startValue, _endValue);
|
|
335
|
+
this.setValue([this.startValue, this.endValue]);
|
|
336
|
+
}
|
|
312
337
|
}
|
|
313
338
|
else {
|
|
314
|
-
|
|
339
|
+
var _value = this.value;
|
|
340
|
+
var valueGreatherThanMax = _value > this.max;
|
|
341
|
+
var valueLessThanMin = _value < this.min;
|
|
342
|
+
var needUpdateValue = valueGreatherThanMax || valueLessThanMin;
|
|
343
|
+
if (valueGreatherThanMax) {
|
|
344
|
+
_value = this.max;
|
|
345
|
+
}
|
|
346
|
+
else if (valueLessThanMin) {
|
|
347
|
+
_value = this.min;
|
|
348
|
+
}
|
|
349
|
+
if (needUpdateValue) {
|
|
350
|
+
this.setValue(_value);
|
|
351
|
+
}
|
|
315
352
|
}
|
|
316
353
|
}
|
|
317
354
|
this.setProgress();
|
|
@@ -333,22 +370,22 @@ var SliderComponent = /** @class */ (function () {
|
|
|
333
370
|
*/
|
|
334
371
|
SliderComponent.prototype.getPercentageByEvent = function (mouseEvent) {
|
|
335
372
|
var trackRect = this.track.nativeElement.getBoundingClientRect();
|
|
336
|
-
var newLeft = ((mouseEvent.clientX - trackRect.left) / trackRect.width) *
|
|
337
|
-
newLeft = Math.
|
|
338
|
-
newLeft = Math.max(0, Math.min(newLeft, 100));
|
|
373
|
+
var newLeft = Math.round(((mouseEvent.clientX - trackRect.left) / trackRect.width) * this.MAX_RANGE_VALUE);
|
|
374
|
+
newLeft = Math.max(0, Math.min(newLeft, this.MAX_RANGE_VALUE));
|
|
339
375
|
return newLeft;
|
|
340
376
|
};
|
|
341
|
-
SliderComponent.prototype.setValue = function (value) {
|
|
377
|
+
SliderComponent.prototype.setValue = function (value, parse) {
|
|
342
378
|
var _this = this;
|
|
379
|
+
if (parse === void 0) { parse = true; }
|
|
343
380
|
if (this.disabled) {
|
|
344
381
|
return;
|
|
345
382
|
}
|
|
346
|
-
if (this.needParseValues) {
|
|
383
|
+
if (this.needParseValues && parse) {
|
|
347
384
|
if (Array.isArray(value)) {
|
|
348
|
-
value = value.map(function (x) { return _this.
|
|
385
|
+
value = value.map(function (x) { return _this.getValueFromMapByValue(x); });
|
|
349
386
|
}
|
|
350
387
|
else {
|
|
351
|
-
value = this.
|
|
388
|
+
value = this.getValueFromMapByValue(value);
|
|
352
389
|
}
|
|
353
390
|
}
|
|
354
391
|
this.value = value;
|
|
@@ -361,54 +398,84 @@ var SliderComponent = /** @class */ (function () {
|
|
|
361
398
|
var _this = this;
|
|
362
399
|
var start = this.min;
|
|
363
400
|
var end = this.max;
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
this.mapRangeValuesForSlider.clear();
|
|
367
|
-
var mappedValues = [];
|
|
368
|
-
for (var i = start; i <= end; i++) {
|
|
369
|
-
var valuesWithMap = [];
|
|
370
|
-
for (var j = forStart; j <= forEnd; j++) {
|
|
371
|
-
var sliderToUserRangeValue = this.mapSliderToUserRange(j);
|
|
372
|
-
if (sliderToUserRangeValue !== i) {
|
|
373
|
-
forStart = j;
|
|
374
|
-
break;
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
valuesWithMap.push(j);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
var left = valuesWithMap[0];
|
|
381
|
-
var right = valuesWithMap[valuesWithMap.length - 1];
|
|
382
|
-
mappedValues.push({ value: i, left: left, right: right });
|
|
401
|
+
if (start > end) {
|
|
402
|
+
throw new Error('Max value must be greater than min value');
|
|
383
403
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
404
|
+
this.mapRangeValuesForSlider.clear();
|
|
405
|
+
var range = end - start;
|
|
406
|
+
var decimalPlaces = 2;
|
|
407
|
+
var stepCount = Math.floor(range / this.step);
|
|
408
|
+
var values = [];
|
|
409
|
+
for (var value = start; value <= end; value += this.step) {
|
|
410
|
+
values.push(value);
|
|
411
|
+
}
|
|
412
|
+
if (values[values.length - 1] !== end) {
|
|
413
|
+
values.push(end);
|
|
414
|
+
}
|
|
415
|
+
var mappedValues = values.map(function (value) {
|
|
416
|
+
var mapped = ((value - start) / range) * _this.MAX_RANGE_VALUE;
|
|
417
|
+
return parseFloat(mapped.toFixed(decimalPlaces));
|
|
418
|
+
});
|
|
419
|
+
mappedValues[0] = 0;
|
|
420
|
+
mappedValues[mappedValues.length - 1] = this.MAX_RANGE_VALUE;
|
|
421
|
+
var error = this.MAX_RANGE_VALUE - mappedValues[mappedValues.length - 1];
|
|
422
|
+
var errorPerStep = error / stepCount;
|
|
423
|
+
for (var i = 1; i < mappedValues.length - 1; i++) {
|
|
424
|
+
mappedValues[i] += errorPerStep;
|
|
425
|
+
mappedValues[i] = parseFloat(mappedValues[i].toFixed(decimalPlaces));
|
|
426
|
+
}
|
|
427
|
+
values.forEach(function (value, index) {
|
|
428
|
+
_this.mapRangeValuesForSlider.set(value, mappedValues[index]);
|
|
387
429
|
});
|
|
388
430
|
};
|
|
389
431
|
/**
|
|
390
|
-
*
|
|
432
|
+
* Returns the user value from the given slider value by using the map of range values.
|
|
391
433
|
* @example
|
|
392
|
-
* If
|
|
434
|
+
* If the map is 0: { 0 }, 1: { 10 }, 2: { 30 }, 3: { 40 }, 4: { 50 }
|
|
435
|
+
* and the sliderValue is 37, the function returns 3
|
|
436
|
+
* or the slider value is 40, the function returns 4
|
|
437
|
+
* @param sliderValue the value of the slider (values only between range MIN and MAX)
|
|
438
|
+
* @returns the user value from the given slider value
|
|
393
439
|
*/
|
|
394
|
-
SliderComponent.prototype.
|
|
395
|
-
|
|
440
|
+
SliderComponent.prototype.getValueFromMapByValue = function (sliderValue) {
|
|
441
|
+
var mapToArray = Array.from(this.mapRangeValuesForSlider).map(function (_a) {
|
|
442
|
+
var _b = __read(_a, 2), value = _b[0], mapped = _b[1];
|
|
443
|
+
return ({ value: value, mapped: mapped });
|
|
444
|
+
});
|
|
445
|
+
var exactValue = mapToArray.find(function (x) { return x.mapped == sliderValue; });
|
|
446
|
+
var closest = mapToArray.reduce(function (prev, curr) { return Math.abs(curr.mapped - sliderValue) < Math.abs(prev.mapped - sliderValue) ? curr : prev; });
|
|
447
|
+
return exactValue ? exactValue.value : closest.value;
|
|
396
448
|
};
|
|
397
449
|
/**
|
|
398
|
-
*
|
|
399
|
-
* @
|
|
400
|
-
*
|
|
401
|
-
* and the sliderValue is 37, the function returns 1
|
|
402
|
-
* @param sliderValue the value of the slider
|
|
403
|
-
* @returns the user value from the given slider value
|
|
450
|
+
* Retrieves the key from the map that is closest to the given slider value.
|
|
451
|
+
* @param userValue - The value to find the closest key for. (values only between 0 - 100)
|
|
452
|
+
* @returns The key that corresponds to the closest mapped value.
|
|
404
453
|
*/
|
|
405
|
-
SliderComponent.prototype.
|
|
406
|
-
var _a
|
|
407
|
-
|
|
408
|
-
return
|
|
454
|
+
SliderComponent.prototype.getClosestValueFromMapSlider = function (userValue) {
|
|
455
|
+
var mapToArray = Array.from(this.mapRangeValuesForSlider).map(function (_a) {
|
|
456
|
+
var _b = __read(_a, 2), value = _b[0], mapped = _b[1];
|
|
457
|
+
return ({ value: value, mapped: mapped });
|
|
409
458
|
});
|
|
410
|
-
|
|
411
|
-
|
|
459
|
+
if (userValue >= this.max) {
|
|
460
|
+
return mapToArray[mapToArray.length - 1].mapped;
|
|
461
|
+
}
|
|
462
|
+
else if (userValue <= this.min) {
|
|
463
|
+
return mapToArray[0].mapped;
|
|
464
|
+
}
|
|
465
|
+
var exactValue = mapToArray.find(function (x) { return x.value == userValue; });
|
|
466
|
+
var closestValue = mapToArray.reduce(function (prev, curr) { return Math.abs(curr.value - userValue) < Math.abs(prev.value - userValue) ? curr : prev; });
|
|
467
|
+
var item = exactValue || closestValue;
|
|
468
|
+
var isFirstItem = mapToArray[0] === item;
|
|
469
|
+
var isLastItem = mapToArray[mapToArray.length - 1] === item;
|
|
470
|
+
if (isFirstItem && userValue > this.min) {
|
|
471
|
+
return getMidpoint(item.mapped, mapToArray[1].mapped);
|
|
472
|
+
}
|
|
473
|
+
else if (isLastItem && userValue < this.max) {
|
|
474
|
+
return getMidpoint(item.mapped, mapToArray[mapToArray.length - 2].mapped);
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
return item.mapped;
|
|
478
|
+
}
|
|
412
479
|
};
|
|
413
480
|
SliderComponent.prototype.handleArrowKeyLeft = function () {
|
|
414
481
|
if (this.multiple) {
|
|
@@ -430,6 +497,7 @@ var SliderComponent = /** @class */ (function () {
|
|
|
430
497
|
};
|
|
431
498
|
SliderComponent.prototype._incrementOrDecrementStartAndEndValue = function (increment) {
|
|
432
499
|
var _a = __read(this.value, 2), start = _a[0], end = _a[1];
|
|
500
|
+
var difference = getDifference(end, start);
|
|
433
501
|
if (increment) {
|
|
434
502
|
start += this.step;
|
|
435
503
|
end += this.step;
|
|
@@ -438,31 +506,28 @@ var SliderComponent = /** @class */ (function () {
|
|
|
438
506
|
start -= this.step;
|
|
439
507
|
end -= this.step;
|
|
440
508
|
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
509
|
+
var startLessThanMin = start < this.min;
|
|
510
|
+
var endGreaterThanMax = end > this.max;
|
|
511
|
+
if (startLessThanMin || endGreaterThanMax) {
|
|
512
|
+
if (startLessThanMin) {
|
|
513
|
+
start = this.min;
|
|
514
|
+
end = start + difference;
|
|
444
515
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
start =
|
|
448
|
-
end = start;
|
|
449
|
-
}
|
|
450
|
-
else {
|
|
451
|
-
start = this.mapRangeValuesForSlider.get(start).left;
|
|
452
|
-
if (isEqual) {
|
|
453
|
-
end = start;
|
|
454
|
-
}
|
|
455
|
-
else {
|
|
456
|
-
end = this.mapRangeValuesForSlider.get(end).right;
|
|
457
|
-
}
|
|
516
|
+
else if (endGreaterThanMax) {
|
|
517
|
+
end = this.max;
|
|
518
|
+
start = end - difference;
|
|
458
519
|
}
|
|
459
520
|
}
|
|
460
|
-
if (start <
|
|
521
|
+
if (start < this.min || end > this.max) {
|
|
461
522
|
return;
|
|
462
523
|
}
|
|
524
|
+
this.setValue([start, end], false);
|
|
525
|
+
if (this.needParseValues) {
|
|
526
|
+
start = this.getClosestValueFromMapSlider(start);
|
|
527
|
+
end = this.getClosestValueFromMapSlider(end);
|
|
528
|
+
}
|
|
463
529
|
this.startValue = start;
|
|
464
530
|
this.endValue = end;
|
|
465
|
-
this.setValue([start, end]);
|
|
466
531
|
};
|
|
467
532
|
SliderComponent.prototype._incrementOrDecrementEndValue = function (increment) {
|
|
468
533
|
var value = this.value;
|
|
@@ -474,28 +539,18 @@ var SliderComponent = /** @class */ (function () {
|
|
|
474
539
|
}
|
|
475
540
|
var _newEndValue = value;
|
|
476
541
|
if (this.needParseValues) {
|
|
477
|
-
|
|
478
|
-
if (!valueParsedInSlider) {
|
|
479
|
-
return;
|
|
480
|
-
}
|
|
481
|
-
var pickLeft = valueParsedInSlider.right <= 50;
|
|
482
|
-
if (pickLeft) {
|
|
483
|
-
_newEndValue = this.mapRangeValuesForSlider.get(value).left;
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
_newEndValue = this.mapRangeValuesForSlider.get(value).right;
|
|
487
|
-
}
|
|
542
|
+
_newEndValue = this.getClosestValueFromMapSlider(_newEndValue);
|
|
488
543
|
}
|
|
489
|
-
if (_newEndValue <
|
|
544
|
+
if (_newEndValue < this.MIN_RANGE_VALUE || _newEndValue > this.MAX_RANGE_VALUE) {
|
|
490
545
|
return;
|
|
491
546
|
}
|
|
492
547
|
this.endValue = _newEndValue;
|
|
493
548
|
this.startValue = this.endValue;
|
|
494
|
-
this.setValue(
|
|
549
|
+
this.setValue(_newEndValue);
|
|
495
550
|
};
|
|
496
551
|
Object.defineProperty(SliderComponent.prototype, "needParseValues", {
|
|
497
552
|
get: function () {
|
|
498
|
-
return this.max !==
|
|
553
|
+
return this.max !== this.MAX_RANGE_VALUE || this.min !== this.MIN_RANGE_VALUE;
|
|
499
554
|
},
|
|
500
555
|
enumerable: true,
|
|
501
556
|
configurable: true
|
|
@@ -578,71 +633,14 @@ var isInRange = function (value, rangeStart, rangeEnd) {
|
|
|
578
633
|
return value >= min && value <= max;
|
|
579
634
|
};
|
|
580
635
|
var ɵ1 = isInRange;
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
* The function works by finding the gap between the last item and the penultimate item and
|
|
589
|
-
* then distributing this gap among the previous items. The distribution is done by finding
|
|
590
|
-
* the items that need to be fixed and then fixing them by shifting their left and right
|
|
591
|
-
* positions.
|
|
592
|
-
*
|
|
593
|
-
* The function returns nothing, but it modifies the mappedValues array in place.
|
|
594
|
-
*/
|
|
595
|
-
var adjustLastItem = function (mappedValues) {
|
|
596
|
-
var lastItem = mappedValues[mappedValues.length - 1];
|
|
597
|
-
var lastDifference = lastItem.right - lastItem.left;
|
|
598
|
-
var withoutLastItem = mappedValues.slice(0, mappedValues.length - 1);
|
|
599
|
-
var differences = withoutLastItem.map(function (_a) {
|
|
600
|
-
var left = _a.left, right = _a.right;
|
|
601
|
-
return right - left;
|
|
602
|
-
});
|
|
603
|
-
var averageDifference = Math.floor(differences.reduce(function (sum, diff) { return sum + diff; }, 0) / differences.length);
|
|
604
|
-
var _getRandomIndexFromArray = function (array, storedChanges) {
|
|
605
|
-
if (storedChanges.length === array.length) {
|
|
606
|
-
storedChanges = [];
|
|
607
|
-
}
|
|
608
|
-
var randomIndex = Math.floor(Math.random() * array.length);
|
|
609
|
-
var randomIndexAlreadyStored = storedChanges.includes(randomIndex);
|
|
610
|
-
while (randomIndexAlreadyStored) {
|
|
611
|
-
randomIndex = Math.floor(Math.random() * withoutLastItem.length);
|
|
612
|
-
randomIndexAlreadyStored = storedChanges.includes(randomIndex);
|
|
613
|
-
}
|
|
614
|
-
storedChanges.push(randomIndex);
|
|
615
|
-
return { randomIndex: randomIndex, storedChanges: storedChanges };
|
|
616
|
-
};
|
|
617
|
-
var needFixLastItem = lastDifference < averageDifference;
|
|
618
|
-
var arr = [];
|
|
619
|
-
if (needFixLastItem) {
|
|
620
|
-
var captureItensCount = averageDifference - lastDifference;
|
|
621
|
-
var randomIndexStored = [];
|
|
622
|
-
for (var i = 0; i <= captureItensCount; i++) {
|
|
623
|
-
var _a = _getRandomIndexFromArray(withoutLastItem, randomIndexStored), randomIndex = _a.randomIndex, storedChanges = _a.storedChanges;
|
|
624
|
-
randomIndexStored = storedChanges;
|
|
625
|
-
arr.push(randomIndex);
|
|
626
|
-
var randomItem = withoutLastItem[randomIndex];
|
|
627
|
-
--lastItem.left;
|
|
628
|
-
--randomItem.right;
|
|
629
|
-
}
|
|
630
|
-
mappedValues.forEach(function (mappedValue, index) {
|
|
631
|
-
var _next = mappedValues[index + 1];
|
|
632
|
-
if (!_next) {
|
|
633
|
-
return;
|
|
634
|
-
}
|
|
635
|
-
var nextLeft = _next.left;
|
|
636
|
-
var currentRight = mappedValue.right;
|
|
637
|
-
if (currentRight !== currentRight + 1) {
|
|
638
|
-
var _nextDiff = _next.right - nextLeft;
|
|
639
|
-
var _nextLeft = currentRight + 1;
|
|
640
|
-
_next.left = _nextLeft;
|
|
641
|
-
_next.right = _nextLeft + _nextDiff;
|
|
642
|
-
}
|
|
643
|
-
});
|
|
644
|
-
}
|
|
636
|
+
var getMidpoint = function (start, end) {
|
|
637
|
+
var midpoint = (start + end) / 2;
|
|
638
|
+
return parseFloat(midpoint.toFixed(2));
|
|
639
|
+
};
|
|
640
|
+
var ɵ2 = getMidpoint;
|
|
641
|
+
var getDifference = function (end, start) {
|
|
642
|
+
return Math.abs(end - start);
|
|
645
643
|
};
|
|
646
|
-
var ɵ
|
|
647
|
-
export { ɵ0, ɵ1, ɵ2 };
|
|
648
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWN6RTtJQUFBO1FBQUEsaUJBMGhCQztRQXJoQlUsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixVQUFLLEdBQThCLENBQUMsQ0FBQztRQUdyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRzVELFNBQUksR0FBRyxDQUFDLENBQUM7UUFHVCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLFFBQUcsR0FBRyxDQUFDLENBQUM7UUFHUixRQUFHLEdBQUcsR0FBRyxDQUFDO1FBU1YsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUViLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2Isc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLGFBQVEsR0FBK0MsY0FBTyxDQUFDLENBQUM7UUFDaEUsY0FBUyxHQUErQyxjQUFPLENBQUMsQ0FBQztRQUVoRSxrQkFBYSxHQUEyQixJQUFJLENBQUM7UUFDN0Msa0NBQTZCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMscUNBQWdDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsK0NBQTBDLEdBQUcsQ0FB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QUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7YUFDdkM7UUFDTCxDQUFDLENBQUMsQ0FBQztLQUNOO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJzLXNsaWRlclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vc2xpZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3NsaWRlci5jb21wb25lbnQuc2Nzc1wiXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgQFZpZXdDaGlsZChcInRyYWNrXCIpXG4gICAgcHVibGljIHRyYWNrITogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSA9IDA7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdGVwID0gMTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhpZGRlblRodW1iID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heCA9IDEwMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1pblZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heFZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIHB1YmxpYyBzdGFydFZhbHVlID0gMDtcbiAgICBwdWJsaWMgZW5kVmFsdWUgPSAwO1xuICAgIHB1YmxpYyBtb3ZpbmdQcm9ncmVzc0JhciA9IGZhbHNlO1xuICAgIHB1YmxpYyBwcm9ncmVzc0xlZnQgPSAwO1xuICAgIHB1YmxpYyBwcm9ncmVzc1dpZHRoID0gXCJcIjtcblxuICAgIHB1YmxpYyBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHVibGljIG9uVG91Y2hlZDogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIGRyYWdnaW5nVGh1bWI6IFwic3RhcnRcIiB8IFwiZW5kXCIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gLTE7XG4gICAgcHJpdmF0ZSBzdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgIHByaXZhdGUgcmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgcHJpdmF0ZSB0b3RhbFJhbmdlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgIC8qKlxuICAgICAqIE1hcCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHZhbHVlcyBpbiByYW5nZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHdpdGggbWluID0gLTEwIGFuZCBtYXggPSAxMCB3aWxsIGhhdmUgdGhpcyBtYXAuXG4gICAgICoge1xuICAgICAqICAgICAtMTA6IHsgbGVmdDogMCwgcmlnaHQ6IDEwIH0sXG4gICAgICogICAgIC05OiB7IGxlZnQ6IDExLCByaWdodDogMTkgfSxcbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAxMDogeyBsZWZ0OiA5MCwgcmlnaHQ6IDEwMCB9XG4gICAgICogfVxuICAgICAqIHRoZSBsZWZ0IHZhbHVlIHJlcHJlc2VudCB2YWx1ZSBmb3Igc3RhcnRWYWx1ZSwgdGhlIHJpZ2h0IHZhbHVlIHJlcHJlc2VudCB2YWx1ZSBmb3IgZW5kVmFsdWVcbiAgICAgKiBsZWZ0IGFuZCByaWdodCB2YWx1ZXMg4oCL4oCLYXJlIHVzZWQgd2hlbiBhcHBseWluZyBwZXJjZW50YWdlcyBpbiB0aGUgc2xpZGVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXBSYW5nZVZhbHVlc0ZvclNsaWRlcjogTWFwPG51bWJlciwgeyBsZWZ0OiBudW1iZXI7IHJpZ2h0OiBudW1iZXIgfT4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBhY3RpdmVNb3VzZURvd24gPSBmYWxzZTtcbiAgICBwcml2YXRlIGZvY3VzQWN0aXZlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyUmFuZ2VNYXBWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZVZhbHVlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZG9jdW1lbnQ6a2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gICAgcHVibGljIG9uS2V5ZG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNBY3RpdmUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlMZWZ0ID0gJGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIjtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlSaWdodCA9ICRldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiO1xuICAgICAgICAgICAgaWYgKGlzQXJyb3dLZXlMZWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleUxlZnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJvd0tleVJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleVJpZ2h0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvb2x0aXBTdGFydFRleHQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHRoaXMuc3RhcnRWYWx1ZSkgOiB0aGlzLnN0YXJ0VmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwRW5kVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodGhpcy5lbmRWYWx1ZSkgOiB0aGlzLmVuZFZhbHVlKS50b1N0cmluZygpO1xuICAgIH0gICAgXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzSW4oKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFja0NsaWNrKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgfHwgdGhpcy5hY3RpdmVNb3VzZURvd24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZSA9IHRoaXMuZ2V0UGVyY2VudGFnZUJ5RXZlbnQoZXZ0KTtcbiAgICAgICAgY29uc3QgdHJhY2tDbGlja1RvVXNlclJhbmdlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcCh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgIGNvbnN0IF90cmFja0NsaWNrVmFsaWQgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICBjb25zdCBfc2V0RW5kVmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWVVc2VyVmFsdWUgPSB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgX2VuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpLnJpZ2h0IDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgJiYgX2VuZFZhbHVlVXNlclZhbHVlICE9PSB0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gX2VuZFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgX3NldFN0YXJ0VmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfc3RhcnRWYWx1ZVVzZXJWYWx1ZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodGhpcy5zdGFydFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfc3RhcnRWYWx1ZVVzZXJWYWx1ZSAhPT0gdHJhY2tDbGlja1RvVXNlclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3N0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IF9zdGFydFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkU3RhcnQgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHN0YXJ0KS5sZWZ0IDogc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEVuZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoZW5kKS5yaWdodCA6IGVuZDtcbiAgICAgICAgICAgIGNvbnN0IF91cGRhdGVTdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0U3RhcnRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RyYWNrQ2xpY2tQZXJjZW50YWdlLCB2YWxpZEVuZF0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt2YWxpZFN0YXJ0LCB0cmFja0NsaWNrUGVyY2VudGFnZV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrUGVyY2VudGFnZUJldHdlZW5SYW5nZSA9IGlzSW5SYW5nZShfdHJhY2tDbGlja1ZhbGlkLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChfdHJhY2tDbGlja1ZhbGlkIDwgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RyYWNrQ2xpY2tWYWxpZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlID0gKHN0YXJ0ICsgZW5kKSAvIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUgPSBfdHJhY2tDbGlja1ZhbGlkID09PSBtaWRkbGU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrQ2xpY2tQZXJjZW50YWdlSXNFeGFjdGlkZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFN0YXJ0ID0gX3RyYWNrQ2xpY2tWYWxpZCA8IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0RW5kID0gX3RyYWNrQ2xpY2tWYWxpZCA+IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRFbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJhY2tDbGlja1BlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgX3NldEVuZFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUHJvZ3Jlc3NNb3VzZURvd24oZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldnQpO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IHRoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Nb3VzZURvd24oXzogTW91c2VFdmVudCwgdGh1bWI6IFwic3RhcnRcIiB8IFwiZW5kXCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmRyYWdnaW5nVGh1bWIgPSB0aHVtYjtcbiAgICAgICAgdGhpcy5hY3RpdmVNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMub25UaHVtYk1vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSYW5nZVZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgdXNlIFwibXVsdGlwbGVcIiB3aXRoIHZhbHVlIGFzIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzUmFuZ2VWYWx1ZXMgPSAhISh0aGlzLnN0YXJ0VmFsdWUgJiYgdGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIWhhc1JhbmdlVmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlWzBdO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWVbMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgaXNFcXVhbEFuZE11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnN0YXJ0VmFsdWUgPT09IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0aGlzLnN0YXJ0VmFsdWUpLmxlZnQ7XG4gICAgICAgICAgICBpZiAoaXNFcXVhbEFuZE11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRoaXMuZW5kVmFsdWUpLnJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGh1bWJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1vdmluZ1Byb2dyZXNzQmFyIHx8ICF0aGlzLmRyYWdnaW5nVGh1bWIpIHJldHVybjtcblxuICAgICAgICBsZXQgbmV3UG9zaXRpb24gPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwic3RhcnRcIiAmJiBuZXdQb3NpdGlvbiA+IHRoaXMuZW5kVmFsdWUpIHx8XG4gICAgICAgICAgICAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIgJiYgbmV3UG9zaXRpb24gPCB0aGlzLnN0YXJ0VmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25JblVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAobmV3UG9zaXRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpLmxlZnRcbiAgICAgICAgICAgICAgICAgICAgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkucmlnaHRcbiAgICAgICAgICAgICAgICAgICAgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShbdGhpcy5zdGFydFZhbHVlLCB0aGlzLmVuZFZhbHVlXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcblxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLmVuZFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA9PT0gZW5kICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwaWNrTGVmdFZhbHVlID0gbmV3UG9zaXRpb24gPD0gNTA7XG4gICAgICAgICAgICBjb25zdCBwaWNrUmlnaHRWYWx1ZSA9IG5ld1Bvc2l0aW9uID4gNTA7XG5cbiAgICAgICAgICAgIGlmIChwaWNrTGVmdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwaWNrUmlnaHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpLnJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IG51bGw7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICB9LCAxNTApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldmVudCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCA9IHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQ7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudCA9IHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGxldCB7IG5ld1N0YXJ0LCBuZXdFbmQgfSA9IGNhbGN1bGF0ZU5ld1JhbmdlKFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50LFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ICsgcmFuZ2UsXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBuZXdDZW50ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld1N0YXJ0IDwgMCB8fCBuZXdFbmQgPiAxMDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAoc3RhcnRWYWx1ZUJlZm9yZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudFVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAoc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAobmV3Q2VudGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50O1xuICAgICAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSArIHZhbHVlUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIGNlbnRlclVzZXJSYW5nZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGFydCA8IHRoaXMubWluIHx8IG5ld0VuZCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3U3RhcnQpLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3RW5kKS5yaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IG5ld1N0YXJ0O1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IG5ld0VuZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0UHJvZ3Jlc3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzTGVmdCA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NXaWR0aCA9IGBjYWxjKCR7dGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZX0lICsgMTBweClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0xlZnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1dpZHRoID0gYGNhbGMoJHt0aGlzLmVuZFZhbHVlfSUgKyAxMHB4KWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgYSBtb3VzZSBldmVudCBmcm9tIHRoZSB0cmFjaydzIGxlZnQgZWRnZVxuICAgICAqIEBwYXJhbSBtb3VzZUV2ZW50IG1vdXNlIGV2ZW50XG4gICAgICogQHJldHVybnMgcGVyY2VudGFnZSBmcm9tIHRoZSBsZWZ0IGVkZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBlcmNlbnRhZ2VCeUV2ZW50KG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0cmFja1JlY3QgPSB0aGlzLnRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBuZXdMZWZ0ID0gKChtb3VzZUV2ZW50LmNsaWVudFggLSB0cmFja1JlY3QubGVmdCkgLyB0cmFja1JlY3Qud2lkdGgpICogMTAwO1xuICAgICAgICBuZXdMZWZ0ID0gTWF0aC5yb3VuZChuZXdMZWZ0IC8gdGhpcy5zdGVwKSAqIHRoaXMuc3RlcDtcbiAgICAgICAgbmV3TGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld0xlZnQsIDEwMCkpO1xuICAgICAgICByZXR1cm4gbmV3TGVmdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKCh4KSA9PiB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHgpKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFVzZXJSYW5nZU1hcFZhbHVlcygpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgIGxldCBmb3JTdGFydCA9IDA7XG4gICAgICAgIGxldCBmb3JFbmQgPSAxMDA7XG4gICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuY2xlYXIoKTtcbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWVzOiB7IHZhbHVlOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXNXaXRoTWFwID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gZm9yU3RhcnQ7IGogPD0gZm9yRW5kOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzbGlkZXJUb1VzZXJSYW5nZVZhbHVlID0gdGhpcy5tYXBTbGlkZXJUb1VzZXJSYW5nZShqKTtcbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVyVG9Vc2VyUmFuZ2VWYWx1ZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBmb3JTdGFydCA9IGo7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1dpdGhNYXAucHVzaChqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gdmFsdWVzV2l0aE1hcFswXTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdmFsdWVzV2l0aE1hcFt2YWx1ZXNXaXRoTWFwLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgbWFwcGVkVmFsdWVzLnB1c2goeyB2YWx1ZTogaSwgbGVmdCwgcmlnaHQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYWRqdXN0TGFzdEl0ZW0obWFwcGVkVmFsdWVzKTtcbiAgICAgICAgbWFwcGVkVmFsdWVzLmZvckVhY2goKG1hcHBlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLnNldChtYXBwZWRWYWx1ZS52YWx1ZSwgeyAuLi5tYXBwZWRWYWx1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIHNsaWRlciB2YWx1ZSB0byBhIHVzZXIgdmFsdWUgaW4gdGhlIHJhbmdlIFttaW4sIG1heF0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJZiBtaW4gPSAwIGFuZCBtYXggPSAxMCwgbWFwU2xpZGVyVG9Vc2VyUmFuZ2UoMjUpIHJldHVybnMgMi41XG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXBTbGlkZXJUb1VzZXJSYW5nZShzbGlkZXJWYWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMubWluICsgKHNsaWRlclZhbHVlIC8gMTAwKSAqICh0aGlzLm1heCAtIHRoaXMubWluKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWUgYnkgdXNpbmcgdGhlIG1hcCBvZiByYW5nZSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJZiB0aGUgbWFwIGlzIFt7dmFsdWU6IDAsIGxlZnQ6IDAsIHJpZ2h0OiAyNX0sIHt2YWx1ZTogMSwgbGVmdDogMjUsIHJpZ2h0OiA1MH0sIHt2YWx1ZTogMiwgbGVmdDogNTAsIHJpZ2h0OiA3NX0sIHt2YWx1ZTogMywgbGVmdDogNzUsIHJpZ2h0OiAxMDB9XVxuICAgICAqIGFuZCB0aGUgc2xpZGVyVmFsdWUgaXMgMzcsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDFcbiAgICAgKiBAcGFyYW0gc2xpZGVyVmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzbGlkZXJcbiAgICAgKiBAcmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHNsaWRlclZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbWFwVG9BcnJheSA9IEFycmF5LmZyb20odGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlcikubWFwKCh4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogeFswXSwgLi4ueFsxXSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBUb0FycmF5LmZpbmQoKHgpID0+IGlzSW5SYW5nZShzbGlkZXJWYWx1ZSwgeC5sZWZ0LCB4LnJpZ2h0KSk7XG4gICAgICAgIHJldHVybiBtYXBwZWRWYWx1ZT8udmFsdWUgPz8gc2xpZGVyVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleUxlZnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudFN0YXJ0QW5kRW5kVmFsdWUoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlSaWdodCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50RW5kVmFsdWUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZShpbmNyZW1lbnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0IC09IHRoaXMuc3RlcDtcbiAgICAgICAgICAgIGVuZCAtPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5oYXMoc3RhcnQpIHx8ICF0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmhhcyhlbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNFcXVhbCA9IHN0YXJ0ID09PSBlbmQ7XG4gICAgICAgICAgICBpZiAoaXNFcXVhbCAmJiBlbmQgPT09IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0aGlzLm1heCkucmlnaHQ7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoc3RhcnQpLmxlZnQ7XG4gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoZW5kKS5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiAxMDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IGVuZDtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShbc3RhcnQsIGVuZF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luY3JlbWVudE9yRGVjcmVtZW50RW5kVmFsdWUoaW5jcmVtZW50OiBib29sZWFuKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XG4gICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnN0ZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSAtPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IF9uZXdFbmRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUGFyc2VkSW5TbGlkZXIgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlUGFyc2VkSW5TbGlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwaWNrTGVmdCA9IHZhbHVlUGFyc2VkSW5TbGlkZXIucmlnaHQgPD0gNTA7XG4gICAgICAgICAgICBpZiAocGlja0xlZnQpIHtcbiAgICAgICAgICAgICAgICBfbmV3RW5kVmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh2YWx1ZSkubGVmdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX25ld0VuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQodmFsdWUpLnJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChfbmV3RW5kVmFsdWUgPCAwIHx8IF9uZXdFbmRWYWx1ZSA+IDEwMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5kVmFsdWUgPSBfbmV3RW5kVmFsdWU7XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbmVlZFBhcnNlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXggIT09IDEwMCB8fCB0aGlzLm1pbiAhPT0gMDtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIG5ldyByYW5nZSBiYXNlZCBvbiB0aGUgb2xkIHJhbmdlIGFuZCB0aGUgcG9zaXRpb25zIGNsaWNrZWQgYW5kIGZpbmFsaXplZC5cbiAqXG4gKiBAcGFyYW0gb2xkU3RhcnQgLSBUaGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIG9sZCByYW5nZS5cbiAqIEBwYXJhbSBvbGRFbmQgLSBUaGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBvbGQgcmFuZ2UuXG4gKiBAcGFyYW0gY2xpY2tlZFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZC5cbiAqIEBwYXJhbSBmaW5hbFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSByYW5nZSBzaG91bGQgZW5kLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiB0aGUgcmFuZ2UuXG4gKi9cbmNvbnN0IGNhbGN1bGF0ZU5ld1JhbmdlID0gKG9sZFN0YXJ0OiBudW1iZXIsIG9sZEVuZDogbnVtYmVyLCBjbGlja2VkUG9zaXRpb246IG51bWJlciwgZmluYWxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPSBvbGRFbmQgLSBvbGRTdGFydDtcbiAgICBjb25zdCBuZXdTdGFydCA9IGZpbmFsUG9zaXRpb24gLSAoY2xpY2tlZFBvc2l0aW9uIC0gb2xkU3RhcnQpO1xuICAgIGNvbnN0IG5ld0VuZCA9IG5ld1N0YXJ0ICsgcmFuZ2U7XG4gICAgcmV0dXJuIHsgbmV3U3RhcnQsIG5ld0VuZCB9O1xufTtcblxuY29uc3QgaXNJblJhbmdlID0gKHZhbHVlOiBudW1iZXIsIHJhbmdlU3RhcnQ6IG51bWJlciwgcmFuZ2VFbmQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSByYW5nZVN0YXJ0IDwgcmFuZ2VFbmQgPyBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdIDogW3JhbmdlRW5kLCByYW5nZVN0YXJ0XTtcbiAgICByZXR1cm4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBsYXN0IGl0ZW0gb2YgYSBtYXBwZWQgcmFuZ2UgdG8gZmlsbCB0aGUgZ2FwIGJldHdlZW4gaXQgYW5kIHRoZSBwZW51bHRpbWF0ZSBpdGVtLlxuICogVGhlIGdhcCBpcyBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3QgaXRlbSdzIHJpZ2h0IGFuZCBsZWZ0XG4gKiBmcm9tIHRoZSBhdmVyYWdlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbGwgdGhlIHByZXZpb3VzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSBtYXBwZWRWYWx1ZXMgLSBUaGUgbWFwcGVkIHJhbmdlIHRvIGJlIGFkanVzdGVkLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB3b3JrcyBieSBmaW5kaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgbGFzdCBpdGVtIGFuZCB0aGUgcGVudWx0aW1hdGUgaXRlbSBhbmRcbiAqIHRoZW4gZGlzdHJpYnV0aW5nIHRoaXMgZ2FwIGFtb25nIHRoZSBwcmV2aW91cyBpdGVtcy4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBkb25lIGJ5IGZpbmRpbmdcbiAqIHRoZSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgZml4ZWQgYW5kIHRoZW4gZml4aW5nIHRoZW0gYnkgc2hpZnRpbmcgdGhlaXIgbGVmdCBhbmQgcmlnaHRcbiAqIHBvc2l0aW9ucy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nLCBidXQgaXQgbW9kaWZpZXMgdGhlIG1hcHBlZFZhbHVlcyBhcnJheSBpbiBwbGFjZS5cbiAqL1xuY29uc3QgYWRqdXN0TGFzdEl0ZW0gPSAobWFwcGVkVmFsdWVzOiB7IHZhbHVlOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9W10pID0+IHtcbiAgICBjb25zdCBsYXN0SXRlbSA9IG1hcHBlZFZhbHVlc1ttYXBwZWRWYWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbGFzdERpZmZlcmVuY2UgPSBsYXN0SXRlbS5yaWdodCAtIGxhc3RJdGVtLmxlZnQ7XG4gICAgY29uc3Qgd2l0aG91dExhc3RJdGVtID0gbWFwcGVkVmFsdWVzLnNsaWNlKDAsIG1hcHBlZFZhbHVlcy5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHdpdGhvdXRMYXN0SXRlbS5tYXAoKHsgbGVmdCwgcmlnaHQgfSkgPT4gcmlnaHQgLSBsZWZ0KTtcbiAgICBjb25zdCBhdmVyYWdlRGlmZmVyZW5jZSA9IE1hdGguZmxvb3IoZGlmZmVyZW5jZXMucmVkdWNlKChzdW0sIGRpZmYpID0+IHN1bSArIGRpZmYsIDApIC8gZGlmZmVyZW5jZXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IF9nZXRSYW5kb21JbmRleEZyb21BcnJheSA9IDxUPihhcnJheTogVFtdLCBzdG9yZWRDaGFuZ2VzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkQ2hhbmdlcy5sZW5ndGggPT09IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3RvcmVkQ2hhbmdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFycmF5Lmxlbmd0aCk7XG4gICAgICAgIGxldCByYW5kb21JbmRleEFscmVhZHlTdG9yZWQgPSBzdG9yZWRDaGFuZ2VzLmluY2x1ZGVzKHJhbmRvbUluZGV4KTtcbiAgICAgICAgd2hpbGUgKHJhbmRvbUluZGV4QWxyZWFkeVN0b3JlZCkge1xuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB3aXRob3V0TGFzdEl0ZW0ubGVuZ3RoKTtcbiAgICAgICAgICAgIHJhbmRvbUluZGV4QWxyZWFkeVN0b3JlZCA9IHN0b3JlZENoYW5nZXMuaW5jbHVkZXMocmFuZG9tSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlZENoYW5nZXMucHVzaChyYW5kb21JbmRleCk7XG4gICAgICAgIHJldHVybiB7IHJhbmRvbUluZGV4LCBzdG9yZWRDaGFuZ2VzIH07XG4gICAgfTtcblxuICAgIGNvbnN0IG5lZWRGaXhMYXN0SXRlbSA9IGxhc3REaWZmZXJlbmNlIDwgYXZlcmFnZURpZmZlcmVuY2U7XG4gICAgbGV0IGFyciA9IFtdO1xuICAgIGlmIChuZWVkRml4TGFzdEl0ZW0pIHtcbiAgICAgICAgY29uc3QgY2FwdHVyZUl0ZW5zQ291bnQgPSBhdmVyYWdlRGlmZmVyZW5jZSAtIGxhc3REaWZmZXJlbmNlO1xuICAgICAgICBsZXQgcmFuZG9tSW5kZXhTdG9yZWQ6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNhcHR1cmVJdGVuc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmFuZG9tSW5kZXgsIHN0b3JlZENoYW5nZXMgfSA9IF9nZXRSYW5kb21JbmRleEZyb21BcnJheSh3aXRob3V0TGFzdEl0ZW0sIHJhbmRvbUluZGV4U3RvcmVkKTtcbiAgICAgICAgICAgIHJhbmRvbUluZGV4U3RvcmVkID0gc3RvcmVkQ2hhbmdlcztcbiAgICAgICAgICAgIGFyci5wdXNoKHJhbmRvbUluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUl0ZW0gPSB3aXRob3V0TGFzdEl0ZW1bcmFuZG9tSW5kZXhdO1xuICAgICAgICAgICAgLS1sYXN0SXRlbS5sZWZ0O1xuICAgICAgICAgICAgLS1yYW5kb21JdGVtLnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIG1hcHBlZFZhbHVlcy5mb3JFYWNoKChtYXBwZWRWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9uZXh0ID0gbWFwcGVkVmFsdWVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIV9uZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dExlZnQgPSBfbmV4dC5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJpZ2h0ID0gbWFwcGVkVmFsdWUucmlnaHQ7XG4gICAgICAgICAgICBpZiAoY3VycmVudFJpZ2h0ICE9PSBjdXJyZW50UmlnaHQgKyAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX25leHREaWZmID0gX25leHQucmlnaHQgLSBuZXh0TGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBfbmV4dExlZnQgPSBjdXJyZW50UmlnaHQgKyAxO1xuICAgICAgICAgICAgICAgIF9uZXh0LmxlZnQgPSBfbmV4dExlZnQ7XG4gICAgICAgICAgICAgICAgX25leHQucmlnaHQgPSBfbmV4dExlZnQgKyBfbmV4dERpZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4iXX0=
|
|
644
|
+
var ɵ3 = getDifference;
|
|
645
|
+
export { ɵ0, ɵ1, ɵ2, ɵ3 };
|
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWN6RTtJQUFBO1FBQUEsaUJBb2tCQztRQW5rQm9CLG9CQUFlLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBSzlCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHakIsVUFBSyxHQUE4QixDQUFDLENBQUM7UUFHckMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUc1RCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBR1QsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHcEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixRQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUczQixRQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQVMzQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFbkIsYUFBUSxHQUErQyxjQUFRLENBQUMsQ0FBQztRQUNqRSxjQUFTLEdBQStDLGNBQVEsQ0FBQyxDQUFDO1FBRWpFLGtCQUFhLEdBQTJCLElBQUksQ0FBQztRQUM3QyxrQ0FB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QUFvRixFQUFuRixXQUFHLEVBQUUsV0FBOEUsQ0FBQztJQUMzRixPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUN4QyxDQUFDLENBQUM7O0FBRUYsSUFBTSxXQUFXLEdBQUcsVUFBQyxLQUFhLEVBQUUsR0FBVztJQUMzQyxJQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQTs7QUFDRCxJQUFNLGFBQWEsR0FBRyxVQUFDLEdBQVcsRUFBRSxLQUFhO0lBQzdDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInMtc2xpZGVyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9zbGlkZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vc2xpZGVyLmNvbXBvbmVudC5zY3NzXCJdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNsaWRlckNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTUFYX1JBTkdFX1ZBTFVFID0gMTAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTUlOX1JBTkdFX1ZBTFVFID0gMDtcbiAgICBAVmlld0NoaWxkKFwidHJhY2tcIilcbiAgICBwdWJsaWMgdHJhY2shOiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdID0gMDtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgW251bWJlciwgbnVtYmVyXT4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHN0ZXAgPSAxO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGlkZGVuVGh1bWIgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW4gPSB0aGlzLk1JTl9SQU5HRV9WQUxVRTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heCA9IHRoaXMuTUFYX1JBTkdFX1ZBTFVFO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluVmFsdWVMYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4VmFsdWVMYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgcHVibGljIHN0YXJ0VmFsdWUgPSAwO1xuICAgIHB1YmxpYyBlbmRWYWx1ZSA9IDA7XG4gICAgcHVibGljIG1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgcHVibGljIHByb2dyZXNzTGVmdCA9IDA7XG4gICAgcHVibGljIHByb2dyZXNzV2lkdGggPSBcIlwiO1xuXG4gICAgcHVibGljIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gICAgcHVibGljIG9uVG91Y2hlZDogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuXG4gICAgcHJpdmF0ZSBkcmFnZ2luZ1RodW1iOiBcInN0YXJ0XCIgfCBcImVuZFwiIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydCA9IC0xO1xuICAgIHByaXZhdGUgc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICBwcml2YXRlIHJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgIHByaXZhdGUgdG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAvKipcbiAgICAgKiBNYXAgb2YgdmFsaWQgdmFsdWVzIGZvciB2YWx1ZXMgaW4gcmFuZ2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB3aXRoIG1pbiA9IC0xMCBhbmQgbWF4ID0gMTAgd2lsbCBoYXZlIHRoaXMgbWFwLlxuICAgICAqIHtcbiAgICAgKiAgICAgLTEwOiB7IDAgfSxcbiAgICAgKiAgICAgLTk6IHsgMTAgfSxcbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAxMDogeyAxMCB9XG4gICAgICogfVxuICAgICAqL1xuICAgIHByaXZhdGUgbWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXI6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBhY3RpdmVNb3VzZURvd24gPSBmYWxzZTtcbiAgICBwcml2YXRlIGZvY3VzQWN0aXZlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0VXNlclJhbmdlTWFwVmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFzQ2hhbmdlc09uTWluID0gY2hhbmdlcy5taW4gJiYgIWNoYW5nZXMubWluLmZpcnN0Q2hhbmdlO1xuICAgICAgICBjb25zdCBoYXNDaGFuZ2VzT25NYXggPSBjaGFuZ2VzLm1heCAmJiAhY2hhbmdlcy5tYXguZmlyc3RDaGFuZ2U7XG4gICAgICAgIGNvbnN0IGhhc0NoYW5nZXMgPSBoYXNDaGFuZ2VzT25NaW4gfHwgaGFzQ2hhbmdlc09uTWF4O1xuICAgICAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyUmFuZ2VNYXBWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VWYWx1ZXMoKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZG9jdW1lbnQ6a2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gICAgcHVibGljIG9uS2V5ZG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNBY3RpdmUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlMZWZ0ID0gJGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIjtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlSaWdodCA9ICRldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiO1xuICAgICAgICAgICAgaWYgKGlzQXJyb3dLZXlMZWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleUxlZnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJvd0tleVJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleVJpZ2h0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvb2x0aXBTdGFydFRleHQoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVswXT8udG9TdHJpbmcoKSA6IHRoaXMudmFsdWU/LnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwRW5kVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlWzFdPy50b1N0cmluZygpIDogdGhpcy52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzSW4oKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFja0NsaWNrKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgfHwgdGhpcy5hY3RpdmVNb3VzZURvd24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZSA9IHRoaXMuZ2V0UGVyY2VudGFnZUJ5RXZlbnQoZXZ0KTtcbiAgICAgICAgY29uc3QgdHJhY2tDbGlja1RvVXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHRyYWNrQ2xpY2tQZXJjZW50YWdlKTtcbiAgICAgICAgY29uc3QgX3RyYWNrQ2xpY2tWYWxpZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdHJhY2tDbGlja1RvVXNlclJhbmdlIDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgIGNvbnN0IF9zZXRFbmRWYWx1ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9lbmRWYWx1ZVVzZXJWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZSh0aGlzLmVuZFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IF9lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQodHJhY2tDbGlja1RvVXNlclJhbmdlKSA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzICYmIF9lbmRWYWx1ZVVzZXJWYWx1ZSAhPT0gdHJhY2tDbGlja1RvVXNlclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IF9lbmRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IF9zZXRTdGFydFZhbHVlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgX3N0YXJ0VmFsdWVVc2VyVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUodGhpcy5zdGFydFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfc3RhcnRWYWx1ZVVzZXJWYWx1ZSAhPT0gdHJhY2tDbGlja1RvVXNlclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3N0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSlcbiAgICAgICAgICAgICAgICAgICAgOiB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBfc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICBjb25zdCB2YWxpZFN0YXJ0ID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChzdGFydCkgOiBzdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkRW5kID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChlbmQpIDogZW5kO1xuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZVN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9zZXRTdGFydFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShbdHJhY2tDbGlja1BlcmNlbnRhZ2UsIHZhbGlkRW5kXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBfdXBkYXRlRW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9zZXRFbmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3ZhbGlkU3RhcnQsIHRyYWNrQ2xpY2tQZXJjZW50YWdlXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlID0gaXNJblJhbmdlKF90cmFja0NsaWNrVmFsaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKF90cmFja0NsaWNrVmFsaWQgPCBzdGFydCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfdHJhY2tDbGlja1ZhbGlkID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGlja1BlcmNlbnRhZ2VCZXR3ZWVuUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaWRkbGUgPSAoc3RhcnQgKyBlbmQpIC8gMjtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZUlzRXhhY3RpZGRsZSA9IF90cmFja0NsaWNrVmFsaWQgPT09IG1pZGRsZTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0U3RhcnQgPSBfdHJhY2tDbGlja1ZhbGlkIDwgbWlkZGxlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXRFbmQgPSBfdHJhY2tDbGlja1ZhbGlkID4gbWlkZGxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldEVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZUVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Qcm9ncmVzc01vdXNlRG93bihldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2dCk7XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5oYW5kbGVQcm9ncmVzc0Jhck1vdmVFbmQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1vdXNlRG93bihfOiBNb3VzZUV2ZW50LCB0aHVtYjogXCJzdGFydFwiIHwgXCJlbmRcIik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IHRodW1iO1xuICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFJhbmdlVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBfc2V0U3RhcnRBbmRFbmRWYWx1ZSA9IChzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZ2V0Q2xvc2VzdFZhbHVlRnJvbU1hcFNsaWRlcihzdGFydFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHVzZSBcIm11bHRpcGxlXCIgd2l0aCB2YWx1ZSBhcyBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMudmFsdWVbMF07XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy52YWx1ZVsxXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBfc2V0U3RhcnRBbmRFbmRWYWx1ZSh0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgW19zdGFydFZhbHVlLCBfZW5kVmFsdWVdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBnZXREaWZmZXJlbmNlKF9lbmRWYWx1ZSwgX3N0YXJ0VmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFZhbHVlSXNHcmVhdGhlclRoYW5NYXggPSBfZW5kVmFsdWUgPiB0aGlzLm1heDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFZhbHVlSXNMZXNzVGhhbk1pbiA9IF9zdGFydFZhbHVlIDwgdGhpcy5taW47XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZFVwZGF0ZVZhbHVlcyA9IGVuZFZhbHVlSXNHcmVhdGhlclRoYW5NYXggfHwgc3RhcnRWYWx1ZUlzTGVzc1RoYW5NaW47XG4gICAgICAgICAgICAgICAgaWYgKGVuZFZhbHVlSXNHcmVhdGhlclRoYW5NYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgX2VuZFZhbHVlID0gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgICAgIF9zdGFydFZhbHVlID0gX2VuZFZhbHVlIC0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0VmFsdWVJc0xlc3NUaGFuTWluKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zdGFydFZhbHVlID0gdGhpcy5taW47XG4gICAgICAgICAgICAgICAgICAgIF9lbmRWYWx1ZSA9IF9zdGFydFZhbHVlICsgZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRVcGRhdGVWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NldFN0YXJ0QW5kRW5kVmFsdWUoX3N0YXJ0VmFsdWUsIF9lbmRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IF92YWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlR3JlYXRoZXJUaGFuTWF4ID0gX3ZhbHVlID4gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVMZXNzVGhhbk1pbiA9IF92YWx1ZSA8IHRoaXMubWluO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRVcGRhdGVWYWx1ZSA9IHZhbHVlR3JlYXRoZXJUaGFuTWF4IHx8IHZhbHVlTGVzc1RoYW5NaW47XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlR3JlYXRoZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZSA9IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVMZXNzVGhhbk1pbikge1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRVcGRhdGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKF92YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGh1bWJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1vdmluZ1Byb2dyZXNzQmFyIHx8ICF0aGlzLmRyYWdnaW5nVGh1bWIpIHJldHVybjtcblxuICAgICAgICBsZXQgbmV3UG9zaXRpb24gPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIgJiYgbmV3UG9zaXRpb24gPiB0aGlzLmVuZFZhbHVlKSB8fFxuICAgICAgICAgICAgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiICYmIG5ld1Bvc2l0aW9uIDwgdGhpcy5zdGFydFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uSW5Vc2VyUmFuZ2UgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUobmV3UG9zaXRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV0pO1xuXG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPT09IGVuZCAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSBhcyBudW1iZXI7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHBvc2l0aW9uSW5Vc2VyUmFuZ2UgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRTYW1lVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHBvc2l0aW9uSW5Vc2VyUmFuZ2UgPT09IHRoaXMudmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0ZXAgPSB0aGlzLnN0ZXAgIT09IDA7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZUlzVmFsaWRCeVN0ZXAgPSBoYXNTdGVwID8gY3VycmVudFZhbHVlICsgdGhpcy5zdGVwID09PSBfdmFsdWUgfHwgY3VycmVudFZhbHVlIC0gdGhpcy5zdGVwID09PSBfdmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpc0F0U2FtZVZhbHVlICYmICFuZXdWYWx1ZUlzVmFsaWRCeVN0ZXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKSA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTW91c2VVcCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZ1RodW1iID0gbnVsbDtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm9uVGh1bWJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBuZXdDZW50ZXIgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50ID0gdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydDtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ID0gdGhpcy5zdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudDtcbiAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnQgKyByYW5nZSxcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCxcbiAgICAgICAgICAgIG5ld0NlbnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAobmV3U3RhcnQgPCB0aGlzLk1JTl9SQU5HRV9WQUxVRSB8fCBuZXdFbmQgPiB0aGlzLk1BWF9SQU5HRV9WQUxVRSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHN0YXJ0VmFsdWVCZWZvcmVFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnRVc2VyUmFuZ2UgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUoc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclVzZXJSYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZShuZXdDZW50ZXIpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVSYW5nZSA9IHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgICAgICBsZXQgeyBuZXdTdGFydCwgbmV3RW5kIH0gPSBjYWxjdWxhdGVOZXdSYW5nZShcbiAgICAgICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnRVc2VyUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlICsgdmFsdWVSYW5nZSxcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnRVc2VyUmFuZ2UsXG4gICAgICAgICAgICAgICAgY2VudGVyVXNlclJhbmdlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG5ld1N0YXJ0IDwgdGhpcy5taW4gfHwgbmV3RW5kID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChuZXdTdGFydCk7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3RW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IG5ld1N0YXJ0O1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IG5ld0VuZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0UHJvZ3Jlc3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzTGVmdCA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NXaWR0aCA9IGBjYWxjKCR7dGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZX0lICsgMTBweClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0xlZnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1dpZHRoID0gYGNhbGMoJHt0aGlzLmVuZFZhbHVlfSUgKyAxMHB4KWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgYSBtb3VzZSBldmVudCBmcm9tIHRoZSB0cmFjaydzIGxlZnQgZWRnZVxuICAgICAqIEBwYXJhbSBtb3VzZUV2ZW50IG1vdXNlIGV2ZW50XG4gICAgICogQHJldHVybnMgcGVyY2VudGFnZSBmcm9tIHRoZSBsZWZ0IGVkZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBlcmNlbnRhZ2VCeUV2ZW50KG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0cmFja1JlY3QgPSB0aGlzLnRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBuZXdMZWZ0ID0gTWF0aC5yb3VuZCgoKG1vdXNlRXZlbnQuY2xpZW50WCAtIHRyYWNrUmVjdC5sZWZ0KSAvIHRyYWNrUmVjdC53aWR0aCkgKiB0aGlzLk1BWF9SQU5HRV9WQUxVRSk7XG4gICAgICAgIG5ld0xlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihuZXdMZWZ0LCB0aGlzLk1BWF9SQU5HRV9WQUxVRSkpO1xuICAgICAgICByZXR1cm4gbmV3TGVmdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdLCBwYXJzZSA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBwYXJzZSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoKHgpID0+IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZSh4KSkgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFVzZXJSYW5nZU1hcFZhbHVlcygpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXggdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluIHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5jbGVhcigpO1xuICAgICAgICBjb25zdCByYW5nZSA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICBjb25zdCBkZWNpbWFsUGxhY2VzID0gMjtcbiAgICAgICAgY29uc3Qgc3RlcENvdW50ID0gTWF0aC5mbG9vcihyYW5nZSAvIHRoaXMuc3RlcCk7XG4gICAgICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdmFsdWUgPSBzdGFydDsgdmFsdWUgPD0gZW5kOyB2YWx1ZSArPSB0aGlzLnN0ZXApIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSAhPT0gZW5kKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcHBlZFZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gKCh2YWx1ZSAtIHN0YXJ0KSAvIHJhbmdlKSAqIHRoaXMuTUFYX1JBTkdFX1ZBTFVFO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWFwcGVkLnRvRml4ZWQoZGVjaW1hbFBsYWNlcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWFwcGVkVmFsdWVzWzBdID0gMDtcbiAgICAgICAgbWFwcGVkVmFsdWVzW21hcHBlZFZhbHVlcy5sZW5ndGggLSAxXSA9IHRoaXMuTUFYX1JBTkdFX1ZBTFVFO1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuTUFYX1JBTkdFX1ZBTFVFIC0gbWFwcGVkVmFsdWVzW21hcHBlZFZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZXJyb3JQZXJTdGVwID0gZXJyb3IgLyBzdGVwQ291bnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWFwcGVkVmFsdWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgbWFwcGVkVmFsdWVzW2ldICs9IGVycm9yUGVyU3RlcDtcbiAgICAgICAgICAgIG1hcHBlZFZhbHVlc1tpXSA9IHBhcnNlRmxvYXQobWFwcGVkVmFsdWVzW2ldLnRvRml4ZWQoZGVjaW1hbFBsYWNlcykpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuc2V0KHZhbHVlLCBtYXBwZWRWYWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWUgYnkgdXNpbmcgdGhlIG1hcCBvZiByYW5nZSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJZiB0aGUgbWFwIGlzIDA6IHsgMCB9LCAxOiB7IDEwIH0sIDI6IHsgMzAgfSwgMzogeyA0MCB9LCA0OiB7IDUwIH1cbiAgICAgKiBhbmQgdGhlIHNsaWRlclZhbHVlIGlzIDM3LCB0aGUgZnVuY3Rpb24gcmV0dXJucyAzXG4gICAgICogb3IgdGhlIHNsaWRlciB2YWx1ZSBpcyA0MCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgNFxuICAgICAqIEBwYXJhbSBzbGlkZXJWYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNsaWRlciAodmFsdWVzIG9ubHkgYmV0d2VlbiByYW5nZSBNSU4gYW5kIE1BWClcbiAgICAgKiBAcmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhbHVlRnJvbU1hcEJ5VmFsdWUoc2xpZGVyVmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBtYXBUb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyKS5tYXAoKFt2YWx1ZSwgbWFwcGVkXSkgPT4gKHsgdmFsdWUsIG1hcHBlZCB9KSk7XG4gICAgICAgIGNvbnN0IGV4YWN0VmFsdWUgPSBtYXBUb0FycmF5LmZpbmQoKHgpID0+IHgubWFwcGVkID09IHNsaWRlclZhbHVlKTtcbiAgICAgICAgY29uc3QgY2xvc2VzdCA9IG1hcFRvQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLmFicyhjdXJyLm1hcHBlZCAtIHNsaWRlclZhbHVlKSA8IE1hdGguYWJzKHByZXYubWFwcGVkIC0gc2xpZGVyVmFsdWUpID8gY3VyciA6IHByZXYpO1xuICAgICAgICByZXR1cm4gZXhhY3RWYWx1ZSA/IGV4YWN0VmFsdWUudmFsdWUgOiBjbG9zZXN0LnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUga2V5IGZyb20gdGhlIG1hcCB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGdpdmVuIHNsaWRlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdXNlclZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbmQgdGhlIGNsb3Nlc3Qga2V5IGZvci4gKHZhbHVlcyBvbmx5IGJldHdlZW4gMCAtIDEwMClcbiAgICAgKiBAcmV0dXJucyBUaGUga2V5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNsb3Nlc3QgbWFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q2xvc2VzdFZhbHVlRnJvbU1hcFNsaWRlcih1c2VyVmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1hcFRvQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIpLm1hcCgoW3ZhbHVlLCBtYXBwZWRdKSA9PiAoeyB2YWx1ZSwgbWFwcGVkIH0pKTtcbiAgICAgICAgaWYgKHVzZXJWYWx1ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFRvQXJyYXlbbWFwVG9BcnJheS5sZW5ndGggLSAxXS5tYXBwZWRcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyVmFsdWUgPD0gdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5WzBdLm1hcHBlZFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4YWN0VmFsdWUgPSBtYXBUb0FycmF5LmZpbmQoKHgpID0+IHgudmFsdWUgPT0gdXNlclZhbHVlKTtcbiAgICAgICAgY29uc3QgY2xvc2VzdFZhbHVlID0gbWFwVG9BcnJheS5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IE1hdGguYWJzKGN1cnIudmFsdWUgLSB1c2VyVmFsdWUpIDwgTWF0aC5hYnMocHJldi52YWx1ZSAtIHVzZXJWYWx1ZSkgPyBjdXJyIDogcHJldik7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBleGFjdFZhbHVlIHx8IGNsb3Nlc3RWYWx1ZTtcbiAgICAgICAgY29uc3QgaXNGaXJzdEl0ZW0gPSBtYXBUb0FycmF5WzBdID09PSBpdGVtO1xuICAgICAgICBjb25zdCBpc0xhc3RJdGVtID0gbWFwVG9BcnJheVttYXBUb0FycmF5Lmxlbmd0aCAtIDFdID09PSBpdGVtO1xuICAgICAgICBpZiAoaXNGaXJzdEl0ZW0gJiYgdXNlclZhbHVlID4gdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRNaWRwb2ludChpdGVtLm1hcHBlZCwgbWFwVG9BcnJheVsxXS5tYXBwZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTGFzdEl0ZW0gJiYgdXNlclZhbHVlIDwgdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRNaWRwb2ludChpdGVtLm1hcHBlZCwgbWFwVG9BcnJheVttYXBUb0FycmF5Lmxlbmd0aCAtIDJdLm1hcHBlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5tYXBwZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlMZWZ0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50RW5kVmFsdWUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5UmlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudFN0YXJ0QW5kRW5kVmFsdWUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbmNyZW1lbnRPckRlY3JlbWVudFN0YXJ0QW5kRW5kVmFsdWUoaW5jcmVtZW50OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBnZXREaWZmZXJlbmNlKGVuZCwgc3RhcnQpO1xuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XG4gICAgICAgICAgICBzdGFydCArPSB0aGlzLnN0ZXA7XG4gICAgICAgICAgICBlbmQgKz0gdGhpcy5zdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgLT0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kIC09IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydExlc3NUaGFuTWluID0gc3RhcnQgPCB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgZW5kR3JlYXRlclRoYW5NYXggPSBlbmQgPiB0aGlzLm1heDtcbiAgICAgICAgaWYgKHN0YXJ0TGVzc1RoYW5NaW4gfHwgZW5kR3JlYXRlclRoYW5NYXgpIHtcbiAgICAgICAgICAgIGlmIChzdGFydExlc3NUaGFuTWluKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVuZEdyZWF0ZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICAgICAgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCA8IHRoaXMubWluIHx8IGVuZCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWYWx1ZShbc3RhcnQsIGVuZF0sIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBzdGFydCA9IHRoaXMuZ2V0Q2xvc2VzdFZhbHVlRnJvbU1hcFNsaWRlcihzdGFydCk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IGVuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKGluY3JlbWVudDogYm9vbGVhbikge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5zdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgLT0gdGhpcy5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfbmV3RW5kVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBfbmV3RW5kVmFsdWUgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoX25ld0VuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX25ld0VuZFZhbHVlIDwgdGhpcy5NSU5fUkFOR0VfVkFMVUUgfHwgX25ld0VuZFZhbHVlID4gdGhpcy5NQVhfUkFOR0VfVkFMVUUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuZFZhbHVlID0gX25ld0VuZFZhbHVlO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLmVuZFZhbHVlO1xuICAgICAgICB0aGlzLnNldFZhbHVlKF9uZXdFbmRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbmVlZFBhcnNlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXggIT09IHRoaXMuTUFYX1JBTkdFX1ZBTFVFIHx8IHRoaXMubWluICE9PSB0aGlzLk1JTl9SQU5HRV9WQUxVRTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIG5ldyByYW5nZSBiYXNlZCBvbiB0aGUgb2xkIHJhbmdlIGFuZCB0aGUgcG9zaXRpb25zIGNsaWNrZWQgYW5kIGZpbmFsaXplZC5cbiAqXG4gKiBAcGFyYW0gb2xkU3RhcnQgLSBUaGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIG9sZCByYW5nZS5cbiAqIEBwYXJhbSBvbGRFbmQgLSBUaGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBvbGQgcmFuZ2UuXG4gKiBAcGFyYW0gY2xpY2tlZFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZC5cbiAqIEBwYXJhbSBmaW5hbFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSByYW5nZSBzaG91bGQgZW5kLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiB0aGUgcmFuZ2UuXG4gKi9cbmNvbnN0IGNhbGN1bGF0ZU5ld1JhbmdlID0gKG9sZFN0YXJ0OiBudW1iZXIsIG9sZEVuZDogbnVtYmVyLCBjbGlja2VkUG9zaXRpb246IG51bWJlciwgZmluYWxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPSBvbGRFbmQgLSBvbGRTdGFydDtcbiAgICBjb25zdCBuZXdTdGFydCA9IGZpbmFsUG9zaXRpb24gLSAoY2xpY2tlZFBvc2l0aW9uIC0gb2xkU3RhcnQpO1xuICAgIGNvbnN0IG5ld0VuZCA9IG5ld1N0YXJ0ICsgcmFuZ2U7XG4gICAgcmV0dXJuIHsgbmV3U3RhcnQsIG5ld0VuZCB9O1xufTtcblxuY29uc3QgaXNJblJhbmdlID0gKHZhbHVlOiBudW1iZXIsIHJhbmdlU3RhcnQ6IG51bWJlciwgcmFuZ2VFbmQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSByYW5nZVN0YXJ0IDwgcmFuZ2VFbmQgPyBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdIDogW3JhbmdlRW5kLCByYW5nZVN0YXJ0XTtcbiAgICByZXR1cm4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbn07XG5cbmNvbnN0IGdldE1pZHBvaW50ID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbWlkcG9pbnQgPSAoc3RhcnQgKyBlbmQpIC8gMjtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChtaWRwb2ludC50b0ZpeGVkKDIpKTtcbn1cbmNvbnN0IGdldERpZmZlcmVuY2UgPSAoZW5kOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZW5kIC0gc3RhcnQpO1xufVxuIl19
|