tnx-shared 5.3.310 → 5.3.312
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/tnx-shared.umd.js +267 -32
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/data-form-base.d.ts +13 -1
- package/classes/base/data-form-base.d.ts.map +1 -1
- package/classes/form-schema.d.ts +17 -0
- package/classes/form-schema.d.ts.map +1 -1
- package/const/common.d.ts +4 -0
- package/const/common.d.ts.map +1 -1
- package/esm2015/classes/base/data-form-base.js +178 -3
- package/esm2015/classes/base/list-base.js +2 -2
- package/esm2015/classes/form-schema.js +21 -1
- package/esm2015/const/common.js +5 -1
- package/fesm2015/tnx-shared.js +200 -2
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/tnx-shared.metadata.json +1 -1
|
@@ -6,7 +6,7 @@ import { FileUpload } from 'tn-custom-primeng/fileupload';
|
|
|
6
6
|
import { CrudFormComponent } from '../../components/crud/crud-form/crud-form.component';
|
|
7
7
|
import { CONFIG_CALENDAR_VIETNAMESE } from '../../configs/calendar.config';
|
|
8
8
|
import { ComCtxConstants } from '../../configs/component-context.constant';
|
|
9
|
-
import { FieldDefineIsTaskFormControl, FieldWorkflowCodeInCrudForm } from '../../const/common';
|
|
9
|
+
import { DataSourceBoolean, FieldDefineIsTaskFormControl, FieldWorkflowCodeInCrudForm } from '../../const/common';
|
|
10
10
|
import { PermissionBase } from '../../enums/common';
|
|
11
11
|
import { Filter } from '../../models/grid-info';
|
|
12
12
|
import { CommonService } from '../../services/common.service';
|
|
@@ -20,9 +20,10 @@ import { NotifierService } from '../../services/notifier.service';
|
|
|
20
20
|
import { UserService } from '../../services/user.service';
|
|
21
21
|
import { FormState, KeyFlashShow } from '../constants';
|
|
22
22
|
import { isLiteralObject, isValidDate } from '../environment-schema';
|
|
23
|
-
import { ContainerSchema, CrudFormData, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DropdownControlSchema, EventData, EventType, FileManagerControlSchema, Operator, SwitchControlSchema, TableSchema, TitleSchema } from '../form-schema';
|
|
23
|
+
import { AutoCompletePickerControlSchema, CheckboxControlSchema, ContainerSchema, CrudFormData, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DropdownControlSchema, EditorControlSchema, EventData, EventType, FileManagerControlSchema, LogColumn, LogSetting, MaskControlSchema, Operator, SwitchControlSchema, TableSchema, TextAreaControlSchema, TitleSchema } from '../form-schema';
|
|
24
24
|
import { ComponentBaseWithButton } from './component-base-with-button';
|
|
25
25
|
import { RequiredValidator } from './validators';
|
|
26
|
+
import { DecimalPipe } from '@angular/common';
|
|
26
27
|
export class DataFormBase extends ComponentBaseWithButton {
|
|
27
28
|
constructor(_injector) {
|
|
28
29
|
super(_injector);
|
|
@@ -39,6 +40,7 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
39
40
|
this.messageInsertSuccess = '';
|
|
40
41
|
this.messageUpdateSuccess = '';
|
|
41
42
|
this.setting = new CrudFormSetting();
|
|
43
|
+
this.logSetting = new LogSetting();
|
|
42
44
|
this.vi = CONFIG_CALENDAR_VIETNAMESE;
|
|
43
45
|
this.formControlsList = {};
|
|
44
46
|
this.environment = {};
|
|
@@ -58,6 +60,7 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
58
60
|
const moduleConfigService = _injector.get(ModuleConfigService);
|
|
59
61
|
this.environment = moduleConfigService.getConfig().environment;
|
|
60
62
|
this._notifierService = this._injector.get(NotifierService);
|
|
63
|
+
this._numberPipe = this._injector.get(DecimalPipe);
|
|
61
64
|
this._masterDataService = this._injector.get(MasterDataService);
|
|
62
65
|
this._router = this._injector.get(Router);
|
|
63
66
|
this._activatedRoute = this._injector.get(ActivatedRoute);
|
|
@@ -243,6 +246,9 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
243
246
|
}
|
|
244
247
|
yield this._processAfterGetData(response.data);
|
|
245
248
|
yield this.onAfterGetDetail(response.data);
|
|
249
|
+
if (this.logSetting.isEnableLog) {
|
|
250
|
+
this.logSetting.valueBeforeUpdate = this._commonService.cloneObject(response.data);
|
|
251
|
+
}
|
|
246
252
|
}
|
|
247
253
|
else {
|
|
248
254
|
if (this.crudForm) {
|
|
@@ -348,8 +354,29 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
348
354
|
}
|
|
349
355
|
}
|
|
350
356
|
this.disableBuildInField();
|
|
357
|
+
if (this.logSetting.isEnableLog) {
|
|
358
|
+
this.getLogValueAfterLoadDetail();
|
|
359
|
+
}
|
|
351
360
|
});
|
|
352
361
|
}
|
|
362
|
+
getLogValueAfterLoadDetail() {
|
|
363
|
+
setTimeout(() => {
|
|
364
|
+
var _a;
|
|
365
|
+
for (const controlName of Object.keys(this.formControls)) {
|
|
366
|
+
const control = this.crudForm.formControls[controlName];
|
|
367
|
+
if (controlName.includes('.') || ((_a = this.crudForm.formControls[controlName]) === null || _a === void 0 ? void 0 : _a.hidden) === true
|
|
368
|
+
|| !(control instanceof AutoCompletePickerControlSchema))
|
|
369
|
+
continue;
|
|
370
|
+
this.logSetting.arrValueAfterUpdate.push(new LogColumn({
|
|
371
|
+
field: control.field,
|
|
372
|
+
label: control.label,
|
|
373
|
+
valueBefore: control._component.dataSource.map(p => p.label).join(', '),
|
|
374
|
+
visible: false,
|
|
375
|
+
valueAfter: ''
|
|
376
|
+
}));
|
|
377
|
+
}
|
|
378
|
+
}, 2000);
|
|
379
|
+
}
|
|
353
380
|
fixDateValue(control, parentModel, parentPath) {
|
|
354
381
|
let _parentPath = control.field;
|
|
355
382
|
if (parentPath != null)
|
|
@@ -442,10 +469,155 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
442
469
|
_triggerSave() {
|
|
443
470
|
this.save();
|
|
444
471
|
}
|
|
472
|
+
onAfterGetLogValue() {
|
|
473
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
getSingleLabel(control, dataSource, valueParam) {
|
|
477
|
+
let result = dataSource.find(p => p.value[control.valueField] == valueParam);
|
|
478
|
+
if (!!result) {
|
|
479
|
+
const funcGetLabel = control.funcGetLabel;
|
|
480
|
+
if (funcGetLabel) {
|
|
481
|
+
result = funcGetLabel(result.value);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
result = this.logSetting.emptyValue;
|
|
486
|
+
}
|
|
487
|
+
return result;
|
|
488
|
+
}
|
|
489
|
+
getMultipleLabel(control, dataSource, valueParam) {
|
|
490
|
+
try {
|
|
491
|
+
if (valueParam.some(p => p == Number(p))) {
|
|
492
|
+
valueParam = valueParam.map(p => Number(p));
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
catch (_a) { }
|
|
496
|
+
let result = dataSource
|
|
497
|
+
.filter(p => valueParam.includes(p.value[control.valueField]))
|
|
498
|
+
.map(p => control.funcGetLabel(p.value))
|
|
499
|
+
.join(', ');
|
|
500
|
+
if (!result) {
|
|
501
|
+
result = this.logSetting.emptyValue;
|
|
502
|
+
}
|
|
503
|
+
return result;
|
|
504
|
+
}
|
|
505
|
+
addSinglePropertyLog(control, oldValue, newValue) {
|
|
506
|
+
if (control instanceof AutoCompletePickerControlSchema) {
|
|
507
|
+
const logColumn = this.logSetting.arrValueAfterUpdate.find(p => p.field == control.field);
|
|
508
|
+
let dataSource = control._component.selectedValueObject;
|
|
509
|
+
if (!Array.isArray(dataSource))
|
|
510
|
+
dataSource = [dataSource];
|
|
511
|
+
logColumn.visible = true;
|
|
512
|
+
logColumn.valueAfter = this.getSingleLabel(control, dataSource, newValue);
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
const dataSource = control._component.dataSourceInternal;
|
|
516
|
+
this.logSetting.arrValueAfterUpdate.push(new LogColumn({
|
|
517
|
+
field: control.field,
|
|
518
|
+
label: control.label,
|
|
519
|
+
valueBefore: this.getSingleLabel(control, dataSource, oldValue),
|
|
520
|
+
valueAfter: this.getSingleLabel(control, dataSource, newValue)
|
|
521
|
+
}));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
addMultiplePropertyLog(control, oldValue, newValue) {
|
|
525
|
+
if (control instanceof AutoCompletePickerControlSchema) {
|
|
526
|
+
const logColumn = this.logSetting.arrValueAfterUpdate.find(p => p.field == control.field);
|
|
527
|
+
logColumn.visible = true;
|
|
528
|
+
logColumn.valueAfter = this.getMultipleLabel(control, control._component.selectedValueObject, newValue);
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
const dataSource = control._component.dataSourceInternal;
|
|
532
|
+
this.logSetting.arrValueAfterUpdate.push(new LogColumn({
|
|
533
|
+
field: control.field,
|
|
534
|
+
label: control.label,
|
|
535
|
+
valueBefore: this.getMultipleLabel(control, dataSource, oldValue),
|
|
536
|
+
valueAfter: this.getMultipleLabel(control, dataSource, newValue)
|
|
537
|
+
}));
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
getLogValueDefault(control, oldValue, newValue) {
|
|
541
|
+
var _a, _b;
|
|
542
|
+
const isNullOldValue = this.isNullOrEmpty(oldValue);
|
|
543
|
+
const isNullNewValue = this.isNullOrEmpty(newValue);
|
|
544
|
+
if (control instanceof DateTimeControlSchema) {
|
|
545
|
+
const format = control.showTime ? 'HH:mm dd/MM/yyyy' : 'dd/MM/yyyy';
|
|
546
|
+
oldValue = isNullOldValue ? this.logSetting.emptyValue : this._datePipe.transform(oldValue, format);
|
|
547
|
+
newValue = isNullNewValue ? this.logSetting.emptyValue : this._datePipe.transform(newValue, format);
|
|
548
|
+
}
|
|
549
|
+
else if (control instanceof MaskControlSchema) {
|
|
550
|
+
oldValue = isNullOldValue ? this.logSetting.emptyValue : this._numberPipe.transform(oldValue, '', 'vi-VN');
|
|
551
|
+
newValue = isNullNewValue ? this.logSetting.emptyValue : this._numberPipe.transform(newValue, '', 'vi-VN');
|
|
552
|
+
}
|
|
553
|
+
else if (control instanceof CheckboxControlSchema || control instanceof SwitchControlSchema) {
|
|
554
|
+
oldValue = isNullOldValue ? this.logSetting.emptyValue : (_a = DataSourceBoolean.find(p => p.id == oldValue)) === null || _a === void 0 ? void 0 : _a.ten;
|
|
555
|
+
newValue = isNullNewValue ? this.logSetting.emptyValue : (_b = DataSourceBoolean.find(p => p.id == newValue)) === null || _b === void 0 ? void 0 : _b.ten;
|
|
556
|
+
}
|
|
557
|
+
return [oldValue, newValue];
|
|
558
|
+
}
|
|
559
|
+
getLogValue() {
|
|
560
|
+
var _a;
|
|
561
|
+
try {
|
|
562
|
+
const cloneModel = this._commonService.cloneObject(this.model.data);
|
|
563
|
+
for (const controlName of Object.keys(this.formControls)) {
|
|
564
|
+
if (controlName.includes('.') || ((_a = this.crudForm.formControls[controlName]) === null || _a === void 0 ? void 0 : _a.hidden) === true)
|
|
565
|
+
continue;
|
|
566
|
+
const control = this.formControls[controlName];
|
|
567
|
+
const oldValue = this.logSetting.valueBeforeUpdate[control.field];
|
|
568
|
+
const newValue = cloneModel[control.field];
|
|
569
|
+
const isMultiple = Array.isArray(oldValue);
|
|
570
|
+
if (!this.isNullOrEmpty(oldValue) || !this.isNullOrEmpty(newValue)) {
|
|
571
|
+
if (control instanceof DropdownControlSchema || control instanceof AutoCompletePickerControlSchema) {
|
|
572
|
+
if (!isMultiple && oldValue != newValue) {
|
|
573
|
+
this.addSinglePropertyLog(control, oldValue, newValue);
|
|
574
|
+
}
|
|
575
|
+
else if (isMultiple && !this._commonService.isSameArray(oldValue, newValue)) {
|
|
576
|
+
this.addMultiplePropertyLog(control, oldValue, newValue);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
if (oldValue != newValue) {
|
|
581
|
+
const [valueBefore, valueAfter] = this.getLogValueDefault(control, oldValue, newValue);
|
|
582
|
+
this.logSetting.arrValueAfterUpdate.push(new LogColumn({
|
|
583
|
+
field: control.field,
|
|
584
|
+
label: control.label,
|
|
585
|
+
valueBefore: valueBefore,
|
|
586
|
+
valueAfter: valueAfter,
|
|
587
|
+
isHtml: (control instanceof EditorControlSchema || control instanceof TextAreaControlSchema)
|
|
588
|
+
}));
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
catch (_b) {
|
|
595
|
+
console.error('----log data fail----');
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
isNullOrEmpty(input) {
|
|
599
|
+
if (input !== undefined && input !== null) {
|
|
600
|
+
if (Array.isArray(input)) {
|
|
601
|
+
return input.length ? false : true;
|
|
602
|
+
}
|
|
603
|
+
if (input.toString().trim() !== '') {
|
|
604
|
+
return false;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return true;
|
|
608
|
+
}
|
|
445
609
|
save() {
|
|
446
610
|
return __awaiter(this, void 0, void 0, function* () {
|
|
447
611
|
const validated = yield this.validateFormBase();
|
|
448
612
|
if (validated) {
|
|
613
|
+
if (this.logSetting.isEnableLog) {
|
|
614
|
+
if (!this.logSetting.isCustomAll) {
|
|
615
|
+
yield this.getLogValue();
|
|
616
|
+
}
|
|
617
|
+
// cấu hình thêm
|
|
618
|
+
yield this.onAfterGetLogValue();
|
|
619
|
+
this.model.data.logMetaData = JSON.stringify(this.logSetting.arrValueAfterUpdate.filter(p => p.visible));
|
|
620
|
+
}
|
|
449
621
|
yield this.onBeforeSave();
|
|
450
622
|
this.triggerSaveFileUpload();
|
|
451
623
|
if (this.autoSave) {
|
|
@@ -616,6 +788,9 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
616
788
|
this.model.submitting = false;
|
|
617
789
|
this.showMessageAfterUpdate(false, error);
|
|
618
790
|
});
|
|
791
|
+
if (this.logSetting.isEnableLog) {
|
|
792
|
+
this.logSetting.arrValueAfterUpdate = [];
|
|
793
|
+
}
|
|
619
794
|
});
|
|
620
795
|
}
|
|
621
796
|
handleUpdateError() {
|
|
@@ -733,4 +908,4 @@ DataFormBase.propDecorators = {
|
|
|
733
908
|
onFormReady: [{ type: Output }],
|
|
734
909
|
onDataBinded: [{ type: Output }]
|
|
735
910
|
};
|
|
736
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mb3JtLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvY2xhc3Nlcy9iYXNlL2RhdGEtZm9ybS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBbUIsaUJBQWlCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN6RyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0Ms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dEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUNsRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsV0FBVyxFQUFFLFFBQVE7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUM5RCxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDO0lBQ2pELENBQUM7SUFFRCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRUQsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQzs7O1lBNXZCSixTQUFTOzs7WUFoRE4sUUFBUTs7O3VCQW1EUCxTQUFTLFNBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzBCQUM5QyxTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtzQkFDekMsU0FBUyxTQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7NEJBRXJDLEtBQUs7b0JBQ0wsS0FBSzs0QkFDTCxLQUFLO3FCQUVMLE1BQU07c0JBQ04sTUFBTTt1QkFDTixNQUFNO3dCQUNOLE1BQU07MEJBQ04sTUFBTTsyQkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9maWxldXBsb2FkJztcbmltcG9ydCB7IENvbnRyb2xUcmVlTm9kZSwgQ3J1ZEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ09ORklHX0NBTEVOREFSX1ZJRVROQU1FU0UgfSBmcm9tICcuLi8uLi9jb25maWdzL2NhbGVuZGFyLmNvbmZpZyc7XG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcbmltcG9ydCB7IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2wsIEZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybSB9IGZyb20gJy4uLy4uL2NvbnN0L2NvbW1vbic7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL2VudW1zL2NvbW1vbic7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcbmltcG9ydCB7IFJlc3BvbnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Jlc3BvbnNlLXJlc3VsdCc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tUm91dGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2N1c3RvbS1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEb21TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZG9tLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LW1ldGFkYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0xpdGVyYWxPYmplY3QsIGlzVmFsaWREYXRlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQtc2NoZW1hJztcbmltcG9ydCB7XG4gICAgQ29udGFpbmVyU2NoZW1hLFxuICAgIENydWRGb3JtRGF0YSxcbiAgICBDcnVkRm9ybVNldHRpbmcsXG4gICAgQ3J1ZExpc3RTZXR0aW5nLFxuICAgIEN1c3RvbUNvbnRyb2xTY2hlbWEsXG4gICAgRGF0ZVRpbWVDb250cm9sU2NoZW1hLFxuICAgIERyb3Bkb3duQ29udHJvbFNjaGVtYSxcbiAgICBFdmVudERhdGEsXG4gICAgRXZlbnRUeXBlLFxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcbiAgICBGb3JtQ29udHJvbEJhc2UsXG4gICAgT3BlcmF0b3IsXG4gICAgU3dpdGNoQ29udHJvbFNjaGVtYSxcbiAgICBUYWJsZVNjaGVtYSxcbiAgICBUaXRsZVNjaGVtYVxufSBmcm9tICcuLi9mb3JtLXNjaGVtYSc7XG5pbXBvcnQgeyBDb21wb25lbnRCYXNlV2l0aEJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50LWJhc2Utd2l0aC1idXR0b24nO1xuaW1wb3J0IHsgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhRm9ybUJhc2UgZXh0ZW5kcyBDb21wb25lbnRCYXNlV2l0aEJ1dHRvbiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBWaWV3Q2hpbGQoQ3J1ZEZvcm1Db21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnZm9ybUVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBmb3JtRWxlbWVudDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdwVXBsb2FkJywgeyBzdGF0aWM6IHRydWUgfSkgcFVwbG9hZDogRmlsZVVwbG9hZDtcblxuICAgIEBJbnB1dCgpIHBhcmVudFNldHRpbmc6IENydWRMaXN0U2V0dGluZztcbiAgICBASW5wdXQoKSBtb2RlbDogQ3J1ZEZvcm1EYXRhID0gbmV3IENydWRGb3JtRGF0YSgpO1xuICAgIEBJbnB1dCgpIGZvcmNlT25seVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBvblNhdmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uU2F2ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbk1lc3NhZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uRm9ybVJlYWR5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkRhdGFCaW5kZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBkb05vdENoZWNrQmFzZVNlcnZpY2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIG5vdENvbmZpZ0Jhc2VTZXJ2aWNlTWVzc2FnZSA9ICdDaMawYSBj4bqldSBow6xuaCBDUlVEIGJhc2Ugc2VydmljZSc7XG4gICAgbWVzc2FnZUluc2VydFN1Y2Nlc3MgPSAnJztcbiAgICBtZXNzYWdlVXBkYXRlU3VjY2VzcyA9ICcnO1xuICAgIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcblxuICAgIHZpID0gQ09ORklHX0NBTEVOREFSX1ZJRVROQU1FU0U7XG5cbiAgICBmb3JtQ29udHJvbHM6IGFueTtcbiAgICBmb3JtQ29udHJvbHNMaXN0ID0ge307XG4gICAgZW52aXJvbm1lbnQ6IGFueSA9IHt9O1xuICAgIG1kV2lkdGhXb3JrZmxvdzogbnVtYmVyO1xuXG4gICAgYXV0b0dldERldGFpbCA9IHRydWU7XG4gICAgYXV0b1NhdmUgPSB0cnVlO1xuICAgIGlzQ2xvc2VGb3JtID0gdHJ1ZTtcbiAgICBtZXNzYWdlQ29uZmlybVNhdmU6IHN0cmluZztcbiAgICBzYXZpbmcgPSBmYWxzZTtcbiAgICBnZXREZXRhaWxQbHVzVXJsID0gbnVsbDtcbiAgICBpbnNlcnRQbHVzVXJsID0gbnVsbDtcbiAgICB1cGRhdGVQbHVzVXJsID0gbnVsbDtcbiAgICBkeW5hbWljQ29udHJvbDogYW55ID0ge307XG4gICAgc2V0VmFsaWRhdGVGb3JtID0gdHJ1ZTtcbiAgICBoYXZlRW50aXR5TWV0YWRhdGFBUEkgPSB0cnVlO1xuICAgIGlzQmFzZU1vZGVsID0gdHJ1ZTtcbiAgICBhdXRvR2VuZXJhdGVJZCA9IHRydWU7XG4gICAgcHVibGljIF9faXNGb3JtVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcbiAgICBwdWJsaWMgX3JvdXRlcjogUm91dGVyO1xuICAgIHB1YmxpYyBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlO1xuICAgIHB1YmxpYyBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZTtcbiAgICBwdWJsaWMgX2N1c3RvbVJvdXRlclNlcnZpY2U6IEN1c3RvbVJvdXRlclNlcnZpY2U7XG4gICAgcHVibGljIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2U7XG4gICAgcHVibGljIF9kb21TZXJ2aWNlOiBEb21TZXJ2aWNlO1xuICAgIHB1YmxpYyBfZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBFbnRpdHlNZXRhZGF0YVNlcnZpY2U7XG4gICAgcHVibGljIF91c2VyU2VydmljZTogVXNlclNlcnZpY2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgX2luamVjdG9yOiBJbmplY3RvclxuICAgICkge1xuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25maWdTZXJ2aWNlID0gX2luamVjdG9yLmdldChNb2R1bGVDb25maWdTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IG1vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3JvdXRlciA9IHRoaXMuX2luamVjdG9yLmdldChSb3V0ZXIpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuX2luamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ3VzdG9tUm91dGVyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENydWRTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fZG9tU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChEb21TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEVudGl0eU1ldGFkYXRhU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDb21tb25TZXJ2aWNlKTtcblxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyB0aGlzLmNoZWNrUGVybWlzc2lvbih0aGlzLm1vZGVsLmRhdGEuYmFzZVBlcm1pc3Npb24pO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5nID0gbmV3IENydWRGb3JtU2V0dGluZygpO1xuICAgICAgICBjb25zdCBjYXVIaW5oTmdoaWVwVnUgPSB0aGlzLmVudmlyb25tZW50Py5jYXVIaW5oTmdoaWVwVnU7XG4gICAgICAgIGlmIChjYXVIaW5oTmdoaWVwVnUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhdUhpbmhOZ2hpZXBWdSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U2V0dGluZ1trZXldID09IHRoaXMuc2V0dGluZ1trZXldXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZ1trZXldICE9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAmJiBjYXVIaW5oTmdoaWVwVnVba2V5XSAhPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nW2tleV0gIT0gY2F1SGluaE5naGllcFZ1W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nW2tleV0gPSBjYXVIaW5oTmdoaWVwVnVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIH1cbiAgICBjaGVja1Blcm1pc3Npb24oYmFzZVBlcm1pc3Npb24pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNCYXNlTW9kZWwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9PSBGb3JtU3RhdGUuRURJVCkge1xuICAgICAgICAgICAgICAgIGlmIChiYXNlUGVybWlzc2lvbiAmIFBlcm1pc3Npb25CYXNlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YS5pc0J1aWxkSW5BbGwgJiYgIXRoaXMuX3VzZXJTZXJ2aWNlLmlzU3VwZXJVc2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuVklFVztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9faXNGb3JtVmlldyA9IHRoaXMuX2lzRm9ybVZpZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFNjaGVtYUJhc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl91c2VyU2VydmljZS5pc1N1cGVyVXNlcigpXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLmRhdGEuaGFzQnVpbGRJblxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYVxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBTd2l0Y2hDb250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdpc0J1aWxkSW4nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0tow7NhIG3DoycsXG4gICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgU3dpdGNoQ29udHJvbFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnaXNCdWlsZEluQWxsJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdLaMOzYSBi4bqjbiBnaGknLFxuICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiA0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nXG4gICAgICAgICAgICAmJiB0aGlzLl9pc0Zvcm1BZGROZXcoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBkYXRhU291cmNlID0gW10sIGRlZmF1bHRWYWx1ZSA9IG51bGwsIGhhc1dvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpbml0RGF0YVRhc2tGb3JtOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3ICYmIHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcud29ya2Zsb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93cztcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93Q29kZTtcbiAgICAgICAgICAgICAgICBoYXNXb3JrZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhLmNyZWF0ZVRhc2tJbnN0ZWFkID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5jcmVhdGVUYXNrSW5zdGVhZDtcbiAgICAgICAgICAgICAgICBpbml0RGF0YVRhc2tGb3JtLmlkTG9haUNvbmdWaWVjID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5pZExvYWlDb25nVmllY0RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgaW5pdERhdGFUYXNrRm9ybS5fX3RlbXBsYXRlVGFza05hbWUgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LnRlbXBsYXRlVGFza05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudFNldHRpbmcuaXNXb3JrZmxvd1RyZWUpIHtcbiAgICAgICAgICAgICAgICBoYXNXb3JrZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzV29ya2Zsb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gbmV3IEN1c3RvbUNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogMTIsXG4gICAgICAgICAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnbm8tcGFkZGluZycsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluaXREYXRhVGFza0Zvcm0sXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8ICFyb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBEcm9wZG93bkNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IEZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUXV5IHRyw6xuaCBz4butIGThu6VuZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGaWVsZDogJ2NvZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkOiAndGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogdGhpcy5tZFdpZHRoV29ya2Zsb3cgfHwgMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8IHJvb3RNb2RlbC5jcmVhdGVUYXNrSW5zdGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlZDogYXN5bmMgKGV2dDogRXZlbnREYXRhKSA9PiBhd2FpdCB0aGlzLmhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25BZGp1c3RlZFZhbHVlOiBhc3luYyAoZXZ0OiBFdmVudERhdGEpID0+IGF3YWl0IHRoaXMuaGFuZGxlQ2hhbmdlV29ya2Zsb3dDb2RlKGV2dClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3XG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcudGFza0luc2lkZUJ1c2luZXNzRm9ybVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGl0bGVTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDw7RuZyB2aeG7h2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8ICFyb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQ6IEV2ZW50RGF0YSkge1xuXG4gICAgfVxuXG4gICAgc2V0V29ya2Zsb3dEYXRhc291cmNlKGV2dDogRXZlbnREYXRhLCB3b3JrZmxvd1NldHRpbmcpIHtcbiAgICAgICAgZXZ0LmZvcm1Db250cm9sc1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dLmRhdGFTb3VyY2UgPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzO1xuICAgICAgICBpZiAoIWV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSkge1xuICAgICAgICAgICAgZXZ0LnJvb3RNb2RlbFtGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93Q29kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5zb21lKHggPT4geC5jb2RlID09IGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSkpIHtcbiAgICAgICAgICAgIGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfaGFuZGxlRm9ybVJlYWR5KGZvcm1FdmVudDogRXZlbnREYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX19oYW5kbGVGb3JtUmVhZHkoZm9ybUV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9faGFuZGxlRm9ybVJlYWR5KGZvcm1FdmVudDogRXZlbnREYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5kb05vdENoZWNrQmFzZVNlcnZpY2UgJiYgIXRoaXMuc2V0dGluZy5iYXNlU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMubm90Q29uZmlnQmFzZVNlcnZpY2VNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1Db250cm9scyA9IGZvcm1FdmVudC5mb3JtQ29udHJvbHM7XG4gICAgICAgIGF3YWl0IHRoaXMub25Gb3JtSW5pdGlhbGl6ZWQoZm9ybUV2ZW50KTtcbiAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMsXG4gICAgICAgICAgICBzZXR0aW5nOiB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgICBmb3JtRXZlbnRcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJHZXREZXRhaWwoKTtcbiAgICB9XG5cbiAgICBfdHJpZ2dlckdldERldGFpbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0dldERldGFpbCkge1xuICAgICAgICAgICAgdGhpcy5nZXREZXRhaWwoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5pbml0Q29udHJvbERlZmF1bHRWYWx1ZUZyb21FeHRlcm5hbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25CZWZvcmVHZXREZXRhaWwoKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T2JqZWN0RGV0YWlsKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5nZXREZXRhaWxXaXRoUGVybWlzc2lvbih0aGlzLm1vZGVsLmRhdGEuaWQsIHRoaXMubW9kZWwuZGF0YS5waWQsIHRoaXMuZ2V0RGV0YWlsUGx1c1VybCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RGV0YWlsQ3VzdG9tKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXREZXRhaWwoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdENoZWNrID0gYXdhaXQgdGhpcy5nZXREZXRhaWxDdXN0b20oKTtcbiAgICAgICAgLy8gS2jDtG5nIG92ZXJyaWRlXG4gICAgICAgIGlmIChyZXN1bHRDaGVjayA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRm9ybUFkZE5ldygpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZUdldERldGFpbCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc2V0SXNMb2FkZWREYXRhRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3REZXRhaWwoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1vZGlmeURldGFpbERhdGEocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Byb2Nlc3NBZnRlckdldERhdGEocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyR2V0RGV0YWlsKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3J1ZEZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLmNydWRGb3JtLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogRXZlbnRUeXBlLkZPUk1fUkVBRFksXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpcy5jcnVkRm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0RGF0YUFkZChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRTZXR0aW5nRmlsZUNvbnRyb2woZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLmluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVycmlkZSBjw6FjaCBs4bqleSBk4buvIGxp4buHdSBnZXREZXRhaWxcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0Q2hlY2suc3VjY2VzcyAmJiByZXN1bHRDaGVjay5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmZvcm1TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5FRElUO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLnNldElzTG9hZGVkRGF0YUVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1vZGlmeURldGFpbERhdGEocmVzdWx0Q2hlY2suZGF0YSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJvY2Vzc0FmdGVyR2V0RGF0YShyZXN1bHRDaGVjay5kYXRhKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJHZXREZXRhaWwocmVzdWx0Q2hlY2suZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5BREQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3J1ZEZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLmNydWRGb3JtLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2Zvcm1SZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpcy5jcnVkRm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0RGF0YUFkZChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRTZXR0aW5nRmlsZUNvbnRyb2woZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLmluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGluaXREYXRhQWRkKGV2dDogRXZlbnREYXRhKSB7IH1cblxuICAgIHByaXZhdGUgaW5pdERlZmF1bHRTZXR0aW5nRmlsZUNvbnRyb2woZXZ0OiBFdmVudERhdGEpIHtcbiAgICAgICAgaWYgKCFldnQucm9vdE1vZGVsLmlkICYmIHRoaXMuc2V0dGluZy5zY2hlbWEuc29tZShwID0+IChwIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSkpIHtcbiAgICAgICAgICAgIGV2dC5yb290TW9kZWwuaWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBo4bqjaSBn4buNaSBow6BtIG7DoHkga2hpIG92ZXJyaWRlIGdldERldGFpbFxuICAgICAqL1xuICAgIGFzeW5jIF9wcm9jZXNzQWZ0ZXJHZXREYXRhKGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBEdXnhu4d0IGPDoWMgY29udHJvbCBkYXRldGltZSDEkeG7gyBjb252ZXJ0IHZhbHVlIHNhbmcgZGF0ZXRpbWVcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEuZm9yRWFjaChzY2hlbWEgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZml4RGF0ZVZhbHVlKHNjaGVtYSwgZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLl9fZGlzYWJsZUVkaXQgPSB0aGlzLm1vZGVsLmRhdGEuX19kaXNhYmxlRWRpdDtcblxuICAgICAgICAvLyBTZXQgYmFzZVBlcm1pc3Npb24gdOG7qyBjcnVkbGlzdFxuICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uICYmIHRoaXMubW9kZWwuZGF0YS5iYXNlUGVybWlzc2lvbiA9PT0gUGVybWlzc2lvbkJhc2UuRlVMTCkge1xuICAgICAgICAgICAgZGF0YS5iYXNlUGVybWlzc2lvbiA9IHRoaXMubW9kZWwuZGF0YS5iYXNlUGVybWlzc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kZWwuZGF0YSA9IGRhdGE7XG4gICAgICAgIGlmIChkYXRhLnBpZCAmJiBkYXRhLnBpZCAhPSB0aGlzLmd1aWRFbXB0eSAmJiBkYXRhLmJhc2VQZXJtaXNzaW9uQnlQaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Blcm1pc3Npb24oZGF0YS5iYXNlUGVybWlzc2lvbkJ5UGlkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tQZXJtaXNzaW9uKGRhdGEuYmFzZVBlcm1pc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvcmNlT25seVZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX19pc0Zvcm1WaWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5zd2l0Y2hWaWV3TW9kZSh0aGlzLl9faXNGb3JtVmlldyk7XG4gICAgICAgICAgICB0aGlzLmNydWRGb3JtLnN3aXRjaEZvcm1TdGF0ZUZvclVzZXJwaWNrZXIodGhpcy5faXNGb3JtQWRkTmV3KCkpO1xuICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc2V0SXNMb2FkZWREYXRhRWRpdCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2VcbiAgICAgICAgICAgICYmIHRoaXMuaGF2ZUVudGl0eU1ldGFkYXRhQVBJIC8vIHNldHRpbmcgxJHhu4MgZml4IGzhu5dpIGsgbG9hZCBkYyBlbnRpdHkgbWV0YWRhdGEgY2hvIGPGoSBj4bqldSB04buVIGNo4bupYyBzZXJ2aWNlXG4gICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlLmxvYWQodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCB0aGlzLmNvbnRleHQsIHRydWUpOyAvLyBmb3JjZSBsb2FkIMSR4buDIMSR4buNYyB04burIGNzZGxcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZVZlcnNpb24gPSB0aGlzLl9lbnRpdHlNZXRhZGF0YVNlcnZpY2UuZ2V0QnlDb2RlKCdlbmFibGVWZXJzaW9uJyk7XG4gICAgICAgICAgICBpZiAoZW5hYmxlVmVyc2lvbiA9PSAnMScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZmlsdGVyQ2hlY2tFeGlzdEJ5VmVyc2lvbiA9IFtcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2NvZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLm5vdEVxdWFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHRoaXMubW9kZWwuZGF0YS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc2FibGVCdWlsZEluRmllbGQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpeERhdGVWYWx1ZShjb250cm9sLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZml4RGF0ZVZhbHVlKHN1YkNvbnRyb2wsIGl0ZW0sIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhEYXRlVmFsdWUoc3ViQ29udHJvbCwgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIF9wYXJlbnRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wudGltZU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShTdHJpbmcocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkRGF0ZShkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gdGhpcy5fY29tbW9uU2VydmljZS5nZXRUaW1lKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZUJ1aWxkSW5GaWVsZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0Zvcm1BZGROZXcoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YS5pc0J1aWxkSW5BbGwgJiYgIXRoaXMuX3VzZXJTZXJ2aWNlLmlzU3VwZXJVc2VyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FkZFJlcXVpcmVkVmFsaWRhdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XG4gICAgICAgIGxldCBleGlzdCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBzY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgZXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZXhpc3QpIHtcbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFJlcXVpcmVkVmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICAgIHNjaGVtYS5yZXF1aXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX3JlbW92ZVJlcXVpcmVkVmFsaWRhdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2Ygc2NoZW1hLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvcikge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG4gICAgICAgIHNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9zZXRNb2RlbFZhbHVlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY3J1ZEZvcm0uX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xuICAgICAgICB0aGlzLl9zZXRNb2RlbFZhbHVlQnlOb2RlKG5vZGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBfc2V0TW9kZWxWYWx1ZUJ5Tm9kZShub2RlOiBDb250cm9sVHJlZU5vZGUsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgbm9kZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG1vZGlmeURldGFpbERhdGEoZGF0YSkge1xuICAgIH1cblxuICAgIF90cmlnZ2VyU2F2ZSgpIHtcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzYXZlKCkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRm9ybUJhc2UoKTtcbiAgICAgICAgaWYgKHZhbGlkYXRlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclNhdmVGaWxlVXBsb2FkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0Zvcm1FZGl0KCkgfHwgdGhpcy5faXNGb3JtVmlldygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25VcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5faXNGb3JtQWRkTmV3KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkluc2VydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybSB2aWV3LCBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNYW51YWxTYXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZU1hbnVhbFNhdmUoKSB7XG5cbiAgICB9XG5cbiAgICB0cmlnZ2VyU2F2ZUZpbGVVcGxvYWQoKSB7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uU0FWRV9GSUxFX0lOX0ZPUk0pO1xuICAgIH1cblxuICAgIGFzeW5jIF9nZXRSZXN1bHRWYWxpZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFsaWRhdGVGb3JtQmFzZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybShyZXN1bHRWYWxpZGF0ZUJhc2U6IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZvcm1CYXNlKCkge1xuICAgICAgICBsZXQgcmVzdWx0VmFsaWRhdGVCYXNlID0gdHJ1ZTtcbiAgICAgICAgLy8gQ8OzIHRo4buDIGPDsyBmb3JtIGsgY8OzIGNydWQtZm9ybSAoVsOsIGzDoCBmb3JtIG1hc3RlciBj4bunYSBjw6FjIGZvcm0gY29uKVxuICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgcmVzdWx0VmFsaWRhdGVCYXNlID0gYXdhaXQgdGhpcy5jcnVkRm9ybS52YWxpZGF0ZUZvcm0odGhpcy5zZXRWYWxpZGF0ZUZvcm0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdFZhbGlkYXRlID0gYXdhaXQgdGhpcy52YWxpZGF0ZUZvcm0ocmVzdWx0VmFsaWRhdGVCYXNlKTtcbiAgICAgICAgLy8gQuG7jyBjaGVjayB2YWxpZCBmb3JtIGPDtG5nIHZp4buHYy4gbuG6v3UgbmjGsCBmb3JtIGPDtG5nIHZp4buHYyBraMO0bmcgdmFsaWQgdGjDrCBraMO0bmcgdOG7sSDEkeG7mW5nIHThuqFvIGPDtG5nIHZp4buHY1xuICAgICAgICAvLyBpZiAodGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXVxuICAgICAgICAvLyAgICAgJiYgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXS5fY29tcG9uZW50XG4gICAgICAgIC8vICkge1xuICAgICAgICAvLyAgICAgY29uc3QgdGFza0Zvcm0gPSB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdLl9jb21wb25lbnQ7XG4gICAgICAgIC8vICAgICBjb25zdCByZXN1bHRWYWxpZGF0ZUZvcm1UYXNrID0gYXdhaXQgdGFza0Zvcm0uX2dldFJlc3VsdFZhbGlkYXRlKCk7XG4gICAgICAgIC8vICAgICByZXN1bHRWYWxpZGF0ZSA9IHJlc3VsdFZhbGlkYXRlRm9ybVRhc2sgJiYgcmVzdWx0VmFsaWRhdGU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFZhbGlkYXRlICYmIHJlc3VsdFZhbGlkYXRlQmFzZTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3J1ZEZvcm0udmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpO1xuICAgIH1cblxuICAgIF9jbGVhbkZvcm0oKSB7XG4gICAgICAgIHRoaXMuY3J1ZEZvcm0uY2xlYW4oKTtcbiAgICB9XG5cbiAgICBfdHJpZ2dlckNvbnRyb2xDaGFuZ2UoZmllbGRQYXRoKSB7XG4gICAgICAgIHRoaXMuY3J1ZEZvcm0udHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpO1xuICAgIH1cblxuICAgIG9uQmVmb3JlU2F2ZSgpOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgfVxuXG4gICAgb25BZnRlclNhdmUocmVzcG9uc2U6IFJlc3BvbnNlUmVzdWx0KTogdm9pZCB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIH1cblxuXG4gICAgYXN5bmMgb25BZnRlckdldERldGFpbChkYXRhPzogYW55W10pIHtcblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25JbnNlcnQoKSB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKHRoaXMubW9kZWwuZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdXG4gICAgICAgICAgICAmJiB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdLl9jb21wb25lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB0YXNrRm9ybSA9IHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF0uX2NvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFZhbGlkYXRlRm9ybVRhc2sgPSBhd2FpdCB0YXNrRm9ybS5fZ2V0UmVzdWx0VmFsaWRhdGUoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRWYWxpZGF0ZUZvcm1UYXNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhLml0ZW1Db25nVmllYyA9IHRhc2tGb3JtLm1vZGVsLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YS5jcmVhdGVUYXNrSW5zdGVhZCkge1xuICAgICAgICAgICAgLy8gcmVzZXQgZmllbGQgX1dvcmtmbG93Q29kZSDEkeG7gyBiYWNrZW5kIGtow7RuZyBjaOG6oXkgcXV5IHRyw6xuaCBi4bqjbiBnaGlcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVtGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbmZpcm1JZlJlcXVpcmUoKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5faW5zZXJ0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb25maXJtSWZSZXF1aXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlQ29uZmlybVNhdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0odGhpcy5tZXNzYWdlQ29uZmlybVNhdmUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5zZXJ0KCkge1xuICAgICAgICB0aGlzLmdldFByb21pc2VBY3Rpb25JbnNlcnQoKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2VBZnRlckluc2VydChyZXNwb25zZS5zdWNjZXNzLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhLmlkID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyU2F2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TYXZlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLm1vZGVsLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlRm9ybTogdGhpcy5pc0Nsb3NlRm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5zZXJ0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5lcnJvci5zdWNjZXNzICYmIGVycm9yLmVycm9yLmVycm9yQ2hlY2tFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJJbnNlcnQoZmFsc2UsIGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByb21pc2VBY3Rpb25JbnNlcnQoKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnBvc3QodGhpcy5tb2RlbC5kYXRhLCB0aGlzLmluc2VydFBsdXNVcmwpO1xuICAgIH1cblxuICAgIGhhbmRsZUluc2VydEVycm9yKCkge1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWUodGhpcy5tb2RlbC5kYXRhKTtcbiAgICAgICAgdGhpcy5nZXRQcm9taXNlQWN0aW9uVXBkYXRlKClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJVcGRhdGUocmVzcG9uc2Uuc3VjY2VzcywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlclNhdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2F2ZWQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbC5kYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VGb3JtOiB0aGlzLmlzQ2xvc2VGb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yLmVycm9yLnN1Y2Nlc3MgJiYgZXJyb3IuZXJyb3IuZXJyb3JDaGVja0V4aXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2VBZnRlclVwZGF0ZShmYWxzZSwgZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlVXBkYXRlRXJyb3IoKSB7XG5cbiAgICB9XG5cbiAgICBnZXRQcm9taXNlQWN0aW9uVXBkYXRlKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5wdXQodGhpcy5tb2RlbC5kYXRhLmlkLnRvU3RyaW5nKCksIHRoaXMubW9kZWwuZGF0YSwgdGhpcy51cGRhdGVQbHVzVXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERlZmF1bHRWYWx1ZShtb2RlbCkge1xuICAgICAgICBpZiAobW9kZWwuaXNCdWlsZEluID09PSBudWxsIHx8IG1vZGVsLmlzQnVpbGRJbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtb2RlbC5pc0J1aWxkSW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RlbC5pc0J1aWxkSW5BbGwgPT09IG51bGwgfHwgbW9kZWwuaXNCdWlsZEluQWxsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1vZGVsLmlzQnVpbGRJbkFsbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmc/LmVuYWJsZVJlb3JkZXJSb3cgJiYgdGhpcy5wYXJlbnRTZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbdGhpcy5wYXJlbnRTZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkXSA/Pz0gdGhpcy5wYXJlbnRNb2RlbC50b3RhbCArIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dNZXNzYWdlQWZ0ZXJJbnNlcnQoaXNTdWNjZXNzOiBib29sZWFuID0gZmFsc2UsIGVycm9yPzogYW55KSB7XG4gICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUluc2VydFN1Y2Nlc3MgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ01FU1NBR0UuSU5TRVJUX0RBVEFfU1VDQ0VTUycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZUluc2VydFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93TWVzc2FnZUFmdGVyVXBkYXRlKGlzU3VjY2VzczogYm9vbGVhbiA9IGZhbHNlLCBlcnJvcj86IGFueSkge1xuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGVTdWNjZXNzID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdNRVNTQUdFLlVQREFURV9EQVRBX1NVQ0NFU1MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VVcGRhdGVTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlcnJvci5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGVycm9yLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ8OzIGzhu5dpIHjhuqN5IHJhLCBsacOqbiBo4buHIHF14bqjbiB0cuG7iyB2acOqbiDEkeG7gyBiaeG6v3QgdGjDqm0gY2hpIHRp4bq/dCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25Gb3JtSW5pdGlhbGl6ZWQoZGF0YTogRXZlbnREYXRhKSB7XG5cbiAgICB9XG5cbiAgICBfaGFuZGxlQWZ0ZXJUcmluaEt5KGV2dCkge1xuICAgICAgICBkZWxldGUgdGhpcy5tb2RlbC5kYXRhW0tleUZsYXNoU2hvd107XG4gICAgICAgIHRoaXMuX2hhbmRsZUNhbmNlbChldnQpO1xuICAgIH1cblxuICAgIF9oYW5kbGVTYXZlKGV2dCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5zdWJtaXR0aW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB0aGlzLm9uU2F2ZS5lbWl0KGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZUNhbmNlbChldnQpIHtcbiAgICAgICAgdGhpcy5vbkNhbmNlbC5lbWl0KGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZU1lc3NhZ2UoZXZ0KSB7XG4gICAgICAgIHRoaXMub25NZXNzYWdlLmVtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICBfc2V0RGlzYWJsZUNvbnRyb2wodW5pcXVlRmllbGQsIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbdW5pcXVlRmllbGRdLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBfc2V0SGlkZGVuQ29udHJvbCh1bmlxdWVGaWVsZCwgaXNIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbdW5pcXVlRmllbGRdLmhpZGRlbiA9IGlzSGlkZGVuO1xuICAgIH1cblxuICAgIF9nZXRGb3JtU3RhdGUoKTogRm9ybVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZm9ybVN0YXRlO1xuICAgIH1cblxuICAgIF9pc0Zvcm1BZGROZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuQUREO1xuICAgIH1cblxuICAgIF9pc0Zvcm1FZGl0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybVN0YXRlKCkgPT0gRm9ybVN0YXRlLkVESVQ7XG4gICAgfVxuXG4gICAgX2lzRm9ybVZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuVklFVztcbiAgICB9XG59XG4iXX0=
|
|
911
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mb3JtLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvY2xhc3Nlcy9iYXNlL2RhdGEtZm9ybS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBbUIsaUJBQWlCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN6RyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUs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IERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9maWxldXBsb2FkJztcbmltcG9ydCB7IENvbnRyb2xUcmVlTm9kZSwgQ3J1ZEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ09ORklHX0NBTEVOREFSX1ZJRVROQU1FU0UgfSBmcm9tICcuLi8uLi9jb25maWdzL2NhbGVuZGFyLmNvbmZpZyc7XG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcbmltcG9ydCB7IERhdGFTb3VyY2VCb29sZWFuLCBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sLCBGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm0gfSBmcm9tICcuLi8uLi9jb25zdC9jb21tb24nO1xuaW1wb3J0IHsgUGVybWlzc2lvbkJhc2UgfSBmcm9tICcuLi8uLi9lbnVtcy9jb21tb24nO1xuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XG5pbXBvcnQgeyBSZXNwb25zZVJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVscy9yZXNwb25zZS1yZXN1bHQnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbVJvdXRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jdXN0b20tcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRG9tU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RvbS5zZXJ2aWNlJztcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudGl0eS1tZXRhZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE1hc3RlckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFzdGVyLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybVN0YXRlLCBLZXlGbGFzaFNob3cgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNMaXRlcmFsT2JqZWN0LCBpc1ZhbGlkRGF0ZSB9IGZyb20gJy4uL2Vudmlyb25tZW50LXNjaGVtYSc7XG5pbXBvcnQge1xuICAgIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ2hlY2tib3hDb250cm9sU2NoZW1hLFxuICAgIENvbnRhaW5lclNjaGVtYSxcbiAgICBDcnVkRm9ybURhdGEsXG4gICAgQ3J1ZEZvcm1TZXR0aW5nLFxuICAgIENydWRMaXN0U2V0dGluZyxcbiAgICBDdXN0b21Db250cm9sU2NoZW1hLFxuICAgIERhdGVUaW1lQ29udHJvbFNjaGVtYSxcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXG4gICAgRWRpdG9yQ29udHJvbFNjaGVtYSxcbiAgICBFdmVudERhdGEsXG4gICAgRXZlbnRUeXBlLFxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcbiAgICBGb3JtQ29udHJvbEJhc2UsXG4gICAgTG9nQ29sdW1uLFxuICAgIExvZ1NldHRpbmcsXG4gICAgTWFza0NvbnRyb2xTY2hlbWEsXG4gICAgT3BlcmF0b3IsXG4gICAgU3dpdGNoQ29udHJvbFNjaGVtYSxcbiAgICBUYWJsZVNjaGVtYSxcbiAgICBUZXh0QXJlYUNvbnRyb2xTY2hlbWEsXG4gICAgVGl0bGVTY2hlbWFcbn0gZnJvbSAnLi4vZm9ybS1zY2hlbWEnO1xuaW1wb3J0IHsgQ29tcG9uZW50QmFzZVdpdGhCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudC1iYXNlLXdpdGgtYnV0dG9uJztcbmltcG9ydCB7IFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcbmltcG9ydCB7IERlY2ltYWxQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGF0YUZvcm1CYXNlIGV4dGVuZHMgQ29tcG9uZW50QmFzZVdpdGhCdXR0b24gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgICBAVmlld0NoaWxkKENydWRGb3JtQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2Zvcm1FbGVtZW50JywgeyBzdGF0aWM6IHRydWUgfSkgZm9ybUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgncFVwbG9hZCcsIHsgc3RhdGljOiB0cnVlIH0pIHBVcGxvYWQ6IEZpbGVVcGxvYWQ7XG5cbiAgICBASW5wdXQoKSBwYXJlbnRTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmc7XG4gICAgQElucHV0KCkgbW9kZWw6IENydWRGb3JtRGF0YSA9IG5ldyBDcnVkRm9ybURhdGEoKTtcbiAgICBASW5wdXQoKSBmb3JjZU9ubHlWaWV3OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KCkgb25TYXZlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvblNhdmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkNhbmNlbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25NZXNzYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkZvcm1SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25EYXRhQmluZGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgZG9Ob3RDaGVja0Jhc2VTZXJ2aWNlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBub3RDb25maWdCYXNlU2VydmljZU1lc3NhZ2UgPSAnQ2jGsGEgY+G6pXUgaMOsbmggQ1JVRCBiYXNlIHNlcnZpY2UnO1xuICAgIG1lc3NhZ2VJbnNlcnRTdWNjZXNzID0gJyc7XG4gICAgbWVzc2FnZVVwZGF0ZVN1Y2Nlc3MgPSAnJztcbiAgICBzZXR0aW5nOiBDcnVkRm9ybVNldHRpbmcgPSBuZXcgQ3J1ZEZvcm1TZXR0aW5nKCk7XG4gICAgbG9nU2V0dGluZzogTG9nU2V0dGluZyA9IG5ldyBMb2dTZXR0aW5nKCk7XG5cbiAgICB2aSA9IENPTkZJR19DQUxFTkRBUl9WSUVUTkFNRVNFO1xuXG4gICAgZm9ybUNvbnRyb2xzOiBhbnk7XG4gICAgZm9ybUNvbnRyb2xzTGlzdCA9IHt9O1xuICAgIGVudmlyb25tZW50OiBhbnkgPSB7fTtcbiAgICBtZFdpZHRoV29ya2Zsb3c6IG51bWJlcjtcblxuICAgIGF1dG9HZXREZXRhaWwgPSB0cnVlO1xuICAgIGF1dG9TYXZlID0gdHJ1ZTtcbiAgICBpc0Nsb3NlRm9ybSA9IHRydWU7XG4gICAgbWVzc2FnZUNvbmZpcm1TYXZlOiBzdHJpbmc7XG4gICAgc2F2aW5nID0gZmFsc2U7XG4gICAgZ2V0RGV0YWlsUGx1c1VybCA9IG51bGw7XG4gICAgaW5zZXJ0UGx1c1VybCA9IG51bGw7XG4gICAgdXBkYXRlUGx1c1VybCA9IG51bGw7XG4gICAgZHluYW1pY0NvbnRyb2w6IGFueSA9IHt9O1xuICAgIHNldFZhbGlkYXRlRm9ybSA9IHRydWU7XG4gICAgaGF2ZUVudGl0eU1ldGFkYXRhQVBJID0gdHJ1ZTtcbiAgICBpc0Jhc2VNb2RlbCA9IHRydWU7XG4gICAgYXV0b0dlbmVyYXRlSWQgPSB0cnVlO1xuICAgIHB1YmxpYyBfX2lzRm9ybVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2U7XG4gICAgcHVibGljIF9tYXN0ZXJEYXRhU2VydmljZTogTWFzdGVyRGF0YVNlcnZpY2U7XG4gICAgcHVibGljIF9yb3V0ZXI6IFJvdXRlcjtcbiAgICBwdWJsaWMgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcbiAgICBwdWJsaWMgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2U7XG4gICAgcHVibGljIF9jdXN0b21Sb3V0ZXJTZXJ2aWNlOiBDdXN0b21Sb3V0ZXJTZXJ2aWNlO1xuICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlO1xuICAgIHB1YmxpYyBfZG9tU2VydmljZTogRG9tU2VydmljZTtcbiAgICBwdWJsaWMgX2VudGl0eU1ldGFkYXRhU2VydmljZTogRW50aXR5TWV0YWRhdGFTZXJ2aWNlO1xuICAgIHB1YmxpYyBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlO1xuICAgIHB1YmxpYyBfbnVtYmVyUGlwZTogRGVjaW1hbFBpcGU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgX2luamVjdG9yOiBJbmplY3RvclxuICAgICkge1xuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25maWdTZXJ2aWNlID0gX2luamVjdG9yLmdldChNb2R1bGVDb25maWdTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IG1vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9udW1iZXJQaXBlID0gdGhpcy5faW5qZWN0b3IuZ2V0KERlY2ltYWxQaXBlKTtcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTWFzdGVyRGF0YVNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGVkUm91dGUgPSB0aGlzLl9pbmplY3Rvci5nZXQoQWN0aXZhdGVkUm91dGUpO1xuICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEN1c3RvbVJvdXRlclNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9jcnVkU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDcnVkU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2RvbVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRG9tU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2VudGl0eU1ldGFkYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChFbnRpdHlNZXRhZGF0YVNlcnZpY2UpO1xuICAgICAgICB0aGlzLl91c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ29tbW9uU2VydmljZSk7XG5cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gdGhpcy5jaGVja1Blcm1pc3Npb24odGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uKTtcblxuICAgICAgICBjb25zdCBkZWZhdWx0U2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcbiAgICAgICAgY29uc3QgY2F1SGluaE5naGllcFZ1ID0gdGhpcy5lbnZpcm9ubWVudD8uY2F1SGluaE5naGllcFZ1O1xuICAgICAgICBpZiAoY2F1SGluaE5naGllcFZ1KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXVIaW5oTmdoaWVwVnUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNldHRpbmdba2V5XSA9PSB0aGlzLnNldHRpbmdba2V5XVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnNldHRpbmdba2V5XSAhPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgY2F1SGluaE5naGllcFZ1W2tleV0gIT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZ1trZXldICE9IGNhdUhpbmhOZ2hpZXBWdVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ1trZXldID0gY2F1SGluaE5naGllcFZ1W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB9XG4gICAgY2hlY2tQZXJtaXNzaW9uKGJhc2VQZXJtaXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQmFzZU1vZGVsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5mb3JtU3RhdGUgPT0gRm9ybVN0YXRlLkVESVQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVBlcm1pc3Npb24gJiBQZXJtaXNzaW9uQmFzZS5FRElUKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkVESVQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5WSUVXO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuaXNCdWlsZEluQWxsICYmICF0aGlzLl91c2VyU2VydmljZS5pc1N1cGVyVXNlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX2lzRm9ybVZpZXcgPSB0aGlzLl9pc0Zvcm1WaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRTY2hlbWFCYXNlKCkge1xuICAgICAgICBpZiAodGhpcy5fdXNlclNlcnZpY2UuaXNTdXBlclVzZXIoKVxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbFxuICAgICAgICAgICAgJiYgdGhpcy5tb2RlbC5kYXRhLmhhc0J1aWxkSW5cbiAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZy5zY2hlbWFcbiAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZy5zY2hlbWEubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgU3dpdGNoQ29udHJvbFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnaXNCdWlsZEluJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdLaMOzYSBtw6MnLFxuICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiA0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IFN3aXRjaENvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2lzQnVpbGRJbkFsbCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnS2jDs2EgYuG6o24gZ2hpJyxcbiAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50U2V0dGluZ1xuICAgICAgICAgICAgJiYgdGhpcy5faXNGb3JtQWRkTmV3KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZGF0YVNvdXJjZSA9IFtdLCBkZWZhdWx0VmFsdWUgPSBudWxsLCBoYXNXb3JrZmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgaW5pdERhdGFUYXNrRm9ybTogYW55ID0ge307XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldyAmJiB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93cy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy53b3JrZmxvd3M7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy53b3JrZmxvd0NvZGU7XG4gICAgICAgICAgICAgICAgaGFzV29ya2Zsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5jcmVhdGVUYXNrSW5zdGVhZCA9IHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcuY3JlYXRlVGFza0luc3RlYWQ7XG4gICAgICAgICAgICAgICAgaW5pdERhdGFUYXNrRm9ybS5pZExvYWlDb25nVmllYyA9IHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcuaWRMb2FpQ29uZ1ZpZWNEZWZhdWx0O1xuICAgICAgICAgICAgICAgIGluaXREYXRhVGFza0Zvcm0uX190ZW1wbGF0ZVRhc2tOYW1lID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy50ZW1wbGF0ZVRhc2tOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLmlzV29ya2Zsb3dUcmVlKSB7XG4gICAgICAgICAgICAgICAgaGFzV29ya2Zsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1dvcmtmbG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXSA9IG5ldyBDdXN0b21Db250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDEyLFxuICAgICAgICAgICAgICAgICAgICBzaG93TGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogJ25vLXBhZGRpbmcnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpbml0RGF0YVRhc2tGb3JtLFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5DaGVjazogKHJvb3RNb2RlbCkgPT4gIXJvb3RNb2RlbCB8fCAhcm9vdE1vZGVsLmNyZWF0ZVRhc2tJbnN0ZWFkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1F1eSB0csOsbmggc+G7rSBk4bulbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ6ICdjb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZDogJ3RpdGxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IHRoaXMubWRXaWR0aFdvcmtmbG93IHx8IDEyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQ2FjaGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5DaGVjazogKHJvb3RNb2RlbCkgPT4gIXJvb3RNb2RlbCB8fCByb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZWQ6IGFzeW5jIChldnQ6IEV2ZW50RGF0YSkgPT4gYXdhaXQgdGhpcy5oYW5kbGVDaGFuZ2VXb3JrZmxvd0NvZGUoZXZ0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQWRqdXN0ZWRWYWx1ZTogYXN5bmMgKGV2dDogRXZlbnREYXRhKSA9PiBhd2FpdCB0aGlzLmhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ld1xuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LnRhc2tJbnNpZGVCdXNpbmVzc0Zvcm1cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRpdGxlU2NoZW1hKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ8O0bmcgdmnhu4djJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5DaGVjazogKHJvb3RNb2RlbCkgPT4gIXJvb3RNb2RlbCB8fCAhcm9vdE1vZGVsLmNyZWF0ZVRhc2tJbnN0ZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VXb3JrZmxvd0NvZGUoZXZ0OiBFdmVudERhdGEpIHtcblxuICAgIH1cblxuICAgIHNldFdvcmtmbG93RGF0YXNvdXJjZShldnQ6IEV2ZW50RGF0YSwgd29ya2Zsb3dTZXR0aW5nKSB7XG4gICAgICAgIGV2dC5mb3JtQ29udHJvbHNbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXS5kYXRhU291cmNlID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cztcbiAgICAgICAgaWYgKCFldnQucm9vdE1vZGVsW0ZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybV0pIHtcbiAgICAgICAgICAgIGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXdvcmtmbG93U2V0dGluZy53b3JrZmxvd3Muc29tZSh4ID0+IHguY29kZSA9PSBldnQucm9vdE1vZGVsW0ZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybV0pKSB7XG4gICAgICAgICAgICBldnQucm9vdE1vZGVsW0ZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybV0gPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dDb2RlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX2hhbmRsZUZvcm1SZWFkeShmb3JtRXZlbnQ6IEV2ZW50RGF0YSkge1xuICAgICAgICBhd2FpdCB0aGlzLl9faGFuZGxlRm9ybVJlYWR5KGZvcm1FdmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfX2hhbmRsZUZvcm1SZWFkeShmb3JtRXZlbnQ6IEV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuZG9Ob3RDaGVja0Jhc2VTZXJ2aWNlICYmICF0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyh0aGlzLm5vdENvbmZpZ0Jhc2VTZXJ2aWNlTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBmb3JtRXZlbnQuZm9ybUNvbnRyb2xzO1xuICAgICAgICBhd2FpdCB0aGlzLm9uRm9ybUluaXRpYWxpemVkKGZvcm1FdmVudCk7XG4gICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdCh7XG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLFxuICAgICAgICAgICAgc2V0dGluZzogdGhpcy5zZXR0aW5nLFxuICAgICAgICAgICAgZm9ybUV2ZW50XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmlnZ2VyR2V0RGV0YWlsKCk7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJHZXREZXRhaWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9HZXREZXRhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RGV0YWlsKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uQmVmb3JlR2V0RGV0YWlsKCkge1xuICAgIH1cblxuICAgIGFzeW5jIGdldE9iamVjdERldGFpbCgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZ2V0RGV0YWlsV2l0aFBlcm1pc3Npb24odGhpcy5tb2RlbC5kYXRhLmlkLCB0aGlzLm1vZGVsLmRhdGEucGlkLCB0aGlzLmdldERldGFpbFBsdXNVcmwpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldERldGFpbEN1c3RvbSgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RGV0YWlsKCkge1xuICAgICAgICBjb25zdCByZXN1bHRDaGVjayA9IGF3YWl0IHRoaXMuZ2V0RGV0YWlsQ3VzdG9tKCk7XG4gICAgICAgIC8vIEtow7RuZyBvdmVycmlkZVxuICAgICAgICBpZiAocmVzdWx0Q2hlY2sgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0Zvcm1BZGROZXcoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVHZXREZXRhaWwoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLnNldElzTG9hZGVkRGF0YUVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0RGV0YWlsKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tb2RpZnlEZXRhaWxEYXRhKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm9jZXNzQWZ0ZXJHZXREYXRhKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlckdldERldGFpbChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dTZXR0aW5nLmlzRW5hYmxlTG9nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy52YWx1ZUJlZm9yZVVwZGF0ZSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuY2xvbmVPYmplY3QocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3J1ZEZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLmNydWRGb3JtLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogRXZlbnRUeXBlLkZPUk1fUkVBRFksXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpcy5jcnVkRm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0RGF0YUFkZChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRTZXR0aW5nRmlsZUNvbnRyb2woZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLmluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVycmlkZSBjw6FjaCBs4bqleSBk4buvIGxp4buHdSBnZXREZXRhaWxcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0Q2hlY2suc3VjY2VzcyAmJiByZXN1bHRDaGVjay5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmZvcm1TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5FRElUO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLnNldElzTG9hZGVkRGF0YUVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1vZGlmeURldGFpbERhdGEocmVzdWx0Q2hlY2suZGF0YSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJvY2Vzc0FmdGVyR2V0RGF0YShyZXN1bHRDaGVjay5kYXRhKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJHZXREZXRhaWwocmVzdWx0Q2hlY2suZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5BREQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3J1ZEZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLmNydWRGb3JtLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2Zvcm1SZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpcy5jcnVkRm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0RGF0YUFkZChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRTZXR0aW5nRmlsZUNvbnRyb2woZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLmluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGluaXREYXRhQWRkKGV2dDogRXZlbnREYXRhKSB7IH1cblxuICAgIHByaXZhdGUgaW5pdERlZmF1bHRTZXR0aW5nRmlsZUNvbnRyb2woZXZ0OiBFdmVudERhdGEpIHtcbiAgICAgICAgaWYgKCFldnQucm9vdE1vZGVsLmlkICYmIHRoaXMuc2V0dGluZy5zY2hlbWEuc29tZShwID0+IChwIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSkpIHtcbiAgICAgICAgICAgIGV2dC5yb290TW9kZWwuaWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBo4bqjaSBn4buNaSBow6BtIG7DoHkga2hpIG92ZXJyaWRlIGdldERldGFpbFxuICAgICAqL1xuICAgIGFzeW5jIF9wcm9jZXNzQWZ0ZXJHZXREYXRhKGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBEdXnhu4d0IGPDoWMgY29udHJvbCBkYXRldGltZSDEkeG7gyBjb252ZXJ0IHZhbHVlIHNhbmcgZGF0ZXRpbWVcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEuZm9yRWFjaChzY2hlbWEgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZml4RGF0ZVZhbHVlKHNjaGVtYSwgZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLl9fZGlzYWJsZUVkaXQgPSB0aGlzLm1vZGVsLmRhdGEuX19kaXNhYmxlRWRpdDtcblxuICAgICAgICAvLyBTZXQgYmFzZVBlcm1pc3Npb24gdOG7qyBjcnVkbGlzdFxuICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uICYmIHRoaXMubW9kZWwuZGF0YS5iYXNlUGVybWlzc2lvbiA9PT0gUGVybWlzc2lvbkJhc2UuRlVMTCkge1xuICAgICAgICAgICAgZGF0YS5iYXNlUGVybWlzc2lvbiA9IHRoaXMubW9kZWwuZGF0YS5iYXNlUGVybWlzc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kZWwuZGF0YSA9IGRhdGE7XG4gICAgICAgIGlmIChkYXRhLnBpZCAmJiBkYXRhLnBpZCAhPSB0aGlzLmd1aWRFbXB0eSAmJiBkYXRhLmJhc2VQZXJtaXNzaW9uQnlQaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Blcm1pc3Npb24oZGF0YS5iYXNlUGVybWlzc2lvbkJ5UGlkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tQZXJtaXNzaW9uKGRhdGEuYmFzZVBlcm1pc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvcmNlT25seVZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX19pc0Zvcm1WaWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5zd2l0Y2hWaWV3TW9kZSh0aGlzLl9faXNGb3JtVmlldyk7XG4gICAgICAgICAgICB0aGlzLmNydWRGb3JtLnN3aXRjaEZvcm1TdGF0ZUZvclVzZXJwaWNrZXIodGhpcy5faXNGb3JtQWRkTmV3KCkpO1xuICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc2V0SXNMb2FkZWREYXRhRWRpdCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2VcbiAgICAgICAgICAgICYmIHRoaXMuaGF2ZUVudGl0eU1ldGFkYXRhQVBJIC8vIHNldHRpbmcgxJHhu4MgZml4IGzhu5dpIGsgbG9hZCBkYyBlbnRpdHkgbWV0YWRhdGEgY2hvIGPGoSBj4bqldSB04buVIGNo4bupYyBzZXJ2aWNlXG4gICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlLmxvYWQodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCB0aGlzLmNvbnRleHQsIHRydWUpOyAvLyBmb3JjZSBsb2FkIMSR4buDIMSR4buNYyB04burIGNzZGxcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZVZlcnNpb24gPSB0aGlzLl9lbnRpdHlNZXRhZGF0YVNlcnZpY2UuZ2V0QnlDb2RlKCdlbmFibGVWZXJzaW9uJyk7XG4gICAgICAgICAgICBpZiAoZW5hYmxlVmVyc2lvbiA9PSAnMScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZmlsdGVyQ2hlY2tFeGlzdEJ5VmVyc2lvbiA9IFtcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2NvZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLm5vdEVxdWFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHRoaXMubW9kZWwuZGF0YS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc2FibGVCdWlsZEluRmllbGQoKTtcbiAgICAgICAgaWYgKHRoaXMubG9nU2V0dGluZy5pc0VuYWJsZUxvZykge1xuICAgICAgICAgICAgdGhpcy5nZXRMb2dWYWx1ZUFmdGVyTG9hZERldGFpbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TG9nVmFsdWVBZnRlckxvYWREZXRhaWwoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmZvcm1Db250cm9scykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbY29udHJvbE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sTmFtZS5pbmNsdWRlcygnLicpIHx8IHRoaXMuY3J1ZEZvcm0uZm9ybUNvbnRyb2xzW2NvbnRyb2xOYW1lXT8uaGlkZGVuID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIHx8ICEoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgTG9nQ29sdW1uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb250cm9sLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbnRyb2wubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUJlZm9yZTogY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2UubWFwKHAgPT4gcC5sYWJlbCkuam9pbignLCAnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBZnRlcjogJydcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpeERhdGVWYWx1ZShjb250cm9sLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZml4RGF0ZVZhbHVlKHN1YkNvbnRyb2wsIGl0ZW0sIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhEYXRlVmFsdWUoc3ViQ29udHJvbCwgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIF9wYXJlbnRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wudGltZU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShTdHJpbmcocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkRGF0ZShkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gdGhpcy5fY29tbW9uU2VydmljZS5nZXRUaW1lKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZUJ1aWxkSW5GaWVsZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0Zvcm1BZGROZXcoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YS5pc0J1aWxkSW5BbGwgJiYgIXRoaXMuX3VzZXJTZXJ2aWNlLmlzU3VwZXJVc2VyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FkZFJlcXVpcmVkVmFsaWRhdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XG4gICAgICAgIGxldCBleGlzdCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBzY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgZXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZXhpc3QpIHtcbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFJlcXVpcmVkVmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICAgIHNjaGVtYS5yZXF1aXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX3JlbW92ZVJlcXVpcmVkVmFsaWRhdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2Ygc2NoZW1hLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvcikge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG4gICAgICAgIHNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9zZXRNb2RlbFZhbHVlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY3J1ZEZvcm0uX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xuICAgICAgICB0aGlzLl9zZXRNb2RlbFZhbHVlQnlOb2RlKG5vZGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBfc2V0TW9kZWxWYWx1ZUJ5Tm9kZShub2RlOiBDb250cm9sVHJlZU5vZGUsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgbm9kZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG1vZGlmeURldGFpbERhdGEoZGF0YSkge1xuICAgIH1cblxuICAgIF90cmlnZ2VyU2F2ZSgpIHtcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25BZnRlckdldExvZ1ZhbHVlKCkge1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2luZ2xlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgdmFsdWVQYXJhbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZGF0YVNvdXJjZS5maW5kKHAgPT4gcC52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdID09IHZhbHVlUGFyYW0pO1xuICAgICAgICBpZiAoISFyZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmNHZXRMYWJlbCA9IGNvbnRyb2wuZnVuY0dldExhYmVsO1xuICAgICAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNHZXRMYWJlbChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRNdWx0aXBsZUxhYmVsKGNvbnRyb2wsIGRhdGFTb3VyY2UsIHZhbHVlUGFyYW0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVBhcmFtLnNvbWUocCA9PiBwID09IE51bWJlcihwKSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVBhcmFtID0gdmFsdWVQYXJhbS5tYXAocCA9PiBOdW1iZXIocCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHsgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gZGF0YVNvdXJjZVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHZhbHVlUGFyYW0uaW5jbHVkZXMocC52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdKSlcbiAgICAgICAgICAgIC5tYXAocCA9PiBjb250cm9sLmZ1bmNHZXRMYWJlbChwLnZhbHVlKSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhZGRTaW5nbGVQcm9wZXJ0eUxvZyhjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBjb25zdCBsb2dDb2x1bW4gPSB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5maW5kKHAgPT4gcC5maWVsZCA9PSBjb250cm9sLmZpZWxkKTtcbiAgICAgICAgICAgIGxldCBkYXRhU291cmNlID0gY29udHJvbC5fY29tcG9uZW50LnNlbGVjdGVkVmFsdWVPYmplY3Q7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YVNvdXJjZSkpIGRhdGFTb3VyY2UgPSBbZGF0YVNvdXJjZV07XG4gICAgICAgICAgICBsb2dDb2x1bW4udmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmFsdWVBZnRlciA9IHRoaXMuZ2V0U2luZ2xlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWw7XG4gICAgICAgICAgICB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29udHJvbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbnRyb2wubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiB0aGlzLmdldFNpbmdsZUxhYmVsKGNvbnRyb2wsIGRhdGFTb3VyY2UsIG9sZFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVBZnRlcjogdGhpcy5nZXRTaW5nbGVMYWJlbChjb250cm9sLCBkYXRhU291cmNlLCBuZXdWYWx1ZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRNdWx0aXBsZVByb3BlcnR5TG9nKGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ0NvbHVtbiA9IHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLmZpbmQocCA9PiBwLmZpZWxkID09IGNvbnRyb2wuZmllbGQpO1xuICAgICAgICAgICAgbG9nQ29sdW1uLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgbG9nQ29sdW1uLnZhbHVlQWZ0ZXIgPSB0aGlzLmdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgY29udHJvbC5fY29tcG9uZW50LnNlbGVjdGVkVmFsdWVPYmplY3QsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBjb250cm9sLl9jb21wb25lbnQuZGF0YVNvdXJjZUludGVybmFsO1xuICAgICAgICAgICAgdGhpcy5sb2dTZXR0aW5nLmFyclZhbHVlQWZ0ZXJVcGRhdGUucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgTG9nQ29sdW1uKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb250cm9sLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUJlZm9yZTogdGhpcy5nZXRNdWx0aXBsZUxhYmVsKGNvbnRyb2wsIGRhdGFTb3VyY2UsIG9sZFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVBZnRlcjogdGhpcy5nZXRNdWx0aXBsZUxhYmVsKGNvbnRyb2wsIGRhdGFTb3VyY2UsIG5ld1ZhbHVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldExvZ1ZhbHVlRGVmYXVsdChjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgY29uc3QgaXNOdWxsT2xkVmFsdWUgPSB0aGlzLmlzTnVsbE9yRW1wdHkob2xkVmFsdWUpO1xuICAgICAgICBjb25zdCBpc051bGxOZXdWYWx1ZSA9IHRoaXMuaXNOdWxsT3JFbXB0eShuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBjb250cm9sLnNob3dUaW1lID8gJ0hIOm1tIGRkL01NL3l5eXknIDogJ2RkL01NL3l5eXknO1xuICAgICAgICAgICAgb2xkVmFsdWUgPSBpc051bGxPbGRWYWx1ZSA/IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlIDogdGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKG9sZFZhbHVlLCBmb3JtYXQpO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc051bGxOZXdWYWx1ZSA/IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlIDogdGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKG5ld1ZhbHVlLCBmb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgb2xkVmFsdWUgPSBpc051bGxPbGRWYWx1ZSA/IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlIDogdGhpcy5fbnVtYmVyUGlwZS50cmFuc2Zvcm0ob2xkVmFsdWUsICcnLCAndmktVk4nKTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNOdWxsTmV3VmFsdWUgPyB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZSA6IHRoaXMuX251bWJlclBpcGUudHJhbnNmb3JtKG5ld1ZhbHVlLCAnJywgJ3ZpLVZOJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYSB8fCBjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgb2xkVmFsdWUgPSBpc051bGxPbGRWYWx1ZSA/IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlIDogRGF0YVNvdXJjZUJvb2xlYW4uZmluZChwID0+IHAuaWQgPT0gb2xkVmFsdWUpPy50ZW47XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGlzTnVsbE5ld1ZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiBEYXRhU291cmNlQm9vbGVhbi5maW5kKHAgPT4gcC5pZCA9PSBuZXdWYWx1ZSk/LnRlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW29sZFZhbHVlLCBuZXdWYWx1ZV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMb2dWYWx1ZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb25lTW9kZWwgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmNsb25lT2JqZWN0KHRoaXMubW9kZWwuZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZm9ybUNvbnRyb2xzKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sTmFtZS5pbmNsdWRlcygnLicpIHx8IHRoaXMuY3J1ZEZvcm0uZm9ybUNvbnRyb2xzW2NvbnRyb2xOYW1lXT8uaGlkZGVuID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbE5hbWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlW2NvbnRyb2wuZmllbGRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY2xvbmVNb2RlbFtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkob2xkVmFsdWUpIHx8ICF0aGlzLmlzTnVsbE9yRW1wdHkobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTXVsdGlwbGUgJiYgb2xkVmFsdWUgIT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNpbmdsZVByb3BlcnR5TG9nKGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc011bHRpcGxlICYmICF0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE11bHRpcGxlUHJvcGVydHlMb2coY29udHJvbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZUJlZm9yZSwgdmFsdWVBZnRlcl0gPSB0aGlzLmdldExvZ1ZhbHVlRGVmYXVsdChjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiB2YWx1ZUJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQWZ0ZXI6IHZhbHVlQWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0h0bWw6IChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSB8fCBjb250cm9sIGluc3RhbmNlb2YgVGV4dEFyZWFDb250cm9sU2NoZW1hKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCctLS0tbG9nIGRhdGEgZmFpbC0tLS0nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTnVsbE9yRW1wdHkoaW5wdXQ6IGFueSkge1xuICAgICAgICBpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aCA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbnB1dC50b1N0cmluZygpLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgc2F2ZSgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkID0gYXdhaXQgdGhpcy52YWxpZGF0ZUZvcm1CYXNlKCk7XG4gICAgICAgIGlmICh2YWxpZGF0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ1NldHRpbmcuaXNFbmFibGVMb2cpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubG9nU2V0dGluZy5pc0N1c3RvbUFsbCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldExvZ1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGPhuqV1IGjDrG5oIHRow6ptXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyR2V0TG9nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGEubG9nTWV0YURhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5maWx0ZXIocCA9PiBwLnZpc2libGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVTYXZlKCk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJTYXZlRmlsZVVwbG9hZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNGb3JtRWRpdCgpIHx8IHRoaXMuX2lzRm9ybVZpZXcoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uVXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2lzRm9ybUFkZE5ldygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25JbnNlcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gdmlldywgZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTWFudWFsU2F2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVNYW51YWxTYXZlKCkge1xuXG4gICAgfVxuXG4gICAgdHJpZ2dlclNhdmVGaWxlVXBsb2FkKCkge1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlNBVkVfRklMRV9JTl9GT1JNKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0UmVzdWx0VmFsaWRhdGUoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRm9ybUJhc2UoKTtcbiAgICB9XG5cbiAgICBhc3luYyB2YWxpZGF0ZUZvcm0ocmVzdWx0VmFsaWRhdGVCYXNlOiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVGb3JtQmFzZSgpIHtcbiAgICAgICAgbGV0IHJlc3VsdFZhbGlkYXRlQmFzZSA9IHRydWU7XG4gICAgICAgIC8vIEPDsyB0aOG7gyBjw7MgZm9ybSBrIGPDsyBjcnVkLWZvcm0gKFbDrCBsw6AgZm9ybSBtYXN0ZXIgY+G7p2EgY8OhYyBmb3JtIGNvbilcbiAgICAgICAgaWYgKHRoaXMuY3J1ZEZvcm0pIHtcbiAgICAgICAgICAgIHJlc3VsdFZhbGlkYXRlQmFzZSA9IGF3YWl0IHRoaXMuY3J1ZEZvcm0udmFsaWRhdGVGb3JtKHRoaXMuc2V0VmFsaWRhdGVGb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRWYWxpZGF0ZSA9IGF3YWl0IHRoaXMudmFsaWRhdGVGb3JtKHJlc3VsdFZhbGlkYXRlQmFzZSk7XG4gICAgICAgIC8vIELhu48gY2hlY2sgdmFsaWQgZm9ybSBjw7RuZyB2aeG7h2MuIG7hur91IG5oxrAgZm9ybSBjw7RuZyB2aeG7h2Mga2jDtG5nIHZhbGlkIHRow6wga2jDtG5nIHThu7EgxJHhu5luZyB04bqhbyBjw7RuZyB2aeG7h2NcbiAgICAgICAgLy8gaWYgKHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF1cbiAgICAgICAgLy8gICAgICYmIHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF0uX2NvbXBvbmVudFxuICAgICAgICAvLyApIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhc2tGb3JtID0gdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXS5fY29tcG9uZW50O1xuICAgICAgICAvLyAgICAgY29uc3QgcmVzdWx0VmFsaWRhdGVGb3JtVGFzayA9IGF3YWl0IHRhc2tGb3JtLl9nZXRSZXN1bHRWYWxpZGF0ZSgpO1xuICAgICAgICAvLyAgICAgcmVzdWx0VmFsaWRhdGUgPSByZXN1bHRWYWxpZGF0ZUZvcm1UYXNrICYmIHJlc3VsdFZhbGlkYXRlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiByZXN1bHRWYWxpZGF0ZSAmJiByZXN1bHRWYWxpZGF0ZUJhc2U7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNydWRGb3JtLnZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKTtcbiAgICB9XG5cbiAgICBfY2xlYW5Gb3JtKCkge1xuICAgICAgICB0aGlzLmNydWRGb3JtLmNsZWFuKCk7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJDb250cm9sQ2hhbmdlKGZpZWxkUGF0aCkge1xuICAgICAgICB0aGlzLmNydWRGb3JtLnRyaWdnZXJDaGFuZ2UoZmllbGRQYXRoKTtcbiAgICB9XG5cbiAgICBvbkJlZm9yZVNhdmUoKTogdm9pZCB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIH1cblxuICAgIG9uQWZ0ZXJTYXZlKHJlc3BvbnNlOiBSZXNwb25zZVJlc3VsdCk6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB9XG5cblxuICAgIGFzeW5jIG9uQWZ0ZXJHZXREZXRhaWwoZGF0YT86IGFueVtdKSB7XG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uSW5zZXJ0KCkge1xuICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSh0aGlzLm1vZGVsLmRhdGEpO1xuICAgICAgICBpZiAodGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXVxuICAgICAgICAgICAgJiYgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXS5fY29tcG9uZW50XG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdGFza0Zvcm0gPSB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdLl9jb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRWYWxpZGF0ZUZvcm1UYXNrID0gYXdhaXQgdGFza0Zvcm0uX2dldFJlc3VsdFZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0VmFsaWRhdGVGb3JtVGFzaykge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5pdGVtQ29uZ1ZpZWMgPSB0YXNrRm9ybS5tb2RlbC5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuY3JlYXRlVGFza0luc3RlYWQpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IGZpZWxkIF9Xb3JrZmxvd0NvZGUgxJHhu4MgYmFja2VuZCBraMO0bmcgY2jhuqF5IHF1eSB0csOsbmggYuG6o24gZ2hpXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jcmVhdGVDb25maXJtSWZSZXF1aXJlKCk7XG4gICAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuX2luc2VydCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ29uZmlybUlmUmVxdWlyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZUNvbmZpcm1TYXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKHRoaXMubWVzc2FnZUNvbmZpcm1TYXZlKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luc2VydCgpIHtcbiAgICAgICAgdGhpcy5nZXRQcm9taXNlQWN0aW9uSW5zZXJ0KClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJJbnNlcnQocmVzcG9uc2Uuc3VjY2VzcywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5pZCA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlclNhdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2F2ZWQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbC5kYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbG9zZUZvcm06IHRoaXMuaXNDbG9zZUZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluc2VydEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IuZXJyb3Iuc3VjY2VzcyAmJiBlcnJvci5lcnJvci5lcnJvckNoZWNrRXhpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZUFmdGVySW5zZXJ0KGZhbHNlLCBlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRQcm9taXNlQWN0aW9uSW5zZXJ0KCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5wb3N0KHRoaXMubW9kZWwuZGF0YSwgdGhpcy5pbnNlcnRQbHVzVXJsKTtcbiAgICB9XG5cbiAgICBoYW5kbGVJbnNlcnRFcnJvcigpIHtcblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25VcGRhdGUoKSB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKHRoaXMubW9kZWwuZGF0YSk7XG4gICAgICAgIHRoaXMuZ2V0UHJvbWlzZUFjdGlvblVwZGF0ZSgpXG4gICAgICAgICAgICAudGhlbihhc3luYyByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZUFmdGVyVXBkYXRlKHJlc3BvbnNlLnN1Y2Nlc3MsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJTYXZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNhdmVkLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWwuZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlRm9ybTogdGhpcy5pc0Nsb3NlRm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVXBkYXRlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5lcnJvci5zdWNjZXNzICYmIGVycm9yLmVycm9yLmVycm9yQ2hlY2tFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJVcGRhdGUoZmFsc2UsIGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmxvZ1NldHRpbmcuaXNFbmFibGVMb2cpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVVcGRhdGVFcnJvcigpIHtcblxuICAgIH1cblxuICAgIGdldFByb21pc2VBY3Rpb25VcGRhdGUoKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnB1dCh0aGlzLm1vZGVsLmRhdGEuaWQudG9TdHJpbmcoKSwgdGhpcy5tb2RlbC5kYXRhLCB0aGlzLnVwZGF0ZVBsdXNVcmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGVmYXVsdFZhbHVlKG1vZGVsKSB7XG4gICAgICAgIGlmIChtb2RlbC5pc0J1aWxkSW4gPT09IG51bGwgfHwgbW9kZWwuaXNCdWlsZEluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1vZGVsLmlzQnVpbGRJbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGVsLmlzQnVpbGRJbkFsbCA9PT0gbnVsbCB8fCBtb2RlbC5pc0J1aWxkSW5BbGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbW9kZWwuaXNCdWlsZEluQWxsID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50U2V0dGluZz8uZW5hYmxlUmVvcmRlclJvdyAmJiB0aGlzLnBhcmVudFNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVt0aGlzLnBhcmVudFNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGRdID8/PSB0aGlzLnBhcmVudE1vZGVsLnRvdGFsICsgMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd01lc3NhZ2VBZnRlckluc2VydChpc1N1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZSwgZXJyb3I/OiBhbnkpIHtcbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VJbnNlcnRTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2VzcyA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnTUVTU0FHRS5JTlNFUlRfREFUQV9TVUNDRVNTJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLm1lc3NhZ2VJbnNlcnRTdWNjZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dNZXNzYWdlQWZ0ZXJVcGRhdGUoaXNTdWNjZXNzOiBib29sZWFuID0gZmFsc2UsIGVycm9yPzogYW55KSB7XG4gICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tZXNzYWdlVXBkYXRlU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ01FU1NBR0UuVVBEQVRFX0RBVEFfU1VDQ0VTUycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5tZXNzYWdlVXBkYXRlU3VjY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVycm9yLmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoZXJyb3IuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdDw7MgbOG7l2kgeOG6o3kgcmEsIGxpw6puIGjhu4cgcXXhuqNuIHRy4buLIHZpw6puIMSR4buDIGJp4bq/dCB0aMOqbSBjaGkgdGnhur90Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvbkZvcm1Jbml0aWFsaXplZChkYXRhOiBFdmVudERhdGEpIHtcblxuICAgIH1cblxuICAgIF9oYW5kbGVBZnRlclRyaW5oS3koZXZ0KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1vZGVsLmRhdGFbS2V5Rmxhc2hTaG93XTtcbiAgICAgICAgdGhpcy5faGFuZGxlQ2FuY2VsKGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVNhdmUoZXZ0KSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnN1Ym1pdHRpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIHRoaXMub25TYXZlLmVtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICBfaGFuZGxlQ2FuY2VsKGV2dCkge1xuICAgICAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICBfaGFuZGxlTWVzc2FnZShldnQpIHtcbiAgICAgICAgdGhpcy5vbk1lc3NhZ2UuZW1pdChldnQpO1xuICAgIH1cblxuICAgIF9zZXREaXNhYmxlQ29udHJvbCh1bmlxdWVGaWVsZCwgaXNEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmNydWRGb3JtLmZvcm1Db250cm9sc1t1bmlxdWVGaWVsZF0uZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIF9zZXRIaWRkZW5Db250cm9sKHVuaXF1ZUZpZWxkLCBpc0hpZGRlbikge1xuICAgICAgICB0aGlzLmNydWRGb3JtLmZvcm1Db250cm9sc1t1bmlxdWVGaWVsZF0uaGlkZGVuID0gaXNIaWRkZW47XG4gICAgfVxuXG4gICAgX2dldEZvcm1TdGF0ZSgpOiBGb3JtU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5mb3JtU3RhdGU7XG4gICAgfVxuXG4gICAgX2lzRm9ybUFkZE5ldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZvcm1TdGF0ZSgpID09IEZvcm1TdGF0ZS5BREQ7XG4gICAgfVxuXG4gICAgX2lzRm9ybUVkaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuRURJVDtcbiAgICB9XG5cbiAgICBfaXNGb3JtVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZvcm1TdGF0ZSgpID09IEZvcm1TdGF0ZS5WSUVXO1xuICAgIH1cbn1cbiJdfQ==
|