@magic-xpa/engine 4.1000.0-dev4100.30 → 4.1000.0-dev4100.300
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/esm2020/src/ClientManager.mjs +11 -11
- package/esm2020/src/ConstInterface.mjs +3 -1
- package/esm2020/src/CurrentClientVersion.mjs +2 -2
- package/esm2020/src/commands/ClientToServer/DataviewCommand.mjs +6 -6
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +4 -4
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +8 -8
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +4 -4
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +5 -5
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +7 -7
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +6 -6
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +8 -8
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +7 -7
- package/esm2020/src/data/DataView.mjs +34 -34
- package/esm2020/src/data/DataviewManager.mjs +7 -7
- package/esm2020/src/data/Record.mjs +10 -10
- package/esm2020/src/data/TaskTransactionManager.mjs +4 -4
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +5 -5
- package/esm2020/src/env/Environment.mjs +14 -7
- package/esm2020/src/env/MirrorString.mjs +2 -3
- package/esm2020/src/event/Event.mjs +4 -1
- package/esm2020/src/event/EventHandler.mjs +8 -3
- package/esm2020/src/event/EventHandlerPosition.mjs +5 -1
- package/esm2020/src/event/EventsManager.mjs +2 -1
- package/esm2020/src/event/RunTimeEvent.mjs +16 -16
- package/esm2020/src/exp/ExpressionDict.mjs +8 -8
- package/esm2020/src/exp/ExpressionEvaluator.mjs +4 -178
- package/esm2020/src/gui/FormsTable.mjs +8 -8
- package/esm2020/src/gui/MgControl.mjs +10 -13
- package/esm2020/src/gui/MgForm.mjs +7 -23
- package/esm2020/src/http/HttpManager.mjs +8 -8
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +35 -26
- package/esm2020/src/rt/DataviewHeaderBase.mjs +16 -16
- package/esm2020/src/security/UserDetails.mjs +12 -12
- package/esm2020/src/tasks/MGData.mjs +4 -4
- package/esm2020/src/tasks/RCTimer.mjs +10 -10
- package/esm2020/src/tasks/Task.mjs +43 -42
- package/esm2020/src/util/FlowMonitorQueue.mjs +107 -2
- package/esm2020/src/util/PrmMap.mjs +6 -6
- package/esm2020/src/util/ReturnResult.mjs +7 -7
- package/fesm2015/magic-xpa-engine.mjs +489 -583
- package/fesm2015/magic-xpa-engine.mjs.map +1 -1
- package/fesm2020/magic-xpa-engine.mjs +489 -547
- package/fesm2020/magic-xpa-engine.mjs.map +1 -1
- package/package.json +6 -6
- package/src/ConstInterface.d.ts +2 -0
- package/src/env/Environment.d.ts +2 -0
- package/src/exp/ExpressionEvaluator.d.ts +0 -9
- package/src/gui/MgControl.d.ts +0 -1
- package/src/gui/MgForm.d.ts +1 -3
- package/src/util/FlowMonitorQueue.d.ts +8 -0
- package/src/util/PrmMap.d.ts +1 -1
- package/magic-xpa-engine.d.ts +0 -2
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Commands, CommandType, DataModificationTypes, GuiEnvironment, Manager, MgFormBase, PropInterface } from '@magic-xpa/gui';
|
2
2
|
import { Constants, InternalInterface, Logger, MgControlType, Misc, Priority, XMLConstants } from '@magic-xpa/utils';
|
3
|
-
import { ApplicationException, Debug, Exception, Int32, NString, RefParam, StringBuilder
|
3
|
+
import { ApplicationException, Debug, Exception, Int32, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
4
4
|
import { MgControl } from './MgControl';
|
5
5
|
import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
|
6
6
|
import { SET_DISPLAYLINE_BY_DV } from '../data/DataView';
|
@@ -51,18 +51,8 @@ export class MgForm extends MgFormBase {
|
|
51
51
|
dv = this._task.DataView;
|
52
52
|
return (dv);
|
53
53
|
}
|
54
|
-
async moveInView(unit, direction
|
55
|
-
if (isNullOrUndefined(returnToCtrl))
|
56
|
-
await this.moveInView_0(unit, direction);
|
57
|
-
else
|
58
|
-
await this.moveInView_1(unit, direction, returnToCtrl);
|
59
|
-
}
|
60
|
-
async moveInView_0(unit, direction) {
|
61
|
-
await this.moveInView(unit, direction, true);
|
62
|
-
}
|
63
|
-
async moveInView_1(unit, direction, returnToCtrl) {
|
54
|
+
async moveInView(unit, direction) {
|
64
55
|
let oldRecId = Int32.MinValue;
|
65
|
-
let lastParkedCtrl;
|
66
56
|
let currRec = this.GetDataview().getCurrRec();
|
67
57
|
let oldTaskMode = ' ';
|
68
58
|
let returnToVisibleLine = false;
|
@@ -193,6 +183,7 @@ export class MgForm extends MgFormBase {
|
|
193
183
|
try {
|
194
184
|
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
195
185
|
await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + this.getLastValidRow(), false, true);
|
186
|
+
visibleLine = this.getLastValidRow();
|
196
187
|
}
|
197
188
|
catch (Exception) {
|
198
189
|
}
|
@@ -316,15 +307,6 @@ export class MgForm extends MgFormBase {
|
|
316
307
|
else
|
317
308
|
this.SetTableTopIndex();
|
318
309
|
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
|
319
|
-
if (returnToCtrl) {
|
320
|
-
lastParkedCtrl = this._task.getLastParkedCtrl();
|
321
|
-
if (lastParkedCtrl != null) {
|
322
|
-
let cursorMoved = await lastParkedCtrl.invoke();
|
323
|
-
if (!cursorMoved) {
|
324
|
-
await AccessHelper.eventsManager.HandleNonParkableControls(this._task);
|
325
|
-
}
|
326
|
-
}
|
327
|
-
}
|
328
310
|
}
|
329
311
|
catch (e) {
|
330
312
|
if (e instanceof RecordOutOfDataViewException) {
|
@@ -856,8 +838,10 @@ export class MgForm extends MgFormBase {
|
|
856
838
|
finally {
|
857
839
|
this._inRefreshDisp = false;
|
858
840
|
}
|
859
|
-
if (refreshType === Constants.TASK_REFRESH_CURR_REC && (!super.isLineMode() || this._tableRefreshed))
|
841
|
+
if (refreshType === Constants.TASK_REFRESH_CURR_REC && (!super.isLineMode() || this._tableRefreshed)) {
|
860
842
|
this.FormRefreshed = true;
|
843
|
+
Commands.addNoParameters(CommandType.SET_WC_IDLE, this);
|
844
|
+
}
|
861
845
|
return true;
|
862
846
|
}
|
863
847
|
RefreshUI() {
|
@@ -1191,4 +1175,4 @@ export class MgForm extends MgFormBase {
|
|
1191
1175
|
}
|
1192
1176
|
MgForm.TIME_LIMIT = 50;
|
1193
1177
|
MgForm._createdForms = new CreatedFormVector();
|
1194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sYUFBYSxFQUNiLElBQUksRUFDSixRQUFRLEVBQ1IsWUFBWSxFQUViLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sRUFBVyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWpFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQU03QyxNQUFNLE9BQU8sTUFBTyxTQUFRLFVBQVU7SUFvQnBDO1FB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QWdCO1FBQzNCLE9BQU8sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztJQUNoRSxDQUFDO0lBRUQsV0FBVyxDQUFDLFNBQWlCO1FBQzNCLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztJQUNqRSxDQUFDOztBQTN4RGMsaUJBQVUsR0FBVyxFQUFFLENBQUM7QUFZaEMsb0JBQWEsR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBDb21tYW5kVHlwZSxcclxuICBDb250cm9sVGFibGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUm93XHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFByaW9yaXR5LFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXIsXHJcbiAgaXNOdWxsT3JVbmRlZmluZWRcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbn0gZnJvbSAnLi4vZGF0YS9SZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uJztcclxuaW1wb3J0IHtEYXRhVmlldywgU0VUX0RJU1BMQVlMSU5FX0JZX0RWfSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tICcuLi9yZW1vdGUvU2VydmVyRXJyb3InO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxmb3JtPi4uLjwvZm9ybT5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIE1nRm9ybSBleHRlbmRzIE1nRm9ybUJhc2Uge1xyXG4gIHByaXZhdGUgc3RhdGljIFRJTUVfTElNSVQ6IG51bWJlciA9IDUwOyAvLyB0aW1lIGxpbWl0IGZvciBvbmUgdHJhbnNmZXIgb3BlcmF0aW9uIChpbiBtaWxsaSBzZWNvbmRzKVxyXG4gIElzTW92aW5nSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJldkRpc3BsYXlMaW5lOiBudW1iZXIgPSAwOyAvLyBkaXNwbGF5IGlkZW50aWZpZXIgb2YgcHJldiBsaW5lXHJcbiAgUmVmcmVzaEFsbFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgSWdub3JlRmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1vdmVkVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIG1vdmUgdG8gZmlyc3QgY29udHJvbCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGZvcm1cclxuXHJcbiAgcHJpdmF0ZSBfc3VmZml4RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGhpZGRlbkNvbnRyb2xzSXNuc0xpc3Q6IExpc3Q8bnVtYmVyPiA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBfY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IG5ldyBDcmVhdGVkRm9ybVZlY3RvcigpO1xyXG5cclxuICAvL1RPRE86IE1heWJlIHRoZSBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBsaWtlIGFsbG93RmllbGRDb21wdXRlXHJcbiAgcHJpdmF0ZSBfdHJhbnNmZXJyaW5nRGF0YVRvR1VJOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaXNGZXRjaGluZ1JlY29yZHNBaGVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IENyZWF0ZWRGb3JtcygpOiBDcmVhdGVkRm9ybVZlY3RvciB7XHJcbiAgICByZXR1cm4gTWdGb3JtLl9jcmVhdGVkRm9ybXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5SZXN0b3JlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVzdG9yZTtcclxuICB9XHJcblxyXG4gIGdldCBUcmFuc2ZlcnJpbmdEYXRhVG9HVUkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgIGxldCBwcm9wID0gdGhpcy5fdGFibGVNZ0NvbnRyb2wuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRCk7XHJcblxyXG4gICAgICByZXR1cm4gKHByb3AgIT0gbnVsbCA/IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSA6IGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgICB0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSB0YXNrIGRhdGF2aWV3LCBpZiB0aGUgdGFzayBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSB0YXNrIGRhdGF2aWV3PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0RGF0YXZpZXcoKTogRGF0YVZpZXcge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgIT0gbnVsbClcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuXHJcbiAgICByZXR1cm4gKGR2KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG1vdmVJblZpZXcodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZywgcmV0dXJuVG9DdHJsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHJldHVyblRvQ3RybCkpXHJcbiAgICAgIGF3YWl0IHRoaXMubW92ZUluVmlld18wKHVuaXQsIGRpcmVjdGlvbik7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMubW92ZUluVmlld18xKHVuaXQsIGRpcmVjdGlvbiwgcmV0dXJuVG9DdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG1vdmVJblZpZXdfMCh1bml0OiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm1vdmVJblZpZXcodW5pdCwgZGlyZWN0aW9uLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVyblRvQ3RybFwiPnNob3VsZCB0aGUgY3Vyc29yIHJldHVybiB0byB0aGUgbGFzdCBwYXJrZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBtb3ZlSW5WaWV3XzEodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZywgcmV0dXJuVG9DdHJsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gICAgbGV0IHJldHVyblRvVmlzaWJsZUxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNvcmRPdXRPZlZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB2aXNpYmxlTGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gdHJ1ZTtcclxuICAgICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgICAgLy8gdGFibGUgbW92ZW1lbnRzIChmaXJzdCAvIGxhc3QgcmVjb3JkKVxyXG4gICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBCRUdJTklORyBPRiBUQUJMRVxyXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgoQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRU5EIE9GIFRBQkxFXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQsIHRydWUsIGZhbHNlLCB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSArIDEpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPj0gMClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFnZSBhbmQgcm93IG1vdmVtZW50c1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlY29yZHMgdG8gc2tpcFxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJiB0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORDpcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGxhc3Q6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxO1xyXG4gICAgICAgICAgICAgIGxhc3QgPSBNYXRoLm1pbihsYXN0LCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IGxhc3QgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHJldHVyblRvVmlzaWJsZUxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHNpemUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzaXplID0gMTtcclxuXHJcbiAgICAgICAgc2l6ZSA9IChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWIHx8XHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTlxyXG4gICAgICAgICAgPyAtc2l6ZVxyXG4gICAgICAgICAgOiBzaXplKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA8IDApIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSAwO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nIHRoZSB0YWJsZSBvbmUgcGFnZSBvciBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKSB8fFxyXG4gICAgICAgICAgICB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB2aXNpYmxlTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmIHZpc2libGVMaW5lID09PSAwKSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBwcmV2aW91cyByb3cgYnV0IHdlIGFyZSBhdCB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJlxyXG4gICAgICAgICAgICAgICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyB8fCB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UpICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIG5leHQgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGxhc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgc2l6ZSk7XHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZCh0cnVlKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0aGlzLl9zdWZmaXhEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5NTQ5Njogd2hlbiB0aGUgcmVjb3JkIHN1ZmZpeCBmYWlsZWQgZ28gYmFjayB0byB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQgIT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHModGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5MjEwMTogaWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgdGhlIHJlYyBzdWZmaXhcclxuICAgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGV4ZWN1dGVkIHNvIHdlIG11c3QgaGFuZGxlIGl0IGJlZm9yZSB3ZSBnbyB0byBhIG5ldyByb3dcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlY0lkOiBudW1iZXIgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlY0lkID09PSBvbGRSZWNJZCAmJiAhdGhpcy5fc3VmZml4RG9uZSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSIDc1ODYzOVxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5nZXRMYXN0VmFsaWRSb3coKSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIG1vdmluZyB0aGUgbWFya2luZyBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIG9sZFRhc2tNb2RlID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCB3YXMgZGVsZXRlZCBpbiBSdW4gVGltZSBieSBGb3JjZSBEZWxldGUgZm9yIGV4YW1wbGVcclxuICAgICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwIHx8IG9sZFRhc2tNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IC0xIHx8ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHMob2xkRGlzcGxheUxpbmUpKVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI5MzY2OFxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInNraXBwZWQgc2V0Y3VyclJvdyBmb3Igcm93IHswfVwiLCBvbGREaXNwbGF5TGluZSkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogaWYgZXZlcnl0aGluZyBpcyBPSywgY3VyciByZWMgd2lsbCBsYXRlciBiZSByZWZyZXNoZWQgaW5cclxuICAgICAgICAgICAgICAgIC8vIFJFQ19QUkVGSVhcclxuICAgICAgICAgICAgICAgIC8vIHRodXMsIHJlZnJlc2ggb25seSBpbiBjYXNlIG9mIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBlcnJvciBpcyBiZWNhdXNlIHRoZSBvbGQtcmVjIHdhcyByZW1vdmVkIChjYW5jZWxFZGl0J2VkKSwgc28gcmVmcmVzaCBmb3JtLlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzc3NTMwOTogaWYgbGVhdmluZyB0aGUgbmV3IGNyZWF0ZWQgcmVjb3JkIGZhaWxlZCB0aGVuIHJlc3RvcmVcclxuICAgICAgICAgICAgICAgICAgLy8gYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBhIG5ldyByZWNvcmQgc28gdGhlIG5leHQgYWN0aW9uIHdvdWxkXHJcbiAgICAgICAgICAgICAgICAgIC8vIFwia25vd1wiIHRoYXQgaXQgaXMgc3RpbGwgYSBuZXcgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgIyA4MTYyNyA6IElmIHRhc2sgaXMgaGF2aW5nIGEgc3ViZm9ybSwgdGhlbiB3aGlsZSBtb3ZpbmcgdG8gc3ViZm9ybSwgbmV3bHkgY3JlYXRlZCByZWNvcmRcclxuICAgICAgICAgICAgICAgICAgLy8gaXMgc3luY2VkIGFuZCBpdCBpcyBpbnNlcnRlZCBpbiBfbW9kaWZpZWRUYWIgYXMgJ2luc2VydCcgcmVjb3JkLiBTbywgYW55IHJlcXVlc3QgdG8gc2VydmVyIGluc2VydHNcclxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRvIHNlcnZlci4gRXZlbiBpZiB3ZSBkb250IGdvIHRvIHNlcnZlciwgaXQgaXMgdGhlcmUgaW4gX21vZGlmaWVkVGFiIGFzIG5ldyByZWNvcmQuIEluc2VydGluZ1xyXG4gICAgICAgICAgICAgICAgICAvLyBoZXJlIGFscmVhZHkgc3luY2VkIHJlY29yZCBjYXVzZXMgaW5zZXJ0aW9uIG9mIHJlY29yZCB0d2ljZS4gU28sIElmIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBzeW5jZWQgdGhlbiBvbmx5IGluc2VydC5cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghY3VyclJlYy5TeW5jZWQgJiYgb2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTgwNTI4OiBSZWZyZXNoIHRoZSBjdXJyZW50IHJvdyBhZnRlciBjYW5jZWwgZWRpdCB0byByZWZsZWN0XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN0b3JlZCB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQgYnVnICM6OTQxNzYzLCB3aGlsZSBjcmVhdGUgaXNuJ3QgYWxsb3dlZCBuZWVkIHRvIGRvIHN1ZmZpeCBhbmQgcHJlZml4IG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGRvUmVjb3JkU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCByZWZkb1JlY29yZFN1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9SZWNvcmRTdWZmaXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgoPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIHJlZmRvUmVjb3JkU3VmZml4KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGhpcy5fdGFzayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkb1JlY29yZFN1ZmZpeCA9IHJlZmRvUmVjb3JkU3VmZml4LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGUgZm9ybSBkb2VzIG5vdCBoYXZlIGEgdGFibGUsIG1vdmUgdG8gb25lIHJvdyBpbiB0aGUgY2hvc2VuIERpcmVjdGlvblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICsgc2l6ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnN0b3AoKTtcclxuICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXR1cm5Ub1Zpc2libGVMaW5lKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZE91dE9mVmlldykge1xyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID09PSAwKVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlKTtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB2aXNpYmxlTGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuICAgICAgaWYgKHJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBjdXJzb3JNb3ZlZDogYm9vbGVhbiA9IGF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgaWYgKCFjdXJzb3JNb3ZlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRoaXMuX3Rhc2spO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcblxyXG4gICAgICB0aGlzLlNlbGVjdFJvdygpO1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHJlY29yZCB0byB0aGUgZm9ybSBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGFkZFJlYyhkb1N1ZmZpeDogYm9vbGVhbixpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG5ld0xpbmU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgY3VyckxpbmU6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgY3VyckxpbmUgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcblxyXG4gICAgLy8gSW5jcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgYWRkZWQgaW50byB0aGUgdmlldy5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgIHtcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ICs9IDE7XHJcbiAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdSZWNJZHg6IG51bWJlciA9IGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5hZGRSZWNvcmQoZG9TdWZmaXgsIGZhbHNlLCBpc0NyZWxpbmVBYm92ZSk7XHJcblxyXG4gICAgaWYgKG5ld1JlY0lkeCA+IC0xKSB7XHJcbiAgICAgIC8vIGZvcm1zIHdpdGggYSB0YWJsZVxyXG4gICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAvLyB0aGVyZSBhcmUgbm8gcmVjb3JkcyBpbiB0aGUgdGFibGUgc28gdGhlIG5ldyByb3cgaXMgY3JlYXRlZCBhZnRlclxyXG4gICAgICAgIC8vIHNldHRpbmcgdGhlIHRvcCByZWNvcmQgdG8gMCBhbmQgdGhlIGN1cnJlbnQgcm93IHRvIDBcclxuICAgICAgICBsZXQgbmV3Q3VyclJvdzogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID09PSAwIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICBuZXdDdXJyUm93ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIGN1cnNvciBpcyBwYXJraW5nIG9uIHRoZSBsYXN0IHJvdyBvZiB0aGUgZGlzcGxheWVkIHRhYmxlIHNvIHRoZVxyXG4gICAgICAgIC8vIG5ldyByb3cgaXMgY3JlYXRlZCBhZnRlciBpbmNyZW1lbnRpbmcgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAgICAgICBlbHNlIGlmIChjdXJyTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEpIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgMSk7XHJcbiAgICAgICAgICBuZXdDdXJyUm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRvcCByZWNvcmRcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKGlzQ3JlbGluZUFib3ZlKVxyXG4gICAgICAgICAgICBuZXdDdXJyUm93ID0gY3VyckxpbmUgPiAwID8gY3VyckxpbmUgOiAwO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBuZXdDdXJyUm93ID0gY3VyckxpbmUgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG5ld0xpbmUgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93O1xyXG5cclxuICAgICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgbmV3Q3VyclJvdyk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0xpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmVcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmFkZFJlYygpIHswfVwiLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgLT0gMTtcclxuICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRlbGV0ZSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRlbEN1cnJSZWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG9wVGFibGVSb3c6IGJvb2xlYW4gPSBzdXBlci5pc0xpbmVNb2RlKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5yZW1vdmVDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlYyhmYWxzZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl90YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyBjaGFuZ2UgdG8gY3JlYXRlIG1vZGVcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICAgICAgLy8gTUdfQUNUX0NSRUxJTkUgbWF5IGJlIGRpc2FibGVkIC5pLmUuIFBST1BfVFlQRV9BTExPV19DUkVBVEUgZXhwcmVzc2lvbiBjYW4gYmUgY2hhbmdlZFxyXG4gICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBvd25lclRhc2tcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmICh0b3BUYWJsZVJvdylcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQtLTtcclxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2NyZWVuIG1vZGVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FuY2VsIHRoZSBlZGl0aW5nIG9mIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgcmVzdG9yZSB0aGUgb2xkIHZhbHVlcyBvZiB0aGUgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2FuY2VsXCI+dHJ1ZSBpZiBjYWxsZWQgZm9yIEFDVF9DQU5DRUwsIGZhbHNlIG90aGVyd2lzZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRFdmVudFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgY2FuY2VsRWRpdChpc0FjdENhbmNlbDogYm9vbGVhbiwgaXNRdWl0RXZlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtb2RlOiBzdHJpbmcgPSB0aGlzLl90YXNrLmdldE1vZGUoKTtcclxuICAgIGxldCBuZXdNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgcm93OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV4ZWNSZWNQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBXZSByZXR1cm4gdG8gY3JlYXRlIG1vZGUgb25seSBpZiB0aGVyZSBpcyBubyByZWNvcmQgdG8gZ28gdG8gYWZ0ZXIgdGhlIGNhbmNlbCBhY3Rpb25cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID09PSAxICYmIG1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICBuZXdNb2RlID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEU7XHJcbiAgICBlbHNlXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWTtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIC8vIDk5NzA3MyAmIDkzMTAyMS5cclxuICAgIC8vIEV4cGVjdGVkIGJlaGF2aW9yIGR1cmluZyBjYW5jZWwgZXZlbnQsIGZvciBhIG5ldyByZWNvcmQ6XHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgb3duZXJUYXNrIG1vZGUgaXMgbm90IGNyZWF0ZSwgZGVsZXRlIHRoZSBuZXcgcmVjb3JkIGFuZCBnbyBiYWNrIHRvIHRoZSBwcmV2aW91cyByZWNvcmQuXHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgb3duZXJUYXNrIG1vZGUgaXMgY3JlYXRlLCBzdGF5IG9uIHRoZSBuZXcgcmVjb3JkLlxyXG5cclxuICAgIC8vIGR2LmNhbmNlbEVkaXQoKSByZW1vdmVzIHRoZSBuZXcgcmVjb3JkIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gU28sIGluIGNhc2Ugb2Ygb3JnVGFza01vZGU9Qywgc2luY2Ugd2Ugd2FudCB0byBzdGF5IG9uIHRoZSBuZXcgcmVjb3JkLCB3ZSBuZWVkIHRvIHJlLWNyZWF0ZSBhIHJlY29yZC5cclxuXHJcbiAgICAvLyBCdXQgYXMgc2FpZCwgZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgT05MWSB1bmRlciBzb21lIGNvbmRpdGlvbi5cclxuICAgIC8vIFRoZSBjb25kaXRpb24gaXMgYXMgZm9sbG93czpcclxuICAgIC8vIFRoZSByZWNvcmQgaXMgcmVtb3ZlZCBvbmx5IGlmIHRoZSBkdiBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxLiBTbywgaWYgdGhlIGR2IHNpemUgaXMgMSwgZHYuY2FuY2VsRWRpdCgpXHJcbiAgICAvLyBkb2VzIG5vdCByZW1vdmUgdGhlIHJlY29yZCBhbmQgaGVuY2UgaW4gdGhpcyBjYXNlLCBmb3JtLmNhbmNlbEVkaXQoKSBzaG91bGQgbm90IGNyZWF0ZSBhIG5ldyByZWNvcmQuXHJcbiAgICAvLyBGb3IgdGhpcyByZWFzb24sIHRoZSBzaWduYXR1cmUgb2YgZHYuY2FuY2VsRWRpdCgpIGlzIGNoYW5nZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgcmVjb3JkIHdhcyByZW1vdmVkIG9yIG5vdC5cclxuXHJcbiAgICAvLyBUaGlzIGlzIG9uZSBwYXJ0LlxyXG5cclxuICAgIC8vIE5vdywgYWZ0ZXIgY2FuY2VsRWRpdCwgUlAgaGFzIHRvIGJlIGV4ZWN1dGVkLiBUaGlzIHdhcyBkb25lIGluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwuXHJcbiAgICAvLyBCdXQgd2hhdCBoYXBwZW5zIGlzLCBpZiBmb3JtLmNhbmNlbEVkaXQoKSBjcmVhdGVkIGEgbmV3IGxpbmUsIFJQIHdhcyBhbHJlYWR5IGV4ZWN1dGVkIGZyb20gdGhlcmUuIEFuZCBmcm9tXHJcbiAgICAvLyBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKSwgUlAgaXMgZXhlY3V0ZWQgZm9yIHRoZSBzZWNvbmQgdGltZS5cclxuICAgIC8vIFNvLCBtb3ZlZCB0aGUgY29kZSBvZiBleGVjdXRpbmcgUlAgZnJvbSBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKS0+Y2FzZSBNR19BQ1RfQ0FOQ0VMIHRvIGZvcm0uY2FuY2VsRWRpdCgpXHJcbiAgICAvLyBhbmQgdGhhdCB3aWxsIGJlIGRvbmUgb25seSBpZiB0aGUgY3JlYXRlIGxpbmUgd2FzIG5vdCBleGVjdXRlZC5cclxuXHJcbiAgICAvLyBOb3csIHdlIGhhdmUgb25lIG1vcmUgaXNzdWUuXHJcblxyXG4gICAgLy8gVW50aWwgbm93LCB0aGUgUlAgd2FzIGV4ZWN1dGVkIGFmdGVyIGZvcm0uY2FuY2VsRWRpdCgpLlxyXG4gICAgLy8gU28sIHdoZW4gdGhlIGNvZGUgaXMgbW92ZWQgdG8gZm9ybS5jYW5jZWxFZGl0KCksIGl0IHNob3VsZCBiZSB0aGUgbGFzdCB0aGluZyB0byBiZSBleGVjdXRlZC5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIGxldCByZWNSZW1vdmVkOiBib29sZWFuID0gYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRQcmV2Q3VyclJlYyhudWxsKTtcclxuICAgIGlmICgodGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSB8fCAoKGlzQWN0Q2FuY2VsICYmIHJlY1JlbW92ZWQpICYmICghR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U3BlY2lhbENhbmNlbE9uQ3JlYXRlKCkpJiYoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICAvLyBTZXQgQ2FuY2VsIGluZGljYXRpb24gb24gdGhlIHRhc2sgZm9yIHRvIG5vdCBwZXJmb3JtIGNvbnRyb2wgdmFsdWUgdmFsaWRhdGlvbiBpbiB0aGUgQ3JlYXRlIGxpbmUgYWN0aW9uLlxyXG4gICAgICBsZXQgb3JnQ2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRDYW5jZWxXYXNSYWlzZWQoaXNBY3RDYW5jZWwpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChvcmdDYW5jZWxXYXNSYWlzZWQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNBY3RDYW5jZWwpXHJcbiAgICAgIGV4ZWNSZWNQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIHRoZSBlbXB0aW5lc3Mgb2YgdGhlIERWIG11c3QgYmUgY2hlY2tlZCBhZ2FpbiBiZWNhdXNlIHRoZSBcImNyZWF0ZSBsaW5lXCIgbWF5IGZhaWxcclxuICAgIGlmICghdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSkge1xyXG4gICAgICBpZiAoc3VwZXIuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgICAgaWYgKHJvdyA8IDAgfHwgcm93ID49IHRoaXMuX3Jvd3NJblBhZ2UpIHtcclxuICAgICAgICAgICAgICBsZXQgdG9wUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgaWYgKHRvcFJlY0lkeCA+IGN1cnJSZWNJZHgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGN1cnJSZWNJZHgpO1xyXG4gICAgICAgICAgICAgIHJvdyA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyByb3csIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBzaG91bGQgcmVhbGx5IGJlIGNhdWdodCBoZXJlLlxyXG4gICAgICAgICAgICBpZiAocm93ICE9PSAwKVxyXG4gICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gRm9ybS5jYW5jZWxFZGl0KCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpICYmIHJlY1JlbW92ZWQpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudC0tO1xyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2NyZWVuIG1vZGVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIHRydWUsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImluIEZvcm0uY2FuY2VsRWRpdCgpIGVycm9yIGluIFNjcmVlbiBtb2RlIGZvciBDdXJyZW50IFJlY29yZFwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShuZXdNb2RlKTtcclxuICAgICAgaWYgKCEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaylcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcblxyXG4gICAgICBpZiAoISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV4ZWNSZWNQcmVmaXgpIHtcclxuICAgICAgLy8gUUNSICM5MjU2NDYsICM0NTQxNjc6IGV4aXQgdG8gdGhlIG93bmVyVGFzayBsZXZlbCBpbiBvcmRlciB0byBza2lwIGNvbnRyb2wgc3VmZml4XHJcbiAgICAgIC8vIGFuZCByZWNvcmQgc3VmZml4IG9mIHRoZSBjYW5jZWxlZCBuZXcgcmVjb3JkIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGVcclxuICAgICAgLy8gbmV4dCByZWNvcmQgcGVyZml4IHdvdWxkIGJlIGV4ZWN1dGVkXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIC8vIHdlIHJvbGxiYWNrIGEgcGFyZW50IG93bmVyVGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vb3duZXJUYXNrLiBXZSBkbyBub3Qgd2FudCB0aGUgY3RybCBvbiB0aGUgc3ViZm9ybSB0byBkbyBjdHJsIHN1ZmZpeC5cclxuICAgICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICgoPFRhc2tCYXNlPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLnBhdGhDb250YWlucyg8VGFza0Jhc2U+dGhpcy5fdGFzaykpXHJcbiAgICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSA8VGFza0Jhc2U+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICAgICAgICAgcGFyZW50ICE9PSBudWxsICYmIHBhcmVudCAhPT0gdGhpcy5fdGFzaztcclxuICAgICAgICAgICAgICAgcGFyZW50ID0gPFRhc2tCYXNlPnBhcmVudC5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICBwYXJlbnQuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICAgICgoPERhdGFWaWV3PnBhcmVudC5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzUXVpdEV2ZW50KSB7XHJcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgZm9sbG93aW5nIDIgbGluZXMgY2FuIGJlIG1lcmdlZCBpbiBvbmUgbWV0aG9kXHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKHRoaXMuX3Rhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2NhbiBhbGwgY29udHJvbHMgaW4gdGhlIGZvcm0uIEV2ZXJ5IGNvbnRyb2wgd2hpY2ggaGFzIGEgcHJvcGVydHkgdGhhdCBpcyBhbiBleHByZXNzaW9uIHdpbGwgYmVcclxuICAvLy8gICByZWZyZXNoZWQuIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhlIGNvbnRyb2wncyBkaXNwbGF5IGlzIHN5bmNoZWQgd2l0aCB0aGUgZXhwcmVzc2luJ3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hPbkV4cHJlc3Npb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSAoKHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpIGluc3RhbmNlb2YgTWdDb250cm9sKSA/IDxNZ0NvbnRyb2w+dGhpcy5DdHJsVGFiLmdldEN0cmwoaSkgOiBudWxsKTtcclxuXHJcbiAgICAgIGlmIChtZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgICBhd2FpdCBtZ0NvbnRyb2wucmVmcmVzaE9uRXhwcmVzc2lvbigpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIHJlZnJlc2ggdGhlIGZvcm0gcHJvcGVydGllc1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaFByb3BzT25FeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGNvbnRyb2xzIG9mIHRoaXMgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmc1RvQ3RybHMoKTogdm9pZCB7XHJcbiAgICAvLyBpZiBsYXN0IGZvY3VzZWQgY29udHJvbCB3YXMgZnJvbSB0aGlzIHRhc2sgLSB6ZXJvIGl0LlxyXG4gICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCAmJiBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0Rm9ybSgpID09PSB0aGlzKVxyXG4gICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKDxUYXNrQmFzZT50aGlzLl90YXNrLCBudWxsKTtcclxuXHJcbiAgICBzdXBlci5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgY29udHJvbCB3aXRoIGEgZ2l2ZW4gbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPnRoZSBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxCeUN0cmxOYW1lKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIDxNZ0NvbnRyb2w+dGhpcy5DdHJsVGFiLmdldEN0cmwoY3RybE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgc3ViZm9ybSBjb250cm9sIHdpdGggdGhlIHR5cGVkIG5hbWUgZnJvbSBhbGwgcGFyZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPiB0aGUgcmVxdWVzdGVkIHN1YmZvcm0gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRTdWJGb3JtQ3RybEJ5TmFtZShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIGxldCBndWlQYXJlbnRUYXNrOiBUYXNrQmFzZTtcclxuICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGd1aVBhcmVudFRhc2sgPSA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuICAgICAgICAgZGVzdFN1YkZvcm0gPT09IG51bGwgJiYgZ3VpUGFyZW50VGFzayAhPT0gbnVsbCAmJiBndWlQYXJlbnRUYXNrLmdldEZvcm0oKSAhPT0gbnVsbDtcclxuICAgICAgICAgZ3VpUGFyZW50VGFzayA9IGd1aVBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgZGVzdFN1YkZvcm0gPSA8TWdDb250cm9sPmd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY3RybE5hbWUsIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICBpZiAoZGVzdFN1YkZvcm0gPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghZ3VpUGFyZW50VGFzay5Jc1N1YkZvcm0gfHwgTlN0cmluZy5FcXVhbHMoZ3VpUGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKS5OYW1lLCBjdHJsTmFtZSwgdHJ1ZSkpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkZXN0U3ViRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHN1ZmZpeERvbmUgcGFyYW1ldGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN1ZmZpeERvbmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWZmaXhEb25lID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldERlc3RpbmF0aW9uUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdFRibFJvdztcclxuICB9XHJcblxyXG4gIHNldFN1YkZvcm1DdHJsKHN1YkZvcm1DdHJsOiBNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLl9zdWJGb3JtQ3RybCA9PT0gbnVsbCAmJiBzdWJGb3JtQ3RybCAhPT0gbnVsbCk7XHJcbiAgICB0aGlzLl9zdWJGb3JtQ3RybCA9IHN1YkZvcm1DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBzdWJmb3JtIGNvbnRyb2wgdGhhdCBwb2ludHMgdG8gYSB0YXNrIHdob3NlIGlkIGlzIGdpdmVuIGluIHRhc2tJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj50aGUgaWQgb2YgcmVxdWVzdGVkIHN1YmZvcm0gb3duZXJUYXNrPC9wYXJhbT5cclxuICBnZXRTdWJGb3JtQ3RybEZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN1cnI6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcGFyZW50Q3RybFRhYjogQ29udHJvbFRhYmxlO1xyXG4gICAgbGV0IGd1aVBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGZvciAoZ3VpUGFyZW50Rm9ybSA9IHRoaXM7IGd1aVBhcmVudEZvcm0gIT0gbnVsbDsgZ3VpUGFyZW50Rm9ybSA9IGd1aVBhcmVudEZvcm0uUGFyZW50Rm9ybSkge1xyXG4gICAgICBwYXJlbnRDdHJsVGFiID0gZ3VpUGFyZW50Rm9ybS5DdHJsVGFiO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFyZW50Q3RybFRhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIGN1cnIgPSAoKHBhcmVudEN0cmxUYWIuZ2V0Q3RybChpKSBpbnN0YW5jZW9mIE1nQ29udHJvbCkgPyA8TWdDb250cm9sPnBhcmVudEN0cmxUYWIuZ2V0Q3RybChpKSA6IG51bGwpO1xyXG4gICAgICAgIGlmIChjdXJyICE9IG51bGwgJiYgY3Vyci5pc1N1YmZvcm0oKSAmJiAoY3Vyci5nZXRTdWJmb3JtVGFza0lkKCkgIT0gbnVsbCkpXHJcbiAgICAgICAgICBpZiAoY3Vyci5nZXRTdWJmb3JtVGFza0lkKCkgPT09IHRhc2tJZCkge1xyXG4gICAgICAgICAgICBkZXN0U3ViRm9ybSA9IGN1cnI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGVzdFN1YkZvcm0gIT0gbnVsbClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBkZXN0U3ViRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNyZWF0ZSByZWNvcmRzIGJldHdlZW4gaWR4IGFuZCBlbmQgb2YgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICByZW1vdmVSZWNvcmRzQWZ0ZXJJZHgoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByZW1vdmVBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBpbiBzb21lIGNhc2VzIGludmlzaWJsZSAtMSByb3cgKHRoYXQgZXhpc3Qgb25seSBmb3Igc2Nyb2xsYmFyIGVmZmVjdHMpIGJlY29tZXMgdmlzaWJsZS5cclxuICAgIC8vIFRvIHByZXZlbnQgdGhpcyB3ZSdsbCByZW1vdmUgYWxsIHJlY29yZHMuIFRoaXMgd2lsbCBub3QgY2F1c2UgcGVyZnJvbWFuY2UgcHJvYmxlbXMgc2luY2VcclxuICAgIC8vIHdlIHdpbGwgYWRkIG1heGltdW0gcm93SW5QYWdlIHJlY29yZHMgbW9yZSB0aGVuIHdlIGludGVuZGVkIGluIHRoZSBiZWdpbmluZ1xyXG5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKVxyXG4gICAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGlkeCA8PSB0aGlzLl9yb3dzSW5QYWdlICsgMSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID4gdGhpcy5fcm93c0luUGFnZSlcclxuICAgICAgICBpZHggPSAwO1xyXG4gICAgICBpZiAoaWR4ID09PSAwKVxyXG4gICAgICAgIHJlbW92ZUFsbCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgIHN1cGVyLlNldFRhYmxlSXRlbXNDb3VudChpZHgsIHJlbW92ZUFsbCk7XHJcbiAgICAgIC8vIHVwZGF0ZXMgdGFibGUgaXRlbSdzIGNvdW50XHJcblxyXG4gICAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHJvdyBpcyB2YWxpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNSb3dWYWxpZGF0ZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeCB8fCBpZHggPCAwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgcm93ID0gPFJvdz50aGlzLlJvd3MuZ2V0X0l0ZW0oaWR4KTtcclxuICAgIGlmIChyb3cgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHJvdy5DcmVhdGVkICYmIHJvdy5WYWxpZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcnVucyBpbiBXb3JrZXIgdGhyZWFkIHdoZW4gdGhlIHRocmVhZCBpcyBmcmVlIGFuZCBzZW5kIHRvIEdVSSB0aHJlYWQgY29udHJvbHMgZGF0YSBvZiBhbGwgcm93c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgdHJhbnNmZXJEYXRhVG9HdWkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBtYXhUaW1lOiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpICsgTWdGb3JtLlRJTUVfTElNSVQ7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJlbnRFZGl0aW5nQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2w7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgICAgLy8gdGhpcyBsaW1pdGF0aW9uIGlzIG5lZWRlZCBzbyB0aGlzIHJlcXVlc3Qgd2lsbCBuZXZlciB0YWtlIHRvbyBtdWNoIHRpbWVcclxuICAgICAgd2hpbGUgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgPCBtYXhUaW1lICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ICsgMSA+PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgLy8gYWxsIHJvd3MgYWxyZWFkeSBzZW50XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSAmJiB0aGlzLl9sYXN0Um93U2VudCArIDEgPj0gdGhpcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xhc3RSb3dTZW50Kys7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKHRoaXMuX2xhc3RSb3dTZW50KSkge1xyXG4gICAgICAgICAgLy8gcm93IG5lZWRzIHRvIGJlIHNlbnRcclxuICAgICAgICAgIC8vIHNlbmQgcm93IGRhdGFcclxuICAgICAgICAgIHN1cGVyLmNoZWNrQW5kQ3JlYXRlUm93KHRoaXMuX2xhc3RSb3dTZW50KTtcclxuICAgICAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCAhPT0gc2F2ZVJvd0lkeCkge1xyXG4gICAgICAgICAgICBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDsgLy8gcmVzZXQgdGhlIGZsYWdcclxuICAgICAgICAgICAgLy8gaXJyZWxldmFudCBmb3IgdHJlZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuX2xhc3RSb3dTZW50LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHJlc3RvcmUgcHJldmlvdXMgY3VycmVudCByZWNvcmRcclxuICAgICAgaWYgKHVwZGF0ZWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCwgYmtwUmVjb3JkKTtcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IGN1cnJlbnRFZGl0aW5nQ29udHJvbDsgLy8gc2V0IHRoZSBmbGFnIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIHRoaXMuX3RyYW5zZmVyaW5nRGF0YSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGFueSByb3dzIG5lZWQgdG8gYmUgc2VudCB0byBHVUkgdGhyZWFkXHJcbiAgLy8vICAgaWYgdGhlcmUgYXJlLCBwdXRzIGV2ZW50IGluIGV2ZW50IHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmIHRoaXMuT3BlbmVkICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpO1xyXG4gICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgPj0gdGhpcy5Sb3dzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIHdoZW4gd2UgZGVjcmVhc2Ugc2l6ZSBvZiByb3dzIGFycmF5IGFkanVzdCBsYXN0Um93U2VudFxyXG4gICAgICAgIHRoaXMuX2xhc3RSb3dTZW50ID0gdGhpcy5Sb3dzLmxlbmd0aCAtIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHRoZXJlIGFyZSByb3dzIHRvIHNlbmQgYW5kIHRoZXJlIGlzIG5vdyByZXF1ZXN0IGZvciByb3dzIHlldFxyXG4gICAgICAvLyBhZGQgcmVxdWVzdCBmb3Igcm93c1xyXG4gICAgICBsZXQgdHJhbnNmZXJEYXRhVG9HdWk6IGJvb2xlYW4gPSB0aGlzLl9sYXN0Um93U2VudCA8IChzaXplIC0gMSk7XHJcblxyXG4gICAgICAvLyBGb3IgcGFnaW5hdGVkIHRhYmxlIGNoZWNrIHRoZSBtYXggcm93cyBvZiBHVUkgdGFibGUgY29udHJvbC5cclxuICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkgJiYgKHRoaXMuX2xhc3RSb3dTZW50ICsgMSkgPj0gdGhpcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpKVxyXG4gICAgICAgIHRyYW5zZmVyRGF0YVRvR3VpID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodHJhbnNmZXJEYXRhVG9HdWkgJiYgIXRoaXMuX3RyYW5zZmVyaW5nRGF0YSkge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eSh0aGlzLl90YWJsZU1nQ29udHJvbCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RWX1RPX0dVSSwgUHJpb3JpdHkuTE9XRVNUKTtcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcmluZ0RhdGEgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc2hvdWxkRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyICYmICF0cmFuc2ZlckRhdGFUb0d1aSAmJiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSB8fCAhdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSkpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkodGhpcy5fdGFibGVNZ0NvbnRyb2wsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GRVRDSF9SRUNPUkRTX0FIRUFEX0ZST01fU0VSVkVSLCBQcmlvcml0eS5MT1dFU1QpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByb3cgZGF0YSBmb3IgdGhlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzaXJlZFRvcEluZGV4XCI+ZGVzaXJlZCB0b3AgaW5kZXggaWYgZGVzaXJlZFRvcEluZGV4IGlzIEludGVnZXIuTUlOX1ZBTFVFLCB0b3AgaW5kZXggaXMgY2VjaWV2ZWQgZm9ybSBkdjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3JkcywgZXZlbiBpZiB0aGV5IGFyZSBjcmVhdGVkIGFuZCB2YWxpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4gKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBkaWZmOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGdldFByZXZDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGdldE5leHRDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZGVzaXJlZFRvcEluZGV4ICE9PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAoZGVzaXJlZFRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgcmVxdWVzdCBmb3IgbGluZSBvciBwYWdlIGJlZm9yZSBjdXJyZW50IGNodW5rXHJcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoZSB0b3AgaW5kZXggaXMgYWx3YXlzIDBcclxuICAgICAgICBnZXRQcmV2Q2h1bmsgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZGVzaXJlZFRvcEluZGV4ICsgdGhpcy5fcm93c0luUGFnZSArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSlcclxuICAgICAgLy8gcGFnZWRvd24gb3IgYXJyb3dkb3duIGF0IGVuZCBvZiB0aGUgZGF0YXZpZXdcclxuICAgICAgICBnZXROZXh0Q2h1bmsgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBkZXNpcmVkVG9wSW5kZXggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcblxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuXHJcbiAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW0oZGlmZik7XHJcbiAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5yZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwsIHNhdmVSb3dJZHgsIGRpZmZSZWYpO1xyXG4gICAgZGlmZiA9IGRpZmZSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKChnZXRQcmV2Q2h1bmsgJiYgZGlmZiAhPT0gMCkgfHwgZ2V0TmV4dENodW5rKSB7XHJcbiAgICAgIC8vIGlmIGRpZmYgIT0gMCBhIG5ldyBjaHVuayB3YXMgYnJvdWdodCB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIGR2XHJcbiAgICAgIC8vIHNldCB0b3AgaW5kZXggdG8gZmlyc3QgcmVxdWVzdGVkIGluZGV4XHJcbiAgICAgIC8vIGlmIG5leHQgY2h1bmsgd2FzIGJyb3VnaHQsIHRvcCBpbmRleCBtYXkgYWxzbyBiZSB1cGRhdGVkXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoZGVzaXJlZFRvcEluZGV4ICsgZGlmZik7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICBpZiAodGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgLy8gaWYgdG9wIGluZGV4IHdhcyB1cGRhdGVkIGluIHRoZSBzZXRUYWJsZVRvcEluZGV4IC0gd2UgbWlnaHQgaGF2ZSByb3dzIHRoYXQgd2VyZSBub3QgcmVmcmVzaGVkXHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgIC8vIGFueSByb3cgd2FzIHVwZGF0ZWRcclxuICAgICAgLy8gcmVzdG9yZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCArIGRpZmYsIGJrcFJlY29yZCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIGFzayB0YWJsZSB0byByZWZyZXNoIHRoZSBwYWdlXHJcblxyXG4gICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICBpZiAoZ2V0UHJldkNodW5rKSB7XHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBmb2N1c2VkXHJcbiAgICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldFBhcmVudFRhYmxlKCkgPT09IHRoaXMuX3RhYmxlTWdDb250cm9sKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoZXMgcm93cyBpbiB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzYXZlUm93SWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpZmZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgc2F2ZVJvd0lkeDogbnVtYmVyLCBkaWZmUmVmOiBSZWZQYXJhbTxudW1iZXI+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZGlmZlJlZi52YWx1ZSA9IDA7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiA9IHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCk7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Jvd3NJblBhZ2U7IGkrKykge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBkZXNpcmVkVG9wSW5kZXggKyBpO1xyXG4gICAgICBsZXQgcHJldlRvcElkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIGlmIHdlIGZhaWwgdG8gZ2V0IG9uZSByZWNvcmQsIHdlIG1heSBzdWNjZWVkIHRvIGdldCB0aGUgbmV4dCBvbmVcclxuICAgICAgICBpbmRleCA9IGlkeCArIGRpZmZSZWYudmFsdWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKGlkeCkgfHwgc2VuZEFsbCB8fCB0aGlzLlJlZnJlc2hBbGxSb3dzKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMClcclxuICAgICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGlmIChzYXZlUm93SWR4ICsgZGlmZlJlZi52YWx1ZSAhPT0gaW5kZXgpIHsgLy8gbm90IGN1cnJlbnQgbGluZVxyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaW5kZXgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIGEgbmV3IGNodW5rIGlzIGJyb3VnaHQgdG9wIGluZGV4IHdpbGwgYmUgY2hhbmdlZFxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpbmRleCkpXHJcbiAgICAgICAgICAgIHN1cGVyLm1hcmtSb3dOT1RDcmVhdGVkKGluZGV4KTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gUUNSICMyNjEwNTUsIGV2ZW4gc28gcmVxdWlyZWQgcmVjb3JkIG1heSBub3QgYmUgZm91bmQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBuZXcgY2h1bmsgaGFzIGJlZW4gc2VudFxyXG4gICAgICAgIC8vIGFuZCBkaWZmIG11c3QgYmUgdXBkYXRlZFxyXG4gICAgICAgIGRpZmZSZWYudmFsdWUgPSBkaWZmUmVmLnZhbHVlICsgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAtIHByZXZUb3BJZHgpO1xyXG4gICAgICAgIHByZXZUb3BJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgaWYgKCF1cGRhdGVkICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5EYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdCwgb3JnSW5jbHVkZXNMYXN0KSlcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHJvdyBpbiB0aGUgcGFnZTwvcmV0dXJucz5cclxuICBnZXRWaXNpYmxlTGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIGN1cnJSZWNJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIHJldHVybiBjdXJyUmVjSWR4IC0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhc3NlcnRzIHRoYXQgY3VycmVudCByZWNvcmQgaXMgaW4gdGhlIHZpZXcsIGlmIGl0IGlzIG5vdCBvbiB0aGUgcGFnZSwgYWRqdXN0cyB0b3AgaW5kZXgsIHNvIHRoYXQgY3VycmVudFxyXG4gIC8vLyAgIHJlY29yZCB3aWxsIGJlIG9uIHRoZSB2aXNpYmxlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJyaW5nUmVjb3JkVG9QYWdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGxldCB0b3BJbmRleDogbnVtYmVyID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgbGV0IG5ld1RvcEluZGV4OiBudW1iZXIgPSB0b3BJbmRleDtcclxuXHJcbiAgICAgIC8vIFRhYmxlIHRvcCBpbmRleCBmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZVxyXG4gICAgICBpZiAoIXRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICBpZiAodG9wSW5kZXggPiBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0b3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxIDwgY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9yb3dzSW5QYWdlID4gMClcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4IC0gdGhpcy5fcm93c0luUGFnZSArIDE7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSB0b3AgaW5kZXggZm9yIHBhZ2luYXRlZCB0YWJsZS5cclxuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGluZGV4IG9mIGZpcnN0IHJlY29yZCBvbiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHJlY29yZCB0byBiZSBzZWxlY3RlZC5cclxuICAgICAgICBsZXQgY3Vyckd1aUlkeCA9IHRoaXMuZ2V0R3VpUm93aWR4KGN1cnJJZHgpO1xyXG4gICAgICAgIGxldCBuZXdUb3BHdWlJbmRleCA9IChjdXJyR3VpSWR4KSAtICgoY3Vyckd1aUlkeCkgJSB0aGlzLl9yb3dzSW5QYWdlKTsgLy9ndWkgaWR4IG9mIGZpcnN0IHJlY29yZCBvZiByZXNwZWN0aXZlIHBhZ2VcclxuXHJcbiAgICAgICAgbmV3VG9wSW5kZXggPSB0aGlzLmdldER2Um93SWR4KG5ld1RvcEd1aUluZGV4KTtcclxuXHJcbiAgICAgICAgaWYobmV3VG9wSW5kZXggIT09IHRoaXMuX3ByZXZHdWlUb3BJbmRleCB8fCB0aGlzLklzTW92aW5nSW5WaWV3IClcclxuICAgICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBiZSBjdXJyZW50IGxpbmVcclxuICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAhPT0gbmV3VG9wSW5kZXggfHwgdGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChuZXdUb3BJbmRleCk7XHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKEludDMyLk1pblZhbHVlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnZhbGlkYXRlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbnZhbGlkYXRlVGFibGUoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5Sb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCByb3c6IFJvdyA9IDxSb3c+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+XHJcbiAgYXN5bmMgZmlyc3RUYWJsZVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgc3VwZXIuZmlyc3RUYWJsZVJlZnJlc2goKTtcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEluc2VydFRhYmxlSXRlbXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUm93cy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgICAgdGhpcy5JbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBzZXRUYWJsZUl0ZW1zQ291bnQocmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXI7XHJcblxyXG4gICAgLy8gRm9yIGFic29sdXRlIHNjcm9sbGJhciwgc2V0IHRoZSB2aXJ0dWFsIGl0ZW1zIGNvdW50IGFjY29yZGluZ2x5LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKSB7XHJcblxyXG4gICAgICAvLyBJZiB0YXNrIGlzIG1vdmVkIGludG8gQ1JFQVRFIG1vZGUgYW5kIGN1cnJlbnRseSBuZXcgbGluZSBpcyBjcmVhdGVkXHJcbiAgICAgIC8vIHRoZW4gb25seSBuZXdseSBjcmVhdGVkIHJlY29yZHMgc2hvdWxkIGJlIHNlZSBvbiB0aGUgc2NyZWVuXHJcbiAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50VmlldygwKTtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFRhYmxlIHdpdGggc2V0IG9mIHJlY29yZHMgT1IgaWYgZW1wdHkgdGFibGUgdGhlbiB0YWJsZUl0ZW1zQ291bnQgc2hvdWxkIG5vdCBiZSAwLCBhcyB3ZSBhbHdheXMgaGF2ZSAwdGggcm93LlxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9ICh0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSA/IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDogMTtcclxuICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCksIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMCgpOiB2b2lkIHtcclxuICAgIGxldCBkdlNpemU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgdGFibGUgY29udHJvbCBmb3IgdGhlIGZpcnN0IHRpbWUgd2hpbGUgY3JlYXRpbmcgdGhlIGZvcm0gd2l0aCB0b3RhbFJlY29yZHNDb3VudCBhbmQgYWxzb1xyXG4gICAgLy8gc2V0IHRoZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcsIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZmlyc3Qgcm93IGF0IHJlc3BlY3RpdmUgbG9jYXRpb24gaW4gY2FzZSBvZiBsb2NhdGUuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCBmYWxzZSk7XHJcbiAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGFibGUgY29udHJvbCdzIHJvd3MgdG8gJ3RhYmxlSXRlbXNDb3VudCcgY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2U2l6ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFibGVJdGVtc0NvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZW1vdmVBbGxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChyZW1vdmVBbGwpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLklzT25lV2F5S2V5KTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdXBlci5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0b3AgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldFRhYmxlVG9wSW5kZXgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICAgICAgLy8gdGFibGUgbm93IGJlaGF2ZXMgbGlrZSBsaXN0dmlldywgaXQgY2FuIG5vdCBzaG93IGVtcHR5IGxpbmVzXHJcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHVwZGF0ZSB0b3AgaW5kZXhcclxuICAgICAgICAgIGlmIChpbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgPiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkbyBzaG93IGVtcHR5IGxpbmVzIGlmIGluY2x1ZGVGaXJzdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGxlc3MgcmVjb3JkcyB0aGVuIHJvd3Mgb24gc2NyZWVuIFFDUiAjISEhISEhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIHRoaXMuX3Jvd3NJblBhZ2UsIDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoaW5kZXgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldykge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGluZGV4KTtcclxuICAgICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSB0aGlzLmdldEd1aVJvd2lkeChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIHRoZSB3aW5kb3cgZGVmaW5lZCBieSB0aGlzIGZvcm0gYW5kIGl0cyBjaGlsZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3JlYXRlRm9ybSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLmNyZWF0ZUZvcm0oKTtcclxuICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMuYWRkKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZXMgdGhlIHN0cmluZyBvciBzZXRzIHRoZSBpbWFnZSBvbiB0aGUgcGFuZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhbmVJZHhcIj5JbmRleCBvZiB0aGUgcGFuZSB0byBiZSB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJJbmZvXCI+TWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+U291bmQgYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFVwZGF0ZVN0YXR1c0JhcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBpbiBXZWJDbGllbnQuXHJcbiAgICAvLyBpZiAocGFuZUlkeCA9PSBDb25zdGFudHMuU0JfTVNHX1BBTkVfTEFZRVIgfHwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFNob3dTdGF0dXNCYXJQYW5lcygpKVxyXG4gICAgLy8gICBiYXNlLlVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4LCBzdHJJbmZvLCBzb3VuZEJlZXApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSByZWNvbXB1dGUgdGFibGUgZm9yIHRoYXQgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGUgZm9ybVwiKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5pbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IHRhc2s9XCIgKyB0aGlzLl90YXNrICsgXCIsIElkPVwiICsgdGhpcy5fdXNlclN0YXRlSWQgKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYnVpbGQgdGhlIFhNTCBlbnRyeSBvZiB0aGUgaGlkZGVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgeG1sOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ICE9PSBudWxsICYmIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHdyaXRlIHRoZSBpZFxyXG4gICAgICB4bWwuQXBwZW5kKFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hJRERFTl9DT05UT0xTICsgXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTTlMgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0LmZvckVhY2goKGNoYW5nZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgeG1sLkFwcGVuZChjaGFuZ2UgKyBcIixcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgeG1sLlJlbW92ZSh4bWwuTGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICB4bWwuQXBwZW5kKFwiXFxcIi8+XCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIEZvciBSSUEsIE5vbiBJbnRlcmFjdGl2ZSB0YXNrJ3MgYW5kIGl0cyBhbGwgY2hpbGQgdGFzayBzaG91bGQgYmVoYXZlIGFzIGEgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2hvdWxkQmVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBhbmQgaXRzIGNoaWxkcmVuIHdpbGwgYmUgb3BlbmVkIHVzaW5nIHNob3cgZGlhbG9nIHRvIHByZXZlbnQgZXZlbnRzIG9uIHRoZWlyIGFuY2VzdG9yc1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpKVxyXG4gICAgICBzaG91bGRCZU1vZGFsID0gVGFza0Jhc2UuU2hvdWxkTm9uSW50ZXJhY3RpdmVCZU1vZGFsKCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2tCYXNlID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5QYXJlbnRUYXNrO1xyXG4gICAgICBpZiAocGFyZW50VGFzayAhPT0gbnVsbCAmJiAhcGFyZW50VGFzay5Jc0ludGVyYWN0aXZlICYmICFwYXJlbnRUYXNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBzaG91bGRCZU1vZGFsID0gcGFyZW50VGFzay5TaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRCZU1vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFnaW5hdGVkIHRhYmxlIGJlaW5nIHVzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAoPE1nQ29udHJvbD50aGlzLl90YWJsZU1nQ29udHJvbCkuSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidWlsZEZvcm1OYW1lKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gIHRoaXMuVW5pcXVlTmFtZTtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLmdldFRhc2soKTtcclxuXHJcbiAgICBuYW1lID0gKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgJ18nICsgbmFtZTtcclxuICAgIHdoaWxlICh0YXNrLklzU3VidGFzaykge1xyXG4gICAgICB0YXNrID0gPFRhc2tCYXNlPnRhc2suU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCkgOiBUbyBmZXRjaCBwcmV2aW91cyBjaHVuayBvZiByZWNvcmRzIGlmIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNQb3NPblBhZ2U6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgJSB0aGlzLl9yb3dzSW5QYWdlO1xyXG5cclxuICAgICAgLy8gSWYgcmVjb3JkIGlzIG5vdCB0aGUgZmlyc3QgcmVjb3JkIG9uIHBhZ2UsIGZldGNoIHByZXZpb3VzIHJlY29yZCBmb3IgdGhhdCBwYWdlLlxyXG4gICAgICAvLyBUT0RPIDogdGhpcy5EaXNwbGF5TGluZSAtIENoZWNrIHdoZXRoZXIgY2FuIGJlIHJlbW92ZWQgP1xyXG4gICAgICBpZiAocmVjUG9zT25QYWdlID4gMCAmJiB0aGlzLkRpc3BsYXlMaW5lID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKC1yZWNQb3NPblBhZ2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3VpUm93aWR4KGR2Um93SWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGR2Um93SWR4ICsgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcblxyXG4gIGdldER2Um93SWR4KGd1aVJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBndWlSb3dJZHggLSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gIH1cclxufVxyXG4iXX0=
|
1178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sYUFBYSxFQUNiLElBQUksRUFDSixRQUFRLEVBQ1IsWUFBWSxFQUViLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFXLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTTdDLE1BQU0sT0FBTyxNQUFPLFNBQVEsVUFBVTtJQW9CcEM7UUFDRSxLQUFLLEVBQUUs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QztJQUNkLENBQUM7SUFLTyxLQUFLLENBQUMsNEJBQTRCO1FBQ3hDLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGlCQUFpQixHQUFHLENBQUMsRUFBRTtZQUNuRixJQUFJLFlBQVksR0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUkxRixJQUFJLFlBQVksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUU7Z0JBQzlDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM3QztTQUNGO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFnQjtRQUMzQixPQUFPLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsd0JBQXdCLENBQUM7SUFDaEUsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFpQjtRQUMzQixPQUFPLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsd0JBQXdCLENBQUM7SUFDakUsQ0FBQzs7QUFud0RjLGlCQUFVLEdBQVcsRUFBRSxDQUFDO0FBWWhDLG9CQUFhLEdBQXNCLElBQUksaUJBQWlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgQ29udHJvbFRhYmxlLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBHdWlFbnZpcm9ubWVudCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBQcm9wSW50ZXJmYWNlLFxyXG4gIFJvd1xyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBQcmlvcml0eSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIEludDMyLFxyXG4gIExpc3QsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb259IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7RGF0YVZpZXcsIFNFVF9ESVNQTEFZTElORV9CWV9EVn0gZnJvbSAnLi4vZGF0YS9EYXRhVmlldyc7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7VGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSAnLi4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0xhc3RGb2N1c2VkTWFuYWdlcn0gZnJvbSAnLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHtDcmVhdGVkRm9ybVZlY3Rvcn0gZnJvbSAnLi9DcmVhdGVkRm9ybVZlY3Rvcic7XHJcbmltcG9ydCB7QWNjZXNzSGVscGVyfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBkYXRhIGZvciA8Zm9ybT4uLi48L2Zvcm0+XHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBNZ0Zvcm0gZXh0ZW5kcyBNZ0Zvcm1CYXNlIHtcclxuICBwcml2YXRlIHN0YXRpYyBUSU1FX0xJTUlUOiBudW1iZXIgPSA1MDsgLy8gdGltZSBsaW1pdCBmb3Igb25lIHRyYW5zZmVyIG9wZXJhdGlvbiAoaW4gbWlsbGkgc2Vjb25kcylcclxuICBJc01vdmluZ0luVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFByZXZEaXNwbGF5TGluZTogbnVtYmVyID0gMDsgLy8gZGlzcGxheSBpZGVudGlmaWVyIG9mIHByZXYgbGluZVxyXG4gIFJlZnJlc2hBbGxSb3dzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIElnbm9yZUZpcnN0UmVjb3JkQ3ljbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBNb3ZlZFRvRmlyc3RDb250cm9sOiBib29sZWFuID0gZmFsc2U7IC8vIHRydWUgd2hlbiBtb3ZlIHRvIGZpcnN0IGNvbnRyb2wgc2hvdWxkIGJlIGV4ZWN1dGVkIG9uIHRoZSBmb3JtXHJcblxyXG4gIHByaXZhdGUgX3N1ZmZpeERvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBoaWRkZW5Db250cm9sc0lzbnNMaXN0OiBMaXN0PG51bWJlcj4gPSBudWxsO1xyXG5cclxuICBzdGF0aWMgX2NyZWF0ZWRGb3JtczogQ3JlYXRlZEZvcm1WZWN0b3IgPSBuZXcgQ3JlYXRlZEZvcm1WZWN0b3IoKTtcclxuXHJcbiAgLy9UT0RPOiBNYXliZSB0aGUgbmFtZSBzaG91bGQgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbGlrZSBhbGxvd0ZpZWxkQ29tcHV0ZVxyXG4gIHByaXZhdGUgX3RyYW5zZmVycmluZ0RhdGFUb0dVSTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBDcmVhdGVkRm9ybXMoKTogQ3JlYXRlZEZvcm1WZWN0b3Ige1xyXG4gICAgcmV0dXJuIE1nRm9ybS5fY3JlYXRlZEZvcm1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEluUmVzdG9yZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlc3RvcmU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJhbnNmZXJyaW5nRGF0YVRvR1VJKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSTtcclxuICB9XHJcblxyXG4gIGdldCBzaG91bGRGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSkge1xyXG4gICAgICBsZXQgcHJvcCA9IHRoaXMuX3RhYmxlTWdDb250cm9sLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VSVkVSX1JFQURfQUhFQUQpO1xyXG5cclxuICAgICAgcmV0dXJuIChwcm9wICE9IG51bGwgPyBwcm9wLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkgOiBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQgPSB0cnVlO1xyXG4gICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLkZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpO1xyXG4gICAgdGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgdGFzayBkYXRhdmlldywgaWYgdGhlIHRhc2sgZXhpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50aGUgdGFzayBkYXRhdmlldzwvcmV0dXJucz5cclxuICBwcml2YXRlIEdldERhdGF2aWV3KCk6IERhdGFWaWV3IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl90YXNrICE9IG51bGwpXHJcbiAgICAgIGR2ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcblxyXG4gICAgcmV0dXJuIChkdik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbW92ZSBvbmUgcGFnZS9yb3cgdXAvZG93biBvciB0byB0aGUgYmVnaW5uaW5nL2VuZCBvZiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1bml0XCI+dG8gbW92ZSBpbnRvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkRpcmVjdGlvblwiPm9mIG1vdmluZzwvcGFyYW0+XHJcbiAgYXN5bmMgbW92ZUluVmlldyh1bml0OiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCk7XHJcbiAgICBsZXQgb2xkVGFza01vZGU6IHN0cmluZyA9ICcgJztcclxuICAgIGxldCByZXR1cm5Ub1Zpc2libGVMaW5lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVjb3JkT3V0T2ZWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdmlzaWJsZUxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5Jc01vdmluZ0luVmlldyA9IHRydWU7XHJcbiAgICAgIGxldCBvbGREaXNwbGF5TGluZTogbnVtYmVyID0gdGhpcy5EaXNwbGF5TGluZTtcclxuXHJcbiAgICAgIC8vIHRhYmxlIG1vdmVtZW50cyAoZmlyc3QgLyBsYXN0IHJlY29yZClcclxuICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gQkVHSU5JTkcgT0YgVEFCTEVcclxuICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KENvbnN0YW50cy5NR19EQVRBVklFV19GSVJTVF9SRUNPUkQsIHRydWUsIGZhbHNlLCB0cnVlLFxyXG4gICAgICAgICAgICAgIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKDAsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIEVORCBPRiBUQUJMRVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgoQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0xBU1RfUkVDT1JELCB0cnVlLCBmYWxzZSwgdHJ1ZSxcclxuICAgICAgICAgICAgICBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHRhYmxlIGluIHRoZSBmb3JtXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuX3Jvd3NJblBhZ2UgKyAxKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID49IDApXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbilcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHBhZ2UgYW5kIHJvdyBtb3ZlbWVudHNcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiByZWNvcmRzIHRvIHNraXBcclxuICAgICAgICBsZXQgc2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiYgdGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOOlxyXG4gICAgICAgICAgICAgIHNpemUgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQ6XHJcblxyXG4gICAgICAgICAgICAgIGxldCBsYXN0OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB0aGlzLl9yb3dzSW5QYWdlIC0gMTtcclxuICAgICAgICAgICAgICBsYXN0ID0gTWF0aC5taW4obGFzdCwgdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIDEpO1xyXG4gICAgICAgICAgICAgIHNpemUgPSBsYXN0IC0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICByZXR1cm5Ub1Zpc2libGVMaW5lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBzaXplID0gdGhpcy5fcm93c0luUGFnZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgc2l6ZSA9IDE7XHJcblxyXG4gICAgICAgIHNpemUgPSAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViB8fFxyXG4gICAgICAgIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOXHJcbiAgICAgICAgICA/IC1zaXplXHJcbiAgICAgICAgICA6IHNpemUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgIHZpc2libGVMaW5lID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lIDwgMCkge1xyXG4gICAgICAgICAgICB2aXNpYmxlTGluZSA9IDA7XHJcbiAgICAgICAgICAgIHJlY29yZE91dE9mVmlldyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuX3Jvd3NJblBhZ2U7XHJcbiAgICAgICAgICAgIHJlY29yZE91dE9mVmlldyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBzY3JvbGxpbmcgdGhlIHRhYmxlIG9uZSBwYWdlIG9yIG9uZSByb3cgdXAgb3IgZG93blxyXG4gICAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCB8fFxyXG4gICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpIHx8XHJcbiAgICAgICAgICAgIHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmXHJcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUICYmIHZpc2libGVMaW5lID09PSB0aGlzLl9yb3dzSW5QYWdlIC0gMSB8fFxyXG4gICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgJiYgdmlzaWJsZUxpbmUgPT09IDApKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIHByZXZpb3VzIHJvdyBidXQgd2UgYXJlIGF0IHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlIGFuZCBkYXRhIHZpZXdcclxuICAgICAgICAgICAgLy8gdGhlbiBkbyBub3RoaW5nXHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmXHJcbiAgICAgICAgICAgICAgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XIHx8IHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSkgJiZcclxuICAgICAgICAgICAgICB2aXNpYmxlTGluZSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpID09PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgd2UgbW92ZSB0byB0aGUgbmV4dCByb3cgYnV0IHdlIGFyZSBhdCB0aGUgbGFzdCByb3cgb2YgdGhlIHRhYmxlIGFuZCB0aGUgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgICB2aXNpYmxlTGluZSA9PT0gdGhpcy5nZXRMYXN0VmFsaWRSb3coKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpID09PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgb2xkUmVjSWQgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBzaXplKTtcclxuICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnNldFRvcFJlY0lkeE1vZGlmaWVkKHRydWUpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3N1ZmZpeERvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICsgc2l6ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSgwLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTk1NDk2OiB3aGVuIHRoZSByZWNvcmQgc3VmZml4IGZhaWxlZCBnbyBiYWNrIHRvIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgcm93XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodW5pdCAhPT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0cyh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTkyMTAxOiBpZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQgaXQgbWVhbnMgdGhhdCB0aGUgcmVjIHN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAvLyB3YXNuJ3QgZXhlY3V0ZWQgc28gd2UgbXVzdCBoYW5kbGUgaXQgYmVmb3JlIHdlIGdvIHRvIGEgbmV3IHJvd1xyXG4gICAgICAgICAgICAgICAgICBsZXQgbmV3UmVjSWQ6IG51bWJlciA9ICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAobmV3UmVjSWQgPT09IG9sZFJlY0lkICYmICF0aGlzLl9zdWZmaXhEb25lKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFFDUiA3NTg2MzlcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHRoaXMuZ2V0TGFzdFZhbGlkUm93KCksIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVMaW5lID0gdGhpcy5nZXRMYXN0VmFsaWRSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmIGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBtb3ZpbmcgdGhlIG1hcmtpbmcgb25lIHJvdyB1cCBvciBkb3duXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBvbGRUYXNrTW9kZSA9IHRoaXMuX3Rhc2suZ2V0TW9kZSgpO1xyXG5cclxuICAgICAgICAgICAgICBvbGRSZWNJZCA9ICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUgKyBzaXplLCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIHRoZSByZWNvcmQgd2FzIGRlbGV0ZWQgaW4gUnVuIFRpbWUgYnkgRm9yY2UgRGVsZXRlIGZvciBleGFtcGxlXHJcbiAgICAgICAgICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVjRXhpc3RzQnlJZChvbGRSZWNJZCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCB8fCBvbGRUYXNrTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChzaXplICE9PSAtMSB8fCAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVjRXhpc3RzKG9sZERpc3BsYXlMaW5lKSlcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI5MzY2OFxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInNraXBwZWQgc2V0Y3VyclJvdyBmb3Igcm93IHswfVwiLCBvbGREaXNwbGF5TGluZSkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogaWYgZXZlcnl0aGluZyBpcyBPSywgY3VyciByZWMgd2lsbCBsYXRlciBiZSByZWZyZXNoZWQgaW5cclxuICAgICAgICAgICAgICAgIC8vIFJFQ19QUkVGSVhcclxuICAgICAgICAgICAgICAgIC8vIHRodXMsIHJlZnJlc2ggb25seSBpbiBjYXNlIG9mIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBlcnJvciBpcyBiZWNhdXNlIHRoZSBvbGQtcmVjIHdhcyByZW1vdmVkIChjYW5jZWxFZGl0J2VkKSwgc28gcmVmcmVzaCBmb3JtLlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzc3NTMwOTogaWYgbGVhdmluZyB0aGUgbmV3IGNyZWF0ZWQgcmVjb3JkIGZhaWxlZCB0aGVuIHJlc3RvcmVcclxuICAgICAgICAgICAgICAgICAgLy8gYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBhIG5ldyByZWNvcmQgc28gdGhlIG5leHQgYWN0aW9uIHdvdWxkXHJcbiAgICAgICAgICAgICAgICAgIC8vIFwia25vd1wiIHRoYXQgaXQgaXMgc3RpbGwgYSBuZXcgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgIyA4MTYyNyA6IElmIHRhc2sgaXMgaGF2aW5nIGEgc3ViZm9ybSwgdGhlbiB3aGlsZSBtb3ZpbmcgdG8gc3ViZm9ybSwgbmV3bHkgY3JlYXRlZCByZWNvcmRcclxuICAgICAgICAgICAgICAgICAgLy8gaXMgc3luY2VkIGFuZCBpdCBpcyBpbnNlcnRlZCBpbiBfbW9kaWZpZWRUYWIgYXMgJ2luc2VydCcgcmVjb3JkLiBTbywgYW55IHJlcXVlc3QgdG8gc2VydmVyIGluc2VydHNcclxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRvIHNlcnZlci4gRXZlbiBpZiB3ZSBkb250IGdvIHRvIHNlcnZlciwgaXQgaXMgdGhlcmUgaW4gX21vZGlmaWVkVGFiIGFzIG5ldyByZWNvcmQuIEluc2VydGluZ1xyXG4gICAgICAgICAgICAgICAgICAvLyBoZXJlIGFscmVhZHkgc3luY2VkIHJlY29yZCBjYXVzZXMgaW5zZXJ0aW9uIG9mIHJlY29yZCB0d2ljZS4gU28sIElmIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBzeW5jZWQgdGhlbiBvbmx5IGluc2VydC5cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghY3VyclJlYy5TeW5jZWQgJiYgb2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTgwNTI4OiBSZWZyZXNoIHRoZSBjdXJyZW50IHJvdyBhZnRlciBjYW5jZWwgZWRpdCB0byByZWZsZWN0XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN0b3JlZCB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQgYnVnICM6OTQxNzYzLCB3aGlsZSBjcmVhdGUgaXNuJ3QgYWxsb3dlZCBuZWVkIHRvIGRvIHN1ZmZpeCBhbmQgcHJlZml4IG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGRvUmVjb3JkU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCByZWZkb1JlY29yZFN1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9SZWNvcmRTdWZmaXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgoPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIHJlZmRvUmVjb3JkU3VmZml4KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGhpcy5fdGFzayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkb1JlY29yZFN1ZmZpeCA9IHJlZmRvUmVjb3JkU3VmZml4LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGUgZm9ybSBkb2VzIG5vdCBoYXZlIGEgdGFibGUsIG1vdmUgdG8gb25lIHJvdyBpbiB0aGUgY2hvc2VuIERpcmVjdGlvblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICsgc2l6ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnN0b3AoKTtcclxuICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXR1cm5Ub1Zpc2libGVMaW5lKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZE91dE9mVmlldykge1xyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID09PSAwKVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlKTtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB2aXNpYmxlTGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcblxyXG4gICAgICB0aGlzLlNlbGVjdFJvdygpO1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHJlY29yZCB0byB0aGUgZm9ybSBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGFkZFJlYyhkb1N1ZmZpeDogYm9vbGVhbixpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG5ld0xpbmU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgY3VyckxpbmU6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgY3VyckxpbmUgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcblxyXG4gICAgLy8gSW5jcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgYWRkZWQgaW50byB0aGUgdmlldy5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgIHtcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ICs9IDE7XHJcbiAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdSZWNJZHg6IG51bWJlciA9IGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5hZGRSZWNvcmQoZG9TdWZmaXgsIGZhbHNlLCBpc0NyZWxpbmVBYm92ZSk7XHJcblxyXG4gICAgaWYgKG5ld1JlY0lkeCA+IC0xKSB7XHJcbiAgICAgIC8vIGZvcm1zIHdpdGggYSB0YWJsZVxyXG4gICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAvLyB0aGVyZSBhcmUgbm8gcmVjb3JkcyBpbiB0aGUgdGFibGUgc28gdGhlIG5ldyByb3cgaXMgY3JlYXRlZCBhZnRlclxyXG4gICAgICAgIC8vIHNldHRpbmcgdGhlIHRvcCByZWNvcmQgdG8gMCBhbmQgdGhlIGN1cnJlbnQgcm93IHRvIDBcclxuICAgICAgICBsZXQgbmV3Q3VyclJvdzogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID09PSAwIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICBuZXdDdXJyUm93ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIGN1cnNvciBpcyBwYXJraW5nIG9uIHRoZSBsYXN0IHJvdyBvZiB0aGUgZGlzcGxheWVkIHRhYmxlIHNvIHRoZVxyXG4gICAgICAgIC8vIG5ldyByb3cgaXMgY3JlYXRlZCBhZnRlciBpbmNyZW1lbnRpbmcgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAgICAgICBlbHNlIGlmIChjdXJyTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEpIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgMSk7XHJcbiAgICAgICAgICBuZXdDdXJyUm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRvcCByZWNvcmRcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKGlzQ3JlbGluZUFib3ZlKVxyXG4gICAgICAgICAgICBuZXdDdXJyUm93ID0gY3VyckxpbmUgPiAwID8gY3VyckxpbmUgOiAwO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBuZXdDdXJyUm93ID0gY3VyckxpbmUgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG5ld0xpbmUgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93O1xyXG5cclxuICAgICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgbmV3Q3VyclJvdyk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0xpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmVcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmFkZFJlYygpIHswfVwiLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgLT0gMTtcclxuICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRlbGV0ZSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRlbEN1cnJSZWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG9wVGFibGVSb3c6IGJvb2xlYW4gPSBzdXBlci5pc0xpbmVNb2RlKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5yZW1vdmVDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlYyhmYWxzZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl90YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyBjaGFuZ2UgdG8gY3JlYXRlIG1vZGVcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICAgICAgLy8gTUdfQUNUX0NSRUxJTkUgbWF5IGJlIGRpc2FibGVkIC5pLmUuIFBST1BfVFlQRV9BTExPV19DUkVBVEUgZXhwcmVzc2lvbiBjYW4gYmUgY2hhbmdlZFxyXG4gICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBvd25lclRhc2tcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmICh0b3BUYWJsZVJvdylcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQtLTtcclxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2NyZWVuIG1vZGVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FuY2VsIHRoZSBlZGl0aW5nIG9mIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgcmVzdG9yZSB0aGUgb2xkIHZhbHVlcyBvZiB0aGUgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2FuY2VsXCI+dHJ1ZSBpZiBjYWxsZWQgZm9yIEFDVF9DQU5DRUwsIGZhbHNlIG90aGVyd2lzZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRFdmVudFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgY2FuY2VsRWRpdChpc0FjdENhbmNlbDogYm9vbGVhbiwgaXNRdWl0RXZlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtb2RlOiBzdHJpbmcgPSB0aGlzLl90YXNrLmdldE1vZGUoKTtcclxuICAgIGxldCBuZXdNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgcm93OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV4ZWNSZWNQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBXZSByZXR1cm4gdG8gY3JlYXRlIG1vZGUgb25seSBpZiB0aGVyZSBpcyBubyByZWNvcmQgdG8gZ28gdG8gYWZ0ZXIgdGhlIGNhbmNlbCBhY3Rpb25cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID09PSAxICYmIG1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICBuZXdNb2RlID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEU7XHJcbiAgICBlbHNlXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWTtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIC8vIDk5NzA3MyAmIDkzMTAyMS5cclxuICAgIC8vIEV4cGVjdGVkIGJlaGF2aW9yIGR1cmluZyBjYW5jZWwgZXZlbnQsIGZvciBhIG5ldyByZWNvcmQ6XHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgb3duZXJUYXNrIG1vZGUgaXMgbm90IGNyZWF0ZSwgZGVsZXRlIHRoZSBuZXcgcmVjb3JkIGFuZCBnbyBiYWNrIHRvIHRoZSBwcmV2aW91cyByZWNvcmQuXHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgb3duZXJUYXNrIG1vZGUgaXMgY3JlYXRlLCBzdGF5IG9uIHRoZSBuZXcgcmVjb3JkLlxyXG5cclxuICAgIC8vIGR2LmNhbmNlbEVkaXQoKSByZW1vdmVzIHRoZSBuZXcgcmVjb3JkIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gU28sIGluIGNhc2Ugb2Ygb3JnVGFza01vZGU9Qywgc2luY2Ugd2Ugd2FudCB0byBzdGF5IG9uIHRoZSBuZXcgcmVjb3JkLCB3ZSBuZWVkIHRvIHJlLWNyZWF0ZSBhIHJlY29yZC5cclxuXHJcbiAgICAvLyBCdXQgYXMgc2FpZCwgZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgT05MWSB1bmRlciBzb21lIGNvbmRpdGlvbi5cclxuICAgIC8vIFRoZSBjb25kaXRpb24gaXMgYXMgZm9sbG93czpcclxuICAgIC8vIFRoZSByZWNvcmQgaXMgcmVtb3ZlZCBvbmx5IGlmIHRoZSBkdiBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxLiBTbywgaWYgdGhlIGR2IHNpemUgaXMgMSwgZHYuY2FuY2VsRWRpdCgpXHJcbiAgICAvLyBkb2VzIG5vdCByZW1vdmUgdGhlIHJlY29yZCBhbmQgaGVuY2UgaW4gdGhpcyBjYXNlLCBmb3JtLmNhbmNlbEVkaXQoKSBzaG91bGQgbm90IGNyZWF0ZSBhIG5ldyByZWNvcmQuXHJcbiAgICAvLyBGb3IgdGhpcyByZWFzb24sIHRoZSBzaWduYXR1cmUgb2YgZHYuY2FuY2VsRWRpdCgpIGlzIGNoYW5nZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgcmVjb3JkIHdhcyByZW1vdmVkIG9yIG5vdC5cclxuXHJcbiAgICAvLyBUaGlzIGlzIG9uZSBwYXJ0LlxyXG5cclxuICAgIC8vIE5vdywgYWZ0ZXIgY2FuY2VsRWRpdCwgUlAgaGFzIHRvIGJlIGV4ZWN1dGVkLiBUaGlzIHdhcyBkb25lIGluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwuXHJcbiAgICAvLyBCdXQgd2hhdCBoYXBwZW5zIGlzLCBpZiBmb3JtLmNhbmNlbEVkaXQoKSBjcmVhdGVkIGEgbmV3IGxpbmUsIFJQIHdhcyBhbHJlYWR5IGV4ZWN1dGVkIGZyb20gdGhlcmUuIEFuZCBmcm9tXHJcbiAgICAvLyBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKSwgUlAgaXMgZXhlY3V0ZWQgZm9yIHRoZSBzZWNvbmQgdGltZS5cclxuICAgIC8vIFNvLCBtb3ZlZCB0aGUgY29kZSBvZiBleGVjdXRpbmcgUlAgZnJvbSBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKS0+Y2FzZSBNR19BQ1RfQ0FOQ0VMIHRvIGZvcm0uY2FuY2VsRWRpdCgpXHJcbiAgICAvLyBhbmQgdGhhdCB3aWxsIGJlIGRvbmUgb25seSBpZiB0aGUgY3JlYXRlIGxpbmUgd2FzIG5vdCBleGVjdXRlZC5cclxuXHJcbiAgICAvLyBOb3csIHdlIGhhdmUgb25lIG1vcmUgaXNzdWUuXHJcblxyXG4gICAgLy8gVW50aWwgbm93LCB0aGUgUlAgd2FzIGV4ZWN1dGVkIGFmdGVyIGZvcm0uY2FuY2VsRWRpdCgpLlxyXG4gICAgLy8gU28sIHdoZW4gdGhlIGNvZGUgaXMgbW92ZWQgdG8gZm9ybS5jYW5jZWxFZGl0KCksIGl0IHNob3VsZCBiZSB0aGUgbGFzdCB0aGluZyB0byBiZSBleGVjdXRlZC5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIGxldCByZWNSZW1vdmVkOiBib29sZWFuID0gYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRQcmV2Q3VyclJlYyhudWxsKTtcclxuICAgIGlmICgodGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSB8fCAoKGlzQWN0Q2FuY2VsICYmIHJlY1JlbW92ZWQpICYmICghR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U3BlY2lhbENhbmNlbE9uQ3JlYXRlKCkpJiYoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICAvLyBTZXQgQ2FuY2VsIGluZGljYXRpb24gb24gdGhlIHRhc2sgZm9yIHRvIG5vdCBwZXJmb3JtIGNvbnRyb2wgdmFsdWUgdmFsaWRhdGlvbiBpbiB0aGUgQ3JlYXRlIGxpbmUgYWN0aW9uLlxyXG4gICAgICBsZXQgb3JnQ2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRDYW5jZWxXYXNSYWlzZWQoaXNBY3RDYW5jZWwpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChvcmdDYW5jZWxXYXNSYWlzZWQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNBY3RDYW5jZWwpXHJcbiAgICAgIGV4ZWNSZWNQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIHRoZSBlbXB0aW5lc3Mgb2YgdGhlIERWIG11c3QgYmUgY2hlY2tlZCBhZ2FpbiBiZWNhdXNlIHRoZSBcImNyZWF0ZSBsaW5lXCIgbWF5IGZhaWxcclxuICAgIGlmICghdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSkge1xyXG4gICAgICBpZiAoc3VwZXIuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgICAgaWYgKHJvdyA8IDAgfHwgcm93ID49IHRoaXMuX3Jvd3NJblBhZ2UpIHtcclxuICAgICAgICAgICAgICBsZXQgdG9wUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgaWYgKHRvcFJlY0lkeCA+IGN1cnJSZWNJZHgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGN1cnJSZWNJZHgpO1xyXG4gICAgICAgICAgICAgIHJvdyA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyByb3csIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBzaG91bGQgcmVhbGx5IGJlIGNhdWdodCBoZXJlLlxyXG4gICAgICAgICAgICBpZiAocm93ICE9PSAwKVxyXG4gICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gRm9ybS5jYW5jZWxFZGl0KCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpICYmIHJlY1JlbW92ZWQpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudC0tO1xyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2NyZWVuIG1vZGVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIHRydWUsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImluIEZvcm0uY2FuY2VsRWRpdCgpIGVycm9yIGluIFNjcmVlbiBtb2RlIGZvciBDdXJyZW50IFJlY29yZFwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShuZXdNb2RlKTtcclxuICAgICAgaWYgKCEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaylcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcblxyXG4gICAgICBpZiAoISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV4ZWNSZWNQcmVmaXgpIHtcclxuICAgICAgLy8gUUNSICM5MjU2NDYsICM0NTQxNjc6IGV4aXQgdG8gdGhlIG93bmVyVGFzayBsZXZlbCBpbiBvcmRlciB0byBza2lwIGNvbnRyb2wgc3VmZml4XHJcbiAgICAgIC8vIGFuZCByZWNvcmQgc3VmZml4IG9mIHRoZSBjYW5jZWxlZCBuZXcgcmVjb3JkIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGVcclxuICAgICAgLy8gbmV4dCByZWNvcmQgcGVyZml4IHdvdWxkIGJlIGV4ZWN1dGVkXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIC8vIHdlIHJvbGxiYWNrIGEgcGFyZW50IG93bmVyVGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vb3duZXJUYXNrLiBXZSBkbyBub3Qgd2FudCB0aGUgY3RybCBvbiB0aGUgc3ViZm9ybSB0byBkbyBjdHJsIHN1ZmZpeC5cclxuICAgICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICgoPFRhc2tCYXNlPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLnBhdGhDb250YWlucyg8VGFza0Jhc2U+dGhpcy5fdGFzaykpXHJcbiAgICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSA8VGFza0Jhc2U+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICAgICAgICAgcGFyZW50ICE9PSBudWxsICYmIHBhcmVudCAhPT0gdGhpcy5fdGFzaztcclxuICAgICAgICAgICAgICAgcGFyZW50ID0gPFRhc2tCYXNlPnBhcmVudC5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICBwYXJlbnQuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICAgICgoPERhdGFWaWV3PnBhcmVudC5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzUXVpdEV2ZW50KSB7XHJcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgZm9sbG93aW5nIDIgbGluZXMgY2FuIGJlIG1lcmdlZCBpbiBvbmUgbWV0aG9kXHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKHRoaXMuX3Rhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2NhbiBhbGwgY29udHJvbHMgaW4gdGhlIGZvcm0uIEV2ZXJ5IGNvbnRyb2wgd2hpY2ggaGFzIGEgcHJvcGVydHkgdGhhdCBpcyBhbiBleHByZXNzaW9uIHdpbGwgYmVcclxuICAvLy8gICByZWZyZXNoZWQuIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhlIGNvbnRyb2wncyBkaXNwbGF5IGlzIHN5bmNoZWQgd2l0aCB0aGUgZXhwcmVzc2luJ3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hPbkV4cHJlc3Npb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSAoKHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpIGluc3RhbmNlb2YgTWdDb250cm9sKSA/IDxNZ0NvbnRyb2w+dGhpcy5DdHJsVGFiLmdldEN0cmwoaSkgOiBudWxsKTtcclxuXHJcbiAgICAgIGlmIChtZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgICBhd2FpdCBtZ0NvbnRyb2wucmVmcmVzaE9uRXhwcmVzc2lvbigpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIHJlZnJlc2ggdGhlIGZvcm0gcHJvcGVydGllc1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaFByb3BzT25FeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGNvbnRyb2xzIG9mIHRoaXMgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmc1RvQ3RybHMoKTogdm9pZCB7XHJcbiAgICAvLyBpZiBsYXN0IGZvY3VzZWQgY29udHJvbCB3YXMgZnJvbSB0aGlzIHRhc2sgLSB6ZXJvIGl0LlxyXG4gICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCAmJiBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0Rm9ybSgpID09PSB0aGlzKVxyXG4gICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKDxUYXNrQmFzZT50aGlzLl90YXNrLCBudWxsKTtcclxuXHJcbiAgICBzdXBlci5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgY29udHJvbCB3aXRoIGEgZ2l2ZW4gbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPnRoZSBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxCeUN0cmxOYW1lKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIDxNZ0NvbnRyb2w+dGhpcy5DdHJsVGFiLmdldEN0cmwoY3RybE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgc3ViZm9ybSBjb250cm9sIHdpdGggdGhlIHR5cGVkIG5hbWUgZnJvbSBhbGwgcGFyZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPiB0aGUgcmVxdWVzdGVkIHN1YmZvcm0gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRTdWJGb3JtQ3RybEJ5TmFtZShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIGxldCBndWlQYXJlbnRUYXNrOiBUYXNrQmFzZTtcclxuICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGd1aVBhcmVudFRhc2sgPSA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuICAgICAgICAgZGVzdFN1YkZvcm0gPT09IG51bGwgJiYgZ3VpUGFyZW50VGFzayAhPT0gbnVsbCAmJiBndWlQYXJlbnRUYXNrLmdldEZvcm0oKSAhPT0gbnVsbDtcclxuICAgICAgICAgZ3VpUGFyZW50VGFzayA9IGd1aVBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgZGVzdFN1YkZvcm0gPSA8TWdDb250cm9sPmd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY3RybE5hbWUsIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICBpZiAoZGVzdFN1YkZvcm0gPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghZ3VpUGFyZW50VGFzay5Jc1N1YkZvcm0gfHwgTlN0cmluZy5FcXVhbHMoZ3VpUGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKS5OYW1lLCBjdHJsTmFtZSwgdHJ1ZSkpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkZXN0U3ViRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHN1ZmZpeERvbmUgcGFyYW1ldGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN1ZmZpeERvbmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWZmaXhEb25lID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldERlc3RpbmF0aW9uUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdFRibFJvdztcclxuICB9XHJcblxyXG4gIHNldFN1YkZvcm1DdHJsKHN1YkZvcm1DdHJsOiBNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLl9zdWJGb3JtQ3RybCA9PT0gbnVsbCAmJiBzdWJGb3JtQ3RybCAhPT0gbnVsbCk7XHJcbiAgICB0aGlzLl9zdWJGb3JtQ3RybCA9IHN1YkZvcm1DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBzdWJmb3JtIGNvbnRyb2wgdGhhdCBwb2ludHMgdG8gYSB0YXNrIHdob3NlIGlkIGlzIGdpdmVuIGluIHRhc2tJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj50aGUgaWQgb2YgcmVxdWVzdGVkIHN1YmZvcm0gb3duZXJUYXNrPC9wYXJhbT5cclxuICBnZXRTdWJGb3JtQ3RybEZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN1cnI6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcGFyZW50Q3RybFRhYjogQ29udHJvbFRhYmxlO1xyXG4gICAgbGV0IGd1aVBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGZvciAoZ3VpUGFyZW50Rm9ybSA9IHRoaXM7IGd1aVBhcmVudEZvcm0gIT0gbnVsbDsgZ3VpUGFyZW50Rm9ybSA9IGd1aVBhcmVudEZvcm0uUGFyZW50Rm9ybSkge1xyXG4gICAgICBwYXJlbnRDdHJsVGFiID0gZ3VpUGFyZW50Rm9ybS5DdHJsVGFiO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFyZW50Q3RybFRhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIGN1cnIgPSAoKHBhcmVudEN0cmxUYWIuZ2V0Q3RybChpKSBpbnN0YW5jZW9mIE1nQ29udHJvbCkgPyA8TWdDb250cm9sPnBhcmVudEN0cmxUYWIuZ2V0Q3RybChpKSA6IG51bGwpO1xyXG4gICAgICAgIGlmIChjdXJyICE9IG51bGwgJiYgY3Vyci5pc1N1YmZvcm0oKSAmJiAoY3Vyci5nZXRTdWJmb3JtVGFza0lkKCkgIT0gbnVsbCkpXHJcbiAgICAgICAgICBpZiAoY3Vyci5nZXRTdWJmb3JtVGFza0lkKCkgPT09IHRhc2tJZCkge1xyXG4gICAgICAgICAgICBkZXN0U3ViRm9ybSA9IGN1cnI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGVzdFN1YkZvcm0gIT0gbnVsbClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBkZXN0U3ViRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNyZWF0ZSByZWNvcmRzIGJldHdlZW4gaWR4IGFuZCBlbmQgb2YgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICByZW1vdmVSZWNvcmRzQWZ0ZXJJZHgoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByZW1vdmVBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBpbiBzb21lIGNhc2VzIGludmlzaWJsZSAtMSByb3cgKHRoYXQgZXhpc3Qgb25seSBmb3Igc2Nyb2xsYmFyIGVmZmVjdHMpIGJlY29tZXMgdmlzaWJsZS5cclxuICAgIC8vIFRvIHByZXZlbnQgdGhpcyB3ZSdsbCByZW1vdmUgYWxsIHJlY29yZHMuIFRoaXMgd2lsbCBub3QgY2F1c2UgcGVyZnJvbWFuY2UgcHJvYmxlbXMgc2luY2VcclxuICAgIC8vIHdlIHdpbGwgYWRkIG1heGltdW0gcm93SW5QYWdlIHJlY29yZHMgbW9yZSB0aGVuIHdlIGludGVuZGVkIGluIHRoZSBiZWdpbmluZ1xyXG5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKVxyXG4gICAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGlkeCA8PSB0aGlzLl9yb3dzSW5QYWdlICsgMSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID4gdGhpcy5fcm93c0luUGFnZSlcclxuICAgICAgICBpZHggPSAwO1xyXG4gICAgICBpZiAoaWR4ID09PSAwKVxyXG4gICAgICAgIHJlbW92ZUFsbCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgIHN1cGVyLlNldFRhYmxlSXRlbXNDb3VudChpZHgsIHJlbW92ZUFsbCk7XHJcbiAgICAgIC8vIHVwZGF0ZXMgdGFibGUgaXRlbSdzIGNvdW50XHJcblxyXG4gICAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHJvdyBpcyB2YWxpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNSb3dWYWxpZGF0ZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeCB8fCBpZHggPCAwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgcm93ID0gPFJvdz50aGlzLlJvd3MuZ2V0X0l0ZW0oaWR4KTtcclxuICAgIGlmIChyb3cgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHJvdy5DcmVhdGVkICYmIHJvdy5WYWxpZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcnVucyBpbiBXb3JrZXIgdGhyZWFkIHdoZW4gdGhlIHRocmVhZCBpcyBmcmVlIGFuZCBzZW5kIHRvIEdVSSB0aHJlYWQgY29udHJvbHMgZGF0YSBvZiBhbGwgcm93c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgdHJhbnNmZXJEYXRhVG9HdWkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBtYXhUaW1lOiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpICsgTWdGb3JtLlRJTUVfTElNSVQ7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJlbnRFZGl0aW5nQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2w7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgICAgLy8gdGhpcyBsaW1pdGF0aW9uIGlzIG5lZWRlZCBzbyB0aGlzIHJlcXVlc3Qgd2lsbCBuZXZlciB0YWtlIHRvbyBtdWNoIHRpbWVcclxuICAgICAgd2hpbGUgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgPCBtYXhUaW1lICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ICsgMSA+PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgLy8gYWxsIHJvd3MgYWxyZWFkeSBzZW50XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSAmJiB0aGlzLl9sYXN0Um93U2VudCArIDEgPj0gdGhpcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xhc3RSb3dTZW50Kys7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKHRoaXMuX2xhc3RSb3dTZW50KSkge1xyXG4gICAgICAgICAgLy8gcm93IG5lZWRzIHRvIGJlIHNlbnRcclxuICAgICAgICAgIC8vIHNlbmQgcm93IGRhdGFcclxuICAgICAgICAgIHN1cGVyLmNoZWNrQW5kQ3JlYXRlUm93KHRoaXMuX2xhc3RSb3dTZW50KTtcclxuICAgICAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCAhPT0gc2F2ZVJvd0lkeCkge1xyXG4gICAgICAgICAgICBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDsgLy8gcmVzZXQgdGhlIGZsYWdcclxuICAgICAgICAgICAgLy8gaXJyZWxldmFudCBmb3IgdHJlZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuX2xhc3RSb3dTZW50LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHJlc3RvcmUgcHJldmlvdXMgY3VycmVudCByZWNvcmRcclxuICAgICAgaWYgKHVwZGF0ZWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCwgYmtwUmVjb3JkKTtcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IGN1cnJlbnRFZGl0aW5nQ29udHJvbDsgLy8gc2V0IHRoZSBmbGFnIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIHRoaXMuX3RyYW5zZmVyaW5nRGF0YSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGFueSByb3dzIG5lZWQgdG8gYmUgc2VudCB0byBHVUkgdGhyZWFkXHJcbiAgLy8vICAgaWYgdGhlcmUgYXJlLCBwdXRzIGV2ZW50IGluIGV2ZW50IHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmIHRoaXMuT3BlbmVkICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpO1xyXG4gICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgPj0gdGhpcy5Sb3dzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIHdoZW4gd2UgZGVjcmVhc2Ugc2l6ZSBvZiByb3dzIGFycmF5IGFkanVzdCBsYXN0Um93U2VudFxyXG4gICAgICAgIHRoaXMuX2xhc3RSb3dTZW50ID0gdGhpcy5Sb3dzLmxlbmd0aCAtIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHRoZXJlIGFyZSByb3dzIHRvIHNlbmQgYW5kIHRoZXJlIGlzIG5vdyByZXF1ZXN0IGZvciByb3dzIHlldFxyXG4gICAgICAvLyBhZGQgcmVxdWVzdCBmb3Igcm93c1xyXG4gICAgICBsZXQgdHJhbnNmZXJEYXRhVG9HdWk6IGJvb2xlYW4gPSB0aGlzLl9sYXN0Um93U2VudCA8IChzaXplIC0gMSk7XHJcblxyXG4gICAgICAvLyBGb3IgcGFnaW5hdGVkIHRhYmxlIGNoZWNrIHRoZSBtYXggcm93cyBvZiBHVUkgdGFibGUgY29udHJvbC5cclxuICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkgJiYgKHRoaXMuX2xhc3RSb3dTZW50ICsgMSkgPj0gdGhpcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpKVxyXG4gICAgICAgIHRyYW5zZmVyRGF0YVRvR3VpID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodHJhbnNmZXJEYXRhVG9HdWkgJiYgIXRoaXMuX3RyYW5zZmVyaW5nRGF0YSkge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eSh0aGlzLl90YWJsZU1nQ29udHJvbCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RWX1RPX0dVSSwgUHJpb3JpdHkuTE9XRVNUKTtcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcmluZ0RhdGEgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc2hvdWxkRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyICYmICF0cmFuc2ZlckRhdGFUb0d1aSAmJiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSB8fCAhdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSkpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkodGhpcy5fdGFibGVNZ0NvbnRyb2wsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GRVRDSF9SRUNPUkRTX0FIRUFEX0ZST01fU0VSVkVSLCBQcmlvcml0eS5MT1dFU1QpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByb3cgZGF0YSBmb3IgdGhlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzaXJlZFRvcEluZGV4XCI+ZGVzaXJlZCB0b3AgaW5kZXggaWYgZGVzaXJlZFRvcEluZGV4IGlzIEludGVnZXIuTUlOX1ZBTFVFLCB0b3AgaW5kZXggaXMgY2VjaWV2ZWQgZm9ybSBkdjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3JkcywgZXZlbiBpZiB0aGV5IGFyZSBjcmVhdGVkIGFuZCB2YWxpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4gKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBkaWZmOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGdldFByZXZDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGdldE5leHRDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZGVzaXJlZFRvcEluZGV4ICE9PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAoZGVzaXJlZFRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgcmVxdWVzdCBmb3IgbGluZSBvciBwYWdlIGJlZm9yZSBjdXJyZW50IGNodW5rXHJcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoZSB0b3AgaW5kZXggaXMgYWx3YXlzIDBcclxuICAgICAgICBnZXRQcmV2Q2h1bmsgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZGVzaXJlZFRvcEluZGV4ICsgdGhpcy5fcm93c0luUGFnZSArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSlcclxuICAgICAgLy8gcGFnZWRvd24gb3IgYXJyb3dkb3duIGF0IGVuZCBvZiB0aGUgZGF0YXZpZXdcclxuICAgICAgICBnZXROZXh0Q2h1bmsgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBkZXNpcmVkVG9wSW5kZXggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcblxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuXHJcbiAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW0oZGlmZik7XHJcbiAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5yZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwsIHNhdmVSb3dJZHgsIGRpZmZSZWYpO1xyXG4gICAgZGlmZiA9IGRpZmZSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKChnZXRQcmV2Q2h1bmsgJiYgZGlmZiAhPT0gMCkgfHwgZ2V0TmV4dENodW5rKSB7XHJcbiAgICAgIC8vIGlmIGRpZmYgIT0gMCBhIG5ldyBjaHVuayB3YXMgYnJvdWdodCB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIGR2XHJcbiAgICAgIC8vIHNldCB0b3AgaW5kZXggdG8gZmlyc3QgcmVxdWVzdGVkIGluZGV4XHJcbiAgICAgIC8vIGlmIG5leHQgY2h1bmsgd2FzIGJyb3VnaHQsIHRvcCBpbmRleCBtYXkgYWxzbyBiZSB1cGRhdGVkXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoZGVzaXJlZFRvcEluZGV4ICsgZGlmZik7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICBpZiAodGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgLy8gaWYgdG9wIGluZGV4IHdhcyB1cGRhdGVkIGluIHRoZSBzZXRUYWJsZVRvcEluZGV4IC0gd2UgbWlnaHQgaGF2ZSByb3dzIHRoYXQgd2VyZSBub3QgcmVmcmVzaGVkXHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgIC8vIGFueSByb3cgd2FzIHVwZGF0ZWRcclxuICAgICAgLy8gcmVzdG9yZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCArIGRpZmYsIGJrcFJlY29yZCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIGFzayB0YWJsZSB0byByZWZyZXNoIHRoZSBwYWdlXHJcblxyXG4gICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICBpZiAoZ2V0UHJldkNodW5rKSB7XHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBmb2N1c2VkXHJcbiAgICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldFBhcmVudFRhYmxlKCkgPT09IHRoaXMuX3RhYmxlTWdDb250cm9sKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoZXMgcm93cyBpbiB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzYXZlUm93SWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpZmZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgc2F2ZVJvd0lkeDogbnVtYmVyLCBkaWZmUmVmOiBSZWZQYXJhbTxudW1iZXI+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZGlmZlJlZi52YWx1ZSA9IDA7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiA9IHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCk7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Jvd3NJblBhZ2U7IGkrKykge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBkZXNpcmVkVG9wSW5kZXggKyBpO1xyXG4gICAgICBsZXQgcHJldlRvcElkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIGlmIHdlIGZhaWwgdG8gZ2V0IG9uZSByZWNvcmQsIHdlIG1heSBzdWNjZWVkIHRvIGdldCB0aGUgbmV4dCBvbmVcclxuICAgICAgICBpbmRleCA9IGlkeCArIGRpZmZSZWYudmFsdWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKGlkeCkgfHwgc2VuZEFsbCB8fCB0aGlzLlJlZnJlc2hBbGxSb3dzKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMClcclxuICAgICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGlmIChzYXZlUm93SWR4ICsgZGlmZlJlZi52YWx1ZSAhPT0gaW5kZXgpIHsgLy8gbm90IGN1cnJlbnQgbGluZVxyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaW5kZXgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIGEgbmV3IGNodW5rIGlzIGJyb3VnaHQgdG9wIGluZGV4IHdpbGwgYmUgY2hhbmdlZFxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpbmRleCkpXHJcbiAgICAgICAgICAgIHN1cGVyLm1hcmtSb3dOT1RDcmVhdGVkKGluZGV4KTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gUUNSICMyNjEwNTUsIGV2ZW4gc28gcmVxdWlyZWQgcmVjb3JkIG1heSBub3QgYmUgZm91bmQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBuZXcgY2h1bmsgaGFzIGJlZW4gc2VudFxyXG4gICAgICAgIC8vIGFuZCBkaWZmIG11c3QgYmUgdXBkYXRlZFxyXG4gICAgICAgIGRpZmZSZWYudmFsdWUgPSBkaWZmUmVmLnZhbHVlICsgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAtIHByZXZUb3BJZHgpO1xyXG4gICAgICAgIHByZXZUb3BJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgaWYgKCF1cGRhdGVkICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5EYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdCwgb3JnSW5jbHVkZXNMYXN0KSlcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHJvdyBpbiB0aGUgcGFnZTwvcmV0dXJucz5cclxuICBnZXRWaXNpYmxlTGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIGN1cnJSZWNJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIHJldHVybiBjdXJyUmVjSWR4IC0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhc3NlcnRzIHRoYXQgY3VycmVudCByZWNvcmQgaXMgaW4gdGhlIHZpZXcsIGlmIGl0IGlzIG5vdCBvbiB0aGUgcGFnZSwgYWRqdXN0cyB0b3AgaW5kZXgsIHNvIHRoYXQgY3VycmVudFxyXG4gIC8vLyAgIHJlY29yZCB3aWxsIGJlIG9uIHRoZSB2aXNpYmxlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJyaW5nUmVjb3JkVG9QYWdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGxldCB0b3BJbmRleDogbnVtYmVyID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgbGV0IG5ld1RvcEluZGV4OiBudW1iZXIgPSB0b3BJbmRleDtcclxuXHJcbiAgICAgIC8vIFRhYmxlIHRvcCBpbmRleCBmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZVxyXG4gICAgICBpZiAoIXRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICBpZiAodG9wSW5kZXggPiBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0b3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxIDwgY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9yb3dzSW5QYWdlID4gMClcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4IC0gdGhpcy5fcm93c0luUGFnZSArIDE7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSB0b3AgaW5kZXggZm9yIHBhZ2luYXRlZCB0YWJsZS5cclxuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGluZGV4IG9mIGZpcnN0IHJlY29yZCBvbiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHJlY29yZCB0byBiZSBzZWxlY3RlZC5cclxuICAgICAgICBsZXQgY3Vyckd1aUlkeCA9IHRoaXMuZ2V0R3VpUm93aWR4KGN1cnJJZHgpO1xyXG4gICAgICAgIGxldCBuZXdUb3BHdWlJbmRleCA9IChjdXJyR3VpSWR4KSAtICgoY3Vyckd1aUlkeCkgJSB0aGlzLl9yb3dzSW5QYWdlKTsgLy9ndWkgaWR4IG9mIGZpcnN0IHJlY29yZCBvZiByZXNwZWN0aXZlIHBhZ2VcclxuXHJcbiAgICAgICAgbmV3VG9wSW5kZXggPSB0aGlzLmdldER2Um93SWR4KG5ld1RvcEd1aUluZGV4KTtcclxuXHJcbiAgICAgICAgaWYobmV3VG9wSW5kZXggIT09IHRoaXMuX3ByZXZHdWlUb3BJbmRleCB8fCB0aGlzLklzTW92aW5nSW5WaWV3IClcclxuICAgICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBiZSBjdXJyZW50IGxpbmVcclxuICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAhPT0gbmV3VG9wSW5kZXggfHwgdGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChuZXdUb3BJbmRleCk7XHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKEludDMyLk1pblZhbHVlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnZhbGlkYXRlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbnZhbGlkYXRlVGFibGUoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5Sb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCByb3c6IFJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAocm93ICE9PSBudWxsKVxyXG4gICAgICAgIHJvdy5WYWxpZGF0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBwcmV2aW91cyB2aXNpYmxlIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRQcmV2TGluZShsaW5lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGxpbmUgLSAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBzb3J0IG1hcmsoZGVsdGEpIGZyb20gdGhlIGNvbHVtbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2xlYXJTb3J0TWFya1wiPjwvcGFyYW0+XHJcbiAgY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKGNsZWFyU29ydE1hcms6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjbGVhclNvcnRNYXJrKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHN0b3AgdGhlIHJvdyBmcm9tIGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBhc3luYyBzdG9wUm93RWRpdGluZyhpZHg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICBpZiAodGhpcy5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGlkeCkpIHtcclxuICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX05PVF9JU19ST1dfRURJVElORywgdGhpcywgIHRoaXMuaXNMaW5lTW9kZSgpICA/IGlkeCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgIH1cclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHN0YXJ0IHRoZSByb3cgZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHN0YXJ0Um93RWRpdGluZyhpZHg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoIXRoaXMuZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShpZHgpKSB7XHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9JU19ST1dfRURJVElORywgdGhpcywgdGhpcy5pc0xpbmVNb2RlKCkgPyBpZHggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCByZXR1cm4gaWYgdGhlIHJvdyBpcyBpbiBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcHVibGljIGdldElzUm93RWRpdGluZ0Zyb21HdWkoZGlzcGxheUluZGV4Om51bWJlciApOiBib29sZWFuIHtcclxuICAgIGxldCBpc1Jvd0VkaXRpbmc6IGJvb2xlYW4gPSBDb21tYW5kcy5nZXRJc1Jvd0VkaXRpbmcodGhpcywgdGhpcy5pc0xpbmVNb2RlKCkgPyBkaXNwbGF5SW5kZXggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICByZXR1cm4gaXNSb3dFZGl0aW5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0aGUgZGlzcGxheSwgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShyZWZyZXNoVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gVGFrZSBhbm90aGVyIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBvZiBRQ1JzICM5ODQ5OTksICM5MzM2MzkgJiAjNjk5ODIxOlxyXG4gICAgLy8gTm93LCB0aGUgZGlzcGxheSB3b3VsZCBiZSByZWZyZXNoZWQgb25seSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgTk9UIGFuIG9sZFxyXG4gICAgLy8gcmVjb3JkIHdoaWNoIGlzIGJlaW5nIGNvbXB1dGVkLiBUaGUgcmVzdWx0IG9mIHRoaXMgY2hhbmdlIGlzIHRoYXQgZHVyaW5nIHRoZVxyXG4gICAgLy8gY29tcHV0ZSBwcm9jZXNzIG9mIGEgcmVjb3JkIHRoZSBkaXNwbGF5IGlzIG5vdCByZWZyZXNoZWQgKHdoaWNoIGlzIGdvb2QgZm9yIHVzKS5cclxuICAgIC8vIFRoZSBkaXNwbGF5IHdvdWxkIGJlIHJlZnJlc2hlZCBhbnl3YXkgQUZURVIgdGhlIGNvbXB1dGUgcHJvY2VzcyBpcyBkb25lLlxyXG4gICAgLy8gKEVodWQgMjEtTUFZLTIwMDIpXHJcbiAgICBpZiAoY3VyclJlYyAhPT0gbnVsbCAmJiBjdXJyUmVjLkluQ29tcHV0ZSAmJiAhY3VyclJlYy5pc05ld1JlYygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2luUmVmcmVzaERpc3ApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2luUmVmcmVzaERpc3AgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNIHx8IHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybSBhbmQgcmVmcmVzaCBpdFxyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpICYmIHRoaXMuT3BlbmVkKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0gfHwgcmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpIHtcclxuICAgICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMgJiYgc3VwZXIuaGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUHJldkNodW5rRm9yQ3VycmVudFBhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgZm9ybSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaFByb3BzKCk7XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgY3VycmVudCByZWNvcmQvUm93XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfSBpbiB0YXNrIHsyfVwiLCBleC5HZXRUeXBlKCksIGV4Lk1lc3NhZ2UsICg8VGFza0Jhc2U+c3VwZXIuZ2V0VGFzaygpKS5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luUmVmcmVzaERpc3AgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaWduYWwgd2UgY29tcGxldGVkIHRoZSBmaXJzdCBjeWNsZSBvZiByZWZyZXNoaW5nIHRoZSBmb3JtXHJcbiAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMgJiYgKCFzdXBlci5pc0xpbmVNb2RlKCkgfHwgdGhpcy5fdGFibGVSZWZyZXNoZWQpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkZvcm1SZWZyZXNoZWQgPSB0cnVlO1xyXG4gICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuU0VUX1dDX0lETEUsIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hVSSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRUYXNrKCkuaXNNYWluUHJvZygpIC8qJiYgSW5pdGlhbGl6YXRpb25GaW5pc2hlZCovKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIGZvcm1zIHdpdGggdGFibGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWJsZSgpOiBQcm9taXNlPHZvaWQ+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+XHJcbiAgYXN5bmMgZmlyc3RUYWJsZVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgc3VwZXIuZmlyc3RUYWJsZVJlZnJlc2goKTtcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEluc2VydFRhYmxlSXRlbXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUm93cy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgICAgdGhpcy5JbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBzZXRUYWJsZUl0ZW1zQ291bnQocmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXI7XHJcblxyXG4gICAgLy8gRm9yIGFic29sdXRlIHNjcm9sbGJhciwgc2V0IHRoZSB2aXJ0dWFsIGl0ZW1zIGNvdW50IGFjY29yZGluZ2x5LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKSB7XHJcblxyXG4gICAgICAvLyBJZiB0YXNrIGlzIG1vdmVkIGludG8gQ1JFQVRFIG1vZGUgYW5kIGN1cnJlbnRseSBuZXcgbGluZSBpcyBjcmVhdGVkXHJcbiAgICAgIC8vIHRoZW4gb25seSBuZXdseSBjcmVhdGVkIHJlY29yZHMgc2hvdWxkIGJlIHNlZSBvbiB0aGUgc2NyZWVuXHJcbiAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50VmlldygwKTtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFRhYmxlIHdpdGggc2V0IG9mIHJlY29yZHMgT1IgaWYgZW1wdHkgdGFibGUgdGhlbiB0YWJsZUl0ZW1zQ291bnQgc2hvdWxkIG5vdCBiZSAwLCBhcyB3ZSBhbHdheXMgaGF2ZSAwdGggcm93LlxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9ICh0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSA/IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDogMTtcclxuICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCksIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMCgpOiB2b2lkIHtcclxuICAgIGxldCBkdlNpemU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgdGFibGUgY29udHJvbCBmb3IgdGhlIGZpcnN0IHRpbWUgd2hpbGUgY3JlYXRpbmcgdGhlIGZvcm0gd2l0aCB0b3RhbFJlY29yZHNDb3VudCBhbmQgYWxzb1xyXG4gICAgLy8gc2V0IHRoZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcsIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZmlyc3Qgcm93IGF0IHJlc3BlY3RpdmUgbG9jYXRpb24gaW4gY2FzZSBvZiBsb2NhdGUuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCBmYWxzZSk7XHJcbiAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGFibGUgY29udHJvbCdzIHJvd3MgdG8gJ3RhYmxlSXRlbXNDb3VudCcgY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2U2l6ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFibGVJdGVtc0NvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZW1vdmVBbGxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChyZW1vdmVBbGwpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLklzT25lV2F5S2V5KTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdXBlci5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0b3AgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldFRhYmxlVG9wSW5kZXgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICAgICAgLy8gdGFibGUgbm93IGJlaGF2ZXMgbGlrZSBsaXN0dmlldywgaXQgY2FuIG5vdCBzaG93IGVtcHR5IGxpbmVzXHJcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHVwZGF0ZSB0b3AgaW5kZXhcclxuICAgICAgICAgIGlmIChpbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgPiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkbyBzaG93IGVtcHR5IGxpbmVzIGlmIGluY2x1ZGVGaXJzdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGxlc3MgcmVjb3JkcyB0aGVuIHJvd3Mgb24gc2NyZWVuIFFDUiAjISEhISEhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIHRoaXMuX3Jvd3NJblBhZ2UsIDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoaW5kZXgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldykge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGluZGV4KTtcclxuICAgICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSB0aGlzLmdldEd1aVJvd2lkeChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIHRoZSB3aW5kb3cgZGVmaW5lZCBieSB0aGlzIGZvcm0gYW5kIGl0cyBjaGlsZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3JlYXRlRm9ybSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLmNyZWF0ZUZvcm0oKTtcclxuICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMuYWRkKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZXMgdGhlIHN0cmluZyBvciBzZXRzIHRoZSBpbWFnZSBvbiB0aGUgcGFuZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhbmVJZHhcIj5JbmRleCBvZiB0aGUgcGFuZSB0byBiZSB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJJbmZvXCI+TWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+U291bmQgYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFVwZGF0ZVN0YXR1c0JhcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBpbiBXZWJDbGllbnQuXHJcbiAgICAvLyBpZiAocGFuZUlkeCA9PSBDb25zdGFudHMuU0JfTVNHX1BBTkVfTEFZRVIgfHwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFNob3dTdGF0dXNCYXJQYW5lcygpKVxyXG4gICAgLy8gICBiYXNlLlVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4LCBzdHJJbmZvLCBzb3VuZEJlZXApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSByZWNvbXB1dGUgdGFibGUgZm9yIHRoYXQgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGUgZm9ybVwiKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5pbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IHRhc2s9XCIgKyB0aGlzLl90YXNrICsgXCIsIElkPVwiICsgdGhpcy5fdXNlclN0YXRlSWQgKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYnVpbGQgdGhlIFhNTCBlbnRyeSBvZiB0aGUgaGlkZGVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgeG1sOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ICE9PSBudWxsICYmIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHdyaXRlIHRoZSBpZFxyXG4gICAgICB4bWwuQXBwZW5kKFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hJRERFTl9DT05UT0xTICsgXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTTlMgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0LmZvckVhY2goKGNoYW5nZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgeG1sLkFwcGVuZChjaGFuZ2UgKyBcIixcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgeG1sLlJlbW92ZSh4bWwuTGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICB4bWwuQXBwZW5kKFwiXFxcIi8+XCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIEZvciBSSUEsIE5vbiBJbnRlcmFjdGl2ZSB0YXNrJ3MgYW5kIGl0cyBhbGwgY2hpbGQgdGFzayBzaG91bGQgYmVoYXZlIGFzIGEgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2hvdWxkQmVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBhbmQgaXRzIGNoaWxkcmVuIHdpbGwgYmUgb3BlbmVkIHVzaW5nIHNob3cgZGlhbG9nIHRvIHByZXZlbnQgZXZlbnRzIG9uIHRoZWlyIGFuY2VzdG9yc1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpKVxyXG4gICAgICBzaG91bGRCZU1vZGFsID0gVGFza0Jhc2UuU2hvdWxkTm9uSW50ZXJhY3RpdmVCZU1vZGFsKCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2tCYXNlID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5QYXJlbnRUYXNrO1xyXG4gICAgICBpZiAocGFyZW50VGFzayAhPT0gbnVsbCAmJiAhcGFyZW50VGFzay5Jc0ludGVyYWN0aXZlICYmICFwYXJlbnRUYXNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBzaG91bGRCZU1vZGFsID0gcGFyZW50VGFzay5TaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRCZU1vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFnaW5hdGVkIHRhYmxlIGJlaW5nIHVzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAoPE1nQ29udHJvbD50aGlzLl90YWJsZU1nQ29udHJvbCkuSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidWlsZEZvcm1OYW1lKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gIHRoaXMuVW5pcXVlTmFtZTtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLmdldFRhc2soKTtcclxuXHJcbiAgICBuYW1lID0gKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgJ18nICsgbmFtZTtcclxuICAgIHdoaWxlICh0YXNrLklzU3VidGFzaykge1xyXG4gICAgICB0YXNrID0gPFRhc2tCYXNlPnRhc2suU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCkgOiBUbyBmZXRjaCBwcmV2aW91cyBjaHVuayBvZiByZWNvcmRzIGlmIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNQb3NPblBhZ2U6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgJSB0aGlzLl9yb3dzSW5QYWdlO1xyXG5cclxuICAgICAgLy8gSWYgcmVjb3JkIGlzIG5vdCB0aGUgZmlyc3QgcmVjb3JkIG9uIHBhZ2UsIGZldGNoIHByZXZpb3VzIHJlY29yZCBmb3IgdGhhdCBwYWdlLlxyXG4gICAgICAvLyBUT0RPIDogdGhpcy5EaXNwbGF5TGluZSAtIENoZWNrIHdoZXRoZXIgY2FuIGJlIHJlbW92ZWQgP1xyXG4gICAgICBpZiAocmVjUG9zT25QYWdlID4gMCAmJiB0aGlzLkRpc3BsYXlMaW5lID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKC1yZWNQb3NPblBhZ2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3VpUm93aWR4KGR2Um93SWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGR2Um93SWR4ICsgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcblxyXG4gIGdldER2Um93SWR4KGd1aVJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBndWlSb3dJZHggLSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gIH1cclxufVxyXG4iXX0=
|