@sumaris-net/ngx-components 18.2.28-alpha1 → 18.2.28-alpha3

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.
@@ -0,0 +1,607 @@
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Inject, Input, numberAttribute, Optional, Output, ViewChild, } from '@angular/core';
2
+ import { FormControl, NG_VALUE_ACCESSOR, Validators, } from '@angular/forms';
3
+ import { MAT_FORM_FIELD_DEFAULT_OPTIONS, } from '@angular/material/form-field';
4
+ import { merge, Subscription } from 'rxjs';
5
+ import { filter } from 'rxjs/operators';
6
+ import { isNil, isNilOrBlank, isNotNil } from '../../functions';
7
+ import { isMobile } from '../../platforms';
8
+ import { SharedValidators } from '../../validator/validators';
9
+ import { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';
10
+ import { computeDecimalDegrees, LAT_LONG_PATTERN_MAX_DECIMALS, LAT_LONG_VALUE_MAX_DECIMALS, splitNumberToFieldsDD, splitNumberToFieldsDDMM, splitNumberToFieldsDDMMSS, } from './latlong.utils';
11
+ import { MatSelect } from '@angular/material/select';
12
+ import { selectInputContent } from '../../inputs';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/forms";
15
+ import * as i2 from "@angular/common";
16
+ import * as i3 from "@ionic/angular";
17
+ import * as i4 from "../../directives/autofocus.directive";
18
+ import * as i5 from "@angular/material/form-field";
19
+ import * as i6 from "@angular/material/input";
20
+ import * as i7 from "@angular/material/button";
21
+ import * as i8 from "@angular/material/icon";
22
+ import * as i9 from "@angular/material/select";
23
+ import * as i10 from "@angular/material/core";
24
+ import * as i11 from "../../pipes/latlong-format.pipe";
25
+ import * as i12 from "../../pipes/arrays.pipe";
26
+ import * as i13 from "../../pipes/maps.pipe";
27
+ import * as i14 from "../../pipes/string.pipes";
28
+ import * as i15 from "../../pipes/types.pipes";
29
+ import * as i16 from "@ngx-translate/core";
30
+ const noop = () => { };
31
+ export class MatLatLongField2 {
32
+ cd;
33
+ formGroupDir;
34
+ _onChangeCallback = noop;
35
+ _onTouchedCallback = noop;
36
+ _subscription = new Subscription();
37
+ _disabling = false;
38
+ _writing = false;
39
+ _appearance = null;
40
+ _subscriptSizing = null;
41
+ _readonly = false;
42
+ _tabindex;
43
+ _defaultAppearance;
44
+ _defaultSubscriptSizing;
45
+ _focused = false;
46
+ _touched = false;
47
+ degreesControl;
48
+ minutesControl;
49
+ secondsControl;
50
+ signControl;
51
+ showMinutes = false;
52
+ showSeconds = false;
53
+ showSignControl;
54
+ degreesPlaceholder;
55
+ minutesPlaceholder;
56
+ secondsPlaceholder;
57
+ patternMaxDecimals = LAT_LONG_PATTERN_MAX_DECIMALS;
58
+ i18nErrorKeys = SharedValidators.I18N_ERROR_KEYS;
59
+ minMaxValues;
60
+ formControl;
61
+ formControlName;
62
+ type;
63
+ pattern;
64
+ maxDecimals = LAT_LONG_VALUE_MAX_DECIMALS;
65
+ required = false;
66
+ floatLabel = 'auto';
67
+ placeholder;
68
+ defaultSign;
69
+ autofocus = false;
70
+ mobile;
71
+ degreesSymbolUnit = '°';
72
+ minutesSymbolUnit = "'";
73
+ secondsSymbolUnit = '"';
74
+ clearable = false;
75
+ set tabindex(value) {
76
+ if (this._tabindex !== value) {
77
+ this._tabindex = value;
78
+ setTimeout(() => this.updateTabIndex());
79
+ }
80
+ }
81
+ get tabindex() {
82
+ return this._tabindex;
83
+ }
84
+ set appearance(value) {
85
+ this._appearance = value;
86
+ }
87
+ get appearance() {
88
+ return this._appearance || this._defaultAppearance;
89
+ }
90
+ set readonly(value) {
91
+ this._readonly = value;
92
+ this.markForCheck();
93
+ }
94
+ get readonly() {
95
+ return this._readonly;
96
+ }
97
+ set subscriptSizing(value) {
98
+ this._subscriptSizing = value;
99
+ }
100
+ get subscriptSizing() {
101
+ return this._subscriptSizing || this._defaultSubscriptSizing;
102
+ }
103
+ get showFields() {
104
+ return isNotNil(this.formControl.value) || this._focused;
105
+ }
106
+ get disabled() {
107
+ return this.readonly || this.formControl.disabled;
108
+ }
109
+ // eslint-disable-next-line @angular-eslint/no-output-on-prefix,@angular-eslint/no-output-rename
110
+ keyupEnter = new EventEmitter();
111
+ // eslint-disable-next-line @angular-eslint/no-output-rename
112
+ blurred = new EventEmitter();
113
+ // eslint-disable-next-line @angular-eslint/no-output-rename
114
+ focused = new EventEmitter();
115
+ formField;
116
+ fakeInput;
117
+ inputDegrees;
118
+ inputMinutes;
119
+ inputSeconds;
120
+ inputSign;
121
+ inputSignSelect;
122
+ constructor(cd, formGroupDir, defaultOptions) {
123
+ this.cd = cd;
124
+ this.formGroupDir = formGroupDir;
125
+ this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;
126
+ this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;
127
+ }
128
+ ngOnInit() {
129
+ this.mobile = this.mobile ?? isMobile(window);
130
+ this.type = this.type || 'latitude';
131
+ this.pattern = this.pattern || 'DDMM';
132
+ this.showSignControl = this.pattern !== 'DD';
133
+ const degreesValidators = [this.type === 'latitude' ? SharedValidators.latitude : SharedValidators.longitude];
134
+ const minutesValidators = [];
135
+ const secondsValidators = [];
136
+ this.minMaxValues = {};
137
+ switch (this.pattern) {
138
+ case 'DD':
139
+ this.patternMaxDecimals = 7;
140
+ degreesValidators.push(SharedValidators.decimal({ maxDecimals: this.patternMaxDecimals }));
141
+ this.degreesPlaceholder =
142
+ this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD_PLACEHOLDER' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD_PLACEHOLDER';
143
+ break;
144
+ case 'DDMM':
145
+ this.patternMaxDecimals = 3;
146
+ this.showMinutes = true;
147
+ this.minMaxValues.minutes = {
148
+ min: 0,
149
+ max: 60 - this.computeDecimalPart(1, this.patternMaxDecimals),
150
+ step: this.computeDecimalPart(1, this.patternMaxDecimals),
151
+ };
152
+ degreesValidators.push(SharedValidators.integer);
153
+ minutesValidators.push(Validators.min(this.minMaxValues.minutes.min));
154
+ minutesValidators.push(Validators.max(this.minMaxValues.minutes.max));
155
+ minutesValidators.push(SharedValidators.decimal({ maxDecimals: this.patternMaxDecimals }));
156
+ this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD';
157
+ this.minutesPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.MM';
158
+ break;
159
+ default: // Default is DDMMSS
160
+ this.patternMaxDecimals = 2;
161
+ this.showMinutes = true;
162
+ this.showSeconds = true;
163
+ this.minMaxValues.minutes = {
164
+ min: 0,
165
+ max: 59,
166
+ step: 1,
167
+ };
168
+ this.minMaxValues.seconds = {
169
+ min: 0,
170
+ max: 60 - this.computeDecimalPart(1, this.patternMaxDecimals),
171
+ step: this.computeDecimalPart(1, this.patternMaxDecimals),
172
+ };
173
+ degreesValidators.push(SharedValidators.integer);
174
+ minutesValidators.push(SharedValidators.integer);
175
+ minutesValidators.push(Validators.min(this.minMaxValues.minutes.min));
176
+ minutesValidators.push(Validators.max(this.minMaxValues.minutes.max));
177
+ secondsValidators.push(Validators.min(this.minMaxValues.seconds.min));
178
+ secondsValidators.push(Validators.max(this.minMaxValues.seconds.max));
179
+ secondsValidators.push(SharedValidators.decimal({ maxDecimals: this.patternMaxDecimals }));
180
+ this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD';
181
+ this.minutesPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.MM';
182
+ this.secondsPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.SS_SS';
183
+ break;
184
+ }
185
+ // Must be done after set this.maxDecimals in switch block above
186
+ this.minMaxValues.degrees = {
187
+ min: this.pattern === 'DD' ? (this.type === 'latitude' ? -90 : -180) : 0,
188
+ max: this.type === 'latitude' ? 90 : 180,
189
+ step: this.pattern === 'DD' ? this.computeDecimalPart(1, this.patternMaxDecimals) : 1,
190
+ };
191
+ this.formControl =
192
+ this.formControl || (this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName));
193
+ if (!this.formControl)
194
+ throw new Error("Missing mandatory attribute 'formControl' or 'formControlName' in <mat-latlong-field>.");
195
+ this.degreesControl = new FormControl(null, degreesValidators);
196
+ this.minutesControl = new FormControl(null, minutesValidators);
197
+ this.secondsControl = new FormControl(null, secondsValidators);
198
+ this.signControl = new FormControl(null);
199
+ this._subscription.add(merge(this.degreesControl.valueChanges, this.minutesControl.valueChanges, this.secondsControl.valueChanges, this.signControl.valueChanges).subscribe((_) => this.onFormChange()));
200
+ // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
201
+ this._subscription.add(this.formControl.statusChanges
202
+ .pipe(filter(() => !this.readonly && !this._writing && !this._disabling) // Skip
203
+ )
204
+ .subscribe(() => this.markForCheck()));
205
+ }
206
+ ngOnDestroy() {
207
+ this._subscription.unsubscribe();
208
+ }
209
+ registerOnChange(fn) {
210
+ this._onChangeCallback = fn;
211
+ }
212
+ registerOnTouched(fn) {
213
+ this._onTouchedCallback = fn;
214
+ }
215
+ writeValue(value) {
216
+ if (this._writing)
217
+ return;
218
+ this._writing = true;
219
+ if (value !== this.formControl.value) {
220
+ this.formControl.patchValue(value, { emitEvent: false });
221
+ this._onChangeCallback(value);
222
+ }
223
+ const result = this.computeLatLongFormGroupValue(value);
224
+ console.debug('[mat-latlong-field] Changing value of inputs:', value, result);
225
+ this.patchValue(result, { emitEvent: false });
226
+ this._writing = false;
227
+ this.markForCheck();
228
+ setTimeout(() => {
229
+ this.updateFakeInput();
230
+ this.updateTabIndex();
231
+ });
232
+ }
233
+ setDisabledState(isDisabled) {
234
+ if (this._disabling)
235
+ return;
236
+ this._disabling = true;
237
+ if (isDisabled) {
238
+ this.degreesControl.disable();
239
+ this.minutesControl.disable();
240
+ this.secondsControl.disable();
241
+ this.signControl.disable();
242
+ }
243
+ else {
244
+ this.degreesControl.enable();
245
+ this.minutesControl.enable();
246
+ this.secondsControl.enable();
247
+ this.signControl.enable();
248
+ }
249
+ this._disabling = false;
250
+ this.markForCheck();
251
+ }
252
+ clearValue(event) {
253
+ event?.stopPropagation();
254
+ this.writeValue(null);
255
+ }
256
+ get internalElements() {
257
+ return (this.inputDegrees ? [this.inputDegrees.nativeElement] : [])
258
+ .concat(this.inputMinutes ? [this.inputMinutes.nativeElement] : [])
259
+ .concat(this.inputSeconds ? [this.inputSeconds.nativeElement] : [])
260
+ .concat(this.inputSign ? [this.inputSign.nativeElement] : [])
261
+ .concat(this.fakeInput ? [this.fakeInput.nativeElement] : []);
262
+ }
263
+ onFocusFakeInput(event) {
264
+ if (!this.showFields) {
265
+ event.preventDefault();
266
+ // Hide the fake input
267
+ this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');
268
+ }
269
+ this._touched = this.formControl.touched;
270
+ // Focus on first input
271
+ this.focus();
272
+ }
273
+ onBlurFakeInput(event) {
274
+ const internalEvent = this.internalElements.some((el) => el === event.relatedTarget);
275
+ if (internalEvent && !this._touched) {
276
+ // Workaround to remove touched on the fakeInput
277
+ this.formControl.markAsUntouched();
278
+ }
279
+ }
280
+ _onFocusInput(event) {
281
+ const internalEvent = this.internalElements.some((el) => el === event.target);
282
+ if (internalEvent) {
283
+ if (event.target === this.inputSign?.nativeElement) {
284
+ this.inputSignSelect?.open();
285
+ }
286
+ else {
287
+ this.selectInput(event.target);
288
+ }
289
+ }
290
+ this.focus(event.target);
291
+ }
292
+ _onBlurInput(event) {
293
+ const internalEvent = this.internalElements.some((el) => el === event.relatedTarget);
294
+ if (!internalEvent) {
295
+ this._focused = false;
296
+ if (this.appearance == 'fill') {
297
+ this.formField._lineRipple.deactivate();
298
+ }
299
+ this.blurred.emit(event);
300
+ this.updateFakeInput();
301
+ this.updateTabIndex();
302
+ this._touched = true;
303
+ this.formControl.markAsTouched();
304
+ this._checkIfTouched();
305
+ }
306
+ }
307
+ _onClickInput(event) {
308
+ const internalEvent = this.internalElements.some((el) => el === event.target);
309
+ if (internalEvent) {
310
+ this.selectInput(event.target);
311
+ }
312
+ // Avoid mat-form-field to give focus to fake input
313
+ event.stopPropagation();
314
+ }
315
+ selectInput(input) {
316
+ if (input?.type === 'number') {
317
+ input.type = 'text';
318
+ selectInputContent(input);
319
+ input.type = 'number';
320
+ }
321
+ }
322
+ focus(target) {
323
+ if (this._focused)
324
+ return true; // Already focused
325
+ const showFields = this.showFields;
326
+ this._focused = true;
327
+ this.markForCheck();
328
+ setTimeout(() => {
329
+ if (!showFields) {
330
+ this.inputDegrees.nativeElement.focus();
331
+ this.selectInput(this.inputDegrees.nativeElement);
332
+ }
333
+ else if (target) {
334
+ target.focus();
335
+ this.selectInput(target);
336
+ }
337
+ if (this.appearance == 'fill') {
338
+ this.formField._lineRipple.activate();
339
+ }
340
+ this.updateFakeInput();
341
+ this.updateTabIndex();
342
+ }, 50);
343
+ }
344
+ format(rawValue) {
345
+ const values = this.computeLatLongFormGroupValue(rawValue);
346
+ if (values.degrees === null)
347
+ return '';
348
+ let result = `${values.degrees}° `;
349
+ if (values.minutes !== null)
350
+ result += `${values.minutes}' `;
351
+ if (values.seconds !== null)
352
+ result += `${values.seconds}" `;
353
+ if (this.type === 'latitude') {
354
+ result += values.sign === 1 ? 'N' : 'S';
355
+ }
356
+ else {
357
+ result += values.sign === 1 ? 'E' : 'W';
358
+ }
359
+ return result;
360
+ }
361
+ computeDecimalPart(value, nbOfDecimals) {
362
+ return value * 10 ** (nbOfDecimals * -1);
363
+ }
364
+ computeLatLongFormGroupValue(rawValue) {
365
+ const isLongitude = this.type === 'longitude';
366
+ const value = typeof rawValue === 'string' ? parseFloat(rawValue.replace(/,/g, '.')) : rawValue;
367
+ const result = {
368
+ degrees: null,
369
+ minutes: null,
370
+ seconds: null,
371
+ sign: isNotNil(value)
372
+ ? value < 0
373
+ ? -1
374
+ : 1
375
+ : // Use default sign, if any
376
+ this.defaultSign && this.defaultSign === '-'
377
+ ? -1
378
+ : 1,
379
+ };
380
+ if (value === 0) {
381
+ result.degrees = 0;
382
+ }
383
+ else if (isNotNil(value)) {
384
+ if (this.pattern === 'DD') {
385
+ const splitValue = splitNumberToFieldsDD(value, {
386
+ longitude: isLongitude,
387
+ pattern: this.pattern,
388
+ maxDecimals: this.patternMaxDecimals,
389
+ fixLatLong: true,
390
+ }).slice(1); // remove sign;
391
+ result.degrees = (splitValue[0] + this.computeDecimalPart(splitValue[1] ?? 0, this.patternMaxDecimals)) * (result.sign || 1) || null;
392
+ }
393
+ else if (this.pattern === 'DDMM') {
394
+ const splitValue = splitNumberToFieldsDDMM(value, {
395
+ longitude: isLongitude,
396
+ pattern: this.pattern,
397
+ maxDecimals: this.patternMaxDecimals,
398
+ fixLatLong: true,
399
+ });
400
+ result['minutes'] = Math.abs((splitValue[1] ?? 0) + this.computeDecimalPart(splitValue[2] ?? 0, this.patternMaxDecimals)) || null;
401
+ result['degrees'] = Math.abs(!result['minutes'] && isNilOrBlank(splitValue[0]) ? null : (splitValue[0] ?? 0));
402
+ }
403
+ else {
404
+ // Default // DDMMSS
405
+ const splitValue = splitNumberToFieldsDDMMSS(value, {
406
+ longitude: isLongitude,
407
+ pattern: this.pattern,
408
+ maxDecimals: this.patternMaxDecimals,
409
+ fixLatLong: true,
410
+ });
411
+ result['seconds'] = Math.abs((splitValue[2] ?? 0) + this.computeDecimalPart(splitValue[3] ?? 0, this.patternMaxDecimals)) || null;
412
+ result['minutes'] = !result['seconds'] && !splitValue[1] ? null : Math.abs(splitValue[1] ?? 0);
413
+ result['degrees'] = !result['seconds'] && !result['minutes'] && isNilOrBlank(splitValue[0]) ? null : Math.abs(splitValue[0] ?? 0);
414
+ }
415
+ }
416
+ return result;
417
+ }
418
+ markAsTouched() {
419
+ this.formControl.markAsTouched();
420
+ this.degreesControl.markAsTouched();
421
+ this.minutesControl.markAsTouched();
422
+ this.secondsControl.markAsTouched();
423
+ this.signControl.markAsTouched();
424
+ this._onTouchedCallback();
425
+ }
426
+ /* -- private method -- */
427
+ patchValue(values, opts) {
428
+ this.degreesControl.patchValue(values.degrees, opts);
429
+ this.minutesControl.patchValue(values.minutes, opts);
430
+ this.secondsControl.patchValue(values.seconds, opts);
431
+ this.signControl.patchValue(values.sign, opts);
432
+ }
433
+ onFormChange() {
434
+ if (this._writing)
435
+ return; // Skip if call by self
436
+ this._writing = true;
437
+ const degrees = this.degreesControl.value;
438
+ const minutes = this.minutesControl.value;
439
+ const seconds = this.secondsControl.value;
440
+ const sign = this.signControl.value;
441
+ const incompleteValue = isNil(degrees) && (isNotNil(minutes) || isNotNil(seconds));
442
+ const invalid = incompleteValue || this.degreesControl.invalid || this.minutesControl.invalid || this.secondsControl.invalid || this.signControl.invalid;
443
+ if (invalid) {
444
+ this.formControl.markAsPending({ onlySelf: true });
445
+ this.formControl.setErrors({
446
+ invalid: incompleteValue,
447
+ ...this.degreesControl.errors,
448
+ ...this.minutesControl.errors,
449
+ ...this.secondsControl.errors,
450
+ ...this.signControl.errors,
451
+ });
452
+ if (this.degreesControl.dirty || this.minutesControl.dirty || this.secondsControl.dirty || this.signControl.dirty) {
453
+ this.formControl.markAsDirty();
454
+ }
455
+ this._writing = false;
456
+ return;
457
+ }
458
+ // Compute decimal values
459
+ const value = isNil(degrees) || this.pattern === 'DD' ? degrees : computeDecimalDegrees(degrees, minutes, seconds, sign, this.maxDecimals);
460
+ // Set model value
461
+ this.emitChange(value);
462
+ this._writing = false;
463
+ this.markForCheck();
464
+ }
465
+ emitChange(value) {
466
+ if (this.formControl.value !== value) {
467
+ this.formControl.setValue(value, { emitEvent: false });
468
+ // Changes comes from inside function: use the callback
469
+ this._onChangeCallback(value);
470
+ // Check if need to update controls
471
+ this._checkIfTouched();
472
+ }
473
+ }
474
+ _checkIfTouched() {
475
+ if (this.formControl.touched) {
476
+ this._onTouchedCallback();
477
+ this.markForCheck();
478
+ this._touched = true;
479
+ }
480
+ else {
481
+ this._touched = false;
482
+ }
483
+ }
484
+ markForCheck() {
485
+ this.cd.markForCheck();
486
+ }
487
+ /**
488
+ * Show/Hide the fake input
489
+ */
490
+ updateFakeInput() {
491
+ if (this.showFields) {
492
+ this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');
493
+ }
494
+ else {
495
+ this.fakeInput?.nativeElement.classList.remove('cdk-visually-hidden');
496
+ }
497
+ // TODO: check if need
498
+ this.markForCheck();
499
+ }
500
+ /**
501
+ * This is a special case, because, this component has a temporary component displayed before the first focus event
502
+ */
503
+ updateTabIndex() {
504
+ if (isNil(this._tabindex))
505
+ return;
506
+ if (this.fakeInput) {
507
+ this.fakeInput.nativeElement.tabIndex = this._tabindex;
508
+ }
509
+ this.markForCheck();
510
+ }
511
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongField2, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
512
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatLatLongField2, selector: "mat-latlong-field", inputs: { formControl: "formControl", formControlName: "formControlName", type: "type", pattern: ["latLongPattern", "pattern"], maxDecimals: "maxDecimals", required: "required", floatLabel: "floatLabel", placeholder: "placeholder", defaultSign: "defaultSign", autofocus: "autofocus", mobile: ["mobile", "mobile", booleanAttribute], degreesSymbolUnit: "degreesSymbolUnit", minutesSymbolUnit: "minutesSymbolUnit", secondsSymbolUnit: "secondsSymbolUnit", clearable: ["clearable", "clearable", booleanAttribute], tabindex: ["tabindex", "tabindex", numberAttribute], appearance: "appearance", readonly: "readonly", subscriptSizing: "subscriptSizing" }, outputs: { keyupEnter: "keyup.enter", blurred: "blur", focused: "focus" }, providers: [
513
+ {
514
+ provide: NG_VALUE_ACCESSOR,
515
+ multi: true,
516
+ useExisting: forwardRef(() => MatLatLongField2),
517
+ },
518
+ ], viewQueries: [{ propertyName: "formField", first: true, predicate: ["formField"], descendants: true }, { propertyName: "fakeInput", first: true, predicate: ["fakeInput"], descendants: true }, { propertyName: "inputDegrees", first: true, predicate: ["inputDegrees"], descendants: true }, { propertyName: "inputMinutes", first: true, predicate: ["inputMinutes"], descendants: true }, { propertyName: "inputSeconds", first: true, predicate: ["inputSeconds"], descendants: true }, { propertyName: "inputSign", first: true, predicate: ["inputSign"], descendants: true, read: ElementRef }, { propertyName: "inputSignSelect", first: true, predicate: ["inputSign"], descendants: true, read: MatSelect }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{\n formControl.value\n | latLongFormat: { pattern: pattern, maxDecimals: patternMaxDecimals, type: type, placeholderChar: '' }\n }}\n </ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n #formField\n [floatLabel]=\"showFields && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signControl.invalid || formControl.invalid)\"\n class=\"mat-latlong-form-field\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [appAutofocus]=\"!showFields && autofocus\"\n [class.cdk-visually-hidden]=\"showFields\"\n (focus)=\"onFocusFakeInput($event)\"\n (blur)=\"onBlurFakeInput($event)\"\n />\n <input\n matInput\n #inputDegrees\n [class.degrees]=\"pattern !== 'DD'\"\n [class.cdk-visually-hidden]=\"!showFields\"\n type=\"number\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n [formControl]=\"degreesControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"showFields && autofocus\"\n [min]=\"minMaxValues.degrees.min\"\n [max]=\"minMaxValues.degrees.max\"\n [step]=\"minMaxValues.degrees.step\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n matInput\n #inputMinutes\n class=\"minutes\"\n [class.cdk-visually-hidden]=\"!showFields\"\n type=\"number\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n [formControl]=\"minutesControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [min]=\"minMaxValues.minutes.min\"\n [max]=\"minMaxValues.minutes.max\"\n [step]=\"minMaxValues.minutes.step\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n matInput\n #inputSeconds\n class=\"seconds\"\n [class.cdk-visually-hidden]=\"!showFields\"\n type=\"number\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n [formControl]=\"secondsControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [min]=\"minMaxValues.seconds.min\"\n [max]=\"minMaxValues.seconds.max\"\n [step]=\"minMaxValues.seconds.step\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span [class.cdk-visually-hidden]=\"!showFields\" class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSignControl) {\n <span #spacer class=\"flex-spacer\"></span>\n <mat-select\n #inputSign\n [formControl]=\"signControl\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n [tabindex]=\"tabindex\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n class=\"sign\"\n >\n <mat-option [value]=\"1\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n <mat-error>\n {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n </mat-error>\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (clearable && !readonly) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"formControl.value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0}input[type=number]{text-align:right;max-height:24px}input[type=number].degrees{width:2em}input[type=number].minutes{width:3.5em}input[type=number].seconds{width:3em}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}span.symbol-unit{max-height:24px;display:inline-block;text-align:center;font-weight:700;font-size:1.3em}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i11.LatLongFormatPipe, name: "latLongFormat" }, { kind: "pipe", type: i12.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i13.MapGetPipe, name: "mapGet" }, { kind: "pipe", type: i13.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i14.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i14.IsNilPipe, name: "isNil" }, { kind: "pipe", type: i15.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i16.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
519
+ }
520
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongField2, decorators: [{
521
+ type: Component,
522
+ args: [{ selector: 'mat-latlong-field', providers: [
523
+ {
524
+ provide: NG_VALUE_ACCESSOR,
525
+ multi: true,
526
+ useExisting: forwardRef(() => MatLatLongField2),
527
+ },
528
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{\n formControl.value\n | latLongFormat: { pattern: pattern, maxDecimals: patternMaxDecimals, type: type, placeholderChar: '' }\n }}\n </ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n #formField\n [floatLabel]=\"showFields && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signControl.invalid || formControl.invalid)\"\n class=\"mat-latlong-form-field\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [appAutofocus]=\"!showFields && autofocus\"\n [class.cdk-visually-hidden]=\"showFields\"\n (focus)=\"onFocusFakeInput($event)\"\n (blur)=\"onBlurFakeInput($event)\"\n />\n <input\n matInput\n #inputDegrees\n [class.degrees]=\"pattern !== 'DD'\"\n [class.cdk-visually-hidden]=\"!showFields\"\n type=\"number\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n [formControl]=\"degreesControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"showFields && autofocus\"\n [min]=\"minMaxValues.degrees.min\"\n [max]=\"minMaxValues.degrees.max\"\n [step]=\"minMaxValues.degrees.step\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n matInput\n #inputMinutes\n class=\"minutes\"\n [class.cdk-visually-hidden]=\"!showFields\"\n type=\"number\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n [formControl]=\"minutesControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [min]=\"minMaxValues.minutes.min\"\n [max]=\"minMaxValues.minutes.max\"\n [step]=\"minMaxValues.minutes.step\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n matInput\n #inputSeconds\n class=\"seconds\"\n [class.cdk-visually-hidden]=\"!showFields\"\n type=\"number\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n [formControl]=\"secondsControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [min]=\"minMaxValues.seconds.min\"\n [max]=\"minMaxValues.seconds.max\"\n [step]=\"minMaxValues.seconds.step\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span [class.cdk-visually-hidden]=\"!showFields\" class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSignControl) {\n <span #spacer class=\"flex-spacer\"></span>\n <mat-select\n #inputSign\n [formControl]=\"signControl\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n [tabindex]=\"tabindex\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n class=\"sign\"\n >\n <mat-option [value]=\"1\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n <mat-error>\n {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n </mat-error>\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (clearable && !readonly) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"formControl.value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0}input[type=number]{text-align:right;max-height:24px}input[type=number].degrees{width:2em}input[type=number].minutes{width:3.5em}input[type=number].seconds{width:3em}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}span.symbol-unit{max-height:24px;display:inline-block;text-align:center;font-weight:700;font-size:1.3em}\n"] }]
529
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FormGroupDirective, decorators: [{
530
+ type: Optional
531
+ }] }, { type: undefined, decorators: [{
532
+ type: Inject,
533
+ args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]
534
+ }] }], propDecorators: { formControl: [{
535
+ type: Input
536
+ }], formControlName: [{
537
+ type: Input
538
+ }], type: [{
539
+ type: Input
540
+ }], pattern: [{
541
+ type: Input,
542
+ args: ['latLongPattern']
543
+ }], maxDecimals: [{
544
+ type: Input
545
+ }], required: [{
546
+ type: Input
547
+ }], floatLabel: [{
548
+ type: Input
549
+ }], placeholder: [{
550
+ type: Input
551
+ }], defaultSign: [{
552
+ type: Input
553
+ }], autofocus: [{
554
+ type: Input
555
+ }], mobile: [{
556
+ type: Input,
557
+ args: [{ transform: booleanAttribute }]
558
+ }], degreesSymbolUnit: [{
559
+ type: Input
560
+ }], minutesSymbolUnit: [{
561
+ type: Input
562
+ }], secondsSymbolUnit: [{
563
+ type: Input
564
+ }], clearable: [{
565
+ type: Input,
566
+ args: [{ transform: booleanAttribute }]
567
+ }], tabindex: [{
568
+ type: Input,
569
+ args: [{ transform: numberAttribute }]
570
+ }], appearance: [{
571
+ type: Input
572
+ }], readonly: [{
573
+ type: Input
574
+ }], subscriptSizing: [{
575
+ type: Input
576
+ }], keyupEnter: [{
577
+ type: Output,
578
+ args: ['keyup.enter']
579
+ }], blurred: [{
580
+ type: Output,
581
+ args: ['blur']
582
+ }], focused: [{
583
+ type: Output,
584
+ args: ['focus']
585
+ }], formField: [{
586
+ type: ViewChild,
587
+ args: ['formField']
588
+ }], fakeInput: [{
589
+ type: ViewChild,
590
+ args: ['fakeInput']
591
+ }], inputDegrees: [{
592
+ type: ViewChild,
593
+ args: ['inputDegrees']
594
+ }], inputMinutes: [{
595
+ type: ViewChild,
596
+ args: ['inputMinutes']
597
+ }], inputSeconds: [{
598
+ type: ViewChild,
599
+ args: ['inputSeconds']
600
+ }], inputSign: [{
601
+ type: ViewChild,
602
+ args: ['inputSign', { read: ElementRef }]
603
+ }], inputSignSelect: [{
604
+ type: ViewChild,
605
+ args: ['inputSign', { read: MatSelect }]
606
+ }] } });
607
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwubGF0bG9uZzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9sYXRsb25nL21hdGVyaWFsLmxhdGxvbmcyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvbGF0bG9uZy9tYXRlcmlhbC5sYXRsb25nMi5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFHZixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUVYLGlCQUFpQixFQUdqQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsOEJBQThCLEdBSy9CLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoSCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDZCQUE2QixFQUM3QiwyQkFBMkIsRUFHM0IscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2Qix5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QUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ2tDLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRUssUUFBUTtzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBWWpDLFVBQVU7c0JBRGIsS0FBSztnQkFTTyxRQUFRO3NCQUFwQixLQUFLO2dCQVVGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBa0JpQixVQUFVO3NCQUFoQyxNQUFNO3VCQUFDLGFBQWE7Z0JBRUwsT0FBTztzQkFBdEIsTUFBTTt1QkFBQyxNQUFNO2dCQUVHLE9BQU87c0JBQXZCLE1BQU07dUJBQUMsT0FBTztnQkFFUyxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0UsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0UsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNxQixTQUFTO3NCQUF0RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ0MsZUFBZTtzQkFBM0QsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLFxuICBNYXRGb3JtRmllbGQsXG4gIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsXG4gIE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zLFxuICBTdWJzY3JpcHRTaXppbmcsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXBwRmxvYXRMYWJlbFR5cGUgfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IGlzTmlsLCBpc05pbE9yQmxhbmssIGlzTm90TmlsIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7IFNoYXJlZFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3IvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0UsIE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORyB9IGZyb20gJy4uL21hdGVyaWFsLmNvbmZpZyc7XG5pbXBvcnQge1xuICBjb21wdXRlRGVjaW1hbERlZ3JlZXMsXG4gIExBVF9MT05HX1BBVFRFUk5fTUFYX0RFQ0lNQUxTLFxuICBMQVRfTE9OR19WQUxVRV9NQVhfREVDSU1BTFMsXG4gIExhdExvbmdQYXR0ZXJuLFxuICBMYXRMb25nVHlwZSxcbiAgc3BsaXROdW1iZXJUb0ZpZWxkc0RELFxuICBzcGxpdE51bWJlclRvRmllbGRzRERNTSxcbiAgc3BsaXROdW1iZXJUb0ZpZWxkc0RETU1TUyxcbn0gZnJvbSAnLi9sYXRsb25nLnV0aWxzJztcbmltcG9ydCB7IE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBmb2N1c1ByZXZpb3VzSW5wdXQsIHNlbGVjdElucHV0Q29udGVudCwgc2VsZWN0SW5wdXRSYW5nZSB9IGZyb20gJy4uLy4uL2lucHV0cyc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuZGVjbGFyZSB0eXBlIExhdExvbmdTaWduID0gMSB8IC0xO1xuXG5pbnRlcmZhY2UgSUxhdExvbmdEYXRhIHtcbiAgZGVncmVlczogbnVtYmVyO1xuICBtaW51dGVzOiBudW1iZXI7XG4gIHNlY29uZHM6IG51bWJlcjtcbiAgc2lnbjogTGF0TG9uZ1NpZ247XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1sYXRsb25nLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmxhdGxvbmcyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5sYXRsb25nMi5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNYXRMYXRMb25nRmllbGQyKSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0TGF0TG9uZ0ZpZWxkMiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfZGlzYWJsaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3dyaXRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9zdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZWFkb25seSA9IGZhbHNlO1xuICBwcml2YXRlIF90YWJpbmRleDogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0QXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuXG4gIHByb3RlY3RlZCBfZm9jdXNlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3RvdWNoZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGRlZ3JlZXNDb250cm9sOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICBwcm90ZWN0ZWQgbWludXRlc0NvbnRyb2w6IEZvcm1Db250cm9sPG51bWJlcj47XG4gIHByb3RlY3RlZCBzZWNvbmRzQ29udHJvbDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIHNpZ25Db250cm9sOiBGb3JtQ29udHJvbDxMYXRMb25nU2lnbj47XG4gIHByb3RlY3RlZCBzaG93TWludXRlcyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2hvd1NlY29uZHMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dTaWduQ29udHJvbDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGRlZ3JlZXNQbGFjZWhvbGRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbWludXRlc1BsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzZWNvbmRzUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHBhdHRlcm5NYXhEZWNpbWFscyA9IExBVF9MT05HX1BBVFRFUk5fTUFYX0RFQ0lNQUxTO1xuICBwcm90ZWN0ZWQgaTE4bkVycm9yS2V5cyA9IFNoYXJlZFZhbGlkYXRvcnMuSTE4Tl9FUlJPUl9LRVlTO1xuICBwcm90ZWN0ZWQgbWluTWF4VmFsdWVzOiB7XG4gICAgZGVncmVlcz86IHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyOyBzdGVwOiBudW1iZXIgfTtcbiAgICBtaW51dGVzPzogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXI7IHN0ZXA6IG51bWJlciB9O1xuICAgIHNlY29uZHM/OiB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlcjsgc3RlcDogbnVtYmVyIH07XG4gIH07XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHR5cGU6IExhdExvbmdUeXBlO1xuICBASW5wdXQoJ2xhdExvbmdQYXR0ZXJuJykgcGF0dGVybjogTGF0TG9uZ1BhdHRlcm47XG4gIEBJbnB1dCgpIG1heERlY2ltYWxzOiBudW1iZXIgPSBMQVRfTE9OR19WQUxVRV9NQVhfREVDSU1BTFM7XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U2lnbjogJy0nIHwgJysnO1xuICBASW5wdXQoKSBhdXRvZm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVncmVlc1N5bWJvbFVuaXQgPSAnwrAnO1xuICBASW5wdXQoKSBtaW51dGVzU3ltYm9sVW5pdCA9IFwiJ1wiO1xuICBASW5wdXQoKSBzZWNvbmRzU3ltYm9sVW5pdCA9ICdcIic7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhcmFibGUgPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl90YWJpbmRleCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlVGFiSW5kZXgoKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmluZGV4O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICB0aGlzLl9hcHBlYXJhbmNlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgYXBwZWFyYW5jZSgpOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwZWFyYW5jZSB8fCB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc3Vic2NyaXB0U2l6aW5nKHZhbHVlOiBTdWJzY3JpcHRTaXppbmcpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRTaXppbmcgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzdWJzY3JpcHRTaXppbmcoKTogU3Vic2NyaXB0U2l6aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0U2l6aW5nIHx8IHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc7XG4gIH1cblxuICBnZXQgc2hvd0ZpZWxkcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOb3ROaWwodGhpcy5mb3JtQ29udHJvbC52YWx1ZSkgfHwgdGhpcy5fZm9jdXNlZDtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQ7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXgsQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgQE91dHB1dCgna2V5dXAuZW50ZXInKSBrZXl1cEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBAT3V0cHV0KCdibHVyJykgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ2ZvY3VzJykgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcblxuICBAVmlld0NoaWxkKCdmb3JtRmllbGQnKSBmb3JtRmllbGQ6IE1hdEZvcm1GaWVsZDtcbiAgQFZpZXdDaGlsZCgnZmFrZUlucHV0JykgZmFrZUlucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdpbnB1dERlZ3JlZXMnKSBpbnB1dERlZ3JlZXM6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2lucHV0TWludXRlcycpIGlucHV0TWludXRlczogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnaW5wdXRTZWNvbmRzJykgaW5wdXRTZWNvbmRzOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdpbnB1dFNpZ24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgaW5wdXRTaWduOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdpbnB1dFNpZ24nLCB7IHJlYWQ6IE1hdFNlbGVjdCB9KSBpbnB1dFNpZ25TZWxlY3Q6IE1hdFNlbGVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBJbmplY3QoTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TKSBkZWZhdWx0T3B0aW9ucz86IE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zXG4gICkge1xuICAgIHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmcgPSBkZWZhdWx0T3B0aW9ucz8uc3Vic2NyaXB0U2l6aW5nIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORztcbiAgICB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9IGRlZmF1bHRPcHRpb25zPy5hcHBlYXJhbmNlIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gaXNNb2JpbGUod2luZG93KTtcbiAgICB0aGlzLnR5cGUgPSB0aGlzLnR5cGUgfHwgJ2xhdGl0dWRlJztcbiAgICB0aGlzLnBhdHRlcm4gPSB0aGlzLnBhdHRlcm4gfHwgJ0RETU0nO1xuICAgIHRoaXMuc2hvd1NpZ25Db250cm9sID0gdGhpcy5wYXR0ZXJuICE9PSAnREQnO1xuXG4gICAgY29uc3QgZGVncmVlc1ZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbdGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8gU2hhcmVkVmFsaWRhdG9ycy5sYXRpdHVkZSA6IFNoYXJlZFZhbGlkYXRvcnMubG9uZ2l0dWRlXTtcbiAgICBjb25zdCBtaW51dGVzVmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgIGNvbnN0IHNlY29uZHNWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XG5cbiAgICB0aGlzLm1pbk1heFZhbHVlcyA9IHt9O1xuXG4gICAgc3dpdGNoICh0aGlzLnBhdHRlcm4pIHtcbiAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgdGhpcy5wYXR0ZXJuTWF4RGVjaW1hbHMgPSA3O1xuICAgICAgICBkZWdyZWVzVmFsaWRhdG9ycy5wdXNoKFNoYXJlZFZhbGlkYXRvcnMuZGVjaW1hbCh7IG1heERlY2ltYWxzOiB0aGlzLnBhdHRlcm5NYXhEZWNpbWFscyB9KSk7XG4gICAgICAgIHRoaXMuZGVncmVlc1BsYWNlaG9sZGVyID1cbiAgICAgICAgICB0aGlzLnR5cGUgPT09ICdsYXRpdHVkZScgPyAnQ09NTU9OLkxBVF9MT05HLlNJTkdMRV9GSUVMRF9QQVRURVJOLkREX1BMQUNFSE9MREVSJyA6ICdDT01NT04uTEFUX0xPTkcuU0lOR0xFX0ZJRUxEX1BBVFRFUk4uREREX1BMQUNFSE9MREVSJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdERE1NJzpcbiAgICAgICAgdGhpcy5wYXR0ZXJuTWF4RGVjaW1hbHMgPSAzO1xuICAgICAgICB0aGlzLnNob3dNaW51dGVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5taW5NYXhWYWx1ZXMubWludXRlcyA9IHtcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiA2MCAtIHRoaXMuY29tcHV0ZURlY2ltYWxQYXJ0KDEsIHRoaXMucGF0dGVybk1heERlY2ltYWxzKSxcbiAgICAgICAgICBzdGVwOiB0aGlzLmNvbXB1dGVEZWNpbWFsUGFydCgxLCB0aGlzLnBhdHRlcm5NYXhEZWNpbWFscyksXG4gICAgICAgIH07XG4gICAgICAgIGRlZ3JlZXNWYWxpZGF0b3JzLnB1c2goU2hhcmVkVmFsaWRhdG9ycy5pbnRlZ2VyKTtcbiAgICAgICAgbWludXRlc1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbih0aGlzLm1pbk1heFZhbHVlcy5taW51dGVzLm1pbikpO1xuICAgICAgICBtaW51dGVzVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KHRoaXMubWluTWF4VmFsdWVzLm1pbnV0ZXMubWF4KSk7XG4gICAgICAgIG1pbnV0ZXNWYWxpZGF0b3JzLnB1c2goU2hhcmVkVmFsaWRhdG9ycy5kZWNpbWFsKHsgbWF4RGVjaW1hbHM6IHRoaXMucGF0dGVybk1heERlY2ltYWxzIH0pKTtcbiAgICAgICAgdGhpcy5kZWdyZWVzUGxhY2Vob2xkZXIgPSB0aGlzLnR5cGUgPT09ICdsYXRpdHVkZScgPyAnQ09NTU9OLkxBVF9MT05HLlNJTkdMRV9GSUVMRF9QQVRURVJOLkREJyA6ICdDT01NT04uTEFUX0xPTkcuU0lOR0xFX0ZJRUxEX1BBVFRFUk4uREREJztcbiAgICAgICAgdGhpcy5taW51dGVzUGxhY2Vob2xkZXIgPSAnQ09NTU9OLkxBVF9MT05HLlNJTkdMRV9GSUVMRF9QQVRURVJOLk1NJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiAvLyBEZWZhdWx0IGlzIERETU1TU1xuICAgICAgICB0aGlzLnBhdHRlcm5NYXhEZWNpbWFscyA9IDI7XG4gICAgICAgIHRoaXMuc2hvd01pbnV0ZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dTZWNvbmRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5taW5NYXhWYWx1ZXMubWludXRlcyA9IHtcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiA1OSxcbiAgICAgICAgICBzdGVwOiAxLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1pbk1heFZhbHVlcy5zZWNvbmRzID0ge1xuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBtYXg6IDYwIC0gdGhpcy5jb21wdXRlRGVjaW1hbFBhcnQoMSwgdGhpcy5wYXR0ZXJuTWF4RGVjaW1hbHMpLFxuICAgICAgICAgIHN0ZXA6IHRoaXMuY29tcHV0ZURlY2ltYWxQYXJ0KDEsIHRoaXMucGF0dGVybk1heERlY2ltYWxzKSxcbiAgICAgICAgfTtcbiAgICAgICAgZGVncmVlc1ZhbGlkYXRvcnMucHVzaChTaGFyZWRWYWxpZGF0b3JzLmludGVnZXIpO1xuICAgICAgICBtaW51dGVzVmFsaWRhdG9ycy5wdXNoKFNoYXJlZFZhbGlkYXRvcnMuaW50ZWdlcik7XG4gICAgICAgIG1pbnV0ZXNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4odGhpcy5taW5NYXhWYWx1ZXMubWludXRlcy5taW4pKTtcbiAgICAgICAgbWludXRlc1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heCh0aGlzLm1pbk1heFZhbHVlcy5taW51dGVzLm1heCkpO1xuICAgICAgICBzZWNvbmRzVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKHRoaXMubWluTWF4VmFsdWVzLnNlY29uZHMubWluKSk7XG4gICAgICAgIHNlY29uZHNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgodGhpcy5taW5NYXhWYWx1ZXMuc2Vjb25kcy5tYXgpKTtcbiAgICAgICAgc2Vjb25kc1ZhbGlkYXRvcnMucHVzaChTaGFyZWRWYWxpZGF0b3JzLmRlY2ltYWwoeyBtYXhEZWNpbWFsczogdGhpcy5wYXR0ZXJuTWF4RGVjaW1hbHMgfSkpO1xuICAgICAgICB0aGlzLmRlZ3JlZXNQbGFjZWhvbGRlciA9IHRoaXMudHlwZSA9PT0gJ2xhdGl0dWRlJyA/ICdDT01NT04uTEFUX0xPTkcuU0lOR0xFX0ZJRUxEX1BBVFRFUk4uREQnIDogJ0NPTU1PTi5MQVRfTE9ORy5TSU5HTEVfRklFTERfUEFUVEVSTi5EREQnO1xuICAgICAgICB0aGlzLm1pbnV0ZXNQbGFjZWhvbGRlciA9ICdDT01NT04uTEFUX0xPTkcuU0lOR0xFX0ZJRUxEX1BBVFRFUk4uTU0nO1xuICAgICAgICB0aGlzLnNlY29uZHNQbGFjZWhvbGRlciA9ICdDT01NT04uTEFUX0xPTkcuU0lOR0xFX0ZJRUxEX1BBVFRFUk4uU1NfU1MnO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgc2V0IHRoaXMubWF4RGVjaW1hbHMgaW4gc3dpdGNoIGJsb2NrIGFib3ZlXG4gICAgdGhpcy5taW5NYXhWYWx1ZXMuZGVncmVlcyA9IHtcbiAgICAgIG1pbjogdGhpcy5wYXR0ZXJuID09PSAnREQnID8gKHRoaXMudHlwZSA9PT0gJ2xhdGl0dWRlJyA/IC05MCA6IC0xODApIDogMCxcbiAgICAgIG1heDogdGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8gOTAgOiAxODAsXG4gICAgICBzdGVwOiB0aGlzLnBhdHRlcm4gPT09ICdERCcgPyB0aGlzLmNvbXB1dGVEZWNpbWFsUGFydCgxLCB0aGlzLnBhdHRlcm5NYXhEZWNpbWFscykgOiAxLFxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgfHwgKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWxhdGxvbmctZmllbGQ+LlwiKTtcblxuICAgIHRoaXMuZGVncmVlc0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihudWxsLCBkZWdyZWVzVmFsaWRhdG9ycyk7XG4gICAgdGhpcy5taW51dGVzQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KG51bGwsIG1pbnV0ZXNWYWxpZGF0b3JzKTtcbiAgICB0aGlzLnNlY29uZHNDb250cm9sID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4obnVsbCwgc2Vjb25kc1ZhbGlkYXRvcnMpO1xuICAgIHRoaXMuc2lnbkNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8TGF0TG9uZ1NpZ24+KG51bGwpO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLmRlZ3JlZXNDb250cm9sLnZhbHVlQ2hhbmdlcyxcbiAgICAgICAgdGhpcy5taW51dGVzQ29udHJvbC52YWx1ZUNoYW5nZXMsXG4gICAgICAgIHRoaXMuc2Vjb25kc0NvbnRyb2wudmFsdWVDaGFuZ2VzLFxuICAgICAgICB0aGlzLnNpZ25Db250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMub25Gb3JtQ2hhbmdlKCkpXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBzdGF0dXMgY2hhbmdlcyAod2hlbiBkb25lIG91dHNpZGUgdGhlIGNvbXBvbmVudCAgLSBlLmcuIHdoZW4gc2V0RXJyb3JzKCkgaXMgY2FsbGluZyBvbiB0aGUgZm9ybUNvbnRyb2wpXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuX3dyaXRpbmcgJiYgIXRoaXMuX2Rpc2FibGluZykgLy8gU2tpcFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5tYXJrRm9yQ2hlY2soKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47XG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb21wdXRlTGF0TG9uZ0Zvcm1Hcm91cFZhbHVlKHZhbHVlKTtcbiAgICBjb25zb2xlLmRlYnVnKCdbbWF0LWxhdGxvbmctZmllbGRdIENoYW5naW5nIHZhbHVlIG9mIGlucHV0czonLCB2YWx1ZSwgcmVzdWx0KTtcbiAgICB0aGlzLnBhdGNoVmFsdWUocmVzdWx0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kaXNhYmxpbmcpIHJldHVybjtcblxuICAgIHRoaXMuX2Rpc2FibGluZyA9IHRydWU7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGVncmVlc0NvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgdGhpcy5taW51dGVzQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICB0aGlzLnNlY29uZHNDb250cm9sLmRpc2FibGUoKTtcbiAgICAgIHRoaXMuc2lnbkNvbnRyb2wuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlZ3JlZXNDb250cm9sLmVuYWJsZSgpO1xuICAgICAgdGhpcy5taW51dGVzQ29udHJvbC5lbmFibGUoKTtcbiAgICAgIHRoaXMuc2Vjb25kc0NvbnRyb2wuZW5hYmxlKCk7XG4gICAgICB0aGlzLnNpZ25Db250cm9sLmVuYWJsZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2xlYXJWYWx1ZShldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaW50ZXJuYWxFbGVtZW50cygpOiBIVE1MRWxlbWVudFtdIHtcbiAgICByZXR1cm4gKHRoaXMuaW5wdXREZWdyZWVzID8gW3RoaXMuaW5wdXREZWdyZWVzLm5hdGl2ZUVsZW1lbnRdIDogW10pXG4gICAgICAuY29uY2F0KHRoaXMuaW5wdXRNaW51dGVzID8gW3RoaXMuaW5wdXRNaW51dGVzLm5hdGl2ZUVsZW1lbnRdIDogW10pXG4gICAgICAuY29uY2F0KHRoaXMuaW5wdXRTZWNvbmRzID8gW3RoaXMuaW5wdXRTZWNvbmRzLm5hdGl2ZUVsZW1lbnRdIDogW10pXG4gICAgICAuY29uY2F0KHRoaXMuaW5wdXRTaWduID8gW3RoaXMuaW5wdXRTaWduLm5hdGl2ZUVsZW1lbnRdIDogW10pXG4gICAgICAuY29uY2F0KHRoaXMuZmFrZUlucHV0ID8gW3RoaXMuZmFrZUlucHV0Lm5hdGl2ZUVsZW1lbnRdIDogW10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRm9jdXNGYWtlSW5wdXQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd0ZpZWxkcykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgLy8gSGlkZSB0aGUgZmFrZSBpbnB1dFxuICAgICAgdGhpcy5mYWtlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3RvdWNoZWQgPSB0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQ7XG5cbiAgICAvLyBGb2N1cyBvbiBmaXJzdCBpbnB1dFxuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJsdXJGYWtlSW5wdXQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbEV2ZW50ID0gdGhpcy5pbnRlcm5hbEVsZW1lbnRzLnNvbWUoKGVsKSA9PiBlbCA9PT0gZXZlbnQucmVsYXRlZFRhcmdldCk7XG4gICAgaWYgKGludGVybmFsRXZlbnQgJiYgIXRoaXMuX3RvdWNoZWQpIHtcbiAgICAgIC8vIFdvcmthcm91bmQgdG8gcmVtb3ZlIHRvdWNoZWQgb24gdGhlIGZha2VJbnB1dFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uRm9jdXNJbnB1dChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGNvbnN0IGludGVybmFsRXZlbnQgPSB0aGlzLmludGVybmFsRWxlbWVudHMuc29tZSgoZWwpID0+IGVsID09PSBldmVudC50YXJnZXQpO1xuICAgIGlmIChpbnRlcm5hbEV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLmlucHV0U2lnbj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLmlucHV0U2lnblNlbGVjdD8ub3BlbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJbnB1dChldmVudC50YXJnZXQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvY3VzKGV2ZW50LnRhcmdldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uQmx1cklucHV0KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxFdmVudCA9IHRoaXMuaW50ZXJuYWxFbGVtZW50cy5zb21lKChlbCkgPT4gZWwgPT09IGV2ZW50LnJlbGF0ZWRUYXJnZXQpO1xuICAgIGlmICghaW50ZXJuYWxFdmVudCkge1xuICAgICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuYXBwZWFyYW5jZSA9PSAnZmlsbCcpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGQuX2xpbmVSaXBwbGUuZGVhY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG5cbiAgICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XG4gICAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG5cbiAgICAgIHRoaXMuX3RvdWNoZWQgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfb25DbGlja0lucHV0KGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxFdmVudCA9IHRoaXMuaW50ZXJuYWxFbGVtZW50cy5zb21lKChlbCkgPT4gZWwgPT09IGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKGludGVybmFsRXZlbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0SW5wdXQoZXZlbnQudGFyZ2V0KTtcbiAgICB9XG4gICAgLy8gQXZvaWQgbWF0LWZvcm0tZmllbGQgdG8gZ2l2ZSBmb2N1cyB0byBmYWtlIGlucHV0XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0SW5wdXQoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQ/LnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICAgICAgc2VsZWN0SW5wdXRDb250ZW50KGlucHV0KTtcbiAgICAgIGlucHV0LnR5cGUgPSAnbnVtYmVyJztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXModGFyZ2V0Pykge1xuICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm4gdHJ1ZTsgLy8gQWxyZWFkeSBmb2N1c2VkXG4gICAgY29uc3Qgc2hvd0ZpZWxkcyA9IHRoaXMuc2hvd0ZpZWxkcztcbiAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXNob3dGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5pbnB1dERlZ3JlZXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLnNlbGVjdElucHV0KHRoaXMuaW5wdXREZWdyZWVzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0SW5wdXQodGFyZ2V0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYXBwZWFyYW5jZSA9PSAnZmlsbCcpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGQuX2xpbmVSaXBwbGUuYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9ybWF0KHJhd1ZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuY29tcHV0ZUxhdExvbmdGb3JtR3JvdXBWYWx1ZShyYXdWYWx1ZSk7XG4gICAgaWYgKHZhbHVlcy5kZWdyZWVzID09PSBudWxsKSByZXR1cm4gJyc7XG4gICAgbGV0IHJlc3VsdCA9IGAke3ZhbHVlcy5kZWdyZWVzfcKwIGA7XG4gICAgaWYgKHZhbHVlcy5taW51dGVzICE9PSBudWxsKSByZXN1bHQgKz0gYCR7dmFsdWVzLm1pbnV0ZXN9JyBgO1xuICAgIGlmICh2YWx1ZXMuc2Vjb25kcyAhPT0gbnVsbCkgcmVzdWx0ICs9IGAke3ZhbHVlcy5zZWNvbmRzfVwiIGA7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2xhdGl0dWRlJykge1xuICAgICAgcmVzdWx0ICs9IHZhbHVlcy5zaWduID09PSAxID8gJ04nIDogJ1MnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gdmFsdWVzLnNpZ24gPT09IDEgPyAnRScgOiAnVyc7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcHV0ZURlY2ltYWxQYXJ0KHZhbHVlOiBudW1iZXIsIG5iT2ZEZWNpbWFsczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdmFsdWUgKiAxMCAqKiAobmJPZkRlY2ltYWxzICogLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXB1dGVMYXRMb25nRm9ybUdyb3VwVmFsdWUocmF3VmFsdWU6IG51bWJlciB8IHN0cmluZyk6IElMYXRMb25nRGF0YSB7XG4gICAgY29uc3QgaXNMb25naXR1ZGUgPSB0aGlzLnR5cGUgPT09ICdsb25naXR1ZGUnO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09ICdzdHJpbmcnID8gcGFyc2VGbG9hdChyYXdWYWx1ZS5yZXBsYWNlKC8sL2csICcuJykpIDogcmF3VmFsdWU7XG4gICAgY29uc3QgcmVzdWx0OiBJTGF0TG9uZ0RhdGEgPSB7XG4gICAgICBkZWdyZWVzOiBudWxsLFxuICAgICAgbWludXRlczogbnVsbCxcbiAgICAgIHNlY29uZHM6IG51bGwsXG4gICAgICBzaWduOiBpc05vdE5pbCh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZSA8IDBcbiAgICAgICAgICA/IC0xXG4gICAgICAgICAgOiAxXG4gICAgICAgIDogLy8gVXNlIGRlZmF1bHQgc2lnbiwgaWYgYW55XG4gICAgICAgICAgdGhpcy5kZWZhdWx0U2lnbiAmJiB0aGlzLmRlZmF1bHRTaWduID09PSAnLSdcbiAgICAgICAgICA/IC0xXG4gICAgICAgICAgOiAxLFxuICAgIH07XG5cbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgIHJlc3VsdC5kZWdyZWVzID0gMDtcbiAgICB9IGVsc2UgaWYgKGlzTm90TmlsKHZhbHVlKSkge1xuICAgICAgaWYgKHRoaXMucGF0dGVybiA9PT0gJ0REJykge1xuICAgICAgICBjb25zdCBzcGxpdFZhbHVlID0gc3BsaXROdW1iZXJUb0ZpZWxkc0REKHZhbHVlLCB7XG4gICAgICAgICAgbG9uZ2l0dWRlOiBpc0xvbmdpdHVkZSxcbiAgICAgICAgICBwYXR0ZXJuOiB0aGlzLnBhdHRlcm4sXG4gICAgICAgICAgbWF4RGVjaW1hbHM6IHRoaXMucGF0dGVybk1heERlY2ltYWxzLFxuICAgICAgICAgIGZpeExhdExvbmc6IHRydWUsXG4gICAgICAgIH0pLnNsaWNlKDEpIGFzIG51bWJlcltdOyAvLyByZW1vdmUgc2lnbjtcbiAgICAgICAgcmVzdWx0LmRlZ3JlZXMgPSAoc3BsaXRWYWx1ZVswXSArIHRoaXMuY29tcHV0ZURlY2ltYWxQYXJ0KHNwbGl0VmFsdWVbMV0gPz8gMCwgdGhpcy5wYXR0ZXJuTWF4RGVjaW1hbHMpKSAqIChyZXN1bHQuc2lnbiB8fCAxKSB8fCBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERE1NJykge1xuICAgICAgICBjb25zdCBzcGxpdFZhbHVlID0gc3BsaXROdW1iZXJUb0ZpZWxkc0RETU0odmFsdWUsIHtcbiAgICAgICAgICBsb25naXR1ZGU6IGlzTG9uZ2l0dWRlLFxuICAgICAgICAgIHBhdHRlcm46IHRoaXMucGF0dGVybixcbiAgICAgICAgICBtYXhEZWNpbWFsczogdGhpcy5wYXR0ZXJuTWF4RGVjaW1hbHMsXG4gICAgICAgICAgZml4TGF0TG9uZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFsnbWludXRlcyddID0gTWF0aC5hYnMoKHNwbGl0VmFsdWVbMV0gPz8gMCkgKyB0aGlzLmNvbXB1dGVEZWNpbWFsUGFydChzcGxpdFZhbHVlWzJdID8/IDAsIHRoaXMucGF0dGVybk1heERlY2ltYWxzKSkgfHwgbnVsbDtcbiAgICAgICAgcmVzdWx0WydkZWdyZWVzJ10gPSBNYXRoLmFicyghcmVzdWx0WydtaW51dGVzJ10gJiYgaXNOaWxPckJsYW5rKHNwbGl0VmFsdWVbMF0pID8gbnVsbCA6IChzcGxpdFZhbHVlWzBdID8/IDApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgLy8gRERNTVNTXG4gICAgICAgIGNvbnN0IHNwbGl0VmFsdWUgPSBzcGxpdE51bWJlclRvRmllbGRzRERNTVNTKHZhbHVlLCB7XG4gICAgICAgICAgbG9uZ2l0dWRlOiBpc0xvbmdpdHVkZSxcbiAgICAgICAgICBwYXR0ZXJuOiB0aGlzLnBhdHRlcm4sXG4gICAgICAgICAgbWF4RGVjaW1hbHM6IHRoaXMucGF0dGVybk1heERlY2ltYWxzLFxuICAgICAgICAgIGZpeExhdExvbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRbJ3NlY29uZHMnXSA9IE1hdGguYWJzKChzcGxpdFZhbHVlWzJdID8/IDApICsgdGhpcy5jb21wdXRlRGVjaW1hbFBhcnQoc3BsaXRWYWx1ZVszXSA/PyAwLCB0aGlzLnBhdHRlcm5NYXhEZWNpbWFscykpIHx8IG51bGw7XG4gICAgICAgIHJlc3VsdFsnbWludXRlcyddID0gIXJlc3VsdFsnc2Vjb25kcyddICYmICFzcGxpdFZhbHVlWzFdID8gbnVsbCA6IE1hdGguYWJzKHNwbGl0VmFsdWVbMV0gPz8gMCk7XG4gICAgICAgIHJlc3VsdFsnZGVncmVlcyddID0gIXJlc3VsdFsnc2Vjb25kcyddICYmICFyZXN1bHRbJ21pbnV0ZXMnXSAmJiBpc05pbE9yQmxhbmsoc3BsaXRWYWx1ZVswXSkgPyBudWxsIDogTWF0aC5hYnMoc3BsaXRWYWx1ZVswXSA/PyAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBc1RvdWNoZWQoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5kZWdyZWVzQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5taW51dGVzQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5zZWNvbmRzQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5zaWduQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBwYXRjaFZhbHVlKHZhbHVlczogSUxhdExvbmdEYXRhLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLmRlZ3JlZXNDb250cm9sLnBhdGNoVmFsdWUodmFsdWVzLmRlZ3JlZXMsIG9wdHMpO1xuICAgIHRoaXMubWludXRlc0NvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZXMubWludXRlcywgb3B0cyk7XG4gICAgdGhpcy5zZWNvbmRzQ29udHJvbC5wYXRjaFZhbHVlKHZhbHVlcy5zZWNvbmRzLCBvcHRzKTtcbiAgICB0aGlzLnNpZ25Db250cm9sLnBhdGNoVmFsdWUodmFsdWVzLnNpZ24sIG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcCBpZiBjYWxsIGJ5IHNlbGZcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGRlZ3JlZXMgPSB0aGlzLmRlZ3JlZXNDb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSB0aGlzLm1pbnV0ZXNDb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLnNlY29uZHNDb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IHNpZ24gPSB0aGlzLnNpZ25Db250cm9sLnZhbHVlO1xuXG4gICAgY29uc3QgaW5jb21wbGV0ZVZhbHVlID0gaXNOaWwoZGVncmVlcykgJiYgKGlzTm90TmlsKG1pbnV0ZXMpIHx8IGlzTm90TmlsKHNlY29uZHMpKTtcbiAgICBjb25zdCBpbnZhbGlkID1cbiAgICAgIGluY29tcGxldGVWYWx1ZSB8fCB0aGlzLmRlZ3JlZXNDb250cm9sLmludmFsaWQgfHwgdGhpcy5taW51dGVzQ29udHJvbC5pbnZhbGlkIHx8IHRoaXMuc2Vjb25kc0NvbnRyb2wuaW52YWxpZCB8fCB0aGlzLnNpZ25Db250cm9sLmludmFsaWQ7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZyh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xuICAgICAgICBpbnZhbGlkOiBpbmNvbXBsZXRlVmFsdWUsXG4gICAgICAgIC4uLnRoaXMuZGVncmVlc0NvbnRyb2wuZXJyb3JzLFxuICAgICAgICAuLi50aGlzLm1pbnV0ZXNDb250cm9sLmVycm9ycyxcbiAgICAgICAgLi4udGhpcy5zZWNvbmRzQ29udHJvbC5lcnJvcnMsXG4gICAgICAgIC4uLnRoaXMuc2lnbkNvbnRyb2wuZXJyb3JzLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmRlZ3JlZXNDb250cm9sLmRpcnR5IHx8IHRoaXMubWludXRlc0NvbnRyb2wuZGlydHkgfHwgdGhpcy5zZWNvbmRzQ29udHJvbC5kaXJ0eSB8fCB0aGlzLnNpZ25Db250cm9sLmRpcnR5KSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgZGVjaW1hbCB2YWx1ZXNcbiAgICBjb25zdCB2YWx1ZSA9IGlzTmlsKGRlZ3JlZXMpIHx8IHRoaXMucGF0dGVybiA9PT0gJ0REJyA/IGRlZ3JlZXMgOiBjb21wdXRlRGVjaW1hbERlZ3JlZXMoZGVncmVlcywgbWludXRlcywgc2Vjb25kcywgc2lnbiwgdGhpcy5tYXhEZWNpbWFscyk7XG5cbiAgICAvLyBTZXQgbW9kZWwgdmFsdWVcbiAgICB0aGlzLmVtaXRDaGFuZ2UodmFsdWUpO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICAvLyBDaGFuZ2VzIGNvbWVzIGZyb20gaW5zaWRlIGZ1bmN0aW9uOiB1c2UgdGhlIGNhbGxiYWNrXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgY29udHJvbHNcbiAgICAgIHRoaXMuX2NoZWNrSWZUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLl90b3VjaGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdG91Y2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdy9IaWRlIHRoZSBmYWtlIGlucHV0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUZha2VJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzKSB7XG4gICAgICB0aGlzLmZha2VJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmFrZUlucHV0Py5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Nkay12aXN1YWxseS1oaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBjaGVjayBpZiBuZWVkXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlLCB0aGlzIGNvbXBvbmVudCBoYXMgYSB0ZW1wb3JhcnkgY29tcG9uZW50IGRpc3BsYXllZCBiZWZvcmUgdGhlIGZpcnN0IGZvY3VzIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRhYkluZGV4KCkge1xuICAgIGlmIChpc05pbCh0aGlzLl90YWJpbmRleCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmZha2VJbnB1dCkge1xuICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IHRoaXMuX3RhYmluZGV4O1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjwhLS0gcmVhZG9ubHkgLS0+XG5AaWYgKHJlYWRvbmx5KSB7XG4gIDxtYXQtZm9ybS1maWVsZFxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZFwiXG4gID5cbiAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgIDxtYXQtbGFiZWw+e3sgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICB9XG5cbiAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICA8aW9uLXRleHQ+XG4gICAgICB7e1xuICAgICAgICBmb3JtQ29udHJvbC52YWx1ZVxuICAgICAgICAgIHwgbGF0TG9uZ0Zvcm1hdDogeyBwYXR0ZXJuOiBwYXR0ZXJuLCBtYXhEZWNpbWFsczogcGF0dGVybk1heERlY2ltYWxzLCB0eXBlOiB0eXBlLCBwbGFjZWhvbGRlckNoYXI6ICcnIH1cbiAgICAgIH19XG4gICAgPC9pb24tdGV4dD5cblxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhpbnRzIC0tPlxuICAgIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJmb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbn0gQGVsc2Uge1xuICA8IS0tIHdyaXRhYmxlIC0tPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICAjZm9ybUZpZWxkXG4gICAgW2Zsb2F0TGFiZWxdPVwic2hvd0ZpZWxkcyAmJiAoIWZsb2F0TGFiZWwgfHwgZmxvYXRMYWJlbCA9PT0gJ2F1dG8nKSA/ICdhbHdheXMnIDogKGZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlKVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0taW52YWxpZF09XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIChzaWduQ29udHJvbC5pbnZhbGlkIHx8IGZvcm1Db250cm9sLmludmFsaWQpXCJcbiAgICBjbGFzcz1cIm1hdC1sYXRsb25nLWZvcm0tZmllbGRcIlxuICA+XG4gICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiBwbGFjZWhvbGRlciB8IGlzTm90TmlsT3JCbGFuaykge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cblxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgICNmYWtlSW5wdXRcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJlYWRvbmx5PVwidHJ1ZVwiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgIFthcHBBdXRvZm9jdXNdPVwiIXNob3dGaWVsZHMgJiYgYXV0b2ZvY3VzXCJcbiAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInNob3dGaWVsZHNcIlxuICAgICAgKGZvY3VzKT1cIm9uRm9jdXNGYWtlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJvbkJsdXJGYWtlSW5wdXQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgIG1hdElucHV0XG4gICAgICAjaW5wdXREZWdyZWVzXG4gICAgICBbY2xhc3MuZGVncmVlc109XCJwYXR0ZXJuICE9PSAnREQnXCJcbiAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFzaG93RmllbGRzXCJcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJkZWdyZWVzUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cImRlZ3JlZXNDb250cm9sXCJcbiAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgW2FwcEF1dG9mb2N1c109XCJzaG93RmllbGRzICYmIGF1dG9mb2N1c1wiXG4gICAgICBbbWluXT1cIm1pbk1heFZhbHVlcy5kZWdyZWVzLm1pblwiXG4gICAgICBbbWF4XT1cIm1pbk1heFZhbHVlcy5kZWdyZWVzLm1heFwiXG4gICAgICBbc3RlcF09XCJtaW5NYXhWYWx1ZXMuZGVncmVlcy5zdGVwXCJcbiAgICAgIChmb2N1cyk9XCJfb25Gb2N1c0lucHV0KCRldmVudClcIlxuICAgICAgKGJsdXIpPVwiX29uQmx1cklucHV0KCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIl9vbkNsaWNrSW5wdXQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8c3BhbiBjbGFzcz1cInN5bWJvbC11bml0XCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dGaWVsZHNcIj5cbiAgICAgIHt7IGRlZ3JlZXNTeW1ib2xVbml0IH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmIChzaG93TWludXRlcykge1xuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgICNpbnB1dE1pbnV0ZXNcbiAgICAgICAgY2xhc3M9XCJtaW51dGVzXCJcbiAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dGaWVsZHNcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1pbnV0ZXNQbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJtaW51dGVzQ29udHJvbFwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgIFttaW5dPVwibWluTWF4VmFsdWVzLm1pbnV0ZXMubWluXCJcbiAgICAgICAgW21heF09XCJtaW5NYXhWYWx1ZXMubWludXRlcy5tYXhcIlxuICAgICAgICBbc3RlcF09XCJtaW5NYXhWYWx1ZXMubWludXRlcy5zdGVwXCJcbiAgICAgICAgKGZvY3VzKT1cIl9vbkZvY3VzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cIl9vbkJsdXJJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cIl9vbkNsaWNrSW5wdXQoJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtdW5pdFwiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFzaG93RmllbGRzXCI+XG4gICAgICAgIHt7IG1pbnV0ZXNTeW1ib2xVbml0IH19XG4gICAgICA8L3NwYW4+XG4gICAgfVxuXG4gICAgQGlmIChzaG93U2Vjb25kcykge1xuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgICNpbnB1dFNlY29uZHNcbiAgICAgICAgY2xhc3M9XCJzZWNvbmRzXCJcbiAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dGaWVsZHNcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlY29uZHNQbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWNvbmRzQ29udHJvbFwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgIFttaW5dPVwibWluTWF4VmFsdWVzLnNlY29uZHMubWluXCJcbiAgICAgICAgW21heF09XCJtaW5NYXhWYWx1ZXMuc2Vjb25kcy5tYXhcIlxuICAgICAgICBbc3RlcF09XCJtaW5NYXhWYWx1ZXMuc2Vjb25kcy5zdGVwXCJcbiAgICAgICAgKGZvY3VzKT1cIl9vbkZvY3VzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cIl9vbkJsdXJJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cIl9vbkNsaWNrSW5wdXQoJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHNwYW4gW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dGaWVsZHNcIiBjbGFzcz1cInN5bWJvbC11bml0XCI+XG4gICAgICAgIHt7IHNlY29uZHNTeW1ib2xVbml0IH19XG4gICAgICA8L3NwYW4+XG4gICAgfVxuXG4gICAgPCEtLSBzaWduIC0tPlxuICAgIEBpZiAoc2hvd1NpZ25Db250cm9sKSB7XG4gICAgICA8c3BhbiAjc3BhY2VyIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAjaW5wdXRTaWduXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJzaWduQ29udHJvbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAodHlwZSA9PT0gJ2xhdGl0dWRlJyA/ICdDT01NT04uTEFUX0xPTkcuTEFUX1NJR05fUExBQ0VIT0xERVInIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fUExBQ0VIT0xERVInKVxuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgXCJcbiAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgKGZvY3VzKT1cIl9vbkZvY3VzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cIl9vbkJsdXJJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cIl9vbkNsaWNrSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwic2lnblwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIxXCI+XG4gICAgICAgICAge3sgKHR5cGUgPT09ICdsYXRpdHVkZScgPyAnQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX04nIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fRScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIi0xXCI+XG4gICAgICAgICAge3sgKHR5cGUgPT09ICdsYXRpdHVkZScgPyAnQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX1MnIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fVycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICB9XG5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDwhLS0gRG8gdGhlIHNhbWUgYXMgTWF0RnJvbUZpZWxkIHNpbmNlIGFuZ3VsYXIgMTUgKHNlZSBjb21wb25lbnQgc291cmNlKS0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJcIlxuICAgIFtjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtYm90dG9tLWFsaWduXT1cInN1YnNjcmlwdFNpemluZyA9PT0gJ2ZpeGVkJ1wiXG4gICAgW2NsYXNzLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtZHluYW1pYy1zaXplXT1cInN1YnNjcmlwdFNpemluZyA9PT0gJ2R5bmFtaWMnXCJcbiAgPlxuICAgIEBpZiAoZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICA8IS0tIGVycm9ycyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtZXJyb3Itd3JhcHBlclwiPlxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmVycm9ycyB8IG1hcEtleXMgfCBhcnJheUZpcnN0OyBhcyBlcnJvcktleSkge1xuICAgICAgICAgIDxtYXQtZXJyb3I+XG4gICAgICAgICAgICB7eyBpMThuRXJyb3JLZXlzIHwgbWFwR2V0OiBlcnJvcktleSB8IHRyYW5zbGF0ZTogKGZvcm1Db250cm9sLmVycm9ycyB8IG1hcEdldDogZXJyb3JLZXkpIH19XG4gICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRFcnJvclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPCEtLSBoaW50cyAtLT5cbiAgICAgIDxtYXQtaGludD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtaGludD5cbiAgICB9XG4gIDwvZGl2PlxufVxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIEBpZiAoY2xlYXJhYmxlICYmICFyZWFkb25seSkge1xuICAgIDxidXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICBbaGlkZGVuXT1cImZvcm1Db250cm9sLnZhbHVlIHwgaXNOaWxcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cblxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0RXJyb3JUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yLFttYXRFcnJvcl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEhpbnRUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludDpub3QoW2FsaWduPSdlbmQnXSksW21hdEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFthbGlnbj0nZW5kJ11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==