sliftutils 1.7.113 → 1.7.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/storage/ArchivesDisk.ts +2 -1
- package/storage/dist/ArchivesDisk.ts.cache +4 -3
- package/storage/remoteStorage/blobStore.ts +5 -4
- package/storage/remoteStorage/chainStartup.ts +3 -2
- package/storage/remoteStorage/createArchives.ts +3 -3
- package/storage/remoteStorage/deployTakeover.ts +2 -1
- package/storage/remoteStorage/dist/blobStore.ts.cache +7 -6
- package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +5 -5
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +4 -3
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +5 -4
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +6 -5
- package/storage/remoteStorage/dist/storeSync.ts.cache +3 -3
- package/storage/remoteStorage/intermediateManagement.ts +3 -2
- package/storage/remoteStorage/sourceWrapper.ts +4 -3
- package/storage/remoteStorage/storageServer.ts +2 -1
- package/storage/remoteStorage/storeSync.ts +1 -1
- package/yarn.lock +4 -4
|
@@ -467,7 +467,7 @@ class ArchivesChain {
|
|
|
467
467
|
if (Date.now() >= deadline) {
|
|
468
468
|
throw error;
|
|
469
469
|
}
|
|
470
|
-
console.error(`${error.message}. Retrying in ${COVERING_RETRY_DELAY / 1000}s (giving up at ${
|
|
470
|
+
console.error(`${error.message}. Retrying in ${COVERING_RETRY_DELAY / 1000}s (giving up at ${(0, format_1.formatDateTimeDetailed)(deadline)}).`);
|
|
471
471
|
void this.state.recheckAvailability();
|
|
472
472
|
await (0, batching_1.delay)(COVERING_RETRY_DELAY);
|
|
473
473
|
}
|
|
@@ -491,7 +491,7 @@ class ArchivesChain {
|
|
|
491
491
|
return merged;
|
|
492
492
|
}
|
|
493
493
|
async getChangesAfter2(config) {
|
|
494
|
-
let results = await this.runOnCovering(`The changes listing since ${
|
|
494
|
+
let results = await this.runOnCovering(`The changes listing since ${(0, format_1.formatDateTimeDetailed)(config.time)}`, archives => archives.getChangesAfter2(config));
|
|
495
495
|
let byPath = new Map();
|
|
496
496
|
for (let list of results) {
|
|
497
497
|
for (let file of list) {
|
|
@@ -570,7 +570,7 @@ class ArchivesChain {
|
|
|
570
570
|
seen.add(key);
|
|
571
571
|
targets.push(source);
|
|
572
572
|
}
|
|
573
|
-
console.log(`Writing storage routing config for ${this.getDebugName()} to all ${targets.length} stores (write time ${
|
|
573
|
+
console.log(`Writing storage routing config for ${this.getDebugName()} to all ${targets.length} stores (write time ${(0, format_1.formatDateTimeDetailed)(writeTime)}): ${data.toString("utf8").slice(0, 2000)}`);
|
|
574
574
|
await Promise.all(targets.map(async (source) => {
|
|
575
575
|
var _a;
|
|
576
576
|
let label = `${source.config.url} (store ${JSON.stringify(source.config.name)})`;
|
|
@@ -902,5 +902,5 @@ async function getBucketInfo(config) {
|
|
|
902
902
|
return await remote.getConfig();
|
|
903
903
|
}
|
|
904
904
|
exports.getBucketInfo = getBucketInfo;
|
|
905
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBa0U7QUFDbEUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixzREFBb0Q7QUFDcEQsaURBSXdCO0FBQ3hCLCtDQUE0QztBQUM1QyxtRUFBZ0U7QUFDaEUscURBQXdGO0FBRXhGLDJEQUF5RjtBQUV6RixpREFBK0Q7QUFDL0Qsb0RBQWlGO0FBQ2pGLGtFQUEyRjtBQUUzRix5UUFBeVE7QUFDelEsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQyxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdELHFOQUFxTjtBQUNyTiwrQ0FBcUY7QUFBNUUsOEdBQUEs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O0lBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVRELHNDQVNDO0FBRUQsOFNBQThTO0FBQ3ZTLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxNQUE2RTtJQUNoSCxPQUFPLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFDLFVBQVUsRUFBQyxFQUFFO1FBQ25ELElBQUksT0FBTyxHQUEyQyxFQUFFLENBQUM7UUFDekQsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsSUFBSSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFBLGlDQUFpQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFURCw0Q0FTQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBdUI7SUFDdkQsNkdBQTZHO0lBQzdHLElBQUksTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RILE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUpELHNDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydCwgd2F0Y2hTbG93UHJvbWlzZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBSZW1vdGVDb25maWcsIFJlbW90ZUNvbmZpZ0Jhc2UsIFNvdXJjZUNvbmZpZyxcbiAgICBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRGVsQ29uZmlnLCBGaW5kQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIE1vdmVGaWxlQ29uZmlnLCBTZXRDb25maWcsIFNldExhcmdlRmlsZUNvbmZpZywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsIExBUkdFX1NFVF9USFJFU0hPTEQsIGJ1ZmZlckNodW5rU3RyZWFtLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIHBhcnNlUm91dGluZ0RhdGEsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLFxuICAgIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplU291cmNlLFxuICAgIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCBwYXJzZVZhcmlhYmxlUm91dGUsIGdldEJ1Y2tldEJhc2VVcmwsIGJ1aWxkRmlsZVVybCxcbn0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlLCBwYXJzZVN0b3JhZ2VVcmwsIGF1dGhlbnRpY2F0ZVN0b3JhZ2UgfSBmcm9tIFwiLi9BcmNoaXZlc1JlbW90ZVwiO1xuaW1wb3J0IHsgU2VydmVyQnVja2V0SW5mbywgQWN0aXZlQnVja2V0SW5mbyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcbmltcG9ydCB7IENoYWluU3RhdGUsIENoYWluU3RhdGVNYW5hZ2VyIH0gZnJvbSBcIi4vY2hhaW5TdGFydHVwXCI7XG5pbXBvcnQgeyBMb2dGaWxlSW5mbywgZGVjb2RlTG9nRmlsZSwgY3JlYXRlTG9nU2VhcmNoZXIgfSBmcm9tIFwiLi4vU3RyZWFtaW5nTG9nc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZSwgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5cbi8vIEhvdyBtYW55IGV4dHJhIGZ1bGwgcGFzc2VzIG92ZXIgdGhlIHNvdXJjZXMgZmFsbGJhY2sgZGlzcGF0Y2ggbWFrZXMgd2hlbiBFVkVSWSBzb3VyY2UgaW4gYSBwYXNzIGZhaWxlZCwgYmVmb3JlIHRoZSBvcGVyYXRpb24gdGhyb3dzIChzZWUgR2V0Q29uZmlnLnJldHJpZXMpIC0gbW9zdCByZXF1ZXN0cyBzaG91bGRuJ3QgZmFpbCBhdCBhbGwsIHNvIGEgY291cGxlIG9mIGJsYW5rZXQgcmV0cmllcyBidXlzIGF2YWlsYWJpbGl0eSBmb3IgYWxtb3N0IG5vdGhpbmdcbmNvbnN0IERFRkFVTFRfRkFMTEJBQ0tfUkVUUklFUyA9IDM7XG5jb25zdCBGQUxMQkFDS19SRVRSWV9ERUxBWSA9IDIgKiAxMDAwO1xuY29uc3QgV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVyA9IDMwICogMTAwMDtcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IENPTkZJR19SRUZSRVNIX1RIUk9UVExFID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9USU1FT1VUID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9ERUxBWSA9IDIgKiAxMDAwO1xuY29uc3QgQ09WRVJJTkdfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX0RFTEFZID0gNSAqIDEwMDA7XG4vLyBTbWFydCB0aW1lb3V0czogYW4gYXR0ZW1wdCBnZXRzIHRoaXMgbG9uZyB0byBwcm9kdWNlIGFueXRoaW5nIGJlZm9yZSB3ZSBwcm9iZSBnZXRJbmZvIGZvciB0aGUgZmlsZSdzIHNpemUgKGFuZCB0aGUgcHJvYmUgaXRzZWxmIGdldHMgdGhlIHNhbWUgd2luZG93KVxuY29uc3QgU01BUlRfVElNRU9VVF9QUk9CRSA9IDYwICogMTAwMDtcbi8vIFZlcnkgZ2VuZXJvdXMgYXNzdW1lZCB0cmFuc2ZlciByYXRlcyAtIHRoZSByZXN1bHRpbmcgZGVhZGxpbmUgZXhpc3RzIHRvIGNhdGNoIHN0dWNrIHNvdXJjZXMsIG5vdCBzbG93IG9uZXNcbmNvbnN0IFNNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORCA9IDEwMjQgKiAxMDI0O1xuY29uc3QgU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCA9IDUxMiAqIDEwMjQ7XG4vLyBNYXJrZXIgaW4gc21hcnQtdGltZW91dCBlcnJvcnMsIHNvIHRoZSByZWFkIGxvb3AgY2FuIGxvZyB0aGVtIGFuZCBjb250aW51ZSB3aXRoIHRoZSBvdGhlciBzb3VyY2VzIChhIGNvbm5lY3RlZCBzb3VyY2UncyBvdGhlciBlcnJvcnMgc3RpbGwgdGhyb3cpXG5jb25zdCBTTUFSVF9USU1FT1VUX01BUktFUiA9IFwiQVJDSElWRVNfU01BUlRfVElNRU9VVF9jNDFhOWRcIjtcblxuLy8gU2l6ZXMgYSBnZW5lcm91cyBwZXItYXR0ZW1wdCBkZWFkbGluZS4gR2V0LXN0eWxlIGNhbGxzIHBhc3MgcGF0aDogdGhlIHNpemUgaXMgb25seSBmZXRjaGVkICh2aWEgZ2V0SW5mbykgd2hlbiB0aGUgY2FsbCB0dXJucyBvdXQgdG8gYmUgc2xvdy4gU2V0LXN0eWxlIGNhbGxzIHBhc3MgdXBsb2FkQnl0ZXMsIHdoaWNoIHRoZXkgYWxyZWFkeSBrbm93LlxudHlwZSBTbWFydFRpbWVvdXQgPSB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICB1cGxvYWRCeXRlcz86IG51bWJlcjtcbiAgICAvLyBOYW1lcyB0aGUgb3BlcmF0aW9uIGluIHRpbWVvdXQgZXJyb3JzIC0gd2l0aG91dCBpdCBhIGRlbGV0aW9uIChhIHRvbWJzdG9uZSB3cml0ZSwgdXBsb2FkQnl0ZXMgMCkgcmVhZHMgYXMgXCJVcGxvYWQgb2YgMCBieXRlc1wiLCB3aGljaCBsb29rcyBsaWtlIGEgYnVnIHJhdGhlciB0aGFuIGEgZGVsZXRlXG4gICAgbGFiZWw/OiBzdHJpbmc7XG59O1xuXG4vKiogVGhlIGFkZHJlc3MsIHBvcnQsIGFjY291bnQsIGFuZCBidWNrZXQgbmFtZSBhIGJ1Y2tldCByb3V0aW5nIFVSTCBhZGRyZXNzZXMuIFRocm93cyB3aGVuIHRoZSBVUkwgaXNuJ3QgYSBob3N0ZWQgYnVja2V0IHJvdXRpbmcgVVJMIChodHRwczovL2hvc3Q6cG9ydC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uKS4gKi9cbmV4cG9ydCB7IHBhcnNlSG9zdGVkVXJsLCBwYXJzZUJhY2tibGF6ZVVybCwgZ2V0QnVja2V0QmFzZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vKiogQSBjbGllbnQgZm9yIE9ORSBzb3VyY2UgLSBzZWUgc3RvcmVTb3VyY2VzLnRzLiBSZS1leHBvcnRlZCBoZXJlIGJlY2F1c2UgYSBjaGFpbiBpcyBidWlsdCBvdXQgb2YgdGhlbS4gKi9cbmV4cG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzIH0gZnJvbSBcIi4vc3RvcmVTb3VyY2VzXCI7XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzQ2hhaW5PcHRpb25zID0ge1xuICAgIC8qKiBPdXRzaWRlIG9mIG5vZGUgd2UgZGVmYXVsdCB0byByZWFkLW9ubHkgZG93bmxvYWRzIG92ZXIgdGhlIHB1YmxpYyBVUkxzIChubyBBUEkgY29ubmVjdGlvbikgd2hlbiB0aGUgY29uZmlnIGhhcyBwdWJsaWMgc291cmNlcy4gU2V0IHRoaXMgdG8gY29ubmVjdCB0byB0aGUgQVBJIGFueXdheSAtIG5lZWRlZCBmb3Igd3JpdGluZywgbGlzdGluZywgYW5kIGFueSBvdGhlciBvcGVyYXRpb24gdGhlIHBsYWluIFVSTCBmb3JtIGNhbm5vdCBzZXJ2ZS4gKi9cbiAgICBkaXJlY3RDb25uZWN0PzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnOiBTb3VyY2VDb25maWcpOiBib29sZWFuIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gY29uZmlnLnZhbGlkV2luZG93O1xuICAgIHJldHVybiBzdGFydCA8PSBub3cgJiYgbm93IDwgZW5kO1xufVxuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZVNoYXJkS2V5KGtleTogc3RyaW5nLCB0YXJnZXQ6IFNvdXJjZVdyYXBwZXIpOiBzdHJpbmcge1xuICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0YXJnZXQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGtleS5yZXBsYWNlKFZBUklBQkxFX1NIQVJELCBWQVJJQUJMRV9TSEFSRCArIFwiX1wiICsgKHN0YXJ0ICsgTWF0aC5yYW5kb20oKSAqIChlbmQgLSBzdGFydCkpKTtcbn1cblxuLyoqIENvdmVycyB0aGUgd2hvbGUga2V5IHNwYWNlIHdpdGggdGhlIEFVVEhPUklUQVRJVkUgc291cmNlczogZm9yIGVhY2ggdW5jb3ZlcmVkIHBvaW50LCB0aGUgRklSU1Qgc291cmNlIGluIGNvbmZpZyBvcmRlciB3aG9zZSByb3V0ZSBjb250YWlucyBpdCAtIHRoZSBleGFjdCBzZWxlY3Rpb24gZXZlcnkgcmVhZCBhbmQgd3JpdGUgdXNlcywgc28gbGlzdGluZ3MgY29tZSBmcm9tIHRoZSBzYW1lIG5vZGVzIHdyaXRlcyB3ZW50IHRvIChyZWFkLXlvdXItd3JpdGVzKS4gTmV2ZXIgXCJmZXdlc3RcIiBvciBcIndpZGVzdFwiOiBwcmVmZXJyaW5nIGEgd2lkZSByZWFkIHJlcGxpY2Egb3ZlciB0aGUgcm91dGVkIHdyaXRlIHNoYXJkcyB3b3VsZCBzZXJ2ZSBsaXN0aW5ncyBmcm9tIGEgbm9kZSB0aGF0IG9ubHkgaGFzIHRoZSBkYXRhIHNlY29uZC1oYW5kLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjYW5kaWRhdGVzIGxlYXZlIGEgZ2FwLiAqL1xuZnVuY3Rpb24gY292ZXJSb3V0ZXMoY2FuZGlkYXRlczogU291cmNlV3JhcHBlcltdKTogU291cmNlV3JhcHBlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2hvc2VuOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgd2hpbGUgKGNvdmVyZWQgPCAxKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2FuZGlkYXRlcy5maW5kKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY292ZXJlZCkpO1xuICAgICAgICBpZiAoIW5leHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNob3Nlbi5wdXNoKG5leHQpO1xuICAgICAgICBsZXQgWywgZW5kXSA9IG5leHQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgIGNvdmVyZWQgPSBlbmQ7XG4gICAgfVxuICAgIHJldHVybiBjaG9zZW47XG59XG5cbi8qKiBSRUFEUyBPTkxZLiBEcm9wcyBzb3VyY2VzIHRoYXQgcmVjZW50bHkgZmFpbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZCAtIHVubGVzcyB0aGF0IHdvdWxkIGxlYXZlIG5vdGhpbmcsIGluIHdoaWNoIGNhc2UgYSBkb3duIHNvdXJjZSBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBubyBzb3VyY2UsIGFuZCB3ZSByZXRyeSBpdCBpbW1lZGlhdGVseS4gTmV2ZXIgYXBwbGllcyB0byB3cml0ZXMgKG9yIG5vRmFsbGJhY2tzIHJlYWRzIG9mIHRoZSB3cml0ZSB0YXJnZXQpOiB0aGUgd3JpdGUgbm9kZSBpcyBzdHJpY3RseSB0aGUgRklSU1Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCByZWdhcmRsZXNzIG9mIGNvbm5lY3Rpdml0eSAtIGEgY2xpZW50J3MgZmxha3kgdmlldyBvZiB0aGUgbmV0d29yayBtdXN0IG5ldmVyIHNjYXR0ZXIgd3JpdGVzIGFjcm9zcyB0aGUgY2hhaW4gKHNwZWM6IGNsaWVudCB3cml0ZXMgYXJlIGNvbnNpc3RlbnQsIGNsaWVudCByZWFkcyBhcmUgcmVkdW5kYW50KS4gKi9cbmZ1bmN0aW9uIHByZWZlclVzYWJsZShzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgIGxldCB1c2FibGUgPSBzb3VyY2VzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICByZXR1cm4gdXNhYmxlLmxlbmd0aCAmJiB1c2FibGUgfHwgc291cmNlcztcbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQ2hhaW4gaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIC8vIFRoZSBjaGFpbidzIHN0YXRlLCBhbmQgZXZlcnl0aGluZyBhYm91dCBoYXZpbmcgb25lIChpbml0ICsgaXRzIHJldHJ5LCBjb25maWcgcG9sbGluZy9hZG9wdGlvbiwgYXZhaWxhYmlsaXR5IHJlY2hlY2tzLCB0aGUgY29uZmlnIHJld3JpdGUgbG9vcCksIGxpdmVzIGluIHRoZSBtYW5hZ2VyIC0gd2hhdCBzdGF5cyBpbiB0aGlzIGNsYXNzIGlzIGRpc3BhdGNoIG92ZXIgdGhhdCBzdGF0ZVxuICAgIHByaXZhdGUgc3RhdGU6IENoYWluU3RhdGVNYW5hZ2VyO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBDaGFpblN0YXRlTWFuYWdlcih7XG4gICAgICAgICAgICBjb25maWd1cmVkOiBub3JtYWxpemVSZW1vdGVDb25maWcoY29uZmlnKSxcbiAgICAgICAgICAgIGRlYnVnTmFtZTogKCkgPT4gdGhpcy5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgIGRpcmVjdENvbm5lY3Q6IG9wdGlvbnM/LmRpcmVjdENvbm5lY3QsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIGxldCB1cmxzID0gdGhpcy5zdGF0ZS5hY3RpdmVDb25maWcuc291cmNlcy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICh4IGFzIFNvdXJjZUNvbmZpZykudXJsKTtcbiAgICAgICAgcmV0dXJuIGBjaGFpbiAke3VybHMuam9pbihcIiwgXCIpfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIE9ORSBkaXNwYXRjaCBmb3IgZXZlcnkgb3BlcmF0aW9uOiBubyBmYWxsYmFja3MgKGFsbCB3cml0ZXMgYnkgZGVmYXVsdCwgYW5kIG5vRmFsbGJhY2tzIHJlYWRzKSAtPiB0aGUgcHJpbWFyeSBub2RlIG9ubHksIHZpYSBydW5QcmltYXJ5OyBldmVyeXRoaW5nIGVsc2UgLT4gdGhlIHNoYXJlZCBmYWxsYmFjayBsb29wLCB0cnlpbmcgc291cmNlcyBpbiBjb25maWcgb3JkZXIgKG9yIGxhdGVuY3kgb3JkZXIgZm9yIGZhc3QgcmVhZHMpIGFuZCBvbmx5IG1vdmluZyBvbiB3aGVuIG9uZSBmYWlscy4gV3JpdGVzIGluIHRoZSBsb29wIGRpZmZlciBmcm9tIHJlYWRzIG9ubHkgaW4gY2FsbGluZyBzb3VyY2Uud3JpdGUuXG4gICAgcHJpdmF0ZSBhc3luYyBydW48VD4oc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgbm9GYWxsYmFja3M/OiBib29sZWFuOyBmYWxsYmFja3M/OiBib29sZWFuOyByZXRyaWVzPzogbnVtYmVyOyBmYXN0PzogYm9vbGVhbjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoY29uZmlnLmZhc3QgJiYgY29uZmlnLm5vRmFsbGJhY2tzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhc3QgYW5kIG5vRmFsbGJhY2tzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IG5vRmFsbGJhY2tzIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgKHRoZSB3cml0ZSBub2RlKSwgc28gdGhlcmUgaXMgbm8gb3JkZXIgdG8gc3BlZWQgdXBgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLm5vRmFsbGJhY2tzIHx8IGNvbmZpZy53cml0ZSAmJiAhY29uZmlnLmZhbGxiYWNrcykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuUHJpbWFyeShjb25maWcsIHJ1bik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldHJpZXMgPSBjb25maWcucmV0cmllcztcbiAgICAgICAgaWYgKHJldHJpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0cmllcyA9IERFRkFVTFRfRkFMTEJBQ0tfUkVUUklFUztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdUYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWRQYXNzZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzID0gc3RhdGUuc291cmNlcy5maWx0ZXIoc291cmNlID0+XG4gICAgICAgICAgICAgICAgKGNvbmZpZy5yb3V0ZSA9PT0gdW5kZWZpbmVkIHx8IHJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgY29uZmlnLnJvdXRlKSlcbiAgICAgICAgICAgICAgICAmJiBjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpXG4gICAgICAgICAgICAgICAgLy8gQSB3cml0ZS1ibG9ja2VkIHNvdXJjZSAocmVhZC1vbmx5IG1vZGUsIGJhY2tibGF6ZSB3aXRob3V0IGNyZWRlbnRpYWxzKSBjYW4gbmV2ZXIgdGFrZSBhIHdyaXRlLCBzbyBpdCBpcyBub3QgYSBmYWxsYmFjayBjYW5kaWRhdGUgLSBpdHMgdGhyb3cgd291bGQgZW5kIHRoZSBwYXNzIGVhcmx5IChpdCBjb3VudHMgYXMgY29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICYmICEoY29uZmlnLndyaXRlICYmIChzb3VyY2Uud3JpdGVCbG9ja2VkIHx8ICFzb3VyY2UuYXBpKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgb3JkZXJlZCA9IHByZWZlclVzYWJsZShjYW5kaWRhdGVzKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuZmFzdCkge1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4ub3JkZXJlZF07XG4gICAgICAgICAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB3cm9uZ1RhcmdldCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmFwaU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcGkgPSBzb3VyY2UuYXBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH0gaGFzIFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlIHRoaXMgb3BlcmF0aW9uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGFwaSwgc291cmNlLmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KGNvbmZpZy50aW1lb3V0LCBzb3VyY2UsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcud3JpdGUpIHJldHVybiBzb3VyY2Uud3JpdGUoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBzb3VyY2UuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5yZWFkKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgc291cmNlLmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNNQVJUX1RJTUVPVVRfTUFSS0VSKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU291cmNlIHRpbWVkIG91dCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgY29udGludWluZyB3aXRoIHRoZSBuZXh0IHNvdXJjZTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBBIHdyb25nLXdpbmRvdy9yb3V0ZS91bmNvbmZpZ3VyZWQgcmVqZWN0aW9uIG1lYW5zIE9VUiBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzLCBzbyBldmVyeSBzb3VyY2Ugd2UnZCBmYWxsIGJhY2sgdG8gaXMganVkZ2VkIGJ5IHRoZSBzYW1lIHN0YWxlIGNvbmZpZyAtIHJlZnJlc2ggaXQgYW5kIHJlc3RhcnQgdGhlIHBhc3MgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgfHwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX05PVF9DT05GSUdVUkVEKSkgJiYgIXJldHJpZWRXcm9uZ1RhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpICYmIFwid2luZG93XCIgfHwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSAmJiBcInJvdXRlXCIgfHwgXCJ1bmNvbmZpZ3VyZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxsYmFja3MgbWVhbnMgYXZhaWxhYmlsaXR5IGFib3ZlIGV2ZXJ5dGhpbmc6IEFOWSBmYWlsaW5nIHNvdXJjZSAtIGRvd24sIG1pc2NvbmZpZ3VyZWQsIHJlamVjdGluZywgbWlkLXN3aXRjaG92ZXIgLSBpcyBza2lwcGVkIGFuZCB0aGUgbmV4dCBjb3ZlcmluZyBzb3VyY2UgdGFrZXMgdGhlIGNhbGwuIE9ubHkgZXZlcnkgc291cmNlIGZhaWxpbmcgdGhyb3dzIChiZWxvdykuIFdpdGhvdXQgZmFsbGJhY2tzLCBhIENPTk5FQ1RFRCBzb3VyY2UncyBlcnJvciBpcyBhIHJlYWwgYW5zd2VyIGFuZCB0aHJvd3MuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTb3VyY2UgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBmYWxsaW5nIGJhY2sgdG8gdGhlIG5leHQgc291cmNlOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5pc0Nvbm5lY3RlZCgpKSBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdyb25nVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCbGFua2V0IHJldHJ5IG9mIHRoZSB3aG9sZSBwYXNzLCBBTlkgZXJyb3IgKHNlZSBHZXRDb25maWcucmV0cmllcyk6IG1vc3QgcmVxdWVzdHMgc2hvdWxkbid0IGZhaWwgYXQgYWxsLCBzbyByZXRyeWluZyB0aGUgcmFyZSBmYWlsdXJlIC0gd2hhdGV2ZXIgaXQgd2FzIC0gYnV5cyBhdmFpbGFiaWxpdHkgZm9yIGFsbW9zdCBub3RoaW5nXG4gICAgICAgICAgICBpZiAocmV0cmllZFBhc3NlcyA8IHJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICByZXRyaWVkUGFzc2VzKys7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBFdmVyeSBzb3VyY2UgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifTsgcmV0cnlpbmcgdGhlIHdob2xlIHBhc3MgaW4gJHtGQUxMQkFDS19SRVRSWV9ERUxBWSAvIDEwMDB9cyAocmV0cnkgJHtyZXRyaWVkUGFzc2VzfSBvZiAke3JldHJpZXN9KWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KEZBTExCQUNLX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxsIHNvdXJjZXMgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifSAoYWZ0ZXIgJHtyZXRyaWVkUGFzc2VzfSByZXRyJHtyZXRyaWVkUGFzc2VzID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9KTogJHtlcnJvcnMuam9pbihcIiB8IFwiKSB8fCBcIm5vIHNvdXJjZXMgYXZhaWxhYmxlXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXcml0ZXMgYW5kIG5vRmFsbGJhY2tzIHJlYWRzIGFyZSB0aGUgc2FtZSBjYXNlOiB0YWtlIHRoZSBhdXRob3JpdGF0aXZlIG5vZGUgLSBzdHJpY3RseSB0aGUgZmlyc3Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCB3aGV0aGVyIGl0IGlzIHVwIG9yIGRvd24gLSBhbmQgdXNlIGl0LCBuZXZlciBmYWxsaW5nIGJhY2sgdG8gYW5vdGhlciBub2RlLiBJdCdzIGltcG9ydGFudCB0aGF0IHdyaXRpbmcgYWx3YXlzIGFjY2Vzc2VzIHRoZSBzYW1lIG5vZGUgZXZlcnl3aGVyZSwgZXZlbiBpZiB0aGF0IG5vZGUgaXMgZG93biAtIG90aGVyd2lzZSB3ZSdyZSBqdXN0IHdyaXRpbmcgaW50byB0aGUgdm9pZCwgYW5kIHdobyBrbm93cyBpZiB0aGUgd3JpdGVzIHdpbGwgZXZlbiBiZSBhY2NlcHRlZCwgb3IgY2xvYmJlcmVkLCBvciB3aGF0OyBhbmQgbm9GYWxsYmFja3MgcmVhZHMgd2FudCB0aGUgc2FtZSBub2RlIHByZWNpc2VseSBiZWNhdXNlIGl0IGlzIHRoZSBvbmUgd3JpdGVzIHRhcmdldC4gQSBzbG93IGNhbGwgaXMgYWxtb3N0IGFsd2F5cyBiZXR0ZXIgdGhhbiB0aHJvd2luZywgc28gYSBmYWlsaW5nIHByaW1hcnkgaXMgcmV0cmllZCAodGhlIFNBTUUgbm9kZSwgcmUtcmVzb2x2ZWQgZWFjaCBhdHRlbXB0IHNpbmNlIGEgY29uZmlnIHJlZnJlc2ggY2FuIGNoYW5nZSB3aGljaCBzb3VyY2UgaXMgcHJpbWFyeSkgdW50aWwgdGhlIGRlYWRsaW5lLCB0aGVuIHRocm93cy5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blByaW1hcnk8VD4oY29uZmlnOiB7IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1dpbmRvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nUm91dGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWROb3RDb25maWd1cmVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBQUklNQVJZX1JFVFJZX1RJTUVPVVQ7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgIGxldCBhdHRlbXB0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsaWQgc291cmNlIGNvdmVycyB0aGlzIHJlcXVlc3QuIE5vIHNvdXJjZSBpcyB0aGUgJHtjb25maWcud3JpdGUgJiYgXCJ3cml0ZSB0YXJnZXRcIiB8fCBcInByaW1hcnkgcmVhZCBzb3VyY2VcIn0gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9IChldmVyeSBzb3VyY2UgaXMgb3V0c2lkZSBpdHMgdmFsaWQgd2luZG93IG9yIG91dHNpZGUgdGhlIGtleSdzIHJvdXRlKWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5ID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KGNvbmZpZy50aW1lb3V0LCBwcmltYXJ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcud3JpdGUpIHJldHVybiBwcmltYXJ5LndyaXRlKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgcHJpbWFyeS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmltYXJ5LnJlYWQoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBwcmltYXJ5LmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpICYmICFyZXRyaWVkV3JvbmdXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJ3aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSAmJiAhcmV0cmllZFdyb25nUm91dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nUm91dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcInJvdXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQ09ORklHVVJFRCkgJiYgIXJldHJpZWROb3RDb25maWd1cmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWROb3RDb25maWd1cmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJ1bmNvbmZpZ3VyZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICYmICF0YXJnZXQuaXNDb25uZWN0ZWQoKSkgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcud3JpdGUgJiYgdGFyZ2V0ICYmIChhdHRlbXB0ID09PSAxIHx8IGF0dGVtcHQgJSAzID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdlIHRyeSB0aGUgSFRUUCByZXF1ZXN0OiBodHRwc1JlcXVlc3QgaGFzIGJldHRlciBETlMgcmV0cnlpbmcgY2FwYWJpbGl0aWVzIHRoYW4gb3VyIFdlYlNvY2tldCBzZXJ2ZXIgKHdlIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgaXQpLCBzbyBqdXN0IHVzaW5nIGl0IGNhbiBmaXggc29tZSBETlMgaXNzdWVzLCB3aGljaCBjYW4gcHJvcGFnYXRlIHRvIGZpeCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIEl0IGlzIHN0aWxsIHRoZSBwcmltYXJ5IHNvdXJjZSdzIG93biBkYXRhLCBzbyB0aGUgbm8tZmFsbGJhY2sgc2VtYW50aWNzIGhvbGQgLSBhbmQgQXJjaGl2ZXNVcmwgaGFzIG5vIHNldHVwIGNvc3QsIHNvIG1ha2luZyBvbmUgb24gdGhlIHNwb3QgaXMgZmluZS5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGFyZ2V0LnVybCB8fCBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybCh0YXJnZXQuY29uZmlnLnVybCkpLCB0YXJnZXQuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IHRoZSBwcmltYXJ5J3MgZXJyb3IgKHRocm93biBhdCB0aGUgZGVhZGxpbmUpIGlzIHRoZSByZWFsIG9uZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXQgbW9zdCBvbmUgYXR0ZW1wdCBwZXIgaW50ZXJ2YWwsIGluIGNhc2UgdGhlIGZhaWx1cmUgaXMgZmFzdFxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5tYXgoMCwgYXR0ZW1wdFN0YXJ0ICsgUFJJTUFSWV9SRVRSWV9ERUxBWSAtIERhdGUubm93KCkpKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJhY2VzIGNhbGwgYWdhaW5zdCBhIHNpemUtYmFzZWQgZGVhZGxpbmUuIFVwbG9hZHMga25vdyB0aGVpciBzaXplIHVwZnJvbnQ7IGdldHMgYXJlIGdpdmVuIFNNQVJUX1RJTUVPVVRfUFJPQkUgdG8gcHJvZHVjZSBhbnl0aGluZywgYW5kIG9ubHkgdGhlbiBpcyB0aGUgZmlsZSdzIGluZm8gZmV0Y2hlZCAoZnJvbSB0aGUgc2FtZSBzb3VyY2UsIGl0c2VsZiB0aW1lLWxpbWl0ZWQpIHRvIHNpemUgdGhlIGRlYWRsaW5lIC0gbWVhc3VyZWQgZnJvbSB0aGUgY2FsbCdzIHN0YXJ0LCBzbyBhIHNvdXJjZSB0aGF0IHdhcyBzbG93IGJlZm9yZSB0aGUgcHJvYmUgZG9lc24ndCBnZXQgdGhlIGZ1bGwgYWxsb3dhbmNlIGFnYWluLiBUaW1lZC1vdXQgY2FsbHMga2VlcCBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kICh0aGV5IGNhbm5vdCBiZSBjYW5jZWxsZWQpIGJ1dCB0aGVpciBldmVudHVhbCByZXN1bHQgaXMgaWdub3JlZC4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGFwcGx5U21hcnRUaW1lb3V0PFQ+KHRpbWVvdXQ6IFNtYXJ0VGltZW91dCB8IHVuZGVmaW5lZCwgc291cmNlOiBTb3VyY2VXcmFwcGVyLCBjYWxsOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghdGltZW91dCkgcmV0dXJuIGF3YWl0IGNhbGwoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNhbGxQcm9taXNlID0gY2FsbCgpO1xuICAgICAgICAvLyBBbiBhYmFuZG9uZWQgY2FsbCBtdXN0IG5vdCBzdXJmYWNlIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gd2hlbiBpdCBldmVudHVhbGx5IGZhaWxzXG4gICAgICAgIGxldCBhYmFuZG9uID0gKCkgPT4gdm9pZCBjYWxsUHJvbWlzZS50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgaWYgKHRpbWVvdXQudXBsb2FkQnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gQSBmbGF0IGJhc2UgcGx1cyB0aGUgcHJlZGljdGVkIHRyYW5zZmVyIHRpbWUsIHNvIHRpbnkgdXBsb2FkcyBzdGlsbCBnZXQgdGhlIGZ1bGwgYmFzZSB3aW5kb3dcbiAgICAgICAgICAgIGxldCBhbGxvd2VkID0gU01BUlRfVElNRU9VVF9QUk9CRSArIHRpbWVvdXQudXBsb2FkQnl0ZXMgLyBTTUFSVF9USU1FT1VUX1VQTE9BRF9CWVRFU19QRVJfU0VDT05EICogMTAwMDtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShhbGxvd2VkKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICBhYmFuZG9uKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFVwbG9hZCB0aW1lZCBvdXQuICR7dGltZW91dC5sYWJlbCB8fCBgVXBsb2FkIG9mICR7dGltZW91dC51cGxvYWRCeXRlc30gYnl0ZXNgfSB0byAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0IGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIChhbGxvd2VkICR7TWF0aC5yb3VuZChhbGxvd2VkKX1tczogJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGJhc2UgcGx1cyB0cmFuc2ZlciBhdCBhbiBhc3N1bWVkICR7U01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORH0gYnl0ZXMvcylgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoID0gdGltZW91dC5wYXRoO1xuICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXdhaXQgY2FsbFByb21pc2U7XG4gICAgICAgIGxldCBmaXJzdCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKV0pO1xuICAgICAgICBpZiAoZmlyc3QpIHJldHVybiBmaXJzdC52YWx1ZTtcbiAgICAgICAgbGV0IHByb2JlRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGluZm86IHsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRJbmZvKHBhdGgpKS50aGVuKHggPT4gKHsgc2l6ZTogeCAmJiB4LnNpemUgfHwgMCB9KSksXG4gICAgICAgICAgICAgICAgZGVsYXkoU01BUlRfVElNRU9VVF9QUk9CRSkudGhlbigoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHByb2JlRXJyb3IgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBSZWFkIHRpbWVkIG91dCB3aXRoIG5vIHNpemUgcHJvYmUuIFJlYWQgb2YgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX06IG5vIHJlc3VsdCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcywgYW5kIGdldEluZm8gJHtwcm9iZUVycm9yICYmIGBmYWlsZWQgKCR7cHJvYmVFcnJvcn0pYCB8fCBgY291bGQgbm90IGFuc3dlciB3aXRoaW4gJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGVpdGhlcmB9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChTTUFSVF9USU1FT1VUX1BST0JFLCBpbmZvLnNpemUgLyBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgKiAxMDAwKTtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IHN0YXJ0ICsgYWxsb3dlZCAtIERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBsZXQgc2Vjb25kID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkocmVtYWluaW5nKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChzZWNvbmQpIHJldHVybiBzZWNvbmQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFJlYWQgdGltZWQgb3V0LiBSZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9ICgke2luZm8uc2l6ZX0gYnl0ZXMpIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXMgZnJvbSB0aGUgY2FsbCdzIHN0YXJ0LCBhdCBhbiBhc3N1bWVkICR7U01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EfSBieXRlcy9zKWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGFzdENvbmZpZ1JlZnJlc2ggPSAwO1xuICAgIHByaXZhdGUgYXN5bmMgcHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGU6IENoYWluU3RhdGUsIGtpbmQ6IFwid2luZG93XCIgfCBcInJvdXRlXCIgfCBcInVuY29uZmlndXJlZFwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChraW5kID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBuZWFyQm91bmRhcnkgPSBzdGF0ZS5zb3VyY2VzLnNvbWUoc291cmNlID0+IHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3cuc29tZSh0ID0+IHQgPiAwICYmIHQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBNYXRoLmFicyh0IC0gbm93KSA8PSBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XKSk7XG4gICAgICAgICAgICBpZiAobmVhckJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHJhY2VkIGEgdmFsaWQgd2luZG93IGJvdW5kYXJ5OyB3YWl0aW5nICR7V1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZIC8gMTAwMH1zIGFuZCByZXRyeWluZ2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0Q29uZmlnUmVmcmVzaCA8IENPTkZJR19SRUZSRVNIX1RIUk9UVExFKSByZXR1cm47XG4gICAgICAgIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgcmVhc29uID0ga2luZCA9PT0gXCJ3aW5kb3dcIiAmJiBcIndyb25nIHZhbGlkIHdpbmRvd1wiIHx8IGtpbmQgPT09IFwicm91dGVcIiAmJiBcIndyb25nIHJvdXRlXCIgfHwgXCJ0aGUgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZW50cnkgb24gdGhhdCBzZXJ2ZXJcIjtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKCR7cmVhc29ufSk6IG91ciBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIChsaWtlbHkgc3RhbGUsIG9yIGEgZGVwbG95IHN3aXRjaG92ZXIpOyByZWZyZXNoaW5nIGl0IGFuZCByZXRyeWluZ2ApO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlZnJlc2hBY3RpdmVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcXVlc3Q8VD4oY29uZmlnOiB7IGFwaU9ubHk/OiBib29sZWFuOyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyBub0ZhbGxiYWNrcz86IGJvb2xlYW47IGZhbGxiYWNrcz86IGJvb2xlYW47IHJldHJpZXM/OiBudW1iZXI7IGZhc3Q/OiBib29sZWFuOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKHN0YXRlLCBjb25maWcsIHJ1bik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdhaXRpbmdGb3JBY2Nlc3MoKTogUHJvbWlzZTx7IGxpbms6IHN0cmluZzsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBBIHNvdXJjZSB3aG9zZSB3aW5kb3cgaGFzIHBhc3NlZCBpcyBuZXZlciByZWFkIG9yIHdyaXR0ZW4gYWdhaW4sIHNvIGl0cyBhY2Nlc3Mgc3RhdGUgaXMgaXJyZWxldmFudCAtIGFuZCBhc2tpbmcgYSBkZWFkIGludGVybWVkaWF0ZSB3b3VsZCBqdXN0IGhhbmcgb3IgdGhyb3cuIEZ1dHVyZSB3aW5kb3dzIERPIG1hdHRlcjogYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIGJlZm9yZSB0aGVpciB3aW5kb3cgc3RhcnRzLlxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3dbMV0gPD0gRGF0ZS5ub3coKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLmFwaSBpbnN0YW5jZW9mIEFyY2hpdmVzUmVtb3RlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCBzb3VyY2UuYXBpLndhaXRpbmdGb3JBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAod2FpdGluZykgcmV0dXJuIHdhaXRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHNvdXJjZXMgdGhhdCBjYW4gc2VydmUgYSBmaWxlIHJpZ2h0IG5vdywgaW4gZGlzcGF0Y2ggb3JkZXIgLSB0aGUgZmlyc3QgaXMgdGhlIHdyaXRlIG5vZGUsIHRoZSBvbmUgYSBwbGFpbiByZWFkIGFza3MgZmlyc3QuIEVhY2ggZW50cnkncyB1cmwgaXMgd2hhdCBHZXRDb25maWcuc291cmNlVXJsIC8gR2V0SW5mb0NvbmZpZy5zb3VyY2VVcmwgYWNjZXB0LCBzbyBsaXN0aW5nIHRoZXNlIGFuZCB0aGVuIHJlYWRpbmcgd2l0aCBzb3VyY2VVcmwgY29tcGFyZXMgdGhlIGNvcGllcyB0aGUgc291cmNlcyBhY3R1YWxseSBob2xkLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRGaWxlU291cmNlcyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VDb25maWdbXT4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgcm91dGUpICYmIGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpKS5tYXAoeCA9PiB4LmNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG9uZSBleGFjdCBzb3VyY2UgYSBzb3VyY2VVcmwgcmVhZCBtZWFucywgbm8gZmFsbGJhY2sgb2YgYW55IGtpbmQgLSBhc2tpbmcgZm9yIGEgU1BFQ0lGSUMgc291cmNlJ3MgY29weSBhbmQgZ2V0dGluZyBhbm90aGVyJ3Mgd291bGQgZGVmZWF0IHRoZSBwb2ludFxuICAgIHByaXZhdGUgYXN5bmMgcnVuT25Tb3VyY2U8VD4oc291cmNlVXJsOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgc291cmNlID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4geC5jb25maWcudXJsID09PSBzb3VyY2VVcmwpO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhlIHVybCAke0pTT04uc3RyaW5naWZ5KHNvdXJjZVVybCl9IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IChzb3VyY2VzOiAke3N0YXRlLnNvdXJjZXMubWFwKHggPT4geC5jb25maWcudXJsKS5qb2luKFwiLCBcIil9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBzb3VyY2UucmVhZChydW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBnZXQyLCBidXQgdHJ5aW5nIHNvdXJjZXMgaW4gbGF0ZW5jeSBvcmRlciAoZmFzdGVzdCBmaXJzdCkgaW5zdGVhZCBvZiBjb25maWcgb3JkZXIuIFdoaWxlIHRoaXMgaXMgbXVjaCBmYXN0ZXIsIGl0IG1pZ2h0IG1pc3MgaW1tZWRpYXRlIHdyaXRlczogdGhlIHdyaXRlIG5vZGUgaXMgbm8gbG9uZ2VyIHRyaWVkIGZpcnN0LCBzbyBhIGxhZ2dpbmcgcmVwbGljYSBtYXkgYW5zd2VyIHdpdGggYSBzbGlnaHRseSBvbGRlciB2YWx1ZS4gRXhjbHVzaXZlIHdpdGggbm9GYWxsYmFja3MgKHdoaWNoIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgLSB0aGUgd3JpdGUgbm9kZSAtIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwKTsgcGFzc2luZyBib3RoIHRocm93cy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmFzdChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgaWYgKGNvbmZpZz8uc291cmNlVXJsKSB7XG4gICAgICAgICAgICAvLyBBIHNwZWNpZmljIHNvdXJjZSBsZWF2ZXMgbm90aGluZyBmb3IgdGhlIGxhdGVuY3kgb3JkZXJpbmcgdG8gZGVjaWRlXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCBmYXN0OiB0cnVlLCB0aW1lb3V0OiB7IHBhdGg6IGZpbGVOYW1lIH0gfSwgYXN5bmMgKGFyY2hpdmVzLCB1cmwpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBpcyBhIHRvbWJzdG9uZSwgbm90IGNvbnRlbnQgLSBzZWUgZ2V0MlxuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGggJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMgJiYgIShjb25maWc/LnJhbmdlICYmIHJlc3VsdC5zaXplKSkgcmV0dXJuIHsgdXJsIH07XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSwgdXJsIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogQWx3YXlzIHJlc29sdmVzIHdpdGggYSB1cmwgLSB0aGUgYXV0aG9yaXR5IHRoYXQgYW5zd2VyZWQuIEEgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0IGlzIHN0aWxsIGFuIGFuc3dlciBGUk9NIGEgc2VydmVyLCBzbyBpdCBjb21lcyBiYWNrIGFzIHsgdXJsIH0gd2l0aCBubyBkYXRhIChuZXZlciBwbGFpbiB1bmRlZmluZWQpOyBlcnJvcnMgZnJvbSBldmVyeSBzb3VyY2UgdGhyb3cgaW5zdGVhZC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgY29uc3Qgc291cmNlVXJsID0gY29uZmlnPy5zb3VyY2VVcmw7XG4gICAgICAgIGlmIChzb3VyY2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bk9uU291cmNlKHNvdXJjZVVybCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybDogc291cmNlVXJsIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybDogc291cmNlVXJsIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh1bmxlc3MgdGhlIGNhbGxlciBhc2tlZCBmb3IgdG9tYnN0b25lcykgLSBhIHJhbmdlZCByZWFkIG9mIGEgUkVBTCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgdGhvdWdoIChyYW5nZSBwYXN0IEVPRiksIHdoaWNoIHRoZSB0b3RhbCBzaXplIGRpc3Rpbmd1aXNoZXNcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybCA9IGNvbmZpZz8uc291cmNlVXJsO1xuICAgICAgICBpZiAoc291cmNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5PblNvdXJjZShzb3VyY2VVcmwsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgLi4ucmVzdWx0LCB1cmw6IHNvdXJjZVVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzIH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyAuLi5yZXN1bHQsIHVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2l0aG91dCBmYWxsYmFja3M6IHRoZSBBVVRIT1JJVEFUSVZFIGNvdmVyaW5nIE9OTFkgLSB0aGUgZmlyc3Qgc291cmNlIHBlciByb3V0ZSBpbiBjb25maWcgb3JkZXIgKHRoZSBzYW1lIG5vZGUgZXZlcnkgd3JpdGUgYW5kIHJlYWQgdGFyZ2V0cyksIGRvd24gb3Igbm90LiBJdCBpcyBORVZFUiBleGNsdWRlZCBhbmQgTkVWRVIgc3Vic3RpdHV0ZWQsIHNvIGEgbGlzdGluZyB0aGF0IGNhbid0IHJlYWNoIGl0cyB3cml0ZSBub2RlcyByZXRyaWVzIHRob3NlIHNhbWUgbm9kZXMgdW50aWwgdGhlIGRlYWRsaW5lIGFuZCB0aGVuIGZhaWxzLCByYXRoZXIgdGhhbiBxdWlldGx5IHJlYWRpbmcgc2Vjb25kLWhhbmQgZGF0YSBvZmYgYSByZXBsaWNhIG9yIGJhY2tibGF6ZS4gZXhjbHVkZS9jb29sZG93bi9zdWJzdGl0dXRpb24gYXBwbHkgT05MWSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgaW50byBmYWxsYmFja3MuXG4gICAgcHJpdmF0ZSBzZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbjsgZXhjbHVkZT86IFNldDxTb3VyY2VXcmFwcGVyPiB9KTogU291cmNlV3JhcHBlcltdIHtcbiAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgeC5hcGkgJiYgIWNvbmZpZy5leGNsdWRlPy5oYXMoeCkpO1xuICAgICAgICAgICAgbGV0IHVzYWJsZSA9IGNhbmRpZGF0ZXMuZmlsdGVyKHggPT4gIXguaXNPbkNvb2xkb3duKCkpO1xuICAgICAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKHVzYWJsZSkgfHwgY292ZXJSb3V0ZXMoY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICBpZiAoY2hvc2VuKSByZXR1cm4gY2hvc2VuO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHguYXBpKTtcbiAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICBpZiAoIWNob3Nlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob3NlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uQ292ZXJpbmc8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4sIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBDT1ZFUklOR19SRVRSWV9USU1FT1VUO1xuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgZmFpbGVkIGR1cmluZyB0aGlzIGNhbGwgLSB3aXRoIGZhbGxiYWNrcywgdGhlIG5leHQgYXR0ZW1wdCBjb3ZlcnMgdGhlaXIgcm91dGVzIHdpdGggdGhlIG5leHQgc291cmNlIGhvbGRpbmcgdGhlbSBpbnN0ZWFkXG4gICAgICAgIGxldCBmYWlsZWQgPSBuZXcgU2V0PFNvdXJjZVdyYXBwZXI+KCk7XG4gICAgICAgIGxldCB0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cmllcysrO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG5hbWUgdGhlIE9QRVJBVElPTiBhbmQgdGhlIFNQRUNJRklDIHNvdXJjZXMgdGhhdCBmYWlsZWQgLSBcInRoZSBmaW5kIGZhaWxlZCBiZWNhdXNlIHNvdXJjZSBYIGlzIHVuYXZhaWxhYmxlXCIsIG5ldmVyIGFuIGFub255bW91cyBmYWlsdXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdob2xlIGNoYWluXG4gICAgICAgICAgICBsZXQgb3V0Y29tZSA9IGF3YWl0IChhc3luYyAoKTogUHJvbWlzZTx7IHZhbHVlczogVFtdIH0gfCB7IGVycm9yOiBFcnJvciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdmVyaW5nOiBTb3VyY2VXcmFwcGVyW107XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY292ZXJpbmcgPSB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gY2Fubm90IHJ1bjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZXM6IHsgc291cmNlOiBTb3VyY2VXcmFwcGVyOyBlcnJvcjogRXJyb3IgfVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNvdmVyaW5nLm1hcChhc3luYyAoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBuZXcgRXJyb3IoYFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlICR7b3BlcmF0aW9ufWApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhd2FpdCBydW4oYXBpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNvdXJjZSwgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIGFmdGVyICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSl9IGluZGV4ICR7aW5kZXh9IG9mICR7Y292ZXJpbmcubGVuZ3RofWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGlmICghZmFpbHVyZXMubGVuZ3RoKSByZXR1cm4geyB2YWx1ZXMgfTtcbiAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgJHtmYWlsdXJlc1swXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGlzIHVuYXZhaWxhYmxlOiAke2ZhaWx1cmVzWzBdLmVycm9yLm1lc3NhZ2UgPz8gZmFpbHVyZXNbMF0uZXJyb3J9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2UgJHtmYWlsdXJlcy5sZW5ndGh9IG9mIHRoZSAke2NvdmVyaW5nLmxlbmd0aH0gY292ZXJpbmcgc291cmNlcyBhcmUgdW5hdmFpbGFibGU6ICR7ZmFpbHVyZXMubWFwKHggPT4gYCR7eC5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiAke3guZXJyb3IubWVzc2FnZSA/PyB4LmVycm9yfWApLmpvaW4oXCIgfCBcIil9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIGlmIChcInZhbHVlc1wiIGluIG91dGNvbWUpIHJldHVybiBvdXRjb21lLnZhbHVlcztcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAvLyBTdWJzdGl0dXRpb24gY29tZXMgQkVGT1JFIHRoZSBkZWFkbGluZSBjaGVjazogYSBzaW5nbGUgY29ubmVjdCB0aW1lb3V0IGNhbiBlYXQgdGhlIGVudGlyZSBkZWFkbGluZSwgYW5kIGdpdmluZyB1cCB0aGVuIC0gd2l0aG91dCBldmVyIHRyeWluZyB0aGUgc3Vic3RpdHV0ZSB0aGF0IGZhbGxiYWNrcyBleGlzdCBmb3IgLSB0aHJvd3MgZXhhY3RseSB3aGVuIGZhbGxpbmcgYmFjayBtYXR0ZXJzIG1vc3QuIFN1YnN0aXR1dGlvbiBjYW5ub3QgbG9vcCBwYXN0IHRoZSBkZWFkbGluZSBmb3JldmVyOiBldmVyeSBwYXNzIGFkZHMgaXRzIGZhaWx1cmVzIHRvIGBmYWlsZWRgLCBzbyB0aGUgc3Vic3RpdHV0ZXMgcnVuIG91dCB3aXRoIHRoZSBzb3VyY2VzLlxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzICYmIGZhaWxlZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IHRydWUsIGV4Y2x1ZGU6IGZhaWxlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYChyZXRyeWluZyB3aXRoIGZhbGxiYWNrcykgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gc3Vic3RpdHV0ZSBjb3ZlcnMgdGhlIGZhaWxlZCByb3V0ZXMgLSByZXRyeSB0aGUgZmFpbGVkIHNvdXJjZXMgdGhlbXNlbHZlcyBhZnRlciB0aGUgZGVsYXlcbiAgICAgICAgICAgICAgICBmYWlsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiAke0NPVkVSSU5HX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChnaXZpbmcgdXAgYXQgJHtuZXcgRGF0ZShkZWFkbGluZSkudG9JU09TdHJpbmcoKX0pLmApO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KENPVkVSSU5HX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5PbkNvdmVyaW5nKGBUaGUgZmluZCBvZiAke0pTT04uc3RyaW5naWZ5KHByZWZpeCl9YCwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpLCB7IGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MgfSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGNoYW5nZXMgbGlzdGluZyBzaW5jZSAke25ldyBEYXRlKGNvbmZpZy50aW1lKS50b0lTT1N0cmluZygpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENoYW5nZXNBZnRlcjIoY29uZmlnKSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIHN5bmMgc3RhdHVzIGNoZWNrYCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRTeW5jU3RhdHVzIGlzIG5vdCBzdXBwb3J0ZWQ6ICR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IGltcGxlbWVudCBpdGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFyY2hpdmVzLmdldFN5bmNTdGF0dXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiBzdGF0dXNlcy5ldmVyeSh4ID0+IHguYWxsU2NhbnNDb21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHN0YXR1c2VzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmluZGV4U2l6ZSwgMCksXG4gICAgICAgICAgICBzb3VyY2VzOiBzdGF0dXNlcy5mbGF0TWFwKHggPT4geC5zb3VyY2VzKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5zb3VyY2VzLnNvbWUoeCA9PiB4LmFwaSkpIHJldHVybiB7IHJlbW90ZUNvbmZpZzogc3RhdGUuY29uZmlnIH07XG4gICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgeyBhcGlPbmx5OiB0cnVlIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENvbmZpZygpKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29uZmlnLCByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW1wdHkgd3JpdGUgcmVmdXNlZDogc2V0IHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBidWZmZXIgZm9yICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfTogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGluIHRoaXMgc3lzdGVtIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZyAtIGNhbGwgZGVsIGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0Um91dGluZ0NvbmZpZyhkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZS5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGZpbGVOYW1lKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRWYXJpYWJsZVNoYXJkKGZpbGVOYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IExBUkdFX1NFVF9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgIC8vIFN0cmVhbWVkIGF1dG9tYXRpY2FsbHkgc28gY2FsbGVycyBuZXZlciBoYXZlIHRvIGNhbGwgc2V0TGFyZ2VGaWxlIHRoZW1zZWx2ZXMgd2hlbiB0aGV5IGFscmVhZHkgaG9sZCB0aGUgYnVmZmVyIC0gb25lIGdpYW50IG1lc3NhZ2Ugd291bGQgZXhjZWVkIHRoZSB3aXJlIGxpbWl0IGFuZCBsYWcgZXZlcnkgb3RoZXIgY2xpZW50IG9uIHRoZSBjb25uZWN0aW9uLiBUaGUgd2hvbGUgY29uZmlnIGdvZXMgd2l0aCBpdCAoaW5jbHVkaW5nIGZhbGxiYWNrcywgd2hpY2ggdGhlIGJ1ZmZlcidzIHJlc3RhcnRTdHJlYW0gbWFrZXMgcG9zc2libGUpOiBhIGZpbGUgbXVzdCBub3QgZ2V0IGRpZmZlcmVudCB3cml0ZSBzZW1hbnRpY3MganVzdCBmb3IgYmVpbmcgYmlnLlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmaWxlTmFtZSwgLi4uY29uZmlnLCAuLi5idWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBVcGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9ICgke2RhdGEubGVuZ3RofSBieXRlcylgIH0gfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZpbGVOYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0Um91dGluZ0NvbmZpZyhkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBDaGVja2VkIGJlZm9yZSB0aGUgZmlyc3Qgbm9kZSBpcyB3cml0dGVuIHRvLCBub3QganVzdCBieSBlYWNoIG5vZGUgYXMgaXQgYXJyaXZlczogZXZlcnkgc2VydmVyIHdvdWxkIHJlamVjdCBpdCBhbnl3YXksIGFuZCBmaW5kaW5nIHRoYXQgb3V0IG9uZSBub2RlIGF0IGEgdGltZSBpcyBob3cgYSBjb25maWcgd3JpdGUgZW5kcyB1cCBoYWxmLWFwcGxpZWRcbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocGFyc2VSb3V0aW5nRGF0YShkYXRhKSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHdyaXRlVGltZSA9IE1hdGguZmxvb3IoY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBPbmUgd3JpdGUgcGVyIFNUT1JFLCBub3QgcGVyIHNlcnZlcjogdGhlIHdyaXRlIGxhbmRzIGluIHRoZSBzdG9yZSB0aGUgZW50cnkgTkFNRVMsIHNvIHR3byBlbnRyaWVzIHNoYXJpbmcgYSBVUkwgYnV0IG5hbWluZyBkaWZmZXJlbnQgc3RvcmVzIGFyZSB0d28gc2VwYXJhdGUgZGVsaXZlcmllcyAtIGRlZHVwaW5nIGJ5IFVSTCBhbG9uZSBsZWF2ZXMgdGhlIHNlY29uZCBzdG9yZSB1bmNvbmZpZ3VyZWQgZm9yZXZlclxuICAgICAgICBsZXQgdGFyZ2V0czogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGxldCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gYCR7c291cmNlLmNvbmZpZy51cmx9fCR7c291cmNlLmNvbmZpZy5uYW1lfWA7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRpbmcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSB0byBhbGwgJHt0YXJnZXRzLmxlbmd0aH0gc3RvcmVzICh3cml0ZSB0aW1lICR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSk6ICR7ZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc2xpY2UoMCwgMjAwMCl9YCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBgJHtzb3VyY2UuY29uZmlnLnVybH0gKHN0b3JlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5uYW1lKX0pYDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSkpO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIHRvICR7bGFiZWx9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7bGFiZWx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSBmYWlsZWQgb24gc29tZSBzdG9yZXMuIEZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBmYWlsZWQgb24gJHtlcnJvcnMubGVuZ3RofSBvZiAke3RhcmdldHMubGVuZ3RofSBzdG9yZXMgKHN1Y2NlZWRlZCBvbjogJHt3cml0dGVuLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0pOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBST1VUSU5HX0ZJTEU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWc/LnJldHJpZXMsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IDAsIGxhYmVsOiBgRGVsZXRpb24gb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9YCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSwgY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBJQXJjaGl2ZXMudW5kZWxldGU6IHJlc3RvcmVzIGEgZmlsZSBtYXJrZWQgZm9yIGRlbGV0aW9uLCBkaXNwYXRjaGVkIHRvIHRoZSB3cml0ZSBub2RlIGFzIFNldENvbmZpZy51bmRlbGV0ZSAodGhlIHdyaXRlIG5vZGUgcHJvcGFnYXRlcyB0aGUgcmVzdG9yZSB0byBpdHMgcGVlcnMgaXRzZWxmKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5kZWxldGUoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBzZXQgcmVmdXNlcyBlbXB0eSBidWZmZXJzLCBhbmQgYW4gdW5kZWxldGUgY2FycmllcyBubyBkYXRhIC0gdGhlIGJ5dGUgaXMgaWdub3JlZFxuICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBCdWZmZXIuZnJvbShbMV0pO1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgdGltZW91dDogeyB1cGxvYWRCeXRlczogcGxhY2Vob2xkZXIubGVuZ3RoLCBsYWJlbDogYFVuZGVsZXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfWAgfSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoZmlsZU5hbWUsIHBsYWNlaG9sZGVyLCB7IHVuZGVsZXRlOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICAvKiogU2VlIElBcmNoaXZlcy5tb3ZlLiBXaGVuIG9uZSBub2RlIGlzIHRoZSB3cml0ZSB0YXJnZXQgZm9yIEJPVEggcGF0aHMsIHRoYXQgbm9kZSBtb3ZlcyB0aGUgZmlsZSBpdHNlbGYgLSB0aGUgYnl0ZXMgbmV2ZXIgY29tZSB0aHJvdWdoIHVzIC0gd2l0aCB0aGUgc2FtZSB3cm9uZy13aW5kb3cvcm91dGUgcmUtcmVzb2x1dGlvbiBhcyBhbnkgd3JpdGUuIFdoZW4gdGhlIHBhdGhzIHJvdXRlIHRvIGRpZmZlcmVudCBzaGFyZHMgbm8gc2luZ2xlIG5vZGUgaG9sZHMgYm90aCwgc28gdGhlIG1vdmUgZGVncmFkZXMgdG8gYSBjb3B5IHRocm91Z2ggdXMgcGx1cyBhIGRlbGV0ZSwgQ09ORklSTUVEIGF0IHRoZSBkZXN0aW5hdGlvbiBiZWZvcmUgdGhlIHNvdXJjZSBpcyB0b3VjaGVkLiBObyBzbWFydCB0aW1lb3V0IG9uIHRoZSBub2RlLXNpZGUgbW92ZTogaXQgY2FuIGJlIGEgYmlnIGZpbGUncyB3b3J0aCBvZiBub2RlLXNpZGUgd29yaywgd2hpY2ggdGhlIHVwbG9hZC1zaXplZCBkZWFkbGluZXMgd291bGQgbWlzanVkZ2UuICovXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiBNb3ZlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IFJPVVRJTkdfRklMRSB8fCBjb25maWcudG9QYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIG1vdmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyb21Sb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5mcm9tUGF0aCk7XG4gICAgICAgIGxldCB0b1JvdXRlID0gZ2V0Um91dGUoY29uZmlnLnRvUGF0aCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIGZyb21Sb3V0ZSkpO1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHJvdXRlQ29udGFpbnModGFyZ2V0LmNvbmZpZy5yb3V0ZSwgdG9Sb3V0ZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZnJvbVJvdXRlIH0sIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFyY2hpdmVzLm1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzb3VyY2U6ICR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IChtb3ZpbmcgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgYXJjaGl2ZXMubW92ZShjb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5saW5lIHJhdGhlciB0aGFuIG1vdmVBcmNoaXZlRmlsZSwgd2hpY2ggLSBnaXZlbiBvbmUgYXJjaGl2ZXMgdGhhdCBpbXBsZW1lbnRzIG1vdmUgLSB3b3VsZCBqdXN0IGNhbGwgYmFjayBpbnRvIHRoaXMgbWV0aG9kXG4gICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiB0aGlzLCB0bzogdGhpcywgcGF0aDogY29uZmlnLmZyb21QYXRoLCB0b1BhdGg6IGNvbmZpZy50b1BhdGggfSk7XG4gICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAvLyBVbmRlZmluZWQgaXMgdHdvIGNhc2VzIChzZWUgY29weUFyY2hpdmVGaWxlKSAtIGFza2luZyB0aGUgc291cmNlIHdoaWNoIG9uZSBrZWVwcyB0aGUgZXJyb3IgaG9uZXN0XG4gICAgICAgICAgICBsZXQgc291cmNlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vdmUgcmVmdXNlZCAtIGEgbmV3ZXIgZmlsZSBleGlzdHMgYXQgdGhlIGRlc3RpbmF0aW9uLiBDYW5ub3QgbW92ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5mcm9tUGF0aCl9ICgke3NvdXJjZUluZm8uc2l6ZX0gYnl0ZXMgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHNvdXJjZUluZm8ud3JpdGVUaW1lKX0pIHRvICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnRvUGF0aCl9OiB0aGUgY29weSB3YXMgcmVmdXNlZCByYXRoZXIgdGhhbiByb2xsIGl0IGJhY2sgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0pIC0gdGhlIHNvdXJjZSBpcyBsZWZ0IHVudG91Y2hlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogbm90IGZvdW5kIG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgdGhpcy5nZXRJbmZvKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIGNvcHkgY291bGQgbm90IGJlIGNvbmZpcm1lZCAtIHRoZSBzb3VyY2UgaXMga2VwdC4gTm90IGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gYWZ0ZXIgY29weWluZyBpdCB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IHJlcG9ydCBpdCAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmRlbChjb25maWcuZnJvbVBhdGgpO1xuICAgIH1cblxuICAgIC8vIE9uZSB3cml0ZSB0YXJnZXQgcGVyIHJvdXRlIHJhbmdlLCBsb3dlc3QgbGF0ZW5jeSBmaXJzdC4gV2l0aGluIGEgc2hhcmQgdGhlIHRhcmdldCBpcyBBTFdBWVMgdGhlIGZpcnN0IHNvdXJjZSBpbiBjb25maWcgb3JkZXIgKHNlZSBydW5QcmltYXJ5IC0gd3JpdGVzIG11c3Qgc3RheSBvbiB0aGUgc2FtZSBub2RlKTogY29ubmVjdGl2aXR5IG9ubHkgZGVjaWRlcyB3aGljaCBTSEFSRCB3ZSBwaWNrLCBuZXZlciB3aGljaCBub2RlIHdpdGhpbiBpdCwgc28gYSBzaGFyZCB3aG9zZSBub2RlIGlzIGRpc2Nvbm5lY3RlZCBpcyBkcm9wcGVkIGVudGlyZWx5IHdoZW4gY29ubmVjdGVkT25seSBpcyBzZXQuXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGNvbm5lY3RlZE9ubHk6IGJvb2xlYW4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldHNCeVJvdXRlLmhhcyhyb3V0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RlZE9ubHkpIHtcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcih4ID0+IHguaXNDb25uZWN0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBrZXkgc2V0VmFyaWFibGVTaGFyZCB3b3VsZCBtYXRlcmlhbGl6ZSBmb3IgdGhpcyBWQVJJQUJMRV9TSEFSRCBrZXkgKGEgdmFsdWUgaW4gdGhlIHByZWZlcnJlZCBzaGFyZCdzIHJvdXRlIHJhbmdlKSwgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRTaGFyZEtleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSB8fCBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFNoYXJkS2V5IHJlcXVpcmVzIGEga2V5IGNvbnRhaW5pbmcgYW4gdW5tYXRlcmlhbGl6ZWQgJHtKU09OLnN0cmluZ2lmeShWQVJJQUJMRV9TSEFSRCl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogdHJ1ZSB9KVswXVxuICAgICAgICAgICAgfHwgdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiBmYWxzZSB9KVswXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBzbyB0aGVyZSBpcyBubyBzaGFyZCB0byBtYXRlcmlhbGl6ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IGludG9gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCB0YWxraW5nIHRvIGEgc2hhcmQgd2hvc2Ugbm9kZSB3YXMgZmFzdCBidXQgaXMgbm93IGRpc2Nvbm5lY3RlZCAtIG9ubHkgd2hlbiBubyBjb25uZWN0ZWQgc2hhcmQgd29ya3MgZG8gd2UgcmVjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRyeSBldmVyeSBzaGFyZFxuICAgICAgICBsZXQgY29ubmVjdGVkT25seSA9IHRydWU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBmdWxsS2V5ID0gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNoYXJkIHBpY2tpbmcgYWxyZWFkeSByZXRyaWVzIGFjcm9zcyBzaGFyZHMsIHNvIGEgc3R1Y2sgc2hhcmQganVzdCBjb3N0cyBpdHMgdGltZW91dCBhbmQgd2UgbW92ZSBvbi4gTGFyZ2UgZGF0YSBzdHJlYW1zIHZpYSBzZXRMYXJnZUZpbGUgLSB0aGUga2V5IGlzIGFscmVhZHkgbWF0ZXJpYWxpemVkIGhlcmUsIHNvIHRoZSBuby1WQVJJQUJMRV9TSEFSRCByZXN0cmljdGlvbiBvbiBzZXRMYXJnZUZpbGUgZG9lc24ndCBhcHBseS5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dCh7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBWYXJpYWJsZS1zaGFyZCB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmdWxsS2V5KX0gKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWAgfSwgdGFyZ2V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmdWxsS2V5LCAuLi5jb25maWcsIC4uLmJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZ1bGxLZXksIGRhdGEsIGNvbmZpZykpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsS2V5O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0OyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gaXMgZG93bjsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkYCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRPbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IHZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGFjY2VwdCB3cml0ZXNcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGxhcmdlIGZpbGUgaXMgd3JpdHRlbiBleGFjdGx5IGxpa2UgYSBzbWFsbCBvbmUgLSBzYW1lIHdyaXRlIG5vZGUsIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24sIHNhbWUgZmFsbGJhY2tzIC0gc28gYSB2YWx1ZSdzIFNJWkUgbmV2ZXIgZGVjaWRlcyBpdHMgd3JpdGUgc2VtYW50aWNzIChzZXQgc3RyZWFtcyB0aHJvdWdoIGhlcmUgcGFzdCBMQVJHRV9TRVRfVEhSRVNIT0xELCBhbmQgYSBmaWxlIHRoYXQgZ3JldyBwYXN0IGl0IG11c3Qgbm90IHN1ZGRlbmx5IGxvc2UgdGhlIGF2YWlsYWJpbGl0eSBpdHMgY2FsbGVyIGFza2VkIGZvcikuIFRoZSBvbmUgZGlmZmVyZW5jZTogZXZlcnkgYXR0ZW1wdCBhZnRlciB0aGUgZmlyc3QgaGFzIHRvIHJld2luZCB0aGUgc3RyZWFtLCBzbyBhIGNvbmZpZyB3aXRob3V0IHJlc3RhcnRTdHJlYW0gZ2V0cyBhIHNpbmdsZSBhdHRlbXB0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbSA9IGNvbmZpZy5yZXN0YXJ0U3RyZWFtO1xuICAgICAgICBpZiAoIXJlc3RhcnRTdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlT25jZShjb25maWcsIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZy5mYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZy5yZXRyaWVzLCByb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgYXR0ZW1wdCBjb25zdW1lZCBzb21lIChvciBhbGwpIG9mIHRoZSBzdHJlYW0sIGFuZCB0aGlzIHNvdXJjZSBuZWVkcyB0aGUgZmlsZSBmcm9tIGl0cyBmaXJzdCBieXRlXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIGF3YWl0IHJlc3RhcnRTdHJlYW0oKTtcbiAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQSBzdHJlYW0gdGhhdCBjYW5ub3QgcmV3aW5kIGdldHMgZXhhY3RseSBPTkUgYXR0ZW1wdCBhdCB0aGUgd3JpdGUgbm9kZTogcmV0cnlpbmcgYW55d2hlcmUgKGFub3RoZXIgc291cmNlLCBvciB0aGlzIG9uZSBhZ2Fpbikgd291bGQgc2VuZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgc3RyZWFtIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGZpbGUuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRMYXJnZUZpbGVPbmNlKGNvbmZpZzogU2V0TGFyZ2VGaWxlQ29uZmlnLCByb3V0ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciBzZXRMYXJnZUZpbGUgb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfSAocm91dGUgJHtyb3V0ZX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoY29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJscyA9IGF3YWl0IHRoaXMuZ2V0VVJMcyhwYXRoKTtcbiAgICAgICAgaWYgKCF1cmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwdWJsaWMgc291cmNlIGNvdmVyaW5nIHJvdXRlICR7Z2V0Um91dGUocGF0aCl9IHRvIGJ1aWxkIGEgVVJMIGZyb20gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsc1swXTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgVVJMIHRoYXQgY291bGQgc2VydmUgdGhpcyBwYXRoOiBwdWJsaWMgc291cmNlcyBtYXRjaGluZyBib3RoIHRoZSBwYXRoJ3Mgcm91dGUgYW5kIHRoZSBjdXJyZW50IHZhbGlkIHdpbmRvdy4gVGhlIGZpcnN0IGlzIHRoZSB3cml0ZSBub2RlJ3MgKGZpcnN0IG1hdGNoaW5nIHNvdXJjZSBpbiBjb25maWcgb3JkZXIsIHNlZSBydW5QcmltYXJ5IC0gdGhlIG9uZSBndWFyYW50ZWVkIGN1cnJlbnQpOyB0aGUgcmVzdCBhcmUgcmFua2VkIGZhc3Rlc3QtZmlyc3QgYnkgbWVhc3VyZWQgbGF0ZW5jeS4gRW1wdHkgd2hlbiBub25lIHF1YWxpZnkuICovXG4gICAgcHVibGljIGFzeW5jIGdldFVSTHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0R2V0VVJMcygpKShwYXRoKTtcbiAgICB9XG5cbiAgICAvKiogZ2V0VVJMcywgYnV0IGFmdGVyIHRoZSBvbmUgYXdhaXQgKGluaXRpYWxpemF0aW9uKSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgc3luY2hyb25vdXM6IGV2ZXJ5dGhpbmcgdW5kZXJuZWF0aCAtIHJvdXRlIGhhc2hpbmcsIHdpbmRvdyBjaGVja3MsIGxhdGVuY2llcywgVVJMIGJ1aWxkaW5nIC0gaXMgc3luY2hyb25vdXMsIGFuZCB0aGUgY2xvc3VyZSBhbHdheXMgcmVhZHMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgc28gaXQgc3RheXMgY29ycmVjdCBhY3Jvc3MgY29uZmlnIHJlZnJlc2hlcy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogZ2V0R2V0VVJMcywgYnV0IHNvcnRlZCBwdXJlbHkgYnkgbGF0ZW5jeSAtIHRoZSB3cml0ZSBub2RlIGdldHMgbm8gc3BlY2lhbCBmaXJzdCBwb3NpdGlvbi4gRm9yIHJlYWQtb25seSBjb25zdW1lcnMgdGhhdCBqdXN0IHdhbnQgdGhlIGZhc3Rlc3QgaG9zdC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0RmFzdFVSTHMoKTogUHJvbWlzZTwocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlR2V0VVJMcyhpbml0aWFsU3RhdGUsIHsgd3JpdGVOb2RlRmlyc3Q6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgd3JpdGVOb2RlRmlyc3Q6IGJvb2xlYW4gfSk6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUubGF0ZXN0KCkgfHwgaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUocGF0aCk7XG4gICAgICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZS5jb25maWcucHVibGljID8/IHRydWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yZGVyZWQ6IFNvdXJjZVdyYXBwZXJbXTtcbiAgICAgICAgICAgIGlmIChjb25maWcud3JpdGVOb2RlRmlyc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IHNvdXJjZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc29ydChyZXN0LCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXMuc2xpY2UoMCwgMSksIC4uLnJlc3RdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXJscyA9IG9yZGVyZWQubWFwKHggPT4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwoeC5jb25maWcudXJsKSwgcGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KHVybHMpXTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5kaXNwb3NlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZXMoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpOiBBcmNoaXZlc0NoYWluIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQ2hhaW4oY29uZmlnLCBvcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsbFNlcnZlcjxUPih1cmw6IHN0cmluZywgcnVuOiAoY29udHJvbGxlcjogdHlwZW9mIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW3N0cmluZ10pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZVN0b3JhZ2VVcmwodXJsKTtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCB9KTtcbiAgICBsZXQgY29udHJvbGxlciA9IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW25vZGVJZF07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCwgbm9kZUlkIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJCdWNrZXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5saXN0QnVja2V0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCBvbiBhIHNlcnZlciAocm91dGluZyBjb25maWcgaW5jbHVkZWQpLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGlzIHVuYXZhaWxhYmxlLiBDaGVhcCAtIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHNlcnZlcidzIGRpc2sgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGF0IGJ1Y2tldCBpcyBsb2FkZWQgdGhlcmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyQWN0aXZlQnVja2V0KGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5nZXRBY3RpdmVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogVGhlIGJ1Y2tldHMgYSBzZXJ2ZXIgY3VycmVudGx5IGhhcyBsb2FkZWQuIEFkbWluIG9ubHksIHNvIGluIHByYWN0aWNlIHRoaXMgaXMgb3VyIG93biBtYWNoaW5lJ3Mgb3RoZXIgcHJvY2VzcyAtIGEgZGVwbG95IHN1Y2Nlc3NvciBhc2tpbmcgaXRzIHByZWRlY2Vzc29yIHdoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzKGNvbmZpZzogeyB1cmw6IHN0cmluZyB9KTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5hZG1pbkxpc3RBY3RpdmVCdWNrZXRzKCkpO1xufVxuXG4vKiogVGVsbHMgYSBzZXJ2ZXIgdG8gbG9hZCBvbmUgb2YgaXRzIGJ1Y2tldHMgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIE9ubHkgdG91Y2hlcyB0aGF0IHNlcnZlciAtIG5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgbm8gb3RoZXIgc291cmNlIGlzIGNvbnRhY3RlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVNlcnZlckJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWN0aXZhdGVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RTZXJ2ZXJCdWNrZXRzIHJlcG9ydHMsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2ZXJXcml0ZVN0YXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmNsZWFyV3JpdGVTdGF0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBvcGVyYXRpb24tbG9nIGZpbGVzIE9ORSBzdG9yYWdlIHNlcnZlciBob2xkcyAoZXZlcnkgc2VydmVyIGxvZ3Mgb25seSBpdHMgb3duIG9wZXJhdGlvbnMgLSBzZWUgbGlzdEFsbFNlcnZlckxvZ0ZpbGVzIGZvciB0aGUgd2hvbGUgZmxlZXQpLiBUaGUgbmFtZXMgY2FycnkgcGlkL3RocmVhZC90aW1lLXJhbmdlL2VudHJ5LWNvdW50IG1ldGFkYXRhOyBzZWUgTG9nRmlsZUluZm8uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZlckxvZ0ZpbGVzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPExvZ0ZpbGVJbmZvW10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIubGlzdExvZ0ZpbGVzKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQgfSkpO1xufVxuXG4vKiogRXZlcnkgc2VydmVyJ3MgbG9nIGZpbGVzIGF0IG9uY2UsIG9uZSBlbnRyeSBwZXIgdXJsIC0gYSBzZXJ2ZXIgdGhhdCBjYW5ub3QgYW5zd2VyIHJlcG9ydHMgaXRzIGVycm9yIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcmVzdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWxsU2VydmVyTG9nRmlsZXMoY29uZmlnOiB7IHVybHM6IHN0cmluZ1tdOyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyB1cmw6IHN0cmluZzsgZmlsZXM/OiBMb2dGaWxlSW5mb1tdOyBlcnJvcj86IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoY29uZmlnLnVybHMubWFwKGFzeW5jIHVybCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyB1cmwsIGZpbGVzOiBhd2FpdCBsaXN0U2VydmVyTG9nRmlsZXMoeyB1cmwsIGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVybCwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkgfTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIERvd25sb2FkcyB0aGUgbmFtZWQgbG9nIGZpbGVzIG9mZiBvbmUgc2VydmVyIGFuZCBkZWNvZGVzIHRoZW0gaW50byB0aGUgbG9nZ2VkIG9iamVjdHMgKHRoZSB3aXJlIGFsd2F5cyBjYXJyaWVzIHRoZW0gTFo0LWNvbXByZXNzZWQgLSBsaXZlIGZpbGVzIGFyZSBjb21wcmVzc2VkIGluIG1lbW9yeSBzZXJ2ZXItc2lkZSkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyTG9ncyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgbmFtZXM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBlbnRyaWVzOiB1bmtub3duW10gfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgYXN5bmMgY29udHJvbGxlciA9PiB7XG4gICAgICAgIGxldCByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGNvbmZpZy5uYW1lcykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb250cm9sbGVyLmdldExvZ0ZpbGUoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbmFtZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IG5hbWUsIGVudHJpZXM6IGRlY29kZUxvZ0ZpbGUoQnVmZmVyLmZyb20oZGF0YSkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xufVxuXG4vKiogZ2V0U2VydmVyTG9ncywgYnV0IFNFQVJDSEVEIGluc3RlYWQgb2YgZnVsbHkgZGVjb2RlZDogdGhlIHJhdyBKU09OIHRleHQgaXMgc3Vic3RyaW5nLW1hdGNoZWQgKGV2ZXJ5IHNlYXJjaCBzdHJpbmcgbXVzdCBhcHBlYXIgaW4gYSBzdGF0ZW1lbnQgLSBzZWUgY3JlYXRlTG9nU2VhcmNoZXIpLCBhbmQgb25seSB0aGUgbWF0Y2hpbmcgc3RhdGVtZW50cyBhcmUgZGVjb2RlZCBpbnRvIG9iamVjdHMuIEZhciBjaGVhcGVyIHRoYW4gZGVjb2Rpbmcgd2hvbGUgZmlsZXMgdG8gbG9vayBmb3Igb25lIHBhdGggb3IgY2FsbGVyLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaFNlcnZlckxvZ3MoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IG5hbWVzOiBzdHJpbmdbXTsgc2VhcmNoZXM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBlbnRyaWVzOiB1bmtub3duW10gfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgYXN5bmMgY29udHJvbGxlciA9PiB7XG4gICAgICAgIGxldCByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGNvbmZpZy5uYW1lcykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb250cm9sbGVyLmdldExvZ0ZpbGUoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbmFtZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IG5hbWUsIGVudHJpZXM6IGNyZWF0ZUxvZ1NlYXJjaGVyKEJ1ZmZlci5mcm9tKGRhdGEpKShjb25maWcuc2VhcmNoZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0SW5mbyhjb25maWc6IHsgdXJsOiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAvLyBnZXRDb25maWcgaXMgYnVja2V0LWxldmVsIChubyBzdG9yZSBzZWxlY3Rpb24pLCBzbyB0aGUgZmFicmljYXRlZCBzb3VyY2VDb25maWcgbmV2ZXIgaGFzIHRvIG1hdGNoIGFueXRoaW5nXG4gICAgbGV0IHJlbW90ZSA9IG5ldyBBcmNoaXZlc1JlbW90ZSh7IHVybDogY29uZmlnLnVybCwgd2FpdEZvckFjY2VzczogZmFsc2UsIHNvdXJjZUNvbmZpZzogbm9ybWFsaXplU291cmNlKGNvbmZpZy51cmwpIH0pO1xuICAgIHJldHVybiBhd2FpdCByZW1vdGUuZ2V0Q29uZmlnKCk7XG59XG4iXX0=
|
|
906
|
-
/* _JS_SOURCE_HASH = "
|
|
905
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBa0U7QUFDbEUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixzREFBb0Q7QUFDcEQsaURBSXdCO0FBQ3hCLCtDQUE0QztBQUM1QyxtRUFBZ0U7QUFDaEUscURBQXdGO0FBRXhGLDJEQUF5RjtBQUV6RixpREFBK0Q7QUFDL0Qsb0RBQWlGO0FBQ2pGLGtFQUEyRjtBQUUzRix5UUFBeVE7QUFDelEsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQyxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdELHFOQUFxTjtBQUNyTiwrQ0FBcUY7QUFBNUUsOEdBQUEs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QVNDO0FBRUQsOFNBQThTO0FBQ3ZTLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxNQUE2RTtJQUNoSCxPQUFPLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFDLFVBQVUsRUFBQyxFQUFFO1FBQ25ELElBQUksT0FBTyxHQUEyQyxFQUFFLENBQUM7UUFDekQsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsSUFBSSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFBLGlDQUFpQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFURCw0Q0FTQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBdUI7SUFDdkQsNkdBQTZHO0lBQzdHLElBQUksTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RILE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUpELHNDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydCwgd2F0Y2hTbG93UHJvbWlzZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBSZW1vdGVDb25maWcsIFJlbW90ZUNvbmZpZ0Jhc2UsIFNvdXJjZUNvbmZpZyxcbiAgICBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRGVsQ29uZmlnLCBGaW5kQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIE1vdmVGaWxlQ29uZmlnLCBTZXRDb25maWcsIFNldExhcmdlRmlsZUNvbmZpZywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsIExBUkdFX1NFVF9USFJFU0hPTEQsIGJ1ZmZlckNodW5rU3RyZWFtLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIHBhcnNlUm91dGluZ0RhdGEsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLFxuICAgIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplU291cmNlLFxuICAgIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCBwYXJzZVZhcmlhYmxlUm91dGUsIGdldEJ1Y2tldEJhc2VVcmwsIGJ1aWxkRmlsZVVybCxcbn0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlLCBwYXJzZVN0b3JhZ2VVcmwsIGF1dGhlbnRpY2F0ZVN0b3JhZ2UgfSBmcm9tIFwiLi9BcmNoaXZlc1JlbW90ZVwiO1xuaW1wb3J0IHsgU2VydmVyQnVja2V0SW5mbywgQWN0aXZlQnVja2V0SW5mbyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcbmltcG9ydCB7IENoYWluU3RhdGUsIENoYWluU3RhdGVNYW5hZ2VyIH0gZnJvbSBcIi4vY2hhaW5TdGFydHVwXCI7XG5pbXBvcnQgeyBMb2dGaWxlSW5mbywgZGVjb2RlTG9nRmlsZSwgY3JlYXRlTG9nU2VhcmNoZXIgfSBmcm9tIFwiLi4vU3RyZWFtaW5nTG9nc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZSwgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5cbi8vIEhvdyBtYW55IGV4dHJhIGZ1bGwgcGFzc2VzIG92ZXIgdGhlIHNvdXJjZXMgZmFsbGJhY2sgZGlzcGF0Y2ggbWFrZXMgd2hlbiBFVkVSWSBzb3VyY2UgaW4gYSBwYXNzIGZhaWxlZCwgYmVmb3JlIHRoZSBvcGVyYXRpb24gdGhyb3dzIChzZWUgR2V0Q29uZmlnLnJldHJpZXMpIC0gbW9zdCByZXF1ZXN0cyBzaG91bGRuJ3QgZmFpbCBhdCBhbGwsIHNvIGEgY291cGxlIG9mIGJsYW5rZXQgcmV0cmllcyBidXlzIGF2YWlsYWJpbGl0eSBmb3IgYWxtb3N0IG5vdGhpbmdcbmNvbnN0IERFRkFVTFRfRkFMTEJBQ0tfUkVUUklFUyA9IDM7XG5jb25zdCBGQUxMQkFDS19SRVRSWV9ERUxBWSA9IDIgKiAxMDAwO1xuY29uc3QgV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVyA9IDMwICogMTAwMDtcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IENPTkZJR19SRUZSRVNIX1RIUk9UVExFID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9USU1FT1VUID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9ERUxBWSA9IDIgKiAxMDAwO1xuY29uc3QgQ09WRVJJTkdfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX0RFTEFZID0gNSAqIDEwMDA7XG4vLyBTbWFydCB0aW1lb3V0czogYW4gYXR0ZW1wdCBnZXRzIHRoaXMgbG9uZyB0byBwcm9kdWNlIGFueXRoaW5nIGJlZm9yZSB3ZSBwcm9iZSBnZXRJbmZvIGZvciB0aGUgZmlsZSdzIHNpemUgKGFuZCB0aGUgcHJvYmUgaXRzZWxmIGdldHMgdGhlIHNhbWUgd2luZG93KVxuY29uc3QgU01BUlRfVElNRU9VVF9QUk9CRSA9IDYwICogMTAwMDtcbi8vIFZlcnkgZ2VuZXJvdXMgYXNzdW1lZCB0cmFuc2ZlciByYXRlcyAtIHRoZSByZXN1bHRpbmcgZGVhZGxpbmUgZXhpc3RzIHRvIGNhdGNoIHN0dWNrIHNvdXJjZXMsIG5vdCBzbG93IG9uZXNcbmNvbnN0IFNNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORCA9IDEwMjQgKiAxMDI0O1xuY29uc3QgU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCA9IDUxMiAqIDEwMjQ7XG4vLyBNYXJrZXIgaW4gc21hcnQtdGltZW91dCBlcnJvcnMsIHNvIHRoZSByZWFkIGxvb3AgY2FuIGxvZyB0aGVtIGFuZCBjb250aW51ZSB3aXRoIHRoZSBvdGhlciBzb3VyY2VzIChhIGNvbm5lY3RlZCBzb3VyY2UncyBvdGhlciBlcnJvcnMgc3RpbGwgdGhyb3cpXG5jb25zdCBTTUFSVF9USU1FT1VUX01BUktFUiA9IFwiQVJDSElWRVNfU01BUlRfVElNRU9VVF9jNDFhOWRcIjtcblxuLy8gU2l6ZXMgYSBnZW5lcm91cyBwZXItYXR0ZW1wdCBkZWFkbGluZS4gR2V0LXN0eWxlIGNhbGxzIHBhc3MgcGF0aDogdGhlIHNpemUgaXMgb25seSBmZXRjaGVkICh2aWEgZ2V0SW5mbykgd2hlbiB0aGUgY2FsbCB0dXJucyBvdXQgdG8gYmUgc2xvdy4gU2V0LXN0eWxlIGNhbGxzIHBhc3MgdXBsb2FkQnl0ZXMsIHdoaWNoIHRoZXkgYWxyZWFkeSBrbm93LlxudHlwZSBTbWFydFRpbWVvdXQgPSB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICB1cGxvYWRCeXRlcz86IG51bWJlcjtcbiAgICAvLyBOYW1lcyB0aGUgb3BlcmF0aW9uIGluIHRpbWVvdXQgZXJyb3JzIC0gd2l0aG91dCBpdCBhIGRlbGV0aW9uIChhIHRvbWJzdG9uZSB3cml0ZSwgdXBsb2FkQnl0ZXMgMCkgcmVhZHMgYXMgXCJVcGxvYWQgb2YgMCBieXRlc1wiLCB3aGljaCBsb29rcyBsaWtlIGEgYnVnIHJhdGhlciB0aGFuIGEgZGVsZXRlXG4gICAgbGFiZWw/OiBzdHJpbmc7XG59O1xuXG4vKiogVGhlIGFkZHJlc3MsIHBvcnQsIGFjY291bnQsIGFuZCBidWNrZXQgbmFtZSBhIGJ1Y2tldCByb3V0aW5nIFVSTCBhZGRyZXNzZXMuIFRocm93cyB3aGVuIHRoZSBVUkwgaXNuJ3QgYSBob3N0ZWQgYnVja2V0IHJvdXRpbmcgVVJMIChodHRwczovL2hvc3Q6cG9ydC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uKS4gKi9cbmV4cG9ydCB7IHBhcnNlSG9zdGVkVXJsLCBwYXJzZUJhY2tibGF6ZVVybCwgZ2V0QnVja2V0QmFzZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vKiogQSBjbGllbnQgZm9yIE9ORSBzb3VyY2UgLSBzZWUgc3RvcmVTb3VyY2VzLnRzLiBSZS1leHBvcnRlZCBoZXJlIGJlY2F1c2UgYSBjaGFpbiBpcyBidWlsdCBvdXQgb2YgdGhlbS4gKi9cbmV4cG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzIH0gZnJvbSBcIi4vc3RvcmVTb3VyY2VzXCI7XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzQ2hhaW5PcHRpb25zID0ge1xuICAgIC8qKiBPdXRzaWRlIG9mIG5vZGUgd2UgZGVmYXVsdCB0byByZWFkLW9ubHkgZG93bmxvYWRzIG92ZXIgdGhlIHB1YmxpYyBVUkxzIChubyBBUEkgY29ubmVjdGlvbikgd2hlbiB0aGUgY29uZmlnIGhhcyBwdWJsaWMgc291cmNlcy4gU2V0IHRoaXMgdG8gY29ubmVjdCB0byB0aGUgQVBJIGFueXdheSAtIG5lZWRlZCBmb3Igd3JpdGluZywgbGlzdGluZywgYW5kIGFueSBvdGhlciBvcGVyYXRpb24gdGhlIHBsYWluIFVSTCBmb3JtIGNhbm5vdCBzZXJ2ZS4gKi9cbiAgICBkaXJlY3RDb25uZWN0PzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnOiBTb3VyY2VDb25maWcpOiBib29sZWFuIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gY29uZmlnLnZhbGlkV2luZG93O1xuICAgIHJldHVybiBzdGFydCA8PSBub3cgJiYgbm93IDwgZW5kO1xufVxuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZVNoYXJkS2V5KGtleTogc3RyaW5nLCB0YXJnZXQ6IFNvdXJjZVdyYXBwZXIpOiBzdHJpbmcge1xuICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0YXJnZXQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGtleS5yZXBsYWNlKFZBUklBQkxFX1NIQVJELCBWQVJJQUJMRV9TSEFSRCArIFwiX1wiICsgKHN0YXJ0ICsgTWF0aC5yYW5kb20oKSAqIChlbmQgLSBzdGFydCkpKTtcbn1cblxuLyoqIENvdmVycyB0aGUgd2hvbGUga2V5IHNwYWNlIHdpdGggdGhlIEFVVEhPUklUQVRJVkUgc291cmNlczogZm9yIGVhY2ggdW5jb3ZlcmVkIHBvaW50LCB0aGUgRklSU1Qgc291cmNlIGluIGNvbmZpZyBvcmRlciB3aG9zZSByb3V0ZSBjb250YWlucyBpdCAtIHRoZSBleGFjdCBzZWxlY3Rpb24gZXZlcnkgcmVhZCBhbmQgd3JpdGUgdXNlcywgc28gbGlzdGluZ3MgY29tZSBmcm9tIHRoZSBzYW1lIG5vZGVzIHdyaXRlcyB3ZW50IHRvIChyZWFkLXlvdXItd3JpdGVzKS4gTmV2ZXIgXCJmZXdlc3RcIiBvciBcIndpZGVzdFwiOiBwcmVmZXJyaW5nIGEgd2lkZSByZWFkIHJlcGxpY2Egb3ZlciB0aGUgcm91dGVkIHdyaXRlIHNoYXJkcyB3b3VsZCBzZXJ2ZSBsaXN0aW5ncyBmcm9tIGEgbm9kZSB0aGF0IG9ubHkgaGFzIHRoZSBkYXRhIHNlY29uZC1oYW5kLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjYW5kaWRhdGVzIGxlYXZlIGEgZ2FwLiAqL1xuZnVuY3Rpb24gY292ZXJSb3V0ZXMoY2FuZGlkYXRlczogU291cmNlV3JhcHBlcltdKTogU291cmNlV3JhcHBlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2hvc2VuOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgd2hpbGUgKGNvdmVyZWQgPCAxKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2FuZGlkYXRlcy5maW5kKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY292ZXJlZCkpO1xuICAgICAgICBpZiAoIW5leHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNob3Nlbi5wdXNoKG5leHQpO1xuICAgICAgICBsZXQgWywgZW5kXSA9IG5leHQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgIGNvdmVyZWQgPSBlbmQ7XG4gICAgfVxuICAgIHJldHVybiBjaG9zZW47XG59XG5cbi8qKiBSRUFEUyBPTkxZLiBEcm9wcyBzb3VyY2VzIHRoYXQgcmVjZW50bHkgZmFpbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZCAtIHVubGVzcyB0aGF0IHdvdWxkIGxlYXZlIG5vdGhpbmcsIGluIHdoaWNoIGNhc2UgYSBkb3duIHNvdXJjZSBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBubyBzb3VyY2UsIGFuZCB3ZSByZXRyeSBpdCBpbW1lZGlhdGVseS4gTmV2ZXIgYXBwbGllcyB0byB3cml0ZXMgKG9yIG5vRmFsbGJhY2tzIHJlYWRzIG9mIHRoZSB3cml0ZSB0YXJnZXQpOiB0aGUgd3JpdGUgbm9kZSBpcyBzdHJpY3RseSB0aGUgRklSU1Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCByZWdhcmRsZXNzIG9mIGNvbm5lY3Rpdml0eSAtIGEgY2xpZW50J3MgZmxha3kgdmlldyBvZiB0aGUgbmV0d29yayBtdXN0IG5ldmVyIHNjYXR0ZXIgd3JpdGVzIGFjcm9zcyB0aGUgY2hhaW4gKHNwZWM6IGNsaWVudCB3cml0ZXMgYXJlIGNvbnNpc3RlbnQsIGNsaWVudCByZWFkcyBhcmUgcmVkdW5kYW50KS4gKi9cbmZ1bmN0aW9uIHByZWZlclVzYWJsZShzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgIGxldCB1c2FibGUgPSBzb3VyY2VzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICByZXR1cm4gdXNhYmxlLmxlbmd0aCAmJiB1c2FibGUgfHwgc291cmNlcztcbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQ2hhaW4gaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIC8vIFRoZSBjaGFpbidzIHN0YXRlLCBhbmQgZXZlcnl0aGluZyBhYm91dCBoYXZpbmcgb25lIChpbml0ICsgaXRzIHJldHJ5LCBjb25maWcgcG9sbGluZy9hZG9wdGlvbiwgYXZhaWxhYmlsaXR5IHJlY2hlY2tzLCB0aGUgY29uZmlnIHJld3JpdGUgbG9vcCksIGxpdmVzIGluIHRoZSBtYW5hZ2VyIC0gd2hhdCBzdGF5cyBpbiB0aGlzIGNsYXNzIGlzIGRpc3BhdGNoIG92ZXIgdGhhdCBzdGF0ZVxuICAgIHByaXZhdGUgc3RhdGU6IENoYWluU3RhdGVNYW5hZ2VyO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBDaGFpblN0YXRlTWFuYWdlcih7XG4gICAgICAgICAgICBjb25maWd1cmVkOiBub3JtYWxpemVSZW1vdGVDb25maWcoY29uZmlnKSxcbiAgICAgICAgICAgIGRlYnVnTmFtZTogKCkgPT4gdGhpcy5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgIGRpcmVjdENvbm5lY3Q6IG9wdGlvbnM/LmRpcmVjdENvbm5lY3QsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIGxldCB1cmxzID0gdGhpcy5zdGF0ZS5hY3RpdmVDb25maWcuc291cmNlcy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICh4IGFzIFNvdXJjZUNvbmZpZykudXJsKTtcbiAgICAgICAgcmV0dXJuIGBjaGFpbiAke3VybHMuam9pbihcIiwgXCIpfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIE9ORSBkaXNwYXRjaCBmb3IgZXZlcnkgb3BlcmF0aW9uOiBubyBmYWxsYmFja3MgKGFsbCB3cml0ZXMgYnkgZGVmYXVsdCwgYW5kIG5vRmFsbGJhY2tzIHJlYWRzKSAtPiB0aGUgcHJpbWFyeSBub2RlIG9ubHksIHZpYSBydW5QcmltYXJ5OyBldmVyeXRoaW5nIGVsc2UgLT4gdGhlIHNoYXJlZCBmYWxsYmFjayBsb29wLCB0cnlpbmcgc291cmNlcyBpbiBjb25maWcgb3JkZXIgKG9yIGxhdGVuY3kgb3JkZXIgZm9yIGZhc3QgcmVhZHMpIGFuZCBvbmx5IG1vdmluZyBvbiB3aGVuIG9uZSBmYWlscy4gV3JpdGVzIGluIHRoZSBsb29wIGRpZmZlciBmcm9tIHJlYWRzIG9ubHkgaW4gY2FsbGluZyBzb3VyY2Uud3JpdGUuXG4gICAgcHJpdmF0ZSBhc3luYyBydW48VD4oc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgbm9GYWxsYmFja3M/OiBib29sZWFuOyBmYWxsYmFja3M/OiBib29sZWFuOyByZXRyaWVzPzogbnVtYmVyOyBmYXN0PzogYm9vbGVhbjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoY29uZmlnLmZhc3QgJiYgY29uZmlnLm5vRmFsbGJhY2tzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhc3QgYW5kIG5vRmFsbGJhY2tzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IG5vRmFsbGJhY2tzIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgKHRoZSB3cml0ZSBub2RlKSwgc28gdGhlcmUgaXMgbm8gb3JkZXIgdG8gc3BlZWQgdXBgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLm5vRmFsbGJhY2tzIHx8IGNvbmZpZy53cml0ZSAmJiAhY29uZmlnLmZhbGxiYWNrcykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuUHJpbWFyeShjb25maWcsIHJ1bik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldHJpZXMgPSBjb25maWcucmV0cmllcztcbiAgICAgICAgaWYgKHJldHJpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0cmllcyA9IERFRkFVTFRfRkFMTEJBQ0tfUkVUUklFUztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdUYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWRQYXNzZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzID0gc3RhdGUuc291cmNlcy5maWx0ZXIoc291cmNlID0+XG4gICAgICAgICAgICAgICAgKGNvbmZpZy5yb3V0ZSA9PT0gdW5kZWZpbmVkIHx8IHJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgY29uZmlnLnJvdXRlKSlcbiAgICAgICAgICAgICAgICAmJiBjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpXG4gICAgICAgICAgICAgICAgLy8gQSB3cml0ZS1ibG9ja2VkIHNvdXJjZSAocmVhZC1vbmx5IG1vZGUsIGJhY2tibGF6ZSB3aXRob3V0IGNyZWRlbnRpYWxzKSBjYW4gbmV2ZXIgdGFrZSBhIHdyaXRlLCBzbyBpdCBpcyBub3QgYSBmYWxsYmFjayBjYW5kaWRhdGUgLSBpdHMgdGhyb3cgd291bGQgZW5kIHRoZSBwYXNzIGVhcmx5IChpdCBjb3VudHMgYXMgY29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICYmICEoY29uZmlnLndyaXRlICYmIChzb3VyY2Uud3JpdGVCbG9ja2VkIHx8ICFzb3VyY2UuYXBpKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgb3JkZXJlZCA9IHByZWZlclVzYWJsZShjYW5kaWRhdGVzKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuZmFzdCkge1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4ub3JkZXJlZF07XG4gICAgICAgICAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB3cm9uZ1RhcmdldCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmFwaU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcGkgPSBzb3VyY2UuYXBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH0gaGFzIFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlIHRoaXMgb3BlcmF0aW9uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGFwaSwgc291cmNlLmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KGNvbmZpZy50aW1lb3V0LCBzb3VyY2UsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcud3JpdGUpIHJldHVybiBzb3VyY2Uud3JpdGUoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBzb3VyY2UuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5yZWFkKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgc291cmNlLmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNNQVJUX1RJTUVPVVRfTUFSS0VSKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU291cmNlIHRpbWVkIG91dCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgY29udGludWluZyB3aXRoIHRoZSBuZXh0IHNvdXJjZTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBBIHdyb25nLXdpbmRvdy9yb3V0ZS91bmNvbmZpZ3VyZWQgcmVqZWN0aW9uIG1lYW5zIE9VUiBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzLCBzbyBldmVyeSBzb3VyY2Ugd2UnZCBmYWxsIGJhY2sgdG8gaXMganVkZ2VkIGJ5IHRoZSBzYW1lIHN0YWxlIGNvbmZpZyAtIHJlZnJlc2ggaXQgYW5kIHJlc3RhcnQgdGhlIHBhc3MgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgfHwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX05PVF9DT05GSUdVUkVEKSkgJiYgIXJldHJpZWRXcm9uZ1RhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpICYmIFwid2luZG93XCIgfHwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSAmJiBcInJvdXRlXCIgfHwgXCJ1bmNvbmZpZ3VyZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxsYmFja3MgbWVhbnMgYXZhaWxhYmlsaXR5IGFib3ZlIGV2ZXJ5dGhpbmc6IEFOWSBmYWlsaW5nIHNvdXJjZSAtIGRvd24sIG1pc2NvbmZpZ3VyZWQsIHJlamVjdGluZywgbWlkLXN3aXRjaG92ZXIgLSBpcyBza2lwcGVkIGFuZCB0aGUgbmV4dCBjb3ZlcmluZyBzb3VyY2UgdGFrZXMgdGhlIGNhbGwuIE9ubHkgZXZlcnkgc291cmNlIGZhaWxpbmcgdGhyb3dzIChiZWxvdykuIFdpdGhvdXQgZmFsbGJhY2tzLCBhIENPTk5FQ1RFRCBzb3VyY2UncyBlcnJvciBpcyBhIHJlYWwgYW5zd2VyIGFuZCB0aHJvd3MuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTb3VyY2UgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBmYWxsaW5nIGJhY2sgdG8gdGhlIG5leHQgc291cmNlOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5pc0Nvbm5lY3RlZCgpKSBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdyb25nVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCbGFua2V0IHJldHJ5IG9mIHRoZSB3aG9sZSBwYXNzLCBBTlkgZXJyb3IgKHNlZSBHZXRDb25maWcucmV0cmllcyk6IG1vc3QgcmVxdWVzdHMgc2hvdWxkbid0IGZhaWwgYXQgYWxsLCBzbyByZXRyeWluZyB0aGUgcmFyZSBmYWlsdXJlIC0gd2hhdGV2ZXIgaXQgd2FzIC0gYnV5cyBhdmFpbGFiaWxpdHkgZm9yIGFsbW9zdCBub3RoaW5nXG4gICAgICAgICAgICBpZiAocmV0cmllZFBhc3NlcyA8IHJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICByZXRyaWVkUGFzc2VzKys7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBFdmVyeSBzb3VyY2UgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifTsgcmV0cnlpbmcgdGhlIHdob2xlIHBhc3MgaW4gJHtGQUxMQkFDS19SRVRSWV9ERUxBWSAvIDEwMDB9cyAocmV0cnkgJHtyZXRyaWVkUGFzc2VzfSBvZiAke3JldHJpZXN9KWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KEZBTExCQUNLX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxsIHNvdXJjZXMgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifSAoYWZ0ZXIgJHtyZXRyaWVkUGFzc2VzfSByZXRyJHtyZXRyaWVkUGFzc2VzID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9KTogJHtlcnJvcnMuam9pbihcIiB8IFwiKSB8fCBcIm5vIHNvdXJjZXMgYXZhaWxhYmxlXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXcml0ZXMgYW5kIG5vRmFsbGJhY2tzIHJlYWRzIGFyZSB0aGUgc2FtZSBjYXNlOiB0YWtlIHRoZSBhdXRob3JpdGF0aXZlIG5vZGUgLSBzdHJpY3RseSB0aGUgZmlyc3Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCB3aGV0aGVyIGl0IGlzIHVwIG9yIGRvd24gLSBhbmQgdXNlIGl0LCBuZXZlciBmYWxsaW5nIGJhY2sgdG8gYW5vdGhlciBub2RlLiBJdCdzIGltcG9ydGFudCB0aGF0IHdyaXRpbmcgYWx3YXlzIGFjY2Vzc2VzIHRoZSBzYW1lIG5vZGUgZXZlcnl3aGVyZSwgZXZlbiBpZiB0aGF0IG5vZGUgaXMgZG93biAtIG90aGVyd2lzZSB3ZSdyZSBqdXN0IHdyaXRpbmcgaW50byB0aGUgdm9pZCwgYW5kIHdobyBrbm93cyBpZiB0aGUgd3JpdGVzIHdpbGwgZXZlbiBiZSBhY2NlcHRlZCwgb3IgY2xvYmJlcmVkLCBvciB3aGF0OyBhbmQgbm9GYWxsYmFja3MgcmVhZHMgd2FudCB0aGUgc2FtZSBub2RlIHByZWNpc2VseSBiZWNhdXNlIGl0IGlzIHRoZSBvbmUgd3JpdGVzIHRhcmdldC4gQSBzbG93IGNhbGwgaXMgYWxtb3N0IGFsd2F5cyBiZXR0ZXIgdGhhbiB0aHJvd2luZywgc28gYSBmYWlsaW5nIHByaW1hcnkgaXMgcmV0cmllZCAodGhlIFNBTUUgbm9kZSwgcmUtcmVzb2x2ZWQgZWFjaCBhdHRlbXB0IHNpbmNlIGEgY29uZmlnIHJlZnJlc2ggY2FuIGNoYW5nZSB3aGljaCBzb3VyY2UgaXMgcHJpbWFyeSkgdW50aWwgdGhlIGRlYWRsaW5lLCB0aGVuIHRocm93cy5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blByaW1hcnk8VD4oY29uZmlnOiB7IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1dpbmRvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nUm91dGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWROb3RDb25maWd1cmVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBQUklNQVJZX1JFVFJZX1RJTUVPVVQ7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgIGxldCBhdHRlbXB0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsaWQgc291cmNlIGNvdmVycyB0aGlzIHJlcXVlc3QuIE5vIHNvdXJjZSBpcyB0aGUgJHtjb25maWcud3JpdGUgJiYgXCJ3cml0ZSB0YXJnZXRcIiB8fCBcInByaW1hcnkgcmVhZCBzb3VyY2VcIn0gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9IChldmVyeSBzb3VyY2UgaXMgb3V0c2lkZSBpdHMgdmFsaWQgd2luZG93IG9yIG91dHNpZGUgdGhlIGtleSdzIHJvdXRlKWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5ID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KGNvbmZpZy50aW1lb3V0LCBwcmltYXJ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcud3JpdGUpIHJldHVybiBwcmltYXJ5LndyaXRlKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgcHJpbWFyeS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmltYXJ5LnJlYWQoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBwcmltYXJ5LmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpICYmICFyZXRyaWVkV3JvbmdXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJ3aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSAmJiAhcmV0cmllZFdyb25nUm91dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nUm91dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcInJvdXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQ09ORklHVVJFRCkgJiYgIXJldHJpZWROb3RDb25maWd1cmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWROb3RDb25maWd1cmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJ1bmNvbmZpZ3VyZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICYmICF0YXJnZXQuaXNDb25uZWN0ZWQoKSkgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcud3JpdGUgJiYgdGFyZ2V0ICYmIChhdHRlbXB0ID09PSAxIHx8IGF0dGVtcHQgJSAzID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdlIHRyeSB0aGUgSFRUUCByZXF1ZXN0OiBodHRwc1JlcXVlc3QgaGFzIGJldHRlciBETlMgcmV0cnlpbmcgY2FwYWJpbGl0aWVzIHRoYW4gb3VyIFdlYlNvY2tldCBzZXJ2ZXIgKHdlIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgaXQpLCBzbyBqdXN0IHVzaW5nIGl0IGNhbiBmaXggc29tZSBETlMgaXNzdWVzLCB3aGljaCBjYW4gcHJvcGFnYXRlIHRvIGZpeCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIEl0IGlzIHN0aWxsIHRoZSBwcmltYXJ5IHNvdXJjZSdzIG93biBkYXRhLCBzbyB0aGUgbm8tZmFsbGJhY2sgc2VtYW50aWNzIGhvbGQgLSBhbmQgQXJjaGl2ZXNVcmwgaGFzIG5vIHNldHVwIGNvc3QsIHNvIG1ha2luZyBvbmUgb24gdGhlIHNwb3QgaXMgZmluZS5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGFyZ2V0LnVybCB8fCBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybCh0YXJnZXQuY29uZmlnLnVybCkpLCB0YXJnZXQuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IHRoZSBwcmltYXJ5J3MgZXJyb3IgKHRocm93biBhdCB0aGUgZGVhZGxpbmUpIGlzIHRoZSByZWFsIG9uZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXQgbW9zdCBvbmUgYXR0ZW1wdCBwZXIgaW50ZXJ2YWwsIGluIGNhc2UgdGhlIGZhaWx1cmUgaXMgZmFzdFxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5tYXgoMCwgYXR0ZW1wdFN0YXJ0ICsgUFJJTUFSWV9SRVRSWV9ERUxBWSAtIERhdGUubm93KCkpKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJhY2VzIGNhbGwgYWdhaW5zdCBhIHNpemUtYmFzZWQgZGVhZGxpbmUuIFVwbG9hZHMga25vdyB0aGVpciBzaXplIHVwZnJvbnQ7IGdldHMgYXJlIGdpdmVuIFNNQVJUX1RJTUVPVVRfUFJPQkUgdG8gcHJvZHVjZSBhbnl0aGluZywgYW5kIG9ubHkgdGhlbiBpcyB0aGUgZmlsZSdzIGluZm8gZmV0Y2hlZCAoZnJvbSB0aGUgc2FtZSBzb3VyY2UsIGl0c2VsZiB0aW1lLWxpbWl0ZWQpIHRvIHNpemUgdGhlIGRlYWRsaW5lIC0gbWVhc3VyZWQgZnJvbSB0aGUgY2FsbCdzIHN0YXJ0LCBzbyBhIHNvdXJjZSB0aGF0IHdhcyBzbG93IGJlZm9yZSB0aGUgcHJvYmUgZG9lc24ndCBnZXQgdGhlIGZ1bGwgYWxsb3dhbmNlIGFnYWluLiBUaW1lZC1vdXQgY2FsbHMga2VlcCBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kICh0aGV5IGNhbm5vdCBiZSBjYW5jZWxsZWQpIGJ1dCB0aGVpciBldmVudHVhbCByZXN1bHQgaXMgaWdub3JlZC4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGFwcGx5U21hcnRUaW1lb3V0PFQ+KHRpbWVvdXQ6IFNtYXJ0VGltZW91dCB8IHVuZGVmaW5lZCwgc291cmNlOiBTb3VyY2VXcmFwcGVyLCBjYWxsOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghdGltZW91dCkgcmV0dXJuIGF3YWl0IGNhbGwoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNhbGxQcm9taXNlID0gY2FsbCgpO1xuICAgICAgICAvLyBBbiBhYmFuZG9uZWQgY2FsbCBtdXN0IG5vdCBzdXJmYWNlIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gd2hlbiBpdCBldmVudHVhbGx5IGZhaWxzXG4gICAgICAgIGxldCBhYmFuZG9uID0gKCkgPT4gdm9pZCBjYWxsUHJvbWlzZS50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgaWYgKHRpbWVvdXQudXBsb2FkQnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gQSBmbGF0IGJhc2UgcGx1cyB0aGUgcHJlZGljdGVkIHRyYW5zZmVyIHRpbWUsIHNvIHRpbnkgdXBsb2FkcyBzdGlsbCBnZXQgdGhlIGZ1bGwgYmFzZSB3aW5kb3dcbiAgICAgICAgICAgIGxldCBhbGxvd2VkID0gU01BUlRfVElNRU9VVF9QUk9CRSArIHRpbWVvdXQudXBsb2FkQnl0ZXMgLyBTTUFSVF9USU1FT1VUX1VQTE9BRF9CWVRFU19QRVJfU0VDT05EICogMTAwMDtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShhbGxvd2VkKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICBhYmFuZG9uKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFVwbG9hZCB0aW1lZCBvdXQuICR7dGltZW91dC5sYWJlbCB8fCBgVXBsb2FkIG9mICR7dGltZW91dC51cGxvYWRCeXRlc30gYnl0ZXNgfSB0byAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0IGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIChhbGxvd2VkICR7TWF0aC5yb3VuZChhbGxvd2VkKX1tczogJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGJhc2UgcGx1cyB0cmFuc2ZlciBhdCBhbiBhc3N1bWVkICR7U01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORH0gYnl0ZXMvcylgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoID0gdGltZW91dC5wYXRoO1xuICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXdhaXQgY2FsbFByb21pc2U7XG4gICAgICAgIGxldCBmaXJzdCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKV0pO1xuICAgICAgICBpZiAoZmlyc3QpIHJldHVybiBmaXJzdC52YWx1ZTtcbiAgICAgICAgbGV0IHByb2JlRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGluZm86IHsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRJbmZvKHBhdGgpKS50aGVuKHggPT4gKHsgc2l6ZTogeCAmJiB4LnNpemUgfHwgMCB9KSksXG4gICAgICAgICAgICAgICAgZGVsYXkoU01BUlRfVElNRU9VVF9QUk9CRSkudGhlbigoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHByb2JlRXJyb3IgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBSZWFkIHRpbWVkIG91dCB3aXRoIG5vIHNpemUgcHJvYmUuIFJlYWQgb2YgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX06IG5vIHJlc3VsdCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcywgYW5kIGdldEluZm8gJHtwcm9iZUVycm9yICYmIGBmYWlsZWQgKCR7cHJvYmVFcnJvcn0pYCB8fCBgY291bGQgbm90IGFuc3dlciB3aXRoaW4gJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGVpdGhlcmB9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChTTUFSVF9USU1FT1VUX1BST0JFLCBpbmZvLnNpemUgLyBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgKiAxMDAwKTtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IHN0YXJ0ICsgYWxsb3dlZCAtIERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBsZXQgc2Vjb25kID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkocmVtYWluaW5nKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChzZWNvbmQpIHJldHVybiBzZWNvbmQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFJlYWQgdGltZWQgb3V0LiBSZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9ICgke2luZm8uc2l6ZX0gYnl0ZXMpIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXMgZnJvbSB0aGUgY2FsbCdzIHN0YXJ0LCBhdCBhbiBhc3N1bWVkICR7U01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EfSBieXRlcy9zKWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGFzdENvbmZpZ1JlZnJlc2ggPSAwO1xuICAgIHByaXZhdGUgYXN5bmMgcHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGU6IENoYWluU3RhdGUsIGtpbmQ6IFwid2luZG93XCIgfCBcInJvdXRlXCIgfCBcInVuY29uZmlndXJlZFwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChraW5kID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBuZWFyQm91bmRhcnkgPSBzdGF0ZS5zb3VyY2VzLnNvbWUoc291cmNlID0+IHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3cuc29tZSh0ID0+IHQgPiAwICYmIHQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBNYXRoLmFicyh0IC0gbm93KSA8PSBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XKSk7XG4gICAgICAgICAgICBpZiAobmVhckJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHJhY2VkIGEgdmFsaWQgd2luZG93IGJvdW5kYXJ5OyB3YWl0aW5nICR7V1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZIC8gMTAwMH1zIGFuZCByZXRyeWluZ2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0Q29uZmlnUmVmcmVzaCA8IENPTkZJR19SRUZSRVNIX1RIUk9UVExFKSByZXR1cm47XG4gICAgICAgIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgcmVhc29uID0ga2luZCA9PT0gXCJ3aW5kb3dcIiAmJiBcIndyb25nIHZhbGlkIHdpbmRvd1wiIHx8IGtpbmQgPT09IFwicm91dGVcIiAmJiBcIndyb25nIHJvdXRlXCIgfHwgXCJ0aGUgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZW50cnkgb24gdGhhdCBzZXJ2ZXJcIjtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKCR7cmVhc29ufSk6IG91ciBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIChsaWtlbHkgc3RhbGUsIG9yIGEgZGVwbG95IHN3aXRjaG92ZXIpOyByZWZyZXNoaW5nIGl0IGFuZCByZXRyeWluZ2ApO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlZnJlc2hBY3RpdmVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcXVlc3Q8VD4oY29uZmlnOiB7IGFwaU9ubHk/OiBib29sZWFuOyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyBub0ZhbGxiYWNrcz86IGJvb2xlYW47IGZhbGxiYWNrcz86IGJvb2xlYW47IHJldHJpZXM/OiBudW1iZXI7IGZhc3Q/OiBib29sZWFuOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKHN0YXRlLCBjb25maWcsIHJ1bik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdhaXRpbmdGb3JBY2Nlc3MoKTogUHJvbWlzZTx7IGxpbms6IHN0cmluZzsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBBIHNvdXJjZSB3aG9zZSB3aW5kb3cgaGFzIHBhc3NlZCBpcyBuZXZlciByZWFkIG9yIHdyaXR0ZW4gYWdhaW4sIHNvIGl0cyBhY2Nlc3Mgc3RhdGUgaXMgaXJyZWxldmFudCAtIGFuZCBhc2tpbmcgYSBkZWFkIGludGVybWVkaWF0ZSB3b3VsZCBqdXN0IGhhbmcgb3IgdGhyb3cuIEZ1dHVyZSB3aW5kb3dzIERPIG1hdHRlcjogYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIGJlZm9yZSB0aGVpciB3aW5kb3cgc3RhcnRzLlxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3dbMV0gPD0gRGF0ZS5ub3coKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLmFwaSBpbnN0YW5jZW9mIEFyY2hpdmVzUmVtb3RlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCBzb3VyY2UuYXBpLndhaXRpbmdGb3JBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAod2FpdGluZykgcmV0dXJuIHdhaXRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHNvdXJjZXMgdGhhdCBjYW4gc2VydmUgYSBmaWxlIHJpZ2h0IG5vdywgaW4gZGlzcGF0Y2ggb3JkZXIgLSB0aGUgZmlyc3QgaXMgdGhlIHdyaXRlIG5vZGUsIHRoZSBvbmUgYSBwbGFpbiByZWFkIGFza3MgZmlyc3QuIEVhY2ggZW50cnkncyB1cmwgaXMgd2hhdCBHZXRDb25maWcuc291cmNlVXJsIC8gR2V0SW5mb0NvbmZpZy5zb3VyY2VVcmwgYWNjZXB0LCBzbyBsaXN0aW5nIHRoZXNlIGFuZCB0aGVuIHJlYWRpbmcgd2l0aCBzb3VyY2VVcmwgY29tcGFyZXMgdGhlIGNvcGllcyB0aGUgc291cmNlcyBhY3R1YWxseSBob2xkLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRGaWxlU291cmNlcyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VDb25maWdbXT4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgcm91dGUpICYmIGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpKS5tYXAoeCA9PiB4LmNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG9uZSBleGFjdCBzb3VyY2UgYSBzb3VyY2VVcmwgcmVhZCBtZWFucywgbm8gZmFsbGJhY2sgb2YgYW55IGtpbmQgLSBhc2tpbmcgZm9yIGEgU1BFQ0lGSUMgc291cmNlJ3MgY29weSBhbmQgZ2V0dGluZyBhbm90aGVyJ3Mgd291bGQgZGVmZWF0IHRoZSBwb2ludFxuICAgIHByaXZhdGUgYXN5bmMgcnVuT25Tb3VyY2U8VD4oc291cmNlVXJsOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgc291cmNlID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4geC5jb25maWcudXJsID09PSBzb3VyY2VVcmwpO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhlIHVybCAke0pTT04uc3RyaW5naWZ5KHNvdXJjZVVybCl9IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IChzb3VyY2VzOiAke3N0YXRlLnNvdXJjZXMubWFwKHggPT4geC5jb25maWcudXJsKS5qb2luKFwiLCBcIil9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBzb3VyY2UucmVhZChydW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBnZXQyLCBidXQgdHJ5aW5nIHNvdXJjZXMgaW4gbGF0ZW5jeSBvcmRlciAoZmFzdGVzdCBmaXJzdCkgaW5zdGVhZCBvZiBjb25maWcgb3JkZXIuIFdoaWxlIHRoaXMgaXMgbXVjaCBmYXN0ZXIsIGl0IG1pZ2h0IG1pc3MgaW1tZWRpYXRlIHdyaXRlczogdGhlIHdyaXRlIG5vZGUgaXMgbm8gbG9uZ2VyIHRyaWVkIGZpcnN0LCBzbyBhIGxhZ2dpbmcgcmVwbGljYSBtYXkgYW5zd2VyIHdpdGggYSBzbGlnaHRseSBvbGRlciB2YWx1ZS4gRXhjbHVzaXZlIHdpdGggbm9GYWxsYmFja3MgKHdoaWNoIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgLSB0aGUgd3JpdGUgbm9kZSAtIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwKTsgcGFzc2luZyBib3RoIHRocm93cy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmFzdChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgaWYgKGNvbmZpZz8uc291cmNlVXJsKSB7XG4gICAgICAgICAgICAvLyBBIHNwZWNpZmljIHNvdXJjZSBsZWF2ZXMgbm90aGluZyBmb3IgdGhlIGxhdGVuY3kgb3JkZXJpbmcgdG8gZGVjaWRlXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCBmYXN0OiB0cnVlLCB0aW1lb3V0OiB7IHBhdGg6IGZpbGVOYW1lIH0gfSwgYXN5bmMgKGFyY2hpdmVzLCB1cmwpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBpcyBhIHRvbWJzdG9uZSwgbm90IGNvbnRlbnQgLSBzZWUgZ2V0MlxuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGggJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMgJiYgIShjb25maWc/LnJhbmdlICYmIHJlc3VsdC5zaXplKSkgcmV0dXJuIHsgdXJsIH07XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSwgdXJsIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogQWx3YXlzIHJlc29sdmVzIHdpdGggYSB1cmwgLSB0aGUgYXV0aG9yaXR5IHRoYXQgYW5zd2VyZWQuIEEgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0IGlzIHN0aWxsIGFuIGFuc3dlciBGUk9NIGEgc2VydmVyLCBzbyBpdCBjb21lcyBiYWNrIGFzIHsgdXJsIH0gd2l0aCBubyBkYXRhIChuZXZlciBwbGFpbiB1bmRlZmluZWQpOyBlcnJvcnMgZnJvbSBldmVyeSBzb3VyY2UgdGhyb3cgaW5zdGVhZC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgY29uc3Qgc291cmNlVXJsID0gY29uZmlnPy5zb3VyY2VVcmw7XG4gICAgICAgIGlmIChzb3VyY2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bk9uU291cmNlKHNvdXJjZVVybCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybDogc291cmNlVXJsIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybDogc291cmNlVXJsIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh1bmxlc3MgdGhlIGNhbGxlciBhc2tlZCBmb3IgdG9tYnN0b25lcykgLSBhIHJhbmdlZCByZWFkIG9mIGEgUkVBTCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgdGhvdWdoIChyYW5nZSBwYXN0IEVPRiksIHdoaWNoIHRoZSB0b3RhbCBzaXplIGRpc3Rpbmd1aXNoZXNcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybCA9IGNvbmZpZz8uc291cmNlVXJsO1xuICAgICAgICBpZiAoc291cmNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5PblNvdXJjZShzb3VyY2VVcmwsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgLi4ucmVzdWx0LCB1cmw6IHNvdXJjZVVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzIH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyAuLi5yZXN1bHQsIHVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2l0aG91dCBmYWxsYmFja3M6IHRoZSBBVVRIT1JJVEFUSVZFIGNvdmVyaW5nIE9OTFkgLSB0aGUgZmlyc3Qgc291cmNlIHBlciByb3V0ZSBpbiBjb25maWcgb3JkZXIgKHRoZSBzYW1lIG5vZGUgZXZlcnkgd3JpdGUgYW5kIHJlYWQgdGFyZ2V0cyksIGRvd24gb3Igbm90LiBJdCBpcyBORVZFUiBleGNsdWRlZCBhbmQgTkVWRVIgc3Vic3RpdHV0ZWQsIHNvIGEgbGlzdGluZyB0aGF0IGNhbid0IHJlYWNoIGl0cyB3cml0ZSBub2RlcyByZXRyaWVzIHRob3NlIHNhbWUgbm9kZXMgdW50aWwgdGhlIGRlYWRsaW5lIGFuZCB0aGVuIGZhaWxzLCByYXRoZXIgdGhhbiBxdWlldGx5IHJlYWRpbmcgc2Vjb25kLWhhbmQgZGF0YSBvZmYgYSByZXBsaWNhIG9yIGJhY2tibGF6ZS4gZXhjbHVkZS9jb29sZG93bi9zdWJzdGl0dXRpb24gYXBwbHkgT05MWSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgaW50byBmYWxsYmFja3MuXG4gICAgcHJpdmF0ZSBzZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbjsgZXhjbHVkZT86IFNldDxTb3VyY2VXcmFwcGVyPiB9KTogU291cmNlV3JhcHBlcltdIHtcbiAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgeC5hcGkgJiYgIWNvbmZpZy5leGNsdWRlPy5oYXMoeCkpO1xuICAgICAgICAgICAgbGV0IHVzYWJsZSA9IGNhbmRpZGF0ZXMuZmlsdGVyKHggPT4gIXguaXNPbkNvb2xkb3duKCkpO1xuICAgICAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKHVzYWJsZSkgfHwgY292ZXJSb3V0ZXMoY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICBpZiAoY2hvc2VuKSByZXR1cm4gY2hvc2VuO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHguYXBpKTtcbiAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICBpZiAoIWNob3Nlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob3NlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uQ292ZXJpbmc8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4sIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBDT1ZFUklOR19SRVRSWV9USU1FT1VUO1xuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgZmFpbGVkIGR1cmluZyB0aGlzIGNhbGwgLSB3aXRoIGZhbGxiYWNrcywgdGhlIG5leHQgYXR0ZW1wdCBjb3ZlcnMgdGhlaXIgcm91dGVzIHdpdGggdGhlIG5leHQgc291cmNlIGhvbGRpbmcgdGhlbSBpbnN0ZWFkXG4gICAgICAgIGxldCBmYWlsZWQgPSBuZXcgU2V0PFNvdXJjZVdyYXBwZXI+KCk7XG4gICAgICAgIGxldCB0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cmllcysrO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG5hbWUgdGhlIE9QRVJBVElPTiBhbmQgdGhlIFNQRUNJRklDIHNvdXJjZXMgdGhhdCBmYWlsZWQgLSBcInRoZSBmaW5kIGZhaWxlZCBiZWNhdXNlIHNvdXJjZSBYIGlzIHVuYXZhaWxhYmxlXCIsIG5ldmVyIGFuIGFub255bW91cyBmYWlsdXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdob2xlIGNoYWluXG4gICAgICAgICAgICBsZXQgb3V0Y29tZSA9IGF3YWl0IChhc3luYyAoKTogUHJvbWlzZTx7IHZhbHVlczogVFtdIH0gfCB7IGVycm9yOiBFcnJvciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdmVyaW5nOiBTb3VyY2VXcmFwcGVyW107XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY292ZXJpbmcgPSB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gY2Fubm90IHJ1bjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZXM6IHsgc291cmNlOiBTb3VyY2VXcmFwcGVyOyBlcnJvcjogRXJyb3IgfVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNvdmVyaW5nLm1hcChhc3luYyAoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBuZXcgRXJyb3IoYFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlICR7b3BlcmF0aW9ufWApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhd2FpdCBydW4oYXBpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNvdXJjZSwgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIGFmdGVyICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSl9IGluZGV4ICR7aW5kZXh9IG9mICR7Y292ZXJpbmcubGVuZ3RofWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGlmICghZmFpbHVyZXMubGVuZ3RoKSByZXR1cm4geyB2YWx1ZXMgfTtcbiAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgJHtmYWlsdXJlc1swXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGlzIHVuYXZhaWxhYmxlOiAke2ZhaWx1cmVzWzBdLmVycm9yLm1lc3NhZ2UgPz8gZmFpbHVyZXNbMF0uZXJyb3J9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2UgJHtmYWlsdXJlcy5sZW5ndGh9IG9mIHRoZSAke2NvdmVyaW5nLmxlbmd0aH0gY292ZXJpbmcgc291cmNlcyBhcmUgdW5hdmFpbGFibGU6ICR7ZmFpbHVyZXMubWFwKHggPT4gYCR7eC5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiAke3guZXJyb3IubWVzc2FnZSA/PyB4LmVycm9yfWApLmpvaW4oXCIgfCBcIil9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIGlmIChcInZhbHVlc1wiIGluIG91dGNvbWUpIHJldHVybiBvdXRjb21lLnZhbHVlcztcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAvLyBTdWJzdGl0dXRpb24gY29tZXMgQkVGT1JFIHRoZSBkZWFkbGluZSBjaGVjazogYSBzaW5nbGUgY29ubmVjdCB0aW1lb3V0IGNhbiBlYXQgdGhlIGVudGlyZSBkZWFkbGluZSwgYW5kIGdpdmluZyB1cCB0aGVuIC0gd2l0aG91dCBldmVyIHRyeWluZyB0aGUgc3Vic3RpdHV0ZSB0aGF0IGZhbGxiYWNrcyBleGlzdCBmb3IgLSB0aHJvd3MgZXhhY3RseSB3aGVuIGZhbGxpbmcgYmFjayBtYXR0ZXJzIG1vc3QuIFN1YnN0aXR1dGlvbiBjYW5ub3QgbG9vcCBwYXN0IHRoZSBkZWFkbGluZSBmb3JldmVyOiBldmVyeSBwYXNzIGFkZHMgaXRzIGZhaWx1cmVzIHRvIGBmYWlsZWRgLCBzbyB0aGUgc3Vic3RpdHV0ZXMgcnVuIG91dCB3aXRoIHRoZSBzb3VyY2VzLlxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzICYmIGZhaWxlZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IHRydWUsIGV4Y2x1ZGU6IGZhaWxlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYChyZXRyeWluZyB3aXRoIGZhbGxiYWNrcykgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gc3Vic3RpdHV0ZSBjb3ZlcnMgdGhlIGZhaWxlZCByb3V0ZXMgLSByZXRyeSB0aGUgZmFpbGVkIHNvdXJjZXMgdGhlbXNlbHZlcyBhZnRlciB0aGUgZGVsYXlcbiAgICAgICAgICAgICAgICBmYWlsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiAke0NPVkVSSU5HX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChnaXZpbmcgdXAgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKGRlYWRsaW5lKX0pLmApO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KENPVkVSSU5HX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5PbkNvdmVyaW5nKGBUaGUgZmluZCBvZiAke0pTT04uc3RyaW5naWZ5KHByZWZpeCl9YCwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpLCB7IGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MgfSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGNoYW5nZXMgbGlzdGluZyBzaW5jZSAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQoY29uZmlnLnRpbWUpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENoYW5nZXNBZnRlcjIoY29uZmlnKSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIHN5bmMgc3RhdHVzIGNoZWNrYCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRTeW5jU3RhdHVzIGlzIG5vdCBzdXBwb3J0ZWQ6ICR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IGltcGxlbWVudCBpdGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFyY2hpdmVzLmdldFN5bmNTdGF0dXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiBzdGF0dXNlcy5ldmVyeSh4ID0+IHguYWxsU2NhbnNDb21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHN0YXR1c2VzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmluZGV4U2l6ZSwgMCksXG4gICAgICAgICAgICBzb3VyY2VzOiBzdGF0dXNlcy5mbGF0TWFwKHggPT4geC5zb3VyY2VzKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5zb3VyY2VzLnNvbWUoeCA9PiB4LmFwaSkpIHJldHVybiB7IHJlbW90ZUNvbmZpZzogc3RhdGUuY29uZmlnIH07XG4gICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgeyBhcGlPbmx5OiB0cnVlIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENvbmZpZygpKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29uZmlnLCByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW1wdHkgd3JpdGUgcmVmdXNlZDogc2V0IHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBidWZmZXIgZm9yICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfTogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGluIHRoaXMgc3lzdGVtIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZyAtIGNhbGwgZGVsIGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0Um91dGluZ0NvbmZpZyhkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZS5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGZpbGVOYW1lKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRWYXJpYWJsZVNoYXJkKGZpbGVOYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IExBUkdFX1NFVF9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgIC8vIFN0cmVhbWVkIGF1dG9tYXRpY2FsbHkgc28gY2FsbGVycyBuZXZlciBoYXZlIHRvIGNhbGwgc2V0TGFyZ2VGaWxlIHRoZW1zZWx2ZXMgd2hlbiB0aGV5IGFscmVhZHkgaG9sZCB0aGUgYnVmZmVyIC0gb25lIGdpYW50IG1lc3NhZ2Ugd291bGQgZXhjZWVkIHRoZSB3aXJlIGxpbWl0IGFuZCBsYWcgZXZlcnkgb3RoZXIgY2xpZW50IG9uIHRoZSBjb25uZWN0aW9uLiBUaGUgd2hvbGUgY29uZmlnIGdvZXMgd2l0aCBpdCAoaW5jbHVkaW5nIGZhbGxiYWNrcywgd2hpY2ggdGhlIGJ1ZmZlcidzIHJlc3RhcnRTdHJlYW0gbWFrZXMgcG9zc2libGUpOiBhIGZpbGUgbXVzdCBub3QgZ2V0IGRpZmZlcmVudCB3cml0ZSBzZW1hbnRpY3MganVzdCBmb3IgYmVpbmcgYmlnLlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmaWxlTmFtZSwgLi4uY29uZmlnLCAuLi5idWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBVcGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9ICgke2RhdGEubGVuZ3RofSBieXRlcylgIH0gfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZpbGVOYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0Um91dGluZ0NvbmZpZyhkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBDaGVja2VkIGJlZm9yZSB0aGUgZmlyc3Qgbm9kZSBpcyB3cml0dGVuIHRvLCBub3QganVzdCBieSBlYWNoIG5vZGUgYXMgaXQgYXJyaXZlczogZXZlcnkgc2VydmVyIHdvdWxkIHJlamVjdCBpdCBhbnl3YXksIGFuZCBmaW5kaW5nIHRoYXQgb3V0IG9uZSBub2RlIGF0IGEgdGltZSBpcyBob3cgYSBjb25maWcgd3JpdGUgZW5kcyB1cCBoYWxmLWFwcGxpZWRcbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocGFyc2VSb3V0aW5nRGF0YShkYXRhKSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHdyaXRlVGltZSA9IE1hdGguZmxvb3IoY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBPbmUgd3JpdGUgcGVyIFNUT1JFLCBub3QgcGVyIHNlcnZlcjogdGhlIHdyaXRlIGxhbmRzIGluIHRoZSBzdG9yZSB0aGUgZW50cnkgTkFNRVMsIHNvIHR3byBlbnRyaWVzIHNoYXJpbmcgYSBVUkwgYnV0IG5hbWluZyBkaWZmZXJlbnQgc3RvcmVzIGFyZSB0d28gc2VwYXJhdGUgZGVsaXZlcmllcyAtIGRlZHVwaW5nIGJ5IFVSTCBhbG9uZSBsZWF2ZXMgdGhlIHNlY29uZCBzdG9yZSB1bmNvbmZpZ3VyZWQgZm9yZXZlclxuICAgICAgICBsZXQgdGFyZ2V0czogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGxldCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gYCR7c291cmNlLmNvbmZpZy51cmx9fCR7c291cmNlLmNvbmZpZy5uYW1lfWA7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRpbmcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSB0byBhbGwgJHt0YXJnZXRzLmxlbmd0aH0gc3RvcmVzICh3cml0ZSB0aW1lICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSk6ICR7ZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc2xpY2UoMCwgMjAwMCl9YCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBgJHtzb3VyY2UuY29uZmlnLnVybH0gKHN0b3JlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5uYW1lKX0pYDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSkpO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIHRvICR7bGFiZWx9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7bGFiZWx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSBmYWlsZWQgb24gc29tZSBzdG9yZXMuIEZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBmYWlsZWQgb24gJHtlcnJvcnMubGVuZ3RofSBvZiAke3RhcmdldHMubGVuZ3RofSBzdG9yZXMgKHN1Y2NlZWRlZCBvbjogJHt3cml0dGVuLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0pOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBST1VUSU5HX0ZJTEU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWc/LnJldHJpZXMsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IDAsIGxhYmVsOiBgRGVsZXRpb24gb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9YCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSwgY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBJQXJjaGl2ZXMudW5kZWxldGU6IHJlc3RvcmVzIGEgZmlsZSBtYXJrZWQgZm9yIGRlbGV0aW9uLCBkaXNwYXRjaGVkIHRvIHRoZSB3cml0ZSBub2RlIGFzIFNldENvbmZpZy51bmRlbGV0ZSAodGhlIHdyaXRlIG5vZGUgcHJvcGFnYXRlcyB0aGUgcmVzdG9yZSB0byBpdHMgcGVlcnMgaXRzZWxmKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5kZWxldGUoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBzZXQgcmVmdXNlcyBlbXB0eSBidWZmZXJzLCBhbmQgYW4gdW5kZWxldGUgY2FycmllcyBubyBkYXRhIC0gdGhlIGJ5dGUgaXMgaWdub3JlZFxuICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBCdWZmZXIuZnJvbShbMV0pO1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgdGltZW91dDogeyB1cGxvYWRCeXRlczogcGxhY2Vob2xkZXIubGVuZ3RoLCBsYWJlbDogYFVuZGVsZXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfWAgfSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoZmlsZU5hbWUsIHBsYWNlaG9sZGVyLCB7IHVuZGVsZXRlOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICAvKiogU2VlIElBcmNoaXZlcy5tb3ZlLiBXaGVuIG9uZSBub2RlIGlzIHRoZSB3cml0ZSB0YXJnZXQgZm9yIEJPVEggcGF0aHMsIHRoYXQgbm9kZSBtb3ZlcyB0aGUgZmlsZSBpdHNlbGYgLSB0aGUgYnl0ZXMgbmV2ZXIgY29tZSB0aHJvdWdoIHVzIC0gd2l0aCB0aGUgc2FtZSB3cm9uZy13aW5kb3cvcm91dGUgcmUtcmVzb2x1dGlvbiBhcyBhbnkgd3JpdGUuIFdoZW4gdGhlIHBhdGhzIHJvdXRlIHRvIGRpZmZlcmVudCBzaGFyZHMgbm8gc2luZ2xlIG5vZGUgaG9sZHMgYm90aCwgc28gdGhlIG1vdmUgZGVncmFkZXMgdG8gYSBjb3B5IHRocm91Z2ggdXMgcGx1cyBhIGRlbGV0ZSwgQ09ORklSTUVEIGF0IHRoZSBkZXN0aW5hdGlvbiBiZWZvcmUgdGhlIHNvdXJjZSBpcyB0b3VjaGVkLiBObyBzbWFydCB0aW1lb3V0IG9uIHRoZSBub2RlLXNpZGUgbW92ZTogaXQgY2FuIGJlIGEgYmlnIGZpbGUncyB3b3J0aCBvZiBub2RlLXNpZGUgd29yaywgd2hpY2ggdGhlIHVwbG9hZC1zaXplZCBkZWFkbGluZXMgd291bGQgbWlzanVkZ2UuICovXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiBNb3ZlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IFJPVVRJTkdfRklMRSB8fCBjb25maWcudG9QYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIG1vdmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyb21Sb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5mcm9tUGF0aCk7XG4gICAgICAgIGxldCB0b1JvdXRlID0gZ2V0Um91dGUoY29uZmlnLnRvUGF0aCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIGZyb21Sb3V0ZSkpO1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHJvdXRlQ29udGFpbnModGFyZ2V0LmNvbmZpZy5yb3V0ZSwgdG9Sb3V0ZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZnJvbVJvdXRlIH0sIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFyY2hpdmVzLm1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzb3VyY2U6ICR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IChtb3ZpbmcgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgYXJjaGl2ZXMubW92ZShjb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5saW5lIHJhdGhlciB0aGFuIG1vdmVBcmNoaXZlRmlsZSwgd2hpY2ggLSBnaXZlbiBvbmUgYXJjaGl2ZXMgdGhhdCBpbXBsZW1lbnRzIG1vdmUgLSB3b3VsZCBqdXN0IGNhbGwgYmFjayBpbnRvIHRoaXMgbWV0aG9kXG4gICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiB0aGlzLCB0bzogdGhpcywgcGF0aDogY29uZmlnLmZyb21QYXRoLCB0b1BhdGg6IGNvbmZpZy50b1BhdGggfSk7XG4gICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAvLyBVbmRlZmluZWQgaXMgdHdvIGNhc2VzIChzZWUgY29weUFyY2hpdmVGaWxlKSAtIGFza2luZyB0aGUgc291cmNlIHdoaWNoIG9uZSBrZWVwcyB0aGUgZXJyb3IgaG9uZXN0XG4gICAgICAgICAgICBsZXQgc291cmNlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vdmUgcmVmdXNlZCAtIGEgbmV3ZXIgZmlsZSBleGlzdHMgYXQgdGhlIGRlc3RpbmF0aW9uLiBDYW5ub3QgbW92ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5mcm9tUGF0aCl9ICgke3NvdXJjZUluZm8uc2l6ZX0gYnl0ZXMgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHNvdXJjZUluZm8ud3JpdGVUaW1lKX0pIHRvICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnRvUGF0aCl9OiB0aGUgY29weSB3YXMgcmVmdXNlZCByYXRoZXIgdGhhbiByb2xsIGl0IGJhY2sgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0pIC0gdGhlIHNvdXJjZSBpcyBsZWZ0IHVudG91Y2hlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogbm90IGZvdW5kIG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgdGhpcy5nZXRJbmZvKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIGNvcHkgY291bGQgbm90IGJlIGNvbmZpcm1lZCAtIHRoZSBzb3VyY2UgaXMga2VwdC4gTm90IGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gYWZ0ZXIgY29weWluZyBpdCB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IHJlcG9ydCBpdCAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmRlbChjb25maWcuZnJvbVBhdGgpO1xuICAgIH1cblxuICAgIC8vIE9uZSB3cml0ZSB0YXJnZXQgcGVyIHJvdXRlIHJhbmdlLCBsb3dlc3QgbGF0ZW5jeSBmaXJzdC4gV2l0aGluIGEgc2hhcmQgdGhlIHRhcmdldCBpcyBBTFdBWVMgdGhlIGZpcnN0IHNvdXJjZSBpbiBjb25maWcgb3JkZXIgKHNlZSBydW5QcmltYXJ5IC0gd3JpdGVzIG11c3Qgc3RheSBvbiB0aGUgc2FtZSBub2RlKTogY29ubmVjdGl2aXR5IG9ubHkgZGVjaWRlcyB3aGljaCBTSEFSRCB3ZSBwaWNrLCBuZXZlciB3aGljaCBub2RlIHdpdGhpbiBpdCwgc28gYSBzaGFyZCB3aG9zZSBub2RlIGlzIGRpc2Nvbm5lY3RlZCBpcyBkcm9wcGVkIGVudGlyZWx5IHdoZW4gY29ubmVjdGVkT25seSBpcyBzZXQuXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGNvbm5lY3RlZE9ubHk6IGJvb2xlYW4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldHNCeVJvdXRlLmhhcyhyb3V0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RlZE9ubHkpIHtcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcih4ID0+IHguaXNDb25uZWN0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBrZXkgc2V0VmFyaWFibGVTaGFyZCB3b3VsZCBtYXRlcmlhbGl6ZSBmb3IgdGhpcyBWQVJJQUJMRV9TSEFSRCBrZXkgKGEgdmFsdWUgaW4gdGhlIHByZWZlcnJlZCBzaGFyZCdzIHJvdXRlIHJhbmdlKSwgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRTaGFyZEtleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSB8fCBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFNoYXJkS2V5IHJlcXVpcmVzIGEga2V5IGNvbnRhaW5pbmcgYW4gdW5tYXRlcmlhbGl6ZWQgJHtKU09OLnN0cmluZ2lmeShWQVJJQUJMRV9TSEFSRCl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogdHJ1ZSB9KVswXVxuICAgICAgICAgICAgfHwgdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiBmYWxzZSB9KVswXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBzbyB0aGVyZSBpcyBubyBzaGFyZCB0byBtYXRlcmlhbGl6ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IGludG9gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCB0YWxraW5nIHRvIGEgc2hhcmQgd2hvc2Ugbm9kZSB3YXMgZmFzdCBidXQgaXMgbm93IGRpc2Nvbm5lY3RlZCAtIG9ubHkgd2hlbiBubyBjb25uZWN0ZWQgc2hhcmQgd29ya3MgZG8gd2UgcmVjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRyeSBldmVyeSBzaGFyZFxuICAgICAgICBsZXQgY29ubmVjdGVkT25seSA9IHRydWU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBmdWxsS2V5ID0gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNoYXJkIHBpY2tpbmcgYWxyZWFkeSByZXRyaWVzIGFjcm9zcyBzaGFyZHMsIHNvIGEgc3R1Y2sgc2hhcmQganVzdCBjb3N0cyBpdHMgdGltZW91dCBhbmQgd2UgbW92ZSBvbi4gTGFyZ2UgZGF0YSBzdHJlYW1zIHZpYSBzZXRMYXJnZUZpbGUgLSB0aGUga2V5IGlzIGFscmVhZHkgbWF0ZXJpYWxpemVkIGhlcmUsIHNvIHRoZSBuby1WQVJJQUJMRV9TSEFSRCByZXN0cmljdGlvbiBvbiBzZXRMYXJnZUZpbGUgZG9lc24ndCBhcHBseS5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dCh7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBWYXJpYWJsZS1zaGFyZCB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmdWxsS2V5KX0gKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWAgfSwgdGFyZ2V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmdWxsS2V5LCAuLi5jb25maWcsIC4uLmJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZ1bGxLZXksIGRhdGEsIGNvbmZpZykpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsS2V5O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0OyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gaXMgZG93bjsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkYCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRPbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IHZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGFjY2VwdCB3cml0ZXNcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGxhcmdlIGZpbGUgaXMgd3JpdHRlbiBleGFjdGx5IGxpa2UgYSBzbWFsbCBvbmUgLSBzYW1lIHdyaXRlIG5vZGUsIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24sIHNhbWUgZmFsbGJhY2tzIC0gc28gYSB2YWx1ZSdzIFNJWkUgbmV2ZXIgZGVjaWRlcyBpdHMgd3JpdGUgc2VtYW50aWNzIChzZXQgc3RyZWFtcyB0aHJvdWdoIGhlcmUgcGFzdCBMQVJHRV9TRVRfVEhSRVNIT0xELCBhbmQgYSBmaWxlIHRoYXQgZ3JldyBwYXN0IGl0IG11c3Qgbm90IHN1ZGRlbmx5IGxvc2UgdGhlIGF2YWlsYWJpbGl0eSBpdHMgY2FsbGVyIGFza2VkIGZvcikuIFRoZSBvbmUgZGlmZmVyZW5jZTogZXZlcnkgYXR0ZW1wdCBhZnRlciB0aGUgZmlyc3QgaGFzIHRvIHJld2luZCB0aGUgc3RyZWFtLCBzbyBhIGNvbmZpZyB3aXRob3V0IHJlc3RhcnRTdHJlYW0gZ2V0cyBhIHNpbmdsZSBhdHRlbXB0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbSA9IGNvbmZpZy5yZXN0YXJ0U3RyZWFtO1xuICAgICAgICBpZiAoIXJlc3RhcnRTdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlT25jZShjb25maWcsIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZy5mYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZy5yZXRyaWVzLCByb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgYXR0ZW1wdCBjb25zdW1lZCBzb21lIChvciBhbGwpIG9mIHRoZSBzdHJlYW0sIGFuZCB0aGlzIHNvdXJjZSBuZWVkcyB0aGUgZmlsZSBmcm9tIGl0cyBmaXJzdCBieXRlXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIGF3YWl0IHJlc3RhcnRTdHJlYW0oKTtcbiAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQSBzdHJlYW0gdGhhdCBjYW5ub3QgcmV3aW5kIGdldHMgZXhhY3RseSBPTkUgYXR0ZW1wdCBhdCB0aGUgd3JpdGUgbm9kZTogcmV0cnlpbmcgYW55d2hlcmUgKGFub3RoZXIgc291cmNlLCBvciB0aGlzIG9uZSBhZ2Fpbikgd291bGQgc2VuZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgc3RyZWFtIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGZpbGUuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRMYXJnZUZpbGVPbmNlKGNvbmZpZzogU2V0TGFyZ2VGaWxlQ29uZmlnLCByb3V0ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciBzZXRMYXJnZUZpbGUgb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfSAocm91dGUgJHtyb3V0ZX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoY29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJscyA9IGF3YWl0IHRoaXMuZ2V0VVJMcyhwYXRoKTtcbiAgICAgICAgaWYgKCF1cmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwdWJsaWMgc291cmNlIGNvdmVyaW5nIHJvdXRlICR7Z2V0Um91dGUocGF0aCl9IHRvIGJ1aWxkIGEgVVJMIGZyb20gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsc1swXTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgVVJMIHRoYXQgY291bGQgc2VydmUgdGhpcyBwYXRoOiBwdWJsaWMgc291cmNlcyBtYXRjaGluZyBib3RoIHRoZSBwYXRoJ3Mgcm91dGUgYW5kIHRoZSBjdXJyZW50IHZhbGlkIHdpbmRvdy4gVGhlIGZpcnN0IGlzIHRoZSB3cml0ZSBub2RlJ3MgKGZpcnN0IG1hdGNoaW5nIHNvdXJjZSBpbiBjb25maWcgb3JkZXIsIHNlZSBydW5QcmltYXJ5IC0gdGhlIG9uZSBndWFyYW50ZWVkIGN1cnJlbnQpOyB0aGUgcmVzdCBhcmUgcmFua2VkIGZhc3Rlc3QtZmlyc3QgYnkgbWVhc3VyZWQgbGF0ZW5jeS4gRW1wdHkgd2hlbiBub25lIHF1YWxpZnkuICovXG4gICAgcHVibGljIGFzeW5jIGdldFVSTHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0R2V0VVJMcygpKShwYXRoKTtcbiAgICB9XG5cbiAgICAvKiogZ2V0VVJMcywgYnV0IGFmdGVyIHRoZSBvbmUgYXdhaXQgKGluaXRpYWxpemF0aW9uKSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgc3luY2hyb25vdXM6IGV2ZXJ5dGhpbmcgdW5kZXJuZWF0aCAtIHJvdXRlIGhhc2hpbmcsIHdpbmRvdyBjaGVja3MsIGxhdGVuY2llcywgVVJMIGJ1aWxkaW5nIC0gaXMgc3luY2hyb25vdXMsIGFuZCB0aGUgY2xvc3VyZSBhbHdheXMgcmVhZHMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgc28gaXQgc3RheXMgY29ycmVjdCBhY3Jvc3MgY29uZmlnIHJlZnJlc2hlcy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogZ2V0R2V0VVJMcywgYnV0IHNvcnRlZCBwdXJlbHkgYnkgbGF0ZW5jeSAtIHRoZSB3cml0ZSBub2RlIGdldHMgbm8gc3BlY2lhbCBmaXJzdCBwb3NpdGlvbi4gRm9yIHJlYWQtb25seSBjb25zdW1lcnMgdGhhdCBqdXN0IHdhbnQgdGhlIGZhc3Rlc3QgaG9zdC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0RmFzdFVSTHMoKTogUHJvbWlzZTwocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlR2V0VVJMcyhpbml0aWFsU3RhdGUsIHsgd3JpdGVOb2RlRmlyc3Q6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgd3JpdGVOb2RlRmlyc3Q6IGJvb2xlYW4gfSk6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUubGF0ZXN0KCkgfHwgaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUocGF0aCk7XG4gICAgICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZS5jb25maWcucHVibGljID8/IHRydWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yZGVyZWQ6IFNvdXJjZVdyYXBwZXJbXTtcbiAgICAgICAgICAgIGlmIChjb25maWcud3JpdGVOb2RlRmlyc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IHNvdXJjZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc29ydChyZXN0LCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXMuc2xpY2UoMCwgMSksIC4uLnJlc3RdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXJscyA9IG9yZGVyZWQubWFwKHggPT4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwoeC5jb25maWcudXJsKSwgcGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KHVybHMpXTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5kaXNwb3NlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZXMoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpOiBBcmNoaXZlc0NoYWluIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQ2hhaW4oY29uZmlnLCBvcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsbFNlcnZlcjxUPih1cmw6IHN0cmluZywgcnVuOiAoY29udHJvbGxlcjogdHlwZW9mIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW3N0cmluZ10pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZVN0b3JhZ2VVcmwodXJsKTtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCB9KTtcbiAgICBsZXQgY29udHJvbGxlciA9IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW25vZGVJZF07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCwgbm9kZUlkIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJCdWNrZXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5saXN0QnVja2V0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCBvbiBhIHNlcnZlciAocm91dGluZyBjb25maWcgaW5jbHVkZWQpLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGlzIHVuYXZhaWxhYmxlLiBDaGVhcCAtIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHNlcnZlcidzIGRpc2sgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGF0IGJ1Y2tldCBpcyBsb2FkZWQgdGhlcmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyQWN0aXZlQnVja2V0KGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5nZXRBY3RpdmVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogVGhlIGJ1Y2tldHMgYSBzZXJ2ZXIgY3VycmVudGx5IGhhcyBsb2FkZWQuIEFkbWluIG9ubHksIHNvIGluIHByYWN0aWNlIHRoaXMgaXMgb3VyIG93biBtYWNoaW5lJ3Mgb3RoZXIgcHJvY2VzcyAtIGEgZGVwbG95IHN1Y2Nlc3NvciBhc2tpbmcgaXRzIHByZWRlY2Vzc29yIHdoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzKGNvbmZpZzogeyB1cmw6IHN0cmluZyB9KTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5hZG1pbkxpc3RBY3RpdmVCdWNrZXRzKCkpO1xufVxuXG4vKiogVGVsbHMgYSBzZXJ2ZXIgdG8gbG9hZCBvbmUgb2YgaXRzIGJ1Y2tldHMgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIE9ubHkgdG91Y2hlcyB0aGF0IHNlcnZlciAtIG5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgbm8gb3RoZXIgc291cmNlIGlzIGNvbnRhY3RlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVNlcnZlckJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWN0aXZhdGVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RTZXJ2ZXJCdWNrZXRzIHJlcG9ydHMsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2ZXJXcml0ZVN0YXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmNsZWFyV3JpdGVTdGF0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBvcGVyYXRpb24tbG9nIGZpbGVzIE9ORSBzdG9yYWdlIHNlcnZlciBob2xkcyAoZXZlcnkgc2VydmVyIGxvZ3Mgb25seSBpdHMgb3duIG9wZXJhdGlvbnMgLSBzZWUgbGlzdEFsbFNlcnZlckxvZ0ZpbGVzIGZvciB0aGUgd2hvbGUgZmxlZXQpLiBUaGUgbmFtZXMgY2FycnkgcGlkL3RocmVhZC90aW1lLXJhbmdlL2VudHJ5LWNvdW50IG1ldGFkYXRhOyBzZWUgTG9nRmlsZUluZm8uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZlckxvZ0ZpbGVzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPExvZ0ZpbGVJbmZvW10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIubGlzdExvZ0ZpbGVzKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQgfSkpO1xufVxuXG4vKiogRXZlcnkgc2VydmVyJ3MgbG9nIGZpbGVzIGF0IG9uY2UsIG9uZSBlbnRyeSBwZXIgdXJsIC0gYSBzZXJ2ZXIgdGhhdCBjYW5ub3QgYW5zd2VyIHJlcG9ydHMgaXRzIGVycm9yIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcmVzdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWxsU2VydmVyTG9nRmlsZXMoY29uZmlnOiB7IHVybHM6IHN0cmluZ1tdOyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyB1cmw6IHN0cmluZzsgZmlsZXM/OiBMb2dGaWxlSW5mb1tdOyBlcnJvcj86IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoY29uZmlnLnVybHMubWFwKGFzeW5jIHVybCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyB1cmwsIGZpbGVzOiBhd2FpdCBsaXN0U2VydmVyTG9nRmlsZXMoeyB1cmwsIGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVybCwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkgfTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIERvd25sb2FkcyB0aGUgbmFtZWQgbG9nIGZpbGVzIG9mZiBvbmUgc2VydmVyIGFuZCBkZWNvZGVzIHRoZW0gaW50byB0aGUgbG9nZ2VkIG9iamVjdHMgKHRoZSB3aXJlIGFsd2F5cyBjYXJyaWVzIHRoZW0gTFo0LWNvbXByZXNzZWQgLSBsaXZlIGZpbGVzIGFyZSBjb21wcmVzc2VkIGluIG1lbW9yeSBzZXJ2ZXItc2lkZSkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyTG9ncyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgbmFtZXM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBlbnRyaWVzOiB1bmtub3duW10gfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgYXN5bmMgY29udHJvbGxlciA9PiB7XG4gICAgICAgIGxldCByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGNvbmZpZy5uYW1lcykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb250cm9sbGVyLmdldExvZ0ZpbGUoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbmFtZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IG5hbWUsIGVudHJpZXM6IGRlY29kZUxvZ0ZpbGUoQnVmZmVyLmZyb20oZGF0YSkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xufVxuXG4vKiogZ2V0U2VydmVyTG9ncywgYnV0IFNFQVJDSEVEIGluc3RlYWQgb2YgZnVsbHkgZGVjb2RlZDogdGhlIHJhdyBKU09OIHRleHQgaXMgc3Vic3RyaW5nLW1hdGNoZWQgKGV2ZXJ5IHNlYXJjaCBzdHJpbmcgbXVzdCBhcHBlYXIgaW4gYSBzdGF0ZW1lbnQgLSBzZWUgY3JlYXRlTG9nU2VhcmNoZXIpLCBhbmQgb25seSB0aGUgbWF0Y2hpbmcgc3RhdGVtZW50cyBhcmUgZGVjb2RlZCBpbnRvIG9iamVjdHMuIEZhciBjaGVhcGVyIHRoYW4gZGVjb2Rpbmcgd2hvbGUgZmlsZXMgdG8gbG9vayBmb3Igb25lIHBhdGggb3IgY2FsbGVyLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaFNlcnZlckxvZ3MoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IG5hbWVzOiBzdHJpbmdbXTsgc2VhcmNoZXM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBlbnRyaWVzOiB1bmtub3duW10gfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgYXN5bmMgY29udHJvbGxlciA9PiB7XG4gICAgICAgIGxldCByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGNvbmZpZy5uYW1lcykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb250cm9sbGVyLmdldExvZ0ZpbGUoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbmFtZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IG5hbWUsIGVudHJpZXM6IGNyZWF0ZUxvZ1NlYXJjaGVyKEJ1ZmZlci5mcm9tKGRhdGEpKShjb25maWcuc2VhcmNoZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0SW5mbyhjb25maWc6IHsgdXJsOiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAvLyBnZXRDb25maWcgaXMgYnVja2V0LWxldmVsIChubyBzdG9yZSBzZWxlY3Rpb24pLCBzbyB0aGUgZmFicmljYXRlZCBzb3VyY2VDb25maWcgbmV2ZXIgaGFzIHRvIG1hdGNoIGFueXRoaW5nXG4gICAgbGV0IHJlbW90ZSA9IG5ldyBBcmNoaXZlc1JlbW90ZSh7IHVybDogY29uZmlnLnVybCwgd2FpdEZvckFjY2VzczogZmFsc2UsIHNvdXJjZUNvbmZpZzogbm9ybWFsaXplU291cmNlKGNvbmZpZy51cmwpIH0pO1xuICAgIHJldHVybiBhd2FpdCByZW1vdGUuZ2V0Q29uZmlnKCk7XG59XG4iXX0=
|
|
906
|
+
/* _JS_SOURCE_HASH = "9a9f30bd252db8c52c788db30979b30552adf06ced619bb4e3f2ccfee69be891"; */
|