ca-components 1.0.78 → 1.0.81
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/esm2022/lib/ca-components.module.mjs +16 -4
- package/esm2022/lib/components/ca-activity-log-list/ca-activity-log-list.component.mjs +1 -1
- package/esm2022/lib/components/ca-app-tooltip-v2/ca-app-tooltip-v2.component.mjs +1 -1
- package/esm2022/lib/components/ca-filters/components/ca-dispatcher-filter/ca-dispatcher-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-filters/components/ca-money-filter/ca-money-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-filters/components/ca-state-filter/ca-state-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-filters/components/ca-trailer-type-filter/ca-trailer-type-filter.component.mjs +1 -1
- package/esm2022/lib/components/ca-filters/components/ca-truck-type-filter/ca-truck-type-filter.component.mjs +1 -1
- package/esm2022/lib/components/ca-filters/components/ca-user-filter/ca-user-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-input/base-classes/ca-input-base-helpres.mjs +237 -0
- package/esm2022/lib/components/ca-input/base-classes/ca-input-base.mjs +1020 -0
- package/esm2022/lib/components/ca-input/base-classes/ca-input-event-manager.mjs +24 -0
- package/esm2022/lib/components/ca-input/ca-input.component.mjs +53 -163
- package/esm2022/lib/components/ca-input/components/ca-input-clear/ca-input-clear.component.mjs +4 -4
- package/esm2022/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.mjs +11 -17
- package/esm2022/lib/components/ca-input/config/ca-input.config.mjs +1 -1
- package/esm2022/lib/components/ca-input/directives/caps-lock.directive.mjs +50 -0
- package/esm2022/lib/components/ca-input/directives/index.mjs +5 -1
- package/esm2022/lib/components/ca-input/directives/input-max-value.directive.mjs +53 -0
- package/esm2022/lib/components/ca-input/directives/min-max-value.directive.mjs +1 -1
- package/esm2022/lib/components/ca-input/directives/price_format.directive.mjs +41 -0
- package/esm2022/lib/components/ca-input/directives/restrict-input.directive.mjs +98 -0
- package/esm2022/lib/components/ca-input/enums/input-text-transform.enum.mjs +9 -0
- package/esm2022/lib/components/ca-input/input-test/input-test.component.mjs +178 -0
- package/esm2022/lib/components/ca-input/pipes/input-container-class.pipe.mjs +16 -16
- package/esm2022/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.mjs +1 -1
- package/esm2022/lib/components/ca-input/pipes/input-error.pipe.mjs +18 -15
- package/esm2022/lib/components/ca-input/pipes/input-pattern.pipe.mjs +326 -0
- package/esm2022/lib/components/ca-input/services/index.mjs +1 -2
- package/esm2022/lib/components/ca-input/utils/constants/input-constants.mjs +102 -1
- package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +2 -2
- package/esm2022/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +809 -0
- package/esm2022/lib/components/ca-input-dropdown/ca-input-dropdown.component.mjs +18 -18
- package/esm2022/lib/components/ca-rating-review/ca-rating-review.component.mjs +2 -2
- package/esm2022/lib/components/ca-rating-review/components/ca-ratings-reviews-popup/ca-ratings-reviews-popup.component.mjs +1 -1
- package/esm2022/lib/components/ca-upload-files/components/ca-upload-file/ca-upload-file.component.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/ca-components.mjs +7754 -7230
- package/fesm2022/ca-components.mjs.map +1 -1
- package/lib/ca-components.module.d.ts +32 -30
- package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
- package/lib/components/ca-input/base-classes/ca-input-base-helpres.d.ts +29 -0
- package/lib/components/ca-input/base-classes/ca-input-base.d.ts +82 -0
- package/lib/components/ca-input/base-classes/ca-input-event-manager.d.ts +16 -0
- package/lib/components/ca-input/ca-input.component.d.ts +30 -48
- package/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.d.ts +3 -7
- package/lib/components/ca-input/config/ca-input.config.d.ts +10 -1
- package/lib/components/ca-input/directives/caps-lock.directive.d.ts +14 -0
- package/lib/components/ca-input/directives/index.d.ts +4 -0
- package/lib/components/ca-input/directives/input-max-value.directive.d.ts +12 -0
- package/lib/components/ca-input/directives/price_format.directive.d.ts +11 -0
- package/lib/components/ca-input/directives/restrict-input.directive.d.ts +15 -0
- package/lib/components/ca-input/enums/input-text-transform.enum.d.ts +6 -0
- package/lib/components/ca-input/input-test/input-test.component.d.ts +47 -0
- package/lib/components/ca-input/pipes/input-container-class.pipe.d.ts +3 -3
- package/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.d.ts +1 -1
- package/lib/components/ca-input/pipes/input-pattern.pipe.d.ts +31 -0
- package/lib/components/ca-input/services/index.d.ts +0 -1
- package/lib/components/ca-input/utils/constants/input-constants.d.ts +11 -0
- package/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +99 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/esm2022/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +0 -100
- package/esm2022/lib/components/ca-input/services/ca-input-state.service.mjs +0 -2173
- package/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +0 -48
- package/lib/components/ca-input/services/ca-input-state.service.d.ts +0 -196
|
@@ -0,0 +1,1020 @@
|
|
|
1
|
+
import { InputCommandsAction, InputCommandsType, InputConfigNameStringEnum, InputStringEnum, } from '../enums';
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import { InputConstants } from '../utils/constants';
|
|
4
|
+
import { InputSvgRoutes } from '../utils';
|
|
5
|
+
import { CaInputBaseHelpersComponent } from '../base-classes/ca-input-base-helpres';
|
|
6
|
+
export class CaInputBaseComponent extends CaInputBaseHelpersComponent {
|
|
7
|
+
constructor(cdRef, thousandSeparatorPipe) {
|
|
8
|
+
super();
|
|
9
|
+
this.cdRef = cdRef;
|
|
10
|
+
this.thousandSeparatorPipe = thousandSeparatorPipe;
|
|
11
|
+
// #endregion
|
|
12
|
+
this.inputSelection = false;
|
|
13
|
+
this.hasDecimalIndex = -1;
|
|
14
|
+
this.lastCursorSpacePosition = 0;
|
|
15
|
+
// Dropdown
|
|
16
|
+
this.showDateInput = false;
|
|
17
|
+
this.dateTimeInputDate = new Date();
|
|
18
|
+
// Number of spaces
|
|
19
|
+
this.numberOfConsecutivelySpaces = 0;
|
|
20
|
+
}
|
|
21
|
+
transformText(value, isPaste) {
|
|
22
|
+
this.cursorInputPosition = this.input.nativeElement.selectionStart;
|
|
23
|
+
// Handle paste operation
|
|
24
|
+
if (isPaste) {
|
|
25
|
+
this.handlePaste(value);
|
|
26
|
+
}
|
|
27
|
+
else if (value) {
|
|
28
|
+
this.superControl.control?.patchValue(value, { emitEvent: false });
|
|
29
|
+
}
|
|
30
|
+
this.applyTextTransformation();
|
|
31
|
+
// Apply thousand and price separators if configured
|
|
32
|
+
this.applyThousandSeparator();
|
|
33
|
+
this.applyPriceSeparator();
|
|
34
|
+
this.customValidation(value);
|
|
35
|
+
this.sanitizeConsecutiveSpaces();
|
|
36
|
+
this.removeLeadingZero();
|
|
37
|
+
}
|
|
38
|
+
handlePaste(value) {
|
|
39
|
+
let mainValue = this.superControl.control?.value;
|
|
40
|
+
if (!this.inputSelection) {
|
|
41
|
+
mainValue += value;
|
|
42
|
+
this.limitInputLength();
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
mainValue = value;
|
|
46
|
+
this.inputSelection = false;
|
|
47
|
+
}
|
|
48
|
+
// Delete spaces on begin and end
|
|
49
|
+
mainValue = mainValue.trim();
|
|
50
|
+
this.superControl.control?.patchValue(mainValue, {
|
|
51
|
+
emitEvent: false,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
limitInputLength() {
|
|
55
|
+
if (this.superControl.control?.value.length >
|
|
56
|
+
this._inputConfig.maxLength) {
|
|
57
|
+
this.superControl.control?.patchValue(this.superControl.control?.value.substring(0, this._inputConfig.maxLength), {
|
|
58
|
+
emitEvent: false,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
applyTextTransformation() {
|
|
63
|
+
let { value } = this.input.nativeElement;
|
|
64
|
+
switch (this._inputConfig.textTransform) {
|
|
65
|
+
case InputStringEnum.CAPITALIZE:
|
|
66
|
+
value =
|
|
67
|
+
value.charAt(0).toUpperCase() +
|
|
68
|
+
value.substring(1).toLowerCase();
|
|
69
|
+
break;
|
|
70
|
+
case InputStringEnum.UPPERCASE:
|
|
71
|
+
value = value.toLocaleUpperCase('en-US');
|
|
72
|
+
break;
|
|
73
|
+
case InputStringEnum.CAPITALIZED_CASE:
|
|
74
|
+
const capitalizedCaseWords = value.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
|
|
75
|
+
value = capitalizedCaseWords;
|
|
76
|
+
break;
|
|
77
|
+
default:
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
this.superControl.control?.patchValue(value, {
|
|
81
|
+
emitEvent: false,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
applyThousandSeparator() {
|
|
85
|
+
const controlValue = this.superControl.control?.value;
|
|
86
|
+
if (this._inputConfig.thousandSeparator && controlValue) {
|
|
87
|
+
if (this.isAllZeros(controlValue)) {
|
|
88
|
+
this.superControl.control?.patchValue('0', {
|
|
89
|
+
emitEvent: false,
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (this.superControl.control?.value.toString()) {
|
|
94
|
+
this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue), {
|
|
95
|
+
emitEvent: false,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
applyPriceSeparator() {
|
|
101
|
+
const controlValue = this.superControl.control?.value;
|
|
102
|
+
if (this._inputConfig.priceSeparator && controlValue) {
|
|
103
|
+
// 0. Don't allow 0 as first character
|
|
104
|
+
if (this.isAllZeros(controlValue)) {
|
|
105
|
+
this.superControl.control?.patchValue('0', {
|
|
106
|
+
emitEvent: false,
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// 4. If user set dot
|
|
111
|
+
if (controlValue.includes('.')) {
|
|
112
|
+
this.formatWithDecimal();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// 5. If user doesn't set dot
|
|
116
|
+
this.formatWithoutDecimal();
|
|
117
|
+
}
|
|
118
|
+
this.setInputCursorPosition();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
setInputCursorPosition() {
|
|
122
|
+
if (this.superControl.control?.value) {
|
|
123
|
+
this.timeoutCleaner = setTimeout(() => {
|
|
124
|
+
this.input.nativeElement.setSelectionRange(this.cursorInputPosition +
|
|
125
|
+
(this.superControl.control?.value.indexOf('.') === -1
|
|
126
|
+
? 1
|
|
127
|
+
: 0), this.cursorInputPosition +
|
|
128
|
+
(this.superControl.control?.value.indexOf('.') === -1
|
|
129
|
+
? 1
|
|
130
|
+
: 0));
|
|
131
|
+
}, 0);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// if we have ${n}00000 and we delete N then we got undefined instead of dot
|
|
135
|
+
this.superControl.control?.patchValue(0, {
|
|
136
|
+
emitEvent: false,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
formatWithDecimal() {
|
|
141
|
+
const controlValue = this.superControl.control?.value;
|
|
142
|
+
// 4.1. Check for Dot position
|
|
143
|
+
this.hasDecimalIndex = controlValue.indexOf('.');
|
|
144
|
+
this.originPriceSeparatorLimit =
|
|
145
|
+
this._inputConfig.priceSeparatorLimitation + 3;
|
|
146
|
+
// 4.2. Divide number into decimal and integer parts
|
|
147
|
+
let integerPart = this.thousandSeparatorPipe.transform(controlValue
|
|
148
|
+
.slice(0, this.hasDecimalIndex)
|
|
149
|
+
.slice(0, this._inputConfig.priceSeparatorLimitation));
|
|
150
|
+
let decimalPart = controlValue.slice(this.hasDecimalIndex + 1);
|
|
151
|
+
if (!integerPart) {
|
|
152
|
+
integerPart = '0';
|
|
153
|
+
}
|
|
154
|
+
// 4.4. Get only two numbers of the decimal part
|
|
155
|
+
decimalPart = decimalPart.slice(0, 2);
|
|
156
|
+
if (decimalPart) {
|
|
157
|
+
// 4.5. Set formatted number
|
|
158
|
+
this.superControl.control?.patchValue(`${integerPart}.${decimalPart}`, {
|
|
159
|
+
emitEvent: false,
|
|
160
|
+
});
|
|
161
|
+
this.hasDecimalIndex =
|
|
162
|
+
this.superControl.control?.value.indexOf('.');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
customValidation(value) {
|
|
166
|
+
const configName = this._inputConfig.name.toLowerCase();
|
|
167
|
+
if (configName === InputStringEnum.YEAR &&
|
|
168
|
+
parseInt(value) > parseInt(moment().add(1, 'year').format('YYYY'))) {
|
|
169
|
+
this.superControl.control?.setErrors({ invalid: true });
|
|
170
|
+
}
|
|
171
|
+
if (configName === InputStringEnum.MONTHS) {
|
|
172
|
+
if (parseInt(value) < 1 || parseInt(value) > 12) {
|
|
173
|
+
this.superControl.control?.setErrors({ invalid: true });
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.superControl.control?.setErrors(null);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (configName === InputStringEnum.AXLES) {
|
|
180
|
+
if (parseInt(value) < 1 || parseInt(value) > 17) {
|
|
181
|
+
if (parseInt(value) < 1) {
|
|
182
|
+
this.superControl.control?.setErrors({ min: 1 });
|
|
183
|
+
}
|
|
184
|
+
else if (parseInt(value) > 17) {
|
|
185
|
+
this.superControl.control?.setErrors({ max: 17 });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this.superControl.control?.setErrors(null);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (configName === InputStringEnum.FULL_NAME &&
|
|
193
|
+
this.superControl.control?.value) {
|
|
194
|
+
this.capitalizeWords();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
formatWithoutDecimal() {
|
|
198
|
+
const controlValue = this.superControl.control?.value;
|
|
199
|
+
this.hasDecimalIndex = -1;
|
|
200
|
+
if (controlValue.indexOf('.') === -1) {
|
|
201
|
+
// Transform value with thousand separator
|
|
202
|
+
this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue), {
|
|
203
|
+
emitEvent: false,
|
|
204
|
+
});
|
|
205
|
+
// Limit validation
|
|
206
|
+
this.originPriceSeparatorLimit =
|
|
207
|
+
this._inputConfig.priceSeparatorLimitation;
|
|
208
|
+
// Cut value
|
|
209
|
+
if (controlValue) {
|
|
210
|
+
this.superControl.control?.patchValue(controlValue.slice(0, this._inputConfig.priceSeparatorLimitation), {
|
|
211
|
+
emitEvent: false,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Transform value again after cutting
|
|
215
|
+
this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue), {
|
|
216
|
+
emitEvent: false,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
sanitizeConsecutiveSpaces() {
|
|
221
|
+
const configNames = InputConstants.textTransformConfigNames;
|
|
222
|
+
if (configNames.includes(this._inputConfig.name.toLowerCase())) {
|
|
223
|
+
const sanitizedInput = this.input.nativeElement.value.replace(/\s{2,}/g, ' ');
|
|
224
|
+
if (sanitizedInput !== this.input.nativeElement.value) {
|
|
225
|
+
this.superControl.control?.patchValue(sanitizedInput, {
|
|
226
|
+
emitEvent: false,
|
|
227
|
+
});
|
|
228
|
+
this.setCursorForSanitizedInput();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
setCursorForSanitizedInput() {
|
|
233
|
+
this.timeoutCleaner = setTimeout(() => {
|
|
234
|
+
this.input.nativeElement.setSelectionRange(this.lastCursorSpacePosition - 1, this.lastCursorSpacePosition - 1);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
removeLeadingZero() {
|
|
238
|
+
if (this._inputConfig.removeLeadingZero) {
|
|
239
|
+
const currentValue = this.superControl.control?.value;
|
|
240
|
+
if (!currentValue) {
|
|
241
|
+
this.superControl.control?.patchValue('', {
|
|
242
|
+
emitEvent: false,
|
|
243
|
+
});
|
|
244
|
+
this.superControl.control?.setErrors(null);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (this._inputConfig.negativeLeadingZero) {
|
|
248
|
+
const isNegative = currentValue.startsWith('-');
|
|
249
|
+
if (isNegative) {
|
|
250
|
+
// Get the part after the negative sign
|
|
251
|
+
const numberPart = currentValue.slice(1);
|
|
252
|
+
// Remove leading zeros
|
|
253
|
+
const transformedNumber = numberPart.replace(/^0+(?=\d)/, '');
|
|
254
|
+
this.superControl.control?.patchValue(`-${transformedNumber}`, {
|
|
255
|
+
emitEvent: false,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
this.superControl.control?.patchValue(currentValue.replace(/^0+(?=\d)/, ''), {
|
|
260
|
+
emitEvent: false,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
this.superControl.control?.patchValue(currentValue.replace(/^0+(?!$)/, ''), {
|
|
266
|
+
emitEvent: false,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
writeValueBase(obj) {
|
|
272
|
+
this.setChangeInput.next(obj);
|
|
273
|
+
if (!this._inputConfig.priceSeparator) {
|
|
274
|
+
this.input.nativeElement.value = obj;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
capitalizeWords() {
|
|
278
|
+
const words = this.superControl.control?.value.split(' ');
|
|
279
|
+
const capitalized = words.map((word) => {
|
|
280
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
281
|
+
});
|
|
282
|
+
this.superControl.control?.patchValue(capitalized.join(' '), {
|
|
283
|
+
emitEvent: false,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
isAllZeros(value) {
|
|
287
|
+
return value.split('').every((char) => char === '0');
|
|
288
|
+
}
|
|
289
|
+
onBlurBase(event) {
|
|
290
|
+
// DropDown Label
|
|
291
|
+
if (this._inputConfig.dropdownLabel && !this.isEditInput)
|
|
292
|
+
this._inputConfig.placeholderIcon = InputSvgRoutes.dynamicLabelSvg;
|
|
293
|
+
// Edit Input
|
|
294
|
+
if (this.isEditInput) {
|
|
295
|
+
this.superControl.control?.setErrors({ invalid: true });
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// Datepicker;
|
|
299
|
+
if (this.preventBlur) {
|
|
300
|
+
this.preventBlur = false;
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
// Bank
|
|
304
|
+
if (this._inputConfig.name ===
|
|
305
|
+
InputConfigNameStringEnum.INPUT_DROPDOWN_BANK_NAME)
|
|
306
|
+
this._inputConfig.blackInput = false;
|
|
307
|
+
// Price Separator - remove dot on focus out
|
|
308
|
+
if (this._inputConfig.priceSeparator &&
|
|
309
|
+
this.superControl.control?.value &&
|
|
310
|
+
this.superControl.control?.value?.toString().indexOf('.') >= 0) {
|
|
311
|
+
// 4.1. Check for Dot position
|
|
312
|
+
this.hasDecimalIndex = this.superControl.control?.value
|
|
313
|
+
.toString()
|
|
314
|
+
.indexOf('.');
|
|
315
|
+
let integerPart = this.thousandSeparatorPipe.transform(this.superControl.control?.value
|
|
316
|
+
.slice(0, this.hasDecimalIndex)
|
|
317
|
+
.slice(0, this._inputConfig.priceSeparatorLimitation));
|
|
318
|
+
let decimalPart = this.superControl.control?.value.slice(this.hasDecimalIndex + 1);
|
|
319
|
+
// 4.4. Get only two numbers of decimal part
|
|
320
|
+
decimalPart = decimalPart.slice(0, 2);
|
|
321
|
+
if (!decimalPart) {
|
|
322
|
+
this.hasDecimalIndex = -1;
|
|
323
|
+
this.superControl.control?.patchValue(integerPart);
|
|
324
|
+
this.numberOfPoints = 0;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Dropdown
|
|
328
|
+
if (this._inputConfig.isDropdown || this._inputConfig.dropdownLabel) {
|
|
329
|
+
this.blurOnDropDownArrow();
|
|
330
|
+
}
|
|
331
|
+
// Normal, without dropdown
|
|
332
|
+
else {
|
|
333
|
+
let selection = window.getSelection();
|
|
334
|
+
selection?.removeAllRanges();
|
|
335
|
+
// Input Commands
|
|
336
|
+
if (this._inputConfig.commands)
|
|
337
|
+
this.blurOnCommands();
|
|
338
|
+
// Password
|
|
339
|
+
if (this._inputConfig.type === 'password')
|
|
340
|
+
this.blurOnPassword();
|
|
341
|
+
// Normal focus out
|
|
342
|
+
else
|
|
343
|
+
this.isFocusInput = false;
|
|
344
|
+
}
|
|
345
|
+
this.setBlurInput.next(true);
|
|
346
|
+
this.isTouchedInput = true;
|
|
347
|
+
}
|
|
348
|
+
blurOnDropDownArrow() {
|
|
349
|
+
this.timeoutCleaner = setTimeout(() => {
|
|
350
|
+
this.isDropdownToggler = false;
|
|
351
|
+
this.isFocusInput = false;
|
|
352
|
+
this.isDropdownToggler = false;
|
|
353
|
+
this.isFocusInput = false;
|
|
354
|
+
this.setShowHideDropdown.next(this.isDropdownToggler);
|
|
355
|
+
}, 150);
|
|
356
|
+
}
|
|
357
|
+
blurOnPassword() {
|
|
358
|
+
this.passwordTimeout = setTimeout(() => {
|
|
359
|
+
this.isFocusInput = false;
|
|
360
|
+
this.input.nativeElement.blur();
|
|
361
|
+
this.cdRef.detectChanges();
|
|
362
|
+
}, 150);
|
|
363
|
+
}
|
|
364
|
+
checkRegexPattern(charCode, name) {
|
|
365
|
+
return this.caInputValidationService
|
|
366
|
+
.getInputRegexPattern(name)
|
|
367
|
+
?.test(charCode);
|
|
368
|
+
}
|
|
369
|
+
// FOCUS INPUT FUNCTION
|
|
370
|
+
onKeypress(event) {
|
|
371
|
+
const lowerCaseName = this._inputConfig.name.toLowerCase();
|
|
372
|
+
const charCode = String.fromCharCode(event.charCode);
|
|
373
|
+
// Disable first character to be space
|
|
374
|
+
if (!this.input.nativeElement.value && /^\s*$/.test(charCode)) {
|
|
375
|
+
event.preventDefault();
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
if (this._inputConfig.priceSeparator) {
|
|
379
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.PRICE_SEPARATOR)) {
|
|
380
|
+
if (this.superControl.control?.value?.length ===
|
|
381
|
+
this.originPriceSeparatorLimit &&
|
|
382
|
+
event.keyCode !== 46) {
|
|
383
|
+
event.preventDefault();
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
// Disable multiple dots
|
|
387
|
+
this.disableMultiplePoints(event);
|
|
388
|
+
// Find index of dot
|
|
389
|
+
const valueToString = String(this.superControl.control?.value);
|
|
390
|
+
this.hasDecimalIndex = valueToString?.indexOf('.');
|
|
391
|
+
if (this.hasDecimalIndex >= 0) {
|
|
392
|
+
// 1. Divide number on decimal and integer part
|
|
393
|
+
let integerPart = this.superControl.control?.value.slice(0, this.hasDecimalIndex);
|
|
394
|
+
if (!integerPart)
|
|
395
|
+
integerPart = '0';
|
|
396
|
+
let decimalPart = this.superControl.control?.value.slice(this.hasDecimalIndex + 1);
|
|
397
|
+
// 2. Disable more than two decimals
|
|
398
|
+
if (decimalPart.length > 2) {
|
|
399
|
+
event.preventDefault();
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
// 3. Get only two numbers of decimal part
|
|
403
|
+
decimalPart = decimalPart.slice(0, 2);
|
|
404
|
+
const currentPosition = this.input.nativeElement.selectionStart;
|
|
405
|
+
// 4. Set formatted number
|
|
406
|
+
this.superControl.control?.patchValue(integerPart + '.' + decimalPart);
|
|
407
|
+
this.timeoutCleaner = setTimeout(() => {
|
|
408
|
+
if (event.keyCode === 51) {
|
|
409
|
+
this.cursorInputPosition =
|
|
410
|
+
this.input.nativeElement.selectionStart;
|
|
411
|
+
this.input.nativeElement.setSelectionRange(currentPosition, currentPosition);
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
this.input.nativeElement.setSelectionRange(currentPosition, currentPosition);
|
|
415
|
+
}
|
|
416
|
+
}, 0);
|
|
417
|
+
}
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
event.preventDefault();
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
if (this.checkNameArray(InputConstants.businessNamesArray, lowerCaseName)) {
|
|
424
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.BUSINESS_NAME)) {
|
|
425
|
+
this.disableMultiplePoints(event);
|
|
426
|
+
this.disableConsecutivelySpaces(event);
|
|
427
|
+
return true;
|
|
428
|
+
}
|
|
429
|
+
event.preventDefault();
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
if (this.checkNameArray(InputConstants.qtyArray, lowerCaseName)) {
|
|
433
|
+
// Only numbers
|
|
434
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.QTY))
|
|
435
|
+
return true;
|
|
436
|
+
event.preventDefault();
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
if (this.checkNameArray([InputStringEnum.EMAIL], lowerCaseName)) {
|
|
440
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.EMAIL)) {
|
|
441
|
+
this.disableConsecutivelyPoints(event);
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
event.preventDefault();
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
if (this.checkNameArray([InputStringEnum.INVOICE], lowerCaseName)) {
|
|
448
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.INVOICE))
|
|
449
|
+
return true;
|
|
450
|
+
event.preventDefault();
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
if (this.checkNameArray([InputStringEnum.ADDRESS], lowerCaseName)) {
|
|
454
|
+
if (/^[A-Za-z0-9\s.&/,_-]*$/?.test(charCode)) {
|
|
455
|
+
this.disableConsecutivelySpaces(event);
|
|
456
|
+
return true;
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
event.preventDefault();
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
if (this.checkNameArray(InputConstants.addressUnitArray, lowerCaseName)) {
|
|
464
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.ADDRESS_UNIT))
|
|
465
|
+
return true;
|
|
466
|
+
event.preventDefault();
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
if (this.checkNameArray([InputStringEnum.FIRST_NAME], lowerCaseName)) {
|
|
470
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.FIRST_NAME)) {
|
|
471
|
+
this.disableMultiplePoints(event);
|
|
472
|
+
this.enableOneSpaceOnly(event);
|
|
473
|
+
return true;
|
|
474
|
+
}
|
|
475
|
+
event.preventDefault();
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
if (this.checkNameArray([InputStringEnum.LAST_NAME], lowerCaseName)) {
|
|
479
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.LAST_NAME)) {
|
|
480
|
+
this.enableOneSpaceOnly(event);
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
event.preventDefault();
|
|
484
|
+
return false;
|
|
485
|
+
}
|
|
486
|
+
if (this.checkNameArray([InputStringEnum.BANK_NAME], lowerCaseName)) {
|
|
487
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.BANK_NAME)) {
|
|
488
|
+
this.disableMultiplePoints(event);
|
|
489
|
+
this.enableOneSpaceOnly(event);
|
|
490
|
+
return true;
|
|
491
|
+
}
|
|
492
|
+
event.preventDefault();
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
if (this.checkNameArray(InputConstants.vinNumberArray, lowerCaseName)) {
|
|
496
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.VIN_NUMBER))
|
|
497
|
+
return !/^[IiOQ]*$/?.test(charCode);
|
|
498
|
+
event.preventDefault();
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
if (this.checkNameArray([InputStringEnum.TRUCK_TRAILER_MODEL], lowerCaseName)) {
|
|
502
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.TRUCK_TRAILER_MODEL)) {
|
|
503
|
+
this.enableOneSpaceOnly(event);
|
|
504
|
+
return true;
|
|
505
|
+
}
|
|
506
|
+
event.preventDefault();
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
if (this.checkNameArray([InputStringEnum.YEAR], lowerCaseName)) {
|
|
510
|
+
if (/^0*$/.test(charCode) && !this.input.nativeElement.value) {
|
|
511
|
+
event.preventDefault();
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.YEAR))
|
|
515
|
+
return true;
|
|
516
|
+
event.preventDefault();
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
if (this.checkNameArray([InputStringEnum.LICENSE_PLATE], lowerCaseName)) {
|
|
520
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.LICENSE_PLATE)) {
|
|
521
|
+
this.enableOneSpaceOnly(event);
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
event.preventDefault();
|
|
525
|
+
return false;
|
|
526
|
+
}
|
|
527
|
+
if (this.checkNameArray([InputStringEnum.DESCRIPTION], lowerCaseName)) {
|
|
528
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.DESCRIPTION)) {
|
|
529
|
+
this.disableConsecutivelySpaces(event);
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
event.preventDefault();
|
|
533
|
+
return false;
|
|
534
|
+
}
|
|
535
|
+
if (this.checkNameArray([InputStringEnum.ALLOW_ALL], lowerCaseName)) {
|
|
536
|
+
if (/.*/?.test(charCode))
|
|
537
|
+
return true;
|
|
538
|
+
event.preventDefault();
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
if (this.checkNameArray([InputStringEnum.DBA_NAME], lowerCaseName)) {
|
|
542
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.DBA_NAME))
|
|
543
|
+
return true;
|
|
544
|
+
event.preventDefault();
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
if (this.checkNameArray([InputStringEnum.PER_MILE], lowerCaseName)) {
|
|
548
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.PER_MILE)) {
|
|
549
|
+
this.disableMultiplePoints(event);
|
|
550
|
+
// Check for max length
|
|
551
|
+
if (this.superControl.control?.value?.toString().includes('.'))
|
|
552
|
+
this._inputConfig.maxLength = 4;
|
|
553
|
+
else
|
|
554
|
+
this._inputConfig.maxLength = 2;
|
|
555
|
+
// Check for range
|
|
556
|
+
if (this.superControl.control?.value > this._inputConfig.max ||
|
|
557
|
+
this.superControl.control?.value < this._inputConfig.min) {
|
|
558
|
+
this.superControl.control?.setErrors({ invalid: true });
|
|
559
|
+
}
|
|
560
|
+
return true;
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
event.preventDefault();
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (this.checkNameArray(InputConstants.perStopArray, lowerCaseName)) {
|
|
568
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.PER_STOP)) {
|
|
569
|
+
this.timeoutCleaner = setTimeout(() => {
|
|
570
|
+
if (this.superControl.control?.value) {
|
|
571
|
+
let perStopValue = this.superControl.control?.value.replace(/,/g, '');
|
|
572
|
+
if (perStopValue > this._inputConfig.max ||
|
|
573
|
+
perStopValue < this._inputConfig.min) {
|
|
574
|
+
this.superControl.control?.setErrors({
|
|
575
|
+
invalid: true,
|
|
576
|
+
});
|
|
577
|
+
return false;
|
|
578
|
+
}
|
|
579
|
+
return true;
|
|
580
|
+
}
|
|
581
|
+
return;
|
|
582
|
+
}, 0);
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
event.preventDefault();
|
|
586
|
+
return false;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
if (this.checkNameArray(InputConstants.emergencyNameArray, lowerCaseName)) {
|
|
590
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.EMERGENCY_NAME))
|
|
591
|
+
return true;
|
|
592
|
+
event.preventDefault();
|
|
593
|
+
return false;
|
|
594
|
+
}
|
|
595
|
+
if (this.checkNameArray([InputStringEnum.EMERGENCY_NAME], lowerCaseName)) {
|
|
596
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.EMERGENCY_NAME)) {
|
|
597
|
+
this.disableConsecutivelySpaces(event);
|
|
598
|
+
this.enableOneSpaceOnly(event);
|
|
599
|
+
return true;
|
|
600
|
+
}
|
|
601
|
+
event.preventDefault();
|
|
602
|
+
return false;
|
|
603
|
+
}
|
|
604
|
+
if (this.checkNameArray([InputStringEnum.FULL_CONTACT_NAME], lowerCaseName)) {
|
|
605
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.FULL_CONTACT_NAME))
|
|
606
|
+
return true;
|
|
607
|
+
event.preventDefault();
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
if (this.checkNameArray([InputStringEnum.FUEL_STORE], lowerCaseName)) {
|
|
611
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.FUEL_STORE))
|
|
612
|
+
return true;
|
|
613
|
+
event.preventDefault();
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
if (this.checkNameArray([InputStringEnum.HOS], lowerCaseName)) {
|
|
617
|
+
if (!this.inputSelection &&
|
|
618
|
+
this.checkRegexPattern(charCode, InputStringEnum.HOS)) {
|
|
619
|
+
return (this.superControl.control?.value * 10 +
|
|
620
|
+
event.charCode -
|
|
621
|
+
48 <=
|
|
622
|
+
this._inputConfig.max);
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
if (this.inputSelection) {
|
|
626
|
+
this.superControl.control?.patchValue(charCode);
|
|
627
|
+
this.inputSelection = false;
|
|
628
|
+
}
|
|
629
|
+
event.preventDefault();
|
|
630
|
+
return false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
if (this.checkNameArray(InputConstants.parkingSlotArray, lowerCaseName)) {
|
|
634
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.FULL_PARKING_SLOT))
|
|
635
|
+
return true;
|
|
636
|
+
else {
|
|
637
|
+
event.preventDefault();
|
|
638
|
+
return false;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
if (this.checkNameArray([InputStringEnum.CDL_NUMBER], lowerCaseName)) {
|
|
642
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.CDL_NUMBER)) {
|
|
643
|
+
this.enableOneSpaceOnly(event);
|
|
644
|
+
this.disableConsecutivelySpaces(event);
|
|
645
|
+
return true;
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
event.preventDefault();
|
|
649
|
+
return false;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
// All Simbols
|
|
653
|
+
if (this.checkNameArray(InputConstants.usernameArray, lowerCaseName)) {
|
|
654
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.USERNAME))
|
|
655
|
+
return true;
|
|
656
|
+
else {
|
|
657
|
+
event.preventDefault();
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
if (this.checkNameArray([InputStringEnum.FULL_NAME], lowerCaseName)) {
|
|
662
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.FULL_NAME)) {
|
|
663
|
+
this.enableOneSpaceOnly(event);
|
|
664
|
+
this.disableMultiplePoints(event);
|
|
665
|
+
this.disableConsecutivelySpaces(event);
|
|
666
|
+
return true;
|
|
667
|
+
}
|
|
668
|
+
else {
|
|
669
|
+
event.preventDefault();
|
|
670
|
+
return false;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
if (this.checkNameArray([InputStringEnum.TOLL_VALIDATION], lowerCaseName)) {
|
|
674
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.TOLL_VALIDATION))
|
|
675
|
+
return true;
|
|
676
|
+
else {
|
|
677
|
+
event.preventDefault();
|
|
678
|
+
return false;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
// Just characters and numbers
|
|
682
|
+
if (this.checkNameArray(InputConstants.prefixArray, lowerCaseName)) {
|
|
683
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.PREFIX))
|
|
684
|
+
return true;
|
|
685
|
+
else {
|
|
686
|
+
event.preventDefault();
|
|
687
|
+
return false;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
if (this.checkNameArray([InputStringEnum.FULL_NAME], lowerCaseName)) {
|
|
691
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.FULL_NAME)) {
|
|
692
|
+
event.preventDefault();
|
|
693
|
+
return false;
|
|
694
|
+
}
|
|
695
|
+
else {
|
|
696
|
+
this.disableConsecutivelySpaces(event);
|
|
697
|
+
return true;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
if (this.checkNameArray(InputConstants.producerNameArray, lowerCaseName)) {
|
|
701
|
+
if (this.checkRegexPattern(charCode, InputStringEnum.PRODUCER_NAME)) {
|
|
702
|
+
this.disableMultiplePoints(event);
|
|
703
|
+
return true;
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
event.preventDefault();
|
|
707
|
+
return false;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
if (this.checkNameArray([InputStringEnum.INPUT_DROPDOWN_LABEL], lowerCaseName)) {
|
|
711
|
+
this.disableConsecutivelySpaces(event);
|
|
712
|
+
this.disableConsecutivelyPoints(event);
|
|
713
|
+
}
|
|
714
|
+
this.input.nativeElement.value.trim();
|
|
715
|
+
}
|
|
716
|
+
// #region onFocus
|
|
717
|
+
onFocus(event) {
|
|
718
|
+
this.focusInputEvent.emit(event);
|
|
719
|
+
// DropDown Label
|
|
720
|
+
if (this._inputConfig.dropdownLabel) {
|
|
721
|
+
this._inputConfig.placeholderIcon =
|
|
722
|
+
InputSvgRoutes.dynamicFocusLabelSvg;
|
|
723
|
+
}
|
|
724
|
+
// Dropdown
|
|
725
|
+
if (this._inputConfig.isDropdown) {
|
|
726
|
+
this.isDropdownToggler = true;
|
|
727
|
+
this.setShowHideDropdown.next(this.isDropdownToggler);
|
|
728
|
+
}
|
|
729
|
+
// Commands
|
|
730
|
+
if (this._inputConfig.commands && !this._inputConfig.isDisabled) {
|
|
731
|
+
if (this._inputConfig.commands.type === InputCommandsType.MONTHS) {
|
|
732
|
+
if (!this._inputConfig.blueInput)
|
|
733
|
+
this._inputConfig.blackInput = true;
|
|
734
|
+
this._inputConfig.commands.active = true;
|
|
735
|
+
this.isVisibleCommands = true;
|
|
736
|
+
}
|
|
737
|
+
if (this._inputConfig.commands.type ===
|
|
738
|
+
InputCommandsType.PM_INCREMENT_DECREMENT ||
|
|
739
|
+
this._inputConfig.commands.type ===
|
|
740
|
+
InputCommandsType.INCREMENT_DECREMENT) {
|
|
741
|
+
this._inputConfig.blackInput = false;
|
|
742
|
+
this._inputConfig.commands.active = true;
|
|
743
|
+
this.isVisibleCommands = true;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
this.isFocusInput = true;
|
|
747
|
+
}
|
|
748
|
+
// #endregion
|
|
749
|
+
// #region onKeyDown
|
|
750
|
+
onKeydown(event) {
|
|
751
|
+
if (event)
|
|
752
|
+
this.isCapsLockOn = event?.getModifierState?.('CapsLock');
|
|
753
|
+
if (this._inputConfig.priceSeparator) {
|
|
754
|
+
const valueToString = String(this.superControl.control?.value);
|
|
755
|
+
this.isDotDeleted = valueToString?.includes('.');
|
|
756
|
+
}
|
|
757
|
+
// Disable for phone field first character to be 0
|
|
758
|
+
if (this._inputConfig.name.toLowerCase() === InputStringEnum.PHONE) {
|
|
759
|
+
if (event.target.selectionStart === 0 &&
|
|
760
|
+
event.key === '0') {
|
|
761
|
+
event.preventDefault();
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
if (event.keyCode === 9) {
|
|
765
|
+
this.setDropDownKeyNavigation.next({
|
|
766
|
+
keyCode: event.keyCode,
|
|
767
|
+
data: null,
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
// #endregion
|
|
772
|
+
// #region onKeyUp
|
|
773
|
+
onKeyup(event) {
|
|
774
|
+
if (event) {
|
|
775
|
+
this.isCapsLockOn = event?.getModifierState?.('CapsLock');
|
|
776
|
+
}
|
|
777
|
+
// Reset function property for disabling multiple dots
|
|
778
|
+
const valueToString = String(this.superControl.control?.value);
|
|
779
|
+
if (this.isDotDeleted && !valueToString?.includes('.'))
|
|
780
|
+
this.numberOfPoints = 0;
|
|
781
|
+
if (event.keyCode == 8 &&
|
|
782
|
+
!(this._inputConfig.isDropdown || this._inputConfig.dropdownLabel)) {
|
|
783
|
+
// Reset Multiple Consecutively Spaces
|
|
784
|
+
this.numberOfConsecutivelySpaces = 0;
|
|
785
|
+
// Reset One Space Only
|
|
786
|
+
if (this.superControl.control?.value &&
|
|
787
|
+
!this.superControl.control?.value?.includes(' ')) {
|
|
788
|
+
this.oneSpaceOnlyCounter = 0;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
if (this._inputConfig.isDropdown ||
|
|
792
|
+
this._inputConfig.dropdownLabel ||
|
|
793
|
+
this._inputConfig.name === InputConfigNameStringEnum.ADDRESS) {
|
|
794
|
+
if (event.keyCode === 40 || event.keyCode === 38) {
|
|
795
|
+
this.setDropDownKeyNavigation.next({
|
|
796
|
+
keyCode: event.keyCode,
|
|
797
|
+
data: null,
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
if (event.keyCode === 13) {
|
|
801
|
+
this.setDropDownKeyNavigation.next({
|
|
802
|
+
keyCode: event.keyCode,
|
|
803
|
+
data: this._inputConfig,
|
|
804
|
+
});
|
|
805
|
+
if (this._inputConfig.name === InputConfigNameStringEnum.ADDRESS) {
|
|
806
|
+
this.input.nativeElement.blur();
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
if (event.keyCode === 27) {
|
|
810
|
+
this.isVisibleCommands = false;
|
|
811
|
+
this.onBlurBase();
|
|
812
|
+
this.blurOnDropDownArrow();
|
|
813
|
+
this.input.nativeElement.blur();
|
|
814
|
+
this.setDropDownKeyNavigation.next({
|
|
815
|
+
keyCode: event.keyCode,
|
|
816
|
+
data: null,
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
if (event.keyCode === 9) {
|
|
820
|
+
this.onFocus();
|
|
821
|
+
this.input.nativeElement.focus();
|
|
822
|
+
this.setDropDownKeyNavigation.next({
|
|
823
|
+
keyCode: event.keyCode,
|
|
824
|
+
data: null,
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
handleConfirmCancel(action) {
|
|
830
|
+
switch (action) {
|
|
831
|
+
case InputCommandsAction.CONFIRM:
|
|
832
|
+
this.confirmCommand();
|
|
833
|
+
break;
|
|
834
|
+
case InputCommandsAction.CANCEL:
|
|
835
|
+
this.cancelCommand();
|
|
836
|
+
break;
|
|
837
|
+
default:
|
|
838
|
+
break;
|
|
839
|
+
}
|
|
840
|
+
this.superControl.control?.setErrors(null);
|
|
841
|
+
this._inputConfig.dropdownLabelNew = false;
|
|
842
|
+
this._inputConfig.commands.active = false;
|
|
843
|
+
this._inputConfig.blackInput = false;
|
|
844
|
+
this.isEditInput = false;
|
|
845
|
+
this.isVisibleCommands = false;
|
|
846
|
+
this.isFocusInput = false;
|
|
847
|
+
}
|
|
848
|
+
cancelCommand() {
|
|
849
|
+
this.setCommandEvent.next({ action: InputCommandsAction.CANCEL });
|
|
850
|
+
}
|
|
851
|
+
confirmCommand() {
|
|
852
|
+
this.setCommandEvent.next({
|
|
853
|
+
data: this.superControl.control?.value,
|
|
854
|
+
action: InputCommandsAction.CONFIRM,
|
|
855
|
+
mode: !this._inputConfig.dropdownLabelNew &&
|
|
856
|
+
this._inputConfig.name !== 'Input Dropdown Bank Name'
|
|
857
|
+
? 'edit'
|
|
858
|
+
: 'new',
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
// #endregion
|
|
862
|
+
// #region ClearInput
|
|
863
|
+
clearInput(event) {
|
|
864
|
+
event.preventDefault();
|
|
865
|
+
event.stopPropagation();
|
|
866
|
+
// Clear whole input
|
|
867
|
+
if (this._inputConfig.removeInput) {
|
|
868
|
+
this.setClearInputEvent.next(true);
|
|
869
|
+
return;
|
|
870
|
+
}
|
|
871
|
+
// Incorrect Input
|
|
872
|
+
if (this._inputConfig.incorrectInput) {
|
|
873
|
+
this.incorrectValue = !this.incorrectValue;
|
|
874
|
+
this.setIncorrectInput.next(this.incorrectValue);
|
|
875
|
+
}
|
|
876
|
+
// Native clear
|
|
877
|
+
else {
|
|
878
|
+
this.input.nativeElement.value = null;
|
|
879
|
+
this.superControl.control?.setValue(null, {
|
|
880
|
+
emitEvent: false,
|
|
881
|
+
});
|
|
882
|
+
this.numberOfConsecutivelySpaces = 0;
|
|
883
|
+
this.numberOfConsecutivelyPoints = 0;
|
|
884
|
+
this.numberOfPoints = 0;
|
|
885
|
+
this.oneSpaceOnlyCounter = 0;
|
|
886
|
+
this._inputConfig.dropdownImageInput = undefined;
|
|
887
|
+
this.isTouchedInput = true;
|
|
888
|
+
this.isFocusInput = false;
|
|
889
|
+
this.setClearInputEvent.next(true);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
// #endregion
|
|
893
|
+
// #region OnCommands
|
|
894
|
+
onCommands(e) {
|
|
895
|
+
const { event, type, action } = e;
|
|
896
|
+
event.stopPropagation();
|
|
897
|
+
event.preventDefault();
|
|
898
|
+
switch (type) {
|
|
899
|
+
case InputCommandsType.PM_INCREMENT_DECREMENT:
|
|
900
|
+
this.handlePmIncrementDecrement(action);
|
|
901
|
+
break;
|
|
902
|
+
case InputCommandsType.INCREMENT_DECREMENT:
|
|
903
|
+
this.handleIncrementDecrement(action);
|
|
904
|
+
break;
|
|
905
|
+
case InputCommandsType.CONFIRM_CANCEL:
|
|
906
|
+
this.handleConfirmCancel(action);
|
|
907
|
+
break;
|
|
908
|
+
case InputCommandsType.MONTHS:
|
|
909
|
+
this.handleMonths(action);
|
|
910
|
+
break;
|
|
911
|
+
default:
|
|
912
|
+
break;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
// #endregion
|
|
916
|
+
// #region onEditInput
|
|
917
|
+
onEditInput(event) {
|
|
918
|
+
event.preventDefault();
|
|
919
|
+
event.stopPropagation();
|
|
920
|
+
this.isEditInput = true;
|
|
921
|
+
this._inputConfig.dropdownLabelNew = false;
|
|
922
|
+
if (!this._inputConfig.blueInput)
|
|
923
|
+
this._inputConfig.blackInput = true;
|
|
924
|
+
this._inputConfig.commands.active = true;
|
|
925
|
+
this.isVisibleCommands = true;
|
|
926
|
+
this.isFocusInput = true;
|
|
927
|
+
this.setInputCursorAtTheEnd(this.input.nativeElement);
|
|
928
|
+
this.superControl.control?.setErrors({ required: true });
|
|
929
|
+
this.setCommandEvent.next({
|
|
930
|
+
data: this.superControl.control?.value,
|
|
931
|
+
action: 'Edit Input',
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
// #endregion
|
|
935
|
+
// #region ToggleDropdownOptions
|
|
936
|
+
toggleDropdownOptions() {
|
|
937
|
+
this.handleToggleDropdownOptions.emit();
|
|
938
|
+
if (this._inputConfig.isDisabled) {
|
|
939
|
+
return;
|
|
940
|
+
}
|
|
941
|
+
this.isDropdownToggler = !this.isDropdownToggler;
|
|
942
|
+
this.setShowHideDropdown.next(this.isDropdownToggler);
|
|
943
|
+
if (this.isDropdownToggler) {
|
|
944
|
+
this.input.nativeElement.focus();
|
|
945
|
+
this.isFocusInput = true;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
// #endregion
|
|
949
|
+
// #region onPlaceholderIconevent
|
|
950
|
+
onPlaceholderIconEvent(event) {
|
|
951
|
+
event.preventDefault();
|
|
952
|
+
event.stopPropagation();
|
|
953
|
+
if (this.isEditInput) {
|
|
954
|
+
this.setCommandEvent.next({
|
|
955
|
+
data: this.superControl.control?.value,
|
|
956
|
+
action: 'Toggle Dropdown',
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
else {
|
|
960
|
+
this.setCommandEvent.next({
|
|
961
|
+
data: this.superControl.control?.value,
|
|
962
|
+
action: 'Placeholder Icon Event',
|
|
963
|
+
});
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
// #endregion
|
|
967
|
+
// #region SelectionChange
|
|
968
|
+
selectionChange(event) {
|
|
969
|
+
if (event)
|
|
970
|
+
this.inputSelection = true;
|
|
971
|
+
}
|
|
972
|
+
// #endregion setSelection
|
|
973
|
+
// #region AutoFocusFirstInput
|
|
974
|
+
autoFocusFirstInput() {
|
|
975
|
+
if (this._inputConfig.autoFocus && !this.superControl.control?.value) {
|
|
976
|
+
this.timeoutCleaner = setTimeout(() => {
|
|
977
|
+
this.input.nativeElement.focus();
|
|
978
|
+
this.isFocusInput = true;
|
|
979
|
+
this._inputConfig.autoFocus = false;
|
|
980
|
+
}, 30);
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
// #endregion
|
|
984
|
+
onPopoverShown() {
|
|
985
|
+
if (!this._inputConfig.dropdownLabel) {
|
|
986
|
+
this.isFocusInput = true;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
onPopoverHidden() {
|
|
990
|
+
if (!this._inputConfig.dropdownLabel) {
|
|
991
|
+
this.isFocusInput = false;
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
onInputConfigChange() {
|
|
995
|
+
// Price Separator
|
|
996
|
+
if (this._inputConfig.priceSeparator) {
|
|
997
|
+
this.originPriceSeparatorLimit =
|
|
998
|
+
this._inputConfig.priceSeparatorLimitation;
|
|
999
|
+
}
|
|
1000
|
+
// Custom Range
|
|
1001
|
+
if (this._inputConfig.isUsingCustomPeriodRange) {
|
|
1002
|
+
if (this._inputConfig.isDisplayingCustomPeriodRange)
|
|
1003
|
+
this.isFocusInput = true;
|
|
1004
|
+
else
|
|
1005
|
+
this.isFocusInput = false;
|
|
1006
|
+
}
|
|
1007
|
+
// When add mode in dropdown
|
|
1008
|
+
if (this._inputConfig.commands?.active &&
|
|
1009
|
+
!this._inputConfig.isDisabled) {
|
|
1010
|
+
if (this._inputConfig.commands.type === 'confirm-cancel') {
|
|
1011
|
+
if (!this._inputConfig.blueInput)
|
|
1012
|
+
this._inputConfig.blackInput = true;
|
|
1013
|
+
this.isVisibleCommands = true;
|
|
1014
|
+
this.isFocusInput = true;
|
|
1015
|
+
this.input.nativeElement.focus();
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtaW5wdXQtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLWlucHV0L2Jhc2UtY2xhc3Nlcy9jYS1pbnB1dC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLHlCQUF5QixFQUN6QixlQUFlLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFvQixjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLcEYsTUFBTSxPQUFnQixvQkFBcUIsU0FBUSwyQkFBMkI7SUFxRDFFLFlBQ1csS0FBd0IsRUFDeEIscUJBQTRDO1FBRW5ELEtBQUssRUFBRSxDQUFDO1FBSEQsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQTFCdkQsYUFBYTtRQUVOLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRWhDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFHN0IsNEJBQXVCLEdBQVcsQ0FBQyxDQUFDO1FBUTNDLFdBQVc7UUFDSixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixzQkFBaUIsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRTVDLG1CQUFtQjtRQUNaLGdDQUEyQixHQUFXLENBQUMsQ0FBQztJQVMvQyxDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQWEsRUFBRSxPQUFpQjtRQUNqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBYyxD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QUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLHlCQUF5QjtnQkFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQztRQUNuRCxDQUFDO1FBRUQsZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyw2QkFBNkI7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDOztnQkFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDbkMsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUNJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU07WUFDbEMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFDL0IsQ0FBQztZQUNDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7b0JBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJbnB1dENvbW1hbmRzQWN0aW9uLFxuICAgIElucHV0Q29tbWFuZHNUeXBlLFxuICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0sXG4gICAgSW5wdXRTdHJpbmdFbnVtLFxufSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBUaG91c2FuZFNlcGFyYXRvclBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy90aG91c2FuZC1zZXBhcmF0b3IucGlwZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJbnB1dENvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJbnB1dENoYW5nZVZhbHVlLCBJbnB1dFN2Z1JvdXRlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENhSW5wdXRWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENhSW5wdXRCYXNlSGVscGVyc0NvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtY2xhc3Nlcy9jYS1pbnB1dC1iYXNlLWhlbHByZXMnO1xuaW1wb3J0IHsgRXZlbnRJbnB1dE1hbmFnZXIgfSBmcm9tICcuL2NhLWlucHV0LWV2ZW50LW1hbmFnZXInO1xuaW1wb3J0IHsgQ29tbWFuZHNFdmVudCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJQ2FJbnB1dCB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYUlucHV0QmFzZUNvbXBvbmVudCBleHRlbmRzIENhSW5wdXRCYXNlSGVscGVyc0NvbXBvbmVudCB7XG4gICAgYWJzdHJhY3QgZm9jdXNJbnB1dEV2ZW50OiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD47XG4gICAgYWJzdHJhY3QgaGFuZGxlVG9nZ2xlRHJvcGRvd25PcHRpb25zOiBFdmVudEVtaXR0ZXI8dm9pZD47XG5cbiAgICAvLyAjcmVnaW9uIGFic3RyYWN0IHZhcmlhYmxlc1xuICAgIGFic3RyYWN0IGlzRm9jdXNJbnB1dDogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCBpc1RvdWNoZWRJbnB1dDogYm9vbGVhbjtcblxuICAgIC8vIElucHV0IENvbW1hbmRzXG4gICAgYWJzdHJhY3QgaXNWaXNpYmxlQ29tbWFuZHM6IGJvb2xlYW47XG5cbiAgICAvLyBFZGl0IElucHV0XG4gICAgYWJzdHJhY3QgaXNFZGl0SW5wdXQ6IGJvb2xlYW47XG5cbiAgICBhYnN0cmFjdCBpc0Ryb3Bkb3duVG9nZ2xlcjogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCBpc0NhcHNMb2NrT246IGJvb2xlYW47XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBhYnN0cmFjdCBldmVudHNcbiAgICBhYnN0cmFjdCBzZXRDb21tYW5kRXZlbnQ6IEV2ZW50SW5wdXRNYW5hZ2VyPENvbW1hbmRzRXZlbnQ+O1xuICAgIGFic3RyYWN0IHNldENsZWFySW5wdXRFdmVudDogRXZlbnRJbnB1dE1hbmFnZXI8Ym9vbGVhbj47XG4gICAgYWJzdHJhY3Qgc2V0SW5jb3JyZWN0SW5wdXQ6IEV2ZW50SW5wdXRNYW5hZ2VyPGJvb2xlYW4+O1xuICAgIGFic3RyYWN0IHNldEJsdXJJbnB1dDogRXZlbnRJbnB1dE1hbmFnZXI8Ym9vbGVhbj47XG4gICAgYWJzdHJhY3Qgc2V0Q2hhbmdlSW5wdXQ6IEV2ZW50SW5wdXRNYW5hZ2VyPElucHV0Q2hhbmdlVmFsdWU+O1xuICAgIGFic3RyYWN0IHNldFNob3dIaWRlRHJvcGRvd246IEV2ZW50SW5wdXRNYW5hZ2VyPGJvb2xlYW4+O1xuICAgIGFic3RyYWN0IHNldERyb3BEb3duS2V5TmF2aWdhdGlvbjogRXZlbnRJbnB1dE1hbmFnZXI8e1xuICAgICAgICBrZXlDb2RlOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IElDYUlucHV0IHwgbnVsbDtcbiAgICB9PjtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICBwdWJsaWMgaW5wdXRTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY3Vyc29ySW5wdXRQb3NpdGlvbiE6IG51bWJlcjtcbiAgICBwdWJsaWMgaGFzRGVjaW1hbEluZGV4OiBudW1iZXIgPSAtMTtcbiAgICBwdWJsaWMgb3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCE6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgdGltZW91dENsZWFuZXIhOiBOb2RlSlMuVGltZW91dCB8IG51bWJlcjtcbiAgICBwdWJsaWMgbGFzdEN1cnNvclNwYWNlUG9zaXRpb246IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBwcmV2ZW50Qmx1ciE6IGJvb2xlYW47XG4gICAgcHVibGljIHBhc3N3b3JkVGltZW91dCE6IE5vZGVKUy5UaW1lb3V0IHwgbnVtYmVyO1xuXG4gICAgcHVibGljIGlzRG90RGVsZXRlZCE6IGJvb2xlYW47XG5cbiAgICBhYnN0cmFjdCBpbmNvcnJlY3RWYWx1ZTogYm9vbGVhbjtcblxuICAgIC8vIERyb3Bkb3duXG4gICAgcHVibGljIHNob3dEYXRlSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgZGF0ZVRpbWVJbnB1dERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgLy8gTnVtYmVyIG9mIHNwYWNlc1xuICAgIHB1YmxpYyBudW1iZXJPZkNvbnNlY3V0aXZlbHlTcGFjZXM6IG51bWJlciA9IDA7XG5cbiAgICBhYnN0cmFjdCBjYUlucHV0VmFsaWRhdGlvblNlcnZpY2U6IENhSW5wdXRWYWxpZGF0aW9uU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3JQaXBlOiBUaG91c2FuZFNlcGFyYXRvclBpcGVcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNmb3JtVGV4dCh2YWx1ZTogc3RyaW5nLCBpc1Bhc3RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnNvcklucHV0UG9zaXRpb24gPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XG5cbiAgICAgICAgLy8gSGFuZGxlIHBhc3RlIG9wZXJhdGlvblxuICAgICAgICBpZiAoaXNQYXN0ZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQYXN0ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtYXRpb24oKTtcblxuICAgICAgICAvLyBBcHBseSB0aG91c2FuZCBhbmQgcHJpY2Ugc2VwYXJhdG9ycyBpZiBjb25maWd1cmVkXG4gICAgICAgIHRoaXMuYXBwbHlUaG91c2FuZFNlcGFyYXRvcigpO1xuICAgICAgICB0aGlzLmFwcGx5UHJpY2VTZXBhcmF0b3IoKTtcblxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRpb24odmFsdWUpO1xuXG4gICAgICAgIHRoaXMuc2FuaXRpemVDb25zZWN1dGl2ZVNwYWNlcygpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlTGVhZGluZ1plcm8oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVBhc3RlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IG1haW5WYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIG1haW5WYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubGltaXRJbnB1dExlbmd0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFpblZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmlucHV0U2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWxldGUgc3BhY2VzIG9uIGJlZ2luIGFuZCBlbmRcbiAgICAgICAgbWFpblZhbHVlID0gbWFpblZhbHVlLnRyaW0oKTtcbiAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShtYWluVmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGltaXRJbnB1dExlbmd0aCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUubGVuZ3RoID5cbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm1heExlbmd0aCFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlUZXh0VHJhbnNmb3JtYXRpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCB7IHZhbHVlIH0gPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5faW5wdXRDb25maWcudGV4dFRyYW5zZm9ybSkge1xuICAgICAgICAgICAgY2FzZSBJbnB1dFN0cmluZ0VudW0uQ0FQSVRBTElaRTpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0U3RyaW5nRW51bS5VUFBFUkNBU0U6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvY2FsZVVwcGVyQ2FzZSgnZW4tVVMnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5wdXRTdHJpbmdFbnVtLkNBUElUQUxJWkVEX0NBU0U6XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRDYXNlV29yZHMgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKF5cXHd7MX0pfChcXHMrXFx3ezF9KS9nLFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyOiBzdHJpbmcpID0+IGxldHRlci50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHZhbHVlID0gY2FwaXRhbGl6ZWRDYXNlV29yZHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUodmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlUaG91c2FuZFNlcGFyYXRvcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy50aG91c2FuZFNlcGFyYXRvciAmJiBjb250cm9sVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWxsWmVyb3MoY29udHJvbFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoJzAnLCB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oY29udHJvbFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5UHJpY2VTZXBhcmF0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3IgJiYgY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAvLyAwLiBEb24ndCBhbGxvdyAwIGFzIGZpcnN0IGNoYXJhY3RlclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNBbGxaZXJvcyhjb250cm9sVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZSgnMCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDQuIElmIHVzZXIgc2V0IGRvdFxuICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRXaXRoRGVjaW1hbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyA1LiBJZiB1c2VyIGRvZXNuJ3Qgc2V0IGRvdFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0V2l0aG91dERlY2ltYWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dEN1cnNvclBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElucHV0Q3Vyc29yUG9zaXRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS5pbmRleE9mKCcuJykgPT09IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS5pbmRleE9mKCcuJykgPT09IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgJHtufTAwMDAwIGFuZCB3ZSBkZWxldGUgTiB0aGVuIHdlIGdvdCB1bmRlZmluZWQgaW5zdGVhZCBvZiBkb3RcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoMCwge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0V2l0aERlY2ltYWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICAvLyA0LjEuIENoZWNrIGZvciBEb3QgcG9zaXRpb25cbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSBjb250cm9sVmFsdWUuaW5kZXhPZignLicpO1xuXG4gICAgICAgIHRoaXMub3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCA9XG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb24hICsgMztcblxuICAgICAgICAvLyA0LjIuIERpdmlkZSBudW1iZXIgaW50byBkZWNpbWFsIGFuZCBpbnRlZ2VyIHBhcnRzXG4gICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IHRoaXMudGhvdXNhbmRTZXBhcmF0b3JQaXBlLnRyYW5zZm9ybShcbiAgICAgICAgICAgIGNvbnRyb2xWYWx1ZVxuICAgICAgICAgICAgICAgIC5zbGljZSgwLCB0aGlzLmhhc0RlY2ltYWxJbmRleClcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5faW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3JMaW1pdGF0aW9uKVxuICAgICAgICApO1xuICAgICAgICBsZXQgZGVjaW1hbFBhcnQgPSBjb250cm9sVmFsdWUuc2xpY2UodGhpcy5oYXNEZWNpbWFsSW5kZXggKyAxKTtcblxuICAgICAgICBpZiAoIWludGVnZXJQYXJ0KSB7XG4gICAgICAgICAgICBpbnRlZ2VyUGFydCA9ICcwJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuNC4gR2V0IG9ubHkgdHdvIG51bWJlcnMgb2YgdGhlIGRlY2ltYWwgcGFydFxuICAgICAgICBkZWNpbWFsUGFydCA9IGRlY2ltYWxQYXJ0LnNsaWNlKDAsIDIpO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCkge1xuICAgICAgICAgICAgLy8gNC41LiBTZXQgZm9ybWF0dGVkIG51bWJlclxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBgJHtpbnRlZ2VyUGFydH0uJHtkZWNpbWFsUGFydH1gLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPVxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLmluZGV4T2YoJy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3VzdG9tVmFsaWRhdGlvbih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ05hbWUgPSB0aGlzLl9pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLllFQVIgJiZcbiAgICAgICAgICAgIHBhcnNlSW50KHZhbHVlKSA+IHBhcnNlSW50KG1vbWVudCgpLmFkZCgxLCAneWVhcicpLmZvcm1hdCgnWVlZWScpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLk1PTlRIUykge1xuICAgICAgICAgICAgaWYgKHBhcnNlSW50KHZhbHVlKSA8IDEgfHwgcGFyc2VJbnQodmFsdWUpID4gMTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLkFYTEVTKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VJbnQodmFsdWUpIDwgMSB8fCBwYXJzZUludCh2YWx1ZSkgPiAxNykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZUludCh2YWx1ZSkgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7IG1pbjogMSB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KHZhbHVlKSA+IDE3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7IG1heDogMTcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWdOYW1lID09PSBJbnB1dFN0cmluZ0VudW0uRlVMTF9OQU1FICYmXG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY2FwaXRhbGl6ZVdvcmRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdFdpdGhvdXREZWNpbWFsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAoY29udHJvbFZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB2YWx1ZSB3aXRoIHRob3VzYW5kIHNlcGFyYXRvclxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oY29udHJvbFZhbHVlKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gTGltaXQgdmFsaWRhdGlvblxuICAgICAgICAgICAgdGhpcy5vcmlnaW5QcmljZVNlcGFyYXRvckxpbWl0ID1cbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb247XG5cbiAgICAgICAgICAgIC8vIEN1dCB2YWx1ZVxuICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZS5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB2YWx1ZSBhZ2FpbiBhZnRlciBjdXR0aW5nXG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3JQaXBlLnRyYW5zZm9ybShjb250cm9sVmFsdWUpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZUNvbnNlY3V0aXZlU3BhY2VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWdOYW1lcyA9IElucHV0Q29uc3RhbnRzLnRleHRUcmFuc2Zvcm1Db25maWdOYW1lcztcblxuICAgICAgICBpZiAoY29uZmlnTmFtZXMuaW5jbHVkZXModGhpcy5faW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUucmVwbGFjZShcbiAgICAgICAgICAgICAgICAvXFxzezIsfS9nLFxuICAgICAgICAgICAgICAgICcgJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzYW5pdGl6ZWRJbnB1dCAhPT0gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShzYW5pdGl6ZWRJbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3Vyc29yRm9yU2FuaXRpemVkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q3Vyc29yRm9yU2FuaXRpemVkSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGltZW91dENsZWFuZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RDdXJzb3JTcGFjZVBvc2l0aW9uIC0gMSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RDdXJzb3JTcGFjZVBvc2l0aW9uIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVMZWFkaW5nWmVybygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLnJlbW92ZUxlYWRpbmdaZXJvKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKCcnLCB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLm5lZ2F0aXZlTGVhZGluZ1plcm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc05lZ2F0aXZlID0gY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFydCBhZnRlciB0aGUgbmVnYXRpdmUgc2lnblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJQYXJ0ID0gY3VycmVudFZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyB6ZXJvc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZE51bWJlciA9IG51bWJlclBhcnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIC9eMCsoPz1cXGQpLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBgLSR7dHJhbnNmb3JtZWROdW1iZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUucmVwbGFjZSgvXjArKD89XFxkKS8sICcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLnJlcGxhY2UoL14wKyg/ISQpLywgJycpLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlQmFzZShvYmo6IElucHV0Q2hhbmdlVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2VJbnB1dC5uZXh0KG9iaik7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gb2JqO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYXBpdGFsaXplV29yZHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdvcmRzID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWQgPSB3b3Jkcy5tYXAoKHdvcmQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKGNhcGl0YWxpemVkLmpvaW4oJyAnKSwge1xuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FsbFplcm9zKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5ldmVyeSgoY2hhcikgPT4gY2hhciA9PT0gJzAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25CbHVyQmFzZShldmVudD86IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gRHJvcERvd24gTGFiZWxcblxuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCAmJiAhdGhpcy5pc0VkaXRJbnB1dClcbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLnBsYWNlaG9sZGVySWNvbiA9IElucHV0U3ZnUm91dGVzLmR5bmFtaWNMYWJlbFN2ZztcblxuICAgICAgICAvLyBFZGl0IElucHV0XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdElucHV0KSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGF0ZXBpY2tlcjtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEJsdXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhbmtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubmFtZSA9PT1cbiAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uSU5QVVRfRFJPUERPV05fQkFOS19OQU1FXG4gICAgICAgIClcbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmJsYWNrSW5wdXQgPSBmYWxzZTtcblxuICAgICAgICAvLyBQcmljZSBTZXBhcmF0b3IgLSByZW1vdmUgZG90IG9uIGZvY3VzIG91dFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvciAmJlxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUgJiZcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlPy50b1N0cmluZygpLmluZGV4T2YoJy4nKSA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gNC4xLiBDaGVjayBmb3IgRG90IHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAuaW5kZXhPZignLicpO1xuXG4gICAgICAgICAgICBsZXQgaW50ZWdlclBhcnQgPSB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuaGFzRGVjaW1hbEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5faW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3JMaW1pdGF0aW9uKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggKyAxXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyA0LjQuIEdldCBvbmx5IHR3byBudW1iZXJzIG9mIGRlY2ltYWwgcGFydFxuICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zbGljZSgwLCAyKTtcblxuICAgICAgICAgICAgaWYgKCFkZWNpbWFsUGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVjaW1hbEluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShpbnRlZ2VyUGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5udW1iZXJPZlBvaW50cyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEcm9wZG93blxuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuaXNEcm9wZG93biB8fCB0aGlzLl9pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJPbkRyb3BEb3duQXJyb3coKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3JtYWwsIHdpdGhvdXQgZHJvcGRvd25cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gSW5wdXQgQ29tbWFuZHNcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcykgdGhpcy5ibHVyT25Db21tYW5kcygpO1xuXG4gICAgICAgICAgICAvLyBQYXNzd29yZFxuICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLnR5cGUgPT09ICdwYXNzd29yZCcpIHRoaXMuYmx1ck9uUGFzc3dvcmQoKTtcbiAgICAgICAgICAgIC8vIE5vcm1hbCBmb2N1cyBvdXRcbiAgICAgICAgICAgIGVsc2UgdGhpcy5pc0ZvY3VzSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Qmx1cklucHV0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXNUb3VjaGVkSW5wdXQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmx1ck9uRHJvcERvd25BcnJvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVG9nZ2xlciA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVG9nZ2xlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0hpZGVEcm9wZG93bi5uZXh0KHRoaXMuaXNEcm9wZG93blRvZ2dsZXIpO1xuICAgICAgICB9LCAxNTApO1xuICAgIH1cblxuICAgIHB1YmxpYyBibHVyT25QYXNzd29yZCgpIHtcbiAgICAgICAgdGhpcy5wYXNzd29yZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICBjaGFyQ29kZTogc3RyaW5nLFxuICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICApOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4obmFtZSlcbiAgICAgICAgICAgID8udGVzdChjaGFyQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gRk9DVVMgSU5QVVQgRlVOQ1RJT05cbiAgICBwdWJsaWMgb25LZXlwcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgICAgICAgY29uc3QgbG93ZXJDYXNlTmFtZSA9IHRoaXMuX2lucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKTtcblxuICAgICAgICAvLyBEaXNhYmxlIGZpcnN0IGNoYXJhY3RlciB0byBiZSBzcGFjZVxuICAgICAgICBpZiAoIXRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSAmJiAvXlxccyokLy50ZXN0KGNoYXJDb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlLFxuICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUFJJQ0VfU0VQQVJBVE9SXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZT8ubGVuZ3RoID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5QcmljZVNlcGFyYXRvckxpbWl0ICYmXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgIT09IDQ2XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIERpc2FibGUgbXVsdGlwbGUgZG90c1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgaW5kZXggb2YgZG90XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCA9IHZhbHVlVG9TdHJpbmc/LmluZGV4T2YoJy4nKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlY2ltYWxJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIERpdmlkZSBudW1iZXIgb24gZGVjaW1hbCBhbmQgaW50ZWdlciBwYXJ0XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVjaW1hbEluZGV4XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlZ2VyUGFydCkgaW50ZWdlclBhcnQgPSAnMCc7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCArIDFcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyAyLiBEaXNhYmxlIG1vcmUgdGhhbiB0d28gZGVjaW1hbHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyAzLiBHZXQgb25seSB0d28gbnVtYmVycyBvZiBkZWNpbWFsIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zbGljZSgwLCAyKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIDQuIFNldCBmb3JtYXR0ZWQgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydCArICcuJyArIGRlY2ltYWxQYXJ0XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDUxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBJbnB1dENvbnN0YW50cy5idXNpbmVzc05hbWVzQXJyYXksXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uQlVTSU5FU1NfTkFNRSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KElucHV0Q29uc3RhbnRzLnF0eUFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgLy8gT25seSBudW1iZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLlFUWSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkVNQUlMXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRU1BSUwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVBvaW50cyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5JTlZPSUNFXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uSU5WT0lDRSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkFERFJFU1NdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKC9eW0EtWmEtejAtOVxccy4mLyxfLV0qJC8/LnRlc3QoY2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy5hZGRyZXNzVW5pdEFycmF5LCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uQUREUkVTU19VTklUKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uRklSU1RfTkFNRV0sIGxvd2VyQ2FzZU5hbWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLkZJUlNUX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkxBU1RfTkFNRV0sIGxvd2VyQ2FzZU5hbWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLkxBU1RfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5CQU5LX05BTUVdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5CQU5LX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy52aW5OdW1iZXJBcnJheSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uVklOX05VTUJFUikpXG4gICAgICAgICAgICAgICAgcmV0dXJuICEvXltJaU9RXSokLz8udGVzdChjaGFyQ29kZSk7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KFxuICAgICAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uVFJVQ0tfVFJBSUxFUl9NT0RFTF0sXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlRSVUNLX1RSQUlMRVJfTU9ERUxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5ZRUFSXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICgvXjAqJC8udGVzdChjaGFyQ29kZSkgJiYgIXRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLllFQVIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkxJQ0VOU0VfUExBVEVdLCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uTElDRU5TRV9QTEFURSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkRFU0NSSVBUSU9OXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uREVTQ1JJUFRJT04pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5BTExPV19BTExdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKC8uKi8/LnRlc3QoY2hhckNvZGUpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uREJBX05BTUVdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5EQkFfTkFNRSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLlBFUl9NSUxFXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uUEVSX01JTEUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG1heCBsZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJy4nKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubWF4TGVuZ3RoID0gNDtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuX2lucHV0Q29uZmlnLm1heExlbmd0aCA9IDI7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlID4gdGhpcy5faW5wdXRDb25maWcubWF4ISB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSA8IHRoaXMuX2lucHV0Q29uZmlnLm1pbiFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoSW5wdXRDb25zdGFudHMucGVyU3RvcEFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5QRVJfU1RPUCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXRDbGVhbmVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBlclN0b3BWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUucmVwbGFjZSgvLC9nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyU3RvcFZhbHVlID4gdGhpcy5faW5wdXRDb25maWcubWF4ISB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlclN0b3BWYWx1ZSA8IHRoaXMuX2lucHV0Q29uZmlnLm1pbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBJbnB1dENvbnN0YW50cy5lbWVyZ2VuY3lOYW1lQXJyYXksXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRU1FUkdFTkNZX05BTUUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uRU1FUkdFTkNZX05BTUVdLCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRU1FUkdFTkNZX05BTUUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkZVTExfQ09OVEFDVF9OQU1FXSxcbiAgICAgICAgICAgICAgICBsb3dlckNhc2VOYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlLFxuICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uRlVMTF9DT05UQUNUX05BTUVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkZVRUxfU1RPUkVdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5GVUVMX1NUT1JFKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uSE9TXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5pbnB1dFNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5IT1MpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSAqIDEwICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNoYXJDb2RlIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIDQ4IDw9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm1heCFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy5wYXJraW5nU2xvdEFycmF5LCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkZVTExfUEFSS0lOR19TTE9UXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkNETF9OVU1CRVJdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5DRExfTlVNQkVSKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGwgU2ltYm9sc1xuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy51c2VybmFtZUFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5VU0VSTkFNRSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uRlVMTF9OQU1FXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRlVMTF9OQU1FKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aXBsZVBvaW50cyhldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLlRPTExfVkFMSURBVElPTl0sXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlRPTExfVkFMSURBVElPTlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSnVzdCBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KElucHV0Q29uc3RhbnRzLnByZWZpeEFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5QUkVGSVgpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRV0sIGxvd2VyQ2FzZU5hbWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KElucHV0Q29uc3RhbnRzLnByb2R1Y2VyTmFtZUFycmF5LCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uUFJPRFVDRVJfTkFNRSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KFxuICAgICAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uSU5QVVRfRFJPUERPV05fTEFCRUxdLFxuICAgICAgICAgICAgICAgIGxvd2VyQ2FzZU5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnNlY3V0aXZlbHlQb2ludHMoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyAjcmVnaW9uIG9uRm9jdXNcbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudD86IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c0lucHV0RXZlbnQuZW1pdChldmVudCk7XG4gICAgICAgIC8vIERyb3BEb3duIExhYmVsXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wbGFjZWhvbGRlckljb24gPVxuICAgICAgICAgICAgICAgIElucHV0U3ZnUm91dGVzLmR5bmFtaWNGb2N1c0xhYmVsU3ZnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJvcGRvd25cbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLmlzRHJvcGRvd24pIHtcbiAgICAgICAgICAgIHRoaXMuaXNEcm9wZG93blRvZ2dsZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93SGlkZURyb3Bkb3duLm5leHQodGhpcy5pc0Ryb3Bkb3duVG9nZ2xlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21tYW5kc1xuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMgJiYgIXRoaXMuX2lucHV0Q29uZmlnLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcy50eXBlID09PSBJbnB1dENvbW1hbmRzVHlwZS5NT05USFMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0Q29uZmlnLmJsdWVJbnB1dClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbW1hbmRzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmNvbW1hbmRzLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgIElucHV0Q29tbWFuZHNUeXBlLlBNX0lOQ1JFTUVOVF9ERUNSRU1FTlQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcy50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICBJbnB1dENvbW1hbmRzVHlwZS5JTkNSRU1FTlRfREVDUkVNRU5UXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5ibGFja0lucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbW1hbmRzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBvbktleURvd25cbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5pc0NhcHNMb2NrT24gPSBldmVudD8uZ2V0TW9kaWZpZXJTdGF0ZT8uKCdDYXBzTG9jaycpO1xuXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNEb3REZWxldGVkID0gdmFsdWVUb1N0cmluZz8uaW5jbHVkZXMoJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgZm9yIHBob25lIGZpZWxkIGZpcnN0IGNoYXJhY3RlciB0byBiZSAwXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IElucHV0U3RyaW5nRW51bS5QSE9ORSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuc2VsZWN0aW9uU3RhcnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICBldmVudC5rZXkgPT09ICcwJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbi5uZXh0KHtcbiAgICAgICAgICAgICAgICBrZXlDb2RlOiBldmVudC5rZXlDb2RlLFxuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIG9uS2V5VXBcbiAgICBwdWJsaWMgb25LZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNDYXBzTG9ja09uID0gZXZlbnQ/LmdldE1vZGlmaWVyU3RhdGU/LignQ2Fwc0xvY2snKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNldCBmdW5jdGlvbiBwcm9wZXJ0eSBmb3IgZGlzYWJsaW5nIG11bHRpcGxlIGRvdHNcbiAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEb3REZWxldGVkICYmICF2YWx1ZVRvU3RyaW5nPy5pbmNsdWRlcygnLicpKVxuICAgICAgICAgICAgdGhpcy5udW1iZXJPZlBvaW50cyA9IDA7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PSA4ICYmXG4gICAgICAgICAgICAhKHRoaXMuX2lucHV0Q29uZmlnLmlzRHJvcGRvd24gfHwgdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXNldCBNdWx0aXBsZSBDb25zZWN1dGl2ZWx5IFNwYWNlc1xuICAgICAgICAgICAgdGhpcy5udW1iZXJPZkNvbnNlY3V0aXZlbHlTcGFjZXMgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXNldCBPbmUgU3BhY2UgT25seVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlPy5pbmNsdWRlcygnICcpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uZVNwYWNlT25seUNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuaXNEcm9wZG93biB8fFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCB8fFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5BRERSRVNTXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDQwIHx8IGV2ZW50LmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcm9wRG93bktleU5hdmlnYXRpb24ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIGtleUNvZGU6IGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbi5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5faW5wdXRDb25maWcsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uQUREUkVTU1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tbWFuZHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQmx1ckJhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJsdXJPbkRyb3BEb3duQXJyb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RHJvcERvd25LZXlOYXZpZ2F0aW9uLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBrZXlDb2RlOiBldmVudC5rZXlDb2RlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbi5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ29uZmlybUNhbmNlbChhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzQWN0aW9uLkNPTkZJUk06XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtQ29tbWFuZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbENvbW1hbmQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWxOZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMhLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5ibGFja0lucHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNFZGl0SW5wdXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1Zpc2libGVDb21tYW5kcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuY2VsQ29tbWFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDb21tYW5kRXZlbnQubmV4dCh7IGFjdGlvbjogSW5wdXRDb21tYW5kc0FjdGlvbi5DQU5DRUwgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtQ29tbWFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDb21tYW5kRXZlbnQubmV4dCh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogSW5wdXRDb21tYW5kc0FjdGlvbi5DT05GSVJNLFxuICAgICAgICAgICAgbW9kZTpcbiAgICAgICAgICAgICAgICAhdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbE5ldyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm5hbWUgIT09ICdJbnB1dCBEcm9wZG93biBCYW5rIE5hbWUnXG4gICAgICAgICAgICAgICAgICAgID8gJ2VkaXQnXG4gICAgICAgICAgICAgICAgICAgIDogJ25ldycsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIENsZWFySW5wdXRcbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIC8vIENsZWFyIHdob2xlIGlucHV0XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5yZW1vdmVJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDbGVhcklucHV0RXZlbnQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmNvcnJlY3QgSW5wdXRcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLmluY29ycmVjdElucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdFZhbHVlID0gIXRoaXMuaW5jb3JyZWN0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldEluY29ycmVjdElucHV0Lm5leHQodGhpcy5pbmNvcnJlY3RWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmF0aXZlIGNsZWFyXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldFZhbHVlKG51bGwsIHtcbiAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVNwYWNlcyA9IDA7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVBvaW50cyA9IDA7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mUG9pbnRzID0gMDtcbiAgICAgICAgICAgIHRoaXMub25lU3BhY2VPbmx5Q291bnRlciA9IDA7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5kcm9wZG93bkltYWdlSW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmlzVG91Y2hlZElucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q2xlYXJJbnB1dEV2ZW50Lm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBPbkNvbW1hbmRzXG4gICAgcHVibGljIG9uQ29tbWFuZHMoZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQsIHR5cGUsIGFjdGlvbiB9ID0gZTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNUeXBlLlBNX0lOQ1JFTUVOVF9ERUNSRU1FTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQbUluY3JlbWVudERlY3JlbWVudChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzVHlwZS5JTkNSRU1FTlRfREVDUkVNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jcmVtZW50RGVjcmVtZW50KGFjdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNUeXBlLkNPTkZJUk1fQ0FOQ0VMOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uZmlybUNhbmNlbChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzVHlwZS5NT05USFM6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNb250aHMoYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBvbkVkaXRJbnB1dFxuICAgIHB1YmxpYyBvbkVkaXRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5pc0VkaXRJbnB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWxOZXcgPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dENvbmZpZy5ibHVlSW5wdXQpIHRoaXMuX2lucHV0Q29uZmlnLmJsYWNrSW5wdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcyEuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1Zpc2libGVDb21tYW5kcyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnNldElucHV0Q3Vyc29yQXRUaGVFbmQodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy5zZXRDb21tYW5kRXZlbnQubmV4dCh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0VkaXQgSW5wdXQnLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBUb2dnbGVEcm9wZG93bk9wdGlvbnNcbiAgICBwdWJsaWMgdG9nZ2xlRHJvcGRvd25PcHRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhhbmRsZVRvZ2dsZURyb3Bkb3duT3B0aW9ucy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRHJvcGRvd25Ub2dnbGVyID0gIXRoaXMuaXNEcm9wZG93blRvZ2dsZXI7XG5cbiAgICAgICAgdGhpcy5zZXRTaG93SGlkZURyb3Bkb3duLm5leHQodGhpcy5pc0Ryb3Bkb3duVG9nZ2xlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blRvZ2dsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gb25QbGFjZWhvbGRlckljb25ldmVudFxuICAgIHB1YmxpYyBvblBsYWNlaG9sZGVySWNvbkV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0SW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tbWFuZEV2ZW50Lm5leHQoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ1RvZ2dsZSBEcm9wZG93bicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tbWFuZEV2ZW50Lm5leHQoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ1BsYWNlaG9sZGVyIEljb24gRXZlbnQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBTZWxlY3Rpb25DaGFuZ2VcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHRoaXMuaW5wdXRTZWxlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIHNldFNlbGVjdGlvblxuXG4gICAgLy8gI3JlZ2lvbiBBdXRvRm9jdXNGaXJzdElucHV0XG5cbiAgICBwdWJsaWMgYXV0b0ZvY3VzRmlyc3RJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLmF1dG9Gb2N1cyAmJiAhdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZW91dENsZWFuZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuYXV0b0ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAzMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgcHVibGljIG9uUG9wb3ZlclNob3duKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2lucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWwpIHtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblBvcG92ZXJIaWRkZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCkge1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Q29uZmlnQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyBQcmljZSBTZXBhcmF0b3JcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpblByaWNlU2VwYXJhdG9yTGltaXQgPVxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yTGltaXRhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEN1c3RvbSBSYW5nZVxuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuaXNVc2luZ0N1c3RvbVBlcmlvZFJhbmdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuaXNEaXNwbGF5aW5nQ3VzdG9tUGVyaW9kUmFuZ2UpXG4gICAgICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmlzRm9jdXNJbnB1dCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiBhZGQgbW9kZSBpbiBkcm9wZG93blxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcz8uYWN0aXZlICYmXG4gICAgICAgICAgICAhdGhpcy5faW5wdXRDb25maWcuaXNEaXNhYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcy50eXBlID09PSAnY29uZmlybS1jYW5jZWwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnB1dENvbmZpZy5ibHVlSW5wdXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmJsYWNrSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tbWFuZHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|