sliftutils 1.7.21 → 1.7.22
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 +9 -2
- package/package.json +1 -1
- package/storage/remoteStorage/ArchivesRemote.ts +5 -5
- package/storage/remoteStorage/blobStore.d.ts +0 -1
- package/storage/remoteStorage/blobStore.ts +4 -10
- package/storage/remoteStorage/deployTakeover.d.ts +3 -0
- package/storage/remoteStorage/deployTakeover.ts +50 -12
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +3 -3
- package/storage/remoteStorage/dist/createArchives.ts.cache +40 -9
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +13 -3
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +11 -4
- package/storage/remoteStorage/dist/storageController.ts.cache +9 -4
- package/storage/remoteStorage/spec.md +1 -1
- package/storage/remoteStorage/storageController.d.ts +6 -1
- package/storage/remoteStorage/storageController.ts +24 -8
- package/storage/remoteStorage/storageServerState.ts +9 -5
|
@@ -212,6 +212,30 @@ class ArchivesChain {
|
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
|
+
// The server may be MID deploy-takeover: its getConfig returns the in-memory
|
|
216
|
+
// interpretation (window splits pointing at a successor's port), which is never in the
|
|
217
|
+
// routing file. A client connecting during the takeover must start on that
|
|
218
|
+
// interpretation, not discover it minutes later.
|
|
219
|
+
try {
|
|
220
|
+
let probeApi = found.probe.api;
|
|
221
|
+
if (probeApi) {
|
|
222
|
+
let servedConfig = (await probeApi.getConfig()).remoteConfig;
|
|
223
|
+
if (servedConfig) {
|
|
224
|
+
let served = (0, remoteConfig_1.normalizeRemoteConfig)(servedConfig);
|
|
225
|
+
if (JSON.stringify(served) !== JSON.stringify(active) && (0, remoteConfig_1.getConfigVersion)(served) >= (0, remoteConfig_1.getConfigVersion)(active)) {
|
|
226
|
+
console.log(`Adopting the server's in-memory routing interpretation at init for ${this.getDebugName()} (deploy takeover in progress)`);
|
|
227
|
+
active = served;
|
|
228
|
+
for (let source of sources) {
|
|
229
|
+
source.dispose();
|
|
230
|
+
}
|
|
231
|
+
sources = await this.buildSources(active);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (_b) {
|
|
237
|
+
// The raw routing config we already adopted still works
|
|
238
|
+
}
|
|
215
239
|
// The routing fetches double as our first latency measurements: variable-shard picking
|
|
216
240
|
// works immediately, instead of waiting for the first ping pass to land
|
|
217
241
|
for (let source of sources) {
|
|
@@ -230,13 +254,22 @@ class ArchivesChain {
|
|
|
230
254
|
}
|
|
231
255
|
}
|
|
232
256
|
}
|
|
257
|
+
async createChainSource(sourceConfig) {
|
|
258
|
+
let source = await sourceWrapper_1.SourceWrapper.create(sourceConfig);
|
|
259
|
+
// A takeover stamp change in a ping means the server's routing interpretation changed
|
|
260
|
+
// (deploy takeover started/ended); refresh so we learn within one ping interval
|
|
261
|
+
source.onServedConfigChanged = () => {
|
|
262
|
+
console.log(`Storage ${source.getDebugName()} advertised a routing change (deploy takeover); refreshing config for ${this.getDebugName()}`);
|
|
263
|
+
void this.refreshActiveConfig().catch((e) => { var _a; return console.error(`Config refresh failed for ${this.getDebugName()}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
264
|
+
};
|
|
265
|
+
// Latency (for variable-shard target preference) is tracked from initialization on
|
|
266
|
+
source.startPinging();
|
|
267
|
+
return source;
|
|
268
|
+
}
|
|
233
269
|
async buildSources(config) {
|
|
234
270
|
let sources = [];
|
|
235
271
|
for (let sourceConfig of config.sources.map(remoteConfig_1.normalizeSource)) {
|
|
236
|
-
|
|
237
|
-
// Latency (for variable-shard target preference) is tracked from initialization on
|
|
238
|
-
source.startPinging();
|
|
239
|
-
sources.push(source);
|
|
272
|
+
sources.push(await this.createChainSource(sourceConfig));
|
|
240
273
|
}
|
|
241
274
|
return sources;
|
|
242
275
|
}
|
|
@@ -313,9 +346,7 @@ class ArchivesChain {
|
|
|
313
346
|
sources.push(old);
|
|
314
347
|
}
|
|
315
348
|
else {
|
|
316
|
-
|
|
317
|
-
source.startPinging();
|
|
318
|
-
sources.push(source);
|
|
349
|
+
sources.push(await this.createChainSource(sourceConfig));
|
|
319
350
|
}
|
|
320
351
|
}
|
|
321
352
|
// In-flight requests still hold the old wrappers and finish fine; dispose just stops any
|
|
@@ -797,5 +828,5 @@ async function getBucketInfo(config) {
|
|
|
797
828
|
return await remote.getConfig();
|
|
798
829
|
}
|
|
799
830
|
exports.getBucketInfo = getBucketInfo;
|
|
800
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQixtREFBd0Q7QUFDeEQsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixpREFJd0I7QUFDeEIsbUVBQWdFO0FBQ2hFLHFEQUF3RjtBQUN4Riw0Q0FBaUQ7QUFDakQsNkRBQTBHO0FBQzFHLDJEQUF5RjtBQUN6RixtREFBa0c7QUFFbEcsZ0dBQWdHO0FBQ2hHLG1HQUFtRztBQUNuRyxnR0FBZ0c7QUFDaEcsa0dBQWtHO0FBQ2xHLG1HQUFtRztBQUNuRyxtR0FBbUc7QUFDbkcsbUdBQW1HO0FBQ25HLG9GQUFvRjtBQUVwRixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzNDLG1HQUFtRztBQUNuRyxpRUFBaUU7QUFDakUsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwRCxrR0FBa0c7QUFDbEcsMkJBQTJCO0FBQzNCLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQywyRkFBMkY7QUFDM0Ysb0RBQW9EO0FBQ3BELE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUUvQyxrR0FBa0c7QUFDbEcsa0dBQWtHO0FBQ2xHLGlHQUFpRztBQUNqRyxpR0FBaUc7QUFDakcsU0FBZ0IsaUJBQWlCLENBQUMsTUFBc0M7SUFDcEUsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSw2QkFBaUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFBLGdDQUFpQixFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxV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R0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUhELHNDQUdDIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuaW1wb3J0IHsgaXNOb2RlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnLCBCYWNrYmxhemVDb25maWcsXG4gICAgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBXUklURV9QQVNUX1dJTkRPV19HUkFDRSwgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBnZXRDb25maWdWZXJzaW9uLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsXG4gICAgbm9ybWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UsIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyxcbiAgICBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VWYXJpYWJsZVJvdXRlLFxufSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgQXJjaGl2ZXNSZW1vdGUsIHBhcnNlU3RvcmFnZVVybCwgYXV0aGVudGljYXRlU3RvcmFnZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCwgZ2V0TG9jYWxBcmNoaXZlcywgU2VydmVyQnVja2V0SW5mbyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciwgUkVUUllfU1RBUlRfREVMQVksIFJFVFJZX01BWF9ERUxBWSwgUkVUUllfR1JPV1RIIH0gZnJvbSBcIi4vc291cmNlV3JhcHBlclwiO1xuXG4vLyBUdXJucyBhIFJlbW90ZUNvbmZpZyBpbnRvIGEgdXNhYmxlIElBcmNoaXZlcyAoY3JlYXRlQXJjaGl2ZXMpLiBJbml0aWFsaXphdGlvbiBpcyBsYXp5OiBvbiB0aGVcbi8vIGZpcnN0IGNhbGwgd2Ugd2FsayB0aGUgc291cmNlcyBJTiBPUkRFUiBhbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGFuc3dlcnMgaXMgYXV0aG9yaXRhdGl2ZSAoc291cmNlc1xuLy8gYXJlIHN5bmNocm9uaXplZCBjb3BpZXMgb2YgdGhlIHNhbWUgYnVja2V0LCBzbyB3ZSBuZXZlciBjb25zdWx0IHRoZSByZXN0KS4gSXRzIHN0b3JlZCByb3V0aW5nXG4vLyBjb25maWcgd2lucyBvdmVyIHRoZSBpbi1tZW1vcnkgb25lIC0gdW5sZXNzIG91cnMgaGFzIGEgc3RyaWN0bHkgbmV3ZXIgdmVyc2lvbiwgaW4gd2hpY2ggY2FzZSB3ZVxuLy8gd3JpdGUgb3VycyAoY3JlYXRpbmcgdGhlIGJ1Y2tldCB3aGVuIG5vIHJvdXRpbmcgZXhpc3RzIGF0IGFsbCkuIEEgZmFpbGVkIGluaXQgKGFsbCBzb3VyY2VzIGRvd24sXG4vLyBvciB0aGUgcm91dGluZyB3cml0ZSB3YXMgcmVqZWN0ZWQpIHN0YXlzIGZhaWxlZCBmb3IgY2FsbGVycyBidXQgcmV0cmllcyBpdHNlbGYgaW4gdGhlIGJhY2tncm91bmRcbi8vIHdpdGggYSByYW1waW5nIGRlbGF5LiBPbmNlIHJ1bm5pbmcsIHdlIHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGV2ZXJ5IENPTkZJR19QT0xMX0lOVEVSVkFMIGFuZFxuLy8gcmVidWlsZCB0aGUgc291cmNlIGxpc3Qgd2hlbiBpdCBjaGFuZ2VkIChyZXVzaW5nIHdyYXBwZXJzIGZvciB1bmNoYW5nZWQgc291cmNlcykuXG5cbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbi8vIFdyb25nLXZhbGlkLXdpbmRvdyByZWplY3Rpb25zIHdpdGhpbiB0aGlzIGRpc3RhbmNlIG9mIGEga25vd24gd2luZG93IGJvdW5kYXJ5IGFyZSBqdXN0IHVzIHJhY2luZ1xuLy8gdGhlIGJvdW5kYXJ5IGl0c2VsZiAtIHdhaXRpbmcgZml4ZXMgdGhlbSwgbm8gbmV3IGNvbmZpZyBuZWVkZWRcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9XSU5ET1cgPSAzMCAqIDEwMDA7XG5jb25zdCBXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkgPSAxNSAqIDEwMDA7XG4vLyBPdGhlcndpc2Ugb3VyIGNvbmZpZyBpcyBzdGFsZTsgcmUtZmV0Y2ggaXQgZnJvbSB0aGUgc2VydmVyLCBhdCBtb3N0IHRoaXMgb2Z0ZW4gKHdoZW4gdGhyb3R0bGVkLFxuLy8gcmV0cnkgd2l0aCB3aGF0IHdlIGhhdmUpXG5jb25zdCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSA9IDMwICogMTAwMDtcbi8vIFdoZW4gZXZlcnkgc291cmNlIGxvb2tzIGRvd24sIGFsbCBvZiB0aGVtIGFyZSByZS1jb250YWN0ZWQgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb25cbi8vIHJlLWF0dGVtcHQpIGJlZm9yZSBnaXZpbmcgdXAgLSBhdCBtb3N0IHRoaXMgb2Z0ZW5cbmNvbnN0IEFWQUlMQUJJTElUWV9SRUNIRUNLX1RIUk9UVExFID0gNSAqIDEwMDA7XG5cbi8vIFRoZSBkaXJlY3QgQVBJIElBcmNoaXZlcyBmb3Igb25lIHNvdXJjZSwgd2l0aCBubyBVUkwtZm9ybSBmYWxsYmFjayBhbmQgbm8gY2hhaW5pbmcuIFVzZWQgYnkgdGhlXG4vLyBzdG9yYWdlIHNlcnZlciBmb3IgaXRzIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzLiBEZW5pZWQgY2FsbHMgdGhyb3cgaW1tZWRpYXRlbHkgKHJlZ2lzdGVyaW5nIHRoZVxuLy8gYWNjZXNzIHJlcXVlc3QgaW4gdGhlIGJhY2tncm91bmQpOiB0aGUgc3luYyBsb29wcyByZXRyeS1hbmQtbG9nIHVudGlsIGFjY2VzcyBpcyBncmFudGVkLCB3aGlsZVxuLy8gZXhwbGljaXQgd3JpdGVzIHN1cmZhY2UgdGhlIGRlbmlhbCAod2l0aCBncmFudCBpbnN0cnVjdGlvbnMpIHRvIHRoZSBjYWxsZXIgaW5zdGVhZCBvZiBoYW5naW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZTogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnKTogSUFyY2hpdmVzIHtcbiAgICBpZiAoc291cmNlLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZS51cmwpLmJ1Y2tldE5hbWUsIHB1YmxpYzogc291cmNlLnB1YmxpYywgaW1tdXRhYmxlOiBzb3VyY2UuaW1tdXRhYmxlIH0pO1xuICAgIH1cbiAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgbGV0IHNlcnZlciA9IGlzTm9kZSgpICYmIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VydmVyICYmIHBhcnNlZC5hZGRyZXNzID09PSBzZXJ2ZXIuZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBzZXJ2ZXIucG9ydCkge1xuICAgICAgICAvLyBUaGlzIHNvdXJjZSBpcyBhIGJ1Y2tldCBob3N0ZWQgYnkgb3VyIG93biBwcm9jZXNzIC0gdXNlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZ1xuICAgICAgICAvLyBvdXJzZWx2ZXMgb3ZlciBIVFRQU1xuICAgICAgICByZXR1cm4gZ2V0TG9jYWxBcmNoaXZlcyhwYXJzZWQuYWNjb3VudCwgcGFyc2VkLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBzb3VyY2UudXJsLCBhY2NvdW50TmFtZTogc291cmNlLmFjY291bnROYW1lLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSB9KTtcbn1cblxudHlwZSBDaGFpblN0YXRlID0ge1xuICAgIGNvbmZpZzogUmVtb3RlQ29uZmlnO1xuICAgIHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXTtcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcpOiBib29sZWFuIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gY29uZmlnLnZhbGlkV2luZG93O1xuICAgIHJldHVybiBzdGFydCAtIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFIDw9IG5vdyAmJiBub3cgPD0gZW5kICsgV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0U7XG59XG5cbi8vIENsaWVudCB3cml0ZXMgdGFyZ2V0IG9ubHkgdGhlIENVUlJFTlRMWSB2YWxpZCBzb3VyY2U6IGEgZnV0dXJlLXdpbmRvdyBzb3VyY2UgcmVjZWl2ZXMgaXRzIGRhdGFcbi8vIHRocm91Z2ggc2VydmVyLXNpZGUgZG93bnN0cmVhbSBwcm9wYWdhdGlvbi9iYWNrZmlsbCwgbmV2ZXIgZGlyZWN0bHkgZnJvbSBjbGllbnRzXG5mdW5jdGlvbiBjb25maWdBY2NlcHRzV3JpdGVzKGNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQ2hhaW4gaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIHByaXZhdGUgY29uZmlndXJlZDogUmVtb3RlQ29uZmlnO1xuICAgIC8vIFRoZSBjb25maWcgd2UgYWN0dWFsbHkgcnVuIG9uICh0aGUgYXV0aG9yaXRhdGl2ZSBzdG9yZWQgb25lIGFmdGVyIGluaXQpXG4gICAgcHJpdmF0ZSBhY3RpdmVDb25maWc6IFJlbW90ZUNvbmZpZztcbiAgICBwcml2YXRlIHN0YXRlUHJvbWlzZTogUHJvbWlzZTxDaGFpblN0YXRlPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGluaXRSZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgcHJpdmF0ZSBpbml0UmV0cnlUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVkID0gbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gdGhpcy5jb25maWd1cmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIGxldCB1cmxzID0gdGhpcy5hY3RpdmVDb25maWcuc291cmNlcy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICh4IGFzIEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZykudXJsKTtcbiAgICAgICAgcmV0dXJuIGBjaGFpbi8ke3VybHMuam9pbihcIixcIil9YDtcbiAgICB9XG5cbiAgICAvLyBMYXp5IGluaXQgdGhhdCByZXRocm93cyBpdHMgZXJyb3IgdG8gZXZlcnkgY2FsbGVyLCB3aGlsZSBhIGJhY2tncm91bmQgdGltZXIgcmVzZXRzIGFuZFxuICAgIC8vIHJldHJpZXMgaXQgd2l0aCBhIHJhbXBpbmcgZGVsYXkgLSBzbyBhIGNoYWluIHRoYXQgY291bGRuJ3QgaW5pdGlhbGl6ZSBmaXhlcyBpdHNlbGYgb25jZSBhXG4gICAgLy8gc291cmNlIGNvbWVzIGJhY2ssIHdpdGhvdXQgYW55IGNhbGxlciBoYXZpbmcgdG8gZHJpdmUgaXQuXG4gICAgcHJpdmF0ZSBnZXRTdGF0ZSgpOiBQcm9taXNlPENoYWluU3RhdGU+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEFyY2hpdmVzQ2hhaW4gJHt0aGlzLmdldERlYnVnTmFtZSgpfSBoYXMgYmVlbiBkaXNwb3NlZGApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3RhdGVQcm9taXNlKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgICAgICAgICB9LCAoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCB0aGlzLmluaXRSZXRyeVRpbWVyKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU3RvcmFnZSBpbml0IGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHRoaXMuaW5pdFJldHJ5RGVsYXkgLyAxMDAwKX1zLiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlUHJvbWlzZSA9PT0gcHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTdGF0ZSgpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5pbml0UmV0cnlEZWxheSk7XG4gICAgICAgICAgICAgICAgKHRoaXMuaW5pdFJldHJ5VGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5RGVsYXkgPSBNYXRoLm1pbihSRVRSWV9NQVhfREVMQVksIHRoaXMuaW5pdFJldHJ5RGVsYXkgKiBSRVRSWV9HUk9XVEgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPENoYWluU3RhdGU+IHtcbiAgICAgICAgbGV0IGNvbmZpZ3MgPSB0aGlzLmNvbmZpZ3VyZWQuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKTtcbiAgICAgICAgLy8gRVZFUlkgc291cmNlIGlzIGNvbnRhY3RlZCBmb3IgaXRzIHBpY3R1cmUgb2YgdGhlIHJvdXRpbmcgY29uZmlnIChwZXIgdGhlIHNwZWM6IHRoZSBjb25maWdcbiAgICAgICAgLy8gaXMgZHVwbGljYXRlZCBpbnRvIGFsbCBvZiB0aGVtKSAtIHdoaWNoIGFsc28gZXN0YWJsaXNoZXMgb3VyIGNvbm5lY3Rpb24gdG8gZXZlcnkgbm9kZSB1cFxuICAgICAgICAvLyBmcm9udC4gQ29udGFjdCBpcyBwYXJhbGxlbDsgQURPUFRJT04gaXMgZGV0ZXJtaW5pc3RpYyBieSBjb25maWcgb3JkZXIgYW1vbmcgdGhlIHNvdXJjZXNcbiAgICAgICAgLy8gdGhhdCBhbnN3ZXJlZCAodGhlIGZpcnN0IHVwIHNvdXJjZSBpcyBhdXRob3JpdGF0aXZlKS5cbiAgICAgICAgbGV0IGZldGNoZXMgPSBhd2FpdCBQcm9taXNlLmFsbChjb25maWdzLm1hcChhc3luYyBzb3VyY2VDb25maWcgPT4ge1xuICAgICAgICAgICAgbGV0IHByb2JlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IGJhY2tncm91bmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBwcm9iZS5yZWFkKGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldChST1VUSU5HX0ZJTEUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9iZSwgc291cmNlQ29uZmlnLCByZXNwb25kZWQ6IHRydWUsIGxhdGVuY3k6IERhdGUubm93KCkgLSBzdGFydCwgZXhpc3Rpbmc6IGRhdGEgJiYgcGFyc2VSb3V0aW5nRGF0YShkYXRhKSB8fCB1bmRlZmluZWQsIGVycm9yOiBcIlwiIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvYmUsIHNvdXJjZUNvbmZpZywgcmVzcG9uZGVkOiBmYWxzZSwgbGF0ZW5jeTogMCwgZXhpc3Rpbmc6IHVuZGVmaW5lZCwgZXJyb3I6IGAke3NvdXJjZUNvbmZpZy51cmx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmV0Y2hlcy5maW5kKHggPT4geC5yZXNwb25kZWQpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluaXRpYWxpemUgc3RvcmFnZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogbm8gc291cmNlIGFuc3dlcmVkLiAke2ZldGNoZXMubWFwKHggPT4geC5lcnJvcikuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGZvdW5kLmV4aXN0aW5nO1xuICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IHRoaXMuY29uZmlndXJlZDtcbiAgICAgICAgICAgIGxldCBuZWVkc1dyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBnZXRDb25maWdWZXJzaW9uKGV4aXN0aW5nKSA+PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0Q29uZmlnVmVyc2lvbihleGlzdGluZykgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShleGlzdGluZykgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXJjaGl2ZXMgY29uZmlndXJhdGlvbiB1cGRhdGVkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24sIGZvciAke2ZvdW5kLnNvdXJjZUNvbmZpZy51cmx9LiBVcGRhdGVzIHdpbGwgYmUgaWdub3JlZCB1bnRpbCB5b3UgaW5jcmVhc2UgdGhlIHZlcnNpb24uIFVzaW5nOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nKX0sIGlnbm9yaW5nOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGV4aXN0aW5nO1xuICAgICAgICAgICAgICAgIG5lZWRzV3JpdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZGVjaWRlZCB0byB3cml0ZSAob3VycyBpcyBuZXdlciB0aGFuIHRoZSBhdXRob3JpdGF0aXZlIGZpcnN0LXVwIHNvdXJjZSdzLCBvclxuICAgICAgICAgICAgICAgIC8vIG5vIHJvdXRpbmcgZXhpc3RzIHlldCkuIFRoZSB3cml0ZSBnb2VzIHRvIGFsbCBzb3VyY2VzLCBzbyBpdCBpcyByZWZ1c2VkIHVubGVzc1xuICAgICAgICAgICAgICAgIC8vIG91ciB2ZXJzaW9uIGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBFVkVSWSBzb3VyY2UncyBzdG9yZWQgdmVyc2lvbiAoYWxsIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBmZXRjaGVkIGFib3ZlKSAtIGEgc291cmNlIGF0IChvciBwYXN0KSBvdXIgdmVyc2lvbiBtZWFucyB0aGlzIHZlcnNpb24gbnVtYmVyIGlzXG4gICAgICAgICAgICAgICAgLy8gdGFrZW4sIGFuZCB3cml0aW5nIGFueXdheSB3b3VsZCBsZWF2ZSBzb3VyY2VzIGF0IHRoZSBzYW1lIHZlcnNpb24gd2l0aCBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50LCBlYWNoIHJlamVjdGluZyB0aGUgb3RoZXIncyBwdXNoZXMgZm9yZXZlci4gRG93biBzb3VyY2VzIGFyZSBzdGlsbFxuICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSB0aGUgc2VydmVyLXNpZGUgdmVyc2lvbiBndWFyZCB3aGVuIHRoZSB3cml0ZSBldmVudHVhbGx5IHJlYWNoZXMgdGhlbS5cbiAgICAgICAgICAgICAgICBsZXQgYmVzdDogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBjb25mbGljdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZldGNoIG9mIGZldGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0b3JlZCA9IGZldGNoLmV4aXN0aW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3JlZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmVzdCB8fCBnZXRDb25maWdWZXJzaW9uKHN0b3JlZCkgPiBnZXRDb25maWdWZXJzaW9uKGJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gc3RvcmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDb25maWdWZXJzaW9uKHN0b3JlZCkgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShzdG9yZWQpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdFVybCA9IGZldGNoLnNvdXJjZUNvbmZpZy51cmw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlc3QgJiYgZ2V0Q29uZmlnVmVyc2lvbihiZXN0KSA+PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0VXJsICYmIGdldENvbmZpZ1ZlcnNpb24oYmVzdCkgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXJjaGl2ZXMgY29uZmlndXJhdGlvbiB1cGRhdGVkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24sIGZvciAke2NvbmZsaWN0VXJsfS4gVXBkYXRlcyB3aWxsIGJlIGlnbm9yZWQgdW50aWwgeW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uLiBVc2luZzogJHtKU09OLnN0cmluZ2lmeShiZXN0KX0sIGlnbm9yaW5nOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCl9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gYmVzdDtcbiAgICAgICAgICAgICAgICAgICAgbmVlZHNXcml0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHVwZGF0ZSBvbmx5IGhhcHBlbnMgd2hlbiBFVkVSWSBzb3VyY2Ugd291bGQgYWNjZXB0IGl0IC0gYSBwYXJ0aWFsIHVwZGF0ZVxuICAgICAgICAgICAgICAgIC8vIHdvdWxkIGxlYXZlIHRoZSBzb3VyY2VzIG91dCBvZiBzeW5jLCBhbmQgYSBjbGllbnQgd2l0aG91dCBhY2Nlc3MgcmV0cnlpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gd3JpdGUgZm9yZXZlciB3b3VsZCBuZXZlciBpbml0aWFsaXplLiBXaXRob3V0IGZ1bGwgYWNjZXNzIHdlIHJ1biBvbiB0aGUgc3RvcmVkXG4gICAgICAgICAgICAgICAgLy8gY29uZmlnICh3aGVuIHRoZXJlIGlzIG9uZSkgYW5kIGxvZyB0aGUgcHJvYmxlbSBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgIGxldCBtaXNzaW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfSAoY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm90IHdyaXRpbmcgdGhlIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCl9KTogbm8gd3JpdGUgYWNjZXNzIHRvICR7bWlzc2luZy5qb2luKFwiLCBcIil9LiAke2V4aXN0aW5nICYmIGBSdW5uaW5nIG9uIHRoZSBzdG9yZWQgY29uZmlnICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihleGlzdGluZyl9KSBpbnN0ZWFkLmAgfHwgYE5vIHN0b3JlZCBjb25maWcgZXhpc3RzLCBzbyB0aGUgYnVja2V0IGNhbm5vdCBiZSBjcmVhdGVkIHVudGlsIHdyaXRlIGFjY2VzcyBpcyBncmFudGVkLmB9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gZXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJlamVjdGVkIHdyaXRlIGZhaWxzIGluaXQsIHdoaWNoIHJldHJpZXMgZnJvbSBzY3JhdGNoIC0gcmUtcmVhZGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdXRpbmcsIHNvIGxvc2luZyBhIGNyZWF0ZSByYWNlIHRvIGFub3RoZXIgY2xpZW50IGp1c3QgYWRvcHRzIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcgb24gdGhlIG5leHQgYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvdW5kLnByb2JlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyh0aGlzLmNvbmZpZ3VyZWQpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBmZXRjaGVzIGRvdWJsZSBhcyBvdXIgZmlyc3QgbGF0ZW5jeSBtZWFzdXJlbWVudHM6IHZhcmlhYmxlLXNoYXJkIHBpY2tpbmdcbiAgICAgICAgICAgIC8vIHdvcmtzIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBwaW5nIHBhc3MgdG8gbGFuZFxuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmV0Y2ggPSBmZXRjaGVzLmZpbmQoeCA9PiB4LnJlc3BvbmRlZCAmJiB4LnNvdXJjZUNvbmZpZy51cmwgPT09IHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoZmV0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLnNlZWRMYXRlbmN5KGZldGNoLmxhdGVuY3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbmZpZ1BvbGwoKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbmZpZzogYWN0aXZlLCBzb3VyY2VzIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmZXRjaCBvZiBmZXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgZmV0Y2gucHJvYmUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcpOiBQcm9taXNlPFNvdXJjZVdyYXBwZXJbXT4ge1xuICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZUNvbmZpZyBvZiBjb25maWcuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGF3YWl0IFNvdXJjZVdyYXBwZXIuY3JlYXRlKHNvdXJjZUNvbmZpZyk7XG4gICAgICAgICAgICAvLyBMYXRlbmN5IChmb3IgdmFyaWFibGUtc2hhcmQgdGFyZ2V0IHByZWZlcmVuY2UpIGlzIHRyYWNrZWQgZnJvbSBpbml0aWFsaXphdGlvbiBvblxuICAgICAgICAgICAgc291cmNlLnN0YXJ0UGluZ2luZygpO1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydENvbmZpZ1BvbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lciB8fCB0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJlZnJlc2hBY3RpdmVDb25maWcoKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyBmb3IgYSBuZXcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIENPTkZJR19QT0xMX0lOVEVSVkFMKTtcbiAgICAgICAgKHRoaXMucG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZXMgY29uY3VycmVudCByZWZyZXNoZXMgKHRoZSBwb2xsIHRpbWVyIGFuZCB3cm9uZy10YXJnZXQgd3JpdGUgcmV0cmllcyBzaGFyZSB0aGlzKVxuICAgIHByaXZhdGUgY29uZmlnUmVmcmVzaEluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVmcmVzaEFjdGl2ZUNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQgPSB0aGlzLmNoZWNrRm9yTmV3Q29uZmlnKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhdGVzdCBjb25maWcsIGFzIHRoZSBzZXJ2ZXIgSU5URVJQUkVUUyBpdDogZ2V0Q29uZmlnIGNhcnJpZXMgaW4tbWVtb3J5IG92ZXJsYXlzIChkZXBsb3lcbiAgICAvLyB0YWtlb3ZlciByZW1hcHMpIHRoYXQgYXJlIGRlbGliZXJhdGVseSBuZXZlciB3cml0dGVuIGludG8gdGhlIHJvdXRpbmcgZmlsZSwgc28gaXQnc1xuICAgIC8vIHByZWZlcnJlZCBvdmVyIHJlYWRpbmcgdGhlIHJhdyBmaWxlLiBVUkwtb25seSBjaGFpbnMgZmFsbCBiYWNrIHRvIHRoZSByYXcgZmlsZS5cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoTGF0ZXN0Q29uZmlnKHN0YXRlOiBDaGFpblN0YXRlKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgeyBhcGlPbmx5OiB0cnVlIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENvbmZpZygpKTtcbiAgICAgICAgICAgIGlmIChjb25maWcucmVtb3RlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhjb25maWcucmVtb3RlQ29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwge30sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldChST1VUSU5HX0ZJTEUpKTtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNoZWNrRm9yTmV3Q29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJbml0IGlzIGZhaWxpbmc7IGl0cyBvd24gcmV0cnkgbG9vcCBoYW5kbGVzIHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGF0ZXN0ID0gYXdhaXQgdGhpcy5mZXRjaExhdGVzdENvbmZpZyhzdGF0ZSk7XG4gICAgICAgIGlmICghbGF0ZXN0KSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuYWRvcHROZXdDb25maWcoc3RhdGUsIGxhdGVzdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhZG9wdE5ld0NvbmZpZyhzdGF0ZTogQ2hhaW5TdGF0ZSwgbGF0ZXN0OiBSZW1vdGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGxhdGVzdCkgPT09IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbmZpZykpIHJldHVybjtcbiAgICAgICAgLy8gU2FtZSB2ZXJzaW9uIGJ1dCBkaWZmZXJlbnQgY29udGVudCBpcyBhIGRlcGxveSBzd2l0Y2hvdmVyIHJlbWFwIChhbiBpbi1tZW1vcnkgd2luZG93XG4gICAgICAgIC8vIHNwbGl0IHBvaW50aW5nIGF0IGEgc3VjY2Vzc29yJ3MgcG9ydCksIG5vdCBhbiBhY3R1YWwgY29uZmlndXJhdGlvbiBjaGFuZ2VcbiAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24obGF0ZXN0KSA9PT0gZ2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIHJlaW50ZXJwcmV0ZWQgYXQgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24obGF0ZXN0KX0gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKGRlcGxveSBzd2l0Y2hvdmVyIGluIHByb2dyZXNzKSwgcmVidWlsZGluZyBzb3VyY2VzLiBTb3VyY2VzOiAke0pTT04uc3RyaW5naWZ5KGxhdGVzdC5zb3VyY2VzKX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yYWdlIHJvdXRpbmcgY29uZmlnIGNoYW5nZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHN0YXRlLmNvbmZpZyl9IC0+ICR7Z2V0Q29uZmlnVmVyc2lvbihsYXRlc3QpfSksIHJlYnVpbGRpbmcgc291cmNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvbGRCeUNvbmZpZyA9IG5ldyBNYXAoc3RhdGUuc291cmNlcy5tYXAoc291cmNlID0+IFtKU09OLnN0cmluZ2lmeShzb3VyY2UuY29uZmlnKSwgc291cmNlXSkpO1xuICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZUNvbmZpZyBvZiBsYXRlc3Quc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSkge1xuICAgICAgICAgICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZyk7XG4gICAgICAgICAgICBsZXQgb2xkID0gb2xkQnlDb25maWcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAob2xkKSB7XG4gICAgICAgICAgICAgICAgb2xkQnlDb25maWcuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKG9sZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBhd2FpdCBTb3VyY2VXcmFwcGVyLmNyZWF0ZShzb3VyY2VDb25maWcpO1xuICAgICAgICAgICAgICAgIHNvdXJjZS5zdGFydFBpbmdpbmcoKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJbi1mbGlnaHQgcmVxdWVzdHMgc3RpbGwgaG9sZCB0aGUgb2xkIHdyYXBwZXJzIGFuZCBmaW5pc2ggZmluZTsgZGlzcG9zZSBqdXN0IHN0b3BzIGFueVxuICAgICAgICAvLyBiYWNrZ3JvdW5kIHJlY29ubmVjdC9waW5nIGxvb3BzXG4gICAgICAgIGZvciAobGV0IGxlZnRvdmVyIG9mIG9sZEJ5Q29uZmlnLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBsZWZ0b3Zlci5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVDb25maWcgPSBsYXRlc3Q7XG4gICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHsgY29uZmlnOiBsYXRlc3QsIHNvdXJjZXMgfSk7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBldmVyeSBzb3VyY2UgbG9va3MgZG93biwgdGhlIHJvdXRpbmcgY29uZmlnIGlzIHJlLXJlYWQgZnJvbSBFVkVSWSBzb3VyY2UgLSB3aGljaCBib3RoXG4gICAgLy8gcmUtYXR0ZW1wdHMgdGhlaXIgY29ubmVjdGlvbnMgKG91ciBsaXZlbmVzcyByZS1jaGVjaykgYW5kIGRpc2NvdmVycyBhIHJvdXRpbmcgdXBkYXRlIHdlIG1heVxuICAgIC8vIGhhdmUgbWlzc2VkIChhZG9wdGluZyBpdCByZS1pbml0aWFsaXplcyB0aGUgc291cmNlIGxpc3QpLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHBhc3MuXG4gICAgcHJpdmF0ZSBsYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA9IDA7XG4gICAgcHJpdmF0ZSBhdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByZWNoZWNrQXZhaWxhYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQpIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrIDwgQVZBSUxBQklMSVRZX1JFQ0hFQ0tfVEhST1RUTEUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5sYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0ID0gdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyByZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJbml0IGlzIGZhaWxpbmc7IGl0cyBvd24gcmV0cnkgbG9vcCBoYW5kbGVzIHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgRXZlcnkgc3RvcmFnZSBzb3VyY2UgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OyByZS1jb250YWN0aW5nIGFsbCAke3N0YXRlLnNvdXJjZXMubGVuZ3RofSBzb3VyY2VzIChyb3V0aW5nIHJlLXJlYWQgKyBjb25uZWN0aW9uIHJlLWF0dGVtcHQpYCk7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RhdGUuc291cmNlcy5tYXAoYXN5bmMgc291cmNlID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXQoUk9VVElOR19GSUxFKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEgJiYgcGFyc2VSb3V0aW5nRGF0YShkYXRhKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBsYXRlc3QgPSByZXN1bHRzLmZpbmQoeCA9PiB4KTtcbiAgICAgICAgaWYgKCFsYXRlc3QpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5hZG9wdE5ld0NvbmZpZyhzdGF0ZSwgbGF0ZXN0KTtcbiAgICB9XG5cbiAgICAvLyBSdW5zIGEgcmVxdWVzdCBhZ2FpbnN0IHRoZSBmaXJzdCBhdmFpbGFibGUgc291cmNlICh0aGF0IGNvdmVycyB0aGUga2V5J3Mgcm91dGUsIHdoZW4gb25lIGlzXG4gICAgLy8gZ2l2ZW4pLCBtb3ZpbmcgdG8gdGhlIG5leHQgb25lIE9OTFkgd2hlbiB0aGUgc291cmNlJ3MgV2ViU29ja2V0IGlzIGRvd24gKGNoZWNrZWQgZGlyZWN0bHkgLVxuICAgIC8vIG5ldmVyIGJ5IGluc3BlY3RpbmcgdGhlIGVycm9yLCB3aGljaCBpcyBhcmJpdHJhcnkgZGF0YSkuIEFuIGVycm9yIGZyb20gYSBjb25uZWN0ZWQgc291cmNlIGlzXG4gICAgLy8gYW4gYXBwbGljYXRpb24gZXJyb3IgYW5kIHRocm93cyBhcy1pcy4gQSBkb3duIHNvdXJjZSBnZXRzIGl0cyBiYWNrZ3JvdW5kIHJlY29ubmVjdCBraWNrZWQuXG4gICAgcHJpdmF0ZSBhc3luYyBydW48VD4oc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlciB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChjb25maWcud3JpdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bldyaXRlKGNvbmZpZy5yb3V0ZSwgcnVuKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgIXJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgY29uZmlnLnJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmFwaU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcGkgPSBzb3VyY2UuYXBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH0gaGFzIFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlIHRoaXMgb3BlcmF0aW9uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGFwaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHNvdXJjZS5yZWFkKHJ1bik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFdmVyeSBzb3VyY2UgZmFpbGVkOiByZS1jb250YWN0IGV2ZXJ5dGhpbmcgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb24gcmUtYXR0ZW1wdCxcbiAgICAgICAgICAgIC8vIHBvc3NpYmx5IGFkb3B0aW5nIGEgcm91dGluZyB1cGRhdGUpIGFuZCB0cnkgb25jZSBtb3JlIGJlZm9yZSBnaXZpbmcgdXBcbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxsIHNvdXJjZXMgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifTogJHtlcnJvcnMuam9pbihcIiB8IFwiKSB8fCBcIm5vIHNvdXJjZXMgYXZhaWxhYmxlXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXcml0ZXMgYXJlIGNvbnNpc3RlbnQ6IHRoZXkgZ28gdG8gdGhlIGZpcnN0IGN1cnJlbnRseS12YWxpZCBzb3VyY2UgY292ZXJpbmcgdGhlIGtleSdzIHJvdXRlXG4gICAgLy8gYW5kIE5FVkVSIGZhaWwgb3ZlciB0byBhbm90aGVyIG5vZGUgLSBhIGNsaWVudCB3cm9uZ2x5IGRlY2lkaW5nIG5vZGVzIGFyZSBkb3duIG11c3Qgbm90XG4gICAgLy8gc2NhdHRlciBpdHMgd3JpdGVzIGFjcm9zcyB0aGUgY2hhaW4uIChSZWFkcyBmYWlsIG92ZXIgZnJlZWx5IGFib3ZlOiBzb3VyY2VzIGFyZSBzeW5jaHJvbml6ZWRcbiAgICAvLyBjb3BpZXMsIHNvIHJlYWRpbmcgZnJvbSBhbnkgb2YgdGhlbSBpcyBzYWZlLikgVGhlIG9uZSByZXRyeSBpcyBmb3IgYSB3aW5kb3cgYm91bmRhcnkgcGFzc2luZ1xuICAgIC8vIChvciBhIHJvdXRlIGRpc2FncmVlbWVudCkgbWlkLXdyaXRlLCB3aGljaCByZS1yZXNvbHZlcyB0aGUgdGFyZ2V0IHJhdGhlciB0aGFuIGZhbGxpbmcgYmFjay5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bldyaXRlPFQ+KHJvdXRlOiBudW1iZXIgfCB1bmRlZmluZWQsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1dpbmRvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nUm91dGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ0FjY2VwdHNXcml0ZXMoeC5jb25maWcpICYmIChyb3V0ZSA9PT0gdW5kZWZpbmVkIHx8IHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIHJvdXRlKSkpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAvLyBCZWZvcmUgZ2l2aW5nIHVwLCByZS1jb250YWN0IGV2ZXJ5IHNvdXJjZSBvbmNlIChyb3V0aW5nIHJlLXJlYWQgKyBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gcmUtYXR0ZW1wdCwgcG9zc2libHkgYWRvcHRpbmcgYSByb3V0aW5nIHVwZGF0ZSB0aGF0IGZpeGVzIHRoZSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7cm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke3JvdXRlfSlgIHx8IFwiXCJ9IChldmVyeSBzb3VyY2UgaXMgb3V0c2lkZSBpdHMgdmFsaWQgd2luZG93IG9yIG91dHNpZGUgdGhlIGtleSdzIHJvdXRlKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGFyZ2V0LndyaXRlKHJ1bik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSAmJiAhcmV0cmllZFdyb25nV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1dpbmRvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwid2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgJiYgIXJldHJpZWRXcm9uZ1JvdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1JvdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJyb3V0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb25uZWN0aW9uIGRpZWQgZHVyaW5nIChvciBiZWZvcmUpIHRoZSByZXF1ZXN0LiBPbmUgZnVsbCByZS1jb250YWN0IHBhc3MsXG4gICAgICAgICAgICAgICAgLy8gdGhlbiBvbmUgcmV0cnkgLSBzdGlsbCB0aGUgc2FtZSBjb25zaXN0ZW50IHRhcmdldCwgbmV2ZXIgYSBkaWZmZXJlbnQgbm9kZS5cbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbGFzdENvbmZpZ1JlZnJlc2ggPSAwO1xuICAgIC8vIEEgd3JvbmctdGFyZ2V0IHJlamVjdGlvbiBtZWFucyBlaXRoZXIgd2UgcmFjZWQgYSB3aW5kb3cgYm91bmRhcnkgKHRpbWUgZml4ZXMgaXQpIG9yIG91clxuICAgIC8vIGNvbmZpZyBpcyBzdGFsZSAtIGUuZy4gYSBkZXBsb3ktdGFrZW92ZXIgcmVtYXAgdGhhdCBvbmx5IGV4aXN0cyBpbiB0aGUgc2VydmVyJ3MgbWVtb3J5XG4gICAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZTogQ2hhaW5TdGF0ZSwga2luZDogXCJ3aW5kb3dcIiB8IFwicm91dGVcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbmVhckJvdW5kYXJ5ID0gc3RhdGUuc291cmNlcy5zb21lKHNvdXJjZSA9PiBzb3VyY2UuY29uZmlnLnZhbGlkV2luZG93LnNvbWUodCA9PiB0ID4gMCAmJiB0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgTWF0aC5hYnModCAtIG5vdykgPD0gV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVykpO1xuICAgICAgICAgICAgaWYgKG5lYXJCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcml0ZSByZWplY3RlZCBieSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiByYWNlZCBhIHZhbGlkIHdpbmRvdyBib3VuZGFyeTsgd2FpdGluZyAke1dST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSAvIDEwMDB9cyBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmxhc3RDb25maWdSZWZyZXNoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHdyb25nICR7a2luZH0pOiBvdXIgY29uZmlnIGlzIHN0YWxlIChsaWtlbHkgYSBkZXBsb3kgc3dpdGNob3Zlcik7IHJlZnJlc2hpbmcgaXQgYW5kIHJldHJ5aW5nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihjb25maWc6IHsgYXBpT25seT86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXIgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgY29uZmlnLCBydW4pO1xuICAgIH1cblxuICAgIC8vIFRoZSBhY2Nlc3MtcGFnZSBsaW5rIChwbHVzIG91ciBtYWNoaW5lSWQvaXAsIGZvciB0aGUgYXBwcm92ZXIgdG8gbWF0Y2ggdGhlIHJlcXVlc3QpIGZvciB0aGVcbiAgICAvLyBmaXJzdCBob3N0ZWQgc291cmNlIHRoYXQgaGFzbid0IGdyYW50ZWQgdXMgYWNjZXNzLiB1bmRlZmluZWQgd2hlbiB3ZSBoYXZlIGFjY2VzcyBldmVyeXdoZXJlXG4gICAgLy8gd2UgY2FuIGhhdmUgaXQuIEFsc28gcmVnaXN0ZXJzIHRoZSBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZS5cbiAgICBwdWJsaWMgYXN5bmMgd2FpdGluZ0ZvckFjY2VzcygpOiBQcm9taXNlPHsgbGluazogc3RyaW5nOyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuYXBpIGluc3RhbmNlb2YgQXJjaGl2ZXNSZW1vdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgd2FpdGluZyA9IGF3YWl0IHNvdXJjZS5hcGkud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nKSByZXR1cm4gd2FpdGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7IHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSkgfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSkpO1xuICAgIH1cblxuICAgIC8vIEEgbWluaW1hbCBzZXQgb2YgY29ubmVjdGVkLCBjdXJyZW50bHktdmFsaWQgQVBJIHNvdXJjZXMgd2hvc2Ugcm91dGVzIGNvdmVyIFswLCAxKSAtIGxpc3RpbmdcbiAgICAvLyBvcGVyYXRpb25zIG11c3QgbWVyZ2UgZXZlcnkgc2hhcmQuIEdyZWVkeSBzd2VlcDogcmVwZWF0ZWRseSB0YWtlIHRoZSBzb3VyY2UgdGhhdCBleHRlbmRzXG4gICAgLy8gY292ZXJhZ2UgdGhlIGZ1cnRoZXN0LiBJbiBwcmFjdGljZSB0aGlzIGlzIG9uZSBzb3VyY2UgKHVuc2hhcmRlZCksIG9yIG9uZSBwZXIgc2hhcmQuXG4gICAgcHJpdmF0ZSBzZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGU6IENoYWluU3RhdGUsIGV4Y2x1ZGVkOiBTZXQ8U291cmNlV3JhcHBlcj4pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgeC5hcGkgJiYgIWV4Y2x1ZGVkLmhhcyh4KSk7XG4gICAgICAgIGxldCBjaG9zZW46IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgICAgIHdoaWxlIChjb3ZlcmVkIDwgMSkge1xuICAgICAgICAgICAgbGV0IGJlc3Q6IFNvdXJjZVdyYXBwZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgYmVzdEVuZCA9IGNvdmVyZWQ7XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzb3VyY2UuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID4gY292ZXJlZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA+IGJlc3RFbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdEVuZCA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgYmVzdCA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJlc3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3ZlciB0aGUgZnVsbCByb3V0ZSBzcGFjZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogdGhlIGF2YWlsYWJsZSBzb3VyY2VzIG9ubHkgY292ZXIgdXAgdG8gJHtjb3ZlcmVkfSAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaG9zZW4ucHVzaChiZXN0KTtcbiAgICAgICAgICAgIGNvdmVyZWQgPSBiZXN0RW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaG9zZW47XG4gICAgfVxuXG4gICAgLy8gRmFucyBvbmUgY2FsbCBvdXQgb3ZlciBhIGNvdmVyaW5nIHNldCBvZiBzaGFyZHMuIFNvdXJjZXMgYXJlIG5ldmVyIHByZS1maWx0ZXJlZCBieVxuICAgIC8vIGNvbm5lY3Rpdml0eSAtIHRoZSByZXF1ZXN0IGlzIGF0dGVtcHRlZCwgYW5kIGEgZmFpbHVyZSB3aXRoIHRoZSBzb2NrZXQgZG93biBhZnRlcndhcmRzXG4gICAgLy8gZXhjbHVkZXMgdGhhdCBzb3VyY2UgYW5kIHJlLXNlbGVjdHMgdGhlIGNvdmVyaW5nIHNldCAoYW4gZXJyb3IgZnJvbSBhIGxpdmUgc291cmNlIHRocm93cykuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5PbkNvdmVyaW5nPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCBleGNsdWRlZCA9IG5ldyBTZXQ8U291cmNlV3JhcHBlcj4oKTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBjb3ZlcmluZyA9IHRoaXMuc2VsZWN0Q292ZXJpbmdTb3VyY2VzKHN0YXRlLCBleGNsdWRlZCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNvdmVyaW5nLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBhcGkgPSBzb3VyY2UuYXBpO1xuICAgICAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2UuY29uZmlnLnVybH0gaGFzIFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlIHRoaXMgb3BlcmF0aW9uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhd2FpdCBydW4oYXBpKSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWQuYWRkKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMuZXZlcnkoeCA9PiB4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcCh4ID0+ICh4IGFzIHsgdmFsdWU6IFQgfSkudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKTtcbiAgICAgICAgLy8gT3ZlcmxhcHBpbmcgc2hhcmRzIGNhbiBib3RoIHJlcG9ydCBhIHBhdGg7IHRoZSBuZXdlc3Qgd2luc1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyKHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IHN1cHBvcnQgZ2V0Q2hhbmdlc0FmdGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXJjaGl2ZXMuZ2V0Q2hhbmdlc0FmdGVyKHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IGxpc3Qgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlQYXRoLmdldChmaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmcgfHwgZmlsZS5jcmVhdGVUaW1lID4gZXhpc3RpbmcuY3JlYXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBieVBhdGguc2V0KGZpbGUucGF0aCwgZmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBtZXJnZWQgPSBbLi4uYnlQYXRoLnZhbHVlcygpXTtcbiAgICAgICAgc29ydChtZXJnZWQsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgbGV0IHN0YXR1c2VzID0gYXdhaXQgdGhpcy5ydW5PbkNvdmVyaW5nKGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgIGlmICghYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcmNoaXZlcy5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHN0YXR1c2VzLmV2ZXJ5KHggPT4geC5hbGxTY2Fuc0NvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogc3RhdHVzZXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguaW5kZXhTaXplLCAwKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHN0YXR1c2VzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIXN0YXRlLnNvdXJjZXMuc29tZSh4ID0+IHguYXBpKSkgcmV0dXJuIHsgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IGF3YWl0IHRoaXMucnVuKHN0YXRlLCB7IGFwaU9ubHk6IHRydWUgfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0Q29uZmlnKCkpO1xuICAgICAgICByZXR1cm4geyAuLi5jb25maWcsIHJlbW90ZUNvbmZpZzogc3RhdGUuY29uZmlnIH07XG4gICAgfVxuICAgIC8qKiBUcnVlIG9ubHkgd2hlbiBFVkVSWSB3cml0ZS1yZWNlaXZpbmcgc291cmNlIHdvdWxkIGFjY2VwdCBvdXIgd3JpdGVzIChwYXJ0aWFsIHdyaXRlIGFjY2Vzc1xuICAgICAqICBkZXN5bmNocm9uaXplcyBzb3VyY2VzLCBzbyBpdCBjb3VudHMgYXMgbm8gYWNjZXNzKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnQWNjZXB0c1dyaXRlcyhzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgdGhlIGZ1bGwga2V5IHdyaXR0ZW4uIFBsYWluIGtleXMgY29tZSBiYWNrIHVuY2hhbmdlZDsga2V5cyBjb250YWluaW5nIFZBUklBQkxFX1NIQVJEXG4gICAgICogIGFyZSBhdXRvbWF0aWNhbGx5IG1hdGVyaWFsaXplZCAoYSBzaGFyZCB2YWx1ZSBpcyBwaWNrZWQgYW5kIGVtYmVkZGVkLCBzZWUgc2V0VmFyaWFibGVTaGFyZClcbiAgICAgKiAgYW5kIHRoZSBjYWxsZXIgbmVlZHMgdGhlIHJldHVybmVkIGtleSB0byBldmVyIHJlYWQgdGhlIHZhbHVlIGJhY2suICovXG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoVkFSSUFCTEVfU0hBUkQpICYmIHBhcnNlVmFyaWFibGVSb3V0ZShmaWxlTmFtZSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0VmFyaWFibGVTaGFyZChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoZmlsZU5hbWUsIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5kZWwoZmlsZU5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBXcml0ZXMgYSBiYXJlIHZhcmlhYmxlLXNoYXJkIGtleTogcGlja3MgdGhlIGxvd2VzdC1sYXRlbmN5IHVwIHdyaXRlIHNoYXJkLCBtYXRlcmlhbGl6ZXMgdGhlXG4gICAgLy8ga2V5IHdpdGggYSByYW5kb20gdmFsdWUgaW5zaWRlIHRoYXQgc2hhcmQncyByb3V0ZSwgd3JpdGVzIGl0LCBhbmQgcmV0dXJucyB0aGUgRlVMTCBrZXlcbiAgICAvLyBhY3R1YWxseSB3cml0dGVuLiBVbmxpa2Ugbm9ybWFsIHdyaXRlcyB0aGlzIENBTiBtb3ZlIHRvIGFub3RoZXIgc2hhcmQgd2hlbiB0aGUgcHJlZmVycmVkIG9uZVxuICAgIC8vIGlzIGRvd24gKGVycm9yICsgc29ja2V0IGRvd24sIHNhbWUgcnVsZSBhcyByZWFkcykgLSBlYWNoIHNoYXJkIHJlY2VpdmVzIGEgZGlmZmVyZW50IGtleSwgc29cbiAgICAvLyB3cml0ZSBjb25zaXN0ZW5jeSBpcyBwcmVzZXJ2ZWQuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAvLyBQZXItc2hhcmQgd3JpdGUgY29uc2lzdGVuY3kgc3RpbGwgaG9sZHM6IHdpdGhpbiBhIHJvdXRlLCBvbmx5IHRoZSBGSVJTVCBzb3VyY2UgbWF5XG4gICAgICAgICAgICAvLyB0YWtlIHdyaXRlcyAtIGxhdGVuY3kgb25seSBwaWNrcyBXSElDSCBzaGFyZCB0aGUga2V5IG1hdGVyaWFsaXplcyBpbnRvXG4gICAgICAgICAgICBsZXQgdGFyZ2V0c0J5Um91dGUgPSBuZXcgTWFwPHN0cmluZywgU291cmNlV3JhcHBlcj4oKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWdBY2NlcHRzV3JpdGVzKHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVLZXkgPSBKU09OLnN0cmluZ2lmeShzb3VyY2UuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUpO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0c0J5Um91dGUuaGFzKHJvdXRlS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0YXJnZXQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgbGV0IGZ1bGxLZXkgPSBrZXkucmVwbGFjZShWQVJJQUJMRV9TSEFSRCwgVkFSSUFCTEVfU0hBUkQgKyBcIl9cIiArIChzdGFydCArIE1hdGgucmFuZG9tKCkgKiAoZW5kIC0gc3RhcnQpKSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmdWxsS2V5LCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGxLZXk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBJZiB3ZSBydW4gaW50byBjYXNlcyB3aGVuIHRyYW5zcG9ydCBsZXZlbCBlcnJvcnMgaGFwcGVuLCBidXQgd2UgYXJlIHN0aWxsIGNvbm5lY3RlZCwgdGhlbiB3ZSBtaWdodCB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIGNoZWNraW5nIGhlcmUsIGFkZGl0aW9uYWwgZXJyb3JzIGluIHdoaWNoIHdlIHdpbGwgcmV0cnkgdGhlIG90aGVyIHRhcmdldHMuIEhvd2V2ZXIsIGlkZWFsbHksIGNoZWNraW5nIGlmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBzdGlsbCBjb25uZWN0ZWQgd2lsbCBoYW5kbGUgYWxsIHRob3NlIGNhc2VzLiBEaXN0aW5ndWlzaGluZyBiZXR3ZWVuIGFwcGxpY2F0aW9uIGVycm9ycyAod2hpY2ggd2UgY2FuJ3QgcmV0cnkpIGFuZCB0cmFuc3BvcnQgZXJyb3JzLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFyaWFibGUtc2hhcmQgd3JpdGUgdGFyZ2V0ICR7dGFyZ2V0LmdldERlYnVnTmFtZSgpfSBpcyBkb3duOyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmRgKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXZlcnkgc2hhcmQgZmFpbGVkOiByZS1jb250YWN0IGV2ZXJ5dGhpbmcgYW5kIHRyeSBvbmNlIG1vcmUgYmVmb3JlIGdpdmluZyB1cFxuICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVyeSB2YXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiAke2Vycm9ycy5qb2luKFwiIHwgXCIpIHx8IFwibm8gc291cmNlcyBhY2NlcHQgd3JpdGVzXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aC5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGNvbmZpZy5wYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldExhcmdlRmlsZSBkb2VzIG5vdCBzdXBwb3J0IFZBUklBQkxFX1NIQVJEIGtleXMgKHRoZXJlIGlzIG5vIHdheSB0byByZXR1cm4gdGhlIG1hdGVyaWFsaXplZCBrZXkpOyB3cml0ZSB0aGUgZmlsZSB3aXRoIHNldCwgb3IgbWF0ZXJpYWxpemUgdGhlIGtleSB5b3Vyc2VsZi4gS2V5OiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5wYXRoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShjb25maWcucGF0aCk7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIC8vIFNhbWUgY29uc2lzdGVuY3kgcnVsZSBhcyBydW5Xcml0ZTogdGhlIGZpcnN0IGN1cnJlbnRseS12YWxpZCBzb3VyY2UgZm9yIHRoZSByb3V0ZSwgb3Igbm90aGluZ1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ0FjY2VwdHNXcml0ZXMoeC5jb25maWcpICYmIHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIHJvdXRlKSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgZm9yIHNldExhcmdlRmlsZSBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IChyb3V0ZSAke3JvdXRlfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRhdGEgc3RyZWFtIGNhbm5vdCBiZSByZXdvdW5kLCBzbyBhIG1pZC11cGxvYWQgZGlzY29ubmVjdCBjYW5ub3QgYmUgcmV0cmllZFxuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUocGF0aCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmNvbmZpZy5wdWJsaWMgPT09IGZhbHNlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS51cmwpIHJldHVybiBhd2FpdCBzb3VyY2UudXJsLmdldFVSTChwYXRoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuYXBpKSByZXR1cm4gYXdhaXQgc291cmNlLmFwaS5nZXRVUkwocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwdWJsaWMgc291cmNlIGNvdmVyaW5nIHJvdXRlICR7cm91dGV9IHRvIGJ1aWxkIGEgVVJMIGZyb20gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5pdFJldHJ5VGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluaXRSZXRyeVRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGVQcm9taXNlID0gdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgICAgIGlmIChzdGF0ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHZvaWQgc3RhdGVQcm9taXNlLnRoZW4oc3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVGhlIElBcmNoaXZlcyBmb3IgYSBSZW1vdGVDb25maWcgKG9yIGEgc2luZ2xlIHNvdXJjZSAtIGEgcm91dGluZyBVUkwgc3RyaW5nIHdvcmtzKS4gRnVsbHkgbGF6eTpcbi8vIG5vdGhpbmcgaXMgY29udGFjdGVkIHVudGlsIHRoZSBmaXJzdCBjYWxsLiBDYWxsIGRpc3Bvc2UoKSB3aGVuIGRvbmUgd2l0aCBpdCwgc28gaXRzIGJhY2tncm91bmRcbi8vIHJldHJ5L3BvbGwgbG9vcHMgc3RvcC5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcmNoaXZlcyhjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UpOiBBcmNoaXZlc0NoYWluIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQ2hhaW4oY29uZmlnKTtcbn1cblxuLyoqIEV2ZXJ5IGJ1Y2tldCBhbiBhY2NvdW50IGhhcyBvbiBvbmUgc3RvcmFnZSBzZXJ2ZXIgLSBhY3RpdmUgYW5kIGluYWN0aXZlIC0gd2l0aCBlYWNoIGJ1Y2tldCdzXG4gKiAgY29uZmlndXJhdGlvbi4gT25lIGF1dGhlbnRpY2F0ZWQgY2FsbCAodGhlIG5vcm1hbCB0cnVzdCBzeXN0ZW0gYXBwbGllcyk6IG5vIEFyY2hpdmVzQ2hhaW4sIG5vXG4gKiAgc3luY2hyb25pemF0aW9uLCBhbmQgaW5hY3RpdmUgYnVja2V0cyBvbiB0aGUgc2VydmVyIHN0YXkgaW5hY3RpdmUuIEFueSBVUkwgYWRkcmVzc2luZyB0aGVcbiAqICBzZXJ2ZXIgd29ya3MgKGEgYnVja2V0IHJvdXRpbmcgVVJMLCBvciBqdXN0IGh0dHBzOi8vaG9zdDpwb3J0KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmVyQnVja2V0cyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZVN0b3JhZ2VVcmwoY29uZmlnLnVybCk7XG4gICAgbGV0IG5vZGVJZCA9IFNvY2tldEZ1bmN0aW9uLmNvbm5lY3QoeyBhZGRyZXNzOiBwYXJzZWQuYWRkcmVzcywgcG9ydDogcGFyc2VkLnBvcnQgfSk7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1tub2RlSWRdO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250cm9sbGVyLmxpc3RCdWNrZXRzKGNvbmZpZy5hY2NvdW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCwgbm9kZUlkIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgY29udHJvbGxlci5saXN0QnVja2V0cyhjb25maWcuYWNjb3VudCk7XG4gICAgfVxufVxuXG4vKiogTGl2ZSBpbmZvIGZvciBvbmUgYnVja2V0IGdpdmVuIGl0cyByb3V0aW5nIFVSTCAoZ2V0Q29uZmlnOiByb3V0aW5nIGNvbmZpZywgaW5kZXggdG90YWxzLCBkaXNrXG4gKiAgbGltaXQsIGluLXByb2dyZXNzIHN5bmNocm9uaXphdGlvbikuIE9uZSBhdXRoZW50aWNhdGVkIGNhbGwgdG8gdGhhdCBzZXJ2ZXIgLSBhIGxpZ2h0LCBzYWZlXG4gKiAgYWx0ZXJuYXRpdmUgdG8gaW5zdGFudGlhdGluZyBhbiBBcmNoaXZlc0NoYWluLCB3aGljaCB3b3VsZCBzdGFydCBzeW5jaHJvbml6YXRpb24gbWFjaGluZXJ5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldEluZm8oY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50TmFtZT86IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgIGxldCByZW1vdGUgPSBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IGNvbmZpZy51cmwsIGFjY291bnROYW1lOiBjb25maWcuYWNjb3VudE5hbWUsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlIH0pO1xuICAgIHJldHVybiBhd2FpdCByZW1vdGUuZ2V0Q29uZmlnKCk7XG59XG4iXX0=
|
|
801
|
-
/* _JS_SOURCE_HASH = "
|
|
831
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQixtREFBd0Q7QUFDeEQsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixpREFJd0I7QUFDeEIsbUVBQWdFO0FBQ2hFLHFEQUF3RjtBQUN4Riw0Q0FBaUQ7QUFDakQsNkRBQTBHO0FBQzFHLDJEQUF5RjtBQUN6RixtREFBa0c7QUFFbEcsZ0dBQWdHO0FBQ2hHLG1HQUFtRztBQUNuRyxnR0FBZ0c7QUFDaEcsa0dBQWtHO0FBQ2xHLG1HQUFtRztBQUNuRyxtR0FBbUc7QUFDbkcsbUdBQW1HO0FBQ25HLG9GQUFvRjtBQUVwRixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzNDLG1HQUFtRztBQUNuRyxpRUFBaUU7QUFDakUsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwRCxrR0FBa0c7QUFDbEcsMkJBQTJCO0FBQzNCLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQywyRkFBMkY7QUFDM0Ysb0RBQW9EO0FBQ3BELE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUUvQyxrR0FBa0c7QUFDbEcsa0dBQWtHO0FBQ2xHLGlHQUFpRztBQUNqRyxpR0FBaUc7QUFDakcsU0FBZ0IsaUJBQWlCLENBQUMsTUFBc0M7SUFDcEUsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSw2QkFBaUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFBLGdDQUFpQixFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxV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TSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLE9BQU8sTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0FBQ0wsQ0FBQztBQVpELDhDQVlDO0FBRUQ7O2tHQUVrRztBQUMzRixLQUFLLFVBQVUsYUFBYSxDQUFDLE1BQTZDO0lBQzdFLElBQUksTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUhELHNDQUdDIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuaW1wb3J0IHsgaXNOb2RlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnLCBCYWNrYmxhemVDb25maWcsXG4gICAgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBXUklURV9QQVNUX1dJTkRPV19HUkFDRSwgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBnZXRDb25maWdWZXJzaW9uLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsXG4gICAgbm9ybWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UsIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyxcbiAgICBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VWYXJpYWJsZVJvdXRlLFxufSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgQXJjaGl2ZXNSZW1vdGUsIHBhcnNlU3RvcmFnZVVybCwgYXV0aGVudGljYXRlU3RvcmFnZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCwgZ2V0TG9jYWxBcmNoaXZlcywgU2VydmVyQnVja2V0SW5mbyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciwgUkVUUllfU1RBUlRfREVMQVksIFJFVFJZX01BWF9ERUxBWSwgUkVUUllfR1JPV1RIIH0gZnJvbSBcIi4vc291cmNlV3JhcHBlclwiO1xuXG4vLyBUdXJucyBhIFJlbW90ZUNvbmZpZyBpbnRvIGEgdXNhYmxlIElBcmNoaXZlcyAoY3JlYXRlQXJjaGl2ZXMpLiBJbml0aWFsaXphdGlvbiBpcyBsYXp5OiBvbiB0aGVcbi8vIGZpcnN0IGNhbGwgd2Ugd2FsayB0aGUgc291cmNlcyBJTiBPUkRFUiBhbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGFuc3dlcnMgaXMgYXV0aG9yaXRhdGl2ZSAoc291cmNlc1xuLy8gYXJlIHN5bmNocm9uaXplZCBjb3BpZXMgb2YgdGhlIHNhbWUgYnVja2V0LCBzbyB3ZSBuZXZlciBjb25zdWx0IHRoZSByZXN0KS4gSXRzIHN0b3JlZCByb3V0aW5nXG4vLyBjb25maWcgd2lucyBvdmVyIHRoZSBpbi1tZW1vcnkgb25lIC0gdW5sZXNzIG91cnMgaGFzIGEgc3RyaWN0bHkgbmV3ZXIgdmVyc2lvbiwgaW4gd2hpY2ggY2FzZSB3ZVxuLy8gd3JpdGUgb3VycyAoY3JlYXRpbmcgdGhlIGJ1Y2tldCB3aGVuIG5vIHJvdXRpbmcgZXhpc3RzIGF0IGFsbCkuIEEgZmFpbGVkIGluaXQgKGFsbCBzb3VyY2VzIGRvd24sXG4vLyBvciB0aGUgcm91dGluZyB3cml0ZSB3YXMgcmVqZWN0ZWQpIHN0YXlzIGZhaWxlZCBmb3IgY2FsbGVycyBidXQgcmV0cmllcyBpdHNlbGYgaW4gdGhlIGJhY2tncm91bmRcbi8vIHdpdGggYSByYW1waW5nIGRlbGF5LiBPbmNlIHJ1bm5pbmcsIHdlIHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGV2ZXJ5IENPTkZJR19QT0xMX0lOVEVSVkFMIGFuZFxuLy8gcmVidWlsZCB0aGUgc291cmNlIGxpc3Qgd2hlbiBpdCBjaGFuZ2VkIChyZXVzaW5nIHdyYXBwZXJzIGZvciB1bmNoYW5nZWQgc291cmNlcykuXG5cbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbi8vIFdyb25nLXZhbGlkLXdpbmRvdyByZWplY3Rpb25zIHdpdGhpbiB0aGlzIGRpc3RhbmNlIG9mIGEga25vd24gd2luZG93IGJvdW5kYXJ5IGFyZSBqdXN0IHVzIHJhY2luZ1xuLy8gdGhlIGJvdW5kYXJ5IGl0c2VsZiAtIHdhaXRpbmcgZml4ZXMgdGhlbSwgbm8gbmV3IGNvbmZpZyBuZWVkZWRcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9XSU5ET1cgPSAzMCAqIDEwMDA7XG5jb25zdCBXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkgPSAxNSAqIDEwMDA7XG4vLyBPdGhlcndpc2Ugb3VyIGNvbmZpZyBpcyBzdGFsZTsgcmUtZmV0Y2ggaXQgZnJvbSB0aGUgc2VydmVyLCBhdCBtb3N0IHRoaXMgb2Z0ZW4gKHdoZW4gdGhyb3R0bGVkLFxuLy8gcmV0cnkgd2l0aCB3aGF0IHdlIGhhdmUpXG5jb25zdCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSA9IDMwICogMTAwMDtcbi8vIFdoZW4gZXZlcnkgc291cmNlIGxvb2tzIGRvd24sIGFsbCBvZiB0aGVtIGFyZSByZS1jb250YWN0ZWQgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb25cbi8vIHJlLWF0dGVtcHQpIGJlZm9yZSBnaXZpbmcgdXAgLSBhdCBtb3N0IHRoaXMgb2Z0ZW5cbmNvbnN0IEFWQUlMQUJJTElUWV9SRUNIRUNLX1RIUk9UVExFID0gNSAqIDEwMDA7XG5cbi8vIFRoZSBkaXJlY3QgQVBJIElBcmNoaXZlcyBmb3Igb25lIHNvdXJjZSwgd2l0aCBubyBVUkwtZm9ybSBmYWxsYmFjayBhbmQgbm8gY2hhaW5pbmcuIFVzZWQgYnkgdGhlXG4vLyBzdG9yYWdlIHNlcnZlciBmb3IgaXRzIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzLiBEZW5pZWQgY2FsbHMgdGhyb3cgaW1tZWRpYXRlbHkgKHJlZ2lzdGVyaW5nIHRoZVxuLy8gYWNjZXNzIHJlcXVlc3QgaW4gdGhlIGJhY2tncm91bmQpOiB0aGUgc3luYyBsb29wcyByZXRyeS1hbmQtbG9nIHVudGlsIGFjY2VzcyBpcyBncmFudGVkLCB3aGlsZVxuLy8gZXhwbGljaXQgd3JpdGVzIHN1cmZhY2UgdGhlIGRlbmlhbCAod2l0aCBncmFudCBpbnN0cnVjdGlvbnMpIHRvIHRoZSBjYWxsZXIgaW5zdGVhZCBvZiBoYW5naW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZTogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnKTogSUFyY2hpdmVzIHtcbiAgICBpZiAoc291cmNlLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZS51cmwpLmJ1Y2tldE5hbWUsIHB1YmxpYzogc291cmNlLnB1YmxpYywgaW1tdXRhYmxlOiBzb3VyY2UuaW1tdXRhYmxlIH0pO1xuICAgIH1cbiAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgbGV0IHNlcnZlciA9IGlzTm9kZSgpICYmIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VydmVyICYmIHBhcnNlZC5hZGRyZXNzID09PSBzZXJ2ZXIuZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBzZXJ2ZXIucG9ydCkge1xuICAgICAgICAvLyBUaGlzIHNvdXJjZSBpcyBhIGJ1Y2tldCBob3N0ZWQgYnkgb3VyIG93biBwcm9jZXNzIC0gdXNlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZ1xuICAgICAgICAvLyBvdXJzZWx2ZXMgb3ZlciBIVFRQU1xuICAgICAgICByZXR1cm4gZ2V0TG9jYWxBcmNoaXZlcyhwYXJzZWQuYWNjb3VudCwgcGFyc2VkLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBzb3VyY2UudXJsLCBhY2NvdW50TmFtZTogc291cmNlLmFjY291bnROYW1lLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSB9KTtcbn1cblxudHlwZSBDaGFpblN0YXRlID0ge1xuICAgIGNvbmZpZzogUmVtb3RlQ29uZmlnO1xuICAgIHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXTtcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcpOiBib29sZWFuIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gY29uZmlnLnZhbGlkV2luZG93O1xuICAgIHJldHVybiBzdGFydCAtIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFIDw9IG5vdyAmJiBub3cgPD0gZW5kICsgV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0U7XG59XG5cbi8vIENsaWVudCB3cml0ZXMgdGFyZ2V0IG9ubHkgdGhlIENVUlJFTlRMWSB2YWxpZCBzb3VyY2U6IGEgZnV0dXJlLXdpbmRvdyBzb3VyY2UgcmVjZWl2ZXMgaXRzIGRhdGFcbi8vIHRocm91Z2ggc2VydmVyLXNpZGUgZG93bnN0cmVhbSBwcm9wYWdhdGlvbi9iYWNrZmlsbCwgbmV2ZXIgZGlyZWN0bHkgZnJvbSBjbGllbnRzXG5mdW5jdGlvbiBjb25maWdBY2NlcHRzV3JpdGVzKGNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQ2hhaW4gaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIHByaXZhdGUgY29uZmlndXJlZDogUmVtb3RlQ29uZmlnO1xuICAgIC8vIFRoZSBjb25maWcgd2UgYWN0dWFsbHkgcnVuIG9uICh0aGUgYXV0aG9yaXRhdGl2ZSBzdG9yZWQgb25lIGFmdGVyIGluaXQpXG4gICAgcHJpdmF0ZSBhY3RpdmVDb25maWc6IFJlbW90ZUNvbmZpZztcbiAgICBwcml2YXRlIHN0YXRlUHJvbWlzZTogUHJvbWlzZTxDaGFpblN0YXRlPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGluaXRSZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgcHJpdmF0ZSBpbml0UmV0cnlUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVkID0gbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gdGhpcy5jb25maWd1cmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIGxldCB1cmxzID0gdGhpcy5hY3RpdmVDb25maWcuc291cmNlcy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICh4IGFzIEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZykudXJsKTtcbiAgICAgICAgcmV0dXJuIGBjaGFpbi8ke3VybHMuam9pbihcIixcIil9YDtcbiAgICB9XG5cbiAgICAvLyBMYXp5IGluaXQgdGhhdCByZXRocm93cyBpdHMgZXJyb3IgdG8gZXZlcnkgY2FsbGVyLCB3aGlsZSBhIGJhY2tncm91bmQgdGltZXIgcmVzZXRzIGFuZFxuICAgIC8vIHJldHJpZXMgaXQgd2l0aCBhIHJhbXBpbmcgZGVsYXkgLSBzbyBhIGNoYWluIHRoYXQgY291bGRuJ3QgaW5pdGlhbGl6ZSBmaXhlcyBpdHNlbGYgb25jZSBhXG4gICAgLy8gc291cmNlIGNvbWVzIGJhY2ssIHdpdGhvdXQgYW55IGNhbGxlciBoYXZpbmcgdG8gZHJpdmUgaXQuXG4gICAgcHJpdmF0ZSBnZXRTdGF0ZSgpOiBQcm9taXNlPENoYWluU3RhdGU+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEFyY2hpdmVzQ2hhaW4gJHt0aGlzLmdldERlYnVnTmFtZSgpfSBoYXMgYmVlbiBkaXNwb3NlZGApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3RhdGVQcm9taXNlKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgICAgICAgICB9LCAoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCB0aGlzLmluaXRSZXRyeVRpbWVyKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU3RvcmFnZSBpbml0IGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHRoaXMuaW5pdFJldHJ5RGVsYXkgLyAxMDAwKX1zLiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlUHJvbWlzZSA9PT0gcHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTdGF0ZSgpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5pbml0UmV0cnlEZWxheSk7XG4gICAgICAgICAgICAgICAgKHRoaXMuaW5pdFJldHJ5VGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5RGVsYXkgPSBNYXRoLm1pbihSRVRSWV9NQVhfREVMQVksIHRoaXMuaW5pdFJldHJ5RGVsYXkgKiBSRVRSWV9HUk9XVEgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPENoYWluU3RhdGU+IHtcbiAgICAgICAgbGV0IGNvbmZpZ3MgPSB0aGlzLmNvbmZpZ3VyZWQuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKTtcbiAgICAgICAgLy8gRVZFUlkgc291cmNlIGlzIGNvbnRhY3RlZCBmb3IgaXRzIHBpY3R1cmUgb2YgdGhlIHJvdXRpbmcgY29uZmlnIChwZXIgdGhlIHNwZWM6IHRoZSBjb25maWdcbiAgICAgICAgLy8gaXMgZHVwbGljYXRlZCBpbnRvIGFsbCBvZiB0aGVtKSAtIHdoaWNoIGFsc28gZXN0YWJsaXNoZXMgb3VyIGNvbm5lY3Rpb24gdG8gZXZlcnkgbm9kZSB1cFxuICAgICAgICAvLyBmcm9udC4gQ29udGFjdCBpcyBwYXJhbGxlbDsgQURPUFRJT04gaXMgZGV0ZXJtaW5pc3RpYyBieSBjb25maWcgb3JkZXIgYW1vbmcgdGhlIHNvdXJjZXNcbiAgICAgICAgLy8gdGhhdCBhbnN3ZXJlZCAodGhlIGZpcnN0IHVwIHNvdXJjZSBpcyBhdXRob3JpdGF0aXZlKS5cbiAgICAgICAgbGV0IGZldGNoZXMgPSBhd2FpdCBQcm9taXNlLmFsbChjb25maWdzLm1hcChhc3luYyBzb3VyY2VDb25maWcgPT4ge1xuICAgICAgICAgICAgbGV0IHByb2JlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IGJhY2tncm91bmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBwcm9iZS5yZWFkKGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldChST1VUSU5HX0ZJTEUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9iZSwgc291cmNlQ29uZmlnLCByZXNwb25kZWQ6IHRydWUsIGxhdGVuY3k6IERhdGUubm93KCkgLSBzdGFydCwgZXhpc3Rpbmc6IGRhdGEgJiYgcGFyc2VSb3V0aW5nRGF0YShkYXRhKSB8fCB1bmRlZmluZWQsIGVycm9yOiBcIlwiIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvYmUsIHNvdXJjZUNvbmZpZywgcmVzcG9uZGVkOiBmYWxzZSwgbGF0ZW5jeTogMCwgZXhpc3Rpbmc6IHVuZGVmaW5lZCwgZXJyb3I6IGAke3NvdXJjZUNvbmZpZy51cmx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmV0Y2hlcy5maW5kKHggPT4geC5yZXNwb25kZWQpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluaXRpYWxpemUgc3RvcmFnZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogbm8gc291cmNlIGFuc3dlcmVkLiAke2ZldGNoZXMubWFwKHggPT4geC5lcnJvcikuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGZvdW5kLmV4aXN0aW5nO1xuICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IHRoaXMuY29uZmlndXJlZDtcbiAgICAgICAgICAgIGxldCBuZWVkc1dyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBnZXRDb25maWdWZXJzaW9uKGV4aXN0aW5nKSA+PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0Q29uZmlnVmVyc2lvbihleGlzdGluZykgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShleGlzdGluZykgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXJjaGl2ZXMgY29uZmlndXJhdGlvbiB1cGRhdGVkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24sIGZvciAke2ZvdW5kLnNvdXJjZUNvbmZpZy51cmx9LiBVcGRhdGVzIHdpbGwgYmUgaWdub3JlZCB1bnRpbCB5b3UgaW5jcmVhc2UgdGhlIHZlcnNpb24uIFVzaW5nOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nKX0sIGlnbm9yaW5nOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGV4aXN0aW5nO1xuICAgICAgICAgICAgICAgIG5lZWRzV3JpdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZGVjaWRlZCB0byB3cml0ZSAob3VycyBpcyBuZXdlciB0aGFuIHRoZSBhdXRob3JpdGF0aXZlIGZpcnN0LXVwIHNvdXJjZSdzLCBvclxuICAgICAgICAgICAgICAgIC8vIG5vIHJvdXRpbmcgZXhpc3RzIHlldCkuIFRoZSB3cml0ZSBnb2VzIHRvIGFsbCBzb3VyY2VzLCBzbyBpdCBpcyByZWZ1c2VkIHVubGVzc1xuICAgICAgICAgICAgICAgIC8vIG91ciB2ZXJzaW9uIGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBFVkVSWSBzb3VyY2UncyBzdG9yZWQgdmVyc2lvbiAoYWxsIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBmZXRjaGVkIGFib3ZlKSAtIGEgc291cmNlIGF0IChvciBwYXN0KSBvdXIgdmVyc2lvbiBtZWFucyB0aGlzIHZlcnNpb24gbnVtYmVyIGlzXG4gICAgICAgICAgICAgICAgLy8gdGFrZW4sIGFuZCB3cml0aW5nIGFueXdheSB3b3VsZCBsZWF2ZSBzb3VyY2VzIGF0IHRoZSBzYW1lIHZlcnNpb24gd2l0aCBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50LCBlYWNoIHJlamVjdGluZyB0aGUgb3RoZXIncyBwdXNoZXMgZm9yZXZlci4gRG93biBzb3VyY2VzIGFyZSBzdGlsbFxuICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSB0aGUgc2VydmVyLXNpZGUgdmVyc2lvbiBndWFyZCB3aGVuIHRoZSB3cml0ZSBldmVudHVhbGx5IHJlYWNoZXMgdGhlbS5cbiAgICAgICAgICAgICAgICBsZXQgYmVzdDogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBjb25mbGljdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZldGNoIG9mIGZldGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0b3JlZCA9IGZldGNoLmV4aXN0aW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3JlZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmVzdCB8fCBnZXRDb25maWdWZXJzaW9uKHN0b3JlZCkgPiBnZXRDb25maWdWZXJzaW9uKGJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gc3RvcmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDb25maWdWZXJzaW9uKHN0b3JlZCkgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShzdG9yZWQpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdFVybCA9IGZldGNoLnNvdXJjZUNvbmZpZy51cmw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlc3QgJiYgZ2V0Q29uZmlnVmVyc2lvbihiZXN0KSA+PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0VXJsICYmIGdldENvbmZpZ1ZlcnNpb24oYmVzdCkgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXJjaGl2ZXMgY29uZmlndXJhdGlvbiB1cGRhdGVkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24sIGZvciAke2NvbmZsaWN0VXJsfS4gVXBkYXRlcyB3aWxsIGJlIGlnbm9yZWQgdW50aWwgeW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uLiBVc2luZzogJHtKU09OLnN0cmluZ2lmeShiZXN0KX0sIGlnbm9yaW5nOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCl9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gYmVzdDtcbiAgICAgICAgICAgICAgICAgICAgbmVlZHNXcml0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHVwZGF0ZSBvbmx5IGhhcHBlbnMgd2hlbiBFVkVSWSBzb3VyY2Ugd291bGQgYWNjZXB0IGl0IC0gYSBwYXJ0aWFsIHVwZGF0ZVxuICAgICAgICAgICAgICAgIC8vIHdvdWxkIGxlYXZlIHRoZSBzb3VyY2VzIG91dCBvZiBzeW5jLCBhbmQgYSBjbGllbnQgd2l0aG91dCBhY2Nlc3MgcmV0cnlpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gd3JpdGUgZm9yZXZlciB3b3VsZCBuZXZlciBpbml0aWFsaXplLiBXaXRob3V0IGZ1bGwgYWNjZXNzIHdlIHJ1biBvbiB0aGUgc3RvcmVkXG4gICAgICAgICAgICAgICAgLy8gY29uZmlnICh3aGVuIHRoZXJlIGlzIG9uZSkgYW5kIGxvZyB0aGUgcHJvYmxlbSBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgIGxldCBtaXNzaW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfSAoY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm90IHdyaXRpbmcgdGhlIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCl9KTogbm8gd3JpdGUgYWNjZXNzIHRvICR7bWlzc2luZy5qb2luKFwiLCBcIil9LiAke2V4aXN0aW5nICYmIGBSdW5uaW5nIG9uIHRoZSBzdG9yZWQgY29uZmlnICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihleGlzdGluZyl9KSBpbnN0ZWFkLmAgfHwgYE5vIHN0b3JlZCBjb25maWcgZXhpc3RzLCBzbyB0aGUgYnVja2V0IGNhbm5vdCBiZSBjcmVhdGVkIHVudGlsIHdyaXRlIGFjY2VzcyBpcyBncmFudGVkLmB9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gZXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJlamVjdGVkIHdyaXRlIGZhaWxzIGluaXQsIHdoaWNoIHJldHJpZXMgZnJvbSBzY3JhdGNoIC0gcmUtcmVhZGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdXRpbmcsIHNvIGxvc2luZyBhIGNyZWF0ZSByYWNlIHRvIGFub3RoZXIgY2xpZW50IGp1c3QgYWRvcHRzIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcgb24gdGhlIG5leHQgYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvdW5kLnByb2JlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyh0aGlzLmNvbmZpZ3VyZWQpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgc2VydmVyIG1heSBiZSBNSUQgZGVwbG95LXRha2VvdmVyOiBpdHMgZ2V0Q29uZmlnIHJldHVybnMgdGhlIGluLW1lbW9yeVxuICAgICAgICAgICAgLy8gaW50ZXJwcmV0YXRpb24gKHdpbmRvdyBzcGxpdHMgcG9pbnRpbmcgYXQgYSBzdWNjZXNzb3IncyBwb3J0KSwgd2hpY2ggaXMgbmV2ZXIgaW4gdGhlXG4gICAgICAgICAgICAvLyByb3V0aW5nIGZpbGUuIEEgY2xpZW50IGNvbm5lY3RpbmcgZHVyaW5nIHRoZSB0YWtlb3ZlciBtdXN0IHN0YXJ0IG9uIHRoYXRcbiAgICAgICAgICAgIC8vIGludGVycHJldGF0aW9uLCBub3QgZGlzY292ZXIgaXQgbWludXRlcyBsYXRlci5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb2JlQXBpID0gZm91bmQucHJvYmUuYXBpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9iZUFwaSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VydmVkQ29uZmlnID0gKGF3YWl0IHByb2JlQXBpLmdldENvbmZpZygpKS5yZW1vdGVDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZWRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZWQgPSBub3JtYWxpemVSZW1vdGVDb25maWcoc2VydmVkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXJ2ZWQpICE9PSBKU09OLnN0cmluZ2lmeShhY3RpdmUpICYmIGdldENvbmZpZ1ZlcnNpb24oc2VydmVkKSA+PSBnZXRDb25maWdWZXJzaW9uKGFjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQWRvcHRpbmcgdGhlIHNlcnZlcidzIGluLW1lbW9yeSByb3V0aW5nIGludGVycHJldGF0aW9uIGF0IGluaXQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKGRlcGxveSB0YWtlb3ZlciBpbiBwcm9ncmVzcylgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBzZXJ2ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IGF3YWl0IHRoaXMuYnVpbGRTb3VyY2VzKGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcmF3IHJvdXRpbmcgY29uZmlnIHdlIGFscmVhZHkgYWRvcHRlZCBzdGlsbCB3b3Jrc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmV0Y2hlcyBkb3VibGUgYXMgb3VyIGZpcnN0IGxhdGVuY3kgbWVhc3VyZW1lbnRzOiB2YXJpYWJsZS1zaGFyZCBwaWNraW5nXG4gICAgICAgICAgICAvLyB3b3JrcyBpbW1lZGlhdGVseSwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgZmlyc3QgcGluZyBwYXNzIHRvIGxhbmRcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZldGNoID0gZmV0Y2hlcy5maW5kKHggPT4geC5yZXNwb25kZWQgJiYgeC5zb3VyY2VDb25maWcudXJsID09PSBzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgaWYgKGZldGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZWVkTGF0ZW5jeShmZXRjaC5sYXRlbmN5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZyA9IGFjdGl2ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDb25maWdQb2xsKCk7XG4gICAgICAgICAgICByZXR1cm4geyBjb25maWc6IGFjdGl2ZSwgc291cmNlcyB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZm9yIChsZXQgZmV0Y2ggb2YgZmV0Y2hlcykge1xuICAgICAgICAgICAgICAgIGZldGNoLnByb2JlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQ2hhaW5Tb3VyY2Uoc291cmNlQ29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcpOiBQcm9taXNlPFNvdXJjZVdyYXBwZXI+IHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IGF3YWl0IFNvdXJjZVdyYXBwZXIuY3JlYXRlKHNvdXJjZUNvbmZpZyk7XG4gICAgICAgIC8vIEEgdGFrZW92ZXIgc3RhbXAgY2hhbmdlIGluIGEgcGluZyBtZWFucyB0aGUgc2VydmVyJ3Mgcm91dGluZyBpbnRlcnByZXRhdGlvbiBjaGFuZ2VkXG4gICAgICAgIC8vIChkZXBsb3kgdGFrZW92ZXIgc3RhcnRlZC9lbmRlZCk7IHJlZnJlc2ggc28gd2UgbGVhcm4gd2l0aGluIG9uZSBwaW5nIGludGVydmFsXG4gICAgICAgIHNvdXJjZS5vblNlcnZlZENvbmZpZ0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gYWR2ZXJ0aXNlZCBhIHJvdXRpbmcgY2hhbmdlIChkZXBsb3kgdGFrZW92ZXIpOyByZWZyZXNoaW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJlZnJlc2hBY3RpdmVDb25maWcoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYENvbmZpZyByZWZyZXNoIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBMYXRlbmN5IChmb3IgdmFyaWFibGUtc2hhcmQgdGFyZ2V0IHByZWZlcmVuY2UpIGlzIHRyYWNrZWQgZnJvbSBpbml0aWFsaXphdGlvbiBvblxuICAgICAgICBzb3VyY2Uuc3RhcnRQaW5naW5nKCk7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcpOiBQcm9taXNlPFNvdXJjZVdyYXBwZXJbXT4ge1xuICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZUNvbmZpZyBvZiBjb25maWcuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKGF3YWl0IHRoaXMuY3JlYXRlQ2hhaW5Tb3VyY2Uoc291cmNlQ29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydENvbmZpZ1BvbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lciB8fCB0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJlZnJlc2hBY3RpdmVDb25maWcoKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyBmb3IgYSBuZXcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIENPTkZJR19QT0xMX0lOVEVSVkFMKTtcbiAgICAgICAgKHRoaXMucG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZXMgY29uY3VycmVudCByZWZyZXNoZXMgKHRoZSBwb2xsIHRpbWVyIGFuZCB3cm9uZy10YXJnZXQgd3JpdGUgcmV0cmllcyBzaGFyZSB0aGlzKVxuICAgIHByaXZhdGUgY29uZmlnUmVmcmVzaEluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVmcmVzaEFjdGl2ZUNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQgPSB0aGlzLmNoZWNrRm9yTmV3Q29uZmlnKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhdGVzdCBjb25maWcsIGFzIHRoZSBzZXJ2ZXIgSU5URVJQUkVUUyBpdDogZ2V0Q29uZmlnIGNhcnJpZXMgaW4tbWVtb3J5IG92ZXJsYXlzIChkZXBsb3lcbiAgICAvLyB0YWtlb3ZlciByZW1hcHMpIHRoYXQgYXJlIGRlbGliZXJhdGVseSBuZXZlciB3cml0dGVuIGludG8gdGhlIHJvdXRpbmcgZmlsZSwgc28gaXQnc1xuICAgIC8vIHByZWZlcnJlZCBvdmVyIHJlYWRpbmcgdGhlIHJhdyBmaWxlLiBVUkwtb25seSBjaGFpbnMgZmFsbCBiYWNrIHRvIHRoZSByYXcgZmlsZS5cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoTGF0ZXN0Q29uZmlnKHN0YXRlOiBDaGFpblN0YXRlKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgeyBhcGlPbmx5OiB0cnVlIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENvbmZpZygpKTtcbiAgICAgICAgICAgIGlmIChjb25maWcucmVtb3RlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhjb25maWcucmVtb3RlQ29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwge30sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldChST1VUSU5HX0ZJTEUpKTtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNoZWNrRm9yTmV3Q29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJbml0IGlzIGZhaWxpbmc7IGl0cyBvd24gcmV0cnkgbG9vcCBoYW5kbGVzIHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGF0ZXN0ID0gYXdhaXQgdGhpcy5mZXRjaExhdGVzdENvbmZpZyhzdGF0ZSk7XG4gICAgICAgIGlmICghbGF0ZXN0KSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuYWRvcHROZXdDb25maWcoc3RhdGUsIGxhdGVzdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhZG9wdE5ld0NvbmZpZyhzdGF0ZTogQ2hhaW5TdGF0ZSwgbGF0ZXN0OiBSZW1vdGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGxhdGVzdCkgPT09IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbmZpZykpIHJldHVybjtcbiAgICAgICAgLy8gU2FtZSB2ZXJzaW9uIGJ1dCBkaWZmZXJlbnQgY29udGVudCBpcyBhIGRlcGxveSBzd2l0Y2hvdmVyIHJlbWFwIChhbiBpbi1tZW1vcnkgd2luZG93XG4gICAgICAgIC8vIHNwbGl0IHBvaW50aW5nIGF0IGEgc3VjY2Vzc29yJ3MgcG9ydCksIG5vdCBhbiBhY3R1YWwgY29uZmlndXJhdGlvbiBjaGFuZ2VcbiAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24obGF0ZXN0KSA9PT0gZ2V0Q29uZmlnVmVyc2lvbihzdGF0ZS5jb25maWcpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIHJlaW50ZXJwcmV0ZWQgYXQgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24obGF0ZXN0KX0gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKGRlcGxveSBzd2l0Y2hvdmVyIGluIHByb2dyZXNzKSwgcmVidWlsZGluZyBzb3VyY2VzLiBTb3VyY2VzOiAke0pTT04uc3RyaW5naWZ5KGxhdGVzdC5zb3VyY2VzKX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yYWdlIHJvdXRpbmcgY29uZmlnIGNoYW5nZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHN0YXRlLmNvbmZpZyl9IC0+ICR7Z2V0Q29uZmlnVmVyc2lvbihsYXRlc3QpfSksIHJlYnVpbGRpbmcgc291cmNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvbGRCeUNvbmZpZyA9IG5ldyBNYXAoc3RhdGUuc291cmNlcy5tYXAoc291cmNlID0+IFtKU09OLnN0cmluZ2lmeShzb3VyY2UuY29uZmlnKSwgc291cmNlXSkpO1xuICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZUNvbmZpZyBvZiBsYXRlc3Quc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSkge1xuICAgICAgICAgICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZyk7XG4gICAgICAgICAgICBsZXQgb2xkID0gb2xkQnlDb25maWcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAob2xkKSB7XG4gICAgICAgICAgICAgICAgb2xkQnlDb25maWcuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKG9sZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluLWZsaWdodCByZXF1ZXN0cyBzdGlsbCBob2xkIHRoZSBvbGQgd3JhcHBlcnMgYW5kIGZpbmlzaCBmaW5lOyBkaXNwb3NlIGp1c3Qgc3RvcHMgYW55XG4gICAgICAgIC8vIGJhY2tncm91bmQgcmVjb25uZWN0L3BpbmcgbG9vcHNcbiAgICAgICAgZm9yIChsZXQgbGVmdG92ZXIgb2Ygb2xkQnlDb25maWcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGxlZnRvdmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZyA9IGxhdGVzdDtcbiAgICAgICAgdGhpcy5zdGF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoeyBjb25maWc6IGxhdGVzdCwgc291cmNlcyB9KTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGV2ZXJ5IHNvdXJjZSBsb29rcyBkb3duLCB0aGUgcm91dGluZyBjb25maWcgaXMgcmUtcmVhZCBmcm9tIEVWRVJZIHNvdXJjZSAtIHdoaWNoIGJvdGhcbiAgICAvLyByZS1hdHRlbXB0cyB0aGVpciBjb25uZWN0aW9ucyAob3VyIGxpdmVuZXNzIHJlLWNoZWNrKSBhbmQgZGlzY292ZXJzIGEgcm91dGluZyB1cGRhdGUgd2UgbWF5XG4gICAgLy8gaGF2ZSBtaXNzZWQgKGFkb3B0aW5nIGl0IHJlLWluaXRpYWxpemVzIHRoZSBzb3VyY2UgbGlzdCkuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmUgcGFzcy5cbiAgICBwcml2YXRlIGxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrID0gMDtcbiAgICBwcml2YXRlIGF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHJlY2hlY2tBdmFpbGFiaWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodCkgcmV0dXJuIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0O1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdEF2YWlsYWJpbGl0eVJlY2hlY2sgPCBBVkFJTEFCSUxJVFlfUkVDSEVDS19USFJPVFRMRSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLmxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQgPSB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHlOb3coKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0O1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHJlY2hlY2tBdmFpbGFiaWxpdHlOb3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkIHx8ICF0aGlzLnN0YXRlUHJvbWlzZSkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhdGU6IENoYWluU3RhdGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGVQcm9taXNlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEluaXQgaXMgZmFpbGluZzsgaXRzIG93biByZXRyeSBsb29wIGhhbmRsZXMgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBFdmVyeSBzdG9yYWdlIHNvdXJjZSBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX07IHJlLWNvbnRhY3RpbmcgYWxsICR7c3RhdGUuc291cmNlcy5sZW5ndGh9IHNvdXJjZXMgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb24gcmUtYXR0ZW1wdClgKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChzdGF0ZS5zb3VyY2VzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHNvdXJjZS5yZWFkKGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldChST1VUSU5HX0ZJTEUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YSAmJiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IGxhdGVzdCA9IHJlc3VsdHMuZmluZCh4ID0+IHgpO1xuICAgICAgICBpZiAoIWxhdGVzdCkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmFkb3B0TmV3Q29uZmlnKHN0YXRlLCBsYXRlc3QpO1xuICAgIH1cblxuICAgIC8vIFJ1bnMgYSByZXF1ZXN0IGFnYWluc3QgdGhlIGZpcnN0IGF2YWlsYWJsZSBzb3VyY2UgKHRoYXQgY292ZXJzIHRoZSBrZXkncyByb3V0ZSwgd2hlbiBvbmUgaXNcbiAgICAvLyBnaXZlbiksIG1vdmluZyB0byB0aGUgbmV4dCBvbmUgT05MWSB3aGVuIHRoZSBzb3VyY2UncyBXZWJTb2NrZXQgaXMgZG93biAoY2hlY2tlZCBkaXJlY3RseSAtXG4gICAgLy8gbmV2ZXIgYnkgaW5zcGVjdGluZyB0aGUgZXJyb3IsIHdoaWNoIGlzIGFyYml0cmFyeSBkYXRhKS4gQW4gZXJyb3IgZnJvbSBhIGNvbm5lY3RlZCBzb3VyY2UgaXNcbiAgICAvLyBhbiBhcHBsaWNhdGlvbiBlcnJvciBhbmQgdGhyb3dzIGFzLWlzLiBBIGRvd24gc291cmNlIGdldHMgaXRzIGJhY2tncm91bmQgcmVjb25uZWN0IGtpY2tlZC5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bjxUPihzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGFwaU9ubHk/OiBib29sZWFuOyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyIH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy53cml0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuV3JpdGUoY29uZmlnLnJvdXRlLCBydW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiAhcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXBpT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFwaSA9IHNvdXJjZS5hcGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfSBoYXMgVVJMLW9ubHkgYWNjZXNzLCB3aGljaCBjYW5ub3Qgc2VydmUgdGhpcyBvcGVyYXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4oYXBpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgc291cmNlLnJlYWQocnVuKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaXNDb25uZWN0ZWQoKSkgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEV2ZXJ5IHNvdXJjZSBmYWlsZWQ6IHJlLWNvbnRhY3QgZXZlcnl0aGluZyAocm91dGluZyByZS1yZWFkICsgY29ubmVjdGlvbiByZS1hdHRlbXB0LFxuICAgICAgICAgICAgLy8gcG9zc2libHkgYWRvcHRpbmcgYSByb3V0aW5nIHVwZGF0ZSkgYW5kIHRyeSBvbmNlIG1vcmUgYmVmb3JlIGdpdmluZyB1cFxuICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGwgc291cmNlcyBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9OiAke2Vycm9ycy5qb2luKFwiIHwgXCIpIHx8IFwibm8gc291cmNlcyBhdmFpbGFibGVcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyaXRlcyBhcmUgY29uc2lzdGVudDogdGhleSBnbyB0byB0aGUgZmlyc3QgY3VycmVudGx5LXZhbGlkIHNvdXJjZSBjb3ZlcmluZyB0aGUga2V5J3Mgcm91dGVcbiAgICAvLyBhbmQgTkVWRVIgZmFpbCBvdmVyIHRvIGFub3RoZXIgbm9kZSAtIGEgY2xpZW50IHdyb25nbHkgZGVjaWRpbmcgbm9kZXMgYXJlIGRvd24gbXVzdCBub3RcbiAgICAvLyBzY2F0dGVyIGl0cyB3cml0ZXMgYWNyb3NzIHRoZSBjaGFpbi4gKFJlYWRzIGZhaWwgb3ZlciBmcmVlbHkgYWJvdmU6IHNvdXJjZXMgYXJlIHN5bmNocm9uaXplZFxuICAgIC8vIGNvcGllcywgc28gcmVhZGluZyBmcm9tIGFueSBvZiB0aGVtIGlzIHNhZmUuKSBUaGUgb25lIHJldHJ5IGlzIGZvciBhIHdpbmRvdyBib3VuZGFyeSBwYXNzaW5nXG4gICAgLy8gKG9yIGEgcm91dGUgZGlzYWdyZWVtZW50KSBtaWQtd3JpdGUsIHdoaWNoIHJlLXJlc29sdmVzIHRoZSB0YXJnZXQgcmF0aGVyIHRoYW4gZmFsbGluZyBiYWNrLlxuICAgIHByaXZhdGUgYXN5bmMgcnVuV3JpdGU8VD4ocm91dGU6IG51bWJlciB8IHVuZGVmaW5lZCwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nV2luZG93ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdSb3V0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4gY29uZmlnQWNjZXB0c1dyaXRlcyh4LmNvbmZpZykgJiYgKHJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgcm91dGUpKSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIC8vIEJlZm9yZSBnaXZpbmcgdXAsIHJlLWNvbnRhY3QgZXZlcnkgc291cmNlIG9uY2UgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAvLyByZS1hdHRlbXB0LCBwb3NzaWJseSBhZG9wdGluZyBhIHJvdXRpbmcgdXBkYXRlIHRoYXQgZml4ZXMgdGhlIHRhcmdldClcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtyb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7cm91dGV9KWAgfHwgXCJcIn0gKGV2ZXJ5IHNvdXJjZSBpcyBvdXRzaWRlIGl0cyB2YWxpZCB3aW5kb3cgb3Igb3V0c2lkZSB0aGUga2V5J3Mgcm91dGUpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0YXJnZXQud3JpdGUocnVuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpICYmICFyZXRyaWVkV3JvbmdXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJ3aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSAmJiAhcmV0cmllZFdyb25nUm91dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nUm91dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcInJvdXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24gZGllZCBkdXJpbmcgKG9yIGJlZm9yZSkgdGhlIHJlcXVlc3QuIE9uZSBmdWxsIHJlLWNvbnRhY3QgcGFzcyxcbiAgICAgICAgICAgICAgICAvLyB0aGVuIG9uZSByZXRyeSAtIHN0aWxsIHRoZSBzYW1lIGNvbnNpc3RlbnQgdGFyZ2V0LCBuZXZlciBhIGRpZmZlcmVudCBub2RlLlxuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsYXN0Q29uZmlnUmVmcmVzaCA9IDA7XG4gICAgLy8gQSB3cm9uZy10YXJnZXQgcmVqZWN0aW9uIG1lYW5zIGVpdGhlciB3ZSByYWNlZCBhIHdpbmRvdyBib3VuZGFyeSAodGltZSBmaXhlcyBpdCkgb3Igb3VyXG4gICAgLy8gY29uZmlnIGlzIHN0YWxlIC0gZS5nLiBhIGRlcGxveS10YWtlb3ZlciByZW1hcCB0aGF0IG9ubHkgZXhpc3RzIGluIHRoZSBzZXJ2ZXIncyBtZW1vcnlcbiAgICBwcml2YXRlIGFzeW5jIHByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlOiBDaGFpblN0YXRlLCBraW5kOiBcIndpbmRvd1wiIHwgXCJyb3V0ZVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChraW5kID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBuZWFyQm91bmRhcnkgPSBzdGF0ZS5zb3VyY2VzLnNvbWUoc291cmNlID0+IHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3cuc29tZSh0ID0+IHQgPiAwICYmIHQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBNYXRoLmFicyh0IC0gbm93KSA8PSBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XKSk7XG4gICAgICAgICAgICBpZiAobmVhckJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHJhY2VkIGEgdmFsaWQgd2luZG93IGJvdW5kYXJ5OyB3YWl0aW5nICR7V1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZIC8gMTAwMH1zIGFuZCByZXRyeWluZ2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0Q29uZmlnUmVmcmVzaCA8IENPTkZJR19SRUZSRVNIX1RIUk9UVExFKSByZXR1cm47XG4gICAgICAgIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zb2xlLmxvZyhgV3JpdGUgcmVqZWN0ZWQgYnkgJHt0aGlzLmdldERlYnVnTmFtZSgpfSAod3JvbmcgJHtraW5kfSk6IG91ciBjb25maWcgaXMgc3RhbGUgKGxpa2VseSBhIGRlcGxveSBzd2l0Y2hvdmVyKTsgcmVmcmVzaGluZyBpdCBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQWN0aXZlQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlciB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKHN0YXRlLCBjb25maWcsIHJ1bik7XG4gICAgfVxuXG4gICAgLy8gVGhlIGFjY2Vzcy1wYWdlIGxpbmsgKHBsdXMgb3VyIG1hY2hpbmVJZC9pcCwgZm9yIHRoZSBhcHByb3ZlciB0byBtYXRjaCB0aGUgcmVxdWVzdCkgZm9yIHRoZVxuICAgIC8vIGZpcnN0IGhvc3RlZCBzb3VyY2UgdGhhdCBoYXNuJ3QgZ3JhbnRlZCB1cyBhY2Nlc3MuIHVuZGVmaW5lZCB3aGVuIHdlIGhhdmUgYWNjZXNzIGV2ZXJ5d2hlcmVcbiAgICAvLyB3ZSBjYW4gaGF2ZSBpdC4gQWxzbyByZWdpc3RlcnMgdGhlIGFjY2VzcyByZXF1ZXN0IHNlcnZlci1zaWRlLlxuICAgIHB1YmxpYyBhc3luYyB3YWl0aW5nRm9yQWNjZXNzKCk6IFByb21pc2U8eyBsaW5rOiBzdHJpbmc7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5hcGkgaW5zdGFuY2VvZiBBcmNoaXZlc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGxldCB3YWl0aW5nID0gYXdhaXQgc291cmNlLmFwaS53YWl0aW5nRm9yQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKHdhaXRpbmcpIHJldHVybiB3YWl0aW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldDIoZmlsZU5hbWUsIGNvbmZpZykpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRJbmZvKGZpbGVOYW1lKSk7XG4gICAgfVxuXG4gICAgLy8gQSBtaW5pbWFsIHNldCBvZiBjb25uZWN0ZWQsIGN1cnJlbnRseS12YWxpZCBBUEkgc291cmNlcyB3aG9zZSByb3V0ZXMgY292ZXIgWzAsIDEpIC0gbGlzdGluZ1xuICAgIC8vIG9wZXJhdGlvbnMgbXVzdCBtZXJnZSBldmVyeSBzaGFyZC4gR3JlZWR5IHN3ZWVwOiByZXBlYXRlZGx5IHRha2UgdGhlIHNvdXJjZSB0aGF0IGV4dGVuZHNcbiAgICAvLyBjb3ZlcmFnZSB0aGUgZnVydGhlc3QuIEluIHByYWN0aWNlIHRoaXMgaXMgb25lIHNvdXJjZSAodW5zaGFyZGVkKSwgb3Igb25lIHBlciBzaGFyZC5cbiAgICBwcml2YXRlIHNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZTogQ2hhaW5TdGF0ZSwgZXhjbHVkZWQ6IFNldDxTb3VyY2VXcmFwcGVyPik6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGVzID0gc3RhdGUuc291cmNlcy5maWx0ZXIoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiB4LmFwaSAmJiAhZXhjbHVkZWQuaGFzKHgpKTtcbiAgICAgICAgbGV0IGNob3NlbjogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGxldCBjb3ZlcmVkID0gMDtcbiAgICAgICAgd2hpbGUgKGNvdmVyZWQgPCAxKSB7XG4gICAgICAgICAgICBsZXQgYmVzdDogU291cmNlV3JhcHBlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBiZXN0RW5kID0gY292ZXJlZDtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiBjb3ZlcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gYmVzdEVuZCkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0RW5kID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICBiZXN0ID0gc291cmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYmVzdCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgYXZhaWxhYmxlIHNvdXJjZXMgb25seSBjb3ZlciB1cCB0byAke2NvdmVyZWR9IChzb21lIHNoYXJkcyBhcmUgZG93biBvciBVUkwtb25seSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNob3Nlbi5wdXNoKGJlc3QpO1xuICAgICAgICAgICAgY292ZXJlZCA9IGJlc3RFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob3NlbjtcbiAgICB9XG5cbiAgICAvLyBGYW5zIG9uZSBjYWxsIG91dCBvdmVyIGEgY292ZXJpbmcgc2V0IG9mIHNoYXJkcy4gU291cmNlcyBhcmUgbmV2ZXIgcHJlLWZpbHRlcmVkIGJ5XG4gICAgLy8gY29ubmVjdGl2aXR5IC0gdGhlIHJlcXVlc3QgaXMgYXR0ZW1wdGVkLCBhbmQgYSBmYWlsdXJlIHdpdGggdGhlIHNvY2tldCBkb3duIGFmdGVyd2FyZHNcbiAgICAvLyBleGNsdWRlcyB0aGF0IHNvdXJjZSBhbmQgcmUtc2VsZWN0cyB0aGUgY292ZXJpbmcgc2V0IChhbiBlcnJvciBmcm9tIGEgbGl2ZSBzb3VyY2UgdGhyb3dzKS5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uQ292ZXJpbmc8VD4ocnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IGV4Y2x1ZGVkID0gbmV3IFNldDxTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IGNvdmVyaW5nID0gdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIGV4Y2x1ZGVkKTtcbiAgICAgICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY292ZXJpbmcubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGFwaSA9IHNvdXJjZS5hcGk7XG4gICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZS5jb25maWcudXJsfSBoYXMgVVJMLW9ubHkgYWNjZXNzLCB3aGljaCBjYW5ub3Qgc2VydmUgdGhpcyBvcGVyYXRpb25gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGF3YWl0IHJ1bihhcGkpIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBleGNsdWRlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0cy5ldmVyeSh4ID0+IHgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHggPT4gKHggYXMgeyB2YWx1ZTogVCB9KS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhhcmNoaXZlcyA9PiBhcmNoaXZlcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpO1xuICAgICAgICAvLyBPdmVybGFwcGluZyBzaGFyZHMgY2FuIGJvdGggcmVwb3J0IGEgcGF0aDsgdGhlIG5ld2VzdCB3aW5zXG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIodGltZTogbnVtYmVyKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICBpZiAoIWFyY2hpdmVzLmdldENoYW5nZXNBZnRlcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcmNoaXZlcy5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcmNoaXZlcy5nZXRDaGFuZ2VzQWZ0ZXIodGltZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgc3RhdHVzZXMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FyY2hpdmVzLmdldERlYnVnTmFtZSgpfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogc3RhdHVzZXMuZXZlcnkoeCA9PiB4LmFsbFNjYW5zQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiBzdGF0dXNlcy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5pbmRleFNpemUsIDApLFxuICAgICAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIGlmICghc3RhdGUuc291cmNlcy5zb21lKHggPT4geC5hcGkpKSByZXR1cm4geyByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgdGhpcy5ydW4oc3RhdGUsIHsgYXBpT25seTogdHJ1ZSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDb25maWcoKSk7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbmZpZywgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICB9XG4gICAgLyoqIFRydWUgb25seSB3aGVuIEVWRVJZIHdyaXRlLXJlY2VpdmluZyBzb3VyY2Ugd291bGQgYWNjZXB0IG91ciB3cml0ZXMgKHBhcnRpYWwgd3JpdGUgYWNjZXNzXG4gICAgICogIGRlc3luY2hyb25pemVzIHNvdXJjZXMsIHNvIGl0IGNvdW50cyBhcyBubyBhY2Nlc3MpLiAqL1xuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdBY2NlcHRzV3JpdGVzKHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghYXdhaXQgc291cmNlLmhhc1dyaXRlQWNjZXNzKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyB0aGUgZnVsbCBrZXkgd3JpdHRlbi4gUGxhaW4ga2V5cyBjb21lIGJhY2sgdW5jaGFuZ2VkOyBrZXlzIGNvbnRhaW5pbmcgVkFSSUFCTEVfU0hBUkRcbiAgICAgKiAgYXJlIGF1dG9tYXRpY2FsbHkgbWF0ZXJpYWxpemVkIChhIHNoYXJkIHZhbHVlIGlzIHBpY2tlZCBhbmQgZW1iZWRkZWQsIHNlZSBzZXRWYXJpYWJsZVNoYXJkKVxuICAgICAqICBhbmQgdGhlIGNhbGxlciBuZWVkcyB0aGUgcmV0dXJuZWQga2V5IHRvIGV2ZXIgcmVhZCB0aGUgdmFsdWUgYmFjay4gKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmIChmaWxlTmFtZS5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGZpbGVOYW1lKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRWYXJpYWJsZVNoYXJkKGZpbGVOYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSkpO1xuICAgIH1cblxuICAgIC8vIFdyaXRlcyBhIGJhcmUgdmFyaWFibGUtc2hhcmQga2V5OiBwaWNrcyB0aGUgbG93ZXN0LWxhdGVuY3kgdXAgd3JpdGUgc2hhcmQsIG1hdGVyaWFsaXplcyB0aGVcbiAgICAvLyBrZXkgd2l0aCBhIHJhbmRvbSB2YWx1ZSBpbnNpZGUgdGhhdCBzaGFyZCdzIHJvdXRlLCB3cml0ZXMgaXQsIGFuZCByZXR1cm5zIHRoZSBGVUxMIGtleVxuICAgIC8vIGFjdHVhbGx5IHdyaXR0ZW4uIFVubGlrZSBub3JtYWwgd3JpdGVzIHRoaXMgQ0FOIG1vdmUgdG8gYW5vdGhlciBzaGFyZCB3aGVuIHRoZSBwcmVmZXJyZWQgb25lXG4gICAgLy8gaXMgZG93biAoZXJyb3IgKyBzb2NrZXQgZG93biwgc2FtZSBydWxlIGFzIHJlYWRzKSAtIGVhY2ggc2hhcmQgcmVjZWl2ZXMgYSBkaWZmZXJlbnQga2V5LCBzb1xuICAgIC8vIHdyaXRlIGNvbnNpc3RlbmN5IGlzIHByZXNlcnZlZC5cbiAgICBwcml2YXRlIGFzeW5jIHNldFZhcmlhYmxlU2hhcmQoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIC8vIFBlci1zaGFyZCB3cml0ZSBjb25zaXN0ZW5jeSBzdGlsbCBob2xkczogd2l0aGluIGEgcm91dGUsIG9ubHkgdGhlIEZJUlNUIHNvdXJjZSBtYXlcbiAgICAgICAgICAgIC8vIHRha2Ugd3JpdGVzIC0gbGF0ZW5jeSBvbmx5IHBpY2tzIFdISUNIIHNoYXJkIHRoZSBrZXkgbWF0ZXJpYWxpemVzIGludG9cbiAgICAgICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0FjY2VwdHNXcml0ZXMoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRzQnlSb3V0ZS5oYXMocm91dGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldHNCeVJvdXRlLnNldChyb3V0ZUtleSwgc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IFsuLi50YXJnZXRzQnlSb3V0ZS52YWx1ZXMoKV07XG4gICAgICAgICAgICBzb3J0KHRhcmdldHMsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHRhcmdldC5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBsZXQgZnVsbEtleSA9IGtleS5yZXBsYWNlKFZBUklBQkxFX1NIQVJELCBWQVJJQUJMRV9TSEFSRCArIFwiX1wiICsgKHN0YXJ0ICsgTWF0aC5yYW5kb20oKSAqIChlbmQgLSBzdGFydCkpKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZ1bGxLZXksIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsbEtleTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IElmIHdlIHJ1biBpbnRvIGNhc2VzIHdoZW4gdHJhbnNwb3J0IGxldmVsIGVycm9ycyBoYXBwZW4sIGJ1dCB3ZSBhcmUgc3RpbGwgY29ubmVjdGVkLCB0aGVuIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgY2hlY2tpbmcgaGVyZSwgYWRkaXRpb25hbCBlcnJvcnMgaW4gd2hpY2ggd2Ugd2lsbCByZXRyeSB0aGUgb3RoZXIgdGFyZ2V0cy4gSG93ZXZlciwgaWRlYWxseSwgY2hlY2tpbmcgaWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIHN0aWxsIGNvbm5lY3RlZCB3aWxsIGhhbmRsZSBhbGwgdGhvc2UgY2FzZXMuIERpc3Rpbmd1aXNoaW5nIGJldHdlZW4gYXBwbGljYXRpb24gZXJyb3JzICh3aGljaCB3ZSBjYW4ndCByZXRyeSkgYW5kIHRyYW5zcG9ydCBlcnJvcnMuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNDb25uZWN0ZWQoKSkgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBWYXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgJHt0YXJnZXQuZ2V0RGVidWdOYW1lKCl9IGlzIGRvd247IG1vdmluZyB0byB0aGUgbmV4dC1sb3dlc3QtbGF0ZW5jeSBzaGFyZGApO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFdmVyeSBzaGFyZCBmYWlsZWQ6IHJlLWNvbnRhY3QgZXZlcnl0aGluZyBhbmQgdHJ5IG9uY2UgbW9yZSBiZWZvcmUgZ2l2aW5nIHVwXG4gICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IHZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGFjY2VwdCB3cml0ZXNcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgLy8gU2FtZSBjb25zaXN0ZW5jeSBydWxlIGFzIHJ1bldyaXRlOiB0aGUgZmlyc3QgY3VycmVudGx5LXZhbGlkIHNvdXJjZSBmb3IgdGhlIHJvdXRlLCBvciBub3RoaW5nXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4gY29uZmlnQWNjZXB0c1dyaXRlcyh4LmNvbmZpZykgJiYgcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyBmb3Igc2V0TGFyZ2VGaWxlIG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHJvdXRlICR7cm91dGV9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0TGFyZ2VGaWxlKGNvbmZpZykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZGF0YSBzdHJlYW0gY2Fubm90IGJlIHJld291bmQsIHNvIGEgbWlkLXVwbG9hZCBkaXNjb25uZWN0IGNhbm5vdCBiZSByZXRyaWVkXG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShwYXRoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuY29uZmlnLnB1YmxpYyA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHNvdXJjZS5jb25maWcucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLnVybCkgcmV0dXJuIGF3YWl0IHNvdXJjZS51cmwuZ2V0VVJMKHBhdGgpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5hcGkpIHJldHVybiBhd2FpdCBzb3VyY2UuYXBpLmdldFVSTChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHB1YmxpYyBzb3VyY2UgY292ZXJpbmcgcm91dGUgJHtyb3V0ZX0gdG8gYnVpbGQgYSBVUkwgZnJvbSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbml0UmV0cnlUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5pdFJldHJ5VGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZVByb21pc2UgPSB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgaWYgKHN0YXRlUHJvbWlzZSkge1xuICAgICAgICAgICAgdm9pZCBzdGF0ZVByb21pc2UudGhlbihzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUaGUgSUFyY2hpdmVzIGZvciBhIFJlbW90ZUNvbmZpZyAob3IgYSBzaW5nbGUgc291cmNlIC0gYSByb3V0aW5nIFVSTCBzdHJpbmcgd29ya3MpLiBGdWxseSBsYXp5OlxuLy8gbm90aGluZyBpcyBjb250YWN0ZWQgdW50aWwgdGhlIGZpcnN0IGNhbGwuIENhbGwgZGlzcG9zZSgpIHdoZW4gZG9uZSB3aXRoIGl0LCBzbyBpdHMgYmFja2dyb3VuZFxuLy8gcmV0cnkvcG9sbCBsb29wcyBzdG9wLlxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFyY2hpdmVzKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSk6IEFyY2hpdmVzQ2hhaW4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNDaGFpbihjb25maWcpO1xufVxuXG4vKiogRXZlcnkgYnVja2V0IGFuIGFjY291bnQgaGFzIG9uIG9uZSBzdG9yYWdlIHNlcnZlciAtIGFjdGl2ZSBhbmQgaW5hY3RpdmUgLSB3aXRoIGVhY2ggYnVja2V0J3NcbiAqICBjb25maWd1cmF0aW9uLiBPbmUgYXV0aGVudGljYXRlZCBjYWxsICh0aGUgbm9ybWFsIHRydXN0IHN5c3RlbSBhcHBsaWVzKTogbm8gQXJjaGl2ZXNDaGFpbiwgbm9cbiAqICBzeW5jaHJvbml6YXRpb24sIGFuZCBpbmFjdGl2ZSBidWNrZXRzIG9uIHRoZSBzZXJ2ZXIgc3RheSBpbmFjdGl2ZS4gQW55IFVSTCBhZGRyZXNzaW5nIHRoZVxuICogIHNlcnZlciB3b3JrcyAoYSBidWNrZXQgcm91dGluZyBVUkwsIG9yIGp1c3QgaHR0cHM6Ly9ob3N0OnBvcnQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJCdWNrZXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIFNvY2tldEZ1bmN0aW9uLkVOQUJMRV9DTElFTlRfTU9ERSA9IHRydWU7XG4gICAgbGV0IHBhcnNlZCA9IHBhcnNlU3RvcmFnZVVybChjb25maWcudXJsKTtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCB9KTtcbiAgICBsZXQgY29udHJvbGxlciA9IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW25vZGVJZF07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRyb2xsZXIubGlzdEJ1Y2tldHMoY29uZmlnLmFjY291bnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCFTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB0aHJvdyBlO1xuICAgICAgICBhd2FpdCBhdXRoZW50aWNhdGVTdG9yYWdlKHsgYWRkcmVzczogcGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHBhcnNlZC5wb3J0LCBub2RlSWQgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250cm9sbGVyLmxpc3RCdWNrZXRzKGNvbmZpZy5hY2NvdW50KTtcbiAgICB9XG59XG5cbi8qKiBMaXZlIGluZm8gZm9yIG9uZSBidWNrZXQgZ2l2ZW4gaXRzIHJvdXRpbmcgVVJMIChnZXRDb25maWc6IHJvdXRpbmcgY29uZmlnLCBpbmRleCB0b3RhbHMsIGRpc2tcbiAqICBsaW1pdCwgaW4tcHJvZ3Jlc3Mgc3luY2hyb25pemF0aW9uKS4gT25lIGF1dGhlbnRpY2F0ZWQgY2FsbCB0byB0aGF0IHNlcnZlciAtIGEgbGlnaHQsIHNhZmVcbiAqICBhbHRlcm5hdGl2ZSB0byBpbnN0YW50aWF0aW5nIGFuIEFyY2hpdmVzQ2hhaW4sIHdoaWNoIHdvdWxkIHN0YXJ0IHN5bmNocm9uaXphdGlvbiBtYWNoaW5lcnkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0SW5mbyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnROYW1lPzogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgbGV0IHJlbW90ZSA9IG5ldyBBcmNoaXZlc1JlbW90ZSh7IHVybDogY29uZmlnLnVybCwgYWNjb3VudE5hbWU6IGNvbmZpZy5hY2NvdW50TmFtZSwgd2FpdEZvckFjY2VzczogZmFsc2UgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlbW90ZS5nZXRDb25maWcoKTtcbn1cbiJdfQ==
|
|
832
|
+
/* _JS_SOURCE_HASH = "3b14703b802e43025c6ff52b9a51d9b70206327cee21e3c5c5fc86f34d5a4ded"; */
|