sliftutils 1.7.117 → 1.7.119
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/index.d.ts +4 -1
- package/package.json +1 -1
- package/storage/remoteStorage/blobStore.ts +5 -6
- package/storage/remoteStorage/chainStartup.ts +10 -1
- package/storage/remoteStorage/createArchives.ts +5 -1
- package/storage/remoteStorage/dist/blobStore.ts.cache +7 -10
- package/storage/remoteStorage/dist/chainStartup.ts.cache +12 -3
- package/storage/remoteStorage/dist/createArchives.ts.cache +7 -3
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +5 -8
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +7 -4
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +17 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +5 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +6 -3
- package/storage/remoteStorage/intermediateManagement.ts +3 -5
- package/storage/remoteStorage/remoteConfig.d.ts +2 -1
- package/storage/remoteStorage/remoteConfig.ts +6 -3
- package/storage/remoteStorage/sourceWrapper.d.ts +2 -0
- package/storage/remoteStorage/sourceWrapper.ts +13 -0
- package/storage/remoteStorage/storageServerState.ts +3 -0
- package/storage/remoteStorage/storeSync.ts +3 -1
|
@@ -251,7 +251,10 @@ class StoreSync {
|
|
|
251
251
|
let theirs = await source.get2(remoteConfig_1.ROUTING_FILE, { internal: true });
|
|
252
252
|
if (!theirs || !theirs.data || !theirs.data.length)
|
|
253
253
|
continue;
|
|
254
|
-
let
|
|
254
|
+
let theirRouting = (0, remoteConfig_1.parseRoutingData)(theirs.data);
|
|
255
|
+
if (!theirRouting)
|
|
256
|
+
continue;
|
|
257
|
+
let version = (0, remoteConfig_1.getConfigVersion)(theirRouting);
|
|
255
258
|
if (version <= this.store.routingVersion())
|
|
256
259
|
continue;
|
|
257
260
|
console.log(`Routing config version ${version} found on ${source.getDebugName()} (we have ${this.store.routingVersion()}, store ${this.store.folder}): taking it`);
|
|
@@ -824,5 +827,5 @@ class StoreSync {
|
|
|
824
827
|
}
|
|
825
828
|
}
|
|
826
829
|
exports.StoreSync = StoreSync;
|
|
827
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUErRztBQUMvRyx5REFBb0Q7QUFDcEQsbURBQTBFO0FBQzFFLGtFQUF5RztBQUN6Ryw0Q0FHc0I7QUFDdEIsc0RBQW9EO0FBQ3BELDRDQUFpRDtBQUNqRCxpREFBMkc7QUFFM0csMkNBQWtFO0FBQ2xFLCtDQUE2QztBQUM3Qyx3RUFBbUU7QUFFbkUsa2JBQWtiO0FBRWxiLHlFQUF5RTtBQUN6RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEMsbU1BQW1NO0FBQ25NLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Msa1FBQWtRO0FBQ2xRLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDNUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Qsc0dBQXNHO0FBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsbUJBQVksQ0FBQztBQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsb0xBQW9MO0FBQ3BMLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELG1GQUFtRjtBQUNuRixNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVDLHdJQUF3STtBQUN4SSxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3Qiw4S0FBOEs7QUFD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LElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDcEMsSUFBSSxVQUFVLElBQUksT0FBTztnQkFBRSxNQUFNO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsWUFBWSxJQUFJLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixJQUFBLHFCQUFZLEVBQUMsZ0JBQWdCLENBQUMsYUFBYSxJQUFBLHFCQUFZLEVBQUMsT0FBTyxDQUFDLDJCQUEyQixPQUFPLHlCQUF5QixJQUFBLHFCQUFZLEVBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDN1IsQ0FBQztDQUNKO0FBN3NCRCw4QkE2c0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsLCBkZWxheSwgcnVuSW5maW5pdGVQb2xsQ2FsbEF0U3RhcnQsIHJ1bkluU2VyaWFsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGNhY2hlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0LCBwcm9taXNlT2JqIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lLCBmb3JtYXREYXRlVGltZURldGFpbGVkIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU3luY1N0YXR1cywgU3luY0FjdGl2aXR5LCBGVUxMX1JPVVRFLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGNvcHlBcmNoaXZlRmlsZSB9IGZyb20gXCIuLi9hcmNoaXZlSGVscGVyc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNCYWNrYmxhemUgfSBmcm9tIFwiLi4vYmFja2JsYXplXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCBwYXJzZVJvdXRpbmdEYXRhLCBnZXRDb25maWdWZXJzaW9uIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IEJsb2JTdG9yZSwgSW5kZXhFbnRyeSB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHsgZ2V0SGlzdG9yeUZhY3RvciwgSElTVE9SWV9NSU5fQllURVMgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7IGxvZ1N5bmNFdmVudCB9IGZyb20gXCIuL3N0b3JhZ2VMb2dzXCI7XG5pbXBvcnQgeyBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcblxuLy8gRXZlcnl0aGluZyB0aGF0IGtlZXBzIGEgc3RvcmUncyBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCBpdHMgc291cmNlcywgcGx1cyB0aGUgdHdvIG1haW50ZW5hbmNlIGxvb3BzIHRoYXQgZm9sbG93IGZyb20gaG9sZGluZyBhbiBpbmRleCAoZXZpY3RpbmcgYSBib3VuZGVkIGRpc2sgY2FjaGUsIGV4cGlyaW5nIHRvbWJzdG9uZXMpLiBUaGUgc3RvcmUgb3ducyB0aGUgc291cmNlcyBhbmQgZGVjaWRlcyB3aGVyZSB3cml0ZXMgZ287IHRoaXMgZGVjaWRlcyB3aGF0IGlzIHNjYW5uZWQsIHB1bGxlZCwgcHVzaGVkLCBldmljdGVkLCBhbmQgZm9yZ290dGVuIC0gc28gdGhlIHdyaXRlIHBhdGggc3RheXMgcmVhZGFibGUgd2l0aG91dCB0aGUgc2V2ZXJhbCBodW5kcmVkIGxpbmVzIG9mIHN5bmNocm9uaXphdGlvbiBtYWNoaW5lcnkgaW50ZXJsZWF2ZWQgaW50byBpdC5cblxuLy8gU291cmNlcyB3aXRoIGEgbmF0aXZlIChpbmRleC1iYWNrZWQpIGNoYW5nZSBmZWVkIGFyZSBwb2xsZWQgdGhpcyBvZnRlblxuY29uc3QgQ0hBTkdFU19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIGNoZWNrZWQgZm9yIG9uIGV2ZXJ5IHBlZXIgdGhpcyBvZnRlbiAtIGZhciBtb3JlIG9mdGVuIHRoYW4gYSBmdWxsIHJlc2NhbiwgYmVjYXVzZSBpdCBpcyB0aGUgZmlsZSB0aGF0IGRlY2lkZXMgd2hhdCBldmVyeXRoaW5nIGVsc2UgZG9lcywgYW5kIGl0IGlzIG9uZSBzbWFsbCByZWFkIHBlciBwZWVyXG5jb25zdCBDT05GSUdfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDU7XG4vLyBGdWxsIG1ldGFkYXRhIHJlc2NhbnMuIHN1cHBvcnRzQ2hhbmdlc0FmdGVyIGlzIHRoZSBoZXVyaXN0aWMgZm9yIFwib25lIG9mIG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzXCI6IHRoZWlyIGluZGV4LWJhY2tlZCBsaXN0aW5ncyBhcmUgY2hlYXAsIHNvIGhvdXJseSBpcyBmaW5lLiBFdmVyeXRoaW5nIGVsc2UgKGJhY2tibGF6ZSwgcGxhaW4gZGlzaykgcGF5cyB0aGUgZnVsbCBsaXN0aW5nIGNvc3QsIHNvIGl0IHJlc2NhbnMgbXVjaCBsZXNzIG9mdGVuLlxuY29uc3QgRlVMTF9SRVNDQU5fSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbmNvbnN0IEZVTExfUkVTQ0FOX05PTl9SRU1PVEVfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MCAqIDY7XG4vLyBDaGFuZ2UgcG9sbHMgcmUtcmVxdWVzdCB0aGlzIG11Y2ggb3ZlcmxhcCwgc28gY2xvY2sgc2tldyBiZXR3ZWVuIHVzIGFuZCBhIHNvdXJjZSBjYW4ndCBkcm9wIGNoYW5nZXNcbmNvbnN0IENIQU5HRVNfUE9MTF9PVkVSTEFQID0gdGltZUluTWludXRlO1xuY29uc3QgU0NBTl9SRVRSWV9ERUxBWSA9IDEwMDAgKiAzMDtcbi8vIERlbGV0ZXMgYXJlIHRvbWJzdG9uZXMgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpOiB0aGUgc2l6ZS0wIGluZGV4IGVudHJ5IGlzIHdoYXQgbGV0cyBhIGRlbGV0aW9uIHByb3BhZ2F0ZS9yZWNvbmNpbGUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIGFuZCBpdCBleHBpcmVzIGFmdGVyIHRoaXMgbG9uZ1xuY29uc3QgVE9NQlNUT05FX0VYUElSWSA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiA3O1xuY29uc3QgVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFdoaWxlIGEgbWV0YWRhdGEgc2NhbiBvciBmdWxsIHN5bmMgaXMgcnVubmluZywgaXRzIHByb2dyZXNzIGlzIGxvZ2dlZCB0aGlzIG9mdGVuXG5jb25zdCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbmNvbnN0IERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBGdWxsIHN5bmNzIGRvd25sb2FkIHRoaXMgbWFueSBmaWxlcyBjb25jdXJyZW50bHkgKGhpZ2gtbGF0ZW5jeSBzb3VyY2VzIGxpa2UgYmFja2JsYXplIHdvdWxkIG90aGVyd2lzZSBjcmF3bCBvbmUgcm91bmQtdHJpcCBhdCBhIHRpbWUpXG5jb25zdCBGVUxMX1NZTkNfUEFSQUxMRUwgPSA4O1xuLy8gQSBmdWxsIHN5bmMgcnVubmluZyBsb25nZXIgdGhhbiB0aGlzIGlzIGNvbnNvbGUuZXJyb3JlZCAoYW5kIGFnYWluIGV2ZXJ5IGludGVydmFsIGFmdGVyKSwgc28gYSBzeW5jIHRoYXQgd2lsbCB0YWtlIGRheXMgaXMgbG91ZCBpbnN0ZWFkIG9mIGEgcXVpZXQgY29uc29sZS5sb2cgZXZlcnkgbWludXRlXG5jb25zdCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gUmVjb25jaWxlIHBhc3NlcyBBTkQgZnVsbCBzeW5jcyBza2lwIGZhaWxpbmcgZmlsZXMgKG9uZSBiYWQgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCAtIGEgc291cmNlIGZhaWxpbmcgb25lIHJlcXVlc3QgaW4gYSB0aG91c2FuZCBjb3VsZCBvdGhlcndpc2UgbmV2ZXIgZmluaXNoIGEgc3luYyksIGJ1dCB0aGlzIG1hbnkgZmFpbHVyZXMgaW4gYSByb3cgbWVhbnMgdGhlIG90aGVyIHNpZGUgaXRzZWxmIGlzIGRvd24sIHNvIHRoZSBwYXNzIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBjeWNsZVxuY29uc3QgU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMgPSA1O1xuY29uc3QgU1lOQ19FUlJPUl9MT0dfTElNSVQgPSAzO1xuLy8gRXZlcnkgZmFpbGVkIGZpbGUgd2FpdHMgdGhpcyBsb25nIGJlZm9yZSB0aGUgcGFzcyBjb250aW51ZXMsIHNvIGEgZG93biBuZXR3b3JrIGJ1cm5zIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIG92ZXIgYSBtaW51dGUtcGx1cyBpbnN0ZWFkIG9mIGluIGFuIGluc3RhbnRcbmNvbnN0IFNZTkNfRkFJTFVSRV9ERUxBWSA9IDEwMDAgKiAxNTtcbi8vIEEgZnVsbCBsaXN0aW5nIHRoYXQgY29tZXMgYmFjayBFTVBUWSAtIG9yIHVuZGVyIGhhbGYgb2Ygd2hhdCB3ZSBrbm93IHRoZSBzb3VyY2UgaG9sZHMgLSBpcyB0cmVhdGVkIGFzIHRoZSBvdGhlciBlbmQgYmVpbmcgYnJpZWZseSBicm9rZW4sIG5vdCBhcyB0aGUgdHJ1dGg6IGl0IGlzIHJldHJpZWQgdGhpcyBtYW55IHRpbWVzLCB0aGlzIGZhciBhcGFydCwgYmVmb3JlIGJlaW5nIGJlbGlldmVkLiBCZWxpZXZpbmcgYSB3cm9uZ2x5LXNocnVua2VuIGxpc3RpbmcgcHVyZ2VzIGV2ZXJ5IGluZGV4IGVudHJ5IHRoZSBzb3VyY2UgaGVsZCwgd2hpY2ggaXMgaG93IHN5bmMgcHJvZ3Jlc3MgXCJnb2VzIGJhY2t3YXJkc1wiLlxuY29uc3QgU1VTUElDSU9VU19TQ0FOX1JFVFJJRVMgPSAzO1xuY29uc3QgU1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDYwO1xuLy8gSG93IGxvbmcgcGFzdCB0aGUgZW5kIG9mIGEgc291cmNlJ3MgbGFzdCB3aW5kb3cgd2UgYXJlIHN0aWxsIHdpbGxpbmcgdG8gcmVhZCAoc2NhbikgaXQuIFdlIGNhbid0IHJlYWQgZnJvbSBhIHNvdXJjZSB0aGF0J3MgdG9vIG9sZCwgYmVjYXVzZSBvdXIgdG9tYnN0b25lcyBvbmx5IGxhc3Qgc28gbG9uZyAoVE9NQlNUT05FX0VYUElSWSk6IGEgc291cmNlIHdob3NlIHdpbmRvd3MgYXJlIGFsbCBwYXN0IG5ldmVyIHJlY2VpdmVzIGRlbGV0aW9ucyAodGhlIHdpbmRvdyBnYXRlcyB3cml0ZXMsIGRlbGV0aW9ucyBpbmNsdWRlZCksIHNvIGl0IG5ldmVyIGtuZXcgYWJvdXQgb3VyIHRvbWJzdG9uZXMgLSBhbmQgaWYgd2UgcmVhZCBpdCBhZnRlciBhIHRvbWJzdG9uZSBleHBpcmVzLCBpdCBjYW4gcmVzdXJyZWN0IGEgZGVhZCB2YWx1ZS4gV2hpbGUgd2UgRE8gcmVhZCBpdCwgb3VyIG93biB0b21ic3RvbmUgaXMgd2hhdCByZWZ1dGVzIGl0cyBzdGFsZSBsaXN0aW5ncywgc28gdGhpcyBkdXJhdGlvbiBtdXN0IHN0YXkgZmFyIGJlbG93IFRPTUJTVE9ORV9FWFBJUlkuXG5jb25zdCBQQVNUX1JFQURfRFVSQVRJT04gPSAxMDAwICogNjAgKiA2MDtcblxudHlwZSBTb3VyY2VTdGF0ZSA9IHtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbjogUmV0dXJuVHlwZTx0eXBlb2YgcHJvbWlzZU9iaj47XG4gICAgc2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIFdoZXRoZXIgYSBzY2FuIG9mIHRoaXMgc291cmNlIGhhcyBldmVyIGFjdHVhbGx5IFNVQ0NFRURFRCAtIHdoYXQgZnVsbCBzeW5jcyBnYXRlIG9uOiB3aXRob3V0IG9uZSwgdGhlIGluZGV4J3MgdmlldyBvZiB0aGlzIHNvdXJjZSBjYW4gYmUgYXJiaXRyYXJpbHkgc3RhbGUgKGUuZy4gaXQgd2FzIHJlc3RhcnRpbmcgd2hlbiB3ZSBmaXJzdCB0cmllZCksIGFuZCBzeW5jaW5nIGZyb20gc3RhbGUgaW5mb3JtYXRpb24gY2h1cm5zIGZvcmV2ZXJcbiAgICBzY2FuU3VjY2VlZGVkOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbiAgICAvLyBXYXRlcm1hcmsgZm9yIGdldENoYW5nZXNBZnRlcjIgcG9sbHNcbiAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiBudW1iZXI7XG4gICAgLy8gUGVyLXNsb3Qgc3RvcCB0b2tlbjogYSByZW1vdmVkIHNvdXJjZSdzIGxvb3BzIHN0b3Agd2l0aG91dCB0b3VjaGluZyB0aGUgcmVzdCBvZiB0aGUgc3RvcmVcbiAgICBzdG9wcGVkOiB7IHN0b3A6IGJvb2xlYW4gfTtcbiAgICAvLyBBIHJlbW92ZWQgc291cmNlJ3Mgc2xvdCBzdGF5cyBpbiB0aGUgYXJyYXlzICh0aGV5IGFyZSBuZXZlciBzcGxpY2VkLCBzbyBzbG90IG51bWJlcnMgaGVsZCBieSBydW5uaW5nIGxvb3BzIHN0YXkgbWVhbmluZ2Z1bCksIG1hcmtlZCBkZWFkIC0gbmV2ZXIgc2Nhbm5lZCwgd3JpdHRlbiwgb3IgcmVhZC4gSW5kZXggZW50cmllcyBkb24ndCByZWZlcmVuY2Ugc2xvdHMgYXQgYWxsOyB0aGV5IHBlcnNpc3QgdGhlIHNvdXJjZXMgbGlzdCdzIHNvdXJjZXNMaXN0SW5kZXguXG4gICAgZGVhZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBuZXdTb3VyY2VTdGF0ZSgpOiBTb3VyY2VTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGZhbHNlLFxuICAgICAgICBpbml0aWFsU2NhbjogcHJvbWlzZU9iaigpLFxuICAgICAgICBzY2FuQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICBzY2FuU3VjY2VlZGVkOiBmYWxzZSxcbiAgICAgICAgc2Nhbm5lZENvdW50OiAwLFxuICAgICAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiAwLFxuICAgICAgICBzdG9wcGVkOiB7IHN0b3A6IGZhbHNlIH0sXG4gICAgfTtcbn1cblxuLy8gV2hhdCBhIHNjYW5uZWQgbGlzdGluZyBlbnRyeSBtZWFudCB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3VyIGluZGV4XG50eXBlIFNjYW5PdXRjb21lID0gXCJmaWx0ZXJlZFwiIHwgXCJuZXdcIiB8IFwidXBkYXRlZFwiIHwgXCJ0b21ic3RvbmVcIiB8IFwidW5jaGFuZ2VkXCI7XG50eXBlIFNjYW5UYWxseSA9IFJlY29yZDxTY2FuT3V0Y29tZSwgbnVtYmVyPjtcbmZ1bmN0aW9uIG5ld1NjYW5UYWxseSgpOiBTY2FuVGFsbHkge1xuICAgIHJldHVybiB7IGZpbHRlcmVkOiAwLCBuZXc6IDAsIHVwZGF0ZWQ6IDAsIHRvbWJzdG9uZTogMCwgdW5jaGFuZ2VkOiAwIH07XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yZVN5bmMge1xuICAgIC8vIFBlciBzb3VyY2Ugc2xvdCwgaW4gc3RlcCB3aXRoIHRoZSBzdG9yZSdzIHNvdXJjZXMgYXJyYXkuIFNsb3RzIGFyZSBuZXZlciBzcGxpY2VkIG91dCAtIGEgcmVtb3ZlZCBvbmUgaXMgbWFya2VkIGRlYWQgLSBzbyBhIHNsb3QgbnVtYmVyIGhlbGQgYnkgYSBydW5uaW5nIGxvb3AgYWx3YXlzIG1lYW5zIHRoZSBzYW1lIHNvdXJjZS5cbiAgICBwcml2YXRlIHN0YXRlczogU291cmNlU3RhdGVbXTtcbiAgICAvLyBTY2FucyAvIGZ1bGwgc3luY3MgaW4gcHJvZ3Jlc3MgKGEgU2V0IC0gb25lIHNvdXJjZSBjYW4gaGF2ZSBhIGNoYW5nZSBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIGFjdGl2aXRpZXMgPSBuZXcgU2V0PFN5bmNBY3Rpdml0eT4oKTtcbiAgICAvLyBHdWFyZHMgYWdhaW5zdCBhIHNlY29uZCBldmljdGlvbiBwYXNzIHN0YXJ0aW5nIHdoaWxlIG9uZSBpcyBzdGlsbCB3YWxraW5nIHRoZSBpbmRleFxuICAgIHByaXZhdGUgZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAvLyBXaGVuIGVhY2gga2V5IHdhcyBsYXN0IHNlcnZlZCwgZm9yIHJlYWRlckRpc2tMaW1pdCdzIExSVSBldmljdGlvbi4gTmV2ZXIgcGVyc2lzdGVkIChhIHJlc3RhcnQgaGFzIG5vIG9waW5pb24gYWJvdXQgcmVjZW5jeSksIGFuZCBvbmx5IGtlcHQgZm9yIGtleXMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gcmVhZCAtIGFuIGluZGV4IGVudHJ5IG5vIG9uZSBoYXMgdG91Y2hlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0LlxuICAgIHByaXZhdGUgbGFzdEFjY2VzcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBCbG9iU3RvcmUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBzdG9yZS5zb3VyY2VzLm1hcCgoKSA9PiBuZXdTb3VyY2VTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogU3RhcnRzIGV2ZXJ5IGxpdmUgc291cmNlJ3Mgc3luY2hyb25pemF0aW9uLCBwbHVzIHRoZSBtYWludGVuYW5jZSBsb29wcy4gQ2FsbGVkIG9uY2UsIGJ5IHRoZSBzdG9yZSdzIGluaXQgLSB0aGUgc3RvcmUncyBpbmRleCBtdXN0IGFscmVhZHkgYmUgbG9hZGVkLCBzaW5jZSBzY2FucyB3cml0ZSBzdHJhaWdodCBpbnRvIGl0LiAqL1xuICAgIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXJ0U291cmNlU3luY0xvb3BzKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChDT05GSUdfUE9MTF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5wb2xsUm91dGluZ0NvbmZpZygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuY2xlYW51cFRvbWJzdG9uZXMoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmVuZm9yY2VIaXN0b3J5TGltaXQoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgLy8gUmVhZCBsaXZlOiB0aGUgbGltaXQgY29tZXMgZnJvbSB0aGUgY29uZmlnLCBzbyBhIHN0b3JlIHRoYXQgZ2FpbnMgb25lIGxhdGVyIHN0YXJ0cyBlbmZvcmNpbmcgaXQgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWRcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFza3MgZXZlcnkgcGVlciBmb3IgdGhlIHJvdXRpbmcgY29uZmlnLCBhbmQgdGFrZXMgaXQgaWYgaXQgaXMgbmV3ZXIgdGhhbiBvdXJzLiBUaGlzIGlzIHRoZSB3aG9sZVxuICAgICAqIG9mIGNvbmZpZ3VyYXRpb24gcHJvcGFnYXRpb246IGl0IHJpZGVzIGJlc2lkZSB0aGUgc2NhbnMgcmF0aGVyIHRoYW4gYmVpbmcgcGFydCBvZiB0aGVtLCBiZWNhdXNlXG4gICAgICogb25lIHNtYWxsIHJlYWQgaXMgd29ydGggZG9pbmcgZXZlcnkgZmV3IG1pbnV0ZXMgd2hpbGUgYSBmdWxsIGxpc3RpbmcgaXMgbm90LCBhbmQgYmVjYXVzZSBhXG4gICAgICogY29uZmlnIHdlIGFyZSBtaXNzaW5nIGlzIHdoYXQgc3RvcHMgZXZlcnl0aGluZyBlbHNlIGZyb20gYmVpbmcgcmlnaHQuXG4gICAgICpcbiAgICAgKiBUaGUgY29weSBpcyBzdG9yZWQgdGhlIHNhbWUgd2F5IGEgc2NhbiBzdG9yZXMgYW55dGhpbmcgaXQgcHVsbHMgLSBhbiBpbnRlcm5hbCB3cml0ZSBpbnRvIG91ciBvd25cbiAgICAgKiBzdG9yZSAtIGFuZCB0aGUgc3RvcmUgbm90aWNlcyB0aGF0IGZpbGUgbGFuZGluZyBhbmQgcmUtY29uZmlndXJlcyBpdHNlbGYuIE5vdGhpbmcgaGVyZSBrbm93cyB3aGF0XG4gICAgICogYSBjb25maWcgbWVhbnM7IGl0IG9ubHkga25vd3MgdGhpcyBvbmUgZmlsZSBpcyB3b3J0aCBhc2tpbmcgZm9yIG9mdGVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcG9sbFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbaV0uaW50ZXJtZWRpYXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldDIoUk9VVElOR19GSUxFLCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGhlaXJzIHx8ICF0aGVpcnMuZGF0YSB8fCAhdGhlaXJzLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbiA9IGdldENvbmZpZ1ZlcnNpb24ocGFyc2VSb3V0aW5nRGF0YSh0aGVpcnMuZGF0YSkpO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDw9IHRoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHt2ZXJzaW9ufSBmb3VuZCBvbiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHdlIGhhdmUgJHt0aGlzLnN0b3JlLnJvdXRpbmdWZXJzaW9uKCl9LCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHRha2luZyBpdGApO1xuICAgICAgICAgICAgICAgIC8vIFN0YW1wZWQgTk9XLCBub3Qgd2l0aCB0aGVpciB3cml0ZSB0aW1lOiBjb25maWdzIGFyZSBvcmRlcmVkIGJ5IHZlcnNpb24sIGFuZCB0aGlzIG9uZSBpcyBuZXdlciBieSB0aGF0IG9yZGVyaW5nLiBUaGVpciBmaWxlIGNhbiBlYXNpbHkgYmUgb2xkZXIgYnkgd3JpdGUgdGltZSAob3VycyB3YXMgcmV3cml0dGVuIGxvY2FsbHkgbW9yZSByZWNlbnRseSksIGFuZCB0aGUgc3RvcmUncyBvbmx5LXRha2UtdGhlLWxhdGVzdCBydWxlIHdvdWxkIHRoZW4gZHJvcCBpdCAtIGxlYXZpbmcgdXMgZmluZGluZyB0aGUgc2FtZSBuZXdlciB2ZXJzaW9uIG9uIGV2ZXJ5IHBvbGwgYW5kIG5ldmVyIGFkb3B0aW5nIGl0LlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2V0KHsgcGF0aDogUk9VVElOR19GSUxFLCBkYXRhOiB0aGVpcnMuZGF0YSwgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBIHBlZXIgdGhhdCBjYW5ub3QgYW5zd2VyIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgYSBzb3VyY2UgdGhhdCBpcyBkb3duOyB0aGUgbmV4dCBwb2xsIGFza3MgYWdhaW5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZm9yIGEgbmV3ZXIgcm91dGluZyBjb25maWcgZmFpbGVkIChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU3RvcHMgZXZlcnkgc291cmNlJ3MgbG9vcHMgKHRoZSBzdG9yZSdzIG93biBzdG9wIHRva2VuIHN0b3BzIHRoZSBtYWludGVuYW5jZSBsb29wcykuICovXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IHN0YXRlIG9mIHRoaXMuc3RhdGVzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgc2xvdCB0aGUgc3RvcmUganVzdCBhcHBlbmRlZCB0byBpdHMgc291cmNlcyBhcnJheTogaXQgc3RhcnRzIGZyb20gbm90aGluZywgc28gaXQgZ2V0cyBhIGZ1bGwgc2Nhbi4gKi9cbiAgICBwdWJsaWMgYWRkU291cmNlKHNsb3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlc1tzbG90XSA9IG5ld1NvdXJjZVN0YXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICB2b2lkIHRoaXMuc3RhcnRTb3VyY2VTeW5jTG9vcHMoc2xvdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIHNsb3Qgc3RheXMgaW4gdGhlIHN0b3JlJ3MgYXJyYXlzIGZvcmV2ZXIgKHJ1bm5pbmcgbG9vcHMgaG9sZCBzbG90IG51bWJlcnMpOyBpdCBqdXN0IGdvZXMgZGVhZCAtIGxvb3BzIHN0b3AsIGFuZCBpdHMgaW5kZXggZW50cmllcyBkcm9wIChvdGhlciBzb3VyY2VzJyBzY2FucyByZS1maW5kIGFueSBjb3B5IHRoYXQncyBzdGlsbCByZWFjaGFibGUgdGhyb3VnaCB0aGUgbmV3IGNvbmZpZykuICovXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZVNvdXJjZShzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc2xvdF07XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnN0b3JlLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBzdGF0ZS5kZWFkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBsZXQgc291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc2xvdFNvdXJjZXNMaXN0SW5kZXgoc2xvdCk7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYmUgYW5vdGhlciBsaXZlIHNsb3QgKG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93KSAtIHRoZSBlbmRwb2ludCBpcyBzdGlsbCBjb25maWd1cmVkLCBzbyBpdHMgZW50cmllcyBzdGF5XG4gICAgICAgIGlmIChzb3VyY2VzTGlzdEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zdG9yZS5zbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBzb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBGb3Jnb3R0ZW4sIG5vdCBkZWxldGVkOiB0aGUgZmlsZXMgc3RpbGwgZXhpc3Qgd2hlcmV2ZXIgdGhhdCBzb3VyY2UgcHV0IHRoZW0sIHdlIGp1c3Qgbm8gbG9uZ2VyIGhhdmUgYSB3YXkgdG8gcmVhY2ggdGhlbVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCBhbmQgJHtkcm9wcGVkfSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgd2VyZSBkcm9wcGVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCAoaXRzIFVSTCBpcyBzdGlsbCBzZXJ2ZWQgYnkgYW5vdGhlciBzbG90LCBzbyBpdHMgaW5kZXggZW50cmllcyBzdGF5KWApO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGEgc2xvdCBpcyBzdGlsbCBjb25maWd1cmVkLiBEZWFkIHNsb3RzIGFyZSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiAqL1xuICAgIHB1YmxpYyBpc0xpdmUoc2xvdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3RvcmUuc291cmNlc1tzbG90XSAmJiAhdGhpcy5zdGF0ZXNbc2xvdF0/LmRlYWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGl2aXRpZXMoKTogU3luY0FjdGl2aXR5W10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuYWN0aXZpdGllc107XG4gICAgfVxuXG4gICAgLyoqIEEga2V5IHdhcyBqdXN0IHNlcnZlZCwgc28gaXQgZ29lcyB0byB0aGUgYmFjayBvZiB0aGUgZXZpY3Rpb24gcXVldWUuICovXG4gICAgcHVibGljIG5vdGVBY2Nlc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzLnNldChrZXksIERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdGhlIGluZGV4IHN0aWxsIGhvbGRzIGV4YWN0bHkgdGhlIGVudHJ5IGEgcGFzcyBwaWNrZWQgdXAgZWFybGllci4gSW5kZXggcm93cyBhcmUgcmVhZCBvdXQgb2YgdGhlIGRhdGFiYXNlIHBlciBsb29rdXAsIHNvIHRoaXMgY29tcGFyZXMgdGhlIHJvdywgbm90IHRoZSBvYmplY3QgLSBhIHdyaXRlIGxhbmRpbmcgbWlkLXBhc3MgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgdGhyZWUuXG4gICAgcHJpdmF0ZSBlbnRyeVVuY2hhbmdlZChrZXk6IHN0cmluZywgZW50cnk6IEluZGV4RW50cnkpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjdXJyZW50LndyaXRlVGltZSA9PT0gZW50cnkud3JpdGVUaW1lICYmIGN1cnJlbnQuc2l6ZSA9PT0gZW50cnkuc2l6ZSAmJiBjdXJyZW50LnNvdXJjZXNMaXN0SW5kZXggPT09IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXR1cygpOiBBcmNoaXZlc1N5bmNTdGF0dXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogdGhpcy5zdGF0ZXMuZXZlcnkoeCA9PiB4LnNjYW5Db21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHRoaXMuc3RvcmUuaW5kZXhTaXplKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0aGlzLnN0b3JlLnNvdXJjZXMubWFwKCh4LCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzOiB4LnZhbGlkV2luZG93cyxcbiAgICAgICAgICAgICAgICByb3V0ZTogeC5yb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jOiB4Lm5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRoaXMuc3RhdGVzW2ldLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLFxuICAgICAgICAgICAgICAgIGluaXRpYWxTY2FuQ29tcGxldGU6IHRoaXMuc3RhdGVzW2ldLnNjYW5Db21wbGV0ZSxcbiAgICAgICAgICAgICAgICBzY2FubmVkQ291bnQ6IHRoaXMuc3RhdGVzW2ldLnNjYW5uZWRDb3VudCxcbiAgICAgICAgICAgIH0pKS5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogTGlzdGluZ3MgY29tZSBzdHJhaWdodCBmcm9tIHRoZSBpbmRleCwgc28gdGhleSBtdXN0IHdhaXQgZm9yIG91ciBvd24gYmFzZSBzb3VyY2UncyBpbml0aWFsIHNjYW4gKHdoaWNoIG1pZ2h0IGxhZyBtaW51dGVzKSBiZWZvcmUgdGhleSBhcmUgdHJ1c3R3b3J0aHkuIFRoZSBiYXNlIChsb2NhbCBkaXNrKSBpcyBpbXBsaWNpdGx5IHJlcXVpcmVkIC0gcmVtb3RlIHNvdXJjZXMgYXJlIG5vdCwgdGhleSBjb21lIGFuZCBnby4gKi9cbiAgICBwdWJsaWMgYXN5bmMgd2FpdEZvclJlcXVpcmVkU2NhbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVzWzBdLmluaXRpYWxTY2FuLnByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKDApKCk7XG4gICAgfVxuXG4gICAgLyoqIE9uZSBzeW5jaHJvbml6YXRpb24gcm91bmQgb2YgYSBzb3VyY2U6IHRoZSBQVUxMIGRpcmVjdGlvbiBhbHdheXMgKGl0cyBsaXN0aW5nLCBhcHBsaWVkIHRvIG91ciBpbmRleCksIGFuZCB3aXRoIFwicHVzaFwiIHRoZSBwdXNoIGRpcmVjdGlvbiB0b28gKHdoYXQgb3VyIGluZGV4IHNheXMgdGhlIHNvdXJjZSBpcyBtaXNzaW5nLCB3cml0dGVuIHRvIGl0KS4gUHVzaCBpcyBhbiBhcmd1bWVudCByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNhbGwgYmVjYXVzZSBpdCBjYW5ub3QgcnVuIHdpdGhvdXQgdGhlIHB1bGwncyBsaXN0aW5nIC0gdGhlIGluZGV4IGFsb25lIGNhbm5vdCBzYXkgd2hhdCB0aGUgc291cmNlIGFscmVhZHkgaG9sZHMuIExpc3RpbmdzIHVuYmxvY2sgKGluaXRpYWxTY2FuKSBiZXR3ZWVuIHRoZSBoYWx2ZXMsIHNvIHRoZXkgbmV2ZXIgd2FpdCBiZWhpbmQgYSBwdXNoLiBPbmx5IG9uZSByb3VuZCBwZXIgU09VUkNFIHJ1bnMgYXQgYSB0aW1lIChjYWNoZSBrZXlzIHRoZSBzZXJpYWxpemVyIGJ5IHNvdXJjZSBpbmRleCkuICovXG4gICAgcHJpdmF0ZSBzeW5jU291cmNlID0gY2FjaGUoKHNvdXJjZUluZGV4OiBudW1iZXIpID0+IHJ1bkluU2VyaWFsKGFzeW5jIChwdXNoPzogXCJwdXNoXCIpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgbGV0IGxpc3RpbmcgPSBhd2FpdCB0aGlzLnB1bGxTb3VyY2Uoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHB1c2ggJiYgIXRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVzaFNvdXJjZShzb3VyY2VJbmRleCwgbGlzdGluZyk7XG4gICAgICAgIH1cbiAgICB9KSk7XG5cbiAgICAvKiogQSBib3VuZGFyeSBzY2FuIG9mIHRoZSBub2RlIHRoYXQgb3duZWQgKHBhcnQgb2YpIG91ciByb3V0ZSBpbiB0aGUgdmFsaWQgd2luZG93IGJlZm9yZSBvdXJzLCB3aGVuIHRoYXQgbm9kZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSAoYSBkaXNrIHJlc2NhbiBjYW4ndCBzZWUgaXRzIHdyaXRlcyk6IGp1c3QgaXRzIGNoYW5nZXMgc2luY2UgdGhlIGJvdW5kYXJ5IG5laWdoYm9yaG9vZCwgd2l0aCBtYXRjaGluZyB2YWx1ZXMgcHVsbGVkIG9udG8gb3VyIG93biBkaXNrLiAqL1xuICAgIHB1YmxpYyBhc3luYyBib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlOiBJQXJjaGl2ZXMsIGNvbmZpZzogeyBzaW5jZTogbnVtYmVyOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl0gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiYm91bmRhcnlTY2FuU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc2luY2U6IGNvbmZpZy5zaW5jZSwgcm91dGU6IGNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIyKHsgdGltZTogY29uZmlnLnNpbmNlLCByb3V0ZXM6IGNvbmZpZy5yb3V0ZSAmJiBbY29uZmlnLnJvdXRlXSB8fCB1bmRlZmluZWQsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS5maWx0ZXJlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGZpbGUucGF0aCk7XG4gICAgICAgICAgICBpZiAoZmlsZS5jcmVhdGVUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkudW5jaGFuZ2VkKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gU2l6ZSAwIGluIGEgbGlzdGluZyBJUyBhIGRlbGV0aW9uIChhbiBlbXB0eSBmaWxlIGlzIGEgbWlzc2luZyBmaWxlKSwgc28gaXQgaXMgdGFrZW4gYXMgb25lXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGZpbGUucGF0aCwgcHJlc2VydmVXcml0ZVRpbWU6IHRydWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBpcyB0d28gY2FzZXMgKHNlZSBjb3B5QXJjaGl2ZUZpbGUpOiBvdXIgb3duIGRpc2sgYWxyZWFkeSBob2xkaW5nIHNvbWV0aGluZyBuZXdlciBpcyB0aGUgYm91bmRhcnkgc2NhbiB3b3JraW5nIGFzIGludGVuZGVkIChvdXIgd3JpdGVzIHNpbmNlIHRoZSBib3VuZGFyeSBvdXRyYW5rIHRoZSBuZWlnaGJvcidzKSwgb25seSBhIGdlbnVpbmVseSB1bnJlYWRhYmxlIGZpbGUgaXMgd29ydGggYSB3YXJuaW5nXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsICYmIGxvY2FsLndyaXRlVGltZSA+IGZpbGUuY3JlYXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5Mb2NhbE5ld2VyXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGZpbGUucGF0aCwgdGhlaXJXcml0ZVRpbWU6IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQoZmlsZS5jcmVhdGVUaW1lKSwgdGhlaXJTaXplOiBmaWxlLnNpemUsIGxvY2FsV3JpdGVUaW1lOiBmb3JtYXREYXRlVGltZURldGFpbGVkKGxvY2FsLndyaXRlVGltZSksIGxvY2FsU2l6ZTogbG9jYWwuc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGxvY2FsLndyaXRlVGltZSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgICAgICB0YWxseS51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQm91bmRhcnkgc2NhbiBjb3VsZCBub3QgY29weSAke2ZpbGUucGF0aH0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIGNoYW5nZSBmZWVkIGxpc3RlZCBpdCAoJHtmaWxlLnNpemV9IGJ5dGVzLCB3cml0ZVRpbWUgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKGZpbGUuY3JlYXRlVGltZSl9KSBidXQgdGhlIHJlYWQgZm91bmQgbm90aGluZ2ApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwgZmlsZS5wYXRoLCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICBpZiAoY29waWVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGNvcGllZC53cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51cGRhdGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbGx5Lm5ldysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhbkZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc2NhblN0YXJ0LCBzaW5jZTogY29uZmlnLnNpbmNlLCBjaGFuZ2VzOiBjaGFuZ2VzLmxlbmd0aCwgbmV3UGF0aHM6IHRhbGx5Lm5ldywgdXBkYXRlZDogdGFsbHkudXBkYXRlZCwgdG9tYnN0b25lczogdGFsbHkudG9tYnN0b25lLCB1bmNoYW5nZWQ6IHRhbGx5LnVuY2hhbmdlZCB9KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcGVyLXNvdXJjZSBsb29wcyDilIDilIBcblxuICAgIC8vIFNsb3QgMCBpcyBleGVtcHQ6IG91ciBvd24gZGlzayBhbnN3ZXJzIGZvciBldmVyeSB3aW5kb3cgdGhpcyBzdG9yZSBFVkVSIGhlbGQsIGFuZCBzY2FubmluZyBpdCBpcyB3aGF0IGtlZXBzIHRoZSBpbmRleCBob25lc3QgYWJvdXQgdGhlbS4gUmVhZCBsaXZlIGVhY2ggY2FsbCAtIHVwZGF0ZVNvdXJjZXMgbW92ZXMgdGhlIHdpbmRvd3Mgb24gcnVubmluZyBzbG90cywgc28gYSBzb3VyY2UgZ29lcyBzdGFsZSAob3IgY29tZXMgYmFjaykgd2hpbGUgaXRzIGxvb3BzIHJ1bi5cbiAgICBwcml2YXRlIHdpbmRvd3NBbGxvd1NjYW5uaW5nKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0udmFsaWRXaW5kb3dzLnNvbWUodyA9PiB3WzFdID4gRGF0ZS5ub3coKSAtIFBBU1RfUkVBRF9EVVJBVElPTik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydFNvdXJjZVN5bmNMb29wcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmUucmVnaXN0ZXJTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHNvdXJjZU9iaiA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VPYmouc291cmNlO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIC8vIElmIGEgc2xvdCBldmVyIGdldHMgVFdPIG9mIHRoZXNlLCBpdHMgbG9vcHMgYXJlIGRvdWJsZWQgLSBldmVyeSBwb2xsIGFuZCBmdWxsIHN5bmMgcnVucyB0d2ljZVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzb3VyY2VTeW5jU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc291cmNlSW5kZXgsIHVybDogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS51cmwsIGludGVybWVkaWF0ZTogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUgfSk7XG4gICAgICAgIC8vIFJlYWQgbGl2ZSBmb3IgZXZlcnkgcGFzcywgbm90IGNhcHR1cmVkIC0gdGhlIHN0b3JlJ3Mgc291cmNlIGxpc3QgY2FuIGNoYW5nZSB3aGlsZSBsb29wcyBydW5cbiAgICAgICAgbGV0IG5vRnVsbFN5bmMgPSAoKSA9PiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLm5vRnVsbFN5bmM7XG4gICAgICAgIC8vIEFuIGludGVybWVkaWF0ZSBpcyBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZSBQT1JUIG9udG8gYSBzb3VyY2Ugd2UgYWxyZWFkeSBoYXZlOiB0aGUgc2FtZSBidWNrZXQsIHJlYWNoYWJsZSBhbm90aGVyIHdheSBmb3IgYSBmZXcgbWludXRlcy4gU2Nhbm5pbmcgaXQgd291bGQgbGlzdCBleGFjdGx5IHdoYXQgc2Nhbm5pbmcgdGhhdCBzb3VyY2UgbGlzdHMsIGFnYWluc3QgYSBwb3J0IHRoYXQgaXMgYWJvdXQgdG8gZGlzYXBwZWFyIC0gc28gaXQgaXMgbmV2ZXIgc2Nhbm5lZCwgYW5kIHRoZSBzb3VyY2UgaXQgd2FzIHNwbGl0IG91dCBvZiBjb3ZlcnMgaXQgZm9yIGFzIGxvbmcgYXMgaXQgZXhpc3RzIGFuZCBhZnRlciBpdCBpcyBnb25lLlxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2tlZCBwZXIgdGljaywgbmV2ZXIgZGVjaWRlZCBvbmNlOiB0aGUgd2luZG93cyBtb3ZlIG9uIHJ1bm5pbmcgc2xvdHMgKHNlZSB1cGRhdGVTb3VyY2VzKSwgc28gYSBzb3VyY2UgZ29lcyBzdGFsZSBtaWQtbGlmZSBhbmQgY2FuIGNvbWUgYmFjayBpZiBhIGNvbmZpZyBleHRlbmRzIHRoZW0uIExvZ2dlZCBvbmx5IG9uIGVhY2ggdHJhbnNpdGlvbiBpbnRvIHN0YWxlbmVzcy5cbiAgICAgICAgbGV0IGxvZ2dlZFN0YWxlID0gZmFsc2U7XG4gICAgICAgIGxldCBza2lwU3RhbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy53aW5kb3dzQWxsb3dTY2FubmluZyhzb3VyY2VJbmRleCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZWRTdGFsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAoIWxvZ2dlZFN0YWxlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5Ta2lwcGVkU3RhbGVXaW5kb3dzXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHZhbGlkV2luZG93czogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS52YWxpZFdpbmRvd3MubWFwKHcgPT4gW2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod1swXSksIGZvcm1hdERhdGVUaW1lRGV0YWlsZWQod1sxXSldKSwgcGFzdFJlYWREdXJhdGlvbk1zOiBQQVNUX1JFQURfRFVSQVRJT04gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQW4gYWxyZWFkeS1zdGFsZSBzb3VyY2Ugc2tpcHMgZ2V0Q29uZmlnIGVudGlyZWx5OiBpdHMgZW5kcG9pbnQgaXMgb2Z0ZW4gbG9uZyBnb25lLCBhbmQgcmV0cnlpbmcgdGhhdCBldmVyeSAzMHMgZm9yZXZlciBpcyBub2lzZSBhYm91dCBhIHNvdXJjZSB3ZSB3b3VsZCBub3Qgc2NhbiBhbnl3YXkgKGlmIGl0cyB3aW5kb3dzIGFyZSBsYXRlciBleHRlbmRlZCwgdGhlIGZ1bGwtcm91bmQgcG9sbCBiZWxvdyBwaWNrcyBpdCB1cCAtIGp1c3Qgd2l0aG91dCBjaGFuZ2UgcG9sbGluZyB1bnRpbCBhIHJlc3RhcnQpXG4gICAgICAgIHdoaWxlICghc2tpcFN0YWxlKCkgJiYgIXRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IGF3YWl0IHNvdXJjZS5nZXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciA9ICEhY29uZmlnLnN1cHBvcnRzQ2hhbmdlc0FmdGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImluaXRpYWxTY2FuRmFpbGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHJldHJ5SW5NczogU0NBTl9SRVRSWV9ERUxBWSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU0NBTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAvLyBIb3VybHkgZm9yIG91ciBvd24gZGlzayAobm8gc291cmNlQ29uZmlnIC0gYSBjaGVhcCBsb2NhbCB3YWxrLCBhbmQgaG93IGEgc2libGluZyBwcm9jZXNzJ3Mgd3JpdGVzIGludG8gdGhlIHNoYXJlZCBmb2xkZXIgYXJlIGZvdW5kKSBhbmQgZm9yIHJlbW90ZSBwZWVycyAoaW5kZXgtYmFja2VkLCBjaGVhcCBsaXN0aW5ncyk7IHRoZSBzbG93IGludGVydmFsIGlzIG9ubHkgZm9yIHNvdXJjZXMgd2hlcmUgYSBmdWxsIGxpc3RpbmcgaXMgZ2VudWluZWx5IGV4cGVuc2l2ZSAoYmFja2JsYXplKVxuICAgICAgICBsZXQgcG9sbEludGVydmFsID0gKCFzb3VyY2VPYmouc291cmNlQ29uZmlnIHx8IHNvdXJjZU9iai5zb3VyY2VDb25maWcudHlwZSA9PT0gXCJyZW1vdGVcIikgJiYgRlVMTF9SRVNDQU5fSU5URVJWQUwgfHwgRlVMTF9SRVNDQU5fTk9OX1JFTU9URV9JTlRFUlZBTDtcbiAgICAgICAgLy8gQm90aCBsb29wcyBiZWxvdyBydW4gb25lIGF0IGEgdGltZTogYSBjaGFuZ2UtcG9sbCB0aWNrIGxhbmRpbmcgbWlkIGZ1bGwgcm91bmQgd291bGQgb3RoZXJ3aXNlIHN0YXJ0IGEgc2Vjb25kIGNvcHkgcGFzcyBvdmVyIHRoZSBzYW1lIHBlbmRpbmcgbGlzdCwgZG93bmxvYWRpbmcgZXZlcnl0aGluZyB0d2ljZVxuICAgICAgICBsZXQgc2VyaWFsID0gcnVuSW5TZXJpYWwoYXN5bmMgKGZuYzogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gYXdhaXQgZm5jKCkpO1xuICAgICAgICBhd2FpdCBydW5JbmZpbml0ZVBvbGxDYWxsQXRTdGFydChwb2xsSW50ZXJ2YWwsICgpID0+IHNlcmlhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2tpcFN0YWxlKCkpIHJldHVybjtcbiAgICAgICAgICAgIHdoaWxlICghdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NvdXJjZShzb3VyY2VJbmRleCkoXCJwdXNoXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmFpbGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHJldHJ5SW5NczogU0NBTl9SRVRSWV9ERUxBWSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgaWYgKHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyKSB7XG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoQ0hBTkdFU19QT0xMX0lOVEVSVkFMLCAoKSA9PiBzZXJpYWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChza2lwU3RhbGUoKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIEEgc2NhbiB0aGF0IGhhcyBub3Qgc3VjY2VlZGVkIHlldCBpcyByZXRyaWVkIEhFUkUsIGJlZm9yZSBhbnl0aGluZyBlbHNlIC0gcG9sbGluZyBjaGFuZ2VzIGFuZCBjb3B5aW5nIGFnYWluc3QgYSBuZXZlci1zY2FubmVkIHNvdXJjZSB3b3VsZCBydW4gb24gYXJiaXRyYXJpbHkgc3RhbGUgaW5mb3JtYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLnNjYW5TdWNjZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKHNvdXJjZUluZGV4KShcInB1c2hcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucG9sbENoYW5nZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCkoKTtcbiAgICAgICAgICAgIH0pLCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBQVUxMIGRpcmVjdGlvbjogYSBmdWxsIG1ldGFkYXRhIHNjYW4gKHNpemUsIHdyaXRlVGltZSwgcGF0aCkgb2Ygb25lIHNvdXJjZSwgYXBwbGllZCB0byBvdXIgaW5kZXguIFJldHVybnMgdGhlIHNvdXJjZSdzIGxpc3RpbmcgKHBhdGggLT4gd3JpdGUgdGltZSksIHdoaWNoIHB1c2hTb3VyY2UgdXNlcyBmb3IgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi5cbiAgICBwcml2YXRlIGFzeW5jIHB1bGxTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPj4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHsgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiwgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHN0YXJ0VGltZTogc2NhblN0YXJ0IH07XG4gICAgICAgIHRoaXMuYWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSB9KTtcbiAgICAgICAgbGV0IHByb2dyZXNzVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gc3RpbGwgcnVubmluZyAoJHtNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc2NhblN0YXJ0KSAvIDEwMDApfXMsIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KWApO1xuICAgICAgICB9LCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgLy8gVGhlIGxpc3RpbmcgcmVxdWVzdCBkZWxpYmVyYXRlbHkgdGFrZXMgbm8gdGltZSBvciByb3V0ZSBmaWx0ZXJzOiBvdXIgc2xvd2VzdCBzb3VyY2VzIChiYWNrYmxhemUpIHN1cHBvcnQgbmVpdGhlciwgc28gZmlsdGVyaW5nIHdvdWxkIGhhcHBlbiBhZnRlciB0aGUgZnVsbCBmZXRjaCBhbnl3YXkgLSBsaXR0bGUgYmVuZWZpdCwgbW9yZSByb29tIGZvciBkZXN5bmNocm9uaXphdGlvbi4gQW5kIGlmIGEgZnVsbCBsaXN0aW5nIGV2ZXIgYmVjb21lcyB0b28gYmlnIHRvIHNlbmQgb3ZlciB0aGUgbmV0d29yaywgaXQgaXMgYWxzbyB0b28gYmlnIGZvciB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgdG8gaG9sZCBpbiBtZW1vcnkgLSB0aGUgZml4IGlzIG1vcmUgcm91dGluZyBzaGFyZHMgKGVhY2ggc3RvcmluZyBhbmQgc2VuZGluZyBsZXNzKSwgbm90IGZpbHRlcmluZy5cbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZpbGVzID0gYXdhaXQgc291cmNlLmZpbmRJbmZvKFwiXCIsIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gV2hhdCB3ZSBiZWxpZXZlIHRoZSBzb3VyY2UgaGFzOiB3aGljaGV2ZXIgaXMgbGFyZ2VyIG9mIGl0cyBwcmV2aW91cyBsaXN0aW5nIGFuZCB0aGUgaW5kZXggZW50cmllcyBuYW1pbmcgaXQgYXMgaG9sZGVyLiBGaWxlcyBkbyBub3QganVzdCB2YW5pc2ggLSBhIGxpc3RpbmcgZmFyIGJlbG93IHRoaXMgbWVhbnMgdGhlIG90aGVyIGVuZCBpcyBicmllZmx5IGJyb2tlbiwgYW5kIGJlbGlldmluZyBpdCB3b3VsZCBwdXJnZSBldmVyeXRoaW5nIGl0IGhlbGQuXG4gICAgICAgICAgICAgICAgbGV0IGhlbGQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBzY2FubmVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgWywgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4KSBoZWxkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IE1hdGgubWF4KHN0YXRlLnNjYW5uZWRDb3VudCwgaGVsZCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXhwZWN0ZWQgPiAwICYmIGZpbGVzLmxlbmd0aCA8IGV4cGVjdGVkIC8gMikpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0cyA+PSBTVVNQSUNJT1VTX1NDQU5fUkVUUklFUykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgU1RJTEwgbGlzdHMgJHtmaWxlcy5sZW5ndGh9IGZpbGVzIHdoZXJlIH4ke2V4cGVjdGVkfSB3ZXJlIGV4cGVjdGVkLCBhZnRlciAke2F0dGVtcHRzfSByZXRyaWVzIC0gYWNjZXB0aW5nIHRoZSBsaXN0aW5nIGFzIHRoZSB0cnV0aGApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXR0ZW1wdHMrKztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgbGlzdGVkICR7ZmlsZXMubGVuZ3RofSBmaWxlcywgYnV0IH4ke2V4cGVjdGVkfSB3ZXJlIGV4cGVjdGVkIChwcmV2aW91cyBsaXN0aW5nICR7c3RhdGUuc2Nhbm5lZENvdW50fSwgaW5kZXggZW50cmllcyBpdCBob2xkcyAke2hlbGR9KSAtIHRoZSBvdGhlciBlbmQgaXMgcHJvYmFibHkgYnJpZWZseSBicm9rZW47IGFza2luZyBhZ2FpbiBpbiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSWV9ERUxBWSAvIDEwMDB9cyAocmV0cnkgJHthdHRlbXB0c30gb2YgJHtTVVNQSUNJT1VTX1NDQU5fUkVUUklFU30pYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmFjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCB3aGlsZSB0aGUgbGlzdGluZyB3YXMgaW4gZmxpZ2h0OyBpdHMgcmVzdWx0cyBhcmUgZGVhZFxuICAgICAgICBpZiAoc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm4gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgaW5kZXhTaXplQmVmb3JlID0gdGhpcy5zdG9yZS5pbmRleFNpemUoKTtcbiAgICAgICAgbGV0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgbGV0IG5ld1BhdGhzID0gMDtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgc2Vlbi5zZXQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoZmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgIG5ld1BhdGhzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICAvLyBFbnRyaWVzIHRoaXMgc291cmNlIHdhcyB0aGUgaG9sZGVyIG9mLCBidXQgdGhhdCBpdHMgbGlzdGluZyBkaWQgbm90IG1lbnRpb246IG91ciBvd24gZGlzayB0YWtlcyBvdmVyIGFzIGhvbGRlciB3aGVuIGl0IGhhcyBhIGNvcHksIGFuZCBvbmx5IHdpdGggbm8gbG9jYWwgY29weSBlaXRoZXIgaXMgdGhlIGVudHJ5IGZvcmdvdHRlbiAtIHdlIHdlcmUgd3JvbmcgYWJvdXQgd2hlcmUgdGhlIGZpbGUgaXMsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBpdCBoYXZpbmcgYmVlbiBkZWxldGVkLiBFbnRyaWVzIGNoYW5nZWQgYWZ0ZXIgdGhlIHNjYW4gc3RhcnRlZCBhcmUga2VwdDogdGhlIGxpc3RpbmcgbWF5IHNpbXBseSBwcmVkYXRlIHRoZW0uIFRvbWJzdG9uZXMgYXJlIG5vdCB3YWxrZWQgaGVyZSBhdCBhbGwsIGJlY2F1c2UgdGhleSBhcmUgbm90IGZpbGVzIGEgbGlzdGluZyBjb3VsZCB2b3VjaCBmb3IuXG4gICAgICAgIGxldCByZW1vdmVkRnJvbUluZGV4ID0gMDtcbiAgICAgICAgbGV0IHJlcG9pbnRlZFRvTG9jYWwgPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSBzY2FubmVkU291cmNlc0xpc3RJbmRleCAmJiBlbnRyeS5jaGFuZ2VkQXQgPCBzY2FuU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb2ludGVkVG9Mb2NhbCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICByZW1vdmVkRnJvbUluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb3VudGVkIG9ubHkgd2hlbiB0aGUgc291cmNlIFNIT1VMRCBob2xkIHRoZSBlbnRyeSAoaXRzIHJvdXRlIG1hdGNoZXMpIC0gdGhlc2UgYXJlIHdoYXQgdGhlIHJlY29uY2lsZSBwYXNzIHB1c2hlcyB0byBpdCAod2hpY2ggYWxzbyBpZ25vcmVzIHRoZSB2YWxpZCB3aW5kb3c6IHN5bmNocm9uaXphdGlvbiBtb3ZlcyBleGlzdGluZyB2YWx1ZXMsIHRoZSB3aW5kb3cgb25seSByb3V0ZXMgZnJlc2ggd3JpdGVzKVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbWlzc2luZ09uU291cmNlKys7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhbkZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc2NhblN0YXJ0LCBsaXN0ZWQ6IGZpbGVzLmxlbmd0aCwgaW5kZXhlZEJlZm9yZTogaW5kZXhTaXplQmVmb3JlLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkLCBvdXRzaWRlUm91dGU6IHRhbGx5LmZpbHRlcmVkLCBtaXNzaW5nT25Tb3VyY2UsIHJlcG9pbnRlZFRvTG9jYWwsIHJlbW92ZWRGcm9tSW5kZXggfSk7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBNYXRoLm1heChzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCBzY2FuU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUCk7XG4gICAgICAgIHN0YXRlLnNjYW5TdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gc2VlbjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHVzaCBkaXJlY3Rpb24gb2Ygc3luY2hyb25pemF0aW9uOiBldmVyeXRoaW5nIHdlIGtub3cgdGhhdCB0aGUgc291cmNlIGlzIG1pc3NpbmcgKG9yIGhvbGRzIGFuIG9sZGVyIGNvcHkgb2YpIGlzIHdyaXR0ZW4gdG8gaXQg4oCUIGluY2x1ZGluZyBkZWxldGlvbnMsIGFzIHRvbWJzdG9uZSB3cml0ZXMuIFRoaXMgaXMgd2hhdCBoZWFscyBhIHNvdXJjZSB3aG9zZSBiYWNrZ3JvdW5kIHdyaXRlcyBmYWlsZWQgKGUuZy4gaXQgd2FzIGRvd24pOiB0aGUgbmV4dCBzY2FuIHNlZXMgd2hhdCdzIG1pc3NpbmcgYW5kIHJlLXNlbmRzIGl0LiBBIGZhaWxpbmcgZmlsZSBpcyBza2lwcGVkLCBub3QgZmF0YWwgKGltbXV0YWJsZSB0YXJnZXRzIGFyZSBoYW5kbGVkIGJ5IGZvcmNlU2V0SW1tdXRhYmxlLCBhbmQgb25lIHVucmVhZGFibGUgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCBvZiB0aGUgcGFzcykgLSBvbmx5IGEgcnVuIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzICh0aGUgc291cmNlIGl0c2VsZiBpcyBkb3duKSBhYm9ydHMgdW50aWwgdGhlIG5leHQgc2NhbiBjeWNsZS5cbiAgICBwcml2YXRlIGFzeW5jIHB1c2hTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlciwgbGlzdGluZzogTWFwPHN0cmluZywgbnVtYmVyPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHZhbGlkV2luZG93cywgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IGFjY2VwdHNXcml0ZXMgPSB3aW5kb3dzQWNjZXB0V3JpdGVzKHZhbGlkV2luZG93cyk7XG4gICAgICAgIGxldCB0YXJnZXRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHB1c2hlZCA9IDA7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBsZXQgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIC8vIEZpbGVzIGZpcnN0LCB0aGVuIHRoZSBkZWxldGlvbnMgLSB0d28gd2Fsa3Mgbm93IHRoYXQgdGhleSBhcmUgdHdvIG1hcHMsIGFuZCB0aGUgZGVsZXRpb25zIG9uZSBpcyB0aGUgc2hvcnQgb25lXG4gICAgICAgIGxldCBwdXNoYWJsZTogeyBrZXk6IHN0cmluZzsgd3JpdGVUaW1lOiBudW1iZXI7IGVudHJ5PzogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSB0YXJnZXRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHB1c2hhYmxlLnB1c2goeyBrZXksIHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBlbnRyeSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuc3RvcmUuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHsga2V5LCB3cml0ZVRpbWUsIGVudHJ5IH0gb2YgcHVzaGFibGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgbm90IHJlY29uY2lsZWQ6IGl0IHByb3BhZ2F0ZXMgYnkgYmVpbmcgYXNrZWQgZm9yLCBvbiBpdHMgb3duIHNjaGVkdWxlIChzZWUgcG9sbFJvdXRpbmdDb25maWcpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhY2NlcHRzV3JpdGVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRoZWlyVGltZSA9IGxpc3RpbmcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodGhlaXJUaW1lICE9PSB1bmRlZmluZWQgJiYgdGhlaXJUaW1lID49IHdyaXRlVGltZSkgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBvbmx5IG5lZWRzIHB1c2hpbmcgd2hpbGUgdGhlIHNvdXJjZSBzdGlsbCBob2xkcyBhbiBvbGRlciBjb3B5LiBJdCB0cmF2ZWxzIGFzIGRlbCAobmV2ZXIgYXMgYW4gZW1wdHkgc2V0IC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycyksIHdpdGggdGhlIE9SSUdJTkFMIGRlbGV0aW9uIHRpbWUgc28gb3JkZXJpbmcgc3Vydml2ZXMuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGVpclRpbWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5kZWwoa2V5LCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBob2xkZXIgPSBhd2FpdCB0aGlzLnN0b3JlLmdldEVudHJ5SG9sZGVyKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IGhvbGRlciwgdG86IHNvdXJjZSwgcGF0aDoga2V5LCBwcmVzZXJ2ZVdyaXRlVGltZTogdHJ1ZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVbmRlZmluZWQgaXMgdHdvIGNhc2VzIChzZWUgY29weUFyY2hpdmVGaWxlKS4gVGhlIHNvdXJjZSBoYXZpbmcgYSBORVdFUiBmaWxlIHRoYW4gb3VyIGluZGV4ICh0aGUgbGlzdGluZyB3ZSBwdXNoZWQgZnJvbSB3YXMgc3RhbGUpIGlzIGFkb3B0ZWQgZXhhY3RseSB0aGUgd2F5IHRoZSBwdWxsIGRpcmVjdGlvbiBhZG9wdHMgYSBsaXN0aW5nIGVudHJ5IC0gYW5kIHB1c2hpbmcgb3VyIHN0YWxlIGNvcHkgc3RvcHMuIE90aGVyd2lzZSB0aGUgSE9MREVSIGNvdWxkIG5vdCBwcm9kdWNlIHRoZSBmaWxlLCB3aGljaCB0aGUgbmV4dCByb3VuZCdzIHB1bGwgcmUtcmVzb2x2ZXM7IGVpdGhlciB3YXksIHNpbGVuY2UgaGVyZSB3YXMgdGhlIGJ1Zy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRoZWlycyA9IGF3YWl0IHNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGVpcnMgJiYgdGhlaXJzLndyaXRlVGltZSA+IHdyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IHRoZWlycy53cml0ZVRpbWUsIHNpemU6IHRoZWlycy5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0YXJnZXRTb3VyY2VzTGlzdEluZGV4IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicHVzaEZvdW5kTmV3ZXJPblNvdXJjZVwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIG91cldyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpLCB0aGVpcldyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh0aGVpcnMud3JpdGVUaW1lKSwgb3VyU2l6ZTogZW50cnkuc2l6ZSwgdGhlaXJTaXplOiB0aGVpcnMuc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInB1c2hDb3B5VW5hdmFpbGFibGVcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBob2xkZXI6IGhvbGRlci5nZXREZWJ1Z05hbWUoKSwgZXhwZWN0ZWRTaXplOiBlbnRyeS5zaXplLCBleHBlY3RlZFdyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpLCBzb3VyY2VIYXM6IHRoZWlycyAmJiBgJHt0aGVpcnMuc2l6ZX0gYnl0ZXMgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHRoZWlycy53cml0ZVRpbWUpfWAgfHwgXCJub3RoaW5nXCIgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIHNldFwiLCBrZXksIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgICAgICBwdXNoZWQrKztcbiAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzKys7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPCBTWU5DX0VSUk9SX0xPR19MSU1JVCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtrZXl9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEEgcGF1c2UgcGVyIGZhaWx1cmUsIHNvIGEgZG93biBuZXR3b3JrIHRha2VzIG1pbnV0ZXMgdG8gYnVybiB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnRcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY29uY2lsaW5nIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBwdXNoZWQgJHtwdXNoZWR9IGZpbGVzLCAke2ZhaWxlZH0gZmFpbGVkJHthYm9ydGVkICYmIGAgYmVmb3JlIGFib3J0aW5nIHRoZSBwYXNzICgke2NvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlIGZhaWx1cmVzIC0gdGhlIHNvdXJjZSBsb29rcyBkb3duOyB0aGUgbmV4dCBzY2FuIGN5Y2xlIHJldHJpZXMpYCB8fCBcIlwifS4gRmlyc3QgZXJyb3JzOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInJlY29uY2lsZUZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwdXNoZWQsIGZhaWxlZCwgYWJvcnRlZCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleDogbnVtYmVyLCBmaWxlOiBBcmNoaXZlRmlsZUluZm8pOiBTY2FuT3V0Y29tZSB7XG4gICAgICAgIC8vIEFuIGluLWZsaWdodCBzY2FuIGNhbiBvdXRsaXZlIGl0cyBzb3VyY2UncyByZW1vdmFsOyBpdHMgcmVzdWx0cyBhcmUgZGVhZFxuICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKHNvdXJjZUluZGV4KSkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgTkVWRVIgcHVsbGVkIGZyb20gb3RoZXIgc291cmNlcyAtIGl0IG9ubHkgZXZlciBhcnJpdmVzIGFzIGFuIGV4cGxpY2l0LCB2ZXJzaW9uLXZhbGlkYXRlZCB3cml0ZSwgYW5kIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2suIFJvdXRlIGFuZCB2YWxpZC13aW5kb3cgZmlsdGVycyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byBpdCBlaXRoZXI6IGl0IGlzIHRoZSBmaWxlIERFRklOSU5HIHRoZW0sIHNvIGZpbHRlcmluZyBpdCB3b3VsZCBtZWFuIGNlcnRhaW4gc291cmNlcyBjb3VsZCBuZXZlciBoYXZlIHRoZWlyIHJvdXRpbmcgY29uZmlnIHVwZGF0ZWQsIGV2ZXIuXG4gICAgICAgICAgICBpZiAoc291cmNlSW5kZXggIT09IDApIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgdmFsaWQgd2luZG93IGlzIGRlbGliZXJhdGVseSBOT1QgYXBwbGllZCBoZXJlOiBpdCBkZWNpZGVzIHdoZXJlIFdSSVRFUyByb3V0ZSwgYnV0IGEgc2NhbiBpcyB1cyBhc2tpbmcgYSBzb3VyY2Ugd2hhdCBpdCBhbHJlYWR5IGhvbGRzIC0gZXhpc3RpbmcgdmFsdWVzIHN5bmNocm9uaXplIHJlZ2FyZGxlc3Mgb2YgdGhlIHdpbmRvdyAodGhlIHNhbWUgcmVhc29uaW5nIHRoYXQgbGV0cyBzeW5jaHJvbml6YXRpb24gaWdub3JlIHRoZSBpbW11dGFibGUgZmxhZykuIE9ubHkgdGhlIHJvdXRlIGZpbHRlcnM6IGEgcGFydGlhbGx5LW92ZXJsYXBwaW5nIHNoYXJkJ3MgbGlzdGluZyBsZWdpdGltYXRlbHkgaW5jbHVkZXMga2V5cyB0aGF0IGFyZW4ndCBvdXJzLlxuICAgICAgICAgICAgbGV0IHsgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGZpbGUucGF0aCkpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpO1xuICAgICAgICAvLyBUaGUgaGlnaGVzdCB3cml0ZSB0aW1lIHdpbnMgYWNyb3NzIGFsbCBzb3VyY2VzLCBhbmQgYSB0aWUga2VlcHMgd2hhdCB3ZSBoYXZlIC0gb3RoZXJ3aXNlIGV2ZXJ5IHJlc2NhbiBvZiBhbiB1bmNoYW5nZWQgZmlsZSB3b3VsZCByZS1yZWNvcmQgaXQsIG1vdmluZyBpdHMgaG9sZGVyIGFuZCB3cml0aW5nIGEgbG9nIHJlY29yZCBmb3Igbm90aGluZy4gY3VycmVudFdyaXRlVGltZSBjb3VudHMgZGVsZXRpb25zLCBzbyBhIGxpc3RpbmcgdGhhdCBzdGlsbCBzaG93cyBhIGZpbGUgd2Uga25vdyB3YXMgZGVsZXRlZCBkb2VzIG5vdCByZXN1cnJlY3QgaXQuXG4gICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGZpbGUucGF0aCkpIHJldHVybiBcInVuY2hhbmdlZFwiO1xuICAgICAgICAvLyBTaXplIDAgaW4gYSBsaXN0aW5nIElTIGEgZGVsZXRpb24gLSBhbiBlbXB0eSBmaWxlIGlzIGEgbWlzc2luZyBmaWxlIC0gc28gdGhhdCBpcyB3aGF0IGl0IGlzIHRha2VuIGFzXG4gICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgIHJldHVybiBcInRvbWJzdG9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShmaWxlLnBhdGgsIHsgd3JpdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KSB9KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gXCJ1cGRhdGVkXCI7XG4gICAgICAgIHJldHVybiBcIm5ld1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcG9sbENoYW5nZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwb2xsU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIyKHsgdGltZTogc3RhdGUuY2hhbmdlc0FmdGVyVGltZSwgcm91dGVzOiByb3V0ZSAmJiBbcm91dGVdIHx8IHVuZGVmaW5lZCwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICAvLyBQb2xscyBydW4gY29uc3RhbnRseSwgc28gb25seSB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGNoYW5nZWQgdGhlIGluZGV4IGdldCBhbiBlbnRyeVxuICAgICAgICBpZiAodGFsbHkubmV3IHx8IHRhbGx5LnVwZGF0ZWQgfHwgdGFsbHkudG9tYnN0b25lKSB7XG4gICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJjaGFuZ2VzUG9sbFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBjaGFuZ2VzOiBjaGFuZ2VzLmxlbmd0aCwgbmV3UGF0aHM6IHRhbGx5Lm5ldywgdXBkYXRlZDogdGFsbHkudXBkYXRlZCwgdG9tYnN0b25lczogdGFsbHkudG9tYnN0b25lLCB1bmNoYW5nZWQ6IHRhbGx5LnVuY2hhbmdlZCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgKz0gY2hhbmdlcy5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBwb2xsU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUDtcbiAgICB9XG5cbiAgICAvLyBEb3dubG9hZHMgdGhlIGZpbGVzIGEgc291cmNlIGN1cnJlbnRseSBob2xkcyBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgcHJlc2VydmluZyB0aGVpciBtb2RpZmllZCB0aW1lcyDigJQgc28gYSBuZXdlciBsb2NhbCB3cml0ZSBhbHdheXMgd2lucy4gU2tpcHBlZCBmb3Igbm9GdWxsU3luYyBzb3VyY2VzIChmcm9udGluZyBhIGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyBpdCk7IHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgbGF6aWx5LiBPbmx5IG9uZSBwYXNzIHBlciBTT1VSQ0UgcnVucyBhdCBhIHRpbWUgKGNhY2hlIGtleXMgdGhlIHNlcmlhbGl6ZXIgYnkgc291cmNlIGluZGV4KSAtIHR3byBwYXNzZXMgb3ZlciB0aGUgc2FtZSBwZW5kaW5nIGxpc3Qgd291bGQgZG93bmxvYWQgZXZlcnl0aGluZyB0d2ljZS5cbiAgICBwcml2YXRlIGNvcHlTb3VyY2VGaWxlcyA9IGNhY2hlKChzb3VyY2VJbmRleDogbnVtYmVyKSA9PiBydW5JblNlcmlhbChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBlbmRpbmc6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGxldCBjb3BpZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBjb3BpZWRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVsbFN5bmNcIixcbiAgICAgICAgICAgIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZG9uZUZpbGVzOiAwLFxuICAgICAgICAgICAgdG90YWxGaWxlczogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgICAgICBkb25lQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgZGlmZkJhc2VkOiBzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciwgZmlsZXM6IHBlbmRpbmcubGVuZ3RoLCBieXRlczogdG90YWxCeXRlcyB9KTtcbiAgICAgICAgbGV0IHByb2dyZXNzTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBsb2dQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyZXNzTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYERlbHRhIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHthY3Rpdml0eS5kb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeygoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpYCkpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKGxvZ1Byb2dyZXNzLCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgbGV0IHNsb3dFcnJvclRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lO1xuICAgICAgICAgICAgbGV0IGRvbmVGaWxlcyA9IGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGRvbmVCeXRlcyA9IGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGJ5dGVzUGVyU2Vjb25kID0gZG9uZUJ5dGVzIC8gKGVsYXBzZWQgLyAxMDAwKTtcbiAgICAgICAgICAgIGxldCByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXMgLSBkb25lQnl0ZXM7XG4gICAgICAgICAgICBsZXQgZXRhVGV4dCA9IFwidW5rbm93biAobm8gYnl0ZXMgdHJhbnNmZXJyZWQgeWV0KVwiO1xuICAgICAgICAgICAgaWYgKGJ5dGVzUGVyU2Vjb25kID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdNcyA9IHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNQZXJTZWNvbmQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIGV0YVRleHQgPSBgJHtmb3JtYXRUaW1lKHJlbWFpbmluZ01zKX0gcmVtYWluaW5nLCBjb21wbGV0aW5nIGFyb3VuZCAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQoRGF0ZS5ub3coKSArIHJlbWFpbmluZ01zKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBEZWx0YSBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgaGFzIGJlZW4gcnVubmluZyBmb3IgJHtmb3JtYXRUaW1lKGVsYXBzZWQpfTogJHtkb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeyhkb25lRmlsZXMgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoZG9uZUJ5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgZG9uZUJ5dGVzIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGJ5dGVzUGVyU2Vjb25kKX1CL3MuIEVzdGltYXRlZCAke2V0YVRleHR9LmApO1xuICAgICAgICB9LCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCk7XG4gICAgICAgIChzbG93RXJyb3JUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBsZXQgY29waWVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHNvdXJjZSBjYW5ub3QgZ2l2ZSB1cyB0aGUgZmlsZSAoaXRzIHJlYWQgaGFkIG5vdGhpbmcsIG9yIGl0IGVycm9yZWQpLiBSZXRyeWluZyB0aGUgc2FtZSBlbnRyeSBmb3JldmVyIGlzIG5vdCBhbiBhbnN3ZXI6IGlmIG91ciBvd24gZGlzayBob2xkcyBhIGNvcHksIElUIGJlY29tZXMgdGhlIGhvbGRlcjsgd2l0aCBubyBsb2NhbCBjb3B5IGVpdGhlciwgdGhlIGVudHJ5IGlzIHB1cmdlZCAtIGZvcmdvdHRlbiwgbm90IGRlbGV0ZWQsIGV4YWN0bHkgbGlrZSBhIHJlYWQgdGhhdCBjb21lcyB1cCBlbXB0eSBldmVyeXdoZXJlIC0gYW5kIHRoZSBuZXh0IGZ1bGwgcHVsbCByZS1maW5kcyBpdCBpZiBpdCBleGlzdHMgYW55d2hlcmUuXG4gICAgICAgIGxldCByZXNvbHZlVW5hdmFpbGFibGUgPSBhc3luYyAoZXZlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGVudHJ5OiBJbmRleEVudHJ5LCBleHRyYTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlID0geyBldmVudCwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIC4uLmV4dHJhIH07XG4gICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBsb2NhbCBjb3B5IGNhbiBiZSBORVdFUiB0aGFuIHRoZSBlbnRyeSAod2hpY2ggaXMgZXhhY3RseSB3aHkgY29weUFyY2hpdmVGaWxlIHJlZnVzZXMgdG8gb3ZlcndyaXRlIGl0IC0gc2VlIGl0cyBkZXN0aW5hdGlvbiBjaGVjayksIHNvIHRoZSByZXBvaW50IGtlZXBzIHRoZSBuZXdlciBvZiB0aGUgdHdvIHRpbWVzIHJhdGhlciB0aGFuIHJvbGxpbmcgdGhlIGluZGV4IGJhY2tcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogTWF0aC5tYXgoZW50cnkud3JpdGVUaW1lLCBsb2NhbC53cml0ZVRpbWUpLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgLi4uYmFzZSwgcmVzb2x1dGlvbjogXCJyZXBvaW50ZWQgdG8gb3VyIGxvY2FsIGNvcHlcIiwgbG9jYWxTaXplOiBsb2NhbC5zaXplLCBsb2NhbFdyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChsb2NhbC53cml0ZVRpbWUpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSA8PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IC4uLmJhc2UsIHJlc29sdXRpb246IFwicHVyZ2VkIC0gbmVpdGhlciB0aGUgc291cmNlIG5vciBvdXIgZGlzayBoYXMgaXQsIHNvIGl0IGRvZXMgbm90IGV4aXN0XCIgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQSBuZXdlciB3cml0ZSBsYW5kZWQgd2hpbGUgd2Ugd2VyZSBjaGVja2luZyAtIHRoZSBlbnRyeSBpcyBubyBsb25nZXIgdGhlIG9uZSB3ZSBmb3VuZCB1bmF2YWlsYWJsZSwgc28gaXQgaXMgbGVmdCBhbG9uZVxuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgLi4uYmFzZSwgcmVzb2x1dGlvbjogXCJrZXB0IC0gYSBuZXdlciB3cml0ZSBhcHBlYXJlZCB3aGlsZSBjaGVja2luZ1wiLCBjdXJyZW50V3JpdGVUaW1lOiB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgbGV0IGNvcHlXb3JrZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFhYm9ydGVkICYmICF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG5leHRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsga2V5LCBlbnRyeSB9ID0gcGVuZGluZ1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogc291cmNlLCB0bzogdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZSwgcGF0aDoga2V5LCBwcmVzZXJ2ZVdyaXRlVGltZTogdHJ1ZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZEJ5dGVzICs9IGNvcGllZC5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgZ2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3B5IGNhcnJpZXMgdGhlIHNvdXJjZSdzIHdyaXRlIHRpbWUsIGFuZCB0aGUgaW5kZXggY29tbWl0cyBpdCB1bmRlciB0aGUgbm9ybWFsIG9yZGVyaW5nIHJ1bGUgKD49IHRoZSBjdXJyZW50IHRpbWUgd2lucykgLSBpdCByZWZ1c2luZyBtZWFucyBhIE5FV0VSIHdyaXRlIGxhbmRlZCB3aGlsZSB3ZSBjb3BpZWQsIHdoaWNoIG11c3QgYmUgc2FpZCwgbm90IHN3YWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jQ29tbWl0U3VwZXJzZWRlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGNvcGllZFdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJkZWx0YVN5bmNNaXNzaW5nT25Tb3VyY2VcIiwga2V5LCBlbnRyeSwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGluZyBmaWxlIHJlc29sdmVzIGV4YWN0bHkgbGlrZSBhIG1pc3Npbmcgb25lICh0aGUgc291cmNlIGNhbm5vdCBnaXZlIGl0IHRvIHVzIGVpdGhlciB3YXkpLCBzbyBpdCBuZXZlciB3ZWRnZXMgdGhlIHBhc3Mgb24gcmV0cmllcyBmb3JldmVyIC0gYW5kIHRoZSBuZXh0IGZ1bGwgcHVsbCByZS1maW5kcyBpdCBpZiB0aGUgc291cmNlIHJlY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzb2x2ZVVuYXZhaWxhYmxlKFwiZGVsdGFTeW5jQ29weUZhaWxlZFwiLCBrZXksIGVudHJ5LCB7IGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocmVzb2x2ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jQ29weUZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApLCByZXNvbHZlRXJyb3I6IFN0cmluZygocmVzb2x2ZUVycm9yIGFzIEVycm9yKS5zdGFjayA/PyByZXNvbHZlRXJyb3IpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBhdXNlIHBlciBmYWlsdXJlLCBzbyBhIGRvd24gbmV0d29yayB0YWtlcyBtaW51dGVzIHRvIGJ1cm4gdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2UgaW5zdGVhZCBvZiBhbiBpbnN0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImRlbHRhU3luY0ZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkaWZmQmFzZWQ6IHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lLCB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCwgdG90YWxCeXRlcywgcHJvY2Vzc2VkRmlsZXM6IGFjdGl2aXR5LmRvbmVGaWxlcywgY29waWVkRmlsZXMsIGNvcGllZEJ5dGVzLCBtaXNzaW5nT25Tb3VyY2UsIGZhaWxlZCwgYWJvcnRlZCB9KTtcbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIC8vIOKUgOKUgCBtYWludGVuYW5jZSDilIDilIBcblxuICAgIC8vIHJlYWRlckRpc2tMaW1pdDogdGhlIGRpc2sgaXMgb25seSBhIGJvdW5kZWQgcmVhZCBjYWNoZSwgc28gb25jZSBpdCBleGNlZWRzIHRoZSBsaW1pdCwgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZmlsZXMgYXJlIGRlbGV0ZWQgZnJvbSBpdCAtIGJ1dCBPTkxZIHdoZW4gYW5vdGhlciBzb3VyY2UgdmVyaWZpYWJseSBob2xkcyBhIHNhbWUtb3ItbmV3ZXIgY29weSAodGhlIG9ubHkgY29weSBvZiBhIGZpbGUgaXMgbmV2ZXIgZGVsZXRlZCksIGFuZCB0aGUgaW5kZXggZW50cnkgcmVwb2ludHMgdG8gdGhhdCBzb3VyY2Ugc28gcmVhZHMga2VlcCB3b3JraW5nIChyZS1jYWNoaW5nIG9uIHRoZSBuZXh0IHJlYWQpLlxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZURpc2tMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGxpbWl0ID0gdGhpcy5zdG9yZS5yZWFkZXJEaXNrTGltaXQ7XG4gICAgICAgIGlmICghbGltaXQgfHwgdGhpcy5ldmljdGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5zdG9yZS5pbmRleFRvdGFscygpO1xuICAgICAgICAvLyBDb3VudGVkIGRvd24gYXMgd2UgZXZpY3QsIHJhdGhlciB0aGFuIHJlLXJlYWQgcGVyIGZpbGU6IGEgcGFzcyBvbmx5IGV2ZXIgcmVtb3ZlcyBieXRlcyBmcm9tIHRoZSBkaXNrLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBkdXJpbmcgaXQgaXMgcGlja2VkIHVwIGJ5IHRoZSBuZXh0IHBhc3NcbiAgICAgICAgbGV0IGRpc2tCeXRlcyA9IHRvdGFscy5zbG90c1swXS5ieXRlQ291bnQ7XG4gICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5ldmljdGluZyA9IHRydWU7XG4gICAgICAgIGxldCBldmljdGVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgZXZpY3RlZEJ5dGVzID0gMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBiYXNlU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKTtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4IHx8IGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBrZXksIGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGVhc3QgcmVjZW50bHkgUkVBRCBmaXJzdDsgYSBrZXkgbm9ib2R5IGhhcyByZWFkIHNpbmNlIHdlIHN0YXJ0ZWQgZmFsbHMgYmFjayB0byB3aGVuIHdlIGxhc3QgY2hhbmdlZCBpdFxuICAgICAgICAgICAgc29ydChjYW5kaWRhdGVzLCB4ID0+IHRoaXMubGFzdEFjY2Vzcy5nZXQoeC5rZXkpIHx8IHguZW50cnkuY2hhbmdlZEF0KTtcbiAgICAgICAgICAgIGZvciAobGV0IHsga2V5LCBlbnRyeSB9IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoZGlza0J5dGVzIDw9IGxpbWl0KSBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW50cnlVbmNoYW5nZWQoa2V5LCBlbnRyeSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBob2xkZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoaG9sZGVyKSB9KTtcbiAgICAgICAgICAgICAgICBldmljdGVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICBldmljdGVkQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICBkaXNrQnl0ZXMgLT0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmljdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGlzayBjYWNoZSBvdmVyIHJlYWRlckRpc2tMaW1pdCAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBldmljdGVkICR7ZXZpY3RlZEZpbGVzfSBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihldmljdGVkQnl0ZXMpfUIpLCBub3cgYXQgJHtmb3JtYXROdW1iZXIoZGlza0J5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKGxpbWl0KX1CYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb21ic3RvbmVzIG9ubHkgbmVlZCB0byBleGlzdCBsb25nIGVub3VnaCBmb3IgZXZlcnkgc3RvcmUgdG8gbGVhcm4gb2YgdGhlIGRlbGV0aW9uOyBleHBpcmVkIG9uZXMgYXJlIGZvcmdvdHRlbiBlbnRpcmVseS4gQSB3YWxrIG9mIHRoZSB0b21ic3RvbmVzIGFsb25lLCB3aGljaCBpcyB3aHkgaXQgY2FuIHJ1biBvZnRlbiBhbmQgY29zdCBub3RoaW5nLiBUaGUgcGh5c2ljYWwgZW1wdHkgZmlsZSBpcyByZW1vdmVkIG9ubHkgb24gYmFja2JsYXplIHNvdXJjZXM6IHJlbW90ZSBzdG9yZXMgZXhwaXJlIHRoZWlyIG93biB0b21ic3RvbmVzIChhIGRlbCB0aGVyZSB3b3VsZCBqdXN0IG1pbnQgYSBmcmVzaCBvbmUpLCBhbmQgb3VyIG93biBkaXNrIG5ldmVyIHN0b3JlZCBhbnl0aGluZyBmb3IgaXQuXG4gICAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVG9tYnN0b25lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBUT01CU1RPTkVfRVhQSVJZO1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuc3RvcmUuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLndyaXRlVGltZSA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICAvLyBBIE1BUktFRCBkZWxldGlvbiBuZXZlciBleHBpcmVzIGJ5IHRpbWUgLSBpdHMgYnl0ZXMgYXJlIHN0aWxsIG9uIGRpc2ssIGFuZCBwdXJnaW5nIHRoZSB0b21ic3RvbmUgd291bGQgbGV0IHRoZSBuZXh0IGRpc2sgc2NhbiByZXN1cnJlY3QgdGhlbSBhcyBsaXZlLiBSZXRlbnRpb24gZXhwaXJlcyBpdCBieSBTSVpFIChlbmZvcmNlSGlzdG9yeUxpbWl0KTsgb25seSBvbmNlIHRoZSBieXRlcyBhcmUgZ29uZSBkb2VzIHRoZSBwbGFpbiB0b21ic3RvbmUgYWdlIG91dCBoZXJlLlxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuZ2V0TWFya2VkRW50cnkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRW50cnkgPSB0aGlzLnN0b3JlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3dzQWNjZXB0V3JpdGVzKHNvdXJjZUVudHJ5LnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VFbnRyeS5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQXJjaGl2ZXNCYWNrYmxhemUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB2b2lkIHNvdXJjZS5kZWwoa2V5KS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVtb3ZpbmcgZXhwaXJlZCB0b21ic3RvbmUgJHtrZXl9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWxldGlvbiBoaXN0b3J5IHJldGVudGlvbjogbWFya2VkIGZpbGVzIGtlZXAgdGhlaXIgYnl0ZXMgb24gb3VyIGRpc2sgdW50aWwgdGhlIGhpc3Rvcnkgb3V0Z3Jvd3MgbWF4KEhJU1RPUllfTUlOX0JZVEVTLCBsaXZlIGJ5dGVzICogaGlzdG9yeSBmYWN0b3IpOyB0aGVuIHRoZSBPTERFU1QgZGVsZXRpb25zIGxvc2UgdGhlaXIgYnl0ZXMgYW5kIGJlY29tZSBwbGFpbiB0b21ic3RvbmVzLCB3aGljaCBhZ2Ugb3V0IG5vcm1hbGx5IChjbGVhbnVwVG9tYnN0b25lcylcbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VIaXN0b3J5TGltaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gTWF0aC5tYXgoSElTVE9SWV9NSU5fQllURVMsIHRoaXMuc3RvcmUuaW5kZXhUb3RhbHMoKS5ieXRlQ291bnQgKiBhd2FpdCBnZXRIaXN0b3J5RmFjdG9yKCkpO1xuICAgICAgICBsZXQgbWFya2VkOiB7IGtleTogc3RyaW5nOyBzaXplOiBudW1iZXI7IGRlbGV0ZVRpbWU6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIG1hcmtlZC5wdXNoKHsga2V5LCBzaXplOiBlbnRyeS5zaXplLCBkZWxldGVUaW1lOiBlbnRyeS5kZWxldGVUaW1lIH0pO1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXJ0ZWRXaXRoQnl0ZXMgPSB0b3RhbEJ5dGVzO1xuICAgICAgICBzb3J0KG1hcmtlZCwgeCA9PiB4LmRlbGV0ZVRpbWUpO1xuICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgIGxldCBkcm9wcGVkQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCB7IGtleSwgc2l6ZSB9IG9mIG1hcmtlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodG90YWxCeXRlcyA8PSBhbGxvd2VkKSBicmVhaztcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZHJvcE1hcmtlZEhpc3Rvcnkoa2V5KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgLT0gc2l6ZTtcbiAgICAgICAgICAgIGRyb3BwZWQrKztcbiAgICAgICAgICAgIGRyb3BwZWRCeXRlcyArPSBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGlvbiBoaXN0b3J5IG9mIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9IG91dGdyZXcgaXRzIGJ1ZGdldCAoJHtmb3JtYXROdW1iZXIoc3RhcnRlZFdpdGhCeXRlcyl9QiBrZXB0IHZzICR7Zm9ybWF0TnVtYmVyKGFsbG93ZWQpfUIgYWxsb3dlZCk6IGRyb3BwZWQgdGhlICR7ZHJvcHBlZH0gb2xkZXN0IG1hcmtlZCBmaWxlcyAoJHtmb3JtYXROdW1iZXIoZHJvcHBlZEJ5dGVzKX1CKTsgdGhlaXIgdG9tYnN0b25lcyByZW1haW4gdW50aWwgdGhleSBhZ2Ugb3V0YCk7XG4gICAgfVxufVxuIl19
|
|
828
|
-
/* _JS_SOURCE_HASH = "
|
|
830
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUErRztBQUMvRyx5REFBb0Q7QUFDcEQsbURBQTBFO0FBQzFFLGtFQUF5RztBQUN6Ryw0Q0FHc0I7QUFDdEIsc0RBQW9EO0FBQ3BELDRDQUFpRDtBQUNqRCxpREFBMkc7QUFFM0csMkNBQWtFO0FBQ2xFLCtDQUE2QztBQUM3Qyx3RUFBbUU7QUFFbkUsa2JBQWtiO0FBRWxiLHlFQUF5RTtBQUN6RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEMsbU1BQW1NO0FBQ25NLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Msa1FBQWtRO0FBQ2xRLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDNUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Qsc0dBQXNHO0FBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsbUJBQVksQ0FBQztBQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsb0xBQW9MO0FBQ3BMLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELG1GQUFtRjtBQUNuRixNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVDLHdJQUF3STtBQUN4SSxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3Qiw4S0FBOEs7QUFD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QUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUNwQyxJQUFJLFVBQVUsSUFBSSxPQUFPO2dCQUFFLE1BQU07WUFDakMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLFVBQVUsSUFBSSxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixZQUFZLElBQUksSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sd0JBQXdCLElBQUEscUJBQVksRUFBQyxnQkFBZ0IsQ0FBQyxhQUFhLElBQUEscUJBQVksRUFBQyxPQUFPLENBQUMsMkJBQTJCLE9BQU8seUJBQXlCLElBQUEscUJBQVksRUFBQyxZQUFZLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUM3UixDQUFDO0NBQ0o7QUEvc0JELDhCQStzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwsIGRlbGF5LCBydW5JbmZpbml0ZVBvbGxDYWxsQXRTdGFydCwgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgY2FjaGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQsIHByb21pc2VPYmogfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUsIGZvcm1hdERhdGVUaW1lRGV0YWlsZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBTeW5jQWN0aXZpdHksIEZVTExfUk9VVEUsXG4gICAgd2luZG93c0FjY2VwdFdyaXRlcyxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4uL2FyY2hpdmVIZWxwZXJzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHBhcnNlUm91dGluZ0RhdGEsIGdldENvbmZpZ1ZlcnNpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQmxvYlN0b3JlLCBJbmRleEVudHJ5IH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRIaXN0b3J5RmFjdG9yLCBISVNUT1JZX01JTl9CWVRFUyB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHsgbG9nU3luY0V2ZW50IH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcbmltcG9ydCB7IG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBFdmVyeXRoaW5nIHRoYXQga2VlcHMgYSBzdG9yZSdzIGluZGV4IGluIGFncmVlbWVudCB3aXRoIGl0cyBzb3VyY2VzLCBwbHVzIHRoZSB0d28gbWFpbnRlbmFuY2UgbG9vcHMgdGhhdCBmb2xsb3cgZnJvbSBob2xkaW5nIGFuIGluZGV4IChldmljdGluZyBhIGJvdW5kZWQgZGlzayBjYWNoZSwgZXhwaXJpbmcgdG9tYnN0b25lcykuIFRoZSBzdG9yZSBvd25zIHRoZSBzb3VyY2VzIGFuZCBkZWNpZGVzIHdoZXJlIHdyaXRlcyBnbzsgdGhpcyBkZWNpZGVzIHdoYXQgaXMgc2Nhbm5lZCwgcHVsbGVkLCBwdXNoZWQsIGV2aWN0ZWQsIGFuZCBmb3Jnb3R0ZW4gLSBzbyB0aGUgd3JpdGUgcGF0aCBzdGF5cyByZWFkYWJsZSB3aXRob3V0IHRoZSBzZXZlcmFsIGh1bmRyZWQgbGluZXMgb2Ygc3luY2hyb25pemF0aW9uIG1hY2hpbmVyeSBpbnRlcmxlYXZlZCBpbnRvIGl0LlxuXG4vLyBTb3VyY2VzIHdpdGggYSBuYXRpdmUgKGluZGV4LWJhY2tlZCkgY2hhbmdlIGZlZWQgYXJlIHBvbGxlZCB0aGlzIG9mdGVuXG5jb25zdCBDSEFOR0VTX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBUaGUgcm91dGluZyBjb25maWcgaXMgY2hlY2tlZCBmb3Igb24gZXZlcnkgcGVlciB0aGlzIG9mdGVuIC0gZmFyIG1vcmUgb2Z0ZW4gdGhhbiBhIGZ1bGwgcmVzY2FuLCBiZWNhdXNlIGl0IGlzIHRoZSBmaWxlIHRoYXQgZGVjaWRlcyB3aGF0IGV2ZXJ5dGhpbmcgZWxzZSBkb2VzLCBhbmQgaXQgaXMgb25lIHNtYWxsIHJlYWQgcGVyIHBlZXJcbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNTtcbi8vIEZ1bGwgbWV0YWRhdGEgcmVzY2Fucy4gc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgaXMgdGhlIGhldXJpc3RpYyBmb3IgXCJvbmUgb2Ygb3VyIG93biBzdG9yYWdlIHNlcnZlcnNcIjogdGhlaXIgaW5kZXgtYmFja2VkIGxpc3RpbmdzIGFyZSBjaGVhcCwgc28gaG91cmx5IGlzIGZpbmUuIEV2ZXJ5dGhpbmcgZWxzZSAoYmFja2JsYXplLCBwbGFpbiBkaXNrKSBwYXlzIHRoZSBmdWxsIGxpc3RpbmcgY29zdCwgc28gaXQgcmVzY2FucyBtdWNoIGxlc3Mgb2Z0ZW4uXG5jb25zdCBGVUxMX1JFU0NBTl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuY29uc3QgRlVMTF9SRVNDQU5fTk9OX1JFTU9URV9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwICogNjtcbi8vIENoYW5nZSBwb2xscyByZS1yZXF1ZXN0IHRoaXMgbXVjaCBvdmVybGFwLCBzbyBjbG9jayBza2V3IGJldHdlZW4gdXMgYW5kIGEgc291cmNlIGNhbid0IGRyb3AgY2hhbmdlc1xuY29uc3QgQ0hBTkdFU19QT0xMX09WRVJMQVAgPSB0aW1lSW5NaW51dGU7XG5jb25zdCBTQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDMwO1xuLy8gRGVsZXRlcyBhcmUgdG9tYnN0b25lcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSBzaXplLTAgaW5kZXggZW50cnkgaXMgd2hhdCBsZXRzIGEgZGVsZXRpb24gcHJvcGFnYXRlL3JlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgYW5kIGl0IGV4cGlyZXMgYWZ0ZXIgdGhpcyBsb25nXG5jb25zdCBUT01CU1RPTkVfRVhQSVJZID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5jb25zdCBUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gV2hpbGUgYSBtZXRhZGF0YSBzY2FuIG9yIGZ1bGwgc3luYyBpcyBydW5uaW5nLCBpdHMgcHJvZ3Jlc3MgaXMgbG9nZ2VkIHRoaXMgb2Z0ZW5cbmNvbnN0IFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuY29uc3QgRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIEZ1bGwgc3luY3MgZG93bmxvYWQgdGhpcyBtYW55IGZpbGVzIGNvbmN1cnJlbnRseSAoaGlnaC1sYXRlbmN5IHNvdXJjZXMgbGlrZSBiYWNrYmxhemUgd291bGQgb3RoZXJ3aXNlIGNyYXdsIG9uZSByb3VuZC10cmlwIGF0IGEgdGltZSlcbmNvbnN0IEZVTExfU1lOQ19QQVJBTExFTCA9IDg7XG4vLyBBIGZ1bGwgc3luYyBydW5uaW5nIGxvbmdlciB0aGFuIHRoaXMgaXMgY29uc29sZS5lcnJvcmVkIChhbmQgYWdhaW4gZXZlcnkgaW50ZXJ2YWwgYWZ0ZXIpLCBzbyBhIHN5bmMgdGhhdCB3aWxsIHRha2UgZGF5cyBpcyBsb3VkIGluc3RlYWQgb2YgYSBxdWlldCBjb25zb2xlLmxvZyBldmVyeSBtaW51dGVcbmNvbnN0IEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBSZWNvbmNpbGUgcGFzc2VzIEFORCBmdWxsIHN5bmNzIHNraXAgZmFpbGluZyBmaWxlcyAob25lIGJhZCB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IC0gYSBzb3VyY2UgZmFpbGluZyBvbmUgcmVxdWVzdCBpbiBhIHRob3VzYW5kIGNvdWxkIG90aGVyd2lzZSBuZXZlciBmaW5pc2ggYSBzeW5jKSwgYnV0IHRoaXMgbWFueSBmYWlsdXJlcyBpbiBhIHJvdyBtZWFucyB0aGUgb3RoZXIgc2lkZSBpdHNlbGYgaXMgZG93biwgc28gdGhlIHBhc3MgYWJvcnRzIHVudGlsIHRoZSBuZXh0IGN5Y2xlXG5jb25zdCBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUyA9IDU7XG5jb25zdCBTWU5DX0VSUk9SX0xPR19MSU1JVCA9IDM7XG4vLyBFdmVyeSBmYWlsZWQgZmlsZSB3YWl0cyB0aGlzIGxvbmcgYmVmb3JlIHRoZSBwYXNzIGNvbnRpbnVlcywgc28gYSBkb3duIG5ldHdvcmsgYnVybnMgdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2Ugb3ZlciBhIG1pbnV0ZS1wbHVzIGluc3RlYWQgb2YgaW4gYW4gaW5zdGFudFxuY29uc3QgU1lOQ19GQUlMVVJFX0RFTEFZID0gMTAwMCAqIDE1O1xuLy8gQSBmdWxsIGxpc3RpbmcgdGhhdCBjb21lcyBiYWNrIEVNUFRZIC0gb3IgdW5kZXIgaGFsZiBvZiB3aGF0IHdlIGtub3cgdGhlIHNvdXJjZSBob2xkcyAtIGlzIHRyZWF0ZWQgYXMgdGhlIG90aGVyIGVuZCBiZWluZyBicmllZmx5IGJyb2tlbiwgbm90IGFzIHRoZSB0cnV0aDogaXQgaXMgcmV0cmllZCB0aGlzIG1hbnkgdGltZXMsIHRoaXMgZmFyIGFwYXJ0LCBiZWZvcmUgYmVpbmcgYmVsaWV2ZWQuIEJlbGlldmluZyBhIHdyb25nbHktc2hydW5rZW4gbGlzdGluZyBwdXJnZXMgZXZlcnkgaW5kZXggZW50cnkgdGhlIHNvdXJjZSBoZWxkLCB3aGljaCBpcyBob3cgc3luYyBwcm9ncmVzcyBcImdvZXMgYmFja3dhcmRzXCIuXG5jb25zdCBTVVNQSUNJT1VTX1NDQU5fUkVUUklFUyA9IDM7XG5jb25zdCBTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkgPSAxMDAwICogNjA7XG4vLyBIb3cgbG9uZyBwYXN0IHRoZSBlbmQgb2YgYSBzb3VyY2UncyBsYXN0IHdpbmRvdyB3ZSBhcmUgc3RpbGwgd2lsbGluZyB0byByZWFkIChzY2FuKSBpdC4gV2UgY2FuJ3QgcmVhZCBmcm9tIGEgc291cmNlIHRoYXQncyB0b28gb2xkLCBiZWNhdXNlIG91ciB0b21ic3RvbmVzIG9ubHkgbGFzdCBzbyBsb25nIChUT01CU1RPTkVfRVhQSVJZKTogYSBzb3VyY2Ugd2hvc2Ugd2luZG93cyBhcmUgYWxsIHBhc3QgbmV2ZXIgcmVjZWl2ZXMgZGVsZXRpb25zICh0aGUgd2luZG93IGdhdGVzIHdyaXRlcywgZGVsZXRpb25zIGluY2x1ZGVkKSwgc28gaXQgbmV2ZXIga25ldyBhYm91dCBvdXIgdG9tYnN0b25lcyAtIGFuZCBpZiB3ZSByZWFkIGl0IGFmdGVyIGEgdG9tYnN0b25lIGV4cGlyZXMsIGl0IGNhbiByZXN1cnJlY3QgYSBkZWFkIHZhbHVlLiBXaGlsZSB3ZSBETyByZWFkIGl0LCBvdXIgb3duIHRvbWJzdG9uZSBpcyB3aGF0IHJlZnV0ZXMgaXRzIHN0YWxlIGxpc3RpbmdzLCBzbyB0aGlzIGR1cmF0aW9uIG11c3Qgc3RheSBmYXIgYmVsb3cgVE9NQlNUT05FX0VYUElSWS5cbmNvbnN0IFBBU1RfUkVBRF9EVVJBVElPTiA9IDEwMDAgKiA2MCAqIDYwO1xuXG50eXBlIFNvdXJjZVN0YXRlID0ge1xuICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBib29sZWFuO1xuICAgIGluaXRpYWxTY2FuOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9taXNlT2JqPjtcbiAgICBzY2FuQ29tcGxldGU6IGJvb2xlYW47XG4gICAgLy8gV2hldGhlciBhIHNjYW4gb2YgdGhpcyBzb3VyY2UgaGFzIGV2ZXIgYWN0dWFsbHkgU1VDQ0VFREVEIC0gd2hhdCBmdWxsIHN5bmNzIGdhdGUgb246IHdpdGhvdXQgb25lLCB0aGUgaW5kZXgncyB2aWV3IG9mIHRoaXMgc291cmNlIGNhbiBiZSBhcmJpdHJhcmlseSBzdGFsZSAoZS5nLiBpdCB3YXMgcmVzdGFydGluZyB3aGVuIHdlIGZpcnN0IHRyaWVkKSwgYW5kIHN5bmNpbmcgZnJvbSBzdGFsZSBpbmZvcm1hdGlvbiBjaHVybnMgZm9yZXZlclxuICAgIHNjYW5TdWNjZWVkZWQ6IGJvb2xlYW47XG4gICAgLy8gRmlsZXMgc2VlbiBpbiB0aGlzIHNvdXJjZSdzIHNjYW5zIC8gY2hhbmdlIHBvbGxzIHNvIGZhclxuICAgIHNjYW5uZWRDb3VudDogbnVtYmVyO1xuICAgIC8vIFdhdGVybWFyayBmb3IgZ2V0Q2hhbmdlc0FmdGVyMiBwb2xsc1xuICAgIGNoYW5nZXNBZnRlclRpbWU6IG51bWJlcjtcbiAgICAvLyBQZXItc2xvdCBzdG9wIHRva2VuOiBhIHJlbW92ZWQgc291cmNlJ3MgbG9vcHMgc3RvcCB3aXRob3V0IHRvdWNoaW5nIHRoZSByZXN0IG9mIHRoZSBzdG9yZVxuICAgIHN0b3BwZWQ6IHsgc3RvcDogYm9vbGVhbiB9O1xuICAgIC8vIEEgcmVtb3ZlZCBzb3VyY2UncyBzbG90IHN0YXlzIGluIHRoZSBhcnJheXMgKHRoZXkgYXJlIG5ldmVyIHNwbGljZWQsIHNvIHNsb3QgbnVtYmVycyBoZWxkIGJ5IHJ1bm5pbmcgbG9vcHMgc3RheSBtZWFuaW5nZnVsKSwgbWFya2VkIGRlYWQgLSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiBJbmRleCBlbnRyaWVzIGRvbid0IHJlZmVyZW5jZSBzbG90cyBhdCBhbGw7IHRoZXkgcGVyc2lzdCB0aGUgc291cmNlcyBsaXN0J3Mgc291cmNlc0xpc3RJbmRleC5cbiAgICBkZWFkPzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIG5ld1NvdXJjZVN0YXRlKCk6IFNvdXJjZVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogZmFsc2UsXG4gICAgICAgIGluaXRpYWxTY2FuOiBwcm9taXNlT2JqKCksXG4gICAgICAgIHNjYW5Db21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHNjYW5TdWNjZWVkZWQ6IGZhbHNlLFxuICAgICAgICBzY2FubmVkQ291bnQ6IDAsXG4gICAgICAgIGNoYW5nZXNBZnRlclRpbWU6IDAsXG4gICAgICAgIHN0b3BwZWQ6IHsgc3RvcDogZmFsc2UgfSxcbiAgICB9O1xufVxuXG4vLyBXaGF0IGEgc2Nhbm5lZCBsaXN0aW5nIGVudHJ5IG1lYW50IHdoZW4gY29tcGFyZWQgYWdhaW5zdCBvdXIgaW5kZXhcbnR5cGUgU2Nhbk91dGNvbWUgPSBcImZpbHRlcmVkXCIgfCBcIm5ld1wiIHwgXCJ1cGRhdGVkXCIgfCBcInRvbWJzdG9uZVwiIHwgXCJ1bmNoYW5nZWRcIjtcbnR5cGUgU2NhblRhbGx5ID0gUmVjb3JkPFNjYW5PdXRjb21lLCBudW1iZXI+O1xuZnVuY3Rpb24gbmV3U2NhblRhbGx5KCk6IFNjYW5UYWxseSB7XG4gICAgcmV0dXJuIHsgZmlsdGVyZWQ6IDAsIG5ldzogMCwgdXBkYXRlZDogMCwgdG9tYnN0b25lOiAwLCB1bmNoYW5nZWQ6IDAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JlU3luYyB7XG4gICAgLy8gUGVyIHNvdXJjZSBzbG90LCBpbiBzdGVwIHdpdGggdGhlIHN0b3JlJ3Mgc291cmNlcyBhcnJheS4gU2xvdHMgYXJlIG5ldmVyIHNwbGljZWQgb3V0IC0gYSByZW1vdmVkIG9uZSBpcyBtYXJrZWQgZGVhZCAtIHNvIGEgc2xvdCBudW1iZXIgaGVsZCBieSBhIHJ1bm5pbmcgbG9vcCBhbHdheXMgbWVhbnMgdGhlIHNhbWUgc291cmNlLlxuICAgIHByaXZhdGUgc3RhdGVzOiBTb3VyY2VTdGF0ZVtdO1xuICAgIC8vIFNjYW5zIC8gZnVsbCBzeW5jcyBpbiBwcm9ncmVzcyAoYSBTZXQgLSBvbmUgc291cmNlIGNhbiBoYXZlIGEgY2hhbmdlIHBvbGwncyBmdWxsIHN5bmMgYW5kIGEgcmVzY2FuIG92ZXJsYXBwaW5nKVxuICAgIHByaXZhdGUgYWN0aXZpdGllcyA9IG5ldyBTZXQ8U3luY0FjdGl2aXR5PigpO1xuICAgIC8vIEd1YXJkcyBhZ2FpbnN0IGEgc2Vjb25kIGV2aWN0aW9uIHBhc3Mgc3RhcnRpbmcgd2hpbGUgb25lIGlzIHN0aWxsIHdhbGtpbmcgdGhlIGluZGV4XG4gICAgcHJpdmF0ZSBldmljdGluZyA9IGZhbHNlO1xuICAgIC8vIFdoZW4gZWFjaCBrZXkgd2FzIGxhc3Qgc2VydmVkLCBmb3IgcmVhZGVyRGlza0xpbWl0J3MgTFJVIGV2aWN0aW9uLiBOZXZlciBwZXJzaXN0ZWQgKGEgcmVzdGFydCBoYXMgbm8gb3BpbmlvbiBhYm91dCByZWNlbmN5KSwgYW5kIG9ubHkga2VwdCBmb3Iga2V5cyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiByZWFkIC0gYW4gaW5kZXggZW50cnkgbm8gb25lIGhhcyB0b3VjaGVkIGZhbGxzIGJhY2sgdG8gd2hlbiB3ZSBsYXN0IGNoYW5nZWQgaXQuXG4gICAgcHJpdmF0ZSBsYXN0QWNjZXNzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IEJsb2JTdG9yZSkge1xuICAgICAgICB0aGlzLnN0YXRlcyA9IHN0b3JlLnNvdXJjZXMubWFwKCgpID0+IG5ld1NvdXJjZVN0YXRlKCkpO1xuICAgIH1cblxuICAgIC8qKiBTdGFydHMgZXZlcnkgbGl2ZSBzb3VyY2UncyBzeW5jaHJvbml6YXRpb24sIHBsdXMgdGhlIG1haW50ZW5hbmNlIGxvb3BzLiBDYWxsZWQgb25jZSwgYnkgdGhlIHN0b3JlJ3MgaW5pdCAtIHRoZSBzdG9yZSdzIGluZGV4IG11c3QgYWxyZWFkeSBiZSBsb2FkZWQsIHNpbmNlIHNjYW5zIHdyaXRlIHN0cmFpZ2h0IGludG8gaXQuICovXG4gICAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICB2b2lkIHRoaXMuc3RhcnRTb3VyY2VTeW5jTG9vcHMoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKENPTkZJR19QT0xMX0lOVEVSVkFMLCAoKSA9PiB0aGlzLnBvbGxSb3V0aW5nQ29uZmlnKCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5jbGVhbnVwVG9tYnN0b25lcygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZUhpc3RvcnlMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICAvLyBSZWFkIGxpdmU6IHRoZSBsaW1pdCBjb21lcyBmcm9tIHRoZSBjb25maWcsIHNvIGEgc3RvcmUgdGhhdCBnYWlucyBvbmUgbGF0ZXIgc3RhcnRzIGVuZm9yY2luZyBpdCB3aXRob3V0IGJlaW5nIHJlc3RhcnRlZFxuICAgICAgICBydW5JbmZpbml0ZVBvbGwoRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCwgKCkgPT4gdGhpcy5lbmZvcmNlRGlza0xpbWl0KCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNrcyBldmVyeSBwZWVyIGZvciB0aGUgcm91dGluZyBjb25maWcsIGFuZCB0YWtlcyBpdCBpZiBpdCBpcyBuZXdlciB0aGFuIG91cnMuIFRoaXMgaXMgdGhlIHdob2xlXG4gICAgICogb2YgY29uZmlndXJhdGlvbiBwcm9wYWdhdGlvbjogaXQgcmlkZXMgYmVzaWRlIHRoZSBzY2FucyByYXRoZXIgdGhhbiBiZWluZyBwYXJ0IG9mIHRoZW0sIGJlY2F1c2VcbiAgICAgKiBvbmUgc21hbGwgcmVhZCBpcyB3b3J0aCBkb2luZyBldmVyeSBmZXcgbWludXRlcyB3aGlsZSBhIGZ1bGwgbGlzdGluZyBpcyBub3QsIGFuZCBiZWNhdXNlIGFcbiAgICAgKiBjb25maWcgd2UgYXJlIG1pc3NpbmcgaXMgd2hhdCBzdG9wcyBldmVyeXRoaW5nIGVsc2UgZnJvbSBiZWluZyByaWdodC5cbiAgICAgKlxuICAgICAqIFRoZSBjb3B5IGlzIHN0b3JlZCB0aGUgc2FtZSB3YXkgYSBzY2FuIHN0b3JlcyBhbnl0aGluZyBpdCBwdWxscyAtIGFuIGludGVybmFsIHdyaXRlIGludG8gb3VyIG93blxuICAgICAqIHN0b3JlIC0gYW5kIHRoZSBzdG9yZSBub3RpY2VzIHRoYXQgZmlsZSBsYW5kaW5nIGFuZCByZS1jb25maWd1cmVzIGl0c2VsZi4gTm90aGluZyBoZXJlIGtub3dzIHdoYXRcbiAgICAgKiBhIGNvbmZpZyBtZWFuczsgaXQgb25seSBrbm93cyB0aGlzIG9uZSBmaWxlIGlzIHdvcnRoIGFza2luZyBmb3Igb2Z0ZW4uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc291cmNlc1tpXS5pbnRlcm1lZGlhdGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB0aGVpcnMgPSBhd2FpdCBzb3VyY2UuZ2V0MihST1VUSU5HX0ZJTEUsIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGVpcnMgfHwgIXRoZWlycy5kYXRhIHx8ICF0aGVpcnMuZGF0YS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCB0aGVpclJvdXRpbmcgPSBwYXJzZVJvdXRpbmdEYXRhKHRoZWlycy5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoZWlyUm91dGluZykgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHZlcnNpb24gPSBnZXRDb25maWdWZXJzaW9uKHRoZWlyUm91dGluZyk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPD0gdGhpcy5zdG9yZS5yb3V0aW5nVmVyc2lvbigpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGluZyBjb25maWcgdmVyc2lvbiAke3ZlcnNpb259IGZvdW5kIG9uICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAod2UgaGF2ZSAke3RoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKX0sIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogdGFraW5nIGl0YCk7XG4gICAgICAgICAgICAgICAgLy8gU3RhbXBlZCBOT1csIG5vdCB3aXRoIHRoZWlyIHdyaXRlIHRpbWU6IGNvbmZpZ3MgYXJlIG9yZGVyZWQgYnkgdmVyc2lvbiwgYW5kIHRoaXMgb25lIGlzIG5ld2VyIGJ5IHRoYXQgb3JkZXJpbmcuIFRoZWlyIGZpbGUgY2FuIGVhc2lseSBiZSBvbGRlciBieSB3cml0ZSB0aW1lIChvdXJzIHdhcyByZXdyaXR0ZW4gbG9jYWxseSBtb3JlIHJlY2VudGx5KSwgYW5kIHRoZSBzdG9yZSdzIG9ubHktdGFrZS10aGUtbGF0ZXN0IHJ1bGUgd291bGQgdGhlbiBkcm9wIGl0IC0gbGVhdmluZyB1cyBmaW5kaW5nIHRoZSBzYW1lIG5ld2VyIHZlcnNpb24gb24gZXZlcnkgcG9sbCBhbmQgbmV2ZXIgYWRvcHRpbmcgaXQuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zZXQoeyBwYXRoOiBST1VUSU5HX0ZJTEUsIGRhdGE6IHRoZWlycy5kYXRhLCBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgcGVlciB0aGF0IGNhbm5vdCBhbnN3ZXIgaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhIHNvdXJjZSB0aGF0IGlzIGRvd247IHRoZSBuZXh0IHBvbGwgYXNrcyBhZ2FpblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENoZWNraW5nICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmb3IgYSBuZXdlciByb3V0aW5nIGNvbmZpZyBmYWlsZWQgKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTdG9wcyBldmVyeSBzb3VyY2UncyBsb29wcyAodGhlIHN0b3JlJ3Mgb3duIHN0b3AgdG9rZW4gc3RvcHMgdGhlIG1haW50ZW5hbmNlIGxvb3BzKS4gKi9cbiAgICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc3RhdGUgb2YgdGhpcy5zdGF0ZXMpIHtcbiAgICAgICAgICAgIHN0YXRlLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBzbG90IHRoZSBzdG9yZSBqdXN0IGFwcGVuZGVkIHRvIGl0cyBzb3VyY2VzIGFycmF5OiBpdCBzdGFydHMgZnJvbSBub3RoaW5nLCBzbyBpdCBnZXRzIGEgZnVsbCBzY2FuLiAqL1xuICAgIHB1YmxpYyBhZGRTb3VyY2Uoc2xvdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGVzW3Nsb3RdID0gbmV3U291cmNlU3RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zdGFydFNvdXJjZVN5bmNMb29wcyhzbG90KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgc2xvdCBzdGF5cyBpbiB0aGUgc3RvcmUncyBhcnJheXMgZm9yZXZlciAocnVubmluZyBsb29wcyBob2xkIHNsb3QgbnVtYmVycyk7IGl0IGp1c3QgZ29lcyBkZWFkIC0gbG9vcHMgc3RvcCwgYW5kIGl0cyBpbmRleCBlbnRyaWVzIGRyb3AgKG90aGVyIHNvdXJjZXMnIHNjYW5zIHJlLWZpbmQgYW55IGNvcHkgdGhhdCdzIHN0aWxsIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBuZXcgY29uZmlnKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlU291cmNlKHNsb3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzbG90XTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc3RvcmUuc291cmNlc1tzbG90XS5zb3VyY2U7XG4gICAgICAgIHN0YXRlLmRlYWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGxldCBzb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zbG90U291cmNlc0xpc3RJbmRleChzbG90KTtcbiAgICAgICAgLy8gVGhlIHNhbWUgVVJMIGNhbiBiZSBhbm90aGVyIGxpdmUgc2xvdCAob25lIGVudHJ5IHBlciB2YWxpZCB3aW5kb3cpIC0gdGhlIGVuZHBvaW50IGlzIHN0aWxsIGNvbmZpZ3VyZWQsIHNvIGl0cyBlbnRyaWVzIHN0YXlcbiAgICAgICAgaWYgKHNvdXJjZXNMaXN0SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN0b3JlLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IHNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEZvcmdvdHRlbiwgbm90IGRlbGV0ZWQ6IHRoZSBmaWxlcyBzdGlsbCBleGlzdCB3aGVyZXZlciB0aGF0IHNvdXJjZSBwdXQgdGhlbSwgd2UganVzdCBubyBsb25nZXIgaGF2ZSBhIHdheSB0byByZWFjaCB0aGVtXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBkcm9wcGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIGFuZCAke2Ryb3BwZWR9IGluZGV4IGVudHJpZXMgaXQgaGVsZCB3ZXJlIGRyb3BwZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIChpdHMgVVJMIGlzIHN0aWxsIHNlcnZlZCBieSBhbm90aGVyIHNsb3QsIHNvIGl0cyBpbmRleCBlbnRyaWVzIHN0YXkpYCk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgYSBzbG90IGlzIHN0aWxsIGNvbmZpZ3VyZWQuIERlYWQgc2xvdHMgYXJlIG5ldmVyIHNjYW5uZWQsIHdyaXR0ZW4sIG9yIHJlYWQuICovXG4gICAgcHVibGljIGlzTGl2ZShzbG90OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdG9yZS5zb3VyY2VzW3Nsb3RdICYmICF0aGlzLnN0YXRlc1tzbG90XT8uZGVhZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWN0aXZpdGllcygpOiBTeW5jQWN0aXZpdHlbXSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5hY3Rpdml0aWVzXTtcbiAgICB9XG5cbiAgICAvKiogQSBrZXkgd2FzIGp1c3Qgc2VydmVkLCBzbyBpdCBnb2VzIHRvIHRoZSBiYWNrIG9mIHRoZSBldmljdGlvbiBxdWV1ZS4gKi9cbiAgICBwdWJsaWMgbm90ZUFjY2VzcyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3RBY2Nlc3Muc2V0KGtleSwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgaW5kZXggc3RpbGwgaG9sZHMgZXhhY3RseSB0aGUgZW50cnkgYSBwYXNzIHBpY2tlZCB1cCBlYXJsaWVyLiBJbmRleCByb3dzIGFyZSByZWFkIG91dCBvZiB0aGUgZGF0YWJhc2UgcGVyIGxvb2t1cCwgc28gdGhpcyBjb21wYXJlcyB0aGUgcm93LCBub3QgdGhlIG9iamVjdCAtIGEgd3JpdGUgbGFuZGluZyBtaWQtcGFzcyBjaGFuZ2VzIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSB0aHJlZS5cbiAgICBwcml2YXRlIGVudHJ5VW5jaGFuZ2VkKGtleTogc3RyaW5nLCBlbnRyeTogSW5kZXhFbnRyeSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQud3JpdGVUaW1lID09PSBlbnRyeS53cml0ZVRpbWUgJiYgY3VycmVudC5zaXplID09PSBlbnRyeS5zaXplICYmIGN1cnJlbnQuc291cmNlc0xpc3RJbmRleCA9PT0gZW50cnkuc291cmNlc0xpc3RJbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdHVzKCk6IEFyY2hpdmVzU3luY1N0YXR1cyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiB0aGlzLnN0YXRlcy5ldmVyeSh4ID0+IHguc2NhbkNvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogdGhpcy5zdG9yZS5pbmRleFNpemUoKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc3RvcmUuc291cmNlcy5tYXAoKHgsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3M6IHgudmFsaWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIHJvdXRlOiB4LnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHgubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdGhpcy5zdGF0ZXNbaV0uc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogdGhpcy5zdGF0ZXNbaV0uc2NhbkNvbXBsZXRlLFxuICAgICAgICAgICAgICAgIHNjYW5uZWRDb3VudDogdGhpcy5zdGF0ZXNbaV0uc2Nhbm5lZENvdW50LFxuICAgICAgICAgICAgfSkpLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBMaXN0aW5ncyBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LCBzbyB0aGV5IG11c3Qgd2FpdCBmb3Igb3VyIG93biBiYXNlIHNvdXJjZSdzIGluaXRpYWwgc2NhbiAod2hpY2ggbWlnaHQgbGFnIG1pbnV0ZXMpIGJlZm9yZSB0aGV5IGFyZSB0cnVzdHdvcnRoeS4gVGhlIGJhc2UgKGxvY2FsIGRpc2spIGlzIGltcGxpY2l0bHkgcmVxdWlyZWQgLSByZW1vdGUgc291cmNlcyBhcmUgbm90LCB0aGV5IGNvbWUgYW5kIGdvLiAqL1xuICAgIHB1YmxpYyBhc3luYyB3YWl0Rm9yUmVxdWlyZWRTY2FucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZXNbMF0uaW5pdGlhbFNjYW4ucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKiogUmVzY2FucyBvdXIgb3duIGRpc2sncyBtZXRhZGF0YSBpbnRvIHRoZSBpbmRleCAtIHVzZWQgYXJvdW5kIHZhbGlkIHdpbmRvdyBoYW5kb2Zmcywgd2hlcmUgYW5vdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2UoMCkoKTtcbiAgICB9XG5cbiAgICAvKiogT25lIHN5bmNocm9uaXphdGlvbiByb3VuZCBvZiBhIHNvdXJjZTogdGhlIFBVTEwgZGlyZWN0aW9uIGFsd2F5cyAoaXRzIGxpc3RpbmcsIGFwcGxpZWQgdG8gb3VyIGluZGV4KSwgYW5kIHdpdGggXCJwdXNoXCIgdGhlIHB1c2ggZGlyZWN0aW9uIHRvbyAod2hhdCBvdXIgaW5kZXggc2F5cyB0aGUgc291cmNlIGlzIG1pc3NpbmcsIHdyaXR0ZW4gdG8gaXQpLiBQdXNoIGlzIGFuIGFyZ3VtZW50IHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgY2FsbCBiZWNhdXNlIGl0IGNhbm5vdCBydW4gd2l0aG91dCB0aGUgcHVsbCdzIGxpc3RpbmcgLSB0aGUgaW5kZXggYWxvbmUgY2Fubm90IHNheSB3aGF0IHRoZSBzb3VyY2UgYWxyZWFkeSBob2xkcy4gTGlzdGluZ3MgdW5ibG9jayAoaW5pdGlhbFNjYW4pIGJldHdlZW4gdGhlIGhhbHZlcywgc28gdGhleSBuZXZlciB3YWl0IGJlaGluZCBhIHB1c2guIE9ubHkgb25lIHJvdW5kIHBlciBTT1VSQ0UgcnVucyBhdCBhIHRpbWUgKGNhY2hlIGtleXMgdGhlIHNlcmlhbGl6ZXIgYnkgc291cmNlIGluZGV4KS4gKi9cbiAgICBwcml2YXRlIHN5bmNTb3VyY2UgPSBjYWNoZSgoc291cmNlSW5kZXg6IG51bWJlcikgPT4gcnVuSW5TZXJpYWwoYXN5bmMgKHB1c2g/OiBcInB1c2hcIik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBsZXQgbGlzdGluZyA9IGF3YWl0IHRoaXMucHVsbFNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBpZiAocHVzaCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wdXNoU291cmNlKHNvdXJjZUluZGV4LCBsaXN0aW5nKTtcbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKToganVzdCBpdHMgY2hhbmdlcyBzaW5jZSB0aGUgYm91bmRhcnkgbmVpZ2hib3Job29kLCB3aXRoIG1hdGNoaW5nIHZhbHVlcyBwdWxsZWQgb250byBvdXIgb3duIGRpc2suICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5TdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzaW5jZTogY29uZmlnLnNpbmNlLCByb3V0ZTogY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUgfSk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBjb25maWcuc2luY2UsIHJvdXRlczogY29uZmlnLnJvdXRlICYmIFtjb25maWcucm91dGVdIHx8IHVuZGVmaW5lZCwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LmZpbHRlcmVkKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBTaXplIDAgaW4gYSBsaXN0aW5nIElTIGEgZGVsZXRpb24gKGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUpLCBzbyBpdCBpcyB0YWtlbiBhcyBvbmVcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogc291cmNlLCB0bzogdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZSwgcGF0aDogZmlsZS5wYXRoLCBwcmVzZXJ2ZVdyaXRlVGltZTogdHJ1ZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgLy8gVW5kZWZpbmVkIGlzIHR3byBjYXNlcyAoc2VlIGNvcHlBcmNoaXZlRmlsZSk6IG91ciBvd24gZGlzayBhbHJlYWR5IGhvbGRpbmcgc29tZXRoaW5nIG5ld2VyIGlzIHRoZSBib3VuZGFyeSBzY2FuIHdvcmtpbmcgYXMgaW50ZW5kZWQgKG91ciB3cml0ZXMgc2luY2UgdGhlIGJvdW5kYXJ5IG91dHJhbmsgdGhlIG5laWdoYm9yJ3MpLCBvbmx5IGEgZ2VudWluZWx5IHVucmVhZGFibGUgZmlsZSBpcyB3b3J0aCBhIHdhcm5pbmdcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWwgJiYgbG9jYWwud3JpdGVUaW1lID4gZmlsZS5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhbkxvY2FsTmV3ZXJcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDogZmlsZS5wYXRoLCB0aGVpcldyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChmaWxlLmNyZWF0ZVRpbWUpLCB0aGVpclNpemU6IGZpbGUuc2l6ZSwgbG9jYWxXcml0ZVRpbWU6IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQobG9jYWwud3JpdGVUaW1lKSwgbG9jYWxTaXplOiBsb2NhbC5zaXplIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogbG9jYWwud3JpdGVUaW1lLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRhbGx5LnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBCb3VuZGFyeSBzY2FuIGNvdWxkIG5vdCBjb3B5ICR7ZmlsZS5wYXRofSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgY2hhbmdlIGZlZWQgbGlzdGVkIGl0ICgke2ZpbGUuc2l6ZX0gYnl0ZXMsIHdyaXRlVGltZSAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQoZmlsZS5jcmVhdGVUaW1lKX0pIGJ1dCB0aGUgcmVhZCBmb3VuZCBub3RoaW5nYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBmaWxlLnBhdGgsIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgIGlmIChjb3BpZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgY29waWVkLndyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgc2l6ZTogY29waWVkLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVwZGF0ZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFsbHkubmV3Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiYm91bmRhcnlTY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIHNpbmNlOiBjb25maWcuc2luY2UsIGNoYW5nZXM6IGNoYW5nZXMubGVuZ3RoLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkIH0pO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBwZXItc291cmNlIGxvb3BzIOKUgOKUgFxuXG4gICAgLy8gU2xvdCAwIGlzIGV4ZW1wdDogb3VyIG93biBkaXNrIGFuc3dlcnMgZm9yIGV2ZXJ5IHdpbmRvdyB0aGlzIHN0b3JlIEVWRVIgaGVsZCwgYW5kIHNjYW5uaW5nIGl0IGlzIHdoYXQga2VlcHMgdGhlIGluZGV4IGhvbmVzdCBhYm91dCB0aGVtLiBSZWFkIGxpdmUgZWFjaCBjYWxsIC0gdXBkYXRlU291cmNlcyBtb3ZlcyB0aGUgd2luZG93cyBvbiBydW5uaW5nIHNsb3RzLCBzbyBhIHNvdXJjZSBnb2VzIHN0YWxlIChvciBjb21lcyBiYWNrKSB3aGlsZSBpdHMgbG9vcHMgcnVuLlxuICAgIHByaXZhdGUgd2luZG93c0FsbG93U2Nhbm5pbmcoc291cmNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS52YWxpZFdpbmRvd3Muc29tZSh3ID0+IHdbMV0gPiBEYXRlLm5vdygpIC0gUEFTVF9SRUFEX0RVUkFUSU9OKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0U291cmNlU3luY0xvb3BzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5yZWdpc3RlclNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgc291cmNlT2JqID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZU9iai5zb3VyY2U7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgLy8gSWYgYSBzbG90IGV2ZXIgZ2V0cyBUV08gb2YgdGhlc2UsIGl0cyBsb29wcyBhcmUgZG91YmxlZCAtIGV2ZXJ5IHBvbGwgYW5kIGZ1bGwgc3luYyBydW5zIHR3aWNlXG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNvdXJjZVN5bmNTdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzb3VyY2VJbmRleCwgdXJsOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnVybCwgaW50ZXJtZWRpYXRlOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLmludGVybWVkaWF0ZSB9KTtcbiAgICAgICAgLy8gUmVhZCBsaXZlIGZvciBldmVyeSBwYXNzLCBub3QgY2FwdHVyZWQgLSB0aGUgc3RvcmUncyBzb3VyY2UgbGlzdCBjYW4gY2hhbmdlIHdoaWxlIGxvb3BzIHJ1blxuICAgICAgICBsZXQgbm9GdWxsU3luYyA9ICgpID0+IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0ubm9GdWxsU3luYztcbiAgICAgICAgLy8gQW4gaW50ZXJtZWRpYXRlIGlzIGEgZGVwbG95IHN3aXRjaG92ZXIncyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIFBPUlQgb250byBhIHNvdXJjZSB3ZSBhbHJlYWR5IGhhdmU6IHRoZSBzYW1lIGJ1Y2tldCwgcmVhY2hhYmxlIGFub3RoZXIgd2F5IGZvciBhIGZldyBtaW51dGVzLiBTY2FubmluZyBpdCB3b3VsZCBsaXN0IGV4YWN0bHkgd2hhdCBzY2FubmluZyB0aGF0IHNvdXJjZSBsaXN0cywgYWdhaW5zdCBhIHBvcnQgdGhhdCBpcyBhYm91dCB0byBkaXNhcHBlYXIgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkLCBhbmQgdGhlIHNvdXJjZSBpdCB3YXMgc3BsaXQgb3V0IG9mIGNvdmVycyBpdCBmb3IgYXMgbG9uZyBhcyBpdCBleGlzdHMgYW5kIGFmdGVyIGl0IGlzIGdvbmUuXG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLmludGVybWVkaWF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVja2VkIHBlciB0aWNrLCBuZXZlciBkZWNpZGVkIG9uY2U6IHRoZSB3aW5kb3dzIG1vdmUgb24gcnVubmluZyBzbG90cyAoc2VlIHVwZGF0ZVNvdXJjZXMpLCBzbyBhIHNvdXJjZSBnb2VzIHN0YWxlIG1pZC1saWZlIGFuZCBjYW4gY29tZSBiYWNrIGlmIGEgY29uZmlnIGV4dGVuZHMgdGhlbS4gTG9nZ2VkIG9ubHkgb24gZWFjaCB0cmFuc2l0aW9uIGludG8gc3RhbGVuZXNzLlxuICAgICAgICBsZXQgbG9nZ2VkU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNraXBTdGFsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpbmRvd3NBbGxvd1NjYW5uaW5nKHNvdXJjZUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlZFN0YWxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghbG9nZ2VkU3RhbGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblNraXBwZWRTdGFsZVdpbmRvd3NcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgdmFsaWRXaW5kb3dzOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnZhbGlkV2luZG93cy5tYXAodyA9PiBbZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3WzBdKSwgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3WzFdKV0pLCBwYXN0UmVhZER1cmF0aW9uTXM6IFBBU1RfUkVBRF9EVVJBVElPTiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBbiBhbHJlYWR5LXN0YWxlIHNvdXJjZSBza2lwcyBnZXRDb25maWcgZW50aXJlbHk6IGl0cyBlbmRwb2ludCBpcyBvZnRlbiBsb25nIGdvbmUsIGFuZCByZXRyeWluZyB0aGF0IGV2ZXJ5IDMwcyBmb3JldmVyIGlzIG5vaXNlIGFib3V0IGEgc291cmNlIHdlIHdvdWxkIG5vdCBzY2FuIGFueXdheSAoaWYgaXRzIHdpbmRvd3MgYXJlIGxhdGVyIGV4dGVuZGVkLCB0aGUgZnVsbC1yb3VuZCBwb2xsIGJlbG93IHBpY2tzIGl0IHVwIC0ganVzdCB3aXRob3V0IGNoYW5nZSBwb2xsaW5nIHVudGlsIGEgcmVzdGFydClcbiAgICAgICAgd2hpbGUgKCFza2lwU3RhbGUoKSAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgc291cmNlLmdldENvbmZpZygpO1xuICAgICAgICAgICAgICAgIHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyID0gISFjb25maWcuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiaW5pdGlhbFNjYW5GYWlsZWRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcmV0cnlJbk1zOiBTQ0FOX1JFVFJZX0RFTEFZLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgIC8vIEhvdXJseSBmb3Igb3VyIG93biBkaXNrIChubyBzb3VyY2VDb25maWcgLSBhIGNoZWFwIGxvY2FsIHdhbGssIGFuZCBob3cgYSBzaWJsaW5nIHByb2Nlc3MncyB3cml0ZXMgaW50byB0aGUgc2hhcmVkIGZvbGRlciBhcmUgZm91bmQpIGFuZCBmb3IgcmVtb3RlIHBlZXJzIChpbmRleC1iYWNrZWQsIGNoZWFwIGxpc3RpbmdzKTsgdGhlIHNsb3cgaW50ZXJ2YWwgaXMgb25seSBmb3Igc291cmNlcyB3aGVyZSBhIGZ1bGwgbGlzdGluZyBpcyBnZW51aW5lbHkgZXhwZW5zaXZlIChiYWNrYmxhemUpXG4gICAgICAgIGxldCBwb2xsSW50ZXJ2YWwgPSAoIXNvdXJjZU9iai5zb3VyY2VDb25maWcgfHwgc291cmNlT2JqLnNvdXJjZUNvbmZpZy50eXBlID09PSBcInJlbW90ZVwiKSAmJiBGVUxMX1JFU0NBTl9JTlRFUlZBTCB8fCBGVUxMX1JFU0NBTl9OT05fUkVNT1RFX0lOVEVSVkFMO1xuICAgICAgICAvLyBCb3RoIGxvb3BzIGJlbG93IHJ1biBvbmUgYXQgYSB0aW1lOiBhIGNoYW5nZS1wb2xsIHRpY2sgbGFuZGluZyBtaWQgZnVsbCByb3VuZCB3b3VsZCBvdGhlcndpc2Ugc3RhcnQgYSBzZWNvbmQgY29weSBwYXNzIG92ZXIgdGhlIHNhbWUgcGVuZGluZyBsaXN0LCBkb3dubG9hZGluZyBldmVyeXRoaW5nIHR3aWNlXG4gICAgICAgIGxldCBzZXJpYWwgPSBydW5JblNlcmlhbChhc3luYyAoZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBhd2FpdCBmbmMoKSk7XG4gICAgICAgIGF3YWl0IHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0KHBvbGxJbnRlcnZhbCwgKCkgPT4gc2VyaWFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwU3RhbGUoKSkgcmV0dXJuO1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKHNvdXJjZUluZGV4KShcInB1c2hcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCkoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5GYWlsZWRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcmV0cnlJbk1zOiBTQ0FOX1JFVFJZX0RFTEFZLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU0NBTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsICgpID0+IHNlcmlhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBTdGFsZSgpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gQSBzY2FuIHRoYXQgaGFzIG5vdCBzdWNjZWVkZWQgeWV0IGlzIHJldHJpZWQgSEVSRSwgYmVmb3JlIGFueXRoaW5nIGVsc2UgLSBwb2xsaW5nIGNoYW5nZXMgYW5kIGNvcHlpbmcgYWdhaW5zdCBhIG5ldmVyLXNjYW5uZWQgc291cmNlIHdvdWxkIHJ1biBvbiBhcmJpdHJhcmlseSBzdGFsZSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmICghc3RhdGUuc2NhblN1Y2NlZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2Uoc291cmNlSW5kZXgpKFwicHVzaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2hhbmdlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KSgpO1xuICAgICAgICAgICAgfSksIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIFBVTEwgZGlyZWN0aW9uOiBhIGZ1bGwgbWV0YWRhdGEgc2NhbiAoc2l6ZSwgd3JpdGVUaW1lLCBwYXRoKSBvZiBvbmUgc291cmNlLCBhcHBsaWVkIHRvIG91ciBpbmRleC4gUmV0dXJucyB0aGUgc291cmNlJ3MgbGlzdGluZyAocGF0aCAtPiB3cml0ZSB0aW1lKSwgd2hpY2ggcHVzaFNvdXJjZSB1c2VzIGZvciB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLlxuICAgIHByaXZhdGUgYXN5bmMgcHVsbFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0geyB0eXBlOiBcIm1ldGFkYXRhU2NhblwiLCBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc3RhcnRUaW1lOiBzY2FuU3RhcnQgfTtcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5TdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpIH0pO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGlsbCBydW5uaW5nICgke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cywgc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pYCk7XG4gICAgICAgIH0sIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAvLyBUaGUgbGlzdGluZyByZXF1ZXN0IGRlbGliZXJhdGVseSB0YWtlcyBubyB0aW1lIG9yIHJvdXRlIGZpbHRlcnM6IG91ciBzbG93ZXN0IHNvdXJjZXMgKGJhY2tibGF6ZSkgc3VwcG9ydCBuZWl0aGVyLCBzbyBmaWx0ZXJpbmcgd291bGQgaGFwcGVuIGFmdGVyIHRoZSBmdWxsIGZldGNoIGFueXdheSAtIGxpdHRsZSBiZW5lZml0LCBtb3JlIHJvb20gZm9yIGRlc3luY2hyb25pemF0aW9uLiBBbmQgaWYgYSBmdWxsIGxpc3RpbmcgZXZlciBiZWNvbWVzIHRvbyBiaWcgdG8gc2VuZCBvdmVyIHRoZSBuZXR3b3JrLCBpdCBpcyBhbHNvIHRvbyBiaWcgZm9yIHRoZSByZWNlaXZpbmcgcHJvY2VzcyB0byBob2xkIGluIG1lbW9yeSAtIHRoZSBmaXggaXMgbW9yZSByb3V0aW5nIHNoYXJkcyAoZWFjaCBzdG9yaW5nIGFuZCBzZW5kaW5nIGxlc3MpLCBub3QgZmlsdGVyaW5nLlxuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIiwgeyBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBXaGF0IHdlIGJlbGlldmUgdGhlIHNvdXJjZSBoYXM6IHdoaWNoZXZlciBpcyBsYXJnZXIgb2YgaXRzIHByZXZpb3VzIGxpc3RpbmcgYW5kIHRoZSBpbmRleCBlbnRyaWVzIG5hbWluZyBpdCBhcyBob2xkZXIuIEZpbGVzIGRvIG5vdCBqdXN0IHZhbmlzaCAtIGEgbGlzdGluZyBmYXIgYmVsb3cgdGhpcyBtZWFucyB0aGUgb3RoZXIgZW5kIGlzIGJyaWVmbHkgYnJva2VuLCBhbmQgYmVsaWV2aW5nIGl0IHdvdWxkIHB1cmdlIGV2ZXJ5dGhpbmcgaXQgaGVsZC5cbiAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCA9PT0gc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXgpIGhlbGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gTWF0aC5tYXgoc3RhdGUuc2Nhbm5lZENvdW50LCBoZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIShleHBlY3RlZCA+IDAgJiYgZmlsZXMubGVuZ3RoIDwgZXhwZWN0ZWQgLyAyKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRzID49IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBTVElMTCBsaXN0cyAke2ZpbGVzLmxlbmd0aH0gZmlsZXMgd2hlcmUgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQsIGFmdGVyICR7YXR0ZW1wdHN9IHJldHJpZXMgLSBhY2NlcHRpbmcgdGhlIGxpc3RpbmcgYXMgdGhlIHRydXRoYCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBsaXN0ZWQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzLCBidXQgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQgKHByZXZpb3VzIGxpc3RpbmcgJHtzdGF0ZS5zY2FubmVkQ291bnR9LCBpbmRleCBlbnRyaWVzIGl0IGhvbGRzICR7aGVsZH0pIC0gdGhlIG90aGVyIGVuZCBpcyBwcm9iYWJseSBicmllZmx5IGJyb2tlbjsgYXNraW5nIGFnYWluIGluICR7U1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChyZXRyeSAke2F0dGVtcHRzfSBvZiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgbWF5IGhhdmUgYmVlbiByZW1vdmVkIHdoaWxlIHRoZSBsaXN0aW5nIHdhcyBpbiBmbGlnaHQ7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmIChzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybiBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBpbmRleFNpemVCZWZvcmUgPSB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBsZXQgbmV3UGF0aHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWVuLnNldChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIC8vIEVudHJpZXMgdGhpcyBzb3VyY2Ugd2FzIHRoZSBob2xkZXIgb2YsIGJ1dCB0aGF0IGl0cyBsaXN0aW5nIGRpZCBub3QgbWVudGlvbjogb3VyIG93biBkaXNrIHRha2VzIG92ZXIgYXMgaG9sZGVyIHdoZW4gaXQgaGFzIGEgY29weSwgYW5kIG9ubHkgd2l0aCBubyBsb2NhbCBjb3B5IGVpdGhlciBpcyB0aGUgZW50cnkgZm9yZ290dGVuIC0gd2Ugd2VyZSB3cm9uZyBhYm91dCB3aGVyZSB0aGUgZmlsZSBpcywgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGl0IGhhdmluZyBiZWVuIGRlbGV0ZWQuIEVudHJpZXMgY2hhbmdlZCBhZnRlciB0aGUgc2NhbiBzdGFydGVkIGFyZSBrZXB0OiB0aGUgbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBhcmUgbm90IHdhbGtlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZSB0aGV5IGFyZSBub3QgZmlsZXMgYSBsaXN0aW5nIGNvdWxkIHZvdWNoIGZvci5cbiAgICAgICAgbGV0IHJlbW92ZWRGcm9tSW5kZXggPSAwO1xuICAgICAgICBsZXQgcmVwb2ludGVkVG9Mb2NhbCA9IDA7XG4gICAgICAgIGxldCBtaXNzaW5nT25Tb3VyY2UgPSAwO1xuICAgICAgICBsZXQgc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ICYmIGVudHJ5LmNoYW5nZWRBdCA8IHNjYW5TdGFydCkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvaW50ZWRUb0xvY2FsKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRGcm9tSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50ZWQgb25seSB3aGVuIHRoZSBzb3VyY2UgU0hPVUxEIGhvbGQgdGhlIGVudHJ5IChpdHMgcm91dGUgbWF0Y2hlcykgLSB0aGVzZSBhcmUgd2hhdCB0aGUgcmVjb25jaWxlIHBhc3MgcHVzaGVzIHRvIGl0ICh3aGljaCBhbHNvIGlnbm9yZXMgdGhlIHZhbGlkIHdpbmRvdzogc3luY2hyb25pemF0aW9uIG1vdmVzIGV4aXN0aW5nIHZhbHVlcywgdGhlIHdpbmRvdyBvbmx5IHJvdXRlcyBmcmVzaCB3cml0ZXMpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgfVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIGxpc3RlZDogZmlsZXMubGVuZ3RoLCBpbmRleGVkQmVmb3JlOiBpbmRleFNpemVCZWZvcmUsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQsIG91dHNpZGVSb3V0ZTogdGFsbHkuZmlsdGVyZWQsIG1pc3NpbmdPblNvdXJjZSwgcmVwb2ludGVkVG9Mb2NhbCwgcmVtb3ZlZEZyb21JbmRleCB9KTtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgc3RhdGUuc2NhblN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBzZWVuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwdXNoIGRpcmVjdGlvbiBvZiBzeW5jaHJvbml6YXRpb246IGV2ZXJ5dGhpbmcgd2Uga25vdyB0aGF0IHRoZSBzb3VyY2UgaXMgbWlzc2luZyAob3IgaG9sZHMgYW4gb2xkZXIgY29weSBvZikgaXMgd3JpdHRlbiB0byBpdCDigJQgaW5jbHVkaW5nIGRlbGV0aW9ucywgYXMgdG9tYnN0b25lIHdyaXRlcy4gVGhpcyBpcyB3aGF0IGhlYWxzIGEgc291cmNlIHdob3NlIGJhY2tncm91bmQgd3JpdGVzIGZhaWxlZCAoZS5nLiBpdCB3YXMgZG93bik6IHRoZSBuZXh0IHNjYW4gc2VlcyB3aGF0J3MgbWlzc2luZyBhbmQgcmUtc2VuZHMgaXQuIEEgZmFpbGluZyBmaWxlIGlzIHNraXBwZWQsIG5vdCBmYXRhbCAoaW1tdXRhYmxlIHRhcmdldHMgYXJlIGhhbmRsZWQgYnkgZm9yY2VTZXRJbW11dGFibGUsIGFuZCBvbmUgdW5yZWFkYWJsZSB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IG9mIHRoZSBwYXNzKSAtIG9ubHkgYSBydW4gb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMgKHRoZSBzb3VyY2UgaXRzZWxmIGlzIGRvd24pIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBzY2FuIGN5Y2xlLlxuICAgIHByaXZhdGUgYXN5bmMgcHVzaFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3dzLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzKTtcbiAgICAgICAgbGV0IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgcHVzaGVkID0gMDtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmlsZXMgZmlyc3QsIHRoZW4gdGhlIGRlbGV0aW9ucyAtIHR3byB3YWxrcyBub3cgdGhhdCB0aGV5IGFyZSB0d28gbWFwcywgYW5kIHRoZSBkZWxldGlvbnMgb25lIGlzIHRoZSBzaG9ydCBvbmVcbiAgICAgICAgbGV0IHB1c2hhYmxlOiB7IGtleTogc3RyaW5nOyB3cml0ZVRpbWU6IG51bWJlcjsgZW50cnk/OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHRhcmdldFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGVudHJ5IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBwdXNoYWJsZS5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeyBrZXksIHdyaXRlVGltZSwgZW50cnkgfSBvZiBwdXNoYWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBub3QgcmVjb25jaWxlZDogaXQgcHJvcGFnYXRlcyBieSBiZWluZyBhc2tlZCBmb3IsIG9uIGl0cyBvd24gc2NoZWR1bGUgKHNlZSBwb2xsUm91dGluZ0NvbmZpZylcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjY2VwdHNXcml0ZXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gd3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbGV0aW9uIG9ubHkgbmVlZHMgcHVzaGluZyB3aGlsZSB0aGUgc291cmNlIHN0aWxsIGhvbGRzIGFuIG9sZGVyIGNvcHkuIEl0IHRyYXZlbHMgYXMgZGVsIChuZXZlciBhcyBhbiBlbXB0eSBzZXQgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKSwgd2l0aCB0aGUgT1JJR0lOQUwgZGVsZXRpb24gdGltZSBzbyBvcmRlcmluZyBzdXJ2aXZlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBzZXRcIiwga2V5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlciA9IGF3YWl0IHRoaXMuc3RvcmUuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICghaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogaG9sZGVyLCB0bzogc291cmNlLCBwYXRoOiBrZXksIHByZXNlcnZlV3JpdGVUaW1lOiB0cnVlLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBpcyB0d28gY2FzZXMgKHNlZSBjb3B5QXJjaGl2ZUZpbGUpLiBUaGUgc291cmNlIGhhdmluZyBhIE5FV0VSIGZpbGUgdGhhbiBvdXIgaW5kZXggKHRoZSBsaXN0aW5nIHdlIHB1c2hlZCBmcm9tIHdhcyBzdGFsZSkgaXMgYWRvcHRlZCBleGFjdGx5IHRoZSB3YXkgdGhlIHB1bGwgZGlyZWN0aW9uIGFkb3B0cyBhIGxpc3RpbmcgZW50cnkgLSBhbmQgcHVzaGluZyBvdXIgc3RhbGUgY29weSBzdG9wcy4gT3RoZXJ3aXNlIHRoZSBIT0xERVIgY291bGQgbm90IHByb2R1Y2UgdGhlIGZpbGUsIHdoaWNoIHRoZSBuZXh0IHJvdW5kJ3MgcHVsbCByZS1yZXNvbHZlczsgZWl0aGVyIHdheSwgc2lsZW5jZSBoZXJlIHdhcyB0aGUgYnVnLlxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlycyAmJiB0aGVpcnMud3JpdGVUaW1lID4gd3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogdGhlaXJzLndyaXRlVGltZSwgc2l6ZTogdGhlaXJzLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJwdXNoRm91bmROZXdlck9uU291cmNlXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgb3VyV3JpdGVUaW1lOiBmb3JtYXREYXRlVGltZURldGFpbGVkKHdyaXRlVGltZSksIHRoZWlyV3JpdGVUaW1lOiBmb3JtYXREYXRlVGltZURldGFpbGVkKHRoZWlycy53cml0ZVRpbWUpLCBvdXJTaXplOiBlbnRyeS5zaXplLCB0aGVpclNpemU6IHRoZWlycy5zaXplIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicHVzaENvcHlVbmF2YWlsYWJsZVwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGhvbGRlcjogaG9sZGVyLmdldERlYnVnTmFtZSgpLCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBmb3JtYXREYXRlVGltZURldGFpbGVkKHdyaXRlVGltZSksIHNvdXJjZUhhczogdGhlaXJzICYmIGAke3RoZWlycy5zaXplfSBieXRlcyBhdCAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQodGhlaXJzLndyaXRlVGltZSl9YCB8fCBcIm5vdGhpbmdcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA8IFNZTkNfRVJST1JfTE9HX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZUZhaWx1cmVzID49IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQSBwYXVzZSBwZXIgZmFpbHVyZSwgc28gYSBkb3duIG5ldHdvcmsgdGFrZXMgbWludXRlcyB0byBidXJuIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIGluc3RlYWQgb2YgYW4gaW5zdGFudFxuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVjb25jaWxpbmcgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMsICR7ZmFpbGVkfSBmYWlsZWQke2Fib3J0ZWQgJiYgYCBiZWZvcmUgYWJvcnRpbmcgdGhlIHBhc3MgKCR7Y29uc2VjdXRpdmVGYWlsdXJlc30gY29uc2VjdXRpdmUgZmFpbHVyZXMgLSB0aGUgc291cmNlIGxvb2tzIGRvd247IHRoZSBuZXh0IHNjYW4gY3ljbGUgcmV0cmllcylgIHx8IFwiXCJ9LiBGaXJzdCBlcnJvcnM6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicmVjb25jaWxlRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHB1c2hlZCwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IFNjYW5PdXRjb21lIHtcbiAgICAgICAgLy8gQW4gaW4tZmxpZ2h0IHNjYW4gY2FuIG91dGxpdmUgaXRzIHNvdXJjZSdzIHJlbW92YWw7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmICghdGhpcy5pc0xpdmUoc291cmNlSW5kZXgpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBORVZFUiBwdWxsZWQgZnJvbSBvdGhlciBzb3VyY2VzIC0gaXQgb25seSBldmVyIGFycml2ZXMgYXMgYW4gZXhwbGljaXQsIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCBhbmQgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzay4gUm91dGUgYW5kIHZhbGlkLXdpbmRvdyBmaWx0ZXJzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IGVpdGhlcjogaXQgaXMgdGhlIGZpbGUgREVGSU5JTkcgdGhlbSwgc28gZmlsdGVyaW5nIGl0IHdvdWxkIG1lYW4gY2VydGFpbiBzb3VyY2VzIGNvdWxkIG5ldmVyIGhhdmUgdGhlaXIgcm91dGluZyBjb25maWcgdXBkYXRlZCwgZXZlci5cbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB2YWxpZCB3aW5kb3cgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhcHBsaWVkIGhlcmU6IGl0IGRlY2lkZXMgd2hlcmUgV1JJVEVTIHJvdXRlLCBidXQgYSBzY2FuIGlzIHVzIGFza2luZyBhIHNvdXJjZSB3aGF0IGl0IGFscmVhZHkgaG9sZHMgLSBleGlzdGluZyB2YWx1ZXMgc3luY2hyb25pemUgcmVnYXJkbGVzcyBvZiB0aGUgd2luZG93ICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS4gT25seSB0aGUgcm91dGUgZmlsdGVyczogYSBwYXJ0aWFsbHktb3ZlcmxhcHBpbmcgc2hhcmQncyBsaXN0aW5nIGxlZ2l0aW1hdGVseSBpbmNsdWRlcyBrZXlzIHRoYXQgYXJlbid0IG91cnMuXG4gICAgICAgICAgICBsZXQgeyByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMsIGFuZCBhIHRpZSBrZWVwcyB3aGF0IHdlIGhhdmUgLSBvdGhlcndpc2UgZXZlcnkgcmVzY2FuIG9mIGFuIHVuY2hhbmdlZCBmaWxlIHdvdWxkIHJlLXJlY29yZCBpdCwgbW92aW5nIGl0cyBob2xkZXIgYW5kIHdyaXRpbmcgYSBsb2cgcmVjb3JkIGZvciBub3RoaW5nLiBjdXJyZW50V3JpdGVUaW1lIGNvdW50cyBkZWxldGlvbnMsIHNvIGEgbGlzdGluZyB0aGF0IHN0aWxsIHNob3dzIGEgZmlsZSB3ZSBrbm93IHdhcyBkZWxldGVkIGRvZXMgbm90IHJlc3VycmVjdCBpdC5cbiAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKSkgcmV0dXJuIFwidW5jaGFuZ2VkXCI7XG4gICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAtIGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUgLSBzbyB0aGF0IGlzIHdoYXQgaXQgaXMgdGFrZW4gYXNcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFwidG9tYnN0b25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBcInVwZGF0ZWRcIjtcbiAgICAgICAgcmV0dXJuIFwibmV3XCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsQ2hhbmdlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBvbGxTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCByb3V0ZXM6IHJvdXRlICYmIFtyb3V0ZV0gfHwgdW5kZWZpbmVkLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgdGFsbHlbdGhpcy51cGRhdGVTY2FuSW5kZXgoc291cmNlSW5kZXgsIGZpbGUpXSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvbGxzIHJ1biBjb25zdGFudGx5LCBzbyBvbmx5IHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgY2hhbmdlZCB0aGUgaW5kZXggZ2V0IGFuIGVudHJ5XG4gICAgICAgIGlmICh0YWxseS5uZXcgfHwgdGFsbHkudXBkYXRlZCB8fCB0YWxseS50b21ic3RvbmUpIHtcbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImNoYW5nZXNQb2xsXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGNoYW5nZXM6IGNoYW5nZXMubGVuZ3RoLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCArPSBjaGFuZ2VzLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IHBvbGxTdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkcyB0aGUgZmlsZXMgYSBzb3VyY2UgY3VycmVudGx5IGhvbGRzIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCBwcmVzZXJ2aW5nIHRoZWlyIG1vZGlmaWVkIHRpbWVzIOKAlCBzbyBhIG5ld2VyIGxvY2FsIHdyaXRlIGFsd2F5cyB3aW5zLiBTa2lwcGVkIGZvciBub0Z1bGxTeW5jIHNvdXJjZXMgKGZyb250aW5nIGEgbGFyZ2UgZGF0YWJhc2Ugd2l0aG91dCBjb3B5aW5nIGl0KTsgcmVhZHMgc3RpbGwgZG93bi1jYWNoZSBsYXppbHkuIE9ubHkgb25lIHBhc3MgcGVyIFNPVVJDRSBydW5zIGF0IGEgdGltZSAoY2FjaGUga2V5cyB0aGUgc2VyaWFsaXplciBieSBzb3VyY2UgaW5kZXgpIC0gdHdvIHBhc3NlcyBvdmVyIHRoZSBzYW1lIHBlbmRpbmcgbGlzdCB3b3VsZCBkb3dubG9hZCBldmVyeXRoaW5nIHR3aWNlLlxuICAgIHByaXZhdGUgY29weVNvdXJjZUZpbGVzID0gY2FjaGUoKHNvdXJjZUluZGV4OiBudW1iZXIpID0+IHJ1bkluU2VyaWFsKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSAwKSByZXR1cm47XG4gICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgcGVuZGluZzogeyBrZXk6IHN0cmluZzsgZW50cnk6IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgbGV0IGNvcGllZFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IGNvcGllZFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcGVuZGluZy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJmdWxsU3luY1wiLFxuICAgICAgICAgICAgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICBkb25lRmlsZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIGRvbmVCeXRlczogMCxcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJkZWx0YVN5bmNTdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkaWZmQmFzZWQ6IHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCBmaWxlczogcGVuZGluZy5sZW5ndGgsIGJ5dGVzOiB0b3RhbEJ5dGVzIH0pO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NMb2dnZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGxvZ1Byb2dyZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcHJvZ3Jlc3NMb2dnZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgRGVsdGEgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAke2FjdGl2aXR5LmRvbmVGaWxlc30vJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgKCR7KChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApfUIvJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiAoJHsodG90YWxCeXRlcyAmJiAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSlgKSk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwobG9nUHJvZ3Jlc3MsIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgc2xvd0Vycm9yVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWU7XG4gICAgICAgICAgICBsZXQgZG9uZUZpbGVzID0gYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgZG9uZUJ5dGVzID0gYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgYnl0ZXNQZXJTZWNvbmQgPSBkb25lQnl0ZXMgLyAoZWxhcHNlZCAvIDEwMDApO1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZ0J5dGVzID0gdG90YWxCeXRlcyAtIGRvbmVCeXRlcztcbiAgICAgICAgICAgIGxldCBldGFUZXh0ID0gXCJ1bmtub3duIChubyBieXRlcyB0cmFuc2ZlcnJlZCB5ZXQpXCI7XG4gICAgICAgICAgICBpZiAoYnl0ZXNQZXJTZWNvbmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZ01zID0gcmVtYWluaW5nQnl0ZXMgLyBieXRlc1BlclNlY29uZCAqIDEwMDA7XG4gICAgICAgICAgICAgICAgZXRhVGV4dCA9IGAke2Zvcm1hdFRpbWUocmVtYWluaW5nTXMpfSByZW1haW5pbmcsIGNvbXBsZXRpbmcgYXJvdW5kICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChEYXRlLm5vdygpICsgcmVtYWluaW5nTXMpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYERlbHRhIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBoYXMgYmVlbiBydW5uaW5nIGZvciAke2Zvcm1hdFRpbWUoZWxhcHNlZCl9OiAke2RvbmVGaWxlc30vJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgKCR7KGRvbmVGaWxlcyAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihkb25lQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiAoJHsodG90YWxCeXRlcyAmJiBkb25lQnl0ZXMgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoYnl0ZXNQZXJTZWNvbmQpfUIvcy4gRXN0aW1hdGVkICR7ZXRhVGV4dH0uYCk7XG4gICAgICAgIH0sIEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMKTtcbiAgICAgICAgKHNsb3dFcnJvclRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIGxldCBjb3BpZWRGaWxlcyA9IDA7XG4gICAgICAgIGxldCBjb3BpZWRCeXRlcyA9IDA7XG4gICAgICAgIGxldCBtaXNzaW5nT25Tb3VyY2UgPSAwO1xuICAgICAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUgc291cmNlIGNhbm5vdCBnaXZlIHVzIHRoZSBmaWxlIChpdHMgcmVhZCBoYWQgbm90aGluZywgb3IgaXQgZXJyb3JlZCkuIFJldHJ5aW5nIHRoZSBzYW1lIGVudHJ5IGZvcmV2ZXIgaXMgbm90IGFuIGFuc3dlcjogaWYgb3VyIG93biBkaXNrIGhvbGRzIGEgY29weSwgSVQgYmVjb21lcyB0aGUgaG9sZGVyOyB3aXRoIG5vIGxvY2FsIGNvcHkgZWl0aGVyLCB0aGUgZW50cnkgaXMgcHVyZ2VkIC0gZm9yZ290dGVuLCBub3QgZGVsZXRlZCwgZXhhY3RseSBsaWtlIGEgcmVhZCB0aGF0IGNvbWVzIHVwIGVtcHR5IGV2ZXJ5d2hlcmUgLSBhbmQgdGhlIG5leHQgZnVsbCBwdWxsIHJlLWZpbmRzIGl0IGlmIGl0IGV4aXN0cyBhbnl3aGVyZS5cbiAgICAgICAgbGV0IHJlc29sdmVVbmF2YWlsYWJsZSA9IGFzeW5jIChldmVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgZW50cnk6IEluZGV4RW50cnksIGV4dHJhOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkgPT4ge1xuICAgICAgICAgICAgbGV0IGJhc2UgPSB7IGV2ZW50LCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGV4cGVjdGVkU2l6ZTogZW50cnkuc2l6ZSwgZXhwZWN0ZWRXcml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgLi4uZXh0cmEgfTtcbiAgICAgICAgICAgIGxldCBsb2NhbCA9IGF3YWl0IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UuZ2V0SW5mbyhrZXkpO1xuICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGxvY2FsIGNvcHkgY2FuIGJlIE5FV0VSIHRoYW4gdGhlIGVudHJ5ICh3aGljaCBpcyBleGFjdGx5IHdoeSBjb3B5QXJjaGl2ZUZpbGUgcmVmdXNlcyB0byBvdmVyd3JpdGUgaXQgLSBzZWUgaXRzIGRlc3RpbmF0aW9uIGNoZWNrKSwgc28gdGhlIHJlcG9pbnQga2VlcHMgdGhlIG5ld2VyIG9mIHRoZSB0d28gdGltZXMgcmF0aGVyIHRoYW4gcm9sbGluZyB0aGUgaW5kZXggYmFja1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBNYXRoLm1heChlbnRyeS53cml0ZVRpbWUsIGxvY2FsLndyaXRlVGltZSksIHNpemU6IGxvY2FsLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyAuLi5iYXNlLCByZXNvbHV0aW9uOiBcInJlcG9pbnRlZCB0byBvdXIgbG9jYWwgY29weVwiLCBsb2NhbFNpemU6IGxvY2FsLnNpemUsIGxvY2FsV3JpdGVUaW1lOiBmb3JtYXREYXRlVGltZURldGFpbGVkKGxvY2FsLndyaXRlVGltZSkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShrZXkpIDw9IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgLi4uYmFzZSwgcmVzb2x1dGlvbjogXCJwdXJnZWQgLSBuZWl0aGVyIHRoZSBzb3VyY2Ugbm9yIG91ciBkaXNrIGhhcyBpdCwgc28gaXQgZG9lcyBub3QgZXhpc3RcIiB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBIG5ld2VyIHdyaXRlIGxhbmRlZCB3aGlsZSB3ZSB3ZXJlIGNoZWNraW5nIC0gdGhlIGVudHJ5IGlzIG5vIGxvbmdlciB0aGUgb25lIHdlIGZvdW5kIHVuYXZhaWxhYmxlLCBzbyBpdCBpcyBsZWZ0IGFsb25lXG4gICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyAuLi5iYXNlLCByZXNvbHV0aW9uOiBcImtlcHQgLSBhIG5ld2VyIHdyaXRlIGFwcGVhcmVkIHdoaWxlIGNoZWNraW5nXCIsIGN1cnJlbnRXcml0ZVRpbWU6IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShrZXkpIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICBsZXQgY29weVdvcmtlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWFib3J0ZWQgJiYgIXRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gbmV4dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBrZXksIGVudHJ5IH0gPSBwZW5kaW5nW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiBzb3VyY2UsIHRvOiB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLCBwYXRoOiBrZXksIHByZXNlcnZlV3JpdGVUaW1lOiB0cnVlLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcGllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZEZpbGVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkQnl0ZXMgKz0gY29waWVkLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwga2V5LCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvcHkgY2FycmllcyB0aGUgc291cmNlJ3Mgd3JpdGUgdGltZSwgYW5kIHRoZSBpbmRleCBjb21taXRzIGl0IHVuZGVyIHRoZSBub3JtYWwgb3JkZXJpbmcgcnVsZSAoPj0gdGhlIGN1cnJlbnQgdGltZSB3aW5zKSAtIGl0IHJlZnVzaW5nIG1lYW5zIGEgTkVXRVIgd3JpdGUgbGFuZGVkIHdoaWxlIHdlIGNvcGllZCwgd2hpY2ggbXVzdCBiZSBzYWlkLCBub3Qgc3dhbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgc2l6ZTogY29waWVkLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJkZWx0YVN5bmNDb21taXRTdXBlcnNlZGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgY29waWVkV3JpdGVUaW1lOiBjb3BpZWQud3JpdGVUaW1lLCBjdXJyZW50V3JpdGVUaW1lOiB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdPblNvdXJjZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlc29sdmVVbmF2YWlsYWJsZShcImRlbHRhU3luY01pc3NpbmdPblNvdXJjZVwiLCBrZXksIGVudHJ5LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBmYWlsaW5nIGZpbGUgcmVzb2x2ZXMgZXhhY3RseSBsaWtlIGEgbWlzc2luZyBvbmUgKHRoZSBzb3VyY2UgY2Fubm90IGdpdmUgaXQgdG8gdXMgZWl0aGVyIHdheSksIHNvIGl0IG5ldmVyIHdlZGdlcyB0aGUgcGFzcyBvbiByZXRyaWVzIGZvcmV2ZXIgLSBhbmQgdGhlIG5leHQgZnVsbCBwdWxsIHJlLWZpbmRzIGl0IGlmIHRoZSBzb3VyY2UgcmVjb3ZlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJkZWx0YVN5bmNDb3B5RmFpbGVkXCIsIGtleSwgZW50cnksIHsgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyZXNvbHZlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJkZWx0YVN5bmNDb3B5RmFpbGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCksIHJlc29sdmVFcnJvcjogU3RyaW5nKChyZXNvbHZlRXJyb3IgYXMgRXJyb3IpLnN0YWNrID8/IHJlc29sdmVFcnJvcikuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcGF1c2UgcGVyIGZhaWx1cmUsIHNvIGEgZG93biBuZXR3b3JrIHRha2VzIG1pbnV0ZXMgdG8gYnVybiB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZG9uZUZpbGVzID0gKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVCeXRlcyA9IChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgKyBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgd29ya2VyczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKEZVTExfU1lOQ19QQVJBTExFTCwgcGVuZGluZy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJzLnB1c2goY29weVdvcmtlcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2xvd0Vycm9yVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmRlbGV0ZShhY3Rpdml0eSk7XG4gICAgICAgICAgICAvLyBBIHN5bmMgc2xvdyBlbm91Z2ggdG8gaGF2ZSBsb2dnZWQgcHJvZ3Jlc3MgYWxzbyBsb2dzIGl0cyBjb21wbGV0aW9uXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NMb2dnZWQpIHtcbiAgICAgICAgICAgICAgICBsb2dQcm9ncmVzcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGRpZmZCYXNlZDogc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWUsIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLCB0b3RhbEJ5dGVzLCBwcm9jZXNzZWRGaWxlczogYWN0aXZpdHkuZG9uZUZpbGVzLCBjb3BpZWRGaWxlcywgY29waWVkQnl0ZXMsIG1pc3NpbmdPblNvdXJjZSwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgLy8g4pSA4pSAIG1haW50ZW5hbmNlIOKUgOKUgFxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGl0IC0gYnV0IE9OTFkgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIGEgc2FtZS1vci1uZXdlciBjb3B5ICh0aGUgb25seSBjb3B5IG9mIGEgZmlsZSBpcyBuZXZlciBkZWxldGVkKSwgYW5kIHRoZSBpbmRleCBlbnRyeSByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBhc3luYyBlbmZvcmNlRGlza0xpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnN0b3JlLnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLnN0b3JlLmluZGV4VG90YWxzKCk7XG4gICAgICAgIC8vIENvdW50ZWQgZG93biBhcyB3ZSBldmljdCwgcmF0aGVyIHRoYW4gcmUtcmVhZCBwZXIgZmlsZTogYSBwYXNzIG9ubHkgZXZlciByZW1vdmVzIGJ5dGVzIGZyb20gdGhlIGRpc2ssIGFuZCBhbnl0aGluZyB3cml0dGVuIGR1cmluZyBpdCBpcyBwaWNrZWQgdXAgYnkgdGhlIG5leHQgcGFzc1xuICAgICAgICBsZXQgZGlza0J5dGVzID0gdG90YWxzLnNsb3RzWzBdLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKGRpc2tCeXRlcyA8PSBsaW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmV2aWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGV2aWN0ZWRGaWxlcyA9IDA7XG4gICAgICAgIGxldCBldmljdGVkQnl0ZXMgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXM6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXggfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZWFzdCByZWNlbnRseSBSRUFEIGZpcnN0OyBhIGtleSBub2JvZHkgaGFzIHJlYWQgc2luY2Ugd2Ugc3RhcnRlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4gdGhpcy5sYXN0QWNjZXNzLmdldCh4LmtleSkgfHwgeC5lbnRyeS5jaGFuZ2VkQXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbnRyeVVuY2hhbmdlZChrZXksIGVudHJ5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbaV0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmIGluZm8ud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBkb3duIHNvdXJjZSBqdXN0IGNhbid0IHZvdWNoIGZvciB0aGlzIGZpbGUgcmlnaHQgbm93XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvbGRlciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChob2xkZXIpIH0pO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIGRpc2tCeXRlcyAtPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5ldmljdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV2aWN0ZWRGaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEaXNrIGNhY2hlIG92ZXIgcmVhZGVyRGlza0xpbWl0IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGV2aWN0ZWQgJHtldmljdGVkRmlsZXN9IGxlYXN0LXJlY2VudGx5LXVzZWQgZmlsZXMgKCR7Zm9ybWF0TnVtYmVyKGV2aWN0ZWRCeXRlcyl9QiksIG5vdyBhdCAke2Zvcm1hdE51bWJlcihkaXNrQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIobGltaXQpfUJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWQgb25lcyBhcmUgZm9yZ290dGVuIGVudGlyZWx5LiBBIHdhbGsgb2YgdGhlIHRvbWJzdG9uZXMgYWxvbmUsIHdoaWNoIGlzIHdoeSBpdCBjYW4gcnVuIG9mdGVuIGFuZCBjb3N0IG5vdGhpbmcuIFRoZSBwaHlzaWNhbCBlbXB0eSBmaWxlIGlzIHJlbW92ZWQgb25seSBvbiBiYWNrYmxhemUgc291cmNlczogcmVtb3RlIHN0b3JlcyBleHBpcmUgdGhlaXIgb3duIHRvbWJzdG9uZXMgKGEgZGVsIHRoZXJlIHdvdWxkIGp1c3QgbWludCBhIGZyZXNoIG9uZSksIGFuZCBvdXIgb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgTUFSS0VEIGRlbGV0aW9uIG5ldmVyIGV4cGlyZXMgYnkgdGltZSAtIGl0cyBieXRlcyBhcmUgc3RpbGwgb24gZGlzaywgYW5kIHB1cmdpbmcgdGhlIHRvbWJzdG9uZSB3b3VsZCBsZXQgdGhlIG5leHQgZGlzayBzY2FuIHJlc3VycmVjdCB0aGVtIGFzIGxpdmUuIFJldGVudGlvbiBleHBpcmVzIGl0IGJ5IFNJWkUgKGVuZm9yY2VIaXN0b3J5TGltaXQpOyBvbmx5IG9uY2UgdGhlIGJ5dGVzIGFyZSBnb25lIGRvZXMgdGhlIHBsYWluIHRvbWJzdG9uZSBhZ2Ugb3V0IGhlcmUuXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRNYXJrZWRFbnRyeShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd3NBY2NlcHRXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlbGV0aW9uIGhpc3RvcnkgcmV0ZW50aW9uOiBtYXJrZWQgZmlsZXMga2VlcCB0aGVpciBieXRlcyBvbiBvdXIgZGlzayB1bnRpbCB0aGUgaGlzdG9yeSBvdXRncm93cyBtYXgoSElTVE9SWV9NSU5fQllURVMsIGxpdmUgYnl0ZXMgKiBoaXN0b3J5IGZhY3Rvcik7IHRoZW4gdGhlIE9MREVTVCBkZWxldGlvbnMgbG9zZSB0aGVpciBieXRlcyBhbmQgYmVjb21lIHBsYWluIHRvbWJzdG9uZXMsIHdoaWNoIGFnZSBvdXQgbm9ybWFsbHkgKGNsZWFudXBUb21ic3RvbmVzKVxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZUhpc3RvcnlMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChISVNUT1JZX01JTl9CWVRFUywgdGhpcy5zdG9yZS5pbmRleFRvdGFscygpLmJ5dGVDb3VudCAqIGF3YWl0IGdldEhpc3RvcnlGYWN0b3IoKSk7XG4gICAgICAgIGxldCBtYXJrZWQ6IHsga2V5OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZGVsZXRlVGltZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgbWFya2VkLnB1c2goeyBrZXksIHNpemU6IGVudHJ5LnNpemUsIGRlbGV0ZVRpbWU6IGVudHJ5LmRlbGV0ZVRpbWUgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPD0gYWxsb3dlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhcnRlZFdpdGhCeXRlcyA9IHRvdGFsQnl0ZXM7XG4gICAgICAgIHNvcnQobWFya2VkLCB4ID0+IHguZGVsZXRlVGltZSk7XG4gICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgbGV0IGRyb3BwZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IHsga2V5LCBzaXplIH0gb2YgbWFya2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5kcm9wTWFya2VkSGlzdG9yeShrZXkpO1xuICAgICAgICAgICAgdG90YWxCeXRlcyAtPSBzaXplO1xuICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgZHJvcHBlZEJ5dGVzICs9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW9uIGhpc3Rvcnkgb2Ygc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0gb3V0Z3JldyBpdHMgYnVkZ2V0ICgke2Zvcm1hdE51bWJlcihzdGFydGVkV2l0aEJ5dGVzKX1CIGtlcHQgdnMgJHtmb3JtYXROdW1iZXIoYWxsb3dlZCl9QiBhbGxvd2VkKTogZHJvcHBlZCB0aGUgJHtkcm9wcGVkfSBvbGRlc3QgbWFya2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihkcm9wcGVkQnl0ZXMpfUIpOyB0aGVpciB0b21ic3RvbmVzIHJlbWFpbiB1bnRpbCB0aGV5IGFnZSBvdXRgKTtcbiAgICB9XG59XG4iXX0=
|
|
831
|
+
/* _JS_SOURCE_HASH = "abfb3baf1ae048394c48c5b067ed0ac42cf4bd5b3ee4afb5f11f30a76ec7ea71"; */
|