@magic-xpa/engine 4.901.0-dev491.323 → 4.901.0-dev491.324

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.
@@ -1086,8 +1086,8 @@ export class MgForm extends MgFormBase {
1086
1086
  }
1087
1087
  }
1088
1088
  }
1089
- async createForm() {
1090
- await super.createForm();
1089
+ createForm() {
1090
+ super.createForm();
1091
1091
  MgForm.CreatedForms.add(this);
1092
1092
  }
1093
1093
  UpdateStatusBar() {
@@ -1173,4 +1173,4 @@ export class MgForm extends MgFormBase {
1173
1173
  }
1174
1174
  MgForm.TIME_LIMIT = 50;
1175
1175
  MgForm._createdForms = new CreatedFormVector();
1176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sYUFBYSxFQUNiLElBQUksRUFDSixRQUFRLEVBQ1IsWUFBWSxFQUViLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFXLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTTdDLE1BQU0sT0FBTyxNQUFPLFNBQVEsVUFBVTtJQW9CcEM7UUFDRSxLQUFLLEVBQUUs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QkFBNEIsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7WUFDbkYsSUFBSSxZQUFZLEdBQVcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFJMUYsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxFQUFFO2dCQUM5QyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDN0M7U0FDRjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBaUI7UUFDM0IsT0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2pFLENBQUM7O0FBaHdEYyxpQkFBVSxHQUFXLEVBQUUsQ0FBQztBQVloQyxvQkFBYSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIENvbnRyb2xUYWJsZSxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgR3VpRW52aXJvbm1lbnQsXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSb3dcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1pc2MsXHJcbiAgUHJpb3JpdHksXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEV4Y2VwdGlvbixcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4vTWdDb250cm9sJztcclxuaW1wb3J0IHtSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9ufSBmcm9tICcuLi9kYXRhL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3LCBTRVRfRElTUExBWUxJTkVfQllfRFZ9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQge1Rhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4uL3JlbW90ZS9TZXJ2ZXJFcnJvcic7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7Q3JlYXRlZEZvcm1WZWN0b3J9IGZyb20gJy4vQ3JlYXRlZEZvcm1WZWN0b3InO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZvcm0+Li4uPC9mb3JtPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgTWdGb3JtIGV4dGVuZHMgTWdGb3JtQmFzZSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVElNRV9MSU1JVDogbnVtYmVyID0gNTA7IC8vIHRpbWUgbGltaXQgZm9yIG9uZSB0cmFuc2ZlciBvcGVyYXRpb24gKGluIG1pbGxpIHNlY29uZHMpXHJcbiAgSXNNb3ZpbmdJblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcmV2RGlzcGxheUxpbmU6IG51bWJlciA9IDA7IC8vIGRpc3BsYXkgaWRlbnRpZmllciBvZiBwcmV2IGxpbmVcclxuICBSZWZyZXNoQWxsUm93czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBJZ25vcmVGaXJzdFJlY29yZEN5Y2xlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTW92ZWRUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIHdoZW4gbW92ZSB0byBmaXJzdCBjb250cm9sIHNob3VsZCBiZSBleGVjdXRlZCBvbiB0aGUgZm9ybVxyXG5cclxuICBwcml2YXRlIF9zdWZmaXhEb25lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaGlkZGVuQ29udHJvbHNJc25zTGlzdDogTGlzdDxudW1iZXI+ID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIF9jcmVhdGVkRm9ybXM6IENyZWF0ZWRGb3JtVmVjdG9yID0gbmV3IENyZWF0ZWRGb3JtVmVjdG9yKCk7XHJcblxyXG4gIC8vVE9ETzogTWF5YmUgdGhlIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIGxpa2UgYWxsb3dGaWVsZENvbXB1dGVcclxuICBwcml2YXRlIF90cmFuc2ZlcnJpbmdEYXRhVG9HVUk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBpc0ZldGNoaW5nUmVjb3Jkc0FoZWFkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXQgQ3JlYXRlZEZvcm1zKCk6IENyZWF0ZWRGb3JtVmVjdG9yIHtcclxuICAgIHJldHVybiBNZ0Zvcm0uX2NyZWF0ZWRGb3JtcztcclxuICB9XHJcblxyXG4gIGdldCBJblJlc3RvcmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5SZXN0b3JlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyYW5zZmVycmluZ0RhdGFUb0dVSSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvdWxkRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgbGV0IHByb3AgPSB0aGlzLl90YWJsZU1nQ29udHJvbC5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEKTtcclxuXHJcbiAgICAgIHJldHVybiAocHJvcCAhPSBudWxsID8gcHJvcC5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpIDogZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIHRhc2sgZGF0YXZpZXcsIGlmIHRoZSB0YXNrIGV4aXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dGhlIHRhc2sgZGF0YXZpZXc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXREYXRhdmlldygpOiBEYXRhVmlldyB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fdGFzayAhPSBudWxsKVxyXG4gICAgICBkdiA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG5cclxuICAgIHJldHVybiAoZHYpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmUgb25lIHBhZ2Uvcm93IHVwL2Rvd24gb3IgdG8gdGhlIGJlZ2lubmluZy9lbmQgb2YgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidW5pdFwiPnRvIG1vdmUgaW50bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJEaXJlY3Rpb25cIj5vZiBtb3Zpbmc8L3BhcmFtPlxyXG4gIGFzeW5jIG1vdmVJblZpZXcodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpO1xyXG4gICAgbGV0IG9sZFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBsZXQgcmV0dXJuVG9WaXNpYmxlTGluZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlY29yZE91dE9mVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHZpc2libGVMaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuSXNNb3ZpbmdJblZpZXcgPSB0cnVlO1xyXG4gICAgICBsZXQgb2xkRGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuRGlzcGxheUxpbmU7XHJcblxyXG4gICAgICAvLyB0YWJsZSBtb3ZlbWVudHMgKGZpcnN0IC8gbGFzdCByZWNvcmQpXHJcbiAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIEJFR0lOSU5HIE9GIFRBQkxFXHJcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfRklSU1RfUkVDT1JELCB0cnVlLCBmYWxzZSwgdHJ1ZSxcclxuICAgICAgICAgICAgICBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHRhYmxlIGluIHRoZSBmb3JtXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSgwLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBFTkQgT0YgVEFCTEVcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KENvbnN0YW50cy5NR19EQVRBVklFV19MQVNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlICsgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA+PSAwKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBwYWdlIGFuZCByb3cgbW92ZW1lbnRzXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0VG9wSW5kZXhGcm9tR1VJKCk7XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcmVjb3JkcyB0byBza2lwXHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlcjtcclxuICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmIHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xyXG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTjpcclxuICAgICAgICAgICAgICBzaXplID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EOlxyXG5cclxuICAgICAgICAgICAgICBsZXQgbGFzdDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5fcm93c0luUGFnZSAtIDE7XHJcbiAgICAgICAgICAgICAgbGFzdCA9IE1hdGgubWluKGxhc3QsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxKTtcclxuICAgICAgICAgICAgICBzaXplID0gbGFzdCAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgcmV0dXJuVG9WaXNpYmxlTGluZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuX3Jvd3NJblBhZ2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHNpemUgPSAxO1xyXG5cclxuICAgICAgICBzaXplID0gKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgfHxcclxuICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTlxyXG4gICAgICAgICAgPyAtc2l6ZVxyXG4gICAgICAgICAgOiBzaXplKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA8IDApIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSAwO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nIHRoZSB0YWJsZSBvbmUgcGFnZSBvciBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKSB8fFxyXG4gICAgICAgICAgICB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB2aXNpYmxlTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmIHZpc2libGVMaW5lID09PSAwKSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBwcmV2aW91cyByb3cgYnV0IHdlIGFyZSBhdCB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJlxyXG4gICAgICAgICAgICAgICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyB8fCB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UpICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIG5leHQgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGxhc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgc2l6ZSk7XHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZCh0cnVlKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0aGlzLl9zdWZmaXhEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5NTQ5Njogd2hlbiB0aGUgcmVjb3JkIHN1ZmZpeCBmYWlsZWQgZ28gYmFjayB0byB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQgIT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHModGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5MjEwMTogaWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgdGhlIHJlYyBzdWZmaXhcclxuICAgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGV4ZWN1dGVkIHNvIHdlIG11c3QgaGFuZGxlIGl0IGJlZm9yZSB3ZSBnbyB0byBhIG5ldyByb3dcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlY0lkOiBudW1iZXIgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlY0lkID09PSBvbGRSZWNJZCAmJiAhdGhpcy5fc3VmZml4RG9uZSlcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgNzU4NjM5XHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB0aGlzLmdldExhc3RWYWxpZFJvdygpLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJiBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbW92aW5nIHRoZSBtYXJraW5nIG9uZSByb3cgdXAgb3IgZG93blxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgb2xkVGFza01vZGUgPSB0aGlzLl90YXNrLmdldE1vZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgb2xkUmVjSWQgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lICsgc2l6ZSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIHdhcyBkZWxldGVkIGluIFJ1biBUaW1lIGJ5IEZvcmNlIERlbGV0ZSBmb3IgZXhhbXBsZVxyXG4gICAgICAgICAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDAgfHwgb2xkVGFza01vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPT0gLTEgfHwgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0cyhvbGREaXNwbGF5TGluZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSICMyOTM2NjhcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJza2lwcGVkIHNldGN1cnJSb3cgZm9yIHJvdyB7MH1cIiwgb2xkRGlzcGxheUxpbmUpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IGlmIGV2ZXJ5dGhpbmcgaXMgT0ssIGN1cnIgcmVjIHdpbGwgbGF0ZXIgYmUgcmVmcmVzaGVkIGluXHJcbiAgICAgICAgICAgICAgICAvLyBSRUNfUFJFRklYXHJcbiAgICAgICAgICAgICAgICAvLyB0aHVzLCByZWZyZXNoIG9ubHkgaW4gY2FzZSBvZiBlcnJvci5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgZXJyb3IgaXMgYmVjYXVzZSB0aGUgb2xkLXJlYyB3YXMgcmVtb3ZlZCAoY2FuY2VsRWRpdCdlZCksIHNvIHJlZnJlc2ggZm9ybS5cclxuICAgICAgICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVjRXhpc3RzQnlJZChvbGRSZWNJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM3NzUzMDk6IGlmIGxlYXZpbmcgdGhlIG5ldyBjcmVhdGVkIHJlY29yZCBmYWlsZWQgdGhlbiByZXN0b3JlXHJcbiAgICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgYSBuZXcgcmVjb3JkIHNvIHRoZSBuZXh0IGFjdGlvbiB3b3VsZFxyXG4gICAgICAgICAgICAgICAgICAvLyBcImtub3dcIiB0aGF0IGl0IGlzIHN0aWxsIGEgbmV3IHJlY29yZC5cclxuICAgICAgICAgICAgICAgICAgLy8gRGVmZWN0ICMgODE2MjcgOiBJZiB0YXNrIGlzIGhhdmluZyBhIHN1YmZvcm0sIHRoZW4gd2hpbGUgbW92aW5nIHRvIHN1YmZvcm0sIG5ld2x5IGNyZWF0ZWQgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgIC8vIGlzIHN5bmNlZCBhbmQgaXQgaXMgaW5zZXJ0ZWQgaW4gX21vZGlmaWVkVGFiIGFzICdpbnNlcnQnIHJlY29yZC4gU28sIGFueSByZXF1ZXN0IHRvIHNlcnZlciBpbnNlcnRzXHJcbiAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0byBzZXJ2ZXIuIEV2ZW4gaWYgd2UgZG9udCBnbyB0byBzZXJ2ZXIsIGl0IGlzIHRoZXJlIGluIF9tb2RpZmllZFRhYiBhcyBuZXcgcmVjb3JkLiBJbnNlcnRpbmdcclxuICAgICAgICAgICAgICAgICAgLy8gaGVyZSBhbHJlYWR5IHN5bmNlZCByZWNvcmQgY2F1c2VzIGluc2VydGlvbiBvZiByZWNvcmQgdHdpY2UuIFNvLCBJZiBjdXJyZW50IHJlY29yZCBpcyBub3Qgc3luY2VkIHRoZW4gb25seSBpbnNlcnQuXHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIWN1cnJSZWMuU3luY2VkICYmIG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5zZXROZXdSZWMoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk4MDUyODogUmVmcmVzaCB0aGUgY3VycmVudCByb3cgYWZ0ZXIgY2FuY2VsIGVkaXQgdG8gcmVmbGVjdFxyXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdG9yZWQgdmFsdWVzXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBvbGREaXNwbGF5TGluZSA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUgLSAxKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gMCB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkIGJ1ZyAjOjk0MTc2Mywgd2hpbGUgY3JlYXRlIGlzbid0IGFsbG93ZWQgbmVlZCB0byBkbyBzdWZmaXggYW5kIHByZWZpeCBvZiB0aGUgY3VycmVudCByZWNvcmRcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBkb1JlY29yZFN1ZmZpeDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVmZG9SZWNvcmRTdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGRvUmVjb3JkU3VmZml4KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkRvVGFza0xldmVsUmVjb3JkU3VmZml4KDxUYXNrQmFzZT50aGlzLl90YXNrLCByZWZkb1JlY29yZFN1ZmZpeCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkRvVGFza0xldmVsUmVjb3JkUHJlZml4KHRoaXMuX3Rhc2spO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZG9SZWNvcmRTdWZmaXggPSByZWZkb1JlY29yZFN1ZmZpeC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgdGhlIGZvcm0gZG9lcyBub3QgaGF2ZSBhIHRhYmxlLCBtb3ZlIHRvIG9uZSByb3cgaW4gdGhlIGNob3NlbiBEaXJlY3Rpb25cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLlByb2Nlc3NBYm9ydGluZ0Vycm9yKGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAocmV0dXJuVG9WaXNpYmxlTGluZSkge1xyXG4gICAgICAgIGlmIChyZWNvcmRPdXRPZlZpZXcpIHtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA9PT0gMClcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSk7XHJcbiAgICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdmlzaWJsZUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG5cclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGUuTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG5cclxuICAgICAgdGhpcy5TZWxlY3RSb3coKTtcclxuICAgICAgdGhpcy5Jc01vdmluZ0luVmlldyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSByZWNvcmQgdG8gdGhlIGZvcm0gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBhZGRSZWMoZG9TdWZmaXg6IGJvb2xlYW4saXNDcmVsaW5lQWJvdmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBuZXdMaW5lOiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IGN1cnJMaW5lOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIGN1cnJMaW5lID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG5cclxuICAgIC8vIEluY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGFkZGVkIGludG8gdGhlIHZpZXcuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCArPSAxO1xyXG4gICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbmV3UmVjSWR4OiBudW1iZXIgPSBhd2FpdCAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuYWRkUmVjb3JkKGRvU3VmZml4LCBmYWxzZSwgaXNDcmVsaW5lQWJvdmUpO1xyXG5cclxuICAgIGlmIChuZXdSZWNJZHggPiAtMSkge1xyXG4gICAgICAvLyBmb3JtcyB3aXRoIGEgdGFibGVcclxuICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgLy8gdGhlcmUgYXJlIG5vIHJlY29yZHMgaW4gdGhlIHRhYmxlIHNvIHRoZSBuZXcgcm93IGlzIGNyZWF0ZWQgYWZ0ZXJcclxuICAgICAgICAvLyBzZXR0aW5nIHRoZSB0b3AgcmVjb3JkIHRvIDAgYW5kIHRoZSBjdXJyZW50IHJvdyB0byAwXHJcbiAgICAgICAgbGV0IG5ld0N1cnJSb3c6IG51bWJlcjtcclxuICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA9PT0gMCB8fCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgbmV3Q3VyclJvdyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBjdXJzb3IgaXMgcGFya2luZyBvbiB0aGUgbGFzdCByb3cgb2YgdGhlIGRpc3BsYXllZCB0YWJsZSBzbyB0aGVcclxuICAgICAgICAvLyBuZXcgcm93IGlzIGNyZWF0ZWQgYWZ0ZXIgaW5jcmVtZW50aW5nIHRoZSB0b3AgcmVjb3JkIGluZGV4XHJcbiAgICAgICAgZWxzZSBpZiAoY3VyckxpbmUgPT09IHRoaXMuX3Jvd3NJblBhZ2UgLSAxKSB7XHJcbiAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIDEpO1xyXG4gICAgICAgICAgbmV3Q3VyclJvdyA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIG5ldyByb3cgaXMgY3JlYXRlZCB3aXRob3V0IGNoYW5naW5nIHRoZSB0b3AgcmVjb3JkXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChpc0NyZWxpbmVBYm92ZSlcclxuICAgICAgICAgICAgbmV3Q3VyclJvdyA9IGN1cnJMaW5lID4gMCA/IGN1cnJMaW5lIDogMDtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgbmV3Q3VyclJvdyA9IGN1cnJMaW5lICsgMTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBuZXdMaW5lID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgbmV3Q3VyclJvdztcclxuXHJcbiAgICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIG5ld0N1cnJSb3cpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShuZXdMaW5lLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBzaG91bGQgcmVhbGx5IGJlIGNhdWdodCBoZXJlXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gRm9ybS5hZGRSZWMoKSB7MH1cIiwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgIHtcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50IC09IDE7XHJcbiAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBkZWxDdXJyUmVjKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRvcFRhYmxlUm93OiBib29sZWFuID0gc3VwZXIuaXNMaW5lTW9kZSgpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkucmVtb3ZlQ3VyclJlYygpO1xyXG5cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIGlmICh0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWMoZmFsc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkge1xyXG4gICAgICAgICAgLy8gY2hhbmdlIHRvIGNyZWF0ZSBtb2RlXHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG5cclxuICAgICAgICAgIC8vIE1HX0FDVF9DUkVMSU5FIG1heSBiZSBkaXNhYmxlZCAuaS5lLiBQUk9QX1RZUEVfQUxMT1dfQ1JFQVRFIGV4cHJlc3Npb24gY2FuIGJlIGNoYW5nZWRcclxuICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZW5hYmxlQ3JlYXRlQWN0cyh0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGV4aXQgZnJvbSB0aGUgb3duZXJUYXNrXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoZSBlbXB0aW5lc3Mgb2YgdGhlIERWIG11c3QgYmUgY2hlY2tlZCBhZ2FpbiBiZWNhdXNlIHRoZSBcImNyZWF0ZSBsaW5lXCIgbWF5IGZhaWxcclxuICAgIGlmICghdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSkge1xyXG4gICAgICBpZiAodG9wVGFibGVSb3cpXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgLy8gRGVjcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgZGVsZXRlZC5cclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50LS07XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHNjcmVlbiBtb2RlXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIHRydWUsIHRydWUsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbmNlbCB0aGUgZWRpdGluZyBvZiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMgb2YgdGhlIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0FjdENhbmNlbFwiPnRydWUgaWYgY2FsbGVkIGZvciBBQ1RfQ0FOQ0VMLCBmYWxzZSBvdGhlcndpc2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNRdWl0RXZlbnRcIj48L3BhcmFtPlxyXG4gIGFzeW5jIGNhbmNlbEVkaXQoaXNBY3RDYW5jZWw6IGJvb2xlYW4sIGlzUXVpdEV2ZW50OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbW9kZTogc3RyaW5nID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcbiAgICBsZXQgbmV3TW9kZTogc3RyaW5nO1xyXG4gICAgbGV0IHJvdzogbnVtYmVyID0gMDtcclxuICAgIGxldCBleGVjUmVjUHJlZml4OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gV2UgcmV0dXJuIHRvIGNyZWF0ZSBtb2RlIG9ubHkgaWYgdGhlcmUgaXMgbm8gcmVjb3JkIHRvIGdvIHRvIGFmdGVyIHRoZSBjYW5jZWwgYWN0aW9uXHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA9PT0gMSAmJiBtb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgbmV3TW9kZSA9IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFO1xyXG4gICAgZWxzZVxyXG4gICAgICBuZXdNb2RlID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlk7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAvLyA5OTcwNzMgJiA5MzEwMjEuXHJcbiAgICAvLyBFeHBlY3RlZCBiZWhhdmlvciBkdXJpbmcgY2FuY2VsIGV2ZW50LCBmb3IgYSBuZXcgcmVjb3JkOlxyXG4gICAgLy8gSWYgdGhlIG9yaWdpbmFsIG93bmVyVGFzayBtb2RlIGlzIG5vdCBjcmVhdGUsIGRlbGV0ZSB0aGUgbmV3IHJlY29yZCBhbmQgZ28gYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkLlxyXG4gICAgLy8gSWYgdGhlIG9yaWdpbmFsIG93bmVyVGFzayBtb2RlIGlzIGNyZWF0ZSwgc3RheSBvbiB0aGUgbmV3IHJlY29yZC5cclxuXHJcbiAgICAvLyBkdi5jYW5jZWxFZGl0KCkgcmVtb3ZlcyB0aGUgbmV3IHJlY29yZCB1bmRlciBzb21lIGNvbmRpdGlvbi5cclxuICAgIC8vIFNvLCBpbiBjYXNlIG9mIG9yZ1Rhc2tNb2RlPUMsIHNpbmNlIHdlIHdhbnQgdG8gc3RheSBvbiB0aGUgbmV3IHJlY29yZCwgd2UgbmVlZCB0byByZS1jcmVhdGUgYSByZWNvcmQuXHJcblxyXG4gICAgLy8gQnV0IGFzIHNhaWQsIGR2LmNhbmNlbEVkaXQoKSByZW1vdmVzIHRoZSBuZXcgcmVjb3JkIE9OTFkgdW5kZXIgc29tZSBjb25kaXRpb24uXHJcbiAgICAvLyBUaGUgY29uZGl0aW9uIGlzIGFzIGZvbGxvd3M6XHJcbiAgICAvLyBUaGUgcmVjb3JkIGlzIHJlbW92ZWQgb25seSBpZiB0aGUgZHYgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMS4gU28sIGlmIHRoZSBkdiBzaXplIGlzIDEsIGR2LmNhbmNlbEVkaXQoKVxyXG4gICAgLy8gZG9lcyBub3QgcmVtb3ZlIHRoZSByZWNvcmQgYW5kIGhlbmNlIGluIHRoaXMgY2FzZSwgZm9ybS5jYW5jZWxFZGl0KCkgc2hvdWxkIG5vdCBjcmVhdGUgYSBuZXcgcmVjb3JkLlxyXG4gICAgLy8gRm9yIHRoaXMgcmVhc29uLCB0aGUgc2lnbmF0dXJlIG9mIGR2LmNhbmNlbEVkaXQoKSBpcyBjaGFuZ2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgcmVtb3ZlZCBvciBub3QuXHJcblxyXG4gICAgLy8gVGhpcyBpcyBvbmUgcGFydC5cclxuXHJcbiAgICAvLyBOb3csIGFmdGVyIGNhbmNlbEVkaXQsIFJQIGhhcyB0byBiZSBleGVjdXRlZC4gVGhpcyB3YXMgZG9uZSBpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKS0+Y2FzZSBNR19BQ1RfQ0FOQ0VMLlxyXG4gICAgLy8gQnV0IHdoYXQgaGFwcGVucyBpcywgaWYgZm9ybS5jYW5jZWxFZGl0KCkgY3JlYXRlZCBhIG5ldyBsaW5lLCBSUCB3YXMgYWxyZWFkeSBleGVjdXRlZCBmcm9tIHRoZXJlLiBBbmQgZnJvbVxyXG4gICAgLy8gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCksIFJQIGlzIGV4ZWN1dGVkIGZvciB0aGUgc2Vjb25kIHRpbWUuXHJcbiAgICAvLyBTbywgbW92ZWQgdGhlIGNvZGUgb2YgZXhlY3V0aW5nIFJQIGZyb20gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCktPmNhc2UgTUdfQUNUX0NBTkNFTCB0byBmb3JtLmNhbmNlbEVkaXQoKVxyXG4gICAgLy8gYW5kIHRoYXQgd2lsbCBiZSBkb25lIG9ubHkgaWYgdGhlIGNyZWF0ZSBsaW5lIHdhcyBub3QgZXhlY3V0ZWQuXHJcblxyXG4gICAgLy8gTm93LCB3ZSBoYXZlIG9uZSBtb3JlIGlzc3VlLlxyXG5cclxuICAgIC8vIFVudGlsIG5vdywgdGhlIFJQIHdhcyBleGVjdXRlZCBhZnRlciBmb3JtLmNhbmNlbEVkaXQoKS5cclxuICAgIC8vIFNvLCB3aGVuIHRoZSBjb2RlIGlzIG1vdmVkIHRvIGZvcm0uY2FuY2VsRWRpdCgpLCBpdCBzaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgdG8gYmUgZXhlY3V0ZWQuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBsZXQgcmVjUmVtb3ZlZDogYm9vbGVhbiA9IGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5jYW5jZWxFZGl0KGZhbHNlLCBmYWxzZSk7XHJcbiAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0UHJldkN1cnJSZWMobnVsbCk7XHJcbiAgICBpZiAoKHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkgfHwgKChpc0FjdENhbmNlbCAmJiByZWNSZW1vdmVkKSAmJiAoIUd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNwZWNpYWxDYW5jZWxPbkNyZWF0ZSgpKSYmKDxUYXNrQmFzZT50aGlzLl90YXNrKS5nZXRPcmlnaW5hbFRhc2tNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgLy8gU2V0IENhbmNlbCBpbmRpY2F0aW9uIG9uIHRoZSB0YXNrIGZvciB0byBub3QgcGVyZm9ybSBjb250cm9sIHZhbHVlIHZhbGlkYXRpb24gaW4gdGhlIENyZWF0ZSBsaW5lIGFjdGlvbi5cclxuICAgICAgbGV0IG9yZ0NhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuY2FuY2VsV2FzUmFpc2VkKCk7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0Q2FuY2VsV2FzUmFpc2VkKGlzQWN0Q2FuY2VsKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRDYW5jZWxXYXNSYWlzZWQob3JnQ2FuY2VsV2FzUmFpc2VkKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzQWN0Q2FuY2VsKVxyXG4gICAgICBleGVjUmVjUHJlZml4ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyB0aGUgZW1wdGluZXNzIG9mIHRoZSBEViBtdXN0IGJlIGNoZWNrZWQgYWdhaW4gYmVjYXVzZSB0aGUgXCJjcmVhdGUgbGluZVwiIG1heSBmYWlsXHJcbiAgICBpZiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkpIHtcclxuICAgICAgaWYgKHN1cGVyLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICByb3cgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSB0aGlzLl9yb3dzSW5QYWdlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRvcFJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGlmICh0b3BSZWNJZHggPiBjdXJyUmVjSWR4KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChjdXJyUmVjSWR4KTtcclxuICAgICAgICAgICAgICByb3cgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgcm93LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gc2hvdWxkIHJlYWxseSBiZSBjYXVnaHQgaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJvdyAhPT0gMClcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcImluIEZvcm0uY2FuY2VsRWRpdCgpIHswfVwiLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgLy8gRGVjcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgZGVsZXRlZC5cclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiByZWNSZW1vdmVkKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQtLTtcclxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHNjcmVlbiBtb2RlXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSBlcnJvciBpbiBTY3JlZW4gbW9kZSBmb3IgQ3VycmVudCBSZWNvcmRcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl90YXNrLnNldE1vZGUobmV3TW9kZSk7XHJcbiAgICAgIGlmICghKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgICAgaWYgKCEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaylcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChleGVjUmVjUHJlZml4KSB7XHJcbiAgICAgIC8vIFFDUiAjOTI1NjQ2LCAjNDU0MTY3OiBleGl0IHRvIHRoZSBvd25lclRhc2sgbGV2ZWwgaW4gb3JkZXIgdG8gc2tpcCBjb250cm9sIHN1ZmZpeFxyXG4gICAgICAvLyBhbmQgcmVjb3JkIHN1ZmZpeCBvZiB0aGUgY2FuY2VsZWQgbmV3IHJlY29yZCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlXHJcbiAgICAgIC8vIG5leHQgcmVjb3JkIHBlcmZpeCB3b3VsZCBiZSBleGVjdXRlZFxyXG4gICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAvLyB3ZSByb2xsYmFjayBhIHBhcmVudCBvd25lclRhc2sgd2hpbGUgZm9jdXNlZCBvbiBzdWJmb3JtL293bmVyVGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoKDxUYXNrQmFzZT5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5wYXRoQ29udGFpbnMoPFRhc2tCYXNlPnRoaXMuX3Rhc2spKVxyXG4gICAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gPFRhc2tCYXNlPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQgIT09IHRoaXMuX3Rhc2s7XHJcbiAgICAgICAgICAgICAgIHBhcmVudCA9IDxUYXNrQmFzZT5wYXJlbnQuZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgcGFyZW50LnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAoKDxEYXRhVmlldz5wYXJlbnQuRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc1F1aXRFdmVudCkge1xyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGZvbGxvd2luZyAyIGxpbmVzIGNhbiBiZSBtZXJnZWQgaW4gb25lIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0aGlzLl90YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNjYW4gYWxsIGNvbnRyb2xzIGluIHRoZSBmb3JtLiBFdmVyeSBjb250cm9sIHdoaWNoIGhhcyBhIHByb3BlcnR5IHRoYXQgaXMgYW4gZXhwcmVzc2lvbiB3aWxsIGJlXHJcbiAgLy8vICAgcmVmcmVzaGVkLiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoZSBjb250cm9sJ3MgZGlzcGxheSBpcyBzeW5jaGVkIHdpdGggdGhlIGV4cHJlc3NpbidzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoT25FeHByZXNzaW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gKCh0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKSBpbnN0YW5jZW9mIE1nQ29udHJvbCkgPyA8TWdDb250cm9sPnRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpIDogbnVsbCk7XHJcblxyXG4gICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgYXdhaXQgbWdDb250cm9sLnJlZnJlc2hPbkV4cHJlc3Npb24oKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLkFzc2VydChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyByZWZyZXNoIHRoZSBmb3JtIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hQcm9wc09uRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBjb250cm9scyBvZiB0aGlzIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZnNUb0N0cmxzKCk6IHZvaWQge1xyXG4gICAgLy8gaWYgbGFzdCBmb2N1c2VkIGNvbnRyb2wgd2FzIGZyb20gdGhpcyB0YXNrIC0gemVybyBpdC5cclxuICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldEZvcm0oKSA9PT0gdGhpcylcclxuICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+dGhpcy5fdGFzaywgbnVsbCk7XHJcblxyXG4gICAgc3VwZXIucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRDdHJsQnlDdHJsTmFtZShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiA8TWdDb250cm9sPnRoaXMuQ3RybFRhYi5nZXRDdHJsKGN0cmxOYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIHN1YmZvcm0gY29udHJvbCB3aXRoIHRoZSB0eXBlZCBuYW1lIGZyb20gYWxsIHBhcmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj4gdGhlIHJlcXVlc3RlZCBzdWJmb3JtIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0U3ViRm9ybUN0cmxCeU5hbWUoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgZ3VpUGFyZW50VGFzazogVGFza0Jhc2U7XHJcbiAgICBsZXQgZGVzdFN1YkZvcm06IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChndWlQYXJlbnRUYXNrID0gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcbiAgICAgICAgIGRlc3RTdWJGb3JtID09PSBudWxsICYmIGd1aVBhcmVudFRhc2sgIT09IG51bGwgJiYgZ3VpUGFyZW50VGFzay5nZXRGb3JtKCkgIT09IG51bGw7XHJcbiAgICAgICAgIGd1aVBhcmVudFRhc2sgPSBndWlQYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgIGRlc3RTdWJGb3JtID0gPE1nQ29udHJvbD5ndWlQYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKGN0cmxOYW1lLCBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNKTtcclxuICAgICAgaWYgKGRlc3RTdWJGb3JtID09IG51bGwpIHtcclxuICAgICAgICBpZiAoIWd1aVBhcmVudFRhc2suSXNTdWJGb3JtIHx8IE5TdHJpbmcuRXF1YWxzKGd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkuTmFtZSwgY3RybE5hbWUsIHRydWUpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVzdFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBzdWZmaXhEb25lIHBhcmFtZXRlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTdWZmaXhEb25lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3VmZml4RG9uZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXREZXN0aW5hdGlvblJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RUYmxSb3c7XHJcbiAgfVxyXG5cclxuICBzZXRTdWJGb3JtQ3RybChzdWJGb3JtQ3RybDogTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fc3ViRm9ybUN0cmwgPT09IG51bGwgJiYgc3ViRm9ybUN0cmwgIT09IG51bGwpO1xyXG4gICAgdGhpcy5fc3ViRm9ybUN0cmwgPSBzdWJGb3JtQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgc3ViZm9ybSBjb250cm9sIHRoYXQgcG9pbnRzIHRvIGEgdGFzayB3aG9zZSBpZCBpcyBnaXZlbiBpbiB0YXNrSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+dGhlIGlkIG9mIHJlcXVlc3RlZCBzdWJmb3JtIG93bmVyVGFzazwvcGFyYW0+XHJcbiAgZ2V0U3ViRm9ybUN0cmxGb3JUYXNrKHRhc2tJZDogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHBhcmVudEN0cmxUYWI6IENvbnRyb2xUYWJsZTtcclxuICAgIGxldCBndWlQYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGd1aVBhcmVudEZvcm0gPSB0aGlzOyBndWlQYXJlbnRGb3JtICE9IG51bGw7IGd1aVBhcmVudEZvcm0gPSBndWlQYXJlbnRGb3JtLlBhcmVudEZvcm0pIHtcclxuICAgICAgcGFyZW50Q3RybFRhYiA9IGd1aVBhcmVudEZvcm0uQ3RybFRhYjtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhcmVudEN0cmxUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBjdXJyID0gKChwYXJlbnRDdHJsVGFiLmdldEN0cmwoaSkgaW5zdGFuY2VvZiBNZ0NvbnRyb2wpID8gPE1nQ29udHJvbD5wYXJlbnRDdHJsVGFiLmdldEN0cmwoaSkgOiBudWxsKTtcclxuICAgICAgICBpZiAoY3VyciAhPSBudWxsICYmIGN1cnIuaXNTdWJmb3JtKCkgJiYgKGN1cnIuZ2V0U3ViZm9ybVRhc2tJZCgpICE9IG51bGwpKVxyXG4gICAgICAgICAgaWYgKGN1cnIuZ2V0U3ViZm9ybVRhc2tJZCgpID09PSB0YXNrSWQpIHtcclxuICAgICAgICAgICAgZGVzdFN1YkZvcm0gPSBjdXJyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRlc3RTdWJGb3JtICE9IG51bGwpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVzdFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjcmVhdGUgcmVjb3JkcyBiZXR3ZWVuIGlkeCBhbmQgZW5kIG9mIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcmVtb3ZlUmVjb3Jkc0FmdGVySWR4KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVtb3ZlQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gaW4gc29tZSBjYXNlcyBpbnZpc2libGUgLTEgcm93ICh0aGF0IGV4aXN0IG9ubHkgZm9yIHNjcm9sbGJhciBlZmZlY3RzKSBiZWNvbWVzIHZpc2libGUuXHJcbiAgICAvLyBUbyBwcmV2ZW50IHRoaXMgd2UnbGwgcmVtb3ZlIGFsbCByZWNvcmRzLiBUaGlzIHdpbGwgbm90IGNhdXNlIHBlcmZyb21hbmNlIHByb2JsZW1zIHNpbmNlXHJcbiAgICAvLyB3ZSB3aWxsIGFkZCBtYXhpbXVtIHJvd0luUGFnZSByZWNvcmRzIG1vcmUgdGhlbiB3ZSBpbnRlbmRlZCBpbiB0aGUgYmVnaW5pbmdcclxuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSlcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChpZHggPD0gdGhpcy5fcm93c0luUGFnZSArIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgaWR4ID0gMDtcclxuICAgICAgaWYgKGlkeCA9PT0gMClcclxuICAgICAgICByZW1vdmVBbGwgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICBzdXBlci5TZXRUYWJsZUl0ZW1zQ291bnQoaWR4LCByZW1vdmVBbGwpO1xyXG4gICAgICAvLyB1cGRhdGVzIHRhYmxlIGl0ZW0ncyBjb3VudFxyXG5cclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiByb3cgaXMgdmFsaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUm93VmFsaWRhdGVkKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHggfHwgaWR4IDwgMClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICBpZiAocm93ID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiByb3cuQ3JlYXRlZCAmJiByb3cuVmFsaWRhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJ1bnMgaW4gV29ya2VyIHRocmVhZCB3aGVuIHRoZSB0aHJlYWQgaXMgZnJlZSBhbmQgc2VuZCB0byBHVUkgdGhyZWFkIGNvbnRyb2xzIGRhdGEgb2YgYWxsIHJvd3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHRyYW5zZmVyRGF0YVRvR3VpKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmVSb3dJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICBsZXQgbWF4VGltZTogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSArIE1nRm9ybS5USU1FX0xJTUlUO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjdXJyZW50RWRpdGluZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcbiAgICAgIC8vIHRoaXMgbGltaXRhdGlvbiBpcyBuZWVkZWQgc28gdGhpcyByZXF1ZXN0IHdpbGwgbmV2ZXIgdGFrZSB0b28gbXVjaCB0aW1lXHJcbiAgICAgIHdoaWxlIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIDwgbWF4VGltZSAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICAgIC8vIGFsbCByb3dzIGFscmVhZHkgc2VudFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkgJiYgdGhpcy5fbGFzdFJvd1NlbnQgKyAxID49IHRoaXMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9sYXN0Um93U2VudCsrO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1ZhbGlkYXRlZCh0aGlzLl9sYXN0Um93U2VudCkpIHtcclxuICAgICAgICAgIC8vIHJvdyBuZWVkcyB0byBiZSBzZW50XHJcbiAgICAgICAgICAvLyBzZW5kIHJvdyBkYXRhXHJcbiAgICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyh0aGlzLl9sYXN0Um93U2VudCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgIT09IHNhdmVSb3dJZHgpIHtcclxuICAgICAgICAgICAgc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7IC8vIHJlc2V0IHRoZSBmbGFnXHJcbiAgICAgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRyZWVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLl9sYXN0Um93U2VudCwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyByZXN0b3JlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKHNhdmVSb3dJZHgsIGJrcFJlY29yZCk7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgIHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBjdXJyZW50RWRpdGluZ0NvbnRyb2w7IC8vIHNldCB0aGUgZmxhZyB0byB0aGUgb3JpZ2luYWwgdmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLl90cmFuc2ZlcmluZ0RhdGEgPSBmYWxzZTtcclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiBhbnkgcm93cyBuZWVkIHRvIGJlIHNlbnQgdG8gR1VJIHRocmVhZFxyXG4gIC8vLyAgIGlmIHRoZXJlIGFyZSwgcHV0cyBldmVudCBpbiBldmVudCBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiB0aGlzLk9wZW5lZCAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICBsZXQgc2l6ZTogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ID49IHRoaXMuUm93cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyB3aGVuIHdlIGRlY3JlYXNlIHNpemUgb2Ygcm93cyBhcnJheSBhZGp1c3QgbGFzdFJvd1NlbnRcclxuICAgICAgICB0aGlzLl9sYXN0Um93U2VudCA9IHRoaXMuUm93cy5sZW5ndGggLSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGVyZSBhcmUgcm93cyB0byBzZW5kIGFuZCB0aGVyZSBpcyBub3cgcmVxdWVzdCBmb3Igcm93cyB5ZXRcclxuICAgICAgLy8gYWRkIHJlcXVlc3QgZm9yIHJvd3NcclxuICAgICAgbGV0IHRyYW5zZmVyRGF0YVRvR3VpOiBib29sZWFuID0gdGhpcy5fbGFzdFJvd1NlbnQgPCAoc2l6ZSAtIDEpO1xyXG5cclxuICAgICAgLy8gRm9yIHBhZ2luYXRlZCB0YWJsZSBjaGVjayB0aGUgbWF4IHJvd3Mgb2YgR1VJIHRhYmxlIGNvbnRyb2wuXHJcbiAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpICYmICh0aGlzLl9sYXN0Um93U2VudCArIDEpID49IHRoaXMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKSlcclxuICAgICAgICB0cmFuc2ZlckRhdGFUb0d1aSA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHRyYW5zZmVyRGF0YVRvR3VpICYmICF0aGlzLl90cmFuc2ZlcmluZ0RhdGEpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkodGhpcy5fdGFibGVNZ0NvbnRyb2wsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVl9UT19HVUksIFByaW9yaXR5LkxPV0VTVCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJpbmdEYXRhID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlciAmJiAhdHJhbnNmZXJEYXRhVG9HdWkgJiYgKCF0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkgfHwgIXRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkpKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KHRoaXMuX3RhYmxlTWdDb250cm9sLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfUkVDT1JEU19BSEVBRF9GUk9NX1NFUlZFUiwgUHJpb3JpdHkuTE9XRVNUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgcm93IGRhdGEgZm9yIHRoZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc2lyZWRUb3BJbmRleFwiPmRlc2lyZWQgdG9wIGluZGV4IGlmIGRlc2lyZWRUb3BJbmRleCBpcyBJbnRlZ2VyLk1JTl9WQUxVRSwgdG9wIGluZGV4IGlzIGNlY2lldmVkIGZvcm0gZHY8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPmlmIHRydWUsIHNlbmQgYWxsIHJlY29yZHMsIGV2ZW4gaWYgdGhleSBhcmUgY3JlYXRlZCBhbmQgdmFsaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RGb2N1c2VkVmFsXCI+PC9wYXJhbT5cclxuICBhc3luYyBzZXRSb3dEYXRhKGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmVSb3dJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICBsZXQgZGlmZjogbnVtYmVyID0gMDtcclxuICAgIGxldCBnZXRQcmV2Q2h1bms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBnZXROZXh0Q2h1bms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKGRlc2lyZWRUb3BJbmRleCAhPT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgaWYgKGRlc2lyZWRUb3BJbmRleCA8IDApIHtcclxuICAgICAgICAvLyB0aGlzIGlzIHJlcXVlc3QgZm9yIGxpbmUgb3IgcGFnZSBiZWZvcmUgY3VycmVudCBjaHVua1xyXG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGUgdG9wIGluZGV4IGlzIGFsd2F5cyAwXHJcbiAgICAgICAgZ2V0UHJldkNodW5rID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGRlc2lyZWRUb3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgKyAxID49IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkpXHJcbiAgICAgIC8vIHBhZ2Vkb3duIG9yIGFycm93ZG93biBhdCBlbmQgb2YgdGhlIGRhdGF2aWV3XHJcbiAgICAgICAgZ2V0TmV4dENodW5rID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgZGVzaXJlZFRvcEluZGV4ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG5cclxuICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcblxyXG4gICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgIGxldCBkaWZmUmVmOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKGRpZmYpO1xyXG4gICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucmVmcmVzaFJvd3MoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsLCBzYXZlUm93SWR4LCBkaWZmUmVmKTtcclxuICAgIGRpZmYgPSBkaWZmUmVmLnZhbHVlO1xyXG5cclxuICAgIGlmICgoZ2V0UHJldkNodW5rICYmIGRpZmYgIT09IDApIHx8IGdldE5leHRDaHVuaykge1xyXG4gICAgICAvLyBpZiBkaWZmICE9IDAgYSBuZXcgY2h1bmsgd2FzIGJyb3VnaHQgdG8gdGhlIGJlZ2luaW5nIG9mIHRoZSBkdlxyXG4gICAgICAvLyBzZXQgdG9wIGluZGV4IHRvIGZpcnN0IHJlcXVlc3RlZCBpbmRleFxyXG4gICAgICAvLyBpZiBuZXh0IGNodW5rIHdhcyBicm91Z2h0LCB0b3AgaW5kZXggbWF5IGFsc28gYmUgdXBkYXRlZFxyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGRlc2lyZWRUb3BJbmRleCArIGRpZmYpO1xyXG4gICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgaWYgKHRoaXMuX3RvcEluZGV4VXBkYXRlZCkge1xyXG4gICAgICAgIC8vIGlmIHRvcCBpbmRleCB3YXMgdXBkYXRlZCBpbiB0aGUgc2V0VGFibGVUb3BJbmRleCAtIHdlIG1pZ2h0IGhhdmUgcm93cyB0aGF0IHdlcmUgbm90IHJlZnJlc2hlZFxyXG4gICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAvLyBhbnkgcm93IHdhcyB1cGRhdGVkXHJcbiAgICAgIC8vIHJlc3RvcmUgY3VycmVudCByZWNvcmRcclxuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKHNhdmVSb3dJZHggKyBkaWZmLCBia3BSZWNvcmQpO1xyXG4gICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBhc2sgdGFibGUgdG8gcmVmcmVzaCB0aGUgcGFnZVxyXG5cclxuICAgIHN1cGVyLlNlbGVjdFJvdygpO1xyXG4gICAgaWYgKGdldFByZXZDaHVuaykge1xyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgZm9jdXNlZFxyXG4gICAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsICYmIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRQYXJlbnRUYWJsZSgpID09PSB0aGlzLl90YWJsZU1nQ29udHJvbCkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaGVzIHJvd3MgaW4gdGhlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzaXJlZFRvcEluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2F2ZVJvd0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaWZmXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFJvd3MoZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIHNhdmVSb3dJZHg6IG51bWJlciwgZGlmZlJlZjogUmVmUGFyYW08bnVtYmVyPik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGRpZmZSZWYudmFsdWUgPSAwO1xyXG4gICAgbGV0IG9yZ0luY2x1ZGVzRmlyc3Q6IGJvb2xlYW4gPSB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpO1xyXG4gICAgbGV0IG9yZ0luY2x1ZGVzTGFzdDogYm9vbGVhbiA9IHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9yb3dzSW5QYWdlOyBpKyspIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gZGVzaXJlZFRvcEluZGV4ICsgaTtcclxuICAgICAgbGV0IHByZXZUb3BJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBpZiB3ZSBmYWlsIHRvIGdldCBvbmUgcmVjb3JkLCB3ZSBtYXkgc3VjY2VlZCB0byBnZXQgdGhlIG5leHQgb25lXHJcbiAgICAgICAgaW5kZXggPSBpZHggKyBkaWZmUmVmLnZhbHVlO1xyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1ZhbGlkYXRlZChpZHgpIHx8IHNlbmRBbGwgfHwgdGhpcy5SZWZyZXNoQWxsUm93cykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID49IDApXHJcbiAgICAgICAgICAgIHN1cGVyLmNoZWNrQW5kQ3JlYXRlUm93KGluZGV4KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2F2ZVJvd0lkeCArIGRpZmZSZWYudmFsdWUgIT09IGluZGV4KSB7IC8vIG5vdCBjdXJyZW50IGxpbmVcclxuICAgICAgICAgICAgLy8gaXJyZWxldmFudCBmb3IgdHJlZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKGluZGV4LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBpZiBhIG5ldyBjaHVuayBpcyBicm91Z2h0IHRvcCBpbmRleCB3aWxsIGJlIGNoYW5nZWRcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAvLyBjcmVhdGlvbiBvZiByb3cgZmFpbGVkLCBtYXJrIHRoZSByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAgICAgICAgIGlmIChzdXBlci5pc1Jvd0NyZWF0ZWQoaW5kZXgpKVxyXG4gICAgICAgICAgICBzdXBlci5tYXJrUm93Tk9UQ3JlYXRlZChpbmRleCk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIC8vIFFDUiAjMjYxMDU1LCBldmVuIHNvIHJlcXVpcmVkIHJlY29yZCBtYXkgbm90IGJlIGZvdW5kLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgbmV3IGNodW5rIGhhcyBiZWVuIHNlbnRcclxuICAgICAgICAvLyBhbmQgZGlmZiBtdXN0IGJlIHVwZGF0ZWRcclxuICAgICAgICBkaWZmUmVmLnZhbHVlID0gZGlmZlJlZi52YWx1ZSArICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgLSBwcmV2VG9wSWR4KTtcclxuICAgICAgICBwcmV2VG9wSWR4ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgIGlmICghdXBkYXRlZCAmJiB0aGlzLkdldERhdGF2aWV3KCkuRGF0YXZpZXdCb3VuZHJpZXNBcmVDaGFuZ2VkKG9yZ0luY2x1ZGVzRmlyc3QsIG9yZ0luY2x1ZGVzTGFzdCkpXHJcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSBmYWxzZTtcclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiByb3cgaW4gdGhlIHBhZ2U8L3JldHVybnM+XHJcbiAgZ2V0VmlzaWJsZUxpbmUoKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBjdXJyUmVjSWR4ID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICByZXR1cm4gY3VyclJlY0lkeCAtIE1hdGgubWF4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSwgMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgcmVjb3JkIGlzIGluIHRoZSB2aWV3LCBpZiBpdCBpcyBub3Qgb24gdGhlIHBhZ2UsIGFkanVzdHMgdG9wIGluZGV4LCBzbyB0aGF0IGN1cnJlbnRcclxuICAvLy8gICByZWNvcmQgd2lsbCBiZSBvbiB0aGUgdmlzaWJsZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBicmluZ1JlY29yZFRvUGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiAhdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBsZXQgdG9wSW5kZXg6IG51bWJlciA9IENvbW1hbmRzLmdldFRvcEluZGV4KHRoaXMuX3RhYmxlTWdDb250cm9sKTtcclxuICAgICAgbGV0IGN1cnJJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgIGxldCBuZXdUb3BJbmRleDogbnVtYmVyID0gdG9wSW5kZXg7XHJcblxyXG4gICAgICAvLyBUYWJsZSB0b3AgaW5kZXggZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRvcEluZGV4ID4gY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodG9wSW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlIC0gMSA8IGN1cnJJZHgpIHtcclxuICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcm93c0luUGFnZSA+IDApXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeCAtIHRoaXMuX3Jvd3NJblBhZ2UgKyAxO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBuZXdUb3BJbmRleCA9IGN1cnJJZHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdGFibGUgdG9wIGluZGV4IGZvciBwYWdpbmF0ZWQgdGFibGUuXHJcbiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBpbmRleCBvZiBmaXJzdCByZWNvcmQgb24gdGhlIHBhZ2UgdGhhdCBjb250YWlucyByZWNvcmQgdG8gYmUgc2VsZWN0ZWQuXHJcbiAgICAgICAgbGV0IGN1cnJHdWlJZHggPSB0aGlzLmdldEd1aVJvd2lkeChjdXJySWR4KTtcclxuICAgICAgICBsZXQgbmV3VG9wR3VpSW5kZXggPSAoY3Vyckd1aUlkeCkgLSAoKGN1cnJHdWlJZHgpICUgdGhpcy5fcm93c0luUGFnZSk7IC8vZ3VpIGlkeCBvZiBmaXJzdCByZWNvcmQgb2YgcmVzcGVjdGl2ZSBwYWdlXHJcblxyXG4gICAgICAgIG5ld1RvcEluZGV4ID0gdGhpcy5nZXREdlJvd0lkeChuZXdUb3BHdWlJbmRleCk7XHJcblxyXG4gICAgICAgIGlmKG5ld1RvcEluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldyApXHJcbiAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCB0b3AgaW5kZXggdG8gYmUgY3VycmVudCBsaW5lXHJcbiAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgIT09IG5ld1RvcEluZGV4IHx8IHRoaXMuX3RvcEluZGV4VXBkYXRlZCkge1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgobmV3VG9wSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Um93RGF0YShJbnQzMi5NaW5WYWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW52YWxpZGF0ZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW52YWxpZGF0ZVRhYmxlKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuUm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcm93OiBSb3cgPSA8Um93PnRoaXMuUm93cy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKHJvdyAhPT0gbnVsbClcclxuICAgICAgICByb3cuVmFsaWRhdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbGFzdFJvd1NlbnQgPSAtMTtcclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gcHJldmlvdXMgdmlzaWJsZSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0UHJldkxpbmUobGluZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBsaW5lIC0gMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgc29ydCBtYXJrKGRlbHRhKSBmcm9tIHRoZSBjb2x1bW4uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNsZWFyU29ydE1hcmtcIj48L3BhcmFtPlxyXG4gIGNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayhjbGVhclNvcnRNYXJrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoY2xlYXJTb3J0TWFyaykge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzdG9wIHRoZSByb3cgZnJvbSBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc3RvcFJvd0VkaXRpbmcoaWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgaWYgKHRoaXMuZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShpZHgpKSB7XHJcbiAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9OT1RfSVNfUk9XX0VESVRJTkcsIHRoaXMsICB0aGlzLmlzTGluZU1vZGUoKSAgPyBpZHggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzdGFydCB0aGUgcm93IGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBhc3luYyBzdGFydFJvd0VkaXRpbmcoaWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKCF0aGlzLmdldElzUm93RWRpdGluZ0Zyb21HdWkoaWR4KSkge1xyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfSVNfUk9XX0VESVRJTkcsIHRoaXMsIHRoaXMuaXNMaW5lTW9kZSgpID8gaWR4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2QgcmV0dXJuIGlmIHRoZSByb3cgaXMgaW4gZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHB1YmxpYyBnZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGRpc3BsYXlJbmRleDpudW1iZXIgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSb3dFZGl0aW5nOiBib29sZWFuID0gQ29tbWFuZHMuZ2V0SXNSb3dFZGl0aW5nKHRoaXMsIHRoaXMuaXNMaW5lTW9kZSgpID8gZGlzcGxheUluZGV4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgcmV0dXJuIGlzUm93RWRpdGluZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIGRpc3BsYXksIHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkocmVmcmVzaFR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2tCYXNlID0gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIFRha2UgYW5vdGhlciBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gb2YgUUNScyAjOTg0OTk5LCAjOTMzNjM5ICYgIzY5OTgyMTpcclxuICAgIC8vIE5vdywgdGhlIGRpc3BsYXkgd291bGQgYmUgcmVmcmVzaGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIE5PVCBhbiBvbGRcclxuICAgIC8vIHJlY29yZCB3aGljaCBpcyBiZWluZyBjb21wdXRlZC4gVGhlIHJlc3VsdCBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGR1cmluZyB0aGVcclxuICAgIC8vIGNvbXB1dGUgcHJvY2VzcyBvZiBhIHJlY29yZCB0aGUgZGlzcGxheSBpcyBub3QgcmVmcmVzaGVkICh3aGljaCBpcyBnb29kIGZvciB1cykuXHJcbiAgICAvLyBUaGUgZGlzcGxheSB3b3VsZCBiZSByZWZyZXNoZWQgYW55d2F5IEFGVEVSIHRoZSBjb21wdXRlIHByb2Nlc3MgaXMgZG9uZS5cclxuICAgIC8vIChFaHVkIDIxLU1BWS0yMDAyKVxyXG4gICAgaWYgKGN1cnJSZWMgIT09IG51bGwgJiYgY3VyclJlYy5JbkNvbXB1dGUgJiYgIWN1cnJSZWMuaXNOZXdSZWMoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9pblJlZnJlc2hEaXNwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB0aGlzLl9pblJlZnJlc2hEaXNwID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSB8fCByZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm0gYW5kIHJlZnJlc2ggaXRcclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSAmJiB0aGlzLk9wZW5lZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRhYmxlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNIHx8IHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDICYmIHN1cGVyLmhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlZnJlc2ggdGhlIGZvcm0gcHJvcGVydGllc1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hQcm9wcygpO1xyXG4gICAgICAgIC8vIHJlZnJlc2ggdGhlIGN1cnJlbnQgcmVjb3JkL1Jvd1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyhmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX0gaW4gdGFzayB7Mn1cIiwgZXguR2V0VHlwZSgpLCBleC5NZXNzYWdlLCAoPFRhc2tCYXNlPnN1cGVyLmdldFRhc2soKSkuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9pblJlZnJlc2hEaXNwID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2lnbmFsIHdlIGNvbXBsZXRlZCB0aGUgZmlyc3QgY3ljbGUgb2YgcmVmcmVzaGluZyB0aGUgZm9ybVxyXG4gICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDICYmICghc3VwZXIuaXNMaW5lTW9kZSgpIHx8IHRoaXMuX3RhYmxlUmVmcmVzaGVkKSlcclxuICAgICAgdGhpcy5Gb3JtUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZWZyZXNoVUkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZ2V0VGFzaygpLmlzTWFpblByb2coKSAvKiYmIEluaXRpYWxpemF0aW9uRmluaXNoZWQqLykge1xyXG4gICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCBmb3JtcyB3aXRoIHRhYmxlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVHdWlUb0xvZyhcIlN0YXJ0IGZvcm0ucmVmcmVzaFRhYmxlKClcIik7XHJcbiAgICAvLyB0b2RvIGZvciBub3cgLSBhbHdheXMgc2hvdyBhbGwgcmVjb3Jkc1xyXG4gICAgLy8gc2F2ZSB0aGUgb2xkIGN1cnJlbnQgcm93XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgbGV0IG9sZEN1cnJSb3c6IG51bWJlciA9IHRoaXMuRGlzcGxheUxpbmU7XHJcbiAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICAvLyBGb3IgdGhlIGZpcnN0IHRpbWUgd2UgcmVmcmVzaCB0aGUgdGFibGUgLSBzZXQgY3Vyci1yb3cgYW5kIHRvcC1yZWMtaWR4IHRvIGJlIHRoZVxyXG4gICAgLy8gb25lcyByZXF1ZXN0ZWQgYnkgdGhlIGRhdGF2aWV3LlxyXG4gICAgLy8gSW4gdGhlIGZvbGxvd2luZyB0YWJsZSByZWZyZXNoZXMgLSB3ZSBjaGFuZ2UgY3Vyci1yb3cgYW5kIHRvcC1yZWMgb25seSBpZiB0aGUgdGFibGVcclxuICAgIC8vIGJlY29tZXMgZW1wdHkuXHJcbiAgICBpZiAoIXRoaXMuX3RhYmxlUmVmcmVzaGVkICYmIGN1cnJSZWNJZHggPj0gMCkge1xyXG4gICAgICBvbGRDdXJyUm93ID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcblxyXG4gICAgICBpZiAob2xkQ3VyclJvdyArIDEgPiB0aGlzLl9yb3dzSW5QYWdlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgob2xkQ3VyclJvdyAtIE1hdGguZmxvb3IodGhpcy5fcm93c0luUGFnZSAvIDIpICsgMSk7XHJcblxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAob2xkQ3VyclJvdyA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgb2xkQ3VyclJvdyA9IDA7XHJcblxyXG4gICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGN1cnJSZWNJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoZW4gVG9wUmVjSWR4IDwgMCBpdCBtZWFucyB3ZSBzaG9sZCBub3QgY29udGludWUgdGhlIHJlZnJlc2ggc2luY2Ugd2UgYXJlIGluIHRlbXBvcmFyeSBzaXR1YXRpb24uXHJcbiAgICAvLyBBbm90aGVyIHJlZnJlc2ggd2lsbCBiZSBkb25lIHNvb24gd2l0aCBjb3JyZWN0IHZhbHVlcy5cclxuICAgIC8vIFRoaXMgaXMgY2FuIGhhcHBlbiB3aGVuIDpcclxuICAgIC8vIEluIGZldGNoQ2h1bmtGcm9tU2VydmVyIHdlIGdvIHRvIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgZXhwZWN0cyBuZXcgcmVjb3Jkcy5cclxuICAgIC8vIFdoaWxlIGluIHRoZSBwcm9jZXNzIG9mIGZldGNoaW5nQ2h1bmssIHdlIG1pZ2h0IGdvIGFnYWluIHRvIHRoZSBzZXJ2ZXIsIGJlZm9yZSB0aGUgc2VydmVyIHNlbmRzIHVzIHRoZSBjaHVuay5cclxuICAgIC8vIEdvaW5nIHRvIHRoZSBzZXJ2ZXIgaW4gdGhlIGdldCBjaHVuayBwcm9jZXNzICwgY2FuIGJlIGZvciBleGFtcGxlOiByZWNvcmQgc3VmZml4LCBvciBhbnkgc2VydmVyIHNpZGUgb3AgaW4gcmVjIHN1ZmYgb3IgVkMuXHJcbiAgICAvLyBVc3VhbGx5LCBkdXJpbmcgdGhpcyBwYXJ0LCB3ZSBkbyBub3QgcmVmcmVzaCB0aGUgdGFibGUuXHJcbiAgICAvLyBCdXQsIGZvciBleGFtcGxlIGluIFFDUiAjNjk4MjE3LCBhIGNhbGwgd2FzIG1hZGUgdG8gcmVmcmVzaFRhYmxlIHdpdGggVG9wUmVjSWR4ID09IC0xLlxyXG4gICAgLy8gVGhlIHJlYXNvbiB3YXMsIHRoYXQgaW4gdGhlIFZDIHRoZXJlIHdhcyBhIHNlcnZlciBvcCB0aGF0IHVwZGF0ZWQgYSB2YXIgaW4gdGhlIHRhc2suIEFzIGEgcmVzdWx0LCB0aGUgJ21vZGknIGZsYWdcclxuICAgIC8vIGZyb20gdGhlIHNlcnZlciB3YXMgb24sIHdoaWNoIGNhdXNlZCB0aGUgXCJ0ZW1wXCIgcmVmcmVzaFRhYmxlIGJlZm9yZSB0aGUgcmVhbCBjaHVuayBhcnJpdmVkLlxyXG4gICAgLy8gVGhpcyBpbiB0dXJuIGNhdXNlZCBhIGNoYW5nZSBpbiB0aGUgY3VyciByZWMgaWQsIHdoaWNoIHdhcyB3cm9uZy5cclxuICAgIC8vIEFmdGVyIHRoZSBjaHVuayBhcnJpdmVzLCB0aGUgcmVmcmVzaCBzZXRzIHRoZSBjb3JyZWN0IHZhbHVlcy5cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPCAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgb2xkQ3VyclJvdyA9IG9sZEN1cnJSb3cgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7IC8vIHNhdmUgb2xkQ3VyclJvdyByZWxhdGl2ZWx5IHRvIHRoZSB0b3AgaW5kZXhcclxuICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcbiAgICB0aGlzLl90YWJsZVJlZnJlc2hlZCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9yaVRyYW5zZmVyRGF0YVRvR3VpID0gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG5cclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICAvLyBRQ1IgIzk5ODA2Nywgd2UgbXVzdCBub3QgcmVmcmVzaCBzdWJmb3JtcyBmb3IgYW55IHJvd3MgdGhhdCBhcmUgbm90IG91ciByZWFsIGN1cnJlbnQgcm93XHJcblxyXG4gICAgLy8gcmVmcmVzaCBhbGwgdGhlIHJvd3MgQlVUIG5vdCB0aGUgb2xkIGN1cnJlbnQgcm93XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcm93c0luUGFnZTsgaSsrKSB7XHJcbiAgICAgIC8vIHdoZW4gdGhlcmUgaXMgbm8gcmVjb3JkIGZvciBhIHJvdyBqdXN0IGRpc2FibGUgaXQgYW5kIHZpY2UgdmVyc2FcclxuICAgICAgbGV0IHRvcEluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmICh0b3BJbmRleCA8IDApIHtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgIHRvcEluZGV4ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSB0b3BJbmRleCArIGk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaWR4KTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgb2xkIGN1cnJlbnQgcm93LiB0aGUgcmVmcmVzaCBmb3IgdGhpcyByb3cgaXMgZG9uZSBieSB0aGUgY2FsbGVyXHJcbiAgICAgICAgLy8gYW5kIHJlZnJlc2ggb25seSB2YWxpZCBsaW5lcyB0aGF0IHdlcmUgbm90IGRpc2FibGVkXHJcbiAgICAgICAgaWYgKGkgIT09IG9sZEN1cnJSb3cpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaWR4LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleC5uYW1lID09IFwiUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvblwiKSB7XHJcbiAgICAgICAgICAvLyBjcmVhdGlvbiBvZiByb3cgZmFpbGVkLCBtYXJrIHRoZSByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAgICAgICAgIGlmIChzdXBlci5pc1Jvd0NyZWF0ZWQoaWR4KSlcclxuICAgICAgICAgICAgc3VwZXIubWFya1Jvd05PVENyZWF0ZWQoaWR4KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICBpZiAoIW9yaVRyYW5zZmVyRGF0YVRvR3VpKVxyXG4gICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChvbGRDdXJyUm93ICsgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCBia3BSZWNvcmQpO1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiRW5kIGZvcm0ucmVmcmVzaFRhYmxlKClcIik7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBkaXNwbGF5IGxpbmUgYnkgcmVjb3JkIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHVwZGF0ZURpc3BsYXlMaW5lQnlEVigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGlzcGxheUxpbmUgPSB0aGlzLnJlY29yZElkeDJEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+aXMgdGhlIG5ldyBjdXJyZW50IGRpc3BsYXkgbGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5kbyB0aGUgYWN0aW9ucyBhcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZWNJZHg6IG51bWJlciA9IHRoaXMuZGlzcGxheUxpbmUyUmVjb3JkSWR4KGRpc3BsYXlMaW5lKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5UmVjSWR4KHJlY0lkeCwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIGRpc3BsYXlMaW5lKTtcclxuICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKVxyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkRpc3BsYXlMaW5lID0gZGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdXJyZW50IHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dOdW1cIj5pcyB0aGUgbmV3IGN1cnJlbnQgcm93IG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5kbyB0aGUgYWN0aW9ucyBhcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRDdXJyUm93QnlSZWNJZHgocm93TnVtOiBudW1iZXIsIGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBkaXNwbGF5TGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpID09PSBudWxsIHx8ICghc3VwZXIuaGFzVGFibGUoKSAmJiByb3dOdW0gIT09IDApKVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBGb3JtLnNldEN1cnJSb3coKSBubyB0YWJsZSBcIik7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fZGVzdFRibFJvdyA9IHJvd051bTtcclxuICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChyb3dOdW0sIGRvU3VmZml4LCBpZ25vcmVDdXJyUmVjLCB0cnVlLCBkaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fZGVzdFRibFJvdyA9IHJvd051bSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBsYXN0IHZhbGlkIHJvdyBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RWYWxpZFJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuX3Jvd3NJblBhZ2UgLSAxLCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIHJlY29yZCBsaW5lIHRvIGRpc3BsYXkgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcmVjb3JkSWR4MkRpc3BsYXlMaW5lKHJlY0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiByZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGRpc3BsYXkgbGluZSB0byByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBkaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgb2xkIGN1cnJlbnQgcm93IHVzaW5nIHRoZSBwYXJhbWV0ZXIgYW5kIGlnbm9yaW5nIGFueSBleGNlcHRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj50aGUgb2xkIGN1cnJlbnQgcm93IG51bWJlciB0byBiZSByZXN0b3JlZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZU9sZERpc3BsYXlMaW5lKGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2luUmVzdG9yZSA9IHRydWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luUmVzdG9yZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgcmVjb3JkIGZyb20gZ3VpIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BJbmRleEZyb21HVUkoKTogbnVtYmVyIHtcclxuICAgIGxldCB0b3BEaXNwbGF5TGluZTogbnVtYmVyID0gc3VwZXIuZ2V0VG9wSW5kZXhGcm9tR1VJKCk7XHJcblxyXG4gICAgaWYgKHN1cGVyLmhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgodG9wRGlzcGxheUxpbmUpKTtcclxuXHJcbiAgICByZXR1cm4gdG9wRGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgcmVjb3JkIHBvc2l0aW9uIGluIHRoZSBmb3JtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDdXJyUmVjUG9zSW5Gb3JtKCk6IG51bWJlciB7XHJcbiAgICAvLyB3aGVuIHRoZSBzZWxlY3RlZCByZWNvcmQgaXMgb3V0c2lkZSB0aGUgdmlldywgdG9wSW5kZXggYW5kIERpc3BsYXlMaW5lIHdpbGwgYmUgMFxyXG4gICAgLy8gcmVzdWx0aW5nIGluIGN1cnJSZWNQb3NJbkZvcm0gPT0gMVxyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuICAgIHJldHVybiB0aGlzLkRpc3BsYXlMaW5lIC0gdG9wRGlzcGxheUxpbmUgKyAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmVzIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZERpc3BsYXlMaW5lXCI+b2xkIGN1cnJlbnQgcmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJia3BSZWNvcmRcIj5zYXZlZCByZWNvcmQ8L3BhcmFtPlxyXG4gIGFzeW5jIHJlc3RvcmVCYWNrdXAob2xkRGlzcGxheUxpbmU6IG51bWJlciwgYmtwUmVjb3JkOiBSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFFDUiAjOTQyODc4LCBpZiByZWNvcmQgaXMgaW4gcHJvY2VzcyBvZiBpbnNlcnQsIGRlbGV0ZSBvciBtb2RpZnkgd2UgbXVzdCBwZXJmb3JtIHJlc3RvcmVPbGRDdXJyUm93XHJcbiAgICAvLyB0aGF0IHdpbGwgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IGFjdGlvbnMgZm9yIHRoZSByZWNvcmQsIG90aGVyd2lzZSB3ZSBjYW4ganVzdCByZXN0b3JlIGl0IGZyb20gYmFja3VwXHJcbiAgICBpZiAoYmtwUmVjb3JkLmdldElkKCkgPj0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0UmVjSWR4KGJrcFJlY29yZC5nZXRJZCgpKSA+PSAwICYmIG9sZERpc3BsYXlMaW5lID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPj0gMCAmJiBia3BSZWNvcmQuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZSkge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkucmVzdG9yZUN1cnJlbnQoYmtwUmVjb3JkKTtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gIH1cclxuXHJcbiAgQ29uc3RydWN0TWdDb250cm9sKCk6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHRhc2s6IFRhc2tCYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlO1xyXG4gIENvbnN0cnVjdE1nQ29udHJvbCh0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2xJZHg6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU/OiBNZ0NvbnRyb2xUeXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0/OiBhbnksIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHg/OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkNvbnN0cnVjdE1nQ29udHJvbF8wKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmICh0YXNrT3JQYXJlbnRNZ0Zvcm0gPT09IG51bGwgfHwgdGFza09yUGFyZW50TWdGb3JtIGluc3RhbmNlb2YgVGFza0Jhc2UpICYmIChwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4ID09PSBudWxsIHx8IHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHguY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzEodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkNvbnN0cnVjdE1nQ29udHJvbF8yKHR5cGUsIHRhc2tPclBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbnN0cnVjdHMgYW4gb2JqZWN0IG9mIE1nQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbnN0cnVjdE1nQ29udHJvbF8wKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBNZ0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzEodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBNZ0NvbnRyb2wodHlwZSwgdGFzaywgcGFyZW50Q29udHJvbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudE1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50Q29udHJvbElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbnN0cnVjdE1nQ29udHJvbF8yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCBwYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgdHJ1ZSBpZiBhbHJlYWR5IG1vdmVkIHRvIHRoZSBmaXJzdCBjb250cm9sIG9uIG9uZSBvZiB0aGUgTWdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE1HRGF0YSgpLkFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0YWJsZSBmaXJzdCB0aW1lIHdlIGVudGVyIHRoZSBvd25lclRhc2tcclxuICAvLy8gICBnZXQgcm93cyBudW1iZXIgZm9ybSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGZpcnN0VGFibGVSZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHN1cGVyLmZpcnN0VGFibGVSZWZyZXNoKCk7XHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBJbnNlcnRUYWJsZUl0ZW1zKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlJvd3MuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICAgIHRoaXMuSW5zZXJ0VGFibGVDaGlsZHJlbkFycmF5cyhpZHgsIGNvdW50KTtcclxuICAgICAgdGhpcy5fbGFzdFJvd1NlbnQgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAgc2V0VGFibGVJdGVtc0NvdW50KHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRhYmxlSXRlbXNDb3VudDogbnVtYmVyO1xyXG5cclxuICAgIC8vIEZvciBhYnNvbHV0ZSBzY3JvbGxiYXIsIHNldCB0aGUgdmlydHVhbCBpdGVtcyBjb3VudCBhY2NvcmRpbmdseS5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSkge1xyXG5cclxuICAgICAgLy8gSWYgdGFzayBpcyBtb3ZlZCBpbnRvIENSRUFURSBtb2RlIGFuZCBjdXJyZW50bHkgbmV3IGxpbmUgaXMgY3JlYXRlZFxyXG4gICAgICAvLyB0aGVuIG9ubHkgbmV3bHkgY3JlYXRlZCByZWNvcmRzIHNob3VsZCBiZSBzZWUgb24gdGhlIHNjcmVlblxyXG4gICAgICBpZiAoKDxUYXNrQmFzZT50aGlzLl90YXNrKS5nZXRPcmlnaW5hbFRhc2tNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFXHJcbiAgICAgICAgICAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG5cclxuICAgICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICAvLyBSZXNldCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXdcclxuICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA+IDApIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSAwO1xyXG4gICAgICAgICAgdGhpcy5TZXRSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcoMCk7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBUYWJsZSB3aXRoIHNldCBvZiByZWNvcmRzIE9SIGlmIGVtcHR5IHRhYmxlIHRoZW4gdGFibGVJdGVtc0NvdW50IHNob3VsZCBub3QgYmUgMCwgYXMgd2UgYWx3YXlzIGhhdmUgMHRoIHJvdy5cclxuICAgICAgICB0YWJsZUl0ZW1zQ291bnQgPSAodGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkgPyB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ6IDE7XHJcbiAgICAgICAgdGhpcy5TZXRSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcodGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBOb24tcGFnaW5hdGVkIHRhYmxlXHJcbiAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgIHN1cGVyLlNldFRhYmxlSXRlbXNDb3VudCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgSW5pdFRhYmxlQ29udHJvbCgpOiB2b2lkO1xyXG4gIEluaXRUYWJsZUNvbnRyb2woZHZTaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIEluaXRUYWJsZUNvbnRyb2woZHZTaXplPzogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ/OiBudW1iZXIsIHJlbW92ZUFsbD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMDEoZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRzIHRoZSB0YWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEluaXRUYWJsZUNvbnRyb2xfMDAoKTogdm9pZCB7XHJcbiAgICBsZXQgZHZTaXplOiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IHRhYmxlSXRlbXNDb3VudDogbnVtYmVyID0gMTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIHRhYmxlIGNvbnRyb2wgZm9yIHRoZSBmaXJzdCB0aW1lIHdoaWxlIGNyZWF0aW5nIHRoZSBmb3JtIHdpdGggdG90YWxSZWNvcmRzQ291bnQgYW5kIGFsc29cclxuICAgIC8vIHNldCB0aGUgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3LCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGZpcnN0IHJvdyBhdCByZXNwZWN0aXZlIGxvY2F0aW9uIGluIGNhc2Ugb2YgbG9jYXRlLlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCA+IDApIHtcclxuICAgICAgbGV0IHJlY29yZHNCZWZvcmVDdXJyZW50VmlldzogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50O1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbChkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgZmFsc2UpO1xyXG4gICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRzIHRhYmxlIGNvbnRyb2wncyByb3dzIHRvICd0YWJsZUl0ZW1zQ291bnQnIGNvdW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlNpemVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhYmxlSXRlbXNDb3VudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVtb3ZlQWxsXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEluaXRUYWJsZUNvbnRyb2xfMDEoZHZTaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAocmVtb3ZlQWxsKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRydWUpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfTEFTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfRklSU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5Jc09uZVdheUtleSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX0VNUFRZX0RBVEFWSUVXLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHlEYXRhdmlldygpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3VwZXIuSW5pdFRhYmxlQ29udHJvbChkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuXHJcbiAgICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdG9wIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTZXRUYWJsZVRvcEluZGV4KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICBpZiAoaW5kZXggPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSkge1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpIHtcclxuICAgICAgICAgIC8vIHRhYmxlIG5vdyBiZWhhdmVzIGxpa2UgbGlzdHZpZXcsIGl0IGNhbiBub3Qgc2hvdyBlbXB0eSBsaW5lc1xyXG4gICAgICAgICAgLy8gc28gd2UgbXVzdCB1cGRhdGUgdG9wIGluZGV4XHJcbiAgICAgICAgICBpZiAoaW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlID4gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICAvLyBidXQgd2UgZG8gc2hvdyBlbXB0eSBsaW5lcyBpZiBpbmNsdWRlRmlyc3QgPSBmYWxzZVxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBsZXNzIHJlY29yZHMgdGhlbiByb3dzIG9uIHNjcmVlbiBRQ1IgIyEhISEhIVxyXG4gICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSB8fCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSB0aGlzLl9yb3dzSW5QYWdlLCAwKTtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGluZGV4KTtcclxuICAgICAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5fcHJldkd1aVRvcEluZGV4IHx8IHRoaXMuSXNNb3ZpbmdJblZpZXcpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9UT1BfSU5ERVgsIHRoaXMuX3RhYmxlTWdDb250cm9sLCBpbmRleCk7XHJcbiAgICAgICAgdGhpcy5fcHJldkd1aVRvcEluZGV4ID0gdGhpcy5nZXRHdWlSb3dpZHgoaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ3JlYXRlcyB0aGUgd2luZG93IGRlZmluZWQgYnkgdGhpcyBmb3JtIGFuZCBpdHMgY2hpbGQgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGNyZWF0ZUZvcm0oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBzdXBlci5jcmVhdGVGb3JtKCk7XHJcbiAgICBNZ0Zvcm0uQ3JlYXRlZEZvcm1zLmFkZCh0aGlzKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+V3JpdGVzIHRoZSBzdHJpbmcgb3Igc2V0cyB0aGUgaW1hZ2Ugb24gdGhlIHBhbmUgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4Ljwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYW5lSWR4XCI+SW5kZXggb2YgdGhlIHBhbmUgdG8gYmUgdXBkYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RySW5mb1wiPk1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNvdW5kQmVlcFwiPlNvdW5kIGJlZXAgb3Igbm90PC9wYXJhbT5cclxuICBVcGRhdGVTdGF0dXNCYXIoKTogdm9pZCB7XHJcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgaW4gV2ViQ2xpZW50LlxyXG4gICAgLy8gaWYgKHBhbmVJZHggPT0gQ29uc3RhbnRzLlNCX01TR19QQU5FX0xBWUVSIHx8IEVudmlyb25tZW50Lkluc3RhbmNlLmdldFNwZWNpYWxTaG93U3RhdHVzQmFyUGFuZXMoKSlcclxuICAgIC8vICAgYmFzZS5VcGRhdGVTdGF0dXNCYXIocGFuZUlkeCwgc3RySW5mbywgc291bmRCZWVwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgcmVjb21wdXRlIHRhYmxlIGZvciB0aGF0IGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvdW5kVGFnTmFtZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURSkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gcmVjb21wdXRlIGZvcm1cIik7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuUmVjb21wdXRlRmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcIntcIiArIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiOiB0YXNrPVwiICsgdGhpcy5fdGFzayArIFwiLCBJZD1cIiArIHRoaXMuX3VzZXJTdGF0ZUlkICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGJ1aWxkIHRoZSBYTUwgZW50cnkgb2YgdGhlIGhpZGRlbiBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRIaWRkZW5Db250cm9sTGlzdFhNTCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHhtbDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdCAhPT0gbnVsbCAmJiB0aGlzLmhpZGRlbkNvbnRyb2xzSXNuc0xpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyB3cml0ZSB0aGUgaWRcclxuICAgICAgeG1sLkFwcGVuZChcIjxcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19ISURERU5fQ09OVE9MUyArIFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JU05TICsgXCI9XFxcIlwiKTtcclxuXHJcbiAgICAgIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5mb3JFYWNoKChjaGFuZ2U6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHhtbC5BcHBlbmQoY2hhbmdlICsgXCIsXCIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHhtbC5SZW1vdmUoeG1sLkxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgeG1sLkFwcGVuZChcIlxcXCIvPlwiKTtcclxuXHJcbiAgICAgIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCB0aGlzIGZvcm0gYmVoYXZlIGFzIE1vZGFsIGFsdGhvdWdoIGl0cyBXaW5kb3dUeXBlICE9IE1vZGFsP1xyXG4gIC8vLyBGb3IgUklBLCBOb24gSW50ZXJhY3RpdmUgdGFzaydzIGFuZCBpdHMgYWxsIGNoaWxkIHRhc2sgc2hvdWxkIGJlaGF2ZSBhcyBhIE1vZGFsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRCZWhhdmVBc01vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNob3VsZEJlTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjODAyNDk1LCBub24gaW50ZXJhY3RpdmUgdGFza3MgYW5kIGl0cyBjaGlsZHJlbiB3aWxsIGJlIG9wZW5lZCB1c2luZyBzaG93IGRpYWxvZyB0byBwcmV2ZW50IGV2ZW50cyBvbiB0aGVpciBhbmNlc3RvcnNcclxuICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmICF0aGlzLl90YXNrLmlzTWFpblByb2coKSlcclxuICAgICAgc2hvdWxkQmVNb2RhbCA9IFRhc2tCYXNlLlNob3VsZE5vbkludGVyYWN0aXZlQmVNb2RhbCgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrQmFzZSA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuUGFyZW50VGFzaztcclxuICAgICAgaWYgKHBhcmVudFRhc2sgIT09IG51bGwgJiYgIXBhcmVudFRhc2suSXNJbnRlcmFjdGl2ZSAmJiAhcGFyZW50VGFzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgc2hvdWxkQmVNb2RhbCA9IHBhcmVudFRhc2suU2hvdWxkTm9uSW50ZXJhY3RpdmVDaGlsZEJlTW9kYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkQmVNb2RhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgd2hldGhlciBhIHBhZ2luYXRlZCB0YWJsZSBiZWluZyB1c2VkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIHRhYmxlIGJlaW5nIHVzZWQgd2l0aCBhYnNvbHV0ZSBzY3JvbGxiYXIgdGh1bWIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyID0gKDxNZ0NvbnRyb2w+dGhpcy5fdGFibGVNZ0NvbnRyb2wpLklzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICByZXR1cm4gdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYnVpbGRGb3JtTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9ICB0aGlzLlVuaXF1ZU5hbWU7XHJcbiAgICBsZXQgdGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+dGhpcy5nZXRUYXNrKCk7XHJcblxyXG4gICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB3aGlsZSAodGFzay5Jc1N1YnRhc2spIHtcclxuICAgICAgdGFzayA9IDxUYXNrQmFzZT50YXNrLlN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICAgIG5hbWUgPSAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyAnXycgKyBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvLS9nLCBcIl9cIik7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpIDogVG8gZmV0Y2ggcHJldmlvdXMgY2h1bmsgb2YgcmVjb3JkcyBpZiBuZWVkZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUHJldkNodW5rRm9yQ3VycmVudFBhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjUG9zT25QYWdlOiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ICUgdGhpcy5fcm93c0luUGFnZTtcclxuXHJcbiAgICAgIC8vIElmIHJlY29yZCBpcyBub3QgdGhlIGZpcnN0IHJlY29yZCBvbiBwYWdlLCBmZXRjaCBwcmV2aW91cyByZWNvcmQgZm9yIHRoYXQgcGFnZS5cclxuICAgICAgLy8gVE9ETyA6IHRoaXMuRGlzcGxheUxpbmUgLSBDaGVjayB3aGV0aGVyIGNhbiBiZSByZW1vdmVkID9cclxuICAgICAgaWYgKHJlY1Bvc09uUGFnZSA+IDAgJiYgdGhpcy5EaXNwbGF5TGluZSA9PT0gMCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Um93RGF0YSgtcmVjUG9zT25QYWdlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEd1aVJvd2lkeChkdlJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkdlJvd0lkeCArIHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXREdlJvd0lkeChndWlSb3dJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZ3VpUm93SWR4IC0gdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcbn1cclxuIl19
1176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sYUFBYSxFQUNiLElBQUksRUFDSixRQUFRLEVBQ1IsWUFBWSxFQUViLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFXLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTTdDLE1BQU0sT0FBTyxNQUFPLFNBQVEsVUFBVTtJQW9CcEM7UUFDRSxLQUFLLEVBQUUs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LElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7WUFDbkYsSUFBSSxZQUFZLEdBQVcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFJMUYsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxFQUFFO2dCQUM5QyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDN0M7U0FDRjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBaUI7UUFDM0IsT0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ2pFLENBQUM7O0FBaHdEYyxpQkFBVSxHQUFXLEVBQUUsQ0FBQztBQVloQyxvQkFBYSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIENvbnRyb2xUYWJsZSxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgR3VpRW52aXJvbm1lbnQsXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSb3dcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1pc2MsXHJcbiAgUHJpb3JpdHksXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEV4Y2VwdGlvbixcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4vTWdDb250cm9sJztcclxuaW1wb3J0IHtSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9ufSBmcm9tICcuLi9kYXRhL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3LCBTRVRfRElTUExBWUxJTkVfQllfRFZ9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQge1Rhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4uL3JlbW90ZS9TZXJ2ZXJFcnJvcic7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7Q3JlYXRlZEZvcm1WZWN0b3J9IGZyb20gJy4vQ3JlYXRlZEZvcm1WZWN0b3InO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZvcm0+Li4uPC9mb3JtPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgTWdGb3JtIGV4dGVuZHMgTWdGb3JtQmFzZSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVElNRV9MSU1JVDogbnVtYmVyID0gNTA7IC8vIHRpbWUgbGltaXQgZm9yIG9uZSB0cmFuc2ZlciBvcGVyYXRpb24gKGluIG1pbGxpIHNlY29uZHMpXHJcbiAgSXNNb3ZpbmdJblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcmV2RGlzcGxheUxpbmU6IG51bWJlciA9IDA7IC8vIGRpc3BsYXkgaWRlbnRpZmllciBvZiBwcmV2IGxpbmVcclxuICBSZWZyZXNoQWxsUm93czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBJZ25vcmVGaXJzdFJlY29yZEN5Y2xlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTW92ZWRUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIHdoZW4gbW92ZSB0byBmaXJzdCBjb250cm9sIHNob3VsZCBiZSBleGVjdXRlZCBvbiB0aGUgZm9ybVxyXG5cclxuICBwcml2YXRlIF9zdWZmaXhEb25lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaGlkZGVuQ29udHJvbHNJc25zTGlzdDogTGlzdDxudW1iZXI+ID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIF9jcmVhdGVkRm9ybXM6IENyZWF0ZWRGb3JtVmVjdG9yID0gbmV3IENyZWF0ZWRGb3JtVmVjdG9yKCk7XHJcblxyXG4gIC8vVE9ETzogTWF5YmUgdGhlIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIGxpa2UgYWxsb3dGaWVsZENvbXB1dGVcclxuICBwcml2YXRlIF90cmFuc2ZlcnJpbmdEYXRhVG9HVUk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBpc0ZldGNoaW5nUmVjb3Jkc0FoZWFkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXQgQ3JlYXRlZEZvcm1zKCk6IENyZWF0ZWRGb3JtVmVjdG9yIHtcclxuICAgIHJldHVybiBNZ0Zvcm0uX2NyZWF0ZWRGb3JtcztcclxuICB9XHJcblxyXG4gIGdldCBJblJlc3RvcmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5SZXN0b3JlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyYW5zZmVycmluZ0RhdGFUb0dVSSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvdWxkRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgbGV0IHByb3AgPSB0aGlzLl90YWJsZU1nQ29udHJvbC5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEKTtcclxuXHJcbiAgICAgIHJldHVybiAocHJvcCAhPSBudWxsID8gcHJvcC5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpIDogZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIHRhc2sgZGF0YXZpZXcsIGlmIHRoZSB0YXNrIGV4aXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dGhlIHRhc2sgZGF0YXZpZXc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXREYXRhdmlldygpOiBEYXRhVmlldyB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fdGFzayAhPSBudWxsKVxyXG4gICAgICBkdiA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG5cclxuICAgIHJldHVybiAoZHYpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmUgb25lIHBhZ2Uvcm93IHVwL2Rvd24gb3IgdG8gdGhlIGJlZ2lubmluZy9lbmQgb2YgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidW5pdFwiPnRvIG1vdmUgaW50bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJEaXJlY3Rpb25cIj5vZiBtb3Zpbmc8L3BhcmFtPlxyXG4gIGFzeW5jIG1vdmVJblZpZXcodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpO1xyXG4gICAgbGV0IG9sZFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBsZXQgcmV0dXJuVG9WaXNpYmxlTGluZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlY29yZE91dE9mVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHZpc2libGVMaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuSXNNb3ZpbmdJblZpZXcgPSB0cnVlO1xyXG4gICAgICBsZXQgb2xkRGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuRGlzcGxheUxpbmU7XHJcblxyXG4gICAgICAvLyB0YWJsZSBtb3ZlbWVudHMgKGZpcnN0IC8gbGFzdCByZWNvcmQpXHJcbiAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIEJFR0lOSU5HIE9GIFRBQkxFXHJcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfRklSU1RfUkVDT1JELCB0cnVlLCBmYWxzZSwgdHJ1ZSxcclxuICAgICAgICAgICAgICBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHRhYmxlIGluIHRoZSBmb3JtXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSgwLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBFTkQgT0YgVEFCTEVcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KENvbnN0YW50cy5NR19EQVRBVklFV19MQVNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlICsgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA+PSAwKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBwYWdlIGFuZCByb3cgbW92ZW1lbnRzXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0VG9wSW5kZXhGcm9tR1VJKCk7XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcmVjb3JkcyB0byBza2lwXHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlcjtcclxuICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmIHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xyXG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTjpcclxuICAgICAgICAgICAgICBzaXplID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EOlxyXG5cclxuICAgICAgICAgICAgICBsZXQgbGFzdDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5fcm93c0luUGFnZSAtIDE7XHJcbiAgICAgICAgICAgICAgbGFzdCA9IE1hdGgubWluKGxhc3QsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxKTtcclxuICAgICAgICAgICAgICBzaXplID0gbGFzdCAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgcmV0dXJuVG9WaXNpYmxlTGluZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuX3Jvd3NJblBhZ2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHNpemUgPSAxO1xyXG5cclxuICAgICAgICBzaXplID0gKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgfHxcclxuICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTlxyXG4gICAgICAgICAgPyAtc2l6ZVxyXG4gICAgICAgICAgOiBzaXplKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA8IDApIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSAwO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nIHRoZSB0YWJsZSBvbmUgcGFnZSBvciBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKSB8fFxyXG4gICAgICAgICAgICB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB2aXNpYmxlTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmIHZpc2libGVMaW5lID09PSAwKSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBwcmV2aW91cyByb3cgYnV0IHdlIGFyZSBhdCB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJlxyXG4gICAgICAgICAgICAgICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyB8fCB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UpICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIG5leHQgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGxhc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgc2l6ZSk7XHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZCh0cnVlKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0aGlzLl9zdWZmaXhEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5NTQ5Njogd2hlbiB0aGUgcmVjb3JkIHN1ZmZpeCBmYWlsZWQgZ28gYmFjayB0byB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQgIT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHModGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5MjEwMTogaWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgdGhlIHJlYyBzdWZmaXhcclxuICAgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGV4ZWN1dGVkIHNvIHdlIG11c3QgaGFuZGxlIGl0IGJlZm9yZSB3ZSBnbyB0byBhIG5ldyByb3dcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlY0lkOiBudW1iZXIgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlY0lkID09PSBvbGRSZWNJZCAmJiAhdGhpcy5fc3VmZml4RG9uZSlcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgNzU4NjM5XHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB0aGlzLmdldExhc3RWYWxpZFJvdygpLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVzdG9yZVRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJiBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbW92aW5nIHRoZSBtYXJraW5nIG9uZSByb3cgdXAgb3IgZG93blxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgb2xkVGFza01vZGUgPSB0aGlzLl90YXNrLmdldE1vZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgb2xkUmVjSWQgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lICsgc2l6ZSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIHdhcyBkZWxldGVkIGluIFJ1biBUaW1lIGJ5IEZvcmNlIERlbGV0ZSBmb3IgZXhhbXBsZVxyXG4gICAgICAgICAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDAgfHwgb2xkVGFza01vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPT0gLTEgfHwgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0cyhvbGREaXNwbGF5TGluZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSICMyOTM2NjhcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJza2lwcGVkIHNldGN1cnJSb3cgZm9yIHJvdyB7MH1cIiwgb2xkRGlzcGxheUxpbmUpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IGlmIGV2ZXJ5dGhpbmcgaXMgT0ssIGN1cnIgcmVjIHdpbGwgbGF0ZXIgYmUgcmVmcmVzaGVkIGluXHJcbiAgICAgICAgICAgICAgICAvLyBSRUNfUFJFRklYXHJcbiAgICAgICAgICAgICAgICAvLyB0aHVzLCByZWZyZXNoIG9ubHkgaW4gY2FzZSBvZiBlcnJvci5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgZXJyb3IgaXMgYmVjYXVzZSB0aGUgb2xkLXJlYyB3YXMgcmVtb3ZlZCAoY2FuY2VsRWRpdCdlZCksIHNvIHJlZnJlc2ggZm9ybS5cclxuICAgICAgICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVjRXhpc3RzQnlJZChvbGRSZWNJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM3NzUzMDk6IGlmIGxlYXZpbmcgdGhlIG5ldyBjcmVhdGVkIHJlY29yZCBmYWlsZWQgdGhlbiByZXN0b3JlXHJcbiAgICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgYSBuZXcgcmVjb3JkIHNvIHRoZSBuZXh0IGFjdGlvbiB3b3VsZFxyXG4gICAgICAgICAgICAgICAgICAvLyBcImtub3dcIiB0aGF0IGl0IGlzIHN0aWxsIGEgbmV3IHJlY29yZC5cclxuICAgICAgICAgICAgICAgICAgLy8gRGVmZWN0ICMgODE2MjcgOiBJZiB0YXNrIGlzIGhhdmluZyBhIHN1YmZvcm0sIHRoZW4gd2hpbGUgbW92aW5nIHRvIHN1YmZvcm0sIG5ld2x5IGNyZWF0ZWQgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgIC8vIGlzIHN5bmNlZCBhbmQgaXQgaXMgaW5zZXJ0ZWQgaW4gX21vZGlmaWVkVGFiIGFzICdpbnNlcnQnIHJlY29yZC4gU28sIGFueSByZXF1ZXN0IHRvIHNlcnZlciBpbnNlcnRzXHJcbiAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0byBzZXJ2ZXIuIEV2ZW4gaWYgd2UgZG9udCBnbyB0byBzZXJ2ZXIsIGl0IGlzIHRoZXJlIGluIF9tb2RpZmllZFRhYiBhcyBuZXcgcmVjb3JkLiBJbnNlcnRpbmdcclxuICAgICAgICAgICAgICAgICAgLy8gaGVyZSBhbHJlYWR5IHN5bmNlZCByZWNvcmQgY2F1c2VzIGluc2VydGlvbiBvZiByZWNvcmQgdHdpY2UuIFNvLCBJZiBjdXJyZW50IHJlY29yZCBpcyBub3Qgc3luY2VkIHRoZW4gb25seSBpbnNlcnQuXHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIWN1cnJSZWMuU3luY2VkICYmIG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5zZXROZXdSZWMoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk4MDUyODogUmVmcmVzaCB0aGUgY3VycmVudCByb3cgYWZ0ZXIgY2FuY2VsIGVkaXQgdG8gcmVmbGVjdFxyXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdG9yZWQgdmFsdWVzXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBvbGREaXNwbGF5TGluZSA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUgLSAxKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gMCB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkIGJ1ZyAjOjk0MTc2Mywgd2hpbGUgY3JlYXRlIGlzbid0IGFsbG93ZWQgbmVlZCB0byBkbyBzdWZmaXggYW5kIHByZWZpeCBvZiB0aGUgY3VycmVudCByZWNvcmRcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBkb1JlY29yZFN1ZmZpeDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVmZG9SZWNvcmRTdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGRvUmVjb3JkU3VmZml4KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkRvVGFza0xldmVsUmVjb3JkU3VmZml4KDxUYXNrQmFzZT50aGlzLl90YXNrLCByZWZkb1JlY29yZFN1ZmZpeCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkRvVGFza0xldmVsUmVjb3JkUHJlZml4KHRoaXMuX3Rhc2spO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZG9SZWNvcmRTdWZmaXggPSByZWZkb1JlY29yZFN1ZmZpeC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgdGhlIGZvcm0gZG9lcyBub3QgaGF2ZSBhIHRhYmxlLCBtb3ZlIHRvIG9uZSByb3cgaW4gdGhlIGNob3NlbiBEaXJlY3Rpb25cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLlByb2Nlc3NBYm9ydGluZ0Vycm9yKGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAocmV0dXJuVG9WaXNpYmxlTGluZSkge1xyXG4gICAgICAgIGlmIChyZWNvcmRPdXRPZlZpZXcpIHtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA9PT0gMClcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSk7XHJcbiAgICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdmlzaWJsZUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG5cclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGUuTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG5cclxuICAgICAgdGhpcy5TZWxlY3RSb3coKTtcclxuICAgICAgdGhpcy5Jc01vdmluZ0luVmlldyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSByZWNvcmQgdG8gdGhlIGZvcm0gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBhZGRSZWMoZG9TdWZmaXg6IGJvb2xlYW4saXNDcmVsaW5lQWJvdmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBuZXdMaW5lOiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IGN1cnJMaW5lOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIGN1cnJMaW5lID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG5cclxuICAgIC8vIEluY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGFkZGVkIGludG8gdGhlIHZpZXcuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCArPSAxO1xyXG4gICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbmV3UmVjSWR4OiBudW1iZXIgPSBhd2FpdCAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuYWRkUmVjb3JkKGRvU3VmZml4LCBmYWxzZSwgaXNDcmVsaW5lQWJvdmUpO1xyXG5cclxuICAgIGlmIChuZXdSZWNJZHggPiAtMSkge1xyXG4gICAgICAvLyBmb3JtcyB3aXRoIGEgdGFibGVcclxuICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgLy8gdGhlcmUgYXJlIG5vIHJlY29yZHMgaW4gdGhlIHRhYmxlIHNvIHRoZSBuZXcgcm93IGlzIGNyZWF0ZWQgYWZ0ZXJcclxuICAgICAgICAvLyBzZXR0aW5nIHRoZSB0b3AgcmVjb3JkIHRvIDAgYW5kIHRoZSBjdXJyZW50IHJvdyB0byAwXHJcbiAgICAgICAgbGV0IG5ld0N1cnJSb3c6IG51bWJlcjtcclxuICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA9PT0gMCB8fCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgbmV3Q3VyclJvdyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBjdXJzb3IgaXMgcGFya2luZyBvbiB0aGUgbGFzdCByb3cgb2YgdGhlIGRpc3BsYXllZCB0YWJsZSBzbyB0aGVcclxuICAgICAgICAvLyBuZXcgcm93IGlzIGNyZWF0ZWQgYWZ0ZXIgaW5jcmVtZW50aW5nIHRoZSB0b3AgcmVjb3JkIGluZGV4XHJcbiAgICAgICAgZWxzZSBpZiAoY3VyckxpbmUgPT09IHRoaXMuX3Jvd3NJblBhZ2UgLSAxKSB7XHJcbiAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIDEpO1xyXG4gICAgICAgICAgbmV3Q3VyclJvdyA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIG5ldyByb3cgaXMgY3JlYXRlZCB3aXRob3V0IGNoYW5naW5nIHRoZSB0b3AgcmVjb3JkXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChpc0NyZWxpbmVBYm92ZSlcclxuICAgICAgICAgICAgbmV3Q3VyclJvdyA9IGN1cnJMaW5lID4gMCA/IGN1cnJMaW5lIDogMDtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgbmV3Q3VyclJvdyA9IGN1cnJMaW5lICsgMTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBuZXdMaW5lID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgbmV3Q3VyclJvdztcclxuXHJcbiAgICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIG5ld0N1cnJSb3cpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShuZXdMaW5lLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBzaG91bGQgcmVhbGx5IGJlIGNhdWdodCBoZXJlXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gRm9ybS5hZGRSZWMoKSB7MH1cIiwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgIHtcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50IC09IDE7XHJcbiAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBkZWxDdXJyUmVjKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRvcFRhYmxlUm93OiBib29sZWFuID0gc3VwZXIuaXNMaW5lTW9kZSgpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkucmVtb3ZlQ3VyclJlYygpO1xyXG5cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIGlmICh0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWMoZmFsc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkge1xyXG4gICAgICAgICAgLy8gY2hhbmdlIHRvIGNyZWF0ZSBtb2RlXHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG5cclxuICAgICAgICAgIC8vIE1HX0FDVF9DUkVMSU5FIG1heSBiZSBkaXNhYmxlZCAuaS5lLiBQUk9QX1RZUEVfQUxMT1dfQ1JFQVRFIGV4cHJlc3Npb24gY2FuIGJlIGNoYW5nZWRcclxuICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZW5hYmxlQ3JlYXRlQWN0cyh0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGV4aXQgZnJvbSB0aGUgb3duZXJUYXNrXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoZSBlbXB0aW5lc3Mgb2YgdGhlIERWIG11c3QgYmUgY2hlY2tlZCBhZ2FpbiBiZWNhdXNlIHRoZSBcImNyZWF0ZSBsaW5lXCIgbWF5IGZhaWxcclxuICAgIGlmICghdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSkge1xyXG4gICAgICBpZiAodG9wVGFibGVSb3cpXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgLy8gRGVjcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgZGVsZXRlZC5cclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50LS07XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHNjcmVlbiBtb2RlXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIHRydWUsIHRydWUsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbmNlbCB0aGUgZWRpdGluZyBvZiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMgb2YgdGhlIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0FjdENhbmNlbFwiPnRydWUgaWYgY2FsbGVkIGZvciBBQ1RfQ0FOQ0VMLCBmYWxzZSBvdGhlcndpc2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNRdWl0RXZlbnRcIj48L3BhcmFtPlxyXG4gIGFzeW5jIGNhbmNlbEVkaXQoaXNBY3RDYW5jZWw6IGJvb2xlYW4sIGlzUXVpdEV2ZW50OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbW9kZTogc3RyaW5nID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcbiAgICBsZXQgbmV3TW9kZTogc3RyaW5nO1xyXG4gICAgbGV0IHJvdzogbnVtYmVyID0gMDtcclxuICAgIGxldCBleGVjUmVjUHJlZml4OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gV2UgcmV0dXJuIHRvIGNyZWF0ZSBtb2RlIG9ubHkgaWYgdGhlcmUgaXMgbm8gcmVjb3JkIHRvIGdvIHRvIGFmdGVyIHRoZSBjYW5jZWwgYWN0aW9uXHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA9PT0gMSAmJiBtb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgbmV3TW9kZSA9IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFO1xyXG4gICAgZWxzZVxyXG4gICAgICBuZXdNb2RlID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlk7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAvLyA5OTcwNzMgJiA5MzEwMjEuXHJcbiAgICAvLyBFeHBlY3RlZCBiZWhhdmlvciBkdXJpbmcgY2FuY2VsIGV2ZW50LCBmb3IgYSBuZXcgcmVjb3JkOlxyXG4gICAgLy8gSWYgdGhlIG9yaWdpbmFsIG93bmVyVGFzayBtb2RlIGlzIG5vdCBjcmVhdGUsIGRlbGV0ZSB0aGUgbmV3IHJlY29yZCBhbmQgZ28gYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkLlxyXG4gICAgLy8gSWYgdGhlIG9yaWdpbmFsIG93bmVyVGFzayBtb2RlIGlzIGNyZWF0ZSwgc3RheSBvbiB0aGUgbmV3IHJlY29yZC5cclxuXHJcbiAgICAvLyBkdi5jYW5jZWxFZGl0KCkgcmVtb3ZlcyB0aGUgbmV3IHJlY29yZCB1bmRlciBzb21lIGNvbmRpdGlvbi5cclxuICAgIC8vIFNvLCBpbiBjYXNlIG9mIG9yZ1Rhc2tNb2RlPUMsIHNpbmNlIHdlIHdhbnQgdG8gc3RheSBvbiB0aGUgbmV3IHJlY29yZCwgd2UgbmVlZCB0byByZS1jcmVhdGUgYSByZWNvcmQuXHJcblxyXG4gICAgLy8gQnV0IGFzIHNhaWQsIGR2LmNhbmNlbEVkaXQoKSByZW1vdmVzIHRoZSBuZXcgcmVjb3JkIE9OTFkgdW5kZXIgc29tZSBjb25kaXRpb24uXHJcbiAgICAvLyBUaGUgY29uZGl0aW9uIGlzIGFzIGZvbGxvd3M6XHJcbiAgICAvLyBUaGUgcmVjb3JkIGlzIHJlbW92ZWQgb25seSBpZiB0aGUgZHYgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMS4gU28sIGlmIHRoZSBkdiBzaXplIGlzIDEsIGR2LmNhbmNlbEVkaXQoKVxyXG4gICAgLy8gZG9lcyBub3QgcmVtb3ZlIHRoZSByZWNvcmQgYW5kIGhlbmNlIGluIHRoaXMgY2FzZSwgZm9ybS5jYW5jZWxFZGl0KCkgc2hvdWxkIG5vdCBjcmVhdGUgYSBuZXcgcmVjb3JkLlxyXG4gICAgLy8gRm9yIHRoaXMgcmVhc29uLCB0aGUgc2lnbmF0dXJlIG9mIGR2LmNhbmNlbEVkaXQoKSBpcyBjaGFuZ2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgcmVtb3ZlZCBvciBub3QuXHJcblxyXG4gICAgLy8gVGhpcyBpcyBvbmUgcGFydC5cclxuXHJcbiAgICAvLyBOb3csIGFmdGVyIGNhbmNlbEVkaXQsIFJQIGhhcyB0byBiZSBleGVjdXRlZC4gVGhpcyB3YXMgZG9uZSBpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKS0+Y2FzZSBNR19BQ1RfQ0FOQ0VMLlxyXG4gICAgLy8gQnV0IHdoYXQgaGFwcGVucyBpcywgaWYgZm9ybS5jYW5jZWxFZGl0KCkgY3JlYXRlZCBhIG5ldyBsaW5lLCBSUCB3YXMgYWxyZWFkeSBleGVjdXRlZCBmcm9tIHRoZXJlLiBBbmQgZnJvbVxyXG4gICAgLy8gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCksIFJQIGlzIGV4ZWN1dGVkIGZvciB0aGUgc2Vjb25kIHRpbWUuXHJcbiAgICAvLyBTbywgbW92ZWQgdGhlIGNvZGUgb2YgZXhlY3V0aW5nIFJQIGZyb20gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCktPmNhc2UgTUdfQUNUX0NBTkNFTCB0byBmb3JtLmNhbmNlbEVkaXQoKVxyXG4gICAgLy8gYW5kIHRoYXQgd2lsbCBiZSBkb25lIG9ubHkgaWYgdGhlIGNyZWF0ZSBsaW5lIHdhcyBub3QgZXhlY3V0ZWQuXHJcblxyXG4gICAgLy8gTm93LCB3ZSBoYXZlIG9uZSBtb3JlIGlzc3VlLlxyXG5cclxuICAgIC8vIFVudGlsIG5vdywgdGhlIFJQIHdhcyBleGVjdXRlZCBhZnRlciBmb3JtLmNhbmNlbEVkaXQoKS5cclxuICAgIC8vIFNvLCB3aGVuIHRoZSBjb2RlIGlzIG1vdmVkIHRvIGZvcm0uY2FuY2VsRWRpdCgpLCBpdCBzaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgdG8gYmUgZXhlY3V0ZWQuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBsZXQgcmVjUmVtb3ZlZDogYm9vbGVhbiA9IGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5jYW5jZWxFZGl0KGZhbHNlLCBmYWxzZSk7XHJcbiAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0UHJldkN1cnJSZWMobnVsbCk7XHJcbiAgICBpZiAoKHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkgfHwgKChpc0FjdENhbmNlbCAmJiByZWNSZW1vdmVkKSAmJiAoIUd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNwZWNpYWxDYW5jZWxPbkNyZWF0ZSgpKSYmKDxUYXNrQmFzZT50aGlzLl90YXNrKS5nZXRPcmlnaW5hbFRhc2tNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgLy8gU2V0IENhbmNlbCBpbmRpY2F0aW9uIG9uIHRoZSB0YXNrIGZvciB0byBub3QgcGVyZm9ybSBjb250cm9sIHZhbHVlIHZhbGlkYXRpb24gaW4gdGhlIENyZWF0ZSBsaW5lIGFjdGlvbi5cclxuICAgICAgbGV0IG9yZ0NhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuY2FuY2VsV2FzUmFpc2VkKCk7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0Q2FuY2VsV2FzUmFpc2VkKGlzQWN0Q2FuY2VsKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRDYW5jZWxXYXNSYWlzZWQob3JnQ2FuY2VsV2FzUmFpc2VkKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzQWN0Q2FuY2VsKVxyXG4gICAgICBleGVjUmVjUHJlZml4ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyB0aGUgZW1wdGluZXNzIG9mIHRoZSBEViBtdXN0IGJlIGNoZWNrZWQgYWdhaW4gYmVjYXVzZSB0aGUgXCJjcmVhdGUgbGluZVwiIG1heSBmYWlsXHJcbiAgICBpZiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkpIHtcclxuICAgICAgaWYgKHN1cGVyLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICByb3cgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSB0aGlzLl9yb3dzSW5QYWdlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRvcFJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGlmICh0b3BSZWNJZHggPiBjdXJyUmVjSWR4KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChjdXJyUmVjSWR4KTtcclxuICAgICAgICAgICAgICByb3cgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgcm93LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gc2hvdWxkIHJlYWxseSBiZSBjYXVnaHQgaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJvdyAhPT0gMClcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcImluIEZvcm0uY2FuY2VsRWRpdCgpIHswfVwiLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgLy8gRGVjcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgZGVsZXRlZC5cclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiByZWNSZW1vdmVkKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQtLTtcclxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHNjcmVlbiBtb2RlXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSBlcnJvciBpbiBTY3JlZW4gbW9kZSBmb3IgQ3VycmVudCBSZWNvcmRcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl90YXNrLnNldE1vZGUobmV3TW9kZSk7XHJcbiAgICAgIGlmICghKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgICAgaWYgKCEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaylcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChleGVjUmVjUHJlZml4KSB7XHJcbiAgICAgIC8vIFFDUiAjOTI1NjQ2LCAjNDU0MTY3OiBleGl0IHRvIHRoZSBvd25lclRhc2sgbGV2ZWwgaW4gb3JkZXIgdG8gc2tpcCBjb250cm9sIHN1ZmZpeFxyXG4gICAgICAvLyBhbmQgcmVjb3JkIHN1ZmZpeCBvZiB0aGUgY2FuY2VsZWQgbmV3IHJlY29yZCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlXHJcbiAgICAgIC8vIG5leHQgcmVjb3JkIHBlcmZpeCB3b3VsZCBiZSBleGVjdXRlZFxyXG4gICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAvLyB3ZSByb2xsYmFjayBhIHBhcmVudCBvd25lclRhc2sgd2hpbGUgZm9jdXNlZCBvbiBzdWJmb3JtL293bmVyVGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoKDxUYXNrQmFzZT5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5wYXRoQ29udGFpbnMoPFRhc2tCYXNlPnRoaXMuX3Rhc2spKVxyXG4gICAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gPFRhc2tCYXNlPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQgIT09IHRoaXMuX3Rhc2s7XHJcbiAgICAgICAgICAgICAgIHBhcmVudCA9IDxUYXNrQmFzZT5wYXJlbnQuZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgcGFyZW50LnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAoKDxEYXRhVmlldz5wYXJlbnQuRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc1F1aXRFdmVudCkge1xyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGZvbGxvd2luZyAyIGxpbmVzIGNhbiBiZSBtZXJnZWQgaW4gb25lIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0aGlzLl90YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNjYW4gYWxsIGNvbnRyb2xzIGluIHRoZSBmb3JtLiBFdmVyeSBjb250cm9sIHdoaWNoIGhhcyBhIHByb3BlcnR5IHRoYXQgaXMgYW4gZXhwcmVzc2lvbiB3aWxsIGJlXHJcbiAgLy8vICAgcmVmcmVzaGVkLiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoZSBjb250cm9sJ3MgZGlzcGxheSBpcyBzeW5jaGVkIHdpdGggdGhlIGV4cHJlc3NpbidzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoT25FeHByZXNzaW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gKCh0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKSBpbnN0YW5jZW9mIE1nQ29udHJvbCkgPyA8TWdDb250cm9sPnRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpIDogbnVsbCk7XHJcblxyXG4gICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgYXdhaXQgbWdDb250cm9sLnJlZnJlc2hPbkV4cHJlc3Npb24oKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLkFzc2VydChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyByZWZyZXNoIHRoZSBmb3JtIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hQcm9wc09uRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBjb250cm9scyBvZiB0aGlzIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZnNUb0N0cmxzKCk6IHZvaWQge1xyXG4gICAgLy8gaWYgbGFzdCBmb2N1c2VkIGNvbnRyb2wgd2FzIGZyb20gdGhpcyB0YXNrIC0gemVybyBpdC5cclxuICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldEZvcm0oKSA9PT0gdGhpcylcclxuICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+dGhpcy5fdGFzaywgbnVsbCk7XHJcblxyXG4gICAgc3VwZXIucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRDdHJsQnlDdHJsTmFtZShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiA8TWdDb250cm9sPnRoaXMuQ3RybFRhYi5nZXRDdHJsKGN0cmxOYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIHN1YmZvcm0gY29udHJvbCB3aXRoIHRoZSB0eXBlZCBuYW1lIGZyb20gYWxsIHBhcmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj4gdGhlIHJlcXVlc3RlZCBzdWJmb3JtIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0U3ViRm9ybUN0cmxCeU5hbWUoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgZ3VpUGFyZW50VGFzazogVGFza0Jhc2U7XHJcbiAgICBsZXQgZGVzdFN1YkZvcm06IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChndWlQYXJlbnRUYXNrID0gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcbiAgICAgICAgIGRlc3RTdWJGb3JtID09PSBudWxsICYmIGd1aVBhcmVudFRhc2sgIT09IG51bGwgJiYgZ3VpUGFyZW50VGFzay5nZXRGb3JtKCkgIT09IG51bGw7XHJcbiAgICAgICAgIGd1aVBhcmVudFRhc2sgPSBndWlQYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgIGRlc3RTdWJGb3JtID0gPE1nQ29udHJvbD5ndWlQYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKGN0cmxOYW1lLCBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNKTtcclxuICAgICAgaWYgKGRlc3RTdWJGb3JtID09IG51bGwpIHtcclxuICAgICAgICBpZiAoIWd1aVBhcmVudFRhc2suSXNTdWJGb3JtIHx8IE5TdHJpbmcuRXF1YWxzKGd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkuTmFtZSwgY3RybE5hbWUsIHRydWUpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVzdFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBzdWZmaXhEb25lIHBhcmFtZXRlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTdWZmaXhEb25lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3VmZml4RG9uZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXREZXN0aW5hdGlvblJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RUYmxSb3c7XHJcbiAgfVxyXG5cclxuICBzZXRTdWJGb3JtQ3RybChzdWJGb3JtQ3RybDogTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5fc3ViRm9ybUN0cmwgPT09IG51bGwgJiYgc3ViRm9ybUN0cmwgIT09IG51bGwpO1xyXG4gICAgdGhpcy5fc3ViRm9ybUN0cmwgPSBzdWJGb3JtQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgc3ViZm9ybSBjb250cm9sIHRoYXQgcG9pbnRzIHRvIGEgdGFzayB3aG9zZSBpZCBpcyBnaXZlbiBpbiB0YXNrSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+dGhlIGlkIG9mIHJlcXVlc3RlZCBzdWJmb3JtIG93bmVyVGFzazwvcGFyYW0+XHJcbiAgZ2V0U3ViRm9ybUN0cmxGb3JUYXNrKHRhc2tJZDogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHBhcmVudEN0cmxUYWI6IENvbnRyb2xUYWJsZTtcclxuICAgIGxldCBndWlQYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGd1aVBhcmVudEZvcm0gPSB0aGlzOyBndWlQYXJlbnRGb3JtICE9IG51bGw7IGd1aVBhcmVudEZvcm0gPSBndWlQYXJlbnRGb3JtLlBhcmVudEZvcm0pIHtcclxuICAgICAgcGFyZW50Q3RybFRhYiA9IGd1aVBhcmVudEZvcm0uQ3RybFRhYjtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhcmVudEN0cmxUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBjdXJyID0gKChwYXJlbnRDdHJsVGFiLmdldEN0cmwoaSkgaW5zdGFuY2VvZiBNZ0NvbnRyb2wpID8gPE1nQ29udHJvbD5wYXJlbnRDdHJsVGFiLmdldEN0cmwoaSkgOiBudWxsKTtcclxuICAgICAgICBpZiAoY3VyciAhPSBudWxsICYmIGN1cnIuaXNTdWJmb3JtKCkgJiYgKGN1cnIuZ2V0U3ViZm9ybVRhc2tJZCgpICE9IG51bGwpKVxyXG4gICAgICAgICAgaWYgKGN1cnIuZ2V0U3ViZm9ybVRhc2tJZCgpID09PSB0YXNrSWQpIHtcclxuICAgICAgICAgICAgZGVzdFN1YkZvcm0gPSBjdXJyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRlc3RTdWJGb3JtICE9IG51bGwpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVzdFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjcmVhdGUgcmVjb3JkcyBiZXR3ZWVuIGlkeCBhbmQgZW5kIG9mIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcmVtb3ZlUmVjb3Jkc0FmdGVySWR4KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVtb3ZlQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gaW4gc29tZSBjYXNlcyBpbnZpc2libGUgLTEgcm93ICh0aGF0IGV4aXN0IG9ubHkgZm9yIHNjcm9sbGJhciBlZmZlY3RzKSBiZWNvbWVzIHZpc2libGUuXHJcbiAgICAvLyBUbyBwcmV2ZW50IHRoaXMgd2UnbGwgcmVtb3ZlIGFsbCByZWNvcmRzLiBUaGlzIHdpbGwgbm90IGNhdXNlIHBlcmZyb21hbmNlIHByb2JsZW1zIHNpbmNlXHJcbiAgICAvLyB3ZSB3aWxsIGFkZCBtYXhpbXVtIHJvd0luUGFnZSByZWNvcmRzIG1vcmUgdGhlbiB3ZSBpbnRlbmRlZCBpbiB0aGUgYmVnaW5pbmdcclxuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSlcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChpZHggPD0gdGhpcy5fcm93c0luUGFnZSArIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgaWR4ID0gMDtcclxuICAgICAgaWYgKGlkeCA9PT0gMClcclxuICAgICAgICByZW1vdmVBbGwgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gaW52YWxpZGF0ZXMgYWxsIHJlY29yZHMgYWZ0ZXIgbmV3Q3VyclJvd1xyXG4gICAgICBzdXBlci5TZXRUYWJsZUl0ZW1zQ291bnQoaWR4LCByZW1vdmVBbGwpO1xyXG4gICAgICAvLyB1cGRhdGVzIHRhYmxlIGl0ZW0ncyBjb3VudFxyXG5cclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiByb3cgaXMgdmFsaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUm93VmFsaWRhdGVkKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHggfHwgaWR4IDwgMClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICBpZiAocm93ID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiByb3cuQ3JlYXRlZCAmJiByb3cuVmFsaWRhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJ1bnMgaW4gV29ya2VyIHRocmVhZCB3aGVuIHRoZSB0aHJlYWQgaXMgZnJlZSBhbmQgc2VuZCB0byBHVUkgdGhyZWFkIGNvbnRyb2xzIGRhdGEgb2YgYWxsIHJvd3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHRyYW5zZmVyRGF0YVRvR3VpKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmVSb3dJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICBsZXQgbWF4VGltZTogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSArIE1nRm9ybS5USU1FX0xJTUlUO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjdXJyZW50RWRpdGluZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcbiAgICAgIC8vIHRoaXMgbGltaXRhdGlvbiBpcyBuZWVkZWQgc28gdGhpcyByZXF1ZXN0IHdpbGwgbmV2ZXIgdGFrZSB0b28gbXVjaCB0aW1lXHJcbiAgICAgIHdoaWxlIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIDwgbWF4VGltZSAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICAgIC8vIGFsbCByb3dzIGFscmVhZHkgc2VudFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkgJiYgdGhpcy5fbGFzdFJvd1NlbnQgKyAxID49IHRoaXMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9sYXN0Um93U2VudCsrO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1ZhbGlkYXRlZCh0aGlzLl9sYXN0Um93U2VudCkpIHtcclxuICAgICAgICAgIC8vIHJvdyBuZWVkcyB0byBiZSBzZW50XHJcbiAgICAgICAgICAvLyBzZW5kIHJvdyBkYXRhXHJcbiAgICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyh0aGlzLl9sYXN0Um93U2VudCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgIT09IHNhdmVSb3dJZHgpIHtcclxuICAgICAgICAgICAgc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7IC8vIHJlc2V0IHRoZSBmbGFnXHJcbiAgICAgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRyZWVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLl9sYXN0Um93U2VudCwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyByZXN0b3JlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKHNhdmVSb3dJZHgsIGJrcFJlY29yZCk7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgIHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBjdXJyZW50RWRpdGluZ0NvbnRyb2w7IC8vIHNldCB0aGUgZmxhZyB0byB0aGUgb3JpZ2luYWwgdmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLl90cmFuc2ZlcmluZ0RhdGEgPSBmYWxzZTtcclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiBhbnkgcm93cyBuZWVkIHRvIGJlIHNlbnQgdG8gR1VJIHRocmVhZFxyXG4gIC8vLyAgIGlmIHRoZXJlIGFyZSwgcHV0cyBldmVudCBpbiBldmVudCBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiB0aGlzLk9wZW5lZCAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICBsZXQgc2l6ZTogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ID49IHRoaXMuUm93cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyB3aGVuIHdlIGRlY3JlYXNlIHNpemUgb2Ygcm93cyBhcnJheSBhZGp1c3QgbGFzdFJvd1NlbnRcclxuICAgICAgICB0aGlzLl9sYXN0Um93U2VudCA9IHRoaXMuUm93cy5sZW5ndGggLSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGVyZSBhcmUgcm93cyB0byBzZW5kIGFuZCB0aGVyZSBpcyBub3cgcmVxdWVzdCBmb3Igcm93cyB5ZXRcclxuICAgICAgLy8gYWRkIHJlcXVlc3QgZm9yIHJvd3NcclxuICAgICAgbGV0IHRyYW5zZmVyRGF0YVRvR3VpOiBib29sZWFuID0gdGhpcy5fbGFzdFJvd1NlbnQgPCAoc2l6ZSAtIDEpO1xyXG5cclxuICAgICAgLy8gRm9yIHBhZ2luYXRlZCB0YWJsZSBjaGVjayB0aGUgbWF4IHJvd3Mgb2YgR1VJIHRhYmxlIGNvbnRyb2wuXHJcbiAgICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpICYmICh0aGlzLl9sYXN0Um93U2VudCArIDEpID49IHRoaXMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKSlcclxuICAgICAgICB0cmFuc2ZlckRhdGFUb0d1aSA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHRyYW5zZmVyRGF0YVRvR3VpICYmICF0aGlzLl90cmFuc2ZlcmluZ0RhdGEpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkodGhpcy5fdGFibGVNZ0NvbnRyb2wsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVl9UT19HVUksIFByaW9yaXR5LkxPV0VTVCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJpbmdEYXRhID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlciAmJiAhdHJhbnNmZXJEYXRhVG9HdWkgJiYgKCF0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkgfHwgIXRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkpKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KHRoaXMuX3RhYmxlTWdDb250cm9sLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfUkVDT1JEU19BSEVBRF9GUk9NX1NFUlZFUiwgUHJpb3JpdHkuTE9XRVNUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgcm93IGRhdGEgZm9yIHRoZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc2lyZWRUb3BJbmRleFwiPmRlc2lyZWQgdG9wIGluZGV4IGlmIGRlc2lyZWRUb3BJbmRleCBpcyBJbnRlZ2VyLk1JTl9WQUxVRSwgdG9wIGluZGV4IGlzIGNlY2lldmVkIGZvcm0gZHY8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPmlmIHRydWUsIHNlbmQgYWxsIHJlY29yZHMsIGV2ZW4gaWYgdGhleSBhcmUgY3JlYXRlZCBhbmQgdmFsaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RGb2N1c2VkVmFsXCI+PC9wYXJhbT5cclxuICBhc3luYyBzZXRSb3dEYXRhKGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmVSb3dJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICBsZXQgZGlmZjogbnVtYmVyID0gMDtcclxuICAgIGxldCBnZXRQcmV2Q2h1bms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBnZXROZXh0Q2h1bms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKGRlc2lyZWRUb3BJbmRleCAhPT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgaWYgKGRlc2lyZWRUb3BJbmRleCA8IDApIHtcclxuICAgICAgICAvLyB0aGlzIGlzIHJlcXVlc3QgZm9yIGxpbmUgb3IgcGFnZSBiZWZvcmUgY3VycmVudCBjaHVua1xyXG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGUgdG9wIGluZGV4IGlzIGFsd2F5cyAwXHJcbiAgICAgICAgZ2V0UHJldkNodW5rID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGRlc2lyZWRUb3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgKyAxID49IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkpXHJcbiAgICAgIC8vIHBhZ2Vkb3duIG9yIGFycm93ZG93biBhdCBlbmQgb2YgdGhlIGRhdGF2aWV3XHJcbiAgICAgICAgZ2V0TmV4dENodW5rID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgZGVzaXJlZFRvcEluZGV4ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG5cclxuICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcblxyXG4gICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgIGxldCBkaWZmUmVmOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKGRpZmYpO1xyXG4gICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucmVmcmVzaFJvd3MoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsLCBzYXZlUm93SWR4LCBkaWZmUmVmKTtcclxuICAgIGRpZmYgPSBkaWZmUmVmLnZhbHVlO1xyXG5cclxuICAgIGlmICgoZ2V0UHJldkNodW5rICYmIGRpZmYgIT09IDApIHx8IGdldE5leHRDaHVuaykge1xyXG4gICAgICAvLyBpZiBkaWZmICE9IDAgYSBuZXcgY2h1bmsgd2FzIGJyb3VnaHQgdG8gdGhlIGJlZ2luaW5nIG9mIHRoZSBkdlxyXG4gICAgICAvLyBzZXQgdG9wIGluZGV4IHRvIGZpcnN0IHJlcXVlc3RlZCBpbmRleFxyXG4gICAgICAvLyBpZiBuZXh0IGNodW5rIHdhcyBicm91Z2h0LCB0b3AgaW5kZXggbWF5IGFsc28gYmUgdXBkYXRlZFxyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGRlc2lyZWRUb3BJbmRleCArIGRpZmYpO1xyXG4gICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgaWYgKHRoaXMuX3RvcEluZGV4VXBkYXRlZCkge1xyXG4gICAgICAgIC8vIGlmIHRvcCBpbmRleCB3YXMgdXBkYXRlZCBpbiB0aGUgc2V0VGFibGVUb3BJbmRleCAtIHdlIG1pZ2h0IGhhdmUgcm93cyB0aGF0IHdlcmUgbm90IHJlZnJlc2hlZFxyXG4gICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAvLyBhbnkgcm93IHdhcyB1cGRhdGVkXHJcbiAgICAgIC8vIHJlc3RvcmUgY3VycmVudCByZWNvcmRcclxuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKHNhdmVSb3dJZHggKyBkaWZmLCBia3BSZWNvcmQpO1xyXG4gICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBhc2sgdGFibGUgdG8gcmVmcmVzaCB0aGUgcGFnZVxyXG5cclxuICAgIHN1cGVyLlNlbGVjdFJvdygpO1xyXG4gICAgaWYgKGdldFByZXZDaHVuaykge1xyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgZm9jdXNlZFxyXG4gICAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsICYmIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRQYXJlbnRUYWJsZSgpID09PSB0aGlzLl90YWJsZU1nQ29udHJvbCkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaGVzIHJvd3MgaW4gdGhlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzaXJlZFRvcEluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2F2ZVJvd0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaWZmXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFJvd3MoZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIHNhdmVSb3dJZHg6IG51bWJlciwgZGlmZlJlZjogUmVmUGFyYW08bnVtYmVyPik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGRpZmZSZWYudmFsdWUgPSAwO1xyXG4gICAgbGV0IG9yZ0luY2x1ZGVzRmlyc3Q6IGJvb2xlYW4gPSB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpO1xyXG4gICAgbGV0IG9yZ0luY2x1ZGVzTGFzdDogYm9vbGVhbiA9IHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9yb3dzSW5QYWdlOyBpKyspIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gZGVzaXJlZFRvcEluZGV4ICsgaTtcclxuICAgICAgbGV0IHByZXZUb3BJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBpZiB3ZSBmYWlsIHRvIGdldCBvbmUgcmVjb3JkLCB3ZSBtYXkgc3VjY2VlZCB0byBnZXQgdGhlIG5leHQgb25lXHJcbiAgICAgICAgaW5kZXggPSBpZHggKyBkaWZmUmVmLnZhbHVlO1xyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1ZhbGlkYXRlZChpZHgpIHx8IHNlbmRBbGwgfHwgdGhpcy5SZWZyZXNoQWxsUm93cykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID49IDApXHJcbiAgICAgICAgICAgIHN1cGVyLmNoZWNrQW5kQ3JlYXRlUm93KGluZGV4KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2F2ZVJvd0lkeCArIGRpZmZSZWYudmFsdWUgIT09IGluZGV4KSB7IC8vIG5vdCBjdXJyZW50IGxpbmVcclxuICAgICAgICAgICAgLy8gaXJyZWxldmFudCBmb3IgdHJlZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKGluZGV4LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBpZiBhIG5ldyBjaHVuayBpcyBicm91Z2h0IHRvcCBpbmRleCB3aWxsIGJlIGNoYW5nZWRcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAvLyBjcmVhdGlvbiBvZiByb3cgZmFpbGVkLCBtYXJrIHRoZSByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAgICAgICAgIGlmIChzdXBlci5pc1Jvd0NyZWF0ZWQoaW5kZXgpKVxyXG4gICAgICAgICAgICBzdXBlci5tYXJrUm93Tk9UQ3JlYXRlZChpbmRleCk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIC8vIFFDUiAjMjYxMDU1LCBldmVuIHNvIHJlcXVpcmVkIHJlY29yZCBtYXkgbm90IGJlIGZvdW5kLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgbmV3IGNodW5rIGhhcyBiZWVuIHNlbnRcclxuICAgICAgICAvLyBhbmQgZGlmZiBtdXN0IGJlIHVwZGF0ZWRcclxuICAgICAgICBkaWZmUmVmLnZhbHVlID0gZGlmZlJlZi52YWx1ZSArICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgLSBwcmV2VG9wSWR4KTtcclxuICAgICAgICBwcmV2VG9wSWR4ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgIGlmICghdXBkYXRlZCAmJiB0aGlzLkdldERhdGF2aWV3KCkuRGF0YXZpZXdCb3VuZHJpZXNBcmVDaGFuZ2VkKG9yZ0luY2x1ZGVzRmlyc3QsIG9yZ0luY2x1ZGVzTGFzdCkpXHJcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSBmYWxzZTtcclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiByb3cgaW4gdGhlIHBhZ2U8L3JldHVybnM+XHJcbiAgZ2V0VmlzaWJsZUxpbmUoKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBjdXJyUmVjSWR4ID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICByZXR1cm4gY3VyclJlY0lkeCAtIE1hdGgubWF4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSwgMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgcmVjb3JkIGlzIGluIHRoZSB2aWV3LCBpZiBpdCBpcyBub3Qgb24gdGhlIHBhZ2UsIGFkanVzdHMgdG9wIGluZGV4LCBzbyB0aGF0IGN1cnJlbnRcclxuICAvLy8gICByZWNvcmQgd2lsbCBiZSBvbiB0aGUgdmlzaWJsZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBicmluZ1JlY29yZFRvUGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiAhdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBsZXQgdG9wSW5kZXg6IG51bWJlciA9IENvbW1hbmRzLmdldFRvcEluZGV4KHRoaXMuX3RhYmxlTWdDb250cm9sKTtcclxuICAgICAgbGV0IGN1cnJJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgIGxldCBuZXdUb3BJbmRleDogbnVtYmVyID0gdG9wSW5kZXg7XHJcblxyXG4gICAgICAvLyBUYWJsZSB0b3AgaW5kZXggZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRvcEluZGV4ID4gY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodG9wSW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlIC0gMSA8IGN1cnJJZHgpIHtcclxuICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcm93c0luUGFnZSA+IDApXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeCAtIHRoaXMuX3Jvd3NJblBhZ2UgKyAxO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBuZXdUb3BJbmRleCA9IGN1cnJJZHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdGFibGUgdG9wIGluZGV4IGZvciBwYWdpbmF0ZWQgdGFibGUuXHJcbiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBpbmRleCBvZiBmaXJzdCByZWNvcmQgb24gdGhlIHBhZ2UgdGhhdCBjb250YWlucyByZWNvcmQgdG8gYmUgc2VsZWN0ZWQuXHJcbiAgICAgICAgbGV0IGN1cnJHdWlJZHggPSB0aGlzLmdldEd1aVJvd2lkeChjdXJySWR4KTtcclxuICAgICAgICBsZXQgbmV3VG9wR3VpSW5kZXggPSAoY3Vyckd1aUlkeCkgLSAoKGN1cnJHdWlJZHgpICUgdGhpcy5fcm93c0luUGFnZSk7IC8vZ3VpIGlkeCBvZiBmaXJzdCByZWNvcmQgb2YgcmVzcGVjdGl2ZSBwYWdlXHJcblxyXG4gICAgICAgIG5ld1RvcEluZGV4ID0gdGhpcy5nZXREdlJvd0lkeChuZXdUb3BHdWlJbmRleCk7XHJcblxyXG4gICAgICAgIGlmKG5ld1RvcEluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldyApXHJcbiAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCB0b3AgaW5kZXggdG8gYmUgY3VycmVudCBsaW5lXHJcbiAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgIT09IG5ld1RvcEluZGV4IHx8IHRoaXMuX3RvcEluZGV4VXBkYXRlZCkge1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgobmV3VG9wSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Um93RGF0YShJbnQzMi5NaW5WYWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW52YWxpZGF0ZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW52YWxpZGF0ZVRhYmxlKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuUm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcm93OiBSb3cgPSA8Um93PnRoaXMuUm93cy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKHJvdyAhPT0gbnVsbClcclxuICAgICAgICByb3cuVmFsaWRhdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbGFzdFJvd1NlbnQgPSAtMTtcclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gcHJldmlvdXMgdmlzaWJsZSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0UHJldkxpbmUobGluZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBsaW5lIC0gMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgc29ydCBtYXJrKGRlbHRhKSBmcm9tIHRoZSBjb2x1bW4uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNsZWFyU29ydE1hcmtcIj48L3BhcmFtPlxyXG4gIGNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayhjbGVhclNvcnRNYXJrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoY2xlYXJTb3J0TWFyaykge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzdG9wIHRoZSByb3cgZnJvbSBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc3RvcFJvd0VkaXRpbmcoaWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgaWYgKHRoaXMuZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShpZHgpKSB7XHJcbiAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9OT1RfSVNfUk9XX0VESVRJTkcsIHRoaXMsICB0aGlzLmlzTGluZU1vZGUoKSAgPyBpZHggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzdGFydCB0aGUgcm93IGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBhc3luYyBzdGFydFJvd0VkaXRpbmcoaWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKCF0aGlzLmdldElzUm93RWRpdGluZ0Zyb21HdWkoaWR4KSkge1xyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfSVNfUk9XX0VESVRJTkcsIHRoaXMsIHRoaXMuaXNMaW5lTW9kZSgpID8gaWR4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2QgcmV0dXJuIGlmIHRoZSByb3cgaXMgaW4gZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHB1YmxpYyBnZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGRpc3BsYXlJbmRleDpudW1iZXIgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSb3dFZGl0aW5nOiBib29sZWFuID0gQ29tbWFuZHMuZ2V0SXNSb3dFZGl0aW5nKHRoaXMsIHRoaXMuaXNMaW5lTW9kZSgpID8gZGlzcGxheUluZGV4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgcmV0dXJuIGlzUm93RWRpdGluZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIGRpc3BsYXksIHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkocmVmcmVzaFR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2tCYXNlID0gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIFRha2UgYW5vdGhlciBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gb2YgUUNScyAjOTg0OTk5LCAjOTMzNjM5ICYgIzY5OTgyMTpcclxuICAgIC8vIE5vdywgdGhlIGRpc3BsYXkgd291bGQgYmUgcmVmcmVzaGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIE5PVCBhbiBvbGRcclxuICAgIC8vIHJlY29yZCB3aGljaCBpcyBiZWluZyBjb21wdXRlZC4gVGhlIHJlc3VsdCBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGR1cmluZyB0aGVcclxuICAgIC8vIGNvbXB1dGUgcHJvY2VzcyBvZiBhIHJlY29yZCB0aGUgZGlzcGxheSBpcyBub3QgcmVmcmVzaGVkICh3aGljaCBpcyBnb29kIGZvciB1cykuXHJcbiAgICAvLyBUaGUgZGlzcGxheSB3b3VsZCBiZSByZWZyZXNoZWQgYW55d2F5IEFGVEVSIHRoZSBjb21wdXRlIHByb2Nlc3MgaXMgZG9uZS5cclxuICAgIC8vIChFaHVkIDIxLU1BWS0yMDAyKVxyXG4gICAgaWYgKGN1cnJSZWMgIT09IG51bGwgJiYgY3VyclJlYy5JbkNvbXB1dGUgJiYgIWN1cnJSZWMuaXNOZXdSZWMoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9pblJlZnJlc2hEaXNwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB0aGlzLl9pblJlZnJlc2hEaXNwID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSB8fCByZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm0gYW5kIHJlZnJlc2ggaXRcclxuICAgICAgICBpZiAoc3VwZXIuSGFzVGFibGUoKSAmJiB0aGlzLk9wZW5lZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRhYmxlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNIHx8IHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDICYmIHN1cGVyLmhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlZnJlc2ggdGhlIGZvcm0gcHJvcGVydGllc1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hQcm9wcygpO1xyXG4gICAgICAgIC8vIHJlZnJlc2ggdGhlIGN1cnJlbnQgcmVjb3JkL1Jvd1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyhmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX0gaW4gdGFzayB7Mn1cIiwgZXguR2V0VHlwZSgpLCBleC5NZXNzYWdlLCAoPFRhc2tCYXNlPnN1cGVyLmdldFRhc2soKSkuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9pblJlZnJlc2hEaXNwID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2lnbmFsIHdlIGNvbXBsZXRlZCB0aGUgZmlyc3QgY3ljbGUgb2YgcmVmcmVzaGluZyB0aGUgZm9ybVxyXG4gICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDICYmICghc3VwZXIuaXNMaW5lTW9kZSgpIHx8IHRoaXMuX3RhYmxlUmVmcmVzaGVkKSlcclxuICAgICAgdGhpcy5Gb3JtUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZWZyZXNoVUkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZ2V0VGFzaygpLmlzTWFpblByb2coKSAvKiYmIEluaXRpYWxpemF0aW9uRmluaXNoZWQqLykge1xyXG4gICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCBmb3JtcyB3aXRoIHRhYmxlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVHdWlUb0xvZyhcIlN0YXJ0IGZvcm0ucmVmcmVzaFRhYmxlKClcIik7XHJcbiAgICAvLyB0b2RvIGZvciBub3cgLSBhbHdheXMgc2hvdyBhbGwgcmVjb3Jkc1xyXG4gICAgLy8gc2F2ZSB0aGUgb2xkIGN1cnJlbnQgcm93XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgbGV0IG9sZEN1cnJSb3c6IG51bWJlciA9IHRoaXMuRGlzcGxheUxpbmU7XHJcbiAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcbiAgICAvLyBGb3IgdGhlIGZpcnN0IHRpbWUgd2UgcmVmcmVzaCB0aGUgdGFibGUgLSBzZXQgY3Vyci1yb3cgYW5kIHRvcC1yZWMtaWR4IHRvIGJlIHRoZVxyXG4gICAgLy8gb25lcyByZXF1ZXN0ZWQgYnkgdGhlIGRhdGF2aWV3LlxyXG4gICAgLy8gSW4gdGhlIGZvbGxvd2luZyB0YWJsZSByZWZyZXNoZXMgLSB3ZSBjaGFuZ2UgY3Vyci1yb3cgYW5kIHRvcC1yZWMgb25seSBpZiB0aGUgdGFibGVcclxuICAgIC8vIGJlY29tZXMgZW1wdHkuXHJcbiAgICBpZiAoIXRoaXMuX3RhYmxlUmVmcmVzaGVkICYmIGN1cnJSZWNJZHggPj0gMCkge1xyXG4gICAgICBvbGRDdXJyUm93ID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuXHJcblxyXG4gICAgICBpZiAob2xkQ3VyclJvdyArIDEgPiB0aGlzLl9yb3dzSW5QYWdlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgob2xkQ3VyclJvdyAtIE1hdGguZmxvb3IodGhpcy5fcm93c0luUGFnZSAvIDIpICsgMSk7XHJcblxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAob2xkQ3VyclJvdyA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgb2xkQ3VyclJvdyA9IDA7XHJcblxyXG4gICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGN1cnJSZWNJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoZW4gVG9wUmVjSWR4IDwgMCBpdCBtZWFucyB3ZSBzaG9sZCBub3QgY29udGludWUgdGhlIHJlZnJlc2ggc2luY2Ugd2UgYXJlIGluIHRlbXBvcmFyeSBzaXR1YXRpb24uXHJcbiAgICAvLyBBbm90aGVyIHJlZnJlc2ggd2lsbCBiZSBkb25lIHNvb24gd2l0aCBjb3JyZWN0IHZhbHVlcy5cclxuICAgIC8vIFRoaXMgaXMgY2FuIGhhcHBlbiB3aGVuIDpcclxuICAgIC8vIEluIGZldGNoQ2h1bmtGcm9tU2VydmVyIHdlIGdvIHRvIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgZXhwZWN0cyBuZXcgcmVjb3Jkcy5cclxuICAgIC8vIFdoaWxlIGluIHRoZSBwcm9jZXNzIG9mIGZldGNoaW5nQ2h1bmssIHdlIG1pZ2h0IGdvIGFnYWluIHRvIHRoZSBzZXJ2ZXIsIGJlZm9yZSB0aGUgc2VydmVyIHNlbmRzIHVzIHRoZSBjaHVuay5cclxuICAgIC8vIEdvaW5nIHRvIHRoZSBzZXJ2ZXIgaW4gdGhlIGdldCBjaHVuayBwcm9jZXNzICwgY2FuIGJlIGZvciBleGFtcGxlOiByZWNvcmQgc3VmZml4LCBvciBhbnkgc2VydmVyIHNpZGUgb3AgaW4gcmVjIHN1ZmYgb3IgVkMuXHJcbiAgICAvLyBVc3VhbGx5LCBkdXJpbmcgdGhpcyBwYXJ0LCB3ZSBkbyBub3QgcmVmcmVzaCB0aGUgdGFibGUuXHJcbiAgICAvLyBCdXQsIGZvciBleGFtcGxlIGluIFFDUiAjNjk4MjE3LCBhIGNhbGwgd2FzIG1hZGUgdG8gcmVmcmVzaFRhYmxlIHdpdGggVG9wUmVjSWR4ID09IC0xLlxyXG4gICAgLy8gVGhlIHJlYXNvbiB3YXMsIHRoYXQgaW4gdGhlIFZDIHRoZXJlIHdhcyBhIHNlcnZlciBvcCB0aGF0IHVwZGF0ZWQgYSB2YXIgaW4gdGhlIHRhc2suIEFzIGEgcmVzdWx0LCB0aGUgJ21vZGknIGZsYWdcclxuICAgIC8vIGZyb20gdGhlIHNlcnZlciB3YXMgb24sIHdoaWNoIGNhdXNlZCB0aGUgXCJ0ZW1wXCIgcmVmcmVzaFRhYmxlIGJlZm9yZSB0aGUgcmVhbCBjaHVuayBhcnJpdmVkLlxyXG4gICAgLy8gVGhpcyBpbiB0dXJuIGNhdXNlZCBhIGNoYW5nZSBpbiB0aGUgY3VyciByZWMgaWQsIHdoaWNoIHdhcyB3cm9uZy5cclxuICAgIC8vIEFmdGVyIHRoZSBjaHVuayBhcnJpdmVzLCB0aGUgcmVmcmVzaCBzZXRzIHRoZSBjb3JyZWN0IHZhbHVlcy5cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPCAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgb2xkQ3VyclJvdyA9IG9sZEN1cnJSb3cgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7IC8vIHNhdmUgb2xkQ3VyclJvdyByZWxhdGl2ZWx5IHRvIHRoZSB0b3AgaW5kZXhcclxuICAgIGxldCBia3BSZWNvcmQ6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5iYWNrdXBDdXJyZW50KCk7XHJcbiAgICB0aGlzLl90YWJsZVJlZnJlc2hlZCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9yaVRyYW5zZmVyRGF0YVRvR3VpID0gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG5cclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICAvLyBRQ1IgIzk5ODA2Nywgd2UgbXVzdCBub3QgcmVmcmVzaCBzdWJmb3JtcyBmb3IgYW55IHJvd3MgdGhhdCBhcmUgbm90IG91ciByZWFsIGN1cnJlbnQgcm93XHJcblxyXG4gICAgLy8gcmVmcmVzaCBhbGwgdGhlIHJvd3MgQlVUIG5vdCB0aGUgb2xkIGN1cnJlbnQgcm93XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcm93c0luUGFnZTsgaSsrKSB7XHJcbiAgICAgIC8vIHdoZW4gdGhlcmUgaXMgbm8gcmVjb3JkIGZvciBhIHJvdyBqdXN0IGRpc2FibGUgaXQgYW5kIHZpY2UgdmVyc2FcclxuICAgICAgbGV0IHRvcEluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmICh0b3BJbmRleCA8IDApIHtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgIHRvcEluZGV4ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSB0b3BJbmRleCArIGk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaWR4KTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgb2xkIGN1cnJlbnQgcm93LiB0aGUgcmVmcmVzaCBmb3IgdGhpcyByb3cgaXMgZG9uZSBieSB0aGUgY2FsbGVyXHJcbiAgICAgICAgLy8gYW5kIHJlZnJlc2ggb25seSB2YWxpZCBsaW5lcyB0aGF0IHdlcmUgbm90IGRpc2FibGVkXHJcbiAgICAgICAgaWYgKGkgIT09IG9sZEN1cnJSb3cpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaWR4LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleC5uYW1lID09IFwiUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvblwiKSB7XHJcbiAgICAgICAgICAvLyBjcmVhdGlvbiBvZiByb3cgZmFpbGVkLCBtYXJrIHRoZSByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAgICAgICAgIGlmIChzdXBlci5pc1Jvd0NyZWF0ZWQoaWR4KSlcclxuICAgICAgICAgICAgc3VwZXIubWFya1Jvd05PVENyZWF0ZWQoaWR4KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICBpZiAoIW9yaVRyYW5zZmVyRGF0YVRvR3VpKVxyXG4gICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChvbGRDdXJyUm93ICsgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCBia3BSZWNvcmQpO1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgdGhpcy5SZWZyZXNoVUkoKTtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiRW5kIGZvcm0ucmVmcmVzaFRhYmxlKClcIik7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBkaXNwbGF5IGxpbmUgYnkgcmVjb3JkIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHVwZGF0ZURpc3BsYXlMaW5lQnlEVigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGlzcGxheUxpbmUgPSB0aGlzLnJlY29yZElkeDJEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+aXMgdGhlIG5ldyBjdXJyZW50IGRpc3BsYXkgbGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5kbyB0aGUgYWN0aW9ucyBhcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZWNJZHg6IG51bWJlciA9IHRoaXMuZGlzcGxheUxpbmUyUmVjb3JkSWR4KGRpc3BsYXlMaW5lKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5UmVjSWR4KHJlY0lkeCwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIGRpc3BsYXlMaW5lKTtcclxuICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKVxyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkRpc3BsYXlMaW5lID0gZGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdXJyZW50IHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dOdW1cIj5pcyB0aGUgbmV3IGN1cnJlbnQgcm93IG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb1N1ZmZpeFwiPmRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZUN1cnJSZWNcIj5kbyB0aGUgYWN0aW9ucyBhcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRDdXJyUm93QnlSZWNJZHgocm93TnVtOiBudW1iZXIsIGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBkaXNwbGF5TGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpID09PSBudWxsIHx8ICghc3VwZXIuaGFzVGFibGUoKSAmJiByb3dOdW0gIT09IDApKVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBGb3JtLnNldEN1cnJSb3coKSBubyB0YWJsZSBcIik7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fZGVzdFRibFJvdyA9IHJvd051bTtcclxuICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChyb3dOdW0sIGRvU3VmZml4LCBpZ25vcmVDdXJyUmVjLCB0cnVlLCBkaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fZGVzdFRibFJvdyA9IHJvd051bSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBsYXN0IHZhbGlkIHJvdyBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RWYWxpZFJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuX3Jvd3NJblBhZ2UgLSAxLCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIHJlY29yZCBsaW5lIHRvIGRpc3BsYXkgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcmVjb3JkSWR4MkRpc3BsYXlMaW5lKHJlY0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiByZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGRpc3BsYXkgbGluZSB0byByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBkaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgb2xkIGN1cnJlbnQgcm93IHVzaW5nIHRoZSBwYXJhbWV0ZXIgYW5kIGlnbm9yaW5nIGFueSBleGNlcHRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj50aGUgb2xkIGN1cnJlbnQgcm93IG51bWJlciB0byBiZSByZXN0b3JlZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZU9sZERpc3BsYXlMaW5lKGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2luUmVzdG9yZSA9IHRydWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luUmVzdG9yZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgcmVjb3JkIGZyb20gZ3VpIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BJbmRleEZyb21HVUkoKTogbnVtYmVyIHtcclxuICAgIGxldCB0b3BEaXNwbGF5TGluZTogbnVtYmVyID0gc3VwZXIuZ2V0VG9wSW5kZXhGcm9tR1VJKCk7XHJcblxyXG4gICAgaWYgKHN1cGVyLmhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgodG9wRGlzcGxheUxpbmUpKTtcclxuXHJcbiAgICByZXR1cm4gdG9wRGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgcmVjb3JkIHBvc2l0aW9uIGluIHRoZSBmb3JtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDdXJyUmVjUG9zSW5Gb3JtKCk6IG51bWJlciB7XHJcbiAgICAvLyB3aGVuIHRoZSBzZWxlY3RlZCByZWNvcmQgaXMgb3V0c2lkZSB0aGUgdmlldywgdG9wSW5kZXggYW5kIERpc3BsYXlMaW5lIHdpbGwgYmUgMFxyXG4gICAgLy8gcmVzdWx0aW5nIGluIGN1cnJSZWNQb3NJbkZvcm0gPT0gMVxyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuICAgIHJldHVybiB0aGlzLkRpc3BsYXlMaW5lIC0gdG9wRGlzcGxheUxpbmUgKyAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmVzIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZERpc3BsYXlMaW5lXCI+b2xkIGN1cnJlbnQgcmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJia3BSZWNvcmRcIj5zYXZlZCByZWNvcmQ8L3BhcmFtPlxyXG4gIGFzeW5jIHJlc3RvcmVCYWNrdXAob2xkRGlzcGxheUxpbmU6IG51bWJlciwgYmtwUmVjb3JkOiBSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFFDUiAjOTQyODc4LCBpZiByZWNvcmQgaXMgaW4gcHJvY2VzcyBvZiBpbnNlcnQsIGRlbGV0ZSBvciBtb2RpZnkgd2UgbXVzdCBwZXJmb3JtIHJlc3RvcmVPbGRDdXJyUm93XHJcbiAgICAvLyB0aGF0IHdpbGwgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IGFjdGlvbnMgZm9yIHRoZSByZWNvcmQsIG90aGVyd2lzZSB3ZSBjYW4ganVzdCByZXN0b3JlIGl0IGZyb20gYmFja3VwXHJcbiAgICBpZiAoYmtwUmVjb3JkLmdldElkKCkgPj0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0UmVjSWR4KGJrcFJlY29yZC5nZXRJZCgpKSA+PSAwICYmIG9sZERpc3BsYXlMaW5lID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPj0gMCAmJiBia3BSZWNvcmQuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZSkge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkucmVzdG9yZUN1cnJlbnQoYmtwUmVjb3JkKTtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gIH1cclxuXHJcbiAgQ29uc3RydWN0TWdDb250cm9sKCk6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHRhc2s6IFRhc2tCYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlO1xyXG4gIENvbnN0cnVjdE1nQ29udHJvbCh0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2xJZHg6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU/OiBNZ0NvbnRyb2xUeXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0/OiBhbnksIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHg/OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkNvbnN0cnVjdE1nQ29udHJvbF8wKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmICh0YXNrT3JQYXJlbnRNZ0Zvcm0gPT09IG51bGwgfHwgdGFza09yUGFyZW50TWdGb3JtIGluc3RhbmNlb2YgVGFza0Jhc2UpICYmIChwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4ID09PSBudWxsIHx8IHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHguY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzEodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkNvbnN0cnVjdE1nQ29udHJvbF8yKHR5cGUsIHRhc2tPclBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbnN0cnVjdHMgYW4gb2JqZWN0IG9mIE1nQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbnN0cnVjdE1nQ29udHJvbF8wKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBNZ0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzEodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBNZ0NvbnRyb2wodHlwZSwgdGFzaywgcGFyZW50Q29udHJvbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudE1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50Q29udHJvbElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbnN0cnVjdE1nQ29udHJvbF8yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCBwYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgdHJ1ZSBpZiBhbHJlYWR5IG1vdmVkIHRvIHRoZSBmaXJzdCBjb250cm9sIG9uIG9uZSBvZiB0aGUgTWdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE1HRGF0YSgpLkFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0YWJsZSBmaXJzdCB0aW1lIHdlIGVudGVyIHRoZSBvd25lclRhc2tcclxuICAvLy8gICBnZXQgcm93cyBudW1iZXIgZm9ybSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGZpcnN0VGFibGVSZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHN1cGVyLmZpcnN0VGFibGVSZWZyZXNoKCk7XHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBJbnNlcnRUYWJsZUl0ZW1zKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlJvd3MuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICAgIHRoaXMuSW5zZXJ0VGFibGVDaGlsZHJlbkFycmF5cyhpZHgsIGNvdW50KTtcclxuICAgICAgdGhpcy5fbGFzdFJvd1NlbnQgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAgc2V0VGFibGVJdGVtc0NvdW50KHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRhYmxlSXRlbXNDb3VudDogbnVtYmVyO1xyXG5cclxuICAgIC8vIEZvciBhYnNvbHV0ZSBzY3JvbGxiYXIsIHNldCB0aGUgdmlydHVhbCBpdGVtcyBjb3VudCBhY2NvcmRpbmdseS5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSkge1xyXG5cclxuICAgICAgLy8gSWYgdGFzayBpcyBtb3ZlZCBpbnRvIENSRUFURSBtb2RlIGFuZCBjdXJyZW50bHkgbmV3IGxpbmUgaXMgY3JlYXRlZFxyXG4gICAgICAvLyB0aGVuIG9ubHkgbmV3bHkgY3JlYXRlZCByZWNvcmRzIHNob3VsZCBiZSBzZWUgb24gdGhlIHNjcmVlblxyXG4gICAgICBpZiAoKDxUYXNrQmFzZT50aGlzLl90YXNrKS5nZXRPcmlnaW5hbFRhc2tNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFXHJcbiAgICAgICAgICAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG5cclxuICAgICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICAvLyBSZXNldCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXdcclxuICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA+IDApIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSAwO1xyXG4gICAgICAgICAgdGhpcy5TZXRSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcoMCk7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBUYWJsZSB3aXRoIHNldCBvZiByZWNvcmRzIE9SIGlmIGVtcHR5IHRhYmxlIHRoZW4gdGFibGVJdGVtc0NvdW50IHNob3VsZCBub3QgYmUgMCwgYXMgd2UgYWx3YXlzIGhhdmUgMHRoIHJvdy5cclxuICAgICAgICB0YWJsZUl0ZW1zQ291bnQgPSAodGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkgPyB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ6IDE7XHJcbiAgICAgICAgdGhpcy5TZXRSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcodGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBOb24tcGFnaW5hdGVkIHRhYmxlXHJcbiAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgIHN1cGVyLlNldFRhYmxlSXRlbXNDb3VudCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgSW5pdFRhYmxlQ29udHJvbCgpOiB2b2lkO1xyXG4gIEluaXRUYWJsZUNvbnRyb2woZHZTaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIEluaXRUYWJsZUNvbnRyb2woZHZTaXplPzogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ/OiBudW1iZXIsIHJlbW92ZUFsbD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMDEoZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRzIHRoZSB0YWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEluaXRUYWJsZUNvbnRyb2xfMDAoKTogdm9pZCB7XHJcbiAgICBsZXQgZHZTaXplOiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IHRhYmxlSXRlbXNDb3VudDogbnVtYmVyID0gMTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIHRhYmxlIGNvbnRyb2wgZm9yIHRoZSBmaXJzdCB0aW1lIHdoaWxlIGNyZWF0aW5nIHRoZSBmb3JtIHdpdGggdG90YWxSZWNvcmRzQ291bnQgYW5kIGFsc29cclxuICAgIC8vIHNldCB0aGUgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3LCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGZpcnN0IHJvdyBhdCByZXNwZWN0aXZlIGxvY2F0aW9uIGluIGNhc2Ugb2YgbG9jYXRlLlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCA+IDApIHtcclxuICAgICAgbGV0IHJlY29yZHNCZWZvcmVDdXJyZW50VmlldzogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50O1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbChkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgZmFsc2UpO1xyXG4gICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRzIHRhYmxlIGNvbnRyb2wncyByb3dzIHRvICd0YWJsZUl0ZW1zQ291bnQnIGNvdW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlNpemVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhYmxlSXRlbXNDb3VudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVtb3ZlQWxsXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEluaXRUYWJsZUNvbnRyb2xfMDEoZHZTaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAocmVtb3ZlQWxsKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRydWUpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfTEFTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfRklSU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5Jc09uZVdheUtleSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX0VNUFRZX0RBVEFWSUVXLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHlEYXRhdmlldygpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3VwZXIuSW5pdFRhYmxlQ29udHJvbChkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuXHJcbiAgICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdG9wIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTZXRUYWJsZVRvcEluZGV4KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICBpZiAoaW5kZXggPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSkge1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpIHtcclxuICAgICAgICAgIC8vIHRhYmxlIG5vdyBiZWhhdmVzIGxpa2UgbGlzdHZpZXcsIGl0IGNhbiBub3Qgc2hvdyBlbXB0eSBsaW5lc1xyXG4gICAgICAgICAgLy8gc28gd2UgbXVzdCB1cGRhdGUgdG9wIGluZGV4XHJcbiAgICAgICAgICBpZiAoaW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlID4gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICAvLyBidXQgd2UgZG8gc2hvdyBlbXB0eSBsaW5lcyBpZiBpbmNsdWRlRmlyc3QgPSBmYWxzZVxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBsZXNzIHJlY29yZHMgdGhlbiByb3dzIG9uIHNjcmVlbiBRQ1IgIyEhISEhIVxyXG4gICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSB8fCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSB0aGlzLl9yb3dzSW5QYWdlLCAwKTtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGluZGV4KTtcclxuICAgICAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5fcHJldkd1aVRvcEluZGV4IHx8IHRoaXMuSXNNb3ZpbmdJblZpZXcpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9UT1BfSU5ERVgsIHRoaXMuX3RhYmxlTWdDb250cm9sLCBpbmRleCk7XHJcbiAgICAgICAgdGhpcy5fcHJldkd1aVRvcEluZGV4ID0gdGhpcy5nZXRHdWlSb3dpZHgoaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ3JlYXRlcyB0aGUgd2luZG93IGRlZmluZWQgYnkgdGhpcyBmb3JtIGFuZCBpdHMgY2hpbGQgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNyZWF0ZUZvcm0oKTogdm9pZCB7XHJcbiAgICBzdXBlci5jcmVhdGVGb3JtKCk7XHJcbiAgICBNZ0Zvcm0uQ3JlYXRlZEZvcm1zLmFkZCh0aGlzKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+V3JpdGVzIHRoZSBzdHJpbmcgb3Igc2V0cyB0aGUgaW1hZ2Ugb24gdGhlIHBhbmUgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4Ljwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYW5lSWR4XCI+SW5kZXggb2YgdGhlIHBhbmUgdG8gYmUgdXBkYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RySW5mb1wiPk1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNvdW5kQmVlcFwiPlNvdW5kIGJlZXAgb3Igbm90PC9wYXJhbT5cclxuICBVcGRhdGVTdGF0dXNCYXIoKTogdm9pZCB7XHJcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgaW4gV2ViQ2xpZW50LlxyXG4gICAgLy8gaWYgKHBhbmVJZHggPT0gQ29uc3RhbnRzLlNCX01TR19QQU5FX0xBWUVSIHx8IEVudmlyb25tZW50Lkluc3RhbmNlLmdldFNwZWNpYWxTaG93U3RhdHVzQmFyUGFuZXMoKSlcclxuICAgIC8vICAgYmFzZS5VcGRhdGVTdGF0dXNCYXIocGFuZUlkeCwgc3RySW5mbywgc291bmRCZWVwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgcmVjb21wdXRlIHRhYmxlIGZvciB0aGF0IGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvdW5kVGFnTmFtZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURSkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gcmVjb21wdXRlIGZvcm1cIik7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuUmVjb21wdXRlRmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcIntcIiArIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiOiB0YXNrPVwiICsgdGhpcy5fdGFzayArIFwiLCBJZD1cIiArIHRoaXMuX3VzZXJTdGF0ZUlkICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGJ1aWxkIHRoZSBYTUwgZW50cnkgb2YgdGhlIGhpZGRlbiBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRIaWRkZW5Db250cm9sTGlzdFhNTCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHhtbDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdCAhPT0gbnVsbCAmJiB0aGlzLmhpZGRlbkNvbnRyb2xzSXNuc0xpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyB3cml0ZSB0aGUgaWRcclxuICAgICAgeG1sLkFwcGVuZChcIjxcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19ISURERU5fQ09OVE9MUyArIFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JU05TICsgXCI9XFxcIlwiKTtcclxuXHJcbiAgICAgIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5mb3JFYWNoKChjaGFuZ2U6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHhtbC5BcHBlbmQoY2hhbmdlICsgXCIsXCIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHhtbC5SZW1vdmUoeG1sLkxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgeG1sLkFwcGVuZChcIlxcXCIvPlwiKTtcclxuXHJcbiAgICAgIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCB0aGlzIGZvcm0gYmVoYXZlIGFzIE1vZGFsIGFsdGhvdWdoIGl0cyBXaW5kb3dUeXBlICE9IE1vZGFsP1xyXG4gIC8vLyBGb3IgUklBLCBOb24gSW50ZXJhY3RpdmUgdGFzaydzIGFuZCBpdHMgYWxsIGNoaWxkIHRhc2sgc2hvdWxkIGJlaGF2ZSBhcyBhIE1vZGFsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRCZWhhdmVBc01vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNob3VsZEJlTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjODAyNDk1LCBub24gaW50ZXJhY3RpdmUgdGFza3MgYW5kIGl0cyBjaGlsZHJlbiB3aWxsIGJlIG9wZW5lZCB1c2luZyBzaG93IGRpYWxvZyB0byBwcmV2ZW50IGV2ZW50cyBvbiB0aGVpciBhbmNlc3RvcnNcclxuICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmICF0aGlzLl90YXNrLmlzTWFpblByb2coKSlcclxuICAgICAgc2hvdWxkQmVNb2RhbCA9IFRhc2tCYXNlLlNob3VsZE5vbkludGVyYWN0aXZlQmVNb2RhbCgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrQmFzZSA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuUGFyZW50VGFzaztcclxuICAgICAgaWYgKHBhcmVudFRhc2sgIT09IG51bGwgJiYgIXBhcmVudFRhc2suSXNJbnRlcmFjdGl2ZSAmJiAhcGFyZW50VGFzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgc2hvdWxkQmVNb2RhbCA9IHBhcmVudFRhc2suU2hvdWxkTm9uSW50ZXJhY3RpdmVDaGlsZEJlTW9kYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkQmVNb2RhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgd2hldGhlciBhIHBhZ2luYXRlZCB0YWJsZSBiZWluZyB1c2VkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIHRhYmxlIGJlaW5nIHVzZWQgd2l0aCBhYnNvbHV0ZSBzY3JvbGxiYXIgdGh1bWIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyID0gKDxNZ0NvbnRyb2w+dGhpcy5fdGFibGVNZ0NvbnRyb2wpLklzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICByZXR1cm4gdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYnVpbGRGb3JtTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9ICB0aGlzLlVuaXF1ZU5hbWU7XHJcbiAgICBsZXQgdGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+dGhpcy5nZXRUYXNrKCk7XHJcblxyXG4gICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB3aGlsZSAodGFzay5Jc1N1YnRhc2spIHtcclxuICAgICAgdGFzayA9IDxUYXNrQmFzZT50YXNrLlN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICAgIG5hbWUgPSAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyAnXycgKyBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvLS9nLCBcIl9cIik7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpIDogVG8gZmV0Y2ggcHJldmlvdXMgY2h1bmsgb2YgcmVjb3JkcyBpZiBuZWVkZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUHJldkNodW5rRm9yQ3VycmVudFBhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjUG9zT25QYWdlOiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ICUgdGhpcy5fcm93c0luUGFnZTtcclxuXHJcbiAgICAgIC8vIElmIHJlY29yZCBpcyBub3QgdGhlIGZpcnN0IHJlY29yZCBvbiBwYWdlLCBmZXRjaCBwcmV2aW91cyByZWNvcmQgZm9yIHRoYXQgcGFnZS5cclxuICAgICAgLy8gVE9ETyA6IHRoaXMuRGlzcGxheUxpbmUgLSBDaGVjayB3aGV0aGVyIGNhbiBiZSByZW1vdmVkID9cclxuICAgICAgaWYgKHJlY1Bvc09uUGFnZSA+IDAgJiYgdGhpcy5EaXNwbGF5TGluZSA9PT0gMCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Um93RGF0YSgtcmVjUG9zT25QYWdlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEd1aVJvd2lkeChkdlJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkdlJvd0lkeCArIHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXREdlJvd0lkeChndWlSb3dJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZ3VpUm93SWR4IC0gdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcbn1cclxuIl19