sliftutils 1.7.99 → 1.7.100
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 +74 -3
- package/package.json +1 -1
- package/storage/ArchivesDisk.d.ts +2 -1
- package/storage/ArchivesDisk.ts +9 -3
- package/storage/IArchives.d.ts +8 -0
- package/storage/IArchives.ts +8 -0
- package/storage/LogMap.d.ts +1 -1
- package/storage/TransactionFile.d.ts +56 -0
- package/storage/{LogMap.ts → TransactionFile.ts} +7 -4
- package/storage/backblaze.ts +4 -1
- package/storage/dist/ArchivesDisk.ts.cache +11 -5
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/TransactionFile.ts.cache +212 -0
- package/storage/dist/backblaze.ts.cache +6 -3
- package/storage/remoteStorage/ArchivesRemote.ts +21 -2
- package/storage/remoteStorage/blobStore.d.ts +2 -1
- package/storage/remoteStorage/blobStore.ts +7 -7
- package/storage/remoteStorage/createArchives.ts +25 -8
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +27 -5
- package/storage/remoteStorage/dist/blobStore.ts.cache +5 -5
- package/storage/remoteStorage/dist/createArchives.ts.cache +26 -9
- package/storage/remoteStorage/dist/storageController.ts.cache +4 -3
- package/storage/remoteStorage/dist/storeSync.ts.cache +71 -21
- package/storage/remoteStorage/spec.md +1 -1
- package/storage/remoteStorage/storageController.d.ts +1 -0
- package/storage/remoteStorage/storageController.ts +3 -2
- package/storage/remoteStorage/storeSync.ts +64 -19
|
@@ -12,6 +12,9 @@ const ArchivesRemote_1 = require("./ArchivesRemote");
|
|
|
12
12
|
const storageController_1 = require("./storageController");
|
|
13
13
|
const chainStartup_1 = require("./chainStartup");
|
|
14
14
|
const format_1 = require("socket-function/src/formatting/format");
|
|
15
|
+
// How many extra full passes over the sources fallback dispatch makes when EVERY source in a pass failed, before the operation throws (see GetConfig.retries) - most requests shouldn't fail at all, so a couple of blanket retries buys availability for almost nothing
|
|
16
|
+
const DEFAULT_FALLBACK_RETRIES = 3;
|
|
17
|
+
const FALLBACK_RETRY_DELAY = 2 * 1000;
|
|
15
18
|
const WRONG_TARGET_BOUNDARY_WINDOW = 30 * 1000;
|
|
16
19
|
const WRONG_TARGET_BOUNDARY_RETRY_DELAY = 15 * 1000;
|
|
17
20
|
const CONFIG_REFRESH_THROTTLE = 30 * 1000;
|
|
@@ -84,8 +87,13 @@ class ArchivesChain {
|
|
|
84
87
|
if (config.noFallbacks || config.write && !config.fallbacks) {
|
|
85
88
|
return await this.runPrimary(config, run);
|
|
86
89
|
}
|
|
90
|
+
let retries = config.retries;
|
|
91
|
+
if (retries === undefined) {
|
|
92
|
+
retries = DEFAULT_FALLBACK_RETRIES;
|
|
93
|
+
}
|
|
87
94
|
let recheckedAvailability = false;
|
|
88
95
|
let retriedWrongTarget = false;
|
|
96
|
+
let retriedPasses = 0;
|
|
89
97
|
while (true) {
|
|
90
98
|
let errors = [];
|
|
91
99
|
let candidates = state.sources.filter(source => (config.route === undefined || (0, remoteConfig_1.routeContains)(source.config.route, config.route))
|
|
@@ -152,7 +160,16 @@ class ArchivesChain {
|
|
|
152
160
|
state = await this.state.getState();
|
|
153
161
|
continue;
|
|
154
162
|
}
|
|
155
|
-
|
|
163
|
+
// Blanket retry of the whole pass, ANY error (see GetConfig.retries): most requests shouldn't fail at all, so retrying the rare failure - whatever it was - buys availability for almost nothing
|
|
164
|
+
if (retriedPasses < retries) {
|
|
165
|
+
retriedPasses++;
|
|
166
|
+
console.warn(`Every source failed for ${this.getDebugName()}${config.route !== undefined && ` (route ${config.route})` || ""}; retrying the whole pass in ${FALLBACK_RETRY_DELAY / 1000}s (retry ${retriedPasses} of ${retries})`);
|
|
167
|
+
await (0, batching_1.delay)(FALLBACK_RETRY_DELAY);
|
|
168
|
+
await this.state.recheckAvailability();
|
|
169
|
+
state = await this.state.getState();
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
throw new Error(`All sources failed for ${this.getDebugName()}${config.route !== undefined && ` (route ${config.route})` || ""} (after ${retriedPasses} retr${retriedPasses === 1 && "y" || "ies"}): ${errors.join(" | ") || "no sources available"}`);
|
|
156
173
|
}
|
|
157
174
|
}
|
|
158
175
|
// Writes and noFallbacks reads are the same case: take the authoritative node - strictly the first source matching the route and valid window, whether it is up or down - and use it, never falling back to another node. It's important that writing always accesses the same node everywhere, even if that node is down - otherwise we're just writing into the void, and who knows if the writes will even be accepted, or clobbered, or what; and noFallbacks reads want the same node precisely because it is the one writes target. A slow call is almost always better than throwing, so a failing primary is retried (the SAME node, re-resolved each attempt since a config refresh can change which source is primary) until the deadline, then throws.
|
|
@@ -305,7 +322,7 @@ class ArchivesChain {
|
|
|
305
322
|
}
|
|
306
323
|
/** get2, but trying sources in latency order (fastest first) instead of config order. While this is much faster, it might miss immediate writes: the write node is no longer tried first, so a lagging replica may answer with a slightly older value. Exclusive with noFallbacks (which only considers one source - the write node - so there is no order to speed up); passing both throws. */
|
|
307
324
|
async getFast(fileName, config) {
|
|
308
|
-
return await this.request({ route: (0, remoteConfig_1.getRoute)(fileName), noFallbacks: config === null || config === void 0 ? void 0 : config.noFallbacks, fast: true, timeout: { path: fileName } }, async (archives, url) => {
|
|
325
|
+
return await this.request({ route: (0, remoteConfig_1.getRoute)(fileName), noFallbacks: config === null || config === void 0 ? void 0 : config.noFallbacks, retries: config === null || config === void 0 ? void 0 : config.retries, fast: true, timeout: { path: fileName } }, async (archives, url) => {
|
|
309
326
|
let result = await archives.get2(fileName, config);
|
|
310
327
|
// Empty data is a tombstone, not content - see get2
|
|
311
328
|
if (!result || !result.data || !result.data.length && !(config === null || config === void 0 ? void 0 : config.includeTombstones) && !((config === null || config === void 0 ? void 0 : config.range) && result.size))
|
|
@@ -315,7 +332,7 @@ class ArchivesChain {
|
|
|
315
332
|
}
|
|
316
333
|
/** Always resolves with a url - the authority that answered. A value that doesn't exist is still an answer FROM a server, so it comes back as { url } with no data (never plain undefined); errors from every source throw instead. */
|
|
317
334
|
async get2(fileName, config) {
|
|
318
|
-
return await this.request({ route: (0, remoteConfig_1.getRoute)(fileName), noFallbacks: config === null || config === void 0 ? void 0 : config.noFallbacks, timeout: { path: fileName } }, async (archives, url) => {
|
|
335
|
+
return await this.request({ route: (0, remoteConfig_1.getRoute)(fileName), noFallbacks: config === null || config === void 0 ? void 0 : config.noFallbacks, retries: config === null || config === void 0 ? void 0 : config.retries, timeout: { path: fileName } }, async (archives, url) => {
|
|
319
336
|
let result = await archives.get2(fileName, config);
|
|
320
337
|
// Empty data is a tombstone, not content (unless the caller asked for tombstones) - a ranged read of a REAL file can legitimately be empty though (range past EOF), which the total size distinguishes
|
|
321
338
|
if (!result || !result.data || !result.data.length && !(config === null || config === void 0 ? void 0 : config.includeTombstones) && !((config === null || config === void 0 ? void 0 : config.range) && result.size))
|
|
@@ -324,7 +341,7 @@ class ArchivesChain {
|
|
|
324
341
|
});
|
|
325
342
|
}
|
|
326
343
|
async getInfo(fileName, config) {
|
|
327
|
-
return await this.request({ route: (0, remoteConfig_1.getRoute)(fileName), noFallbacks: config === null || config === void 0 ? void 0 : config.noFallbacks }, async (archives, url) => {
|
|
344
|
+
return await this.request({ route: (0, remoteConfig_1.getRoute)(fileName), noFallbacks: config === null || config === void 0 ? void 0 : config.noFallbacks, retries: config === null || config === void 0 ? void 0 : config.retries }, async (archives, url) => {
|
|
328
345
|
let result = await archives.getInfo(fileName, config);
|
|
329
346
|
return result && { ...result, url } || undefined;
|
|
330
347
|
});
|
|
@@ -497,7 +514,7 @@ class ArchivesChain {
|
|
|
497
514
|
await this.setLargeFile({ path: fileName, ...config, ...(0, IArchives_1.bufferChunkStream)(data) });
|
|
498
515
|
return fileName;
|
|
499
516
|
}
|
|
500
|
-
await this.request({ write: true, fallbacks: config === null || config === void 0 ? void 0 : config.fallbacks, route: (0, remoteConfig_1.getRoute)(fileName), timeout: { uploadBytes: data.length, label: `Upload of ${JSON.stringify(fileName)} (${data.length} bytes)` } }, archives => archives.set(fileName, data, config));
|
|
517
|
+
await this.request({ write: true, fallbacks: config === null || config === void 0 ? void 0 : config.fallbacks, retries: config === null || config === void 0 ? void 0 : config.retries, route: (0, remoteConfig_1.getRoute)(fileName), timeout: { uploadBytes: data.length, label: `Upload of ${JSON.stringify(fileName)} (${data.length} bytes)` } }, archives => archives.set(fileName, data, config));
|
|
501
518
|
return fileName;
|
|
502
519
|
}
|
|
503
520
|
async setRoutingConfig(data, config) {
|
|
@@ -537,7 +554,7 @@ class ArchivesChain {
|
|
|
537
554
|
return remoteConfig_1.ROUTING_FILE;
|
|
538
555
|
}
|
|
539
556
|
async del(fileName, config) {
|
|
540
|
-
await this.request({ write: true, fallbacks: config === null || config === void 0 ? void 0 : config.fallbacks, route: (0, remoteConfig_1.getRoute)(fileName), timeout: { uploadBytes: 0, label: `Deletion of ${JSON.stringify(fileName)}` } }, archives => archives.del(fileName, config));
|
|
557
|
+
await this.request({ write: true, fallbacks: config === null || config === void 0 ? void 0 : config.fallbacks, retries: config === null || config === void 0 ? void 0 : config.retries, route: (0, remoteConfig_1.getRoute)(fileName), timeout: { uploadBytes: 0, label: `Deletion of ${JSON.stringify(fileName)}` } }, archives => archives.del(fileName, config));
|
|
541
558
|
}
|
|
542
559
|
/** See IArchives.move. When one node is the write target for BOTH paths, that node moves the file itself - the bytes never come through us - with the same wrong-window/route re-resolution as any write. When the paths route to different shards no single node holds both, so the move degrades to a copy through us plus a delete, CONFIRMED at the destination before the source is touched. No smart timeout on the node-side move: it can be a big file's worth of node-side work, which the upload-sized deadlines would misjudge. */
|
|
543
560
|
async move(config) {
|
|
@@ -657,7 +674,7 @@ class ArchivesChain {
|
|
|
657
674
|
return;
|
|
658
675
|
}
|
|
659
676
|
let attempt = 0;
|
|
660
|
-
await this.request({ write: true, fallbacks: config.fallbacks, route }, async (archives) => {
|
|
677
|
+
await this.request({ write: true, fallbacks: config.fallbacks, retries: config.retries, route }, async (archives) => {
|
|
661
678
|
attempt++;
|
|
662
679
|
// The previous attempt consumed some (or all) of the stream, and this source needs the file from its first byte
|
|
663
680
|
if (attempt > 1)
|
|
@@ -796,5 +813,5 @@ async function getBucketInfo(config) {
|
|
|
796
813
|
return await remote.getConfig();
|
|
797
814
|
}
|
|
798
815
|
exports.getBucketInfo = getBucketInfo;
|
|
799
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBa0U7QUFDbEUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixzREFBb0Q7QUFDcEQsaURBSXdCO0FBQ3hCLCtDQUE0QztBQUM1QyxtRUFBZ0U7QUFDaEUscURBQXdGO0FBRXhGLDJEQUF5RjtBQUV6RixpREFBK0Q7QUFDL0Qsa0VBQW1FO0FBRW5FLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQyxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdELHFOQUFxTjtBQUNyTiwrQ0FBcUY7QUFBNUUsOEdBQUEsY0FBYyxPQUFBO0FBQUUsaUhBQUEsaUJBQWlCLE9BQUE7QUFBRSxnSEFBQSxnQkFBZ0IsT0FBQTtBQUU1RCw0R0FBNEc7QUFDNUcsK0NBQW1EO0FBQTFDLGlIQUFBLGlCQUFpQixPQUFBO0FBTzFCLFNBQVMsbUJBQW1CLENBQUMsTUFBb0I7SUFDN0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUN0QyxPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFXLEVBQUUsTUFBcUI7SUFDM0QsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxzQkFBVSxDQUFDO0lBQ3JELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQywwQkFBYyxFQUFFLDBCQUFjLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkcsQ0FBQztBQUVELDZkQUE2ZDtBQUM3ZCxTQUFTLFdBQVcsQ0FBQyxVQUEyQjtJQUM1QyxJQUFJLE1BQU0sR0FBb0IsRUFBRSxDQUFDO0lBQ2pDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixPQUFPLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQixJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLHNCQUFVLENBQUM7UUFDOUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVELHdnQkFBd2dCO0FBQ3hnQixTQUFTLFlBQVksQ0FBQyxPQUF3QjtJQUMxQyxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNwRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQztBQUM5QyxDQUFDO0FBRUQsTUFBYSxhQUFhO0lBSXRCLFlBQVksTUFBdUMsRUFBRSxPQUE4QjtRQTZMM0Usc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBNUwxQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZ0NBQWlCLENBQUM7WUFDL0IsVUFBVSxFQUFFLElBQUEsb0NBQXFCLEVBQUMsTUFBTSxDQUFDO1lBQ3pDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BDLGFBQWEsRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsYUFBYTtTQUN4QyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sWUFBWTtRQUNmLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFLLENBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0csT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa1dBQWtXO0lBQzFWLEtBQUssQ0FBQyxHQUFHLENBQUksS0FBaUIsRUFBRSxNQUFrSixFQUFFLEdBQTJEOztRQUNuUCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELElBQUksQ0FBQyxZQUFZLEVBQUUsNEZBQTRGLENBQUMsQ0FBQztRQUN4TCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMvQixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxNQUFNLEdBQWEsRUFBRSxDQUFDO1lBQzFCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQzNDLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBQSw0QkFBYSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzttQkFDN0UsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDckMsaU1BQWlNO21CQUM5TCxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDN0QsQ0FBQztZQUNGLElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO2dCQUN2QixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQztvQkFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDakIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzt3QkFDckIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcseURBQXlELENBQUMsQ0FBQzs0QkFDM0YsU0FBUzt3QkFDYixDQUFDO3dCQUNELE9BQU8sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLENBQUM7b0JBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7d0JBQzdELElBQUksTUFBTSxDQUFDLEtBQUs7NEJBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3BGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNyRSxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQUMsQ0FBVyxDQUFDLEtBQUssbUNBQUksQ0FBQyxDQUFDLENBQUM7b0JBQzlDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7d0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQyxZQUFZLEVBQUUsc0NBQXNDLE9BQU8sRUFBRSxDQUFDLENBQUM7d0JBQzFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3JCLFNBQVM7b0JBQ2IsQ0FBQztvQkFDRCwyTUFBMk07b0JBQzNNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHNDQUEwQixDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQywrQkFBbUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0NBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDN0osa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUNuQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQ0FBMEIsQ0FBQyxJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLCtCQUFtQixDQUFDLElBQUksT0FBTyxJQUFJLGNBQWMsQ0FBQyxDQUFDO3dCQUMxSyxNQUFNO29CQUNWLENBQUM7b0JBQ0Qsb1NBQW9TO29CQUNwUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFlBQVksRUFBRSxzQ0FBc0MsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDdkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7NEJBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyQixTQUFTO29CQUNiLENBQUM7b0JBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO3dCQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNsQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDZCxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxTQUFTO1lBQ2IsQ0FBQztZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUN6QixxQkFBcUIsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN2QyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxTQUFTO1lBQ2IsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxXQUFXLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDdkwsQ0FBQztJQUNMLENBQUM7SUFFRCxrdUJBQWt1QjtJQUMxdEIsS0FBSyxDQUFDLFVBQVUsQ0FBSSxNQUFtRSxFQUFFLEdBQTJEOztRQUN4SixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcscUJBQXFCLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFBLDRCQUFhLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuSixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE1BQU0sQ0FBQyxLQUFLLElBQUksY0FBYyxJQUFJLHFCQUFxQixRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxXQUFXLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLHdFQUF3RSxDQUFDLENBQUM7Z0JBQ3JRLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUN2QixPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDOUQsSUFBSSxNQUFNLENBQUMsS0FBSzt3QkFBRSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQUMsQ0FBVyxDQUFDLEtBQUssbUNBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQ0FBMEIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDdEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO29CQUMxQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3BELFNBQVM7Z0JBQ2IsQ0FBQztnQkFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsK0JBQW1CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQzlELGlCQUFpQixHQUFHLElBQUksQ0FBQztvQkFDekIsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNuRCxTQUFTO2dCQUNiLENBQUM7Z0JBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGtDQUFzQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO29CQUNwRSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7b0JBQzVCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDMUQsU0FBUztnQkFDYixDQUFDO2dCQUNELElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtvQkFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNsRSxzWUFBc1k7b0JBQ3RZLElBQUksQ0FBQzt3QkFDRCxPQUFPLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSx5QkFBVyxDQUFDLElBQUEsK0JBQWdCLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVHLENBQUM7b0JBQUMsV0FBTSxDQUFDO3dCQUNMLDRFQUE0RTtvQkFDaEYsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFFBQVE7b0JBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELGdFQUFnRTtZQUNoRSxNQUFNLElBQUEsZ0JBQUssRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLEdBQUcsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHNkQUFzZDtJQUM5YyxLQUFLLENBQUMsaUJBQWlCLENBQUksT0FBaUMsRUFBRSxNQUFxQixFQUFFLElBQXNCOztRQUMvRyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxXQUFXLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDekIscUZBQXFGO1FBQ3JGLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLCtGQUErRjtZQUMvRixJQUFJLE9BQU8sR0FBRyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLHFDQUFxQyxHQUFHLElBQUksQ0FBQztZQUN2RyxJQUFJLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBLGdCQUFLLEVBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoSCxJQUFJLE1BQU07Z0JBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksYUFBYSxPQUFPLENBQUMsV0FBVyxRQUFRLE9BQU8sTUFBTSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLG1CQUFtQix1Q0FBdUMscUNBQXFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ULENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPLE1BQU0sV0FBVyxDQUFDO1FBQ2pELElBQUksS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUEsZ0JBQUssRUFBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0gsSUFBSSxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksVUFBOEIsQ0FBQztRQUNuQyxJQUFJLElBQWtDLENBQUM7UUFDdkMsSUFBSSxDQUFDO1lBQ0QsSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZGLElBQUEsZ0JBQUssRUFBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDbkQsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQUMsQ0FBVyxDQUFDLEtBQUssbUNBQUksQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsTUFBTSxDQUFDLFlBQVksRUFBRSwrQkFBK0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssbUJBQW1CLFVBQVUsSUFBSSxXQUFXLFVBQVUsR0FBRyxJQUFJLDJCQUEyQixtQkFBbUIsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwUixDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLHVDQUF1QyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hHLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUEsZ0JBQUssRUFBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xILElBQUksTUFBTTtnQkFBRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksZ0JBQWdCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLGVBQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsMkNBQTJDLHVDQUF1QyxXQUFXLENBQUMsQ0FBQztJQUNyUyxDQUFDO0lBR08sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEtBQWlCLEVBQUUsSUFBeUM7UUFDOUYsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLENBQUMsQ0FBQztZQUNoTCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksQ0FBQyxZQUFZLEVBQUUsNENBQTRDLGlDQUFpQyxHQUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQztnQkFDMUosTUFBTSxJQUFBLGdCQUFLLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztnQkFDL0MsT0FBTztZQUNYLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLHVCQUF1QjtZQUFFLE9BQU87UUFDMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssUUFBUSxJQUFJLG9CQUFvQixJQUFJLElBQUksS0FBSyxPQUFPLElBQUksYUFBYSxJQUFJLHFEQUFxRCxDQUFDO1FBQ3JKLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxNQUFNLDhHQUE4RyxDQUFDLENBQUM7UUFDL0ssTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUksTUFBa0osRUFBRSxHQUEyRDtRQUNwTyxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsT0FBTyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGdCQUFnQjtRQUN6QixJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsK09BQStPO1lBQy9PLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFBRSxTQUFTO1lBQ3pELElBQUksTUFBTSxDQUFDLEdBQUcsWUFBWSwrQkFBYyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLE9BQU87b0JBQUUsT0FBTyxPQUFPLENBQUM7WUFDaEMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE1BQWtCO1FBQ2pELElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7SUFDOUMsQ0FBQztJQUNELGlZQUFpWTtJQUMxWCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQWdCLEVBQUUsTUFBa0I7UUFDckQsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBQSx1QkFBUSxFQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4SixJQUFJLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELG9EQUFvRDtZQUNwRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsaUJBQWlCLENBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxLQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3BJLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCx1T0FBdU87SUFDaE8sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFnQixFQUFFLE1BQWtCO1FBQ2xELE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUEsdUJBQVEsRUFBQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzVJLElBQUksTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDbkQsdU1BQXVNO1lBQ3ZNLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxpQkFBaUIsQ0FBQSxJQUFJLENBQUMsQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLEtBQUksTUFBTSxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDcEksT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNNLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBZ0IsRUFBRSxNQUFzQjtRQUN6RCxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFBLHVCQUFRLEVBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9HLElBQUksTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEQsT0FBTyxNQUFNLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxTQUFTLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsMmNBQTJjO0lBQ25jLHFCQUFxQixDQUFDLEtBQWlCLEVBQUUsTUFBOEQ7UUFDM0csSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBQyxPQUFBLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQSxNQUFBLE1BQU0sQ0FBQyxPQUFPLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFBLEVBQUEsQ0FBQyxDQUFDO1lBQzlHLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUQsSUFBSSxNQUFNO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLElBQUksQ0FBQyxZQUFZLEVBQUUsd0VBQXdFLENBQUMsQ0FBQztRQUMxSixDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxJQUFJLENBQUMsWUFBWSxFQUFFLHdFQUF3RSxDQUFDLENBQUM7UUFDMUosQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFJLFNBQWlCLEVBQUUsR0FBd0MsRUFBRSxNQUFnQztRQUN4SCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLHNCQUFzQixDQUFDO1FBQ25ELHdJQUF3STtRQUN4SSxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1YsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsK0tBQStLO1lBQy9LLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQWlELEVBQUU7O2dCQUN6RSxJQUFJLFFBQXlCLENBQUM7Z0JBQzlCLElBQUksQ0FBQztvQkFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsZ0JBQWlCLENBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BGLENBQUM7Z0JBQ0QsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLFFBQVEsR0FBOEMsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ25ELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDUCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ2hHLE9BQU87b0JBQ1gsQ0FBQztvQkFDRCxJQUFJLENBQUM7d0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO29CQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7NEJBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFVLEVBQUUsQ0FBQyxDQUFDO3dCQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFBLG1CQUFVLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEtBQUssT0FBTyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDdEcsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsMEJBQTBCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLG9CQUFvQixNQUFBLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxtQ0FBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFNBQVMsQ0FBQSxhQUFhLEtBQUssVUFBVSxJQUFBLG1CQUFVLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMvUSxDQUFDO2dCQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLG1CQUFtQixRQUFRLENBQUMsTUFBTSxXQUFXLFFBQVEsQ0FBQyxNQUFNLHNDQUFzQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQUMsT0FBQSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssTUFBQSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sbUNBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxTQUFTLENBQUEsYUFBYSxLQUFLLFVBQVUsSUFBQSxtQkFBVSxFQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5VSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ0wsSUFBSSxRQUFRLElBQUksT0FBTztnQkFBRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDL0MsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUMxQixtWEFBbVg7WUFDblgsSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxTQUFTLEtBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQztvQkFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDeEUsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDekIsQ0FBQztnQkFBQyxXQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNYLElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUMzRCxTQUFTO2dCQUNiLENBQUM7Z0JBQ0QsK0ZBQStGO2dCQUMvRixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixNQUFNLEtBQUssQ0FBQztZQUNoQixDQUFDO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLGlCQUFpQixvQkFBb0IsR0FBRyxJQUFJLG1CQUFtQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQW1CO1FBQ2pELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDTSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWMsRUFBRSxNQUFtQjtRQUNyRCxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNqSyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztRQUNoRCxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNsQyxJQUFBLFdBQUksRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUEwQjtRQUNwRCxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUosSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7UUFDaEQsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN2QixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDTSxLQUFLLENBQUMsYUFBYTtRQUN0QixJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxFQUFDLFFBQVEsRUFBQyxFQUFFO1lBQzlFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7WUFDakYsQ0FBQztZQUNELE9BQU8sTUFBTSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0gsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6RCxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM1RCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDNUMsQ0FBQztJQUNOLENBQUM7SUFDTSxLQUFLLENBQUMsU0FBUztRQUNsQixJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNFLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN4RixPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBQ00sS0FBSyxDQUFDLGNBQWM7UUFDdkIsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUFFLFNBQVM7WUFDbEQsSUFBSSxDQUFDLE1BQU0sTUFBTSxDQUFDLGNBQWMsRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsTUFBa0I7UUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdHQUFnRyxDQUFDLENBQUM7UUFDekwsQ0FBQztRQUNELElBQUksUUFBUSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUM1QixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLDBCQUFjLENBQUMsSUFBSSxJQUFBLGlDQUFrQixFQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xGLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLCtCQUFtQixFQUFFLENBQUM7WUFDcEMsdVhBQXVYO1lBQ3ZYLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxJQUFBLDZCQUFpQixFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRixPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBQSx1QkFBUSxFQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sU0FBUyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzdQLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLE1BQWtDO1FBQzNFLDRNQUE0TTtRQUM1TSxJQUFBLHNDQUF1QixFQUFDLElBQUEsK0JBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsSUFBSSxTQUFTLEdBQUcsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxLQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuRCxJQUFJLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzFCLCtPQUErTztRQUMvTyxJQUFJLE9BQU8sR0FBb0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDN0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLE9BQU8sQ0FBQyxNQUFNLHVCQUF1QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BNLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxNQUFNLEVBQUMsRUFBRTs7WUFDekMsSUFBSSxLQUFLLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNqRixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlGLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDSixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN2QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxJQUFJLENBQUMsWUFBWSxFQUFFLGNBQWMsTUFBTSxDQUFDLE1BQU0sT0FBTyxPQUFPLENBQUMsTUFBTSwwQkFBMEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN00sQ0FBQztRQUNELE9BQU8sMkJBQVksQ0FBQztJQUN4QixDQUFDO0lBQ00sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE1BQWtCO1FBQ2pELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUEsdUJBQVEsRUFBQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVOLENBQUM7SUFFRCw4Z0JBQThnQjtJQUN2Z0IsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFzQjtRQUNwQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzlDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSywyQkFBWSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFBLHVCQUFRLEVBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxHQUFHLElBQUEsdUJBQVEsRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUEsNEJBQWEsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hILElBQUksTUFBTSxJQUFJLElBQUEsNEJBQWEsRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBQyxRQUFRLEVBQUMsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsa0NBQWtDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEosQ0FBQztnQkFDRCxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1gsQ0FBQztRQUNELDhIQUE4SDtRQUM5SCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsZ0NBQWUsRUFBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwSyxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLFlBQVksRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzFOLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxxVkFBcVY7SUFDN1UsdUJBQXVCLENBQUMsS0FBaUIsRUFBRSxNQUFrQztRQUNqRixJQUFJLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUN0RCxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFBRSxTQUFTO1lBQ2xELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksc0JBQVUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUEsV0FBSSxFQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCx1SkFBdUo7SUFDaEosS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFXO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDBCQUFjLENBQUMsSUFBSSxJQUFBLGlDQUFrQixFQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELElBQUksQ0FBQyxTQUFTLENBQUMsMEJBQWMsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdJLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztlQUNyRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsSUFBSSxDQUFDLFlBQVksRUFBRSx5Q0FBeUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUksQ0FBQztRQUNELE9BQU8sbUJBQW1CLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxNQUFrQjs7UUFDeEUsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsc0tBQXNLO1FBQ3RLLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLElBQUksTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUMxQixLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUN6QixJQUFJLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQztvQkFDRCwyUEFBMlA7b0JBQzNQLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7d0JBQ3pKLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRywrQkFBbUIsRUFBRSxDQUFDOzRCQUNwQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLElBQUEsNkJBQWlCLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3JILENBQUM7d0JBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFRLENBQUM7b0JBQ2hGLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sT0FBTyxDQUFDO2dCQUNuQixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQUMsQ0FBVyxDQUFDLEtBQUssbUNBQUksQ0FBQyxDQUFDLENBQUM7b0JBQzlDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7d0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsd0RBQXdELE9BQU8sRUFBRSxDQUFDLENBQUM7d0JBQ3JJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3JCLFNBQVM7b0JBQ2IsQ0FBQztvQkFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7d0JBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ2xDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsTUFBTSxDQUFDLFlBQVksRUFBRSxtREFBbUQsQ0FBQyxDQUFDO29CQUNySCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QixDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUN6QixxQkFBcUIsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN2QyxTQUFTO1lBQ2IsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUNoSixDQUFDO0lBQ0wsQ0FBQztJQUVELDJjQUEyYztJQUNwYyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQTBCO1FBQ2hELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsMEJBQWMsQ0FBQyxJQUFJLElBQUEsaUNBQWtCLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hGLE1BQU0sSUFBSSxLQUFLLENBQUMsc0tBQXNLLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6TixDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBQSx1QkFBUSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUMsUUFBUSxFQUFDLEVBQUU7WUFDckYsT0FBTyxFQUFFLENBQUM7WUFDVixnSEFBZ0g7WUFDaEgsSUFBSSxPQUFPLEdBQUcsQ0FBQztnQkFBRSxNQUFNLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBQSx1QkFBZ0IsRUFBQyxnQkFBZ0IsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCx3TkFBd047SUFDaE4sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQTBCLEVBQUUsS0FBYTtRQUNwRSxJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNsQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUEsNEJBQWEsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDekIscUJBQXFCLEdBQUcsSUFBSSxDQUFDO29CQUM3QixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDdkMsU0FBUztnQkFDYixDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzVHLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFBLHVCQUFnQixFQUFDLGdCQUFnQixNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRyxPQUFPO1lBQ1gsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO29CQUN4QixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3pCLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDNUIsSUFBSSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxJQUFBLHVCQUFRLEVBQUMsSUFBSSxDQUFDLDRCQUE0QixJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsNFRBQTRUO0lBQ3JULEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBWTtRQUM3QixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbVNBQW1TO0lBQzVSLEtBQUssQ0FBQyxVQUFVO1FBQ25CLElBQUksWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELHlKQUF5SjtJQUNsSixLQUFLLENBQUMsY0FBYztRQUN2QixJQUFJLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxXQUFXLENBQUMsWUFBd0IsRUFBRSxNQUFtQztRQUM3RSxPQUFPLENBQUMsSUFBWSxFQUFFLEVBQUU7O1lBQ3BCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksWUFBWSxDQUFDO1lBQ2hELElBQUksS0FBSyxHQUFHLElBQUEsdUJBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLE9BQU8sR0FBb0IsRUFBRSxDQUFDO1lBQ2xDLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsQ0FBQyxNQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxtQ0FBSSxJQUFJLENBQUM7b0JBQUUsU0FBUztnQkFDOUMsSUFBSSxDQUFDLElBQUEsNEJBQWEsRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7b0JBQUUsU0FBUztnQkFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQUUsU0FBUztnQkFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsSUFBSSxPQUF3QixDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFBLFdBQUksRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO2dCQUN2QixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUEsMkJBQVksRUFBQyxJQUFBLCtCQUFnQixFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRixPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUF2cEJELHNDQXVwQkM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBdUMsRUFBRSxPQUE4QjtJQUNsRyxPQUFPLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRkQsd0NBRUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUFJLEdBQVcsRUFBRSxHQUE2RTs7SUFDbkgsK0JBQWMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDekMsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQ0FBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLElBQUksVUFBVSxHQUFHLDJDQUF1QixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUM7UUFDRCxPQUFPLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw2Q0FBeUIsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sSUFBQSxvQ0FBbUIsRUFBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEYsT0FBTyxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxDQUFDO0FBQ0wsQ0FBQztBQUVNLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxNQUF3QztJQUM1RSxPQUFPLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQUZELDhDQUVDO0FBRUQsOE5BQThOO0FBQ3ZOLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxNQUE0RDtJQUNwRyxPQUFPLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUksQ0FBQztBQUZELHNEQUVDO0FBRUQseUxBQXlMO0FBQ2xMLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxNQUF1QjtJQUNwRSxPQUFPLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFGRCxnRUFFQztBQUVELHNQQUFzUDtBQUMvTyxLQUFLLFVBQVUsb0JBQW9CLENBQUMsTUFBNEQ7SUFDbkcsT0FBTyxNQUFNLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdJLENBQUM7QUFGRCxvREFFQztBQUVELDhGQUE4RjtBQUN2RixLQUFLLFVBQVUscUJBQXFCLENBQUMsTUFBd0M7SUFDaEYsT0FBTyxNQUFNLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9HLENBQUM7QUFGRCxzREFFQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBdUI7SUFDdkQsNkdBQTZHO0lBQzdHLElBQUksTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RILE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUpELHNDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydCwgd2F0Y2hTbG93UHJvbWlzZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBSZW1vdGVDb25maWcsIFJlbW90ZUNvbmZpZ0Jhc2UsIFNvdXJjZUNvbmZpZyxcbiAgICBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRGVsQ29uZmlnLCBGaW5kQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIE1vdmVGaWxlQ29uZmlnLCBTZXRDb25maWcsIFNldExhcmdlRmlsZUNvbmZpZywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsIExBUkdFX1NFVF9USFJFU0hPTEQsIGJ1ZmZlckNodW5rU3RyZWFtLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIHBhcnNlUm91dGluZ0RhdGEsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLFxuICAgIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplU291cmNlLFxuICAgIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCBwYXJzZVZhcmlhYmxlUm91dGUsIGdldEJ1Y2tldEJhc2VVcmwsIGJ1aWxkRmlsZVVybCxcbn0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlLCBwYXJzZVN0b3JhZ2VVcmwsIGF1dGhlbnRpY2F0ZVN0b3JhZ2UgfSBmcm9tIFwiLi9BcmNoaXZlc1JlbW90ZVwiO1xuaW1wb3J0IHsgU2VydmVyQnVja2V0SW5mbywgQWN0aXZlQnVja2V0SW5mbyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcbmltcG9ydCB7IENoYWluU3RhdGUsIENoYWluU3RhdGVNYW5hZ2VyIH0gZnJvbSBcIi4vY2hhaW5TdGFydHVwXCI7XG5pbXBvcnQgeyBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcblxuY29uc3QgV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVyA9IDMwICogMTAwMDtcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IENPTkZJR19SRUZSRVNIX1RIUk9UVExFID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9USU1FT1VUID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9ERUxBWSA9IDIgKiAxMDAwO1xuY29uc3QgQ09WRVJJTkdfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX0RFTEFZID0gNSAqIDEwMDA7XG4vLyBTbWFydCB0aW1lb3V0czogYW4gYXR0ZW1wdCBnZXRzIHRoaXMgbG9uZyB0byBwcm9kdWNlIGFueXRoaW5nIGJlZm9yZSB3ZSBwcm9iZSBnZXRJbmZvIGZvciB0aGUgZmlsZSdzIHNpemUgKGFuZCB0aGUgcHJvYmUgaXRzZWxmIGdldHMgdGhlIHNhbWUgd2luZG93KVxuY29uc3QgU01BUlRfVElNRU9VVF9QUk9CRSA9IDYwICogMTAwMDtcbi8vIFZlcnkgZ2VuZXJvdXMgYXNzdW1lZCB0cmFuc2ZlciByYXRlcyAtIHRoZSByZXN1bHRpbmcgZGVhZGxpbmUgZXhpc3RzIHRvIGNhdGNoIHN0dWNrIHNvdXJjZXMsIG5vdCBzbG93IG9uZXNcbmNvbnN0IFNNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORCA9IDEwMjQgKiAxMDI0O1xuY29uc3QgU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCA9IDUxMiAqIDEwMjQ7XG4vLyBNYXJrZXIgaW4gc21hcnQtdGltZW91dCBlcnJvcnMsIHNvIHRoZSByZWFkIGxvb3AgY2FuIGxvZyB0aGVtIGFuZCBjb250aW51ZSB3aXRoIHRoZSBvdGhlciBzb3VyY2VzIChhIGNvbm5lY3RlZCBzb3VyY2UncyBvdGhlciBlcnJvcnMgc3RpbGwgdGhyb3cpXG5jb25zdCBTTUFSVF9USU1FT1VUX01BUktFUiA9IFwiQVJDSElWRVNfU01BUlRfVElNRU9VVF9jNDFhOWRcIjtcblxuLy8gU2l6ZXMgYSBnZW5lcm91cyBwZXItYXR0ZW1wdCBkZWFkbGluZS4gR2V0LXN0eWxlIGNhbGxzIHBhc3MgcGF0aDogdGhlIHNpemUgaXMgb25seSBmZXRjaGVkICh2aWEgZ2V0SW5mbykgd2hlbiB0aGUgY2FsbCB0dXJucyBvdXQgdG8gYmUgc2xvdy4gU2V0LXN0eWxlIGNhbGxzIHBhc3MgdXBsb2FkQnl0ZXMsIHdoaWNoIHRoZXkgYWxyZWFkeSBrbm93LlxudHlwZSBTbWFydFRpbWVvdXQgPSB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICB1cGxvYWRCeXRlcz86IG51bWJlcjtcbiAgICAvLyBOYW1lcyB0aGUgb3BlcmF0aW9uIGluIHRpbWVvdXQgZXJyb3JzIC0gd2l0aG91dCBpdCBhIGRlbGV0aW9uIChhIHRvbWJzdG9uZSB3cml0ZSwgdXBsb2FkQnl0ZXMgMCkgcmVhZHMgYXMgXCJVcGxvYWQgb2YgMCBieXRlc1wiLCB3aGljaCBsb29rcyBsaWtlIGEgYnVnIHJhdGhlciB0aGFuIGEgZGVsZXRlXG4gICAgbGFiZWw/OiBzdHJpbmc7XG59O1xuXG4vKiogVGhlIGFkZHJlc3MsIHBvcnQsIGFjY291bnQsIGFuZCBidWNrZXQgbmFtZSBhIGJ1Y2tldCByb3V0aW5nIFVSTCBhZGRyZXNzZXMuIFRocm93cyB3aGVuIHRoZSBVUkwgaXNuJ3QgYSBob3N0ZWQgYnVja2V0IHJvdXRpbmcgVVJMIChodHRwczovL2hvc3Q6cG9ydC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uKS4gKi9cbmV4cG9ydCB7IHBhcnNlSG9zdGVkVXJsLCBwYXJzZUJhY2tibGF6ZVVybCwgZ2V0QnVja2V0QmFzZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vKiogQSBjbGllbnQgZm9yIE9ORSBzb3VyY2UgLSBzZWUgc3RvcmVTb3VyY2VzLnRzLiBSZS1leHBvcnRlZCBoZXJlIGJlY2F1c2UgYSBjaGFpbiBpcyBidWlsdCBvdXQgb2YgdGhlbS4gKi9cbmV4cG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzIH0gZnJvbSBcIi4vc3RvcmVTb3VyY2VzXCI7XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzQ2hhaW5PcHRpb25zID0ge1xuICAgIC8qKiBPdXRzaWRlIG9mIG5vZGUgd2UgZGVmYXVsdCB0byByZWFkLW9ubHkgZG93bmxvYWRzIG92ZXIgdGhlIHB1YmxpYyBVUkxzIChubyBBUEkgY29ubmVjdGlvbikgd2hlbiB0aGUgY29uZmlnIGhhcyBwdWJsaWMgc291cmNlcy4gU2V0IHRoaXMgdG8gY29ubmVjdCB0byB0aGUgQVBJIGFueXdheSAtIG5lZWRlZCBmb3Igd3JpdGluZywgbGlzdGluZywgYW5kIGFueSBvdGhlciBvcGVyYXRpb24gdGhlIHBsYWluIFVSTCBmb3JtIGNhbm5vdCBzZXJ2ZS4gKi9cbiAgICBkaXJlY3RDb25uZWN0PzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ1dpbmRvd0N1cnJlbnQoY29uZmlnOiBTb3VyY2VDb25maWcpOiBib29sZWFuIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gY29uZmlnLnZhbGlkV2luZG93O1xuICAgIHJldHVybiBzdGFydCA8PSBub3cgJiYgbm93IDwgZW5kO1xufVxuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZVNoYXJkS2V5KGtleTogc3RyaW5nLCB0YXJnZXQ6IFNvdXJjZVdyYXBwZXIpOiBzdHJpbmcge1xuICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0YXJnZXQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGtleS5yZXBsYWNlKFZBUklBQkxFX1NIQVJELCBWQVJJQUJMRV9TSEFSRCArIFwiX1wiICsgKHN0YXJ0ICsgTWF0aC5yYW5kb20oKSAqIChlbmQgLSBzdGFydCkpKTtcbn1cblxuLyoqIENvdmVycyB0aGUgd2hvbGUga2V5IHNwYWNlIHdpdGggdGhlIEFVVEhPUklUQVRJVkUgc291cmNlczogZm9yIGVhY2ggdW5jb3ZlcmVkIHBvaW50LCB0aGUgRklSU1Qgc291cmNlIGluIGNvbmZpZyBvcmRlciB3aG9zZSByb3V0ZSBjb250YWlucyBpdCAtIHRoZSBleGFjdCBzZWxlY3Rpb24gZXZlcnkgcmVhZCBhbmQgd3JpdGUgdXNlcywgc28gbGlzdGluZ3MgY29tZSBmcm9tIHRoZSBzYW1lIG5vZGVzIHdyaXRlcyB3ZW50IHRvIChyZWFkLXlvdXItd3JpdGVzKS4gTmV2ZXIgXCJmZXdlc3RcIiBvciBcIndpZGVzdFwiOiBwcmVmZXJyaW5nIGEgd2lkZSByZWFkIHJlcGxpY2Egb3ZlciB0aGUgcm91dGVkIHdyaXRlIHNoYXJkcyB3b3VsZCBzZXJ2ZSBsaXN0aW5ncyBmcm9tIGEgbm9kZSB0aGF0IG9ubHkgaGFzIHRoZSBkYXRhIHNlY29uZC1oYW5kLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjYW5kaWRhdGVzIGxlYXZlIGEgZ2FwLiAqL1xuZnVuY3Rpb24gY292ZXJSb3V0ZXMoY2FuZGlkYXRlczogU291cmNlV3JhcHBlcltdKTogU291cmNlV3JhcHBlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2hvc2VuOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgd2hpbGUgKGNvdmVyZWQgPCAxKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2FuZGlkYXRlcy5maW5kKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY292ZXJlZCkpO1xuICAgICAgICBpZiAoIW5leHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNob3Nlbi5wdXNoKG5leHQpO1xuICAgICAgICBsZXQgWywgZW5kXSA9IG5leHQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgIGNvdmVyZWQgPSBlbmQ7XG4gICAgfVxuICAgIHJldHVybiBjaG9zZW47XG59XG5cbi8qKiBSRUFEUyBPTkxZLiBEcm9wcyBzb3VyY2VzIHRoYXQgcmVjZW50bHkgZmFpbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZCAtIHVubGVzcyB0aGF0IHdvdWxkIGxlYXZlIG5vdGhpbmcsIGluIHdoaWNoIGNhc2UgYSBkb3duIHNvdXJjZSBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBubyBzb3VyY2UsIGFuZCB3ZSByZXRyeSBpdCBpbW1lZGlhdGVseS4gTmV2ZXIgYXBwbGllcyB0byB3cml0ZXMgKG9yIG5vRmFsbGJhY2tzIHJlYWRzIG9mIHRoZSB3cml0ZSB0YXJnZXQpOiB0aGUgd3JpdGUgbm9kZSBpcyBzdHJpY3RseSB0aGUgRklSU1Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCByZWdhcmRsZXNzIG9mIGNvbm5lY3Rpdml0eSAtIGEgY2xpZW50J3MgZmxha3kgdmlldyBvZiB0aGUgbmV0d29yayBtdXN0IG5ldmVyIHNjYXR0ZXIgd3JpdGVzIGFjcm9zcyB0aGUgY2hhaW4gKHNwZWM6IGNsaWVudCB3cml0ZXMgYXJlIGNvbnNpc3RlbnQsIGNsaWVudCByZWFkcyBhcmUgcmVkdW5kYW50KS4gKi9cbmZ1bmN0aW9uIHByZWZlclVzYWJsZShzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgIGxldCB1c2FibGUgPSBzb3VyY2VzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICByZXR1cm4gdXNhYmxlLmxlbmd0aCAmJiB1c2FibGUgfHwgc291cmNlcztcbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQ2hhaW4gaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIC8vIFRoZSBjaGFpbidzIHN0YXRlLCBhbmQgZXZlcnl0aGluZyBhYm91dCBoYXZpbmcgb25lIChpbml0ICsgaXRzIHJldHJ5LCBjb25maWcgcG9sbGluZy9hZG9wdGlvbiwgYXZhaWxhYmlsaXR5IHJlY2hlY2tzLCB0aGUgY29uZmlnIHJld3JpdGUgbG9vcCksIGxpdmVzIGluIHRoZSBtYW5hZ2VyIC0gd2hhdCBzdGF5cyBpbiB0aGlzIGNsYXNzIGlzIGRpc3BhdGNoIG92ZXIgdGhhdCBzdGF0ZVxuICAgIHByaXZhdGUgc3RhdGU6IENoYWluU3RhdGVNYW5hZ2VyO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBDaGFpblN0YXRlTWFuYWdlcih7XG4gICAgICAgICAgICBjb25maWd1cmVkOiBub3JtYWxpemVSZW1vdGVDb25maWcoY29uZmlnKSxcbiAgICAgICAgICAgIGRlYnVnTmFtZTogKCkgPT4gdGhpcy5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgIGRpcmVjdENvbm5lY3Q6IG9wdGlvbnM/LmRpcmVjdENvbm5lY3QsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIGxldCB1cmxzID0gdGhpcy5zdGF0ZS5hY3RpdmVDb25maWcuc291cmNlcy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICh4IGFzIFNvdXJjZUNvbmZpZykudXJsKTtcbiAgICAgICAgcmV0dXJuIGBjaGFpbiAke3VybHMuam9pbihcIiwgXCIpfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIE9ORSBkaXNwYXRjaCBmb3IgZXZlcnkgb3BlcmF0aW9uOiBubyBmYWxsYmFja3MgKGFsbCB3cml0ZXMgYnkgZGVmYXVsdCwgYW5kIG5vRmFsbGJhY2tzIHJlYWRzKSAtPiB0aGUgcHJpbWFyeSBub2RlIG9ubHksIHZpYSBydW5QcmltYXJ5OyBldmVyeXRoaW5nIGVsc2UgLT4gdGhlIHNoYXJlZCBmYWxsYmFjayBsb29wLCB0cnlpbmcgc291cmNlcyBpbiBjb25maWcgb3JkZXIgKG9yIGxhdGVuY3kgb3JkZXIgZm9yIGZhc3QgcmVhZHMpIGFuZCBvbmx5IG1vdmluZyBvbiB3aGVuIG9uZSBmYWlscy4gV3JpdGVzIGluIHRoZSBsb29wIGRpZmZlciBmcm9tIHJlYWRzIG9ubHkgaW4gY2FsbGluZyBzb3VyY2Uud3JpdGUuXG4gICAgcHJpdmF0ZSBhc3luYyBydW48VD4oc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgbm9GYWxsYmFja3M/OiBib29sZWFuOyBmYWxsYmFja3M/OiBib29sZWFuOyBmYXN0PzogYm9vbGVhbjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoY29uZmlnLmZhc3QgJiYgY29uZmlnLm5vRmFsbGJhY2tzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhc3QgYW5kIG5vRmFsbGJhY2tzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IG5vRmFsbGJhY2tzIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgKHRoZSB3cml0ZSBub2RlKSwgc28gdGhlcmUgaXMgbm8gb3JkZXIgdG8gc3BlZWQgdXBgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLm5vRmFsbGJhY2tzIHx8IGNvbmZpZy53cml0ZSAmJiAhY29uZmlnLmZhbGxiYWNrcykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuUHJpbWFyeShjb25maWcsIHJ1bik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcihzb3VyY2UgPT5cbiAgICAgICAgICAgICAgICAoY29uZmlnLnJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKVxuICAgICAgICAgICAgICAgICYmIGNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZylcbiAgICAgICAgICAgICAgICAvLyBBIHdyaXRlLWJsb2NrZWQgc291cmNlIChyZWFkLW9ubHkgbW9kZSwgYmFja2JsYXplIHdpdGhvdXQgY3JlZGVudGlhbHMpIGNhbiBuZXZlciB0YWtlIGEgd3JpdGUsIHNvIGl0IGlzIG5vdCBhIGZhbGxiYWNrIGNhbmRpZGF0ZSAtIGl0cyB0aHJvdyB3b3VsZCBlbmQgdGhlIHBhc3MgZWFybHkgKGl0IGNvdW50cyBhcyBjb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgJiYgIShjb25maWcud3JpdGUgJiYgKHNvdXJjZS53cml0ZUJsb2NrZWQgfHwgIXNvdXJjZS5hcGkpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBvcmRlcmVkID0gcHJlZmVyVXNhYmxlKGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mYXN0KSB7XG4gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFsuLi5vcmRlcmVkXTtcbiAgICAgICAgICAgICAgICBzb3J0KG9yZGVyZWQsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHdyb25nVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygb3JkZXJlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXBpT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFwaSA9IHNvdXJjZS5hcGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfSBoYXMgVVJMLW9ubHkgYWNjZXNzLCB3aGljaCBjYW5ub3Qgc2VydmUgdGhpcyBvcGVyYXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4oYXBpLCBzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlTbWFydFRpbWVvdXQoY29uZmlnLnRpbWVvdXQsIHNvdXJjZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53cml0ZSkgcmV0dXJuIHNvdXJjZS53cml0ZShhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHNvdXJjZS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnJlYWQoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBzb3VyY2UuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU01BUlRfVElNRU9VVF9NQVJLRVIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTb3VyY2UgdGltZWQgb3V0IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBjb250aW51aW5nIHdpdGggdGhlIG5leHQgc291cmNlOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgd3Jvbmctd2luZG93L3JvdXRlL3VuY29uZmlndXJlZCByZWplY3Rpb24gbWVhbnMgT1VSIGNvbmZpZyBkaXNhZ3JlZXMgd2l0aCB0aGUgc2VydmVyJ3MsIHNvIGV2ZXJ5IHNvdXJjZSB3ZSdkIGZhbGwgYmFjayB0byBpcyBqdWRnZWQgYnkgdGhlIHNhbWUgc3RhbGUgY29uZmlnIC0gcmVmcmVzaCBpdCBhbmQgcmVzdGFydCB0aGUgcGFzcyBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVykgfHwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSB8fCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQpKSAmJiAhcmV0cmllZFdyb25nVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVkV3JvbmdUYXJnZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JvbmdUYXJnZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVykgJiYgXCJ3aW5kb3dcIiB8fCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfUk9VVEUpICYmIFwicm91dGVcIiB8fCBcInVuY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrcyBtZWFucyBhdmFpbGFiaWxpdHkgYWJvdmUgZXZlcnl0aGluZzogQU5ZIGZhaWxpbmcgc291cmNlIC0gZG93biwgbWlzY29uZmlndXJlZCwgcmVqZWN0aW5nLCBtaWQtc3dpdGNob3ZlciAtIGlzIHNraXBwZWQgYW5kIHRoZSBuZXh0IGNvdmVyaW5nIHNvdXJjZSB0YWtlcyB0aGUgY2FsbC4gT25seSBldmVyeSBzb3VyY2UgZmFpbGluZyB0aHJvd3MgKGJlbG93KS4gV2l0aG91dCBmYWxsYmFja3MsIGEgQ09OTkVDVEVEIHNvdXJjZSdzIGVycm9yIGlzIGEgcmVhbCBhbnN3ZXIgYW5kIHRocm93cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNvdXJjZSBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIGZhbGxpbmcgYmFjayB0byB0aGUgbmV4dCBzb3VyY2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod3JvbmdUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxsIHNvdXJjZXMgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifTogJHtlcnJvcnMuam9pbihcIiB8IFwiKSB8fCBcIm5vIHNvdXJjZXMgYXZhaWxhYmxlXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXcml0ZXMgYW5kIG5vRmFsbGJhY2tzIHJlYWRzIGFyZSB0aGUgc2FtZSBjYXNlOiB0YWtlIHRoZSBhdXRob3JpdGF0aXZlIG5vZGUgLSBzdHJpY3RseSB0aGUgZmlyc3Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCB3aGV0aGVyIGl0IGlzIHVwIG9yIGRvd24gLSBhbmQgdXNlIGl0LCBuZXZlciBmYWxsaW5nIGJhY2sgdG8gYW5vdGhlciBub2RlLiBJdCdzIGltcG9ydGFudCB0aGF0IHdyaXRpbmcgYWx3YXlzIGFjY2Vzc2VzIHRoZSBzYW1lIG5vZGUgZXZlcnl3aGVyZSwgZXZlbiBpZiB0aGF0IG5vZGUgaXMgZG93biAtIG90aGVyd2lzZSB3ZSdyZSBqdXN0IHdyaXRpbmcgaW50byB0aGUgdm9pZCwgYW5kIHdobyBrbm93cyBpZiB0aGUgd3JpdGVzIHdpbGwgZXZlbiBiZSBhY2NlcHRlZCwgb3IgY2xvYmJlcmVkLCBvciB3aGF0OyBhbmQgbm9GYWxsYmFja3MgcmVhZHMgd2FudCB0aGUgc2FtZSBub2RlIHByZWNpc2VseSBiZWNhdXNlIGl0IGlzIHRoZSBvbmUgd3JpdGVzIHRhcmdldC4gQSBzbG93IGNhbGwgaXMgYWxtb3N0IGFsd2F5cyBiZXR0ZXIgdGhhbiB0aHJvd2luZywgc28gYSBmYWlsaW5nIHByaW1hcnkgaXMgcmV0cmllZCAodGhlIFNBTUUgbm9kZSwgcmUtcmVzb2x2ZWQgZWFjaCBhdHRlbXB0IHNpbmNlIGEgY29uZmlnIHJlZnJlc2ggY2FuIGNoYW5nZSB3aGljaCBzb3VyY2UgaXMgcHJpbWFyeSkgdW50aWwgdGhlIGRlYWRsaW5lLCB0aGVuIHRocm93cy5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blByaW1hcnk8VD4oY29uZmlnOiB7IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1dpbmRvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nUm91dGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWROb3RDb25maWd1cmVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBQUklNQVJZX1JFVFJZX1RJTUVPVVQ7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgIGxldCBhdHRlbXB0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGlzIHRoZSAke2NvbmZpZy53cml0ZSAmJiBcIndyaXRlIHRhcmdldFwiIHx8IFwicHJpbWFyeSByZWFkIHNvdXJjZVwifSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn0gKGV2ZXJ5IHNvdXJjZSBpcyBvdXRzaWRlIGl0cyB2YWxpZCB3aW5kb3cgb3Igb3V0c2lkZSB0aGUga2V5J3Mgcm91dGUpYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnkgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlTbWFydFRpbWVvdXQoY29uZmlnLnRpbWVvdXQsIHByaW1hcnksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53cml0ZSkgcmV0dXJuIHByaW1hcnkud3JpdGUoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBwcmltYXJ5LmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByaW1hcnkucmVhZChhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHByaW1hcnkuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVykgJiYgIXJldHJpZWRXcm9uZ1dpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkV3JvbmdXaW5kb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfUk9VVEUpICYmICFyZXRyaWVkV3JvbmdSb3V0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkV3JvbmdSb3V0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwicm91dGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX05PVF9DT05GSUdVUkVEKSAmJiAhcmV0cmllZE5vdENvbmZpZ3VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZE5vdENvbmZpZ3VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcInVuY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy53cml0ZSAmJiB0YXJnZXQgJiYgKGF0dGVtcHQgPT09IDEgfHwgYXR0ZW1wdCAlIDMgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWFzb24gd2UgdHJ5IHRoZSBIVFRQIHJlcXVlc3Q6IGh0dHBzUmVxdWVzdCBoYXMgYmV0dGVyIEROUyByZXRyeWluZyBjYXBhYmlsaXRpZXMgdGhhbiBvdXIgV2ViU29ja2V0IHNlcnZlciAod2UgaGF2ZSBtb3JlIGNvbnRyb2wgb3ZlciBpdCksIHNvIGp1c3QgdXNpbmcgaXQgY2FuIGZpeCBzb21lIEROUyBpc3N1ZXMsIHdoaWNoIGNhbiBwcm9wYWdhdGUgdG8gZml4IHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi4gSXQgaXMgc3RpbGwgdGhlIHByaW1hcnkgc291cmNlJ3Mgb3duIGRhdGEsIHNvIHRoZSBuby1mYWxsYmFjayBzZW1hbnRpY3MgaG9sZCAtIGFuZCBBcmNoaXZlc1VybCBoYXMgbm8gc2V0dXAgY29zdCwgc28gbWFraW5nIG9uZSBvbiB0aGUgc3BvdCBpcyBmaW5lLlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0YXJnZXQudXJsIHx8IG5ldyBBcmNoaXZlc1VybChnZXRCdWNrZXRCYXNlVXJsKHRhcmdldC5jb25maWcudXJsKSksIHRhcmdldC5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCZXN0LWVmZm9ydDogdGhlIHByaW1hcnkncyBlcnJvciAodGhyb3duIGF0IHRoZSBkZWFkbGluZSkgaXMgdGhlIHJlYWwgb25lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBdCBtb3N0IG9uZSBhdHRlbXB0IHBlciBpbnRlcnZhbCwgaW4gY2FzZSB0aGUgZmFpbHVyZSBpcyBmYXN0XG4gICAgICAgICAgICBhd2FpdCBkZWxheShNYXRoLm1heCgwLCBhdHRlbXB0U3RhcnQgKyBQUklNQVJZX1JFVFJZX0RFTEFZIC0gRGF0ZS5ub3coKSkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmFjZXMgY2FsbCBhZ2FpbnN0IGEgc2l6ZS1iYXNlZCBkZWFkbGluZS4gVXBsb2FkcyBrbm93IHRoZWlyIHNpemUgdXBmcm9udDsgZ2V0cyBhcmUgZ2l2ZW4gU01BUlRfVElNRU9VVF9QUk9CRSB0byBwcm9kdWNlIGFueXRoaW5nLCBhbmQgb25seSB0aGVuIGlzIHRoZSBmaWxlJ3MgaW5mbyBmZXRjaGVkIChmcm9tIHRoZSBzYW1lIHNvdXJjZSwgaXRzZWxmIHRpbWUtbGltaXRlZCkgdG8gc2l6ZSB0aGUgZGVhZGxpbmUgLSBtZWFzdXJlZCBmcm9tIHRoZSBjYWxsJ3Mgc3RhcnQsIHNvIGEgc291cmNlIHRoYXQgd2FzIHNsb3cgYmVmb3JlIHRoZSBwcm9iZSBkb2Vzbid0IGdldCB0aGUgZnVsbCBhbGxvd2FuY2UgYWdhaW4uIFRpbWVkLW91dCBjYWxscyBrZWVwIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgKHRoZXkgY2Fubm90IGJlIGNhbmNlbGxlZCkgYnV0IHRoZWlyIGV2ZW50dWFsIHJlc3VsdCBpcyBpZ25vcmVkLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgYXBwbHlTbWFydFRpbWVvdXQ8VD4odGltZW91dDogU21hcnRUaW1lb3V0IHwgdW5kZWZpbmVkLCBzb3VyY2U6IFNvdXJjZVdyYXBwZXIsIGNhbGw6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKCF0aW1lb3V0KSByZXR1cm4gYXdhaXQgY2FsbCgpO1xuICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgY2FsbFByb21pc2UgPSBjYWxsKCk7XG4gICAgICAgIC8vIEFuIGFiYW5kb25lZCBjYWxsIG11c3Qgbm90IHN1cmZhY2UgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiB3aGVuIGl0IGV2ZW50dWFsbHkgZmFpbHNcbiAgICAgICAgbGV0IGFiYW5kb24gPSAoKSA9PiB2b2lkIGNhbGxQcm9taXNlLnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pO1xuICAgICAgICBpZiAodGltZW91dC51cGxvYWRCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBBIGZsYXQgYmFzZSBwbHVzIHRoZSBwcmVkaWN0ZWQgdHJhbnNmZXIgdGltZSwgc28gdGlueSB1cGxvYWRzIHN0aWxsIGdldCB0aGUgZnVsbCBiYXNlIHdpbmRvd1xuICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBTTUFSVF9USU1FT1VUX1BST0JFICsgdGltZW91dC51cGxvYWRCeXRlcyAvIFNNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkQgKiAxMDAwO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KGFsbG93ZWQpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKV0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTTUFSVF9USU1FT1VUX01BUktFUn0gJHt0aW1lb3V0LmxhYmVsIHx8IGBVcGxvYWQgb2YgJHt0aW1lb3V0LnVwbG9hZEJ5dGVzfSBieXRlc2B9IHRvICR7c291cmNlLmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMgKGFsbG93ZWQgJHtNYXRoLnJvdW5kKGFsbG93ZWQpfW1zOiAke1NNQVJUX1RJTUVPVVRfUFJPQkV9bXMgYmFzZSBwbHVzIHRyYW5zZmVyIGF0IGFuIGFzc3VtZWQgJHtTTUFSVF9USU1FT1VUX1VQTE9BRF9CWVRFU19QRVJfU0VDT05EfSBieXRlcy9zKWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGggPSB0aW1lb3V0LnBhdGg7XG4gICAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHJldHVybiBhd2FpdCBjYWxsUHJvbWlzZTtcbiAgICAgICAgbGV0IGZpcnN0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkoU01BUlRfVElNRU9VVF9QUk9CRSkudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgIGlmIChmaXJzdCkgcmV0dXJuIGZpcnN0LnZhbHVlO1xuICAgICAgICBsZXQgcHJvYmVFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaW5mbzogeyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluZm8gPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgIHNvdXJjZS5yZWFkKGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldEluZm8ocGF0aCkpLnRoZW4oeCA9PiAoeyBzaXplOiB4ICYmIHguc2l6ZSB8fCAwIH0pKSxcbiAgICAgICAgICAgICAgICBkZWxheShTTUFSVF9USU1FT1VUX1BST0JFKS50aGVuKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcHJvYmVFcnJvciA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICBhYmFuZG9uKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFJlYWQgb2YgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0OiBubyByZXN1bHQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMsIGFuZCBnZXRJbmZvICR7cHJvYmVFcnJvciAmJiBgZmFpbGVkICgke3Byb2JlRXJyb3J9KWAgfHwgYGNvdWxkIG5vdCBhbnN3ZXIgd2l0aGluICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBlaXRoZXJgfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbGxvd2VkID0gTWF0aC5tYXgoU01BUlRfVElNRU9VVF9QUk9CRSwgaW5mby5zaXplIC8gU01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EICogMTAwMCk7XG4gICAgICAgIGxldCByZW1haW5pbmcgPSBzdGFydCArIGFsbG93ZWQgLSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgbGV0IHNlY29uZCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KHJlbWFpbmluZykudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kKSByZXR1cm4gc2Vjb25kLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBSZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9ICgke2luZm8uc2l6ZX0gYnl0ZXMpIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXMgZnJvbSB0aGUgY2FsbCdzIHN0YXJ0LCBhdCBhbiBhc3N1bWVkICR7U01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EfSBieXRlcy9zKWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGFzdENvbmZpZ1JlZnJlc2ggPSAwO1xuICAgIHByaXZhdGUgYXN5bmMgcHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGU6IENoYWluU3RhdGUsIGtpbmQ6IFwid2luZG93XCIgfCBcInJvdXRlXCIgfCBcInVuY29uZmlndXJlZFwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChraW5kID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBuZWFyQm91bmRhcnkgPSBzdGF0ZS5zb3VyY2VzLnNvbWUoc291cmNlID0+IHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3cuc29tZSh0ID0+IHQgPiAwICYmIHQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBNYXRoLmFicyh0IC0gbm93KSA8PSBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XKSk7XG4gICAgICAgICAgICBpZiAobmVhckJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHJhY2VkIGEgdmFsaWQgd2luZG93IGJvdW5kYXJ5OyB3YWl0aW5nICR7V1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZIC8gMTAwMH1zIGFuZCByZXRyeWluZ2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0Q29uZmlnUmVmcmVzaCA8IENPTkZJR19SRUZSRVNIX1RIUk9UVExFKSByZXR1cm47XG4gICAgICAgIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgcmVhc29uID0ga2luZCA9PT0gXCJ3aW5kb3dcIiAmJiBcIndyb25nIHZhbGlkIHdpbmRvd1wiIHx8IGtpbmQgPT09IFwicm91dGVcIiAmJiBcIndyb25nIHJvdXRlXCIgfHwgXCJ0aGUgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZW50cnkgb24gdGhhdCBzZXJ2ZXJcIjtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKCR7cmVhc29ufSk6IG91ciBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIChsaWtlbHkgc3RhbGUsIG9yIGEgZGVwbG95IHN3aXRjaG92ZXIpOyByZWZyZXNoaW5nIGl0IGFuZCByZXRyeWluZ2ApO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlZnJlc2hBY3RpdmVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcXVlc3Q8VD4oY29uZmlnOiB7IGFwaU9ubHk/OiBib29sZWFuOyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyBub0ZhbGxiYWNrcz86IGJvb2xlYW47IGZhbGxiYWNrcz86IGJvb2xlYW47IGZhc3Q/OiBib29sZWFuOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKHN0YXRlLCBjb25maWcsIHJ1bik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdhaXRpbmdGb3JBY2Nlc3MoKTogUHJvbWlzZTx7IGxpbms6IHN0cmluZzsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBBIHNvdXJjZSB3aG9zZSB3aW5kb3cgaGFzIHBhc3NlZCBpcyBuZXZlciByZWFkIG9yIHdyaXR0ZW4gYWdhaW4sIHNvIGl0cyBhY2Nlc3Mgc3RhdGUgaXMgaXJyZWxldmFudCAtIGFuZCBhc2tpbmcgYSBkZWFkIGludGVybWVkaWF0ZSB3b3VsZCBqdXN0IGhhbmcgb3IgdGhyb3cuIEZ1dHVyZSB3aW5kb3dzIERPIG1hdHRlcjogYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIGJlZm9yZSB0aGVpciB3aW5kb3cgc3RhcnRzLlxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3dbMV0gPD0gRGF0ZS5ub3coKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLmFwaSBpbnN0YW5jZW9mIEFyY2hpdmVzUmVtb3RlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCBzb3VyY2UuYXBpLndhaXRpbmdGb3JBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAod2FpdGluZykgcmV0dXJuIHdhaXRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKiogZ2V0MiwgYnV0IHRyeWluZyBzb3VyY2VzIGluIGxhdGVuY3kgb3JkZXIgKGZhc3Rlc3QgZmlyc3QpIGluc3RlYWQgb2YgY29uZmlnIG9yZGVyLiBXaGlsZSB0aGlzIGlzIG11Y2ggZmFzdGVyLCBpdCBtaWdodCBtaXNzIGltbWVkaWF0ZSB3cml0ZXM6IHRoZSB3cml0ZSBub2RlIGlzIG5vIGxvbmdlciB0cmllZCBmaXJzdCwgc28gYSBsYWdnaW5nIHJlcGxpY2EgbWF5IGFuc3dlciB3aXRoIGEgc2xpZ2h0bHkgb2xkZXIgdmFsdWUuIEV4Y2x1c2l2ZSB3aXRoIG5vRmFsbGJhY2tzICh3aGljaCBvbmx5IGNvbnNpZGVycyBvbmUgc291cmNlIC0gdGhlIHdyaXRlIG5vZGUgLSBzbyB0aGVyZSBpcyBubyBvcmRlciB0byBzcGVlZCB1cCk7IHBhc3NpbmcgYm90aCB0aHJvd3MuICovXG4gICAgcHVibGljIGFzeW5jIGdldEZhc3QoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmcgfSB8IHsgZGF0YT86IHVuZGVmaW5lZDsgd3JpdGVUaW1lPzogdW5kZWZpbmVkOyBzaXplPzogdW5kZWZpbmVkOyB1cmw6IHN0cmluZyB9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgZmFzdDogdHJ1ZSwgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50IC0gc2VlIGdldDJcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqIEFsd2F5cyByZXNvbHZlcyB3aXRoIGEgdXJsIC0gdGhlIGF1dGhvcml0eSB0aGF0IGFuc3dlcmVkLiBBIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdCBpcyBzdGlsbCBhbiBhbnN3ZXIgRlJPTSBhIHNlcnZlciwgc28gaXQgY29tZXMgYmFjayBhcyB7IHVybCB9IHdpdGggbm8gZGF0YSAobmV2ZXIgcGxhaW4gdW5kZWZpbmVkKTsgZXJyb3JzIGZyb20gZXZlcnkgc291cmNlIHRocm93IGluc3RlYWQuICovXG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmcgfSB8IHsgZGF0YT86IHVuZGVmaW5lZDsgd3JpdGVUaW1lPzogdW5kZWZpbmVkOyBzaXplPzogdW5kZWZpbmVkOyB1cmw6IHN0cmluZyB9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh1bmxlc3MgdGhlIGNhbGxlciBhc2tlZCBmb3IgdG9tYnN0b25lcykgLSBhIHJhbmdlZCByZWFkIG9mIGEgUkVBTCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgdGhvdWdoIChyYW5nZSBwYXN0IEVPRiksIHdoaWNoIHRoZSB0b3RhbCBzaXplIGRpc3Rpbmd1aXNoZXNcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcyB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldEluZm8oZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgLi4ucmVzdWx0LCB1cmwgfSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdpdGhvdXQgZmFsbGJhY2tzOiB0aGUgQVVUSE9SSVRBVElWRSBjb3ZlcmluZyBPTkxZIC0gdGhlIGZpcnN0IHNvdXJjZSBwZXIgcm91dGUgaW4gY29uZmlnIG9yZGVyICh0aGUgc2FtZSBub2RlIGV2ZXJ5IHdyaXRlIGFuZCByZWFkIHRhcmdldHMpLCBkb3duIG9yIG5vdC4gSXQgaXMgTkVWRVIgZXhjbHVkZWQgYW5kIE5FVkVSIHN1YnN0aXR1dGVkLCBzbyBhIGxpc3RpbmcgdGhhdCBjYW4ndCByZWFjaCBpdHMgd3JpdGUgbm9kZXMgcmV0cmllcyB0aG9zZSBzYW1lIG5vZGVzIHVudGlsIHRoZSBkZWFkbGluZSBhbmQgdGhlbiBmYWlscywgcmF0aGVyIHRoYW4gcXVpZXRseSByZWFkaW5nIHNlY29uZC1oYW5kIGRhdGEgb2ZmIGEgcmVwbGljYSBvciBiYWNrYmxhemUuIGV4Y2x1ZGUvY29vbGRvd24vc3Vic3RpdHV0aW9uIGFwcGx5IE9OTFkgd2hlbiB0aGUgY2FsbGVyIG9wdGVkIGludG8gZmFsbGJhY2tzLlxuICAgIHByaXZhdGUgc2VsZWN0Q292ZXJpbmdTb3VyY2VzKHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc/OiB7IGZhbGxiYWNrcz86IGJvb2xlYW47IGV4Y2x1ZGU/OiBTZXQ8U291cmNlV3JhcHBlcj4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGlmIChjb25maWc/LmZhbGxiYWNrcykge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHguYXBpICYmICFjb25maWcuZXhjbHVkZT8uaGFzKHgpKTtcbiAgICAgICAgICAgIGxldCB1c2FibGUgPSBjYW5kaWRhdGVzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICAgICAgICAgIGxldCBjaG9zZW4gPSBjb3ZlclJvdXRlcyh1c2FibGUpIHx8IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKGNob3NlbikgcmV0dXJuIGNob3NlbjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgYXZhaWxhYmxlIHNvdXJjZXMgbGVhdmUgYSBnYXAgKHNvbWUgc2hhcmRzIGFyZSBkb3duIG9yIFVSTC1vbmx5KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYW5kaWRhdGVzID0gc3RhdGUuc291cmNlcy5maWx0ZXIoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiB4LmFwaSk7XG4gICAgICAgIGxldCBjaG9zZW4gPSBjb3ZlclJvdXRlcyhjYW5kaWRhdGVzKTtcbiAgICAgICAgaWYgKCFjaG9zZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgYXZhaWxhYmxlIHNvdXJjZXMgbGVhdmUgYSBnYXAgKHNvbWUgc2hhcmRzIGFyZSBkb3duIG9yIFVSTC1vbmx5KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaG9zZW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5PbkNvdmVyaW5nPFQ+KG9wZXJhdGlvbjogc3RyaW5nLCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+LCBjb25maWc/OiB7IGZhbGxiYWNrcz86IGJvb2xlYW4gfSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQ09WRVJJTkdfUkVUUllfVElNRU9VVDtcbiAgICAgICAgLy8gU291cmNlcyB0aGF0IGZhaWxlZCBkdXJpbmcgdGhpcyBjYWxsIC0gd2l0aCBmYWxsYmFja3MsIHRoZSBuZXh0IGF0dGVtcHQgY292ZXJzIHRoZWlyIHJvdXRlcyB3aXRoIHRoZSBuZXh0IHNvdXJjZSBob2xkaW5nIHRoZW0gaW5zdGVhZFxuICAgICAgICBsZXQgZmFpbGVkID0gbmV3IFNldDxTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBsZXQgdHJpZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJpZXMrKztcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIC8vIEVycm9ycyBuYW1lIHRoZSBPUEVSQVRJT04gYW5kIHRoZSBTUEVDSUZJQyBzb3VyY2VzIHRoYXQgZmFpbGVkIC0gXCJ0aGUgZmluZCBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgWCBpcyB1bmF2YWlsYWJsZVwiLCBuZXZlciBhbiBhbm9ueW1vdXMgZmFpbHVyZSBhdHRyaWJ1dGVkIHRvIHRoZSB3aG9sZSBjaGFpblxuICAgICAgICAgICAgbGV0IG91dGNvbWUgPSBhd2FpdCAoYXN5bmMgKCk6IFByb21pc2U8eyB2YWx1ZXM6IFRbXSB9IHwgeyBlcnJvcjogRXJyb3IgfT4gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb3ZlcmluZzogU291cmNlV3JhcHBlcltdO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdmVyaW5nID0gdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIHsgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgZXhjbHVkZTogZmFpbGVkIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGNhbm5vdCBydW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlczogVFtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGZhaWx1cmVzOiB7IHNvdXJjZTogU291cmNlV3JhcHBlcjsgZXJyb3I6IEVycm9yIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChjb3ZlcmluZy5tYXAoYXN5bmMgKHNvdXJjZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaSA9IHNvdXJjZS5hcGk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYWRkKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcy5wdXNoKHsgc291cmNlLCBlcnJvcjogbmV3IEVycm9yKGBVUkwtb25seSBhY2Nlc3MsIHdoaWNoIGNhbm5vdCBzZXJ2ZSAke29wZXJhdGlvbn1gKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goYXdhaXQgcnVuKGFwaSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5pc0Nvbm5lY3RlZCgpKSBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBlIGFzIEVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCBhZnRlciAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpfSBpbmRleCAke2luZGV4fSBvZiAke2NvdmVyaW5nLmxlbmd0aH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWx1cmVzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWVzIH07XG4gICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2Ugc291cmNlICR7ZmFpbHVyZXNbMF0uc291cmNlLmdldERlYnVnTmFtZSgpfSBpcyB1bmF2YWlsYWJsZTogJHtmYWlsdXJlc1swXS5lcnJvci5tZXNzYWdlID8/IGZhaWx1cmVzWzBdLmVycm9yfS4gRmFsbGJhY2tzID0gJHshIWNvbmZpZz8uZmFsbGJhY2tzfS4gVHJpZXMgPSAke3RyaWVzfSwgVG9vayAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZCBiZWNhdXNlICR7ZmFpbHVyZXMubGVuZ3RofSBvZiB0aGUgJHtjb3ZlcmluZy5sZW5ndGh9IGNvdmVyaW5nIHNvdXJjZXMgYXJlIHVuYXZhaWxhYmxlOiAke2ZhaWx1cmVzLm1hcCh4ID0+IGAke3guc291cmNlLmdldERlYnVnTmFtZSgpfTogJHt4LmVycm9yLm1lc3NhZ2UgPz8geC5lcnJvcn1gKS5qb2luKFwiIHwgXCIpfS4gRmFsbGJhY2tzID0gJHshIWNvbmZpZz8uZmFsbGJhY2tzfS4gVHJpZXMgPSAke3RyaWVzfSwgVG9vayAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCkgfTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICBpZiAoXCJ2YWx1ZXNcIiBpbiBvdXRjb21lKSByZXR1cm4gb3V0Y29tZS52YWx1ZXM7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBvdXRjb21lLmVycm9yO1xuICAgICAgICAgICAgLy8gU3Vic3RpdHV0aW9uIGNvbWVzIEJFRk9SRSB0aGUgZGVhZGxpbmUgY2hlY2s6IGEgc2luZ2xlIGNvbm5lY3QgdGltZW91dCBjYW4gZWF0IHRoZSBlbnRpcmUgZGVhZGxpbmUsIGFuZCBnaXZpbmcgdXAgdGhlbiAtIHdpdGhvdXQgZXZlciB0cnlpbmcgdGhlIHN1YnN0aXR1dGUgdGhhdCBmYWxsYmFja3MgZXhpc3QgZm9yIC0gdGhyb3dzIGV4YWN0bHkgd2hlbiBmYWxsaW5nIGJhY2sgbWF0dGVycyBtb3N0LiBTdWJzdGl0dXRpb24gY2Fubm90IGxvb3AgcGFzdCB0aGUgZGVhZGxpbmUgZm9yZXZlcjogZXZlcnkgcGFzcyBhZGRzIGl0cyBmYWlsdXJlcyB0byBgZmFpbGVkYCwgc28gdGhlIHN1YnN0aXR1dGVzIHJ1biBvdXQgd2l0aCB0aGUgc291cmNlcy5cbiAgICAgICAgICAgIGlmIChjb25maWc/LmZhbGxiYWNrcyAmJiBmYWlsZWQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIHsgZmFsbGJhY2tzOiB0cnVlLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAocmV0cnlpbmcgd2l0aCBmYWxsYmFja3MpICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIHN1YnN0aXR1dGUgY292ZXJzIHRoZSBmYWlsZWQgcm91dGVzIC0gcmV0cnkgdGhlIGZhaWxlZCBzb3VyY2VzIHRoZW1zZWx2ZXMgYWZ0ZXIgdGhlIGRlbGF5XG4gICAgICAgICAgICAgICAgZmFpbGVkLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtlcnJvci5tZXNzYWdlfS4gUmV0cnlpbmcgaW4gJHtDT1ZFUklOR19SRVRSWV9ERUxBWSAvIDEwMDB9cyAoZ2l2aW5nIHVwIGF0ICR7bmV3IERhdGUoZGVhZGxpbmUpLnRvSVNPU3RyaW5nKCl9KS5gKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShDT1ZFUklOR19SRVRSWV9ERUxBWSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGZpbmQgb2YgJHtKU09OLnN0cmluZ2lmeShwcmVmaXgpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzIH0pO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYFRoZSBjaGFuZ2VzIGxpc3Rpbmcgc2luY2UgJHtuZXcgRGF0ZShjb25maWcudGltZSkudG9JU09TdHJpbmcoKX1gLCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZykpO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgc3RhdHVzZXMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYFRoZSBzeW5jIHN0YXR1cyBjaGVja2AsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgIGlmICghYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcmNoaXZlcy5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHN0YXR1c2VzLmV2ZXJ5KHggPT4geC5hbGxTY2Fuc0NvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogc3RhdHVzZXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguaW5kZXhTaXplLCAwKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHN0YXR1c2VzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIXN0YXRlLnNvdXJjZXMuc29tZSh4ID0+IHguYXBpKSkgcmV0dXJuIHsgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IGF3YWl0IHRoaXMucnVuKHN0YXRlLCB7IGFwaU9ubHk6IHRydWUgfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0Q29uZmlnKCkpO1xuICAgICAgICByZXR1cm4geyAuLi5jb25maWcsIHJlbW90ZUNvbmZpZzogc3RhdGUuY29uZmlnIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghYXdhaXQgc291cmNlLmhhc1dyaXRlQWNjZXNzKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRSb3V0aW5nQ29uZmlnKGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoZmlsZU5hbWUpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldFZhcmlhYmxlU2hhcmQoZmlsZU5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gTEFSR0VfU0VUX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgLy8gU3RyZWFtZWQgYXV0b21hdGljYWxseSBzbyBjYWxsZXJzIG5ldmVyIGhhdmUgdG8gY2FsbCBzZXRMYXJnZUZpbGUgdGhlbXNlbHZlcyB3aGVuIHRoZXkgYWxyZWFkeSBob2xkIHRoZSBidWZmZXIgLSBvbmUgZ2lhbnQgbWVzc2FnZSB3b3VsZCBleGNlZWQgdGhlIHdpcmUgbGltaXQgYW5kIGxhZyBldmVyeSBvdGhlciBjbGllbnQgb24gdGhlIGNvbm5lY3Rpb24uIFRoZSB3aG9sZSBjb25maWcgZ29lcyB3aXRoIGl0IChpbmNsdWRpbmcgZmFsbGJhY2tzLCB3aGljaCB0aGUgYnVmZmVyJ3MgcmVzdGFydFN0cmVhbSBtYWtlcyBwb3NzaWJsZSk6IGEgZmlsZSBtdXN0IG5vdCBnZXQgZGlmZmVyZW50IHdyaXRlIHNlbWFudGljcyBqdXN0IGZvciBiZWluZyBiaWcuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldExhcmdlRmlsZSh7IHBhdGg6IGZpbGVOYW1lLCAuLi5jb25maWcsIC4uLmJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBVcGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9ICgke2RhdGEubGVuZ3RofSBieXRlcylgIH0gfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZpbGVOYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0Um91dGluZ0NvbmZpZyhkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBDaGVja2VkIGJlZm9yZSB0aGUgZmlyc3Qgbm9kZSBpcyB3cml0dGVuIHRvLCBub3QganVzdCBieSBlYWNoIG5vZGUgYXMgaXQgYXJyaXZlczogZXZlcnkgc2VydmVyIHdvdWxkIHJlamVjdCBpdCBhbnl3YXksIGFuZCBmaW5kaW5nIHRoYXQgb3V0IG9uZSBub2RlIGF0IGEgdGltZSBpcyBob3cgYSBjb25maWcgd3JpdGUgZW5kcyB1cCBoYWxmLWFwcGxpZWRcbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocGFyc2VSb3V0aW5nRGF0YShkYXRhKSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgIGxldCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBPbmUgd3JpdGUgcGVyIFNUT1JFLCBub3QgcGVyIHNlcnZlcjogdGhlIHdyaXRlIGxhbmRzIGluIHRoZSBzdG9yZSB0aGUgZW50cnkgTkFNRVMsIHNvIHR3byBlbnRyaWVzIHNoYXJpbmcgYSBVUkwgYnV0IG5hbWluZyBkaWZmZXJlbnQgc3RvcmVzIGFyZSB0d28gc2VwYXJhdGUgZGVsaXZlcmllcyAtIGRlZHVwaW5nIGJ5IFVSTCBhbG9uZSBsZWF2ZXMgdGhlIHNlY29uZCBzdG9yZSB1bmNvbmZpZ3VyZWQgZm9yZXZlclxuICAgICAgICBsZXQgdGFyZ2V0czogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGxldCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gYCR7c291cmNlLmNvbmZpZy51cmx9fCR7c291cmNlLmNvbmZpZy5uYW1lfWA7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRpbmcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSB0byBhbGwgJHt0YXJnZXRzLmxlbmd0aH0gc3RvcmVzICh3cml0ZSB0aW1lICR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSk6ICR7ZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc2xpY2UoMCwgMjAwMCl9YCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBgJHtzb3VyY2UuY29uZmlnLnVybH0gKHN0b3JlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5uYW1lKX0pYDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSkpO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIHRvICR7bGFiZWx9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7bGFiZWx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHJvdXRpbmcgY29uZmlnIHdyaXRlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZCBvbiAke2Vycm9ycy5sZW5ndGh9IG9mICR7dGFyZ2V0cy5sZW5ndGh9IHN0b3JlcyAoc3VjY2VlZGVkIG9uOiAke3dyaXR0ZW4uam9pbihcIiwgXCIpIHx8IFwibm9uZVwifSk6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJPVVRJTkdfRklMRTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBEZWxDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHsgd3JpdGU6IHRydWUsIGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IDAsIGxhYmVsOiBgRGVsZXRpb24gb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9YCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSwgY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBJQXJjaGl2ZXMubW92ZS4gV2hlbiBvbmUgbm9kZSBpcyB0aGUgd3JpdGUgdGFyZ2V0IGZvciBCT1RIIHBhdGhzLCB0aGF0IG5vZGUgbW92ZXMgdGhlIGZpbGUgaXRzZWxmIC0gdGhlIGJ5dGVzIG5ldmVyIGNvbWUgdGhyb3VnaCB1cyAtIHdpdGggdGhlIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24gYXMgYW55IHdyaXRlLiBXaGVuIHRoZSBwYXRocyByb3V0ZSB0byBkaWZmZXJlbnQgc2hhcmRzIG5vIHNpbmdsZSBub2RlIGhvbGRzIGJvdGgsIHNvIHRoZSBtb3ZlIGRlZ3JhZGVzIHRvIGEgY29weSB0aHJvdWdoIHVzIHBsdXMgYSBkZWxldGUsIENPTkZJUk1FRCBhdCB0aGUgZGVzdGluYXRpb24gYmVmb3JlIHRoZSBzb3VyY2UgaXMgdG91Y2hlZC4gTm8gc21hcnQgdGltZW91dCBvbiB0aGUgbm9kZS1zaWRlIG1vdmU6IGl0IGNhbiBiZSBhIGJpZyBmaWxlJ3Mgd29ydGggb2Ygbm9kZS1zaWRlIHdvcmssIHdoaWNoIHRoZSB1cGxvYWQtc2l6ZWQgZGVhZGxpbmVzIHdvdWxkIG1pc2p1ZGdlLiAqL1xuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzogTW92ZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmcm9tUm91dGUgPSBnZXRSb3V0ZShjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICBsZXQgdG9Sb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBmcm9tUm91dGUpKTtcbiAgICAgICAgaWYgKHRhcmdldCAmJiByb3V0ZUNvbnRhaW5zKHRhcmdldC5jb25maWcucm91dGUsIHRvUm91dGUpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGZyb21Sb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5tb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcmNoaXZlcy5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3Qgc3VwcG9ydCBtb3ZlIChtb3ZpbmcgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgYXJjaGl2ZXMubW92ZShjb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5saW5lIHJhdGhlciB0aGFuIG1vdmVBcmNoaXZlRmlsZSwgd2hpY2ggLSBnaXZlbiBvbmUgYXJjaGl2ZXMgdGhhdCBpbXBsZW1lbnRzIG1vdmUgLSB3b3VsZCBqdXN0IGNhbGwgYmFjayBpbnRvIHRoaXMgbWV0aG9kXG4gICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiB0aGlzLCB0bzogdGhpcywgcGF0aDogY29uZmlnLmZyb21QYXRoLCB0b1BhdGg6IGNvbmZpZy50b1BhdGggfSk7XG4gICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX06IHRoZSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBleGlzdCBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhjb25maWcudG9QYXRoKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gYWZ0ZXIgY29weWluZyBpdCB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IHJlcG9ydCBpdCAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSkgLSB0aGUgZmlsZSBpcyBsZWZ0IGF0IHRoZSBzb3VyY2VgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmRlbChjb25maWcuZnJvbVBhdGgpO1xuICAgIH1cblxuICAgIC8vIE9uZSB3cml0ZSB0YXJnZXQgcGVyIHJvdXRlIHJhbmdlLCBsb3dlc3QgbGF0ZW5jeSBmaXJzdC4gV2l0aGluIGEgc2hhcmQgdGhlIHRhcmdldCBpcyBBTFdBWVMgdGhlIGZpcnN0IHNvdXJjZSBpbiBjb25maWcgb3JkZXIgKHNlZSBydW5QcmltYXJ5IC0gd3JpdGVzIG11c3Qgc3RheSBvbiB0aGUgc2FtZSBub2RlKTogY29ubmVjdGl2aXR5IG9ubHkgZGVjaWRlcyB3aGljaCBTSEFSRCB3ZSBwaWNrLCBuZXZlciB3aGljaCBub2RlIHdpdGhpbiBpdCwgc28gYSBzaGFyZCB3aG9zZSBub2RlIGlzIGRpc2Nvbm5lY3RlZCBpcyBkcm9wcGVkIGVudGlyZWx5IHdoZW4gY29ubmVjdGVkT25seSBpcyBzZXQuXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGNvbm5lY3RlZE9ubHk6IGJvb2xlYW4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldHNCeVJvdXRlLmhhcyhyb3V0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RlZE9ubHkpIHtcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcih4ID0+IHguaXNDb25uZWN0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBrZXkgc2V0VmFyaWFibGVTaGFyZCB3b3VsZCBtYXRlcmlhbGl6ZSBmb3IgdGhpcyBWQVJJQUJMRV9TSEFSRCBrZXkgKGEgdmFsdWUgaW4gdGhlIHByZWZlcnJlZCBzaGFyZCdzIHJvdXRlIHJhbmdlKSwgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRTaGFyZEtleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSB8fCBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFNoYXJkS2V5IHJlcXVpcmVzIGEga2V5IGNvbnRhaW5pbmcgYW4gdW5tYXRlcmlhbGl6ZWQgJHtKU09OLnN0cmluZ2lmeShWQVJJQUJMRV9TSEFSRCl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogdHJ1ZSB9KVswXVxuICAgICAgICAgICAgfHwgdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiBmYWxzZSB9KVswXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBzbyB0aGVyZSBpcyBubyBzaGFyZCB0byBtYXRlcmlhbGl6ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IGludG9gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCB0YWxraW5nIHRvIGEgc2hhcmQgd2hvc2Ugbm9kZSB3YXMgZmFzdCBidXQgaXMgbm93IGRpc2Nvbm5lY3RlZCAtIG9ubHkgd2hlbiBubyBjb25uZWN0ZWQgc2hhcmQgd29ya3MgZG8gd2UgcmVjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRyeSBldmVyeSBzaGFyZFxuICAgICAgICBsZXQgY29ubmVjdGVkT25seSA9IHRydWU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBmdWxsS2V5ID0gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNoYXJkIHBpY2tpbmcgYWxyZWFkeSByZXRyaWVzIGFjcm9zcyBzaGFyZHMsIHNvIGEgc3R1Y2sgc2hhcmQganVzdCBjb3N0cyBpdHMgdGltZW91dCBhbmQgd2UgbW92ZSBvbi4gTGFyZ2UgZGF0YSBzdHJlYW1zIHZpYSBzZXRMYXJnZUZpbGUgLSB0aGUga2V5IGlzIGFscmVhZHkgbWF0ZXJpYWxpemVkIGhlcmUsIHNvIHRoZSBuby1WQVJJQUJMRV9TSEFSRCByZXN0cmljdGlvbiBvbiBzZXRMYXJnZUZpbGUgZG9lc24ndCBhcHBseS5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dCh7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBWYXJpYWJsZS1zaGFyZCB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmdWxsS2V5KX0gKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWAgfSwgdGFyZ2V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmdWxsS2V5LCAuLi5jb25maWcsIC4uLmJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZ1bGxLZXksIGRhdGEsIGNvbmZpZykpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsS2V5O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0OyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gaXMgZG93bjsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkYCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRPbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IHZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGFjY2VwdCB3cml0ZXNcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGxhcmdlIGZpbGUgaXMgd3JpdHRlbiBleGFjdGx5IGxpa2UgYSBzbWFsbCBvbmUgLSBzYW1lIHdyaXRlIG5vZGUsIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24sIHNhbWUgZmFsbGJhY2tzIC0gc28gYSB2YWx1ZSdzIFNJWkUgbmV2ZXIgZGVjaWRlcyBpdHMgd3JpdGUgc2VtYW50aWNzIChzZXQgc3RyZWFtcyB0aHJvdWdoIGhlcmUgcGFzdCBMQVJHRV9TRVRfVEhSRVNIT0xELCBhbmQgYSBmaWxlIHRoYXQgZ3JldyBwYXN0IGl0IG11c3Qgbm90IHN1ZGRlbmx5IGxvc2UgdGhlIGF2YWlsYWJpbGl0eSBpdHMgY2FsbGVyIGFza2VkIGZvcikuIFRoZSBvbmUgZGlmZmVyZW5jZTogZXZlcnkgYXR0ZW1wdCBhZnRlciB0aGUgZmlyc3QgaGFzIHRvIHJld2luZCB0aGUgc3RyZWFtLCBzbyBhIGNvbmZpZyB3aXRob3V0IHJlc3RhcnRTdHJlYW0gZ2V0cyBhIHNpbmdsZSBhdHRlbXB0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbSA9IGNvbmZpZy5yZXN0YXJ0U3RyZWFtO1xuICAgICAgICBpZiAoIXJlc3RhcnRTdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlT25jZShjb25maWcsIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZy5mYWxsYmFja3MsIHJvdXRlIH0sIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBhdHRlbXB0IGNvbnN1bWVkIHNvbWUgKG9yIGFsbCkgb2YgdGhlIHN0cmVhbSwgYW5kIHRoaXMgc291cmNlIG5lZWRzIHRoZSBmaWxlIGZyb20gaXRzIGZpcnN0IGJ5dGVcbiAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gMSkgYXdhaXQgcmVzdGFydFN0cmVhbSgpO1xuICAgICAgICAgICAgYXdhaXQgd2F0Y2hTbG93UHJvbWlzZShgc2V0TGFyZ2VGaWxlfCR7Y29uZmlnLnBhdGh9YCwgYXJjaGl2ZXMuc2V0TGFyZ2VGaWxlKGNvbmZpZykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBIHN0cmVhbSB0aGF0IGNhbm5vdCByZXdpbmQgZ2V0cyBleGFjdGx5IE9ORSBhdHRlbXB0IGF0IHRoZSB3cml0ZSBub2RlOiByZXRyeWluZyBhbnl3aGVyZSAoYW5vdGhlciBzb3VyY2UsIG9yIHRoaXMgb25lIGFnYWluKSB3b3VsZCBzZW5kIHdoYXRldmVyIGlzIGxlZnQgb2YgYW4gYWxyZWFkeS1jb25zdW1lZCBzdHJlYW0gYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgZmlsZS5cbiAgICBwcml2YXRlIGFzeW5jIHNldExhcmdlRmlsZU9uY2UoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcsIHJvdXRlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIHJvdXRlKSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgZm9yIHNldExhcmdlRmlsZSBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IChyb3V0ZSAke3JvdXRlfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2F0Y2hTbG93UHJvbWlzZShgc2V0TGFyZ2VGaWxlfCR7Y29uZmlnLnBhdGh9YCwgdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxzID0gYXdhaXQgdGhpcy5nZXRVUkxzKHBhdGgpO1xuICAgICAgICBpZiAoIXVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHB1YmxpYyBzb3VyY2UgY292ZXJpbmcgcm91dGUgJHtnZXRSb3V0ZShwYXRoKX0gdG8gYnVpbGQgYSBVUkwgZnJvbSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmxzWzBdO1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBVUkwgdGhhdCBjb3VsZCBzZXJ2ZSB0aGlzIHBhdGg6IHB1YmxpYyBzb3VyY2VzIG1hdGNoaW5nIGJvdGggdGhlIHBhdGgncyByb3V0ZSBhbmQgdGhlIGN1cnJlbnQgdmFsaWQgd2luZG93LiBUaGUgZmlyc3QgaXMgdGhlIHdyaXRlIG5vZGUncyAoZmlyc3QgbWF0Y2hpbmcgc291cmNlIGluIGNvbmZpZyBvcmRlciwgc2VlIHJ1blByaW1hcnkgLSB0aGUgb25lIGd1YXJhbnRlZWQgY3VycmVudCk7IHRoZSByZXN0IGFyZSByYW5rZWQgZmFzdGVzdC1maXJzdCBieSBtZWFzdXJlZCBsYXRlbmN5LiBFbXB0eSB3aGVuIG5vbmUgcXVhbGlmeS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRHZXRVUkxzKCkpKHBhdGgpO1xuICAgIH1cblxuICAgIC8qKiBnZXRVUkxzLCBidXQgYWZ0ZXIgdGhlIG9uZSBhd2FpdCAoaW5pdGlhbGl6YXRpb24pIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcyBzeW5jaHJvbm91czogZXZlcnl0aGluZyB1bmRlcm5lYXRoIC0gcm91dGUgaGFzaGluZywgd2luZG93IGNoZWNrcywgbGF0ZW5jaWVzLCBVUkwgYnVpbGRpbmcgLSBpcyBzeW5jaHJvbm91cywgYW5kIHRoZSBjbG9zdXJlIGFsd2F5cyByZWFkcyB0aGUgbmV3ZXN0IGFkb3B0ZWQgY29uZmlnLCBzbyBpdCBzdGF5cyBjb3JyZWN0IGFjcm9zcyBjb25maWcgcmVmcmVzaGVzLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRHZXRVUkxzKCk6IFByb21pc2U8KHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW10+IHtcbiAgICAgICAgbGV0IGluaXRpYWxTdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlLCB7IHdyaXRlTm9kZUZpcnN0OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKiBnZXRHZXRVUkxzLCBidXQgc29ydGVkIHB1cmVseSBieSBsYXRlbmN5IC0gdGhlIHdyaXRlIG5vZGUgZ2V0cyBubyBzcGVjaWFsIGZpcnN0IHBvc2l0aW9uLiBGb3IgcmVhZC1vbmx5IGNvbnN1bWVycyB0aGF0IGp1c3Qgd2FudCB0aGUgZmFzdGVzdCBob3N0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRHZXRGYXN0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlR2V0VVJMcyhpbml0aWFsU3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyB3cml0ZU5vZGVGaXJzdDogYm9vbGVhbiB9KTogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZS5sYXRlc3QoKSB8fCBpbml0aWFsU3RhdGU7XG4gICAgICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShwYXRoKTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoc291cmNlLmNvbmZpZy5wdWJsaWMgPz8gdHJ1ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgb3JkZXJlZDogU291cmNlV3JhcHBlcltdO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy53cml0ZU5vZGVGaXJzdCkge1xuICAgICAgICAgICAgICAgIGxldCByZXN0ID0gc291cmNlcy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzb3J0KHJlc3QsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4uc291cmNlcy5zbGljZSgwLCAxKSwgLi4ucmVzdF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4uc291cmNlc107XG4gICAgICAgICAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB1cmxzID0gb3JkZXJlZC5tYXAoeCA9PiBidWlsZEZpbGVVcmwoZ2V0QnVja2V0QmFzZVVybCh4LmNvbmZpZy51cmwpLCBwYXRoKSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQodXJscyldO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlLmRpc3Bvc2UoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcmNoaXZlcyhjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UsIG9wdGlvbnM/OiBBcmNoaXZlc0NoYWluT3B0aW9ucyk6IEFyY2hpdmVzQ2hhaW4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNDaGFpbihjb25maWcsIG9wdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxsU2VydmVyPFQ+KHVybDogc3RyaW5nLCBydW46IChjb250cm9sbGVyOiB0eXBlb2YgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbc3RyaW5nXSkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIFNvY2tldEZ1bmN0aW9uLkVOQUJMRV9DTElFTlRfTU9ERSA9IHRydWU7XG4gICAgbGV0IHBhcnNlZCA9IHBhcnNlU3RvcmFnZVVybCh1cmwpO1xuICAgIGxldCBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5jb25uZWN0KHsgYWRkcmVzczogcGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHBhcnNlZC5wb3J0IH0pO1xuICAgIGxldCBjb250cm9sbGVyID0gUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbbm9kZUlkXTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGNvbnRyb2xsZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCFTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB0aHJvdyBlO1xuICAgICAgICBhd2FpdCBhdXRoZW50aWNhdGVTdG9yYWdlKHsgYWRkcmVzczogcGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHBhcnNlZC5wb3J0LCBub2RlSWQgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW4oY29udHJvbGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZlckJ1Y2tldHMoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8U2VydmVyQnVja2V0SW5mb1tdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmxpc3RCdWNrZXRzKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQgfSkpO1xufVxuXG4vKiogVGhlIGxpdmUsIGluLW1lbW9yeSBzdGF0ZSBvZiBvbmUgYnVja2V0IG9uIGEgc2VydmVyIChyb3V0aW5nIGNvbmZpZyBpbmNsdWRlZCksIG9yIGEgc3RyaW5nIHNheWluZyB3aHkgaXQgaXMgdW5hdmFpbGFibGUuIENoZWFwIC0gaXQgbmV2ZXIgdG91Y2hlcyB0aGUgc2VydmVyJ3MgZGlzayAtIGJ1dCBvbmx5IHdvcmtzIHdoaWxlIHRoYXQgYnVja2V0IGlzIGxvYWRlZCB0aGVyZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTZXJ2ZXJBY3RpdmVCdWNrZXQoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmdldEFjdGl2ZUJ1Y2tldCh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBidWNrZXROYW1lOiBjb25maWcuYnVja2V0TmFtZSB9KSk7XG59XG5cbi8qKiBUaGUgYnVja2V0cyBhIHNlcnZlciBjdXJyZW50bHkgaGFzIGxvYWRlZC4gQWRtaW4gb25seSwgc28gaW4gcHJhY3RpY2UgdGhpcyBpcyBvdXIgb3duIG1hY2hpbmUncyBvdGhlciBwcm9jZXNzIC0gYSBkZXBsb3kgc3VjY2Vzc29yIGFza2luZyBpdHMgcHJlZGVjZXNzb3Igd2hhdCBpcyBhY3R1YWxseSBpbiB1c2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZlckFjdGl2ZUJ1Y2tldEtleXMoY29uZmlnOiB7IHVybDogc3RyaW5nIH0pOiBQcm9taXNlPHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmFkbWluTGlzdEFjdGl2ZUJ1Y2tldHMoKSk7XG59XG5cbi8qKiBUZWxscyBhIHNlcnZlciB0byBsb2FkIG9uZSBvZiBpdHMgYnVja2V0cyBpbnRvIG1lbW9yeSAoc3RhcnRpbmcgaXRzIHN5bmNocm9uaXphdGlvbikgYW5kIHJldHVybnMgaXRzIGxpdmUgc3RhdGUsIG9yIGEgc3RyaW5nIHNheWluZyB3aHkgaXQgY291bGQgbm90IGJlIGxvYWRlZC4gT25seSB0b3VjaGVzIHRoYXQgc2VydmVyIC0gbm90aGluZyBpcyB3cml0dGVuIGFuZCBubyBvdGhlciBzb3VyY2UgaXMgY29udGFjdGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlU2VydmVyQnVja2V0KGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5hY3RpdmF0ZUJ1Y2tldCh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBidWNrZXROYW1lOiBjb25maWcuYnVja2V0TmFtZSB9KSk7XG59XG5cbi8qKiBaZXJvZXMgdGhlIHdyaXRlIHN0YXRpc3RpY3MgbGlzdFNlcnZlckJ1Y2tldHMgcmVwb3J0cywgZm9yIGV2ZXJ5IGJ1Y2tldCBpbiB0aGUgYWNjb3VudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhclNlcnZlcldyaXRlU3RhdHMoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyBjbGVhcmVkQnVja2V0czogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuY2xlYXJXcml0ZVN0YXRzKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQgfSkpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0SW5mbyhjb25maWc6IHsgdXJsOiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAvLyBnZXRDb25maWcgaXMgYnVja2V0LWxldmVsIChubyBzdG9yZSBzZWxlY3Rpb24pLCBzbyB0aGUgZmFicmljYXRlZCBzb3VyY2VDb25maWcgbmV2ZXIgaGFzIHRvIG1hdGNoIGFueXRoaW5nXG4gICAgbGV0IHJlbW90ZSA9IG5ldyBBcmNoaXZlc1JlbW90ZSh7IHVybDogY29uZmlnLnVybCwgd2FpdEZvckFjY2VzczogZmFsc2UsIHNvdXJjZUNvbmZpZzogbm9ybWFsaXplU291cmNlKGNvbmZpZy51cmwpIH0pO1xuICAgIHJldHVybiBhd2FpdCByZW1vdGUuZ2V0Q29uZmlnKCk7XG59XG4iXX0=
|
|
800
|
-
/* _JS_SOURCE_HASH = "
|
|
816
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBa0U7QUFDbEUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixzREFBb0Q7QUFDcEQsaURBSXdCO0FBQ3hCLCtDQUE0QztBQUM1QyxtRUFBZ0U7QUFDaEUscURBQXdGO0FBRXhGLDJEQUF5RjtBQUV6RixpREFBK0Q7QUFDL0Qsa0VBQW1FO0FBRW5FLHlRQUF5UTtBQUN6USxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUNuQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwRCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLHdKQUF3SjtBQUN4SixNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdEMsNkdBQTZHO0FBQzdHLE1BQU0sdUNBQXVDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM1RCxNQUFNLHFDQUFxQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDekQsb0pBQW9KO0FBQ3BKLE1BQU0sb0JBQW9CLEdBQUcsK0JBQStCLENBQUM7QUFVN0QscU5BQXFOO0FBQ3JOLCtDQUFxRjtBQUE1RSw4R0FBQSxjQUFjLE9BQUE7QUFB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LEVBQUUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFGRCxnRUFFQztBQUVELHNQQUFzUDtBQUMvTyxLQUFLLFVBQVUsb0JBQW9CLENBQUMsTUFBNEQ7SUFDbkcsT0FBTyxNQUFNLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdJLENBQUM7QUFGRCxvREFFQztBQUVELDhGQUE4RjtBQUN2RixLQUFLLFVBQVUscUJBQXFCLENBQUMsTUFBd0M7SUFDaEYsT0FBTyxNQUFNLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9HLENBQUM7QUFGRCxzREFFQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBdUI7SUFDdkQsNkdBQTZHO0lBQzdHLElBQUksTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RILE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUpELHNDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydCwgd2F0Y2hTbG93UHJvbWlzZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBSZW1vdGVDb25maWcsIFJlbW90ZUNvbmZpZ0Jhc2UsIFNvdXJjZUNvbmZpZyxcbiAgICBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRGVsQ29uZmlnLCBGaW5kQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIE1vdmVGaWxlQ29uZmlnLCBTZXRDb25maWcsIFNldExhcmdlRmlsZUNvbmZpZywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsIExBUkdFX1NFVF9USFJFU0hPTEQsIGJ1ZmZlckNodW5rU3RyZWFtLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIHBhcnNlUm91dGluZ0RhdGEsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLFxuICAgIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplU291cmNlLFxuICAgIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCBwYXJzZVZhcmlhYmxlUm91dGUsIGdldEJ1Y2tldEJhc2VVcmwsIGJ1aWxkRmlsZVVybCxcbn0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlLCBwYXJzZVN0b3JhZ2VVcmwsIGF1dGhlbnRpY2F0ZVN0b3JhZ2UgfSBmcm9tIFwiLi9BcmNoaXZlc1JlbW90ZVwiO1xuaW1wb3J0IHsgU2VydmVyQnVja2V0SW5mbywgQWN0aXZlQnVja2V0SW5mbyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcbmltcG9ydCB7IENoYWluU3RhdGUsIENoYWluU3RhdGVNYW5hZ2VyIH0gZnJvbSBcIi4vY2hhaW5TdGFydHVwXCI7XG5pbXBvcnQgeyBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcblxuLy8gSG93IG1hbnkgZXh0cmEgZnVsbCBwYXNzZXMgb3ZlciB0aGUgc291cmNlcyBmYWxsYmFjayBkaXNwYXRjaCBtYWtlcyB3aGVuIEVWRVJZIHNvdXJjZSBpbiBhIHBhc3MgZmFpbGVkLCBiZWZvcmUgdGhlIG9wZXJhdGlvbiB0aHJvd3MgKHNlZSBHZXRDb25maWcucmV0cmllcykgLSBtb3N0IHJlcXVlc3RzIHNob3VsZG4ndCBmYWlsIGF0IGFsbCwgc28gYSBjb3VwbGUgb2YgYmxhbmtldCByZXRyaWVzIGJ1eXMgYXZhaWxhYmlsaXR5IGZvciBhbG1vc3Qgbm90aGluZ1xuY29uc3QgREVGQVVMVF9GQUxMQkFDS19SRVRSSUVTID0gMztcbmNvbnN0IEZBTExCQUNLX1JFVFJZX0RFTEFZID0gMiAqIDEwMDA7XG5jb25zdCBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XID0gMzAgKiAxMDAwO1xuY29uc3QgV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZID0gMTUgKiAxMDAwO1xuY29uc3QgQ09ORklHX1JFRlJFU0hfVEhST1RUTEUgPSAzMCAqIDEwMDA7XG5jb25zdCBQUklNQVJZX1JFVFJZX1RJTUVPVVQgPSAzMCAqIDEwMDA7XG5jb25zdCBQUklNQVJZX1JFVFJZX0RFTEFZID0gMiAqIDEwMDA7XG5jb25zdCBDT1ZFUklOR19SRVRSWV9USU1FT1VUID0gMzAgKiAxMDAwO1xuY29uc3QgQ09WRVJJTkdfUkVUUllfREVMQVkgPSA1ICogMTAwMDtcbi8vIFNtYXJ0IHRpbWVvdXRzOiBhbiBhdHRlbXB0IGdldHMgdGhpcyBsb25nIHRvIHByb2R1Y2UgYW55dGhpbmcgYmVmb3JlIHdlIHByb2JlIGdldEluZm8gZm9yIHRoZSBmaWxlJ3Mgc2l6ZSAoYW5kIHRoZSBwcm9iZSBpdHNlbGYgZ2V0cyB0aGUgc2FtZSB3aW5kb3cpXG5jb25zdCBTTUFSVF9USU1FT1VUX1BST0JFID0gNjAgKiAxMDAwO1xuLy8gVmVyeSBnZW5lcm91cyBhc3N1bWVkIHRyYW5zZmVyIHJhdGVzIC0gdGhlIHJlc3VsdGluZyBkZWFkbGluZSBleGlzdHMgdG8gY2F0Y2ggc3R1Y2sgc291cmNlcywgbm90IHNsb3cgb25lc1xuY29uc3QgU01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EID0gMTAyNCAqIDEwMjQ7XG5jb25zdCBTTUFSVF9USU1FT1VUX1VQTE9BRF9CWVRFU19QRVJfU0VDT05EID0gNTEyICogMTAyNDtcbi8vIE1hcmtlciBpbiBzbWFydC10aW1lb3V0IGVycm9ycywgc28gdGhlIHJlYWQgbG9vcCBjYW4gbG9nIHRoZW0gYW5kIGNvbnRpbnVlIHdpdGggdGhlIG90aGVyIHNvdXJjZXMgKGEgY29ubmVjdGVkIHNvdXJjZSdzIG90aGVyIGVycm9ycyBzdGlsbCB0aHJvdylcbmNvbnN0IFNNQVJUX1RJTUVPVVRfTUFSS0VSID0gXCJBUkNISVZFU19TTUFSVF9USU1FT1VUX2M0MWE5ZFwiO1xuXG4vLyBTaXplcyBhIGdlbmVyb3VzIHBlci1hdHRlbXB0IGRlYWRsaW5lLiBHZXQtc3R5bGUgY2FsbHMgcGFzcyBwYXRoOiB0aGUgc2l6ZSBpcyBvbmx5IGZldGNoZWQgKHZpYSBnZXRJbmZvKSB3aGVuIHRoZSBjYWxsIHR1cm5zIG91dCB0byBiZSBzbG93LiBTZXQtc3R5bGUgY2FsbHMgcGFzcyB1cGxvYWRCeXRlcywgd2hpY2ggdGhleSBhbHJlYWR5IGtub3cuXG50eXBlIFNtYXJ0VGltZW91dCA9IHtcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHVwbG9hZEJ5dGVzPzogbnVtYmVyO1xuICAgIC8vIE5hbWVzIHRoZSBvcGVyYXRpb24gaW4gdGltZW91dCBlcnJvcnMgLSB3aXRob3V0IGl0IGEgZGVsZXRpb24gKGEgdG9tYnN0b25lIHdyaXRlLCB1cGxvYWRCeXRlcyAwKSByZWFkcyBhcyBcIlVwbG9hZCBvZiAwIGJ5dGVzXCIsIHdoaWNoIGxvb2tzIGxpa2UgYSBidWcgcmF0aGVyIHRoYW4gYSBkZWxldGVcbiAgICBsYWJlbD86IHN0cmluZztcbn07XG5cbi8qKiBUaGUgYWRkcmVzcywgcG9ydCwgYWNjb3VudCwgYW5kIGJ1Y2tldCBuYW1lIGEgYnVja2V0IHJvdXRpbmcgVVJMIGFkZHJlc3Nlcy4gVGhyb3dzIHdoZW4gdGhlIFVSTCBpc24ndCBhIGhvc3RlZCBidWNrZXQgcm91dGluZyBVUkwgKGh0dHBzOi8vaG9zdDpwb3J0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPi9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb24pLiAqL1xuZXhwb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsLCBnZXRCdWNrZXRCYXNlVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5cbi8qKiBBIGNsaWVudCBmb3IgT05FIHNvdXJjZSAtIHNlZSBzdG9yZVNvdXJjZXMudHMuIFJlLWV4cG9ydGVkIGhlcmUgYmVjYXVzZSBhIGNoYWluIGlzIGJ1aWx0IG91dCBvZiB0aGVtLiAqL1xuZXhwb3J0IHsgY3JlYXRlQXBpQXJjaGl2ZXMgfSBmcm9tIFwiLi9zdG9yZVNvdXJjZXNcIjtcblxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNDaGFpbk9wdGlvbnMgPSB7XG4gICAgLyoqIE91dHNpZGUgb2Ygbm9kZSB3ZSBkZWZhdWx0IHRvIHJlYWQtb25seSBkb3dubG9hZHMgb3ZlciB0aGUgcHVibGljIFVSTHMgKG5vIEFQSSBjb25uZWN0aW9uKSB3aGVuIHRoZSBjb25maWcgaGFzIHB1YmxpYyBzb3VyY2VzLiBTZXQgdGhpcyB0byBjb25uZWN0IHRvIHRoZSBBUEkgYW55d2F5IC0gbmVlZGVkIGZvciB3cml0aW5nLCBsaXN0aW5nLCBhbmQgYW55IG90aGVyIG9wZXJhdGlvbiB0aGUgcGxhaW4gVVJMIGZvcm0gY2Fubm90IHNlcnZlLiAqL1xuICAgIGRpcmVjdENvbm5lY3Q/OiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gY29uZmlnV2luZG93Q3VycmVudChjb25maWc6IFNvdXJjZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBbc3RhcnQsIGVuZF0gPSBjb25maWcudmFsaWRXaW5kb3c7XG4gICAgcmV0dXJuIHN0YXJ0IDw9IG5vdyAmJiBub3cgPCBlbmQ7XG59XG5cbmZ1bmN0aW9uIG1hdGVyaWFsaXplU2hhcmRLZXkoa2V5OiBzdHJpbmcsIHRhcmdldDogU291cmNlV3JhcHBlcik6IHN0cmluZyB7XG4gICAgbGV0IFtzdGFydCwgZW5kXSA9IHRhcmdldC5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoVkFSSUFCTEVfU0hBUkQsIFZBUklBQkxFX1NIQVJEICsgXCJfXCIgKyAoc3RhcnQgKyBNYXRoLnJhbmRvbSgpICogKGVuZCAtIHN0YXJ0KSkpO1xufVxuXG4vKiogQ292ZXJzIHRoZSB3aG9sZSBrZXkgc3BhY2Ugd2l0aCB0aGUgQVVUSE9SSVRBVElWRSBzb3VyY2VzOiBmb3IgZWFjaCB1bmNvdmVyZWQgcG9pbnQsIHRoZSBGSVJTVCBzb3VyY2UgaW4gY29uZmlnIG9yZGVyIHdob3NlIHJvdXRlIGNvbnRhaW5zIGl0IC0gdGhlIGV4YWN0IHNlbGVjdGlvbiBldmVyeSByZWFkIGFuZCB3cml0ZSB1c2VzLCBzbyBsaXN0aW5ncyBjb21lIGZyb20gdGhlIHNhbWUgbm9kZXMgd3JpdGVzIHdlbnQgdG8gKHJlYWQteW91ci13cml0ZXMpLiBOZXZlciBcImZld2VzdFwiIG9yIFwid2lkZXN0XCI6IHByZWZlcnJpbmcgYSB3aWRlIHJlYWQgcmVwbGljYSBvdmVyIHRoZSByb3V0ZWQgd3JpdGUgc2hhcmRzIHdvdWxkIHNlcnZlIGxpc3RpbmdzIGZyb20gYSBub2RlIHRoYXQgb25seSBoYXMgdGhlIGRhdGEgc2Vjb25kLWhhbmQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGNhbmRpZGF0ZXMgbGVhdmUgYSBnYXAuICovXG5mdW5jdGlvbiBjb3ZlclJvdXRlcyhjYW5kaWRhdGVzOiBTb3VyY2VXcmFwcGVyW10pOiBTb3VyY2VXcmFwcGVyW10gfCB1bmRlZmluZWQge1xuICAgIGxldCBjaG9zZW46IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgIGxldCBjb3ZlcmVkID0gMDtcbiAgICB3aGlsZSAoY292ZXJlZCA8IDEpIHtcbiAgICAgICAgbGV0IG5leHQgPSBjYW5kaWRhdGVzLmZpbmQoeCA9PiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBjb3ZlcmVkKSk7XG4gICAgICAgIGlmICghbmV4dCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY2hvc2VuLnB1c2gobmV4dCk7XG4gICAgICAgIGxldCBbLCBlbmRdID0gbmV4dC5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgY292ZXJlZCA9IGVuZDtcbiAgICB9XG4gICAgcmV0dXJuIGNob3Nlbjtcbn1cblxuLyoqIFJFQURTIE9OTFkuIERyb3BzIHNvdXJjZXMgdGhhdCByZWNlbnRseSBmYWlsZWQgd2hpbGUgZGlzY29ubmVjdGVkIC0gdW5sZXNzIHRoYXQgd291bGQgbGVhdmUgbm90aGluZywgaW4gd2hpY2ggY2FzZSBhIGRvd24gc291cmNlIGlzIHN0aWxsIGJldHRlciB0aGFuIG5vIHNvdXJjZSwgYW5kIHdlIHJldHJ5IGl0IGltbWVkaWF0ZWx5LiBOZXZlciBhcHBsaWVzIHRvIHdyaXRlcyAob3Igbm9GYWxsYmFja3MgcmVhZHMgb2YgdGhlIHdyaXRlIHRhcmdldCk6IHRoZSB3cml0ZSBub2RlIGlzIHN0cmljdGx5IHRoZSBGSVJTVCBzb3VyY2UgbWF0Y2hpbmcgdGhlIHJvdXRlIGFuZCB2YWxpZCB3aW5kb3csIHJlZ2FyZGxlc3Mgb2YgY29ubmVjdGl2aXR5IC0gYSBjbGllbnQncyBmbGFreSB2aWV3IG9mIHRoZSBuZXR3b3JrIG11c3QgbmV2ZXIgc2NhdHRlciB3cml0ZXMgYWNyb3NzIHRoZSBjaGFpbiAoc3BlYzogY2xpZW50IHdyaXRlcyBhcmUgY29uc2lzdGVudCwgY2xpZW50IHJlYWRzIGFyZSByZWR1bmRhbnQpLiAqL1xuZnVuY3Rpb24gcHJlZmVyVXNhYmxlKHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgbGV0IHVzYWJsZSA9IHNvdXJjZXMuZmlsdGVyKHggPT4gIXguaXNPbkNvb2xkb3duKCkpO1xuICAgIHJldHVybiB1c2FibGUubGVuZ3RoICYmIHVzYWJsZSB8fCBzb3VyY2VzO1xufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNDaGFpbiBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgLy8gVGhlIGNoYWluJ3Mgc3RhdGUsIGFuZCBldmVyeXRoaW5nIGFib3V0IGhhdmluZyBvbmUgKGluaXQgKyBpdHMgcmV0cnksIGNvbmZpZyBwb2xsaW5nL2Fkb3B0aW9uLCBhdmFpbGFiaWxpdHkgcmVjaGVja3MsIHRoZSBjb25maWcgcmV3cml0ZSBsb29wKSwgbGl2ZXMgaW4gdGhlIG1hbmFnZXIgLSB3aGF0IHN0YXlzIGluIHRoaXMgY2xhc3MgaXMgZGlzcGF0Y2ggb3ZlciB0aGF0IHN0YXRlXG4gICAgcHJpdmF0ZSBzdGF0ZTogQ2hhaW5TdGF0ZU1hbmFnZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UsIG9wdGlvbnM/OiBBcmNoaXZlc0NoYWluT3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IENoYWluU3RhdGVNYW5hZ2VyKHtcbiAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhjb25maWcpLFxuICAgICAgICAgICAgZGVidWdOYW1lOiAoKSA9PiB0aGlzLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgZGlyZWN0Q29ubmVjdDogb3B0aW9ucz8uZGlyZWN0Q29ubmVjdCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgbGV0IHVybHMgPSB0aGlzLnN0YXRlLmFjdGl2ZUNvbmZpZy5zb3VyY2VzLm1hcCh4ID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiICYmIHggfHwgKHggYXMgU291cmNlQ29uZmlnKS51cmwpO1xuICAgICAgICByZXR1cm4gYGNoYWluICR7dXJscy5qb2luKFwiLCBcIil9YDtcbiAgICB9XG5cbiAgICAvLyBUaGUgT05FIGRpc3BhdGNoIGZvciBldmVyeSBvcGVyYXRpb246IG5vIGZhbGxiYWNrcyAoYWxsIHdyaXRlcyBieSBkZWZhdWx0LCBhbmQgbm9GYWxsYmFja3MgcmVhZHMpIC0+IHRoZSBwcmltYXJ5IG5vZGUgb25seSwgdmlhIHJ1blByaW1hcnk7IGV2ZXJ5dGhpbmcgZWxzZSAtPiB0aGUgc2hhcmVkIGZhbGxiYWNrIGxvb3AsIHRyeWluZyBzb3VyY2VzIGluIGNvbmZpZyBvcmRlciAob3IgbGF0ZW5jeSBvcmRlciBmb3IgZmFzdCByZWFkcykgYW5kIG9ubHkgbW92aW5nIG9uIHdoZW4gb25lIGZhaWxzLiBXcml0ZXMgaW4gdGhlIGxvb3AgZGlmZmVyIGZyb20gcmVhZHMgb25seSBpbiBjYWxsaW5nIHNvdXJjZS53cml0ZS5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bjxUPihzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGFwaU9ubHk/OiBib29sZWFuOyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyBub0ZhbGxiYWNrcz86IGJvb2xlYW47IGZhbGxiYWNrcz86IGJvb2xlYW47IHJldHJpZXM/OiBudW1iZXI7IGZhc3Q/OiBib29sZWFuOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChjb25maWcuZmFzdCAmJiBjb25maWcubm9GYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFzdCBhbmQgbm9GYWxsYmFja3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogbm9GYWxsYmFja3Mgb25seSBjb25zaWRlcnMgb25lIHNvdXJjZSAodGhlIHdyaXRlIG5vZGUpLCBzbyB0aGVyZSBpcyBubyBvcmRlciB0byBzcGVlZCB1cGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcubm9GYWxsYmFja3MgfHwgY29uZmlnLndyaXRlICYmICFjb25maWcuZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5QcmltYXJ5KGNvbmZpZywgcnVuKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0cmllcyA9IGNvbmZpZy5yZXRyaWVzO1xuICAgICAgICBpZiAocmV0cmllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXRyaWVzID0gREVGQVVMVF9GQUxMQkFDS19SRVRSSUVTO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1RhcmdldCA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFBhc3NlcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcihzb3VyY2UgPT5cbiAgICAgICAgICAgICAgICAoY29uZmlnLnJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKVxuICAgICAgICAgICAgICAgICYmIGNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZylcbiAgICAgICAgICAgICAgICAvLyBBIHdyaXRlLWJsb2NrZWQgc291cmNlIChyZWFkLW9ubHkgbW9kZSwgYmFja2JsYXplIHdpdGhvdXQgY3JlZGVudGlhbHMpIGNhbiBuZXZlciB0YWtlIGEgd3JpdGUsIHNvIGl0IGlzIG5vdCBhIGZhbGxiYWNrIGNhbmRpZGF0ZSAtIGl0cyB0aHJvdyB3b3VsZCBlbmQgdGhlIHBhc3MgZWFybHkgKGl0IGNvdW50cyBhcyBjb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgJiYgIShjb25maWcud3JpdGUgJiYgKHNvdXJjZS53cml0ZUJsb2NrZWQgfHwgIXNvdXJjZS5hcGkpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBvcmRlcmVkID0gcHJlZmVyVXNhYmxlKGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mYXN0KSB7XG4gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFsuLi5vcmRlcmVkXTtcbiAgICAgICAgICAgICAgICBzb3J0KG9yZGVyZWQsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHdyb25nVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygb3JkZXJlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXBpT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFwaSA9IHNvdXJjZS5hcGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfSBoYXMgVVJMLW9ubHkgYWNjZXNzLCB3aGljaCBjYW5ub3Qgc2VydmUgdGhpcyBvcGVyYXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4oYXBpLCBzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlTbWFydFRpbWVvdXQoY29uZmlnLnRpbWVvdXQsIHNvdXJjZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53cml0ZSkgcmV0dXJuIHNvdXJjZS53cml0ZShhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHNvdXJjZS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnJlYWQoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBzb3VyY2UuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU01BUlRfVElNRU9VVF9NQVJLRVIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTb3VyY2UgdGltZWQgb3V0IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBjb250aW51aW5nIHdpdGggdGhlIG5leHQgc291cmNlOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgd3Jvbmctd2luZG93L3JvdXRlL3VuY29uZmlndXJlZCByZWplY3Rpb24gbWVhbnMgT1VSIGNvbmZpZyBkaXNhZ3JlZXMgd2l0aCB0aGUgc2VydmVyJ3MsIHNvIGV2ZXJ5IHNvdXJjZSB3ZSdkIGZhbGwgYmFjayB0byBpcyBqdWRnZWQgYnkgdGhlIHNhbWUgc3RhbGUgY29uZmlnIC0gcmVmcmVzaCBpdCBhbmQgcmVzdGFydCB0aGUgcGFzcyBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVykgfHwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSB8fCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQpKSAmJiAhcmV0cmllZFdyb25nVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVkV3JvbmdUYXJnZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JvbmdUYXJnZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgbWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVykgJiYgXCJ3aW5kb3dcIiB8fCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfUk9VVEUpICYmIFwicm91dGVcIiB8fCBcInVuY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrcyBtZWFucyBhdmFpbGFiaWxpdHkgYWJvdmUgZXZlcnl0aGluZzogQU5ZIGZhaWxpbmcgc291cmNlIC0gZG93biwgbWlzY29uZmlndXJlZCwgcmVqZWN0aW5nLCBtaWQtc3dpdGNob3ZlciAtIGlzIHNraXBwZWQgYW5kIHRoZSBuZXh0IGNvdmVyaW5nIHNvdXJjZSB0YWtlcyB0aGUgY2FsbC4gT25seSBldmVyeSBzb3VyY2UgZmFpbGluZyB0aHJvd3MgKGJlbG93KS4gV2l0aG91dCBmYWxsYmFja3MsIGEgQ09OTkVDVEVEIHNvdXJjZSdzIGVycm9yIGlzIGEgcmVhbCBhbnN3ZXIgYW5kIHRocm93cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNvdXJjZSBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIGZhbGxpbmcgYmFjayB0byB0aGUgbmV4dCBzb3VyY2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod3JvbmdUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJsYW5rZXQgcmV0cnkgb2YgdGhlIHdob2xlIHBhc3MsIEFOWSBlcnJvciAoc2VlIEdldENvbmZpZy5yZXRyaWVzKTogbW9zdCByZXF1ZXN0cyBzaG91bGRuJ3QgZmFpbCBhdCBhbGwsIHNvIHJldHJ5aW5nIHRoZSByYXJlIGZhaWx1cmUgLSB3aGF0ZXZlciBpdCB3YXMgLSBidXlzIGF2YWlsYWJpbGl0eSBmb3IgYWxtb3N0IG5vdGhpbmdcbiAgICAgICAgICAgIGlmIChyZXRyaWVkUGFzc2VzIDwgcmV0cmllcykge1xuICAgICAgICAgICAgICAgIHJldHJpZWRQYXNzZXMrKztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEV2ZXJ5IHNvdXJjZSBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9OyByZXRyeWluZyB0aGUgd2hvbGUgcGFzcyBpbiAke0ZBTExCQUNLX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChyZXRyeSAke3JldHJpZWRQYXNzZXN9IG9mICR7cmV0cmllc30pYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoRkFMTEJBQ0tfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGwgc291cmNlcyBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9IChhZnRlciAke3JldHJpZWRQYXNzZXN9IHJldHIke3JldHJpZWRQYXNzZXMgPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0pOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpIHx8IFwibm8gc291cmNlcyBhdmFpbGFibGVcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyaXRlcyBhbmQgbm9GYWxsYmFja3MgcmVhZHMgYXJlIHRoZSBzYW1lIGNhc2U6IHRha2UgdGhlIGF1dGhvcml0YXRpdmUgbm9kZSAtIHN0cmljdGx5IHRoZSBmaXJzdCBzb3VyY2UgbWF0Y2hpbmcgdGhlIHJvdXRlIGFuZCB2YWxpZCB3aW5kb3csIHdoZXRoZXIgaXQgaXMgdXAgb3IgZG93biAtIGFuZCB1c2UgaXQsIG5ldmVyIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIG5vZGUuIEl0J3MgaW1wb3J0YW50IHRoYXQgd3JpdGluZyBhbHdheXMgYWNjZXNzZXMgdGhlIHNhbWUgbm9kZSBldmVyeXdoZXJlLCBldmVuIGlmIHRoYXQgbm9kZSBpcyBkb3duIC0gb3RoZXJ3aXNlIHdlJ3JlIGp1c3Qgd3JpdGluZyBpbnRvIHRoZSB2b2lkLCBhbmQgd2hvIGtub3dzIGlmIHRoZSB3cml0ZXMgd2lsbCBldmVuIGJlIGFjY2VwdGVkLCBvciBjbG9iYmVyZWQsIG9yIHdoYXQ7IGFuZCBub0ZhbGxiYWNrcyByZWFkcyB3YW50IHRoZSBzYW1lIG5vZGUgcHJlY2lzZWx5IGJlY2F1c2UgaXQgaXMgdGhlIG9uZSB3cml0ZXMgdGFyZ2V0LiBBIHNsb3cgY2FsbCBpcyBhbG1vc3QgYWx3YXlzIGJldHRlciB0aGFuIHRocm93aW5nLCBzbyBhIGZhaWxpbmcgcHJpbWFyeSBpcyByZXRyaWVkICh0aGUgU0FNRSBub2RlLCByZS1yZXNvbHZlZCBlYWNoIGF0dGVtcHQgc2luY2UgYSBjb25maWcgcmVmcmVzaCBjYW4gY2hhbmdlIHdoaWNoIHNvdXJjZSBpcyBwcmltYXJ5KSB1bnRpbCB0aGUgZGVhZGxpbmUsIHRoZW4gdGhyb3dzLlxuICAgIHByaXZhdGUgYXN5bmMgcnVuUHJpbWFyeTxUPihjb25maWc6IHsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nV2luZG93ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdSb3V0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZE5vdENvbmZpZ3VyZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFBSSU1BUllfUkVUUllfVElNRU9VVDtcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgbGV0IGF0dGVtcHRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgKGNvbmZpZy5yb3V0ZSA9PT0gdW5kZWZpbmVkIHx8IHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIGNvbmZpZy5yb3V0ZSkpKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgaXMgdGhlICR7Y29uZmlnLndyaXRlICYmIFwid3JpdGUgdGFyZ2V0XCIgfHwgXCJwcmltYXJ5IHJlYWQgc291cmNlXCJ9IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifSAoZXZlcnkgc291cmNlIGlzIG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvdyBvciBvdXRzaWRlIHRoZSBrZXkncyByb3V0ZSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeSA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dChjb25maWcudGltZW91dCwgcHJpbWFyeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndyaXRlKSByZXR1cm4gcHJpbWFyeS53cml0ZShhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHByaW1hcnkuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpbWFyeS5yZWFkKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgcHJpbWFyeS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSAmJiAhcmV0cmllZFdyb25nV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1dpbmRvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwid2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgJiYgIXJldHJpZWRXcm9uZ1JvdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1JvdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJyb3V0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQpICYmICFyZXRyaWVkTm90Q29uZmlndXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkTm90Q29uZmlndXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwidW5jb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAhdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLndyaXRlICYmIHRhcmdldCAmJiAoYXR0ZW1wdCA9PT0gMSB8fCBhdHRlbXB0ICUgMyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiB3ZSB0cnkgdGhlIEhUVFAgcmVxdWVzdDogaHR0cHNSZXF1ZXN0IGhhcyBiZXR0ZXIgRE5TIHJldHJ5aW5nIGNhcGFiaWxpdGllcyB0aGFuIG91ciBXZWJTb2NrZXQgc2VydmVyICh3ZSBoYXZlIG1vcmUgY29udHJvbCBvdmVyIGl0KSwgc28ganVzdCB1c2luZyBpdCBjYW4gZml4IHNvbWUgRE5TIGlzc3Vlcywgd2hpY2ggY2FuIHByb3BhZ2F0ZSB0byBmaXggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBJdCBpcyBzdGlsbCB0aGUgcHJpbWFyeSBzb3VyY2UncyBvd24gZGF0YSwgc28gdGhlIG5vLWZhbGxiYWNrIHNlbWFudGljcyBob2xkIC0gYW5kIEFyY2hpdmVzVXJsIGhhcyBubyBzZXR1cCBjb3N0LCBzbyBtYWtpbmcgb25lIG9uIHRoZSBzcG90IGlzIGZpbmUuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRhcmdldC51cmwgfHwgbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwodGFyZ2V0LmNvbmZpZy51cmwpKSwgdGFyZ2V0LmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgcHJpbWFyeSdzIGVycm9yICh0aHJvd24gYXQgdGhlIGRlYWRsaW5lKSBpcyB0aGUgcmVhbCBvbmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0IG1vc3Qgb25lIGF0dGVtcHQgcGVyIGludGVydmFsLCBpbiBjYXNlIHRoZSBmYWlsdXJlIGlzIGZhc3RcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KE1hdGgubWF4KDAsIGF0dGVtcHRTdGFydCArIFBSSU1BUllfUkVUUllfREVMQVkgLSBEYXRlLm5vdygpKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSYWNlcyBjYWxsIGFnYWluc3QgYSBzaXplLWJhc2VkIGRlYWRsaW5lLiBVcGxvYWRzIGtub3cgdGhlaXIgc2l6ZSB1cGZyb250OyBnZXRzIGFyZSBnaXZlbiBTTUFSVF9USU1FT1VUX1BST0JFIHRvIHByb2R1Y2UgYW55dGhpbmcsIGFuZCBvbmx5IHRoZW4gaXMgdGhlIGZpbGUncyBpbmZvIGZldGNoZWQgKGZyb20gdGhlIHNhbWUgc291cmNlLCBpdHNlbGYgdGltZS1saW1pdGVkKSB0byBzaXplIHRoZSBkZWFkbGluZSAtIG1lYXN1cmVkIGZyb20gdGhlIGNhbGwncyBzdGFydCwgc28gYSBzb3VyY2UgdGhhdCB3YXMgc2xvdyBiZWZvcmUgdGhlIHByb2JlIGRvZXNuJ3QgZ2V0IHRoZSBmdWxsIGFsbG93YW5jZSBhZ2Fpbi4gVGltZWQtb3V0IGNhbGxzIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCAodGhleSBjYW5ub3QgYmUgY2FuY2VsbGVkKSBidXQgdGhlaXIgZXZlbnR1YWwgcmVzdWx0IGlzIGlnbm9yZWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyBhcHBseVNtYXJ0VGltZW91dDxUPih0aW1lb3V0OiBTbWFydFRpbWVvdXQgfCB1bmRlZmluZWQsIHNvdXJjZTogU291cmNlV3JhcHBlciwgY2FsbDogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoIXRpbWVvdXQpIHJldHVybiBhd2FpdCBjYWxsKCk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjYWxsUHJvbWlzZSA9IGNhbGwoKTtcbiAgICAgICAgLy8gQW4gYWJhbmRvbmVkIGNhbGwgbXVzdCBub3Qgc3VyZmFjZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIHdoZW4gaXQgZXZlbnR1YWxseSBmYWlsc1xuICAgICAgICBsZXQgYWJhbmRvbiA9ICgpID0+IHZvaWQgY2FsbFByb21pc2UudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgICAgIGlmICh0aW1lb3V0LnVwbG9hZEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEEgZmxhdCBiYXNlIHBsdXMgdGhlIHByZWRpY3RlZCB0cmFuc2ZlciB0aW1lLCBzbyB0aW55IHVwbG9hZHMgc3RpbGwgZ2V0IHRoZSBmdWxsIGJhc2Ugd2luZG93XG4gICAgICAgICAgICBsZXQgYWxsb3dlZCA9IFNNQVJUX1RJTUVPVVRfUFJPQkUgKyB0aW1lb3V0LnVwbG9hZEJ5dGVzIC8gU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCAqIDEwMDA7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkoYWxsb3dlZCkudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSAke3RpbWVvdXQubGFiZWwgfHwgYFVwbG9hZCBvZiAke3RpbWVvdXQudXBsb2FkQnl0ZXN9IGJ5dGVzYH0gdG8gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXM6ICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBiYXNlIHBsdXMgdHJhbnNmZXIgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkR9IGJ5dGVzL3MpYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IHRpbWVvdXQucGF0aDtcbiAgICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIGF3YWl0IGNhbGxQcm9taXNlO1xuICAgICAgICBsZXQgZmlyc3QgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShTTUFSVF9USU1FT1VUX1BST0JFKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgaWYgKGZpcnN0KSByZXR1cm4gZmlyc3QudmFsdWU7XG4gICAgICAgIGxldCBwcm9iZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbmZvOiB7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgc291cmNlLnJlYWQoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0SW5mbyhwYXRoKSkudGhlbih4ID0+ICh7IHNpemU6IHggJiYgeC5zaXplIHx8IDAgfSkpLFxuICAgICAgICAgICAgICAgIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9iZUVycm9yID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTTUFSVF9USU1FT1VUX01BUktFUn0gUmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQ6IG5vIHJlc3VsdCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcywgYW5kIGdldEluZm8gJHtwcm9iZUVycm9yICYmIGBmYWlsZWQgKCR7cHJvYmVFcnJvcn0pYCB8fCBgY291bGQgbm90IGFuc3dlciB3aXRoaW4gJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGVpdGhlcmB9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChTTUFSVF9USU1FT1VUX1BST0JFLCBpbmZvLnNpemUgLyBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgKiAxMDAwKTtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IHN0YXJ0ICsgYWxsb3dlZCAtIERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBsZXQgc2Vjb25kID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkocmVtYWluaW5nKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChzZWNvbmQpIHJldHVybiBzZWNvbmQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFJlYWQgb2YgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gKCR7aW5mby5zaXplfSBieXRlcykgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0IGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIChhbGxvd2VkICR7TWF0aC5yb3VuZChhbGxvd2VkKX1tcyBmcm9tIHRoZSBjYWxsJ3Mgc3RhcnQsIGF0IGFuIGFzc3VtZWQgJHtTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkR9IGJ5dGVzL3MpYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsYXN0Q29uZmlnUmVmcmVzaCA9IDA7XG4gICAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZTogQ2hhaW5TdGF0ZSwga2luZDogXCJ3aW5kb3dcIiB8IFwicm91dGVcIiB8IFwidW5jb25maWd1cmVkXCIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IG5lYXJCb3VuZGFyeSA9IHN0YXRlLnNvdXJjZXMuc29tZShzb3VyY2UgPT4gc291cmNlLmNvbmZpZy52YWxpZFdpbmRvdy5zb21lKHQgPT4gdCA+IDAgJiYgdCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIE1hdGguYWJzKHQgLSBub3cpIDw9IFdST05HX1RBUkdFVF9CT1VOREFSWV9XSU5ET1cpKTtcbiAgICAgICAgICAgIGlmIChuZWFyQm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV3JpdGUgcmVqZWN0ZWQgYnkgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogcmFjZWQgYSB2YWxpZCB3aW5kb3cgYm91bmRhcnk7IHdhaXRpbmcgJHtXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkgLyAxMDAwfXMgYW5kIHJldHJ5aW5nYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RDb25maWdSZWZyZXNoIDwgQ09ORklHX1JFRlJFU0hfVEhST1RUTEUpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXN0Q29uZmlnUmVmcmVzaCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCByZWFzb24gPSBraW5kID09PSBcIndpbmRvd1wiICYmIFwid3JvbmcgdmFsaWQgd2luZG93XCIgfHwga2luZCA9PT0gXCJyb3V0ZVwiICYmIFwid3Jvbmcgcm91dGVcIiB8fCBcInRoZSBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyeSBvbiB0aGF0IHNlcnZlclwiO1xuICAgICAgICBjb25zb2xlLmxvZyhgV3JpdGUgcmVqZWN0ZWQgYnkgJHt0aGlzLmdldERlYnVnTmFtZSgpfSAoJHtyZWFzb259KTogb3VyIGNvbmZpZyBkaXNhZ3JlZXMgd2l0aCB0aGUgc2VydmVyJ3MgKGxpa2VseSBzdGFsZSwgb3IgYSBkZXBsb3kgc3dpdGNob3Zlcik7IHJlZnJlc2hpbmcgaXQgYW5kIHJldHJ5aW5nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihjb25maWc6IHsgYXBpT25seT86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IG5vRmFsbGJhY2tzPzogYm9vbGVhbjsgZmFsbGJhY2tzPzogYm9vbGVhbjsgZmFzdD86IGJvb2xlYW47IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oc3RhdGUsIGNvbmZpZywgcnVuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd2FpdGluZ0ZvckFjY2VzcygpOiBQcm9taXNlPHsgbGluazogc3RyaW5nOyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIC8vIEEgc291cmNlIHdob3NlIHdpbmRvdyBoYXMgcGFzc2VkIGlzIG5ldmVyIHJlYWQgb3Igd3JpdHRlbiBhZ2Fpbiwgc28gaXRzIGFjY2VzcyBzdGF0ZSBpcyBpcnJlbGV2YW50IC0gYW5kIGFza2luZyBhIGRlYWQgaW50ZXJtZWRpYXRlIHdvdWxkIGp1c3QgaGFuZyBvciB0aHJvdy4gRnV0dXJlIHdpbmRvd3MgRE8gbWF0dGVyOiBhY2Nlc3Mgc2hvdWxkIGJlIGdyYW50ZWQgYmVmb3JlIHRoZWlyIHdpbmRvdyBzdGFydHMuXG4gICAgICAgICAgICBpZiAoc291cmNlLmNvbmZpZy52YWxpZFdpbmRvd1sxXSA8PSBEYXRlLm5vdygpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuYXBpIGluc3RhbmNlb2YgQXJjaGl2ZXNSZW1vdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgd2FpdGluZyA9IGF3YWl0IHNvdXJjZS5hcGkud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nKSByZXR1cm4gd2FpdGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBnZXQyLCBidXQgdHJ5aW5nIHNvdXJjZXMgaW4gbGF0ZW5jeSBvcmRlciAoZmFzdGVzdCBmaXJzdCkgaW5zdGVhZCBvZiBjb25maWcgb3JkZXIuIFdoaWxlIHRoaXMgaXMgbXVjaCBmYXN0ZXIsIGl0IG1pZ2h0IG1pc3MgaW1tZWRpYXRlIHdyaXRlczogdGhlIHdyaXRlIG5vZGUgaXMgbm8gbG9uZ2VyIHRyaWVkIGZpcnN0LCBzbyBhIGxhZ2dpbmcgcmVwbGljYSBtYXkgYW5zd2VyIHdpdGggYSBzbGlnaHRseSBvbGRlciB2YWx1ZS4gRXhjbHVzaXZlIHdpdGggbm9GYWxsYmFja3MgKHdoaWNoIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgLSB0aGUgd3JpdGUgbm9kZSAtIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwKTsgcGFzc2luZyBib3RoIHRocm93cy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmFzdChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7IHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIG5vRmFsbGJhY2tzOiBjb25maWc/Lm5vRmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWc/LnJldHJpZXMsIGZhc3Q6IHRydWUsIHRpbWVvdXQ6IHsgcGF0aDogZmlsZU5hbWUgfSB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAvLyBFbXB0eSBkYXRhIGlzIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAtIHNlZSBnZXQyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcyAmJiAhKGNvbmZpZz8ucmFuZ2UgJiYgcmVzdWx0LnNpemUpKSByZXR1cm4geyB1cmwgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplLCB1cmwgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBBbHdheXMgcmVzb2x2ZXMgd2l0aCBhIHVybCAtIHRoZSBhdXRob3JpdHkgdGhhdCBhbnN3ZXJlZC4gQSB2YWx1ZSB0aGF0IGRvZXNuJ3QgZXhpc3QgaXMgc3RpbGwgYW4gYW5zd2VyIEZST00gYSBzZXJ2ZXIsIHNvIGl0IGNvbWVzIGJhY2sgYXMgeyB1cmwgfSB3aXRoIG5vIGRhdGEgKG5ldmVyIHBsYWluIHVuZGVmaW5lZCk7IGVycm9ycyBmcm9tIGV2ZXJ5IHNvdXJjZSB0aHJvdyBpbnN0ZWFkLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybDogc3RyaW5nIH0gfCB7IGRhdGE/OiB1bmRlZmluZWQ7IHdyaXRlVGltZT86IHVuZGVmaW5lZDsgc2l6ZT86IHVuZGVmaW5lZDsgdXJsOiBzdHJpbmcgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh1bmxlc3MgdGhlIGNhbGxlciBhc2tlZCBmb3IgdG9tYnN0b25lcykgLSBhIHJhbmdlZCByZWFkIG9mIGEgUkVBTCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgdGhvdWdoIChyYW5nZSBwYXN0IEVPRiksIHdoaWNoIHRoZSB0b3RhbCBzaXplIGRpc3Rpbmd1aXNoZXNcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzIH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyAuLi5yZXN1bHQsIHVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2l0aG91dCBmYWxsYmFja3M6IHRoZSBBVVRIT1JJVEFUSVZFIGNvdmVyaW5nIE9OTFkgLSB0aGUgZmlyc3Qgc291cmNlIHBlciByb3V0ZSBpbiBjb25maWcgb3JkZXIgKHRoZSBzYW1lIG5vZGUgZXZlcnkgd3JpdGUgYW5kIHJlYWQgdGFyZ2V0cyksIGRvd24gb3Igbm90LiBJdCBpcyBORVZFUiBleGNsdWRlZCBhbmQgTkVWRVIgc3Vic3RpdHV0ZWQsIHNvIGEgbGlzdGluZyB0aGF0IGNhbid0IHJlYWNoIGl0cyB3cml0ZSBub2RlcyByZXRyaWVzIHRob3NlIHNhbWUgbm9kZXMgdW50aWwgdGhlIGRlYWRsaW5lIGFuZCB0aGVuIGZhaWxzLCByYXRoZXIgdGhhbiBxdWlldGx5IHJlYWRpbmcgc2Vjb25kLWhhbmQgZGF0YSBvZmYgYSByZXBsaWNhIG9yIGJhY2tibGF6ZS4gZXhjbHVkZS9jb29sZG93bi9zdWJzdGl0dXRpb24gYXBwbHkgT05MWSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgaW50byBmYWxsYmFja3MuXG4gICAgcHJpdmF0ZSBzZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbjsgZXhjbHVkZT86IFNldDxTb3VyY2VXcmFwcGVyPiB9KTogU291cmNlV3JhcHBlcltdIHtcbiAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgeC5hcGkgJiYgIWNvbmZpZy5leGNsdWRlPy5oYXMoeCkpO1xuICAgICAgICAgICAgbGV0IHVzYWJsZSA9IGNhbmRpZGF0ZXMuZmlsdGVyKHggPT4gIXguaXNPbkNvb2xkb3duKCkpO1xuICAgICAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKHVzYWJsZSkgfHwgY292ZXJSb3V0ZXMoY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICBpZiAoY2hvc2VuKSByZXR1cm4gY2hvc2VuO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHguYXBpKTtcbiAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICBpZiAoIWNob3Nlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob3NlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uQ292ZXJpbmc8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4sIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBDT1ZFUklOR19SRVRSWV9USU1FT1VUO1xuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgZmFpbGVkIGR1cmluZyB0aGlzIGNhbGwgLSB3aXRoIGZhbGxiYWNrcywgdGhlIG5leHQgYXR0ZW1wdCBjb3ZlcnMgdGhlaXIgcm91dGVzIHdpdGggdGhlIG5leHQgc291cmNlIGhvbGRpbmcgdGhlbSBpbnN0ZWFkXG4gICAgICAgIGxldCBmYWlsZWQgPSBuZXcgU2V0PFNvdXJjZVdyYXBwZXI+KCk7XG4gICAgICAgIGxldCB0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cmllcysrO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG5hbWUgdGhlIE9QRVJBVElPTiBhbmQgdGhlIFNQRUNJRklDIHNvdXJjZXMgdGhhdCBmYWlsZWQgLSBcInRoZSBmaW5kIGZhaWxlZCBiZWNhdXNlIHNvdXJjZSBYIGlzIHVuYXZhaWxhYmxlXCIsIG5ldmVyIGFuIGFub255bW91cyBmYWlsdXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdob2xlIGNoYWluXG4gICAgICAgICAgICBsZXQgb3V0Y29tZSA9IGF3YWl0IChhc3luYyAoKTogUHJvbWlzZTx7IHZhbHVlczogVFtdIH0gfCB7IGVycm9yOiBFcnJvciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdmVyaW5nOiBTb3VyY2VXcmFwcGVyW107XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY292ZXJpbmcgPSB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gY2Fubm90IHJ1bjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZXM6IHsgc291cmNlOiBTb3VyY2VXcmFwcGVyOyBlcnJvcjogRXJyb3IgfVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNvdmVyaW5nLm1hcChhc3luYyAoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBuZXcgRXJyb3IoYFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlICR7b3BlcmF0aW9ufWApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhd2FpdCBydW4oYXBpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNvdXJjZSwgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIGFmdGVyICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSl9IGluZGV4ICR7aW5kZXh9IG9mICR7Y292ZXJpbmcubGVuZ3RofWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGlmICghZmFpbHVyZXMubGVuZ3RoKSByZXR1cm4geyB2YWx1ZXMgfTtcbiAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgJHtmYWlsdXJlc1swXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGlzIHVuYXZhaWxhYmxlOiAke2ZhaWx1cmVzWzBdLmVycm9yLm1lc3NhZ2UgPz8gZmFpbHVyZXNbMF0uZXJyb3J9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2UgJHtmYWlsdXJlcy5sZW5ndGh9IG9mIHRoZSAke2NvdmVyaW5nLmxlbmd0aH0gY292ZXJpbmcgc291cmNlcyBhcmUgdW5hdmFpbGFibGU6ICR7ZmFpbHVyZXMubWFwKHggPT4gYCR7eC5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiAke3guZXJyb3IubWVzc2FnZSA/PyB4LmVycm9yfWApLmpvaW4oXCIgfCBcIil9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIGlmIChcInZhbHVlc1wiIGluIG91dGNvbWUpIHJldHVybiBvdXRjb21lLnZhbHVlcztcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAvLyBTdWJzdGl0dXRpb24gY29tZXMgQkVGT1JFIHRoZSBkZWFkbGluZSBjaGVjazogYSBzaW5nbGUgY29ubmVjdCB0aW1lb3V0IGNhbiBlYXQgdGhlIGVudGlyZSBkZWFkbGluZSwgYW5kIGdpdmluZyB1cCB0aGVuIC0gd2l0aG91dCBldmVyIHRyeWluZyB0aGUgc3Vic3RpdHV0ZSB0aGF0IGZhbGxiYWNrcyBleGlzdCBmb3IgLSB0aHJvd3MgZXhhY3RseSB3aGVuIGZhbGxpbmcgYmFjayBtYXR0ZXJzIG1vc3QuIFN1YnN0aXR1dGlvbiBjYW5ub3QgbG9vcCBwYXN0IHRoZSBkZWFkbGluZSBmb3JldmVyOiBldmVyeSBwYXNzIGFkZHMgaXRzIGZhaWx1cmVzIHRvIGBmYWlsZWRgLCBzbyB0aGUgc3Vic3RpdHV0ZXMgcnVuIG91dCB3aXRoIHRoZSBzb3VyY2VzLlxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzICYmIGZhaWxlZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IHRydWUsIGV4Y2x1ZGU6IGZhaWxlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYChyZXRyeWluZyB3aXRoIGZhbGxiYWNrcykgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gc3Vic3RpdHV0ZSBjb3ZlcnMgdGhlIGZhaWxlZCByb3V0ZXMgLSByZXRyeSB0aGUgZmFpbGVkIHNvdXJjZXMgdGhlbXNlbHZlcyBhZnRlciB0aGUgZGVsYXlcbiAgICAgICAgICAgICAgICBmYWlsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiAke0NPVkVSSU5HX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChnaXZpbmcgdXAgYXQgJHtuZXcgRGF0ZShkZWFkbGluZSkudG9JU09TdHJpbmcoKX0pLmApO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KENPVkVSSU5HX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5PbkNvdmVyaW5nKGBUaGUgZmluZCBvZiAke0pTT04uc3RyaW5naWZ5KHByZWZpeCl9YCwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpLCB7IGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MgfSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGNoYW5nZXMgbGlzdGluZyBzaW5jZSAke25ldyBEYXRlKGNvbmZpZy50aW1lKS50b0lTT1N0cmluZygpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENoYW5nZXNBZnRlcjIoY29uZmlnKSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIHN5bmMgc3RhdHVzIGNoZWNrYCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FyY2hpdmVzLmdldERlYnVnTmFtZSgpfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogc3RhdHVzZXMuZXZlcnkoeCA9PiB4LmFsbFNjYW5zQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiBzdGF0dXNlcy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5pbmRleFNpemUsIDApLFxuICAgICAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGlmICghc3RhdGUuc291cmNlcy5zb21lKHggPT4geC5hcGkpKSByZXR1cm4geyByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgdGhpcy5ydW4oc3RhdGUsIHsgYXBpT25seTogdHJ1ZSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDb25maWcoKSk7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbmZpZywgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBzb3VyY2UuaGFzV3JpdGVBY2Nlc3MoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZpbGVOYW1lKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldFJvdXRpbmdDb25maWcoZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoVkFSSUFCTEVfU0hBUkQpICYmIHBhcnNlVmFyaWFibGVSb3V0ZShmaWxlTmFtZSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0VmFyaWFibGVTaGFyZChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAvLyBTdHJlYW1lZCBhdXRvbWF0aWNhbGx5IHNvIGNhbGxlcnMgbmV2ZXIgaGF2ZSB0byBjYWxsIHNldExhcmdlRmlsZSB0aGVtc2VsdmVzIHdoZW4gdGhleSBhbHJlYWR5IGhvbGQgdGhlIGJ1ZmZlciAtIG9uZSBnaWFudCBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgd2lyZSBsaW1pdCBhbmQgbGFnIGV2ZXJ5IG90aGVyIGNsaWVudCBvbiB0aGUgY29ubmVjdGlvbi4gVGhlIHdob2xlIGNvbmZpZyBnb2VzIHdpdGggaXQgKGluY2x1ZGluZyBmYWxsYmFja3MsIHdoaWNoIHRoZSBidWZmZXIncyByZXN0YXJ0U3RyZWFtIG1ha2VzIHBvc3NpYmxlKTogYSBmaWxlIG11c3Qgbm90IGdldCBkaWZmZXJlbnQgd3JpdGUgc2VtYW50aWNzIGp1c3QgZm9yIGJlaW5nIGJpZy5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlKHsgcGF0aDogZmlsZU5hbWUsIC4uLmNvbmZpZywgLi4uYnVmZmVyQ2h1bmtTdHJlYW0oZGF0YSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHsgd3JpdGU6IHRydWUsIGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgdGltZW91dDogeyB1cGxvYWRCeXRlczogZGF0YS5sZW5ndGgsIGxhYmVsOiBgVXBsb2FkIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfSAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMpYCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFJvdXRpbmdDb25maWcoZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gQ2hlY2tlZCBiZWZvcmUgdGhlIGZpcnN0IG5vZGUgaXMgd3JpdHRlbiB0bywgbm90IGp1c3QgYnkgZWFjaCBub2RlIGFzIGl0IGFycml2ZXM6IGV2ZXJ5IHNlcnZlciB3b3VsZCByZWplY3QgaXQgYW55d2F5LCBhbmQgZmluZGluZyB0aGF0IG91dCBvbmUgbm9kZSBhdCBhIHRpbWUgaXMgaG93IGEgY29uZmlnIHdyaXRlIGVuZHMgdXAgaGFsZi1hcHBsaWVkXG4gICAgICAgIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKHBhcnNlUm91dGluZ0RhdGEoZGF0YSkpO1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWc/Lmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgd3JpdHRlbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgLy8gT25lIHdyaXRlIHBlciBTVE9SRSwgbm90IHBlciBzZXJ2ZXI6IHRoZSB3cml0ZSBsYW5kcyBpbiB0aGUgc3RvcmUgdGhlIGVudHJ5IE5BTUVTLCBzbyB0d28gZW50cmllcyBzaGFyaW5nIGEgVVJMIGJ1dCBuYW1pbmcgZGlmZmVyZW50IHN0b3JlcyBhcmUgdHdvIHNlcGFyYXRlIGRlbGl2ZXJpZXMgLSBkZWR1cGluZyBieSBVUkwgYWxvbmUgbGVhdmVzIHRoZSBzZWNvbmQgc3RvcmUgdW5jb25maWd1cmVkIGZvcmV2ZXJcbiAgICAgICAgbGV0IHRhcmdldHM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke3NvdXJjZS5jb25maWcudXJsfXwke3NvdXJjZS5jb25maWcubmFtZX1gO1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcml0aW5nIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gdG8gYWxsICR7dGFyZ2V0cy5sZW5ndGh9IHN0b3JlcyAod3JpdGUgdGltZSAke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pOiAke2RhdGEudG9TdHJpbmcoXCJ1dGY4XCIpLnNsaWNlKDAsIDIwMDApfWApO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gYCR7c291cmNlLmNvbmZpZy51cmx9IChzdG9yZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcubmFtZSl9KWA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pKTtcbiAgICAgICAgICAgICAgICB3cml0dGVuLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSB0aGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyB0byAke2xhYmVsfWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2xhYmVsfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlZnJlc2hBY3RpdmVDb25maWcoKTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSByb3V0aW5nIGNvbmZpZyB3cml0ZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSBmYWlsZWQgb24gJHtlcnJvcnMubGVuZ3RofSBvZiAke3RhcmdldHMubGVuZ3RofSBzdG9yZXMgKHN1Y2NlZWRlZCBvbjogJHt3cml0dGVuLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0pOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBST1VUSU5HX0ZJTEU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWc/LnJldHJpZXMsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IDAsIGxhYmVsOiBgRGVsZXRpb24gb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9YCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSwgY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBJQXJjaGl2ZXMubW92ZS4gV2hlbiBvbmUgbm9kZSBpcyB0aGUgd3JpdGUgdGFyZ2V0IGZvciBCT1RIIHBhdGhzLCB0aGF0IG5vZGUgbW92ZXMgdGhlIGZpbGUgaXRzZWxmIC0gdGhlIGJ5dGVzIG5ldmVyIGNvbWUgdGhyb3VnaCB1cyAtIHdpdGggdGhlIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24gYXMgYW55IHdyaXRlLiBXaGVuIHRoZSBwYXRocyByb3V0ZSB0byBkaWZmZXJlbnQgc2hhcmRzIG5vIHNpbmdsZSBub2RlIGhvbGRzIGJvdGgsIHNvIHRoZSBtb3ZlIGRlZ3JhZGVzIHRvIGEgY29weSB0aHJvdWdoIHVzIHBsdXMgYSBkZWxldGUsIENPTkZJUk1FRCBhdCB0aGUgZGVzdGluYXRpb24gYmVmb3JlIHRoZSBzb3VyY2UgaXMgdG91Y2hlZC4gTm8gc21hcnQgdGltZW91dCBvbiB0aGUgbm9kZS1zaWRlIG1vdmU6IGl0IGNhbiBiZSBhIGJpZyBmaWxlJ3Mgd29ydGggb2Ygbm9kZS1zaWRlIHdvcmssIHdoaWNoIHRoZSB1cGxvYWQtc2l6ZWQgZGVhZGxpbmVzIHdvdWxkIG1pc2p1ZGdlLiAqL1xuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzogTW92ZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmcm9tUm91dGUgPSBnZXRSb3V0ZShjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICBsZXQgdG9Sb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBmcm9tUm91dGUpKTtcbiAgICAgICAgaWYgKHRhcmdldCAmJiByb3V0ZUNvbnRhaW5zKHRhcmdldC5jb25maWcucm91dGUsIHRvUm91dGUpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGZyb21Sb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5tb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcmNoaXZlcy5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3Qgc3VwcG9ydCBtb3ZlIChtb3ZpbmcgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgYXJjaGl2ZXMubW92ZShjb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5saW5lIHJhdGhlciB0aGFuIG1vdmVBcmNoaXZlRmlsZSwgd2hpY2ggLSBnaXZlbiBvbmUgYXJjaGl2ZXMgdGhhdCBpbXBsZW1lbnRzIG1vdmUgLSB3b3VsZCBqdXN0IGNhbGwgYmFjayBpbnRvIHRoaXMgbWV0aG9kXG4gICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiB0aGlzLCB0bzogdGhpcywgcGF0aDogY29uZmlnLmZyb21QYXRoLCB0b1BhdGg6IGNvbmZpZy50b1BhdGggfSk7XG4gICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX06IHRoZSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBleGlzdCBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhjb25maWcudG9QYXRoKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gYWZ0ZXIgY29weWluZyBpdCB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IHJlcG9ydCBpdCAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSkgLSB0aGUgZmlsZSBpcyBsZWZ0IGF0IHRoZSBzb3VyY2VgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmRlbChjb25maWcuZnJvbVBhdGgpO1xuICAgIH1cblxuICAgIC8vIE9uZSB3cml0ZSB0YXJnZXQgcGVyIHJvdXRlIHJhbmdlLCBsb3dlc3QgbGF0ZW5jeSBmaXJzdC4gV2l0aGluIGEgc2hhcmQgdGhlIHRhcmdldCBpcyBBTFdBWVMgdGhlIGZpcnN0IHNvdXJjZSBpbiBjb25maWcgb3JkZXIgKHNlZSBydW5QcmltYXJ5IC0gd3JpdGVzIG11c3Qgc3RheSBvbiB0aGUgc2FtZSBub2RlKTogY29ubmVjdGl2aXR5IG9ubHkgZGVjaWRlcyB3aGljaCBTSEFSRCB3ZSBwaWNrLCBuZXZlciB3aGljaCBub2RlIHdpdGhpbiBpdCwgc28gYSBzaGFyZCB3aG9zZSBub2RlIGlzIGRpc2Nvbm5lY3RlZCBpcyBkcm9wcGVkIGVudGlyZWx5IHdoZW4gY29ubmVjdGVkT25seSBpcyBzZXQuXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGNvbm5lY3RlZE9ubHk6IGJvb2xlYW4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldHNCeVJvdXRlLmhhcyhyb3V0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RlZE9ubHkpIHtcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcih4ID0+IHguaXNDb25uZWN0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBrZXkgc2V0VmFyaWFibGVTaGFyZCB3b3VsZCBtYXRlcmlhbGl6ZSBmb3IgdGhpcyBWQVJJQUJMRV9TSEFSRCBrZXkgKGEgdmFsdWUgaW4gdGhlIHByZWZlcnJlZCBzaGFyZCdzIHJvdXRlIHJhbmdlKSwgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRTaGFyZEtleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSB8fCBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFNoYXJkS2V5IHJlcXVpcmVzIGEga2V5IGNvbnRhaW5pbmcgYW4gdW5tYXRlcmlhbGl6ZWQgJHtKU09OLnN0cmluZ2lmeShWQVJJQUJMRV9TSEFSRCl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogdHJ1ZSB9KVswXVxuICAgICAgICAgICAgfHwgdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiBmYWxzZSB9KVswXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBzbyB0aGVyZSBpcyBubyBzaGFyZCB0byBtYXRlcmlhbGl6ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IGludG9gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCB0YWxraW5nIHRvIGEgc2hhcmQgd2hvc2Ugbm9kZSB3YXMgZmFzdCBidXQgaXMgbm93IGRpc2Nvbm5lY3RlZCAtIG9ubHkgd2hlbiBubyBjb25uZWN0ZWQgc2hhcmQgd29ya3MgZG8gd2UgcmVjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRyeSBldmVyeSBzaGFyZFxuICAgICAgICBsZXQgY29ubmVjdGVkT25seSA9IHRydWU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBmdWxsS2V5ID0gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNoYXJkIHBpY2tpbmcgYWxyZWFkeSByZXRyaWVzIGFjcm9zcyBzaGFyZHMsIHNvIGEgc3R1Y2sgc2hhcmQganVzdCBjb3N0cyBpdHMgdGltZW91dCBhbmQgd2UgbW92ZSBvbi4gTGFyZ2UgZGF0YSBzdHJlYW1zIHZpYSBzZXRMYXJnZUZpbGUgLSB0aGUga2V5IGlzIGFscmVhZHkgbWF0ZXJpYWxpemVkIGhlcmUsIHNvIHRoZSBuby1WQVJJQUJMRV9TSEFSRCByZXN0cmljdGlvbiBvbiBzZXRMYXJnZUZpbGUgZG9lc24ndCBhcHBseS5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dCh7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBWYXJpYWJsZS1zaGFyZCB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmdWxsS2V5KX0gKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWAgfSwgdGFyZ2V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmdWxsS2V5LCAuLi5jb25maWcsIC4uLmJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZ1bGxLZXksIGRhdGEsIGNvbmZpZykpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsS2V5O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0OyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gaXMgZG93bjsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkYCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRPbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IHZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGFjY2VwdCB3cml0ZXNcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGxhcmdlIGZpbGUgaXMgd3JpdHRlbiBleGFjdGx5IGxpa2UgYSBzbWFsbCBvbmUgLSBzYW1lIHdyaXRlIG5vZGUsIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24sIHNhbWUgZmFsbGJhY2tzIC0gc28gYSB2YWx1ZSdzIFNJWkUgbmV2ZXIgZGVjaWRlcyBpdHMgd3JpdGUgc2VtYW50aWNzIChzZXQgc3RyZWFtcyB0aHJvdWdoIGhlcmUgcGFzdCBMQVJHRV9TRVRfVEhSRVNIT0xELCBhbmQgYSBmaWxlIHRoYXQgZ3JldyBwYXN0IGl0IG11c3Qgbm90IHN1ZGRlbmx5IGxvc2UgdGhlIGF2YWlsYWJpbGl0eSBpdHMgY2FsbGVyIGFza2VkIGZvcikuIFRoZSBvbmUgZGlmZmVyZW5jZTogZXZlcnkgYXR0ZW1wdCBhZnRlciB0aGUgZmlyc3QgaGFzIHRvIHJld2luZCB0aGUgc3RyZWFtLCBzbyBhIGNvbmZpZyB3aXRob3V0IHJlc3RhcnRTdHJlYW0gZ2V0cyBhIHNpbmdsZSBhdHRlbXB0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbSA9IGNvbmZpZy5yZXN0YXJ0U3RyZWFtO1xuICAgICAgICBpZiAoIXJlc3RhcnRTdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlT25jZShjb25maWcsIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZy5mYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZy5yZXRyaWVzLCByb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgYXR0ZW1wdCBjb25zdW1lZCBzb21lIChvciBhbGwpIG9mIHRoZSBzdHJlYW0sIGFuZCB0aGlzIHNvdXJjZSBuZWVkcyB0aGUgZmlsZSBmcm9tIGl0cyBmaXJzdCBieXRlXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIGF3YWl0IHJlc3RhcnRTdHJlYW0oKTtcbiAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQSBzdHJlYW0gdGhhdCBjYW5ub3QgcmV3aW5kIGdldHMgZXhhY3RseSBPTkUgYXR0ZW1wdCBhdCB0aGUgd3JpdGUgbm9kZTogcmV0cnlpbmcgYW55d2hlcmUgKGFub3RoZXIgc291cmNlLCBvciB0aGlzIG9uZSBhZ2Fpbikgd291bGQgc2VuZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgc3RyZWFtIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGZpbGUuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRMYXJnZUZpbGVPbmNlKGNvbmZpZzogU2V0TGFyZ2VGaWxlQ29uZmlnLCByb3V0ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciBzZXRMYXJnZUZpbGUgb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfSAocm91dGUgJHtyb3V0ZX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoY29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJscyA9IGF3YWl0IHRoaXMuZ2V0VVJMcyhwYXRoKTtcbiAgICAgICAgaWYgKCF1cmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwdWJsaWMgc291cmNlIGNvdmVyaW5nIHJvdXRlICR7Z2V0Um91dGUocGF0aCl9IHRvIGJ1aWxkIGEgVVJMIGZyb20gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsc1swXTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgVVJMIHRoYXQgY291bGQgc2VydmUgdGhpcyBwYXRoOiBwdWJsaWMgc291cmNlcyBtYXRjaGluZyBib3RoIHRoZSBwYXRoJ3Mgcm91dGUgYW5kIHRoZSBjdXJyZW50IHZhbGlkIHdpbmRvdy4gVGhlIGZpcnN0IGlzIHRoZSB3cml0ZSBub2RlJ3MgKGZpcnN0IG1hdGNoaW5nIHNvdXJjZSBpbiBjb25maWcgb3JkZXIsIHNlZSBydW5QcmltYXJ5IC0gdGhlIG9uZSBndWFyYW50ZWVkIGN1cnJlbnQpOyB0aGUgcmVzdCBhcmUgcmFua2VkIGZhc3Rlc3QtZmlyc3QgYnkgbWVhc3VyZWQgbGF0ZW5jeS4gRW1wdHkgd2hlbiBub25lIHF1YWxpZnkuICovXG4gICAgcHVibGljIGFzeW5jIGdldFVSTHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0R2V0VVJMcygpKShwYXRoKTtcbiAgICB9XG5cbiAgICAvKiogZ2V0VVJMcywgYnV0IGFmdGVyIHRoZSBvbmUgYXdhaXQgKGluaXRpYWxpemF0aW9uKSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgc3luY2hyb25vdXM6IGV2ZXJ5dGhpbmcgdW5kZXJuZWF0aCAtIHJvdXRlIGhhc2hpbmcsIHdpbmRvdyBjaGVja3MsIGxhdGVuY2llcywgVVJMIGJ1aWxkaW5nIC0gaXMgc3luY2hyb25vdXMsIGFuZCB0aGUgY2xvc3VyZSBhbHdheXMgcmVhZHMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgc28gaXQgc3RheXMgY29ycmVjdCBhY3Jvc3MgY29uZmlnIHJlZnJlc2hlcy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogZ2V0R2V0VVJMcywgYnV0IHNvcnRlZCBwdXJlbHkgYnkgbGF0ZW5jeSAtIHRoZSB3cml0ZSBub2RlIGdldHMgbm8gc3BlY2lhbCBmaXJzdCBwb3NpdGlvbi4gRm9yIHJlYWQtb25seSBjb25zdW1lcnMgdGhhdCBqdXN0IHdhbnQgdGhlIGZhc3Rlc3QgaG9zdC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0RmFzdFVSTHMoKTogUHJvbWlzZTwocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlR2V0VVJMcyhpbml0aWFsU3RhdGUsIHsgd3JpdGVOb2RlRmlyc3Q6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgd3JpdGVOb2RlRmlyc3Q6IGJvb2xlYW4gfSk6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUubGF0ZXN0KCkgfHwgaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUocGF0aCk7XG4gICAgICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZS5jb25maWcucHVibGljID8/IHRydWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yZGVyZWQ6IFNvdXJjZVdyYXBwZXJbXTtcbiAgICAgICAgICAgIGlmIChjb25maWcud3JpdGVOb2RlRmlyc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IHNvdXJjZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc29ydChyZXN0LCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXMuc2xpY2UoMCwgMSksIC4uLnJlc3RdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXJscyA9IG9yZGVyZWQubWFwKHggPT4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwoeC5jb25maWcudXJsKSwgcGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KHVybHMpXTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5kaXNwb3NlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZXMoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpOiBBcmNoaXZlc0NoYWluIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQ2hhaW4oY29uZmlnLCBvcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsbFNlcnZlcjxUPih1cmw6IHN0cmluZywgcnVuOiAoY29udHJvbGxlcjogdHlwZW9mIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW3N0cmluZ10pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZVN0b3JhZ2VVcmwodXJsKTtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCB9KTtcbiAgICBsZXQgY29udHJvbGxlciA9IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW25vZGVJZF07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCwgbm9kZUlkIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJCdWNrZXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5saXN0QnVja2V0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCBvbiBhIHNlcnZlciAocm91dGluZyBjb25maWcgaW5jbHVkZWQpLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGlzIHVuYXZhaWxhYmxlLiBDaGVhcCAtIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHNlcnZlcidzIGRpc2sgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGF0IGJ1Y2tldCBpcyBsb2FkZWQgdGhlcmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyQWN0aXZlQnVja2V0KGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5nZXRBY3RpdmVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogVGhlIGJ1Y2tldHMgYSBzZXJ2ZXIgY3VycmVudGx5IGhhcyBsb2FkZWQuIEFkbWluIG9ubHksIHNvIGluIHByYWN0aWNlIHRoaXMgaXMgb3VyIG93biBtYWNoaW5lJ3Mgb3RoZXIgcHJvY2VzcyAtIGEgZGVwbG95IHN1Y2Nlc3NvciBhc2tpbmcgaXRzIHByZWRlY2Vzc29yIHdoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzKGNvbmZpZzogeyB1cmw6IHN0cmluZyB9KTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5hZG1pbkxpc3RBY3RpdmVCdWNrZXRzKCkpO1xufVxuXG4vKiogVGVsbHMgYSBzZXJ2ZXIgdG8gbG9hZCBvbmUgb2YgaXRzIGJ1Y2tldHMgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIE9ubHkgdG91Y2hlcyB0aGF0IHNlcnZlciAtIG5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgbm8gb3RoZXIgc291cmNlIGlzIGNvbnRhY3RlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVNlcnZlckJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWN0aXZhdGVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RTZXJ2ZXJCdWNrZXRzIHJlcG9ydHMsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2ZXJXcml0ZVN0YXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmNsZWFyV3JpdGVTdGF0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldEluZm8oY29uZmlnOiB7IHVybDogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgLy8gZ2V0Q29uZmlnIGlzIGJ1Y2tldC1sZXZlbCAobm8gc3RvcmUgc2VsZWN0aW9uKSwgc28gdGhlIGZhYnJpY2F0ZWQgc291cmNlQ29uZmlnIG5ldmVyIGhhcyB0byBtYXRjaCBhbnl0aGluZ1xuICAgIGxldCByZW1vdGUgPSBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IGNvbmZpZy51cmwsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlLCBzb3VyY2VDb25maWc6IG5vcm1hbGl6ZVNvdXJjZShjb25maWcudXJsKSB9KTtcbiAgICByZXR1cm4gYXdhaXQgcmVtb3RlLmdldENvbmZpZygpO1xufVxuIl19
|
|
817
|
+
/* _JS_SOURCE_HASH = "5a294d89ae73ae76df9424a7fdc69091eb0034693bbcb6a4150844101141623d"; */
|