sliftutils 1.7.121 → 1.7.123
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/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +74 -7
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +2 -2
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/BulkDatabase2/BulkDatabase2.d.ts +14 -2
- package/storage/BulkDatabase2/BulkDatabase2.ts +15 -2
- package/storage/BulkDatabase2/BulkDatabaseBase.d.ts +57 -5
- package/storage/BulkDatabase2/BulkDatabaseBase.ts +288 -137
- package/storage/BulkDatabase2/LoadedIndex.d.ts +1 -0
- package/storage/BulkDatabase2/LoadedIndex.ts +2 -1
- package/storage/BulkDatabase2/blockCache.ts +6 -1
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +257 -162
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +8 -3
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +30 -4
- package/storage/BulkDatabase2/syncClient.d.ts +2 -0
- package/storage/BulkDatabase2/syncClient.ts +27 -2
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/StreamingLogs.ts.cache +2 -2
- package/storage/dist/TransactionFile.ts.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +2 -2
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageLogs.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +2 -2
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
- package/yarn.lock +4 -4
|
@@ -25,10 +25,9 @@ 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
|
-
const FIRST_MERGE_BYTES = BulkDatabaseFormat_1.TARGET_FILE_BYTES / 2;
|
|
29
28
|
const KEY_GROUP_BYTES = 800 * 1024 * 1024;
|
|
30
29
|
const DUP_THRESHOLD = 0.4;
|
|
31
|
-
// Whole-tier dedup short-circuit (
|
|
30
|
+
// 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).
|
|
32
31
|
const DEDUP_TRIGGER_BYTES = 512 * 1024 * 1024;
|
|
33
32
|
const DEDUP_TRIGGER_FRACTION = 0.5;
|
|
34
33
|
const WRITE_FLUSH_FIRST_STEP_MS = 250;
|
|
@@ -39,11 +38,13 @@ exports.bulkDatabase2Timing = {
|
|
|
39
38
|
// Wait this long after the tab becomes visible before the first merge check, then check this often afterwards. Tab being hidden cancels the timers (no merges while in background). Browser-only; Node compactors (e.g. remoteFileServer) drive their own polling.
|
|
40
39
|
visibleMergeIntervalMs: 5 * 60 * 1000,
|
|
41
40
|
mergeSpacingMs: 5 * 60 * 1000,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
// Phase 2 rolls the loose bulk files up once they pass either of these. Bytes because read cost grows with them; count because each loose file holds its whole key list in memory no matter how few bytes it has, so a trickle of tiny folds has to be collapsed long before it reaches the byte trigger.
|
|
42
|
+
looseBulkTriggerBytes: 1024 * 1024 * 1024,
|
|
43
|
+
looseBulkTriggerFiles: 20,
|
|
45
44
|
streamFoldTriggerBytes: 64 * 1024 * 1024,
|
|
46
45
|
streamFileMaxBytes: 50 * 1024 * 1024,
|
|
46
|
+
// How long to wait for peers to answer a stream-owner liveness probe. Runs inside a merge pass, which already waits 15s for the file lock, so a second here costs nothing.
|
|
47
|
+
liveWriterProbeMs: 1000,
|
|
47
48
|
streamFoldHardLimitBytes: 768 * 1024 * 1024,
|
|
48
49
|
// 0 = flush every write (Node — append is real and cheap); browser ramps to 15s to avoid rewriting the whole stream file per write.
|
|
49
50
|
writeFlushMaxDelayMs: (0, typesafecss_1.isNode)() ? 0 : 15 * 1000,
|
|
@@ -69,8 +70,11 @@ exports.noopReactiveDeps = {
|
|
|
69
70
|
};
|
|
70
71
|
let networkCompactionEnabled = false;
|
|
71
72
|
let fileNameCounter = 0;
|
|
72
|
-
// Per-process ID so two writers picking the same timestamp + counter never collide on a name.
|
|
73
|
+
// Per-process ID so two writers picking the same timestamp + counter never collide on a name. Also stamped into our stream file names and answered over the sync channel, so a peer can tell whether the writer of a given stream file is still running.
|
|
73
74
|
const writerId = Math.random().toString(36).slice(2, 10);
|
|
75
|
+
(0, syncClient_1.registerWriterId)(writerId);
|
|
76
|
+
// Reserved owner for the tombstone-carry file a merge emits. Nothing ever appends to it, but it must NOT read as abandoned: folding it would emit another carry file, which would read as abandoned in turn, and the pass would fold forever.
|
|
77
|
+
const MERGE_OUTPUT_OWNER = "merged";
|
|
74
78
|
function nextCounter() { return ++fileNameCounter; }
|
|
75
79
|
let lastFileTime = 0;
|
|
76
80
|
// Strictly-increasing integer so newest-first ordering is unambiguous within a millisecond.
|
|
@@ -81,16 +85,22 @@ function nextFileTime() {
|
|
|
81
85
|
function newFileName(timestamp) {
|
|
82
86
|
return `0_${timestamp}_${writerId}_${nextCounter()}${FILE_EXTENSION}`;
|
|
83
87
|
}
|
|
88
|
+
// Accept old 3-part (stream_timestamp_random) and new 4-part (stream_timestamp_ownerId_counter) shapes. A 3-part name carries no owner, so it can never be matched to a live writer — which is what we want: no build that produces those names is still appending to them.
|
|
84
89
|
function parseStreamFileName(fileName) {
|
|
85
90
|
if (!fileName.endsWith(streamLog_1.STREAM_EXTENSION))
|
|
86
91
|
return undefined;
|
|
87
92
|
const parts = fileName.slice(0, -streamLog_1.STREAM_EXTENSION.length).split("_");
|
|
88
|
-
if (parts
|
|
93
|
+
if (parts[0] !== "stream")
|
|
94
|
+
return undefined;
|
|
95
|
+
if (parts.length !== 3 && parts.length !== 4)
|
|
89
96
|
return undefined;
|
|
90
97
|
const timestamp = parseInt(parts[1], 10);
|
|
91
98
|
if (!Number.isFinite(timestamp))
|
|
92
99
|
return undefined;
|
|
93
|
-
return { fileName, timestamp };
|
|
100
|
+
return { fileName, timestamp, ownerId: parts.length === 4 && parts[2] || undefined };
|
|
101
|
+
}
|
|
102
|
+
function newStreamFileName(ownerId) {
|
|
103
|
+
return `stream_${Date.now()}_${ownerId}_${nextCounter()}${streamLog_1.STREAM_EXTENSION}`;
|
|
94
104
|
}
|
|
95
105
|
// Accept old 3-part (level_timestamp_counter) and new 4-part (level_timestamp_writerId_counter) shapes.
|
|
96
106
|
function parseFileName(fileName) {
|
|
@@ -105,6 +115,16 @@ function parseFileName(fileName) {
|
|
|
105
115
|
return undefined;
|
|
106
116
|
return { fileName, level, timestamp };
|
|
107
117
|
}
|
|
118
|
+
function makeTrigger(config) {
|
|
119
|
+
return { ...config, fraction: config.value / config.threshold, met: config.value >= config.threshold };
|
|
120
|
+
}
|
|
121
|
+
function fmtTriggerValue(value, unit) {
|
|
122
|
+
if (unit === "bytes")
|
|
123
|
+
return fmtBytes(value);
|
|
124
|
+
if (unit === "fraction")
|
|
125
|
+
return `${Math.round(value * 100)}%`;
|
|
126
|
+
return (0, format_1.formatNumber)(value);
|
|
127
|
+
}
|
|
108
128
|
class BulkDatabaseBase {
|
|
109
129
|
constructor(name, deps, storageFactory, config = {}) {
|
|
110
130
|
this.name = name;
|
|
@@ -121,8 +141,7 @@ class BulkDatabaseBase {
|
|
|
121
141
|
// In-process re-entry guard: if a merge is running, additional triggers (visibility timer, writes, tryMergeNow calls) return immediately instead of queueing. Keeps the visibility-timer firings from stacking behind a long merge.
|
|
122
142
|
this.mergeInFlight = false;
|
|
123
143
|
this.lastMergeSkipLogMs = 0;
|
|
124
|
-
// Running
|
|
125
|
-
this.streamRowsOnDisk = 0;
|
|
144
|
+
// Running counter of stream-tier bytes on disk. Seeded from each LoadedIndex build, then incremented per flush so the fold-trigger checks current data without an extra directory listing.
|
|
126
145
|
this.streamBytesOnDisk = 0;
|
|
127
146
|
this.rebuildDirty = false;
|
|
128
147
|
this.rebuildOptions = { dropStaleFallback: false };
|
|
@@ -291,9 +310,39 @@ class BulkDatabaseBase {
|
|
|
291
310
|
async isRemote() {
|
|
292
311
|
return !!(await this.storage()).isRemote;
|
|
293
312
|
}
|
|
313
|
+
// Uncompacted stream bytes have to be read and decoded in full by every reader on every index build, so size alone decides — a fold is worth it even if those bytes are one enormous row.
|
|
294
314
|
streamNeedsFold() {
|
|
295
|
-
return this.
|
|
296
|
-
|
|
315
|
+
return this.streamBytesOnDisk > exports.bulkDatabase2Timing.streamFoldTriggerBytes;
|
|
316
|
+
}
|
|
317
|
+
// Stream files nobody can still be appending to, split by who owned them:
|
|
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.
|
|
320
|
+
//
|
|
321
|
+
// 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
|
+
//
|
|
323
|
+
// 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
|
+
async findAbandonedStreams(streamFiles, assumeSealed) {
|
|
325
|
+
const retirable = new Set();
|
|
326
|
+
const ownerGone = new Set();
|
|
327
|
+
const hasForeignOwner = streamFiles.some(f => f.ownerId && f.ownerId !== writerId && f.ownerId !== MERGE_OUTPUT_OWNER);
|
|
328
|
+
const live = hasForeignOwner && await (0, syncClient_1.queryLiveWriters)(this.name, exports.bulkDatabase2Timing.liveWriterProbeMs) || undefined;
|
|
329
|
+
for (const f of streamFiles) {
|
|
330
|
+
if (f.ownerId === MERGE_OUTPUT_OWNER) {
|
|
331
|
+
retirable.add(f.fileName);
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
// streamFileName is the only "we will append here again" signal - once it moves on, getStreamFileName opens a fresh file and this one is final.
|
|
335
|
+
if (f.ownerId === writerId) {
|
|
336
|
+
if (assumeSealed || f.fileName !== this.streamFileName)
|
|
337
|
+
retirable.add(f.fileName);
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
if (!f.ownerId || live && !live.has(f.ownerId)) {
|
|
341
|
+
retirable.add(f.fileName);
|
|
342
|
+
ownerGone.add(f.fileName);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return { retirable, ownerGone };
|
|
297
346
|
}
|
|
298
347
|
async automaticCompactionAllowed() {
|
|
299
348
|
if (networkCompactionEnabled)
|
|
@@ -350,7 +399,6 @@ class BulkDatabaseBase {
|
|
|
350
399
|
});
|
|
351
400
|
const oldIndex = this.reader.index;
|
|
352
401
|
this.reader.setIndex(newIndex, { dropStaleFallback: this.rebuildOptions.dropStaleFallback });
|
|
353
|
-
this.streamRowsOnDisk = newIndex.streamRowsOnDisk;
|
|
354
402
|
this.streamBytesOnDisk = newIndex.streamBytesOnDisk;
|
|
355
403
|
if (oldIndex) {
|
|
356
404
|
for (const f of oldIndex.fileSet) {
|
|
@@ -434,7 +482,7 @@ class BulkDatabaseBase {
|
|
|
434
482
|
});
|
|
435
483
|
for (const { time, row } of stamped)
|
|
436
484
|
(0, syncClient_1.broadcast)(this.name, { key: row.key, time, value: row });
|
|
437
|
-
await this.streamAppend(framed
|
|
485
|
+
await this.streamAppend(framed);
|
|
438
486
|
void this.maybeMerge({ onlyIfStreamHeavy: true });
|
|
439
487
|
}
|
|
440
488
|
async delete(key) {
|
|
@@ -451,12 +499,12 @@ class BulkDatabaseBase {
|
|
|
451
499
|
});
|
|
452
500
|
for (const { time, key } of stamped)
|
|
453
501
|
(0, syncClient_1.broadcast)(this.name, { key, time, deleted: true });
|
|
454
|
-
await this.streamAppend((0, streamLog_1.frameDeletes)(stamped)
|
|
502
|
+
await this.streamAppend((0, streamLog_1.frameDeletes)(stamped));
|
|
455
503
|
void this.maybeMerge({ onlyIfStreamHeavy: true });
|
|
456
504
|
}
|
|
457
505
|
// Coalesce stream appends on a ramping per-collection schedule (the browser rewrites the whole file per append). The first write after a lull flushes immediately so a single edit-then-close is saved at once; sustained writes ramp toward writeFlushMaxDelayMs.
|
|
458
|
-
async streamAppend(framed
|
|
459
|
-
this.pendingAppends.push(
|
|
506
|
+
async streamAppend(framed) {
|
|
507
|
+
this.pendingAppends.push(framed);
|
|
460
508
|
const max = exports.bulkDatabase2Timing.writeFlushMaxDelayMs;
|
|
461
509
|
const now = Date.now();
|
|
462
510
|
if (max <= 0 || this.currentFlushDelay <= 0 || now - this.lastWriteTime > max) {
|
|
@@ -488,7 +536,7 @@ class BulkDatabaseBase {
|
|
|
488
536
|
if (!this.pendingAppends.length)
|
|
489
537
|
return;
|
|
490
538
|
const batch = this.pendingAppends.slice();
|
|
491
|
-
const combined = Buffer.concat(batch
|
|
539
|
+
const combined = Buffer.concat(batch);
|
|
492
540
|
const storage = await this.storage();
|
|
493
541
|
const fileName = this.getStreamFileName();
|
|
494
542
|
if (fileName !== this.currentStreamFileName) {
|
|
@@ -500,8 +548,6 @@ class BulkDatabaseBase {
|
|
|
500
548
|
// New entries appended during the await are after `batch` — removing the front is exactly the flushed set.
|
|
501
549
|
this.pendingAppends.splice(0, batch.length);
|
|
502
550
|
this.streamBytesOnDisk += combined.length;
|
|
503
|
-
for (const p of batch)
|
|
504
|
-
this.streamRowsOnDisk += p.rows;
|
|
505
551
|
this.currentStreamFileBytes += combined.length;
|
|
506
552
|
if (this.currentStreamFileBytes >= exports.bulkDatabase2Timing.streamFileMaxBytes) {
|
|
507
553
|
this.streamFileName = undefined;
|
|
@@ -518,7 +564,7 @@ class BulkDatabaseBase {
|
|
|
518
564
|
this.streamFileName = undefined;
|
|
519
565
|
}
|
|
520
566
|
if (!this.streamFileName) {
|
|
521
|
-
this.streamFileName =
|
|
567
|
+
this.streamFileName = newStreamFileName(writerId);
|
|
522
568
|
}
|
|
523
569
|
return this.streamFileName;
|
|
524
570
|
}
|
|
@@ -763,10 +809,19 @@ class BulkDatabaseBase {
|
|
|
763
809
|
const streamData = await (0, LoadedIndex_1.loadStreamEntries)(this.name, storage, streamFiles, this.subCaches.stream);
|
|
764
810
|
const ordered = (0, LoadedIndex_1.orderStreamEntries)(streamData.entries);
|
|
765
811
|
const streamReader = ordered.length ? (0, streamLog_1.streamReaderFromEntries)(ordered, 0).reader : undefined;
|
|
812
|
+
// 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 { retirable: retirableStreams } = await this.findAbandonedStreams(streamFiles, false);
|
|
814
|
+
const contributingStreams = new Set(streamData.entries.map(e => e.fileName));
|
|
815
|
+
const emptyAbandoned = streamFiles.filter(f => retirableStreams.has(f.fileName) && !contributingStreams.has(f.fileName)).map(f => f.fileName);
|
|
816
|
+
if (emptyAbandoned.length)
|
|
817
|
+
await (0, mergeMarkers_1.writeDeleteMarker)(storage, { deleteFiles: emptyAbandoned, replacedBy: [] });
|
|
766
818
|
const readers = streamReader ? [streamReader, ...bulkReaders] : bulkReaders;
|
|
767
819
|
const readerNames = streamReader ? ["(streams)", ...consumedBulk.map(f => f.fileName)] : consumedBulk.map(f => f.fileName);
|
|
768
|
-
if (!readers.length)
|
|
769
|
-
|
|
820
|
+
if (!readers.length) {
|
|
821
|
+
if (emptyAbandoned.length)
|
|
822
|
+
await this.triggerRebuild();
|
|
823
|
+
return emptyAbandoned.length > 0;
|
|
824
|
+
}
|
|
770
825
|
const inputs = [
|
|
771
826
|
...await Promise.all(consumedBulk.map(async (f) => { var _a, _b; return ({ name: f.fileName, size: (_b = (_a = (await storage.getInfo(f.fileName).catch(() => undefined))) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : 0 }); })),
|
|
772
827
|
...streamFiles.map(f => { var _a; return ({ name: f.fileName, size: (_a = streamData.sizes.get(f.fileName)) !== null && _a !== void 0 ? _a : 0 }); }),
|
|
@@ -806,7 +861,7 @@ class BulkDatabaseBase {
|
|
|
806
861
|
const carriedDeletes = includesOldest ? 0 : mergeResult.carriedDeletes.size;
|
|
807
862
|
const outNames = [...newNames];
|
|
808
863
|
if (carriedDeletes) {
|
|
809
|
-
const carryName =
|
|
864
|
+
const carryName = newStreamFileName(MERGE_OUTPUT_OWNER);
|
|
810
865
|
await storage.set(carryName, (0, streamLog_1.frameDeletes)([...mergeResult.carriedDeletes].map(([key, time]) => ({ time, key }))));
|
|
811
866
|
outNames.push(carryName);
|
|
812
867
|
}
|
|
@@ -823,6 +878,10 @@ class BulkDatabaseBase {
|
|
|
823
878
|
// A stream may still be appended to after we read it (the writer hasn't sealed/moved on); only retire streams canDeleteStream clears — the rest stay live and a later merge re-folds them once sealed. Bulk files are immutable, so a used one is always safe to retire.
|
|
824
879
|
const deletableStreams = [];
|
|
825
880
|
for (const f of usedStreamFiles) {
|
|
881
|
+
if (retirableStreams.has(f.fileName)) {
|
|
882
|
+
deletableStreams.push(f.fileName);
|
|
883
|
+
continue;
|
|
884
|
+
}
|
|
826
885
|
if (await this.canDeleteStream(f, Date.now(), streamData.sizes, forceDeleteStreams))
|
|
827
886
|
deletableStreams.push(f.fileName);
|
|
828
887
|
}
|
|
@@ -866,139 +925,30 @@ class BulkDatabaseBase {
|
|
|
866
925
|
}
|
|
867
926
|
return true;
|
|
868
927
|
}
|
|
869
|
-
//
|
|
870
|
-
//
|
|
871
|
-
//
|
|
872
|
-
async
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
const
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
{
|
|
885
|
-
const { streamFiles } = await this.listFiles();
|
|
886
|
-
if (streamFiles.length) {
|
|
887
|
-
const storage = await this.storage();
|
|
888
|
-
const sizes = await Promise.all(streamFiles.map(async (f) => { var _a, _b; try {
|
|
889
|
-
return (_b = (_a = (await storage.getInfo(f.fileName))) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : 0;
|
|
890
|
-
}
|
|
891
|
-
catch (_c) {
|
|
892
|
-
return 0;
|
|
893
|
-
} }));
|
|
894
|
-
const totalStreamBytes = sizes.reduce((a, b) => a + b, 0);
|
|
895
|
-
if (totalStreamBytes > exports.bulkDatabase2Timing.streamFoldHardLimitBytes) {
|
|
896
|
-
console.log(`${(0, logColors_1.blue)(this.name)} ${(0, logColors_1.magenta)("fold")} stream tier ${fmtBytes(totalStreamBytes)} over hard limit ${fmtBytes(exports.bulkDatabase2Timing.streamFoldHardLimitBytes)} - folding all streams now`);
|
|
897
|
-
if (await this.mergeFileSet([], streamFiles, false, true))
|
|
898
|
-
merged = true;
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
// Pass 1: consolidate recent. Only seal when cross-tab sync can fold recent streams — in Node canDeleteStream needs them aged anyway, so sealing would just fragment streams every pass.
|
|
903
|
-
const foldRecentStreams = (0, syncClient_1.isSyncSupported)();
|
|
904
|
-
if (foldRecentStreams) {
|
|
905
|
-
(0, syncClient_1.broadcastSeal)(this.name);
|
|
906
|
-
this.streamFileName = undefined;
|
|
907
|
-
}
|
|
908
|
-
{
|
|
909
|
-
const { bulkFiles, streamFiles } = await this.listFiles();
|
|
910
|
-
const bulkMeta = await Promise.all(bulkFiles.map(async (f) => {
|
|
911
|
-
const [size, header] = await Promise.all([this.fileLogicalSize(f.fileName), this.readBulkHeader(f.fileName)]);
|
|
912
|
-
return { kind: "bulk", file: f, bytes: size !== null && size !== void 0 ? size : 0, time: (header === null || header === void 0 ? void 0 : header.maxTime) || f.timestamp };
|
|
913
|
-
}));
|
|
914
|
-
const streamMeta = [];
|
|
915
|
-
for (const f of streamFiles) {
|
|
916
|
-
const aged = Date.now() - f.timestamp >= exports.bulkDatabase2Timing.streamSealAgeMs;
|
|
917
|
-
if (!foldRecentStreams && !aged)
|
|
918
|
-
continue;
|
|
919
|
-
let bytes = 0;
|
|
920
|
-
try {
|
|
921
|
-
const info = await (await this.storage()).getInfo(f.fileName);
|
|
922
|
-
bytes = (_a = info === null || info === void 0 ? void 0 : info.size) !== null && _a !== void 0 ? _a : 0;
|
|
923
|
-
}
|
|
924
|
-
catch (_b) {
|
|
925
|
-
bytes = 0;
|
|
926
|
-
}
|
|
927
|
-
streamMeta.push({ kind: "stream", file: f, bytes, time: f.timestamp });
|
|
928
|
-
}
|
|
929
|
-
const items = [...bulkMeta, ...streamMeta].sort((a, b) => b.time - a.time);
|
|
930
|
-
const recent = [];
|
|
931
|
-
let recentBytes = 0;
|
|
932
|
-
for (const it of items) {
|
|
933
|
-
recent.push(it);
|
|
934
|
-
recentBytes += it.bytes;
|
|
935
|
-
if (recentBytes >= FIRST_MERGE_BYTES)
|
|
936
|
-
break;
|
|
937
|
-
}
|
|
938
|
-
const span = recent.length ? recent[0].time - recent[recent.length - 1].time : 0;
|
|
939
|
-
const recentStreamBytes = recent.reduce((a, it) => a + (it.kind === "stream" ? it.bytes : 0), 0);
|
|
940
|
-
const heavyStream = recentStreamBytes > exports.bulkDatabase2Timing.streamFoldTriggerBytes;
|
|
941
|
-
const triggered = recent.length >= 2 && (recent.length > exports.bulkDatabase2Timing.firstMergeTriggerFiles || span > exports.bulkDatabase2Timing.firstMergeTriggerRangeMs)
|
|
942
|
-
|| heavyStream;
|
|
943
|
-
if (triggered) {
|
|
944
|
-
const rb = recent.filter(i => i.kind === "bulk").map(i => i.file);
|
|
945
|
-
const rs = recent.filter(i => i.kind === "stream").map(i => i.file);
|
|
946
|
-
if (!await runMerge(rb, rs))
|
|
947
|
-
return merged;
|
|
948
|
-
}
|
|
949
|
-
}
|
|
950
|
-
// Whole-tier dedup short-circuit (between Pass 1 and the per-group Pass 2): when the bulk tier is big enough AND mostly duplicates, fold every bulk file in one merge. Avoids the per-group walk's 5-min spacing × N-groups latency.
|
|
951
|
-
{
|
|
952
|
-
const { bulkFiles } = await this.listFiles();
|
|
953
|
-
if (bulkFiles.length >= 2) {
|
|
954
|
-
const storage = await this.storage();
|
|
955
|
-
let totalBytes = 0;
|
|
956
|
-
let totalSlots = 0;
|
|
957
|
-
const uniqueKeys = new Set();
|
|
958
|
-
for (const f of bulkFiles) {
|
|
959
|
-
try {
|
|
960
|
-
const reader = await (0, LoadedIndex_1.loadFileReader)(this.name, storage, f, this.subCaches.bulk);
|
|
961
|
-
totalBytes += reader.totalBytes;
|
|
962
|
-
totalSlots += reader.keys.length;
|
|
963
|
-
for (const k of reader.keys)
|
|
964
|
-
uniqueKeys.add(k);
|
|
965
|
-
}
|
|
966
|
-
catch ( /* skip unreadable */_c) { /* skip unreadable */ }
|
|
967
|
-
}
|
|
968
|
-
const dupFraction = totalSlots ? (totalSlots - uniqueKeys.size) / totalSlots : 0;
|
|
969
|
-
if (totalBytes > DEDUP_TRIGGER_BYTES && dupFraction > DEDUP_TRIGGER_FRACTION) {
|
|
970
|
-
console.log(`${(0, logColors_1.blue)(this.name)} ${(0, logColors_1.magenta)("dedup")}: ${fmtBytes(totalBytes)} across ${bulkFiles.length} bulk file(s), ${Math.round(dupFraction * 100)}% duplicate key-slots - folding all at once`);
|
|
971
|
-
if (!await runMerge(bulkFiles, []))
|
|
972
|
-
return merged;
|
|
973
|
-
return merged;
|
|
974
|
-
}
|
|
975
|
-
}
|
|
976
|
-
}
|
|
977
|
-
// Pass 2: key-stratified deduplication. Disjoint key ranges → one group's merge doesn't change another's duplication; re-select each group's files at merge time (set shifts).
|
|
978
|
-
const groups = await this.findDuplicateGroups();
|
|
979
|
-
for (const g of groups) {
|
|
980
|
-
const { bulkFiles } = await this.listFiles();
|
|
981
|
-
const headers = await Promise.all(bulkFiles.map(f => this.readBulkHeader(f.fileName)));
|
|
982
|
-
const groupFiles = bulkFiles.filter((f, i) => {
|
|
983
|
-
const h = headers[i];
|
|
984
|
-
if (!h)
|
|
985
|
-
return false;
|
|
986
|
-
if (h.minKey === undefined || h.maxKey === undefined)
|
|
987
|
-
return true;
|
|
988
|
-
return h.minKey <= g.hi && h.maxKey >= g.lo;
|
|
989
|
-
});
|
|
990
|
-
if (groupFiles.length >= 2) {
|
|
991
|
-
if (!await runMerge(groupFiles, []))
|
|
992
|
-
return merged;
|
|
928
|
+
// Splits the bulk tier the way the merge writer does. A merge cuts an output file once it reaches TARGET_FILE_BYTES, so only its LAST output can be under that — meaning a sub-target file is either a single stream fold or the tail of an earlier merge, and is still waiting to be rolled up ("loose"). Anything at or over the target is done growing ("combined") and only phase 3 touches it again.
|
|
929
|
+
//
|
|
930
|
+
// 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
|
+
async splitBulkTier(bulkFiles) {
|
|
932
|
+
const logicalSizes = await Promise.all(bulkFiles.map(f => this.fileLogicalSize(f.fileName)));
|
|
933
|
+
const loose = [];
|
|
934
|
+
const combined = [];
|
|
935
|
+
const sizes = new Map();
|
|
936
|
+
let looseBytes = 0;
|
|
937
|
+
for (let i = 0; i < bulkFiles.length; i++) {
|
|
938
|
+
const bytes = logicalSizes[i];
|
|
939
|
+
sizes.set(bulkFiles[i].fileName, bytes !== null && bytes !== void 0 ? bytes : 0);
|
|
940
|
+
if (bytes === undefined || bytes >= BulkDatabaseFormat_1.TARGET_FILE_BYTES) {
|
|
941
|
+
combined.push(bulkFiles[i]);
|
|
942
|
+
continue;
|
|
993
943
|
}
|
|
944
|
+
loose.push(bulkFiles[i]);
|
|
945
|
+
looseBytes += bytes;
|
|
994
946
|
}
|
|
995
|
-
return
|
|
947
|
+
return { loose, looseBytes, combined, sizes };
|
|
996
948
|
}
|
|
997
|
-
|
|
949
|
+
// One walk of the combined tier's key lists, producing both of phase 3's inputs: the whole-tier duplicate fraction, and the per-key-range groups. Combined into one pass because walking every file's keys is the most expensive thing a merge pass does that isn't a merge, and both answers come from the same key counts.
|
|
950
|
+
async analyzeDuplicates(bulkFiles) {
|
|
998
951
|
var _a;
|
|
999
|
-
const { bulkFiles } = await this.listFiles();
|
|
1000
|
-
if (bulkFiles.length < 2)
|
|
1001
|
-
return [];
|
|
1002
952
|
const storage = await this.storage();
|
|
1003
953
|
const infos = await Promise.all(bulkFiles.map(async (f) => {
|
|
1004
954
|
try {
|
|
@@ -1018,8 +968,8 @@ class BulkDatabaseBase {
|
|
|
1018
968
|
totalSlots++;
|
|
1019
969
|
}
|
|
1020
970
|
}
|
|
1021
|
-
if (totalSlots
|
|
1022
|
-
return [];
|
|
971
|
+
if (!totalSlots)
|
|
972
|
+
return { dupFraction: 0, groups: [] };
|
|
1023
973
|
const bytesPerSlot = totalBytes / totalSlots;
|
|
1024
974
|
const sortedKeys = [...keyCount.keys()].sort();
|
|
1025
975
|
const groups = [];
|
|
@@ -1030,17 +980,162 @@ class BulkDatabaseBase {
|
|
|
1030
980
|
gSlots += c;
|
|
1031
981
|
gUnique += 1;
|
|
1032
982
|
if (gBytes >= KEY_GROUP_BYTES || i === sortedKeys.length - 1) {
|
|
1033
|
-
|
|
1034
|
-
if (dup > DUP_THRESHOLD)
|
|
1035
|
-
groups.push({ lo: sortedKeys[gStart], hi: sortedKeys[i], dup });
|
|
983
|
+
groups.push({ lo: sortedKeys[gStart], hi: sortedKeys[i], dup: (gSlots - gUnique) / gSlots });
|
|
1036
984
|
gStart = i + 1;
|
|
1037
985
|
gBytes = 0;
|
|
1038
986
|
gSlots = 0;
|
|
1039
987
|
gUnique = 0;
|
|
1040
988
|
}
|
|
1041
989
|
}
|
|
1042
|
-
|
|
1043
|
-
return groups;
|
|
990
|
+
(0, misc_1.sort)(groups, g => -g.dup);
|
|
991
|
+
return { dupFraction: (totalSlots - keyCount.size) / totalSlots, groups };
|
|
992
|
+
}
|
|
993
|
+
// Which files a key-group step rewrites. Re-run at merge time as well as at plan time: groups are disjoint by KEY range, not by file, so an earlier step in the same pass can consume a file this range still lists.
|
|
994
|
+
async filesForKeyRange(bulkFiles, keyRange) {
|
|
995
|
+
const headers = await Promise.all(bulkFiles.map(f => this.readBulkHeader(f.fileName)));
|
|
996
|
+
return bulkFiles.filter((f, i) => {
|
|
997
|
+
const h = headers[i];
|
|
998
|
+
if (!h)
|
|
999
|
+
return false;
|
|
1000
|
+
if (h.minKey === undefined || h.maxKey === undefined)
|
|
1001
|
+
return true;
|
|
1002
|
+
return h.minKey <= keyRange.hi && h.maxKey >= keyRange.lo;
|
|
1003
|
+
});
|
|
1004
|
+
}
|
|
1005
|
+
/**
|
|
1006
|
+
* Every compaction the files on disk currently call for, without performing any of them. A merge pass
|
|
1007
|
+
* builds exactly this and then runs the steps whose `ready` is true, so the plan is precisely what the
|
|
1008
|
+
* database is about to do — and a step that isn't ready still reports its `triggers`, so a caller can
|
|
1009
|
+
* see how close it is (50MB of stream data out of the 64MB that would fold it, and so on).
|
|
1010
|
+
*
|
|
1011
|
+
* O(total keys): the phase 3 steps need every combined file's key list walked.
|
|
1012
|
+
*/
|
|
1013
|
+
async planCompaction() {
|
|
1014
|
+
const time = Date.now();
|
|
1015
|
+
const steps = [];
|
|
1016
|
+
const storage = await this.storage();
|
|
1017
|
+
const { bulkFiles, streamFiles } = await this.listFiles();
|
|
1018
|
+
const streamSizes = new Map();
|
|
1019
|
+
await Promise.all(streamFiles.map(async (f) => {
|
|
1020
|
+
var _a, _b;
|
|
1021
|
+
try {
|
|
1022
|
+
streamSizes.set(f.fileName, (_b = (_a = (await storage.getInfo(f.fileName))) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : 0);
|
|
1023
|
+
}
|
|
1024
|
+
catch (_c) {
|
|
1025
|
+
streamSizes.set(f.fileName, 0);
|
|
1026
|
+
}
|
|
1027
|
+
}));
|
|
1028
|
+
const streamBytes = (files) => files.reduce((a, f) => { var _a; return a + ((_a = streamSizes.get(f.fileName)) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
1029
|
+
// ── Phase 1: stream -> bulk ──────────────────────────────────────────────────────────────────
|
|
1030
|
+
// The ENTIRE stream tier is parsed into memory and held there (subCaches.stream keeps every decoded entry) just to build the index, so it is the biggest single lever on our heap - a fold turns it into a bulk file we only read an index of. Folds streams and nothing else: no bulk file is dragged in, so the work is proportional to the memory reclaimed.
|
|
1031
|
+
const hardLimit = makeTrigger({ name: "streamBytes", value: streamBytes(streamFiles), threshold: exports.bulkDatabase2Timing.streamFoldHardLimitBytes, unit: "bytes" });
|
|
1032
|
+
// Past the hard limit every read pulls an enormous file, so fold the whole tier regardless of who owns what. mergeFileSet force-deletes for this one; canDeleteStream still requires size-stability, so an active writer never loses data.
|
|
1033
|
+
steps.push({
|
|
1034
|
+
phase: 1, kind: "streamHardLimit", requires: "all", triggers: [hardLimit],
|
|
1035
|
+
ready: hardLimit.met && streamFiles.length > 0,
|
|
1036
|
+
bulkFiles: [], streamFiles, bytes: hardLimit.value,
|
|
1037
|
+
});
|
|
1038
|
+
// 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 { retirable, ownerGone } = await this.findAbandonedStreams(streamFiles, (0, syncClient_1.isSyncSupported)());
|
|
1040
|
+
// 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
|
+
// 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
|
+
const foldable = streamFiles.filter(f => f.ownerId !== MERGE_OUTPUT_OWNER
|
|
1043
|
+
&& (retirable.has(f.fileName) || time - f.timestamp >= exports.bulkDatabase2Timing.streamSealAgeMs));
|
|
1044
|
+
// 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
|
+
const carry = streamFiles.filter(f => f.ownerId === MERGE_OUTPUT_OWNER);
|
|
1046
|
+
// A stream whose writer is gone will never grow and nothing else will ever fold it, so fold it at any size - even one row. Zero-byte ones don't count: they hold no data to fold, and mergeFileSetInner retires them directly.
|
|
1047
|
+
const abandoned = foldable.filter(f => ownerGone.has(f.fileName) && streamSizes.get(f.fileName));
|
|
1048
|
+
const foldTriggers = [
|
|
1049
|
+
makeTrigger({ name: "foldableBytes", value: streamBytes(foldable), threshold: exports.bulkDatabase2Timing.streamFoldTriggerBytes, unit: "bytes" }),
|
|
1050
|
+
makeTrigger({ name: "abandonedFiles", value: abandoned.length, threshold: 1, unit: "count" }),
|
|
1051
|
+
];
|
|
1052
|
+
steps.push({
|
|
1053
|
+
phase: 1, kind: "streamFold", requires: "any", triggers: foldTriggers,
|
|
1054
|
+
// Skipped when the hard limit already folds everything this would have.
|
|
1055
|
+
ready: !hardLimit.met && foldTriggers.some(t => t.met),
|
|
1056
|
+
bulkFiles: [], streamFiles: [...foldable, ...carry], bytes: streamBytes([...foldable, ...carry]),
|
|
1057
|
+
});
|
|
1058
|
+
// ── 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, because a merge cuts every output but the last at TARGET_FILE_BYTES, so one pass can leave at most one loose file behind.
|
|
1060
|
+
const { loose, looseBytes, combined, sizes } = await this.splitBulkTier(bulkFiles);
|
|
1061
|
+
const looseTriggers = [
|
|
1062
|
+
makeTrigger({ name: "looseBytes", value: looseBytes, threshold: exports.bulkDatabase2Timing.looseBulkTriggerBytes, unit: "bytes" }),
|
|
1063
|
+
makeTrigger({ name: "looseFiles", value: loose.length, threshold: exports.bulkDatabase2Timing.looseBulkTriggerFiles, unit: "count" }),
|
|
1064
|
+
];
|
|
1065
|
+
steps.push({
|
|
1066
|
+
phase: 2, kind: "looseCombine", requires: "any", triggers: looseTriggers,
|
|
1067
|
+
// Under two files there is nothing to combine, and rewriting one file into an identical one would re-trigger forever.
|
|
1068
|
+
ready: loose.length >= 2 && looseTriggers.some(t => t.met),
|
|
1069
|
+
bulkFiles: loose, streamFiles: [], bytes: looseBytes,
|
|
1070
|
+
});
|
|
1071
|
+
// ── Phase 3: dedup the combined files ────────────────────────────────────────────────────────
|
|
1072
|
+
// Loose files are excluded throughout: phase 2 rewrites them anyway, and that rewrite already dedupes them, so pulling one in here would do the same work twice at key-group scale.
|
|
1073
|
+
const combinedBytes = combined.reduce((a, f) => { var _a; return a + ((_a = sizes.get(f.fileName)) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
1074
|
+
const { dupFraction, groups } = await this.analyzeDuplicates(combined);
|
|
1075
|
+
// Whole-tier short-circuit: when the combined tier is big enough AND mostly duplicates, fold all of it in one merge rather than paying the per-group walk's 5-min spacing x N groups.
|
|
1076
|
+
const dedupAllTriggers = [
|
|
1077
|
+
makeTrigger({ name: "combinedBytes", value: combinedBytes, threshold: DEDUP_TRIGGER_BYTES, unit: "bytes" }),
|
|
1078
|
+
makeTrigger({ name: "duplicateFraction", value: dupFraction, threshold: DEDUP_TRIGGER_FRACTION, unit: "fraction" }),
|
|
1079
|
+
];
|
|
1080
|
+
const dedupAllReady = combined.length >= 2 && dedupAllTriggers.every(t => t.met);
|
|
1081
|
+
steps.push({
|
|
1082
|
+
phase: 3, kind: "dedupAll", requires: "all", triggers: dedupAllTriggers,
|
|
1083
|
+
ready: dedupAllReady,
|
|
1084
|
+
bulkFiles: combined, streamFiles: [], bytes: combinedBytes,
|
|
1085
|
+
});
|
|
1086
|
+
// Then key-stratified: disjoint key ranges, so one group's merge doesn't change another's duplication. Only groups over the threshold are worth a step; the best one below it is listed anyway so a caller can see how close the tier is.
|
|
1087
|
+
const groupSteps = groups.filter(g => g.dup >= DUP_THRESHOLD);
|
|
1088
|
+
if (!groupSteps.length && groups.length)
|
|
1089
|
+
groupSteps.push(groups[0]);
|
|
1090
|
+
for (const g of groupSteps) {
|
|
1091
|
+
const groupFiles = await this.filesForKeyRange(combined, g);
|
|
1092
|
+
const dup = makeTrigger({ name: "duplicateFraction", value: g.dup, threshold: DUP_THRESHOLD, unit: "fraction" });
|
|
1093
|
+
steps.push({
|
|
1094
|
+
phase: 3, kind: "dedupKeyGroup", requires: "all", triggers: [dup],
|
|
1095
|
+
// Moot if the whole tier is about to be folded in one go.
|
|
1096
|
+
ready: !dedupAllReady && dup.met && groupFiles.length >= 2,
|
|
1097
|
+
bulkFiles: groupFiles, streamFiles: [], bytes: groupFiles.reduce((a, f) => { var _a; return a + ((_a = sizes.get(f.fileName)) !== null && _a !== void 0 ? _a : 0); }, 0),
|
|
1098
|
+
keyRange: { lo: g.lo, hi: g.hi },
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
// Merges are spaced mergeSpacingMs apart, and the first one runs immediately.
|
|
1102
|
+
let readyCount = 0;
|
|
1103
|
+
for (const step of steps) {
|
|
1104
|
+
if (!step.ready)
|
|
1105
|
+
continue;
|
|
1106
|
+
step.startTime = time + readyCount * exports.bulkDatabase2Timing.mergeSpacingMs;
|
|
1107
|
+
readyCount++;
|
|
1108
|
+
}
|
|
1109
|
+
return { collection: this.name, time, steps };
|
|
1110
|
+
}
|
|
1111
|
+
// Runs the compaction plan: builds it, then performs every step it marks ready, in order. All the deciding lives in planCompaction - this only executes, so what the database does and what planCompaction reports can never drift apart.
|
|
1112
|
+
async testMergeINTERNAL_DO_NOT_CALL() {
|
|
1113
|
+
let merged = false;
|
|
1114
|
+
await this.flushPending();
|
|
1115
|
+
// Seal before planning, so every writer's current stream file is final and the plan can count it as foldable. Only when cross-tab sync is there to carry the seal - in Node canDeleteStream needs streams aged anyway, so sealing would just fragment them every pass.
|
|
1116
|
+
if ((0, syncClient_1.isSyncSupported)()) {
|
|
1117
|
+
(0, syncClient_1.broadcastSeal)(this.name);
|
|
1118
|
+
this.streamFileName = undefined;
|
|
1119
|
+
}
|
|
1120
|
+
const plan = await this.planCompaction();
|
|
1121
|
+
for (const step of plan.steps) {
|
|
1122
|
+
if (!step.ready)
|
|
1123
|
+
continue;
|
|
1124
|
+
let bulkFiles = step.bulkFiles;
|
|
1125
|
+
if (step.keyRange) {
|
|
1126
|
+
bulkFiles = await this.filesForKeyRange(bulkFiles, step.keyRange);
|
|
1127
|
+
if (bulkFiles.length < 2)
|
|
1128
|
+
continue;
|
|
1129
|
+
}
|
|
1130
|
+
const why = step.triggers.filter(t => t.met)
|
|
1131
|
+
.map(t => `${t.name} ${fmtTriggerValue(t.value, t.unit)} of ${fmtTriggerValue(t.threshold, t.unit)}`).join(", ");
|
|
1132
|
+
console.log(`${(0, logColors_1.blue)(this.name)} ${(0, logColors_1.magenta)(step.kind)} phase ${step.phase}: ${bulkFiles.length} bulk + ${step.streamFiles.length} stream file(s), ${fmtBytes(step.bytes)} - ${why}`);
|
|
1133
|
+
if (merged && !await this.mergeSpacingDelay())
|
|
1134
|
+
return merged;
|
|
1135
|
+
if (await this.mergeFileSet(bulkFiles, step.streamFiles, false, step.kind === "streamHardLimit"))
|
|
1136
|
+
merged = true;
|
|
1137
|
+
}
|
|
1138
|
+
return merged;
|
|
1044
1139
|
}
|
|
1045
1140
|
// ── reads — forwarded to BulkDatabaseReader, with rebuild-on-missing retry ───────────────────────
|
|
1046
1141
|
async getSingleField(key, column) {
|
|
@@ -1175,5 +1270,5 @@ exports.BulkDatabaseBase = BulkDatabaseBase;
|
|
|
1175
1270
|
BulkDatabaseBase.liveInstances = new Set();
|
|
1176
1271
|
BulkDatabaseBase.memoryWatchdogStarted = false;
|
|
1177
1272
|
BulkDatabaseBase.lastMemoryFlushMs = 0;
|
|
1178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsa0RhdGFiYXNlQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkJ1bGtEYXRhYmFzZUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWtFO0FBQ2xFLDJEQUEyRDtBQUMzRCxtREFBeUQ7QUFDekQseURBQW1EO0FBQ25ELDZDQUFxQztBQUVyQyw2REFNOEI7QUFDOUIsMkRBQXNEO0FBQ3RELDZDQUFrRTtBQUNsRSxrRUFBaUY7QUFDakYsd0VBQXlFO0FBQ3pFLDJDQUFpRztBQUNqRyw2Q0FBb0o7QUFDcEosaURBQXlDO0FBQ3pDLDJDQUFpTTtBQUNqTSxpREFBOEc7QUFDOUcsK0NBVXVCO0FBQ3ZCLDZEQUFvRTtBQUV2RCxRQUFBLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQ2pELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLGlCQUFpQixHQUFHLHNDQUFpQixHQUFHLENBQUMsQ0FBQztBQUNoRCxNQUFNLGVBQWUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsb1JBQW9SO0FBQ3BSLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFDdEMsMExBQTBMO0FBQzFM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NUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVsQyxNQUFNLE1BQU0sR0FBRztZQUNYLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFLGVBQUMsT0FBQSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQUEsTUFBQSxDQUFDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLDBDQUFFLElBQUksbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQztZQUN0SixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBQyxPQUFBLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBQSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUEsRUFBQSxDQUFDO1NBQy9GLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLDBFQUEwRTtRQUMxRSx1RUFBdUU7UUFDdkUsZ0VBQWdFO1FBQ2hFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQiwwTEFBMEw7UUFDMUwsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksYUFBYSxHQUFHLEdBQUcsSUFBQSxnQkFBSSxFQUFDLElBQUEsbUJBQVUsRUFBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwRSwrTUFBK007WUFDL00sT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDckIsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLEdBQUcsSUFBQSxtQkFBTyxFQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWhGLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsbUNBQWUsRUFBQztZQUN0QyxPQUFPLEVBQUUsT0FBTztZQUNoQixXQUFXLEVBQUUsV0FBVztZQUN4QixjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDekIsR0FBRztZQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7O2dCQUN0QixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBQSxtQ0FBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixNQUFNLElBQUksR0FBRyxNQUFBLE1BQUEsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLDBDQUFFLElBQUksbUNBQUksQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQzVFLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyw0QkFBZ0IsRUFBRSxDQUFDO1lBQ3ZHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBQSx3QkFBWSxFQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsSCxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUUsZUFBQyxPQUFBLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFBLE1BQUEsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLDBDQUFFLElBQUksbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQyxDQUFDO1FBQzlJLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxHQUFHLENBQUMsR0FBRyxJQUFBLG1CQUFPLEVBQUMsT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDLE1BQU0sb0JBQW9CLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssY0FBYyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVySixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFBLG1CQUFPLEVBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLGNBQWMsSUFBQSxtQkFBVSxFQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0wsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO1lBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFbkIsd05BQXdOO1FBQ3hOLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3SSx5UUFBeVE7UUFDelEsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM5QixJQUFJLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUM7Z0JBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzSCxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFFcEYsbVZBQW1WO1FBQ25WLElBQUksV0FBVyxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUEsZ0NBQWlCLEVBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRWhHLDBMQUEwTDtRQUMxTCxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QixPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHFTQUFxUztJQUM3UixLQUFLLENBQUMsZUFBZSxDQUFDLENBQWlCLEVBQUUsR0FBVyxFQUFFLEtBQTBCLEVBQUUsS0FBSyxHQUFHLEtBQUs7UUFDbkcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSwyQkFBbUIsQ0FBQyxlQUFlO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUUsSUFBSSxDQUFDLElBQUEsNEJBQWUsR0FBRSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksUUFBUSxLQUFLLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQztRQUNULElBQUksQ0FBQztZQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUFDLE9BQU8sS0FBSyxDQUFDO1FBQUMsQ0FBQztRQUN4RixPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUI7UUFDM0IsTUFBTSxLQUFLLEdBQUcsMkJBQW1CLENBQUMsY0FBYyxDQUFDO1FBQ2pELElBQUksS0FBSyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUEsK0JBQW1CLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRSxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE9BQU8sTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsTUFBTSxJQUFJLElBQUksQ0FBQztZQUNmLElBQUksQ0FBQyxJQUFBLCtCQUFtQixFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELDJKQUEySjtJQUMzSixxS0FBcUs7SUFDN0osS0FBSyxDQUFDLDZCQUE2Qjs7UUFDdkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxJQUFvQixFQUFFLE1BQXdCLEVBQW9CLEVBQUU7WUFDeEYsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM1RCxJQUFJLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBRUYsZ01BQWdNO1FBQ2hNLENBQUM7WUFDRyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0MsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUUsZUFBRyxJQUFJLENBQUM7b0JBQUMsT0FBTyxNQUFBLE1BQUEsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBDQUFFLElBQUksbUNBQUksQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDO29CQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwSixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLGdCQUFnQixHQUFHLDJCQUFtQixDQUFDLHdCQUF3QixFQUFFLENBQUM7b0JBQ2xFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUEsbUJBQU8sRUFBQyxNQUFNLENBQUMsZ0JBQWdCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsUUFBUSxDQUFDLDJCQUFtQixDQUFDLHdCQUF3QixDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ25NLElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQzt3QkFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUM3RSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCx5TEFBeUw7UUFDekwsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLDRCQUFlLEdBQUUsQ0FBQztRQUM1QyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDcEIsSUFBQSwwQkFBaUIsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDcEMsQ0FBQztRQUNELENBQUM7WUFDRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsRUFBRTtnQkFDdkQsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsT0FBTyxLQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0RyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ0osTUFBTSxVQUFVLEdBQTRFLEVBQUUsQ0FBQztZQUMvRixLQUFLLE1BQU0sQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSwyQkFBbUIsQ0FBQyxlQUFlLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUk7b0JBQUUsU0FBUztnQkFDMUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLElBQUksQ0FBQztvQkFBQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUFDLEtBQUssR0FBRyxNQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxJQUFJLG1DQUFJLENBQUMsQ0FBQztnQkFBQyxDQUFDO2dCQUFDLFdBQU0sQ0FBQztvQkFBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQ3BILFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMzRSxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNFLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7WUFDaEMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hCLFdBQVcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUN4QixJQUFJLFdBQVcsSUFBSSxpQkFBaUI7b0JBQUUsTUFBTTtZQUNoRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakcsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLEdBQUcsMkJBQW1CLENBQUMsc0JBQXNCLENBQUM7WUFDbkYsTUFBTSxTQUFTLEdBQ1gsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLDJCQUFtQixDQUFDLHNCQUFzQixJQUFJLElBQUksR0FBRywyQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQzttQkFDdEksV0FBVyxDQUFDO1lBQ25CLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDLElBQXFCLENBQUMsQ0FBQztnQkFDcEYsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDLElBQXVCLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQUUsT0FBTyxNQUFNLENBQUM7WUFDL0MsQ0FBQztRQUNMLENBQUM7UUFFRCxxT0FBcU87UUFDck8sQ0FBQztZQUNHLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztnQkFDckMsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDO3dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBYyxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNoRixVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQzt3QkFDaEMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUNqQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJOzRCQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25ELENBQUM7b0JBQUMsUUFBUSxxQkFBcUIsSUFBdkIsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQ0QsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLElBQUksVUFBVSxHQUFHLG1CQUFtQixJQUFJLFdBQVcsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO29CQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFBLG1CQUFPLEVBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLFNBQVMsQ0FBQyxNQUFNLGtCQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsNkNBQTZDLENBQUMsQ0FBQztvQkFDcE0sSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7d0JBQUUsT0FBTyxNQUFNLENBQUM7b0JBQ2xELE9BQU8sTUFBTSxDQUFDO2dCQUNsQixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCwrS0FBK0s7UUFDL0ssTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN6QyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxDQUFDO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEUsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO29CQUFFLE9BQU8sTUFBTSxDQUFDO1lBQUMsQ0FBQztRQUN2RixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUI7O1FBQzdCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLDRCQUFjLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNELENBQUM7WUFBQyxXQUFNLENBQUM7Z0JBQ0wsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0osTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDM0MsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkMsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNwQixVQUFVLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsVUFBVSxFQUFFLENBQUM7WUFBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLFVBQVUsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEMsTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQThDLEVBQUUsQ0FBQztRQUM3RCxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxNQUFNLENBQUMsR0FBRyxNQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQztZQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksTUFBTSxJQUFJLGVBQWUsSUFBSSxDQUFDLEtBQUssVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUN4QyxJQUFJLEdBQUcsR0FBRyxhQUFhO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDekYsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELG9HQUFvRztJQUM3RixLQUFLLENBQUMsY0FBYyxDQUFvQixHQUFXLEVBQUUsTUFBUztRQUNqRSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBb0IsR0FBVyxFQUFFLE1BQVM7UUFDcEUsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQW9CLE1BQVM7UUFDL0MsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLGtCQUFrQixDQUFvQixHQUFXLEVBQUUsTUFBUztRQUMvRCxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTSxxQkFBcUIsQ0FBb0IsR0FBVyxFQUFFLE1BQVM7UUFDbEUsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sYUFBYSxDQUFvQixNQUFTO1FBQzdDLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLGlCQUFpQixDQUFvQixHQUFXLEVBQUUsTUFBUztRQUM5RCxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxrQkFBa0IsQ0FBb0IsTUFBUztRQUNsRCxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGdTQUFnUztJQUN6UixnQkFBZ0I7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQyxPQUFPO1lBQ0gsT0FBTztZQUNQLFNBQVM7WUFDVCxVQUFVLEVBQUUsT0FBTyxHQUFHLFNBQVM7WUFDL0IsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXO1NBQ3BDLENBQUM7SUFDTixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWE7UUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsT0FBTztZQUNILFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDL0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNuQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNsQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUF1QjtZQUNyRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1NBQ2hDLENBQUM7SUFDTixDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFDcEIsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7O1lBQ2xDLElBQUksQ0FBQztnQkFDRCxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSxtQ0FBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFlBQVksbUNBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0UsQ0FBQztZQUFDLFdBQU0sQ0FBQztnQkFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsRUFBRTtZQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsT0FBTztnQkFDSCxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVE7Z0JBQ2hCLElBQUksRUFBRSxNQUFlO2dCQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUNuQix1RkFBdUY7b0JBQ3ZGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBYyxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkYsQ0FBQzthQUNKLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0osTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO1lBQzVELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxPQUFPO2dCQUNILElBQUksRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDaEIsSUFBSSxFQUFFLFFBQWlCO2dCQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUNuQiwyRkFBMkY7b0JBQzNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSwrQkFBaUIsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3JGLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7b0JBQy9CLElBQUksT0FBTyxHQUFHLFFBQVEsRUFBRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQzVDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsT0FBTzs0QkFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDdkMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLE9BQU87NEJBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHOzRCQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBYSxDQUFDLENBQUM7NkJBQ2hELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUzs0QkFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzVFLENBQUM7b0JBQ0QsT0FBTzt3QkFDSCxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDZixPQUFPLEVBQUUsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUMzQyxPQUFPLEVBQUUsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87cUJBQy9DLENBQUM7Z0JBQ04sQ0FBQzthQUNKLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0osTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFNBQVMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlGLENBQUM7O0FBaCtCTCw0Q0FpK0JDO0FBbDRCRyx3REFBd0Q7QUFDekMsOEJBQWEsR0FBRyxJQUFJLEdBQUcsRUFBcUMsQUFBL0MsQ0FBZ0Q7QUFDN0Qsc0NBQXFCLEdBQUcsS0FBSyxBQUFSLENBQVM7QUFDOUIsa0NBQWlCLEdBQUcsQ0FBQyxBQUFKLENBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0LCB0aHJvdHRsZUZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0VGltZVVuaXF1ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JpdHNcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwidHlwZXNhZmVjc3NcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN0b3JhZ2UgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHtcbiAgICBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyLFxuICAgIEJ1bGtIZWFkZXJJbmZvLFxuICAgIGJ1aWxkRmlsZUJ1ZmZlcixcbiAgICBsb2FkQnVsa0hlYWRlcixcbiAgICBUQVJHRVRfRklMRV9CWVRFUyxcbn0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlRm9ybWF0XCI7XG5pbXBvcnQgeyBydW5QbGFubmVkTWVyZ2UgfSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VNZXJnZVwiO1xuaW1wb3J0IHsgYmxvY2tDYWNoZSwgZW5jb2RlQ29tcHJlc3NlZEJsb2NrcyB9IGZyb20gXCIuL2Jsb2NrQ2FjaGVcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IFNUUkVBTV9FWFRFTlNJT04sIGZyYW1lRGVsZXRlcywgZnJhbWVSb3dzLCBzdHJlYW1SZWFkZXJGcm9tRW50cmllcyB9IGZyb20gXCIuL3N0cmVhbUxvZ1wiO1xuaW1wb3J0IHsgYnJvYWRjYXN0IGFzIHN5bmNCcm9hZGNhc3QsIGJyb2FkY2FzdFNlYWwgYXMgc3luY0Jyb2FkY2FzdFNlYWwsIGNvbm5lY3QgYXMgc3luY0Nvbm5lY3QsIGlzU3luY1N1cHBvcnRlZCwgUmVtb3RlV3JpdGUgfSBmcm9tIFwiLi9zeW5jQ2xpZW50XCI7XG5pbXBvcnQgeyBERUxFVEVEIH0gZnJvbSBcIi4vV3JpdGVPdmVybGF5XCI7XG5pbXBvcnQgeyBNZXJnZUxvY2tJbmZvLCBwZWVrTWVyZ2VGaWxlTG9jaywgcGVla01lcmdlTG9jaywgcmVsZWFzZU1lcmdlRmlsZUxvY2ssIHJlbGVhc2VNZXJnZUxvY2ssIHN0YXJ0TWVyZ2VGaWxlTG9ja0hlYXJ0YmVhdCwgdHJ5QWNxdWlyZU1lcmdlRmlsZUxvY2ssIHRyeUFjcXVpcmVNZXJnZUxvY2sgfSBmcm9tIFwiLi9tZXJnZUxvY2tcIjtcbmltcG9ydCB7IG1hcmtlckV4Y2x1c2lvbnMsIHByb2Nlc3NEZWxldGVNYXJrZXJzLCByZWFkRGVsZXRlTWFya2Vycywgd3JpdGVEZWxldGVNYXJrZXIgfSBmcm9tIFwiLi9tZXJnZU1hcmtlcnNcIjtcbmltcG9ydCB7XG4gICAgQnVsa0ZpbGVJbmZvLFxuICAgIExvYWRlZEluZGV4LFxuICAgIGxvYWRGaWxlUmVhZGVyLFxuICAgIGxvYWRTdHJlYW1FbnRyaWVzLFxuICAgIG1ha2VSYXdHZXRSYW5nZSxcbiAgICBNaXNzaW5nRmlsZUVycm9yLFxuICAgIG9yZGVyU3RyZWFtRW50cmllcyxcbiAgICBTdHJlYW1GaWxlSW5mbyxcbiAgICBTdWJSZWFkZXJDYWNoZXMsXG59IGZyb20gXCIuL0xvYWRlZEluZGV4XCI7XG5pbXBvcnQgeyBCdWxrRGF0YWJhc2VSZWFkZXIsIG51bGxKb2luIH0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlUmVhZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBCVUxLX1JPT1RfRk9MREVSID0gXCJidWxrRGF0YWJhc2VzMlwiO1xuY29uc3QgRklMRV9FWFRFTlNJT04gPSBcIi5idWxrXCI7XG5jb25zdCBST0xMT1ZFUl9ST1dTID0gNTAwMDtcbmNvbnN0IFJPTExPVkVSX0JZVEVTID0gNSAqIDEwMjQgKiAxMDI0O1xuY29uc3QgTUVNT1JZX1dBVENIRE9HX0lOVEVSVkFMX01TID0gNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfREVMRVRFX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbmNvbnN0IE1BWF9JTkRFWF9SRUxPQURfQVRURU1QVFMgPSAzO1xuY29uc3QgRklSU1RfTUVSR0VfQllURVMgPSBUQVJHRVRfRklMRV9CWVRFUyAvIDI7XG5jb25zdCBLRVlfR1JPVVBfQllURVMgPSA4MDAgKiAxMDI0ICogMTAyNDtcbmNvbnN0IERVUF9USFJFU0hPTEQgPSAwLjQ7XG4vLyBXaG9sZS10aWVyIGRlZHVwIHNob3J0LWNpcmN1aXQgKGFmdGVyIFBhc3MgMSk6IHdoZW4gdGhlIGJ1bGsgdGllciBpcyBvdmVyIHRoaXMgc2l6ZSBBTkQgdGhlIG92ZXJhbGwga2V5IGR1cGxpY2F0aW9uIGZyYWN0aW9uIGlzIG92ZXIgdGhpcyB0aHJlc2hvbGQsIGZvbGQgZXZlcnkgYnVsayBmaWxlIGluIG9uZSBtZXJnZSBpbnN0ZWFkIG9mIHRoZSBwZXIta2V5LWdyb3VwIHdhbGsgKHdoaWNoIHNwYWNlcyBtZXJnZXMgNSBtaW4gYXBhcnQg4oCUIDE2IGggZm9yIDIwMCBncm91cHMpLlxuY29uc3QgREVEVVBfVFJJR0dFUl9CWVRFUyA9IDUxMiAqIDEwMjQgKiAxMDI0O1xuY29uc3QgREVEVVBfVFJJR0dFUl9GUkFDVElPTiA9IDAuNTtcbmNvbnN0IFdSSVRFX0ZMVVNIX0ZJUlNUX1NURVBfTVMgPSAyNTA7XG4vLyBTa2lwIGxvZ3MgYXJlIHRocm90dGxlZCBwZXIgY29sbGVjdGlvbjogdGhlIGJhY2tncm91bmQgd3JpdGUgcGF0aCByZXRyaWVzIG1lcmdlcyBhYm91dCBvbmNlIGEgc2Vjb25kLCBzbyBhbiB1bnRocm90dGxlZCBsb2cgd291bGQgcmVwZWF0IGZvciB0aGUgd2hvbGUgZHVyYXRpb24gb2YgYW5vdGhlciB0YWIncyBtZXJnZS5cbmNvbnN0IE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TID0gMzAgKiAxMDAwO1xuXG5leHBvcnQgY29uc3QgYnVsa0RhdGFiYXNlMlRpbWluZyA9IHtcbiAgICBzdHJlYW1TZWFsQWdlTXM6IDEwICogNjAgKiA2MCAqIDEwMDAsXG4gICAgLy8gV2FpdCB0aGlzIGxvbmcgYWZ0ZXIgdGhlIHRhYiBiZWNvbWVzIHZpc2libGUgYmVmb3JlIHRoZSBmaXJzdCBtZXJnZSBjaGVjaywgdGhlbiBjaGVjayB0aGlzIG9mdGVuIGFmdGVyd2FyZHMuIFRhYiBiZWluZyBoaWRkZW4gY2FuY2VscyB0aGUgdGltZXJzIChubyBtZXJnZXMgd2hpbGUgaW4gYmFja2dyb3VuZCkuIEJyb3dzZXItb25seTsgTm9kZSBjb21wYWN0b3JzIChlLmcuIHJlbW90ZUZpbGVTZXJ2ZXIpIGRyaXZlIHRoZWlyIG93biBwb2xsaW5nLlxuICAgIHZpc2libGVNZXJnZUludGVydmFsTXM6IDUgKiA2MCAqIDEwMDAsXG4gICAgbWVyZ2VTcGFjaW5nTXM6IDUgKiA2MCAqIDEwMDAsXG4gICAgZmlyc3RNZXJnZVRyaWdnZXJGaWxlczogMjAsXG4gICAgZmlyc3RNZXJnZVRyaWdnZXJSYW5nZU1zOiAzICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICBzdHJlYW1Gb2xkVHJpZ2dlclJvd3M6IDEwMCxcbiAgICBzdHJlYW1Gb2xkVHJpZ2dlckJ5dGVzOiA2NCAqIDEwMjQgKiAxMDI0LFxuICAgIHN0cmVhbUZpbGVNYXhCeXRlczogNTAgKiAxMDI0ICogMTAyNCxcbiAgICBzdHJlYW1Gb2xkSGFyZExpbWl0Qnl0ZXM6IDc2OCAqIDEwMjQgKiAxMDI0LFxuICAgIC8vIDAgPSBmbHVzaCBldmVyeSB3cml0ZSAoTm9kZSDigJQgYXBwZW5kIGlzIHJlYWwgYW5kIGNoZWFwKTsgYnJvd3NlciByYW1wcyB0byAxNXMgdG8gYXZvaWQgcmV3cml0aW5nIHRoZSB3aG9sZSBzdHJlYW0gZmlsZSBwZXIgd3JpdGUuXG4gICAgd3JpdGVGbHVzaE1heERlbGF5TXM6IGlzTm9kZSgpID8gMCA6IDE1ICogMTAwMCxcbiAgICBmaWxlU2V0UG9sbEludGVydmFsTXM6IDMwICogNjAgKiAxMDAwLFxuICAgIG1lbW9yeUZsdXNoSGVhcEJ5dGVzOiA1ICogMTAyNCAqIDEwMjQgKiAxMDI0LFxuICAgIG1lbW9yeUZsdXNoTWluQ29sbGVjdGlvbkJ5dGVzOiAxMDAgKiAxMDI0ICogMTAyNCxcbiAgICBtZW1vcnlGbHVzaFRocm90dGxlTXM6IDE1ICogNjAgKiAxMDAwLFxufTtcblxuZnVuY3Rpb24gZm10Qnl0ZXMobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobiA8IDEwMjQpIHJldHVybiBuICsgXCJCXCI7XG4gICAgaWYgKG4gPCAxMDI0ICogMTAyNCkgcmV0dXJuIChuIC8gMTAyNCkudG9GaXhlZCgxKSArIFwiS0JcIjtcbiAgICBpZiAobiA8IDEwMjQgKiAxMDI0ICogMTAyNCkgcmV0dXJuIChuIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIk1CXCI7XG4gICAgcmV0dXJuIChuIC8gMTAyNCAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDIpICsgXCJHQlwiO1xufVxuXG4vLyBSZWFjdGl2aXR5IHNlYW0gKG5vIG1vYnggZGVwZW5kZW5jeSBpbiB0aGlzIGZpbGUpLiBUaGUgbW9ieCBzdWJjbGFzcyBzdXBwbGllcyBhIFJlYWN0aXZlRGVwcyB0aGF0IG1hcHMgc2lnbmFsIHN0cmluZ3MgdG8gaXRzIG93biBkZXBlbmRlbmN5IHRyYWNraW5nOyBub24tcmVhY3RpdmUgY2FsbGVycyBwYXNzIG5vb3BSZWFjdGl2ZURlcHMuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aXZlRGVwcyB7XG4gICAgb2JzZXJ2ZShzaWduYWw6IHN0cmluZyk6IHZvaWQ7XG4gICAgaW52YWxpZGF0ZShzaWduYWw6IHN0cmluZyk6IHZvaWQ7XG4gICAgYmF0Y2goZm46ICgpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIE9wdGlvbmFsIOKAlCBsZXRzIHdyaXRlcyBza2lwIHBlci1rZXkgaW52YWxpZGF0aW9uIGZvciByb3dzIG5vdGhpbmcgaXMgd2F0Y2hpbmcuIFVuZGVmaW5lZCA9IFwiYXNzdW1lIHdhdGNoZWRcIi5cbiAgICBpc09ic2VydmVkPyhzaWduYWw6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBub29wUmVhY3RpdmVEZXBzOiBSZWFjdGl2ZURlcHMgPSB7XG4gICAgb2JzZXJ2ZSgpIHsgfSxcbiAgICBpbnZhbGlkYXRlKCkgeyB9LFxuICAgIGJhdGNoKGZuKSB7IGZuKCk7IH0sXG4gICAgaXNPYnNlcnZlZCgpIHsgcmV0dXJuIGZhbHNlOyB9LFxufTtcblxuZXhwb3J0IHR5cGUgU3RvcmFnZUZhY3RvcnkgPSAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPEZpbGVTdG9yYWdlPjtcblxuZXhwb3J0IHR5cGUgQnVsa0RhdGFiYXNlMkNvbmZpZyA9IHtcbiAgICAvLyBTZWUgQnVsa0RhdGFiYXNlUmVhZGVyLmNmZy5tYXhUcmlnZ2VyVGhyb3R0bGVNcy5cbiAgICBtYXhUcmlnZ2VyVGhyb3R0bGVNcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE1lcmdlU2tpcFJlYXNvbiA9XG4gICAgLy8gVGhpcyBpbnN0YW5jZSBpcyBhbHJlYWR5IG1pZC1tZXJnZS5cbiAgICB8IFwibWVyZ2VJbkZsaWdodFwiXG4gICAgLy8gQW5vdGhlciBzYW1lLW9yaWdpbiB0YWIgaG9sZHMgdGhlIGxvY2FsU3RvcmFnZSBtZXJnZSBsb2NrLlxuICAgIHwgXCJ0YWJMb2NrSGVsZFwiXG4gICAgLy8gQW5vdGhlciBwcm9jZXNzIGhvbGRzIHRoZSBjcm9zcy1wcm9jZXNzIC5tZXJnZS1sb2NrIGZpbGUgKG9yIHdvbiB0aGUgc2V0dGxlIHJhY2UgZm9yIGl0KS5cbiAgICB8IFwiZmlsZUxvY2tIZWxkXCJcbiAgICAvLyBjb21wYWN0KCkgb25seTogdGhlIGNvbGxlY3Rpb24gaGFzIG5vIGZpbGVzIG9uIGRpc2suXG4gICAgfCBcIm5vdGhpbmdUb01lcmdlXCI7XG5cbi8vIFdoYXQgYSBjb21wYWN0KCkvdHJ5TWVyZ2VOb3coKSBjYWxsIGRpZC4gc2tpcFJlYXNvbiBpcyBzZXQgd2hlbiB0aGUgcGFzcyBuZXZlciByYW47IGZvciB0aGUgbG9jayByZWFzb25zLCBsb2NrSG9sZGVySWQvbG9ja0V4cGlyZXNJbk1zIHJlcG9ydCB3aG8gaG9sZHMgdGhlIGxvY2sgYW5kIGhvdyBsb25nIHVudGlsIGl0IGdvZXMgc3RhbGUgKHNvIGEgc2NoZWR1bGVyIGtub3dzIHdoZW4gcmV0cnlpbmcgY291bGQgc3VjY2VlZCkuXG5leHBvcnQgdHlwZSBNZXJnZUF0dGVtcHRSZXN1bHQgPSB7XG4gICAgbWVyZ2VkOiBib29sZWFuO1xuICAgIHNraXBSZWFzb24/OiBNZXJnZVNraXBSZWFzb247XG4gICAgbG9ja0hvbGRlcklkPzogc3RyaW5nO1xuICAgIGxvY2tFeHBpcmVzSW5Ncz86IG51bWJlcjtcbn07XG5cbmxldCBuZXR3b3JrQ29tcGFjdGlvbkVuYWJsZWQgPSBmYWxzZTtcblxubGV0IGZpbGVOYW1lQ291bnRlciA9IDA7XG4vLyBQZXItcHJvY2VzcyBJRCBzbyB0d28gd3JpdGVycyBwaWNraW5nIHRoZSBzYW1lIHRpbWVzdGFtcCArIGNvdW50ZXIgbmV2ZXIgY29sbGlkZSBvbiBhIG5hbWUuXG5jb25zdCB3cml0ZXJJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKTtcbmZ1bmN0aW9uIG5leHRDb3VudGVyKCk6IG51bWJlciB7IHJldHVybiArK2ZpbGVOYW1lQ291bnRlcjsgfVxuXG5sZXQgbGFzdEZpbGVUaW1lID0gMDtcbi8vIFN0cmljdGx5LWluY3JlYXNpbmcgaW50ZWdlciBzbyBuZXdlc3QtZmlyc3Qgb3JkZXJpbmcgaXMgdW5hbWJpZ3VvdXMgd2l0aGluIGEgbWlsbGlzZWNvbmQuXG5mdW5jdGlvbiBuZXh0RmlsZVRpbWUoKTogbnVtYmVyIHtcbiAgICBsYXN0RmlsZVRpbWUgPSBNYXRoLm1heChEYXRlLm5vdygpLCBsYXN0RmlsZVRpbWUgKyAxKTtcbiAgICByZXR1cm4gbGFzdEZpbGVUaW1lO1xufVxuXG5mdW5jdGlvbiBuZXdGaWxlTmFtZSh0aW1lc3RhbXA6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAwXyR7dGltZXN0YW1wfV8ke3dyaXRlcklkfV8ke25leHRDb3VudGVyKCl9JHtGSUxFX0VYVEVOU0lPTn1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmVhbUZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBTdHJlYW1GaWxlSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aChTVFJFQU1fRVhURU5TSU9OKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJ0cyA9IGZpbGVOYW1lLnNsaWNlKDAsIC1TVFJFQU1fRVhURU5TSU9OLmxlbmd0aCkuc3BsaXQoXCJfXCIpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09IFwic3RyZWFtXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGltZXN0YW1wID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aW1lc3RhbXApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGZpbGVOYW1lLCB0aW1lc3RhbXAgfTtcbn1cblxuLy8gQWNjZXB0IG9sZCAzLXBhcnQgKGxldmVsX3RpbWVzdGFtcF9jb3VudGVyKSBhbmQgbmV3IDQtcGFydCAobGV2ZWxfdGltZXN0YW1wX3dyaXRlcklkX2NvdW50ZXIpIHNoYXBlcy5cbmZ1bmN0aW9uIHBhcnNlRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IEJ1bGtGaWxlSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aChGSUxFX0VYVEVOU0lPTikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFydHMgPSBmaWxlTmFtZS5zbGljZSgwLCAtRklMRV9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGV2ZWwgPSBwYXJzZUludChwYXJ0c1swXSwgMTApO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobGV2ZWwpIHx8ICFOdW1iZXIuaXNGaW5pdGUodGltZXN0YW1wKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlTmFtZSwgbGV2ZWwsIHRpbWVzdGFtcCB9O1xufVxuXG5leHBvcnQgY2xhc3MgQnVsa0RhdGFiYXNlQmFzZTxUIGV4dGVuZHMgeyBrZXk6IHN0cmluZyB9PiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBkZXBzOiBSZWFjdGl2ZURlcHMsXG4gICAgICAgIHByaXZhdGUgc3RvcmFnZUZhY3Rvcnk6IFN0b3JhZ2VGYWN0b3J5LFxuICAgICAgICBwcml2YXRlIGNvbmZpZzogQnVsa0RhdGFiYXNlMkNvbmZpZyA9IHt9LFxuICAgICkgeyB9XG5cbiAgICAvLyBUaGUgcmVhZGVyIChhbmQgdGhlIGJhY2tncm91bmQgbWFjaGluZXJ5IHRoYXQgcmlkZXMgYWxvbmcgd2l0aCBpdCkgbXVzdCBOT1QgYmUgc2V0IHVwIGp1c3QgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiB3YXMgY29uc3RydWN0ZWQuIE1hbnkgY29sbGVjdGlvbnMgYXJlIGNvbnN0cnVjdGVkIGFuZCBuZXZlciB0b3VjaGVkLCBhbmQgaW4gTm9kZSBhIG1lcmdlIHRpY2sgd291bGQgcG9rZSB0aGUgc3RvcmFnZSBmYWN0b3J5IChlLmcuIGluZGV4ZWREQikgYW5kIHRocm93LiBXZSBidWlsZCBpdCBsYXppbHkgb24gZmlyc3QgYWNjZXNzIHRvIGB0aGlzLnJlYWRlcmA6IGV2ZXJ5IHJlYWQsIHdyaXRlLCBhbmQgbWVyZ2UgZ29lcyB0aHJvdWdoIHRoZSByZWFkZXIsIHdoaWxlIHB1cmUgY29uc3RydWN0aW9uIG5ldmVyIHRvdWNoZXMgaXQuXG4gICAgcHJpdmF0ZSBfcmVhZGVyOiBCdWxrRGF0YWJhc2VSZWFkZXI8VD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBnZXQgcmVhZGVyKCk6IEJ1bGtEYXRhYmFzZVJlYWRlcjxUPiB7XG4gICAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHJldHVybiB0aGlzLl9yZWFkZXI7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBCdWxrRGF0YWJhc2VSZWFkZXI8VD4oe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgZGVwczogdGhpcy5kZXBzLFxuICAgICAgICAgICAgbWF4VHJpZ2dlclRocm90dGxlTXM6IHRoaXMuY29uZmlnLm1heFRyaWdnZXJUaHJvdHRsZU1zLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLnNldEVuc3VyZUluZGV4KCgpID0+IHRoaXMuZW5zdXJlSW5kZXgoKSk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IHJlYWRlcjtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCAoKSA9PiB2b2lkIHRoaXMuZmx1c2hQZW5kaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJoaWRkZW5cIikgdm9pZCB0aGlzLmZsdXNoUGVuZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHsgLyogbm90IGluIGEgRE9NIGNvbnRleHQgKi8gfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZVNldFBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHZvaWQgdGhpcy5wb2xsRmlsZVNldCgpLCBidWxrRGF0YWJhc2UyVGltaW5nLmZpbGVTZXRQb2xsSW50ZXJ2YWxNcyk7XG4gICAgICAgICh0aGlzLmZpbGVTZXRQb2xsVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICB0aGlzLnNldHVwVmlzaWJpbGl0eU1lcmdlQ2hlY2soKTtcbiAgICAgICAgQnVsa0RhdGFiYXNlQmFzZS5saXZlSW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICAgICAgQnVsa0RhdGFiYXNlQmFzZS5zdGFydE1lbW9yeVdhdGNoZG9nKCk7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgYHZpc2libGVNZXJnZUludGVydmFsTXNgIG9mIGJlaW5nLXZpc2libGUgdGltZSwgcnVuIGEgbWVyZ2UgY2hlY2suIEZpcnN0IGNoZWNrIGZpcmVzIGB2aXNpYmxlTWVyZ2VJbnRlcnZhbE1zYCBhZnRlciB0aGUgdGFiIGJlY29tZXMgdmlzaWJsZSAobm90IG9uIGluaXRpYWwgbG9hZCDigJQgZ2l2ZXMgdGhlIHVzZXIgYSBtb21lbnQgb2Ygc2Vzc2lvbiBjb21taXRtZW50IGJlZm9yZSB3ZSBzdGFydCBjaHVybmluZyB0aGUgRlMpLCB0aGVuIGV2ZXJ5IGludGVydmFsIGFmdGVyLiBUYWIgaGlkaW5nIGNhbmNlbHMgdGhlIHRpbWVyczsgdmlzaWJsZS1hZ2FpbiByZXN0YXJ0cy4gTm9kZSBoYXMgbm8gZG9jdW1lbnQg4oCUIHRoZXJlIHdlIGNvbnNpZGVyIG91cnNlbHZlcyBhbHdheXMtdmlzaWJsZSBhbmQganVzdCBpbnN0YWxsIHRoZSBpbnRlcnZhbCBkaXJlY3RseS5cbiAgICBwcml2YXRlIHNldHVwVmlzaWJpbGl0eU1lcmdlQ2hlY2soKTogdm9pZCB7XG4gICAgICAgIGxldCBmaXJzdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGludGVydmFsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWVyKSB7IGNsZWFyVGltZW91dChmaXJzdFRpbWVyKTsgZmlyc3RUaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgaWYgKGludGVydmFsVGltZXIpIHsgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFRpbWVyKTsgaW50ZXJ2YWxUaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWVyIHx8IGludGVydmFsVGltZXIpIHJldHVybjtcbiAgICAgICAgICAgIGZpcnN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKCk7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHZvaWQgdGhpcy5tYXliZU1lcmdlKCksIGJ1bGtEYXRhYmFzZTJUaW1pbmcudmlzaWJsZU1lcmdlSW50ZXJ2YWxNcyk7XG4gICAgICAgICAgICAgICAgKGludGVydmFsVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgfSwgYnVsa0RhdGFiYXNlMlRpbWluZy52aXNpYmxlTWVyZ2VJbnRlcnZhbE1zKTtcbiAgICAgICAgICAgIChmaXJzdFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgeyBzdGFydCgpOyByZXR1cm47IH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSBcInZpc2libGVcIikgc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBlbHNlIHN0b3AoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIHN0YXJ0KCk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3QgaW4gYSBET00gY29udGV4dCAqLyB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJDYWNoZXM6IFN1YlJlYWRlckNhY2hlcyA9IHsgYnVsazogbmV3IE1hcCgpLCBzdHJlYW06IG5ldyBNYXAoKSB9O1xuXG4gICAgcHJpdmF0ZSBwZW5kaW5nQXBwZW5kczogeyBmcmFtZWQ6IEJ1ZmZlcjsgcm93czogbnVtYmVyIH1bXSA9IFtdO1xuICAgIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBmbHVzaENoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcHJpdmF0ZSBjdXJyZW50Rmx1c2hEZWxheSA9IDA7XG4gICAgcHJpdmF0ZSBsYXN0V3JpdGVUaW1lID0gMDtcblxuICAgIHByaXZhdGUgc3RyZWFtRmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGN1cnJlbnRTdHJlYW1GaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgY3VycmVudFN0cmVhbUZpbGVCeXRlcyA9IDA7XG4gICAgLy8gSW4tcHJvY2VzcyByZS1lbnRyeSBndWFyZDogaWYgYSBtZXJnZSBpcyBydW5uaW5nLCBhZGRpdGlvbmFsIHRyaWdnZXJzICh2aXNpYmlsaXR5IHRpbWVyLCB3cml0ZXMsIHRyeU1lcmdlTm93IGNhbGxzKSByZXR1cm4gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiBxdWV1ZWluZy4gS2VlcHMgdGhlIHZpc2liaWxpdHktdGltZXIgZmlyaW5ncyBmcm9tIHN0YWNraW5nIGJlaGluZCBhIGxvbmcgbWVyZ2UuXG4gICAgcHJpdmF0ZSBtZXJnZUluRmxpZ2h0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0TWVyZ2VTa2lwTG9nTXMgPSAwO1xuICAgIC8vIFJ1bm5pbmcgY291bnRlcnMgb2Ygc3RyZWFtLXRpZXIgcm93cyArIGJ5dGVzIG9uIGRpc2suIFNlZWRlZCBmcm9tIGVhY2ggTG9hZGVkSW5kZXggYnVpbGQsIHRoZW4gaW5jcmVtZW50ZWQgcGVyIGZsdXNoIHNvIHRoZSBmb2xkLXRyaWdnZXIgY2hlY2tzIGN1cnJlbnQgZGF0YSB3aXRob3V0IGFuIGV4dHJhIGRpcmVjdG9yeSBsaXN0aW5nLlxuICAgIHByaXZhdGUgc3RyZWFtUm93c09uRGlzayA9IDA7XG4gICAgcHJpdmF0ZSBzdHJlYW1CeXRlc09uRGlzayA9IDA7XG5cbiAgICBwcml2YXRlIGZpbGVTZXRQb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHJlYnVpbGRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVidWlsZERpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWJ1aWxkT3B0aW9uczogeyBkcm9wU3RhbGVGYWxsYmFjazogYm9vbGVhbiB9ID0geyBkcm9wU3RhbGVGYWxsYmFjazogZmFsc2UgfTtcblxuICAgIC8vIOKUgOKUgCBtZW1vcnktcHJlc3N1cmUgd2F0Y2hkb2cgKGdsb2JhbCwgYnJvd3Nlci1vbmx5KSDilIDilIBcbiAgICBwcml2YXRlIHN0YXRpYyBsaXZlSW5zdGFuY2VzID0gbmV3IFNldDxCdWxrRGF0YWJhc2VCYXNlPHsga2V5OiBzdHJpbmcgfT4+KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbWVtb3J5V2F0Y2hkb2dTdGFydGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbGFzdE1lbW9yeUZsdXNoTXMgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHN0YXJ0TWVtb3J5V2F0Y2hkb2coKSB7XG4gICAgICAgIGlmIChCdWxrRGF0YWJhc2VCYXNlLm1lbW9yeVdhdGNoZG9nU3RhcnRlZCkgcmV0dXJuO1xuICAgICAgICBCdWxrRGF0YWJhc2VCYXNlLm1lbW9yeVdhdGNoZG9nU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHVzZWRIZWFwID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICB0cnkgeyByZXR1cm4gKHBlcmZvcm1hbmNlIGFzIHVua25vd24gYXMgeyBtZW1vcnk/OiB7IHVzZWRKU0hlYXBTaXplPzogbnVtYmVyIH0gfSk/Lm1lbW9yeT8udXNlZEpTSGVhcFNpemU7IH1cbiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSBcInVuZGVmaW5lZFwiIHx8IHVzZWRIZWFwKCkgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVzZWQgPSB1c2VkSGVhcCgpO1xuICAgICAgICAgICAgaWYgKHVzZWQgIT09IHVuZGVmaW5lZCkgQnVsa0RhdGFiYXNlQmFzZS5jaGVja01lbW9yeVByZXNzdXJlKHVzZWQpO1xuICAgICAgICB9LCBNRU1PUllfV0FUQ0hET0dfSU5URVJWQUxfTVMpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrTWVtb3J5UHJlc3N1cmUodXNlZEhlYXBCeXRlczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh1c2VkSGVhcEJ5dGVzIDwgYnVsa0RhdGFiYXNlMlRpbWluZy5tZW1vcnlGbHVzaEhlYXBCeXRlcykgcmV0dXJuO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gQnVsa0RhdGFiYXNlQmFzZS5sYXN0TWVtb3J5Rmx1c2hNcyA8IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVtb3J5Rmx1c2hUaHJvdHRsZU1zKSByZXR1cm47XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2UubGFzdE1lbW9yeUZsdXNoTXMgPSBub3c7XG4gICAgICAgIGNvbnN0IGZsdXNoZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGIgb2YgQnVsa0RhdGFiYXNlQmFzZS5saXZlSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IGRiLnJlYWRlci5pbmRleD8udG90YWxCeXRlcyA/PyAwO1xuICAgICAgICAgICAgaWYgKGJ5dGVzID4gYnVsa0RhdGFiYXNlMlRpbWluZy5tZW1vcnlGbHVzaE1pbkNvbGxlY3Rpb25CeXRlcykge1xuICAgICAgICAgICAgICAgIGZsdXNoZWQucHVzaChgJHtkYi5uYW1lfSAoJHtmbXRCeXRlcyhieXRlcyl9KWApO1xuICAgICAgICAgICAgICAgIGRiLnJlbG9hZEZyb21EaXNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsdXNoZWQubGVuZ3RoKSBjb25zb2xlLmxvZyhgW2J1bGsyXSBoZWFwICR7Zm10Qnl0ZXModXNlZEhlYXBCeXRlcyl9IG92ZXIgJHtmbXRCeXRlcyhidWxrRGF0YWJhc2UyVGltaW5nLm1lbW9yeUZsdXNoSGVhcEJ5dGVzKX0gLSBmbHVzaGVkICR7Zmx1c2hlZC5sZW5ndGh9IGxhcmdlIGNvbGxlY3Rpb24ocyk6ICR7Zmx1c2hlZC5qb2luKFwiLCBcIil9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckNhY2hlKCkge1xuICAgICAgICBibG9ja0NhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbmFibGVOZXR3b3JrQ29tcGFjdGlvbigpIHtcbiAgICAgICAgbmV0d29ya0NvbXBhY3Rpb25FbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmFnZSA9IGxhenkoYXN5bmMgKCkgPT4gdGhpcy5zdG9yYWdlRmFjdG9yeShgJHtCVUxLX1JPT1RfRk9MREVSfS8ke3RoaXMubmFtZX1gKSk7XG5cbiAgICBwdWJsaWMgYXN5bmMgaXNSZW1vdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiAhIShhd2FpdCB0aGlzLnN0b3JhZ2UoKSkuaXNSZW1vdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdHJlYW1OZWVkc0ZvbGQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbVJvd3NPbkRpc2sgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkVHJpZ2dlclJvd3NcbiAgICAgICAgICAgICYmIHRoaXMuc3RyZWFtQnl0ZXNPbkRpc2sgPiBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZvbGRUcmlnZ2VyQnl0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRvbWF0aWNDb21wYWN0aW9uQWxsb3dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKG5ldHdvcmtDb21wYWN0aW9uRW5hYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChpc05vZGUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhKGF3YWl0IHRoaXMuc3RvcmFnZSgpKS5pc1JlbW90ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNLZXlXYXRjaGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0tleVdhdGNoZWQoa2V5KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgaW5kZXggbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5kZXgoKTogUHJvbWlzZTxMb2FkZWRJbmRleDxUPj4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkZXIuaW5kZXgpIHJldHVybiB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgaWYgKCFpZHgpIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5hbWV9OiBpbmRleCBmYWlsZWQgdG8gYnVpbGRgKTtcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICAvLyBDb2FsZXNjaW5nIHJlYnVpbGQgbG9vcDogdHJpZ2dlcnMgZHVyaW5nIGEgYnVpbGQgc2V0IHJlYnVpbGREaXJ0eSBzbyB0aGUgbG9vcCBpdGVyYXRlcyBvbmNlIG1vcmUgd2hlbiBpdCBmaW5pc2hlcyDigJQgTiByYXBpZCB0cmlnZ2VycyBjYXVzZSBhdCBtb3N0IE9ORSBleHRyYSByZWJ1aWxkIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBlbmRzLlxuICAgIHByaXZhdGUgdHJpZ2dlclJlYnVpbGQob3B0czogeyBkcm9wU3RhbGVGYWxsYmFjaz86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChvcHRzLmRyb3BTdGFsZUZhbGxiYWNrKSB0aGlzLnJlYnVpbGRPcHRpb25zLmRyb3BTdGFsZUZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucmVidWlsZFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZERpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGRQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVidWlsZFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZERpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZG9PbmVSZWJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAodGhpcy5yZWJ1aWxkRGlydHkpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZE9wdGlvbnMuZHJvcFN0YWxlRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb09uZVJlYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGF3YWl0IExvYWRlZEluZGV4LmJ1aWxkPFQ+KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICBidWxrRmlsZXMsXG4gICAgICAgICAgICBzdHJlYW1GaWxlcyxcbiAgICAgICAgICAgIHN1YkNhY2hlczogdGhpcy5zdWJDYWNoZXMsXG4gICAgICAgICAgICBvblVucmVhZGFibGVGaWxlOiAoZiwgbXNnKSA9PiB0aGlzLmhhbmRsZVVucmVhZGFibGVGaWxlKGYsIG1zZyksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMucmVhZGVyLmluZGV4O1xuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChuZXdJbmRleCwgeyBkcm9wU3RhbGVGYWxsYmFjazogdGhpcy5yZWJ1aWxkT3B0aW9ucy5kcm9wU3RhbGVGYWxsYmFjayB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1Sb3dzT25EaXNrID0gbmV3SW5kZXguc3RyZWFtUm93c09uRGlzaztcbiAgICAgICAgdGhpcy5zdHJlYW1CeXRlc09uRGlzayA9IG5ld0luZGV4LnN0cmVhbUJ5dGVzT25EaXNrO1xuICAgICAgICBpZiAob2xkSW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBvbGRJbmRleC5maWxlU2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdJbmRleC5maWxlU2V0LmhhcyhmKSkgYmxvY2tDYWNoZS5ldmljdChudWxsSm9pbih0aGlzLm5hbWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyb3AgZXZlcnl0aGluZyBpbi1tZW1vcnksIGhhcmQgcmVzZXQuIFBlbmRpbmcgdW4tZmx1c2hlZCB3cml0ZXMgc3Vydml2ZSAoc3RpbGwgaW4gb3ZlcmxheSkuXG4gICAgcHVibGljIHJlbG9hZEZyb21EaXNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YkNhY2hlcy5idWxrLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc3ViQ2FjaGVzLnN0cmVhbS5jbGVhcigpO1xuICAgICAgICB0aGlzLnJlYWRlci5pbmRleD8uZHJvcExvYWRlZFZhbHVlcygpO1xuICAgICAgICB2b2lkIHRoaXMudHJpZ2dlclJlYnVpbGQoeyBkcm9wU3RhbGVGYWxsYmFjazogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHRlcm5hbC1tZXJnZSBkZXRlY3Rpb246IGlmIHNvbWUgb3RoZXIgdGFiL3Byb2Nlc3MgY2hhbmdlZCB0aGUgZmlsZSBzZXQgdW5kZXIgdXMsIHJlYnVpbGQuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsRmlsZVNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRlci5pbmRleCkgcmV0dXJuO1xuICAgICAgICBsZXQgY3VycmVudDogU2V0PHN0cmluZz47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gbmV3IFNldChbLi4uYnVsa0ZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpLCAuLi5zdHJlYW1GaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKV0pO1xuICAgICAgICB9IGNhdGNoIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLnJlYWRlci5pbmRleD8uZmlsZVNldDtcbiAgICAgICAgaWYgKCFwcmV2KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBjdXJyZW50LnNpemUgIT09IHByZXYuc2l6ZSB8fCBbLi4uY3VycmVudF0uc29tZShuID0+ICFwcmV2LmhhcyhuKSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB2b2lkIHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlYWRXaXRoUmV0cnk8Uj4oZm46ICgpID0+IFByb21pc2U8Uj4pOiBQcm9taXNlPFI+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbmRleCgpO1xuICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucmVhZGVyLmluZGV4O1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIGF3YWl0IGZuKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1pc3NpbmdGaWxlRXJyb3IpIHx8IGF0dGVtcHQgPj0gTUFYX0lOREVYX1JFTE9BRF9BVFRFTVBUUykgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkZXIuaW5kZXggPT09IGJlZm9yZSkgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIGNyb3NzLXRhYiBzeW5jIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHByaXZhdGUgc3luY1NldHVwID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNTeW5jU3VwcG9ydGVkKCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbmRleCgpO1xuICAgICAgICBjb25zdCByZWNlbnQgPSBhd2FpdCBzeW5jQ29ubmVjdCh0aGlzLm5hbWUsIHcgPT4gdGhpcy5hcHBseVJlbW90ZSh3KSwgKCkgPT4geyB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHJlY2VudCkgdGhpcy5hcHBseVJlbW90ZSh3KTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXBwbHlSZW1vdGUod3JpdGU6IFJlbW90ZVdyaXRlKSB7XG4gICAgICAgIGlmICh3cml0ZS50aW1lIDw9IHRoaXMucmVhZGVyLmxvY2FsVGltZSh3cml0ZS5rZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuZGVwcy5iYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAod3JpdGUuZGVsZXRlZCkgdGhpcy5yZWFkZXIuYXBwbHlEZWxldGUod3JpdGUua2V5LCB3cml0ZS50aW1lKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5yZWFkZXIuYXBwbHlXcml0ZSh3cml0ZS5rZXksIHdyaXRlLnZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB3cml0ZS50aW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHdyaXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBwdWJsaWMgYXN5bmMgd3JpdGUoZW50cnk6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCYXRjaChbZW50cnldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVCYXRjaChlbnRyaWVzOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBlbnRyaWVzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgICAgICAgY29uc3Qgc3RhbXBlZCA9IHJvd3MubWFwKHJvdyA9PiAoeyB0aW1lOiBnZXRUaW1lVW5pcXVlKCksIHJvdyB9KSk7XG4gICAgICAgIGNvbnN0IGZyYW1lZCA9IGZyYW1lUm93cyhzdGFtcGVkKTtcblxuICAgICAgICAvLyBCaWcgYmF0Y2hlcyBza2lwIHRoZSBzdHJlYW0gYW5kIGJlY29tZSBhIGJ1bGsgZmlsZSBkaXJlY3RseSDigJQgc3RyZWFtaW5nIHRob3VzYW5kcyBvZiByb3dzIG9uZSBmcmFtZSBhdCBhIHRpbWUgd291bGQganVzdCBjaHVybi5cbiAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID49IFJPTExPVkVSX1JPV1MgfHwgZnJhbWVkLmxlbmd0aCA+PSBST0xMT1ZFUl9CWVRFUykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZUJ1bGtGaWxlKHJvd3MpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXBzLmJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCByb3cgfSBvZiBzdGFtcGVkKSB0aGlzLnJlYWRlci5hcHBseVdyaXRlKHJvdy5rZXkgYXMgc3RyaW5nLCByb3csIHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCB7IHRpbWUsIHJvdyB9IG9mIHN0YW1wZWQpIHN5bmNCcm9hZGNhc3QodGhpcy5uYW1lLCB7IGtleTogcm93LmtleSBhcyBzdHJpbmcsIHRpbWUsIHZhbHVlOiByb3cgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQXBwZW5kKGZyYW1lZCwgc3RhbXBlZC5sZW5ndGgpO1xuICAgICAgICB2b2lkIHRoaXMubWF5YmVNZXJnZSh7IG9ubHlJZlN0cmVhbUhlYXZ5OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlQmF0Y2goW2tleV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGVCYXRjaChrZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgY29uc3Qgc3RhbXBlZCA9IGtleXMubWFwKGtleSA9PiAoeyB0aW1lOiBnZXRUaW1lVW5pcXVlKCksIGtleSB9KSk7XG4gICAgICAgIHRoaXMuZGVwcy5iYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGltZSwga2V5IH0gb2Ygc3RhbXBlZCkgdGhpcy5yZWFkZXIuYXBwbHlEZWxldGUoa2V5LCB0aW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCBrZXkgfSBvZiBzdGFtcGVkKSBzeW5jQnJvYWRjYXN0KHRoaXMubmFtZSwgeyBrZXksIHRpbWUsIGRlbGV0ZWQ6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQXBwZW5kKGZyYW1lRGVsZXRlcyhzdGFtcGVkKSwgc3RhbXBlZC5sZW5ndGgpO1xuICAgICAgICB2b2lkIHRoaXMubWF5YmVNZXJnZSh7IG9ubHlJZlN0cmVhbUhlYXZ5OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIENvYWxlc2NlIHN0cmVhbSBhcHBlbmRzIG9uIGEgcmFtcGluZyBwZXItY29sbGVjdGlvbiBzY2hlZHVsZSAodGhlIGJyb3dzZXIgcmV3cml0ZXMgdGhlIHdob2xlIGZpbGUgcGVyIGFwcGVuZCkuIFRoZSBmaXJzdCB3cml0ZSBhZnRlciBhIGx1bGwgZmx1c2hlcyBpbW1lZGlhdGVseSBzbyBhIHNpbmdsZSBlZGl0LXRoZW4tY2xvc2UgaXMgc2F2ZWQgYXQgb25jZTsgc3VzdGFpbmVkIHdyaXRlcyByYW1wIHRvd2FyZCB3cml0ZUZsdXNoTWF4RGVsYXlNcy5cbiAgICBwcml2YXRlIGFzeW5jIHN0cmVhbUFwcGVuZChmcmFtZWQ6IEJ1ZmZlciwgcm93czogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0FwcGVuZHMucHVzaCh7IGZyYW1lZCwgcm93cyB9KTtcbiAgICAgICAgY29uc3QgbWF4ID0gYnVsa0RhdGFiYXNlMlRpbWluZy53cml0ZUZsdXNoTWF4RGVsYXlNcztcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG1heCA8PSAwIHx8IHRoaXMuY3VycmVudEZsdXNoRGVsYXkgPD0gMCB8fCBub3cgLSB0aGlzLmxhc3RXcml0ZVRpbWUgPiBtYXgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFdyaXRlVGltZSA9IG5vdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZsdXNoRGVsYXkgPSBtYXggPiAwID8gTWF0aC5taW4obWF4LCBXUklURV9GTFVTSF9GSVJTVF9TVEVQX01TKSA6IDA7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdFdyaXRlVGltZSA9IG5vdztcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hUaW1lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5mbHVzaFRpbWVyID0gdW5kZWZpbmVkOyB2b2lkIHRoaXMuZmx1c2hQZW5kaW5nKCk7IH0sIHRoaXMuY3VycmVudEZsdXNoRGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudEZsdXNoRGVsYXkgPSBNYXRoLm1pbihtYXgsIHRoaXMuY3VycmVudEZsdXNoRGVsYXkgKiAyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaFBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoVGltZXIgIT09IHVuZGVmaW5lZCkgeyBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKTsgdGhpcy5mbHVzaFRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgICAgIHRoaXMuZmx1c2hDaGFpbiA9IHRoaXMuZmx1c2hDaGFpbi50aGVuKCgpID0+IHRoaXMuZG9GbHVzaCgpKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBzdHJlYW0gZmx1c2ggZmFpbGVkLCB3aWxsIHJldHJ5OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2hDaGFpbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nQXBwZW5kcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLnBlbmRpbmdBcHBlbmRzLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gQnVmZmVyLmNvbmNhdChiYXRjaC5tYXAocCA9PiBwLmZyYW1lZCkpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRTdHJlYW1GaWxlTmFtZSgpO1xuICAgICAgICBpZiAoZmlsZU5hbWUgIT09IHRoaXMuY3VycmVudFN0cmVhbUZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbiBmYWlsdXJlIHRoZSB0aHJvdyBsZWF2ZXMgcGVuZGluZ0FwcGVuZHMgaW50YWN0IHNvIGEgbGF0ZXIgZmx1c2ggcmV0cmllcy5cbiAgICAgICAgYXdhaXQgc3RvcmFnZS5hcHBlbmQoZmlsZU5hbWUsIGNvbWJpbmVkKTtcbiAgICAgICAgLy8gTmV3IGVudHJpZXMgYXBwZW5kZWQgZHVyaW5nIHRoZSBhd2FpdCBhcmUgYWZ0ZXIgYGJhdGNoYCDigJQgcmVtb3ZpbmcgdGhlIGZyb250IGlzIGV4YWN0bHkgdGhlIGZsdXNoZWQgc2V0LlxuICAgICAgICB0aGlzLnBlbmRpbmdBcHBlbmRzLnNwbGljZSgwLCBiYXRjaC5sZW5ndGgpO1xuICAgICAgICB0aGlzLnN0cmVhbUJ5dGVzT25EaXNrICs9IGNvbWJpbmVkLmxlbmd0aDtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGJhdGNoKSB0aGlzLnN0cmVhbVJvd3NPbkRpc2sgKz0gcC5yb3dzO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlQnl0ZXMgKz0gY29tYmluZWQubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzID49IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtRmlsZU1heEJ5dGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlQnl0ZXMgPSAwO1xuICAgICAgICAgICAgdm9pZCB0aGlzLmZvbGRPd25TdHJlYW0oZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdHJlYW1GaWxlTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICAvLyBTZWFsIG91ciBjdXJyZW50IGZpbGUgb25jZSBpdCBhZ2VzIHBhc3QgdGhlIHNlYWwgdGhyZXNob2xkIOKAlCBubyBmaWxlIGlzIGV2ZXIgYXBwZW5kZWQgdG8gcGFzdCBpdHMgc2VhbCBhZ2UsIHdoaWNoIGxldHMgYSBjb25zb2xpZGF0aW9uIHNhZmVseSBmb2xkIGl0IG9uY2UgYWdlZC5cbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtRmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSBwYXJzZVN0cmVhbUZpbGVOYW1lKHRoaXMuc3RyZWFtRmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKGluZm8gJiYgRGF0ZS5ub3coKSAtIGluZm8udGltZXN0YW1wID49IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtU2VhbEFnZU1zKSB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1GaWxlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IGBzdHJlYW1fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX0ke1NUUkVBTV9FWFRFTlNJT059YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW1GaWxlTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZvbGRPd25TdHJlYW0oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmZvID0gcGFyc2VTdHJlYW1GaWxlTmFtZShmaWxlTmFtZSk7XG4gICAgICAgIGlmICghaW5mbykgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXQoW10sIFtpbmZvXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogZm9sZGluZyBvd24gc3RyZWFtICR7ZmlsZU5hbWV9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoZW50cnk6IFBhcnRpYWw8VD4gJiB7IGtleTogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQmF0Y2goW2VudHJ5XSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZUJhdGNoKGVudHJpZXM6IChQYXJ0aWFsPFQ+ICYgeyBrZXk6IHN0cmluZyB9KVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgY29uc3QgcHJlc2VudDogVFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUVudHJ5ID0gdGhpcy5yZWFkZXIub3ZlcmxheS5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IG92ZXJsYXlFbnRyeSA/IG92ZXJsYXlFbnRyeS52YWx1ZSAhPT0gREVMRVRFRCA6IGluZGV4LmtleXMuaGFzKGVudHJ5LmtleSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9LnVwZGF0ZToga2V5ICR7SlNPTi5zdHJpbmdpZnkoZW50cnkua2V5KX0gaXMgbm90IGluIHRoZSBjb2xsZWN0aW9uLCBpZ25vcmluZ2ApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlc2VudC5wdXNoKGVudHJ5IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXNlbnQubGVuZ3RoKSBhd2FpdCB0aGlzLndyaXRlQmF0Y2gocHJlc2VudCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIGZpbGUgbGlzdGluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgcHJpdmF0ZSBhc3luYyBsaXN0RmlsZXMoKTogUHJvbWlzZTx7IGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW107IHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdIH0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGF3YWl0IHN0b3JhZ2UuZ2V0S2V5cygpO1xuICAgICAgICAvLyBBIGNvbnN1bWVkLW1lcmdlIGlucHV0IGlzIGhpZGRlbiBmcm9tIHJlYWRzIHRoZSBpbnN0YW50IGl0cyBkZWxldGlvbiBtYXJrZXIgZXhpc3RzIOKAlCB0aGF0J3Mgd2hhdCBzdG9wcyBpdCBmcm9tIGJlaW5nIHJlLXJlYWQgYW5kIHJlLW1lcmdlZC4gUGh5c2ljYWwgZGVsZXRpb24gKyBtYXJrZXIgY2xlYW51cCBydW5zIG9uIGEgdGhyb3R0bGUgKG5vdCBpbmxpbmUpIHNvIGEgcmVhZCBpc24ndCBzbG93ZWQgYnkgaXQuXG4gICAgICAgIGNvbnN0IG1hcmtlcnMgPSBhd2FpdCByZWFkRGVsZXRlTWFya2VycyhzdG9yYWdlLCBuYW1lcyk7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gbWFya2VyRXhjbHVzaW9ucyhtYXJrZXJzKTtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoKSB2b2lkIHRoaXMucHJvY2Vzc01hcmtlcnMoKTtcbiAgICAgICAgY29uc3QgYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgbmFtZXMpIHtcbiAgICAgICAgICAgIGlmIChleGNsdWRlZC5oYXMobikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG4uZW5kc1dpdGgoRklMRV9FWFRFTlNJT04pKSB7IGNvbnN0IHAgPSBwYXJzZUZpbGVOYW1lKG4pOyBpZiAocCkgYnVsa0ZpbGVzLnB1c2gocCk7IH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG4uZW5kc1dpdGgoU1RSRUFNX0VYVEVOU0lPTikpIHsgY29uc3QgcCA9IHBhcnNlU3RyZWFtRmlsZU5hbWUobik7IGlmIChwKSBzdHJlYW1GaWxlcy5wdXNoKHApOyB9XG4gICAgICAgIH1cbiAgICAgICAgYnVsa0ZpbGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGlmIChhLnRpbWVzdGFtcCAhPT0gYi50aW1lc3RhbXApIHJldHVybiBiLnRpbWVzdGFtcCAtIGEudGltZXN0YW1wO1xuICAgICAgICAgICAgcmV0dXJuIGEuZmlsZU5hbWUgPCBiLmZpbGVOYW1lICYmIDEgfHwgYS5maWxlTmFtZSA+IGIuZmlsZU5hbWUgJiYgLTEgfHwgMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnQoc3RyZWFtRmlsZXMsIGYgPT4gZi50aW1lc3RhbXApO1xuICAgICAgICByZXR1cm4geyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH07XG4gICAgfVxuXG4gICAgLy8gVGhyb3R0bGVkIG1hcmtlciBob3VzZWtlZXBpbmc6IGRlbGV0ZSBpbnB1dHMgd2hvc2UgcmVwbGFjZW1lbnQgb3V0cHV0cyBoYXZlIGxhbmRlZCAob3Igd2hvc2UgbWFya2VyIGhhcyBhZ2VkIG91dCkgYW5kIHJldGlyZSBmdWxmaWxsZWQgbWFya2Vycy4gVHJpZ2dlcmVkIGZyb20gbGlzdEZpbGVzLCBzbyBpdCdzIGdhdGVkIHRvIGF2b2lkIGEgZGVsZXRlIHN0b3JtIHVuZGVyIGhlYXZ5IHJlYWRzLlxuICAgIHByaXZhdGUgcHJvY2Vzc01hcmtlcnMgPSB0aHJvdHRsZUZ1bmN0aW9uKDMwICogMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gYXdhaXQgc3RvcmFnZS5nZXRLZXlzKCk7XG4gICAgICAgIGNvbnN0IG1hcmtlcnMgPSBhd2FpdCByZWFkRGVsZXRlTWFya2VycyhzdG9yYWdlLCBuYW1lcyk7XG4gICAgICAgIGlmIChtYXJrZXJzLmxlbmd0aCkgYXdhaXQgcHJvY2Vzc0RlbGV0ZU1hcmtlcnModGhpcy5uYW1lLCBzdG9yYWdlLCBtYXJrZXJzLCBuYW1lcyk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlQnVsa0ZpbGUocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5leHRGaWxlVGltZSgpO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB0aW1lcyA9IHJvd3MubWFwKCgpID0+IG5vdyk7XG4gICAgICAgIGZvciAoY29uc3QgYnVpbHQgb2YgYnVpbGRGaWxlQnVmZmVyKHJvd3MsIHRpbWVzKSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5ld0ZpbGVOYW1lKHRpbWVzdGFtcCk7XG4gICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNldChuYW1lLCBlbmNvZGVDb21wcmVzc2VkQmxvY2tzKGJ1aWx0LmJ1ZmZlcikpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMudHJpZ2dlclJlYnVpbGQoKTtcbiAgICAgICAgdm9pZCB0aGlzLm1heWJlTWVyZ2UoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgbWVyZ2UgcG9saWN5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBDYWxsZWQgYm90aCBwZXJpb2RpY2FsbHkgKHZpc2liaWxpdHkgdGltZXIpIGFuZCBvbiB3cml0ZXMgKHdpdGggdGhlIHN0cmVhbU5lZWRzRm9sZCBnYXRlIHNvIGEgc21hbGwgd3JpdGUgZG9lc24ndCBkcmFnIHRoZSBtZXJnZSB0aHJvdWdoKS4gVGhlIG1lcmdlSW5GbGlnaHQgY2hlY2sgaW4gdHJ5TWVyZ2VOb3cgc2tpcHMgYW55IGNhbGwgdGhhdCBhcnJpdmVzIHdoaWxlIGEgcHJldmlvdXMgb25lIGlzIHN0aWxsIHJ1bm5pbmcg4oCUIHNvIDUtbWluIHRpbWVyIHRpY2tzIGRvbid0IHBpbGUgdXAuXG4gICAgcHJpdmF0ZSBhc3luYyBtYXliZU1lcmdlKG9wdHM6IHsgb25seUlmU3RyZWFtSGVhdnk/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYXV0b21hdGljQ29tcGFjdGlvbkFsbG93ZWQoKSkgcmV0dXJuO1xuICAgICAgICBpZiAob3B0cy5vbmx5SWZTdHJlYW1IZWF2eSAmJiAhdGhpcy5zdHJlYW1OZWVkc0ZvbGQoKSkgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50cnlNZXJnZVRocm90dGxlZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogYmFja2dyb3VuZCBtZXJnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgXCJ3ZSBkaWRuJ3QgbWVyZ2VcIiByZXN1bHQgYW5kIGxvZyBpdCAodGhyb3R0bGVkIOKAlCBzZWUgTUVSR0VfU0tJUF9MT0dfSU5URVJWQUxfTVMpLiBGb3IgbG9jayByZWFzb25zIHRoZSBsb2cgYW5kIHJlc3VsdCBpbmNsdWRlIHRoZSBob2xkZXIgYW5kIHRpbWUgdW50aWwgdGhlIGxvY2sgZ29lcyBzdGFsZS5cbiAgICBwcml2YXRlIGFzeW5jIG1lcmdlU2tpcChyZWFzb246IE1lcmdlU2tpcFJlYXNvbik6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIGxldCBsb2NrOiBNZXJnZUxvY2tJbmZvIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVhc29uID09PSBcInRhYkxvY2tIZWxkXCIpIHtcbiAgICAgICAgICAgIGxvY2sgPSBwZWVrTWVyZ2VMb2NrKHRoaXMubmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVhc29uID09PSBcImZpbGVMb2NrSGVsZFwiKSB7XG4gICAgICAgICAgICBsb2NrID0gYXdhaXQgcGVla01lcmdlRmlsZUxvY2soYXdhaXQgdGhpcy5zdG9yYWdlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0TWVyZ2VTa2lwTG9nTXMgPj0gTUVSR0VfU0tJUF9MT0dfSU5URVJWQUxfTVMpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdE1lcmdlU2tpcExvZ01zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGxvY2sgJiYgYCAoaGVsZCBieSAke2xvY2suaG9sZGVySWR9LCBleHBpcmVzIGluICR7Zm9ybWF0VGltZShNYXRoLm1heCgwLCBsb2NrLmV4cGlyZXNJbk1zKSl9KWAgfHwgXCJcIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKFwibWVyZ2VcIil9IHNraXBwZWQ6ICR7cmVhc29ufSR7ZGV0YWlsfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1lcmdlZDogZmFsc2UsIHNraXBSZWFzb246IHJlYXNvbiwgbG9ja0hvbGRlcklkOiBsb2NrPy5ob2xkZXJJZCwgbG9ja0V4cGlyZXNJbk1zOiBsb2NrPy5leHBpcmVzSW5NcyB9O1xuICAgIH1cblxuICAgIC8vIEFjcXVpcmUgYm90aCBtZXJnZSBsb2NrcyAoc2FtZS10YWIgbWVyZ2VJbkZsaWdodCwgY3Jvc3MtdGFiIGxvY2FsU3RvcmFnZSwgY3Jvc3MtcHJvY2VzcyBmaWxlKSwgcnVuIHRoZSBwYXNzLCByZWxlYXNlLiBTa2lwcyAod2l0aCB0aGUgcmVhc29uKSBpbnN0ZWFkIG9mIHdhaXRpbmcgd2hlbiBhbnkgb2YgdGhlbSBpcyBoZWxkLlxuICAgIHByaXZhdGUgYXN5bmMgcnVuTG9ja2VkTWVyZ2UocnVuOiAoKSA9PiBQcm9taXNlPE1lcmdlQXR0ZW1wdFJlc3VsdD4pOiBQcm9taXNlPE1lcmdlQXR0ZW1wdFJlc3VsdD4ge1xuICAgICAgICBpZiAodGhpcy5tZXJnZUluRmxpZ2h0KSByZXR1cm4gYXdhaXQgdGhpcy5tZXJnZVNraXAoXCJtZXJnZUluRmxpZ2h0XCIpO1xuICAgICAgICBpZiAoIXRyeUFjcXVpcmVNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCkpIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlU2tpcChcInRhYkxvY2tIZWxkXCIpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IGhhdmVGaWxlTG9jayA9IGF3YWl0IHRyeUFjcXVpcmVNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIHdyaXRlcklkKTtcbiAgICAgICAgaWYgKCFoYXZlRmlsZUxvY2spIHtcbiAgICAgICAgICAgIHJlbGVhc2VNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tZXJnZVNraXAoXCJmaWxlTG9ja0hlbGRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXJnZUluRmxpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RvcEhlYXJ0YmVhdCA9IHN0YXJ0TWVyZ2VGaWxlTG9ja0hlYXJ0YmVhdChzdG9yYWdlLCB3cml0ZXJJZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzdG9wSGVhcnRiZWF0KCk7XG4gICAgICAgICAgICBhd2FpdCByZWxlYXNlTWVyZ2VGaWxlTG9jayhzdG9yYWdlLCB3cml0ZXJJZCk7XG4gICAgICAgICAgICByZWxlYXNlTWVyZ2VMb2NrKHRoaXMubmFtZSwgd3JpdGVySWQpO1xuICAgICAgICAgICAgdGhpcy5tZXJnZUluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgYmFja2dyb3VuZCBwYXRoIChtYXliZU1lcmdlKSBnb2VzIHRocm91Z2ggdGhpcyBzbyB3cml0ZSBidXJzdHMgY29hbGVzY2U7IGV4cGxpY2l0IGNhbGxlcnMgdXNlIHRyeU1lcmdlTm93IGRpcmVjdGx5IGFuZCBnZXQgdGhlIHBlci1jYWxsIHJlc3VsdC5cbiAgICBwcml2YXRlIHRyeU1lcmdlVGhyb3R0bGVkID0gdGhyb3R0bGVGdW5jdGlvbigxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudHJ5TWVyZ2VOb3coKTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBhc3luYyB0cnlNZXJnZU5vdygpOiBQcm9taXNlPE1lcmdlQXR0ZW1wdFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5Mb2NrZWRNZXJnZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBhd2FpdCB0aGlzLnRlc3RNZXJnZUlOVEVSTkFMX0RPX05PVF9DQUxMKCk7XG4gICAgICAgICAgICByZXR1cm4geyBtZXJnZWQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTxNZXJnZUF0dGVtcHRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuTG9ja2VkTWVyZ2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICAgICAgICAgIHN5bmNCcm9hZGNhc3RTZWFsKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICAgICAgaWYgKGJ1bGtGaWxlcy5sZW5ndGggKyBzdHJlYW1GaWxlcy5sZW5ndGggPCAxKSByZXR1cm4gYXdhaXQgdGhpcy5tZXJnZVNraXAoXCJub3RoaW5nVG9NZXJnZVwiKTtcbiAgICAgICAgICAgIC8vIGNvbXBhY3QoKSBmb2xkcyBldmVyeSBmaWxlIOKGkiBubyBvbGRlciBkYXRhIHN1cnZpdmVzIG91dHNpZGUgaXQg4oaSIHN1cnZpdmluZyB0b21ic3RvbmVzIGNhbiBiZSBkcm9wcGVkIChub3RoaW5nIGxlZnQgdG8gc3VwcHJlc3MpLlxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXQoYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4geyBtZXJnZWQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1lcmdlKHRpbWVMbzogbnVtYmVyLCB0aW1lSGk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGltZUhpID49IERhdGUubm93KCkpIHsgc3luY0Jyb2FkY2FzdFNlYWwodGhpcy5uYW1lKTsgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDsgfVxuICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGYgPT4gdGhpcy5yZWFkQnVsa0hlYWRlcihmLmZpbGVOYW1lKSkpO1xuICAgICAgICBjb25zdCBzZWxCdWxrID0gYnVsa0ZpbGVzLmZpbHRlcigoZiwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaCA9IGhlYWRlcnNbaV07XG4gICAgICAgICAgICBpZiAoIWgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghaC5tYXhUaW1lICYmICFoLm1pblRpbWUpIHJldHVybiB0aW1lTG8gPD0gMDtcbiAgICAgICAgICAgIHJldHVybiBoLm1pblRpbWUgPD0gdGltZUhpICYmIGgubWF4VGltZSA+PSB0aW1lTG87XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxTdHJlYW0gPSBzdHJlYW1GaWxlcy5maWx0ZXIoZiA9PlxuICAgICAgICAgICAgZi50aW1lc3RhbXAgPD0gdGltZUhpICYmIGYudGltZXN0YW1wICsgYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1TZWFsQWdlTXMgPj0gdGltZUxvKTtcbiAgICAgICAgaWYgKHNlbEJ1bGsubGVuZ3RoICsgc2VsU3RyZWFtLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXQoc2VsQnVsaywgc2VsU3RyZWFtLCB0aW1lTG8gPD0gMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkQnVsa0hlYWRlcihmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxCdWxrSGVhZGVySW5mbyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgbWFrZVJhd0dldFJhbmdlKHN0b3JhZ2UsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVJZCA9IG51bGxKb2luKHRoaXMubmFtZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgb3BlbmVkID0gYXdhaXQgYmxvY2tDYWNoZS5vcGVuKGZpbGVJZCwgcmF3LnNpemUsIHJhdy5yYXdHZXRSYW5nZSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbG9hZEJ1bGtIZWFkZXIob3BlbmVkLmdldFJhbmdlLCBvcGVuZWQudW5jb21wcmVzc2VkU2l6ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmlsZUxvZ2ljYWxTaXplKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgbWFrZVJhd0dldFJhbmdlKHN0b3JhZ2UsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVJZCA9IG51bGxKb2luKHRoaXMubmFtZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgb3BlbmVkID0gYXdhaXQgYmxvY2tDYWNoZS5vcGVuKGZpbGVJZCwgcmF3LnNpemUsIHJhdy5yYXdHZXRSYW5nZSk7XG4gICAgICAgICAgICByZXR1cm4gb3BlbmVkLnVuY29tcHJlc3NlZFNpemU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEEgYnVsayBmaWxlIHRoYXQgd29uJ3QgbG9hZCBpcyBlaXRoZXIgYW4gaW4tcHJvZ3Jlc3Mgd3JpdGUgKHJlY2VudCkgb3IgYSBjcmFzaGVkIHBhcnRpYWwgd3JpdGUgKHN0YWxlKS4gV2FybiB3aGlsZSByZWNlbnQsIGRlbGV0ZSBvbmNlIGNsZWFybHkgYWJhbmRvbmVkIOKAlCBkZWxldGluZyBpcyBzYWZlIGJlY2F1c2UgdGhlIHdyaXRlIHByb3RvY29sIGFsd2F5cyBsYW5kcyB0aGUgcmVwbGFjZW1lbnQgYmVmb3JlIHJlbW92aW5nIHRoZSBmaWxlIGl0IHN1cGVyc2VkZXMuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVVbnJlYWRhYmxlRmlsZShmaWxlOiBCdWxrRmlsZUluZm8sIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBhZ2VNcyA9IERhdGUubm93KCkgLSBmaWxlLnRpbWVzdGFtcDtcbiAgICAgICAgaWYgKGFnZU1zID4gU1RBTEVfREVMRVRFX01TKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogZGVsZXRpbmcgc3RhbGUgdW5yZWFkYWJsZSBidWxrIGZpbGUgJHtmaWxlLmZpbGVOYW1lfSAoJHtNYXRoLnJvdW5kKGFnZU1zIC8gODY0MDAwMDApfWQgb2xkKTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5yZW1vdmUoZmlsZS5maWxlTmFtZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZW1vdmVFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBmYWlsZWQgdG8gZGVsZXRlICR7ZmlsZS5maWxlTmFtZX06ICR7KHJlbW92ZUVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBza2lwcGluZyB1bnJlYWRhYmxlIGJ1bGsgZmlsZSAke2ZpbGUuZmlsZU5hbWV9IChyZWNlbnQgLSBtYXkgYmUgaW4tcHJvZ3Jlc3MpOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG9uZSBtZXJnZSBwcmltaXRpdmUuIFJlYWRzICsgcGxhbnMgKyB3cml0ZXMgb3V0cHV0cyBiZWZvcmUgZGVsZXRpbmcgYW55IGlucHV0LCBzbyBhIGNyYXNoIGxlYXZlcyBkdXBsaWNhdGVzIChuZXh0IG1lcmdlIGRlZHVwZXMpIHJhdGhlciB0aGFuIGEgZ2FwLiBBZnRlciB0aGUgZmlsZSBzZXQgY2hhbmdlcyBvbiBkaXNrLCB3ZSB0cmlnZ2VyIGFuIGluZGV4IHJlYnVpbGQgKyBhdG9taWMgc3dhcDsgb25jZSBzd2FwIGNvbXBsZXRlcywgdGhlIGNvbnN1bWVkIGZpbGVzJyBibG9jay1jYWNoZSBlbnRyaWVzIGFyZSBldmljdGVkIChubyBjb25zdW1lciBjYW4gYXNrIGZvciB0aGVtIG5vdykuXG4gICAgLy8gXG4gICAgLy8gU2VyaWFsaXplZDogZm9sZE93blN0cmVhbSArIG1lcmdlKHRpbWVMbywgdGltZUhpKSArIHRlc3RNZXJnZSdzIHJ1bk1lcmdlIGFsbCBoaXQgdGhpczsgdGhlIGxvY2sgY292ZXJzIHRyeU1lcmdlTm93L2NvbXBhY3QgYnV0IHRob3NlIHR3byBwYXRocyBieXBhc3MgaXQuIHJ1bkluU2VyaWFsIHF1ZXVlcyBzbyB0aGV5IG5ldmVyIGNvbGxpZGUgb24gdGhlIGZpbGUgc2V0LlxuICAgIHByaXZhdGUgbWVyZ2VGaWxlU2V0ID0gcnVuSW5TZXJpYWwoYXN5bmMgKGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10sIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLCBpbmNsdWRlc09sZGVzdCA9IGZhbHNlLCBmb3JjZURlbGV0ZVN0cmVhbXMgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICB0aGlzLnJlYWRlci5iZWdpbkNvbXBhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldElubmVyKGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMsIGluY2x1ZGVzT2xkZXN0LCBmb3JjZURlbGV0ZVN0cmVhbXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuZW5kQ29tcGFjdGlvbigpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGFzeW5jIG1lcmdlRmlsZVNldElubmVyKGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10sIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLCBpbmNsdWRlc09sZGVzdDogYm9vbGVhbiwgZm9yY2VEZWxldGVTdHJlYW1zOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV4dEZpbGVUaW1lKCk7XG5cbiAgICAgICAgLy8gVGhlIGNhbGxlcidzIGJ1bGtGaWxlcyBjYW1lIGZyb20gYSBgbGlzdEZpbGVzKClgIHNuYXBzaG90LiBCZXR3ZWVuIHRoZW4gYW5kIG5vdyBhbnkgZmlsZSBjb3VsZCBiZSBnb25lIChhbm90aGVyIHRhYidzIGRlZmVycmVkIGRlbGV0ZSwgbWFudWFsIGNsZWFudXApLiBUaGUgc3ViQ2FjaGVzIHJlYWRlciBmb3IgYSBkZWxldGVkIGZpbGUgaXMgc2lsZW50bHkgc3RhbGUg4oCUIGl0cyBpbi1tZW1vcnkgbWV0YWRhdGEgc3RpbGwgcmVzb2x2ZXMsIGJ1dCB0aGUgdmVyeSBuZXh0IGdldFJhbmdlIGFnYWluc3QgZGlzayB0aHJvd3MuIFJlLXZlcmlmeSBleGlzdGVuY2UgdXAtZnJvbnQgYW5kIGRyb3AgdGhlIGNhY2hlIGVudHJ5IGZvciBhbnl0aGluZyB0aGF0IHZhbmlzaGVkLCBzbyB3ZSBkb24ndCBldmVuIHRyeSB0byBwbGFuIGFyb3VuZCBhIGdob3N0IGZpbGUuXG4gICAgICAgIGNvbnN0IHZlcmlmaWVkQnVsa0ZpbGVzID0gKGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzdG9yYWdlLmdldEluZm8oZi5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmZvKSB7IHRoaXMuc3ViQ2FjaGVzLmJ1bGsuZGVsZXRlKGYuZmlsZU5hbWUpOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YkNhY2hlcy5idWxrLmRlbGV0ZShmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkpLmZpbHRlcigoZik6IGYgaXMgQnVsa0ZpbGVJbmZvID0+IGYgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGJ1bGtGaWxlcyA9IHZlcmlmaWVkQnVsa0ZpbGVzO1xuXG4gICAgICAgIGNvbnN0IGNvbnN1bWVkQnVsazogQnVsa0ZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3QgYnVsa1JlYWRlcnM6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXJbXSA9IFtdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gYXdhaXQgbG9hZEZpbGVSZWFkZXIodGhpcy5uYW1lLCBzdG9yYWdlLCBmLCB0aGlzLnN1YkNhY2hlcy5idWxrKTtcbiAgICAgICAgICAgICAgICBidWxrUmVhZGVycy5wdXNoKHIpO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkQnVsay5wdXNoKGYpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IC8qIG1pc3Npbmcgb3IgY29ycnVwdCDigJQgc2tpcDsgaXRzIGRhdGEgbGl2ZXMgaW4gYW5vdGhlciBmaWxlICovIH1cbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbURhdGEgPSBhd2FpdCBsb2FkU3RyZWFtRW50cmllcyh0aGlzLm5hbWUsIHN0b3JhZ2UsIHN0cmVhbUZpbGVzLCB0aGlzLnN1YkNhY2hlcy5zdHJlYW0pO1xuICAgICAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJTdHJlYW1FbnRyaWVzKHN0cmVhbURhdGEuZW50cmllcyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVJlYWRlciA9IG9yZGVyZWQubGVuZ3RoID8gc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMob3JkZXJlZCwgMCkucmVhZGVyIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHJlYWRlcnMgPSBzdHJlYW1SZWFkZXIgPyBbc3RyZWFtUmVhZGVyLCAuLi5idWxrUmVhZGVyc10gOiBidWxrUmVhZGVycztcbiAgICAgICAgY29uc3QgcmVhZGVyTmFtZXMgPSBzdHJlYW1SZWFkZXIgPyBbXCIoc3RyZWFtcylcIiwgLi4uY29uc3VtZWRCdWxrLm1hcChmID0+IGYuZmlsZU5hbWUpXSA6IGNvbnN1bWVkQnVsay5tYXAoZiA9PiBmLmZpbGVOYW1lKTtcbiAgICAgICAgaWYgKCFyZWFkZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgICAgICAgIC4uLmF3YWl0IFByb21pc2UuYWxsKGNvbnN1bWVkQnVsay5tYXAoYXN5bmMgZiA9PiAoeyBuYW1lOiBmLmZpbGVOYW1lLCBzaXplOiAoYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpPy5zaXplID8/IDAgfSkpKSxcbiAgICAgICAgICAgIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+ICh7IG5hbWU6IGYuZmlsZU5hbWUsIHNpemU6IHN0cmVhbURhdGEuc2l6ZXMuZ2V0KGYuZmlsZU5hbWUpID8/IDAgfSkpLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpblRvdGFsID0gaW5wdXRzLnJlZHVjZSgoYSwgZikgPT4gYSArIGYuc2l6ZSwgMCk7XG4gICAgICAgIGNvbnN0IG1lcmdlU3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIENvbGxlY3QgZWFjaCBzdGVwIGluc3RlYWQgb2YgbG9nZ2luZyBpdCBsaXZlOyBlbWl0dGVkIGF0IHRoZSBlbmQgYXMgb25lXG4gICAgICAgIC8vIGV4cGFuZGVkIGNvbnNvbGUuZ3JvdXAgc28gYSBtZXJnZSB0YWtlcyBvbmUgY29sbGFwc2libGUgYmxvY2ssIG5vdCBhXG4gICAgICAgIC8vIHNjcmVlbmZ1bCAoYW5kIG5ldmVyIHRoZSBwZXItZmlsZSBuYW1lIGR1bXAgaXQgdXNlZCB0byBzcGV3KS5cbiAgICAgICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEVhY2ggc3RlcCByZWNvcmRzIHRoZSB0aW1lIHNwZW50IHNpbmNlIHRoZSBwcmV2aW91cyBzdGVwIGluIGJsdWUgYXQgdGhlIGZyb250LCBzbyBjYWxsZXJzIGNhbiBqdXN0IGRlc2NyaWJlIHdoYXQgdGhleSBkaWQgYW5kIG5vdCBib3RoZXIgbWVhc3VyaW5nL2Zvcm1hdHRpbmcgZWxhcHNlZCB0aW1lcyB0aGVtc2VsdmVzLlxuICAgICAgICBsZXQgbGFzdFN0ZXBNcyA9IG1lcmdlU3RhcnRNcztcbiAgICAgICAgY29uc3QgbG9nID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBsaW5lRm9ybWF0dGVkID0gYCR7Ymx1ZShmb3JtYXRUaW1lKG5vdyAtIGxhc3RTdGVwTXMpKX0gJHtsaW5lfWA7XG4gICAgICAgICAgICAvLyBETyBOT1QgUkVNT1ZFIFRISVMgTE9HISBPYnZpb3VzbHksIHdlIHNob3VsZCBiZSBsb2dnaW5nIGFzIHdlIHJ1biwgb3IgZWxzZSB3ZSBkb24ndCBnZXQgcHJvZ3Jlc3MuIFdoeSB3b3VsZCB3ZSBzdG9wIGdldHRpbmcgcHJvZ3Jlc3M/IFByb2dyZXNzIGlzIGFsbW9zdCBtb3JlIGltcG9ydGFudCB0aGFuIHNob3dpbmcgYSBzdW1tYXJ5IGF0IHRoZSBlbmQuLi5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmVGb3JtYXR0ZWQpO1xuICAgICAgICAgICAgc3RlcHMucHVzaChsaW5lRm9ybWF0dGVkKTtcbiAgICAgICAgICAgIGxhc3RTdGVwTXMgPSBub3c7XG4gICAgICAgIH07XG4gICAgICAgIGxvZyhgJHttYWdlbnRhKFwicmVhZFwiKX06ICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgZmlsZShzKSwgJHtmbXRCeXRlcyhpblRvdGFsKX1gKTtcblxuICAgICAgICBjb25zdCBuZXdOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgbWVyZ2VSZXN1bHQgPSBhd2FpdCBydW5QbGFubmVkTWVyZ2Uoe1xuICAgICAgICAgICAgc291cmNlczogcmVhZGVycyxcbiAgICAgICAgICAgIHNvdXJjZU5hbWVzOiByZWFkZXJOYW1lcyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICB3cml0ZUZpbGU6IGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm5hbWUgPSBuZXdGaWxlTmFtZSh0aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KGZuYW1lLCBlbmNvZGVDb21wcmVzc2VkQmxvY2tzKGRhdGEpKTtcbiAgICAgICAgICAgICAgICBuZXdOYW1lcy5wdXNoKGZuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmbmFtZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk/LnNpemUgPz8gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBmbmFtZSwgc2l6ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2FycmllZERlbGV0ZXMgPSBpbmNsdWRlc09sZGVzdCA/IDAgOiBtZXJnZVJlc3VsdC5jYXJyaWVkRGVsZXRlcy5zaXplO1xuICAgICAgICBjb25zdCBvdXROYW1lcyA9IFsuLi5uZXdOYW1lc107XG4gICAgICAgIGlmIChjYXJyaWVkRGVsZXRlcykge1xuICAgICAgICAgICAgY29uc3QgY2FycnlOYW1lID0gYHN0cmVhbV8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfSR7U1RSRUFNX0VYVEVOU0lPTn1gO1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoY2FycnlOYW1lLCBmcmFtZURlbGV0ZXMoWy4uLm1lcmdlUmVzdWx0LmNhcnJpZWREZWxldGVzXS5tYXAoKFtrZXksIHRpbWVdKSA9PiAoeyB0aW1lLCBrZXkgfSkpKSk7XG4gICAgICAgICAgICBvdXROYW1lcy5wdXNoKGNhcnJ5TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXRzID0gYXdhaXQgUHJvbWlzZS5hbGwob3V0TmFtZXMubWFwKGFzeW5jIG4gPT4gKHsgbmFtZTogbiwgc2l6ZTogKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhuKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKT8uc2l6ZSA/PyAwIH0pKSk7XG4gICAgICAgIGNvbnN0IG91dFRvdGFsID0gb3V0cHV0cy5yZWR1Y2UoKGEsIGYpID0+IGEgKyBmLnNpemUsIDApO1xuICAgICAgICBsb2coYCR7bWFnZW50YShcIndyb3RlXCIpfTogJHtvdXRwdXRzLmxlbmd0aH0gb3V0cHV0IGZpbGUocyksICR7Zm10Qnl0ZXMob3V0VG90YWwpfSR7Y2FycmllZERlbGV0ZXMgPyBgLCAke2NhcnJpZWREZWxldGVzfSB0b21ic3RvbmVzIGNhcnJpZWRgIDogXCJcIn1gKTtcblxuICAgICAgICBjb25zb2xlLmdyb3VwKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKFwibWVyZ2VcIil9OiAke2ZtdEJ5dGVzKGluVG90YWwpfSAtPiAke2ZtdEJ5dGVzKG91dFRvdGFsKX0gKCR7aW5wdXRzLmxlbmd0aH0tPiR7b3V0cHV0cy5sZW5ndGh9IGZpbGVzKSBpbiAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIG1lcmdlU3RhcnRNcyl9YCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdGVwcykgY29uc29sZS5sb2cobGluZSk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBzb3VyY2VzIHJ1blBsYW5uZWRNZXJnZSBhY3R1YWxseSB1c2VkIGNhbiBiZSByZXRpcmVkIOKAlCBhIHNvdXJjZSBpdCBkcm9wcGVkIG1pZC1wbGFuIChmaWxlIGdvbmUsIGNvcnJ1cHRpb24pIHN0aWxsIGhvbGRzIGRhdGEgd2UgY291bGRuJ3QgbWVyZ2UgaW4sIHNvIGxlYXZlIGl0IG9uIGRpc2sgYW5kIGxldCBhIGZ1dHVyZSBtZXJnZSByZS1hdHRlbXB0IGl0LlxuICAgICAgICBjb25zdCB1c2VkQ29uc3VtZWRCdWxrID0gY29uc3VtZWRCdWxrLmZpbHRlcihmID0+IG1lcmdlUmVzdWx0LnVzZWRTb3VyY2VOYW1lcy5oYXMoZi5maWxlTmFtZSkpO1xuICAgICAgICBjb25zdCB1c2VkU3RyZWFtRmlsZXMgPSBzdHJlYW1GaWxlcy5maWx0ZXIoZiA9PiBtZXJnZVJlc3VsdC51c2VkU291cmNlTmFtZXMuaGFzKGYuZmlsZU5hbWUpIHx8IG1lcmdlUmVzdWx0LnVzZWRTb3VyY2VOYW1lcy5oYXMoXCIoc3RyZWFtcylcIikpO1xuICAgICAgICAvLyBBIHN0cmVhbSBtYXkgc3RpbGwgYmUgYXBwZW5kZWQgdG8gYWZ0ZXIgd2UgcmVhZCBpdCAodGhlIHdyaXRlciBoYXNuJ3Qgc2VhbGVkL21vdmVkIG9uKTsgb25seSByZXRpcmUgc3RyZWFtcyBjYW5EZWxldGVTdHJlYW0gY2xlYXJzIOKAlCB0aGUgcmVzdCBzdGF5IGxpdmUgYW5kIGEgbGF0ZXIgbWVyZ2UgcmUtZm9sZHMgdGhlbSBvbmNlIHNlYWxlZC4gQnVsayBmaWxlcyBhcmUgaW1tdXRhYmxlLCBzbyBhIHVzZWQgb25lIGlzIGFsd2F5cyBzYWZlIHRvIHJldGlyZS5cbiAgICAgICAgY29uc3QgZGVsZXRhYmxlU3RyZWFtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHVzZWRTdHJlYW1GaWxlcykge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2FuRGVsZXRlU3RyZWFtKGYsIERhdGUubm93KCksIHN0cmVhbURhdGEuc2l6ZXMsIGZvcmNlRGVsZXRlU3RyZWFtcykpIGRlbGV0YWJsZVN0cmVhbXMucHVzaChmLmZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxldGVGaWxlcyA9IFsuLi51c2VkQ29uc3VtZWRCdWxrLm1hcChmID0+IGYuZmlsZU5hbWUpLCAuLi5kZWxldGFibGVTdHJlYW1zXTtcblxuICAgICAgICAvLyBXcml0ZSBhIGRlbGV0aW9uIG1hcmtlciBpbnN0ZWFkIG9mIGRlbGV0aW5nIGlubGluZS4gRnJvbSB0aGUgbmV4dCByZWFkIG9uLCBsaXN0RmlsZXMgaGlkZXMgdGhlc2UgaW5wdXRzIChzbyB0aGV5J3JlIG5ldmVyIHJlLW1lcmdlZCDigJQgdGhlIGxvb3AgZml4KSwgYW5kIHByb2Nlc3NNYXJrZXJzIHJlbW92ZXMgdGhlbSBwaHlzaWNhbGx5IG9uY2UgdGhlIG91dHB1dHMgaGF2ZSBsYW5kZWQgb3IgdGhlIG1hcmtlciBhZ2VzIG91dC4gTWFya2VyIEJFRk9SRSB0aGUgcmVidWlsZCBzbyB0aGUgZnJlc2hseS1zd2FwcGVkIGluZGV4IGFscmVhZHkgZXhjbHVkZXMgdGhlIHJldGlyZWQgaW5wdXRzLlxuICAgICAgICBpZiAoZGVsZXRlRmlsZXMubGVuZ3RoKSBhd2FpdCB3cml0ZURlbGV0ZU1hcmtlcihzdG9yYWdlLCB7IGRlbGV0ZUZpbGVzLCByZXBsYWNlZEJ5OiBvdXROYW1lcyB9KTtcblxuICAgICAgICAvLyBSZWJ1aWxkICsgc3dhcCBzbyB0aGUgaW5kZXggc2VlcyB0aGUgbmV3IG91dHB1dHMgYW5kIGRyb3BzIHRoZSByZXRpcmVkIGlucHV0cy4gQmxvY2stY2FjaGUgZXZpY3Rpb24gZm9yIHRoZSBkcm9wcGVkIGlucHV0cyBoYXBwZW5zIGhlcmUgKHRoZXkncmUgbm8gbG9uZ2VyIGluIHRoZSBuZXcgaW5kZXgncyBmaWxlU2V0KS5cbiAgICAgICAgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICByZXR1cm4gbmV3TmFtZXMubGVuZ3RoID4gMCB8fCBjYXJyaWVkRGVsZXRlcyA+IDA7XG4gICAgfVxuXG4gICAgLy8gQSBzdHJlYW0gaXMgc2FmZSB0byBkZWxldGUgaWZmIG5vIHdyaXRlciB3aWxsIGFwcGVuZCB0byBpdCBhZ2FpbjogaXQncyBhZ2VkIHBhc3QgdGhlIHNlYWwgYWdlICh3cml0ZXIgaGFzIHByb3ZhYmx5IHN3aXRjaGVkIGZpbGVzKSBPUiBjcm9zcy10YWIgc3luYyBpcyBvbiBBTkQgaXRzIHNpemUgZGlkbid0IGNoYW5nZSB3aGlsZSB3ZSByZWFkIGl0LiBFbHNlIGxlYXZlIGl0IOKAlCB0aGUgZGF0YSBpcyBhbHNvIGluIHRoZSBuZXcgYnVsayBmaWxlOyBhIGxhdGVyIG1lcmdlIGRlbGV0ZXMgaXQgb25jZSBhZ2VkLlxuICAgIHByaXZhdGUgYXN5bmMgY2FuRGVsZXRlU3RyZWFtKGY6IFN0cmVhbUZpbGVJbmZvLCBub3c6IG51bWJlciwgc2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sIGZvcmNlID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKG5vdyAtIGYudGltZXN0YW1wID49IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtU2VhbEFnZU1zKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc1N5bmNTdXBwb3J0ZWQoKSAmJiAhZm9yY2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVhZFNpemUgPSBzaXplcy5nZXQoZi5maWxlTmFtZSk7XG4gICAgICAgIGlmIChyZWFkU2l6ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBpbmZvO1xuICAgICAgICB0cnkgeyBpbmZvID0gYXdhaXQgKGF3YWl0IHRoaXMuc3RvcmFnZSgpKS5nZXRJbmZvKGYuZmlsZU5hbWUpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHJldHVybiAhIWluZm8gJiYgaW5mby5zaXplID09PSByZWFkU2l6ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1lcmdlU3BhY2luZ0RlbGF5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB0b3RhbCA9IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVyZ2VTcGFjaW5nTXM7XG4gICAgICAgIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gdHJ5QWNxdWlyZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKTtcbiAgICAgICAgY29uc3Qgc3RlcCA9IDE1ICogMTAwMDtcbiAgICAgICAgbGV0IHdhaXRlZCA9IDA7XG4gICAgICAgIHdoaWxlICh3YWl0ZWQgPCB0b3RhbCkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ociA9PiBzZXRUaW1lb3V0KHIsIE1hdGgubWluKHN0ZXAsIHRvdGFsIC0gd2FpdGVkKSkpO1xuICAgICAgICAgICAgd2FpdGVkICs9IHN0ZXA7XG4gICAgICAgICAgICBpZiAoIXRyeUFjcXVpcmVNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWVyZ2UgcG9saWN5ICh0d28gcGFzc2VzLCBzcGFjZWQgYnkgbWVyZ2VTcGFjaW5nTXMpOlxuICAgIC8vICAgMSkgQ29uc29saWRhdGUgcmVjZW50IGZyYWdtZW50YXRpb246IHRha2UgbmV3ZXN0IGZpbGVzIHVwIHRvIH5GSVJTVF9NRVJHRV9CWVRFUzsgbWVyZ2UgdGhlbSBpbnRvIG9uZSB3aGVuIHRoZXkgZnJhZ21lbnQgb3Igc3BhbiB0b28gd2lkZSBhIHRpbWUgcmFuZ2UuXG4gICAgLy8gICAyKSBLZXktc3RyYXRpZnk6IHdhbGsgYWxsIGtleXMgaW4gfktFWV9HUk9VUF9CWVRFUyBncm91cHM7IHJld3JpdGUgZ3JvdXBzIHdob3NlIGR1cGxpY2F0ZS1rZXkgZnJhY3Rpb24gcGFzc2VzIERVUF9USFJFU0hPTEQsIGhpZ2hlc3QgZmlyc3QuIFVzZSB0cnlNZXJnZSBpbnN0ZWFkXG4gICAgcHJpdmF0ZSBhc3luYyB0ZXN0TWVyZ2VJTlRFUk5BTF9ET19OT1RfQ0FMTCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IG1lcmdlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZygpO1xuICAgICAgICBjb25zdCBydW5NZXJnZSA9IGFzeW5jIChidWxrOiBCdWxrRmlsZUluZm9bXSwgc3RyZWFtOiBTdHJlYW1GaWxlSW5mb1tdKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgICBpZiAobWVyZ2VkICYmICFhd2FpdCB0aGlzLm1lcmdlU3BhY2luZ0RlbGF5KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChidWxrLCBzdHJlYW0pKSBtZXJnZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSGFyZCBzdHJlYW0gbGltaXQ6IGEgc3RyZWFtIHRoaXMgYmlnIG1ha2VzIGV2ZXJ5IHJlYWQgcHVsbCBhIGh1Z2UgZmlsZSDihpIgZm9sZCBBTEwgb2YgaXQgbm93LCBmb3JjZS1kZWxldGUgKGNhbkRlbGV0ZVN0cmVhbSBzdGlsbCByZXF1aXJlcyBzaXplLXN0YWJsZSwgc28gYW4gYWN0aXZlIHdyaXRlciBuZXZlciBsb3NlcyBkYXRhKS5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW1GaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChzdHJlYW1GaWxlcy5tYXAoYXN5bmMgZiA9PiB7IHRyeSB7IHJldHVybiAoYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpKT8uc2l6ZSA/PyAwOyB9IGNhdGNoIHsgcmV0dXJuIDA7IH0gfSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsU3RyZWFtQnl0ZXMgPSBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxTdHJlYW1CeXRlcyA+IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtRm9sZEhhcmRMaW1pdEJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKFwiZm9sZFwiKX0gc3RyZWFtIHRpZXIgJHtmbXRCeXRlcyh0b3RhbFN0cmVhbUJ5dGVzKX0gb3ZlciBoYXJkIGxpbWl0ICR7Zm10Qnl0ZXMoYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkSGFyZExpbWl0Qnl0ZXMpfSAtIGZvbGRpbmcgYWxsIHN0cmVhbXMgbm93YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChbXSwgc3RyZWFtRmlsZXMsIGZhbHNlLCB0cnVlKSkgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXNzIDE6IGNvbnNvbGlkYXRlIHJlY2VudC4gT25seSBzZWFsIHdoZW4gY3Jvc3MtdGFiIHN5bmMgY2FuIGZvbGQgcmVjZW50IHN0cmVhbXMg4oCUIGluIE5vZGUgY2FuRGVsZXRlU3RyZWFtIG5lZWRzIHRoZW0gYWdlZCBhbnl3YXksIHNvIHNlYWxpbmcgd291bGQganVzdCBmcmFnbWVudCBzdHJlYW1zIGV2ZXJ5IHBhc3MuXG4gICAgICAgIGNvbnN0IGZvbGRSZWNlbnRTdHJlYW1zID0gaXNTeW5jU3VwcG9ydGVkKCk7XG4gICAgICAgIGlmIChmb2xkUmVjZW50U3RyZWFtcykge1xuICAgICAgICAgICAgc3luY0Jyb2FkY2FzdFNlYWwodGhpcy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICAgICAgY29uc3QgYnVsa01ldGEgPSBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzaXplLCBoZWFkZXJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZmlsZUxvZ2ljYWxTaXplKGYuZmlsZU5hbWUpLCB0aGlzLnJlYWRCdWxrSGVhZGVyKGYuZmlsZU5hbWUpXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2luZDogXCJidWxrXCIgYXMgY29uc3QsIGZpbGU6IGYsIGJ5dGVzOiBzaXplID8/IDAsIHRpbWU6IGhlYWRlcj8ubWF4VGltZSB8fCBmLnRpbWVzdGFtcCB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtTWV0YTogeyBraW5kOiBcInN0cmVhbVwiOyBmaWxlOiBTdHJlYW1GaWxlSW5mbzsgYnl0ZXM6IG51bWJlcjsgdGltZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmIG9mIHN0cmVhbUZpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWdlZCA9IERhdGUubm93KCkgLSBmLnRpbWVzdGFtcCA+PSBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbVNlYWxBZ2VNcztcbiAgICAgICAgICAgICAgICBpZiAoIWZvbGRSZWNlbnRTdHJlYW1zICYmICFhZ2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgIHRyeSB7IGNvbnN0IGluZm8gPSBhd2FpdCAoYXdhaXQgdGhpcy5zdG9yYWdlKCkpLmdldEluZm8oZi5maWxlTmFtZSk7IGJ5dGVzID0gaW5mbz8uc2l6ZSA/PyAwOyB9IGNhdGNoIHsgYnl0ZXMgPSAwOyB9XG4gICAgICAgICAgICAgICAgc3RyZWFtTWV0YS5wdXNoKHsga2luZDogXCJzdHJlYW1cIiwgZmlsZTogZiwgYnl0ZXMsIHRpbWU6IGYudGltZXN0YW1wIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4uYnVsa01ldGEsIC4uLnN0cmVhbU1ldGFdLnNvcnQoKGEsIGIpID0+IGIudGltZSAtIGEudGltZSk7XG4gICAgICAgICAgICBjb25zdCByZWNlbnQ6IHR5cGVvZiBpdGVtcyA9IFtdO1xuICAgICAgICAgICAgbGV0IHJlY2VudEJ5dGVzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICByZWNlbnQucHVzaChpdCk7XG4gICAgICAgICAgICAgICAgcmVjZW50Qnl0ZXMgKz0gaXQuYnl0ZXM7XG4gICAgICAgICAgICAgICAgaWYgKHJlY2VudEJ5dGVzID49IEZJUlNUX01FUkdFX0JZVEVTKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSByZWNlbnQubGVuZ3RoID8gcmVjZW50WzBdLnRpbWUgLSByZWNlbnRbcmVjZW50Lmxlbmd0aCAtIDFdLnRpbWUgOiAwO1xuICAgICAgICAgICAgY29uc3QgcmVjZW50U3RyZWFtQnl0ZXMgPSByZWNlbnQucmVkdWNlKChhLCBpdCkgPT4gYSArIChpdC5raW5kID09PSBcInN0cmVhbVwiID8gaXQuYnl0ZXMgOiAwKSwgMCk7XG4gICAgICAgICAgICBjb25zdCBoZWF2eVN0cmVhbSA9IHJlY2VudFN0cmVhbUJ5dGVzID4gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkVHJpZ2dlckJ5dGVzO1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcmVkID1cbiAgICAgICAgICAgICAgICByZWNlbnQubGVuZ3RoID49IDIgJiYgKHJlY2VudC5sZW5ndGggPiBidWxrRGF0YWJhc2UyVGltaW5nLmZpcnN0TWVyZ2VUcmlnZ2VyRmlsZXMgfHwgc3BhbiA+IGJ1bGtEYXRhYmFzZTJUaW1pbmcuZmlyc3RNZXJnZVRyaWdnZXJSYW5nZU1zKVxuICAgICAgICAgICAgICAgIHx8IGhlYXZ5U3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRyaWdnZXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJiID0gcmVjZW50LmZpbHRlcihpID0+IGkua2luZCA9PT0gXCJidWxrXCIpLm1hcChpID0+IChpLmZpbGUgYXMgQnVsa0ZpbGVJbmZvKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnMgPSByZWNlbnQuZmlsdGVyKGkgPT4gaS5raW5kID09PSBcInN0cmVhbVwiKS5tYXAoaSA9PiAoaS5maWxlIGFzIFN0cmVhbUZpbGVJbmZvKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBydW5NZXJnZShyYiwgcnMpKSByZXR1cm4gbWVyZ2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hvbGUtdGllciBkZWR1cCBzaG9ydC1jaXJjdWl0IChiZXR3ZWVuIFBhc3MgMSBhbmQgdGhlIHBlci1ncm91cCBQYXNzIDIpOiB3aGVuIHRoZSBidWxrIHRpZXIgaXMgYmlnIGVub3VnaCBBTkQgbW9zdGx5IGR1cGxpY2F0ZXMsIGZvbGQgZXZlcnkgYnVsayBmaWxlIGluIG9uZSBtZXJnZS4gQXZvaWRzIHRoZSBwZXItZ3JvdXAgd2FsaydzIDUtbWluIHNwYWNpbmcgw5cgTi1ncm91cHMgbGF0ZW5jeS5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBidWxrRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgICAgICBpZiAoYnVsa0ZpbGVzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxTbG90cyA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBidWxrRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IGxvYWRGaWxlUmVhZGVyKHRoaXMubmFtZSwgc3RvcmFnZSwgZiwgdGhpcy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IHJlYWRlci50b3RhbEJ5dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTbG90cyArPSByZWFkZXIua2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgcmVhZGVyLmtleXMpIHVuaXF1ZUtleXMuYWRkKGspO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHsgLyogc2tpcCB1bnJlYWRhYmxlICovIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZHVwRnJhY3Rpb24gPSB0b3RhbFNsb3RzID8gKHRvdGFsU2xvdHMgLSB1bmlxdWVLZXlzLnNpemUpIC8gdG90YWxTbG90cyA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPiBERURVUF9UUklHR0VSX0JZVEVTICYmIGR1cEZyYWN0aW9uID4gREVEVVBfVFJJR0dFUl9GUkFDVElPTikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtibHVlKHRoaXMubmFtZSl9ICR7bWFnZW50YShcImRlZHVwXCIpfTogJHtmbXRCeXRlcyh0b3RhbEJ5dGVzKX0gYWNyb3NzICR7YnVsa0ZpbGVzLmxlbmd0aH0gYnVsayBmaWxlKHMpLCAke01hdGgucm91bmQoZHVwRnJhY3Rpb24gKiAxMDApfSUgZHVwbGljYXRlIGtleS1zbG90cyAtIGZvbGRpbmcgYWxsIGF0IG9uY2VgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBydW5NZXJnZShidWxrRmlsZXMsIFtdKSkgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXNzIDI6IGtleS1zdHJhdGlmaWVkIGRlZHVwbGljYXRpb24uIERpc2pvaW50IGtleSByYW5nZXMg4oaSIG9uZSBncm91cCdzIG1lcmdlIGRvZXNuJ3QgY2hhbmdlIGFub3RoZXIncyBkdXBsaWNhdGlvbjsgcmUtc2VsZWN0IGVhY2ggZ3JvdXAncyBmaWxlcyBhdCBtZXJnZSB0aW1lIChzZXQgc2hpZnRzKS5cbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYXdhaXQgdGhpcy5maW5kRHVwbGljYXRlR3JvdXBzKCk7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoZiA9PiB0aGlzLnJlYWRCdWxrSGVhZGVyKGYuZmlsZU5hbWUpKSk7XG4gICAgICAgICAgICBjb25zdCBncm91cEZpbGVzID0gYnVsa0ZpbGVzLmZpbHRlcigoZiwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBoZWFkZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChoLm1pbktleSA9PT0gdW5kZWZpbmVkIHx8IGgubWF4S2V5ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBoLm1pbktleSA8PSBnLmhpICYmIGgubWF4S2V5ID49IGcubG87XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChncm91cEZpbGVzLmxlbmd0aCA+PSAyKSB7IGlmICghYXdhaXQgcnVuTWVyZ2UoZ3JvdXBGaWxlcywgW10pKSByZXR1cm4gbWVyZ2VkOyB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmluZER1cGxpY2F0ZUdyb3VwcygpOiBQcm9taXNlPHsgbG86IHN0cmluZzsgaGk6IHN0cmluZzsgZHVwOiBudW1iZXIgfVtdPiB7XG4gICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICBpZiAoYnVsa0ZpbGVzLmxlbmd0aCA8IDIpIHJldHVybiBbXTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBpbmZvcyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IGxvYWRGaWxlUmVhZGVyKHRoaXMubmFtZSwgc3RvcmFnZSwgZiwgdGhpcy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogcmVhZGVyLmtleXMsIGJ5dGVzOiByZWFkZXIudG90YWxCeXRlcyB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogW10gYXMgc3RyaW5nW10sIGJ5dGVzOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3Qga2V5Q291bnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgdG90YWxTbG90cyA9IDAsIHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaW5mb3MpIHtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gaS5ieXRlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBpLmtleXMpIHsga2V5Q291bnQuc2V0KGssIChrZXlDb3VudC5nZXQoaykgfHwgMCkgKyAxKTsgdG90YWxTbG90cysrOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsU2xvdHMgPT09IDApIHJldHVybiBbXTtcbiAgICAgICAgY29uc3QgYnl0ZXNQZXJTbG90ID0gdG90YWxCeXRlcyAvIHRvdGFsU2xvdHM7XG4gICAgICAgIGNvbnN0IHNvcnRlZEtleXMgPSBbLi4ua2V5Q291bnQua2V5cygpXS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGdyb3VwczogeyBsbzogc3RyaW5nOyBoaTogc3RyaW5nOyBkdXA6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgbGV0IGdTdGFydCA9IDAsIGdCeXRlcyA9IDAsIGdTbG90cyA9IDAsIGdVbmlxdWUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBrZXlDb3VudC5nZXQoc29ydGVkS2V5c1tpXSkgPz8gMDtcbiAgICAgICAgICAgIGdCeXRlcyArPSBjICogYnl0ZXNQZXJTbG90OyBnU2xvdHMgKz0gYzsgZ1VuaXF1ZSArPSAxO1xuICAgICAgICAgICAgaWYgKGdCeXRlcyA+PSBLRVlfR1JPVVBfQllURVMgfHwgaSA9PT0gc29ydGVkS2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVwID0gKGdTbG90cyAtIGdVbmlxdWUpIC8gZ1Nsb3RzO1xuICAgICAgICAgICAgICAgIGlmIChkdXAgPiBEVVBfVEhSRVNIT0xEKSBncm91cHMucHVzaCh7IGxvOiBzb3J0ZWRLZXlzW2dTdGFydF0sIGhpOiBzb3J0ZWRLZXlzW2ldLCBkdXAgfSk7XG4gICAgICAgICAgICAgICAgZ1N0YXJ0ID0gaSArIDE7IGdCeXRlcyA9IDA7IGdTbG90cyA9IDA7IGdVbmlxdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdyb3Vwcy5zb3J0KChhLCBiKSA9PiBiLmR1cCAtIGEuZHVwKTtcbiAgICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcmVhZHMg4oCUIGZvcndhcmRlZCB0byBCdWxrRGF0YWJhc2VSZWFkZXIsIHdpdGggcmVidWlsZC1vbi1taXNzaW5nIHJldHJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHB1YmxpYyBhc3luYyBnZXRTaW5nbGVGaWVsZDxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IFByb21pc2U8VFtDXSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2luZ2xlRmllbGRPYmo8QyBleHRlbmRzIGtleW9mIFQ+KGtleTogc3RyaW5nLCBjb2x1bW46IEMpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGRPYmooa2V5LCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29sdW1uPEMgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEMpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfVtdPiB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlYWRlci5nZXRDb2x1bW4oY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0S2V5cygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2luZ2xlRmllbGRTeW5jPEMgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IHN0cmluZywgY29sdW1uOiBDKTogVFtDXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbmdsZUZpZWxkT2JqU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkT2JqU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtblN5bmM8QyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogQyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUW0NdOyB0aW1lOiBudW1iZXIgfVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uU3luYyhjb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZpZWxkTG9hZGVkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IGJvb2xlYW4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0ZpZWxkTG9hZGVkU3luYyhrZXksIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29sdW1uTG9hZGVkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oY29sdW1uOiBDKTogYm9vbGVhbiB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmlzQ29sdW1uTG9hZGVkU3luYyhjb2x1bW4pO1xuICAgIH1cblxuICAgIC8vIFJlYWN0aXZlOiB0cnVlIHdoaWxlIGEgbWVyZ2UgaXMgcmV3cml0aW5nIHRoaXMgY29sbGVjdGlvbidzIGZpbGVzLiBVc2UgdGhpcyBpbiBVSSB0byBzaG93IGEgXCJjb21wYWN0aW5n4oCmXCIgaW5kaWNhdG9yLiBDb3VudHMgYm90aCBiYWNrZ3JvdW5kIG1lcmdlcyAobWF5YmVNZXJnZSkgYW5kIGV4cGxpY2l0IGNvbXBhY3QvbWVyZ2UgY2FsbHMuIEJlY29tZXMgZmFsc2Ugb25jZSB0aGUgbmV3IGluZGV4IGlzIHN3YXBwZWQgaW4gKHRoZSBkZWZlcnJlZC1kZWxldGUgd2luZG93IGlzIE5PVCBjb3VudGVkKS5cbiAgICBwdWJsaWMgaXNDb21wYWN0aW5nU3luYygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmlzQ29tcGFjdGluZ1N5bmMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29sdW1uSW5mbygpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIHJldHVybiBpbmRleC5yZWFkZXIuY29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5U3RhdHMoKTogUHJvbWlzZTx7IHJhd0tleXM6IG51bWJlcjsgZmluYWxLZXlzOiBudW1iZXI7IHdhc3RlZEtleXM6IG51bWJlcjsgZHVwbGljYXRpb246IG51bWJlcjsgcmVhZGVyczogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IHJhd0tleXMgPSBpbmRleC5yZWFkZXIucmF3S2V5Q291bnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsS2V5cyA9IGluZGV4LnJlYWRlci5rZXlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd0tleXMsXG4gICAgICAgICAgICBmaW5hbEtleXMsXG4gICAgICAgICAgICB3YXN0ZWRLZXlzOiByYXdLZXlzIC0gZmluYWxLZXlzLFxuICAgICAgICAgICAgZHVwbGljYXRpb246IGZpbmFsS2V5cyA/IHJhd0tleXMgLyBmaW5hbEtleXMgOiAwLFxuICAgICAgICAgICAgcmVhZGVyczogaW5kZXgucmVhZGVyLnJlYWRlckNvdW50LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRSZWFkZXJJbmZvKCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJvd0NvdW50OiBpbmRleC5yZWFkZXIucm93Q291bnQsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzOiBpbmRleC5yZWFkZXIudG90YWxCeXRlcyxcbiAgICAgICAgICAgIGtleUNvdW50OiBpbmRleC5yZWFkZXIua2V5cy5sZW5ndGgsXG4gICAgICAgICAgICBzYW1wbGVLZXk6IGluZGV4LnJlYWRlci5rZXlzWzBdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IGluZGV4LnJlYWRlci5jb2x1bW5zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRGaWxlSW5mbygpOiBQcm9taXNlPEJ1bGtGaWxlSW5mb0xpc3Rpbmc+IHtcbiAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHN0YXRPZiA9IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBieXRlczogaW5mbz8uc2l6ZSA/PyAwLCBsYXN0TW9kaWZpZWQ6IGluZm8/Lmxhc3RNb2RpZmllZCA/PyAwIH07XG4gICAgICAgICAgICB9IGNhdGNoIHsgcmV0dXJuIHsgYnl0ZXM6IDAsIGxhc3RNb2RpZmllZDogMCB9OyB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1bGtJbmZvcyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgc3RhdE9mKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYnVsa1wiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGJ5dGVzOiBzdGF0LmJ5dGVzLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgZ2V0RGV0YWlsczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWxrOiByZWFkZXIgaGFzIGtleXMgKyBwZXItcm93IGtleVRpbWVzICsgaGVhZGVyIG1pblRpbWUvbWF4VGltZS4gQ2FjaGVkLCBzbyBjaGVhcC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gYXdhaXQgbG9hZEZpbGVSZWFkZXIodGhpcy5uYW1lLCBzdG9yYWdlLCBmLCB0aGlzLnN1YkNhY2hlcy5idWxrKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5czogcmVhZGVyLmtleXMsIG1pblRpbWU6IHJlYWRlci5taW5UaW1lLCBtYXhUaW1lOiByZWFkZXIubWF4VGltZSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm9zID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHN0YXRPZihmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZi5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmVhbVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGJ5dGVzOiBzdGF0LmJ5dGVzLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgZ2V0RGV0YWlsczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJlYW06IG11c3QgcGFyc2UgdGhlIGZpbGUgdG8gd2FsayBldmVyeSBlbnRyeSDigJQgaGVhZGVyIGhhcyBubyBrZXkvdGltZSBib3VuZHMuIENhY2hlZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGxvYWRTdHJlYW1FbnRyaWVzKHRoaXMubmFtZSwgc3RvcmFnZSwgW2ZdLCB0aGlzLnN1YkNhY2hlcy5zdHJlYW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5UaW1lID0gSW5maW5pdHksIG1heFRpbWUgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkYXRhLmVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnRpbWUgPCBtaW5UaW1lKSBtaW5UaW1lID0gZS50aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGltZSA+IG1heFRpbWUpIG1heFRpbWUgPSBlLnRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5lbnRyeS5yb3cpIGtleXMuYWRkKGUuZW50cnkucm93LmtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5lbnRyeS5kZWxldGVkS2V5ICE9PSB1bmRlZmluZWQpIGtleXMuYWRkKGUuZW50cnkuZGVsZXRlZEtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IFsuLi5rZXlzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWU6IG1pblRpbWUgPT09IEluZmluaXR5ID8gMCA6IG1pblRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhUaW1lOiBtYXhUaW1lID09PSAtSW5maW5pdHkgPyAwIDogbWF4VGltZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IFsuLi5idWxrSW5mb3MsIC4uLnN0cmVhbUluZm9zXTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGNvdW50OiBmaWxlcy5sZW5ndGgsIHRvdGFsQnl0ZXM6IGZpbGVzLnJlZHVjZSgoYSwgZikgPT4gYSArIGYuYnl0ZXMsIDApIH07XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBCdWxrRmlsZURldGFpbHMgPSB7IGtleXM6IHN0cmluZ1tdOyBtaW5UaW1lOiBudW1iZXI7IG1heFRpbWU6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgQnVsa0ZpbGVFbnRyeSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogXCJidWxrXCIgfCBcInN0cmVhbVwiO1xuICAgIGJ5dGVzOiBudW1iZXI7XG4gICAgLy8gRmlsZXN5c3RlbSBtdGltZSAobXMgc2luY2UgZXBvY2gpIOKAlCAwIGlmIHRoZSBzdG9yYWdlIGxheWVyIGRpZG4ndCByZXR1cm4gb25lLlxuICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgIC8vIExhenk6IHB1bGxlZCBmcm9tIHRoZSBjYWNoZWQgc3ViLXJlYWRlciBmb3IgYnVsayAoZnJlZSBpZiBsb2FkZWQpLCBvciBmcm9tIGEgcGFyc2Ugb2YgdGhlIHN0cmVhbSBmaWxlIChzbWFsbCDigJQgdGllci0wIHNpemUtY2FwcGVkLCBhbHNvIGNhY2hlZCkuIENhbGwgb25seSB3aGVuIHlvdSBuZWVkIHRoZSBwZXItZmlsZSBkZXRhaWwuXG4gICAgZ2V0RGV0YWlsczogKCkgPT4gUHJvbWlzZTxCdWxrRmlsZURldGFpbHM+O1xufTtcbmV4cG9ydCB0eXBlIEJ1bGtGaWxlSW5mb0xpc3RpbmcgPSB7IGZpbGVzOiBCdWxrRmlsZUVudHJ5W107IGNvdW50OiBudW1iZXI7IHRvdGFsQnl0ZXM6IG51bWJlciB9O1xuXG4iXX0=
|
|
1179
|
-
/* _JS_SOURCE_HASH = "
|
|
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 = "1d9783373e32d67eaecded86d545476bfb5387c5822aae65f97f8133cac7bad9"; */
|