sliftutils 1.7.124 → 1.7.125
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/CLAUDE.md +3 -1
- package/bin/securessh.js +10 -0
- package/bin/setupnotify.js +9 -0
- package/bin/signfiles.js +10 -0
- package/package.json +9 -3
- package/security/README.md +77 -0
- package/security/authorizedKeys/authorizedKeys.ts +43 -0
- package/security/authorizedKeys/daemon/portsecure.service +18 -0
- package/security/authorizedKeys/daemon/portsecureDaemon.js +1032 -0
- package/security/authorizedKeys/secureSSH.ts +427 -0
- package/security/authorizedKeys/sources.ts +20 -0
- package/security/helpers/paths.ts +20 -0
- package/security/helpers/remoteSSH.ts +94 -0
- package/security/helpers/spawn.ts +32 -0
- package/security/notifications/discord.ts +190 -0
- package/security/notifications/remoteWebhook.ts +85 -0
- package/security/notifications/setupNotify.ts +29 -0
- package/security/signedFiles/manifest.ts +56 -0
- package/security/signedFiles/signFiles.ts +116 -0
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +17 -20
|
@@ -25,6 +25,10 @@ const ROLLOVER_BYTES = 5 * 1024 * 1024;
|
|
|
25
25
|
const MEMORY_WATCHDOG_INTERVAL_MS = 60 * 1000;
|
|
26
26
|
const STALE_DELETE_MS = 24 * 60 * 60 * 1000;
|
|
27
27
|
const MAX_INDEX_RELOAD_ATTEMPTS = 3;
|
|
28
|
+
// A bulk file under this is "loose" - still worth rolling up into a bigger one. Half the target file size, because that is exactly where combining stops paying: merging two files that are each over half the target just splits back into two files again, so the file count (and with it the per-file key list every read holds in memory) does not drop. Under half, any two inputs fit in one output, so phase 2 always makes the count go down.
|
|
29
|
+
//
|
|
30
|
+
// NOT the target size itself. runPlannedMerge cuts a chunk BEFORE adding the key that would exceed the target, so every file it writes is under TARGET_FILE_BYTES - testing against the target would classify the entire collection as loose and re-merge all of it, forever.
|
|
31
|
+
const LOOSE_BULK_MAX_BYTES = BulkDatabaseFormat_1.TARGET_FILE_BYTES / 2;
|
|
28
32
|
const KEY_GROUP_BYTES = 800 * 1024 * 1024;
|
|
29
33
|
const DUP_THRESHOLD = 0.4;
|
|
30
34
|
// Whole-tier dedup short-circuit (start of phase 3): when the combined tier is over this size AND the overall key duplication fraction is over this threshold, fold every combined file in one merge instead of the per-key-group walk (which spaces merges 5 min apart — 16 h for 200 groups).
|
|
@@ -314,16 +318,13 @@ class BulkDatabaseBase {
|
|
|
314
318
|
streamNeedsFold() {
|
|
315
319
|
return this.streamBytesOnDisk > exports.bulkDatabase2Timing.streamFoldTriggerBytes;
|
|
316
320
|
}
|
|
317
|
-
// Stream files nobody can still be appending to,
|
|
318
|
-
// retirable - a fold may delete these the moment it has consumed them, instead of waiting out streamSealAgeMs. Includes our own sealed files and merge-carry output.
|
|
319
|
-
// ownerGone - nobody is left to fold these (a closed tab's leftovers, or a legacy name with no owner stamp), and until one is folded every reader has to decode all of it just to build the index. Worth folding at any size. Our own files are deliberately NOT in here: every merge pass seals ours, so counting them would fold on every tick; the streamFileMaxBytes rollover and the streamFoldTriggerBytes gate cover ours instead.
|
|
321
|
+
// Stream files nobody can still be appending to: our own sealed files, merge-carry output, and files whose owner is gone (a closed tab's leftovers, or a legacy name with no owner stamp). A fold may delete these the moment it has consumed them, instead of waiting out streamSealAgeMs.
|
|
320
322
|
//
|
|
321
323
|
// Foreign owners are probed over the sync channel. In Node there is no channel, so we cannot know - every foreign owner is assumed alive and the streamSealAgeMs rule stands.
|
|
322
324
|
//
|
|
323
325
|
// assumeSealed is for planning: a merge pass broadcasts a seal before it starts, so by the time it merges our current file IS final. The planner passes isSyncSupported() to predict that; anything deciding a real deletion passes false and goes by streamFileName as it actually stands.
|
|
324
326
|
async findAbandonedStreams(streamFiles, assumeSealed) {
|
|
325
327
|
const retirable = new Set();
|
|
326
|
-
const ownerGone = new Set();
|
|
327
328
|
const hasForeignOwner = streamFiles.some(f => f.ownerId && f.ownerId !== writerId && f.ownerId !== MERGE_OUTPUT_OWNER);
|
|
328
329
|
const live = hasForeignOwner && await (0, syncClient_1.queryLiveWriters)(this.name, exports.bulkDatabase2Timing.liveWriterProbeMs) || undefined;
|
|
329
330
|
for (const f of streamFiles) {
|
|
@@ -337,12 +338,10 @@ class BulkDatabaseBase {
|
|
|
337
338
|
retirable.add(f.fileName);
|
|
338
339
|
continue;
|
|
339
340
|
}
|
|
340
|
-
if (!f.ownerId || live && !live.has(f.ownerId))
|
|
341
|
+
if (!f.ownerId || live && !live.has(f.ownerId))
|
|
341
342
|
retirable.add(f.fileName);
|
|
342
|
-
ownerGone.add(f.fileName);
|
|
343
|
-
}
|
|
344
343
|
}
|
|
345
|
-
return
|
|
344
|
+
return retirable;
|
|
346
345
|
}
|
|
347
346
|
async automaticCompactionAllowed() {
|
|
348
347
|
if (networkCompactionEnabled)
|
|
@@ -810,7 +809,7 @@ class BulkDatabaseBase {
|
|
|
810
809
|
const ordered = (0, LoadedIndex_1.orderStreamEntries)(streamData.entries);
|
|
811
810
|
const streamReader = ordered.length ? (0, streamLog_1.streamReaderFromEntries)(ordered, 0).reader : undefined;
|
|
812
811
|
// An abandoned stream that yielded no entries (zero bytes, or nothing but torn bytes) holds no data and has no writer left. Retire it here: the merge below never lists it as a used source, so the normal retirement path would skip it and it would re-trigger the abandoned-stream fold on every pass. replacedBy is empty because nothing supersedes it - the marker hides it from reads immediately and processMarkers deletes it once aged.
|
|
813
|
-
const
|
|
812
|
+
const retirableStreams = await this.findAbandonedStreams(streamFiles, false);
|
|
814
813
|
const contributingStreams = new Set(streamData.entries.map(e => e.fileName));
|
|
815
814
|
const emptyAbandoned = streamFiles.filter(f => retirableStreams.has(f.fileName) && !contributingStreams.has(f.fileName)).map(f => f.fileName);
|
|
816
815
|
if (emptyAbandoned.length)
|
|
@@ -925,7 +924,7 @@ class BulkDatabaseBase {
|
|
|
925
924
|
}
|
|
926
925
|
return true;
|
|
927
926
|
}
|
|
928
|
-
// Splits the bulk tier
|
|
927
|
+
// Splits the bulk tier into files still worth rolling up ("loose", under LOOSE_BULK_MAX_BYTES - a single stream fold, or the tail end of an earlier merge) and files that are done growing ("combined", which only phase 3 touches again).
|
|
929
928
|
//
|
|
930
929
|
// A file whose size won't read is reported as combined: phase 2 can't consume one (its reader won't load, so the merge won't retire it), and calling it loose would re-trigger phase 2 on every pass until handleUnreadableFile finally deletes it.
|
|
931
930
|
async splitBulkTier(bulkFiles) {
|
|
@@ -937,7 +936,7 @@ class BulkDatabaseBase {
|
|
|
937
936
|
for (let i = 0; i < bulkFiles.length; i++) {
|
|
938
937
|
const bytes = logicalSizes[i];
|
|
939
938
|
sizes.set(bulkFiles[i].fileName, bytes !== null && bytes !== void 0 ? bytes : 0);
|
|
940
|
-
if (bytes === undefined || bytes >=
|
|
939
|
+
if (bytes === undefined || bytes >= LOOSE_BULK_MAX_BYTES) {
|
|
941
940
|
combined.push(bulkFiles[i]);
|
|
942
941
|
continue;
|
|
943
942
|
}
|
|
@@ -1036,27 +1035,25 @@ class BulkDatabaseBase {
|
|
|
1036
1035
|
bulkFiles: [], streamFiles, bytes: hardLimit.value,
|
|
1037
1036
|
});
|
|
1038
1037
|
// A pass seals before it merges, so by then our own current file is final too - predict that rather than reporting it as still-open.
|
|
1039
|
-
const
|
|
1038
|
+
const retirable = await this.findAbandonedStreams(streamFiles, (0, syncClient_1.isSyncSupported)());
|
|
1040
1039
|
// Only fold what we can also retire. Folding a stream a live foreign owner may still append to would copy it into bulk without removing it, so the bytes would stay in memory and just get re-folded next pass; that owner rolls its own file over at streamFileMaxBytes instead.
|
|
1041
1040
|
// Aged past streamSealAgeMs counts as retirable too (canDeleteStream's own first rule): no writer appends past the seal age, and this is the only thing that frees the tier in Node, where liveness cannot be probed at all.
|
|
1042
1041
|
const foldable = streamFiles.filter(f => f.ownerId !== MERGE_OUTPUT_OWNER
|
|
1043
1042
|
&& (retirable.has(f.fileName) || time - f.timestamp >= exports.bulkDatabase2Timing.streamSealAgeMs));
|
|
1044
1043
|
// Merge-carry files hold nothing but tombstones and are never a REASON to fold - folding one alone would just rewrite it into another carry file, forever. They ride along whenever something else folds, which collapses however many have piled up into one.
|
|
1045
1044
|
const carry = streamFiles.filter(f => f.ownerId === MERGE_OUTPUT_OWNER);
|
|
1046
|
-
//
|
|
1047
|
-
const abandoned = foldable.filter(f => ownerGone.has(f.fileName) && streamSizes.get(f.fileName));
|
|
1045
|
+
// Size is the only reason to fold. An abandoned stream is NOT one on its own: it is already retirable, so it is counted here and gets swept up the moment the tier is worth folding, and until then it is bounded by this very threshold. Triggering on one would fold on essentially every pass - a browser leaves a file behind whose writer never answers the liveness probe on every reload - which mints a small bulk file each time and pushes the fragmentation into phase 2.
|
|
1048
1046
|
const foldTriggers = [
|
|
1049
1047
|
makeTrigger({ name: "foldableBytes", value: streamBytes(foldable), threshold: exports.bulkDatabase2Timing.streamFoldTriggerBytes, unit: "bytes" }),
|
|
1050
|
-
makeTrigger({ name: "abandonedFiles", value: abandoned.length, threshold: 1, unit: "count" }),
|
|
1051
1048
|
];
|
|
1052
1049
|
steps.push({
|
|
1053
|
-
phase: 1, kind: "streamFold", requires: "
|
|
1050
|
+
phase: 1, kind: "streamFold", requires: "all", triggers: foldTriggers,
|
|
1054
1051
|
// Skipped when the hard limit already folds everything this would have.
|
|
1055
|
-
ready: !hardLimit.met && foldTriggers.
|
|
1052
|
+
ready: !hardLimit.met && foldTriggers.every(t => t.met),
|
|
1056
1053
|
bulkFiles: [], streamFiles: [...foldable, ...carry], bytes: streamBytes([...foldable, ...carry]),
|
|
1057
1054
|
});
|
|
1058
1055
|
// ── Phase 2: loose bulk -> combined bulk ─────────────────────────────────────────────────────
|
|
1059
|
-
// Phase 1 emits one small bulk file per fold. Each is cheap to read (index only) but holds its whole key list in memory and joins into every read, so they have to be rolled up. Merging just the loose ones also dedupes them for free - a rewrite-heavy workload collapses a gigabyte of near-identical folds into almost nothing - and it always terminates
|
|
1056
|
+
// Phase 1 emits one small bulk file per fold. Each is cheap to read (index only) but holds its whole key list in memory and joins into every read, so they have to be rolled up. Merging just the loose ones also dedupes them for free - a rewrite-heavy workload collapses a gigabyte of near-identical folds into almost nothing - and it always terminates: a chunk is only cut once the next key would take it past TARGET_FILE_BYTES, so every output but the last is over half the target and lands in the combined tier, leaving at most one loose file behind.
|
|
1060
1057
|
const { loose, looseBytes, combined, sizes } = await this.splitBulkTier(bulkFiles);
|
|
1061
1058
|
const looseTriggers = [
|
|
1062
1059
|
makeTrigger({ name: "looseBytes", value: looseBytes, threshold: exports.bulkDatabase2Timing.looseBulkTriggerBytes, unit: "bytes" }),
|
|
@@ -1270,5 +1267,5 @@ exports.BulkDatabaseBase = BulkDatabaseBase;
|
|
|
1270
1267
|
BulkDatabaseBase.liveInstances = new Set();
|
|
1271
1268
|
BulkDatabaseBase.memoryWatchdogStarted = false;
|
|
1272
1269
|
BulkDatabaseBase.lastMemoryFlushMs = 0;
|
|
1273
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsa0RhdGFiYXNlQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkJ1bGtEYXRhYmFzZUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWtFO0FBQ2xFLDJEQUEyRDtBQUMzRCxtREFBeUQ7QUFDekQseURBQW1EO0FBQ25ELDZDQUFxQztBQUVyQyw2REFNOEI7QUFDOUIsMkRBQXNEO0FBQ3RELDZDQUFrRTtBQUNsRSxrRUFBaUY7QUFDakYsd0VBQXlFO0FBQ3pFLDJDQUFpRztBQUNqRyw2Q0FBd0w7QUFDeEwsaURBQXlDO0FBQ3pDLDJDQUFpTTtBQUNqTSxpREFBOEc7QUFDOUcsK0NBVXVCO0FBQ3ZCLDZEQUFvRTtBQUV2RCxRQUFBLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQ2pELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsZ1NBQWdTO0FBQ2hTLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFDdEMsMExBQTBMO0FBQzFMLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUVoQyxR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Q0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDNUUsQ0FBQztvQkFDRCxPQUFPO3dCQUNILElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUNmLE9BQU8sRUFBRSxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87d0JBQzNDLE9BQU8sRUFBRSxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztxQkFDL0MsQ0FBQztnQkFDTixDQUFDO2FBQ0osQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDSixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsQ0FBQzs7QUExakNMLDRDQTJqQ0M7QUE3OUJHLHdEQUF3RDtBQUN6Qyw4QkFBYSxHQUFHLElBQUksR0FBRyxFQUFxQyxBQUEvQyxDQUFnRDtBQUM3RCxzQ0FBcUIsR0FBRyxLQUFLLEFBQVIsQ0FBUztBQUM5QixrQ0FBaUIsR0FBRyxDQUFDLEFBQUosQ0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNvcnQsIHRocm90dGxlRnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBydW5JblNlcmlhbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRUaW1lVW5pcXVlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYml0c1wiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCJ0eXBlc2FmZWNzc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3RvcmFnZSB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQge1xuICAgIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXIsXG4gICAgQnVsa0hlYWRlckluZm8sXG4gICAgYnVpbGRGaWxlQnVmZmVyLFxuICAgIGxvYWRCdWxrSGVhZGVyLFxuICAgIFRBUkdFVF9GSUxFX0JZVEVTLFxufSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VGb3JtYXRcIjtcbmltcG9ydCB7IHJ1blBsYW5uZWRNZXJnZSB9IGZyb20gXCIuL0J1bGtEYXRhYmFzZU1lcmdlXCI7XG5pbXBvcnQgeyBibG9ja0NhY2hlLCBlbmNvZGVDb21wcmVzc2VkQmxvY2tzIH0gZnJvbSBcIi4vYmxvY2tDYWNoZVwiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJsdWUsIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgU1RSRUFNX0VYVEVOU0lPTiwgZnJhbWVEZWxldGVzLCBmcmFtZVJvd3MsIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzIH0gZnJvbSBcIi4vc3RyZWFtTG9nXCI7XG5pbXBvcnQgeyBicm9hZGNhc3QgYXMgc3luY0Jyb2FkY2FzdCwgYnJvYWRjYXN0U2VhbCBhcyBzeW5jQnJvYWRjYXN0U2VhbCwgY29ubmVjdCBhcyBzeW5jQ29ubmVjdCwgaXNTeW5jU3VwcG9ydGVkLCBxdWVyeUxpdmVXcml0ZXJzLCByZWdpc3RlcldyaXRlcklkLCBSZW1vdGVXcml0ZSB9IGZyb20gXCIuL3N5bmNDbGllbnRcIjtcbmltcG9ydCB7IERFTEVURUQgfSBmcm9tIFwiLi9Xcml0ZU92ZXJsYXlcIjtcbmltcG9ydCB7IE1lcmdlTG9ja0luZm8sIHBlZWtNZXJnZUZpbGVMb2NrLCBwZWVrTWVyZ2VMb2NrLCByZWxlYXNlTWVyZ2VGaWxlTG9jaywgcmVsZWFzZU1lcmdlTG9jaywgc3RhcnRNZXJnZUZpbGVMb2NrSGVhcnRiZWF0LCB0cnlBY3F1aXJlTWVyZ2VGaWxlTG9jaywgdHJ5QWNxdWlyZU1lcmdlTG9jayB9IGZyb20gXCIuL21lcmdlTG9ja1wiO1xuaW1wb3J0IHsgbWFya2VyRXhjbHVzaW9ucywgcHJvY2Vzc0RlbGV0ZU1hcmtlcnMsIHJlYWREZWxldGVNYXJrZXJzLCB3cml0ZURlbGV0ZU1hcmtlciB9IGZyb20gXCIuL21lcmdlTWFya2Vyc1wiO1xuaW1wb3J0IHtcbiAgICBCdWxrRmlsZUluZm8sXG4gICAgTG9hZGVkSW5kZXgsXG4gICAgbG9hZEZpbGVSZWFkZXIsXG4gICAgbG9hZFN0cmVhbUVudHJpZXMsXG4gICAgbWFrZVJhd0dldFJhbmdlLFxuICAgIE1pc3NpbmdGaWxlRXJyb3IsXG4gICAgb3JkZXJTdHJlYW1FbnRyaWVzLFxuICAgIFN0cmVhbUZpbGVJbmZvLFxuICAgIFN1YlJlYWRlckNhY2hlcyxcbn0gZnJvbSBcIi4vTG9hZGVkSW5kZXhcIjtcbmltcG9ydCB7IEJ1bGtEYXRhYmFzZVJlYWRlciwgbnVsbEpvaW4gfSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VSZWFkZXJcIjtcblxuZXhwb3J0IGNvbnN0IEJVTEtfUk9PVF9GT0xERVIgPSBcImJ1bGtEYXRhYmFzZXMyXCI7XG5jb25zdCBGSUxFX0VYVEVOU0lPTiA9IFwiLmJ1bGtcIjtcbmNvbnN0IFJPTExPVkVSX1JPV1MgPSA1MDAwO1xuY29uc3QgUk9MTE9WRVJfQllURVMgPSA1ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBNRU1PUllfV0FUQ0hET0dfSU5URVJWQUxfTVMgPSA2MCAqIDEwMDA7XG5jb25zdCBTVEFMRV9ERUxFVEVfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuY29uc3QgTUFYX0lOREVYX1JFTE9BRF9BVFRFTVBUUyA9IDM7XG5jb25zdCBLRVlfR1JPVVBfQllURVMgPSA4MDAgKiAxMDI0ICogMTAyNDtcbmNvbnN0IERVUF9USFJFU0hPTEQgPSAwLjQ7XG4vLyBXaG9sZS10aWVyIGRlZHVwIHNob3J0LWNpcmN1aXQgKHN0YXJ0IG9mIHBoYXNlIDMpOiB3aGVuIHRoZSBjb21iaW5lZCB0aWVyIGlzIG92ZXIgdGhpcyBzaXplIEFORCB0aGUgb3ZlcmFsbCBrZXkgZHVwbGljYXRpb24gZnJhY3Rpb24gaXMgb3ZlciB0aGlzIHRocmVzaG9sZCwgZm9sZCBldmVyeSBjb21iaW5lZCBmaWxlIGluIG9uZSBtZXJnZSBpbnN0ZWFkIG9mIHRoZSBwZXIta2V5LWdyb3VwIHdhbGsgKHdoaWNoIHNwYWNlcyBtZXJnZXMgNSBtaW4gYXBhcnQg4oCUIDE2IGggZm9yIDIwMCBncm91cHMpLlxuY29uc3QgREVEVVBfVFJJR0dFUl9CWVRFUyA9IDUxMiAqIDEwMjQgKiAxMDI0O1xuY29uc3QgREVEVVBfVFJJR0dFUl9GUkFDVElPTiA9IDAuNTtcbmNvbnN0IFdSSVRFX0ZMVVNIX0ZJUlNUX1NURVBfTVMgPSAyNTA7XG4vLyBTa2lwIGxvZ3MgYXJlIHRocm90dGxlZCBwZXIgY29sbGVjdGlvbjogdGhlIGJhY2tncm91bmQgd3JpdGUgcGF0aCByZXRyaWVzIG1lcmdlcyBhYm91dCBvbmNlIGEgc2Vjb25kLCBzbyBhbiB1bnRocm90dGxlZCBsb2cgd291bGQgcmVwZWF0IGZvciB0aGUgd2hvbGUgZHVyYXRpb24gb2YgYW5vdGhlciB0YWIncyBtZXJnZS5cbmNvbnN0IE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TID0gMzAgKiAxMDAwO1xuXG5leHBvcnQgY29uc3QgYnVsa0RhdGFiYXNlMlRpbWluZyA9IHtcbiAgICBzdHJlYW1TZWFsQWdlTXM6IDEwICogNjAgKiA2MCAqIDEwMDAsXG4gICAgLy8gV2FpdCB0aGlzIGxvbmcgYWZ0ZXIgdGhlIHRhYiBiZWNvbWVzIHZpc2libGUgYmVmb3JlIHRoZSBmaXJzdCBtZXJnZSBjaGVjaywgdGhlbiBjaGVjayB0aGlzIG9mdGVuIGFmdGVyd2FyZHMuIFRhYiBiZWluZyBoaWRkZW4gY2FuY2VscyB0aGUgdGltZXJzIChubyBtZXJnZXMgd2hpbGUgaW4gYmFja2dyb3VuZCkuIEJyb3dzZXItb25seTsgTm9kZSBjb21wYWN0b3JzIChlLmcuIHJlbW90ZUZpbGVTZXJ2ZXIpIGRyaXZlIHRoZWlyIG93biBwb2xsaW5nLlxuICAgIHZpc2libGVNZXJnZUludGVydmFsTXM6IDUgKiA2MCAqIDEwMDAsXG4gICAgbWVyZ2VTcGFjaW5nTXM6IDUgKiA2MCAqIDEwMDAsXG4gICAgLy8gUGhhc2UgMiByb2xscyB0aGUgbG9vc2UgYnVsayBmaWxlcyB1cCBvbmNlIHRoZXkgcGFzcyBlaXRoZXIgb2YgdGhlc2UuIEJ5dGVzIGJlY2F1c2UgcmVhZCBjb3N0IGdyb3dzIHdpdGggdGhlbTsgY291bnQgYmVjYXVzZSBlYWNoIGxvb3NlIGZpbGUgaG9sZHMgaXRzIHdob2xlIGtleSBsaXN0IGluIG1lbW9yeSBubyBtYXR0ZXIgaG93IGZldyBieXRlcyBpdCBoYXMsIHNvIGEgdHJpY2tsZSBvZiB0aW55IGZvbGRzIGhhcyB0byBiZSBjb2xsYXBzZWQgbG9uZyBiZWZvcmUgaXQgcmVhY2hlcyB0aGUgYnl0ZSB0cmlnZ2VyLlxuICAgIGxvb3NlQnVsa1RyaWdnZXJCeXRlczogMTAyNCAqIDEwMjQgKiAxMDI0LFxuICAgIGxvb3NlQnVsa1RyaWdnZXJGaWxlczogMjAsXG4gICAgc3RyZWFtRm9sZFRyaWdnZXJCeXRlczogNjQgKiAxMDI0ICogMTAyNCxcbiAgICBzdHJlYW1GaWxlTWF4Qnl0ZXM6IDUwICogMTAyNCAqIDEwMjQsXG4gICAgLy8gSG93IGxvbmcgdG8gd2FpdCBmb3IgcGVlcnMgdG8gYW5zd2VyIGEgc3RyZWFtLW93bmVyIGxpdmVuZXNzIHByb2JlLiBSdW5zIGluc2lkZSBhIG1lcmdlIHBhc3MsIHdoaWNoIGFscmVhZHkgd2FpdHMgMTVzIGZvciB0aGUgZmlsZSBsb2NrLCBzbyBhIHNlY29uZCBoZXJlIGNvc3RzIG5vdGhpbmcuXG4gICAgbGl2ZVdyaXRlclByb2JlTXM6IDEwMDAsXG4gICAgc3RyZWFtRm9sZEhhcmRMaW1pdEJ5dGVzOiA3NjggKiAxMDI0ICogMTAyNCxcbiAgICAvLyAwID0gZmx1c2ggZXZlcnkgd3JpdGUgKE5vZGUg4oCUIGFwcGVuZCBpcyByZWFsIGFuZCBjaGVhcCk7IGJyb3dzZXIgcmFtcHMgdG8gMTVzIHRvIGF2b2lkIHJld3JpdGluZyB0aGUgd2hvbGUgc3RyZWFtIGZpbGUgcGVyIHdyaXRlLlxuICAgIHdyaXRlRmx1c2hNYXhEZWxheU1zOiBpc05vZGUoKSA/IDAgOiAxNSAqIDEwMDAsXG4gICAgZmlsZVNldFBvbGxJbnRlcnZhbE1zOiAzMCAqIDYwICogMTAwMCxcbiAgICBtZW1vcnlGbHVzaEhlYXBCeXRlczogNSAqIDEwMjQgKiAxMDI0ICogMTAyNCxcbiAgICBtZW1vcnlGbHVzaE1pbkNvbGxlY3Rpb25CeXRlczogMTAwICogMTAyNCAqIDEwMjQsXG4gICAgbWVtb3J5Rmx1c2hUaHJvdHRsZU1zOiAxNSAqIDYwICogMTAwMCxcbn07XG5cbmZ1bmN0aW9uIGZtdEJ5dGVzKG46IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKG4gPCAxMDI0KSByZXR1cm4gbiArIFwiQlwiO1xuICAgIGlmIChuIDwgMTAyNCAqIDEwMjQpIHJldHVybiAobiAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIktCXCI7XG4gICAgaWYgKG4gPCAxMDI0ICogMTAyNCAqIDEwMjQpIHJldHVybiAobiAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJNQlwiO1xuICAgIHJldHVybiAobiAvIDEwMjQgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKSArIFwiR0JcIjtcbn1cblxuLy8gUmVhY3Rpdml0eSBzZWFtIChubyBtb2J4IGRlcGVuZGVuY3kgaW4gdGhpcyBmaWxlKS4gVGhlIG1vYnggc3ViY2xhc3Mgc3VwcGxpZXMgYSBSZWFjdGl2ZURlcHMgdGhhdCBtYXBzIHNpZ25hbCBzdHJpbmdzIHRvIGl0cyBvd24gZGVwZW5kZW5jeSB0cmFja2luZzsgbm9uLXJlYWN0aXZlIGNhbGxlcnMgcGFzcyBub29wUmVhY3RpdmVEZXBzLlxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZURlcHMge1xuICAgIG9ic2VydmUoc2lnbmFsOiBzdHJpbmcpOiB2b2lkO1xuICAgIGludmFsaWRhdGUoc2lnbmFsOiBzdHJpbmcpOiB2b2lkO1xuICAgIGJhdGNoKGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBPcHRpb25hbCDigJQgbGV0cyB3cml0ZXMgc2tpcCBwZXIta2V5IGludmFsaWRhdGlvbiBmb3Igcm93cyBub3RoaW5nIGlzIHdhdGNoaW5nLiBVbmRlZmluZWQgPSBcImFzc3VtZSB3YXRjaGVkXCIuXG4gICAgaXNPYnNlcnZlZD8oc2lnbmFsOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3Qgbm9vcFJlYWN0aXZlRGVwczogUmVhY3RpdmVEZXBzID0ge1xuICAgIG9ic2VydmUoKSB7IH0sXG4gICAgaW52YWxpZGF0ZSgpIHsgfSxcbiAgICBiYXRjaChmbikgeyBmbigpOyB9LFxuICAgIGlzT2JzZXJ2ZWQoKSB7IHJldHVybiBmYWxzZTsgfSxcbn07XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VGYWN0b3J5ID0gKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxGaWxlU3RvcmFnZT47XG5cbmV4cG9ydCB0eXBlIEJ1bGtEYXRhYmFzZTJDb25maWcgPSB7XG4gICAgLy8gU2VlIEJ1bGtEYXRhYmFzZVJlYWRlci5jZmcubWF4VHJpZ2dlclRocm90dGxlTXMuXG4gICAgbWF4VHJpZ2dlclRocm90dGxlTXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBNZXJnZVNraXBSZWFzb24gPVxuICAgIC8vIFRoaXMgaW5zdGFuY2UgaXMgYWxyZWFkeSBtaWQtbWVyZ2UuXG4gICAgfCBcIm1lcmdlSW5GbGlnaHRcIlxuICAgIC8vIEFub3RoZXIgc2FtZS1vcmlnaW4gdGFiIGhvbGRzIHRoZSBsb2NhbFN0b3JhZ2UgbWVyZ2UgbG9jay5cbiAgICB8IFwidGFiTG9ja0hlbGRcIlxuICAgIC8vIEFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGUgY3Jvc3MtcHJvY2VzcyAubWVyZ2UtbG9jayBmaWxlIChvciB3b24gdGhlIHNldHRsZSByYWNlIGZvciBpdCkuXG4gICAgfCBcImZpbGVMb2NrSGVsZFwiXG4gICAgLy8gY29tcGFjdCgpIG9ubHk6IHRoZSBjb2xsZWN0aW9uIGhhcyBubyBmaWxlcyBvbiBkaXNrLlxuICAgIHwgXCJub3RoaW5nVG9NZXJnZVwiO1xuXG4vLyBXaGF0IGEgY29tcGFjdCgpL3RyeU1lcmdlTm93KCkgY2FsbCBkaWQuIHNraXBSZWFzb24gaXMgc2V0IHdoZW4gdGhlIHBhc3MgbmV2ZXIgcmFuOyBmb3IgdGhlIGxvY2sgcmVhc29ucywgbG9ja0hvbGRlcklkL2xvY2tFeHBpcmVzSW5NcyByZXBvcnQgd2hvIGhvbGRzIHRoZSBsb2NrIGFuZCBob3cgbG9uZyB1bnRpbCBpdCBnb2VzIHN0YWxlIChzbyBhIHNjaGVkdWxlciBrbm93cyB3aGVuIHJldHJ5aW5nIGNvdWxkIHN1Y2NlZWQpLlxuZXhwb3J0IHR5cGUgTWVyZ2VBdHRlbXB0UmVzdWx0ID0ge1xuICAgIG1lcmdlZDogYm9vbGVhbjtcbiAgICBza2lwUmVhc29uPzogTWVyZ2VTa2lwUmVhc29uO1xuICAgIGxvY2tIb2xkZXJJZD86IHN0cmluZztcbiAgICBsb2NrRXhwaXJlc0luTXM/OiBudW1iZXI7XG59O1xuXG5sZXQgbmV0d29ya0NvbXBhY3Rpb25FbmFibGVkID0gZmFsc2U7XG5cbmxldCBmaWxlTmFtZUNvdW50ZXIgPSAwO1xuLy8gUGVyLXByb2Nlc3MgSUQgc28gdHdvIHdyaXRlcnMgcGlja2luZyB0aGUgc2FtZSB0aW1lc3RhbXAgKyBjb3VudGVyIG5ldmVyIGNvbGxpZGUgb24gYSBuYW1lLiBBbHNvIHN0YW1wZWQgaW50byBvdXIgc3RyZWFtIGZpbGUgbmFtZXMgYW5kIGFuc3dlcmVkIG92ZXIgdGhlIHN5bmMgY2hhbm5lbCwgc28gYSBwZWVyIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIHdyaXRlciBvZiBhIGdpdmVuIHN0cmVhbSBmaWxlIGlzIHN0aWxsIHJ1bm5pbmcuXG5jb25zdCB3cml0ZXJJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKTtcbnJlZ2lzdGVyV3JpdGVySWQod3JpdGVySWQpO1xuLy8gUmVzZXJ2ZWQgb3duZXIgZm9yIHRoZSB0b21ic3RvbmUtY2FycnkgZmlsZSBhIG1lcmdlIGVtaXRzLiBOb3RoaW5nIGV2ZXIgYXBwZW5kcyB0byBpdCwgYnV0IGl0IG11c3QgTk9UIHJlYWQgYXMgYWJhbmRvbmVkOiBmb2xkaW5nIGl0IHdvdWxkIGVtaXQgYW5vdGhlciBjYXJyeSBmaWxlLCB3aGljaCB3b3VsZCByZWFkIGFzIGFiYW5kb25lZCBpbiB0dXJuLCBhbmQgdGhlIHBhc3Mgd291bGQgZm9sZCBmb3JldmVyLlxuY29uc3QgTUVSR0VfT1VUUFVUX09XTkVSID0gXCJtZXJnZWRcIjtcbmZ1bmN0aW9uIG5leHRDb3VudGVyKCk6IG51bWJlciB7IHJldHVybiArK2ZpbGVOYW1lQ291bnRlcjsgfVxuXG5sZXQgbGFzdEZpbGVUaW1lID0gMDtcbi8vIFN0cmljdGx5LWluY3JlYXNpbmcgaW50ZWdlciBzbyBuZXdlc3QtZmlyc3Qgb3JkZXJpbmcgaXMgdW5hbWJpZ3VvdXMgd2l0aGluIGEgbWlsbGlzZWNvbmQuXG5mdW5jdGlvbiBuZXh0RmlsZVRpbWUoKTogbnVtYmVyIHtcbiAgICBsYXN0RmlsZVRpbWUgPSBNYXRoLm1heChEYXRlLm5vdygpLCBsYXN0RmlsZVRpbWUgKyAxKTtcbiAgICByZXR1cm4gbGFzdEZpbGVUaW1lO1xufVxuXG5mdW5jdGlvbiBuZXdGaWxlTmFtZSh0aW1lc3RhbXA6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAwXyR7dGltZXN0YW1wfV8ke3dyaXRlcklkfV8ke25leHRDb3VudGVyKCl9JHtGSUxFX0VYVEVOU0lPTn1gO1xufVxuXG4vLyBBY2NlcHQgb2xkIDMtcGFydCAoc3RyZWFtX3RpbWVzdGFtcF9yYW5kb20pIGFuZCBuZXcgNC1wYXJ0IChzdHJlYW1fdGltZXN0YW1wX293bmVySWRfY291bnRlcikgc2hhcGVzLiBBIDMtcGFydCBuYW1lIGNhcnJpZXMgbm8gb3duZXIsIHNvIGl0IGNhbiBuZXZlciBiZSBtYXRjaGVkIHRvIGEgbGl2ZSB3cml0ZXIg4oCUIHdoaWNoIGlzIHdoYXQgd2Ugd2FudDogbm8gYnVpbGQgdGhhdCBwcm9kdWNlcyB0aG9zZSBuYW1lcyBpcyBzdGlsbCBhcHBlbmRpbmcgdG8gdGhlbS5cbmZ1bmN0aW9uIHBhcnNlU3RyZWFtRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IFN0cmVhbUZpbGVJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKFNUUkVBTV9FWFRFTlNJT04pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnRzID0gZmlsZU5hbWUuc2xpY2UoMCwgLVNUUkVBTV9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKHBhcnRzWzBdICE9PSBcInN0cmVhbVwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgJiYgcGFydHMubGVuZ3RoICE9PSA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGltZXN0YW1wKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlTmFtZSwgdGltZXN0YW1wLCBvd25lcklkOiBwYXJ0cy5sZW5ndGggPT09IDQgJiYgcGFydHNbMl0gfHwgdW5kZWZpbmVkIH07XG59XG5cbmZ1bmN0aW9uIG5ld1N0cmVhbUZpbGVOYW1lKG93bmVySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBzdHJlYW1fJHtEYXRlLm5vdygpfV8ke293bmVySWR9XyR7bmV4dENvdW50ZXIoKX0ke1NUUkVBTV9FWFRFTlNJT059YDtcbn1cblxuLy8gQWNjZXB0IG9sZCAzLXBhcnQgKGxldmVsX3RpbWVzdGFtcF9jb3VudGVyKSBhbmQgbmV3IDQtcGFydCAobGV2ZWxfdGltZXN0YW1wX3dyaXRlcklkX2NvdW50ZXIpIHNoYXBlcy5cbmZ1bmN0aW9uIHBhcnNlRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IEJ1bGtGaWxlSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aChGSUxFX0VYVEVOU0lPTikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFydHMgPSBmaWxlTmFtZS5zbGljZSgwLCAtRklMRV9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGV2ZWwgPSBwYXJzZUludChwYXJ0c1swXSwgMTApO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobGV2ZWwpIHx8ICFOdW1iZXIuaXNGaW5pdGUodGltZXN0YW1wKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlTmFtZSwgbGV2ZWwsIHRpbWVzdGFtcCB9O1xufVxuXG4vKiogT25lIHRocmVzaG9sZCBhIGNvbXBhY3Rpb24gc3RlcCBpcyBtZWFzdXJlZCBhZ2FpbnN0LiBgdmFsdWVgIGlzIHdoZXJlIHRoZSBjb2xsZWN0aW9uIHN0YW5kcyBub3cgYW5kIGB0aHJlc2hvbGRgIGlzIHdoYXQgc2V0cyB0aGUgc3RlcCBvZmYsIHNvIGBmcmFjdGlvbmAgKHZhbHVlL3RocmVzaG9sZCkgcmVhZHMgYXMgaG93IGNsb3NlIGl0IGlzIC0gMSBvciBtb3JlIG1lYW5zIG1ldC4gRGVsaWJlcmF0ZWx5IG5vdCBjbGFtcGVkLCBzbyBhbiBvdmVyZHVlIHN0ZXAgcmVhZHMgYXMgaG93IGZhciBwYXN0IGR1ZSBpdCBpcy4gKi9cbmV4cG9ydCB0eXBlIENvbXBhY3Rpb25UcmlnZ2VyID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHRocmVzaG9sZDogbnVtYmVyO1xuICAgIGZyYWN0aW9uOiBudW1iZXI7XG4gICAgbWV0OiBib29sZWFuO1xuICAgIC8qKiBIb3cgdG8gcmVuZGVyIHZhbHVlL3RocmVzaG9sZC4gXCJmcmFjdGlvblwiIHZhbHVlcyBhcmUgMC4uMS4gKi9cbiAgICB1bml0OiBcImJ5dGVzXCIgfCBcImNvdW50XCIgfCBcImZyYWN0aW9uXCI7XG59O1xuXG4vKiogc3RyZWFtSGFyZExpbWl0IGFuZCBzdHJlYW1Gb2xkIGFyZSBwaGFzZSAxIChzdHJlYW0gLT4gYnVsayksIGxvb3NlQ29tYmluZSBpcyBwaGFzZSAyIChsb29zZSBidWxrIC0+IGNvbWJpbmVkIGJ1bGspLCBkZWR1cEFsbCBhbmQgZGVkdXBLZXlHcm91cCBhcmUgcGhhc2UgMy4gKi9cbmV4cG9ydCB0eXBlIENvbXBhY3Rpb25TdGVwS2luZCA9IFwic3RyZWFtSGFyZExpbWl0XCIgfCBcInN0cmVhbUZvbGRcIiB8IFwibG9vc2VDb21iaW5lXCIgfCBcImRlZHVwQWxsXCIgfCBcImRlZHVwS2V5R3JvdXBcIjtcblxuZXhwb3J0IHR5cGUgQ29tcGFjdGlvblN0ZXAgPSB7XG4gICAgcGhhc2U6IDEgfCAyIHwgMztcbiAgICBraW5kOiBDb21wYWN0aW9uU3RlcEtpbmQ7XG4gICAgLyoqIFdoZXRoZXIgdGhpcyBzdGVwIHJ1bnMgb24gdGhlIG5leHQgcGFzcy4gQXV0aG9yaXRhdGl2ZTogb24gdG9wIG9mIGByZXF1aXJlc2AgaXQgYWNjb3VudHMgZm9yIGlucHV0cyB0aGUgc3RlcCBuZWVkcyBiZXlvbmQgaXRzIHRocmVzaG9sZHMgKGUuZy4gdHdvIGZpbGVzIHRvIGNvbWJpbmUpLCBzbyBpdCBjYW4gYmUgZmFsc2UgZXZlbiB3aXRoIGV2ZXJ5IHRyaWdnZXIgbWV0LiAqL1xuICAgIHJlYWR5OiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGV2ZXJ5IHRyaWdnZXIgaGFzIHRvIGJlIG1ldCBmb3IgdGhpcyBzdGVwLCBvciBqdXN0IG9uZSBvZiB0aGVtLiAqL1xuICAgIHJlcXVpcmVzOiBcImFueVwiIHwgXCJhbGxcIjtcbiAgICB0cmlnZ2VyczogQ29tcGFjdGlvblRyaWdnZXJbXTtcbiAgICAvKiogV2hlbiB0aGlzIHN0ZXAncyBtZXJnZSBzdGFydHMsIGdpdmVuIG1lcmdlcyBhcmUgc3BhY2VkIG1lcmdlU3BhY2luZ01zIGFwYXJ0LiBPbmx5IHNldCB3aGVuIHJlYWR5LiAqL1xuICAgIHN0YXJ0VGltZT86IG51bWJlcjtcbiAgICAvKiogVGhlIGZpbGVzIHRoaXMgc3RlcCBjb25zdW1lcywgYXMgb2Ygd2hlbiB0aGUgcGxhbiB3YXMgbWFkZS4gKi9cbiAgICBidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdO1xuICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdO1xuICAgIC8qKiBUb3RhbCBzaXplIG9mIHRob3NlIGlucHV0cy4gKi9cbiAgICBieXRlczogbnVtYmVyO1xuICAgIC8qKiBkZWR1cEtleUdyb3VwIG9ubHkgLSB0aGUga2V5IHJhbmdlIHRoZSBzdGVwIHJld3JpdGVzLiAqL1xuICAgIGtleVJhbmdlPzogeyBsbzogc3RyaW5nOyBoaTogc3RyaW5nIH07XG59O1xuXG4vKiogRXZlcnkgY29tcGFjdGlvbiB0aGUgY3VycmVudCBmaWxlIHNldCBjYWxscyBmb3IsIGluIHRoZSBvcmRlciBhIG1lcmdlIHBhc3MgcnVucyB0aGVtLCBwbHVzIGhvdyBjbG9zZSBlYWNoIG5vdC15ZXQtcmVhZHkgb25lIGlzIHRvIGl0cyB0aHJlc2hvbGRzLiAqL1xuZXhwb3J0IHR5cGUgQ29tcGFjdGlvblBsYW4gPSB7XG4gICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHRoZSBwbGFuIHdhcyBjb21wdXRlZDsgZXZlcnkgc3RhcnRUaW1lIGlzIG1lYXN1cmVkIGZyb20gaGVyZS4gKi9cbiAgICB0aW1lOiBudW1iZXI7XG4gICAgc3RlcHM6IENvbXBhY3Rpb25TdGVwW107XG59O1xuXG5mdW5jdGlvbiBtYWtlVHJpZ2dlcihjb25maWc6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyOyB0aHJlc2hvbGQ6IG51bWJlcjsgdW5pdDogQ29tcGFjdGlvblRyaWdnZXJbXCJ1bml0XCJdIH0pOiBDb21wYWN0aW9uVHJpZ2dlciB7XG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBmcmFjdGlvbjogY29uZmlnLnZhbHVlIC8gY29uZmlnLnRocmVzaG9sZCwgbWV0OiBjb25maWcudmFsdWUgPj0gY29uZmlnLnRocmVzaG9sZCB9O1xufVxuXG5mdW5jdGlvbiBmbXRUcmlnZ2VyVmFsdWUodmFsdWU6IG51bWJlciwgdW5pdDogQ29tcGFjdGlvblRyaWdnZXJbXCJ1bml0XCJdKTogc3RyaW5nIHtcbiAgICBpZiAodW5pdCA9PT0gXCJieXRlc1wiKSByZXR1cm4gZm10Qnl0ZXModmFsdWUpO1xuICAgIGlmICh1bml0ID09PSBcImZyYWN0aW9uXCIpIHJldHVybiBgJHtNYXRoLnJvdW5kKHZhbHVlICogMTAwKX0lYDtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1bGtEYXRhYmFzZUJhc2U8VCBleHRlbmRzIHsga2V5OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgZGVwczogUmVhY3RpdmVEZXBzLFxuICAgICAgICBwcml2YXRlIHN0b3JhZ2VGYWN0b3J5OiBTdG9yYWdlRmFjdG9yeSxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc6IEJ1bGtEYXRhYmFzZTJDb25maWcgPSB7fSxcbiAgICApIHsgfVxuXG4gICAgLy8gVGhlIHJlYWRlciAoYW5kIHRoZSBiYWNrZ3JvdW5kIG1hY2hpbmVyeSB0aGF0IHJpZGVzIGFsb25nIHdpdGggaXQpIG11c3QgTk9UIGJlIHNldCB1cCBqdXN0IGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gd2FzIGNvbnN0cnVjdGVkLiBNYW55IGNvbGxlY3Rpb25zIGFyZSBjb25zdHJ1Y3RlZCBhbmQgbmV2ZXIgdG91Y2hlZCwgYW5kIGluIE5vZGUgYSBtZXJnZSB0aWNrIHdvdWxkIHBva2UgdGhlIHN0b3JhZ2UgZmFjdG9yeSAoZS5nLiBpbmRleGVkREIpIGFuZCB0aHJvdy4gV2UgYnVpbGQgaXQgbGF6aWx5IG9uIGZpcnN0IGFjY2VzcyB0byBgdGhpcy5yZWFkZXJgOiBldmVyeSByZWFkLCB3cml0ZSwgYW5kIG1lcmdlIGdvZXMgdGhyb3VnaCB0aGUgcmVhZGVyLCB3aGlsZSBwdXJlIGNvbnN0cnVjdGlvbiBuZXZlciB0b3VjaGVzIGl0LlxuICAgIHByaXZhdGUgX3JlYWRlcjogQnVsa0RhdGFiYXNlUmVhZGVyPFQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgZ2V0IHJlYWRlcigpOiBCdWxrRGF0YWJhc2VSZWFkZXI8VD4ge1xuICAgICAgICBpZiAodGhpcy5fcmVhZGVyKSByZXR1cm4gdGhpcy5fcmVhZGVyO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVsa0RhdGFiYXNlUmVhZGVyPFQ+KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGRlcHM6IHRoaXMuZGVwcyxcbiAgICAgICAgICAgIG1heFRyaWdnZXJUaHJvdHRsZU1zOiB0aGlzLmNvbmZpZy5tYXhUcmlnZ2VyVGhyb3R0bGVNcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5zZXRFbnN1cmVJbmRleCgoKSA9PiB0aGlzLmVuc3VyZUluZGV4KCkpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgKCkgPT4gdm9pZCB0aGlzLmZsdXNoUGVuZGluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwiaGlkZGVuXCIpIHZvaWQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdCBpbiBhIERPTSBjb250ZXh0ICovIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVTZXRQb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIHRoaXMucG9sbEZpbGVTZXQoKSwgYnVsa0RhdGFiYXNlMlRpbWluZy5maWxlU2V0UG9sbEludGVydmFsTXMpO1xuICAgICAgICAodGhpcy5maWxlU2V0UG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgdGhpcy5zZXR1cFZpc2liaWxpdHlNZXJnZUNoZWNrKCk7XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2UubGl2ZUluc3RhbmNlcy5hZGQodGhpcyk7XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2Uuc3RhcnRNZW1vcnlXYXRjaGRvZygpO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IGB2aXNpYmxlTWVyZ2VJbnRlcnZhbE1zYCBvZiBiZWluZy12aXNpYmxlIHRpbWUsIHJ1biBhIG1lcmdlIGNoZWNrLiBGaXJzdCBjaGVjayBmaXJlcyBgdmlzaWJsZU1lcmdlSW50ZXJ2YWxNc2AgYWZ0ZXIgdGhlIHRhYiBiZWNvbWVzIHZpc2libGUgKG5vdCBvbiBpbml0aWFsIGxvYWQg4oCUIGdpdmVzIHRoZSB1c2VyIGEgbW9tZW50IG9mIHNlc3Npb24gY29tbWl0bWVudCBiZWZvcmUgd2Ugc3RhcnQgY2h1cm5pbmcgdGhlIEZTKSwgdGhlbiBldmVyeSBpbnRlcnZhbCBhZnRlci4gVGFiIGhpZGluZyBjYW5jZWxzIHRoZSB0aW1lcnM7IHZpc2libGUtYWdhaW4gcmVzdGFydHMuIE5vZGUgaGFzIG5vIGRvY3VtZW50IOKAlCB0aGVyZSB3ZSBjb25zaWRlciBvdXJzZWx2ZXMgYWx3YXlzLXZpc2libGUgYW5kIGp1c3QgaW5zdGFsbCB0aGUgaW50ZXJ2YWwgZGlyZWN0bHkuXG4gICAgcHJpdmF0ZSBzZXR1cFZpc2liaWxpdHlNZXJnZUNoZWNrKCk6IHZvaWQge1xuICAgICAgICBsZXQgZmlyc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbnRlcnZhbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lcikgeyBjbGVhclRpbWVvdXQoZmlyc3RUaW1lcik7IGZpcnN0VGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgIGlmIChpbnRlcnZhbFRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxUaW1lcik7IGludGVydmFsVGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lciB8fCBpbnRlcnZhbFRpbWVyKSByZXR1cm47XG4gICAgICAgICAgICBmaXJzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMubWF5YmVNZXJnZSgpO1xuICAgICAgICAgICAgICAgIGludGVydmFsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIHRoaXMubWF5YmVNZXJnZSgpLCBidWxrRGF0YWJhc2UyVGltaW5nLnZpc2libGVNZXJnZUludGVydmFsTXMpO1xuICAgICAgICAgICAgICAgIChpbnRlcnZhbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgIH0sIGJ1bGtEYXRhYmFzZTJUaW1pbmcudmlzaWJsZU1lcmdlSW50ZXJ2YWxNcyk7XG4gICAgICAgICAgICAoZmlyc3RUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHsgc3RhcnQoKTsgcmV0dXJuOyB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIHN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgZWxzZSBzdG9wKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSBzdGFydCgpO1xuICAgICAgICB9IGNhdGNoIHsgLyogbm90IGluIGEgRE9NIGNvbnRleHQgKi8gfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMgPSB7IGJ1bGs6IG5ldyBNYXAoKSwgc3RyZWFtOiBuZXcgTWFwKCkgfTtcblxuICAgIHByaXZhdGUgcGVuZGluZ0FwcGVuZHM6IEJ1ZmZlcltdID0gW107XG4gICAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGZsdXNoQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIGN1cnJlbnRGbHVzaERlbGF5ID0gMDtcbiAgICBwcml2YXRlIGxhc3RXcml0ZVRpbWUgPSAwO1xuXG4gICAgcHJpdmF0ZSBzdHJlYW1GaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgY3VycmVudFN0cmVhbUZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBjdXJyZW50U3RyZWFtRmlsZUJ5dGVzID0gMDtcbiAgICAvLyBJbi1wcm9jZXNzIHJlLWVudHJ5IGd1YXJkOiBpZiBhIG1lcmdlIGlzIHJ1bm5pbmcsIGFkZGl0aW9uYWwgdHJpZ2dlcnMgKHZpc2liaWxpdHkgdGltZXIsIHdyaXRlcywgdHJ5TWVyZ2VOb3cgY2FsbHMpIHJldHVybiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHF1ZXVlaW5nLiBLZWVwcyB0aGUgdmlzaWJpbGl0eS10aW1lciBmaXJpbmdzIGZyb20gc3RhY2tpbmcgYmVoaW5kIGEgbG9uZyBtZXJnZS5cbiAgICBwcml2YXRlIG1lcmdlSW5GbGlnaHQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RNZXJnZVNraXBMb2dNcyA9IDA7XG4gICAgLy8gUnVubmluZyBjb3VudGVyIG9mIHN0cmVhbS10aWVyIGJ5dGVzIG9uIGRpc2suIFNlZWRlZCBmcm9tIGVhY2ggTG9hZGVkSW5kZXggYnVpbGQsIHRoZW4gaW5jcmVtZW50ZWQgcGVyIGZsdXNoIHNvIHRoZSBmb2xkLXRyaWdnZXIgY2hlY2tzIGN1cnJlbnQgZGF0YSB3aXRob3V0IGFuIGV4dHJhIGRpcmVjdG9yeSBsaXN0aW5nLlxuICAgIHByaXZhdGUgc3RyZWFtQnl0ZXNPbkRpc2sgPSAwO1xuXG4gICAgcHJpdmF0ZSBmaWxlU2V0UG9sbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByZWJ1aWxkUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHJlYnVpbGREaXJ0eSA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVidWlsZE9wdGlvbnM6IHsgZHJvcFN0YWxlRmFsbGJhY2s6IGJvb2xlYW4gfSA9IHsgZHJvcFN0YWxlRmFsbGJhY2s6IGZhbHNlIH07XG5cbiAgICAvLyDilIDilIAgbWVtb3J5LXByZXNzdXJlIHdhdGNoZG9nIChnbG9iYWwsIGJyb3dzZXItb25seSkg4pSA4pSAXG4gICAgcHJpdmF0ZSBzdGF0aWMgbGl2ZUluc3RhbmNlcyA9IG5ldyBTZXQ8QnVsa0RhdGFiYXNlQmFzZTx7IGtleTogc3RyaW5nIH0+PigpO1xuICAgIHByaXZhdGUgc3RhdGljIG1lbW9yeVdhdGNoZG9nU3RhcnRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIGxhc3RNZW1vcnlGbHVzaE1zID0gMDtcbiAgICBwcml2YXRlIHN0YXRpYyBzdGFydE1lbW9yeVdhdGNoZG9nKCkge1xuICAgICAgICBpZiAoQnVsa0RhdGFiYXNlQmFzZS5tZW1vcnlXYXRjaGRvZ1N0YXJ0ZWQpIHJldHVybjtcbiAgICAgICAgQnVsa0RhdGFiYXNlQmFzZS5tZW1vcnlXYXRjaGRvZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB1c2VkSGVhcCA9ICgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIChwZXJmb3JtYW5jZSBhcyB1bmtub3duIGFzIHsgbWVtb3J5PzogeyB1c2VkSlNIZWFwU2l6ZT86IG51bWJlciB9IH0pPy5tZW1vcnk/LnVzZWRKU0hlYXBTaXplOyB9XG4gICAgICAgICAgICBjYXRjaCB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB1c2VkSGVhcCgpID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1c2VkID0gdXNlZEhlYXAoKTtcbiAgICAgICAgICAgIGlmICh1c2VkICE9PSB1bmRlZmluZWQpIEJ1bGtEYXRhYmFzZUJhc2UuY2hlY2tNZW1vcnlQcmVzc3VyZSh1c2VkKTtcbiAgICAgICAgfSwgTUVNT1JZX1dBVENIRE9HX0lOVEVSVkFMX01TKTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaGVja01lbW9yeVByZXNzdXJlKHVzZWRIZWFwQnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodXNlZEhlYXBCeXRlcyA8IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVtb3J5Rmx1c2hIZWFwQnl0ZXMpIHJldHVybjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyAtIEJ1bGtEYXRhYmFzZUJhc2UubGFzdE1lbW9yeUZsdXNoTXMgPCBidWxrRGF0YWJhc2UyVGltaW5nLm1lbW9yeUZsdXNoVGhyb3R0bGVNcykgcmV0dXJuO1xuICAgICAgICBCdWxrRGF0YWJhc2VCYXNlLmxhc3RNZW1vcnlGbHVzaE1zID0gbm93O1xuICAgICAgICBjb25zdCBmbHVzaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRiIG9mIEJ1bGtEYXRhYmFzZUJhc2UubGl2ZUluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBkYi5yZWFkZXIuaW5kZXg/LnRvdGFsQnl0ZXMgPz8gMDtcbiAgICAgICAgICAgIGlmIChieXRlcyA+IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVtb3J5Rmx1c2hNaW5Db2xsZWN0aW9uQnl0ZXMpIHtcbiAgICAgICAgICAgICAgICBmbHVzaGVkLnB1c2goYCR7ZGIubmFtZX0gKCR7Zm10Qnl0ZXMoYnl0ZXMpfSlgKTtcbiAgICAgICAgICAgICAgICBkYi5yZWxvYWRGcm9tRGlzaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmbHVzaGVkLmxlbmd0aCkgY29uc29sZS5sb2coYFtidWxrMl0gaGVhcCAke2ZtdEJ5dGVzKHVzZWRIZWFwQnl0ZXMpfSBvdmVyICR7Zm10Qnl0ZXMoYnVsa0RhdGFiYXNlMlRpbWluZy5tZW1vcnlGbHVzaEhlYXBCeXRlcyl9IC0gZmx1c2hlZCAke2ZsdXNoZWQubGVuZ3RofSBsYXJnZSBjb2xsZWN0aW9uKHMpOiAke2ZsdXNoZWQuam9pbihcIiwgXCIpfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZSgpIHtcbiAgICAgICAgYmxvY2tDYWNoZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5hYmxlTmV0d29ya0NvbXBhY3Rpb24oKSB7XG4gICAgICAgIG5ldHdvcmtDb21wYWN0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3JhZ2UgPSBsYXp5KGFzeW5jICgpID0+IHRoaXMuc3RvcmFnZUZhY3RvcnkoYCR7QlVMS19ST09UX0ZPTERFUn0vJHt0aGlzLm5hbWV9YCkpO1xuXG4gICAgcHVibGljIGFzeW5jIGlzUmVtb3RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gISEoYXdhaXQgdGhpcy5zdG9yYWdlKCkpLmlzUmVtb3RlO1xuICAgIH1cblxuICAgIC8vIFVuY29tcGFjdGVkIHN0cmVhbSBieXRlcyBoYXZlIHRvIGJlIHJlYWQgYW5kIGRlY29kZWQgaW4gZnVsbCBieSBldmVyeSByZWFkZXIgb24gZXZlcnkgaW5kZXggYnVpbGQsIHNvIHNpemUgYWxvbmUgZGVjaWRlcyDigJQgYSBmb2xkIGlzIHdvcnRoIGl0IGV2ZW4gaWYgdGhvc2UgYnl0ZXMgYXJlIG9uZSBlbm9ybW91cyByb3cuXG4gICAgcHJpdmF0ZSBzdHJlYW1OZWVkc0ZvbGQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbUJ5dGVzT25EaXNrID4gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkVHJpZ2dlckJ5dGVzO1xuICAgIH1cblxuICAgIC8vIFN0cmVhbSBmaWxlcyBub2JvZHkgY2FuIHN0aWxsIGJlIGFwcGVuZGluZyB0bywgc3BsaXQgYnkgd2hvIG93bmVkIHRoZW06XG4gICAgLy8gICByZXRpcmFibGUgLSBhIGZvbGQgbWF5IGRlbGV0ZSB0aGVzZSB0aGUgbW9tZW50IGl0IGhhcyBjb25zdW1lZCB0aGVtLCBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHN0cmVhbVNlYWxBZ2VNcy4gSW5jbHVkZXMgb3VyIG93biBzZWFsZWQgZmlsZXMgYW5kIG1lcmdlLWNhcnJ5IG91dHB1dC5cbiAgICAvLyAgIG93bmVyR29uZSAtIG5vYm9keSBpcyBsZWZ0IHRvIGZvbGQgdGhlc2UgKGEgY2xvc2VkIHRhYidzIGxlZnRvdmVycywgb3IgYSBsZWdhY3kgbmFtZSB3aXRoIG5vIG93bmVyIHN0YW1wKSwgYW5kIHVudGlsIG9uZSBpcyBmb2xkZWQgZXZlcnkgcmVhZGVyIGhhcyB0byBkZWNvZGUgYWxsIG9mIGl0IGp1c3QgdG8gYnVpbGQgdGhlIGluZGV4LiBXb3J0aCBmb2xkaW5nIGF0IGFueSBzaXplLiBPdXIgb3duIGZpbGVzIGFyZSBkZWxpYmVyYXRlbHkgTk9UIGluIGhlcmU6IGV2ZXJ5IG1lcmdlIHBhc3Mgc2VhbHMgb3Vycywgc28gY291bnRpbmcgdGhlbSB3b3VsZCBmb2xkIG9uIGV2ZXJ5IHRpY2s7IHRoZSBzdHJlYW1GaWxlTWF4Qnl0ZXMgcm9sbG92ZXIgYW5kIHRoZSBzdHJlYW1Gb2xkVHJpZ2dlckJ5dGVzIGdhdGUgY292ZXIgb3VycyBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gRm9yZWlnbiBvd25lcnMgYXJlIHByb2JlZCBvdmVyIHRoZSBzeW5jIGNoYW5uZWwuIEluIE5vZGUgdGhlcmUgaXMgbm8gY2hhbm5lbCwgc28gd2UgY2Fubm90IGtub3cgLSBldmVyeSBmb3JlaWduIG93bmVyIGlzIGFzc3VtZWQgYWxpdmUgYW5kIHRoZSBzdHJlYW1TZWFsQWdlTXMgcnVsZSBzdGFuZHMuXG4gICAgLy9cbiAgICAvLyBhc3N1bWVTZWFsZWQgaXMgZm9yIHBsYW5uaW5nOiBhIG1lcmdlIHBhc3MgYnJvYWRjYXN0cyBhIHNlYWwgYmVmb3JlIGl0IHN0YXJ0cywgc28gYnkgdGhlIHRpbWUgaXQgbWVyZ2VzIG91ciBjdXJyZW50IGZpbGUgSVMgZmluYWwuIFRoZSBwbGFubmVyIHBhc3NlcyBpc1N5bmNTdXBwb3J0ZWQoKSB0byBwcmVkaWN0IHRoYXQ7IGFueXRoaW5nIGRlY2lkaW5nIGEgcmVhbCBkZWxldGlvbiBwYXNzZXMgZmFsc2UgYW5kIGdvZXMgYnkgc3RyZWFtRmlsZU5hbWUgYXMgaXQgYWN0dWFsbHkgc3RhbmRzLlxuICAgIHByaXZhdGUgYXN5bmMgZmluZEFiYW5kb25lZFN0cmVhbXMoc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sIGFzc3VtZVNlYWxlZDogYm9vbGVhbik6IFByb21pc2U8eyByZXRpcmFibGU6IFNldDxzdHJpbmc+OyBvd25lckdvbmU6IFNldDxzdHJpbmc+IH0+IHtcbiAgICAgICAgY29uc3QgcmV0aXJhYmxlID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IG93bmVyR29uZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBoYXNGb3JlaWduT3duZXIgPSBzdHJlYW1GaWxlcy5zb21lKGYgPT4gZi5vd25lcklkICYmIGYub3duZXJJZCAhPT0gd3JpdGVySWQgJiYgZi5vd25lcklkICE9PSBNRVJHRV9PVVRQVVRfT1dORVIpO1xuICAgICAgICBjb25zdCBsaXZlID0gaGFzRm9yZWlnbk93bmVyICYmIGF3YWl0IHF1ZXJ5TGl2ZVdyaXRlcnModGhpcy5uYW1lLCBidWxrRGF0YWJhc2UyVGltaW5nLmxpdmVXcml0ZXJQcm9iZU1zKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBzdHJlYW1GaWxlcykge1xuICAgICAgICAgICAgaWYgKGYub3duZXJJZCA9PT0gTUVSR0VfT1VUUFVUX09XTkVSKSB7IHJldGlyYWJsZS5hZGQoZi5maWxlTmFtZSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAvLyBzdHJlYW1GaWxlTmFtZSBpcyB0aGUgb25seSBcIndlIHdpbGwgYXBwZW5kIGhlcmUgYWdhaW5cIiBzaWduYWwgLSBvbmNlIGl0IG1vdmVzIG9uLCBnZXRTdHJlYW1GaWxlTmFtZSBvcGVucyBhIGZyZXNoIGZpbGUgYW5kIHRoaXMgb25lIGlzIGZpbmFsLlxuICAgICAgICAgICAgaWYgKGYub3duZXJJZCA9PT0gd3JpdGVySWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXNzdW1lU2VhbGVkIHx8IGYuZmlsZU5hbWUgIT09IHRoaXMuc3RyZWFtRmlsZU5hbWUpIHJldGlyYWJsZS5hZGQoZi5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWYub3duZXJJZCB8fCBsaXZlICYmICFsaXZlLmhhcyhmLm93bmVySWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0aXJhYmxlLmFkZChmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBvd25lckdvbmUuYWRkKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHJldGlyYWJsZSwgb3duZXJHb25lIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRvbWF0aWNDb21wYWN0aW9uQWxsb3dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKG5ldHdvcmtDb21wYWN0aW9uRW5hYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChpc05vZGUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhKGF3YWl0IHRoaXMuc3RvcmFnZSgpKS5pc1JlbW90ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNLZXlXYXRjaGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0tleVdhdGNoZWQoa2V5KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgaW5kZXggbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5kZXgoKTogUHJvbWlzZTxMb2FkZWRJbmRleDxUPj4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkZXIuaW5kZXgpIHJldHVybiB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgaWYgKCFpZHgpIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5hbWV9OiBpbmRleCBmYWlsZWQgdG8gYnVpbGRgKTtcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICAvLyBDb2FsZXNjaW5nIHJlYnVpbGQgbG9vcDogdHJpZ2dlcnMgZHVyaW5nIGEgYnVpbGQgc2V0IHJlYnVpbGREaXJ0eSBzbyB0aGUgbG9vcCBpdGVyYXRlcyBvbmNlIG1vcmUgd2hlbiBpdCBmaW5pc2hlcyDigJQgTiByYXBpZCB0cmlnZ2VycyBjYXVzZSBhdCBtb3N0IE9ORSBleHRyYSByZWJ1aWxkIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBlbmRzLlxuICAgIHByaXZhdGUgdHJpZ2dlclJlYnVpbGQob3B0czogeyBkcm9wU3RhbGVGYWxsYmFjaz86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChvcHRzLmRyb3BTdGFsZUZhbGxiYWNrKSB0aGlzLnJlYnVpbGRPcHRpb25zLmRyb3BTdGFsZUZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucmVidWlsZFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZERpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGRQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVidWlsZFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZERpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZG9PbmVSZWJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAodGhpcy5yZWJ1aWxkRGlydHkpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZE9wdGlvbnMuZHJvcFN0YWxlRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb09uZVJlYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGF3YWl0IExvYWRlZEluZGV4LmJ1aWxkPFQ+KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICBidWxrRmlsZXMsXG4gICAgICAgICAgICBzdHJlYW1GaWxlcyxcbiAgICAgICAgICAgIHN1YkNhY2hlczogdGhpcy5zdWJDYWNoZXMsXG4gICAgICAgICAgICBvblVucmVhZGFibGVGaWxlOiAoZiwgbXNnKSA9PiB0aGlzLmhhbmRsZVVucmVhZGFibGVGaWxlKGYsIG1zZyksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMucmVhZGVyLmluZGV4O1xuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChuZXdJbmRleCwgeyBkcm9wU3RhbGVGYWxsYmFjazogdGhpcy5yZWJ1aWxkT3B0aW9ucy5kcm9wU3RhbGVGYWxsYmFjayB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1CeXRlc09uRGlzayA9IG5ld0luZGV4LnN0cmVhbUJ5dGVzT25EaXNrO1xuICAgICAgICBpZiAob2xkSW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBvbGRJbmRleC5maWxlU2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdJbmRleC5maWxlU2V0LmhhcyhmKSkgYmxvY2tDYWNoZS5ldmljdChudWxsSm9pbih0aGlzLm5hbWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyb3AgZXZlcnl0aGluZyBpbi1tZW1vcnksIGhhcmQgcmVzZXQuIFBlbmRpbmcgdW4tZmx1c2hlZCB3cml0ZXMgc3Vydml2ZSAoc3RpbGwgaW4gb3ZlcmxheSkuXG4gICAgcHVibGljIHJlbG9hZEZyb21EaXNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YkNhY2hlcy5idWxrLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc3ViQ2FjaGVzLnN0cmVhbS5jbGVhcigpO1xuICAgICAgICB0aGlzLnJlYWRlci5pbmRleD8uZHJvcExvYWRlZFZhbHVlcygpO1xuICAgICAgICB2b2lkIHRoaXMudHJpZ2dlclJlYnVpbGQoeyBkcm9wU3RhbGVGYWxsYmFjazogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHRlcm5hbC1tZXJnZSBkZXRlY3Rpb246IGlmIHNvbWUgb3RoZXIgdGFiL3Byb2Nlc3MgY2hhbmdlZCB0aGUgZmlsZSBzZXQgdW5kZXIgdXMsIHJlYnVpbGQuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsRmlsZVNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRlci5pbmRleCkgcmV0dXJuO1xuICAgICAgICBsZXQgY3VycmVudDogU2V0PHN0cmluZz47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gbmV3IFNldChbLi4uYnVsa0ZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpLCAuLi5zdHJlYW1GaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKV0pO1xuICAgICAgICB9IGNhdGNoIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLnJlYWRlci5pbmRleD8uZmlsZVNldDtcbiAgICAgICAgaWYgKCFwcmV2KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBjdXJyZW50LnNpemUgIT09IHByZXYuc2l6ZSB8fCBbLi4uY3VycmVudF0uc29tZShuID0+ICFwcmV2LmhhcyhuKSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB2b2lkIHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlYWRXaXRoUmV0cnk8Uj4oZm46ICgpID0+IFByb21pc2U8Uj4pOiBQcm9taXNlPFI+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbmRleCgpO1xuICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucmVhZGVyLmluZGV4O1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIGF3YWl0IGZuKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1pc3NpbmdGaWxlRXJyb3IpIHx8IGF0dGVtcHQgPj0gTUFYX0lOREVYX1JFTE9BRF9BVFRFTVBUUykgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkZXIuaW5kZXggPT09IGJlZm9yZSkgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIGNyb3NzLXRhYiBzeW5jIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHByaXZhdGUgc3luY1NldHVwID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNTeW5jU3VwcG9ydGVkKCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbmRleCgpO1xuICAgICAgICBjb25zdCByZWNlbnQgPSBhd2FpdCBzeW5jQ29ubmVjdCh0aGlzLm5hbWUsIHcgPT4gdGhpcy5hcHBseVJlbW90ZSh3KSwgKCkgPT4geyB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHJlY2VudCkgdGhpcy5hcHBseVJlbW90ZSh3KTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXBwbHlSZW1vdGUod3JpdGU6IFJlbW90ZVdyaXRlKSB7XG4gICAgICAgIGlmICh3cml0ZS50aW1lIDw9IHRoaXMucmVhZGVyLmxvY2FsVGltZSh3cml0ZS5rZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuZGVwcy5iYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAod3JpdGUuZGVsZXRlZCkgdGhpcy5yZWFkZXIuYXBwbHlEZWxldGUod3JpdGUua2V5LCB3cml0ZS50aW1lKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5yZWFkZXIuYXBwbHlXcml0ZSh3cml0ZS5rZXksIHdyaXRlLnZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB3cml0ZS50aW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHdyaXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBwdWJsaWMgYXN5bmMgd3JpdGUoZW50cnk6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCYXRjaChbZW50cnldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVCYXRjaChlbnRyaWVzOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBlbnRyaWVzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgICAgICAgY29uc3Qgc3RhbXBlZCA9IHJvd3MubWFwKHJvdyA9PiAoeyB0aW1lOiBnZXRUaW1lVW5pcXVlKCksIHJvdyB9KSk7XG4gICAgICAgIGNvbnN0IGZyYW1lZCA9IGZyYW1lUm93cyhzdGFtcGVkKTtcblxuICAgICAgICAvLyBCaWcgYmF0Y2hlcyBza2lwIHRoZSBzdHJlYW0gYW5kIGJlY29tZSBhIGJ1bGsgZmlsZSBkaXJlY3RseSDigJQgc3RyZWFtaW5nIHRob3VzYW5kcyBvZiByb3dzIG9uZSBmcmFtZSBhdCBhIHRpbWUgd291bGQganVzdCBjaHVybi5cbiAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID49IFJPTExPVkVSX1JPV1MgfHwgZnJhbWVkLmxlbmd0aCA+PSBST0xMT1ZFUl9CWVRFUykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZUJ1bGtGaWxlKHJvd3MpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXBzLmJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCByb3cgfSBvZiBzdGFtcGVkKSB0aGlzLnJlYWRlci5hcHBseVdyaXRlKHJvdy5rZXkgYXMgc3RyaW5nLCByb3csIHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCB7IHRpbWUsIHJvdyB9IG9mIHN0YW1wZWQpIHN5bmNCcm9hZGNhc3QodGhpcy5uYW1lLCB7IGtleTogcm93LmtleSBhcyBzdHJpbmcsIHRpbWUsIHZhbHVlOiByb3cgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQXBwZW5kKGZyYW1lZCk7XG4gICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKHsgb25seUlmU3RyZWFtSGVhdnk6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVCYXRjaChba2V5XSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZUJhdGNoKGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICBjb25zdCBzdGFtcGVkID0ga2V5cy5tYXAoa2V5ID0+ICh7IHRpbWU6IGdldFRpbWVVbmlxdWUoKSwga2V5IH0pKTtcbiAgICAgICAgdGhpcy5kZXBzLmJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCBrZXkgfSBvZiBzdGFtcGVkKSB0aGlzLnJlYWRlci5hcHBseURlbGV0ZShrZXksIHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCB7IHRpbWUsIGtleSB9IG9mIHN0YW1wZWQpIHN5bmNCcm9hZGNhc3QodGhpcy5uYW1lLCB7IGtleSwgdGltZSwgZGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1BcHBlbmQoZnJhbWVEZWxldGVzKHN0YW1wZWQpKTtcbiAgICAgICAgdm9pZCB0aGlzLm1heWJlTWVyZ2UoeyBvbmx5SWZTdHJlYW1IZWF2eTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDb2FsZXNjZSBzdHJlYW0gYXBwZW5kcyBvbiBhIHJhbXBpbmcgcGVyLWNvbGxlY3Rpb24gc2NoZWR1bGUgKHRoZSBicm93c2VyIHJld3JpdGVzIHRoZSB3aG9sZSBmaWxlIHBlciBhcHBlbmQpLiBUaGUgZmlyc3Qgd3JpdGUgYWZ0ZXIgYSBsdWxsIGZsdXNoZXMgaW1tZWRpYXRlbHkgc28gYSBzaW5nbGUgZWRpdC10aGVuLWNsb3NlIGlzIHNhdmVkIGF0IG9uY2U7IHN1c3RhaW5lZCB3cml0ZXMgcmFtcCB0b3dhcmQgd3JpdGVGbHVzaE1heERlbGF5TXMuXG4gICAgcHJpdmF0ZSBhc3luYyBzdHJlYW1BcHBlbmQoZnJhbWVkOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nQXBwZW5kcy5wdXNoKGZyYW1lZCk7XG4gICAgICAgIGNvbnN0IG1heCA9IGJ1bGtEYXRhYmFzZTJUaW1pbmcud3JpdGVGbHVzaE1heERlbGF5TXM7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChtYXggPD0gMCB8fCB0aGlzLmN1cnJlbnRGbHVzaERlbGF5IDw9IDAgfHwgbm93IC0gdGhpcy5sYXN0V3JpdGVUaW1lID4gbWF4KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RXcml0ZVRpbWUgPSBub3c7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGbHVzaERlbGF5ID0gbWF4ID4gMCA/IE1hdGgubWluKG1heCwgV1JJVEVfRkxVU0hfRklSU1RfU1RFUF9NUykgOiAwO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RXcml0ZVRpbWUgPSBub3c7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoVGltZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5mbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuZmx1c2hUaW1lciA9IHVuZGVmaW5lZDsgdm9pZCB0aGlzLmZsdXNoUGVuZGluZygpOyB9LCB0aGlzLmN1cnJlbnRGbHVzaERlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRGbHVzaERlbGF5ID0gTWF0aC5taW4obWF4LCB0aGlzLmN1cnJlbnRGbHVzaERlbGF5ICogMik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hQZW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyICE9PSB1bmRlZmluZWQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuZmx1c2hUaW1lcik7IHRoaXMuZmx1c2hUaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgICAgICB0aGlzLmZsdXNoQ2hhaW4gPSB0aGlzLmZsdXNoQ2hhaW4udGhlbigoKSA9PiB0aGlzLmRvRmx1c2goKSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogc3RyZWFtIGZsdXNoIGZhaWxlZCwgd2lsbCByZXRyeTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZsdXNoQ2hhaW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb0ZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0FwcGVuZHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5wZW5kaW5nQXBwZW5kcy5zbGljZSgpO1xuICAgICAgICBjb25zdCBjb21iaW5lZCA9IEJ1ZmZlci5jb25jYXQoYmF0Y2gpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRTdHJlYW1GaWxlTmFtZSgpO1xuICAgICAgICBpZiAoZmlsZU5hbWUgIT09IHRoaXMuY3VycmVudFN0cmVhbUZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbiBmYWlsdXJlIHRoZSB0aHJvdyBsZWF2ZXMgcGVuZGluZ0FwcGVuZHMgaW50YWN0IHNvIGEgbGF0ZXIgZmx1c2ggcmV0cmllcy5cbiAgICAgICAgYXdhaXQgc3RvcmFnZS5hcHBlbmQoZmlsZU5hbWUsIGNvbWJpbmVkKTtcbiAgICAgICAgLy8gTmV3IGVudHJpZXMgYXBwZW5kZWQgZHVyaW5nIHRoZSBhd2FpdCBhcmUgYWZ0ZXIgYGJhdGNoYCDigJQgcmVtb3ZpbmcgdGhlIGZyb250IGlzIGV4YWN0bHkgdGhlIGZsdXNoZWQgc2V0LlxuICAgICAgICB0aGlzLnBlbmRpbmdBcHBlbmRzLnNwbGljZSgwLCBiYXRjaC5sZW5ndGgpO1xuICAgICAgICB0aGlzLnN0cmVhbUJ5dGVzT25EaXNrICs9IGNvbWJpbmVkLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0cmVhbUZpbGVCeXRlcyA+PSBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZpbGVNYXhCeXRlcykge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzID0gMDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5mb2xkT3duU3RyZWFtKGZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RyZWFtRmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gU2VhbCBvdXIgY3VycmVudCBmaWxlIG9uY2UgaXQgYWdlcyBwYXN0IHRoZSBzZWFsIHRocmVzaG9sZCDigJQgbm8gZmlsZSBpcyBldmVyIGFwcGVuZGVkIHRvIHBhc3QgaXRzIHNlYWwgYWdlLCB3aGljaCBsZXRzIGEgY29uc29saWRhdGlvbiBzYWZlbHkgZm9sZCBpdCBvbmNlIGFnZWQuXG4gICAgICAgIGlmICh0aGlzLnN0cmVhbUZpbGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBpbmZvID0gcGFyc2VTdHJlYW1GaWxlTmFtZSh0aGlzLnN0cmVhbUZpbGVOYW1lKTtcbiAgICAgICAgICAgIGlmIChpbmZvICYmIERhdGUubm93KCkgLSBpbmZvLnRpbWVzdGFtcCA+PSBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbVNlYWxBZ2VNcykgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtRmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtRmlsZU5hbWUgPSBuZXdTdHJlYW1GaWxlTmFtZSh3cml0ZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtRmlsZU5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmb2xkT3duU3RyZWFtKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IHBhcnNlU3RyZWFtRmlsZU5hbWUoZmlsZU5hbWUpO1xuICAgICAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlU2V0KFtdLCBbaW5mb10sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IGZvbGRpbmcgb3duIHN0cmVhbSAke2ZpbGVOYW1lfSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGVudHJ5OiBQYXJ0aWFsPFQ+ICYgeyBrZXk6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhdGNoKFtlbnRyeV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGVCYXRjaChlbnRyaWVzOiAoUGFydGlhbDxUPiAmIHsga2V5OiBzdHJpbmcgfSlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IHByZXNlbnQ6IFRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlFbnRyeSA9IHRoaXMucmVhZGVyLm92ZXJsYXkuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBvdmVybGF5RW50cnkgPyBvdmVybGF5RW50cnkudmFsdWUgIT09IERFTEVURUQgOiBpbmRleC5rZXlzLmhhcyhlbnRyeS5rZXkpO1xuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfS51cGRhdGU6IGtleSAke0pTT04uc3RyaW5naWZ5KGVudHJ5LmtleSl9IGlzIG5vdCBpbiB0aGUgY29sbGVjdGlvbiwgaWdub3JpbmdgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXNlbnQucHVzaChlbnRyeSBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVzZW50Lmxlbmd0aCkgYXdhaXQgdGhpcy53cml0ZUJhdGNoKHByZXNlbnQpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBmaWxlIGxpc3RpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHByaXZhdGUgYXN5bmMgbGlzdEZpbGVzKCk6IFByb21pc2U8eyBidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdOyBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSB9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBhd2FpdCBzdG9yYWdlLmdldEtleXMoKTtcbiAgICAgICAgLy8gQSBjb25zdW1lZC1tZXJnZSBpbnB1dCBpcyBoaWRkZW4gZnJvbSByZWFkcyB0aGUgaW5zdGFudCBpdHMgZGVsZXRpb24gbWFya2VyIGV4aXN0cyDigJQgdGhhdCdzIHdoYXQgc3RvcHMgaXQgZnJvbSBiZWluZyByZS1yZWFkIGFuZCByZS1tZXJnZWQuIFBoeXNpY2FsIGRlbGV0aW9uICsgbWFya2VyIGNsZWFudXAgcnVucyBvbiBhIHRocm90dGxlIChub3QgaW5saW5lKSBzbyBhIHJlYWQgaXNuJ3Qgc2xvd2VkIGJ5IGl0LlxuICAgICAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgcmVhZERlbGV0ZU1hcmtlcnMoc3RvcmFnZSwgbmFtZXMpO1xuICAgICAgICBjb25zdCBleGNsdWRlZCA9IG1hcmtlckV4Y2x1c2lvbnMobWFya2Vycyk7XG4gICAgICAgIGlmIChtYXJrZXJzLmxlbmd0aCkgdm9pZCB0aGlzLnByb2Nlc3NNYXJrZXJzKCk7XG4gICAgICAgIGNvbnN0IGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3Qgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVkZWQuaGFzKG4pKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChuLmVuZHNXaXRoKEZJTEVfRVhURU5TSU9OKSkgeyBjb25zdCBwID0gcGFyc2VGaWxlTmFtZShuKTsgaWYgKHApIGJ1bGtGaWxlcy5wdXNoKHApOyB9XG4gICAgICAgICAgICBlbHNlIGlmIChuLmVuZHNXaXRoKFNUUkVBTV9FWFRFTlNJT04pKSB7IGNvbnN0IHAgPSBwYXJzZVN0cmVhbUZpbGVOYW1lKG4pOyBpZiAocCkgc3RyZWFtRmlsZXMucHVzaChwKTsgfVxuICAgICAgICB9XG4gICAgICAgIGJ1bGtGaWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoYS50aW1lc3RhbXAgIT09IGIudGltZXN0YW1wKSByZXR1cm4gYi50aW1lc3RhbXAgLSBhLnRpbWVzdGFtcDtcbiAgICAgICAgICAgIHJldHVybiBhLmZpbGVOYW1lIDwgYi5maWxlTmFtZSAmJiAxIHx8IGEuZmlsZU5hbWUgPiBiLmZpbGVOYW1lICYmIC0xIHx8IDA7XG4gICAgICAgIH0pO1xuICAgICAgICBzb3J0KHN0cmVhbUZpbGVzLCBmID0+IGYudGltZXN0YW1wKTtcbiAgICAgICAgcmV0dXJuIHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9O1xuICAgIH1cblxuICAgIC8vIFRocm90dGxlZCBtYXJrZXIgaG91c2VrZWVwaW5nOiBkZWxldGUgaW5wdXRzIHdob3NlIHJlcGxhY2VtZW50IG91dHB1dHMgaGF2ZSBsYW5kZWQgKG9yIHdob3NlIG1hcmtlciBoYXMgYWdlZCBvdXQpIGFuZCByZXRpcmUgZnVsZmlsbGVkIG1hcmtlcnMuIFRyaWdnZXJlZCBmcm9tIGxpc3RGaWxlcywgc28gaXQncyBnYXRlZCB0byBhdm9pZCBhIGRlbGV0ZSBzdG9ybSB1bmRlciBoZWF2eSByZWFkcy5cbiAgICBwcml2YXRlIHByb2Nlc3NNYXJrZXJzID0gdGhyb3R0bGVGdW5jdGlvbigzMCAqIDEwMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGF3YWl0IHN0b3JhZ2UuZ2V0S2V5cygpO1xuICAgICAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgcmVhZERlbGV0ZU1hcmtlcnMoc3RvcmFnZSwgbmFtZXMpO1xuICAgICAgICBpZiAobWFya2Vycy5sZW5ndGgpIGF3YWl0IHByb2Nlc3NEZWxldGVNYXJrZXJzKHRoaXMubmFtZSwgc3RvcmFnZSwgbWFya2VycywgbmFtZXMpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUJ1bGtGaWxlKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXh0RmlsZVRpbWUoKTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdGltZXMgPSByb3dzLm1hcCgoKSA9PiBub3cpO1xuICAgICAgICBmb3IgKGNvbnN0IGJ1aWx0IG9mIGJ1aWxkRmlsZUJ1ZmZlcihyb3dzLCB0aW1lcykpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuZXdGaWxlTmFtZSh0aW1lc3RhbXApO1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQobmFtZSwgZW5jb2RlQ29tcHJlc3NlZEJsb2NrcyhidWlsdC5idWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnRyaWdnZXJSZWJ1aWxkKCk7XG4gICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIG1lcmdlIHBvbGljeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgQ2FsbGVkIGJvdGggcGVyaW9kaWNhbGx5ICh2aXNpYmlsaXR5IHRpbWVyKSBhbmQgb24gd3JpdGVzICh3aXRoIHRoZSBzdHJlYW1OZWVkc0ZvbGQgZ2F0ZSBzbyBhIHNtYWxsIHdyaXRlIGRvZXNuJ3QgZHJhZyB0aGUgbWVyZ2UgdGhyb3VnaCkuIFRoZSBtZXJnZUluRmxpZ2h0IGNoZWNrIGluIHRyeU1lcmdlTm93IHNraXBzIGFueSBjYWxsIHRoYXQgYXJyaXZlcyB3aGlsZSBhIHByZXZpb3VzIG9uZSBpcyBzdGlsbCBydW5uaW5nIOKAlCBzbyA1LW1pbiB0aW1lciB0aWNrcyBkb24ndCBwaWxlIHVwLlxuICAgIHByaXZhdGUgYXN5bmMgbWF5YmVNZXJnZShvcHRzOiB7IG9ubHlJZlN0cmVhbUhlYXZ5PzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmF1dG9tYXRpY0NvbXBhY3Rpb25BbGxvd2VkKCkpIHJldHVybjtcbiAgICAgICAgaWYgKG9wdHMub25seUlmU3RyZWFtSGVhdnkgJiYgIXRoaXMuc3RyZWFtTmVlZHNGb2xkKCkpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudHJ5TWVyZ2VUaHJvdHRsZWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IGJhY2tncm91bmQgbWVyZ2UgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIFwid2UgZGlkbid0IG1lcmdlXCIgcmVzdWx0IGFuZCBsb2cgaXQgKHRocm90dGxlZCDigJQgc2VlIE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TKS4gRm9yIGxvY2sgcmVhc29ucyB0aGUgbG9nIGFuZCByZXN1bHQgaW5jbHVkZSB0aGUgaG9sZGVyIGFuZCB0aW1lIHVudGlsIHRoZSBsb2NrIGdvZXMgc3RhbGUuXG4gICAgcHJpdmF0ZSBhc3luYyBtZXJnZVNraXAocmVhc29uOiBNZXJnZVNraXBSZWFzb24pOiBQcm9taXNlPE1lcmdlQXR0ZW1wdFJlc3VsdD4ge1xuICAgICAgICBsZXQgbG9jazogTWVyZ2VMb2NrSW5mbyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlYXNvbiA9PT0gXCJ0YWJMb2NrSGVsZFwiKSB7XG4gICAgICAgICAgICBsb2NrID0gcGVla01lcmdlTG9jayh0aGlzLm5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gXCJmaWxlTG9ja0hlbGRcIikge1xuICAgICAgICAgICAgbG9jayA9IGF3YWl0IHBlZWtNZXJnZUZpbGVMb2NrKGF3YWl0IHRoaXMuc3RvcmFnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdE1lcmdlU2tpcExvZ01zID49IE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RNZXJnZVNraXBMb2dNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBkZXRhaWwgPSBsb2NrICYmIGAgKGhlbGQgYnkgJHtsb2NrLmhvbGRlcklkfSwgZXhwaXJlcyBpbiAke2Zvcm1hdFRpbWUoTWF0aC5tYXgoMCwgbG9jay5leHBpcmVzSW5NcykpfSlgIHx8IFwiXCI7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtibHVlKHRoaXMubmFtZSl9ICR7bWFnZW50YShcIm1lcmdlXCIpfSBza2lwcGVkOiAke3JlYXNvbn0ke2RldGFpbH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtZXJnZWQ6IGZhbHNlLCBza2lwUmVhc29uOiByZWFzb24sIGxvY2tIb2xkZXJJZDogbG9jaz8uaG9sZGVySWQsIGxvY2tFeHBpcmVzSW5NczogbG9jaz8uZXhwaXJlc0luTXMgfTtcbiAgICB9XG5cbiAgICAvLyBBY3F1aXJlIGJvdGggbWVyZ2UgbG9ja3MgKHNhbWUtdGFiIG1lcmdlSW5GbGlnaHQsIGNyb3NzLXRhYiBsb2NhbFN0b3JhZ2UsIGNyb3NzLXByb2Nlc3MgZmlsZSksIHJ1biB0aGUgcGFzcywgcmVsZWFzZS4gU2tpcHMgKHdpdGggdGhlIHJlYXNvbikgaW5zdGVhZCBvZiB3YWl0aW5nIHdoZW4gYW55IG9mIHRoZW0gaXMgaGVsZC5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkxvY2tlZE1lcmdlKHJ1bjogKCkgPT4gUHJvbWlzZTxNZXJnZUF0dGVtcHRSZXN1bHQ+KTogUHJvbWlzZTxNZXJnZUF0dGVtcHRSZXN1bHQ+IHtcbiAgICAgICAgaWYgKHRoaXMubWVyZ2VJbkZsaWdodCkgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VTa2lwKFwibWVyZ2VJbkZsaWdodFwiKTtcbiAgICAgICAgaWYgKCF0cnlBY3F1aXJlTWVyZ2VMb2NrKHRoaXMubmFtZSwgd3JpdGVySWQpKSByZXR1cm4gYXdhaXQgdGhpcy5tZXJnZVNraXAoXCJ0YWJMb2NrSGVsZFwiKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBoYXZlRmlsZUxvY2sgPSBhd2FpdCB0cnlBY3F1aXJlTWVyZ2VGaWxlTG9jayhzdG9yYWdlLCB3cml0ZXJJZCk7XG4gICAgICAgIGlmICghaGF2ZUZpbGVMb2NrKSB7XG4gICAgICAgICAgICByZWxlYXNlTWVyZ2VMb2NrKHRoaXMubmFtZSwgd3JpdGVySWQpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VTa2lwKFwiZmlsZUxvY2tIZWxkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVyZ2VJbkZsaWdodCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0b3BIZWFydGJlYXQgPSBzdGFydE1lcmdlRmlsZUxvY2tIZWFydGJlYXQoc3RvcmFnZSwgd3JpdGVySWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc3RvcEhlYXJ0YmVhdCgpO1xuICAgICAgICAgICAgYXdhaXQgcmVsZWFzZU1lcmdlRmlsZUxvY2soc3RvcmFnZSwgd3JpdGVySWQpO1xuICAgICAgICAgICAgcmVsZWFzZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKTtcbiAgICAgICAgICAgIHRoaXMubWVyZ2VJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGJhY2tncm91bmQgcGF0aCAobWF5YmVNZXJnZSkgZ29lcyB0aHJvdWdoIHRoaXMgc28gd3JpdGUgYnVyc3RzIGNvYWxlc2NlOyBleHBsaWNpdCBjYWxsZXJzIHVzZSB0cnlNZXJnZU5vdyBkaXJlY3RseSBhbmQgZ2V0IHRoZSBwZXItY2FsbCByZXN1bHQuXG4gICAgcHJpdmF0ZSB0cnlNZXJnZVRocm90dGxlZCA9IHRocm90dGxlRnVuY3Rpb24oMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnRyeU1lcmdlTm93KCk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgYXN5bmMgdHJ5TWVyZ2VOb3coKTogUHJvbWlzZTxNZXJnZUF0dGVtcHRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuTG9ja2VkTWVyZ2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gYXdhaXQgdGhpcy50ZXN0TWVyZ2VJTlRFUk5BTF9ET19OT1RfQ0FMTCgpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVyZ2VkIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZE1lcmdlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nKCk7XG4gICAgICAgICAgICBzeW5jQnJvYWRjYXN0U2VhbCh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgICAgIGlmIChidWxrRmlsZXMubGVuZ3RoICsgc3RyZWFtRmlsZXMubGVuZ3RoIDwgMSkgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VTa2lwKFwibm90aGluZ1RvTWVyZ2VcIik7XG4gICAgICAgICAgICAvLyBjb21wYWN0KCkgZm9sZHMgZXZlcnkgZmlsZSDihpIgbm8gb2xkZXIgZGF0YSBzdXJ2aXZlcyBvdXRzaWRlIGl0IOKGkiBzdXJ2aXZpbmcgdG9tYnN0b25lcyBjYW4gYmUgZHJvcHBlZCAobm90aGluZyBsZWZ0IHRvIHN1cHByZXNzKS5cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IGF3YWl0IHRoaXMubWVyZ2VGaWxlU2V0KGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVyZ2VkIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtZXJnZSh0aW1lTG86IG51bWJlciwgdGltZUhpOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRpbWVIaSA+PSBEYXRlLm5vdygpKSB7IHN5bmNCcm9hZGNhc3RTZWFsKHRoaXMubmFtZSk7IHRoaXMuc3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChmID0+IHRoaXMucmVhZEJ1bGtIZWFkZXIoZi5maWxlTmFtZSkpKTtcbiAgICAgICAgY29uc3Qgc2VsQnVsayA9IGJ1bGtGaWxlcy5maWx0ZXIoKGYsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBoZWFkZXJzW2ldO1xuICAgICAgICAgICAgaWYgKCFoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWgubWF4VGltZSAmJiAhaC5taW5UaW1lKSByZXR1cm4gdGltZUxvIDw9IDA7XG4gICAgICAgICAgICByZXR1cm4gaC5taW5UaW1lIDw9IHRpbWVIaSAmJiBoLm1heFRpbWUgPj0gdGltZUxvO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VsU3RyZWFtID0gc3RyZWFtRmlsZXMuZmlsdGVyKGYgPT5cbiAgICAgICAgICAgIGYudGltZXN0YW1wIDw9IHRpbWVIaSAmJiBmLnRpbWVzdGFtcCArIGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtU2VhbEFnZU1zID49IHRpbWVMbyk7XG4gICAgICAgIGlmIChzZWxCdWxrLmxlbmd0aCArIHNlbFN0cmVhbS5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlU2V0KHNlbEJ1bGssIHNlbFN0cmVhbSwgdGltZUxvIDw9IDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZEJ1bGtIZWFkZXIoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8QnVsa0hlYWRlckluZm8gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IG1ha2VSYXdHZXRSYW5nZShzdG9yYWdlLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlSWQgPSBudWxsSm9pbih0aGlzLm5hbWUsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5lZCA9IGF3YWl0IGJsb2NrQ2FjaGUub3BlbihmaWxlSWQsIHJhdy5zaXplLCByYXcucmF3R2V0UmFuZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGxvYWRCdWxrSGVhZGVyKG9wZW5lZC5nZXRSYW5nZSwgb3BlbmVkLnVuY29tcHJlc3NlZFNpemUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbGVMb2dpY2FsU2l6ZShmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IG1ha2VSYXdHZXRSYW5nZShzdG9yYWdlLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlSWQgPSBudWxsSm9pbih0aGlzLm5hbWUsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5lZCA9IGF3YWl0IGJsb2NrQ2FjaGUub3BlbihmaWxlSWQsIHJhdy5zaXplLCByYXcucmF3R2V0UmFuZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG9wZW5lZC51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBIGJ1bGsgZmlsZSB0aGF0IHdvbid0IGxvYWQgaXMgZWl0aGVyIGFuIGluLXByb2dyZXNzIHdyaXRlIChyZWNlbnQpIG9yIGEgY3Jhc2hlZCBwYXJ0aWFsIHdyaXRlIChzdGFsZSkuIFdhcm4gd2hpbGUgcmVjZW50LCBkZWxldGUgb25jZSBjbGVhcmx5IGFiYW5kb25lZCDigJQgZGVsZXRpbmcgaXMgc2FmZSBiZWNhdXNlIHRoZSB3cml0ZSBwcm90b2NvbCBhbHdheXMgbGFuZHMgdGhlIHJlcGxhY2VtZW50IGJlZm9yZSByZW1vdmluZyB0aGUgZmlsZSBpdCBzdXBlcnNlZGVzLlxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlVW5yZWFkYWJsZUZpbGUoZmlsZTogQnVsa0ZpbGVJbmZvLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYWdlTXMgPSBEYXRlLm5vdygpIC0gZmlsZS50aW1lc3RhbXA7XG4gICAgICAgIGlmIChhZ2VNcyA+IFNUQUxFX0RFTEVURV9NUykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IGRlbGV0aW5nIHN0YWxlIHVucmVhZGFibGUgYnVsayBmaWxlICR7ZmlsZS5maWxlTmFtZX0gKCR7TWF0aC5yb3VuZChhZ2VNcyAvIDg2NDAwMDAwKX1kIG9sZCk6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2UucmVtb3ZlKGZpbGUuZmlsZU5hbWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAocmVtb3ZlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogZmFpbGVkIHRvIGRlbGV0ZSAke2ZpbGUuZmlsZU5hbWV9OiAkeyhyZW1vdmVFcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogc2tpcHBpbmcgdW5yZWFkYWJsZSBidWxrIGZpbGUgJHtmaWxlLmZpbGVOYW1lfSAocmVjZW50IC0gbWF5IGJlIGluLXByb2dyZXNzKTogJHttZXNzYWdlfWApO1xuICAgIH1cblxuICAgIC8vIFRoZSBvbmUgbWVyZ2UgcHJpbWl0aXZlLiBSZWFkcyArIHBsYW5zICsgd3JpdGVzIG91dHB1dHMgYmVmb3JlIGRlbGV0aW5nIGFueSBpbnB1dCwgc28gYSBjcmFzaCBsZWF2ZXMgZHVwbGljYXRlcyAobmV4dCBtZXJnZSBkZWR1cGVzKSByYXRoZXIgdGhhbiBhIGdhcC4gQWZ0ZXIgdGhlIGZpbGUgc2V0IGNoYW5nZXMgb24gZGlzaywgd2UgdHJpZ2dlciBhbiBpbmRleCByZWJ1aWxkICsgYXRvbWljIHN3YXA7IG9uY2Ugc3dhcCBjb21wbGV0ZXMsIHRoZSBjb25zdW1lZCBmaWxlcycgYmxvY2stY2FjaGUgZW50cmllcyBhcmUgZXZpY3RlZCAobm8gY29uc3VtZXIgY2FuIGFzayBmb3IgdGhlbSBub3cpLlxuICAgIC8vIFxuICAgIC8vIFNlcmlhbGl6ZWQ6IGZvbGRPd25TdHJlYW0gKyBtZXJnZSh0aW1lTG8sIHRpbWVIaSkgKyB0ZXN0TWVyZ2UncyBydW5NZXJnZSBhbGwgaGl0IHRoaXM7IHRoZSBsb2NrIGNvdmVycyB0cnlNZXJnZU5vdy9jb21wYWN0IGJ1dCB0aG9zZSB0d28gcGF0aHMgYnlwYXNzIGl0LiBydW5JblNlcmlhbCBxdWV1ZXMgc28gdGhleSBuZXZlciBjb2xsaWRlIG9uIHRoZSBmaWxlIHNldC5cbiAgICBwcml2YXRlIG1lcmdlRmlsZVNldCA9IHJ1bkluU2VyaWFsKGFzeW5jIChidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdLCBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSwgaW5jbHVkZXNPbGRlc3QgPSBmYWxzZSwgZm9yY2VEZWxldGVTdHJlYW1zID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgdGhpcy5yZWFkZXIuYmVnaW5Db21wYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXRJbm5lcihidWxrRmlsZXMsIHN0cmVhbUZpbGVzLCBpbmNsdWRlc09sZGVzdCwgZm9yY2VEZWxldGVTdHJlYW1zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLmVuZENvbXBhY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBhc3luYyBtZXJnZUZpbGVTZXRJbm5lcihidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdLCBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSwgaW5jbHVkZXNPbGRlc3Q6IGJvb2xlYW4sIGZvcmNlRGVsZXRlU3RyZWFtczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5leHRGaWxlVGltZSgpO1xuXG4gICAgICAgIC8vIFRoZSBjYWxsZXIncyBidWxrRmlsZXMgY2FtZSBmcm9tIGEgYGxpc3RGaWxlcygpYCBzbmFwc2hvdC4gQmV0d2VlbiB0aGVuIGFuZCBub3cgYW55IGZpbGUgY291bGQgYmUgZ29uZSAoYW5vdGhlciB0YWIncyBkZWZlcnJlZCBkZWxldGUsIG1hbnVhbCBjbGVhbnVwKS4gVGhlIHN1YkNhY2hlcyByZWFkZXIgZm9yIGEgZGVsZXRlZCBmaWxlIGlzIHNpbGVudGx5IHN0YWxlIOKAlCBpdHMgaW4tbWVtb3J5IG1ldGFkYXRhIHN0aWxsIHJlc29sdmVzLCBidXQgdGhlIHZlcnkgbmV4dCBnZXRSYW5nZSBhZ2FpbnN0IGRpc2sgdGhyb3dzLiBSZS12ZXJpZnkgZXhpc3RlbmNlIHVwLWZyb250IGFuZCBkcm9wIHRoZSBjYWNoZSBlbnRyeSBmb3IgYW55dGhpbmcgdGhhdCB2YW5pc2hlZCwgc28gd2UgZG9uJ3QgZXZlbiB0cnkgdG8gcGxhbiBhcm91bmQgYSBnaG9zdCBmaWxlLlxuICAgICAgICBjb25zdCB2ZXJpZmllZEJ1bGtGaWxlcyA9IChhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghaW5mbykgeyB0aGlzLnN1YkNhY2hlcy5idWxrLmRlbGV0ZShmLmZpbGVOYW1lKTsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJDYWNoZXMuYnVsay5kZWxldGUoZi5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpKS5maWx0ZXIoKGYpOiBmIGlzIEJ1bGtGaWxlSW5mbyA9PiBmICE9PSB1bmRlZmluZWQpO1xuICAgICAgICBidWxrRmlsZXMgPSB2ZXJpZmllZEJ1bGtGaWxlcztcblxuICAgICAgICBjb25zdCBjb25zdW1lZEJ1bGs6IEJ1bGtGaWxlSW5mb1tdID0gW107XG4gICAgICAgIGNvbnN0IGJ1bGtSZWFkZXJzOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyW10gPSBbXTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChhc3luYyBmID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IGxvYWRGaWxlUmVhZGVyKHRoaXMubmFtZSwgc3RvcmFnZSwgZiwgdGhpcy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgYnVsa1JlYWRlcnMucHVzaChyKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lZEJ1bGsucHVzaChmKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyAvKiBtaXNzaW5nIG9yIGNvcnJ1cHQg4oCUIHNraXA7IGl0cyBkYXRhIGxpdmVzIGluIGFub3RoZXIgZmlsZSAqLyB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCBzdHJlYW1EYXRhID0gYXdhaXQgbG9hZFN0cmVhbUVudHJpZXModGhpcy5uYW1lLCBzdG9yYWdlLCBzdHJlYW1GaWxlcywgdGhpcy5zdWJDYWNoZXMuc3RyZWFtKTtcbiAgICAgICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyU3RyZWFtRW50cmllcyhzdHJlYW1EYXRhLmVudHJpZXMpO1xuICAgICAgICBjb25zdCBzdHJlYW1SZWFkZXIgPSBvcmRlcmVkLmxlbmd0aCA/IHN0cmVhbVJlYWRlckZyb21FbnRyaWVzKG9yZGVyZWQsIDApLnJlYWRlciA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBBbiBhYmFuZG9uZWQgc3RyZWFtIHRoYXQgeWllbGRlZCBubyBlbnRyaWVzICh6ZXJvIGJ5dGVzLCBvciBub3RoaW5nIGJ1dCB0b3JuIGJ5dGVzKSBob2xkcyBubyBkYXRhIGFuZCBoYXMgbm8gd3JpdGVyIGxlZnQuIFJldGlyZSBpdCBoZXJlOiB0aGUgbWVyZ2UgYmVsb3cgbmV2ZXIgbGlzdHMgaXQgYXMgYSB1c2VkIHNvdXJjZSwgc28gdGhlIG5vcm1hbCByZXRpcmVtZW50IHBhdGggd291bGQgc2tpcCBpdCBhbmQgaXQgd291bGQgcmUtdHJpZ2dlciB0aGUgYWJhbmRvbmVkLXN0cmVhbSBmb2xkIG9uIGV2ZXJ5IHBhc3MuIHJlcGxhY2VkQnkgaXMgZW1wdHkgYmVjYXVzZSBub3RoaW5nIHN1cGVyc2VkZXMgaXQgLSB0aGUgbWFya2VyIGhpZGVzIGl0IGZyb20gcmVhZHMgaW1tZWRpYXRlbHkgYW5kIHByb2Nlc3NNYXJrZXJzIGRlbGV0ZXMgaXQgb25jZSBhZ2VkLlxuICAgICAgICBjb25zdCB7IHJldGlyYWJsZTogcmV0aXJhYmxlU3RyZWFtcyB9ID0gYXdhaXQgdGhpcy5maW5kQWJhbmRvbmVkU3RyZWFtcyhzdHJlYW1GaWxlcywgZmFsc2UpO1xuICAgICAgICBjb25zdCBjb250cmlidXRpbmdTdHJlYW1zID0gbmV3IFNldChzdHJlYW1EYXRhLmVudHJpZXMubWFwKGUgPT4gZS5maWxlTmFtZSkpO1xuICAgICAgICBjb25zdCBlbXB0eUFiYW5kb25lZCA9IHN0cmVhbUZpbGVzLmZpbHRlcihmID0+IHJldGlyYWJsZVN0cmVhbXMuaGFzKGYuZmlsZU5hbWUpICYmICFjb250cmlidXRpbmdTdHJlYW1zLmhhcyhmLmZpbGVOYW1lKSkubWFwKGYgPT4gZi5maWxlTmFtZSk7XG4gICAgICAgIGlmIChlbXB0eUFiYW5kb25lZC5sZW5ndGgpIGF3YWl0IHdyaXRlRGVsZXRlTWFya2VyKHN0b3JhZ2UsIHsgZGVsZXRlRmlsZXM6IGVtcHR5QWJhbmRvbmVkLCByZXBsYWNlZEJ5OiBbXSB9KTtcblxuICAgICAgICBjb25zdCByZWFkZXJzID0gc3RyZWFtUmVhZGVyID8gW3N0cmVhbVJlYWRlciwgLi4uYnVsa1JlYWRlcnNdIDogYnVsa1JlYWRlcnM7XG4gICAgICAgIGNvbnN0IHJlYWRlck5hbWVzID0gc3RyZWFtUmVhZGVyID8gW1wiKHN0cmVhbXMpXCIsIC4uLmNvbnN1bWVkQnVsay5tYXAoZiA9PiBmLmZpbGVOYW1lKV0gOiBjb25zdW1lZEJ1bGsubWFwKGYgPT4gZi5maWxlTmFtZSk7XG4gICAgICAgIGlmICghcmVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChlbXB0eUFiYW5kb25lZC5sZW5ndGgpIGF3YWl0IHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eUFiYW5kb25lZC5sZW5ndGggPiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgICAgICAgLi4uYXdhaXQgUHJvbWlzZS5hbGwoY29uc3VtZWRCdWxrLm1hcChhc3luYyBmID0+ICh7IG5hbWU6IGYuZmlsZU5hbWUsIHNpemU6IChhd2FpdCBzdG9yYWdlLmdldEluZm8oZi5maWxlTmFtZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk/LnNpemUgPz8gMCB9KSkpLFxuICAgICAgICAgICAgLi4uc3RyZWFtRmlsZXMubWFwKGYgPT4gKHsgbmFtZTogZi5maWxlTmFtZSwgc2l6ZTogc3RyZWFtRGF0YS5zaXplcy5nZXQoZi5maWxlTmFtZSkgPz8gMCB9KSksXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGluVG90YWwgPSBpbnB1dHMucmVkdWNlKChhLCBmKSA9PiBhICsgZi5zaXplLCAwKTtcbiAgICAgICAgY29uc3QgbWVyZ2VTdGFydE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQ29sbGVjdCBlYWNoIHN0ZXAgaW5zdGVhZCBvZiBsb2dnaW5nIGl0IGxpdmU7IGVtaXR0ZWQgYXQgdGhlIGVuZCBhcyBvbmVcbiAgICAgICAgLy8gZXhwYW5kZWQgY29uc29sZS5ncm91cCBzbyBhIG1lcmdlIHRha2VzIG9uZSBjb2xsYXBzaWJsZSBibG9jaywgbm90IGFcbiAgICAgICAgLy8gc2NyZWVuZnVsIChhbmQgbmV2ZXIgdGhlIHBlci1maWxlIG5hbWUgZHVtcCBpdCB1c2VkIHRvIHNwZXcpLlxuICAgICAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgLy8gRWFjaCBzdGVwIHJlY29yZHMgdGhlIHRpbWUgc3BlbnQgc2luY2UgdGhlIHByZXZpb3VzIHN0ZXAgaW4gYmx1ZSBhdCB0aGUgZnJvbnQsIHNvIGNhbGxlcnMgY2FuIGp1c3QgZGVzY3JpYmUgd2hhdCB0aGV5IGRpZCBhbmQgbm90IGJvdGhlciBtZWFzdXJpbmcvZm9ybWF0dGluZyBlbGFwc2VkIHRpbWVzIHRoZW1zZWx2ZXMuXG4gICAgICAgIGxldCBsYXN0U3RlcE1zID0gbWVyZ2VTdGFydE1zO1xuICAgICAgICBjb25zdCBsb2cgPSAobGluZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IGxpbmVGb3JtYXR0ZWQgPSBgJHtibHVlKGZvcm1hdFRpbWUobm93IC0gbGFzdFN0ZXBNcykpfSAke2xpbmV9YDtcbiAgICAgICAgICAgIC8vIERPIE5PVCBSRU1PVkUgVEhJUyBMT0chIE9idmlvdXNseSwgd2Ugc2hvdWxkIGJlIGxvZ2dpbmcgYXMgd2UgcnVuLCBvciBlbHNlIHdlIGRvbid0IGdldCBwcm9ncmVzcy4gV2h5IHdvdWxkIHdlIHN0b3AgZ2V0dGluZyBwcm9ncmVzcz8gUHJvZ3Jlc3MgaXMgYWxtb3N0IG1vcmUgaW1wb3J0YW50IHRoYW4gc2hvd2luZyBhIHN1bW1hcnkgYXQgdGhlIGVuZC4uLlxuICAgICAgICAgICAgY29uc29sZS5sb2cobGluZUZvcm1hdHRlZCk7XG4gICAgICAgICAgICBzdGVwcy5wdXNoKGxpbmVGb3JtYXR0ZWQpO1xuICAgICAgICAgICAgbGFzdFN0ZXBNcyA9IG5vdztcbiAgICAgICAgfTtcbiAgICAgICAgbG9nKGAke21hZ2VudGEoXCJyZWFkXCIpfTogJHtpbnB1dHMubGVuZ3RofSBpbnB1dCBmaWxlKHMpLCAke2ZtdEJ5dGVzKGluVG90YWwpfWApO1xuXG4gICAgICAgIGNvbnN0IG5ld05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBtZXJnZVJlc3VsdCA9IGF3YWl0IHJ1blBsYW5uZWRNZXJnZSh7XG4gICAgICAgICAgICBzb3VyY2VzOiByZWFkZXJzLFxuICAgICAgICAgICAgc291cmNlTmFtZXM6IHJlYWRlck5hbWVzLFxuICAgICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGxvZyxcbiAgICAgICAgICAgIHdyaXRlRmlsZTogYXN5bmMgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbmFtZSA9IG5ld0ZpbGVOYW1lKHRpbWVzdGFtcCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoZm5hbWUsIGVuY29kZUNvbXByZXNzZWRCbG9ja3MoZGF0YSkpO1xuICAgICAgICAgICAgICAgIG5ld05hbWVzLnB1c2goZm5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSAoYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGZuYW1lKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKT8uc2l6ZSA/PyAwO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGZuYW1lLCBzaXplIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYXJyaWVkRGVsZXRlcyA9IGluY2x1ZGVzT2xkZXN0ID8gMCA6IG1lcmdlUmVzdWx0LmNhcnJpZWREZWxldGVzLnNpemU7XG4gICAgICAgIGNvbnN0IG91dE5hbWVzID0gWy4uLm5ld05hbWVzXTtcbiAgICAgICAgaWYgKGNhcnJpZWREZWxldGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjYXJyeU5hbWUgPSBuZXdTdHJlYW1GaWxlTmFtZShNRVJHRV9PVVRQVVRfT1dORVIpO1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoY2FycnlOYW1lLCBmcmFtZURlbGV0ZXMoWy4uLm1lcmdlUmVzdWx0LmNhcnJpZWREZWxldGVzXS5tYXAoKFtrZXksIHRpbWVdKSA9PiAoeyB0aW1lLCBrZXkgfSkpKSk7XG4gICAgICAgICAgICBvdXROYW1lcy5wdXNoKGNhcnJ5TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXRzID0gYXdhaXQgUHJvbWlzZS5hbGwob3V0TmFtZXMubWFwKGFzeW5jIG4gPT4gKHsgbmFtZTogbiwgc2l6ZTogKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhuKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKT8uc2l6ZSA/PyAwIH0pKSk7XG4gICAgICAgIGNvbnN0IG91dFRvdGFsID0gb3V0cHV0cy5yZWR1Y2UoKGEsIGYpID0+IGEgKyBmLnNpemUsIDApO1xuICAgICAgICBsb2coYCR7bWFnZW50YShcIndyb3RlXCIpfTogJHtvdXRwdXRzLmxlbmd0aH0gb3V0cHV0IGZpbGUocyksICR7Zm10Qnl0ZXMob3V0VG90YWwpfSR7Y2FycmllZERlbGV0ZXMgPyBgLCAke2NhcnJpZWREZWxldGVzfSB0b21ic3RvbmVzIGNhcnJpZWRgIDogXCJcIn1gKTtcblxuICAgICAgICBjb25zb2xlLmdyb3VwKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKFwibWVyZ2VcIil9OiAke2ZtdEJ5dGVzKGluVG90YWwpfSAtPiAke2ZtdEJ5dGVzKG91dFRvdGFsKX0gKCR7aW5wdXRzLmxlbmd0aH0tPiR7b3V0cHV0cy5sZW5ndGh9IGZpbGVzKSBpbiAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIG1lcmdlU3RhcnRNcyl9YCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdGVwcykgY29uc29sZS5sb2cobGluZSk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBzb3VyY2VzIHJ1blBsYW5uZWRNZXJnZSBhY3R1YWxseSB1c2VkIGNhbiBiZSByZXRpcmVkIOKAlCBhIHNvdXJjZSBpdCBkcm9wcGVkIG1pZC1wbGFuIChmaWxlIGdvbmUsIGNvcnJ1cHRpb24pIHN0aWxsIGhvbGRzIGRhdGEgd2UgY291bGRuJ3QgbWVyZ2UgaW4sIHNvIGxlYXZlIGl0IG9uIGRpc2sgYW5kIGxldCBhIGZ1dHVyZSBtZXJnZSByZS1hdHRlbXB0IGl0LlxuICAgICAgICBjb25zdCB1c2VkQ29uc3VtZWRCdWxrID0gY29uc3VtZWRCdWxrLmZpbHRlcihmID0+IG1lcmdlUmVzdWx0LnVzZWRTb3VyY2VOYW1lcy5oYXMoZi5maWxlTmFtZSkpO1xuICAgICAgICBjb25zdCB1c2VkU3RyZWFtRmlsZXMgPSBzdHJlYW1GaWxlcy5maWx0ZXIoZiA9PiBtZXJnZVJlc3VsdC51c2VkU291cmNlTmFtZXMuaGFzKGYuZmlsZU5hbWUpIHx8IG1lcmdlUmVzdWx0LnVzZWRTb3VyY2VOYW1lcy5oYXMoXCIoc3RyZWFtcylcIikpO1xuICAgICAgICAvLyBBIHN0cmVhbSBtYXkgc3RpbGwgYmUgYXBwZW5kZWQgdG8gYWZ0ZXIgd2UgcmVhZCBpdCAodGhlIHdyaXRlciBoYXNuJ3Qgc2VhbGVkL21vdmVkIG9uKTsgb25seSByZXRpcmUgc3RyZWFtcyBjYW5EZWxldGVTdHJlYW0gY2xlYXJzIOKAlCB0aGUgcmVzdCBzdGF5IGxpdmUgYW5kIGEgbGF0ZXIgbWVyZ2UgcmUtZm9sZHMgdGhlbSBvbmNlIHNlYWxlZC4gQnVsayBmaWxlcyBhcmUgaW1tdXRhYmxlLCBzbyBhIHVzZWQgb25lIGlzIGFsd2F5cyBzYWZlIHRvIHJldGlyZS5cbiAgICAgICAgY29uc3QgZGVsZXRhYmxlU3RyZWFtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHVzZWRTdHJlYW1GaWxlcykge1xuICAgICAgICAgICAgaWYgKHJldGlyYWJsZVN0cmVhbXMuaGFzKGYuZmlsZU5hbWUpKSB7IGRlbGV0YWJsZVN0cmVhbXMucHVzaChmLmZpbGVOYW1lKTsgY29udGludWU7IH1cbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmNhbkRlbGV0ZVN0cmVhbShmLCBEYXRlLm5vdygpLCBzdHJlYW1EYXRhLnNpemVzLCBmb3JjZURlbGV0ZVN0cmVhbXMpKSBkZWxldGFibGVTdHJlYW1zLnB1c2goZi5maWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsZXRlRmlsZXMgPSBbLi4udXNlZENvbnN1bWVkQnVsay5tYXAoZiA9PiBmLmZpbGVOYW1lKSwgLi4uZGVsZXRhYmxlU3RyZWFtc107XG5cbiAgICAgICAgLy8gV3JpdGUgYSBkZWxldGlvbiBtYXJrZXIgaW5zdGVhZCBvZiBkZWxldGluZyBpbmxpbmUuIEZyb20gdGhlIG5leHQgcmVhZCBvbiwgbGlzdEZpbGVzIGhpZGVzIHRoZXNlIGlucHV0cyAoc28gdGhleSdyZSBuZXZlciByZS1tZXJnZWQg4oCUIHRoZSBsb29wIGZpeCksIGFuZCBwcm9jZXNzTWFya2VycyByZW1vdmVzIHRoZW0gcGh5c2ljYWxseSBvbmNlIHRoZSBvdXRwdXRzIGhhdmUgbGFuZGVkIG9yIHRoZSBtYXJrZXIgYWdlcyBvdXQuIE1hcmtlciBCRUZPUkUgdGhlIHJlYnVpbGQgc28gdGhlIGZyZXNobHktc3dhcHBlZCBpbmRleCBhbHJlYWR5IGV4Y2x1ZGVzIHRoZSByZXRpcmVkIGlucHV0cy5cbiAgICAgICAgaWYgKGRlbGV0ZUZpbGVzLmxlbmd0aCkgYXdhaXQgd3JpdGVEZWxldGVNYXJrZXIoc3RvcmFnZSwgeyBkZWxldGVGaWxlcywgcmVwbGFjZWRCeTogb3V0TmFtZXMgfSk7XG5cbiAgICAgICAgLy8gUmVidWlsZCArIHN3YXAgc28gdGhlIGluZGV4IHNlZXMgdGhlIG5ldyBvdXRwdXRzIGFuZCBkcm9wcyB0aGUgcmV0aXJlZCBpbnB1dHMuIEJsb2NrLWNhY2hlIGV2aWN0aW9uIGZvciB0aGUgZHJvcHBlZCBpbnB1dHMgaGFwcGVucyBoZXJlICh0aGV5J3JlIG5vIGxvbmdlciBpbiB0aGUgbmV3IGluZGV4J3MgZmlsZVNldCkuXG4gICAgICAgIGF3YWl0IHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICAgICAgcmV0dXJuIG5ld05hbWVzLmxlbmd0aCA+IDAgfHwgY2FycmllZERlbGV0ZXMgPiAwO1xuICAgIH1cblxuICAgIC8vIEEgc3RyZWFtIGlzIHNhZmUgdG8gZGVsZXRlIGlmZiBubyB3cml0ZXIgd2lsbCBhcHBlbmQgdG8gaXQgYWdhaW46IGl0J3MgYWdlZCBwYXN0IHRoZSBzZWFsIGFnZSAod3JpdGVyIGhhcyBwcm92YWJseSBzd2l0Y2hlZCBmaWxlcykgT1IgY3Jvc3MtdGFiIHN5bmMgaXMgb24gQU5EIGl0cyBzaXplIGRpZG4ndCBjaGFuZ2Ugd2hpbGUgd2UgcmVhZCBpdC4gRWxzZSBsZWF2ZSBpdCDigJQgdGhlIGRhdGEgaXMgYWxzbyBpbiB0aGUgbmV3IGJ1bGsgZmlsZTsgYSBsYXRlciBtZXJnZSBkZWxldGVzIGl0IG9uY2UgYWdlZC5cbiAgICBwcml2YXRlIGFzeW5jIGNhbkRlbGV0ZVN0cmVhbShmOiBTdHJlYW1GaWxlSW5mbywgbm93OiBudW1iZXIsIHNpemVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LCBmb3JjZSA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmIChub3cgLSBmLnRpbWVzdGFtcCA+PSBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbVNlYWxBZ2VNcykgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghaXNTeW5jU3VwcG9ydGVkKCkgJiYgIWZvcmNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlYWRTaXplID0gc2l6ZXMuZ2V0KGYuZmlsZU5hbWUpO1xuICAgICAgICBpZiAocmVhZFNpemUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaW5mbztcbiAgICAgICAgdHJ5IHsgaW5mbyA9IGF3YWl0IChhd2FpdCB0aGlzLnN0b3JhZ2UoKSkuZ2V0SW5mbyhmLmZpbGVOYW1lKTsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gISFpbmZvICYmIGluZm8uc2l6ZSA9PT0gcmVhZFNpemU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtZXJnZVNwYWNpbmdEZWxheSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdG90YWwgPSBidWxrRGF0YWJhc2UyVGltaW5nLm1lcmdlU3BhY2luZ01zO1xuICAgICAgICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIHRyeUFjcXVpcmVNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCk7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSAxNSAqIDEwMDA7XG4gICAgICAgIGxldCB3YWl0ZWQgPSAwO1xuICAgICAgICB3aGlsZSAod2FpdGVkIDwgdG90YWwpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHIgPT4gc2V0VGltZW91dChyLCBNYXRoLm1pbihzdGVwLCB0b3RhbCAtIHdhaXRlZCkpKTtcbiAgICAgICAgICAgIHdhaXRlZCArPSBzdGVwO1xuICAgICAgICAgICAgaWYgKCF0cnlBY3F1aXJlTWVyZ2VMb2NrKHRoaXMubmFtZSwgd3JpdGVySWQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3BsaXRzIHRoZSBidWxrIHRpZXIgdGhlIHdheSB0aGUgbWVyZ2Ugd3JpdGVyIGRvZXMuIEEgbWVyZ2UgY3V0cyBhbiBvdXRwdXQgZmlsZSBvbmNlIGl0IHJlYWNoZXMgVEFSR0VUX0ZJTEVfQllURVMsIHNvIG9ubHkgaXRzIExBU1Qgb3V0cHV0IGNhbiBiZSB1bmRlciB0aGF0IOKAlCBtZWFuaW5nIGEgc3ViLXRhcmdldCBmaWxlIGlzIGVpdGhlciBhIHNpbmdsZSBzdHJlYW0gZm9sZCBvciB0aGUgdGFpbCBvZiBhbiBlYXJsaWVyIG1lcmdlLCBhbmQgaXMgc3RpbGwgd2FpdGluZyB0byBiZSByb2xsZWQgdXAgKFwibG9vc2VcIikuIEFueXRoaW5nIGF0IG9yIG92ZXIgdGhlIHRhcmdldCBpcyBkb25lIGdyb3dpbmcgKFwiY29tYmluZWRcIikgYW5kIG9ubHkgcGhhc2UgMyB0b3VjaGVzIGl0IGFnYWluLlxuICAgIC8vXG4gICAgLy8gQSBmaWxlIHdob3NlIHNpemUgd29uJ3QgcmVhZCBpcyByZXBvcnRlZCBhcyBjb21iaW5lZDogcGhhc2UgMiBjYW4ndCBjb25zdW1lIG9uZSAoaXRzIHJlYWRlciB3b24ndCBsb2FkLCBzbyB0aGUgbWVyZ2Ugd29uJ3QgcmV0aXJlIGl0KSwgYW5kIGNhbGxpbmcgaXQgbG9vc2Ugd291bGQgcmUtdHJpZ2dlciBwaGFzZSAyIG9uIGV2ZXJ5IHBhc3MgdW50aWwgaGFuZGxlVW5yZWFkYWJsZUZpbGUgZmluYWxseSBkZWxldGVzIGl0LlxuICAgIHByaXZhdGUgYXN5bmMgc3BsaXRCdWxrVGllcihidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdKTogUHJvbWlzZTx7IGxvb3NlOiBCdWxrRmlsZUluZm9bXTsgbG9vc2VCeXRlczogbnVtYmVyOyBjb21iaW5lZDogQnVsa0ZpbGVJbmZvW107IHNpemVzOiBNYXA8c3RyaW5nLCBudW1iZXI+IH0+IHtcbiAgICAgICAgY29uc3QgbG9naWNhbFNpemVzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChmID0+IHRoaXMuZmlsZUxvZ2ljYWxTaXplKGYuZmlsZU5hbWUpKSk7XG4gICAgICAgIGNvbnN0IGxvb3NlOiBCdWxrRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBjb21iaW5lZDogQnVsa0ZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgbG9vc2VCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVsa0ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IGxvZ2ljYWxTaXplc1tpXTtcbiAgICAgICAgICAgIHNpemVzLnNldChidWxrRmlsZXNbaV0uZmlsZU5hbWUsIGJ5dGVzID8/IDApO1xuICAgICAgICAgICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQgfHwgYnl0ZXMgPj0gVEFSR0VUX0ZJTEVfQllURVMpIHtcbiAgICAgICAgICAgICAgICBjb21iaW5lZC5wdXNoKGJ1bGtGaWxlc1tpXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb29zZS5wdXNoKGJ1bGtGaWxlc1tpXSk7XG4gICAgICAgICAgICBsb29zZUJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxvb3NlLCBsb29zZUJ5dGVzLCBjb21iaW5lZCwgc2l6ZXMgfTtcbiAgICB9XG5cbiAgICAvLyBPbmUgd2FsayBvZiB0aGUgY29tYmluZWQgdGllcidzIGtleSBsaXN0cywgcHJvZHVjaW5nIGJvdGggb2YgcGhhc2UgMydzIGlucHV0czogdGhlIHdob2xlLXRpZXIgZHVwbGljYXRlIGZyYWN0aW9uLCBhbmQgdGhlIHBlci1rZXktcmFuZ2UgZ3JvdXBzLiBDb21iaW5lZCBpbnRvIG9uZSBwYXNzIGJlY2F1c2Ugd2Fsa2luZyBldmVyeSBmaWxlJ3Mga2V5cyBpcyB0aGUgbW9zdCBleHBlbnNpdmUgdGhpbmcgYSBtZXJnZSBwYXNzIGRvZXMgdGhhdCBpc24ndCBhIG1lcmdlLCBhbmQgYm90aCBhbnN3ZXJzIGNvbWUgZnJvbSB0aGUgc2FtZSBrZXkgY291bnRzLlxuICAgIHByaXZhdGUgYXN5bmMgYW5hbHl6ZUR1cGxpY2F0ZXMoYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSk6IFByb21pc2U8eyBkdXBGcmFjdGlvbjogbnVtYmVyOyBncm91cHM6IHsgbG86IHN0cmluZzsgaGk6IHN0cmluZzsgZHVwOiBudW1iZXIgfVtdIH0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBpbmZvcyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IGxvYWRGaWxlUmVhZGVyKHRoaXMubmFtZSwgc3RvcmFnZSwgZiwgdGhpcy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogcmVhZGVyLmtleXMsIGJ5dGVzOiByZWFkZXIudG90YWxCeXRlcyB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogW10gYXMgc3RyaW5nW10sIGJ5dGVzOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3Qga2V5Q291bnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgdG90YWxTbG90cyA9IDAsIHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaW5mb3MpIHtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gaS5ieXRlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBpLmtleXMpIHsga2V5Q291bnQuc2V0KGssIChrZXlDb3VudC5nZXQoaykgfHwgMCkgKyAxKTsgdG90YWxTbG90cysrOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0b3RhbFNsb3RzKSByZXR1cm4geyBkdXBGcmFjdGlvbjogMCwgZ3JvdXBzOiBbXSB9O1xuICAgICAgICBjb25zdCBieXRlc1BlclNsb3QgPSB0b3RhbEJ5dGVzIC8gdG90YWxTbG90cztcbiAgICAgICAgY29uc3Qgc29ydGVkS2V5cyA9IFsuLi5rZXlDb3VudC5rZXlzKCldLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBzOiB7IGxvOiBzdHJpbmc7IGhpOiBzdHJpbmc7IGR1cDogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBsZXQgZ1N0YXJ0ID0gMCwgZ0J5dGVzID0gMCwgZ1Nsb3RzID0gMCwgZ1VuaXF1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGtleUNvdW50LmdldChzb3J0ZWRLZXlzW2ldKSA/PyAwO1xuICAgICAgICAgICAgZ0J5dGVzICs9IGMgKiBieXRlc1BlclNsb3Q7IGdTbG90cyArPSBjOyBnVW5pcXVlICs9IDE7XG4gICAgICAgICAgICBpZiAoZ0J5dGVzID49IEtFWV9HUk9VUF9CWVRFUyB8fCBpID09PSBzb3J0ZWRLZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaCh7IGxvOiBzb3J0ZWRLZXlzW2dTdGFydF0sIGhpOiBzb3J0ZWRLZXlzW2ldLCBkdXA6IChnU2xvdHMgLSBnVW5pcXVlKSAvIGdTbG90cyB9KTtcbiAgICAgICAgICAgICAgICBnU3RhcnQgPSBpICsgMTsgZ0J5dGVzID0gMDsgZ1Nsb3RzID0gMDsgZ1VuaXF1ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc29ydChncm91cHMsIGcgPT4gLWcuZHVwKTtcbiAgICAgICAgcmV0dXJuIHsgZHVwRnJhY3Rpb246ICh0b3RhbFNsb3RzIC0ga2V5Q291bnQuc2l6ZSkgLyB0b3RhbFNsb3RzLCBncm91cHMgfTtcbiAgICB9XG5cbiAgICAvLyBXaGljaCBmaWxlcyBhIGtleS1ncm91cCBzdGVwIHJld3JpdGVzLiBSZS1ydW4gYXQgbWVyZ2UgdGltZSBhcyB3ZWxsIGFzIGF0IHBsYW4gdGltZTogZ3JvdXBzIGFyZSBkaXNqb2ludCBieSBLRVkgcmFuZ2UsIG5vdCBieSBmaWxlLCBzbyBhbiBlYXJsaWVyIHN0ZXAgaW4gdGhlIHNhbWUgcGFzcyBjYW4gY29uc3VtZSBhIGZpbGUgdGhpcyByYW5nZSBzdGlsbCBsaXN0cy5cbiAgICBwcml2YXRlIGFzeW5jIGZpbGVzRm9yS2V5UmFuZ2UoYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSwga2V5UmFuZ2U6IHsgbG86IHN0cmluZzsgaGk6IHN0cmluZyB9KTogUHJvbWlzZTxCdWxrRmlsZUluZm9bXT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChmID0+IHRoaXMucmVhZEJ1bGtIZWFkZXIoZi5maWxlTmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIGJ1bGtGaWxlcy5maWx0ZXIoKGYsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBoZWFkZXJzW2ldO1xuICAgICAgICAgICAgaWYgKCFoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaC5taW5LZXkgPT09IHVuZGVmaW5lZCB8fCBoLm1heEtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBoLm1pbktleSA8PSBrZXlSYW5nZS5oaSAmJiBoLm1heEtleSA+PSBrZXlSYW5nZS5sbztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlcnkgY29tcGFjdGlvbiB0aGUgZmlsZXMgb24gZGlzayBjdXJyZW50bHkgY2FsbCBmb3IsIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgb2YgdGhlbS4gQSBtZXJnZSBwYXNzXG4gICAgICogYnVpbGRzIGV4YWN0bHkgdGhpcyBhbmQgdGhlbiBydW5zIHRoZSBzdGVwcyB3aG9zZSBgcmVhZHlgIGlzIHRydWUsIHNvIHRoZSBwbGFuIGlzIHByZWNpc2VseSB3aGF0IHRoZVxuICAgICAqIGRhdGFiYXNlIGlzIGFib3V0IHRvIGRvIOKAlCBhbmQgYSBzdGVwIHRoYXQgaXNuJ3QgcmVhZHkgc3RpbGwgcmVwb3J0cyBpdHMgYHRyaWdnZXJzYCwgc28gYSBjYWxsZXIgY2FuXG4gICAgICogc2VlIGhvdyBjbG9zZSBpdCBpcyAoNTBNQiBvZiBzdHJlYW0gZGF0YSBvdXQgb2YgdGhlIDY0TUIgdGhhdCB3b3VsZCBmb2xkIGl0LCBhbmQgc28gb24pLlxuICAgICAqXG4gICAgICogTyh0b3RhbCBrZXlzKTogdGhlIHBoYXNlIDMgc3RlcHMgbmVlZCBldmVyeSBjb21iaW5lZCBmaWxlJ3Mga2V5IGxpc3Qgd2Fsa2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGFuQ29tcGFjdGlvbigpOiBQcm9taXNlPENvbXBhY3Rpb25QbGFuPiB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBzdGVwczogQ29tcGFjdGlvblN0ZXBbXSA9IFtdO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcblxuICAgICAgICBjb25zdCBzdHJlYW1TaXplcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHN0cmVhbUZpbGVzLm1hcChhc3luYyBmID0+IHtcbiAgICAgICAgICAgIHRyeSB7IHN0cmVhbVNpemVzLnNldChmLmZpbGVOYW1lLCAoYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpKT8uc2l6ZSA/PyAwKTsgfSBjYXRjaCB7IHN0cmVhbVNpemVzLnNldChmLmZpbGVOYW1lLCAwKTsgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUJ5dGVzID0gKGZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdKSA9PiBmaWxlcy5yZWR1Y2UoKGEsIGYpID0+IGEgKyAoc3RyZWFtU2l6ZXMuZ2V0KGYuZmlsZU5hbWUpID8/IDApLCAwKTtcblxuICAgICAgICAvLyDilIDilIAgUGhhc2UgMTogc3RyZWFtIC0+IGJ1bGsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICAgIC8vIFRoZSBFTlRJUkUgc3RyZWFtIHRpZXIgaXMgcGFyc2VkIGludG8gbWVtb3J5IGFuZCBoZWxkIHRoZXJlIChzdWJDYWNoZXMuc3RyZWFtIGtlZXBzIGV2ZXJ5IGRlY29kZWQgZW50cnkpIGp1c3QgdG8gYnVpbGQgdGhlIGluZGV4LCBzbyBpdCBpcyB0aGUgYmlnZ2VzdCBzaW5nbGUgbGV2ZXIgb24gb3VyIGhlYXAgLSBhIGZvbGQgdHVybnMgaXQgaW50byBhIGJ1bGsgZmlsZSB3ZSBvbmx5IHJlYWQgYW4gaW5kZXggb2YuIEZvbGRzIHN0cmVhbXMgYW5kIG5vdGhpbmcgZWxzZTogbm8gYnVsayBmaWxlIGlzIGRyYWdnZWQgaW4sIHNvIHRoZSB3b3JrIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbWVtb3J5IHJlY2xhaW1lZC5cbiAgICAgICAgY29uc3QgaGFyZExpbWl0ID0gbWFrZVRyaWdnZXIoeyBuYW1lOiBcInN0cmVhbUJ5dGVzXCIsIHZhbHVlOiBzdHJlYW1CeXRlcyhzdHJlYW1GaWxlcyksIHRocmVzaG9sZDogYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkSGFyZExpbWl0Qnl0ZXMsIHVuaXQ6IFwiYnl0ZXNcIiB9KTtcbiAgICAgICAgLy8gUGFzdCB0aGUgaGFyZCBsaW1pdCBldmVyeSByZWFkIHB1bGxzIGFuIGVub3Jtb3VzIGZpbGUsIHNvIGZvbGQgdGhlIHdob2xlIHRpZXIgcmVnYXJkbGVzcyBvZiB3aG8gb3ducyB3aGF0LiBtZXJnZUZpbGVTZXQgZm9yY2UtZGVsZXRlcyBmb3IgdGhpcyBvbmU7IGNhbkRlbGV0ZVN0cmVhbSBzdGlsbCByZXF1aXJlcyBzaXplLXN0YWJpbGl0eSwgc28gYW4gYWN0aXZlIHdyaXRlciBuZXZlciBsb3NlcyBkYXRhLlxuICAgICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgICAgIHBoYXNlOiAxLCBraW5kOiBcInN0cmVhbUhhcmRMaW1pdFwiLCByZXF1aXJlczogXCJhbGxcIiwgdHJpZ2dlcnM6IFtoYXJkTGltaXRdLFxuICAgICAgICAgICAgcmVhZHk6IGhhcmRMaW1pdC5tZXQgJiYgc3RyZWFtRmlsZXMubGVuZ3RoID4gMCxcbiAgICAgICAgICAgIGJ1bGtGaWxlczogW10sIHN0cmVhbUZpbGVzLCBieXRlczogaGFyZExpbWl0LnZhbHVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBIHBhc3Mgc2VhbHMgYmVmb3JlIGl0IG1lcmdlcywgc28gYnkgdGhlbiBvdXIgb3duIGN1cnJlbnQgZmlsZSBpcyBmaW5hbCB0b28gLSBwcmVkaWN0IHRoYXQgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIGl0IGFzIHN0aWxsLW9wZW4uXG4gICAgICAgIGNvbnN0IHsgcmV0aXJhYmxlLCBvd25lckdvbmUgfSA9IGF3YWl0IHRoaXMuZmluZEFiYW5kb25lZFN0cmVhbXMoc3RyZWFtRmlsZXMsIGlzU3luY1N1cHBvcnRlZCgpKTtcbiAgICAgICAgLy8gT25seSBmb2xkIHdoYXQgd2UgY2FuIGFsc28gcmV0aXJlLiBGb2xkaW5nIGEgc3RyZWFtIGEgbGl2ZSBmb3JlaWduIG93bmVyIG1heSBzdGlsbCBhcHBlbmQgdG8gd291bGQgY29weSBpdCBpbnRvIGJ1bGsgd2l0aG91dCByZW1vdmluZyBpdCwgc28gdGhlIGJ5dGVzIHdvdWxkIHN0YXkgaW4gbWVtb3J5IGFuZCBqdXN0IGdldCByZS1mb2xkZWQgbmV4dCBwYXNzOyB0aGF0IG93bmVyIHJvbGxzIGl0cyBvd24gZmlsZSBvdmVyIGF0IHN0cmVhbUZpbGVNYXhCeXRlcyBpbnN0ZWFkLlxuICAgICAgICAvLyBBZ2VkIHBhc3Qgc3RyZWFtU2VhbEFnZU1zIGNvdW50cyBhcyByZXRpcmFibGUgdG9vIChjYW5EZWxldGVTdHJlYW0ncyBvd24gZmlyc3QgcnVsZSk6IG5vIHdyaXRlciBhcHBlbmRzIHBhc3QgdGhlIHNlYWwgYWdlLCBhbmQgdGhpcyBpcyB0aGUgb25seSB0aGluZyB0aGF0IGZyZWVzIHRoZSB0aWVyIGluIE5vZGUsIHdoZXJlIGxpdmVuZXNzIGNhbm5vdCBiZSBwcm9iZWQgYXQgYWxsLlxuICAgICAgICBjb25zdCBmb2xkYWJsZSA9IHN0cmVhbUZpbGVzLmZpbHRlcihmID0+IGYub3duZXJJZCAhPT0gTUVSR0VfT1VUUFVUX09XTkVSXG4gICAgICAgICAgICAmJiAocmV0aXJhYmxlLmhhcyhmLmZpbGVOYW1lKSB8fCB0aW1lIC0gZi50aW1lc3RhbXAgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1TZWFsQWdlTXMpKTtcbiAgICAgICAgLy8gTWVyZ2UtY2FycnkgZmlsZXMgaG9sZCBub3RoaW5nIGJ1dCB0b21ic3RvbmVzIGFuZCBhcmUgbmV2ZXIgYSBSRUFTT04gdG8gZm9sZCAtIGZvbGRpbmcgb25lIGFsb25lIHdvdWxkIGp1c3QgcmV3cml0ZSBpdCBpbnRvIGFub3RoZXIgY2FycnkgZmlsZSwgZm9yZXZlci4gVGhleSByaWRlIGFsb25nIHdoZW5ldmVyIHNvbWV0aGluZyBlbHNlIGZvbGRzLCB3aGljaCBjb2xsYXBzZXMgaG93ZXZlciBtYW55IGhhdmUgcGlsZWQgdXAgaW50byBvbmUuXG4gICAgICAgIGNvbnN0IGNhcnJ5ID0gc3RyZWFtRmlsZXMuZmlsdGVyKGYgPT4gZi5vd25lcklkID09PSBNRVJHRV9PVVRQVVRfT1dORVIpO1xuICAgICAgICAvLyBBIHN0cmVhbSB3aG9zZSB3cml0ZXIgaXMgZ29uZSB3aWxsIG5ldmVyIGdyb3cgYW5kIG5vdGhpbmcgZWxzZSB3aWxsIGV2ZXIgZm9sZCBpdCwgc28gZm9sZCBpdCBhdCBhbnkgc2l6ZSAtIGV2ZW4gb25lIHJvdy4gWmVyby1ieXRlIG9uZXMgZG9uJ3QgY291bnQ6IHRoZXkgaG9sZCBubyBkYXRhIHRvIGZvbGQsIGFuZCBtZXJnZUZpbGVTZXRJbm5lciByZXRpcmVzIHRoZW0gZGlyZWN0bHkuXG4gICAgICAgIGNvbnN0IGFiYW5kb25lZCA9IGZvbGRhYmxlLmZpbHRlcihmID0+IG93bmVyR29uZS5oYXMoZi5maWxlTmFtZSkgJiYgc3RyZWFtU2l6ZXMuZ2V0KGYuZmlsZU5hbWUpKTtcbiAgICAgICAgY29uc3QgZm9sZFRyaWdnZXJzID0gW1xuICAgICAgICAgICAgbWFrZVRyaWdnZXIoeyBuYW1lOiBcImZvbGRhYmxlQnl0ZXNcIiwgdmFsdWU6IHN0cmVhbUJ5dGVzKGZvbGRhYmxlKSwgdGhyZXNob2xkOiBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZvbGRUcmlnZ2VyQnl0ZXMsIHVuaXQ6IFwiYnl0ZXNcIiB9KSxcbiAgICAgICAgICAgIG1ha2VUcmlnZ2VyKHsgbmFtZTogXCJhYmFuZG9uZWRGaWxlc1wiLCB2YWx1ZTogYWJhbmRvbmVkLmxlbmd0aCwgdGhyZXNob2xkOiAxLCB1bml0OiBcImNvdW50XCIgfSksXG4gICAgICAgIF07XG4gICAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICAgICAgcGhhc2U6IDEsIGtpbmQ6IFwic3RyZWFtRm9sZFwiLCByZXF1aXJlczogXCJhbnlcIiwgdHJpZ2dlcnM6IGZvbGRUcmlnZ2VycyxcbiAgICAgICAgICAgIC8vIFNraXBwZWQgd2hlbiB0aGUgaGFyZCBsaW1pdCBhbHJlYWR5IGZvbGRzIGV2ZXJ5dGhpbmcgdGhpcyB3b3VsZCBoYXZlLlxuICAgICAgICAgICAgcmVhZHk6ICFoYXJkTGltaXQubWV0ICYmIGZvbGRUcmlnZ2Vycy5zb21lKHQgPT4gdC5tZXQpLFxuICAgICAgICAgICAgYnVsa0ZpbGVzOiBbXSwgc3RyZWFtRmlsZXM6IFsuLi5mb2xkYWJsZSwgLi4uY2FycnldLCBieXRlczogc3RyZWFtQnl0ZXMoWy4uLmZvbGRhYmxlLCAuLi5jYXJyeV0pLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDilIDilIAgUGhhc2UgMjogbG9vc2UgYnVsayAtPiBjb21iaW5lZCBidWxrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgICAvLyBQaGFzZSAxIGVtaXRzIG9uZSBzbWFsbCBidWxrIGZpbGUgcGVyIGZvbGQuIEVhY2ggaXMgY2hlYXAgdG8gcmVhZCAoaW5kZXggb25seSkgYnV0IGhvbGRzIGl0cyB3aG9sZSBrZXkgbGlzdCBpbiBtZW1vcnkgYW5kIGpvaW5zIGludG8gZXZlcnkgcmVhZCwgc28gdGhleSBoYXZlIHRvIGJlIHJvbGxlZCB1cC4gTWVyZ2luZyBqdXN0IHRoZSBsb29zZSBvbmVzIGFsc28gZGVkdXBlcyB0aGVtIGZvciBmcmVlIC0gYSByZXdyaXRlLWhlYXZ5IHdvcmtsb2FkIGNvbGxhcHNlcyBhIGdpZ2FieXRlIG9mIG5lYXItaWRlbnRpY2FsIGZvbGRzIGludG8gYWxtb3N0IG5vdGhpbmcgLSBhbmQgaXQgYWx3YXlzIHRlcm1pbmF0ZXMsIGJlY2F1c2UgYSBtZXJnZSBjdXRzIGV2ZXJ5IG91dHB1dCBidXQgdGhlIGxhc3QgYXQgVEFSR0VUX0ZJTEVfQllURVMsIHNvIG9uZSBwYXNzIGNhbiBsZWF2ZSBhdCBtb3N0IG9uZSBsb29zZSBmaWxlIGJlaGluZC5cbiAgICAgICAgY29uc3QgeyBsb29zZSwgbG9vc2VCeXRlcywgY29tYmluZWQsIHNpemVzIH0gPSBhd2FpdCB0aGlzLnNwbGl0QnVsa1RpZXIoYnVsa0ZpbGVzKTtcbiAgICAgICAgY29uc3QgbG9vc2VUcmlnZ2VycyA9IFtcbiAgICAgICAgICAgIG1ha2VUcmlnZ2VyKHsgbmFtZTogXCJsb29zZUJ5dGVzXCIsIHZhbHVlOiBsb29zZUJ5dGVzLCB0aHJlc2hvbGQ6IGJ1bGtEYXRhYmFzZTJUaW1pbmcubG9vc2VCdWxrVHJpZ2dlckJ5dGVzLCB1bml0OiBcImJ5dGVzXCIgfSksXG4gICAgICAgICAgICBtYWtlVHJpZ2dlcih7IG5hbWU6IFwibG9vc2VGaWxlc1wiLCB2YWx1ZTogbG9vc2UubGVuZ3RoLCB0aHJlc2hvbGQ6IGJ1bGtEYXRhYmFzZTJUaW1pbmcubG9vc2VCdWxrVHJpZ2dlckZpbGVzLCB1bml0OiBcImNvdW50XCIgfSksXG4gICAgICAgIF07XG4gICAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICAgICAgcGhhc2U6IDIsIGtpbmQ6IFwibG9vc2VDb21iaW5lXCIsIHJlcXVpcmVzOiBcImFueVwiLCB0cmlnZ2VyczogbG9vc2VUcmlnZ2VycyxcbiAgICAgICAgICAgIC8vIFVuZGVyIHR3byBmaWxlcyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbWJpbmUsIGFuZCByZXdyaXRpbmcgb25lIGZpbGUgaW50byBhbiBpZGVudGljYWwgb25lIHdvdWxkIHJlLXRyaWdnZXIgZm9yZXZlci5cbiAgICAgICAgICAgIHJlYWR5OiBsb29zZS5sZW5ndGggPj0gMiAmJiBsb29zZVRyaWdnZXJzLnNvbWUodCA9PiB0Lm1ldCksXG4gICAgICAgICAgICBidWxrRmlsZXM6IGxvb3NlLCBzdHJlYW1GaWxlczogW10sIGJ5dGVzOiBsb29zZUJ5dGVzLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDilIDilIAgUGhhc2UgMzogZGVkdXAgdGhlIGNvbWJpbmVkIGZpbGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgICAvLyBMb29zZSBmaWxlcyBhcmUgZXhjbHVkZWQgdGhyb3VnaG91dDogcGhhc2UgMiByZXdyaXRlcyB0aGVtIGFueXdheSwgYW5kIHRoYXQgcmV3cml0ZSBhbHJlYWR5IGRlZHVwZXMgdGhlbSwgc28gcHVsbGluZyBvbmUgaW4gaGVyZSB3b3VsZCBkbyB0aGUgc2FtZSB3b3JrIHR3aWNlIGF0IGtleS1ncm91cCBzY2FsZS5cbiAgICAgICAgY29uc3QgY29tYmluZWRCeXRlcyA9IGNvbWJpbmVkLnJlZHVjZSgoYSwgZikgPT4gYSArIChzaXplcy5nZXQoZi5maWxlTmFtZSkgPz8gMCksIDApO1xuICAgICAgICBjb25zdCB7IGR1cEZyYWN0aW9uLCBncm91cHMgfSA9IGF3YWl0IHRoaXMuYW5hbHl6ZUR1cGxpY2F0ZXMoY29tYmluZWQpO1xuICAgICAgICAvLyBXaG9sZS10aWVyIHNob3J0LWNpcmN1aXQ6IHdoZW4gdGhlIGNvbWJpbmVkIHRpZXIgaXMgYmlnIGVub3VnaCBBTkQgbW9zdGx5IGR1cGxpY2F0ZXMsIGZvbGQgYWxsIG9mIGl0IGluIG9uZSBtZXJnZSByYXRoZXIgdGhhbiBwYXlpbmcgdGhlIHBlci1ncm91cCB3YWxrJ3MgNS1taW4gc3BhY2luZyB4IE4gZ3JvdXBzLlxuICAgICAgICBjb25zdCBkZWR1cEFsbFRyaWdnZXJzID0gW1xuICAgICAgICAgICAgbWFrZVRyaWdnZXIoeyBuYW1lOiBcImNvbWJpbmVkQnl0ZXNcIiwgdmFsdWU6IGNvbWJpbmVkQnl0ZXMsIHRocmVzaG9sZDogREVEVVBfVFJJR0dFUl9CWVRFUywgdW5pdDogXCJieXRlc1wiIH0pLFxuICAgICAgICAgICAgbWFrZVRyaWdnZXIoeyBuYW1lOiBcImR1cGxpY2F0ZUZyYWN0aW9uXCIsIHZhbHVlOiBkdXBGcmFjdGlvbiwgdGhyZXNob2xkOiBERURVUF9UUklHR0VSX0ZSQUNUSU9OLCB1bml0OiBcImZyYWN0aW9uXCIgfSksXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGRlZHVwQWxsUmVhZHkgPSBjb21iaW5lZC5sZW5ndGggPj0gMiAmJiBkZWR1cEFsbFRyaWdnZXJzLmV2ZXJ5KHQgPT4gdC5tZXQpO1xuICAgICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgICAgIHBoYXNlOiAzLCBraW5kOiBcImRlZHVwQWxsXCIsIHJlcXVpcmVzOiBcImFsbFwiLCB0cmlnZ2VyczogZGVkdXBBbGxUcmlnZ2VycyxcbiAgICAgICAgICAgIHJlYWR5OiBkZWR1cEFsbFJlYWR5LFxuICAgICAgICAgICAgYnVsa0ZpbGVzOiBjb21iaW5lZCwgc3RyZWFtRmlsZXM6IFtdLCBieXRlczogY29tYmluZWRCeXRlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhlbiBrZXktc3RyYXRpZmllZDogZGlzam9pbnQga2V5IHJhbmdlcywgc28gb25lIGdyb3VwJ3MgbWVyZ2UgZG9lc24ndCBjaGFuZ2UgYW5vdGhlcidzIGR1cGxpY2F0aW9uLiBPbmx5IGdyb3VwcyBvdmVyIHRoZSB0aHJlc2hvbGQgYXJlIHdvcnRoIGEgc3RlcDsgdGhlIGJlc3Qgb25lIGJlbG93IGl0IGlzIGxpc3RlZCBhbnl3YXkgc28gYSBjYWxsZXIgY2FuIHNlZSBob3cgY2xvc2UgdGhlIHRpZXIgaXMuXG4gICAgICAgIGNvbnN0IGdyb3VwU3RlcHMgPSBncm91cHMuZmlsdGVyKGcgPT4gZy5kdXAgPj0gRFVQX1RIUkVTSE9MRCk7XG4gICAgICAgIGlmICghZ3JvdXBTdGVwcy5sZW5ndGggJiYgZ3JvdXBzLmxlbmd0aCkgZ3JvdXBTdGVwcy5wdXNoKGdyb3Vwc1swXSk7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBncm91cFN0ZXBzKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cEZpbGVzID0gYXdhaXQgdGhpcy5maWxlc0ZvcktleVJhbmdlKGNvbWJpbmVkLCBnKTtcbiAgICAgICAgICAgIGNvbnN0IGR1cCA9IG1ha2VUcmlnZ2VyKHsgbmFtZTogXCJkdXBsaWNhdGVGcmFjdGlvblwiLCB2YWx1ZTogZy5kdXAsIHRocmVzaG9sZDogRFVQX1RIUkVTSE9MRCwgdW5pdDogXCJmcmFjdGlvblwiIH0pO1xuICAgICAgICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgcGhhc2U6IDMsIGtpbmQ6IFwiZGVkdXBLZXlHcm91cFwiLCByZXF1aXJlczogXCJhbGxcIiwgdHJpZ2dlcnM6IFtkdXBdLFxuICAgICAgICAgICAgICAgIC8vIE1vb3QgaWYgdGhlIHdob2xlIHRpZXIgaXMgYWJvdXQgdG8gYmUgZm9sZGVkIGluIG9uZSBnby5cbiAgICAgICAgICAgICAgICByZWFkeTogIWRlZHVwQWxsUmVhZHkgJiYgZHVwLm1ldCAmJiBncm91cEZpbGVzLmxlbmd0aCA+PSAyLFxuICAgICAgICAgICAgICAgIGJ1bGtGaWxlczogZ3JvdXBGaWxlcywgc3RyZWFtRmlsZXM6IFtdLCBieXRlczogZ3JvdXBGaWxlcy5yZWR1Y2UoKGEsIGYpID0+IGEgKyAoc2l6ZXMuZ2V0KGYuZmlsZU5hbWUpID8/IDApLCAwKSxcbiAgICAgICAgICAgICAgICBrZXlSYW5nZTogeyBsbzogZy5sbywgaGk6IGcuaGkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2VzIGFyZSBzcGFjZWQgbWVyZ2VTcGFjaW5nTXMgYXBhcnQsIGFuZCB0aGUgZmlyc3Qgb25lIHJ1bnMgaW1tZWRpYXRlbHkuXG4gICAgICAgIGxldCByZWFkeUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgICAgICAgICBpZiAoIXN0ZXAucmVhZHkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc3RlcC5zdGFydFRpbWUgPSB0aW1lICsgcmVhZHlDb3VudCAqIGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVyZ2VTcGFjaW5nTXM7XG4gICAgICAgICAgICByZWFkeUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29sbGVjdGlvbjogdGhpcy5uYW1lLCB0aW1lLCBzdGVwcyB9O1xuICAgIH1cblxuICAgIC8vIFJ1bnMgdGhlIGNvbXBhY3Rpb24gcGxhbjogYnVpbGRzIGl0LCB0aGVuIHBlcmZvcm1zIGV2ZXJ5IHN0ZXAgaXQgbWFya3MgcmVhZHksIGluIG9yZGVyLiBBbGwgdGhlIGRlY2lkaW5nIGxpdmVzIGluIHBsYW5Db21wYWN0aW9uIC0gdGhpcyBvbmx5IGV4ZWN1dGVzLCBzbyB3aGF0IHRoZSBkYXRhYmFzZSBkb2VzIGFuZCB3aGF0IHBsYW5Db21wYWN0aW9uIHJlcG9ydHMgY2FuIG5ldmVyIGRyaWZ0IGFwYXJ0LlxuICAgIHByaXZhdGUgYXN5bmMgdGVzdE1lcmdlSU5URVJOQUxfRE9fTk9UX0NBTEwoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcblxuICAgICAgICAvLyBTZWFsIGJlZm9yZSBwbGFubmluZywgc28gZXZlcnkgd3JpdGVyJ3MgY3VycmVudCBzdHJlYW0gZmlsZSBpcyBmaW5hbCBhbmQgdGhlIHBsYW4gY2FuIGNvdW50IGl0IGFzIGZvbGRhYmxlLiBPbmx5IHdoZW4gY3Jvc3MtdGFiIHN5bmMgaXMgdGhlcmUgdG8gY2FycnkgdGhlIHNlYWwgLSBpbiBOb2RlIGNhbkRlbGV0ZVN0cmVhbSBuZWVkcyBzdHJlYW1zIGFnZWQgYW55d2F5LCBzbyBzZWFsaW5nIHdvdWxkIGp1c3QgZnJhZ21lbnQgdGhlbSBldmVyeSBwYXNzLlxuICAgICAgICBpZiAoaXNTeW5jU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIHN5bmNCcm9hZGNhc3RTZWFsKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhbiA9IGF3YWl0IHRoaXMucGxhbkNvbXBhY3Rpb24oKTtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBsYW4uc3RlcHMpIHtcbiAgICAgICAgICAgIGlmICghc3RlcC5yZWFkeSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgYnVsa0ZpbGVzID0gc3RlcC5idWxrRmlsZXM7XG4gICAgICAgICAgICBpZiAoc3RlcC5rZXlSYW5nZSkge1xuICAgICAgICAgICAgICAgIGJ1bGtGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZXNGb3JLZXlSYW5nZShidWxrRmlsZXMsIHN0ZXAua2V5UmFuZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChidWxrRmlsZXMubGVuZ3RoIDwgMikgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3aHkgPSBzdGVwLnRyaWdnZXJzLmZpbHRlcih0ID0+IHQubWV0KVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiBgJHt0Lm5hbWV9ICR7Zm10VHJpZ2dlclZhbHVlKHQudmFsdWUsIHQudW5pdCl9IG9mICR7Zm10VHJpZ2dlclZhbHVlKHQudGhyZXNob2xkLCB0LnVuaXQpfWApLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKHN0ZXAua2luZCl9IHBoYXNlICR7c3RlcC5waGFzZX06ICR7YnVsa0ZpbGVzLmxlbmd0aH0gYnVsayArICR7c3RlcC5zdHJlYW1GaWxlcy5sZW5ndGh9IHN0cmVhbSBmaWxlKHMpLCAke2ZtdEJ5dGVzKHN0ZXAuYnl0ZXMpfSAtICR7d2h5fWApO1xuICAgICAgICAgICAgaWYgKG1lcmdlZCAmJiAhYXdhaXQgdGhpcy5tZXJnZVNwYWNpbmdEZWxheSgpKSByZXR1cm4gbWVyZ2VkO1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMubWVyZ2VGaWxlU2V0KGJ1bGtGaWxlcywgc3RlcC5zdHJlYW1GaWxlcywgZmFsc2UsIHN0ZXAua2luZCA9PT0gXCJzdHJlYW1IYXJkTGltaXRcIikpIG1lcmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcmVhZHMg4oCUIGZvcndhcmRlZCB0byBCdWxrRGF0YWJhc2VSZWFkZXIsIHdpdGggcmVidWlsZC1vbi1taXNzaW5nIHJldHJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHB1YmxpYyBhc3luYyBnZXRTaW5nbGVGaWVsZDxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IFByb21pc2U8VFtDXSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2luZ2xlRmllbGRPYmo8QyBleHRlbmRzIGtleW9mIFQ+KGtleTogc3RyaW5nLCBjb2x1bW46IEMpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGRPYmooa2V5LCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29sdW1uPEMgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEMpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfVtdPiB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlYWRlci5nZXRDb2x1bW4oY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0S2V5cygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2luZ2xlRmllbGRTeW5jPEMgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IHN0cmluZywgY29sdW1uOiBDKTogVFtDXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbmdsZUZpZWxkT2JqU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkT2JqU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtblN5bmM8QyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogQyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uU3luYyhjb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZpZWxkTG9hZGVkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IGJvb2xlYW4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0ZpZWxkTG9hZGVkU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29sdW1uTG9hZGVkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oY29sdW1uOiBDKTogYm9vbGVhbiB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmlzQ29sdW1uTG9hZGVkU3luYyhjb2x1bW4pO1xuICAgIH1cblxuICAgIC8vIFJlYWN0aXZlOiB0cnVlIHdoaWxlIGEgbWVyZ2UgaXMgcmV3cml0aW5nIHRoaXMgY29sbGVjdGlvbidzIGZpbGVzLiBVc2UgdGhpcyBpbiBVSSB0byBzaG93IGEgXCJjb21wYWN0aW5n4oCmXCIgaW5kaWNhdG9yLiBDb3VudHMgYm90aCBiYWNrZ3JvdW5kIG1lcmdlcyAobWF5YmVNZXJnZSkgYW5kIGV4cGxpY2l0IGNvbXBhY3QvbWVyZ2UgY2FsbHMuIEJlY29tZXMgZmFsc2Ugb25jZSB0aGUgbmV3IGluZGV4IGlzIHN3YXBwZWQgaW4gKHRoZSBkZWZlcnJlZC1kZWxldGUgd2luZG93IGlzIE5PVCBjb3VudGVkKS5cbiAgICBwdWJsaWMgaXNDb21wYWN0aW5nU3luYygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmlzQ29tcGFjdGluZ1N5bmMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29sdW1uSW5mbygpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIHJldHVybiBpbmRleC5yZWFkZXIuY29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5U3RhdHMoKTogUHJvbWlzZTx7IHJhd0tleXM6IG51bWJlcjsgZmluYWxLZXlzOiBudW1iZXI7IHdhc3RlZEtleXM6IG51bWJlcjsgZHVwbGljYXRpb246IG51bWJlcjsgcmVhZGVyczogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IHJhd0tleXMgPSBpbmRleC5yZWFkZXIucmF3S2V5Q291bnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsS2V5cyA9IGluZGV4LnJlYWRlci5rZXlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd0tleXMsXG4gICAgICAgICAgICBmaW5hbEtleXMsXG4gICAgICAgICAgICB3YXN0ZWRLZXlzOiByYXdLZXlzIC0gZmluYWxLZXlzLFxuICAgICAgICAgICAgZHVwbGljYXRpb246IGZpbmFsS2V5cyA/IHJhd0tleXMgLyBmaW5hbEtleXMgOiAwLFxuICAgICAgICAgICAgcmVhZGVyczogaW5kZXgucmVhZGVyLnJlYWRlckNvdW50LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRSZWFkZXJJbmZvKCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJvd0NvdW50OiBpbmRleC5yZWFkZXIucm93Q291bnQsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzOiBpbmRleC5yZWFkZXIudG90YWxCeXRlcyxcbiAgICAgICAgICAgIGtleUNvdW50OiBpbmRleC5yZWFkZXIua2V5cy5sZW5ndGgsXG4gICAgICAgICAgICBzYW1wbGVLZXk6IGluZGV4LnJlYWRlci5rZXlzWzBdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IGluZGV4LnJlYWRlci5jb2x1bW5zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRGaWxlSW5mbygpOiBQcm9taXNlPEJ1bGtGaWxlSW5mb0xpc3Rpbmc+IHtcbiAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHN0YXRPZiA9IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBieXRlczogaW5mbz8uc2l6ZSA/PyAwLCBsYXN0TW9kaWZpZWQ6IGluZm8/Lmxhc3RNb2RpZmllZCA/PyAwIH07XG4gICAgICAgICAgICB9IGNhdGNoIHsgcmV0dXJuIHsgYnl0ZXM6IDAsIGxhc3RNb2RpZmllZDogMCB9OyB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1bGtJbmZvcyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgc3RhdE9mKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYnVsa1wiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGJ5dGVzOiBzdGF0LmJ5dGVzLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgZ2V0RGV0YWlsczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWxrOiByZWFkZXIgaGFzIGtleXMgKyBwZXItcm93IGtleVRpbWVzICsgaGVhZGVyIG1pblRpbWUvbWF4VGltZS4gQ2FjaGVkLCBzbyBjaGVhcC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gYXdhaXQgbG9hZEZpbGVSZWFkZXIodGhpcy5uYW1lLCBzdG9yYWdlLCBmLCB0aGlzLnN1YkNhY2hlcy5idWxrKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogcmVhZGVyLmtleXMsIG1pblRpbWU6IHJlYWRlci5taW5UaW1lLCBtYXhUaW1lOiByZWFkZXIubWF4VGltZSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm9zID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHN0YXRPZihmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZi5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmVhbVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGJ5dGVzOiBzdGF0LmJ5dGVzLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgZ2V0RGV0YWlsczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJlYW06IG11c3QgcGFyc2UgdGhlIGZpbGUgdG8gd2FsayBldmVyeSBlbnRyeSDigJQgaGVhZGVyIGhhcyBubyBrZXkvdGltZSBib3VuZHMuIENhY2hlZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGxvYWRTdHJlYW1FbnRyaWVzKHRoaXMubmFtZSwgc3RvcmFnZSwgW2ZdLCB0aGlzLnN1YkNhY2hlcy5zdHJlYW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5UaW1lID0gSW5maW5pdHksIG1heFRpbWUgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkYXRhLmVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnRpbWUgPCBtaW5UaW1lKSBtaW5UaW1lID0gZS50aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGltZSA+IG1heFRpbWUpIG1heFRpbWUgPSBlLnRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5lbnRyeS5yb3cpIGtleXMuYWRkKGUuZW50cnkucm93LmtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5lbnRyeS5kZWxldGVkS2V5ICE9PSB1bmRlZmluZWQpIGtleXMuYWRkKGUuZW50cnkuZGVsZXRlZEtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IFsuLi5rZXlzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWU6IG1pblRpbWUgPT09IEluZmluaXR5ID8gMCA6IG1pblRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhUaW1lOiBtYXhUaW1lID09PSAtSW5maW5pdHkgPyAwIDogbWF4VGltZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IFsuLi5idWxrSW5mb3MsIC4uLnN0cmVhbUluZm9zXTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGNvdW50OiBmaWxlcy5sZW5ndGgsIHRvdGFsQnl0ZXM6IGZpbGVzLnJlZHVjZSgoYSwgZikgPT4gYSArIGYuYnl0ZXMsIDApIH07XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBCdWxrRmlsZURldGFpbHMgPSB7IGtleXM6IHN0cmluZ1tdOyBtaW5UaW1lOiBudW1iZXI7IG1heFRpbWU6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgQnVsa0ZpbGVFbnRyeSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogXCJidWxrXCIgfCBcInN0cmVhbVwiO1xuICAgIGJ5dGVzOiBudW1iZXI7XG4gICAgLy8gRmlsZXN5c3RlbSBtdGltZSAobXMgc2luY2UgZXBvY2gpIOKAlCAwIGlmIHRoZSBzdG9yYWdlIGxheWVyIGRpZG4ndCByZXR1cm4gb25lLlxuICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgIC8vIExhenk6IHB1bGxlZCBmcm9tIHRoZSBjYWNoZWQgc3ViLXJlYWRlciBmb3IgYnVsayAoZnJlZSBpZiBsb2FkZWQpLCBvciBmcm9tIGEgcGFyc2Ugb2YgdGhlIHN0cmVhbSBmaWxlIChzbWFsbCDigJQgdGllci0wIHNpemUtY2FwcGVkLCBhbHNvIGNhY2hlZCkuIENhbGwgb25seSB3aGVuIHlvdSBuZWVkIHRoZSBwZXItZmlsZSBkZXRhaWwuXG4gICAgZ2V0RGV0YWlsczogKCkgPT4gUHJvbWlzZTxCdWxrRmlsZURldGFpbHM+O1xufTtcbmV4cG9ydCB0eXBlIEJ1bGtGaWxlSW5mb0xpc3RpbmcgPSB7IGZpbGVzOiBCdWxrRmlsZUVudHJ5W107IGNvdW50OiBudW1iZXI7IHRvdGFsQnl0ZXM6IG51bWJlciB9O1xuXG4iXX0=
|
|
1274
|
-
/* _JS_SOURCE_HASH = "
|
|
1270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsa0RhdGFiYXNlQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkJ1bGtEYXRhYmFzZUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWtFO0FBQ2xFLDJEQUEyRDtBQUMzRCxtREFBeUQ7QUFDekQseURBQW1EO0FBQ25ELDZDQUFxQztBQUVyQyw2REFNOEI7QUFDOUIsMkRBQXNEO0FBQ3RELDZDQUFrRTtBQUNsRSxrRUFBaUY7QUFDakYsd0VBQXlFO0FBQ3pFLDJDQUFpRztBQUNqRyw2Q0FBd0w7QUFDeEwsaURBQXlDO0FBQ3pDLDJDQUFpTTtBQUNqTSxpREFBOEc7QUFDOUcsK0NBVXVCO0FBQ3ZCLDZEQUFvRTtBQUV2RCxRQUFBLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQ2pELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxzYkFBc2I7QUFDdGIsRUFBRTtBQUNGLDhRQUE4UTtBQUM5USxNQUFNLG9CQUFvQixHQUFHLHNDQUFpQixHQUFHLENBQUMsQ0FBQztBQUNuRCxNQUFNLGVBQWUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsZ1NBQWdTO0FBQ2hTLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSx5QkFB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LEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsQ0FBQzs7QUFsakNMLDRDQW1qQ0M7QUFyOUJHLHdEQUF3RDtBQUN6Qyw4QkFBYSxHQUFHLElBQUksR0FBRyxFQUFxQyxBQUEvQyxDQUFnRDtBQUM3RCxzQ0FBcUIsR0FBRyxLQUFLLEFBQVIsQ0FBUztBQUM5QixrQ0FBaUIsR0FBRyxDQUFDLEFBQUosQ0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNvcnQsIHRocm90dGxlRnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBydW5JblNlcmlhbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRUaW1lVW5pcXVlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYml0c1wiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCJ0eXBlc2FmZWNzc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3RvcmFnZSB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQge1xuICAgIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXIsXG4gICAgQnVsa0hlYWRlckluZm8sXG4gICAgYnVpbGRGaWxlQnVmZmVyLFxuICAgIGxvYWRCdWxrSGVhZGVyLFxuICAgIFRBUkdFVF9GSUxFX0JZVEVTLFxufSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VGb3JtYXRcIjtcbmltcG9ydCB7IHJ1blBsYW5uZWRNZXJnZSB9IGZyb20gXCIuL0J1bGtEYXRhYmFzZU1lcmdlXCI7XG5pbXBvcnQgeyBibG9ja0NhY2hlLCBlbmNvZGVDb21wcmVzc2VkQmxvY2tzIH0gZnJvbSBcIi4vYmxvY2tDYWNoZVwiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJsdWUsIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgU1RSRUFNX0VYVEVOU0lPTiwgZnJhbWVEZWxldGVzLCBmcmFtZVJvd3MsIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzIH0gZnJvbSBcIi4vc3RyZWFtTG9nXCI7XG5pbXBvcnQgeyBicm9hZGNhc3QgYXMgc3luY0Jyb2FkY2FzdCwgYnJvYWRjYXN0U2VhbCBhcyBzeW5jQnJvYWRjYXN0U2VhbCwgY29ubmVjdCBhcyBzeW5jQ29ubmVjdCwgaXNTeW5jU3VwcG9ydGVkLCBxdWVyeUxpdmVXcml0ZXJzLCByZWdpc3RlcldyaXRlcklkLCBSZW1vdGVXcml0ZSB9IGZyb20gXCIuL3N5bmNDbGllbnRcIjtcbmltcG9ydCB7IERFTEVURUQgfSBmcm9tIFwiLi9Xcml0ZU92ZXJsYXlcIjtcbmltcG9ydCB7IE1lcmdlTG9ja0luZm8sIHBlZWtNZXJnZUZpbGVMb2NrLCBwZWVrTWVyZ2VMb2NrLCByZWxlYXNlTWVyZ2VGaWxlTG9jaywgcmVsZWFzZU1lcmdlTG9jaywgc3RhcnRNZXJnZUZpbGVMb2NrSGVhcnRiZWF0LCB0cnlBY3F1aXJlTWVyZ2VGaWxlTG9jaywgdHJ5QWNxdWlyZU1lcmdlTG9jayB9IGZyb20gXCIuL21lcmdlTG9ja1wiO1xuaW1wb3J0IHsgbWFya2VyRXhjbHVzaW9ucywgcHJvY2Vzc0RlbGV0ZU1hcmtlcnMsIHJlYWREZWxldGVNYXJrZXJzLCB3cml0ZURlbGV0ZU1hcmtlciB9IGZyb20gXCIuL21lcmdlTWFya2Vyc1wiO1xuaW1wb3J0IHtcbiAgICBCdWxrRmlsZUluZm8sXG4gICAgTG9hZGVkSW5kZXgsXG4gICAgbG9hZEZpbGVSZWFkZXIsXG4gICAgbG9hZFN0cmVhbUVudHJpZXMsXG4gICAgbWFrZVJhd0dldFJhbmdlLFxuICAgIE1pc3NpbmdGaWxlRXJyb3IsXG4gICAgb3JkZXJTdHJlYW1FbnRyaWVzLFxuICAgIFN0cmVhbUZpbGVJbmZvLFxuICAgIFN1YlJlYWRlckNhY2hlcyxcbn0gZnJvbSBcIi4vTG9hZGVkSW5kZXhcIjtcbmltcG9ydCB7IEJ1bGtEYXRhYmFzZVJlYWRlciwgbnVsbEpvaW4gfSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VSZWFkZXJcIjtcblxuZXhwb3J0IGNvbnN0IEJVTEtfUk9PVF9GT0xERVIgPSBcImJ1bGtEYXRhYmFzZXMyXCI7XG5jb25zdCBGSUxFX0VYVEVOU0lPTiA9IFwiLmJ1bGtcIjtcbmNvbnN0IFJPTExPVkVSX1JPV1MgPSA1MDAwO1xuY29uc3QgUk9MTE9WRVJfQllURVMgPSA1ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBNRU1PUllfV0FUQ0hET0dfSU5URVJWQUxfTVMgPSA2MCAqIDEwMDA7XG5jb25zdCBTVEFMRV9ERUxFVEVfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuY29uc3QgTUFYX0lOREVYX1JFTE9BRF9BVFRFTVBUUyA9IDM7XG4vLyBBIGJ1bGsgZmlsZSB1bmRlciB0aGlzIGlzIFwibG9vc2VcIiAtIHN0aWxsIHdvcnRoIHJvbGxpbmcgdXAgaW50byBhIGJpZ2dlciBvbmUuIEhhbGYgdGhlIHRhcmdldCBmaWxlIHNpemUsIGJlY2F1c2UgdGhhdCBpcyBleGFjdGx5IHdoZXJlIGNvbWJpbmluZyBzdG9wcyBwYXlpbmc6IG1lcmdpbmcgdHdvIGZpbGVzIHRoYXQgYXJlIGVhY2ggb3ZlciBoYWxmIHRoZSB0YXJnZXQganVzdCBzcGxpdHMgYmFjayBpbnRvIHR3byBmaWxlcyBhZ2Fpbiwgc28gdGhlIGZpbGUgY291bnQgKGFuZCB3aXRoIGl0IHRoZSBwZXItZmlsZSBrZXkgbGlzdCBldmVyeSByZWFkIGhvbGRzIGluIG1lbW9yeSkgZG9lcyBub3QgZHJvcC4gVW5kZXIgaGFsZiwgYW55IHR3byBpbnB1dHMgZml0IGluIG9uZSBvdXRwdXQsIHNvIHBoYXNlIDIgYWx3YXlzIG1ha2VzIHRoZSBjb3VudCBnbyBkb3duLlxuLy9cbi8vIE5PVCB0aGUgdGFyZ2V0IHNpemUgaXRzZWxmLiBydW5QbGFubmVkTWVyZ2UgY3V0cyBhIGNodW5rIEJFRk9SRSBhZGRpbmcgdGhlIGtleSB0aGF0IHdvdWxkIGV4Y2VlZCB0aGUgdGFyZ2V0LCBzbyBldmVyeSBmaWxlIGl0IHdyaXRlcyBpcyB1bmRlciBUQVJHRVRfRklMRV9CWVRFUyAtIHRlc3RpbmcgYWdhaW5zdCB0aGUgdGFyZ2V0IHdvdWxkIGNsYXNzaWZ5IHRoZSBlbnRpcmUgY29sbGVjdGlvbiBhcyBsb29zZSBhbmQgcmUtbWVyZ2UgYWxsIG9mIGl0LCBmb3JldmVyLlxuY29uc3QgTE9PU0VfQlVMS19NQVhfQllURVMgPSBUQVJHRVRfRklMRV9CWVRFUyAvIDI7XG5jb25zdCBLRVlfR1JPVVBfQllURVMgPSA4MDAgKiAxMDI0ICogMTAyNDtcbmNvbnN0IERVUF9USFJFU0hPTEQgPSAwLjQ7XG4vLyBXaG9sZS10aWVyIGRlZHVwIHNob3J0LWNpcmN1aXQgKHN0YXJ0IG9mIHBoYXNlIDMpOiB3aGVuIHRoZSBjb21iaW5lZCB0aWVyIGlzIG92ZXIgdGhpcyBzaXplIEFORCB0aGUgb3ZlcmFsbCBrZXkgZHVwbGljYXRpb24gZnJhY3Rpb24gaXMgb3ZlciB0aGlzIHRocmVzaG9sZCwgZm9sZCBldmVyeSBjb21iaW5lZCBmaWxlIGluIG9uZSBtZXJnZSBpbnN0ZWFkIG9mIHRoZSBwZXIta2V5LWdyb3VwIHdhbGsgKHdoaWNoIHNwYWNlcyBtZXJnZXMgNSBtaW4gYXBhcnQg4oCUIDE2IGggZm9yIDIwMCBncm91cHMpLlxuY29uc3QgREVEVVBfVFJJR0dFUl9CWVRFUyA9IDUxMiAqIDEwMjQgKiAxMDI0O1xuY29uc3QgREVEVVBfVFJJR0dFUl9GUkFDVElPTiA9IDAuNTtcbmNvbnN0IFdSSVRFX0ZMVVNIX0ZJUlNUX1NURVBfTVMgPSAyNTA7XG4vLyBTa2lwIGxvZ3MgYXJlIHRocm90dGxlZCBwZXIgY29sbGVjdGlvbjogdGhlIGJhY2tncm91bmQgd3JpdGUgcGF0aCByZXRyaWVzIG1lcmdlcyBhYm91dCBvbmNlIGEgc2Vjb25kLCBzbyBhbiB1bnRocm90dGxlZCBsb2cgd291bGQgcmVwZWF0IGZvciB0aGUgd2hvbGUgZHVyYXRpb24gb2YgYW5vdGhlciB0YWIncyBtZXJnZS5cbmNvbnN0IE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TID0gMzAgKiAxMDAwO1xuXG5leHBvcnQgY29uc3QgYnVsa0RhdGFiYXNlMlRpbWluZyA9IHtcbiAgICBzdHJlYW1TZWFsQWdlTXM6IDEwICogNjAgKiA2MCAqIDEwMDAsXG4gICAgLy8gV2FpdCB0aGlzIGxvbmcgYWZ0ZXIgdGhlIHRhYiBiZWNvbWVzIHZpc2libGUgYmVmb3JlIHRoZSBmaXJzdCBtZXJnZSBjaGVjaywgdGhlbiBjaGVjayB0aGlzIG9mdGVuIGFmdGVyd2FyZHMuIFRhYiBiZWluZyBoaWRkZW4gY2FuY2VscyB0aGUgdGltZXJzIChubyBtZXJnZXMgd2hpbGUgaW4gYmFja2dyb3VuZCkuIEJyb3dzZXItb25seTsgTm9kZSBjb21wYWN0b3JzIChlLmcuIHJlbW90ZUZpbGVTZXJ2ZXIpIGRyaXZlIHRoZWlyIG93biBwb2xsaW5nLlxuICAgIHZpc2libGVNZXJnZUludGVydmFsTXM6IDUgKiA2MCAqIDEwMDAsXG4gICAgbWVyZ2VTcGFjaW5nTXM6IDUgKiA2MCAqIDEwMDAsXG4gICAgLy8gUGhhc2UgMiByb2xscyB0aGUgbG9vc2UgYnVsayBmaWxlcyB1cCBvbmNlIHRoZXkgcGFzcyBlaXRoZXIgb2YgdGhlc2UuIEJ5dGVzIGJlY2F1c2UgcmVhZCBjb3N0IGdyb3dzIHdpdGggdGhlbTsgY291bnQgYmVjYXVzZSBlYWNoIGxvb3NlIGZpbGUgaG9sZHMgaXRzIHdob2xlIGtleSBsaXN0IGluIG1lbW9yeSBubyBtYXR0ZXIgaG93IGZldyBieXRlcyBpdCBoYXMsIHNvIGEgdHJpY2tsZSBvZiB0aW55IGZvbGRzIGhhcyB0byBiZSBjb2xsYXBzZWQgbG9uZyBiZWZvcmUgaXQgcmVhY2hlcyB0aGUgYnl0ZSB0cmlnZ2VyLlxuICAgIGxvb3NlQnVsa1RyaWdnZXJCeXRlczogMTAyNCAqIDEwMjQgKiAxMDI0LFxuICAgIGxvb3NlQnVsa1RyaWdnZXJGaWxlczogMjAsXG4gICAgc3RyZWFtRm9sZFRyaWdnZXJCeXRlczogNjQgKiAxMDI0ICogMTAyNCxcbiAgICBzdHJlYW1GaWxlTWF4Qnl0ZXM6IDUwICogMTAyNCAqIDEwMjQsXG4gICAgLy8gSG93IGxvbmcgdG8gd2FpdCBmb3IgcGVlcnMgdG8gYW5zd2VyIGEgc3RyZWFtLW93bmVyIGxpdmVuZXNzIHByb2JlLiBSdW5zIGluc2lkZSBhIG1lcmdlIHBhc3MsIHdoaWNoIGFscmVhZHkgd2FpdHMgMTVzIGZvciB0aGUgZmlsZSBsb2NrLCBzbyBhIHNlY29uZCBoZXJlIGNvc3RzIG5vdGhpbmcuXG4gICAgbGl2ZVdyaXRlclByb2JlTXM6IDEwMDAsXG4gICAgc3RyZWFtRm9sZEhhcmRMaW1pdEJ5dGVzOiA3NjggKiAxMDI0ICogMTAyNCxcbiAgICAvLyAwID0gZmx1c2ggZXZlcnkgd3JpdGUgKE5vZGUg4oCUIGFwcGVuZCBpcyByZWFsIGFuZCBjaGVhcCk7IGJyb3dzZXIgcmFtcHMgdG8gMTVzIHRvIGF2b2lkIHJld3JpdGluZyB0aGUgd2hvbGUgc3RyZWFtIGZpbGUgcGVyIHdyaXRlLlxuICAgIHdyaXRlRmx1c2hNYXhEZWxheU1zOiBpc05vZGUoKSA/IDAgOiAxNSAqIDEwMDAsXG4gICAgZmlsZVNldFBvbGxJbnRlcnZhbE1zOiAzMCAqIDYwICogMTAwMCxcbiAgICBtZW1vcnlGbHVzaEhlYXBCeXRlczogNSAqIDEwMjQgKiAxMDI0ICogMTAyNCxcbiAgICBtZW1vcnlGbHVzaE1pbkNvbGxlY3Rpb25CeXRlczogMTAwICogMTAyNCAqIDEwMjQsXG4gICAgbWVtb3J5Rmx1c2hUaHJvdHRsZU1zOiAxNSAqIDYwICogMTAwMCxcbn07XG5cbmZ1bmN0aW9uIGZtdEJ5dGVzKG46IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKG4gPCAxMDI0KSByZXR1cm4gbiArIFwiQlwiO1xuICAgIGlmIChuIDwgMTAyNCAqIDEwMjQpIHJldHVybiAobiAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIktCXCI7XG4gICAgaWYgKG4gPCAxMDI0ICogMTAyNCAqIDEwMjQpIHJldHVybiAobiAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJNQlwiO1xuICAgIHJldHVybiAobiAvIDEwMjQgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKSArIFwiR0JcIjtcbn1cblxuLy8gUmVhY3Rpdml0eSBzZWFtIChubyBtb2J4IGRlcGVuZGVuY3kgaW4gdGhpcyBmaWxlKS4gVGhlIG1vYnggc3ViY2xhc3Mgc3VwcGxpZXMgYSBSZWFjdGl2ZURlcHMgdGhhdCBtYXBzIHNpZ25hbCBzdHJpbmdzIHRvIGl0cyBvd24gZGVwZW5kZW5jeSB0cmFja2luZzsgbm9uLXJlYWN0aXZlIGNhbGxlcnMgcGFzcyBub29wUmVhY3RpdmVEZXBzLlxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZURlcHMge1xuICAgIG9ic2VydmUoc2lnbmFsOiBzdHJpbmcpOiB2b2lkO1xuICAgIGludmFsaWRhdGUoc2lnbmFsOiBzdHJpbmcpOiB2b2lkO1xuICAgIGJhdGNoKGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBPcHRpb25hbCDigJQgbGV0cyB3cml0ZXMgc2tpcCBwZXIta2V5IGludmFsaWRhdGlvbiBmb3Igcm93cyBub3RoaW5nIGlzIHdhdGNoaW5nLiBVbmRlZmluZWQgPSBcImFzc3VtZSB3YXRjaGVkXCIuXG4gICAgaXNPYnNlcnZlZD8oc2lnbmFsOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3Qgbm9vcFJlYWN0aXZlRGVwczogUmVhY3RpdmVEZXBzID0ge1xuICAgIG9ic2VydmUoKSB7IH0sXG4gICAgaW52YWxpZGF0ZSgpIHsgfSxcbiAgICBiYXRjaChmbikgeyBmbigpOyB9LFxuICAgIGlzT2JzZXJ2ZWQoKSB7IHJldHVybiBmYWxzZTsgfSxcbn07XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VGYWN0b3J5ID0gKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxGaWxlU3RvcmFnZT47XG5cbmV4cG9ydCB0eXBlIEJ1bGtEYXRhYmFzZTJDb25maWcgPSB7XG4gICAgLy8gU2VlIEJ1bGtEYXRhYmFzZVJlYWRlci5jZmcubWF4VHJpZ2dlclRocm90dGxlTXMuXG4gICAgbWF4VHJpZ2dlclRocm90dGxlTXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBNZXJnZVNraXBSZWFzb24gPVxuICAgIC8vIFRoaXMgaW5zdGFuY2UgaXMgYWxyZWFkeSBtaWQtbWVyZ2UuXG4gICAgfCBcIm1lcmdlSW5GbGlnaHRcIlxuICAgIC8vIEFub3RoZXIgc2FtZS1vcmlnaW4gdGFiIGhvbGRzIHRoZSBsb2NhbFN0b3JhZ2UgbWVyZ2UgbG9jay5cbiAgICB8IFwidGFiTG9ja0hlbGRcIlxuICAgIC8vIEFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGUgY3Jvc3MtcHJvY2VzcyAubWVyZ2UtbG9jayBmaWxlIChvciB3b24gdGhlIHNldHRsZSByYWNlIGZvciBpdCkuXG4gICAgfCBcImZpbGVMb2NrSGVsZFwiXG4gICAgLy8gY29tcGFjdCgpIG9ubHk6IHRoZSBjb2xsZWN0aW9uIGhhcyBubyBmaWxlcyBvbiBkaXNrLlxuICAgIHwgXCJub3RoaW5nVG9NZXJnZVwiO1xuXG4vLyBXaGF0IGEgY29tcGFjdCgpL3RyeU1lcmdlTm93KCkgY2FsbCBkaWQuIHNraXBSZWFzb24gaXMgc2V0IHdoZW4gdGhlIHBhc3MgbmV2ZXIgcmFuOyBmb3IgdGhlIGxvY2sgcmVhc29ucywgbG9ja0hvbGRlcklkL2xvY2tFeHBpcmVzSW5NcyByZXBvcnQgd2hvIGhvbGRzIHRoZSBsb2NrIGFuZCBob3cgbG9uZyB1bnRpbCBpdCBnb2VzIHN0YWxlIChzbyBhIHNjaGVkdWxlciBrbm93cyB3aGVuIHJldHJ5aW5nIGNvdWxkIHN1Y2NlZWQpLlxuZXhwb3J0IHR5cGUgTWVyZ2VBdHRlbXB0UmVzdWx0ID0ge1xuICAgIG1lcmdlZDogYm9vbGVhbjtcbiAgICBza2lwUmVhc29uPzogTWVyZ2VTa2lwUmVhc29uO1xuICAgIGxvY2tIb2xkZXJJZD86IHN0cmluZztcbiAgICBsb2NrRXhwaXJlc0luTXM/OiBudW1iZXI7XG59O1xuXG5sZXQgbmV0d29ya0NvbXBhY3Rpb25FbmFibGVkID0gZmFsc2U7XG5cbmxldCBmaWxlTmFtZUNvdW50ZXIgPSAwO1xuLy8gUGVyLXByb2Nlc3MgSUQgc28gdHdvIHdyaXRlcnMgcGlja2luZyB0aGUgc2FtZSB0aW1lc3RhbXAgKyBjb3VudGVyIG5ldmVyIGNvbGxpZGUgb24gYSBuYW1lLiBBbHNvIHN0YW1wZWQgaW50byBvdXIgc3RyZWFtIGZpbGUgbmFtZXMgYW5kIGFuc3dlcmVkIG92ZXIgdGhlIHN5bmMgY2hhbm5lbCwgc28gYSBwZWVyIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIHdyaXRlciBvZiBhIGdpdmVuIHN0cmVhbSBmaWxlIGlzIHN0aWxsIHJ1bm5pbmcuXG5jb25zdCB3cml0ZXJJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKTtcbnJlZ2lzdGVyV3JpdGVySWQod3JpdGVySWQpO1xuLy8gUmVzZXJ2ZWQgb3duZXIgZm9yIHRoZSB0b21ic3RvbmUtY2FycnkgZmlsZSBhIG1lcmdlIGVtaXRzLiBOb3RoaW5nIGV2ZXIgYXBwZW5kcyB0byBpdCwgYnV0IGl0IG11c3QgTk9UIHJlYWQgYXMgYWJhbmRvbmVkOiBmb2xkaW5nIGl0IHdvdWxkIGVtaXQgYW5vdGhlciBjYXJyeSBmaWxlLCB3aGljaCB3b3VsZCByZWFkIGFzIGFiYW5kb25lZCBpbiB0dXJuLCBhbmQgdGhlIHBhc3Mgd291bGQgZm9sZCBmb3JldmVyLlxuY29uc3QgTUVSR0VfT1VUUFVUX09XTkVSID0gXCJtZXJnZWRcIjtcbmZ1bmN0aW9uIG5leHRDb3VudGVyKCk6IG51bWJlciB7IHJldHVybiArK2ZpbGVOYW1lQ291bnRlcjsgfVxuXG5sZXQgbGFzdEZpbGVUaW1lID0gMDtcbi8vIFN0cmljdGx5LWluY3JlYXNpbmcgaW50ZWdlciBzbyBuZXdlc3QtZmlyc3Qgb3JkZXJpbmcgaXMgdW5hbWJpZ3VvdXMgd2l0aGluIGEgbWlsbGlzZWNvbmQuXG5mdW5jdGlvbiBuZXh0RmlsZVRpbWUoKTogbnVtYmVyIHtcbiAgICBsYXN0RmlsZVRpbWUgPSBNYXRoLm1heChEYXRlLm5vdygpLCBsYXN0RmlsZVRpbWUgKyAxKTtcbiAgICByZXR1cm4gbGFzdEZpbGVUaW1lO1xufVxuXG5mdW5jdGlvbiBuZXdGaWxlTmFtZSh0aW1lc3RhbXA6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAwXyR7dGltZXN0YW1wfV8ke3dyaXRlcklkfV8ke25leHRDb3VudGVyKCl9JHtGSUxFX0VYVEVOU0lPTn1gO1xufVxuXG4vLyBBY2NlcHQgb2xkIDMtcGFydCAoc3RyZWFtX3RpbWVzdGFtcF9yYW5kb20pIGFuZCBuZXcgNC1wYXJ0IChzdHJlYW1fdGltZXN0YW1wX293bmVySWRfY291bnRlcikgc2hhcGVzLiBBIDMtcGFydCBuYW1lIGNhcnJpZXMgbm8gb3duZXIsIHNvIGl0IGNhbiBuZXZlciBiZSBtYXRjaGVkIHRvIGEgbGl2ZSB3cml0ZXIg4oCUIHdoaWNoIGlzIHdoYXQgd2Ugd2FudDogbm8gYnVpbGQgdGhhdCBwcm9kdWNlcyB0aG9zZSBuYW1lcyBpcyBzdGlsbCBhcHBlbmRpbmcgdG8gdGhlbS5cbmZ1bmN0aW9uIHBhcnNlU3RyZWFtRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IFN0cmVhbUZpbGVJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKFNUUkVBTV9FWFRFTlNJT04pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnRzID0gZmlsZU5hbWUuc2xpY2UoMCwgLVNUUkVBTV9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKHBhcnRzWzBdICE9PSBcInN0cmVhbVwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgJiYgcGFydHMubGVuZ3RoICE9PSA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGltZXN0YW1wKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlTmFtZSwgdGltZXN0YW1wLCBvd25lcklkOiBwYXJ0cy5sZW5ndGggPT09IDQgJiYgcGFydHNbMl0gfHwgdW5kZWZpbmVkIH07XG59XG5cbmZ1bmN0aW9uIG5ld1N0cmVhbUZpbGVOYW1lKG93bmVySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBzdHJlYW1fJHtEYXRlLm5vdygpfV8ke293bmVySWR9XyR7bmV4dENvdW50ZXIoKX0ke1NUUkVBTV9FWFRFTlNJT059YDtcbn1cblxuLy8gQWNjZXB0IG9sZCAzLXBhcnQgKGxldmVsX3RpbWVzdGFtcF9jb3VudGVyKSBhbmQgbmV3IDQtcGFydCAobGV2ZWxfdGltZXN0YW1wX3dyaXRlcklkX2NvdW50ZXIpIHNoYXBlcy5cbmZ1bmN0aW9uIHBhcnNlRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IEJ1bGtGaWxlSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aChGSUxFX0VYVEVOU0lPTikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFydHMgPSBmaWxlTmFtZS5zbGljZSgwLCAtRklMRV9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGV2ZWwgPSBwYXJzZUludChwYXJ0c1swXSwgMTApO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobGV2ZWwpIHx8ICFOdW1iZXIuaXNGaW5pdGUodGltZXN0YW1wKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlTmFtZSwgbGV2ZWwsIHRpbWVzdGFtcCB9O1xufVxuXG4vKiogT25lIHRocmVzaG9sZCBhIGNvbXBhY3Rpb24gc3RlcCBpcyBtZWFzdXJlZCBhZ2FpbnN0LiBgdmFsdWVgIGlzIHdoZXJlIHRoZSBjb2xsZWN0aW9uIHN0YW5kcyBub3cgYW5kIGB0aHJlc2hvbGRgIGlzIHdoYXQgc2V0cyB0aGUgc3RlcCBvZmYsIHNvIGBmcmFjdGlvbmAgKHZhbHVlL3RocmVzaG9sZCkgcmVhZHMgYXMgaG93IGNsb3NlIGl0IGlzIC0gMSBvciBtb3JlIG1lYW5zIG1ldC4gRGVsaWJlcmF0ZWx5IG5vdCBjbGFtcGVkLCBzbyBhbiBvdmVyZHVlIHN0ZXAgcmVhZHMgYXMgaG93IGZhciBwYXN0IGR1ZSBpdCBpcy4gKi9cbmV4cG9ydCB0eXBlIENvbXBhY3Rpb25UcmlnZ2VyID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHRocmVzaG9sZDogbnVtYmVyO1xuICAgIGZyYWN0aW9uOiBudW1iZXI7XG4gICAgbWV0OiBib29sZWFuO1xuICAgIC8qKiBIb3cgdG8gcmVuZGVyIHZhbHVlL3RocmVzaG9sZC4gXCJmcmFjdGlvblwiIHZhbHVlcyBhcmUgMC4uMS4gKi9cbiAgICB1bml0OiBcImJ5dGVzXCIgfCBcImNvdW50XCIgfCBcImZyYWN0aW9uXCI7XG59O1xuXG4vKiogc3RyZWFtSGFyZExpbWl0IGFuZCBzdHJlYW1Gb2xkIGFyZSBwaGFzZSAxIChzdHJlYW0gLT4gYnVsayksIGxvb3NlQ29tYmluZSBpcyBwaGFzZSAyIChsb29zZSBidWxrIC0+IGNvbWJpbmVkIGJ1bGspLCBkZWR1cEFsbCBhbmQgZGVkdXBLZXlHcm91cCBhcmUgcGhhc2UgMy4gKi9cbmV4cG9ydCB0eXBlIENvbXBhY3Rpb25TdGVwS2luZCA9IFwic3RyZWFtSGFyZExpbWl0XCIgfCBcInN0cmVhbUZvbGRcIiB8IFwibG9vc2VDb21iaW5lXCIgfCBcImRlZHVwQWxsXCIgfCBcImRlZHVwS2V5R3JvdXBcIjtcblxuZXhwb3J0IHR5cGUgQ29tcGFjdGlvblN0ZXAgPSB7XG4gICAgcGhhc2U6IDEgfCAyIHwgMztcbiAgICBraW5kOiBDb21wYWN0aW9uU3RlcEtpbmQ7XG4gICAgLyoqIFdoZXRoZXIgdGhpcyBzdGVwIHJ1bnMgb24gdGhlIG5leHQgcGFzcy4gQXV0aG9yaXRhdGl2ZTogb24gdG9wIG9mIGByZXF1aXJlc2AgaXQgYWNjb3VudHMgZm9yIGlucHV0cyB0aGUgc3RlcCBuZWVkcyBiZXlvbmQgaXRzIHRocmVzaG9sZHMgKGUuZy4gdHdvIGZpbGVzIHRvIGNvbWJpbmUpLCBzbyBpdCBjYW4gYmUgZmFsc2UgZXZlbiB3aXRoIGV2ZXJ5IHRyaWdnZXIgbWV0LiAqL1xuICAgIHJlYWR5OiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGV2ZXJ5IHRyaWdnZXIgaGFzIHRvIGJlIG1ldCBmb3IgdGhpcyBzdGVwLCBvciBqdXN0IG9uZSBvZiB0aGVtLiAqL1xuICAgIHJlcXVpcmVzOiBcImFueVwiIHwgXCJhbGxcIjtcbiAgICB0cmlnZ2VyczogQ29tcGFjdGlvblRyaWdnZXJbXTtcbiAgICAvKiogV2hlbiB0aGlzIHN0ZXAncyBtZXJnZSBzdGFydHMsIGdpdmVuIG1lcmdlcyBhcmUgc3BhY2VkIG1lcmdlU3BhY2luZ01zIGFwYXJ0LiBPbmx5IHNldCB3aGVuIHJlYWR5LiAqL1xuICAgIHN0YXJ0VGltZT86IG51bWJlcjtcbiAgICAvKiogVGhlIGZpbGVzIHRoaXMgc3RlcCBjb25zdW1lcywgYXMgb2Ygd2hlbiB0aGUgcGxhbiB3YXMgbWFkZS4gKi9cbiAgICBidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdO1xuICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdO1xuICAgIC8qKiBUb3RhbCBzaXplIG9mIHRob3NlIGlucHV0cy4gKi9cbiAgICBieXRlczogbnVtYmVyO1xuICAgIC8qKiBkZWR1cEtleUdyb3VwIG9ubHkgLSB0aGUga2V5IHJhbmdlIHRoZSBzdGVwIHJld3JpdGVzLiAqL1xuICAgIGtleVJhbmdlPzogeyBsbzogc3RyaW5nOyBoaTogc3RyaW5nIH07XG59O1xuXG4vKiogRXZlcnkgY29tcGFjdGlvbiB0aGUgY3VycmVudCBmaWxlIHNldCBjYWxscyBmb3IsIGluIHRoZSBvcmRlciBhIG1lcmdlIHBhc3MgcnVucyB0aGVtLCBwbHVzIGhvdyBjbG9zZSBlYWNoIG5vdC15ZXQtcmVhZHkgb25lIGlzIHRvIGl0cyB0aHJlc2hvbGRzLiAqL1xuZXhwb3J0IHR5cGUgQ29tcGFjdGlvblBsYW4gPSB7XG4gICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHRoZSBwbGFuIHdhcyBjb21wdXRlZDsgZXZlcnkgc3RhcnRUaW1lIGlzIG1lYXN1cmVkIGZyb20gaGVyZS4gKi9cbiAgICB0aW1lOiBudW1iZXI7XG4gICAgc3RlcHM6IENvbXBhY3Rpb25TdGVwW107XG59O1xuXG5mdW5jdGlvbiBtYWtlVHJpZ2dlcihjb25maWc6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyOyB0aHJlc2hvbGQ6IG51bWJlcjsgdW5pdDogQ29tcGFjdGlvblRyaWdnZXJbXCJ1bml0XCJdIH0pOiBDb21wYWN0aW9uVHJpZ2dlciB7XG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBmcmFjdGlvbjogY29uZmlnLnZhbHVlIC8gY29uZmlnLnRocmVzaG9sZCwgbWV0OiBjb25maWcudmFsdWUgPj0gY29uZmlnLnRocmVzaG9sZCB9O1xufVxuXG5mdW5jdGlvbiBmbXRUcmlnZ2VyVmFsdWUodmFsdWU6IG51bWJlciwgdW5pdDogQ29tcGFjdGlvblRyaWdnZXJbXCJ1bml0XCJdKTogc3RyaW5nIHtcbiAgICBpZiAodW5pdCA9PT0gXCJieXRlc1wiKSByZXR1cm4gZm10Qnl0ZXModmFsdWUpO1xuICAgIGlmICh1bml0ID09PSBcImZyYWN0aW9uXCIpIHJldHVybiBgJHtNYXRoLnJvdW5kKHZhbHVlICogMTAwKX0lYDtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1bGtEYXRhYmFzZUJhc2U8VCBleHRlbmRzIHsga2V5OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgZGVwczogUmVhY3RpdmVEZXBzLFxuICAgICAgICBwcml2YXRlIHN0b3JhZ2VGYWN0b3J5OiBTdG9yYWdlRmFjdG9yeSxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc6IEJ1bGtEYXRhYmFzZTJDb25maWcgPSB7fSxcbiAgICApIHsgfVxuXG4gICAgLy8gVGhlIHJlYWRlciAoYW5kIHRoZSBiYWNrZ3JvdW5kIG1hY2hpbmVyeSB0aGF0IHJpZGVzIGFsb25nIHdpdGggaXQpIG11c3QgTk9UIGJlIHNldCB1cCBqdXN0IGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gd2FzIGNvbnN0cnVjdGVkLiBNYW55IGNvbGxlY3Rpb25zIGFyZSBjb25zdHJ1Y3RlZCBhbmQgbmV2ZXIgdG91Y2hlZCwgYW5kIGluIE5vZGUgYSBtZXJnZSB0aWNrIHdvdWxkIHBva2UgdGhlIHN0b3JhZ2UgZmFjdG9yeSAoZS5nLiBpbmRleGVkREIpIGFuZCB0aHJvdy4gV2UgYnVpbGQgaXQgbGF6aWx5IG9uIGZpcnN0IGFjY2VzcyB0byBgdGhpcy5yZWFkZXJgOiBldmVyeSByZWFkLCB3cml0ZSwgYW5kIG1lcmdlIGdvZXMgdGhyb3VnaCB0aGUgcmVhZGVyLCB3aGlsZSBwdXJlIGNvbnN0cnVjdGlvbiBuZXZlciB0b3VjaGVzIGl0LlxuICAgIHByaXZhdGUgX3JlYWRlcjogQnVsa0RhdGFiYXNlUmVhZGVyPFQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgZ2V0IHJlYWRlcigpOiBCdWxrRGF0YWJhc2VSZWFkZXI8VD4ge1xuICAgICAgICBpZiAodGhpcy5fcmVhZGVyKSByZXR1cm4gdGhpcy5fcmVhZGVyO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVsa0RhdGFiYXNlUmVhZGVyPFQ+KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGRlcHM6IHRoaXMuZGVwcyxcbiAgICAgICAgICAgIG1heFRyaWdnZXJUaHJvdHRsZU1zOiB0aGlzLmNvbmZpZy5tYXhUcmlnZ2VyVGhyb3R0bGVNcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5zZXRFbnN1cmVJbmRleCgoKSA9PiB0aGlzLmVuc3VyZUluZGV4KCkpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgKCkgPT4gdm9pZCB0aGlzLmZsdXNoUGVuZGluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwiaGlkZGVuXCIpIHZvaWQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdCBpbiBhIERPTSBjb250ZXh0ICovIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVTZXRQb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIHRoaXMucG9sbEZpbGVTZXQoKSwgYnVsa0RhdGFiYXNlMlRpbWluZy5maWxlU2V0UG9sbEludGVydmFsTXMpO1xuICAgICAgICAodGhpcy5maWxlU2V0UG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgdGhpcy5zZXR1cFZpc2liaWxpdHlNZXJnZUNoZWNrKCk7XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2UubGl2ZUluc3RhbmNlcy5hZGQodGhpcyk7XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2Uuc3RhcnRNZW1vcnlXYXRjaGRvZygpO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IGB2aXNpYmxlTWVyZ2VJbnRlcnZhbE1zYCBvZiBiZWluZy12aXNpYmxlIHRpbWUsIHJ1biBhIG1lcmdlIGNoZWNrLiBGaXJzdCBjaGVjayBmaXJlcyBgdmlzaWJsZU1lcmdlSW50ZXJ2YWxNc2AgYWZ0ZXIgdGhlIHRhYiBiZWNvbWVzIHZpc2libGUgKG5vdCBvbiBpbml0aWFsIGxvYWQg4oCUIGdpdmVzIHRoZSB1c2VyIGEgbW9tZW50IG9mIHNlc3Npb24gY29tbWl0bWVudCBiZWZvcmUgd2Ugc3RhcnQgY2h1cm5pbmcgdGhlIEZTKSwgdGhlbiBldmVyeSBpbnRlcnZhbCBhZnRlci4gVGFiIGhpZGluZyBjYW5jZWxzIHRoZSB0aW1lcnM7IHZpc2libGUtYWdhaW4gcmVzdGFydHMuIE5vZGUgaGFzIG5vIGRvY3VtZW50IOKAlCB0aGVyZSB3ZSBjb25zaWRlciBvdXJzZWx2ZXMgYWx3YXlzLXZpc2libGUgYW5kIGp1c3QgaW5zdGFsbCB0aGUgaW50ZXJ2YWwgZGlyZWN0bHkuXG4gICAgcHJpdmF0ZSBzZXR1cFZpc2liaWxpdHlNZXJnZUNoZWNrKCk6IHZvaWQge1xuICAgICAgICBsZXQgZmlyc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbnRlcnZhbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lcikgeyBjbGVhclRpbWVvdXQoZmlyc3RUaW1lcik7IGZpcnN0VGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgIGlmIChpbnRlcnZhbFRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxUaW1lcik7IGludGVydmFsVGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lciB8fCBpbnRlcnZhbFRpbWVyKSByZXR1cm47XG4gICAgICAgICAgICBmaXJzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMubWF5YmVNZXJnZSgpO1xuICAgICAgICAgICAgICAgIGludGVydmFsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIHRoaXMubWF5YmVNZXJnZSgpLCBidWxrRGF0YWJhc2UyVGltaW5nLnZpc2libGVNZXJnZUludGVydmFsTXMpO1xuICAgICAgICAgICAgICAgIChpbnRlcnZhbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgIH0sIGJ1bGtEYXRhYmFzZTJUaW1pbmcudmlzaWJsZU1lcmdlSW50ZXJ2YWxNcyk7XG4gICAgICAgICAgICAoZmlyc3RUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHsgc3RhcnQoKTsgcmV0dXJuOyB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIHN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgZWxzZSBzdG9wKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSBzdGFydCgpO1xuICAgICAgICB9IGNhdGNoIHsgLyogbm90IGluIGEgRE9NIGNvbnRleHQgKi8gfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMgPSB7IGJ1bGs6IG5ldyBNYXAoKSwgc3RyZWFtOiBuZXcgTWFwKCkgfTtcblxuICAgIHByaXZhdGUgcGVuZGluZ0FwcGVuZHM6IEJ1ZmZlcltdID0gW107XG4gICAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGZsdXNoQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIGN1cnJlbnRGbHVzaERlbGF5ID0gMDtcbiAgICBwcml2YXRlIGxhc3RXcml0ZVRpbWUgPSAwO1xuXG4gICAgcHJpdmF0ZSBzdHJlYW1GaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgY3VycmVudFN0cmVhbUZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBjdXJyZW50U3RyZWFtRmlsZUJ5dGVzID0gMDtcbiAgICAvLyBJbi1wcm9jZXNzIHJlLWVudHJ5IGd1YXJkOiBpZiBhIG1lcmdlIGlzIHJ1bm5pbmcsIGFkZGl0aW9uYWwgdHJpZ2dlcnMgKHZpc2liaWxpdHkgdGltZXIsIHdyaXRlcywgdHJ5TWVyZ2VOb3cgY2FsbHMpIHJldHVybiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHF1ZXVlaW5nLiBLZWVwcyB0aGUgdmlzaWJpbGl0eS10aW1lciBmaXJpbmdzIGZyb20gc3RhY2tpbmcgYmVoaW5kIGEgbG9uZyBtZXJnZS5cbiAgICBwcml2YXRlIG1lcmdlSW5GbGlnaHQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RNZXJnZVNraXBMb2dNcyA9IDA7XG4gICAgLy8gUnVubmluZyBjb3VudGVyIG9mIHN0cmVhbS10aWVyIGJ5dGVzIG9uIGRpc2suIFNlZWRlZCBmcm9tIGVhY2ggTG9hZGVkSW5kZXggYnVpbGQsIHRoZW4gaW5jcmVtZW50ZWQgcGVyIGZsdXNoIHNvIHRoZSBmb2xkLXRyaWdnZXIgY2hlY2tzIGN1cnJlbnQgZGF0YSB3aXRob3V0IGFuIGV4dHJhIGRpcmVjdG9yeSBsaXN0aW5nLlxuICAgIHByaXZhdGUgc3RyZWFtQnl0ZXNPbkRpc2sgPSAwO1xuXG4gICAgcHJpdmF0ZSBmaWxlU2V0UG9sbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByZWJ1aWxkUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHJlYnVpbGREaXJ0eSA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVidWlsZE9wdGlvbnM6IHsgZHJvcFN0YWxlRmFsbGJhY2s6IGJvb2xlYW4gfSA9IHsgZHJvcFN0YWxlRmFsbGJhY2s6IGZhbHNlIH07XG5cbiAgICAvLyDilIDilIAgbWVtb3J5LXByZXNzdXJlIHdhdGNoZG9nIChnbG9iYWwsIGJyb3dzZXItb25seSkg4pSA4pSAXG4gICAgcHJpdmF0ZSBzdGF0aWMgbGl2ZUluc3RhbmNlcyA9IG5ldyBTZXQ8QnVsa0RhdGFiYXNlQmFzZTx7IGtleTogc3RyaW5nIH0+PigpO1xuICAgIHByaXZhdGUgc3RhdGljIG1lbW9yeVdhdGNoZG9nU3RhcnRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIGxhc3RNZW1vcnlGbHVzaE1zID0gMDtcbiAgICBwcml2YXRlIHN0YXRpYyBzdGFydE1lbW9yeVdhdGNoZG9nKCkge1xuICAgICAgICBpZiAoQnVsa0RhdGFiYXNlQmFzZS5tZW1vcnlXYXRjaGRvZ1N0YXJ0ZWQpIHJldHVybjtcbiAgICAgICAgQnVsa0RhdGFiYXNlQmFzZS5tZW1vcnlXYXRjaGRvZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB1c2VkSGVhcCA9ICgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIChwZXJmb3JtYW5jZSBhcyB1bmtub3duIGFzIHsgbWVtb3J5PzogeyB1c2VkSlNIZWFwU2l6ZT86IG51bWJlciB9IH0pPy5tZW1vcnk/LnVzZWRKU0hlYXBTaXplOyB9XG4gICAgICAgICAgICBjYXRjaCB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB1c2VkSGVhcCgpID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1c2VkID0gdXNlZEhlYXAoKTtcbiAgICAgICAgICAgIGlmICh1c2VkICE9PSB1bmRlZmluZWQpIEJ1bGtEYXRhYmFzZUJhc2UuY2hlY2tNZW1vcnlQcmVzc3VyZSh1c2VkKTtcbiAgICAgICAgfSwgTUVNT1JZX1dBVENIRE9HX0lOVEVSVkFMX01TKTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaGVja01lbW9yeVByZXNzdXJlKHVzZWRIZWFwQnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodXNlZEhlYXBCeXRlcyA8IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVtb3J5Rmx1c2hIZWFwQnl0ZXMpIHJldHVybjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyAtIEJ1bGtEYXRhYmFzZUJhc2UubGFzdE1lbW9yeUZsdXNoTXMgPCBidWxrRGF0YWJhc2UyVGltaW5nLm1lbW9yeUZsdXNoVGhyb3R0bGVNcykgcmV0dXJuO1xuICAgICAgICBCdWxrRGF0YWJhc2VCYXNlLmxhc3RNZW1vcnlGbHVzaE1zID0gbm93O1xuICAgICAgICBjb25zdCBmbHVzaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRiIG9mIEJ1bGtEYXRhYmFzZUJhc2UubGl2ZUluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBkYi5yZWFkZXIuaW5kZXg/LnRvdGFsQnl0ZXMgPz8gMDtcbiAgICAgICAgICAgIGlmIChieXRlcyA+IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVtb3J5Rmx1c2hNaW5Db2xsZWN0aW9uQnl0ZXMpIHtcbiAgICAgICAgICAgICAgICBmbHVzaGVkLnB1c2goYCR7ZGIubmFtZX0gKCR7Zm10Qnl0ZXMoYnl0ZXMpfSlgKTtcbiAgICAgICAgICAgICAgICBkYi5yZWxvYWRGcm9tRGlzaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmbHVzaGVkLmxlbmd0aCkgY29uc29sZS5sb2coYFtidWxrMl0gaGVhcCAke2ZtdEJ5dGVzKHVzZWRIZWFwQnl0ZXMpfSBvdmVyICR7Zm10Qnl0ZXMoYnVsa0RhdGFiYXNlMlRpbWluZy5tZW1vcnlGbHVzaEhlYXBCeXRlcyl9IC0gZmx1c2hlZCAke2ZsdXNoZWQubGVuZ3RofSBsYXJnZSBjb2xsZWN0aW9uKHMpOiAke2ZsdXNoZWQuam9pbihcIiwgXCIpfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZSgpIHtcbiAgICAgICAgYmxvY2tDYWNoZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5hYmxlTmV0d29ya0NvbXBhY3Rpb24oKSB7XG4gICAgICAgIG5ldHdvcmtDb21wYWN0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3JhZ2UgPSBsYXp5KGFzeW5jICgpID0+IHRoaXMuc3RvcmFnZUZhY3RvcnkoYCR7QlVMS19ST09UX0ZPTERFUn0vJHt0aGlzLm5hbWV9YCkpO1xuXG4gICAgcHVibGljIGFzeW5jIGlzUmVtb3RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gISEoYXdhaXQgdGhpcy5zdG9yYWdlKCkpLmlzUmVtb3RlO1xuICAgIH1cblxuICAgIC8vIFVuY29tcGFjdGVkIHN0cmVhbSBieXRlcyBoYXZlIHRvIGJlIHJlYWQgYW5kIGRlY29kZWQgaW4gZnVsbCBieSBldmVyeSByZWFkZXIgb24gZXZlcnkgaW5kZXggYnVpbGQsIHNvIHNpemUgYWxvbmUgZGVjaWRlcyDigJQgYSBmb2xkIGlzIHdvcnRoIGl0IGV2ZW4gaWYgdGhvc2UgYnl0ZXMgYXJlIG9uZSBlbm9ybW91cyByb3cuXG4gICAgcHJpdmF0ZSBzdHJlYW1OZWVkc0ZvbGQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbUJ5dGVzT25EaXNrID4gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkVHJpZ2dlckJ5dGVzO1xuICAgIH1cblxuICAgIC8vIFN0cmVhbSBmaWxlcyBub2JvZHkgY2FuIHN0aWxsIGJlIGFwcGVuZGluZyB0bzogb3VyIG93biBzZWFsZWQgZmlsZXMsIG1lcmdlLWNhcnJ5IG91dHB1dCwgYW5kIGZpbGVzIHdob3NlIG93bmVyIGlzIGdvbmUgKGEgY2xvc2VkIHRhYidzIGxlZnRvdmVycywgb3IgYSBsZWdhY3kgbmFtZSB3aXRoIG5vIG93bmVyIHN0YW1wKS4gQSBmb2xkIG1heSBkZWxldGUgdGhlc2UgdGhlIG1vbWVudCBpdCBoYXMgY29uc3VtZWQgdGhlbSwgaW5zdGVhZCBvZiB3YWl0aW5nIG91dCBzdHJlYW1TZWFsQWdlTXMuXG4gICAgLy9cbiAgICAvLyBGb3JlaWduIG93bmVycyBhcmUgcHJvYmVkIG92ZXIgdGhlIHN5bmMgY2hhbm5lbC4gSW4gTm9kZSB0aGVyZSBpcyBubyBjaGFubmVsLCBzbyB3ZSBjYW5ub3Qga25vdyAtIGV2ZXJ5IGZvcmVpZ24gb3duZXIgaXMgYXNzdW1lZCBhbGl2ZSBhbmQgdGhlIHN0cmVhbVNlYWxBZ2VNcyBydWxlIHN0YW5kcy5cbiAgICAvL1xuICAgIC8vIGFzc3VtZVNlYWxlZCBpcyBmb3IgcGxhbm5pbmc6IGEgbWVyZ2UgcGFzcyBicm9hZGNhc3RzIGEgc2VhbCBiZWZvcmUgaXQgc3RhcnRzLCBzbyBieSB0aGUgdGltZSBpdCBtZXJnZXMgb3VyIGN1cnJlbnQgZmlsZSBJUyBmaW5hbC4gVGhlIHBsYW5uZXIgcGFzc2VzIGlzU3luY1N1cHBvcnRlZCgpIHRvIHByZWRpY3QgdGhhdDsgYW55dGhpbmcgZGVjaWRpbmcgYSByZWFsIGRlbGV0aW9uIHBhc3NlcyBmYWxzZSBhbmQgZ29lcyBieSBzdHJlYW1GaWxlTmFtZSBhcyBpdCBhY3R1YWxseSBzdGFuZHMuXG4gICAgcHJpdmF0ZSBhc3luYyBmaW5kQWJhbmRvbmVkU3RyZWFtcyhzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSwgYXNzdW1lU2VhbGVkOiBib29sZWFuKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICAgICAgICBjb25zdCByZXRpcmFibGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgY29uc3QgaGFzRm9yZWlnbk93bmVyID0gc3RyZWFtRmlsZXMuc29tZShmID0+IGYub3duZXJJZCAmJiBmLm93bmVySWQgIT09IHdyaXRlcklkICYmIGYub3duZXJJZCAhPT0gTUVSR0VfT1VUUFVUX09XTkVSKTtcbiAgICAgICAgY29uc3QgbGl2ZSA9IGhhc0ZvcmVpZ25Pd25lciAmJiBhd2FpdCBxdWVyeUxpdmVXcml0ZXJzKHRoaXMubmFtZSwgYnVsa0RhdGFiYXNlMlRpbWluZy5saXZlV3JpdGVyUHJvYmVNcykgfHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygc3RyZWFtRmlsZXMpIHtcbiAgICAgICAgICAgIGlmIChmLm93bmVySWQgPT09IE1FUkdFX09VVFBVVF9PV05FUikgeyByZXRpcmFibGUuYWRkKGYuZmlsZU5hbWUpOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgLy8gc3RyZWFtRmlsZU5hbWUgaXMgdGhlIG9ubHkgXCJ3ZSB3aWxsIGFwcGVuZCBoZXJlIGFnYWluXCIgc2lnbmFsIC0gb25jZSBpdCBtb3ZlcyBvbiwgZ2V0U3RyZWFtRmlsZU5hbWUgb3BlbnMgYSBmcmVzaCBmaWxlIGFuZCB0aGlzIG9uZSBpcyBmaW5hbC5cbiAgICAgICAgICAgIGlmIChmLm93bmVySWQgPT09IHdyaXRlcklkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFzc3VtZVNlYWxlZCB8fCBmLmZpbGVOYW1lICE9PSB0aGlzLnN0cmVhbUZpbGVOYW1lKSByZXRpcmFibGUuYWRkKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmLm93bmVySWQgfHwgbGl2ZSAmJiAhbGl2ZS5oYXMoZi5vd25lcklkKSkgcmV0aXJhYmxlLmFkZChmLmZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0aXJhYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXV0b21hdGljQ29tcGFjdGlvbkFsbG93ZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmIChuZXR3b3JrQ29tcGFjdGlvbkVuYWJsZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoaXNOb2RlKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gIShhd2FpdCB0aGlzLnN0b3JhZ2UoKSkuaXNSZW1vdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzS2V5V2F0Y2hlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuaXNLZXlXYXRjaGVkKGtleSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIGluZGV4IGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBwcml2YXRlIGFzeW5jIGVuc3VyZUluZGV4KCk6IFByb21pc2U8TG9hZGVkSW5kZXg8VD4+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZGVyLmluZGV4KSByZXR1cm4gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIGF3YWl0IHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIGlmICghaWR4KSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5uYW1lfTogaW5kZXggZmFpbGVkIHRvIGJ1aWxkYCk7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuXG4gICAgLy8gQ29hbGVzY2luZyByZWJ1aWxkIGxvb3A6IHRyaWdnZXJzIGR1cmluZyBhIGJ1aWxkIHNldCByZWJ1aWxkRGlydHkgc28gdGhlIGxvb3AgaXRlcmF0ZXMgb25jZSBtb3JlIHdoZW4gaXQgZmluaXNoZXMg4oCUIE4gcmFwaWQgdHJpZ2dlcnMgY2F1c2UgYXQgbW9zdCBPTkUgZXh0cmEgcmVidWlsZCBhZnRlciB0aGUgY3VycmVudCBvbmUgZW5kcy5cbiAgICBwcml2YXRlIHRyaWdnZXJSZWJ1aWxkKG9wdHM6IHsgZHJvcFN0YWxlRmFsbGJhY2s/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAob3B0cy5kcm9wU3RhbGVGYWxsYmFjaykgdGhpcy5yZWJ1aWxkT3B0aW9ucy5kcm9wU3RhbGVGYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnJlYnVpbGRQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGREaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYnVpbGRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGREaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRvT25lUmVidWlsZCgpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRoaXMucmVidWlsZERpcnR5KTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRPcHRpb25zLmRyb3BTdGFsZUZhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGRQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZG9PbmVSZWJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBhd2FpdCBMb2FkZWRJbmRleC5idWlsZDxUPih7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgYnVsa0ZpbGVzLFxuICAgICAgICAgICAgc3RyZWFtRmlsZXMsXG4gICAgICAgICAgICBzdWJDYWNoZXM6IHRoaXMuc3ViQ2FjaGVzLFxuICAgICAgICAgICAgb25VbnJlYWRhYmxlRmlsZTogKGYsIG1zZykgPT4gdGhpcy5oYW5kbGVVbnJlYWRhYmxlRmlsZShmLCBtc2cpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgobmV3SW5kZXgsIHsgZHJvcFN0YWxlRmFsbGJhY2s6IHRoaXMucmVidWlsZE9wdGlvbnMuZHJvcFN0YWxlRmFsbGJhY2sgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtQnl0ZXNPbkRpc2sgPSBuZXdJbmRleC5zdHJlYW1CeXRlc09uRGlzaztcbiAgICAgICAgaWYgKG9sZEluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygb2xkSW5kZXguZmlsZVNldCkge1xuICAgICAgICAgICAgICAgIGlmICghbmV3SW5kZXguZmlsZVNldC5oYXMoZikpIGJsb2NrQ2FjaGUuZXZpY3QobnVsbEpvaW4odGhpcy5uYW1lLCBmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcm9wIGV2ZXJ5dGhpbmcgaW4tbWVtb3J5LCBoYXJkIHJlc2V0LiBQZW5kaW5nIHVuLWZsdXNoZWQgd3JpdGVzIHN1cnZpdmUgKHN0aWxsIGluIG92ZXJsYXkpLlxuICAgIHB1YmxpYyByZWxvYWRGcm9tRGlzaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJDYWNoZXMuYnVsay5jbGVhcigpO1xuICAgICAgICB0aGlzLnN1YkNhY2hlcy5zdHJlYW0uY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZWFkZXIuaW5kZXg/LmRyb3BMb2FkZWRWYWx1ZXMoKTtcbiAgICAgICAgdm9pZCB0aGlzLnRyaWdnZXJSZWJ1aWxkKHsgZHJvcFN0YWxlRmFsbGJhY2s6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gRXh0ZXJuYWwtbWVyZ2UgZGV0ZWN0aW9uOiBpZiBzb21lIG90aGVyIHRhYi9wcm9jZXNzIGNoYW5nZWQgdGhlIGZpbGUgc2V0IHVuZGVyIHVzLCByZWJ1aWxkLlxuICAgIHByaXZhdGUgYXN5bmMgcG9sbEZpbGVTZXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkZXIuaW5kZXgpIHJldHVybjtcbiAgICAgICAgbGV0IGN1cnJlbnQ6IFNldDxzdHJpbmc+O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICAgICAgY3VycmVudCA9IG5ldyBTZXQoWy4uLmJ1bGtGaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKSwgLi4uc3RyZWFtRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSldKTtcbiAgICAgICAgfSBjYXRjaCB7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5yZWFkZXIuaW5kZXg/LmZpbGVTZXQ7XG4gICAgICAgIGlmICghcHJldikgcmV0dXJuO1xuICAgICAgICBjb25zdCBjaGFuZ2VkID0gY3VycmVudC5zaXplICE9PSBwcmV2LnNpemUgfHwgWy4uLmN1cnJlbnRdLnNvbWUobiA9PiAhcHJldi5oYXMobikpO1xuICAgICAgICBpZiAoY2hhbmdlZCkgdm9pZCB0aGlzLnRyaWdnZXJSZWJ1aWxkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkV2l0aFJldHJ5PFI+KGZuOiAoKSA9PiBQcm9taXNlPFI+KTogUHJvbWlzZTxSPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBhd2FpdCBmbigpOyB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBNaXNzaW5nRmlsZUVycm9yKSB8fCBhdHRlbXB0ID49IE1BWF9JTkRFWF9SRUxPQURfQVRURU1QVFMpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZGVyLmluZGV4ID09PSBiZWZvcmUpIGF3YWl0IHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBjcm9zcy10YWIgc3luYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBwcml2YXRlIHN5bmNTZXR1cCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWlzU3luY1N1cHBvcnRlZCgpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgY29uc3QgcmVjZW50ID0gYXdhaXQgc3luY0Nvbm5lY3QodGhpcy5uYW1lLCB3ID0+IHRoaXMuYXBwbHlSZW1vdGUodyksICgpID0+IHsgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDsgfSk7XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiByZWNlbnQpIHRoaXMuYXBwbHlSZW1vdGUodyk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGFwcGx5UmVtb3RlKHdyaXRlOiBSZW1vdGVXcml0ZSkge1xuICAgICAgICBpZiAod3JpdGUudGltZSA8PSB0aGlzLnJlYWRlci5sb2NhbFRpbWUod3JpdGUua2V5KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmRlcHMuYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHdyaXRlLmRlbGV0ZWQpIHRoaXMucmVhZGVyLmFwcGx5RGVsZXRlKHdyaXRlLmtleSwgd3JpdGUudGltZSk7XG4gICAgICAgICAgICBlbHNlIHRoaXMucmVhZGVyLmFwcGx5V3JpdGUod3JpdGUua2V5LCB3cml0ZS52YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgd3JpdGUudGltZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCB3cml0ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgcHVibGljIGFzeW5jIHdyaXRlKGVudHJ5OiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlQmF0Y2goW2VudHJ5XSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdyaXRlQmF0Y2goZW50cmllczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICBjb25zdCByb3dzID0gZW50cmllcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gICAgICAgIGNvbnN0IHN0YW1wZWQgPSByb3dzLm1hcChyb3cgPT4gKHsgdGltZTogZ2V0VGltZVVuaXF1ZSgpLCByb3cgfSkpO1xuICAgICAgICBjb25zdCBmcmFtZWQgPSBmcmFtZVJvd3Moc3RhbXBlZCk7XG5cbiAgICAgICAgLy8gQmlnIGJhdGNoZXMgc2tpcCB0aGUgc3RyZWFtIGFuZCBiZWNvbWUgYSBidWxrIGZpbGUgZGlyZWN0bHkg4oCUIHN0cmVhbWluZyB0aG91c2FuZHMgb2Ygcm93cyBvbmUgZnJhbWUgYXQgYSB0aW1lIHdvdWxkIGp1c3QgY2h1cm4uXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+PSBST0xMT1ZFUl9ST1dTIHx8IGZyYW1lZC5sZW5ndGggPj0gUk9MTE9WRVJfQllURVMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVCdWxrRmlsZShyb3dzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVwcy5iYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGltZSwgcm93IH0gb2Ygc3RhbXBlZCkgdGhpcy5yZWFkZXIuYXBwbHlXcml0ZShyb3cua2V5IGFzIHN0cmluZywgcm93LCB0aW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCByb3cgfSBvZiBzdGFtcGVkKSBzeW5jQnJvYWRjYXN0KHRoaXMubmFtZSwgeyBrZXk6IHJvdy5rZXkgYXMgc3RyaW5nLCB0aW1lLCB2YWx1ZTogcm93IH0pO1xuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUFwcGVuZChmcmFtZWQpO1xuICAgICAgICB2b2lkIHRoaXMubWF5YmVNZXJnZSh7IG9ubHlJZlN0cmVhbUhlYXZ5OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlQmF0Y2goW2tleV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGVCYXRjaChrZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgY29uc3Qgc3RhbXBlZCA9IGtleXMubWFwKGtleSA9PiAoeyB0aW1lOiBnZXRUaW1lVW5pcXVlKCksIGtleSB9KSk7XG4gICAgICAgIHRoaXMuZGVwcy5iYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGltZSwga2V5IH0gb2Ygc3RhbXBlZCkgdGhpcy5yZWFkZXIuYXBwbHlEZWxldGUoa2V5LCB0aW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCBrZXkgfSBvZiBzdGFtcGVkKSBzeW5jQnJvYWRjYXN0KHRoaXMubmFtZSwgeyBrZXksIHRpbWUsIGRlbGV0ZWQ6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQXBwZW5kKGZyYW1lRGVsZXRlcyhzdGFtcGVkKSk7XG4gICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKHsgb25seUlmU3RyZWFtSGVhdnk6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29hbGVzY2Ugc3RyZWFtIGFwcGVuZHMgb24gYSByYW1waW5nIHBlci1jb2xsZWN0aW9uIHNjaGVkdWxlICh0aGUgYnJvd3NlciByZXdyaXRlcyB0aGUgd2hvbGUgZmlsZSBwZXIgYXBwZW5kKS4gVGhlIGZpcnN0IHdyaXRlIGFmdGVyIGEgbHVsbCBmbHVzaGVzIGltbWVkaWF0ZWx5IHNvIGEgc2luZ2xlIGVkaXQtdGhlbi1jbG9zZSBpcyBzYXZlZCBhdCBvbmNlOyBzdXN0YWluZWQgd3JpdGVzIHJhbXAgdG93YXJkIHdyaXRlRmx1c2hNYXhEZWxheU1zLlxuICAgIHByaXZhdGUgYXN5bmMgc3RyZWFtQXBwZW5kKGZyYW1lZDogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0FwcGVuZHMucHVzaChmcmFtZWQpO1xuICAgICAgICBjb25zdCBtYXggPSBidWxrRGF0YWJhc2UyVGltaW5nLndyaXRlRmx1c2hNYXhEZWxheU1zO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobWF4IDw9IDAgfHwgdGhpcy5jdXJyZW50Rmx1c2hEZWxheSA8PSAwIHx8IG5vdyAtIHRoaXMubGFzdFdyaXRlVGltZSA+IG1heCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0V3JpdGVUaW1lID0gbm93O1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rmx1c2hEZWxheSA9IG1heCA+IDAgPyBNYXRoLm1pbihtYXgsIFdSSVRFX0ZMVVNIX0ZJUlNUX1NURVBfTVMpIDogMDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0V3JpdGVUaW1lID0gbm93O1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmZsdXNoVGltZXIgPSB1bmRlZmluZWQ7IHZvaWQgdGhpcy5mbHVzaFBlbmRpbmcoKTsgfSwgdGhpcy5jdXJyZW50Rmx1c2hEZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50Rmx1c2hEZWxheSA9IE1hdGgubWluKG1heCwgdGhpcy5jdXJyZW50Rmx1c2hEZWxheSAqIDIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZsdXNoUGVuZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hUaW1lciAhPT0gdW5kZWZpbmVkKSB7IGNsZWFyVGltZW91dCh0aGlzLmZsdXNoVGltZXIpOyB0aGlzLmZsdXNoVGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgdGhpcy5mbHVzaENoYWluID0gdGhpcy5mbHVzaENoYWluLnRoZW4oKCkgPT4gdGhpcy5kb0ZsdXNoKCkpLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IHN0cmVhbSBmbHVzaCBmYWlsZWQsIHdpbGwgcmV0cnk6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5mbHVzaENoYWluO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZG9GbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdBcHBlbmRzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBiYXRjaCA9IHRoaXMucGVuZGluZ0FwcGVuZHMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBCdWZmZXIuY29uY2F0KGJhdGNoKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZ2V0U3RyZWFtRmlsZU5hbWUoKTtcbiAgICAgICAgaWYgKGZpbGVOYW1lICE9PSB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0cmVhbUZpbGVCeXRlcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT24gZmFpbHVyZSB0aGUgdGhyb3cgbGVhdmVzIHBlbmRpbmdBcHBlbmRzIGludGFjdCBzbyBhIGxhdGVyIGZsdXNoIHJldHJpZXMuXG4gICAgICAgIGF3YWl0IHN0b3JhZ2UuYXBwZW5kKGZpbGVOYW1lLCBjb21iaW5lZCk7XG4gICAgICAgIC8vIE5ldyBlbnRyaWVzIGFwcGVuZGVkIGR1cmluZyB0aGUgYXdhaXQgYXJlIGFmdGVyIGBiYXRjaGAg4oCUIHJlbW92aW5nIHRoZSBmcm9udCBpcyBleGFjdGx5IHRoZSBmbHVzaGVkIHNldC5cbiAgICAgICAgdGhpcy5wZW5kaW5nQXBwZW5kcy5zcGxpY2UoMCwgYmF0Y2gubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1CeXRlc09uRGlzayArPSBjb21iaW5lZC5sZW5ndGg7XG4gICAgICAgIHRoaXMuY3VycmVudFN0cmVhbUZpbGVCeXRlcyArPSBjb21iaW5lZC5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdHJlYW1GaWxlQnl0ZXMgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1GaWxlTWF4Qnl0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0cmVhbUZpbGVCeXRlcyA9IDA7XG4gICAgICAgICAgICB2b2lkIHRoaXMuZm9sZE93blN0cmVhbShmaWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0cmVhbUZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIFNlYWwgb3VyIGN1cnJlbnQgZmlsZSBvbmNlIGl0IGFnZXMgcGFzdCB0aGUgc2VhbCB0aHJlc2hvbGQg4oCUIG5vIGZpbGUgaXMgZXZlciBhcHBlbmRlZCB0byBwYXN0IGl0cyBzZWFsIGFnZSwgd2hpY2ggbGV0cyBhIGNvbnNvbGlkYXRpb24gc2FmZWx5IGZvbGQgaXQgb25jZSBhZ2VkLlxuICAgICAgICBpZiAodGhpcy5zdHJlYW1GaWxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW5mbyA9IHBhcnNlU3RyZWFtRmlsZU5hbWUodGhpcy5zdHJlYW1GaWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoaW5mbyAmJiBEYXRlLm5vdygpIC0gaW5mby50aW1lc3RhbXAgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1TZWFsQWdlTXMpIHRoaXMuc3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN0cmVhbUZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gbmV3U3RyZWFtRmlsZU5hbWUod3JpdGVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbUZpbGVOYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZm9sZE93blN0cmVhbShmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSBwYXJzZVN0cmVhbUZpbGVOYW1lKGZpbGVOYW1lKTtcbiAgICAgICAgaWYgKCFpbmZvKSByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChbXSwgW2luZm9dLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBmb2xkaW5nIG93biBzdHJlYW0gJHtmaWxlTmFtZX0gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShlbnRyeTogUGFydGlhbDxUPiAmIHsga2V5OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVCYXRjaChbZW50cnldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlQmF0Y2goZW50cmllczogKFBhcnRpYWw8VD4gJiB7IGtleTogc3RyaW5nIH0pW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5lbnN1cmVJbmRleCgpO1xuICAgICAgICBjb25zdCBwcmVzZW50OiBUW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5RW50cnkgPSB0aGlzLnJlYWRlci5vdmVybGF5LmdldChlbnRyeS5rZXkpO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gb3ZlcmxheUVudHJ5ID8gb3ZlcmxheUVudHJ5LnZhbHVlICE9PSBERUxFVEVEIDogaW5kZXgua2V5cy5oYXMoZW50cnkua2V5KTtcbiAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX0udXBkYXRlOiBrZXkgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5rZXkpfSBpcyBub3QgaW4gdGhlIGNvbGxlY3Rpb24sIGlnbm9yaW5nYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmVzZW50LnB1c2goZW50cnkgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJlc2VudC5sZW5ndGgpIGF3YWl0IHRoaXMud3JpdGVCYXRjaChwcmVzZW50KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgZmlsZSBsaXN0aW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBwcml2YXRlIGFzeW5jIGxpc3RGaWxlcygpOiBQcm9taXNlPHsgYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXTsgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10gfT4ge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gYXdhaXQgc3RvcmFnZS5nZXRLZXlzKCk7XG4gICAgICAgIC8vIEEgY29uc3VtZWQtbWVyZ2UgaW5wdXQgaXMgaGlkZGVuIGZyb20gcmVhZHMgdGhlIGluc3RhbnQgaXRzIGRlbGV0aW9uIG1hcmtlciBleGlzdHMg4oCUIHRoYXQncyB3aGF0IHN0b3BzIGl0IGZyb20gYmVpbmcgcmUtcmVhZCBhbmQgcmUtbWVyZ2VkLiBQaHlzaWNhbCBkZWxldGlvbiArIG1hcmtlciBjbGVhbnVwIHJ1bnMgb24gYSB0aHJvdHRsZSAobm90IGlubGluZSkgc28gYSByZWFkIGlzbid0IHNsb3dlZCBieSBpdC5cbiAgICAgICAgY29uc3QgbWFya2VycyA9IGF3YWl0IHJlYWREZWxldGVNYXJrZXJzKHN0b3JhZ2UsIG5hbWVzKTtcbiAgICAgICAgY29uc3QgZXhjbHVkZWQgPSBtYXJrZXJFeGNsdXNpb25zKG1hcmtlcnMpO1xuICAgICAgICBpZiAobWFya2Vycy5sZW5ndGgpIHZvaWQgdGhpcy5wcm9jZXNzTWFya2VycygpO1xuICAgICAgICBjb25zdCBidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdID0gW107XG4gICAgICAgIGNvbnN0IHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBuYW1lcykge1xuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkLmhhcyhuKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAobi5lbmRzV2l0aChGSUxFX0VYVEVOU0lPTikpIHsgY29uc3QgcCA9IHBhcnNlRmlsZU5hbWUobik7IGlmIChwKSBidWxrRmlsZXMucHVzaChwKTsgfVxuICAgICAgICAgICAgZWxzZSBpZiAobi5lbmRzV2l0aChTVFJFQU1fRVhURU5TSU9OKSkgeyBjb25zdCBwID0gcGFyc2VTdHJlYW1GaWxlTmFtZShuKTsgaWYgKHApIHN0cmVhbUZpbGVzLnB1c2gocCk7IH1cbiAgICAgICAgfVxuICAgICAgICBidWxrRmlsZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKGEudGltZXN0YW1wICE9PSBiLnRpbWVzdGFtcCkgcmV0dXJuIGIudGltZXN0YW1wIC0gYS50aW1lc3RhbXA7XG4gICAgICAgICAgICByZXR1cm4gYS5maWxlTmFtZSA8IGIuZmlsZU5hbWUgJiYgMSB8fCBhLmZpbGVOYW1lID4gYi5maWxlTmFtZSAmJiAtMSB8fCAwO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydChzdHJlYW1GaWxlcywgZiA9PiBmLnRpbWVzdGFtcCk7XG4gICAgICAgIHJldHVybiB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfTtcbiAgICB9XG5cbiAgICAvLyBUaHJvdHRsZWQgbWFya2VyIGhvdXNla2VlcGluZzogZGVsZXRlIGlucHV0cyB3aG9zZSByZXBsYWNlbWVudCBvdXRwdXRzIGhhdmUgbGFuZGVkIChvciB3aG9zZSBtYXJrZXIgaGFzIGFnZWQgb3V0KSBhbmQgcmV0aXJlIGZ1bGZpbGxlZCBtYXJrZXJzLiBUcmlnZ2VyZWQgZnJvbSBsaXN0RmlsZXMsIHNvIGl0J3MgZ2F0ZWQgdG8gYXZvaWQgYSBkZWxldGUgc3Rvcm0gdW5kZXIgaGVhdnkgcmVhZHMuXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWFya2VycyA9IHRocm90dGxlRnVuY3Rpb24oMzAgKiAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBhd2FpdCBzdG9yYWdlLmdldEtleXMoKTtcbiAgICAgICAgY29uc3QgbWFya2VycyA9IGF3YWl0IHJlYWREZWxldGVNYXJrZXJzKHN0b3JhZ2UsIG5hbWVzKTtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoKSBhd2FpdCBwcm9jZXNzRGVsZXRlTWFya2Vycyh0aGlzLm5hbWUsIHN0b3JhZ2UsIG1hcmtlcnMsIG5hbWVzKTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVCdWxrRmlsZShyb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV4dEZpbGVUaW1lKCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRpbWVzID0gcm93cy5tYXAoKCkgPT4gbm93KTtcbiAgICAgICAgZm9yIChjb25zdCBidWlsdCBvZiBidWlsZEZpbGVCdWZmZXIocm93cywgdGltZXMpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbmV3RmlsZU5hbWUodGltZXN0YW1wKTtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KG5hbWUsIGVuY29kZUNvbXByZXNzZWRCbG9ja3MoYnVpbHQuYnVmZmVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICB2b2lkIHRoaXMubWF5YmVNZXJnZSgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBtZXJnZSBwb2xpY3kg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENhbGxlZCBib3RoIHBlcmlvZGljYWxseSAodmlzaWJpbGl0eSB0aW1lcikgYW5kIG9uIHdyaXRlcyAod2l0aCB0aGUgc3RyZWFtTmVlZHNGb2xkIGdhdGUgc28gYSBzbWFsbCB3cml0ZSBkb2Vzbid0IGRyYWcgdGhlIG1lcmdlIHRocm91Z2gpLiBUaGUgbWVyZ2VJbkZsaWdodCBjaGVjayBpbiB0cnlNZXJnZU5vdyBza2lwcyBhbnkgY2FsbCB0aGF0IGFycml2ZXMgd2hpbGUgYSBwcmV2aW91cyBvbmUgaXMgc3RpbGwgcnVubmluZyDigJQgc28gNS1taW4gdGltZXIgdGlja3MgZG9uJ3QgcGlsZSB1cC5cbiAgICBwcml2YXRlIGFzeW5jIG1heWJlTWVyZ2Uob3B0czogeyBvbmx5SWZTdHJlYW1IZWF2eT86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5hdXRvbWF0aWNDb21wYWN0aW9uQWxsb3dlZCgpKSByZXR1cm47XG4gICAgICAgIGlmIChvcHRzLm9ubHlJZlN0cmVhbUhlYXZ5ICYmICF0aGlzLnN0cmVhbU5lZWRzRm9sZCgpKSByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRyeU1lcmdlVGhyb3R0bGVkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBiYWNrZ3JvdW5kIG1lcmdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZSBcIndlIGRpZG4ndCBtZXJnZVwiIHJlc3VsdCBhbmQgbG9nIGl0ICh0aHJvdHRsZWQg4oCUIHNlZSBNRVJHRV9TS0lQX0xPR19JTlRFUlZBTF9NUykuIEZvciBsb2NrIHJlYXNvbnMgdGhlIGxvZyBhbmQgcmVzdWx0IGluY2x1ZGUgdGhlIGhvbGRlciBhbmQgdGltZSB1bnRpbCB0aGUgbG9jayBnb2VzIHN0YWxlLlxuICAgIHByaXZhdGUgYXN5bmMgbWVyZ2VTa2lwKHJlYXNvbjogTWVyZ2VTa2lwUmVhc29uKTogUHJvbWlzZTxNZXJnZUF0dGVtcHRSZXN1bHQ+IHtcbiAgICAgICAgbGV0IGxvY2s6IE1lcmdlTG9ja0luZm8gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZWFzb24gPT09IFwidGFiTG9ja0hlbGRcIikge1xuICAgICAgICAgICAgbG9jayA9IHBlZWtNZXJnZUxvY2sodGhpcy5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWFzb24gPT09IFwiZmlsZUxvY2tIZWxkXCIpIHtcbiAgICAgICAgICAgIGxvY2sgPSBhd2FpdCBwZWVrTWVyZ2VGaWxlTG9jayhhd2FpdCB0aGlzLnN0b3JhZ2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RNZXJnZVNraXBMb2dNcyA+PSBNRVJHRV9TS0lQX0xPR19JTlRFUlZBTF9NUykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TWVyZ2VTa2lwTG9nTXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZGV0YWlsID0gbG9jayAmJiBgIChoZWxkIGJ5ICR7bG9jay5ob2xkZXJJZH0sIGV4cGlyZXMgaW4gJHtmb3JtYXRUaW1lKE1hdGgubWF4KDAsIGxvY2suZXhwaXJlc0luTXMpKX0pYCB8fCBcIlwiO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7Ymx1ZSh0aGlzLm5hbWUpfSAke21hZ2VudGEoXCJtZXJnZVwiKX0gc2tpcHBlZDogJHtyZWFzb259JHtkZXRhaWx9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWVyZ2VkOiBmYWxzZSwgc2tpcFJlYXNvbjogcmVhc29uLCBsb2NrSG9sZGVySWQ6IGxvY2s/LmhvbGRlcklkLCBsb2NrRXhwaXJlc0luTXM6IGxvY2s/LmV4cGlyZXNJbk1zIH07XG4gICAgfVxuXG4gICAgLy8gQWNxdWlyZSBib3RoIG1lcmdlIGxvY2tzIChzYW1lLXRhYiBtZXJnZUluRmxpZ2h0LCBjcm9zcy10YWIgbG9jYWxTdG9yYWdlLCBjcm9zcy1wcm9jZXNzIGZpbGUpLCBydW4gdGhlIHBhc3MsIHJlbGVhc2UuIFNraXBzICh3aXRoIHRoZSByZWFzb24pIGluc3RlYWQgb2Ygd2FpdGluZyB3aGVuIGFueSBvZiB0aGVtIGlzIGhlbGQuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5Mb2NrZWRNZXJnZShydW46ICgpID0+IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0Pik6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIGlmICh0aGlzLm1lcmdlSW5GbGlnaHQpIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlU2tpcChcIm1lcmdlSW5GbGlnaHRcIik7XG4gICAgICAgIGlmICghdHJ5QWNxdWlyZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKSkgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VTa2lwKFwidGFiTG9ja0hlbGRcIik7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgaGF2ZUZpbGVMb2NrID0gYXdhaXQgdHJ5QWNxdWlyZU1lcmdlRmlsZUxvY2soc3RvcmFnZSwgd3JpdGVySWQpO1xuICAgICAgICBpZiAoIWhhdmVGaWxlTG9jaykge1xuICAgICAgICAgICAgcmVsZWFzZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlU2tpcChcImZpbGVMb2NrSGVsZFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lcmdlSW5GbGlnaHQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzdG9wSGVhcnRiZWF0ID0gc3RhcnRNZXJnZUZpbGVMb2NrSGVhcnRiZWF0KHN0b3JhZ2UsIHdyaXRlcklkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHN0b3BIZWFydGJlYXQoKTtcbiAgICAgICAgICAgIGF3YWl0IHJlbGVhc2VNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIHdyaXRlcklkKTtcbiAgICAgICAgICAgIHJlbGVhc2VNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCk7XG4gICAgICAgICAgICB0aGlzLm1lcmdlSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBiYWNrZ3JvdW5kIHBhdGggKG1heWJlTWVyZ2UpIGdvZXMgdGhyb3VnaCB0aGlzIHNvIHdyaXRlIGJ1cnN0cyBjb2FsZXNjZTsgZXhwbGljaXQgY2FsbGVycyB1c2UgdHJ5TWVyZ2VOb3cgZGlyZWN0bHkgYW5kIGdldCB0aGUgcGVyLWNhbGwgcmVzdWx0LlxuICAgIHByaXZhdGUgdHJ5TWVyZ2VUaHJvdHRsZWQgPSB0aHJvdHRsZUZ1bmN0aW9uKDEwMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy50cnlNZXJnZU5vdygpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIGFzeW5jIHRyeU1lcmdlTm93KCk6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZE1lcmdlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IGF3YWl0IHRoaXMudGVzdE1lcmdlSU5URVJOQUxfRE9fTk9UX0NBTEwoKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1lcmdlZCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPE1lcmdlQXR0ZW1wdFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5Mb2NrZWRNZXJnZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZygpO1xuICAgICAgICAgICAgc3luY0Jyb2FkY2FzdFNlYWwodGhpcy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgICAgICBpZiAoYnVsa0ZpbGVzLmxlbmd0aCArIHN0cmVhbUZpbGVzLmxlbmd0aCA8IDEpIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlU2tpcChcIm5vdGhpbmdUb01lcmdlXCIpO1xuICAgICAgICAgICAgLy8gY29tcGFjdCgpIGZvbGRzIGV2ZXJ5IGZpbGUg4oaSIG5vIG9sZGVyIGRhdGEgc3Vydml2ZXMgb3V0c2lkZSBpdCDihpIgc3Vydml2aW5nIHRvbWJzdG9uZXMgY2FuIGJlIGRyb3BwZWQgKG5vdGhpbmcgbGVmdCB0byBzdXBwcmVzcykuXG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChidWxrRmlsZXMsIHN0cmVhbUZpbGVzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1lcmdlZCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbWVyZ2UodGltZUxvOiBudW1iZXIsIHRpbWVIaTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aW1lSGkgPj0gRGF0ZS5ub3coKSkgeyBzeW5jQnJvYWRjYXN0U2VhbCh0aGlzLm5hbWUpOyB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkOyB9XG4gICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoZiA9PiB0aGlzLnJlYWRCdWxrSGVhZGVyKGYuZmlsZU5hbWUpKSk7XG4gICAgICAgIGNvbnN0IHNlbEJ1bGsgPSBidWxrRmlsZXMuZmlsdGVyKChmLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGlmICghaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFoLm1heFRpbWUgJiYgIWgubWluVGltZSkgcmV0dXJuIHRpbWVMbyA8PSAwO1xuICAgICAgICAgICAgcmV0dXJuIGgubWluVGltZSA8PSB0aW1lSGkgJiYgaC5tYXhUaW1lID49IHRpbWVMbztcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlbFN0cmVhbSA9IHN0cmVhbUZpbGVzLmZpbHRlcihmID0+XG4gICAgICAgICAgICBmLnRpbWVzdGFtcCA8PSB0aW1lSGkgJiYgZi50aW1lc3RhbXAgKyBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbVNlYWxBZ2VNcyA+PSB0aW1lTG8pO1xuICAgICAgICBpZiAoc2VsQnVsay5sZW5ndGggKyBzZWxTdHJlYW0ubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChzZWxCdWxrLCBzZWxTdHJlYW0sIHRpbWVMbyA8PSAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlYWRCdWxrSGVhZGVyKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtIZWFkZXJJbmZvIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBtYWtlUmF3R2V0UmFuZ2Uoc3RvcmFnZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUlkID0gbnVsbEpvaW4odGhpcy5uYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvcGVuZWQgPSBhd2FpdCBibG9ja0NhY2hlLm9wZW4oZmlsZUlkLCByYXcuc2l6ZSwgcmF3LnJhd0dldFJhbmdlKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBsb2FkQnVsa0hlYWRlcihvcGVuZWQuZ2V0UmFuZ2UsIG9wZW5lZC51bmNvbXByZXNzZWRTaXplKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaWxlTG9naWNhbFNpemUoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBtYWtlUmF3R2V0UmFuZ2Uoc3RvcmFnZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUlkID0gbnVsbEpvaW4odGhpcy5uYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvcGVuZWQgPSBhd2FpdCBibG9ja0NhY2hlLm9wZW4oZmlsZUlkLCByYXcuc2l6ZSwgcmF3LnJhd0dldFJhbmdlKTtcbiAgICAgICAgICAgIHJldHVybiBvcGVuZWQudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBidWxrIGZpbGUgdGhhdCB3b24ndCBsb2FkIGlzIGVpdGhlciBhbiBpbi1wcm9ncmVzcyB3cml0ZSAocmVjZW50KSBvciBhIGNyYXNoZWQgcGFydGlhbCB3cml0ZSAoc3RhbGUpLiBXYXJuIHdoaWxlIHJlY2VudCwgZGVsZXRlIG9uY2UgY2xlYXJseSBhYmFuZG9uZWQg4oCUIGRlbGV0aW5nIGlzIHNhZmUgYmVjYXVzZSB0aGUgd3JpdGUgcHJvdG9jb2wgYWx3YXlzIGxhbmRzIHRoZSByZXBsYWNlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlIGZpbGUgaXQgc3VwZXJzZWRlcy5cbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVVucmVhZGFibGVGaWxlKGZpbGU6IEJ1bGtGaWxlSW5mbywgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGFnZU1zID0gRGF0ZS5ub3coKSAtIGZpbGUudGltZXN0YW1wO1xuICAgICAgICBpZiAoYWdlTXMgPiBTVEFMRV9ERUxFVEVfTVMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBkZWxldGluZyBzdGFsZSB1bnJlYWRhYmxlIGJ1bGsgZmlsZSAke2ZpbGUuZmlsZU5hbWV9ICgke01hdGgucm91bmQoYWdlTXMgLyA4NjQwMDAwMCl9ZCBvbGQpOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnJlbW92ZShmaWxlLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlbW92ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IGZhaWxlZCB0byBkZWxldGUgJHtmaWxlLmZpbGVOYW1lfTogJHsocmVtb3ZlRXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IHNraXBwaW5nIHVucmVhZGFibGUgYnVsayBmaWxlICR7ZmlsZS5maWxlTmFtZX0gKHJlY2VudCAtIG1heSBiZSBpbi1wcm9ncmVzcyk6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgb25lIG1lcmdlIHByaW1pdGl2ZS4gUmVhZHMgKyBwbGFucyArIHdyaXRlcyBvdXRwdXRzIGJlZm9yZSBkZWxldGluZyBhbnkgaW5wdXQsIHNvIGEgY3Jhc2ggbGVhdmVzIGR1cGxpY2F0ZXMgKG5leHQgbWVyZ2UgZGVkdXBlcykgcmF0aGVyIHRoYW4gYSBnYXAuIEFmdGVyIHRoZSBmaWxlIHNldCBjaGFuZ2VzIG9uIGRpc2ssIHdlIHRyaWdnZXIgYW4gaW5kZXggcmVidWlsZCArIGF0b21pYyBzd2FwOyBvbmNlIHN3YXAgY29tcGxldGVzLCB0aGUgY29uc3VtZWQgZmlsZXMnIGJsb2NrLWNhY2hlIGVudHJpZXMgYXJlIGV2aWN0ZWQgKG5vIGNvbnN1bWVyIGNhbiBhc2sgZm9yIHRoZW0gbm93KS5cbiAgICAvLyBcbiAgICAvLyBTZXJpYWxpemVkOiBmb2xkT3duU3RyZWFtICsgbWVyZ2UodGltZUxvLCB0aW1lSGkpICsgdGVzdE1lcmdlJ3MgcnVuTWVyZ2UgYWxsIGhpdCB0aGlzOyB0aGUgbG9jayBjb3ZlcnMgdHJ5TWVyZ2VOb3cvY29tcGFjdCBidXQgdGhvc2UgdHdvIHBhdGhzIGJ5cGFzcyBpdC4gcnVuSW5TZXJpYWwgcXVldWVzIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSBvbiB0aGUgZmlsZSBzZXQuXG4gICAgcHJpdmF0ZSBtZXJnZUZpbGVTZXQgPSBydW5JblNlcmlhbChhc3luYyAoYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSwgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sIGluY2x1ZGVzT2xkZXN0ID0gZmFsc2UsIGZvcmNlRGVsZXRlU3RyZWFtcyA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIHRoaXMucmVhZGVyLmJlZ2luQ29tcGFjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VGaWxlU2V0SW5uZXIoYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcywgaW5jbHVkZXNPbGRlc3QsIGZvcmNlRGVsZXRlU3RyZWFtcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5lbmRDb21wYWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXN5bmMgbWVyZ2VGaWxlU2V0SW5uZXIoYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSwgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sIGluY2x1ZGVzT2xkZXN0OiBib29sZWFuLCBmb3JjZURlbGV0ZVN0cmVhbXM6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXh0RmlsZVRpbWUoKTtcblxuICAgICAgICAvLyBUaGUgY2FsbGVyJ3MgYnVsa0ZpbGVzIGNhbWUgZnJvbSBhIGBsaXN0RmlsZXMoKWAgc25hcHNob3QuIEJldHdlZW4gdGhlbiBhbmQgbm93IGFueSBmaWxlIGNvdWxkIGJlIGdvbmUgKGFub3RoZXIgdGFiJ3MgZGVmZXJyZWQgZGVsZXRlLCBtYW51YWwgY2xlYW51cCkuIFRoZSBzdWJDYWNoZXMgcmVhZGVyIGZvciBhIGRlbGV0ZWQgZmlsZSBpcyBzaWxlbnRseSBzdGFsZSDigJQgaXRzIGluLW1lbW9yeSBtZXRhZGF0YSBzdGlsbCByZXNvbHZlcywgYnV0IHRoZSB2ZXJ5IG5leHQgZ2V0UmFuZ2UgYWdhaW5zdCBkaXNrIHRocm93cy4gUmUtdmVyaWZ5IGV4aXN0ZW5jZSB1cC1mcm9udCBhbmQgZHJvcCB0aGUgY2FjaGUgZW50cnkgZm9yIGFueXRoaW5nIHRoYXQgdmFuaXNoZWQsIHNvIHdlIGRvbid0IGV2ZW4gdHJ5IHRvIHBsYW4gYXJvdW5kIGEgZ2hvc3QgZmlsZS5cbiAgICAgICAgY29uc3QgdmVyaWZpZWRCdWxrRmlsZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChhc3luYyBmID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluZm8pIHsgdGhpcy5zdWJDYWNoZXMuYnVsay5kZWxldGUoZi5maWxlTmFtZSk7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViQ2FjaGVzLmJ1bGsuZGVsZXRlKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSkuZmlsdGVyKChmKTogZiBpcyBCdWxrRmlsZUluZm8gPT4gZiAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgYnVsa0ZpbGVzID0gdmVyaWZpZWRCdWxrRmlsZXM7XG5cbiAgICAgICAgY29uc3QgY29uc3VtZWRCdWxrOiBCdWxrRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBidWxrUmVhZGVyczogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcltdID0gW107XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBsb2FkRmlsZVJlYWRlcih0aGlzLm5hbWUsIHN0b3JhZ2UsIGYsIHRoaXMuc3ViQ2FjaGVzLmJ1bGspO1xuICAgICAgICAgICAgICAgIGJ1bGtSZWFkZXJzLnB1c2gocik7XG4gICAgICAgICAgICAgICAgY29uc3VtZWRCdWxrLnB1c2goZik7XG4gICAgICAgICAgICB9IGNhdGNoIHsgLyogbWlzc2luZyBvciBjb3JydXB0IOKAlCBza2lwOyBpdHMgZGF0YSBsaXZlcyBpbiBhbm90aGVyIGZpbGUgKi8gfVxuICAgICAgICB9KSk7XG5cbiAgICAgICAgY29uc3Qgc3RyZWFtRGF0YSA9IGF3YWl0IGxvYWRTdHJlYW1FbnRyaWVzKHRoaXMubmFtZSwgc3RvcmFnZSwgc3RyZWFtRmlsZXMsIHRoaXMuc3ViQ2FjaGVzLnN0cmVhbSk7XG4gICAgICAgIGNvbnN0IG9yZGVyZWQgPSBvcmRlclN0cmVhbUVudHJpZXMoc3RyZWFtRGF0YS5lbnRyaWVzKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtUmVhZGVyID0gb3JkZXJlZC5sZW5ndGggPyBzdHJlYW1SZWFkZXJGcm9tRW50cmllcyhvcmRlcmVkLCAwKS5yZWFkZXIgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQW4gYWJhbmRvbmVkIHN0cmVhbSB0aGF0IHlpZWxkZWQgbm8gZW50cmllcyAoemVybyBieXRlcywgb3Igbm90aGluZyBidXQgdG9ybiBieXRlcykgaG9sZHMgbm8gZGF0YSBhbmQgaGFzIG5vIHdyaXRlciBsZWZ0LiBSZXRpcmUgaXQgaGVyZTogdGhlIG1lcmdlIGJlbG93IG5ldmVyIGxpc3RzIGl0IGFzIGEgdXNlZCBzb3VyY2UsIHNvIHRoZSBub3JtYWwgcmV0aXJlbWVudCBwYXRoIHdvdWxkIHNraXAgaXQgYW5kIGl0IHdvdWxkIHJlLXRyaWdnZXIgdGhlIGFiYW5kb25lZC1zdHJlYW0gZm9sZCBvbiBldmVyeSBwYXNzLiByZXBsYWNlZEJ5IGlzIGVtcHR5IGJlY2F1c2Ugbm90aGluZyBzdXBlcnNlZGVzIGl0IC0gdGhlIG1hcmtlciBoaWRlcyBpdCBmcm9tIHJlYWRzIGltbWVkaWF0ZWx5IGFuZCBwcm9jZXNzTWFya2VycyBkZWxldGVzIGl0IG9uY2UgYWdlZC5cbiAgICAgICAgY29uc3QgcmV0aXJhYmxlU3RyZWFtcyA9IGF3YWl0IHRoaXMuZmluZEFiYW5kb25lZFN0cmVhbXMoc3RyZWFtRmlsZXMsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgY29udHJpYnV0aW5nU3RyZWFtcyA9IG5ldyBTZXQoc3RyZWFtRGF0YS5lbnRyaWVzLm1hcChlID0+IGUuZmlsZU5hbWUpKTtcbiAgICAgICAgY29uc3QgZW1wdHlBYmFuZG9uZWQgPSBzdHJlYW1GaWxlcy5maWx0ZXIoZiA9PiByZXRpcmFibGVTdHJlYW1zLmhhcyhmLmZpbGVOYW1lKSAmJiAhY29udHJpYnV0aW5nU3RyZWFtcy5oYXMoZi5maWxlTmFtZSkpLm1hcChmID0+IGYuZmlsZU5hbWUpO1xuICAgICAgICBpZiAoZW1wdHlBYmFuZG9uZWQubGVuZ3RoKSBhd2FpdCB3cml0ZURlbGV0ZU1hcmtlcihzdG9yYWdlLCB7IGRlbGV0ZUZpbGVzOiBlbXB0eUFiYW5kb25lZCwgcmVwbGFjZWRCeTogW10gfSk7XG5cbiAgICAgICAgY29uc3QgcmVhZGVycyA9IHN0cmVhbVJlYWRlciA/IFtzdHJlYW1SZWFkZXIsIC4uLmJ1bGtSZWFkZXJzXSA6IGJ1bGtSZWFkZXJzO1xuICAgICAgICBjb25zdCByZWFkZXJOYW1lcyA9IHN0cmVhbVJlYWRlciA/IFtcIihzdHJlYW1zKVwiLCAuLi5jb25zdW1lZEJ1bGsubWFwKGYgPT4gZi5maWxlTmFtZSldIDogY29uc3VtZWRCdWxrLm1hcChmID0+IGYuZmlsZU5hbWUpO1xuICAgICAgICBpZiAoIXJlYWRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZW1wdHlBYmFuZG9uZWQubGVuZ3RoKSBhd2FpdCB0aGlzLnRyaWdnZXJSZWJ1aWxkKCk7XG4gICAgICAgICAgICByZXR1cm4gZW1wdHlBYmFuZG9uZWQubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgICAgICAgIC4uLmF3YWl0IFByb21pc2UuYWxsKGNvbnN1bWVkQnVsay5tYXAoYXN5bmMgZiA9PiAoeyBuYW1lOiBmLmZpbGVOYW1lLCBzaXplOiAoYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpPy5zaXplID8/IDAgfSkpKSxcbiAgICAgICAgICAgIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+ICh7IG5hbWU6IGYuZmlsZU5hbWUsIHNpemU6IHN0cmVhbURhdGEuc2l6ZXMuZ2V0KGYuZmlsZU5hbWUpID8/IDAgfSkpLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpblRvdGFsID0gaW5wdXRzLnJlZHVjZSgoYSwgZikgPT4gYSArIGYuc2l6ZSwgMCk7XG4gICAgICAgIGNvbnN0IG1lcmdlU3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIENvbGxlY3QgZWFjaCBzdGVwIGluc3RlYWQgb2YgbG9nZ2luZyBpdCBsaXZlOyBlbWl0dGVkIGF0IHRoZSBlbmQgYXMgb25lXG4gICAgICAgIC8vIGV4cGFuZGVkIGNvbnNvbGUuZ3JvdXAgc28gYSBtZXJnZSB0YWtlcyBvbmUgY29sbGFwc2libGUgYmxvY2ssIG5vdCBhXG4gICAgICAgIC8vIHNjcmVlbmZ1bCAoYW5kIG5ldmVyIHRoZSBwZXItZmlsZSBuYW1lIGR1bXAgaXQgdXNlZCB0byBzcGV3KS5cbiAgICAgICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEVhY2ggc3RlcCByZWNvcmRzIHRoZSB0aW1lIHNwZW50IHNpbmNlIHRoZSBwcmV2aW91cyBzdGVwIGluIGJsdWUgYXQgdGhlIGZyb250LCBzbyBjYWxsZXJzIGNhbiBqdXN0IGRlc2NyaWJlIHdoYXQgdGhleSBkaWQgYW5kIG5vdCBib3RoZXIgbWVhc3VyaW5nL2Zvcm1hdHRpbmcgZWxhcHNlZCB0aW1lcyB0aGVtc2VsdmVzLlxuICAgICAgICBsZXQgbGFzdFN0ZXBNcyA9IG1lcmdlU3RhcnRNcztcbiAgICAgICAgY29uc3QgbG9nID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBsaW5lRm9ybWF0dGVkID0gYCR7Ymx1ZShmb3JtYXRUaW1lKG5vdyAtIGxhc3RTdGVwTXMpKX0gJHtsaW5lfWA7XG4gICAgICAgICAgICAvLyBETyBOT1QgUkVNT1ZFIFRISVMgTE9HISBPYnZpb3VzbHksIHdlIHNob3VsZCBiZSBsb2dnaW5nIGFzIHdlIHJ1biwgb3IgZWxzZSB3ZSBkb24ndCBnZXQgcHJvZ3Jlc3MuIFdoeSB3b3VsZCB3ZSBzdG9wIGdldHRpbmcgcHJvZ3Jlc3M/IFByb2dyZXNzIGlzIGFsbW9zdCBtb3JlIGltcG9ydGFudCB0aGFuIHNob3dpbmcgYSBzdW1tYXJ5IGF0IHRoZSBlbmQuLi5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmVGb3JtYXR0ZWQpO1xuICAgICAgICAgICAgc3RlcHMucHVzaChsaW5lRm9ybWF0dGVkKTtcbiAgICAgICAgICAgIGxhc3RTdGVwTXMgPSBub3c7XG4gICAgICAgIH07XG4gICAgICAgIGxvZyhgJHttYWdlbnRhKFwicmVhZFwiKX06ICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgZmlsZShzKSwgJHtmbXRCeXRlcyhpblRvdGFsKX1gKTtcblxuICAgICAgICBjb25zdCBuZXdOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgbWVyZ2VSZXN1bHQgPSBhd2FpdCBydW5QbGFubmVkTWVyZ2Uoe1xuICAgICAgICAgICAgc291cmNlczogcmVhZGVycyxcbiAgICAgICAgICAgIHNvdXJjZU5hbWVzOiByZWFkZXJOYW1lcyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICB3cml0ZUZpbGU6IGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm5hbWUgPSBuZXdGaWxlTmFtZSh0aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KGZuYW1lLCBlbmNvZGVDb21wcmVzc2VkQmxvY2tzKGRhdGEpKTtcbiAgICAgICAgICAgICAgICBuZXdOYW1lcy5wdXNoKGZuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmbmFtZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk/LnNpemUgPz8gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBmbmFtZSwgc2l6ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2FycmllZERlbGV0ZXMgPSBpbmNsdWRlc09sZGVzdCA/IDAgOiBtZXJnZVJlc3VsdC5jYXJyaWVkRGVsZXRlcy5zaXplO1xuICAgICAgICBjb25zdCBvdXROYW1lcyA9IFsuLi5uZXdOYW1lc107XG4gICAgICAgIGlmIChjYXJyaWVkRGVsZXRlcykge1xuICAgICAgICAgICAgY29uc3QgY2FycnlOYW1lID0gbmV3U3RyZWFtRmlsZU5hbWUoTUVSR0VfT1VUUFVUX09XTkVSKTtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KGNhcnJ5TmFtZSwgZnJhbWVEZWxldGVzKFsuLi5tZXJnZVJlc3VsdC5jYXJyaWVkRGVsZXRlc10ubWFwKChba2V5LCB0aW1lXSkgPT4gKHsgdGltZSwga2V5IH0pKSkpO1xuICAgICAgICAgICAgb3V0TmFtZXMucHVzaChjYXJyeU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IFByb21pc2UuYWxsKG91dE5hbWVzLm1hcChhc3luYyBuID0+ICh7IG5hbWU6IG4sIHNpemU6IChhd2FpdCBzdG9yYWdlLmdldEluZm8obikuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk/LnNpemUgPz8gMCB9KSkpO1xuICAgICAgICBjb25zdCBvdXRUb3RhbCA9IG91dHB1dHMucmVkdWNlKChhLCBmKSA9PiBhICsgZi5zaXplLCAwKTtcbiAgICAgICAgbG9nKGAke21hZ2VudGEoXCJ3cm90ZVwiKX06ICR7b3V0cHV0cy5sZW5ndGh9IG91dHB1dCBmaWxlKHMpLCAke2ZtdEJ5dGVzKG91dFRvdGFsKX0ke2NhcnJpZWREZWxldGVzID8gYCwgJHtjYXJyaWVkRGVsZXRlc30gdG9tYnN0b25lcyBjYXJyaWVkYCA6IFwiXCJ9YCk7XG5cbiAgICAgICAgY29uc29sZS5ncm91cChgJHtibHVlKHRoaXMubmFtZSl9ICR7bWFnZW50YShcIm1lcmdlXCIpfTogJHtmbXRCeXRlcyhpblRvdGFsKX0gLT4gJHtmbXRCeXRlcyhvdXRUb3RhbCl9ICgke2lucHV0cy5sZW5ndGh9LT4ke291dHB1dHMubGVuZ3RofSBmaWxlcykgaW4gJHtmb3JtYXRUaW1lKERhdGUubm93KCkgLSBtZXJnZVN0YXJ0TXMpfWApO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RlcHMpIGNvbnNvbGUubG9nKGxpbmUpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICAgICAgLy8gT25seSB0aGUgc291cmNlcyBydW5QbGFubmVkTWVyZ2UgYWN0dWFsbHkgdXNlZCBjYW4gYmUgcmV0aXJlZCDigJQgYSBzb3VyY2UgaXQgZHJvcHBlZCBtaWQtcGxhbiAoZmlsZSBnb25lLCBjb3JydXB0aW9uKSBzdGlsbCBob2xkcyBkYXRhIHdlIGNvdWxkbid0IG1lcmdlIGluLCBzbyBsZWF2ZSBpdCBvbiBkaXNrIGFuZCBsZXQgYSBmdXR1cmUgbWVyZ2UgcmUtYXR0ZW1wdCBpdC5cbiAgICAgICAgY29uc3QgdXNlZENvbnN1bWVkQnVsayA9IGNvbnN1bWVkQnVsay5maWx0ZXIoZiA9PiBtZXJnZVJlc3VsdC51c2VkU291cmNlTmFtZXMuaGFzKGYuZmlsZU5hbWUpKTtcbiAgICAgICAgY29uc3QgdXNlZFN0cmVhbUZpbGVzID0gc3RyZWFtRmlsZXMuZmlsdGVyKGYgPT4gbWVyZ2VSZXN1bHQudXNlZFNvdXJjZU5hbWVzLmhhcyhmLmZpbGVOYW1lKSB8fCBtZXJnZVJlc3VsdC51c2VkU291cmNlTmFtZXMuaGFzKFwiKHN0cmVhbXMpXCIpKTtcbiAgICAgICAgLy8gQSBzdHJlYW0gbWF5IHN0aWxsIGJlIGFwcGVuZGVkIHRvIGFmdGVyIHdlIHJlYWQgaXQgKHRoZSB3cml0ZXIgaGFzbid0IHNlYWxlZC9tb3ZlZCBvbik7IG9ubHkgcmV0aXJlIHN0cmVhbXMgY2FuRGVsZXRlU3RyZWFtIGNsZWFycyDigJQgdGhlIHJlc3Qgc3RheSBsaXZlIGFuZCBhIGxhdGVyIG1lcmdlIHJlLWZvbGRzIHRoZW0gb25jZSBzZWFsZWQuIEJ1bGsgZmlsZXMgYXJlIGltbXV0YWJsZSwgc28gYSB1c2VkIG9uZSBpcyBhbHdheXMgc2FmZSB0byByZXRpcmUuXG4gICAgICAgIGNvbnN0IGRlbGV0YWJsZVN0cmVhbXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB1c2VkU3RyZWFtRmlsZXMpIHtcbiAgICAgICAgICAgIGlmIChyZXRpcmFibGVTdHJlYW1zLmhhcyhmLmZpbGVOYW1lKSkgeyBkZWxldGFibGVTdHJlYW1zLnB1c2goZi5maWxlTmFtZSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jYW5EZWxldGVTdHJlYW0oZiwgRGF0ZS5ub3coKSwgc3RyZWFtRGF0YS5zaXplcywgZm9yY2VEZWxldGVTdHJlYW1zKSkgZGVsZXRhYmxlU3RyZWFtcy5wdXNoKGYuZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGV0ZUZpbGVzID0gWy4uLnVzZWRDb25zdW1lZEJ1bGsubWFwKGYgPT4gZi5maWxlTmFtZSksIC4uLmRlbGV0YWJsZVN0cmVhbXNdO1xuXG4gICAgICAgIC8vIFdyaXRlIGEgZGVsZXRpb24gbWFya2VyIGluc3RlYWQgb2YgZGVsZXRpbmcgaW5saW5lLiBGcm9tIHRoZSBuZXh0IHJlYWQgb24sIGxpc3RGaWxlcyBoaWRlcyB0aGVzZSBpbnB1dHMgKHNvIHRoZXkncmUgbmV2ZXIgcmUtbWVyZ2VkIOKAlCB0aGUgbG9vcCBmaXgpLCBhbmQgcHJvY2Vzc01hcmtlcnMgcmVtb3ZlcyB0aGVtIHBoeXNpY2FsbHkgb25jZSB0aGUgb3V0cHV0cyBoYXZlIGxhbmRlZCBvciB0aGUgbWFya2VyIGFnZXMgb3V0LiBNYXJrZXIgQkVGT1JFIHRoZSByZWJ1aWxkIHNvIHRoZSBmcmVzaGx5LXN3YXBwZWQgaW5kZXggYWxyZWFkeSBleGNsdWRlcyB0aGUgcmV0aXJlZCBpbnB1dHMuXG4gICAgICAgIGlmIChkZWxldGVGaWxlcy5sZW5ndGgpIGF3YWl0IHdyaXRlRGVsZXRlTWFya2VyKHN0b3JhZ2UsIHsgZGVsZXRlRmlsZXMsIHJlcGxhY2VkQnk6IG91dE5hbWVzIH0pO1xuXG4gICAgICAgIC8vIFJlYnVpbGQgKyBzd2FwIHNvIHRoZSBpbmRleCBzZWVzIHRoZSBuZXcgb3V0cHV0cyBhbmQgZHJvcHMgdGhlIHJldGlyZWQgaW5wdXRzLiBCbG9jay1jYWNoZSBldmljdGlvbiBmb3IgdGhlIGRyb3BwZWQgaW5wdXRzIGhhcHBlbnMgaGVyZSAodGhleSdyZSBubyBsb25nZXIgaW4gdGhlIG5ldyBpbmRleCdzIGZpbGVTZXQpLlxuICAgICAgICBhd2FpdCB0aGlzLnRyaWdnZXJSZWJ1aWxkKCk7XG4gICAgICAgIHJldHVybiBuZXdOYW1lcy5sZW5ndGggPiAwIHx8IGNhcnJpZWREZWxldGVzID4gMDtcbiAgICB9XG5cbiAgICAvLyBBIHN0cmVhbSBpcyBzYWZlIHRvIGRlbGV0ZSBpZmYgbm8gd3JpdGVyIHdpbGwgYXBwZW5kIHRvIGl0IGFnYWluOiBpdCdzIGFnZWQgcGFzdCB0aGUgc2VhbCBhZ2UgKHdyaXRlciBoYXMgcHJvdmFibHkgc3dpdGNoZWQgZmlsZXMpIE9SIGNyb3NzLXRhYiBzeW5jIGlzIG9uIEFORCBpdHMgc2l6ZSBkaWRuJ3QgY2hhbmdlIHdoaWxlIHdlIHJlYWQgaXQuIEVsc2UgbGVhdmUgaXQg4oCUIHRoZSBkYXRhIGlzIGFsc28gaW4gdGhlIG5ldyBidWxrIGZpbGU7IGEgbGF0ZXIgbWVyZ2UgZGVsZXRlcyBpdCBvbmNlIGFnZWQuXG4gICAgcHJpdmF0ZSBhc3luYyBjYW5EZWxldGVTdHJlYW0oZjogU3RyZWFtRmlsZUluZm8sIG5vdzogbnVtYmVyLCBzaXplczogTWFwPHN0cmluZywgbnVtYmVyPiwgZm9yY2UgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAobm93IC0gZi50aW1lc3RhbXAgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1TZWFsQWdlTXMpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIWlzU3luY1N1cHBvcnRlZCgpICYmICFmb3JjZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZWFkU2l6ZSA9IHNpemVzLmdldChmLmZpbGVOYW1lKTtcbiAgICAgICAgaWYgKHJlYWRTaXplID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGluZm87XG4gICAgICAgIHRyeSB7IGluZm8gPSBhd2FpdCAoYXdhaXQgdGhpcy5zdG9yYWdlKCkpLmdldEluZm8oZi5maWxlTmFtZSk7IH0gY2F0Y2ggeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuICEhaW5mbyAmJiBpbmZvLnNpemUgPT09IHJlYWRTaXplO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbWVyZ2VTcGFjaW5nRGVsYXkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gYnVsa0RhdGFiYXNlMlRpbWluZy5tZXJnZVNwYWNpbmdNcztcbiAgICAgICAgaWYgKHRvdGFsIDw9IDApIHJldHVybiB0cnlBY3F1aXJlTWVyZ2VMb2NrKHRoaXMubmFtZSwgd3JpdGVySWQpO1xuICAgICAgICBjb25zdCBzdGVwID0gMTUgKiAxMDAwO1xuICAgICAgICBsZXQgd2FpdGVkID0gMDtcbiAgICAgICAgd2hpbGUgKHdhaXRlZCA8IHRvdGFsKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyID0+IHNldFRpbWVvdXQociwgTWF0aC5taW4oc3RlcCwgdG90YWwgLSB3YWl0ZWQpKSk7XG4gICAgICAgICAgICB3YWl0ZWQgKz0gc3RlcDtcbiAgICAgICAgICAgIGlmICghdHJ5QWNxdWlyZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNwbGl0cyB0aGUgYnVsayB0aWVyIGludG8gZmlsZXMgc3RpbGwgd29ydGggcm9sbGluZyB1cCAoXCJsb29zZVwiLCB1bmRlciBMT09TRV9CVUxLX01BWF9CWVRFUyAtIGEgc2luZ2xlIHN0cmVhbSBmb2xkLCBvciB0aGUgdGFpbCBlbmQgb2YgYW4gZWFybGllciBtZXJnZSkgYW5kIGZpbGVzIHRoYXQgYXJlIGRvbmUgZ3Jvd2luZyAoXCJjb21iaW5lZFwiLCB3aGljaCBvbmx5IHBoYXNlIDMgdG91Y2hlcyBhZ2FpbikuXG4gICAgLy9cbiAgICAvLyBBIGZpbGUgd2hvc2Ugc2l6ZSB3b24ndCByZWFkIGlzIHJlcG9ydGVkIGFzIGNvbWJpbmVkOiBwaGFzZSAyIGNhbid0IGNvbnN1bWUgb25lIChpdHMgcmVhZGVyIHdvbid0IGxvYWQsIHNvIHRoZSBtZXJnZSB3b24ndCByZXRpcmUgaXQpLCBhbmQgY2FsbGluZyBpdCBsb29zZSB3b3VsZCByZS10cmlnZ2VyIHBoYXNlIDIgb24gZXZlcnkgcGFzcyB1bnRpbCBoYW5kbGVVbnJlYWRhYmxlRmlsZSBmaW5hbGx5IGRlbGV0ZXMgaXQuXG4gICAgcHJpdmF0ZSBhc3luYyBzcGxpdEJ1bGtUaWVyKGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10pOiBQcm9taXNlPHsgbG9vc2U6IEJ1bGtGaWxlSW5mb1tdOyBsb29zZUJ5dGVzOiBudW1iZXI7IGNvbWJpbmVkOiBCdWxrRmlsZUluZm9bXTsgc2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gfT4ge1xuICAgICAgICBjb25zdCBsb2dpY2FsU2l6ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGYgPT4gdGhpcy5maWxlTG9naWNhbFNpemUoZi5maWxlTmFtZSkpKTtcbiAgICAgICAgY29uc3QgbG9vc2U6IEJ1bGtGaWxlSW5mb1tdID0gW107XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkOiBCdWxrRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBzaXplcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCBsb29zZUJ5dGVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWxrRmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbG9naWNhbFNpemVzW2ldO1xuICAgICAgICAgICAgc2l6ZXMuc2V0KGJ1bGtGaWxlc1tpXS5maWxlTmFtZSwgYnl0ZXMgPz8gMCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXMgPT09IHVuZGVmaW5lZCB8fCBieXRlcyA+PSBMT09TRV9CVUxLX01BWF9CWVRFUykge1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkLnB1c2goYnVsa0ZpbGVzW2ldKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvb3NlLnB1c2goYnVsa0ZpbGVzW2ldKTtcbiAgICAgICAgICAgIGxvb3NlQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbG9vc2UsIGxvb3NlQnl0ZXMsIGNvbWJpbmVkLCBzaXplcyB9O1xuICAgIH1cblxuICAgIC8vIE9uZSB3YWxrIG9mIHRoZSBjb21iaW5lZCB0aWVyJ3Mga2V5IGxpc3RzLCBwcm9kdWNpbmcgYm90aCBvZiBwaGFzZSAzJ3MgaW5wdXRzOiB0aGUgd2hvbGUtdGllciBkdXBsaWNhdGUgZnJhY3Rpb24sIGFuZCB0aGUgcGVyLWtleS1yYW5nZSBncm91cHMuIENvbWJpbmVkIGludG8gb25lIHBhc3MgYmVjYXVzZSB3YWxraW5nIGV2ZXJ5IGZpbGUncyBrZXlzIGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSB0aGluZyBhIG1lcmdlIHBhc3MgZG9lcyB0aGF0IGlzbid0IGEgbWVyZ2UsIGFuZCBib3RoIGFuc3dlcnMgY29tZSBmcm9tIHRoZSBzYW1lIGtleSBjb3VudHMuXG4gICAgcHJpdmF0ZSBhc3luYyBhbmFseXplRHVwbGljYXRlcyhidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdKTogUHJvbWlzZTx7IGR1cEZyYWN0aW9uOiBudW1iZXI7IGdyb3VwczogeyBsbzogc3RyaW5nOyBoaTogc3RyaW5nOyBkdXA6IG51bWJlciB9W10gfT4ge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IGluZm9zID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChhc3luYyBmID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gYXdhaXQgbG9hZEZpbGVSZWFkZXIodGhpcy5uYW1lLCBzdG9yYWdlLCBmLCB0aGlzLnN1YkNhY2hlcy5idWxrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXlzOiByZWFkZXIua2V5cywgYnl0ZXM6IHJlYWRlci50b3RhbEJ5dGVzIH07XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXlzOiBbXSBhcyBzdHJpbmdbXSwgYnl0ZXM6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBrZXlDb3VudCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCB0b3RhbFNsb3RzID0gMCwgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpbmZvcykge1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBpLmJ5dGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGkua2V5cykgeyBrZXlDb3VudC5zZXQoaywgKGtleUNvdW50LmdldChrKSB8fCAwKSArIDEpOyB0b3RhbFNsb3RzKys7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvdGFsU2xvdHMpIHJldHVybiB7IGR1cEZyYWN0aW9uOiAwLCBncm91cHM6IFtdIH07XG4gICAgICAgIGNvbnN0IGJ5dGVzUGVyU2xvdCA9IHRvdGFsQnl0ZXMgLyB0b3RhbFNsb3RzO1xuICAgICAgICBjb25zdCBzb3J0ZWRLZXlzID0gWy4uLmtleUNvdW50LmtleXMoKV0uc29ydCgpO1xuICAgICAgICBjb25zdCBncm91cHM6IHsgbG86IHN0cmluZzsgaGk6IHN0cmluZzsgZHVwOiBudW1iZXIgfVtdID0gW107XG4gICAgICAgIGxldCBnU3RhcnQgPSAwLCBnQnl0ZXMgPSAwLCBnU2xvdHMgPSAwLCBnVW5pcXVlID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0ga2V5Q291bnQuZ2V0KHNvcnRlZEtleXNbaV0pID8/IDA7XG4gICAgICAgICAgICBnQnl0ZXMgKz0gYyAqIGJ5dGVzUGVyU2xvdDsgZ1Nsb3RzICs9IGM7IGdVbmlxdWUgKz0gMTtcbiAgICAgICAgICAgIGlmIChnQnl0ZXMgPj0gS0VZX0dST1VQX0JZVEVTIHx8IGkgPT09IHNvcnRlZEtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKHsgbG86IHNvcnRlZEtleXNbZ1N0YXJ0XSwgaGk6IHNvcnRlZEtleXNbaV0sIGR1cDogKGdTbG90cyAtIGdVbmlxdWUpIC8gZ1Nsb3RzIH0pO1xuICAgICAgICAgICAgICAgIGdTdGFydCA9IGkgKyAxOyBnQnl0ZXMgPSAwOyBnU2xvdHMgPSAwOyBnVW5pcXVlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzb3J0KGdyb3VwcywgZyA9PiAtZy5kdXApO1xuICAgICAgICByZXR1cm4geyBkdXBGcmFjdGlvbjogKHRvdGFsU2xvdHMgLSBrZXlDb3VudC5zaXplKSAvIHRvdGFsU2xvdHMsIGdyb3VwcyB9O1xuICAgIH1cblxuICAgIC8vIFdoaWNoIGZpbGVzIGEga2V5LWdyb3VwIHN0ZXAgcmV3cml0ZXMuIFJlLXJ1biBhdCBtZXJnZSB0aW1lIGFzIHdlbGwgYXMgYXQgcGxhbiB0aW1lOiBncm91cHMgYXJlIGRpc2pvaW50IGJ5IEtFWSByYW5nZSwgbm90IGJ5IGZpbGUsIHNvIGFuIGVhcmxpZXIgc3RlcCBpbiB0aGUgc2FtZSBwYXNzIGNhbiBjb25zdW1lIGEgZmlsZSB0aGlzIHJhbmdlIHN0aWxsIGxpc3RzLlxuICAgIHByaXZhdGUgYXN5bmMgZmlsZXNGb3JLZXlSYW5nZShidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdLCBrZXlSYW5nZTogeyBsbzogc3RyaW5nOyBoaTogc3RyaW5nIH0pOiBQcm9taXNlPEJ1bGtGaWxlSW5mb1tdPiB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGYgPT4gdGhpcy5yZWFkQnVsa0hlYWRlcihmLmZpbGVOYW1lKSkpO1xuICAgICAgICByZXR1cm4gYnVsa0ZpbGVzLmZpbHRlcigoZiwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaCA9IGhlYWRlcnNbaV07XG4gICAgICAgICAgICBpZiAoIWgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChoLm1pbktleSA9PT0gdW5kZWZpbmVkIHx8IGgubWF4S2V5ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGgubWluS2V5IDw9IGtleVJhbmdlLmhpICYmIGgubWF4S2V5ID49IGtleVJhbmdlLmxvO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSBjb21wYWN0aW9uIHRoZSBmaWxlcyBvbiBkaXNrIGN1cnJlbnRseSBjYWxsIGZvciwgd2l0aG91dCBwZXJmb3JtaW5nIGFueSBvZiB0aGVtLiBBIG1lcmdlIHBhc3NcbiAgICAgKiBidWlsZHMgZXhhY3RseSB0aGlzIGFuZCB0aGVuIHJ1bnMgdGhlIHN0ZXBzIHdob3NlIGByZWFkeWAgaXMgdHJ1ZSwgc28gdGhlIHBsYW4gaXMgcHJlY2lzZWx5IHdoYXQgdGhlXG4gICAgICogZGF0YWJhc2UgaXMgYWJvdXQgdG8gZG8g4oCUIGFuZCBhIHN0ZXAgdGhhdCBpc24ndCByZWFkeSBzdGlsbCByZXBvcnRzIGl0cyBgdHJpZ2dlcnNgLCBzbyBhIGNhbGxlciBjYW5cbiAgICAgKiBzZWUgaG93IGNsb3NlIGl0IGlzICg1ME1CIG9mIHN0cmVhbSBkYXRhIG91dCBvZiB0aGUgNjRNQiB0aGF0IHdvdWxkIGZvbGQgaXQsIGFuZCBzbyBvbikuXG4gICAgICpcbiAgICAgKiBPKHRvdGFsIGtleXMpOiB0aGUgcGhhc2UgMyBzdGVwcyBuZWVkIGV2ZXJ5IGNvbWJpbmVkIGZpbGUncyBrZXkgbGlzdCB3YWxrZWQuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYW5Db21wYWN0aW9uKCk6IFByb21pc2U8Q29tcGFjdGlvblBsYW4+IHtcbiAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHN0ZXBzOiBDb21wYWN0aW9uU3RlcFtdID0gW107XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbVNpemVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgdHJ5IHsgc3RyZWFtU2l6ZXMuc2V0KGYuZmlsZU5hbWUsIChhd2FpdCBzdG9yYWdlLmdldEluZm8oZi5maWxlTmFtZSkpPy5zaXplID8/IDApOyB9IGNhdGNoIHsgc3RyZWFtU2l6ZXMuc2V0KGYuZmlsZU5hbWUsIDApOyB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtQnl0ZXMgPSAoZmlsZXM6IFN0cmVhbUZpbGVJbmZvW10pID0+IGZpbGVzLnJlZHVjZSgoYSwgZikgPT4gYSArIChzdHJlYW1TaXplcy5nZXQoZi5maWxlTmFtZSkgPz8gMCksIDApO1xuXG4gICAgICAgIC8vIOKUgOKUgCBQaGFzZSAxOiBzdHJlYW0gLT4gYnVsayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgLy8gVGhlIEVOVElSRSBzdHJlYW0gdGllciBpcyBwYXJzZWQgaW50byBtZW1vcnkgYW5kIGhlbGQgdGhlcmUgKHN1YkNhY2hlcy5zdHJlYW0ga2VlcHMgZXZlcnkgZGVjb2RlZCBlbnRyeSkganVzdCB0byBidWlsZCB0aGUgaW5kZXgsIHNvIGl0IGlzIHRoZSBiaWdnZXN0IHNpbmdsZSBsZXZlciBvbiBvdXIgaGVhcCAtIGEgZm9sZCB0dXJucyBpdCBpbnRvIGEgYnVsayBmaWxlIHdlIG9ubHkgcmVhZCBhbiBpbmRleCBvZi4gRm9sZHMgc3RyZWFtcyBhbmQgbm90aGluZyBlbHNlOiBubyBidWxrIGZpbGUgaXMgZHJhZ2dlZCBpbiwgc28gdGhlIHdvcmsgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBtZW1vcnkgcmVjbGFpbWVkLlxuICAgICAgICBjb25zdCBoYXJkTGltaXQgPSBtYWtlVHJpZ2dlcih7IG5hbWU6IFwic3RyZWFtQnl0ZXNcIiwgdmFsdWU6IHN0cmVhbUJ5dGVzKHN0cmVhbUZpbGVzKSwgdGhyZXNob2xkOiBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZvbGRIYXJkTGltaXRCeXRlcywgdW5pdDogXCJieXRlc1wiIH0pO1xuICAgICAgICAvLyBQYXN0IHRoZSBoYXJkIGxpbWl0IGV2ZXJ5IHJlYWQgcHVsbHMgYW4gZW5vcm1vdXMgZmlsZSwgc28gZm9sZCB0aGUgd2hvbGUgdGllciByZWdhcmRsZXNzIG9mIHdobyBvd25zIHdoYXQuIG1lcmdlRmlsZVNldCBmb3JjZS1kZWxldGVzIGZvciB0aGlzIG9uZTsgY2FuRGVsZXRlU3RyZWFtIHN0aWxsIHJlcXVpcmVzIHNpemUtc3RhYmlsaXR5LCBzbyBhbiBhY3RpdmUgd3JpdGVyIG5ldmVyIGxvc2VzIGRhdGEuXG4gICAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICAgICAgcGhhc2U6IDEsIGtpbmQ6IFwic3RyZWFtSGFyZExpbWl0XCIsIHJlcXVpcmVzOiBcImFsbFwiLCB0cmlnZ2VyczogW2hhcmRMaW1pdF0sXG4gICAgICAgICAgICByZWFkeTogaGFyZExpbWl0Lm1ldCAmJiBzdHJlYW1GaWxlcy5sZW5ndGggPiAwLFxuICAgICAgICAgICAgYnVsa0ZpbGVzOiBbXSwgc3RyZWFtRmlsZXMsIGJ5dGVzOiBoYXJkTGltaXQudmFsdWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEEgcGFzcyBzZWFscyBiZWZvcmUgaXQgbWVyZ2VzLCBzbyBieSB0aGVuIG91ciBvd24gY3VycmVudCBmaWxlIGlzIGZpbmFsIHRvbyAtIHByZWRpY3QgdGhhdCByYXRoZXIgdGhhbiByZXBvcnRpbmcgaXQgYXMgc3RpbGwtb3Blbi5cbiAgICAgICAgY29uc3QgcmV0aXJhYmxlID0gYXdhaXQgdGhpcy5maW5kQWJhbmRvbmVkU3RyZWFtcyhzdHJlYW1GaWxlcywgaXNTeW5jU3VwcG9ydGVkKCkpO1xuICAgICAgICAvLyBPbmx5IGZvbGQgd2hhdCB3ZSBjYW4gYWxzbyByZXRpcmUuIEZvbGRpbmcgYSBzdHJlYW0gYSBsaXZlIGZvcmVpZ24gb3duZXIgbWF5IHN0aWxsIGFwcGVuZCB0byB3b3VsZCBjb3B5IGl0IGludG8gYnVsayB3aXRob3V0IHJlbW92aW5nIGl0LCBzbyB0aGUgYnl0ZXMgd291bGQgc3RheSBpbiBtZW1vcnkgYW5kIGp1c3QgZ2V0IHJlLWZvbGRlZCBuZXh0IHBhc3M7IHRoYXQgb3duZXIgcm9sbHMgaXRzIG93biBmaWxlIG92ZXIgYXQgc3RyZWFtRmlsZU1heEJ5dGVzIGluc3RlYWQuXG4gICAgICAgIC8vIEFnZWQgcGFzdCBzdHJlYW1TZWFsQWdlTXMgY291bnRzIGFzIHJldGlyYWJsZSB0b28gKGNhbkRlbGV0ZVN0cmVhbSdzIG93biBmaXJzdCBydWxlKTogbm8gd3JpdGVyIGFwcGVuZHMgcGFzdCB0aGUgc2VhbCBhZ2UsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgZnJlZXMgdGhlIHRpZXIgaW4gTm9kZSwgd2hlcmUgbGl2ZW5lc3MgY2Fubm90IGJlIHByb2JlZCBhdCBhbGwuXG4gICAgICAgIGNvbnN0IGZvbGRhYmxlID0gc3RyZWFtRmlsZXMuZmlsdGVyKGYgPT4gZi5vd25lcklkICE9PSBNRVJHRV9PVVRQVVRfT1dORVJcbiAgICAgICAgICAgICYmIChyZXRpcmFibGUuaGFzKGYuZmlsZU5hbWUpIHx8IHRpbWUgLSBmLnRpbWVzdGFtcCA+PSBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbVNlYWxBZ2VNcykpO1xuICAgICAgICAvLyBNZXJnZS1jYXJyeSBmaWxlcyBob2xkIG5vdGhpbmcgYnV0IHRvbWJzdG9uZXMgYW5kIGFyZSBuZXZlciBhIFJFQVNPTiB0byBmb2xkIC0gZm9sZGluZyBvbmUgYWxvbmUgd291bGQganVzdCByZXdyaXRlIGl0IGludG8gYW5vdGhlciBjYXJyeSBmaWxlLCBmb3JldmVyLiBUaGV5IHJpZGUgYWxvbmcgd2hlbmV2ZXIgc29tZXRoaW5nIGVsc2UgZm9sZHMsIHdoaWNoIGNvbGxhcHNlcyBob3dldmVyIG1hbnkgaGF2ZSBwaWxlZCB1cCBpbnRvIG9uZS5cbiAgICAgICAgY29uc3QgY2FycnkgPSBzdHJlYW1GaWxlcy5maWx0ZXIoZiA9PiBmLm93bmVySWQgPT09IE1FUkdFX09VVFBVVF9PV05FUik7XG4gICAgICAgIC8vIFNpemUgaXMgdGhlIG9ubHkgcmVhc29uIHRvIGZvbGQuIEFuIGFiYW5kb25lZCBzdHJlYW0gaXMgTk9UIG9uZSBvbiBpdHMgb3duOiBpdCBpcyBhbHJlYWR5IHJldGlyYWJsZSwgc28gaXQgaXMgY291bnRlZCBoZXJlIGFuZCBnZXRzIHN3ZXB0IHVwIHRoZSBtb21lbnQgdGhlIHRpZXIgaXMgd29ydGggZm9sZGluZywgYW5kIHVudGlsIHRoZW4gaXQgaXMgYm91bmRlZCBieSB0aGlzIHZlcnkgdGhyZXNob2xkLiBUcmlnZ2VyaW5nIG9uIG9uZSB3b3VsZCBmb2xkIG9uIGVzc2VudGlhbGx5IGV2ZXJ5IHBhc3MgLSBhIGJyb3dzZXIgbGVhdmVzIGEgZmlsZSBiZWhpbmQgd2hvc2Ugd3JpdGVyIG5ldmVyIGFuc3dlcnMgdGhlIGxpdmVuZXNzIHByb2JlIG9uIGV2ZXJ5IHJlbG9hZCAtIHdoaWNoIG1pbnRzIGEgc21hbGwgYnVsayBmaWxlIGVhY2ggdGltZSBhbmQgcHVzaGVzIHRoZSBmcmFnbWVudGF0aW9uIGludG8gcGhhc2UgMi5cbiAgICAgICAgY29uc3QgZm9sZFRyaWdnZXJzID0gW1xuICAgICAgICAgICAgbWFrZVRyaWdnZXIoeyBuYW1lOiBcImZvbGRhYmxlQnl0ZXNcIiwgdmFsdWU6IHN0cmVhbUJ5dGVzKGZvbGRhYmxlKSwgdGhyZXNob2xkOiBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZvbGRUcmlnZ2VyQnl0ZXMsIHVuaXQ6IFwiYnl0ZXNcIiB9KSxcbiAgICAgICAgXTtcbiAgICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgICAgICBwaGFzZTogMSwga2luZDogXCJzdHJlYW1Gb2xkXCIsIHJlcXVpcmVzOiBcImFsbFwiLCB0cmlnZ2VyczogZm9sZFRyaWdnZXJzLFxuICAgICAgICAgICAgLy8gU2tpcHBlZCB3aGVuIHRoZSBoYXJkIGxpbWl0IGFscmVhZHkgZm9sZHMgZXZlcnl0aGluZyB0aGlzIHdvdWxkIGhhdmUuXG4gICAgICAgICAgICByZWFkeTogIWhhcmRMaW1pdC5tZXQgJiYgZm9sZFRyaWdnZXJzLmV2ZXJ5KHQgPT4gdC5tZXQpLFxuICAgICAgICAgICAgYnVsa0ZpbGVzOiBbXSwgc3RyZWFtRmlsZXM6IFsuLi5mb2xkYWJsZSwgLi4uY2FycnldLCBieXRlczogc3RyZWFtQnl0ZXMoWy4uLmZvbGRhYmxlLCAuLi5jYXJyeV0pLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDilIDilIAgUGhhc2UgMjogbG9vc2UgYnVsayAtPiBjb21iaW5lZCBidWxrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgICAvLyBQaGFzZSAxIGVtaXRzIG9uZSBzbWFsbCBidWxrIGZpbGUgcGVyIGZvbGQuIEVhY2ggaXMgY2hlYXAgdG8gcmVhZCAoaW5kZXggb25seSkgYnV0IGhvbGRzIGl0cyB3aG9sZSBrZXkgbGlzdCBpbiBtZW1vcnkgYW5kIGpvaW5zIGludG8gZXZlcnkgcmVhZCwgc28gdGhleSBoYXZlIHRvIGJlIHJvbGxlZCB1cC4gTWVyZ2luZyBqdXN0IHRoZSBsb29zZSBvbmVzIGFsc28gZGVkdXBlcyB0aGVtIGZvciBmcmVlIC0gYSByZXdyaXRlLWhlYXZ5IHdvcmtsb2FkIGNvbGxhcHNlcyBhIGdpZ2FieXRlIG9mIG5lYXItaWRlbnRpY2FsIGZvbGRzIGludG8gYWxtb3N0IG5vdGhpbmcgLSBhbmQgaXQgYWx3YXlzIHRlcm1pbmF0ZXM6IGEgY2h1bmsgaXMgb25seSBjdXQgb25jZSB0aGUgbmV4dCBrZXkgd291bGQgdGFrZSBpdCBwYXN0IFRBUkdFVF9GSUxFX0JZVEVTLCBzbyBldmVyeSBvdXRwdXQgYnV0IHRoZSBsYXN0IGlzIG92ZXIgaGFsZiB0aGUgdGFyZ2V0IGFuZCBsYW5kcyBpbiB0aGUgY29tYmluZWQgdGllciwgbGVhdmluZyBhdCBtb3N0IG9uZSBsb29zZSBmaWxlIGJlaGluZC5cbiAgICAgICAgY29uc3QgeyBsb29zZSwgbG9vc2VCeXRlcywgY29tYmluZWQsIHNpemVzIH0gPSBhd2FpdCB0aGlzLnNwbGl0QnVsa1RpZXIoYnVsa0ZpbGVzKTtcbiAgICAgICAgY29uc3QgbG9vc2VUcmlnZ2VycyA9IFtcbiAgICAgICAgICAgIG1ha2VUcmlnZ2VyKHsgbmFtZTogXCJsb29zZUJ5dGVzXCIsIHZhbHVlOiBsb29zZUJ5dGVzLCB0aHJlc2hvbGQ6IGJ1bGtEYXRhYmFzZTJUaW1pbmcubG9vc2VCdWxrVHJpZ2dlckJ5dGVzLCB1bml0OiBcImJ5dGVzXCIgfSksXG4gICAgICAgICAgICBtYWtlVHJpZ2dlcih7IG5hbWU6IFwibG9vc2VGaWxlc1wiLCB2YWx1ZTogbG9vc2UubGVuZ3RoLCB0aHJlc2hvbGQ6IGJ1bGtEYXRhYmFzZTJUaW1pbmcubG9vc2VCdWxrVHJpZ2dlckZpbGVzLCB1bml0OiBcImNvdW50XCIgfSksXG4gICAgICAgIF07XG4gICAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICAgICAgcGhhc2U6IDIsIGtpbmQ6IFwibG9vc2VDb21iaW5lXCIsIHJlcXVpcmVzOiBcImFueVwiLCB0cmlnZ2VyczogbG9vc2VUcmlnZ2VycyxcbiAgICAgICAgICAgIC8vIFVuZGVyIHR3byBmaWxlcyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbWJpbmUsIGFuZCByZXdyaXRpbmcgb25lIGZpbGUgaW50byBhbiBpZGVudGljYWwgb25lIHdvdWxkIHJlLXRyaWdnZXIgZm9yZXZlci5cbiAgICAgICAgICAgIHJlYWR5OiBsb29zZS5sZW5ndGggPj0gMiAmJiBsb29zZVRyaWdnZXJzLnNvbWUodCA9PiB0Lm1ldCksXG4gICAgICAgICAgICBidWxrRmlsZXM6IGxvb3NlLCBzdHJlYW1GaWxlczogW10sIGJ5dGVzOiBsb29zZUJ5dGVzLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDilIDilIAgUGhhc2UgMzogZGVkdXAgdGhlIGNvbWJpbmVkIGZpbGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgICAvLyBMb29zZSBmaWxlcyBhcmUgZXhjbHVkZWQgdGhyb3VnaG91dDogcGhhc2UgMiByZXdyaXRlcyB0aGVtIGFueXdheSwgYW5kIHRoYXQgcmV3cml0ZSBhbHJlYWR5IGRlZHVwZXMgdGhlbSwgc28gcHVsbGluZyBvbmUgaW4gaGVyZSB3b3VsZCBkbyB0aGUgc2FtZSB3b3JrIHR3aWNlIGF0IGtleS1ncm91cCBzY2FsZS5cbiAgICAgICAgY29uc3QgY29tYmluZWRCeXRlcyA9IGNvbWJpbmVkLnJlZHVjZSgoYSwgZikgPT4gYSArIChzaXplcy5nZXQoZi5maWxlTmFtZSkgPz8gMCksIDApO1xuICAgICAgICBjb25zdCB7IGR1cEZyYWN0aW9uLCBncm91cHMgfSA9IGF3YWl0IHRoaXMuYW5hbHl6ZUR1cGxpY2F0ZXMoY29tYmluZWQpO1xuICAgICAgICAvLyBXaG9sZS10aWVyIHNob3J0LWNpcmN1aXQ6IHdoZW4gdGhlIGNvbWJpbmVkIHRpZXIgaXMgYmlnIGVub3VnaCBBTkQgbW9zdGx5IGR1cGxpY2F0ZXMsIGZvbGQgYWxsIG9mIGl0IGluIG9uZSBtZXJnZSByYXRoZXIgdGhhbiBwYXlpbmcgdGhlIHBlci1ncm91cCB3YWxrJ3MgNS1taW4gc3BhY2luZyB4IE4gZ3JvdXBzLlxuICAgICAgICBjb25zdCBkZWR1cEFsbFRyaWdnZXJzID0gW1xuICAgICAgICAgICAgbWFrZVRyaWdnZXIoeyBuYW1lOiBcImNvbWJpbmVkQnl0ZXNcIiwgdmFsdWU6IGNvbWJpbmVkQnl0ZXMsIHRocmVzaG9sZDogREVEVVBfVFJJR0dFUl9CWVRFUywgdW5pdDogXCJieXRlc1wiIH0pLFxuICAgICAgICAgICAgbWFrZVRyaWdnZXIoeyBuYW1lOiBcImR1cGxpY2F0ZUZyYWN0aW9uXCIsIHZhbHVlOiBkdXBGcmFjdGlvbiwgdGhyZXNob2xkOiBERURVUF9UUklHR0VSX0ZSQUNUSU9OLCB1bml0OiBcImZyYWN0aW9uXCIgfSksXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGRlZHVwQWxsUmVhZHkgPSBjb21iaW5lZC5sZW5ndGggPj0gMiAmJiBkZWR1cEFsbFRyaWdnZXJzLmV2ZXJ5KHQgPT4gdC5tZXQpO1xuICAgICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgICAgIHBoYXNlOiAzLCBraW5kOiBcImRlZHVwQWxsXCIsIHJlcXVpcmVzOiBcImFsbFwiLCB0cmlnZ2VyczogZGVkdXBBbGxUcmlnZ2VycyxcbiAgICAgICAgICAgIHJlYWR5OiBkZWR1cEFsbFJlYWR5LFxuICAgICAgICAgICAgYnVsa0ZpbGVzOiBjb21iaW5lZCwgc3RyZWFtRmlsZXM6IFtdLCBieXRlczogY29tYmluZWRCeXRlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhlbiBrZXktc3RyYXRpZmllZDogZGlzam9pbnQga2V5IHJhbmdlcywgc28gb25lIGdyb3VwJ3MgbWVyZ2UgZG9lc24ndCBjaGFuZ2UgYW5vdGhlcidzIGR1cGxpY2F0aW9uLiBPbmx5IGdyb3VwcyBvdmVyIHRoZSB0aHJlc2hvbGQgYXJlIHdvcnRoIGEgc3RlcDsgdGhlIGJlc3Qgb25lIGJlbG93IGl0IGlzIGxpc3RlZCBhbnl3YXkgc28gYSBjYWxsZXIgY2FuIHNlZSBob3cgY2xvc2UgdGhlIHRpZXIgaXMuXG4gICAgICAgIGNvbnN0IGdyb3VwU3RlcHMgPSBncm91cHMuZmlsdGVyKGcgPT4gZy5kdXAgPj0gRFVQX1RIUkVTSE9MRCk7XG4gICAgICAgIGlmICghZ3JvdXBTdGVwcy5sZW5ndGggJiYgZ3JvdXBzLmxlbmd0aCkgZ3JvdXBTdGVwcy5wdXNoKGdyb3Vwc1swXSk7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBncm91cFN0ZXBzKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cEZpbGVzID0gYXdhaXQgdGhpcy5maWxlc0ZvcktleVJhbmdlKGNvbWJpbmVkLCBnKTtcbiAgICAgICAgICAgIGNvbnN0IGR1cCA9IG1ha2VUcmlnZ2VyKHsgbmFtZTogXCJkdXBsaWNhdGVGcmFjdGlvblwiLCB2YWx1ZTogZy5kdXAsIHRocmVzaG9sZDogRFVQX1RIUkVTSE9MRCwgdW5pdDogXCJmcmFjdGlvblwiIH0pO1xuICAgICAgICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgcGhhc2U6IDMsIGtpbmQ6IFwiZGVkdXBLZXlHcm91cFwiLCByZXF1aXJlczogXCJhbGxcIiwgdHJpZ2dlcnM6IFtkdXBdLFxuICAgICAgICAgICAgICAgIC8vIE1vb3QgaWYgdGhlIHdob2xlIHRpZXIgaXMgYWJvdXQgdG8gYmUgZm9sZGVkIGluIG9uZSBnby5cbiAgICAgICAgICAgICAgICByZWFkeTogIWRlZHVwQWxsUmVhZHkgJiYgZHVwLm1ldCAmJiBncm91cEZpbGVzLmxlbmd0aCA+PSAyLFxuICAgICAgICAgICAgICAgIGJ1bGtGaWxlczogZ3JvdXBGaWxlcywgc3RyZWFtRmlsZXM6IFtdLCBieXRlczogZ3JvdXBGaWxlcy5yZWR1Y2UoKGEsIGYpID0+IGEgKyAoc2l6ZXMuZ2V0KGYuZmlsZU5hbWUpID8/IDApLCAwKSxcbiAgICAgICAgICAgICAgICBrZXlSYW5nZTogeyBsbzogZy5sbywgaGk6IGcuaGkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2VzIGFyZSBzcGFjZWQgbWVyZ2VTcGFjaW5nTXMgYXBhcnQsIGFuZCB0aGUgZmlyc3Qgb25lIHJ1bnMgaW1tZWRpYXRlbHkuXG4gICAgICAgIGxldCByZWFkeUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgICAgICAgICBpZiAoIXN0ZXAucmVhZHkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc3RlcC5zdGFydFRpbWUgPSB0aW1lICsgcmVhZHlDb3VudCAqIGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVyZ2VTcGFjaW5nTXM7XG4gICAgICAgICAgICByZWFkeUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29sbGVjdGlvbjogdGhpcy5uYW1lLCB0aW1lLCBzdGVwcyB9O1xuICAgIH1cblxuICAgIC8vIFJ1bnMgdGhlIGNvbXBhY3Rpb24gcGxhbjogYnVpbGRzIGl0LCB0aGVuIHBlcmZvcm1zIGV2ZXJ5IHN0ZXAgaXQgbWFya3MgcmVhZHksIGluIG9yZGVyLiBBbGwgdGhlIGRlY2lkaW5nIGxpdmVzIGluIHBsYW5Db21wYWN0aW9uIC0gdGhpcyBvbmx5IGV4ZWN1dGVzLCBzbyB3aGF0IHRoZSBkYXRhYmFzZSBkb2VzIGFuZCB3aGF0IHBsYW5Db21wYWN0aW9uIHJlcG9ydHMgY2FuIG5ldmVyIGRyaWZ0IGFwYXJ0LlxuICAgIHByaXZhdGUgYXN5bmMgdGVzdE1lcmdlSU5URVJOQUxfRE9fTk9UX0NBTEwoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcblxuICAgICAgICAvLyBTZWFsIGJlZm9yZSBwbGFubmluZywgc28gZXZlcnkgd3JpdGVyJ3MgY3VycmVudCBzdHJlYW0gZmlsZSBpcyBmaW5hbCBhbmQgdGhlIHBsYW4gY2FuIGNvdW50IGl0IGFzIGZvbGRhYmxlLiBPbmx5IHdoZW4gY3Jvc3MtdGFiIHN5bmMgaXMgdGhlcmUgdG8gY2FycnkgdGhlIHNlYWwgLSBpbiBOb2RlIGNhbkRlbGV0ZVN0cmVhbSBuZWVkcyBzdHJlYW1zIGFnZWQgYW55d2F5LCBzbyBzZWFsaW5nIHdvdWxkIGp1c3QgZnJhZ21lbnQgdGhlbSBldmVyeSBwYXNzLlxuICAgICAgICBpZiAoaXNTeW5jU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIHN5bmNCcm9hZGNhc3RTZWFsKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhbiA9IGF3YWl0IHRoaXMucGxhbkNvbXBhY3Rpb24oKTtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBsYW4uc3RlcHMpIHtcbiAgICAgICAgICAgIGlmICghc3RlcC5yZWFkeSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgYnVsa0ZpbGVzID0gc3RlcC5idWxrRmlsZXM7XG4gICAgICAgICAgICBpZiAoc3RlcC5rZXlSYW5nZSkge1xuICAgICAgICAgICAgICAgIGJ1bGtGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZXNGb3JLZXlSYW5nZShidWxrRmlsZXMsIHN0ZXAua2V5UmFuZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChidWxrRmlsZXMubGVuZ3RoIDwgMikgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3aHkgPSBzdGVwLnRyaWdnZXJzLmZpbHRlcih0ID0+IHQubWV0KVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiBgJHt0Lm5hbWV9ICR7Zm10VHJpZ2dlclZhbHVlKHQudmFsdWUsIHQudW5pdCl9IG9mICR7Zm10VHJpZ2dlclZhbHVlKHQudGhyZXNob2xkLCB0LnVuaXQpfWApLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKHN0ZXAua2luZCl9IHBoYXNlICR7c3RlcC5waGFzZX06ICR7YnVsa0ZpbGVzLmxlbmd0aH0gYnVsayArICR7c3RlcC5zdHJlYW1GaWxlcy5sZW5ndGh9IHN0cmVhbSBmaWxlKHMpLCAke2ZtdEJ5dGVzKHN0ZXAuYnl0ZXMpfSAtICR7d2h5fWApO1xuICAgICAgICAgICAgaWYgKG1lcmdlZCAmJiAhYXdhaXQgdGhpcy5tZXJnZVNwYWNpbmdEZWxheSgpKSByZXR1cm4gbWVyZ2VkO1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMubWVyZ2VGaWxlU2V0KGJ1bGtGaWxlcywgc3RlcC5zdHJlYW1GaWxlcywgZmFsc2UsIHN0ZXAua2luZCA9PT0gXCJzdHJlYW1IYXJkTGltaXRcIikpIG1lcmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcmVhZHMg4oCUIGZvcndhcmRlZCB0byBCdWxrRGF0YWJhc2VSZWFkZXIsIHdpdGggcmVidWlsZC1vbi1taXNzaW5nIHJldHJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHB1YmxpYyBhc3luYyBnZXRTaW5nbGVGaWVsZDxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IFByb21pc2U8VFtDXSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2luZ2xlRmllbGRPYmo8QyBleHRlbmRzIGtleW9mIFQ+KGtleTogc3RyaW5nLCBjb2x1bW46IEMpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGRPYmooa2V5LCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29sdW1uPEMgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEMpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfVtdPiB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlYWRlci5nZXRDb2x1bW4oY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0S2V5cygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2luZ2xlRmllbGRTeW5jPEMgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IHN0cmluZywgY29sdW1uOiBDKTogVFtDXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbmdsZUZpZWxkT2JqU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkT2JqU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtblN5bmM8QyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogQyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uU3luYyhjb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZpZWxkTG9hZGVkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IGJvb2xlYW4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0ZpZWxkTG9hZGVkU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29sdW1uTG9hZGVkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oY29sdW1uOiBDKTogYm9vbGVhbiB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmlzQ29sdW1uTG9hZGVkU3luYyhjb2x1bW4pO1xuICAgIH1cblxuICAgIC8vIFJlYWN0aXZlOiB0cnVlIHdoaWxlIGEgbWVyZ2UgaXMgcmV3cml0aW5nIHRoaXMgY29sbGVjdGlvbidzIGZpbGVzLiBVc2UgdGhpcyBpbiBVSSB0byBzaG93IGEgXCJjb21wYWN0aW5n4oCmXCIgaW5kaWNhdG9yLiBDb3VudHMgYm90aCBiYWNrZ3JvdW5kIG1lcmdlcyAobWF5YmVNZXJnZSkgYW5kIGV4cGxpY2l0IGNvbXBhY3QvbWVyZ2UgY2FsbHMuIEJlY29tZXMgZmFsc2Ugb25jZSB0aGUgbmV3IGluZGV4IGlzIHN3YXBwZWQgaW4gKHRoZSBkZWZlcnJlZC1kZWxldGUgd2luZG93IGlzIE5PVCBjb3VudGVkKS5cbiAgICBwdWJsaWMgaXNDb21wYWN0aW5nU3luYygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmlzQ29tcGFjdGluZ1N5bmMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29sdW1uSW5mbygpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIHJldHVybiBpbmRleC5yZWFkZXIuY29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5U3RhdHMoKTogUHJvbWlzZTx7IHJhd0tleXM6IG51bWJlcjsgZmluYWxLZXlzOiBudW1iZXI7IHdhc3RlZEtleXM6IG51bWJlcjsgZHVwbGljYXRpb246IG51bWJlcjsgcmVhZGVyczogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IHJhd0tleXMgPSBpbmRleC5yZWFkZXIucmF3S2V5Q291bnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsS2V5cyA9IGluZGV4LnJlYWRlci5rZXlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd0tleXMsXG4gICAgICAgICAgICBmaW5hbEtleXMsXG4gICAgICAgICAgICB3YXN0ZWRLZXlzOiByYXdLZXlzIC0gZmluYWxLZXlzLFxuICAgICAgICAgICAgZHVwbGljYXRpb246IGZpbmFsS2V5cyA/IHJhd0tleXMgLyBmaW5hbEtleXMgOiAwLFxuICAgICAgICAgICAgcmVhZGVyczogaW5kZXgucmVhZGVyLnJlYWRlckNvdW50LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRSZWFkZXJJbmZvKCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJvd0NvdW50OiBpbmRleC5yZWFkZXIucm93Q291bnQsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzOiBpbmRleC5yZWFkZXIudG90YWxCeXRlcyxcbiAgICAgICAgICAgIGtleUNvdW50OiBpbmRleC5yZWFkZXIua2V5cy5sZW5ndGgsXG4gICAgICAgICAgICBzYW1wbGVLZXk6IGluZGV4LnJlYWRlci5rZXlzWzBdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IGluZGV4LnJlYWRlci5jb2x1bW5zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRGaWxlSW5mbygpOiBQcm9taXNlPEJ1bGtGaWxlSW5mb0xpc3Rpbmc+IHtcbiAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHN0YXRPZiA9IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBieXRlczogaW5mbz8uc2l6ZSA/PyAwLCBsYXN0TW9kaWZpZWQ6IGluZm8/Lmxhc3RNb2RpZmllZCA/PyAwIH07XG4gICAgICAgICAgICB9IGNhdGNoIHsgcmV0dXJuIHsgYnl0ZXM6IDAsIGxhc3RNb2RpZmllZDogMCB9OyB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1bGtJbmZvcyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgc3RhdE9mKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYnVsa1wiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGJ5dGVzOiBzdGF0LmJ5dGVzLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgZ2V0RGV0YWlsczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWxrOiByZWFkZXIgaGFzIGtleXMgKyBwZXItcm93IGtleVRpbWVzICsgaGVhZGVyIG1pblRpbWUvbWF4VGltZS4gQ2FjaGVkLCBzbyBjaGVhcC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gYXdhaXQgbG9hZEZpbGVSZWFkZXIodGhpcy5uYW1lLCBzdG9yYWdlLCBmLCB0aGlzLnN1YkNhY2hlcy5idWxrKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogcmVhZGVyLmtleXMsIG1pblRpbWU6IHJlYWRlci5taW5UaW1lLCBtYXhUaW1lOiByZWFkZXIubWF4VGltZSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm9zID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHN0YXRPZihmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZi5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmVhbVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGJ5dGVzOiBzdGF0LmJ5dGVzLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgZ2V0RGV0YWlsczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJlYW06IG11c3QgcGFyc2UgdGhlIGZpbGUgdG8gd2FsayBldmVyeSBlbnRyeSDigJQgaGVhZGVyIGhhcyBubyBrZXkvdGltZSBib3VuZHMuIENhY2hlZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGxvYWRTdHJlYW1FbnRyaWVzKHRoaXMubmFtZSwgc3RvcmFnZSwgW2ZdLCB0aGlzLnN1YkNhY2hlcy5zdHJlYW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5UaW1lID0gSW5maW5pdHksIG1heFRpbWUgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkYXRhLmVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnRpbWUgPCBtaW5UaW1lKSBtaW5UaW1lID0gZS50aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGltZSA+IG1heFRpbWUpIG1heFRpbWUgPSBlLnRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5lbnRyeS5yb3cpIGtleXMuYWRkKGUuZW50cnkucm93LmtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5lbnRyeS5kZWxldGVkS2V5ICE9PSB1bmRlZmluZWQpIGtleXMuYWRkKGUuZW50cnkuZGVsZXRlZEtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IFsuLi5rZXlzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWU6IG1pblRpbWUgPT09IEluZmluaXR5ID8gMCA6IG1pblRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhUaW1lOiBtYXhUaW1lID09PSAtSW5maW5pdHkgPyAwIDogbWF4VGltZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IFsuLi5idWxrSW5mb3MsIC4uLnN0cmVhbUluZm9zXTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGNvdW50OiBmaWxlcy5sZW5ndGgsIHRvdGFsQnl0ZXM6IGZpbGVzLnJlZHVjZSgoYSwgZikgPT4gYSArIGYuYnl0ZXMsIDApIH07XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBCdWxrRmlsZURldGFpbHMgPSB7IGtleXM6IHN0cmluZ1tdOyBtaW5UaW1lOiBudW1iZXI7IG1heFRpbWU6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgQnVsa0ZpbGVFbnRyeSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogXCJidWxrXCIgfCBcInN0cmVhbVwiO1xuICAgIGJ5dGVzOiBudW1iZXI7XG4gICAgLy8gRmlsZXN5c3RlbSBtdGltZSAobXMgc2luY2UgZXBvY2gpIOKAlCAwIGlmIHRoZSBzdG9yYWdlIGxheWVyIGRpZG4ndCByZXR1cm4gb25lLlxuICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgIC8vIExhenk6IHB1bGxlZCBmcm9tIHRoZSBjYWNoZWQgc3ViLXJlYWRlciBmb3IgYnVsayAoZnJlZSBpZiBsb2FkZWQpLCBvciBmcm9tIGEgcGFyc2Ugb2YgdGhlIHN0cmVhbSBmaWxlIChzbWFsbCDigJQgdGllci0wIHNpemUtY2FwcGVkLCBhbHNvIGNhY2hlZCkuIENhbGwgb25seSB3aGVuIHlvdSBuZWVkIHRoZSBwZXItZmlsZSBkZXRhaWwuXG4gICAgZ2V0RGV0YWlsczogKCkgPT4gUHJvbWlzZTxCdWxrRmlsZURldGFpbHM+O1xufTtcbmV4cG9ydCB0eXBlIEJ1bGtGaWxlSW5mb0xpc3RpbmcgPSB7IGZpbGVzOiBCdWxrRmlsZUVudHJ5W107IGNvdW50OiBudW1iZXI7IHRvdGFsQnl0ZXM6IG51bWJlciB9O1xuXG4iXX0=
|
|
1271
|
+
/* _JS_SOURCE_HASH = "cec4e554fad7d99ed5fb7a78d57608dc8c95c0b5b75109237e4e5d89defbf3d1"; */
|