@magic-xpa/engine 4.800.0-dev480.93 → 4.800.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/magic-xpa-engine.umd.js +1329 -1138
- package/bundles/magic-xpa-engine.umd.js.map +1 -1
- package/bundles/magic-xpa-engine.umd.min.js +2 -2
- package/bundles/magic-xpa-engine.umd.min.js.map +1 -1
- package/esm2015/index.js +2 -1
- package/esm2015/src/ClientManager.js +2 -2
- package/esm2015/src/ConstInterface.js +7 -3
- package/esm2015/src/CurrentClientVersion.js +2 -2
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +15 -1
- package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +4 -1
- package/esm2015/src/commands/ClientToServer/SelectProgramCommand.js +15 -0
- package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +1 -7
- package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +2 -2
- package/esm2015/src/env/Environment.js +11 -1
- package/esm2015/src/event/ActionManager.js +3 -2
- package/esm2015/src/event/EventHandler.js +10 -4
- package/esm2015/src/event/EventsManager.js +120 -20
- package/esm2015/src/event/IEventsManager.js +1 -1
- package/esm2015/src/exp/ExpressionDict.js +3 -1
- package/esm2015/src/exp/ExpressionEvaluator.js +33 -22
- package/esm2015/src/gui/MgForm.js +16 -24
- package/esm2015/src/remote/RemoteCommandsProcessor.js +48 -21
- package/esm2015/src/rt/Operation.js +7 -30
- package/esm2015/src/tasks/MGData.js +11 -1
- package/esm2015/src/tasks/MGDataCollection.js +12 -2
- package/esm2015/src/tasks/Task.js +46 -46
- package/esm2015/src/util/PrmMap.js +11 -1
- package/esm2015/src/util/cookie.service.js +10 -6
- package/fesm2015/magic-xpa-engine.js +358 -175
- package/fesm2015/magic-xpa-engine.js.map +1 -1
- package/index.d.ts +1 -0
- package/package.json +4 -4
- package/src/ConstInterface.d.ts +6 -2
- package/src/commands/ClientToServer/CommandFactory.d.ts +1 -0
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +2 -1
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -0
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +0 -1
- package/src/env/Environment.d.ts +3 -0
- package/src/event/EventsManager.d.ts +11 -1
- package/src/event/IEventsManager.d.ts +1 -0
- package/src/exp/ExpressionEvaluator.d.ts +1 -0
- package/src/gui/MgForm.d.ts +1 -1
- package/src/rt/Operation.d.ts +0 -3
- package/src/tasks/MGData.d.ts +2 -0
- package/src/tasks/MGDataCollection.d.ts +1 -0
- package/src/tasks/Task.d.ts +0 -1
- package/src/util/PrmMap.d.ts +1 -0
- package/src/util/cookie.service.d.ts +2 -2
|
@@ -17,6 +17,7 @@ export class MgForm extends MgFormBase {
|
|
|
17
17
|
super();
|
|
18
18
|
this.IsMovingInView = false;
|
|
19
19
|
this.PrevDisplayLine = 0;
|
|
20
|
+
this.RefreshAllRows = false;
|
|
20
21
|
this.IgnoreFirstRecordCycle = false;
|
|
21
22
|
this.MovedToFirstControl = false;
|
|
22
23
|
this._suffixDone = false;
|
|
@@ -351,8 +352,10 @@ export class MgForm extends MgFormBase {
|
|
|
351
352
|
let currLine = -1;
|
|
352
353
|
if (!this._task.DataView.isEmptyDataview())
|
|
353
354
|
currLine = this.getVisibleLine();
|
|
354
|
-
if (this.isTableWithAbsoluteScrollbar())
|
|
355
|
+
if (this.isTableWithAbsoluteScrollbar()) {
|
|
355
356
|
this.GetDataview().TotalRecordsCount += 1;
|
|
357
|
+
this.RefreshAllRows = true;
|
|
358
|
+
}
|
|
356
359
|
let newRecIdx = yield this.GetDataview().addRecord(doSuffix, false, isCrelineAbove);
|
|
357
360
|
if (newRecIdx > -1) {
|
|
358
361
|
if (this.isLineMode()) {
|
|
@@ -386,8 +389,10 @@ export class MgForm extends MgFormBase {
|
|
|
386
389
|
yield this.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
|
|
387
390
|
}
|
|
388
391
|
}
|
|
389
|
-
else if (this.isTableWithAbsoluteScrollbar())
|
|
392
|
+
else if (this.isTableWithAbsoluteScrollbar()) {
|
|
390
393
|
this.GetDataview().TotalRecordsCount -= 1;
|
|
394
|
+
this.RefreshAllRows = false;
|
|
395
|
+
}
|
|
391
396
|
});
|
|
392
397
|
}
|
|
393
398
|
delCurrRec() {
|
|
@@ -418,8 +423,10 @@ export class MgForm extends MgFormBase {
|
|
|
418
423
|
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
|
|
419
424
|
if (_super.isLineMode.call(this)) {
|
|
420
425
|
if (_super.HasTable.call(this)) {
|
|
421
|
-
if (this.isTableWithAbsoluteScrollbar())
|
|
426
|
+
if (this.isTableWithAbsoluteScrollbar()) {
|
|
422
427
|
this.GetDataview().TotalRecordsCount--;
|
|
428
|
+
this.RefreshAllRows = true;
|
|
429
|
+
}
|
|
423
430
|
this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
|
|
424
431
|
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
425
432
|
}
|
|
@@ -489,8 +496,10 @@ export class MgForm extends MgFormBase {
|
|
|
489
496
|
throw ex;
|
|
490
497
|
}
|
|
491
498
|
if (_super.HasTable.call(this)) {
|
|
492
|
-
if (this.isTableWithAbsoluteScrollbar() && recRemoved)
|
|
499
|
+
if (this.isTableWithAbsoluteScrollbar() && recRemoved) {
|
|
493
500
|
this.GetDataview().TotalRecordsCount--;
|
|
501
|
+
this.RefreshAllRows = true;
|
|
502
|
+
}
|
|
494
503
|
this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
|
|
495
504
|
}
|
|
496
505
|
}
|
|
@@ -756,7 +765,7 @@ export class MgForm extends MgFormBase {
|
|
|
756
765
|
let prevTopIdx = this.GetDataview().getTopRecIdx();
|
|
757
766
|
try {
|
|
758
767
|
index = idx + diffRef.value;
|
|
759
|
-
if (!this.isRowValidated(idx) || sendAll) {
|
|
768
|
+
if (!this.isRowValidated(idx) || sendAll || this.RefreshAllRows) {
|
|
760
769
|
if (index >= 0)
|
|
761
770
|
_super.checkAndCreateRow.call(this, index);
|
|
762
771
|
if (saveRowIdx + diffRef.value !== index) {
|
|
@@ -783,6 +792,7 @@ export class MgForm extends MgFormBase {
|
|
|
783
792
|
}
|
|
784
793
|
}
|
|
785
794
|
this.RefreshUI();
|
|
795
|
+
this.RefreshAllRows = false;
|
|
786
796
|
return updated;
|
|
787
797
|
});
|
|
788
798
|
}
|
|
@@ -839,24 +849,6 @@ export class MgForm extends MgFormBase {
|
|
|
839
849
|
getPrevLine(line) {
|
|
840
850
|
return line - 1;
|
|
841
851
|
}
|
|
842
|
-
getDefaultButton(checkVisibleEnable) {
|
|
843
|
-
const _super = Object.create(null, {
|
|
844
|
-
getProp: { get: () => super.getProp },
|
|
845
|
-
getCtrlByName: { get: () => super.getCtrlByName }
|
|
846
|
-
});
|
|
847
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
848
|
-
let defaultButton = null;
|
|
849
|
-
let prop = _super.getProp.call(this, PropInterface.PROP_TYPE_DEFAULT_BUTTON);
|
|
850
|
-
if (prop !== null) {
|
|
851
|
-
defaultButton = _super.getCtrlByName.call(this, yield prop.getValue(), MgControlType.CTRL_TYPE_BUTTON);
|
|
852
|
-
if (checkVisibleEnable && defaultButton !== null) {
|
|
853
|
-
if (!defaultButton.isVisible() || !defaultButton.isEnabled())
|
|
854
|
-
defaultButton = null;
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
return defaultButton;
|
|
858
|
-
});
|
|
859
|
-
}
|
|
860
852
|
clearTableColumnSortMark(clearSortMark) {
|
|
861
853
|
if (clearSortMark) {
|
|
862
854
|
}
|
|
@@ -1297,4 +1289,4 @@ export class MgForm extends MgFormBase {
|
|
|
1297
1289
|
}
|
|
1298
1290
|
MgForm.TIME_LIMIT = 50;
|
|
1299
1291
|
MgForm._createdForms = new CreatedFormVector();
|
|
1300
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFFWCxxQkFBcUIsRUFBRSxjQUFjLEVBRXJDLE9BQU8sRUFFUCxVQUFVLEVBRVYsYUFBYSxFQUVkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGFBQWEsRUFDYixJQUFJLEVBQ0osUUFBUSxFQUNSLFlBQVksRUFFYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BGLE9BQU8sRUFBWSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNekMsTUFB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SSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUU7b0JBQzlDLElBQUksY0FBYyxHQUFtQixFQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDLENBQUM7b0JBQ3RHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7aUJBQzdEO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFFRCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBaUI7UUFDM0IsT0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2pFLENBQUM7O0FBL3hEYyxpQkFBVSxHQUFXLEVBQUUsQ0FBQztBQVdoQyxvQkFBYSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIENvbnRyb2xUYWJsZSxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsIEd1aUVudmlyb25tZW50LFxyXG4gIExhc3RGb2N1c2VkVmFsLFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUm93XHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFByaW9yaXR5LFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4vTWdDb250cm9sJztcclxuaW1wb3J0IHsgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbiB9IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7IERhdGFWaWV3LCBTRVRfRElTUExBWUxJTkVfQllfRFYgfSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQgeyBUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tICcuLi9yZW1vdGUvU2VydmVyRXJyb3InO1xyXG5pbXBvcnQgeyBDb25zdEludGVyZmFjZSB9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTGFzdEZvY3VzZWRNYW5hZ2VyIH0gZnJvbSAnLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHsgQ3JlYXRlZEZvcm1WZWN0b3IgfSBmcm9tICcuL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICd1dGlsJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZvcm0+Li4uPC9mb3JtPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgTWdGb3JtIGV4dGVuZHMgTWdGb3JtQmFzZSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVElNRV9MSU1JVDogbnVtYmVyID0gNTA7IC8vIHRpbWUgbGltaXQgZm9yIG9uZSB0cmFuc2ZlciBvcGVyYXRpb24gKGluIG1pbGxpIHNlY29uZHMpXHJcbiAgSXNNb3ZpbmdJblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcmV2RGlzcGxheUxpbmU6IG51bWJlciA9IDA7IC8vIGRpc3BsYXkgaWRlbnRpZmllciBvZiBwcmV2IGxpbmVcclxuXHJcbiAgSWdub3JlRmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1vdmVkVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIG1vdmUgdG8gZmlyc3QgY29udHJvbCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGZvcm1cclxuXHJcbiAgcHJpdmF0ZSBfc3VmZml4RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGhpZGRlbkNvbnRyb2xzSXNuc0xpc3Q6IExpc3Q8bnVtYmVyPiA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBfY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IG5ldyBDcmVhdGVkRm9ybVZlY3RvcigpO1xyXG5cclxuICAvL1RPRE86IE1heWJlIHRoZSBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBsaWtlIGFsbG93RmllbGRDb21wdXRlXHJcbiAgcHJpdmF0ZSBfdHJhbnNmZXJyaW5nRGF0YVRvR1VJOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaXNGZXRjaGluZ1JlY29yZHNBaGVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IENyZWF0ZWRGb3JtcygpOiBDcmVhdGVkRm9ybVZlY3RvciB7XHJcbiAgICByZXR1cm4gTWdGb3JtLl9jcmVhdGVkRm9ybXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5SZXN0b3JlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVzdG9yZTtcclxuICB9XHJcblxyXG4gIGdldCBUcmFuc2ZlcnJpbmdEYXRhVG9HVUkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgIGxldCBwcm9wID0gdGhpcy5fdGFibGVNZ0NvbnRyb2wuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRCk7XHJcblxyXG4gICAgICByZXR1cm4gKHByb3AgIT0gbnVsbCA/IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSA6IGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgICB0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSB0YXNrIGRhdGF2aWV3LCBpZiB0aGUgdGFzayBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSB0YXNrIGRhdGF2aWV3PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0RGF0YXZpZXcoKTogRGF0YVZpZXcge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgIT0gbnVsbClcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuXHJcbiAgICByZXR1cm4gKGR2KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG1vdmVJblZpZXcodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZywgcmV0dXJuVG9DdHJsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHJldHVyblRvQ3RybCkpXHJcbiAgICAgIGF3YWl0IHRoaXMubW92ZUluVmlld18wKHVuaXQsIGRpcmVjdGlvbik7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMubW92ZUluVmlld18xKHVuaXQsIGRpcmVjdGlvbiwgcmV0dXJuVG9DdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG1vdmVJblZpZXdfMCh1bml0OiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm1vdmVJblZpZXcodW5pdCwgZGlyZWN0aW9uLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVyblRvQ3RybFwiPnNob3VsZCB0aGUgY3Vyc29yIHJldHVybiB0byB0aGUgbGFzdCBwYXJrZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBtb3ZlSW5WaWV3XzEodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZywgcmV0dXJuVG9DdHJsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gICAgbGV0IHJldHVyblRvVmlzaWJsZUxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNvcmRPdXRPZlZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB2aXNpYmxlTGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gdHJ1ZTtcclxuICAgICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgICAgLy8gdGFibGUgbW92ZW1lbnRzIChmaXJzdCAvIGxhc3QgcmVjb3JkKVxyXG4gICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBCRUdJTklORyBPRiBUQUJMRVxyXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgoQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRU5EIE9GIFRBQkxFXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQsIHRydWUsIGZhbHNlLCB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSArIDEpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPj0gMClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFnZSBhbmQgcm93IG1vdmVtZW50c1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlY29yZHMgdG8gc2tpcFxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJiB0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORDpcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGxhc3Q6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxO1xyXG4gICAgICAgICAgICAgIGxhc3QgPSBNYXRoLm1pbihsYXN0LCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IGxhc3QgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHJldHVyblRvVmlzaWJsZUxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHNpemUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzaXplID0gMTtcclxuXHJcbiAgICAgICAgc2l6ZSA9IChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWIHx8XHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTlxyXG4gICAgICAgICAgPyAtc2l6ZVxyXG4gICAgICAgICAgOiBzaXplKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA8IDApIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSAwO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nIHRoZSB0YWJsZSBvbmUgcGFnZSBvciBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKSB8fFxyXG4gICAgICAgICAgICB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB2aXNpYmxlTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmIHZpc2libGVMaW5lID09PSAwKSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBwcmV2aW91cyByb3cgYnV0IHdlIGFyZSBhdCB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJlxyXG4gICAgICAgICAgICAgICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyB8fCB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UpICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIG5leHQgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGxhc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgc2l6ZSk7XHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZCh0cnVlKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0aGlzLl9zdWZmaXhEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5NTQ5Njogd2hlbiB0aGUgcmVjb3JkIHN1ZmZpeCBmYWlsZWQgZ28gYmFjayB0byB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQgIT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHModGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5MjEwMTogaWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgdGhlIHJlYyBzdWZmaXhcclxuICAgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGV4ZWN1dGVkIHNvIHdlIG11c3QgaGFuZGxlIGl0IGJlZm9yZSB3ZSBnbyB0byBhIG5ldyByb3dcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlY0lkOiBudW1iZXIgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlY0lkID09PSBvbGRSZWNJZCAmJiAhdGhpcy5fc3VmZml4RG9uZSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSIDc1ODYzOVxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5nZXRMYXN0VmFsaWRSb3coKSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIG1vdmluZyB0aGUgbWFya2luZyBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIG9sZFRhc2tNb2RlID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCB3YXMgZGVsZXRlZCBpbiBSdW4gVGltZSBieSBGb3JjZSBEZWxldGUgZm9yIGV4YW1wbGVcclxuICAgICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwIHx8IG9sZFRhc2tNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IC0xIHx8ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHMob2xkRGlzcGxheUxpbmUpKVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI5MzY2OFxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInNraXBwZWQgc2V0Y3VyclJvdyBmb3Igcm93IHswfVwiLCBvbGREaXNwbGF5TGluZSkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogaWYgZXZlcnl0aGluZyBpcyBPSywgY3VyciByZWMgd2lsbCBsYXRlciBiZSByZWZyZXNoZWQgaW5cclxuICAgICAgICAgICAgICAgIC8vIFJFQ19QUkVGSVhcclxuICAgICAgICAgICAgICAgIC8vIHRodXMsIHJlZnJlc2ggb25seSBpbiBjYXNlIG9mIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBlcnJvciBpcyBiZWNhdXNlIHRoZSBvbGQtcmVjIHdhcyByZW1vdmVkIChjYW5jZWxFZGl0J2VkKSwgc28gcmVmcmVzaCBmb3JtLlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzc3NTMwOTogaWYgbGVhdmluZyB0aGUgbmV3IGNyZWF0ZWQgcmVjb3JkIGZhaWxlZCB0aGVuIHJlc3RvcmVcclxuICAgICAgICAgICAgICAgICAgLy8gYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBhIG5ldyByZWNvcmQgc28gdGhlIG5leHQgYWN0aW9uIHdvdWxkXHJcbiAgICAgICAgICAgICAgICAgIC8vIFwia25vd1wiIHRoYXQgaXQgaXMgc3RpbGwgYSBuZXcgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgIyA4MTYyNyA6IElmIHRhc2sgaXMgaGF2aW5nIGEgc3ViZm9ybSwgdGhlbiB3aGlsZSBtb3ZpbmcgdG8gc3ViZm9ybSwgbmV3bHkgY3JlYXRlZCByZWNvcmRcclxuICAgICAgICAgICAgICAgICAgLy8gaXMgc3luY2VkIGFuZCBpdCBpcyBpbnNlcnRlZCBpbiBfbW9kaWZpZWRUYWIgYXMgJ2luc2VydCcgcmVjb3JkLiBTbywgYW55IHJlcXVlc3QgdG8gc2VydmVyIGluc2VydHNcclxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRvIHNlcnZlci4gRXZlbiBpZiB3ZSBkb250IGdvIHRvIHNlcnZlciwgaXQgaXMgdGhlcmUgaW4gX21vZGlmaWVkVGFiIGFzIG5ldyByZWNvcmQuIEluc2VydGluZ1xyXG4gICAgICAgICAgICAgICAgICAvLyBoZXJlIGFscmVhZHkgc3luY2VkIHJlY29yZCBjYXVzZXMgaW5zZXJ0aW9uIG9mIHJlY29yZCB0d2ljZS4gU28sIElmIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBzeW5jZWQgdGhlbiBvbmx5IGluc2VydC5cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghY3VyclJlYy5TeW5jZWQgJiYgb2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTgwNTI4OiBSZWZyZXNoIHRoZSBjdXJyZW50IHJvdyBhZnRlciBjYW5jZWwgZWRpdCB0byByZWZsZWN0XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN0b3JlZCB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQgYnVnICM6OTQxNzYzLCB3aGlsZSBjcmVhdGUgaXNuJ3QgYWxsb3dlZCBuZWVkIHRvIGRvIHN1ZmZpeCBhbmQgcHJlZml4IG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGRvUmVjb3JkU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCByZWZkb1JlY29yZFN1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9SZWNvcmRTdWZmaXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgoPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIHJlZmRvUmVjb3JkU3VmZml4KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGhpcy5fdGFzaywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkb1JlY29yZFN1ZmZpeCA9IHJlZmRvUmVjb3JkU3VmZml4LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGUgZm9ybSBkb2VzIG5vdCBoYXZlIGEgdGFibGUsIG1vdmUgdG8gb25lIHJvdyBpbiB0aGUgY2hvc2VuIERpcmVjdGlvblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICsgc2l6ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnN0b3AoKTtcclxuICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXR1cm5Ub1Zpc2libGVMaW5lKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZE91dE9mVmlldykge1xyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID09PSAwKVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlKTtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB2aXNpYmxlTGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuICAgICAgaWYgKHJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBjdXJzb3JNb3ZlZDogYm9vbGVhbiA9IGF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgaWYgKCFjdXJzb3JNb3ZlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRoaXMuX3Rhc2spO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcblxyXG4gICAgICB0aGlzLlNlbGVjdFJvdygpO1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHJlY29yZCB0byB0aGUgZm9ybSBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGFkZFJlYyhkb1N1ZmZpeDogYm9vbGVhbiwgcGFyZW50TGluZTogbnVtYmVyLCBwcmV2TGluZTogbnVtYmVyLCBpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG5ld0xpbmU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgY3VyckxpbmU6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgY3VyckxpbmUgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcblxyXG4gICAgLy8gSW5jcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgYWRkZWQgaW50byB0aGUgdmlldy5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ICs9IDE7XHJcblxyXG4gICAgbGV0IG5ld1JlY0lkeDogbnVtYmVyID0gYXdhaXQgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLmFkZFJlY29yZChkb1N1ZmZpeCwgZmFsc2UsIGlzQ3JlbGluZUFib3ZlKTtcclxuXHJcbiAgICBpZiAobmV3UmVjSWR4ID4gLTEpIHtcclxuICAgICAgLy8gZm9ybXMgd2l0aCBhIHRhYmxlXHJcbiAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIC8vIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSB0YWJsZSBzbyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyXHJcbiAgICAgICAgLy8gc2V0dGluZyB0aGUgdG9wIHJlY29yZCB0byAwIGFuZCB0aGUgY3VycmVudCByb3cgdG8gMFxyXG4gICAgICAgIGxldCBuZXdDdXJyUm93OiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDAgfHwgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgY3Vyc29yIGlzIHBhcmtpbmcgb24gdGhlIGxhc3Qgcm93IG9mIHRoZSBkaXNwbGF5ZWQgdGFibGUgc28gdGhlXHJcbiAgICAgICAgLy8gbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyIGluY3JlbWVudGluZyB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gICAgICAgIGVsc2UgaWYgKGN1cnJMaW5lID09PSB0aGlzLl9yb3dzSW5QYWdlIC0gMSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyAxKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBuZXcgcm93IGlzIGNyZWF0ZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgdG9wIHJlY29yZFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoaXNDcmVsaW5lQWJvdmUpXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSA+IDAgPyBjdXJyTGluZSA6IDA7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbmV3TGluZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIG5ld0N1cnJSb3c7XHJcblxyXG4gICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93KTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gc2hvdWxkIHJlYWxseSBiZSBjYXVnaHQgaGVyZVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcImluIEZvcm0uYWRkUmVjKCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCAtPSAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRlbGV0ZSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRlbEN1cnJSZWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG9wVGFibGVSb3c6IGJvb2xlYW4gPSBzdXBlci5pc0xpbmVNb2RlKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5yZW1vdmVDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlYyhmYWxzZSwgMCwgMCwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl90YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyBjaGFuZ2UgdG8gY3JlYXRlIG1vZGVcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICAgICAgLy8gTUdfQUNUX0NSRUxJTkUgbWF5IGJlIGRpc2FibGVkIC5pLmUuIFBST1BfVFlQRV9BTExPV19DUkVBVEUgZXhwcmVzc2lvbiBjYW4gYmUgY2hhbmdlZFxyXG4gICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBvd25lclRhc2tcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmICh0b3BUYWJsZVJvdylcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQtLTtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCB0cnVlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYW5jZWwgdGhlIGVkaXRpbmcgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCByZXN0b3JlIHRoZSBvbGQgdmFsdWVzIG9mIHRoZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDYW5jZWxcIj50cnVlIGlmIGNhbGxlZCBmb3IgQUNUX0NBTkNFTCwgZmFsc2Ugb3RoZXJ3aXNlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdEV2ZW50XCI+PC9wYXJhbT5cclxuICBhc3luYyBjYW5jZWxFZGl0KGlzQWN0Q2FuY2VsOiBib29sZWFuLCBpc1F1aXRFdmVudDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1vZGU6IHN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IG5ld01vZGU6IHN0cmluZztcclxuICAgIGxldCByb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhlY1JlY1ByZWZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFdlIHJldHVybiB0byBjcmVhdGUgbW9kZSBvbmx5IGlmIHRoZXJlIGlzIG5vIHJlY29yZCB0byBnbyB0byBhZnRlciB0aGUgY2FuY2VsIGFjdGlvblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDEgJiYgbW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIGVsc2VcclxuICAgICAgbmV3TW9kZSA9IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgLy8gOTk3MDczICYgOTMxMDIxLlxyXG4gICAgLy8gRXhwZWN0ZWQgYmVoYXZpb3IgZHVyaW5nIGNhbmNlbCBldmVudCwgZm9yIGEgbmV3IHJlY29yZDpcclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBub3QgY3JlYXRlLCBkZWxldGUgdGhlIG5ldyByZWNvcmQgYW5kIGdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBjcmVhdGUsIHN0YXkgb24gdGhlIG5ldyByZWNvcmQuXHJcblxyXG4gICAgLy8gZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgdW5kZXIgc29tZSBjb25kaXRpb24uXHJcbiAgICAvLyBTbywgaW4gY2FzZSBvZiBvcmdUYXNrTW9kZT1DLCBzaW5jZSB3ZSB3YW50IHRvIHN0YXkgb24gdGhlIG5ldyByZWNvcmQsIHdlIG5lZWQgdG8gcmUtY3JlYXRlIGEgcmVjb3JkLlxyXG5cclxuICAgIC8vIEJ1dCBhcyBzYWlkLCBkdi5jYW5jZWxFZGl0KCkgcmVtb3ZlcyB0aGUgbmV3IHJlY29yZCBPTkxZIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gVGhlIGNvbmRpdGlvbiBpcyBhcyBmb2xsb3dzOlxyXG4gICAgLy8gVGhlIHJlY29yZCBpcyByZW1vdmVkIG9ubHkgaWYgdGhlIGR2IHNpemUgaXMgZ3JlYXRlciB0aGFuIDEuIFNvLCBpZiB0aGUgZHYgc2l6ZSBpcyAxLCBkdi5jYW5jZWxFZGl0KClcclxuICAgIC8vIGRvZXMgbm90IHJlbW92ZSB0aGUgcmVjb3JkIGFuZCBoZW5jZSBpbiB0aGlzIGNhc2UsIGZvcm0uY2FuY2VsRWRpdCgpIHNob3VsZCBub3QgY3JlYXRlIGEgbmV3IHJlY29yZC5cclxuICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgdGhlIHNpZ25hdHVyZSBvZiBkdi5jYW5jZWxFZGl0KCkgaXMgY2hhbmdlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIHJlbW92ZWQgb3Igbm90LlxyXG5cclxuICAgIC8vIFRoaXMgaXMgb25lIHBhcnQuXHJcblxyXG4gICAgLy8gTm93LCBhZnRlciBjYW5jZWxFZGl0LCBSUCBoYXMgdG8gYmUgZXhlY3V0ZWQuIFRoaXMgd2FzIGRvbmUgaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCktPmNhc2UgTUdfQUNUX0NBTkNFTC5cclxuICAgIC8vIEJ1dCB3aGF0IGhhcHBlbnMgaXMsIGlmIGZvcm0uY2FuY2VsRWRpdCgpIGNyZWF0ZWQgYSBuZXcgbGluZSwgUlAgd2FzIGFscmVhZHkgZXhlY3V0ZWQgZnJvbSB0aGVyZS4gQW5kIGZyb21cclxuICAgIC8vIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLCBSUCBpcyBleGVjdXRlZCBmb3IgdGhlIHNlY29uZCB0aW1lLlxyXG4gICAgLy8gU28sIG1vdmVkIHRoZSBjb2RlIG9mIGV4ZWN1dGluZyBSUCBmcm9tIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwgdG8gZm9ybS5jYW5jZWxFZGl0KClcclxuICAgIC8vIGFuZCB0aGF0IHdpbGwgYmUgZG9uZSBvbmx5IGlmIHRoZSBjcmVhdGUgbGluZSB3YXMgbm90IGV4ZWN1dGVkLlxyXG5cclxuICAgIC8vIE5vdywgd2UgaGF2ZSBvbmUgbW9yZSBpc3N1ZS5cclxuXHJcbiAgICAvLyBVbnRpbCBub3csIHRoZSBSUCB3YXMgZXhlY3V0ZWQgYWZ0ZXIgZm9ybS5jYW5jZWxFZGl0KCkuXHJcbiAgICAvLyBTbywgd2hlbiB0aGUgY29kZSBpcyBtb3ZlZCB0byBmb3JtLmNhbmNlbEVkaXQoKSwgaXQgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgbGV0IHJlY1JlbW92ZWQ6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgdGhpcy5HZXREYXRhdmlldygpLnNldFByZXZDdXJyUmVjKG51bGwpO1xyXG4gICAgaWYgKCh0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpIHx8ICgoaXNBY3RDYW5jZWwgJiYgcmVjUmVtb3ZlZCkgJiYgKCFHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSkmJig8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIC8vIFNldCBDYW5jZWwgaW5kaWNhdGlvbiBvbiB0aGUgdGFzayBmb3IgdG8gbm90IHBlcmZvcm0gY29udHJvbCB2YWx1ZSB2YWxpZGF0aW9uIGluIHRoZSBDcmVhdGUgbGluZSBhY3Rpb24uXHJcbiAgICAgIGxldCBvcmdDYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChpc0FjdENhbmNlbCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0Q2FuY2VsV2FzUmFpc2VkKG9yZ0NhbmNlbFdhc1JhaXNlZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc0FjdENhbmNlbClcclxuICAgICAgZXhlY1JlY1ByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgcm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgICAgICBpZiAocm93IDwgMCB8fCByb3cgPj0gdGhpcy5fcm93c0luUGFnZSkge1xyXG4gICAgICAgICAgICAgIGxldCB0b3BSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBpZiAodG9wUmVjSWR4ID4gY3VyclJlY0lkeClcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICAgICAgICAgICAgcm93ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHJvdywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmUuXHJcbiAgICAgICAgICAgIGlmIChyb3cgIT09IDApXHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSB7MH1cIiwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgcmVjUmVtb3ZlZClcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50LS07XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHNjcmVlbiBtb2RlXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSBlcnJvciBpbiBTY3JlZW4gbW9kZSBmb3IgQ3VycmVudCBSZWNvcmRcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl90YXNrLnNldE1vZGUobmV3TW9kZSk7XHJcbiAgICAgIGlmICghKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgICAgaWYgKCEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaylcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChleGVjUmVjUHJlZml4KSB7XHJcbiAgICAgIC8vIFFDUiAjOTI1NjQ2LCAjNDU0MTY3OiBleGl0IHRvIHRoZSBvd25lclRhc2sgbGV2ZWwgaW4gb3JkZXIgdG8gc2tpcCBjb250cm9sIHN1ZmZpeFxyXG4gICAgICAvLyBhbmQgcmVjb3JkIHN1ZmZpeCBvZiB0aGUgY2FuY2VsZWQgbmV3IHJlY29yZCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlXHJcbiAgICAgIC8vIG5leHQgcmVjb3JkIHBlcmZpeCB3b3VsZCBiZSBleGVjdXRlZFxyXG4gICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAvLyB3ZSByb2xsYmFjayBhIHBhcmVudCBvd25lclRhc2sgd2hpbGUgZm9jdXNlZCBvbiBzdWJmb3JtL293bmVyVGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoKDxUYXNrQmFzZT5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5wYXRoQ29udGFpbnMoPFRhc2tCYXNlPnRoaXMuX3Rhc2spKVxyXG4gICAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gPFRhc2tCYXNlPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQgIT09IHRoaXMuX3Rhc2s7XHJcbiAgICAgICAgICAgICAgIHBhcmVudCA9IDxUYXNrQmFzZT5wYXJlbnQuZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgcGFyZW50LnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAoKDxEYXRhVmlldz5wYXJlbnQuRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc1F1aXRFdmVudCkge1xyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGZvbGxvd2luZyAyIGxpbmVzIGNhbiBiZSBtZXJnZWQgaW4gb25lIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0aGlzLl90YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNjYW4gYWxsIGNvbnRyb2xzIGluIHRoZSBmb3JtLiBFdmVyeSBjb250cm9sIHdoaWNoIGhhcyBhIHByb3BlcnR5IHRoYXQgaXMgYW4gZXhwcmVzc2lvbiB3aWxsIGJlXHJcbiAgLy8vICAgcmVmcmVzaGVkLiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoZSBjb250cm9sJ3MgZGlzcGxheSBpcyBzeW5jaGVkIHdpdGggdGhlIGV4cHJlc3NpbidzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoT25FeHByZXNzaW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gKCh0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKSBpbnN0YW5jZW9mIE1nQ29udHJvbCkgPyA8TWdDb250cm9sPnRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpIDogbnVsbCk7XHJcblxyXG4gICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgYXdhaXQgbWdDb250cm9sLnJlZnJlc2hPbkV4cHJlc3Npb24oKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLkFzc2VydChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyByZWZyZXNoIHRoZSBmb3JtIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hQcm9wc09uRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBjb250cm9scyBvZiB0aGlzIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZnNUb0N0cmxzKCk6IHZvaWQge1xyXG4gICAgLy8gaWYgbGFzdCBmb2N1c2VkIGNvbnRyb2wgd2FzIGZyb20gdGhpcyB0YXNrIC0gemVybyBpdC5cclxuICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldEZvcm0oKSA9PT0gdGhpcylcclxuICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+dGhpcy5fdGFzaywgbnVsbCk7XHJcblxyXG4gICAgc3VwZXIucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRDdHJsQnlDdHJsTmFtZShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiA8TWdDb250cm9sPnRoaXMuQ3RybFRhYi5nZXRDdHJsKGN0cmxOYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIHN1YmZvcm0gY29udHJvbCB3aXRoIHRoZSB0eXBlZCBuYW1lIGZyb20gYWxsIHBhcmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj4gdGhlIHJlcXVlc3RlZCBzdWJmb3JtIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0U3ViRm9ybUN0cmxCeU5hbWUoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgZ3VpUGFyZW50VGFzazogVGFza0Jhc2U7XHJcbiAgICBsZXQgZGVzdFN1YkZvcm06IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChndWlQYXJlbnRUYXNrID0gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcbiAgICAgICAgIGRlc3RTdWJGb3JtID09PSBudWxsICYmIGd1aVBhcmVudFRhc2sgIT09IG51bGwgJiYgZ3VpUGFyZW50VGFzay5nZXRGb3JtKCkgIT09IG51bGw7XHJcbiAgICAgICAgIGd1aVBhcmVudFRhc2sgPSBndWlQYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgIGRlc3RTdWJGb3JtID0gPE1nQ29udHJvbD5ndWlQYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKGN0cmxOYW1lLCBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNKTtcclxuICAgICAgaWYgKGRlc3RTdWJGb3JtID09IG51bGwpIHtcclxuICAgICAgICBpZiAoIWd1aVBhcmVudFRhc2suSXNTdWJGb3JtIHx8IE5TdHJpbmcuRXF1YWxzKGd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkuTmFtZSwgY3RybE5hbWUsIHRydWUpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVzdFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBzdWZmaXhEb25lIHBhcmFtZXRlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTdWZmaXhEb25lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3VmZml4RG9uZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXREZXN0aW5hdGlvblJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RUYmxSb3c7XHJcbiAgfVxyXG5cclxuICBzZXRTdWJGb3JtQ3RybChzdWJGb3JtQ3RybDogTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fc3ViRm9ybUN0cmwgPT09IG51bGwgJiYgc3ViRm9ybUN0cmwgIT09IG51bGwpO1xyXG4gICAgdGhpcy5fc3ViRm9ybUN0cmwgPSBzdWJGb3JtQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgc3ViZm9ybSBjb250cm9sIHRoYXQgcG9pbnRzIHRvIGEgdGFzayB3aG9zZSBpZCBpcyBnaXZlbiBpbiB0YXNrSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+dGhlIGlkIG9mIHJlcXVlc3RlZCBzdWJmb3JtIG93bmVyVGFzazwvcGFyYW0+XHJcbiAgZ2V0U3ViRm9ybUN0cmxGb3JUYXNrKHRhc2tJZDogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHBhcmVudEN0cmxUYWI6IENvbnRyb2xUYWJsZTtcclxuICAgIGxldCBndWlQYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGd1aVBhcmVudEZvcm0gPSB0aGlzOyBndWlQYXJlbnRGb3JtICE9IG51bGw7IGd1aVBhcmVudEZvcm0gPSBndWlQYXJlbnRGb3JtLlBhcmVudEZvcm0pIHtcclxuICAgICAgcGFyZW50Q3RybFRhYiA9IGd1aVBhcmVudEZvcm0uQ3RybFRhYjtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhcmVudEN0cmxUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBjdXJyID0gKChwYXJlbnRDdHJsVGFiLmdldEN0cmwoaSkgaW5zdGFuY2VvZiBNZ0NvbnRyb2wpID8gPE1nQ29udHJvbD5wYXJlbnRDdHJsVGFiLmdldEN0cmwoaSkgOiBudWxsKTtcclxuICAgICAgICBpZiAoY3VyciAhPSBudWxsICYmIGN1cnIuaXNTdWJmb3JtKCkgJiYgKGN1cnIuZ2V0U3ViZm9ybVRhc2tJZCgpICE9IG51bGwpKVxyXG4gICAgICAgICAgaWYgKGN1cnIuZ2V0U3ViZm9ybVRhc2tJZCgpID09PSB0YXNrSWQpIHtcclxuICAgICAgICAgICAgZGVzdFN1YkZvcm0gPSBjdXJyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRlc3RTdWJGb3JtICE9IG51bGwpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVzdFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjcmVhdGUgcmVjb3JkcyBiZXR3ZWVuIGlkeCBhbmQgZW5kIG9mIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcmVtb3ZlUmVjb3Jkc0FmdGVySWR4KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVtb3ZlQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gaW4gc29tZSBjYXNlcyBpbnZpc2libGUgLTEgcm93ICh0aGF0IGV4aXN0IG9ubHkgZm9yIHNjcm9sbGJhciBlZmZlY3RzKSBiZWNvbWVzIHZpc2libGUuXHJcbiAgICAvLyBUbyBwcmV2ZW50IHRoaXMgd2UnbGwgcmVtb3ZlIGFsbCByZWNvcmRzLiBUaGlzIHdpbGwgbm90IGNhdXNlIHBlcmZyb21hbmNlIHByb2JsZW1zIHNpbmNlXHJcbiAgICAvLyB3ZSB3aWxsIGFkZCBtYXhpbXVtIHJvd0luUGFnZSByZWNvcmRzIG1vcmUgdGhlbiB3ZSBpbnRlbmRlZCBpbiB0aGUgYmVnaW5pbmdcclxuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSlcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChpZHggPD0gdGhpcy5fcm93c0luUGFnZSArIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgaWR4ID0gMDtcclxuICAgICAgaWYgKGlkeCA9PT0gMClcclxuICAgICAgICByZW1vdmVBbGwgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICBzdXBlci5TZXRUYWJsZUl0ZW1zQ291bnQoaWR4LCByZW1vdmVBbGwpO1xyXG4gICAgICAvLyB1cGRhdGVzIHRhYmxlIGl0ZW0ncyBjb3VudFxyXG5cclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiByb3cgaXMgdmFsaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUm93VmFsaWRhdGVkKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHggfHwgaWR4IDwgMClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICBpZiAocm93ID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiByb3cuQ3JlYXRlZCAmJiByb3cuVmFsaWRhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJ1bnMgaW4gV29ya2VyIHRocmVhZCB3aGVuIHRoZSB0aHJlYWQgaXMgZnJlZSBhbmQgc2VuZCB0byBHVUkgdGhyZWFkIGNvbnRyb2xzIGRhdGEgb2YgYWxsIHJvd3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHRyYW5zZmVyRGF0YVRvR3VpKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmVSb3dJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICBsZXQgbWF4VGltZTogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSArIE1nRm9ybS5USU1FX0xJTUlUO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjdXJyZW50RWRpdGluZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcbiAgICAgIC8vIHRoaXMgbGltaXRhdGlvbiBpcyBuZWVkZWQgc28gdGhpcyByZXF1ZXN0IHdpbGwgbmV2ZXIgdGFrZSB0b28gbXVjaCB0aW1lXHJcbiAgICAgIHdoaWxlIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIDwgbWF4VGltZSAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICAgIC8vIGFsbCByb3dzIGFscmVhZHkgc2VudFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkgJiYgdGhpcy5fbGFzdFJvd1NlbnQgKyAxID49IHRoaXMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9sYXN0Um93U2VudCsrO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1ZhbGlkYXRlZCh0aGlzLl9sYXN0Um93U2VudCkpIHtcclxuICAgICAgICAgIC8vIHJvdyBuZWVkcyB0byBiZSBzZW50XHJcbiAgICAgICAgICAvLyBzZW5kIHJvdyBkYXRhXHJcbiAgICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyh0aGlzLl9sYXN0Um93U2VudCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgIT09IHNhdmVSb3dJZHgpIHtcclxuICAgICAgICAgICAgc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7IC8vIHJlc2V0IHRoZSBmbGFnXHJcbiAgICAgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRyZWVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLl9sYXN0Um93U2VudCwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyByZXN0b3JlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKHNhdmVSb3dJZHgsIGJrcFJlY29yZCk7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgIHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBjdXJyZW50RWRpdGluZ0NvbnRyb2w7IC8vIHNldCB0aGUgZmxhZyB0byB0aGUgb3JpZ2luYWwgdmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLl90cmFuc2ZlcmluZ0RhdGEgPSBmYWxzZTtcclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiBhbnkgcm93cyBuZWVkIHRvIGJlIHNlbnQgdG8gR1VJIHRocmVhZFxyXG4gIC8vLyAgIGlmIHRoZXJlIGFyZSwgcHV0cyBldmVudCBpbiBldmVudCBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiB0aGlzLk9wZW5lZCAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICBsZXQgc2l6ZTogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ID49IHRoaXMuUm93cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyB3aGVuIHdlIGRlY3JlYXNlIHNpemUgb2Ygcm93cyBhcnJheSBhZGp1c3QgbGFzdFJvd1NlbnRcclxuICAgICAgICB0aGlzLl9sYXN0Um93U2VudCA9IHRoaXMuUm93cy5sZW5ndGggLSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGVyZSBhcmUgcm93cyB0byBzZW5kIGFuZCB0aGVyZSBpcyBub3cgcmVxdWVzdCBmb3Igcm93cyB5ZXRcclxuICAgICAgLy8gYWRkIHJlcXVlc3QgZm9yIHJvd3NcclxuICAgICAgbGV0IHRyYW5zZmVyRGF0YVRvR3VpOiBib29sZWFuID0gdGhpcy5fbGFzdFJvd1NlbnQgPCAoc2l6ZSAtIDEpO1xyXG5cclxuICAgICAgLy8gRm9yIHBhZ2luYXRlZCB0YWJsZSBjaGVjayB0aGUgbWF4IHJvd3Mgb2YgR1VJIHRhYmxlIGNvbnRyb2wuXHJcbiAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpICYmICh0aGlzLl9sYXN0Um93U2VudCArIDEpID49IHRoaXMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKSlcclxuICAgICAgICB0cmFuc2ZlckRhdGFUb0d1aSA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHRyYW5zZmVyRGF0YVRvR3VpICYmICF0aGlzLl90cmFuc2ZlcmluZ0RhdGEpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkodGhpcy5fdGFibGVNZ0NvbnRyb2wsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVl9UT19HVUksIFByaW9yaXR5LkxPV0VTVCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJpbmdEYXRhID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlciAmJiAhdHJhbnNmZXJEYXRhVG9HdWkgJiYgKCF0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkgfHwgIXRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkpKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KHRoaXMuX3RhYmxlTWdDb250cm9sLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfUkVDT1JEU19BSEVBRF9GUk9NX1NFUlZFUiwgUHJpb3JpdHkuTE9XRVNUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgcm93IGRhdGEgZm9yIHRoZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc2lyZWRUb3BJbmRleFwiPmRlc2lyZWQgdG9wIGluZGV4IGlmIGRlc2lyZWRUb3BJbmRleCBpcyBJbnRlZ2VyLk1JTl9WQUxVRSwgdG9wIGluZGV4IGlzIGNlY2lldmVkIGZvcm0gZHY8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPmlmIHRydWUsIHNlbmQgYWxsIHJlY29yZHMsIGV2ZW4gaWYgdGhleSBhcmUgY3JlYXRlZCBhbmQgdmFsaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RGb2N1c2VkVmFsXCI+PC9wYXJhbT5cclxuICBhc3luYyBzZXRSb3dEYXRhKGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBsYXN0Rm9jdXNlZFZhbDogTGFzdEZvY3VzZWRWYWwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlUm93SWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgbGV0IGRpZmY6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZ2V0UHJldkNodW5rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZ2V0TmV4dENodW5rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChkZXNpcmVkVG9wSW5kZXggIT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGlmIChkZXNpcmVkVG9wSW5kZXggPCAwKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyByZXF1ZXN0IGZvciBsaW5lIG9yIHBhZ2UgYmVmb3JlIGN1cnJlbnQgY2h1bmtcclxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHRvcCBpbmRleCBpcyBhbHdheXMgMFxyXG4gICAgICAgIGdldFByZXZDaHVuayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChkZXNpcmVkVG9wSW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlICsgMSA+PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKVxyXG4gICAgICAvLyBwYWdlZG93biBvciBhcnJvd2Rvd24gYXQgZW5kIG9mIHRoZSBkYXRhdmlld1xyXG4gICAgICAgIGdldE5leHRDaHVuayA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGRlc2lyZWRUb3BJbmRleCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuXHJcbiAgICBsZXQgYmtwUmVjb3JkOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuYmFja3VwQ3VycmVudCgpO1xyXG5cclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICBsZXQgZGlmZlJlZjogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbShkaWZmKTtcclxuICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnJlZnJlc2hSb3dzKGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCwgc2F2ZVJvd0lkeCwgZGlmZlJlZik7XHJcbiAgICBkaWZmID0gZGlmZlJlZi52YWx1ZTtcclxuXHJcbiAgICBpZiAoKGdldFByZXZDaHVuayAmJiBkaWZmICE9PSAwKSB8fCBnZXROZXh0Q2h1bmspIHtcclxuICAgICAgLy8gaWYgZGlmZiAhPSAwIGEgbmV3IGNodW5rIHdhcyBicm91Z2h0IHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgZHZcclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBmaXJzdCByZXF1ZXN0ZWQgaW5kZXhcclxuICAgICAgLy8gaWYgbmV4dCBjaHVuayB3YXMgYnJvdWdodCwgdG9wIGluZGV4IG1heSBhbHNvIGJlIHVwZGF0ZWRcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChkZXNpcmVkVG9wSW5kZXggKyBkaWZmKTtcclxuICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgIGlmICh0aGlzLl90b3BJbmRleFVwZGF0ZWQpIHtcclxuICAgICAgICAvLyBpZiB0b3AgaW5kZXggd2FzIHVwZGF0ZWQgaW4gdGhlIHNldFRhYmxlVG9wSW5kZXggLSB3ZSBtaWdodCBoYXZlIHJvd3MgdGhhdCB3ZXJlIG5vdCByZWZyZXNoZWRcclxuICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB0cnVlO1xyXG4gICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHVwZGF0ZWQpIHtcclxuICAgICAgLy8gYW55IHJvdyB3YXMgdXBkYXRlZFxyXG4gICAgICAvLyByZXN0b3JlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChzYXZlUm93SWR4ICsgZGlmZiwgYmtwUmVjb3JkKTtcclxuICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gYXNrIHRhYmxlIHRvIHJlZnJlc2ggdGhlIHBhZ2VcclxuXHJcbiAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIGlmIChnZXRQcmV2Q2h1bmspIHtcclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGZvY3VzZWRcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCAmJiBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0UGFyZW50VGFibGUoKSA9PT0gdGhpcy5fdGFibGVNZ0NvbnRyb2wpIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2hlcyByb3dzIGluIHRoZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNhdmVSb3dJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlmZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hSb3dzKGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBzYXZlUm93SWR4OiBudW1iZXIsIGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBkaWZmUmVmLnZhbHVlID0gMDtcclxuICAgIGxldCBvcmdJbmNsdWRlc0ZpcnN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKTtcclxuICAgIGxldCBvcmdJbmNsdWRlc0xhc3Q6IGJvb2xlYW4gPSB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcm93c0luUGFnZTsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGRlc2lyZWRUb3BJbmRleCArIGk7XHJcbiAgICAgIGxldCBwcmV2VG9wSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gaWYgd2UgZmFpbCB0byBnZXQgb25lIHJlY29yZCwgd2UgbWF5IHN1Y2NlZWQgdG8gZ2V0IHRoZSBuZXh0IG9uZVxyXG4gICAgICAgIGluZGV4ID0gaWR4ICsgZGlmZlJlZi52YWx1ZTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSb3dWYWxpZGF0ZWQoaWR4KSB8fCBzZW5kQWxsKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMClcclxuICAgICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGlmIChzYXZlUm93SWR4ICsgZGlmZlJlZi52YWx1ZSAhPT0gaW5kZXgpIHsgLy8gbm90IGN1cnJlbnQgbGluZVxyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaW5kZXgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIGEgbmV3IGNodW5rIGlzIGJyb3VnaHQgdG9wIGluZGV4IHdpbGwgYmUgY2hhbmdlZFxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpbmRleCkpXHJcbiAgICAgICAgICAgIHN1cGVyLm1hcmtSb3dOT1RDcmVhdGVkKGluZGV4KTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gUUNSICMyNjEwNTUsIGV2ZW4gc28gcmVxdWlyZWQgcmVjb3JkIG1heSBub3QgYmUgZm91bmQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBuZXcgY2h1bmsgaGFzIGJlZW4gc2VudFxyXG4gICAgICAgIC8vIGFuZCBkaWZmIG11c3QgYmUgdXBkYXRlZFxyXG4gICAgICAgIGRpZmZSZWYudmFsdWUgPSBkaWZmUmVmLnZhbHVlICsgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAtIHByZXZUb3BJZHgpO1xyXG4gICAgICAgIHByZXZUb3BJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgaWYgKCF1cGRhdGVkICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5EYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdCwgb3JnSW5jbHVkZXNMYXN0KSlcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHJvdyBpbiB0aGUgcGFnZTwvcmV0dXJucz5cclxuICBnZXRWaXNpYmxlTGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIGN1cnJSZWNJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIHJldHVybiBjdXJyUmVjSWR4IC0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhc3NlcnRzIHRoYXQgY3VycmVudCByZWNvcmQgaXMgaW4gdGhlIHZpZXcsIGlmIGl0IGlzIG5vdCBvbiB0aGUgcGFnZSwgYWRqdXN0cyB0b3AgaW5kZXgsIHNvIHRoYXQgY3VycmVudFxyXG4gIC8vLyAgIHJlY29yZCB3aWxsIGJlIG9uIHRoZSB2aXNpYmxlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJyaW5nUmVjb3JkVG9QYWdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGxldCB0b3BJbmRleDogbnVtYmVyID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgbGV0IG5ld1RvcEluZGV4OiBudW1iZXIgPSB0b3BJbmRleDtcclxuXHJcbiAgICAgIC8vIFRhYmxlIHRvcCBpbmRleCBmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZVxyXG4gICAgICBpZiAoIXRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICBpZiAodG9wSW5kZXggPiBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0b3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxIDwgY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9yb3dzSW5QYWdlID4gMClcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4IC0gdGhpcy5fcm93c0luUGFnZSArIDE7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSB0b3AgaW5kZXggZm9yIHBhZ2luYXRlZCB0YWJsZS5cclxuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGluZGV4IG9mIGZpcnN0IHJlY29yZCBvbiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHJlY29yZCB0byBiZSBzZWxlY3RlZC5cclxuICAgICAgICBsZXQgY3Vyckd1aUlkeCA9IHRoaXMuZ2V0R3VpUm93aWR4KGN1cnJJZHgpO1xyXG4gICAgICAgIGxldCBuZXdUb3BHdWlJbmRleCA9IChjdXJyR3VpSWR4KSAtICgoY3Vyckd1aUlkeCkgJSB0aGlzLl9yb3dzSW5QYWdlKTsgLy9ndWkgaWR4IG9mIGZpcnN0IHJlY29yZCBvZiByZXNwZWN0aXZlIHBhZ2VcclxuXHJcbiAgICAgICAgbmV3VG9wSW5kZXggPSB0aGlzLmdldER2Um93SWR4KG5ld1RvcEd1aUluZGV4KTtcclxuXHJcbiAgICAgICAgaWYobmV3VG9wSW5kZXggIT09IHRoaXMuX3ByZXZHdWlUb3BJbmRleCB8fCB0aGlzLklzTW92aW5nSW5WaWV3IClcclxuICAgICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBiZSBjdXJyZW50IGxpbmVcclxuICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAhPT0gbmV3VG9wSW5kZXggfHwgdGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChuZXdUb3BJbmRleCk7XHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKEludDMyLk1pblZhbHVlLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnZhbGlkYXRlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbnZhbGlkYXRlVGFibGUoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5Sb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCByb3c6IFJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAocm93ICE9PSBudWxsKVxyXG4gICAgICAgIHJvdy5WYWxpZGF0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBwcmV2aW91cyB2aXNpYmxlIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRQcmV2TGluZShsaW5lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGxpbmUgLSAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZGVmYXVsdCBidXR0b24gY29udHJvbCBvZiB0aGUgZm9ybSwgaWYgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gTlVMTFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBnZXREZWZhdWx0QnV0dG9uKGNoZWNrVmlzaWJsZUVuYWJsZTogYm9vbGVhbik6IFByb21pc2U8TWdDb250cm9sPiB7XHJcbiAgICBsZXQgZGVmYXVsdEJ1dHRvbjogTWdDb250cm9sID0gbnVsbDtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHN1cGVyLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9CVVRUT04pO1xyXG4gICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgZGVmYXVsdEJ1dHRvbiA9IDxNZ0NvbnRyb2w+c3VwZXIuZ2V0Q3RybEJ5TmFtZShhd2FpdCBwcm9wLmdldFZhbHVlKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTik7XHJcbiAgICAgIGlmIChjaGVja1Zpc2libGVFbmFibGUgJiYgZGVmYXVsdEJ1dHRvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghZGVmYXVsdEJ1dHRvbi5pc1Zpc2libGUoKSB8fCAhZGVmYXVsdEJ1dHRvbi5pc0VuYWJsZWQoKSlcclxuICAgICAgICAgIGRlZmF1bHRCdXR0b24gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVmYXVsdEJ1dHRvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgc29ydCBtYXJrKGRlbHRhKSBmcm9tIHRoZSBjb2x1bW4uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNsZWFyU29ydE1hcmtcIj48L3BhcmFtPlxyXG4gIGNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayhjbGVhclNvcnRNYXJrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoY2xlYXJTb3J0TWFyaykge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzdG9wIHRoZSByb3cgZnJvbSBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc3RvcFJvd0VkaXRpbmcoaWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgaWYgKHRoaXMuZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShpZHgpKSB7XHJcbiAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9OT1RfSVNfUk9XX0VESVRJTkcsIHRoaXMsICB0aGlzLmlzTGluZU1vZGUoKSAgPyBpZHggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzdGFydCB0aGUgcm93IGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBhc3luYyBzdGFydFJvd0VkaXRpbmcoaWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKCF0aGlzLmdldElzUm93RWRpdGluZ0Zyb21HdWkoaWR4KSkge1xyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfSVNfUk9XX0VESVRJTkcsIHRoaXMsIHRoaXMuaXNMaW5lTW9kZSgpID8gaWR4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2QgcmV0dXJuIGlmIHRoZSByb3cgaXMgaW4gZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHB1YmxpYyBnZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGRpc3BsYXlJbmRleDpudW1iZXIgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSb3dFZGl0aW5nOiBib29sZWFuID0gQ29tbWFuZHMuZ2V0SXNSb3dFZGl0aW5nKHRoaXMsIHRoaXMuaXNMaW5lTW9kZSgpID8gZGlzcGxheUluZGV4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgcmV0dXJuIGlzUm93RWRpdGluZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIGRpc3BsYXksIHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkocmVmcmVzaFR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2tCYXNlID0gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIFRha2UgYW5vdGhlciBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gb2YgUUNScyAjOTg0OTk5LCAjOTMzNjM5ICYgIzY5OTgyMTpcclxuICAgIC8vIE5vdywgdGhlIGRpc3BsYXkgd291bGQgYmUgcmVmcmVzaGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIE5PVCBhbiBvbGRcclxuICAgIC8vIHJlY29yZCB3aGljaCBpcyBiZWluZyBjb21wdXRlZC4gVGhlIHJlc3VsdCBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGR1cmluZyB0aGVcclxuICAgIC8vIGNvbXB1dGUgcHJvY2VzcyBvZiBhIHJlY29yZCB0aGUgZGlzcGxheSBpcyBub3QgcmVmcmVzaGVkICh3aGljaCBpcyBnb29kIGZvciB1cykuXHJcbiAgICAvLyBUaGUgZGlzcGxheSB3b3VsZCBiZSByZWZyZXNoZWQgYW55d2F5IEFGVEVSIHRoZSBjb21wdXRlIHByb2Nlc3MgaXMgZG9uZS5cclxuICAgIC8vIChFaHVkIDIxLU1BWS0yMDAyKVxyXG4gICAgaWYgKGN1cnJSZWMgIT09IG51bGwgJiYgY3VyclJlYy5JbkNvbXB1dGUgJiYgIWN1cnJSZWMuaXNOZXdSZWMoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9pblJlZnJlc2hEaXNwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB0aGlzLl9pblJlZnJlc2hEaXNwID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSB8fCByZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm0gYW5kIHJlZnJlc2ggaXRcclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSAmJiB0aGlzLk9wZW5lZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRhYmxlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNIHx8IHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDICYmIHN1cGVyLmhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlZnJlc2ggdGhlIGZvcm0gcHJvcGVydGllc1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hQcm9wcygpO1xyXG4gICAgICAgIC8vIHJlZnJlc2ggdGhlIGN1cnJlbnQgcmVjb3JkL1Jvd1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyhmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX0gaW4gdGFzayB7Mn1cIiwgZXguR2V0VHlwZSgpLCBleC5NZXNzYWdlLCAoPFRhc2tCYXNlPnN1cGVyLmdldFRhc2soKSkuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9pblJlZnJlc2hEaXNwID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2lnbmFsIHdlIGNvbXBsZXRlZCB0aGUgZmlyc3QgY3ljbGUgb2YgcmVmcmVzaGluZyB0aGUgZm9ybVxyXG4gICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDICYmICghc3VwZXIuaXNMaW5lTW9kZSgpIHx8IHRoaXMuX3RhYmxlUmVmcmVzaGVkKSlcclxuICAgICAgdGhpcy5Gb3JtUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZWZyZXNoVUkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZ2V0VGFzaygpLmlzTWFpblByb2coKSAvKiYmIEluaXRpYWxpemF0aW9uRmluaXNoZWQqLykge1xyXG4gICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCBmb3JtcyB3aXRoIHRhYmxlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVHdWlUb0xvZyhcIlN0YXJ0IGZvcm0ucmVmcmVzaFRhYmxlKClcIik7XHJcbiAgICAvLyB0b2RvIGZvciBub3cgLSBhbHdheXMgc2hvdyBhbGwgcmVjb3Jkc1xyXG4gICAgLy8gc2F2ZSB0aGUgb2xkIGN1cnJlbnQgcm93XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgbGV0IG9sZEN1cnJSb3c6IG51bWJlciA9IHRoaXMuRGlzcGxheUxpbmU7XHJcbiAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICAvLyBGb3IgdGhlIGZpcnN0IHRpbWUgd2UgcmVmcmVzaCB0aGUgdGFibGUgLSBzZXQgY3Vyci1yb3cgYW5kIHRvcC1yZWMtaWR4IHRvIGJlIHRoZVxyXG4gICAgLy8gb25lcyByZXF1ZXN0ZWQgYnkgdGhlIGRhdGF2aWV3LlxyXG4gICAgLy8gSW4gdGhlIGZvbGxvd2luZyB0YWJsZSByZWZyZXNoZXMgLSB3ZSBjaGFuZ2UgY3Vyci1yb3cgYW5kIHRvcC1yZWMgb25seSBpZiB0aGUgdGFibGVcclxuICAgIC8vIGJlY29tZXMgZW1wdHkuXHJcbiAgICBpZiAoIXRoaXMuX3RhYmxlUmVmcmVzaGVkICYmIGN1cnJSZWNJZHggPj0gMCkge1xyXG4gICAgICBvbGRDdXJyUm93ID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcblxyXG4gICAgICBpZiAob2xkQ3VyclJvdyArIDEgPiB0aGlzLl9yb3dzSW5QYWdlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgob2xkQ3VyclJvdyAtIE1hdGguZmxvb3IodGhpcy5fcm93c0luUGFnZSAvIDIpICsgMSk7XHJcblxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAob2xkQ3VyclJvdyA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgb2xkQ3VyclJvdyA9IDA7XHJcblxyXG4gICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGN1cnJSZWNJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoZW4gVG9wUmVjSWR4IDwgMCBpdCBtZWFucyB3ZSBzaG9sZCBub3QgY29udGludWUgdGhlIHJlZnJlc2ggc2luY2Ugd2UgYXJlIGluIHRlbXBvcmFyeSBzaXR1YXRpb24uXHJcbiAgICAvLyBBbm90aGVyIHJlZnJlc2ggd2lsbCBiZSBkb25lIHNvb24gd2l0aCBjb3JyZWN0IHZhbHVlcy5cclxuICAgIC8vIFRoaXMgaXMgY2FuIGhhcHBlbiB3aGVuIDpcclxuICAgIC8vIEluIGZldGNoQ2h1bmtGcm9tU2VydmVyIHdlIGdvIHRvIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgZXhwZWN0cyBuZXcgcmVjb3Jkcy5cclxuICAgIC8vIFdoaWxlIGluIHRoZSBwcm9jZXNzIG9mIGZldGNoaW5nQ2h1bmssIHdlIG1pZ2h0IGdvIGFnYWluIHRvIHRoZSBzZXJ2ZXIsIGJlZm9yZSB0aGUgc2VydmVyIHNlbmRzIHVzIHRoZSBjaHVuay5cclxuICAgIC8vIEdvaW5nIHRvIHRoZSBzZXJ2ZXIgaW4gdGhlIGdldCBjaHVuayBwcm9jZXNzICwgY2FuIGJlIGZvciBleGFtcGxlOiByZWNvcmQgc3VmZml4LCBvciBhbnkgc2VydmVyIHNpZGUgb3AgaW4gcmVjIHN1ZmYgb3IgVkMuXHJcbiAgICAvLyBVc3VhbGx5LCBkdXJpbmcgdGhpcyBwYXJ0LCB3ZSBkbyBub3QgcmVmcmVzaCB0aGUgdGFibGUuXHJcbiAgICAvLyBCdXQsIGZvciBleGFtcGxlIGluIFFDUiAjNjk4MjE3LCBhIGNhbGwgd2FzIG1hZGUgdG8gcmVmcmVzaFRhYmxlIHdpdGggVG9wUmVjSWR4ID09IC0xLlxyXG4gICAgLy8gVGhlIHJlYXNvbiB3YXMsIHRoYXQgaW4gdGhlIFZDIHRoZXJlIHdhcyBhIHNlcnZlciBvcCB0aGF0IHVwZGF0ZWQgYSB2YXIgaW4gdGhlIHRhc2suIEFzIGEgcmVzdWx0LCB0aGUgJ21vZGknIGZsYWdcclxuICAgIC8vIGZyb20gdGhlIHNlcnZlciB3YXMgb24sIHdoaWNoIGNhdXNlZCB0aGUgXCJ0ZW1wXCIgcmVmcmVzaFRhYmxlIGJlZm9yZSB0aGUgcmVhbCBjaHVuayBhcnJpdmVkLlxyXG4gICAgLy8gVGhpcyBpbiB0dXJuIGNhdXNlZCBhIGNoYW5nZSBpbiB0aGUgY3VyciByZWMgaWQsIHdoaWNoIHdhcyB3cm9uZy5cclxuICAgIC8vIEFmdGVyIHRoZSBjaHVuayBhcnJpdmVzLCB0aGUgcmVmcmVzaCBzZXRzIHRoZSBjb3JyZWN0IHZhbHVlcy5cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPCAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgb2xkQ3VyclJvdyA9IG9sZEN1cnJSb3cgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7IC8vIHNhdmUgb2xkQ3VyclJvdyByZWxhdGl2ZWx5IHRvIHRoZSB0b3AgaW5kZXhcclxuICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcbiAgICB0aGlzLl90YWJsZVJlZnJlc2hlZCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9yaVRyYW5zZmVyRGF0YVRvR3VpID0gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG5cclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICAvLyBRQ1IgIzk5ODA2Nywgd2UgbXVzdCBub3QgcmVmcmVzaCBzdWJmb3JtcyBmb3IgYW55IHJvd3MgdGhhdCBhcmUgbm90IG91ciByZWFsIGN1cnJlbnQgcm93XHJcblxyXG4gICAgLy8gcmVmcmVzaCBhbGwgdGhlIHJvd3MgQlVUIG5vdCB0aGUgb2xkIGN1cnJlbnQgcm93XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcm93c0luUGFnZTsgaSsrKSB7XHJcbiAgICAgIC8vIHdoZW4gdGhlcmUgaXMgbm8gcmVjb3JkIGZvciBhIHJvdyBqdXN0IGRpc2FibGUgaXQgYW5kIHZpY2UgdmVyc2FcclxuICAgICAgbGV0IHRvcEluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmICh0b3BJbmRleCA8IDApIHtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgIHRvcEluZGV4ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSB0b3BJbmRleCArIGk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaWR4KTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgb2xkIGN1cnJlbnQgcm93LiB0aGUgcmVmcmVzaCBmb3IgdGhpcyByb3cgaXMgZG9uZSBieSB0aGUgY2FsbGVyXHJcbiAgICAgICAgLy8gYW5kIHJlZnJlc2ggb25seSB2YWxpZCBsaW5lcyB0aGF0IHdlcmUgbm90IGRpc2FibGVkXHJcbiAgICAgICAgaWYgKGkgIT09IG9sZEN1cnJSb3cpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaWR4LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleC5uYW1lID09IFwiUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvblwiKSB7XHJcbiAgICAgICAgICAvLyBjcmVhdGlvbiBvZiByb3cgZmFpbGVkLCBtYXJrIHRoZSByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAgICAgICAgIGlmIChzdXBlci5pc1Jvd0NyZWF0ZWQoaWR4KSlcclxuICAgICAgICAgICAgc3VwZXIubWFya1Jvd05PVENyZWF0ZWQoaWR4KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICBpZiAoIW9yaVRyYW5zZmVyRGF0YVRvR3VpKVxyXG4gICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChvbGRDdXJyUm93ICsgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCBia3BSZWNvcmQpO1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiRW5kIGZvcm0ucmVmcmVzaFRhYmxlKClcIik7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBkaXNwbGF5IGxpbmUgYnkgcmVjb3JkIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHVwZGF0ZURpc3BsYXlMaW5lQnlEVigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGlzcGxheUxpbmUgPSB0aGlzLnJlY29yZElkeDJEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+aXMgdGhlIG5ldyBjdXJyZW50IGRpc3BsYXkgbGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5kbyB0aGUgYWN0aW9ucyBhcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZWNJZHg6IG51bWJlciA9IHRoaXMuZGlzcGxheUxpbmUyUmVjb3JkSWR4KGRpc3BsYXlMaW5lKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5UmVjSWR4KHJlY0lkeCwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIGRpc3BsYXlMaW5lKTtcclxuICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKVxyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkRpc3BsYXlMaW5lID0gZGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdXJyZW50IHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dOdW1cIj5pcyB0aGUgbmV3IGN1cnJlbnQgcm93IG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5kbyB0aGUgYWN0aW9ucyBhcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRDdXJyUm93QnlSZWNJZHgocm93TnVtOiBudW1iZXIsIGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBkaXNwbGF5TGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpID09PSBudWxsIHx8ICghc3VwZXIuaGFzVGFibGUoKSAmJiByb3dOdW0gIT09IDApKVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBGb3JtLnNldEN1cnJSb3coKSBubyB0YWJsZSBcIik7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fZGVzdFRibFJvdyA9IHJvd051bTtcclxuICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChyb3dOdW0sIGRvU3VmZml4LCBpZ25vcmVDdXJyUmVjLCB0cnVlLCBkaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fZGVzdFRibFJvdyA9IHJvd051bSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBsYXN0IHZhbGlkIHJvdyBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RWYWxpZFJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuX3Jvd3NJblBhZ2UgLSAxLCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIHJlY29yZCBsaW5lIHRvIGRpc3BsYXkgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcmVjb3JkSWR4MkRpc3BsYXlMaW5lKHJlY0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiByZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGRpc3BsYXkgbGluZSB0byByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBkaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgb2xkIGN1cnJlbnQgcm93IHVzaW5nIHRoZSBwYXJhbWV0ZXIgYW5kIGlnbm9yaW5nIGFueSBleGNlcHRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj50aGUgb2xkIGN1cnJlbnQgcm93IG51bWJlciB0byBiZSByZXN0b3JlZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZU9sZERpc3BsYXlMaW5lKGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2luUmVzdG9yZSA9IHRydWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luUmVzdG9yZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgcmVjb3JkIGZyb20gZ3VpIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BJbmRleEZyb21HVUkoKTogbnVtYmVyIHtcclxuICAgIGxldCB0b3BEaXNwbGF5TGluZTogbnVtYmVyID0gc3VwZXIuZ2V0VG9wSW5kZXhGcm9tR1VJKCk7XHJcblxyXG4gICAgaWYgKHN1cGVyLmhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgodG9wRGlzcGxheUxpbmUpKTtcclxuXHJcbiAgICByZXR1cm4gdG9wRGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgcmVjb3JkIHBvc2l0aW9uIGluIHRoZSBmb3JtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDdXJyUmVjUG9zSW5Gb3JtKCk6IG51bWJlciB7XHJcbiAgICAvLyB3aGVuIHRoZSBzZWxlY3RlZCByZWNvcmQgaXMgb3V0c2lkZSB0aGUgdmlldywgdG9wSW5kZXggYW5kIERpc3BsYXlMaW5lIHdpbGwgYmUgMFxyXG4gICAgLy8gcmVzdWx0aW5nIGluIGN1cnJSZWNQb3NJbkZvcm0gPT0gMVxyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuICAgIHJldHVybiB0aGlzLkRpc3BsYXlMaW5lIC0gdG9wRGlzcGxheUxpbmUgKyAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmVzIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZERpc3BsYXlMaW5lXCI+b2xkIGN1cnJlbnQgcmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJia3BSZWNvcmRcIj5zYXZlZCByZWNvcmQ8L3BhcmFtPlxyXG4gIGFzeW5jIHJlc3RvcmVCYWNrdXAob2xkRGlzcGxheUxpbmU6IG51bWJlciwgYmtwUmVjb3JkOiBSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFFDUiAjOTQyODc4LCBpZiByZWNvcmQgaXMgaW4gcHJvY2VzcyBvZiBpbnNlcnQsIGRlbGV0ZSBvciBtb2RpZnkgd2UgbXVzdCBwZXJmb3JtIHJlc3RvcmVPbGRDdXJyUm93XHJcbiAgICAvLyB0aGF0IHdpbGwgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IGFjdGlvbnMgZm9yIHRoZSByZWNvcmQsIG90aGVyd2lzZSB3ZSBjYW4ganVzdCByZXN0b3JlIGl0IGZyb20gYmFja3VwXHJcbiAgICBpZiAoYmtwUmVjb3JkLmdldElkKCkgPj0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0UmVjSWR4KGJrcFJlY29yZC5nZXRJZCgpKSA+PSAwICYmIG9sZERpc3BsYXlMaW5lID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPj0gMCAmJiBia3BSZWNvcmQuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZSkge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkucmVzdG9yZUN1cnJlbnQoYmtwUmVjb3JkKTtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gIH1cclxuXHJcbiAgQ29uc3RydWN0TWdDb250cm9sKCk6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHRhc2s6IFRhc2tCYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlO1xyXG4gIENvbnN0cnVjdE1nQ29udHJvbCh0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2xJZHg6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU/OiBNZ0NvbnRyb2xUeXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0/OiBhbnksIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHg/OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkNvbnN0cnVjdE1nQ29udHJvbF8wKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmICh0YXNrT3JQYXJlbnRNZ0Zvcm0gPT09IG51bGwgfHwgdGFza09yUGFyZW50TWdGb3JtIGluc3RhbmNlb2YgVGFza0Jhc2UpICYmIChwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4ID09PSBudWxsIHx8IHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHguY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzEodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkNvbnN0cnVjdE1nQ29udHJvbF8yKHR5cGUsIHRhc2tPclBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbnN0cnVjdHMgYW4gb2JqZWN0IG9mIE1nQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbnN0cnVjdE1nQ29udHJvbF8wKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBNZ0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzEodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBNZ0NvbnRyb2wodHlwZSwgdGFzaywgcGFyZW50Q29udHJvbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudE1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50Q29udHJvbElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbnN0cnVjdE1nQ29udHJvbF8yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCBwYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgdHJ1ZSBpZiBhbHJlYWR5IG1vdmVkIHRvIHRoZSBmaXJzdCBjb250cm9sIG9uIG9uZSBvZiB0aGUgTWdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE1HRGF0YSgpLkFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0YWJsZSBmaXJzdCB0aW1lIHdlIGVudGVyIHRoZSBvd25lclRhc2tcclxuICAvLy8gICBnZXQgcm93cyBudW1iZXIgZm9ybSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGZpcnN0VGFibGVSZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHN1cGVyLmZpcnN0VGFibGVSZWZyZXNoKCk7XHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBJbnNlcnRUYWJsZUl0ZW1zKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlJvd3MuSW5zZXJ0UmFuZ2UoaWR4LCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgICAgdGhpcy5JbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBzZXRUYWJsZUl0ZW1zQ291bnQocmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXI7XHJcblxyXG4gICAgLy8gRm9yIGFic29sdXRlIHNjcm9sbGJhciwgc2V0IHRoZSB2aXJ0dWFsIGl0ZW1zIGNvdW50IGFjY29yZGluZ2x5LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKSB7XHJcblxyXG4gICAgICAvLyBJZiB0YXNrIGlzIG1vdmVkIGludG8gQ1JFQVRFIG1vZGUgYW5kIGN1cnJlbnRseSBuZXcgbGluZSBpcyBjcmVhdGVkXHJcbiAgICAgIC8vIHRoZW4gb25seSBuZXdseSBjcmVhdGVkIHJlY29yZHMgc2hvdWxkIGJlIHNlZSBvbiB0aGUgc2NyZWVuXHJcbiAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50VmlldygwKTtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFRhYmxlIHdpdGggc2V0IG9mIHJlY29yZHMgT1IgaWYgZW1wdHkgdGFibGUgdGhlbiB0YWJsZUl0ZW1zQ291bnQgc2hvdWxkIG5vdCBiZSAwLCBhcyB3ZSBhbHdheXMgaGF2ZSAwdGggcm93LlxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9ICh0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSA/IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDogMTtcclxuICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCksIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMCgpOiB2b2lkIHtcclxuICAgIGxldCBkdlNpemU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgdGFibGUgY29udHJvbCBmb3IgdGhlIGZpcnN0IHRpbWUgd2hpbGUgY3JlYXRpbmcgdGhlIGZvcm0gd2l0aCB0b3RhbFJlY29yZHNDb3VudCBhbmQgYWxzb1xyXG4gICAgLy8gc2V0IHRoZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcsIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZmlyc3Qgcm93IGF0IHJlc3BlY3RpdmUgbG9jYXRpb24gaW4gY2FzZSBvZiBsb2NhdGUuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCBmYWxzZSk7XHJcbiAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGFibGUgY29udHJvbCdzIHJvd3MgdG8gJ3RhYmxlSXRlbXNDb3VudCcgY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2U2l6ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFibGVJdGVtc0NvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZW1vdmVBbGxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChyZW1vdmVBbGwpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLklzT25lV2F5S2V5KTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdXBlci5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0b3AgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldFRhYmxlVG9wSW5kZXgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICAgICAgLy8gdGFibGUgbm93IGJlaGF2ZXMgbGlrZSBsaXN0dmlldywgaXQgY2FuIG5vdCBzaG93IGVtcHR5IGxpbmVzXHJcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHVwZGF0ZSB0b3AgaW5kZXhcclxuICAgICAgICAgIGlmIChpbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgPiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkbyBzaG93IGVtcHR5IGxpbmVzIGlmIGluY2x1ZGVGaXJzdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGxlc3MgcmVjb3JkcyB0aGVuIHJvd3Mgb24gc2NyZWVuIFFDUiAjISEhISEhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIHRoaXMuX3Jvd3NJblBhZ2UsIDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoaW5kZXgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldykge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGluZGV4KTtcclxuICAgICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSB0aGlzLmdldEd1aVJvd2lkeChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIHRoZSB3aW5kb3cgZGVmaW5lZCBieSB0aGlzIGZvcm0gYW5kIGl0cyBjaGlsZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3JlYXRlRm9ybSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLmNyZWF0ZUZvcm0oKTtcclxuICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMuYWRkKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZXMgdGhlIHN0cmluZyBvciBzZXRzIHRoZSBpbWFnZSBvbiB0aGUgcGFuZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhbmVJZHhcIj5JbmRleCBvZiB0aGUgcGFuZSB0byBiZSB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJJbmZvXCI+TWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+U291bmQgYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4OiBudW1iZXIsIHN0ckluZm86IHN0cmluZywgc291bmRCZWVwOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgaW4gV2ViQ2xpZW50LlxyXG4gICAgLy8gaWYgKHBhbmVJZHggPT0gQ29uc3RhbnRzLlNCX01TR19QQU5FX0xBWUVSIHx8IEVudmlyb25tZW50Lkluc3RhbmNlLmdldFNwZWNpYWxTaG93U3RhdHVzQmFyUGFuZXMoKSlcclxuICAgIC8vICAgYmFzZS5VcGRhdGVTdGF0dXNCYXIocGFuZUlkeCwgc3RySW5mbywgc291bmRCZWVwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgcmVjb21wdXRlIHRhYmxlIGZvciB0aGF0IGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvdW5kVGFnTmFtZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURSkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gcmVjb21wdXRlIGZvcm1cIik7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuUmVjb21wdXRlRmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcIntcIiArIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiOiB0YXNrPVwiICsgdGhpcy5fdGFzayArIFwiLCBJZD1cIiArIHRoaXMuX3VzZXJTdGF0ZUlkICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGJ1aWxkIHRoZSBYTUwgZW50cnkgb2YgdGhlIGhpZGRlbiBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRIaWRkZW5Db250cm9sTGlzdFhNTCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHhtbDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdCAhPT0gbnVsbCAmJiB0aGlzLmhpZGRlbkNvbnRyb2xzSXNuc0xpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyB3cml0ZSB0aGUgaWRcclxuICAgICAgeG1sLkFwcGVuZChcIjxcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19ISURERU5fQ09OVE9MUyArIFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JU05TICsgXCI9XFxcIlwiKTtcclxuXHJcbiAgICAgIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5mb3JFYWNoKChjaGFuZ2U6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHhtbC5BcHBlbmQoY2hhbmdlICsgXCIsXCIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHhtbC5SZW1vdmUoeG1sLkxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgeG1sLkFwcGVuZChcIlxcXCIvPlwiKTtcclxuXHJcbiAgICAgIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCB0aGlzIGZvcm0gYmVoYXZlIGFzIE1vZGFsIGFsdGhvdWdoIGl0cyBXaW5kb3dUeXBlICE9IE1vZGFsP1xyXG4gIC8vLyBGb3IgUklBLCBOb24gSW50ZXJhY3RpdmUgdGFzaydzIGFuZCBpdHMgYWxsIGNoaWxkIHRhc2sgc2hvdWxkIGJlaGF2ZSBhcyBhIE1vZGFsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRCZWhhdmVBc01vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNob3VsZEJlTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjODAyNDk1LCBub24gaW50ZXJhY3RpdmUgdGFza3MgYW5kIGl0cyBjaGlsZHJlbiB3aWxsIGJlIG9wZW5lZCB1c2luZyBzaG93IGRpYWxvZyB0byBwcmV2ZW50IGV2ZW50cyBvbiB0aGVpciBhbmNlc3RvcnNcclxuICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmICF0aGlzLl90YXNrLmlzTWFpblByb2coKSlcclxuICAgICAgc2hvdWxkQmVNb2RhbCA9IFRhc2tCYXNlLlNob3VsZE5vbkludGVyYWN0aXZlQmVNb2RhbCgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrQmFzZSA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuUGFyZW50VGFzaztcclxuICAgICAgaWYgKHBhcmVudFRhc2sgIT09IG51bGwgJiYgIXBhcmVudFRhc2suSXNJbnRlcmFjdGl2ZSAmJiAhcGFyZW50VGFzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgc2hvdWxkQmVNb2RhbCA9IHBhcmVudFRhc2suU2hvdWxkTm9uSW50ZXJhY3RpdmVDaGlsZEJlTW9kYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkQmVNb2RhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgd2hldGhlciBhIHBhZ2luYXRlZCB0YWJsZSBiZWluZyB1c2VkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIHRhYmxlIGJlaW5nIHVzZWQgd2l0aCBhYnNvbHV0ZSBzY3JvbGxiYXIgdGh1bWIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyID0gKDxNZ0NvbnRyb2w+dGhpcy5fdGFibGVNZ0NvbnRyb2wpLklzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICByZXR1cm4gdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYnVpbGRGb3JtTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9ICB0aGlzLlVuaXF1ZU5hbWU7XHJcbiAgICBsZXQgdGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+dGhpcy5nZXRUYXNrKCk7XHJcblxyXG4gICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB3aGlsZSAodGFzay5Jc1N1YnRhc2spIHtcclxuICAgICAgdGFzayA9IDxUYXNrQmFzZT50YXNrLlN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICAgIG5hbWUgPSAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyAnXycgKyBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvLS9nLCBcIl9cIik7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpIDogVG8gZmV0Y2ggcHJldmlvdXMgY2h1bmsgb2YgcmVjb3JkcyBpZiBuZWVkZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUHJldkNodW5rRm9yQ3VycmVudFBhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjUG9zT25QYWdlOiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ICUgdGhpcy5fcm93c0luUGFnZTtcclxuXHJcbiAgICAgIC8vIElmIHJlY29yZCBpcyBub3QgdGhlIGZpcnN0IHJlY29yZCBvbiBwYWdlLCBmZXRjaCBwcmV2aW91cyByZWNvcmQgZm9yIHRoYXQgcGFnZS5cclxuICAgICAgLy8gVE9ETyA6IHRoaXMuRGlzcGxheUxpbmUgLSBDaGVjayB3aGV0aGVyIGNhbiBiZSByZW1vdmVkID9cclxuICAgICAgaWYgKHJlY1Bvc09uUGFnZSA+IDAgJiYgdGhpcy5EaXNwbGF5TGluZSA9PT0gMCkge1xyXG4gICAgICAgIGxldCBsYXN0Rm9jdXNlZFZhbDogTGFzdEZvY3VzZWRWYWwgPSB7Z3VpTWdDb250cm9sOiB0aGlzLmdldFRhYmxlQ3RybCgpLCBMaW5lOiByZWNQb3NPblBhZ2UsIFZhbDogXCJcIn07XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKC1yZWNQb3NPblBhZ2UsIGZhbHNlLCBsYXN0Rm9jdXNlZFZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEd1aVJvd2lkeChkdlJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkdlJvd0lkeCArIHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXREdlJvd0lkeChndWlSb3dJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZ3VpUm93SWR4IC0gdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcbn1cclxuIl19
|
|
1292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFFWCxxQkFBcUIsRUFBRSxjQUFjLEVBRXJDLE9BQU8sRUFFUCxVQUFVLEVBRVYsYUFBYSxFQUVkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGFBQWEsRUFDYixJQUFJLEVBQ0osUUFBUSxFQUNSLFlBQVksRUFFYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BGLE9BQU8sRUFBWSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNekMsTUFB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LFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7aUJBQzdEO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFFRCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBaUI7UUFDM0IsT0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2pFLENBQUM7O0FBNXhEYyxpQkFBVSxHQUFXLEVBQUUsQ0FBQztBQVloQyxvQkFBYSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIENvbnRyb2xUYWJsZSxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsIEd1aUVudmlyb25tZW50LFxyXG4gIExhc3RGb2N1c2VkVmFsLFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUm93XHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFByaW9yaXR5LFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4vTWdDb250cm9sJztcclxuaW1wb3J0IHsgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbiB9IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7IERhdGFWaWV3LCBTRVRfRElTUExBWUxJTkVfQllfRFYgfSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQgeyBUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tICcuLi9yZW1vdGUvU2VydmVyRXJyb3InO1xyXG5pbXBvcnQgeyBDb25zdEludGVyZmFjZSB9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTGFzdEZvY3VzZWRNYW5hZ2VyIH0gZnJvbSAnLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHsgQ3JlYXRlZEZvcm1WZWN0b3IgfSBmcm9tICcuL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICd1dGlsJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZvcm0+Li4uPC9mb3JtPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgTWdGb3JtIGV4dGVuZHMgTWdGb3JtQmFzZSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVElNRV9MSU1JVDogbnVtYmVyID0gNTA7IC8vIHRpbWUgbGltaXQgZm9yIG9uZSB0cmFuc2ZlciBvcGVyYXRpb24gKGluIG1pbGxpIHNlY29uZHMpXHJcbiAgSXNNb3ZpbmdJblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcmV2RGlzcGxheUxpbmU6IG51bWJlciA9IDA7IC8vIGRpc3BsYXkgaWRlbnRpZmllciBvZiBwcmV2IGxpbmVcclxuICBSZWZyZXNoQWxsUm93czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBJZ25vcmVGaXJzdFJlY29yZEN5Y2xlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTW92ZWRUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIHdoZW4gbW92ZSB0byBmaXJzdCBjb250cm9sIHNob3VsZCBiZSBleGVjdXRlZCBvbiB0aGUgZm9ybVxyXG5cclxuICBwcml2YXRlIF9zdWZmaXhEb25lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaGlkZGVuQ29udHJvbHNJc25zTGlzdDogTGlzdDxudW1iZXI+ID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIF9jcmVhdGVkRm9ybXM6IENyZWF0ZWRGb3JtVmVjdG9yID0gbmV3IENyZWF0ZWRGb3JtVmVjdG9yKCk7XHJcblxyXG4gIC8vVE9ETzogTWF5YmUgdGhlIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIGxpa2UgYWxsb3dGaWVsZENvbXB1dGVcclxuICBwcml2YXRlIF90cmFuc2ZlcnJpbmdEYXRhVG9HVUk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBpc0ZldGNoaW5nUmVjb3Jkc0FoZWFkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXQgQ3JlYXRlZEZvcm1zKCk6IENyZWF0ZWRGb3JtVmVjdG9yIHtcclxuICAgIHJldHVybiBNZ0Zvcm0uX2NyZWF0ZWRGb3JtcztcclxuICB9XHJcblxyXG4gIGdldCBJblJlc3RvcmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5SZXN0b3JlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyYW5zZmVycmluZ0RhdGFUb0dVSSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvdWxkRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgbGV0IHByb3AgPSB0aGlzLl90YWJsZU1nQ29udHJvbC5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEKTtcclxuXHJcbiAgICAgIHJldHVybiAocHJvcCAhPSBudWxsID8gcHJvcC5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpIDogZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIHRhc2sgZGF0YXZpZXcsIGlmIHRoZSB0YXNrIGV4aXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dGhlIHRhc2sgZGF0YXZpZXc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXREYXRhdmlldygpOiBEYXRhVmlldyB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fdGFzayAhPSBudWxsKVxyXG4gICAgICBkdiA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG5cclxuICAgIHJldHVybiAoZHYpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbW92ZUluVmlldyh1bml0OiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nLCByZXR1cm5Ub0N0cmw/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQocmV0dXJuVG9DdHJsKSlcclxuICAgICAgYXdhaXQgdGhpcy5tb3ZlSW5WaWV3XzAodW5pdCwgZGlyZWN0aW9uKTtcclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5tb3ZlSW5WaWV3XzEodW5pdCwgZGlyZWN0aW9uLCByZXR1cm5Ub0N0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmUgb25lIHBhZ2Uvcm93IHVwL2Rvd24gb3IgdG8gdGhlIGJlZ2lubmluZy9lbmQgb2YgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidW5pdFwiPnRvIG1vdmUgaW50bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJEaXJlY3Rpb25cIj5vZiBtb3Zpbmc8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgbW92ZUluVmlld18wKHVuaXQ6IHN0cmluZywgZGlyZWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubW92ZUluVmlldyh1bml0LCBkaXJlY3Rpb24sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmUgb25lIHBhZ2Uvcm93IHVwL2Rvd24gb3IgdG8gdGhlIGJlZ2lubmluZy9lbmQgb2YgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidW5pdFwiPnRvIG1vdmUgaW50bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJEaXJlY3Rpb25cIj5vZiBtb3Zpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV0dXJuVG9DdHJsXCI+c2hvdWxkIHRoZSBjdXJzb3IgcmV0dXJuIHRvIHRoZSBsYXN0IHBhcmtlZCBjb250cm9sPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG1vdmVJblZpZXdfMSh1bml0OiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nLCByZXR1cm5Ub0N0cmw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpO1xyXG4gICAgbGV0IG9sZFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBsZXQgcmV0dXJuVG9WaXNpYmxlTGluZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlY29yZE91dE9mVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHZpc2libGVMaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuSXNNb3ZpbmdJblZpZXcgPSB0cnVlO1xyXG4gICAgICBsZXQgb2xkRGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuRGlzcGxheUxpbmU7XHJcblxyXG4gICAgICAvLyB0YWJsZSBtb3ZlbWVudHMgKGZpcnN0IC8gbGFzdCByZWNvcmQpXHJcbiAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIEJFR0lOSU5HIE9GIFRBQkxFXHJcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfRklSU1RfUkVDT1JELCB0cnVlLCBmYWxzZSwgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHRhYmxlIGluIHRoZSBmb3JtXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSgwLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBFTkQgT0YgVEFCTEVcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KENvbnN0YW50cy5NR19EQVRBVklFV19MQVNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlICsgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA+PSAwKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBwYWdlIGFuZCByb3cgbW92ZW1lbnRzXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0VG9wSW5kZXhGcm9tR1VJKCk7XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcmVjb3JkcyB0byBza2lwXHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlcjtcclxuICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmIHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xyXG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTjpcclxuICAgICAgICAgICAgICBzaXplID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EOlxyXG5cclxuICAgICAgICAgICAgICBsZXQgbGFzdDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5fcm93c0luUGFnZSAtIDE7XHJcbiAgICAgICAgICAgICAgbGFzdCA9IE1hdGgubWluKGxhc3QsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxKTtcclxuICAgICAgICAgICAgICBzaXplID0gbGFzdCAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgcmV0dXJuVG9WaXNpYmxlTGluZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuX3Jvd3NJblBhZ2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHNpemUgPSAxO1xyXG5cclxuICAgICAgICBzaXplID0gKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgfHxcclxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOXHJcbiAgICAgICAgICA/IC1zaXplXHJcbiAgICAgICAgICA6IHNpemUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgIHZpc2libGVMaW5lID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lIDwgMCkge1xyXG4gICAgICAgICAgICB2aXNpYmxlTGluZSA9IDA7XHJcbiAgICAgICAgICAgIHJlY29yZE91dE9mVmlldyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuX3Jvd3NJblBhZ2U7XHJcbiAgICAgICAgICAgIHJlY29yZE91dE9mVmlldyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBzY3JvbGxpbmcgdGhlIHRhYmxlIG9uZSBwYWdlIG9yIG9uZSByb3cgdXAgb3IgZG93blxyXG4gICAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCB8fFxyXG4gICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpIHx8XHJcbiAgICAgICAgICAgIHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmXHJcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUICYmIHZpc2libGVMaW5lID09PSB0aGlzLl9yb3dzSW5QYWdlIC0gMSB8fFxyXG4gICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgJiYgdmlzaWJsZUxpbmUgPT09IDApKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIHByZXZpb3VzIHJvdyBidXQgd2UgYXJlIGF0IHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlIGFuZCBkYXRhIHZpZXdcclxuICAgICAgICAgICAgLy8gdGhlbiBkbyBub3RoaW5nXHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmXHJcbiAgICAgICAgICAgICAgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XIHx8IHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSkgJiZcclxuICAgICAgICAgICAgICB2aXNpYmxlTGluZSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpID09PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgd2UgbW92ZSB0byB0aGUgbmV4dCByb3cgYnV0IHdlIGFyZSBhdCB0aGUgbGFzdCByb3cgb2YgdGhlIHRhYmxlIGFuZCB0aGUgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgICB2aXNpYmxlTGluZSA9PT0gdGhpcy5nZXRMYXN0VmFsaWRSb3coKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpID09PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgb2xkUmVjSWQgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBzaXplKTtcclxuICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnNldFRvcFJlY0lkeE1vZGlmaWVkKHRydWUpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3N1ZmZpeERvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICsgc2l6ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSgwLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTk1NDk2OiB3aGVuIHRoZSByZWNvcmQgc3VmZml4IGZhaWxlZCBnbyBiYWNrIHRvIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgcm93XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodW5pdCAhPT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0cyh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTkyMTAxOiBpZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQgaXQgbWVhbnMgdGhhdCB0aGUgcmVjIHN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAvLyB3YXNuJ3QgZXhlY3V0ZWQgc28gd2UgbXVzdCBoYW5kbGUgaXQgYmVmb3JlIHdlIGdvIHRvIGEgbmV3IHJvd1xyXG4gICAgICAgICAgICAgICAgICBsZXQgbmV3UmVjSWQ6IG51bWJlciA9ICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAobmV3UmVjSWQgPT09IG9sZFJlY0lkICYmICF0aGlzLl9zdWZmaXhEb25lKVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgNzU4NjM5XHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB0aGlzLmdldExhc3RWYWxpZFJvdygpLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJiBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbW92aW5nIHRoZSBtYXJraW5nIG9uZSByb3cgdXAgb3IgZG93blxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgb2xkVGFza01vZGUgPSB0aGlzLl90YXNrLmdldE1vZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgb2xkUmVjSWQgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lICsgc2l6ZSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIHdhcyBkZWxldGVkIGluIFJ1biBUaW1lIGJ5IEZvcmNlIERlbGV0ZSBmb3IgZXhhbXBsZVxyXG4gICAgICAgICAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDAgfHwgb2xkVGFza01vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPT0gLTEgfHwgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0cyhvbGREaXNwbGF5TGluZSkpXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjMjkzNjY4XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwic2tpcHBlZCBzZXRjdXJyUm93IGZvciByb3cgezB9XCIsIG9sZERpc3BsYXlMaW5lKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiBpZiBldmVyeXRoaW5nIGlzIE9LLCBjdXJyIHJlYyB3aWxsIGxhdGVyIGJlIHJlZnJlc2hlZCBpblxyXG4gICAgICAgICAgICAgICAgLy8gUkVDX1BSRUZJWFxyXG4gICAgICAgICAgICAgICAgLy8gdGh1cywgcmVmcmVzaCBvbmx5IGluIGNhc2Ugb2YgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGVycm9yIGlzIGJlY2F1c2UgdGhlIG9sZC1yZWMgd2FzIHJlbW92ZWQgKGNhbmNlbEVkaXQnZWQpLCBzbyByZWZyZXNoIGZvcm0uXHJcbiAgICAgICAgICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjNzc1MzA5OiBpZiBsZWF2aW5nIHRoZSBuZXcgY3JlYXRlZCByZWNvcmQgZmFpbGVkIHRoZW4gcmVzdG9yZVxyXG4gICAgICAgICAgICAgICAgICAvLyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGEgbmV3IHJlY29yZCBzbyB0aGUgbmV4dCBhY3Rpb24gd291bGRcclxuICAgICAgICAgICAgICAgICAgLy8gXCJrbm93XCIgdGhhdCBpdCBpcyBzdGlsbCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICAgIC8vIERlZmVjdCAjIDgxNjI3IDogSWYgdGFzayBpcyBoYXZpbmcgYSBzdWJmb3JtLCB0aGVuIHdoaWxlIG1vdmluZyB0byBzdWJmb3JtLCBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAvLyBpcyBzeW5jZWQgYW5kIGl0IGlzIGluc2VydGVkIGluIF9tb2RpZmllZFRhYiBhcyAnaW5zZXJ0JyByZWNvcmQuIFNvLCBhbnkgcmVxdWVzdCB0byBzZXJ2ZXIgaW5zZXJ0c1xyXG4gICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdG8gc2VydmVyLiBFdmVuIGlmIHdlIGRvbnQgZ28gdG8gc2VydmVyLCBpdCBpcyB0aGVyZSBpbiBfbW9kaWZpZWRUYWIgYXMgbmV3IHJlY29yZC4gSW5zZXJ0aW5nXHJcbiAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYWxyZWFkeSBzeW5jZWQgcmVjb3JkIGNhdXNlcyBpbnNlcnRpb24gb2YgcmVjb3JkIHR3aWNlLiBTbywgSWYgY3VycmVudCByZWNvcmQgaXMgbm90IHN5bmNlZCB0aGVuIG9ubHkgaW5zZXJ0LlxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyUmVjLlN5bmNlZCAmJiBvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM5ODA1Mjg6IFJlZnJlc2ggdGhlIGN1cnJlbnQgcm93IGFmdGVyIGNhbmNlbCBlZGl0IHRvIHJlZmxlY3RcclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3RvcmVkIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgb2xkRGlzcGxheUxpbmUgPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDAgfHwgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKSlcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZCBidWcgIzo5NDE3NjMsIHdoaWxlIGNyZWF0ZSBpc24ndCBhbGxvd2VkIG5lZWQgdG8gZG8gc3VmZml4IGFuZCBwcmVmaXggb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZmRvUmVjb3JkU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShkb1JlY29yZFN1ZmZpeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Eb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCg8VGFza0Jhc2U+dGhpcy5fdGFzaywgcmVmZG9SZWNvcmRTdWZmaXgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Eb1Rhc2tMZXZlbFJlY29yZFByZWZpeCh0aGlzLl90YXNrLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGRvUmVjb3JkU3VmZml4ID0gcmVmZG9SZWNvcmRTdWZmaXgudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHRoZSBmb3JtIGRvZXMgbm90IGhhdmUgYSB0YWJsZSwgbW92ZSB0byBvbmUgcm93IGluIHRoZSBjaG9zZW4gRGlyZWN0aW9uXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgKyBzaXplLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuYWJvcnQoKTtcclxuICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Qcm9jZXNzQWJvcnRpbmdFcnJvcihleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJldHVyblRvVmlzaWJsZUxpbmUpIHtcclxuICAgICAgICBpZiAocmVjb3JkT3V0T2ZWaWV3KSB7XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPT09IDApXHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuX3Jvd3NJblBhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHZpc2libGVMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG4gICAgICBpZiAocmV0dXJuVG9DdHJsKSB7XHJcbiAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGN1cnNvck1vdmVkOiBib29sZWFuID0gYXdhaXQgbGFzdFBhcmtlZEN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICBpZiAoIWN1cnNvck1vdmVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGhpcy5fdGFzayk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhlLk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93KCk7XHJcbiAgICAgIHRoaXMuSXNNb3ZpbmdJblZpZXcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgcmVjb3JkIHRvIHRoZSBmb3JtIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYWRkUmVjKGRvU3VmZml4OiBib29sZWFuLCBwYXJlbnRMaW5lOiBudW1iZXIsIHByZXZMaW5lOiBudW1iZXIsIGlzQ3JlbGluZUFib3ZlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbmV3TGluZTogbnVtYmVyID0gMTtcclxuICAgIGxldCBjdXJyTGluZTogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgaWYgKCF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBjdXJyTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuXHJcbiAgICAvLyBJbmNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBhZGRlZCBpbnRvIHRoZSB2aWV3LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgKz0gMTtcclxuICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld1JlY0lkeDogbnVtYmVyID0gYXdhaXQgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLmFkZFJlY29yZChkb1N1ZmZpeCwgZmFsc2UsIGlzQ3JlbGluZUFib3ZlKTtcclxuXHJcbiAgICBpZiAobmV3UmVjSWR4ID4gLTEpIHtcclxuICAgICAgLy8gZm9ybXMgd2l0aCBhIHRhYmxlXHJcbiAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIC8vIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSB0YWJsZSBzbyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyXHJcbiAgICAgICAgLy8gc2V0dGluZyB0aGUgdG9wIHJlY29yZCB0byAwIGFuZCB0aGUgY3VycmVudCByb3cgdG8gMFxyXG4gICAgICAgIGxldCBuZXdDdXJyUm93OiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDAgfHwgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgY3Vyc29yIGlzIHBhcmtpbmcgb24gdGhlIGxhc3Qgcm93IG9mIHRoZSBkaXNwbGF5ZWQgdGFibGUgc28gdGhlXHJcbiAgICAgICAgLy8gbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyIGluY3JlbWVudGluZyB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gICAgICAgIGVsc2UgaWYgKGN1cnJMaW5lID09PSB0aGlzLl9yb3dzSW5QYWdlIC0gMSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyAxKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBuZXcgcm93IGlzIGNyZWF0ZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgdG9wIHJlY29yZFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoaXNDcmVsaW5lQWJvdmUpXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSA+IDAgPyBjdXJyTGluZSA6IDA7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbmV3TGluZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIG5ld0N1cnJSb3c7XHJcblxyXG4gICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93KTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gc2hvdWxkIHJlYWxseSBiZSBjYXVnaHQgaGVyZVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcImluIEZvcm0uYWRkUmVjKCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCAtPSAxO1xyXG4gICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZGVsZXRlIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZGVsQ3VyclJlYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0b3BUYWJsZVJvdzogYm9vbGVhbiA9IHN1cGVyLmlzTGluZU1vZGUoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnJlbW92ZUN1cnJSZWMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICBpZiAodGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYWRkUmVjKGZhbHNlLCAwLCAwLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpIHtcclxuICAgICAgICAgIC8vIGNoYW5nZSB0byBjcmVhdGUgbW9kZVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuXHJcbiAgICAgICAgICAvLyBNR19BQ1RfQ1JFTElORSBtYXkgYmUgZGlzYWJsZWQgLmkuZS4gUFJPUF9UWVBFX0FMTE9XX0NSRUFURSBleHByZXNzaW9uIGNhbiBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBleGl0IGZyb20gdGhlIG93bmVyVGFza1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGUgZW1wdGluZXNzIG9mIHRoZSBEViBtdXN0IGJlIGNoZWNrZWQgYWdhaW4gYmVjYXVzZSB0aGUgXCJjcmVhdGUgbGluZVwiIG1heSBmYWlsXHJcbiAgICBpZiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkpIHtcclxuICAgICAgaWYgKHRvcFRhYmxlUm93KVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcblxyXG4gICAgICBpZiAoc3VwZXIuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudC0tO1xyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCB0cnVlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYW5jZWwgdGhlIGVkaXRpbmcgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCByZXN0b3JlIHRoZSBvbGQgdmFsdWVzIG9mIHRoZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDYW5jZWxcIj50cnVlIGlmIGNhbGxlZCBmb3IgQUNUX0NBTkNFTCwgZmFsc2Ugb3RoZXJ3aXNlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdEV2ZW50XCI+PC9wYXJhbT5cclxuICBhc3luYyBjYW5jZWxFZGl0KGlzQWN0Q2FuY2VsOiBib29sZWFuLCBpc1F1aXRFdmVudDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1vZGU6IHN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IG5ld01vZGU6IHN0cmluZztcclxuICAgIGxldCByb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhlY1JlY1ByZWZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFdlIHJldHVybiB0byBjcmVhdGUgbW9kZSBvbmx5IGlmIHRoZXJlIGlzIG5vIHJlY29yZCB0byBnbyB0byBhZnRlciB0aGUgY2FuY2VsIGFjdGlvblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDEgJiYgbW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIGVsc2VcclxuICAgICAgbmV3TW9kZSA9IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgLy8gOTk3MDczICYgOTMxMDIxLlxyXG4gICAgLy8gRXhwZWN0ZWQgYmVoYXZpb3IgZHVyaW5nIGNhbmNlbCBldmVudCwgZm9yIGEgbmV3IHJlY29yZDpcclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBub3QgY3JlYXRlLCBkZWxldGUgdGhlIG5ldyByZWNvcmQgYW5kIGdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBjcmVhdGUsIHN0YXkgb24gdGhlIG5ldyByZWNvcmQuXHJcblxyXG4gICAgLy8gZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgdW5kZXIgc29tZSBjb25kaXRpb24uXHJcbiAgICAvLyBTbywgaW4gY2FzZSBvZiBvcmdUYXNrTW9kZT1DLCBzaW5jZSB3ZSB3YW50IHRvIHN0YXkgb24gdGhlIG5ldyByZWNvcmQsIHdlIG5lZWQgdG8gcmUtY3JlYXRlIGEgcmVjb3JkLlxyXG5cclxuICAgIC8vIEJ1dCBhcyBzYWlkLCBkdi5jYW5jZWxFZGl0KCkgcmVtb3ZlcyB0aGUgbmV3IHJlY29yZCBPTkxZIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gVGhlIGNvbmRpdGlvbiBpcyBhcyBmb2xsb3dzOlxyXG4gICAgLy8gVGhlIHJlY29yZCBpcyByZW1vdmVkIG9ubHkgaWYgdGhlIGR2IHNpemUgaXMgZ3JlYXRlciB0aGFuIDEuIFNvLCBpZiB0aGUgZHYgc2l6ZSBpcyAxLCBkdi5jYW5jZWxFZGl0KClcclxuICAgIC8vIGRvZXMgbm90IHJlbW92ZSB0aGUgcmVjb3JkIGFuZCBoZW5jZSBpbiB0aGlzIGNhc2UsIGZvcm0uY2FuY2VsRWRpdCgpIHNob3VsZCBub3QgY3JlYXRlIGEgbmV3IHJlY29yZC5cclxuICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgdGhlIHNpZ25hdHVyZSBvZiBkdi5jYW5jZWxFZGl0KCkgaXMgY2hhbmdlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIHJlbW92ZWQgb3Igbm90LlxyXG5cclxuICAgIC8vIFRoaXMgaXMgb25lIHBhcnQuXHJcblxyXG4gICAgLy8gTm93LCBhZnRlciBjYW5jZWxFZGl0LCBSUCBoYXMgdG8gYmUgZXhlY3V0ZWQuIFRoaXMgd2FzIGRvbmUgaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCktPmNhc2UgTUdfQUNUX0NBTkNFTC5cclxuICAgIC8vIEJ1dCB3aGF0IGhhcHBlbnMgaXMsIGlmIGZvcm0uY2FuY2VsRWRpdCgpIGNyZWF0ZWQgYSBuZXcgbGluZSwgUlAgd2FzIGFscmVhZHkgZXhlY3V0ZWQgZnJvbSB0aGVyZS4gQW5kIGZyb21cclxuICAgIC8vIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLCBSUCBpcyBleGVjdXRlZCBmb3IgdGhlIHNlY29uZCB0aW1lLlxyXG4gICAgLy8gU28sIG1vdmVkIHRoZSBjb2RlIG9mIGV4ZWN1dGluZyBSUCBmcm9tIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwgdG8gZm9ybS5jYW5jZWxFZGl0KClcclxuICAgIC8vIGFuZCB0aGF0IHdpbGwgYmUgZG9uZSBvbmx5IGlmIHRoZSBjcmVhdGUgbGluZSB3YXMgbm90IGV4ZWN1dGVkLlxyXG5cclxuICAgIC8vIE5vdywgd2UgaGF2ZSBvbmUgbW9yZSBpc3N1ZS5cclxuXHJcbiAgICAvLyBVbnRpbCBub3csIHRoZSBSUCB3YXMgZXhlY3V0ZWQgYWZ0ZXIgZm9ybS5jYW5jZWxFZGl0KCkuXHJcbiAgICAvLyBTbywgd2hlbiB0aGUgY29kZSBpcyBtb3ZlZCB0byBmb3JtLmNhbmNlbEVkaXQoKSwgaXQgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgbGV0IHJlY1JlbW92ZWQ6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgdGhpcy5HZXREYXRhdmlldygpLnNldFByZXZDdXJyUmVjKG51bGwpO1xyXG4gICAgaWYgKCh0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpIHx8ICgoaXNBY3RDYW5jZWwgJiYgcmVjUmVtb3ZlZCkgJiYgKCFHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSkmJig8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIC8vIFNldCBDYW5jZWwgaW5kaWNhdGlvbiBvbiB0aGUgdGFzayBmb3IgdG8gbm90IHBlcmZvcm0gY29udHJvbCB2YWx1ZSB2YWxpZGF0aW9uIGluIHRoZSBDcmVhdGUgbGluZSBhY3Rpb24uXHJcbiAgICAgIGxldCBvcmdDYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChpc0FjdENhbmNlbCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0Q2FuY2VsV2FzUmFpc2VkKG9yZ0NhbmNlbFdhc1JhaXNlZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc0FjdENhbmNlbClcclxuICAgICAgZXhlY1JlY1ByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgcm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgICAgICBpZiAocm93IDwgMCB8fCByb3cgPj0gdGhpcy5fcm93c0luUGFnZSkge1xyXG4gICAgICAgICAgICAgIGxldCB0b3BSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBpZiAodG9wUmVjSWR4ID4gY3VyclJlY0lkeClcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICAgICAgICAgICAgcm93ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHJvdywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmUuXHJcbiAgICAgICAgICAgIGlmIChyb3cgIT09IDApXHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSB7MH1cIiwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgcmVjUmVtb3ZlZClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50LS07XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiaW4gRm9ybS5jYW5jZWxFZGl0KCkgZXJyb3IgaW4gU2NyZWVuIG1vZGUgZm9yIEN1cnJlbnQgUmVjb3JkXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKG5ld01vZGUpO1xyXG4gICAgICBpZiAoISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAgIGlmICghKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXhlY1JlY1ByZWZpeCkge1xyXG4gICAgICAvLyBRQ1IgIzkyNTY0NiwgIzQ1NDE2NzogZXhpdCB0byB0aGUgb3duZXJUYXNrIGxldmVsIGluIG9yZGVyIHRvIHNraXAgY29udHJvbCBzdWZmaXhcclxuICAgICAgLy8gYW5kIHJlY29yZCBzdWZmaXggb2YgdGhlIGNhbmNlbGVkIG5ldyByZWNvcmQgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZVxyXG4gICAgICAvLyBuZXh0IHJlY29yZCBwZXJmaXggd291bGQgYmUgZXhlY3V0ZWRcclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgb3duZXJUYXNrIHdoaWxlIGZvY3VzZWQgb24gc3ViZm9ybS9vd25lclRhc2suIFdlIGRvIG5vdCB3YW50IHRoZSBjdHJsIG9uIHRoZSBzdWJmb3JtIHRvIGRvIGN0cmwgc3VmZml4LlxyXG4gICAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCg8VGFza0Jhc2U+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkucGF0aENvbnRhaW5zKDxUYXNrQmFzZT50aGlzLl90YXNrKSlcclxuICAgICAgICAgIGZvciAobGV0IHBhcmVudCA9IDxUYXNrQmFzZT5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICAgICAgICAgICBwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50ICE9PSB0aGlzLl90YXNrO1xyXG4gICAgICAgICAgICAgICBwYXJlbnQgPSA8VGFza0Jhc2U+cGFyZW50LmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgKCg8RGF0YVZpZXc+cGFyZW50LkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLnJlc2V0TW9kaWZpZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNRdWl0RXZlbnQpIHtcclxuICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBmb2xsb3dpbmcgMiBsaW5lcyBjYW4gYmUgbWVyZ2VkIGluIG9uZSBtZXRob2RcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UodGhpcy5fdGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzY2FuIGFsbCBjb250cm9scyBpbiB0aGUgZm9ybS4gRXZlcnkgY29udHJvbCB3aGljaCBoYXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGFuIGV4cHJlc3Npb24gd2lsbCBiZVxyXG4gIC8vLyAgIHJlZnJlc2hlZC4gVGhpcyBpcyBkb25lIHRvIGVuc3VyZSB0aGUgY29udHJvbCdzIGRpc3BsYXkgaXMgc3luY2hlZCB3aXRoIHRoZSBleHByZXNzaW4ncyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaE9uRXhwcmVzc2lvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9ICgodGhpcy5DdHJsVGFiLmdldEN0cmwoaSkgaW5zdGFuY2VvZiBNZ0NvbnRyb2wpID8gPE1nQ29udHJvbD50aGlzLkN0cmxUYWIuZ2V0Q3RybChpKSA6IG51bGwpO1xyXG5cclxuICAgICAgaWYgKG1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbC5yZWZyZXNoT25FeHByZXNzaW9uKCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gcmVmcmVzaCB0aGUgZm9ybSBwcm9wZXJ0aWVzXHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoUHJvcHNPbkV4cHJlc3Npb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgY29udHJvbHMgb2YgdGhpcyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWZzVG9DdHJscygpOiB2b2lkIHtcclxuICAgIC8vIGlmIGxhc3QgZm9jdXNlZCBjb250cm9sIHdhcyBmcm9tIHRoaXMgdGFzayAtIHplcm8gaXQuXHJcbiAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsICYmIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkgPT09IHRoaXMpXHJcbiAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIG51bGwpO1xyXG5cclxuICAgIHN1cGVyLnJlbW92ZVJlZnNUb0N0cmxzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBjb250cm9sIHdpdGggYSBnaXZlbiBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0Q3RybEJ5Q3RybE5hbWUoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gPE1nQ29udHJvbD50aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBzdWJmb3JtIGNvbnRyb2wgd2l0aCB0aGUgdHlwZWQgbmFtZSBmcm9tIGFsbCBwYXJlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+IHRoZSByZXF1ZXN0ZWQgc3ViZm9ybSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldFN1YkZvcm1DdHJsQnlOYW1lKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGd1aVBhcmVudFRhc2s6IFRhc2tCYXNlO1xyXG4gICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGZvciAoZ3VpUGFyZW50VGFzayA9IDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG4gICAgICAgICBkZXN0U3ViRm9ybSA9PT0gbnVsbCAmJiBndWlQYXJlbnRUYXNrICE9PSBudWxsICYmIGd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpICE9PSBudWxsO1xyXG4gICAgICAgICBndWlQYXJlbnRUYXNrID0gZ3VpUGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBkZXN0U3ViRm9ybSA9IDxNZ0NvbnRyb2w+Z3VpUGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgIGlmIChkZXN0U3ViRm9ybSA9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFndWlQYXJlbnRUYXNrLklzU3ViRm9ybSB8fCBOU3RyaW5nLkVxdWFscyhndWlQYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpLk5hbWUsIGN0cmxOYW1lLCB0cnVlKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlc3RTdWJGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgc3VmZml4RG9uZSBwYXJhbWV0ZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U3VmZml4RG9uZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1ZmZpeERvbmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVzdGluYXRpb25Sb3coKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0VGJsUm93O1xyXG4gIH1cclxuXHJcbiAgc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3N1YkZvcm1DdHJsID09PSBudWxsICYmIHN1YkZvcm1DdHJsICE9PSBudWxsKTtcclxuICAgIHRoaXMuX3N1YkZvcm1DdHJsID0gc3ViRm9ybUN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHN1YmZvcm0gY29udHJvbCB0aGF0IHBvaW50cyB0byBhIHRhc2sgd2hvc2UgaWQgaXMgZ2l2ZW4gaW4gdGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPnRoZSBpZCBvZiByZXF1ZXN0ZWQgc3ViZm9ybSBvd25lclRhc2s8L3BhcmFtPlxyXG4gIGdldFN1YkZvcm1DdHJsRm9yVGFzayh0YXNrSWQ6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VycjogTWdDb250cm9sID0gbnVsbDtcclxuICAgIGxldCBwYXJlbnRDdHJsVGFiOiBDb250cm9sVGFibGU7XHJcbiAgICBsZXQgZ3VpUGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgICBsZXQgZGVzdFN1YkZvcm06IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChndWlQYXJlbnRGb3JtID0gdGhpczsgZ3VpUGFyZW50Rm9ybSAhPSBudWxsOyBndWlQYXJlbnRGb3JtID0gZ3VpUGFyZW50Rm9ybS5QYXJlbnRGb3JtKSB7XHJcbiAgICAgIHBhcmVudEN0cmxUYWIgPSBndWlQYXJlbnRGb3JtLkN0cmxUYWI7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXJlbnRDdHJsVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgY3VyciA9ICgocGFyZW50Q3RybFRhYi5nZXRDdHJsKGkpIGluc3RhbmNlb2YgTWdDb250cm9sKSA/IDxNZ0NvbnRyb2w+cGFyZW50Q3RybFRhYi5nZXRDdHJsKGkpIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKGN1cnIgIT0gbnVsbCAmJiBjdXJyLmlzU3ViZm9ybSgpICYmIChjdXJyLmdldFN1YmZvcm1UYXNrSWQoKSAhPSBudWxsKSlcclxuICAgICAgICAgIGlmIChjdXJyLmdldFN1YmZvcm1UYXNrSWQoKSA9PT0gdGFza0lkKSB7XHJcbiAgICAgICAgICAgIGRlc3RTdWJGb3JtID0gY3VycjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkZXN0U3ViRm9ybSAhPSBudWxsKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlc3RTdWJGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY3JlYXRlIHJlY29yZHMgYmV0d2VlbiBpZHggYW5kIGVuZCBvZiBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHJlbW92ZVJlY29yZHNBZnRlcklkeChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlbW92ZUFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGluIHNvbWUgY2FzZXMgaW52aXNpYmxlIC0xIHJvdyAodGhhdCBleGlzdCBvbmx5IGZvciBzY3JvbGxiYXIgZWZmZWN0cykgYmVjb21lcyB2aXNpYmxlLlxyXG4gICAgLy8gVG8gcHJldmVudCB0aGlzIHdlJ2xsIHJlbW92ZSBhbGwgcmVjb3Jkcy4gVGhpcyB3aWxsIG5vdCBjYXVzZSBwZXJmcm9tYW5jZSBwcm9ibGVtcyBzaW5jZVxyXG4gICAgLy8gd2Ugd2lsbCBhZGQgbWF4aW11bSByb3dJblBhZ2UgcmVjb3JkcyBtb3JlIHRoZW4gd2UgaW50ZW5kZWQgaW4gdGhlIGJlZ2luaW5nXHJcblxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpXHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoaWR4IDw9IHRoaXMuX3Jvd3NJblBhZ2UgKyAxICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlKVxyXG4gICAgICAgIGlkeCA9IDA7XHJcbiAgICAgIGlmIChpZHggPT09IDApXHJcbiAgICAgICAgcmVtb3ZlQWxsID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KGlkeCwgcmVtb3ZlQWxsKTtcclxuICAgICAgLy8gdXBkYXRlcyB0YWJsZSBpdGVtJ3MgY291bnRcclxuXHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgcm93IGlzIHZhbGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1Jvd1ZhbGlkYXRlZChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuUm93cy5sZW5ndGggPD0gaWR4IHx8IGlkeCA8IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGxldCByb3cgPSA8Um93PnRoaXMuUm93cy5nZXRfSXRlbShpZHgpO1xyXG4gICAgaWYgKHJvdyA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gcm93LkNyZWF0ZWQgJiYgcm93LlZhbGlkYXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBydW5zIGluIFdvcmtlciB0aHJlYWQgd2hlbiB0aGUgdGhyZWFkIGlzIGZyZWUgYW5kIHNlbmQgdG8gR1VJIHRocmVhZCBjb250cm9scyBkYXRhIG9mIGFsbCByb3dzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyB0cmFuc2ZlckRhdGFUb0d1aSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlUm93SWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgbGV0IG1heFRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgKyBNZ0Zvcm0uVElNRV9MSU1JVDtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgYmtwUmVjb3JkOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuYmFja3VwQ3VycmVudCgpO1xyXG4gICAgICAvLyB0aGlzIGxpbWl0YXRpb24gaXMgbmVlZGVkIHNvIHRoaXMgcmVxdWVzdCB3aWxsIG5ldmVyIHRha2UgdG9vIG11Y2ggdGltZVxyXG4gICAgICB3aGlsZSAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSA8IG1heFRpbWUgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgKyAxID49IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICAvLyBhbGwgcm93cyBhbHJlYWR5IHNlbnRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpICYmIHRoaXMuX2xhc3RSb3dTZW50ICsgMSA+PSB0aGlzLmdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCkpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvd1NlbnQrKztcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSb3dWYWxpZGF0ZWQodGhpcy5fbGFzdFJvd1NlbnQpKSB7XHJcbiAgICAgICAgICAvLyByb3cgbmVlZHMgdG8gYmUgc2VudFxyXG4gICAgICAgICAgLy8gc2VuZCByb3cgZGF0YVxyXG4gICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3codGhpcy5fbGFzdFJvd1NlbnQpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ICE9PSBzYXZlUm93SWR4KSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsOyAvLyByZXNldCB0aGUgZmxhZ1xyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5fbGFzdFJvd1NlbnQsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gICAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChzYXZlUm93SWR4LCBia3BSZWNvcmQpO1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gY3VycmVudEVkaXRpbmdDb250cm9sOyAvLyBzZXQgdGhlIGZsYWcgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdHJhbnNmZXJpbmdEYXRhID0gZmFsc2U7XHJcbiAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYW55IHJvd3MgbmVlZCB0byBiZSBzZW50IHRvIEdVSSB0aHJlYWRcclxuICAvLy8gICBpZiB0aGVyZSBhcmUsIHB1dHMgZXZlbnQgaW4gZXZlbnQgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5PcGVuZWQgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcbiAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCA+PSB0aGlzLlJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gd2hlbiB3ZSBkZWNyZWFzZSBzaXplIG9mIHJvd3MgYXJyYXkgYWRqdXN0IGxhc3RSb3dTZW50XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvd1NlbnQgPSB0aGlzLlJvd3MubGVuZ3RoIC0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdGhlcmUgYXJlIHJvd3MgdG8gc2VuZCBhbmQgdGhlcmUgaXMgbm93IHJlcXVlc3QgZm9yIHJvd3MgeWV0XHJcbiAgICAgIC8vIGFkZCByZXF1ZXN0IGZvciByb3dzXHJcbiAgICAgIGxldCB0cmFuc2ZlckRhdGFUb0d1aTogYm9vbGVhbiA9IHRoaXMuX2xhc3RSb3dTZW50IDwgKHNpemUgLSAxKTtcclxuXHJcbiAgICAgIC8vIEZvciBwYWdpbmF0ZWQgdGFibGUgY2hlY2sgdGhlIG1heCByb3dzIG9mIEdVSSB0YWJsZSBjb250cm9sLlxyXG4gICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSAmJiAodGhpcy5fbGFzdFJvd1NlbnQgKyAxKSA+PSB0aGlzLmdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCkpXHJcbiAgICAgICAgdHJhbnNmZXJEYXRhVG9HdWkgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0cmFuc2ZlckRhdGFUb0d1aSAmJiAhdGhpcy5fdHJhbnNmZXJpbmdEYXRhKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KHRoaXMuX3RhYmxlTWdDb250cm9sLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFZfVE9fR1VJLCBQcmlvcml0eS5MT1dFU1QpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVyaW5nRGF0YSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5zaG91bGRGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIgJiYgIXRyYW5zZmVyRGF0YVRvR3VpICYmICghdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpIHx8ICF0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKSkge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eSh0aGlzLl90YWJsZU1nQ29udHJvbCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZFVENIX1JFQ09SRFNfQUhFQURfRlJPTV9TRVJWRVIsIFByaW9yaXR5LkxPV0VTVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIHJvdyBkYXRhIGZvciB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj5kZXNpcmVkIHRvcCBpbmRleCBpZiBkZXNpcmVkVG9wSW5kZXggaXMgSW50ZWdlci5NSU5fVkFMVUUsIHRvcCBpbmRleCBpcyBjZWNpZXZlZCBmb3JtIGR2PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj5pZiB0cnVlLCBzZW5kIGFsbCByZWNvcmRzLCBldmVuIGlmIHRoZXkgYXJlIGNyZWF0ZWQgYW5kIHZhbGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0Rm9jdXNlZFZhbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Um93RGF0YShkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBkaWZmOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGdldFByZXZDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGdldE5leHRDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZGVzaXJlZFRvcEluZGV4ICE9PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAoZGVzaXJlZFRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgcmVxdWVzdCBmb3IgbGluZSBvciBwYWdlIGJlZm9yZSBjdXJyZW50IGNodW5rXHJcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoZSB0b3AgaW5kZXggaXMgYWx3YXlzIDBcclxuICAgICAgICBnZXRQcmV2Q2h1bmsgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZGVzaXJlZFRvcEluZGV4ICsgdGhpcy5fcm93c0luUGFnZSArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSlcclxuICAgICAgLy8gcGFnZWRvd24gb3IgYXJyb3dkb3duIGF0IGVuZCBvZiB0aGUgZGF0YXZpZXdcclxuICAgICAgICBnZXROZXh0Q2h1bmsgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBkZXNpcmVkVG9wSW5kZXggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcblxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuXHJcbiAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW0oZGlmZik7XHJcbiAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5yZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwsIHNhdmVSb3dJZHgsIGRpZmZSZWYpO1xyXG4gICAgZGlmZiA9IGRpZmZSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKChnZXRQcmV2Q2h1bmsgJiYgZGlmZiAhPT0gMCkgfHwgZ2V0TmV4dENodW5rKSB7XHJcbiAgICAgIC8vIGlmIGRpZmYgIT0gMCBhIG5ldyBjaHVuayB3YXMgYnJvdWdodCB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIGR2XHJcbiAgICAgIC8vIHNldCB0b3AgaW5kZXggdG8gZmlyc3QgcmVxdWVzdGVkIGluZGV4XHJcbiAgICAgIC8vIGlmIG5leHQgY2h1bmsgd2FzIGJyb3VnaHQsIHRvcCBpbmRleCBtYXkgYWxzbyBiZSB1cGRhdGVkXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoZGVzaXJlZFRvcEluZGV4ICsgZGlmZik7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICBpZiAodGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgLy8gaWYgdG9wIGluZGV4IHdhcyB1cGRhdGVkIGluIHRoZSBzZXRUYWJsZVRvcEluZGV4IC0gd2UgbWlnaHQgaGF2ZSByb3dzIHRoYXQgd2VyZSBub3QgcmVmcmVzaGVkXHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgIC8vIGFueSByb3cgd2FzIHVwZGF0ZWRcclxuICAgICAgLy8gcmVzdG9yZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCArIGRpZmYsIGJrcFJlY29yZCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIGFzayB0YWJsZSB0byByZWZyZXNoIHRoZSBwYWdlXHJcblxyXG4gICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICBpZiAoZ2V0UHJldkNodW5rKSB7XHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBmb2N1c2VkXHJcbiAgICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldFBhcmVudFRhYmxlKCkgPT09IHRoaXMuX3RhYmxlTWdDb250cm9sKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoZXMgcm93cyBpbiB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzYXZlUm93SWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpZmZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgc2F2ZVJvd0lkeDogbnVtYmVyLCBkaWZmUmVmOiBSZWZQYXJhbTxudW1iZXI+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZGlmZlJlZi52YWx1ZSA9IDA7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiA9IHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCk7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Jvd3NJblBhZ2U7IGkrKykge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBkZXNpcmVkVG9wSW5kZXggKyBpO1xyXG4gICAgICBsZXQgcHJldlRvcElkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIGlmIHdlIGZhaWwgdG8gZ2V0IG9uZSByZWNvcmQsIHdlIG1heSBzdWNjZWVkIHRvIGdldCB0aGUgbmV4dCBvbmVcclxuICAgICAgICBpbmRleCA9IGlkeCArIGRpZmZSZWYudmFsdWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKGlkeCkgfHwgc2VuZEFsbCB8fCB0aGlzLlJlZnJlc2hBbGxSb3dzKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMClcclxuICAgICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGlmIChzYXZlUm93SWR4ICsgZGlmZlJlZi52YWx1ZSAhPT0gaW5kZXgpIHsgLy8gbm90IGN1cnJlbnQgbGluZVxyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaW5kZXgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIGEgbmV3IGNodW5rIGlzIGJyb3VnaHQgdG9wIGluZGV4IHdpbGwgYmUgY2hhbmdlZFxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpbmRleCkpXHJcbiAgICAgICAgICAgIHN1cGVyLm1hcmtSb3dOT1RDcmVhdGVkKGluZGV4KTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gUUNSICMyNjEwNTUsIGV2ZW4gc28gcmVxdWlyZWQgcmVjb3JkIG1heSBub3QgYmUgZm91bmQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBuZXcgY2h1bmsgaGFzIGJlZW4gc2VudFxyXG4gICAgICAgIC8vIGFuZCBkaWZmIG11c3QgYmUgdXBkYXRlZFxyXG4gICAgICAgIGRpZmZSZWYudmFsdWUgPSBkaWZmUmVmLnZhbHVlICsgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAtIHByZXZUb3BJZHgpO1xyXG4gICAgICAgIHByZXZUb3BJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgaWYgKCF1cGRhdGVkICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5EYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdCwgb3JnSW5jbHVkZXNMYXN0KSlcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHJvdyBpbiB0aGUgcGFnZTwvcmV0dXJucz5cclxuICBnZXRWaXNpYmxlTGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIGN1cnJSZWNJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIHJldHVybiBjdXJyUmVjSWR4IC0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhc3NlcnRzIHRoYXQgY3VycmVudCByZWNvcmQgaXMgaW4gdGhlIHZpZXcsIGlmIGl0IGlzIG5vdCBvbiB0aGUgcGFnZSwgYWRqdXN0cyB0b3AgaW5kZXgsIHNvIHRoYXQgY3VycmVudFxyXG4gIC8vLyAgIHJlY29yZCB3aWxsIGJlIG9uIHRoZSB2aXNpYmxlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJyaW5nUmVjb3JkVG9QYWdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGxldCB0b3BJbmRleDogbnVtYmVyID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgbGV0IG5ld1RvcEluZGV4OiBudW1iZXIgPSB0b3BJbmRleDtcclxuXHJcbiAgICAgIC8vIFRhYmxlIHRvcCBpbmRleCBmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZVxyXG4gICAgICBpZiAoIXRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICBpZiAodG9wSW5kZXggPiBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0b3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxIDwgY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9yb3dzSW5QYWdlID4gMClcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4IC0gdGhpcy5fcm93c0luUGFnZSArIDE7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSB0b3AgaW5kZXggZm9yIHBhZ2luYXRlZCB0YWJsZS5cclxuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGluZGV4IG9mIGZpcnN0IHJlY29yZCBvbiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHJlY29yZCB0byBiZSBzZWxlY3RlZC5cclxuICAgICAgICBsZXQgY3Vyckd1aUlkeCA9IHRoaXMuZ2V0R3VpUm93aWR4KGN1cnJJZHgpO1xyXG4gICAgICAgIGxldCBuZXdUb3BHdWlJbmRleCA9IChjdXJyR3VpSWR4KSAtICgoY3Vyckd1aUlkeCkgJSB0aGlzLl9yb3dzSW5QYWdlKTsgLy9ndWkgaWR4IG9mIGZpcnN0IHJlY29yZCBvZiByZXNwZWN0aXZlIHBhZ2VcclxuXHJcbiAgICAgICAgbmV3VG9wSW5kZXggPSB0aGlzLmdldER2Um93SWR4KG5ld1RvcEd1aUluZGV4KTtcclxuXHJcbiAgICAgICAgaWYobmV3VG9wSW5kZXggIT09IHRoaXMuX3ByZXZHdWlUb3BJbmRleCB8fCB0aGlzLklzTW92aW5nSW5WaWV3IClcclxuICAgICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBiZSBjdXJyZW50IGxpbmVcclxuICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAhPT0gbmV3VG9wSW5kZXggfHwgdGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChuZXdUb3BJbmRleCk7XHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKEludDMyLk1pblZhbHVlLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnZhbGlkYXRlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbnZhbGlkYXRlVGFibGUoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5Sb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCByb3c6IFJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAocm93ICE9PSBudWxsKVxyXG4gICAgICAgIHJvdy5WYWxpZGF0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBwcmV2aW91cyB2aXNpYmxlIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRQcmV2TGluZShsaW5lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGxpbmUgLSAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBzb3J0IG1hcmsoZGVsdGEpIGZyb20gdGhlIGNvbHVtbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2xlYXJTb3J0TWFya1wiPjwvcGFyYW0+XHJcbiAgY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKGNsZWFyU29ydE1hcms6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjbGVhclNvcnRNYXJrKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHN0b3AgdGhlIHJvdyBmcm9tIGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBhc3luYyBzdG9wUm93RWRpdGluZyhpZHg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICBpZiAodGhpcy5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGlkeCkpIHtcclxuICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX05PVF9JU19ST1dfRURJVElORywgdGhpcywgIHRoaXMuaXNMaW5lTW9kZSgpICA/IGlkeCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgIH1cclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHN0YXJ0IHRoZSByb3cgZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHN0YXJ0Um93RWRpdGluZyhpZHg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoIXRoaXMuZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShpZHgpKSB7XHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9JU19ST1dfRURJVElORywgdGhpcywgdGhpcy5pc0xpbmVNb2RlKCkgPyBpZHggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCByZXR1cm4gaWYgdGhlIHJvdyBpcyBpbiBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcHVibGljIGdldElzUm93RWRpdGluZ0Zyb21HdWkoZGlzcGxheUluZGV4Om51bWJlciApOiBib29sZWFuIHtcclxuICAgIGxldCBpc1Jvd0VkaXRpbmc6IGJvb2xlYW4gPSBDb21tYW5kcy5nZXRJc1Jvd0VkaXRpbmcodGhpcywgdGhpcy5pc0xpbmVNb2RlKCkgPyBkaXNwbGF5SW5kZXggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICByZXR1cm4gaXNSb3dFZGl0aW5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0aGUgZGlzcGxheSwgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShyZWZyZXNoVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gVGFrZSBhbm90aGVyIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBvZiBRQ1JzICM5ODQ5OTksICM5MzM2MzkgJiAjNjk5ODIxOlxyXG4gICAgLy8gTm93LCB0aGUgZGlzcGxheSB3b3VsZCBiZSByZWZyZXNoZWQgb25seSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgTk9UIGFuIG9sZFxyXG4gICAgLy8gcmVjb3JkIHdoaWNoIGlzIGJlaW5nIGNvbXB1dGVkLiBUaGUgcmVzdWx0IG9mIHRoaXMgY2hhbmdlIGlzIHRoYXQgZHVyaW5nIHRoZVxyXG4gICAgLy8gY29tcHV0ZSBwcm9jZXNzIG9mIGEgcmVjb3JkIHRoZSBkaXNwbGF5IGlzIG5vdCByZWZyZXNoZWQgKHdoaWNoIGlzIGdvb2QgZm9yIHVzKS5cclxuICAgIC8vIFRoZSBkaXNwbGF5IHdvdWxkIGJlIHJlZnJlc2hlZCBhbnl3YXkgQUZURVIgdGhlIGNvbXB1dGUgcHJvY2VzcyBpcyBkb25lLlxyXG4gICAgLy8gKEVodWQgMjEtTUFZLTIwMDIpXHJcbiAgICBpZiAoY3VyclJlYyAhPT0gbnVsbCAmJiBjdXJyUmVjLkluQ29tcHV0ZSAmJiAhY3VyclJlYy5pc05ld1JlYygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2luUmVmcmVzaERpc3ApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2luUmVmcmVzaERpc3AgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNIHx8IHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybSBhbmQgcmVmcmVzaCBpdFxyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpICYmIHRoaXMuT3BlbmVkKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0gfHwgcmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpIHtcclxuICAgICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMgJiYgc3VwZXIuaGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUHJldkNodW5rRm9yQ3VycmVudFBhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgZm9ybSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaFByb3BzKCk7XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgY3VycmVudCByZWNvcmQvUm93XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfSBpbiB0YXNrIHsyfVwiLCBleC5HZXRUeXBlKCksIGV4Lk1lc3NhZ2UsICg8VGFza0Jhc2U+c3VwZXIuZ2V0VGFzaygpKS5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luUmVmcmVzaERpc3AgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaWduYWwgd2UgY29tcGxldGVkIHRoZSBmaXJzdCBjeWNsZSBvZiByZWZyZXNoaW5nIHRoZSBmb3JtXHJcbiAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMgJiYgKCFzdXBlci5pc0xpbmVNb2RlKCkgfHwgdGhpcy5fdGFibGVSZWZyZXNoZWQpKVxyXG4gICAgICB0aGlzLkZvcm1SZWZyZXNoZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hVSSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRUYXNrKCkuaXNNYWluUHJvZygpIC8qJiYgSW5pdGlhbGl6YXRpb25GaW5pc2hlZCovKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIGZvcm1zIHdpdGggdGFibGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiU3RhcnQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuICAgIC8vIHRvZG8gZm9yIG5vdyAtIGFsd2F5cyBzaG93IGFsbCByZWNvcmRzXHJcbiAgICAvLyBzYXZlIHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBsZXQgb2xkQ3VyclJvdzogbnVtYmVyID0gdGhpcy5EaXNwbGF5TGluZTtcclxuICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSB3ZSByZWZyZXNoIHRoZSB0YWJsZSAtIHNldCBjdXJyLXJvdyBhbmQgdG9wLXJlYy1pZHggdG8gYmUgdGhlXHJcbiAgICAvLyBvbmVzIHJlcXVlc3RlZCBieSB0aGUgZGF0YXZpZXcuXHJcbiAgICAvLyBJbiB0aGUgZm9sbG93aW5nIHRhYmxlIHJlZnJlc2hlcyAtIHdlIGNoYW5nZSBjdXJyLXJvdyBhbmQgdG9wLXJlYyBvbmx5IGlmIHRoZSB0YWJsZVxyXG4gICAgLy8gYmVjb21lcyBlbXB0eS5cclxuICAgIGlmICghdGhpcy5fdGFibGVSZWZyZXNoZWQgJiYgY3VyclJlY0lkeCA+PSAwKSB7XHJcbiAgICAgIG9sZEN1cnJSb3cgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuXHJcbiAgICAgIGlmIChvbGRDdXJyUm93ICsgMSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChvbGRDdXJyUm93IC0gTWF0aC5mbG9vcih0aGlzLl9yb3dzSW5QYWdlIC8gMikgKyAxKTtcclxuXHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChvbGRDdXJyUm93ID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBvbGRDdXJyUm93ID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hlbiBUb3BSZWNJZHggPCAwIGl0IG1lYW5zIHdlIHNob2xkIG5vdCBjb250aW51ZSB0aGUgcmVmcmVzaCBzaW5jZSB3ZSBhcmUgaW4gdGVtcG9yYXJ5IHNpdHVhdGlvbi5cclxuICAgIC8vIEFub3RoZXIgcmVmcmVzaCB3aWxsIGJlIGRvbmUgc29vbiB3aXRoIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgLy8gVGhpcyBpcyBjYW4gaGFwcGVuIHdoZW4gOlxyXG4gICAgLy8gSW4gZmV0Y2hDaHVua0Zyb21TZXJ2ZXIgd2UgZ28gdG8gdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBleHBlY3RzIG5ldyByZWNvcmRzLlxyXG4gICAgLy8gV2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZmV0Y2hpbmdDaHVuaywgd2UgbWlnaHQgZ28gYWdhaW4gdG8gdGhlIHNlcnZlciwgYmVmb3JlIHRoZSBzZXJ2ZXIgc2VuZHMgdXMgdGhlIGNodW5rLlxyXG4gICAgLy8gR29pbmcgdG8gdGhlIHNlcnZlciBpbiB0aGUgZ2V0IGNodW5rIHByb2Nlc3MgLCBjYW4gYmUgZm9yIGV4YW1wbGU6IHJlY29yZCBzdWZmaXgsIG9yIGFueSBzZXJ2ZXIgc2lkZSBvcCBpbiByZWMgc3VmZiBvciBWQy5cclxuICAgIC8vIFVzdWFsbHksIGR1cmluZyB0aGlzIHBhcnQsIHdlIGRvIG5vdCByZWZyZXNoIHRoZSB0YWJsZS5cclxuICAgIC8vIEJ1dCwgZm9yIGV4YW1wbGUgaW4gUUNSICM2OTgyMTcsIGEgY2FsbCB3YXMgbWFkZSB0byByZWZyZXNoVGFibGUgd2l0aCBUb3BSZWNJZHggPT0gLTEuXHJcbiAgICAvLyBUaGUgcmVhc29uIHdhcywgdGhhdCBpbiB0aGUgVkMgdGhlcmUgd2FzIGEgc2VydmVyIG9wIHRoYXQgdXBkYXRlZCBhIHZhciBpbiB0aGUgdGFzay4gQXMgYSByZXN1bHQsIHRoZSAnbW9kaScgZmxhZ1xyXG4gICAgLy8gZnJvbSB0aGUgc2VydmVyIHdhcyBvbiwgd2hpY2ggY2F1c2VkIHRoZSBcInRlbXBcIiByZWZyZXNoVGFibGUgYmVmb3JlIHRoZSByZWFsIGNodW5rIGFycml2ZWQuXHJcbiAgICAvLyBUaGlzIGluIHR1cm4gY2F1c2VkIGEgY2hhbmdlIGluIHRoZSBjdXJyIHJlYyBpZCwgd2hpY2ggd2FzIHdyb25nLlxyXG4gICAgLy8gQWZ0ZXIgdGhlIGNodW5rIGFycml2ZXMsIHRoZSByZWZyZXNoIHNldHMgdGhlIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA8IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBvbGRDdXJyUm93ID0gb2xkQ3VyclJvdyAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTsgLy8gc2F2ZSBvbGRDdXJyUm93IHJlbGF0aXZlbHkgdG8gdGhlIHRvcCBpbmRleFxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgIHRoaXMuX3RhYmxlUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb3JpVHJhbnNmZXJEYXRhVG9HdWkgPSB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcblxyXG4gICAgaWYgKCFvcmlUcmFuc2ZlckRhdGFUb0d1aSlcclxuICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjOTk4MDY3LCB3ZSBtdXN0IG5vdCByZWZyZXNoIHN1YmZvcm1zIGZvciBhbnkgcm93cyB0aGF0IGFyZSBub3Qgb3VyIHJlYWwgY3VycmVudCByb3dcclxuXHJcbiAgICAvLyByZWZyZXNoIGFsbCB0aGUgcm93cyBCVVQgbm90IHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9yb3dzSW5QYWdlOyBpKyspIHtcclxuICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyByZWNvcmQgZm9yIGEgcm93IGp1c3QgZGlzYWJsZSBpdCBhbmQgdmljZSB2ZXJzYVxyXG4gICAgICBsZXQgdG9wSW5kZXg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgaWYgKHRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgdG9wSW5kZXggPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IHRvcEluZGV4ICsgaTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyhpZHgpO1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBvbGQgY3VycmVudCByb3cuIHRoZSByZWZyZXNoIGZvciB0aGlzIHJvdyBpcyBkb25lIGJ5IHRoZSBjYWxsZXJcclxuICAgICAgICAvLyBhbmQgcmVmcmVzaCBvbmx5IHZhbGlkIGxpbmVzIHRoYXQgd2VyZSBub3QgZGlzYWJsZWRcclxuICAgICAgICBpZiAoaSAhPT0gb2xkQ3VyclJvdykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShpZHgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4Lm5hbWUgPT0gXCJSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uXCIpIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICAgICAgICBzdXBlci5tYXJrUm93Tk9UQ3JlYXRlZChpZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKG9sZEN1cnJSb3cgKyB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCksIGJrcFJlY29yZCk7XHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlR3VpVG9Mb2coXCJFbmQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGRpc3BsYXkgbGluZSBieSByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdXBkYXRlRGlzcGxheUxpbmVCeURWKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EaXNwbGF5TGluZSA9IHRoaXMucmVjb3JkSWR4MkRpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3VycmVudCByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj5pcyB0aGUgbmV3IGN1cnJlbnQgZGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZTogbnVtYmVyLCBkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlY0lkeDogbnVtYmVyID0gdGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmUpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlSZWNJZHgocmVjSWR4LCBkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgZGlzcGxheUxpbmUpO1xyXG4gICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRGlzcGxheUxpbmUgPSBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd051bVwiPmlzIHRoZSBuZXcgY3VycmVudCByb3cgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHNldEN1cnJSb3dCeVJlY0lkeChyb3dOdW06IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkgPT09IG51bGwgfHwgKCFzdXBlci5oYXNUYWJsZSgpICYmIHJvd051bSAhPT0gMCkpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEZvcm0uc2V0Q3VyclJvdygpIG5vIHRhYmxlIFwiKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtO1xyXG4gICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHJvd051bSwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIHRydWUsIGRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGxhc3QgdmFsaWQgcm93IGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFZhbGlkUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fcm93c0luUGFnZSAtIDEsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgcmVjb3JkIGxpbmUgdG8gZGlzcGxheSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICByZWNvcmRJZHgyRGlzcGxheUxpbmUocmVjSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgZGlzcGxheSBsaW5lIHRvIHJlY29yZCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGRpc3BsYXlMaW5lMlJlY29yZElkeChkaXNwbGF5TGluZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBvbGQgY3VycmVudCByb3cgdXNpbmcgdGhlIHBhcmFtZXRlciBhbmQgaWdub3JpbmcgYW55IGV4Y2VwdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPnRoZSBvbGQgY3VycmVudCByb3cgbnVtYmVyIHRvIGJlIHJlc3RvcmVkPC9wYXJhbT5cclxuICBhc3luYyByZXN0b3JlT2xkRGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByZWNvcmQgZnJvbSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcEluZGV4RnJvbUdVSSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuXHJcbiAgICBpZiAoc3VwZXIuaGFzVGFibGUoKSlcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLmRpc3BsYXlMaW5lMlJlY29yZElkeCh0b3BEaXNwbGF5TGluZSkpO1xyXG5cclxuICAgIHJldHVybiB0b3BEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCByZWNvcmQgcG9zaXRpb24gaW4gdGhlIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWNQb3NJbkZvcm0oKTogbnVtYmVyIHtcclxuICAgIC8vIHdoZW4gdGhlIHNlbGVjdGVkIHJlY29yZCBpcyBvdXRzaWRlIHRoZSB2aWV3LCB0b3BJbmRleCBhbmQgRGlzcGxheUxpbmUgd2lsbCBiZSAwXHJcbiAgICAvLyByZXN1bHRpbmcgaW4gY3VyclJlY1Bvc0luRm9ybSA9PSAxXHJcbiAgICBsZXQgdG9wRGlzcGxheUxpbmU6IG51bWJlciA9IHN1cGVyLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuRGlzcGxheUxpbmUgLSB0b3BEaXNwbGF5TGluZSArIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkRGlzcGxheUxpbmVcIj5vbGQgY3VycmVudCByZWNvcmQgaWR4PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJrcFJlY29yZFwiPnNhdmVkIHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZUJhY2t1cChvbGREaXNwbGF5TGluZTogbnVtYmVyLCBia3BSZWNvcmQ6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUUNSICM5NDI4NzgsIGlmIHJlY29yZCBpcyBpbiBwcm9jZXNzIG9mIGluc2VydCwgZGVsZXRlIG9yIG1vZGlmeSB3ZSBtdXN0IHBlcmZvcm0gcmVzdG9yZU9sZEN1cnJSb3dcclxuICAgIC8vIHRoYXQgd2lsbCBwZXJmb3JtIGFsbCBuZWNlc3NhcnkgYWN0aW9ucyBmb3IgdGhlIHJlY29yZCwgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IHJlc3RvcmUgaXQgZnJvbSBiYWNrdXBcclxuICAgIGlmIChia3BSZWNvcmQuZ2V0SWQoKSA+PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRSZWNJZHgoYmtwUmVjb3JkLmdldElkKCkpID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPj0gMCAmJiBvbGREaXNwbGF5TGluZSA8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA+PSAwICYmIGJrcFJlY29yZC5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lKSB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5yZXN0b3JlQ3VycmVudChia3BSZWNvcmQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgfVxyXG5cclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZT86IE1nQ29udHJvbFR5cGUsIHRhc2tPclBhcmVudE1nRm9ybT86IGFueSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeD86IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzAoKTtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICh0eXBlID09PSBudWxsIHx8IHR5cGUuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHRhc2tPclBhcmVudE1nRm9ybSA9PT0gbnVsbCB8fCB0YXNrT3JQYXJlbnRNZ0Zvcm0gaW5zdGFuY2VvZiBUYXNrQmFzZSkgJiYgKHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHggPT09IG51bGwgfHwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5Db25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzIodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzAoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCB0YXNrOiBUYXNrQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCB0YXNrLCBwYXJlbnRDb250cm9sKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzIodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sSWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiBuZXcgTWdDb250cm9sKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJucyB0cnVlIGlmIGFscmVhZHkgbW92ZWQgdG8gdGhlIGZpcnN0IGNvbnRyb2wgb24gb25lIG9mIHRoZSBNZ0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0TUdEYXRhKCkuQWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRhYmxlIGZpcnN0IHRpbWUgd2UgZW50ZXIgdGhlIG93bmVyVGFza1xyXG4gIC8vLyAgIGdldCByb3dzIG51bWJlciBmb3JtIGd1aSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlyc3RUYWJsZVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgc3VwZXIuZmlyc3RUYWJsZVJlZnJlc2goKTtcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEluc2VydFRhYmxlSXRlbXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUm93cy5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgICB0aGlzLkluc2VydFRhYmxlQ2hpbGRyZW5BcnJheXMoaWR4LCBjb3VudCk7XHJcbiAgICAgIHRoaXMuX2xhc3RSb3dTZW50ID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGFibGUgaXRlbSdzIGNvdW50IGFjY29yZGluZyB0byBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgIHNldFRhYmxlSXRlbXNDb3VudChyZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlcjtcclxuXHJcbiAgICAvLyBGb3IgYWJzb2x1dGUgc2Nyb2xsYmFyLCBzZXQgdGhlIHZpcnR1YWwgaXRlbXMgY291bnQgYWNjb3JkaW5nbHkuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpIHtcclxuXHJcbiAgICAgIC8vIElmIHRhc2sgaXMgbW92ZWQgaW50byBDUkVBVEUgbW9kZSBhbmQgY3VycmVudGx5IG5ldyBsaW5lIGlzIGNyZWF0ZWRcclxuICAgICAgLy8gdGhlbiBvbmx5IG5ld2x5IGNyZWF0ZWQgcmVjb3JkcyBzaG91bGQgYmUgc2VlIG9uIHRoZSBzY3JlZW5cclxuICAgICAgaWYgKCg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURVxyXG4gICAgICAgICAgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuXHJcbiAgICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gMDtcclxuICAgICAgICAgIHRoaXMuU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KDApO1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gVGFibGUgd2l0aCBzZXQgb2YgcmVjb3JkcyBPUiBpZiBlbXB0eSB0YWJsZSB0aGVuIHRhYmxlSXRlbXNDb3VudCBzaG91bGQgbm90IGJlIDAsIGFzIHdlIGFsd2F5cyBoYXZlIDB0aCByb3cuXHJcbiAgICAgICAgdGFibGVJdGVtc0NvdW50ID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCA+IDApID8gdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50OiAxO1xyXG4gICAgICAgIHRoaXMuU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gTm9uLXBhZ2luYXRlZCB0YWJsZVxyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgICBzdXBlci5TZXRUYWJsZUl0ZW1zQ291bnQodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcblxyXG4gIEluaXRUYWJsZUNvbnRyb2woKTogdm9pZDtcclxuICBJbml0VGFibGVDb250cm9sKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZDtcclxuICBJbml0VGFibGVDb250cm9sKGR2U2l6ZT86IG51bWJlciwgdGFibGVJdGVtc0NvdW50PzogbnVtYmVyLCByZW1vdmVBbGw/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMDAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAxKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0cyB0aGUgdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0VGFibGVDb250cm9sXzAwKCk6IHZvaWQge1xyXG4gICAgbGV0IGR2U2l6ZTogbnVtYmVyID0gMTtcclxuICAgIGxldCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciA9IDE7XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSB0YWJsZSBjb250cm9sIGZvciB0aGUgZmlyc3QgdGltZSB3aGlsZSBjcmVhdGluZyB0aGUgZm9ybSB3aXRoIHRvdGFsUmVjb3Jkc0NvdW50IGFuZCBhbHNvXHJcbiAgICAvLyBzZXQgdGhlIHJlY29yZHNCZWZvcmVDdXJyZW50VmlldywgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBmaXJzdCByb3cgYXQgcmVzcGVjdGl2ZSBsb2NhdGlvbiBpbiBjYXNlIG9mIGxvY2F0ZS5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc7XHJcbiAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDtcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2woZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQsIGZhbHNlKTtcclxuICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0cyB0YWJsZSBjb250cm9sJ3Mgcm93cyB0byAndGFibGVJdGVtc0NvdW50JyBjb3VudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZHZTaXplXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YWJsZUl0ZW1zQ291bnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlbW92ZUFsbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBJbml0VGFibGVDb250cm9sXzAxKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHJlbW92ZUFsbCkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfRklSU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0cnVlKTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSB8fCB0aGlzLkdldERhdGF2aWV3KCkuSXNPbmVXYXlLZXkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfTEFTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9FTVBUWV9EQVRBVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5RGF0YXZpZXcoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN1cGVyLkluaXRUYWJsZUNvbnRyb2woZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcblxyXG4gICAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRvcCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0VGFibGVUb3BJbmRleCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgaWYgKGluZGV4ID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBpbmRleCA9IDA7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKSB7XHJcbiAgICAgICAgICAvLyB0YWJsZSBub3cgYmVoYXZlcyBsaWtlIGxpc3R2aWV3LCBpdCBjYW4gbm90IHNob3cgZW1wdHkgbGluZXNcclxuICAgICAgICAgIC8vIHNvIHdlIG11c3QgdXBkYXRlIHRvcCBpbmRleFxyXG4gICAgICAgICAgaWYgKGluZGV4ICsgdGhpcy5fcm93c0luUGFnZSA+IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkpIHtcclxuICAgICAgICAgICAgLy8gYnV0IHdlIGRvIHNob3cgZW1wdHkgbGluZXMgaWYgaW5jbHVkZUZpcnN0ID0gZmFsc2VcclxuICAgICAgICAgICAgLy8gYW5kIHdlIGhhdmUgbGVzcyByZWNvcmRzIHRoZW4gcm93cyBvbiBzY3JlZW4gUUNSICMhISEhISFcclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA+IHRoaXMuX3Jvd3NJblBhZ2UgKyAxKSB7XHJcbiAgICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1heCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gdGhpcy5fcm93c0luUGFnZSwgMCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChpbmRleCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaW5kZXggIT09IHRoaXMuX3ByZXZHdWlUb3BJbmRleCB8fCB0aGlzLklzTW92aW5nSW5WaWV3KSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfVEFCTEVfVE9QX0lOREVYLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgaW5kZXgpO1xyXG4gICAgICAgIHRoaXMuX3ByZXZHdWlUb3BJbmRleCA9IHRoaXMuZ2V0R3VpUm93aWR4KGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENyZWF0ZXMgdGhlIHdpbmRvdyBkZWZpbmVkIGJ5IHRoaXMgZm9ybSBhbmQgaXRzIGNoaWxkIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjcmVhdGVGb3JtKCk6IHZvaWQge1xyXG4gICAgc3VwZXIuY3JlYXRlRm9ybSgpO1xyXG4gICAgTWdGb3JtLkNyZWF0ZWRGb3Jtcy5hZGQodGhpcyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PldyaXRlcyB0aGUgc3RyaW5nIG9yIHNldHMgdGhlIGltYWdlIG9uIHRoZSBwYW5lIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFuZUlkeFwiPkluZGV4IG9mIHRoZSBwYW5lIHRvIGJlIHVwZGF0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0ckluZm9cIj5NZXNzYWdlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzb3VuZEJlZXBcIj5Tb3VuZCBiZWVwIG9yIG5vdDwvcGFyYW0+XHJcbiAgVXBkYXRlU3RhdHVzQmFyKHBhbmVJZHg6IG51bWJlciwgc3RySW5mbzogc3RyaW5nLCBzb3VuZEJlZXA6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBpbiBXZWJDbGllbnQuXHJcbiAgICAvLyBpZiAocGFuZUlkeCA9PSBDb25zdGFudHMuU0JfTVNHX1BBTkVfTEFZRVIgfHwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFNob3dTdGF0dXNCYXJQYW5lcygpKVxyXG4gICAgLy8gICBiYXNlLlVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4LCBzdHJJbmZvLCBzb3VuZEJlZXApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSByZWNvbXB1dGUgdGFibGUgZm9yIHRoYXQgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGUgZm9ybVwiKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5pbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IHRhc2s9XCIgKyB0aGlzLl90YXNrICsgXCIsIElkPVwiICsgdGhpcy5fdXNlclN0YXRlSWQgKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYnVpbGQgdGhlIFhNTCBlbnRyeSBvZiB0aGUgaGlkZGVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgeG1sOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ICE9PSBudWxsICYmIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHdyaXRlIHRoZSBpZFxyXG4gICAgICB4bWwuQXBwZW5kKFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hJRERFTl9DT05UT0xTICsgXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTTlMgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0LmZvckVhY2goKGNoYW5nZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgeG1sLkFwcGVuZChjaGFuZ2UgKyBcIixcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgeG1sLlJlbW92ZSh4bWwuTGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICB4bWwuQXBwZW5kKFwiXFxcIi8+XCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIEZvciBSSUEsIE5vbiBJbnRlcmFjdGl2ZSB0YXNrJ3MgYW5kIGl0cyBhbGwgY2hpbGQgdGFzayBzaG91bGQgYmVoYXZlIGFzIGEgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2hvdWxkQmVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBhbmQgaXRzIGNoaWxkcmVuIHdpbGwgYmUgb3BlbmVkIHVzaW5nIHNob3cgZGlhbG9nIHRvIHByZXZlbnQgZXZlbnRzIG9uIHRoZWlyIGFuY2VzdG9yc1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpKVxyXG4gICAgICBzaG91bGRCZU1vZGFsID0gVGFza0Jhc2UuU2hvdWxkTm9uSW50ZXJhY3RpdmVCZU1vZGFsKCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2tCYXNlID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5QYXJlbnRUYXNrO1xyXG4gICAgICBpZiAocGFyZW50VGFzayAhPT0gbnVsbCAmJiAhcGFyZW50VGFzay5Jc0ludGVyYWN0aXZlICYmICFwYXJlbnRUYXNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBzaG91bGRCZU1vZGFsID0gcGFyZW50VGFzay5TaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRCZU1vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFnaW5hdGVkIHRhYmxlIGJlaW5nIHVzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAoPE1nQ29udHJvbD50aGlzLl90YWJsZU1nQ29udHJvbCkuSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidWlsZEZvcm1OYW1lKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gIHRoaXMuVW5pcXVlTmFtZTtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLmdldFRhc2soKTtcclxuXHJcbiAgICBuYW1lID0gKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgJ18nICsgbmFtZTtcclxuICAgIHdoaWxlICh0YXNrLklzU3VidGFzaykge1xyXG4gICAgICB0YXNrID0gPFRhc2tCYXNlPnRhc2suU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCkgOiBUbyBmZXRjaCBwcmV2aW91cyBjaHVuayBvZiByZWNvcmRzIGlmIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNQb3NPblBhZ2U6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgJSB0aGlzLl9yb3dzSW5QYWdlO1xyXG5cclxuICAgICAgLy8gSWYgcmVjb3JkIGlzIG5vdCB0aGUgZmlyc3QgcmVjb3JkIG9uIHBhZ2UsIGZldGNoIHByZXZpb3VzIHJlY29yZCBmb3IgdGhhdCBwYWdlLlxyXG4gICAgICAvLyBUT0RPIDogdGhpcy5EaXNwbGF5TGluZSAtIENoZWNrIHdoZXRoZXIgY2FuIGJlIHJlbW92ZWQgP1xyXG4gICAgICBpZiAocmVjUG9zT25QYWdlID4gMCAmJiB0aGlzLkRpc3BsYXlMaW5lID09PSAwKSB7XHJcbiAgICAgICAgbGV0IGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCA9IHtndWlNZ0NvbnRyb2w6IHRoaXMuZ2V0VGFibGVDdHJsKCksIExpbmU6IHJlY1Bvc09uUGFnZSwgVmFsOiBcIlwifTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFJvd0RhdGEoLXJlY1Bvc09uUGFnZSwgZmFsc2UsIGxhc3RGb2N1c2VkVmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3VpUm93aWR4KGR2Um93SWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGR2Um93SWR4ICsgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcblxyXG4gIGdldER2Um93SWR4KGd1aVJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBndWlSb3dJZHggLSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gIH1cclxufVxyXG4iXX0=
|