sliftutils 1.7.112 → 1.7.113

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.
Files changed (66) hide show
  1. package/dist/treeSummary.ts.cache +2 -2
  2. package/index.d.ts +2 -1
  3. package/misc/dist/environment.ts.cache +2 -2
  4. package/misc/dist/getSecret.ts.cache +2 -2
  5. package/misc/dist/strings.ts.cache +2 -2
  6. package/misc/dist/zip.ts.cache +2 -2
  7. package/misc/https/dist/certs.ts.cache +2 -2
  8. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  9. package/package.json +1 -1
  10. package/render-utils/dist/observer.tsx.cache +2 -2
  11. package/storage/ArchivesDisk.ts +8 -7
  12. package/storage/IArchives.d.ts +1 -0
  13. package/storage/IArchives.ts +2 -1
  14. package/storage/TransactionFile.d.ts +1 -1
  15. package/storage/TransactionFile.ts +13 -2
  16. package/storage/archiveHelpers.ts +11 -9
  17. package/storage/dist/ArchivesDisk.ts.cache +10 -9
  18. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  19. package/storage/dist/IArchives.ts.cache +3 -3
  20. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  21. package/storage/dist/JSONStorage.ts.cache +2 -2
  22. package/storage/dist/PendingManager.tsx.cache +2 -2
  23. package/storage/dist/StreamingLogs.ts.cache +2 -2
  24. package/storage/dist/TransactionFile.ts.cache +16 -5
  25. package/storage/dist/TransactionStorage.ts.cache +2 -2
  26. package/storage/dist/archiveHelpers.ts.cache +13 -11
  27. package/storage/dist/backblaze.ts.cache +2 -2
  28. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  29. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  30. package/storage/remoteStorage/ArchivesDelayed.ts +3 -3
  31. package/storage/remoteStorage/ArchivesRemote.ts +2 -2
  32. package/storage/remoteStorage/blobStore.ts +15 -15
  33. package/storage/remoteStorage/bucketDisk.ts +2 -1
  34. package/storage/remoteStorage/chainStartup.ts +2 -2
  35. package/storage/remoteStorage/createArchives.ts +13 -13
  36. package/storage/remoteStorage/deployTakeover.ts +1 -1
  37. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +6 -6
  38. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
  39. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
  40. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  41. package/storage/remoteStorage/dist/blobStore.ts.cache +17 -17
  42. package/storage/remoteStorage/dist/bucketDisk.ts.cache +5 -4
  43. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
  44. package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -5
  45. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  46. package/storage/remoteStorage/dist/createArchives.ts.cache +14 -14
  47. package/storage/remoteStorage/dist/deployTakeover.ts.cache +4 -4
  48. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
  49. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  50. package/storage/remoteStorage/dist/remoteConfig.ts.cache +4 -4
  51. package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
  52. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +6 -6
  53. package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
  54. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  55. package/storage/remoteStorage/dist/storageController.ts.cache +7 -7
  56. package/storage/remoteStorage/dist/storageServerState.ts.cache +4 -4
  57. package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
  58. package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
  59. package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
  60. package/storage/remoteStorage/dist/storeSync.ts.cache +8 -8
  61. package/storage/remoteStorage/dist/validation.ts.cache +2 -2
  62. package/storage/remoteStorage/remoteConfig.ts +1 -1
  63. package/storage/remoteStorage/sourceWrapper.ts +3 -3
  64. package/storage/remoteStorage/storageController.ts +4 -4
  65. package/storage/remoteStorage/storageServerState.ts +1 -1
  66. package/storage/remoteStorage/storeSync.ts +7 -7
@@ -1,5 +1,6 @@
1
1
  // Type-only: IArchives.ts re-exports our functions, so a value import back at it would be a require cycle
2
2
  import type { IArchives } from "./IArchives";
3
+ import { formatDateTimeDetailed } from "socket-function/src/formatting/format";
3
4
  import { logStorageError } from "./remoteStorage/storageLogs";
4
5
 
5
6
  // Cross-archive file operations built ON TOP of IArchives (copy, move) - helpers over the interface, not part of it, so they live beside it rather than in it.
@@ -25,11 +26,12 @@ export async function copyArchiveFile(config: {
25
26
  if (!info) return undefined;
26
27
  let size = info.size;
27
28
  // internal (synchronization between replicas of the same key) preserves the source's write time, so ordering survives propagation. A plain copy is a NEW write and is stamped now: the source's old stamp would make it LOSE to any newer write or tombstone at the destination, silently - move a file back to a folder it was deleted from and the copy is dropped, then the caller deletes the source, and the file is gone entirely.
28
- let writeTime = config.internal && info.writeTime || Date.now();
29
+ let writeTime = Math.floor(config.internal && info.writeTime || Date.now());
29
30
  // A destination that already holds a NEWER file must not be overwritten with our older one - and the destination's own only-take-latest would drop the write SILENTLY, leaving the caller believing the copy happened. Refusing here, loudly, is what turns "the remote has something we missed" from a masked bug into a log line the caller can act on.
30
31
  let destInfo = await to.getInfo(toPath, { noFallbacks: config.noFallbacks });
31
- if (destInfo && destInfo.writeTime > writeTime) {
32
- logStorageError(`Refusing to copy ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""}: the destination already has a NEWER file (ours: ${size} bytes at ${new Date(writeTime).toISOString()}, theirs: ${destInfo.size} bytes at ${new Date(destInfo.writeTime).toISOString()}) - copying would roll it back`);
32
+ // Compared at whole-millisecond precision, here and at the confirm below: disk mtimes carry fractional milliseconds, but utimes round-trips only whole ones, so sub-millisecond differences are storage artifacts of the SAME time, not ordering
33
+ if (destInfo && Math.floor(destInfo.writeTime) > Math.floor(writeTime)) {
34
+ logStorageError(`Copy refused - a newer file exists at the destination. Refusing to copy ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""}: ours ${size} bytes at ${formatDateTimeDetailed(writeTime)}, theirs ${destInfo.size} bytes at ${formatDateTimeDetailed(destInfo.writeTime)} - copying would roll it back`);
33
35
  return undefined;
34
36
  }
35
37
  let copiedSize: number;
@@ -57,7 +59,7 @@ export async function copyArchiveFile(config: {
57
59
  let end = Math.min(offset + LARGE_COPY_CHUNK, totalSize);
58
60
  let data = await from.get(path, { range: { start: offset, end }, internal: config.internal, noFallbacks: config.noFallbacks });
59
61
  if (!data || !data.length) {
60
- throw new Error(`Ranged read of ${JSON.stringify(path)} from ${from.getDebugName()} returned ${data && data.length || "nothing"} at ${offset}-${end} (expected ${end - offset} bytes of a ${totalSize} byte file - it changed or vanished mid-copy)`);
62
+ throw new Error(`Ranged read returned nothing mid-copy. Reading ${JSON.stringify(path)} from ${from.getDebugName()} returned ${data && data.length || "nothing"} at ${offset}-${end} (expected ${end - offset} bytes of a ${totalSize} byte file - it changed or vanished mid-copy)`);
61
63
  }
62
64
  offset += data.length;
63
65
  return data;
@@ -67,8 +69,8 @@ export async function copyArchiveFile(config: {
67
69
  }
68
70
  // Every backend drops a superseded write SILENTLY (its only-take-latest is the last line of defense against races the up-front check can't see), so a returned set is not proof the copy landed - only the destination reporting the file at OUR time or newer is. Newer also counts as landed: the destination is at least as new as what we pushed (and b2 always stamps its own, later, upload time).
69
71
  let confirmed = await to.getInfo(toPath, { noFallbacks: config.noFallbacks });
70
- if (!confirmed || confirmed.writeTime < writeTime) {
71
- logStorageError(`Copy of ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""} did not land: we wrote ${copiedSize} bytes at ${new Date(writeTime).toISOString()}, but the destination reports ${confirmed && `${confirmed.size} bytes at ${new Date(confirmed.writeTime).toISOString()}` || "nothing"} - it dropped the write (a newer write or deletion won the race)`);
72
+ if (!confirmed || Math.floor(confirmed.writeTime) < Math.floor(writeTime)) {
73
+ logStorageError(`Copy was silently dropped by the destination. Copy of ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""}: our copy was ${copiedSize} bytes at ${formatDateTimeDetailed(writeTime)}, but the destination reports ${confirmed && `${confirmed.size} bytes at ${formatDateTimeDetailed(confirmed.writeTime)}` || "nothing"} (a newer write or deletion won the race)`);
72
74
  return undefined;
73
75
  }
74
76
  return { writeTime, size: copiedSize };
@@ -105,13 +107,13 @@ export async function moveArchiveFile(config: {
105
107
  // Undefined is two cases (see copyArchiveFile) - asking the source which one keeps the error honest
106
108
  let sourceInfo = await from.getInfo(path, { noFallbacks: config.noFallbacks });
107
109
  if (sourceInfo) {
108
- throw new Error(`Cannot move ${JSON.stringify(path)} (${sourceInfo.size} bytes at ${new Date(sourceInfo.writeTime).toISOString()}) from ${from.getDebugName()}: ${to.getDebugName()} already has a newer file at ${JSON.stringify(toPath)}, and the copy was refused rather than roll it back - the source is left untouched`);
110
+ throw new Error(`Move refused - a newer file exists at the destination. Cannot move ${JSON.stringify(path)} (${sourceInfo.size} bytes at ${formatDateTimeDetailed(sourceInfo.writeTime)}) from ${from.getDebugName()}: ${to.getDebugName()} holds something newer at ${JSON.stringify(toPath)}, and the copy was refused rather than roll it back - the source is left untouched`);
109
111
  }
110
- throw new Error(`Cannot move ${JSON.stringify(path)}: ${from.getDebugName()} does not have it`);
112
+ throw new Error(`Move source does not exist. Cannot move ${JSON.stringify(path)}: ${from.getDebugName()} does not have it`);
111
113
  }
112
114
  let confirmed = await to.getInfo(toPath, { noFallbacks: config.noFallbacks });
113
115
  if (!confirmed) {
114
- throw new Error(`Not deleting ${JSON.stringify(path)} from ${from.getDebugName()} after copying it: ${to.getDebugName()} does not report ${JSON.stringify(toPath)} (the copy claimed to succeed, so something is wrong - the file is left at the source)`);
116
+ throw new Error(`Move copy could not be confirmed - the source is kept. Not deleting ${JSON.stringify(path)} from ${from.getDebugName()} after copying it: ${to.getDebugName()} does not report ${JSON.stringify(toPath)} (the copy claimed to succeed, so something is wrong)`);
115
117
  }
116
118
  await from.del(path);
117
119
  }
@@ -150,8 +150,8 @@ class ArchivesDisk {
150
150
  await this.handles.run(filePath, async () => {
151
151
  if (lastModified) {
152
152
  let existing = await statOrUndefined(filePath);
153
- // An older write never overwrites a newer one (see IArchives.set)
154
- if (existing && lastModified < existing.mtimeMs)
153
+ // An older write never overwrites a newer one (see IArchives.set). Both sides floored: sub-millisecond mtime digits are storage artifacts, not ordering (see get2)
154
+ if (existing && Math.floor(lastModified) < Math.floor(existing.mtimeMs))
155
155
  return;
156
156
  }
157
157
  await fs_1.default.promises.mkdir(path_1.default.dirname(filePath), { recursive: true });
@@ -229,14 +229,15 @@ class ArchivesDisk {
229
229
  return undefined;
230
230
  let start = range && Math.min(range.start, size) || 0;
231
231
  let end = range && Math.min(range.end, size) || size;
232
+ // mtimeMs is floored everywhere this disk reports a time: it carries fractional milliseconds (kernel-stamped files have nanosecond mtimes), but utimes round-trips only whole ones - so a fractional time handed to the rest of the system could never be reproduced by propagation, and every copy of the file would compare "older" than the original forever
232
233
  if (end <= start)
233
- return { data: Buffer.alloc(0), writeTime: stats.mtimeMs, size };
234
+ return { data: Buffer.alloc(0), writeTime: Math.floor(stats.mtimeMs), size };
234
235
  let buffer = Buffer.alloc(end - start);
235
236
  let { bytesRead } = await handle.read(buffer, 0, buffer.length, start);
236
237
  if (bytesRead !== buffer.length) {
237
238
  throw new Error(`Expected ${buffer.length} bytes at ${filePath}:${start}, read ${bytesRead}`);
238
239
  }
239
- return { data: buffer, writeTime: stats.mtimeMs, size };
240
+ return { data: buffer, writeTime: Math.floor(stats.mtimeMs), size };
240
241
  });
241
242
  }
242
243
  async getInfo(key, config) {
@@ -248,7 +249,7 @@ class ArchivesDisk {
248
249
  return undefined;
249
250
  if (!stats.size && !(config === null || config === void 0 ? void 0 : config.includeTombstones))
250
251
  return undefined;
251
- return { writeTime: stats.mtimeMs, size: stats.size };
252
+ return { writeTime: Math.floor(stats.mtimeMs), size: stats.size };
252
253
  });
253
254
  }
254
255
  async find(prefix, config) {
@@ -291,7 +292,7 @@ class ArchivesDisk {
291
292
  // Deleted while we were walking
292
293
  if (!stats)
293
294
  continue;
294
- infos.set(relPath, { path: relPath, createTime: stats.mtimeMs, size: stats.size });
295
+ infos.set(relPath, { path: relPath, createTime: Math.floor(stats.mtimeMs), size: stats.size });
295
296
  }
296
297
  }
297
298
  // The raw disk has no windows, routes, or immutability, so the rest of the SetConfig has nothing to apply to here (the store wrapping this disk is what enforces them)
@@ -351,7 +352,7 @@ class ArchivesDisk {
351
352
  if (lastModified) {
352
353
  // An older write never overwrites a newer one (see IArchives.set) - re-checked HERE, not just when the upload started, because a large upload streams for minutes and that window is exactly when a newer write lands
353
354
  let existing = await statOrUndefined(filePath);
354
- if (existing && lastModified < existing.mtimeMs) {
355
+ if (existing && Math.floor(lastModified) < Math.floor(existing.mtimeMs)) {
355
356
  await fs_1.default.promises.rm(tmpPath, { force: true });
356
357
  return;
357
358
  }
@@ -430,5 +431,5 @@ function applyFindInfoShape(files, prefix, config) {
430
431
  return files;
431
432
  }
432
433
  exports.applyFindInfoShape = applyFindInfoShape;
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQXNOO0FBQ3ROLCtEQUE2RDtBQUU3RCw0YkFBNGI7QUFFNWIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4Qyw2UEFBNlA7QUFDN1AsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBUXJELDhjQUE4YztBQUM5YyxNQUFNLGVBQWU7SUFNakI7UUFMUSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDakQsMERBQTBEO1FBQ2xELFFBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUcvQyxJQUFBLDBCQUFlLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxHQUFHLENBQUksUUFBZ0IsRUFBRSxHQUFxQjtRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FB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QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDbkMsSUFBSSxNQUFjLENBQUM7WUFDbkIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQXJCRCxnREFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzb3J0LCBiaW5hcnlTZWFyY2hCYXNpYyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBEZWxDb25maWcsIEZpbmRDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgTW92ZUZpbGVDb25maWcsIFNldENvbmZpZywgU2V0TGFyZ2VGaWxlQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbi8vIFRoZSBiYXNlIGZpbGUtc3lzdGVtIElBcmNoaXZlczogc3RvcmFnZSBpcyBvbmUtdG8tb25lIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBldmVyeSBrZXkgaXMgZXhhY3RseSBvbmUgcmVhbCBmaWxlIHVuZGVyIDxmb2xkZXI+L2ZpbGVzLCBzbyB0aGUgZmlsZSBzeXN0ZW0gaXRzZWxmIGlzIHRoZSBpbmRleC4gRmlsZSBoYW5kbGVzIGFyZSBjYWNoZWQgYW5kIHJldXNlZCwgYW5kIGNsb3NlZCBvbmNlIGlkbGUgKHNlZSBGaWxlSGFuZGxlQ2FjaGUpLiBBbGwgb3BlcmF0aW9ucyBvbiBhIGZpbGUgcnVuIGluIHNlcmlhbCwgc28gdGhleSBjYW4ndCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIGhhbmRsZSBjbG9zaW5nLiBVc2VkIGFzIHRoZSBkaXNrIHN5bmNocm9uaXphdGlvbiBzb3VyY2Ugb2YgQmxvYlN0b3JlIChzZWUgcmVtb3RlU3RvcmFnZS9ibG9iU3RvcmUudHMpLlxuXG5jb25zdCBIQU5ETEVfSURMRV9USU1FT1VUID0gMTAwMCAqIDYwO1xuY29uc3QgSEFORExFX1NXRUVQX0lOVEVSVkFMID0gMTAwMCAqIDE1O1xuLy8gVXBsb2FkIHRlbXAgZmlsZXMgYXJlIG9ubHkgZ2FyYmFnZSBvbmNlIHRoZXkgYXJlIGNsZWFybHkgYWJhbmRvbmVkLiBBbm90aGVyIHByb2Nlc3MgY2FuIHNoYXJlIG91ciBmb2xkZXIgKGV2ZXJ5IGRlcGxveSBvdmVybGFwIGRvZXMpLCBzbyBhIGZyZXNoIHRlbXAgZmlsZSBtYXkgYmUgSVRTIGluLXByb2dyZXNzIHVwbG9hZCAtIGRlbGV0aW5nIGl0IHdvdWxkIHNpbGVudGx5IHR1cm4gdGhhdCB1cGxvYWQgaW50byBhbiBlbXB0eSBmaWxlLlxuY29uc3QgVVBMT0FEX0FCQU5ET05FRF9BR0UgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogMztcblxudHlwZSBIYW5kbGVFbnRyeSA9IHtcbiAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgIGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICBsYXN0VXNlOiBudW1iZXI7XG59O1xuXG4vLyBDYWNoZXMgb3BlbiBmaWxlIGhhbmRsZXMsIGNsb3NpbmcgdGhlbSBvbmNlIGlkbGUgZm9yIEhBTkRMRV9JRExFX1RJTUVPVVQuIEluc3RlYWQgb2Ygb25lIHNldFRpbWVvdXQgcGVyIGhhbmRsZSwgYSBsaXN0IHNvcnRlZCBieSBsYXN0IHVzZSBpcyBzd2VwdCBwZXJpb2RpY2FsbHkgKGVudHJpZXMgYXJlIG1vdmVkIHZpYSBiaW5hcnkgc2VhcmNoIG9uIGFjY2VzcywgYW5kIGxhc3RVc2UgdmFsdWVzIG9ubHkgaW5jcmVhc2UsIHNvIHRvdWNoZWQgZW50cmllcyBhcHBlbmQgYXQgdGhlIGVuZCkuIEFsc28gc2VyaWFsaXplcyBvcGVyYXRpb25zIHBlciBmaWxlOiBlYWNoIG9wZXJhdGlvbiBvbmx5IHN0YXJ0cyBvbmNlIHRoZSBwcmV2aW91cyBvbmUgb24gdGhlIHNhbWUgZmlsZSBmaW5pc2hlZCwgYW5kIGEgaGFuZGxlIGlzIG5ldmVyIGNsb3NlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgcGVuZGluZyBvbiBpdC5cbmNsYXNzIEZpbGVIYW5kbGVDYWNoZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZUVudHJ5PigpO1xuICAgIC8vIFNvcnRlZCBieSBsYXN0VXNlIGFzY2VuZGluZyAobGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdClcbiAgICBwcml2YXRlIGxydTogSGFuZGxlRW50cnlbXSA9IFtdO1xuICAgIHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChIQU5ETEVfU1dFRVBfSU5URVJWQUwsICgpID0+IHRoaXMuc3dlZXAoKSk7XG4gICAgfVxuXG4gICAgLy8gUnVucyBmbmMgYWZ0ZXIgZXZlcnkgcHJldmlvdXNseSBzY2hlZHVsZWQgb3BlcmF0aW9uIG9uIGZpbGVQYXRoIGhhcyBmaW5pc2hlZFxuICAgIHB1YmxpYyBydW48VD4oZmlsZVBhdGg6IHN0cmluZywgZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBwcmV2LnRoZW4oZm5jKTtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgY2hhaW4gbXVzdCBuZXZlciByZWplY3QsIG9yIG9uZSBmYWlsZWQgb3BlcmF0aW9uIHdvdWxkIHBvaXNvbiBhbGwgbGF0ZXIgb25lc1xuICAgICAgICBsZXQgbGFzdCA9IHJlc3VsdC50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnNldChmaWxlUGF0aCwgbGFzdCk7XG4gICAgICAgIHZvaWQgbGFzdC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN0aWxsIHRoZSBsYXN0IHBlbmRpbmcgb3BlcmF0aW9uIG9uIHRoaXMgZmlsZSwgY2xlYXIgb3Vyc2VsdmVzXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgPT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBjYWxsIGluc2lkZSBydW4oKSBmb3IgdGhlIHNhbWUgZmlsZVBhdGggKHNvIG9wZW5zIGNhbid0IGNvbGxpZGUgd2l0aCBjbG9zZXMpXG4gICAgcHVibGljIGFzeW5jIGdldEhhbmRsZShmaWxlUGF0aDogc3RyaW5nLCBmbGFnczogbnVtYmVyKTogUHJvbWlzZTxmcy5wcm9taXNlcy5GaWxlSGFuZGxlPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5sYXN0VXNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihmaWxlUGF0aCwgZmxhZ3MpO1xuICAgICAgICBlbnRyeSA9IHsgZmlsZVBhdGgsIGhhbmRsZSwgbGFzdFVzZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGZpbGVQYXRoLCBlbnRyeSk7XG4gICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY2FsbCBpbnNpZGUgcnVuKCkgZm9yIHRoZSBzYW1lIGZpbGVQYXRoXG4gICAgcHVibGljIGFzeW5jIGNsb3NlTm93KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChmaWxlUGF0aCk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRnJvbUxSVShlbnRyeTogSGFuZGxlRW50cnkpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoQmFzaWModGhpcy5scnUsIHggPT4geC5sYXN0VXNlLCBlbnRyeS5sYXN0VXNlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgICAvLyBNdWx0aXBsZSBlbnRyaWVzIGNhbiBzaGFyZSBhIGxhc3RVc2UsIHNvIHNjYW4gZm9yIHRoZSBleGFjdCBvbmVcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlID09PSBlbnRyeS5sYXN0VXNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5scnVbaW5kZXhdID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3dlZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gSEFORExFX0lETEVfVElNRU9VVDtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlIDw9IGN1dG9mZikge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5scnVbaW5kZXhdO1xuICAgICAgICAgICAgLy8gQ2FuJ3QgY2xvc2UgYSBoYW5kbGUgd2l0aCBhIHBlbmRpbmcgb3BlcmF0aW9uOyBpdCdsbCBiZSBzd2VwdCBhZnRlciBpdCBmaW5pc2hlc1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZy5oYXMoZW50cnkuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNEaXNrIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvbGRlcjogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgZmlsZXNEaXIgPSBwYXRoLmpvaW4odGhpcy5mb2xkZXIsIFwiZmlsZXNcIik7XG4gICAgcHJpdmF0ZSB1cGxvYWRzRGlyID0gcGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcInVwbG9hZHNcIik7XG4gICAgcHJpdmF0ZSBoYW5kbGVzID0gbmV3IEZpbGVIYW5kbGVDYWNoZSgpO1xuICAgIHByaXZhdGUgbGFyZ2VVcGxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIHsgdG1wUGF0aDogc3RyaW5nIH0+KCk7XG4gICAgcHJpdmF0ZSBuZXh0TGFyZ2VVcGxvYWRJZCA9IDE7XG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLmZpbGVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGhpcy51cGxvYWRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBVUExPQURfQUJBTkRPTkVEX0FHRTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMudXBsb2Fkc0RpcikpIHtcbiAgICAgICAgICAgIGxldCB1cGxvYWRQYXRoID0gcGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgZmlsZSk7XG4gICAgICAgICAgICAvLyBUaGUgbXRpbWUgYWR2YW5jZXMgb24gZXZlcnkgYXBwZW5kLCBzbyBhbiBhY3RpdmUgdXBsb2FkIChldmVuIGFub3RoZXIgcHJvY2VzcydzKSBhbHdheXMgbG9va3MgZnJlc2hcbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZCh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgc3RhdHMubXRpbWVNcyA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgYWJhbmRvbmVkIHVwbG9hZCB0ZW1wIGZpbGUgJHt1cGxvYWRQYXRofSAobGFzdCB3cml0dGVuICR7bmV3IERhdGUoc3RhdHMubXRpbWVNcykudG9JU09TdHJpbmcoKX0pYCk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodXBsb2FkUGF0aCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgZGlzayAke3RoaXMuZm9sZGVyfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgLy8gTm8gbmF0aXZlIGNoYW5nZSBmZWVkIC0gYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgaW4gbWVtb3J5IChzZWUgdGhlIHNjYW5uaW5nIG5vdGUgaW4gU3RvcmVTeW5jLnB1bGxTb3VyY2UgZm9yIHdoeSB0aGUgbGlzdGluZyBpdHNlbGYgdGFrZXMgbm8gZmlsdGVycylcbiAgICAgICAgcmV0dXJuIGZpbHRlckNoYW5nZXMoYXdhaXQgdGhpcy5maW5kSW5mbyhcIlwiKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsZVBhdGgoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIGtleSk7XG4gICAgICAgIGlmICghcmVzdWx0LnN0YXJ0c1dpdGgodGhpcy5maWxlc0RpciArIHBhdGguc2VwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSAke0pTT04uc3RyaW5naWZ5KGtleS5zbGljZSgwLCAyMDApKX0sIGl0IGVzY2FwZXMgdGhlIHN0b3JlIGZvbGRlcmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gZm9yY2VTZXRJbW11dGFibGUgaXMgYWNjZXB0ZWQgYW5kIG5lZWRzIG5vIGhhbmRsaW5nOiBkaXNrIHNvdXJjZXMgYXJlIG5ldmVyIGltbXV0YWJsZSwgYW5kIHRoZSBvbGRlci13cml0ZSBuby1vcCBiZWxvdyBhbHJlYWR5IGdpdmVzIHN5bmNocm9uaXphdGlvbiBpdHMgb25seS10YWtlLXRoZS1sYXRlc3Qgc2VtYW50aWNzXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWc/Lmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBsYXN0TW9kaWZpZWQgPCBleGlzdGluZy5tdGltZU1zKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuT19SRFdSIHwgZnMuY29uc3RhbnRzLk9fQ1JFQVQpO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnRydW5jYXRlKDApO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUudXRpbWVzKG5ldyBEYXRlKGxhc3RNb2RpZmllZCksIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICAvLyBjb25maWcgaXMgYWNjZXB0ZWQgYW5kIGlnbm9yZWQ6IGEgZGlzayBkZWxldGlvbiBpcyBhIHBoeXNpY2FsIHJlbW92ZSAobm8gdG9tYnN0b25lIHRvIHN0YW1wIC0gQmxvYlN0b3JlJ3MgaW5kZXggY2FycmllcyB0aGUgdG9tYnN0b25lIGZvciBkaXNrIHNvdXJjZXMpXG4gICAgcHVibGljIGFzeW5jIGRlbChrZXk6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IE1vdmVGaWxlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGxldCBmcm9tUGF0aCA9IHRoaXMuZmlsZVBhdGgoY29uZmlnLmZyb21QYXRoKTtcbiAgICAgICAgbGV0IHRvUGF0aCA9IHRoaXMuZmlsZVBhdGgoY29uZmlnLnRvUGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZnJvbVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmcm9tUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKHRvUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyh0b1BhdGgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZSh0b1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUoZnJvbVBhdGgsIHRvUGF0aCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgc291cmNlIGZpbGUgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIHJlbmFtZSBwcmVzZXJ2ZXMgdGhlIG10aW1lLCBidXQgYSBtb3ZlIG11c3Qgc3RhbXAgRlJFU0ggKHNlZSBJQXJjaGl2ZXMubW92ZSkgLSB0aGUgb2xkIHN0YW1wIGlzIGhvdyBhIG1vdmVkIGZpbGUgbG9zZXMgdG8gYSBzdGFsZSB0b21ic3RvbmUgYXQgaXRzIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgbGV0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudXRpbWVzKHRvUGF0aCwgbm93LCBub3cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoa2V5LCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihrZXk6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlOiBmcy5wcm9taXNlcy5GaWxlSGFuZGxlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuT19SRFdSKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IGhhbmRsZS5zdGF0KCk7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0YXRzLnNpemU7XG4gICAgICAgICAgICAvLyBBIHNpemUtMCBmaWxlIGlzIGEgdG9tYnN0b25lIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKSAtIGFic2VudCwgdW5sZXNzIHRoZSBjYWxsZXIgYXNrZWQgZm9yIHRvbWJzdG9uZXMuIFJhbmdlZCByZWFkcyBvZiBhIFJFQUwgZmlsZSBjYW4gc3RpbGwgbGVnaXRpbWF0ZWx5IHJldHVybiBubyBieXRlcyAocmFuZ2UgcGFzdCBFT0YsIGJlbG93KS5cbiAgICAgICAgICAgIGlmICghc2l6ZSAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLnN0YXJ0LCBzaXplKSB8fCAwO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLmVuZCwgc2l6ZSkgfHwgc2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBzdGF0cy5tdGltZU1zLCBzaXplIH07XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGxldCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgaGFuZGxlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIGF0ICR7ZmlsZVBhdGh9OiR7c3RhcnR9LCByZWFkICR7Ynl0ZXNSZWFkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogYnVmZmVyLCB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMuaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIXN0YXRzLnNpemUgJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoXCJcIiwgcHJlZml4LCBpbmZvcyk7XG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpO1xuICAgICAgICBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShmaWxlcywgcHJlZml4LCBjb25maWcpO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyByZWxEaXIgaXMgXCJcIiBvciBlbmRzIHdpdGggXCIvXCIuIE9ubHkgZGVzY2VuZHMgaW50byBkaXJlY3RvcmllcyB0aGF0IGNhbiBzdGlsbCBtYXRjaCB0aGUgcHJlZml4LlxuICAgIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJlbERpcjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgaW5mb3M6IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbERpciksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGxldCByZWxQYXRoID0gcmVsRGlyICsgZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpclBhdGggPSByZWxQYXRoICsgXCIvXCI7XG4gICAgICAgICAgICAgICAgaWYgKGRpclBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8IHByZWZpeC5zdGFydHNXaXRoKGRpclBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGRpclBhdGgsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZW50cnkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyZWxQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbFBhdGgpKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZWQgd2hpbGUgd2Ugd2VyZSB3YWxraW5nXG4gICAgICAgICAgICBpZiAoIXN0YXRzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGluZm9zLnNldChyZWxQYXRoLCB7IHBhdGg6IHJlbFBhdGgsIGNyZWF0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcmF3IGRpc2sgaGFzIG5vIHdpbmRvd3MsIHJvdXRlcywgb3IgaW1tdXRhYmlsaXR5LCBzbyB0aGUgcmVzdCBvZiB0aGUgU2V0Q29uZmlnIGhhcyBub3RoaW5nIHRvIGFwcGx5IHRvIGhlcmUgKHRoZSBzdG9yZSB3cmFwcGluZyB0aGlzIGRpc2sgaXMgd2hhdCBlbmZvcmNlcyB0aGVtKVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgdGhpcy5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgZmlsZXMgc3RyZWFtIGludG8gdGhlaXIgb3duIGZpbGUgdW5kZXIgdXBsb2Fkcy8sIHRoZW4gbW92ZSBpbnRvIHBsYWNlIG9uIGZpbmlzaC4gTm8gaGFuZGxlIGlzIG9wZW5lZCB1bnRpbCB0aGUgZmlyc3QgYXBwZW5kIGFjdHVhbGx5IGhhcHBlbnMuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpZCA9IGAke0RhdGUubm93KCl9XyR7dGhpcy5uZXh0TGFyZ2VVcGxvYWRJZCsrfWA7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLnNldChpZCwgeyB0bXBQYXRoOiBwYXRoLmpvaW4odGhpcy51cGxvYWRzRGlyLCBgdXBsb2FkXyR7aWR9LnRtcGApIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIC8qKiBvZmZzZXQgbWFrZXMgdGhlIHdyaXRlIFBPU0lUSU9OQUwgaW5zdGVhZCBvZiBhcHBlbmRpbmc6IGEgcmV0cmllZCBwYXJ0IGxhbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGZhaWxlZCBhdHRlbXB0IHdvdWxkIGhhdmUsIHNvIHBhcnQgcmV0cmllcyBhcmUgaWRlbXBvdGVudC4gT25lIHVwbG9hZCBtdXN0IHVzZSBlaXRoZXIgYXBwZW5kcyBvciBvZmZzZXRzIHRocm91Z2hvdXQsIG5ldmVyIGJvdGggLSB0aGUgY2FjaGVkIGhhbmRsZSBrZWVwcyBpdHMgZmlyc3QgZmxhZ3MsIGFuZCBPX0FQUEVORCBpZ25vcmVzIHRoZSBwb3NpdGlvbiBhcmd1bWVudC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywgZGF0YTogQnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCB8IGZzLmNvbnN0YW50cy5PX0FQUEVORCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCk7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGUoZGF0YSwgMCwgZGF0YS5sZW5ndGgsIG9mZnNldCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGxhc3RNb2RpZmllZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsYXJnZSB1cGxvYWQgJHtpZH1gKTtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCAoKSA9PiB0aGlzLmhhbmRsZXMuY2xvc2VOb3codG1wUGF0aCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDbG9zZSBhbnkgY2FjaGVkIGhhbmRsZSB0byB0aGUgZmlsZSB3ZSdyZSByZXBsYWNpbmcsIHNvIGxhdGVyIHJlYWRzIHJlb3BlbiB0aGUgbmV3IGZpbGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpIC0gcmUtY2hlY2tlZCBIRVJFLCBub3QganVzdCB3aGVuIHRoZSB1cGxvYWQgc3RhcnRlZCwgYmVjYXVzZSBhIGxhcmdlIHVwbG9hZCBzdHJlYW1zIGZvciBtaW51dGVzIGFuZCB0aGF0IHdpbmRvdyBpcyBleGFjdGx5IHdoZW4gYSBuZXdlciB3cml0ZSBsYW5kc1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLm10aW1lTXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0odG1wUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodG1wUGF0aCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbm90aGluZyB3YXMgZXZlciBhcHBlbmRlZCwgb3IgdGhlIHRlbXAgZmlsZSB3YXMgZGVzdHJveWVkIHVuZGVyIHVzIC0gYm90aCBtdXN0IGZhaWwgbG91ZGx5LiBNYXRlcmlhbGl6aW5nIGFuIGVtcHR5IGZpbGUgaGVyZSAodGhlIG9sZCBiZWhhdmlvcikgc2lsZW50bHkgdHVybmVkIHRoZSB1cGxvYWQgaW50byBhIERFTEVUSU9OLCBzaW5jZSBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlIGluIHRoaXMgc3lzdGVtLlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFyZ2UgdXBsb2FkIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gaGFzIG5vIGRhdGE6IHRoZSB1cGxvYWQgdGVtcCBmaWxlICR7dG1wUGF0aH0gZG9lcyBub3QgZXhpc3QuIEVpdGhlciBubyBkYXRhIHdhcyBldmVyIGFwcGVuZGVkIChlbXB0eSBmaWxlcyBhcmUgZm9yYmlkZGVuIC0gdGhleSByZWFkIGJhY2sgYXMgZGVsZXRpb25zOyB1c2UgZGVsIHRvIGRlbGV0ZSkgb3IgdGhlIHRlbXAgZmlsZSB3YXMgcmVtb3ZlZCB3aGlsZSB0aGUgdXBsb2FkIHdhcyBydW5uaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJlbmFtZSBwcmVzZXJ2ZXMgdGhlIHRlbXAgZmlsZSdzIG10aW1lLCB3aGljaCBpcyBqdXN0IHdoZW4gdGhlIGxhc3QgYXBwZW5kIGhhcHBlbmVkIC0gdGhlIGxvZ2ljYWwgd3JpdGUgdGltZSBoYXMgdG8gYmUgc3RhbXBlZCBleHBsaWNpdGx5IChpdCBpcyB0aGUgbWV0YWRhdGEgc2NhbnMgb3JkZXIgZXZlcnl0aGluZyBieSlcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51dGltZXMoZmlsZVBhdGgsIG5ldyBEYXRlKGxhc3RNb2RpZmllZCksIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgdGhpcy5sYXJnZVVwbG9hZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3codG1wUGF0aCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayh0bXBQYXRoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRVUkwgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlzayBhcmNoaXZlcyAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcGF0aCAke3BhdGh9KWApO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhdE9yVW5kZWZpbmVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGZzLlN0YXRzIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cblxuLy8gVGhlIGZvbGRlcnMvc2hhbGxvdyBwb3N0LXByb2Nlc3Npbmcgc2hhcmVkIGJ5IGZpbmRJbmZvIGltcGxlbWVudGF0aW9ucyB0aGF0IGxpc3QgZmxhdCBmaWxlcyAodXNlZCBieSBBcmNoaXZlc0Rpc2sgb24gdGhlIHJhdyBkaXNrIHdhbGssIGFuZCBieSBCbG9iU3RvcmUgb24gaXRzIGluZGV4KS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUZpbmRJbmZvU2hhcGUoZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdLCBwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IEFyY2hpdmVGaWxlSW5mb1tdIHtcbiAgICBpZiAoY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICBsZXQgZm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGxldCByZXN0ID0gZmlsZS5wYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IHJlc3RQYXJ0cyA9IHJlc3Quc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgaWYgKHJlc3RQYXJ0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmb2xkZXI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChjb25maWcuc2hhbGxvdykge1xuICAgICAgICAgICAgICAgIGZvbGRlciA9IHByZWZpeCArIHJlc3RQYXJ0c1swXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gZmlsZS5wYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmb2xkZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUucGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5pbmNsdWRlcyhcIi9cIikpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4iXX0=
434
- /* _JS_SOURCE_HASH = "95667da546be19dd52640781f02a7a6e3d95008a9da9695ea9b84744761ed8fb"; */
434
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQXNOO0FBQ3ROLCtEQUE2RDtBQUU3RCw0YkFBNGI7QUFFNWIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4Qyw2UEFBNlA7QUFDN1AsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBUXJELDhjQUE4YztBQUM5YyxNQUFNLGVBQWU7SUFNakI7UUFMUSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDakQsMERBQTBEO1FBQ2xELFFBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUcvQyxJQUFBLDBCQUFlLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxHQUFHLENBQUksUUFBZ0IsRUFBRSxHQUFxQjtRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FB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QUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQXJCRCxnREFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzb3J0LCBiaW5hcnlTZWFyY2hCYXNpYyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBEZWxDb25maWcsIEZpbmRDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgTW92ZUZpbGVDb25maWcsIFNldENvbmZpZywgU2V0TGFyZ2VGaWxlQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbi8vIFRoZSBiYXNlIGZpbGUtc3lzdGVtIElBcmNoaXZlczogc3RvcmFnZSBpcyBvbmUtdG8tb25lIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBldmVyeSBrZXkgaXMgZXhhY3RseSBvbmUgcmVhbCBmaWxlIHVuZGVyIDxmb2xkZXI+L2ZpbGVzLCBzbyB0aGUgZmlsZSBzeXN0ZW0gaXRzZWxmIGlzIHRoZSBpbmRleC4gRmlsZSBoYW5kbGVzIGFyZSBjYWNoZWQgYW5kIHJldXNlZCwgYW5kIGNsb3NlZCBvbmNlIGlkbGUgKHNlZSBGaWxlSGFuZGxlQ2FjaGUpLiBBbGwgb3BlcmF0aW9ucyBvbiBhIGZpbGUgcnVuIGluIHNlcmlhbCwgc28gdGhleSBjYW4ndCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIGhhbmRsZSBjbG9zaW5nLiBVc2VkIGFzIHRoZSBkaXNrIHN5bmNocm9uaXphdGlvbiBzb3VyY2Ugb2YgQmxvYlN0b3JlIChzZWUgcmVtb3RlU3RvcmFnZS9ibG9iU3RvcmUudHMpLlxuXG5jb25zdCBIQU5ETEVfSURMRV9USU1FT1VUID0gMTAwMCAqIDYwO1xuY29uc3QgSEFORExFX1NXRUVQX0lOVEVSVkFMID0gMTAwMCAqIDE1O1xuLy8gVXBsb2FkIHRlbXAgZmlsZXMgYXJlIG9ubHkgZ2FyYmFnZSBvbmNlIHRoZXkgYXJlIGNsZWFybHkgYWJhbmRvbmVkLiBBbm90aGVyIHByb2Nlc3MgY2FuIHNoYXJlIG91ciBmb2xkZXIgKGV2ZXJ5IGRlcGxveSBvdmVybGFwIGRvZXMpLCBzbyBhIGZyZXNoIHRlbXAgZmlsZSBtYXkgYmUgSVRTIGluLXByb2dyZXNzIHVwbG9hZCAtIGRlbGV0aW5nIGl0IHdvdWxkIHNpbGVudGx5IHR1cm4gdGhhdCB1cGxvYWQgaW50byBhbiBlbXB0eSBmaWxlLlxuY29uc3QgVVBMT0FEX0FCQU5ET05FRF9BR0UgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogMztcblxudHlwZSBIYW5kbGVFbnRyeSA9IHtcbiAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgIGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICBsYXN0VXNlOiBudW1iZXI7XG59O1xuXG4vLyBDYWNoZXMgb3BlbiBmaWxlIGhhbmRsZXMsIGNsb3NpbmcgdGhlbSBvbmNlIGlkbGUgZm9yIEhBTkRMRV9JRExFX1RJTUVPVVQuIEluc3RlYWQgb2Ygb25lIHNldFRpbWVvdXQgcGVyIGhhbmRsZSwgYSBsaXN0IHNvcnRlZCBieSBsYXN0IHVzZSBpcyBzd2VwdCBwZXJpb2RpY2FsbHkgKGVudHJpZXMgYXJlIG1vdmVkIHZpYSBiaW5hcnkgc2VhcmNoIG9uIGFjY2VzcywgYW5kIGxhc3RVc2UgdmFsdWVzIG9ubHkgaW5jcmVhc2UsIHNvIHRvdWNoZWQgZW50cmllcyBhcHBlbmQgYXQgdGhlIGVuZCkuIEFsc28gc2VyaWFsaXplcyBvcGVyYXRpb25zIHBlciBmaWxlOiBlYWNoIG9wZXJhdGlvbiBvbmx5IHN0YXJ0cyBvbmNlIHRoZSBwcmV2aW91cyBvbmUgb24gdGhlIHNhbWUgZmlsZSBmaW5pc2hlZCwgYW5kIGEgaGFuZGxlIGlzIG5ldmVyIGNsb3NlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgcGVuZGluZyBvbiBpdC5cbmNsYXNzIEZpbGVIYW5kbGVDYWNoZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZUVudHJ5PigpO1xuICAgIC8vIFNvcnRlZCBieSBsYXN0VXNlIGFzY2VuZGluZyAobGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdClcbiAgICBwcml2YXRlIGxydTogSGFuZGxlRW50cnlbXSA9IFtdO1xuICAgIHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChIQU5ETEVfU1dFRVBfSU5URVJWQUwsICgpID0+IHRoaXMuc3dlZXAoKSk7XG4gICAgfVxuXG4gICAgLy8gUnVucyBmbmMgYWZ0ZXIgZXZlcnkgcHJldmlvdXNseSBzY2hlZHVsZWQgb3BlcmF0aW9uIG9uIGZpbGVQYXRoIGhhcyBmaW5pc2hlZFxuICAgIHB1YmxpYyBydW48VD4oZmlsZVBhdGg6IHN0cmluZywgZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBwcmV2LnRoZW4oZm5jKTtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgY2hhaW4gbXVzdCBuZXZlciByZWplY3QsIG9yIG9uZSBmYWlsZWQgb3BlcmF0aW9uIHdvdWxkIHBvaXNvbiBhbGwgbGF0ZXIgb25lc1xuICAgICAgICBsZXQgbGFzdCA9IHJlc3VsdC50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnNldChmaWxlUGF0aCwgbGFzdCk7XG4gICAgICAgIHZvaWQgbGFzdC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN0aWxsIHRoZSBsYXN0IHBlbmRpbmcgb3BlcmF0aW9uIG9uIHRoaXMgZmlsZSwgY2xlYXIgb3Vyc2VsdmVzXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgPT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBjYWxsIGluc2lkZSBydW4oKSBmb3IgdGhlIHNhbWUgZmlsZVBhdGggKHNvIG9wZW5zIGNhbid0IGNvbGxpZGUgd2l0aCBjbG9zZXMpXG4gICAgcHVibGljIGFzeW5jIGdldEhhbmRsZShmaWxlUGF0aDogc3RyaW5nLCBmbGFnczogbnVtYmVyKTogUHJvbWlzZTxmcy5wcm9taXNlcy5GaWxlSGFuZGxlPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5sYXN0VXNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihmaWxlUGF0aCwgZmxhZ3MpO1xuICAgICAgICBlbnRyeSA9IHsgZmlsZVBhdGgsIGhhbmRsZSwgbGFzdFVzZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGZpbGVQYXRoLCBlbnRyeSk7XG4gICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY2FsbCBpbnNpZGUgcnVuKCkgZm9yIHRoZSBzYW1lIGZpbGVQYXRoXG4gICAgcHVibGljIGFzeW5jIGNsb3NlTm93KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChmaWxlUGF0aCk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRnJvbUxSVShlbnRyeTogSGFuZGxlRW50cnkpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoQmFzaWModGhpcy5scnUsIHggPT4geC5sYXN0VXNlLCBlbnRyeS5sYXN0VXNlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgICAvLyBNdWx0aXBsZSBlbnRyaWVzIGNhbiBzaGFyZSBhIGxhc3RVc2UsIHNvIHNjYW4gZm9yIHRoZSBleGFjdCBvbmVcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlID09PSBlbnRyeS5sYXN0VXNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5scnVbaW5kZXhdID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3dlZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gSEFORExFX0lETEVfVElNRU9VVDtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlIDw9IGN1dG9mZikge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5scnVbaW5kZXhdO1xuICAgICAgICAgICAgLy8gQ2FuJ3QgY2xvc2UgYSBoYW5kbGUgd2l0aCBhIHBlbmRpbmcgb3BlcmF0aW9uOyBpdCdsbCBiZSBzd2VwdCBhZnRlciBpdCBmaW5pc2hlc1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZy5oYXMoZW50cnkuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNEaXNrIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvbGRlcjogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgZmlsZXNEaXIgPSBwYXRoLmpvaW4odGhpcy5mb2xkZXIsIFwiZmlsZXNcIik7XG4gICAgcHJpdmF0ZSB1cGxvYWRzRGlyID0gcGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcInVwbG9hZHNcIik7XG4gICAgcHJpdmF0ZSBoYW5kbGVzID0gbmV3IEZpbGVIYW5kbGVDYWNoZSgpO1xuICAgIHByaXZhdGUgbGFyZ2VVcGxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIHsgdG1wUGF0aDogc3RyaW5nIH0+KCk7XG4gICAgcHJpdmF0ZSBuZXh0TGFyZ2VVcGxvYWRJZCA9IDE7XG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLmZpbGVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGhpcy51cGxvYWRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBVUExPQURfQUJBTkRPTkVEX0FHRTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMudXBsb2Fkc0RpcikpIHtcbiAgICAgICAgICAgIGxldCB1cGxvYWRQYXRoID0gcGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgZmlsZSk7XG4gICAgICAgICAgICAvLyBUaGUgbXRpbWUgYWR2YW5jZXMgb24gZXZlcnkgYXBwZW5kLCBzbyBhbiBhY3RpdmUgdXBsb2FkIChldmVuIGFub3RoZXIgcHJvY2VzcydzKSBhbHdheXMgbG9va3MgZnJlc2hcbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZCh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgc3RhdHMubXRpbWVNcyA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgYWJhbmRvbmVkIHVwbG9hZCB0ZW1wIGZpbGUgJHt1cGxvYWRQYXRofSAobGFzdCB3cml0dGVuICR7bmV3IERhdGUoc3RhdHMubXRpbWVNcykudG9JU09TdHJpbmcoKX0pYCk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodXBsb2FkUGF0aCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgZGlzayAke3RoaXMuZm9sZGVyfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgLy8gTm8gbmF0aXZlIGNoYW5nZSBmZWVkIC0gYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgaW4gbWVtb3J5IChzZWUgdGhlIHNjYW5uaW5nIG5vdGUgaW4gU3RvcmVTeW5jLnB1bGxTb3VyY2UgZm9yIHdoeSB0aGUgbGlzdGluZyBpdHNlbGYgdGFrZXMgbm8gZmlsdGVycylcbiAgICAgICAgcmV0dXJuIGZpbHRlckNoYW5nZXMoYXdhaXQgdGhpcy5maW5kSW5mbyhcIlwiKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsZVBhdGgoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIGtleSk7XG4gICAgICAgIGlmICghcmVzdWx0LnN0YXJ0c1dpdGgodGhpcy5maWxlc0RpciArIHBhdGguc2VwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSAke0pTT04uc3RyaW5naWZ5KGtleS5zbGljZSgwLCAyMDApKX0sIGl0IGVzY2FwZXMgdGhlIHN0b3JlIGZvbGRlcmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gZm9yY2VTZXRJbW11dGFibGUgaXMgYWNjZXB0ZWQgYW5kIG5lZWRzIG5vIGhhbmRsaW5nOiBkaXNrIHNvdXJjZXMgYXJlIG5ldmVyIGltbXV0YWJsZSwgYW5kIHRoZSBvbGRlci13cml0ZSBuby1vcCBiZWxvdyBhbHJlYWR5IGdpdmVzIHN5bmNocm9uaXphdGlvbiBpdHMgb25seS10YWtlLXRoZS1sYXRlc3Qgc2VtYW50aWNzXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWc/Lmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KS4gQm90aCBzaWRlcyBmbG9vcmVkOiBzdWItbWlsbGlzZWNvbmQgbXRpbWUgZGlnaXRzIGFyZSBzdG9yYWdlIGFydGlmYWN0cywgbm90IG9yZGVyaW5nIChzZWUgZ2V0MilcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgTWF0aC5mbG9vcihsYXN0TW9kaWZpZWQpIDwgTWF0aC5mbG9vcihleGlzdGluZy5tdGltZU1zKSkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZShmaWxlUGF0aCwgZnMuY29uc3RhbnRzLk9fUkRXUiB8IGZzLmNvbnN0YW50cy5PX0NSRUFUKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50cnVuY2F0ZSgwKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS53cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnV0aW1lcyhuZXcgRGF0ZShsYXN0TW9kaWZpZWQpLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgLy8gY29uZmlnIGlzIGFjY2VwdGVkIGFuZCBpZ25vcmVkOiBhIGRpc2sgZGVsZXRpb24gaXMgYSBwaHlzaWNhbCByZW1vdmUgKG5vIHRvbWJzdG9uZSB0byBzdGFtcCAtIEJsb2JTdG9yZSdzIGluZGV4IGNhcnJpZXMgdGhlIHRvbWJzdG9uZSBmb3IgZGlzayBzb3VyY2VzKVxuICAgIHB1YmxpYyBhc3luYyBkZWwoa2V5OiBzdHJpbmcsIGNvbmZpZz86IERlbENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZmlsZVBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiBNb3ZlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgZnJvbVBhdGggPSB0aGlzLmZpbGVQYXRoKGNvbmZpZy5mcm9tUGF0aCk7XG4gICAgICAgIGxldCB0b1BhdGggPSB0aGlzLmZpbGVQYXRoKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZyb21QYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZnJvbVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0b1BhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3codG9QYXRoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUodG9QYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKGZyb21QYXRoLCB0b1BhdGgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX0gb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfTogdGhlIHNvdXJjZSBmaWxlIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSByZW5hbWUgcHJlc2VydmVzIHRoZSBtdGltZSwgYnV0IGEgbW92ZSBtdXN0IHN0YW1wIEZSRVNIIChzZWUgSUFyY2hpdmVzLm1vdmUpIC0gdGhlIG9sZCBzdGFtcCBpcyBob3cgYSBtb3ZlZCBmaWxlIGxvc2VzIHRvIGEgc3RhbGUgdG9tYnN0b25lIGF0IGl0cyBuZXcgcGF0aFxuICAgICAgICAgICAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnV0aW1lcyh0b1BhdGgsIG5vdywgbm93KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGtleSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDIoa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bihmaWxlUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZShmaWxlUGF0aCwgZnMuY29uc3RhbnRzLk9fUkRXUik7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBoYW5kbGUuc3RhdCgpO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzdGF0cy5zaXplO1xuICAgICAgICAgICAgLy8gQSBzaXplLTAgZmlsZSBpcyBhIHRvbWJzdG9uZSAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSkgLSBhYnNlbnQsIHVubGVzcyB0aGUgY2FsbGVyIGFza2VkIGZvciB0b21ic3RvbmVzLiBSYW5nZWQgcmVhZHMgb2YgYSBSRUFMIGZpbGUgY2FuIHN0aWxsIGxlZ2l0aW1hdGVseSByZXR1cm4gbm8gYnl0ZXMgKHJhbmdlIHBhc3QgRU9GLCBiZWxvdykuXG4gICAgICAgICAgICBpZiAoIXNpemUgJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSByYW5nZSAmJiBNYXRoLm1pbihyYW5nZS5zdGFydCwgc2l6ZSkgfHwgMDtcbiAgICAgICAgICAgIGxldCBlbmQgPSByYW5nZSAmJiBNYXRoLm1pbihyYW5nZS5lbmQsIHNpemUpIHx8IHNpemU7XG4gICAgICAgICAgICAvLyBtdGltZU1zIGlzIGZsb29yZWQgZXZlcnl3aGVyZSB0aGlzIGRpc2sgcmVwb3J0cyBhIHRpbWU6IGl0IGNhcnJpZXMgZnJhY3Rpb25hbCBtaWxsaXNlY29uZHMgKGtlcm5lbC1zdGFtcGVkIGZpbGVzIGhhdmUgbmFub3NlY29uZCBtdGltZXMpLCBidXQgdXRpbWVzIHJvdW5kLXRyaXBzIG9ubHkgd2hvbGUgb25lcyAtIHNvIGEgZnJhY3Rpb25hbCB0aW1lIGhhbmRlZCB0byB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIGNvdWxkIG5ldmVyIGJlIHJlcHJvZHVjZWQgYnkgcHJvcGFnYXRpb24sIGFuZCBldmVyeSBjb3B5IG9mIHRoZSBmaWxlIHdvdWxkIGNvbXBhcmUgXCJvbGRlclwiIHRoYW4gdGhlIG9yaWdpbmFsIGZvcmV2ZXJcbiAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBNYXRoLmZsb29yKHN0YXRzLm10aW1lTXMpLCBzaXplIH07XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGxldCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgaGFuZGxlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIGF0ICR7ZmlsZVBhdGh9OiR7c3RhcnR9LCByZWFkICR7Ynl0ZXNSZWFkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogYnVmZmVyLCB3cml0ZVRpbWU6IE1hdGguZmxvb3Ioc3RhdHMubXRpbWVNcyksIHNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMuaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIXN0YXRzLnNpemUgJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IE1hdGguZmxvb3Ioc3RhdHMubXRpbWVNcyksIHNpemU6IHN0YXRzLnNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoXCJcIiwgcHJlZml4LCBpbmZvcyk7XG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpO1xuICAgICAgICBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShmaWxlcywgcHJlZml4LCBjb25maWcpO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyByZWxEaXIgaXMgXCJcIiBvciBlbmRzIHdpdGggXCIvXCIuIE9ubHkgZGVzY2VuZHMgaW50byBkaXJlY3RvcmllcyB0aGF0IGNhbiBzdGlsbCBtYXRjaCB0aGUgcHJlZml4LlxuICAgIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJlbERpcjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgaW5mb3M6IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbERpciksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGxldCByZWxQYXRoID0gcmVsRGlyICsgZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpclBhdGggPSByZWxQYXRoICsgXCIvXCI7XG4gICAgICAgICAgICAgICAgaWYgKGRpclBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8IHByZWZpeC5zdGFydHNXaXRoKGRpclBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGRpclBhdGgsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZW50cnkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyZWxQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbFBhdGgpKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZWQgd2hpbGUgd2Ugd2VyZSB3YWxraW5nXG4gICAgICAgICAgICBpZiAoIXN0YXRzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGluZm9zLnNldChyZWxQYXRoLCB7IHBhdGg6IHJlbFBhdGgsIGNyZWF0ZVRpbWU6IE1hdGguZmxvb3Ioc3RhdHMubXRpbWVNcyksIHNpemU6IHN0YXRzLnNpemUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcmF3IGRpc2sgaGFzIG5vIHdpbmRvd3MsIHJvdXRlcywgb3IgaW1tdXRhYmlsaXR5LCBzbyB0aGUgcmVzdCBvZiB0aGUgU2V0Q29uZmlnIGhhcyBub3RoaW5nIHRvIGFwcGx5IHRvIGhlcmUgKHRoZSBzdG9yZSB3cmFwcGluZyB0aGlzIGRpc2sgaXMgd2hhdCBlbmZvcmNlcyB0aGVtKVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgdGhpcy5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgZmlsZXMgc3RyZWFtIGludG8gdGhlaXIgb3duIGZpbGUgdW5kZXIgdXBsb2Fkcy8sIHRoZW4gbW92ZSBpbnRvIHBsYWNlIG9uIGZpbmlzaC4gTm8gaGFuZGxlIGlzIG9wZW5lZCB1bnRpbCB0aGUgZmlyc3QgYXBwZW5kIGFjdHVhbGx5IGhhcHBlbnMuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpZCA9IGAke0RhdGUubm93KCl9XyR7dGhpcy5uZXh0TGFyZ2VVcGxvYWRJZCsrfWA7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLnNldChpZCwgeyB0bXBQYXRoOiBwYXRoLmpvaW4odGhpcy51cGxvYWRzRGlyLCBgdXBsb2FkXyR7aWR9LnRtcGApIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIC8qKiBvZmZzZXQgbWFrZXMgdGhlIHdyaXRlIFBPU0lUSU9OQUwgaW5zdGVhZCBvZiBhcHBlbmRpbmc6IGEgcmV0cmllZCBwYXJ0IGxhbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGZhaWxlZCBhdHRlbXB0IHdvdWxkIGhhdmUsIHNvIHBhcnQgcmV0cmllcyBhcmUgaWRlbXBvdGVudC4gT25lIHVwbG9hZCBtdXN0IHVzZSBlaXRoZXIgYXBwZW5kcyBvciBvZmZzZXRzIHRocm91Z2hvdXQsIG5ldmVyIGJvdGggLSB0aGUgY2FjaGVkIGhhbmRsZSBrZWVwcyBpdHMgZmlyc3QgZmxhZ3MsIGFuZCBPX0FQUEVORCBpZ25vcmVzIHRoZSBwb3NpdGlvbiBhcmd1bWVudC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywgZGF0YTogQnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCB8IGZzLmNvbnN0YW50cy5PX0FQUEVORCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCk7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGUoZGF0YSwgMCwgZGF0YS5sZW5ndGgsIG9mZnNldCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGxhc3RNb2RpZmllZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsYXJnZSB1cGxvYWQgJHtpZH1gKTtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCAoKSA9PiB0aGlzLmhhbmRsZXMuY2xvc2VOb3codG1wUGF0aCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDbG9zZSBhbnkgY2FjaGVkIGhhbmRsZSB0byB0aGUgZmlsZSB3ZSdyZSByZXBsYWNpbmcsIHNvIGxhdGVyIHJlYWRzIHJlb3BlbiB0aGUgbmV3IGZpbGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpIC0gcmUtY2hlY2tlZCBIRVJFLCBub3QganVzdCB3aGVuIHRoZSB1cGxvYWQgc3RhcnRlZCwgYmVjYXVzZSBhIGxhcmdlIHVwbG9hZCBzdHJlYW1zIGZvciBtaW51dGVzIGFuZCB0aGF0IHdpbmRvdyBpcyBleGFjdGx5IHdoZW4gYSBuZXdlciB3cml0ZSBsYW5kc1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIE1hdGguZmxvb3IobGFzdE1vZGlmaWVkKSA8IE1hdGguZmxvb3IoZXhpc3RpbmcubXRpbWVNcykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0odG1wUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodG1wUGF0aCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbm90aGluZyB3YXMgZXZlciBhcHBlbmRlZCwgb3IgdGhlIHRlbXAgZmlsZSB3YXMgZGVzdHJveWVkIHVuZGVyIHVzIC0gYm90aCBtdXN0IGZhaWwgbG91ZGx5LiBNYXRlcmlhbGl6aW5nIGFuIGVtcHR5IGZpbGUgaGVyZSAodGhlIG9sZCBiZWhhdmlvcikgc2lsZW50bHkgdHVybmVkIHRoZSB1cGxvYWQgaW50byBhIERFTEVUSU9OLCBzaW5jZSBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlIGluIHRoaXMgc3lzdGVtLlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFyZ2UgdXBsb2FkIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gaGFzIG5vIGRhdGE6IHRoZSB1cGxvYWQgdGVtcCBmaWxlICR7dG1wUGF0aH0gZG9lcyBub3QgZXhpc3QuIEVpdGhlciBubyBkYXRhIHdhcyBldmVyIGFwcGVuZGVkIChlbXB0eSBmaWxlcyBhcmUgZm9yYmlkZGVuIC0gdGhleSByZWFkIGJhY2sgYXMgZGVsZXRpb25zOyB1c2UgZGVsIHRvIGRlbGV0ZSkgb3IgdGhlIHRlbXAgZmlsZSB3YXMgcmVtb3ZlZCB3aGlsZSB0aGUgdXBsb2FkIHdhcyBydW5uaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJlbmFtZSBwcmVzZXJ2ZXMgdGhlIHRlbXAgZmlsZSdzIG10aW1lLCB3aGljaCBpcyBqdXN0IHdoZW4gdGhlIGxhc3QgYXBwZW5kIGhhcHBlbmVkIC0gdGhlIGxvZ2ljYWwgd3JpdGUgdGltZSBoYXMgdG8gYmUgc3RhbXBlZCBleHBsaWNpdGx5IChpdCBpcyB0aGUgbWV0YWRhdGEgc2NhbnMgb3JkZXIgZXZlcnl0aGluZyBieSlcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51dGltZXMoZmlsZVBhdGgsIG5ldyBEYXRlKGxhc3RNb2RpZmllZCksIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgdGhpcy5sYXJnZVVwbG9hZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3codG1wUGF0aCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayh0bXBQYXRoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRVUkwgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlzayBhcmNoaXZlcyAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcGF0aCAke3BhdGh9KWApO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhdE9yVW5kZWZpbmVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGZzLlN0YXRzIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cblxuLy8gVGhlIGZvbGRlcnMvc2hhbGxvdyBwb3N0LXByb2Nlc3Npbmcgc2hhcmVkIGJ5IGZpbmRJbmZvIGltcGxlbWVudGF0aW9ucyB0aGF0IGxpc3QgZmxhdCBmaWxlcyAodXNlZCBieSBBcmNoaXZlc0Rpc2sgb24gdGhlIHJhdyBkaXNrIHdhbGssIGFuZCBieSBCbG9iU3RvcmUgb24gaXRzIGluZGV4KS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUZpbmRJbmZvU2hhcGUoZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdLCBwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IEFyY2hpdmVGaWxlSW5mb1tdIHtcbiAgICBpZiAoY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICBsZXQgZm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGxldCByZXN0ID0gZmlsZS5wYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IHJlc3RQYXJ0cyA9IHJlc3Quc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgaWYgKHJlc3RQYXJ0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmb2xkZXI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChjb25maWcuc2hhbGxvdykge1xuICAgICAgICAgICAgICAgIGZvbGRlciA9IHByZWZpeCArIHJlc3RQYXJ0c1swXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gZmlsZS5wYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmb2xkZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUucGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5pbmNsdWRlcyhcIi9cIikpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4iXX0=
435
+ /* _JS_SOURCE_HASH = "6b1abd5fb022db1d787bba1a9df8f25d5a2aec17d30f602cb46729a316eb6c05"; */
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -748,4 +748,4 @@ async function tryToLoadPointer(pointer) {
748
748
  }
749
749
  exports.tryToLoadPointer = tryToLoadPointer;
750
750
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUZvbGRlckFQSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkZpbGVGb2xkZXJBUEkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztBQUVwQyxvREFBNEI7QUFDNUIsMkRBQTZHO0FBQzdHLCtCQUFrQztBQUNsQyx1REFBb0Q7QUFDcEQseURBQTBEO0FBQzFELDZDQUEwQztBQUUxQywyREFBMkQ7QUFDM0QscUVBQWlFO0FBQ2pFLDJEQUFvRztBQUNwRyw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBc0J4Qix1RUFBdUU7QUFDdkUsd0ZBQXdGO0FBQ3hGLCtCQUErQjtBQUMvQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFFN0IscUdBQXFHO0FBQ3JHLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQXFDMUMsSUFBSSxXQUFXLEdBQUcsSUFBQSxpQkFBVSxFQUFDO0lBQ3pCLEVBQUUsRUFBRSxTQUFpRDtDQUN4RCxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRS9CLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNwQixTQUFTLGFBQWE7SUFDbEIsSUFBSSxDQUFDLFVBQVU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRKQUE0SixDQUFDLENBQUM7SUFDL0wsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUNELFNBQWdCLGFBQWEsQ0FBQyxHQUFXO0lBQ3JDLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFDckIsQ0FBQztBQUZELHNDQUVDO0FBRUQsK0VBQStFO0FBQy9FLGtGQUFrRjtBQUNsRixrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLG1GQUFtRjtBQUNuRixtRkFBbUY7QUFDbkYseUNBQXlDO0FBQ3pDLElBQUksbUJBQTBELENBQUM7QUFDL0QsU0FBZ0Isc0JBQXNC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QWUsRUFBRSxFQUFFO1FBQzdCLElBQUksSUFBSSxHQUFxQixJQUFJLENBQUM7UUFDbEMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsSUFBSTtnQkFBRSxTQUFTO1lBQ3BCLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQVZELGtFQVVDO0FBRU0sS0FBSyxVQUFVLGdCQUFnQixDQUFDLE9BQWU7SUFDbEQsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLHdDQUFvQixFQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU87SUFDcEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsRUFBRSxDQUFBLENBQUM7SUFDOUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQ3BCLE9BQU8sTUFBaUMsQ0FBQztBQUM3QyxDQUFDO0FBTkQsNENBTUMiLCJzb3VyY2VzQ29udGVudCI6WyJwcm9jZXNzLmVudi5OT0RFX0VOViA9IFwicHJvZHVjdGlvblwiO1xuXG5pbXBvcnQgcHJlYWN0IGZyb20gXCJwcmVhY3RcIjtcbmltcG9ydCB7IGZpbmRHcmFudGVkUG9pbnRlckhhbmRsZSwgZ2V0RmlsZVN5c3RlbVBvaW50ZXIsIHN0b3JlRmlsZVN5c3RlbVBvaW50ZXIgfSBmcm9tIFwiLi9maWxlU3lzdGVtUG9pbnRlclwiO1xuaW1wb3J0IHsgb2JzZXJ2YWJsZSB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgeyBvYnNlcnZlciB9IGZyb20gXCIuLi9yZW5kZXItdXRpbHMvb2JzZXJ2ZXJcIjtcbmltcG9ydCB7IGNhY2hlLCBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgY3NzLCBpc05vZGUgfSBmcm9tIFwidHlwZXNhZmVjc3NcIjtcbmltcG9ydCB7IElTdG9yYWdlUmF3IH0gZnJvbSBcIi4vSVN0b3JhZ2VcIjtcbmltcG9ydCB7IHJ1bkluU2VyaWFsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldEZpbGVTdG9yYWdlSW5kZXhEQiB9IGZyb20gXCIuL0luZGV4ZWREQkZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IGdldFJlbW90ZURpcmVjdG9yeUhhbmRsZSwgdGVzdFJlbW90ZUNvbm5lY3Rpb24sIFJlbW90ZU9wdGlvbnMgfSBmcm9tIFwiLi9yZW1vdGVGaWxlU3RvcmFnZVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBzaG93U2F2ZUZpbGVQaWNrZXIoY29uZmlnPzoge1xuICAgICAgICAgICAgdHlwZXM6IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nOyBhY2NlcHQ6IHsgW21pbWVUeXBlOiBzdHJpbmddOiBzdHJpbmdbXSB9XG4gICAgICAgICAgICB9W107XG4gICAgICAgIH0pOiBQcm9taXNlPEZpbGVTeXN0ZW1GaWxlSGFuZGxlPjtcbiAgICAgICAgc2hvd0RpcmVjdG9yeVBpY2tlcigpOiBQcm9taXNlPEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGU+O1xuICAgICAgICBzaG93T3BlbkZpbGVQaWNrZXIoY29uZmlnPzoge1xuICAgICAgICAgICAgdHlwZXM6IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nOyBhY2NlcHQ6IHsgW21pbWVUeXBlOiBzdHJpbmddOiBzdHJpbmdbXSB9XG4gICAgICAgICAgICB9W107XG4gICAgICAgIH0pOiBQcm9taXNlPEZpbGVTeXN0ZW1GaWxlSGFuZGxlW10+O1xuICAgIH1cbiAgICBpbnRlcmZhY2UgRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSB7XG4gICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKGNvbmZpZz86IHsgbW9kZTogXCJyZWFkXCIgfCBcInJlYWR3cml0ZVwiIH0pOiBQcm9taXNlPFBlcm1pc3Npb25TdGF0ZT47XG4gICAgfVxufVxuXG5cbi8vIE5PVEU6IEluZGV4ZWREQiBpcyByZXF1aXJlZCBmb3IgaU9TLCBhdCBsZWFzdC4gV2UgTUlHSFQgd2FudCB0byBtYWtlXG4vLyAgdGhpcyBhIHVzZXIgc3VwcG9ydGVkIHRvZ2dsZSB0b28sIHNvIHRoZXkgY2FuIGNob29zZSBkdXJpbmcgcnVudGltZSBpZiB0aGV5IHdhbnQgaXQuXG4vLyBETyBOT1QgZW5hYmxlIHRoaXMgaXMgaXNOb2RlXG5jb25zdCBVU0VfSU5ERVhFRF9EQiA9IGZhbHNlO1xuXG4vLyBIb3cgb2Z0ZW4gYSB3b3JrZXIgcmVjaGVja3MgdGhlIHBvaW50ZXIgSW5kZXhlZERCIGZvciBhIGdyYW50ZWQgaGFuZGxlIHdoZW4gbm9uZSBpcyBhdmFpbGFibGUgeWV0LlxuY29uc3QgV09SS0VSX1BPTExfSU5URVJWQUxfTVMgPSA2MCAqIDEwMDA7XG5cbi8vIFRoZXNlIG1pcnJvciB0aGUgc3Vic2V0IG9mIHRoZSBuYXRpdmUgRmlsZVN5c3RlbUZpbGVIYW5kbGUgLyBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlIEFQSSB3ZSB1c2UsIHNvIHRoZSBuYXRpdmUgYnJvd3NlciBoYW5kbGVzLCB0aGUgTm9kZSBoYW5kbGVzLCBhbmQgdGhlIHJlbW90ZSBoYW5kbGVzIGFyZSBhbGwgaW50ZXJjaGFuZ2VhYmxlIOKAlCBhbmQgY29kZSB3cml0dGVuIGFnYWluc3QgdGhlIG5hdGl2ZSBoYW5kbGUgKGUuZy4gYSByZWN1cnNpdmUgd2FsayBvdmVyIGBoYW5kbGUuZW50cmllcygpYCkgd29ya3Mgb24gYW55IG9mIHRoZW0uIGtpbmQvbmFtZSBhbmQgZW50cmllcygpIGFyZSBwYXJ0IG9mIHRoYXQgY29udHJhY3QuXG5leHBvcnQgdHlwZSBGaWxlV3JhcHBlciA9IHtcbiAgICByZWFkb25seSBraW5kOiBcImZpbGVcIjtcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgZ2V0RmlsZSgpOiBQcm9taXNlPHtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgICAgICAgYXJyYXlCdWZmZXIoKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAgICAgIC8vIE1hdGNoZXMgQmxvYi5zbGljZSAod2hpY2ggdGhlIG5hdGl2ZSBGaWxlIG9iamVjdCBwcm92aWRlcyksIHNvIHRoZSBicm93c2VyXG4gICAgICAgIC8vICBpbXBsZW1lbnRhdGlvbiB3b3JrcyB2YW5pbGxhLiBFbmQgaXMgZXhjbHVzaXZlLCBib3RoIGNsYW1wZWQgdG8gdGhlIGZpbGUgc2l6ZS5cbiAgICAgICAgc2xpY2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB7IGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IH07XG4gICAgfT47XG4gICAgY3JlYXRlV3JpdGFibGUoY29uZmlnPzogeyBrZWVwRXhpc3RpbmdEYXRhPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7XG4gICAgICAgIHNlZWsob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICB3cml0ZSh2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbiAgICB9PjtcbiAgICAvLyBSZXR1cm5zIGEgVVJMIGZvciB0aGUgZmlsZSdzIGJ5dGVzLCB1c2FibGUgaW4gPHZpZGVvPi88aW1nPi9mZXRjaC4gT3B0aW9uYWwg4oCUIHRoZSBuYXRpdmUgYnJvd3NlciBGaWxlU3lzdGVtRmlsZUhhbmRsZSBoYXMgbm8gc3VjaCBtZXRob2QsIHNvIHByZWZlciB0aGUgZ2V0RmlsZVVSTCgpIGhlbHBlciwgd2hpY2ggZmFsbHMgYmFjayB0byBhIGJsb2I6IFVSTCB2aWEgY3JlYXRlT2JqZWN0VVJMIGZvciBuYXRpdmUgaGFuZGxlcy4gQWx3YXlzIHJlbGVhc2UgaXQgd2l0aCBkaXNwb3NlRmlsZVVSTCB3aGVuIGRvbmUuXG4gICAgZ2V0VVJMPygpOiBQcm9taXNlPHN0cmluZz47XG59O1xuZXhwb3J0IHR5cGUgRGlyZWN0b3J5V3JhcHBlciA9IHtcbiAgICByZWFkb25seSBraW5kOiBcImRpcmVjdG9yeVwiO1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvLyBGdWxsIHBhdGggZnJvbSB0aGUgc3RvcmFnZSByb290LCBmb3IgZGlhZ25vc3RpY3MvbG9nZ2luZyAodGhlIG5hdGl2ZSBoYW5kbGUgZG9lc24ndCBleHBvc2UgcGF0aHMsIHNvIGl0J3Mgb3B0aW9uYWwpLiBlLmcuIFwiYnVsa0RhdGFiYXNlczIvbXlDb2xsZWN0aW9uXCIuXG4gICAgcmVhZG9ubHkgZnVsbFBhdGg/OiBzdHJpbmc7XG4gICAgLy8gVHJ1ZSB3aGVuIHRoaXMgc3RvcmFnZSBpcyBzZXJ2ZWQgb3ZlciB0aGUgbmV0d29yayAoYSByZW1vdGUgc2VydmVyKSByYXRoZXIgdGhhbiBhIGxvY2FsIGRpc2ssIHNvIGNhbGxlcnMgY2FuIGFkYXB0IGZvciB0aGUgaGlnaGVyIGxhdGVuY3kvY29zdCAobG9jYWwvbmF0aXZlIGhhbmRsZXMgbGVhdmUgaXQgdW5kZWZpbmVkID0gZmFsc2UpLlxuICAgIHJlYWRvbmx5IGlzUmVtb3RlPzogYm9vbGVhbjtcbiAgICByZW1vdmVFbnRyeShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRGaWxlSGFuZGxlKGtleTogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuIH0pOiBQcm9taXNlPEZpbGVXcmFwcGVyPjtcbiAgICBnZXREaXJlY3RvcnlIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj47XG4gICAgLy8gRWFjaCBlbnRyeSBJUyBhIGhhbmRsZSAoZmlsZSBvciBkaXJlY3RvcnkpLCBzbyBhIHJlY3Vyc2l2ZSB3YWxrIGtlZXBzIHdvcmtpbmcgYXQgZXZlcnkgbGV2ZWwuXG4gICAgZW50cmllcygpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgRmlsZVdyYXBwZXIgfCBEaXJlY3RvcnlXcmFwcGVyXT47XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgRmlsZVdyYXBwZXIgfCBEaXJlY3RvcnlXcmFwcGVyXT47XG59O1xuXG5sZXQgZGlzcGxheURhdGEgPSBvYnNlcnZhYmxlKHtcbiAgICB1aTogdW5kZWZpbmVkIGFzIHVuZGVmaW5lZCB8IHByZWFjdC5Db21wb25lbnRDaGlsZHJlbixcbn0sIHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KTtcblxubGV0IGZpbGVBUElLZXkgPSBcIlwiO1xuZnVuY3Rpb24gZ2V0RmlsZUFQSUtleSgpIHtcbiAgICBpZiAoIWZpbGVBUElLZXkpIHRocm93IG5ldyBFcnJvcihcIk11c3QgY2FsbCBzZXRGaWxlQVBJS2V5IGJlZm9yZSB1c2luZyBmaWxlIHN5c3RlbS4gSnVzdCBwYXNzIGFueSBrZXkuIFRoaXMgcHJldmVudHMgcmV1c2luZyB0aGUgZmlsZSBzeXN0ZW0gYXBpIHRoYXQgb3RoZXIgZGV2ZWxvcG1lbnQgYXBwcyBtaWdodCBiZSB1c2luZy5cIik7XG4gICAgcmV0dXJuIGZpbGVBUElLZXk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsZUFQSUtleShrZXk6IHN0cmluZykge1xuICAgIGZpbGVBUElLZXkgPSBrZXk7XG59XG5cbi8vIEEgZGlyZWN0b3J5IGhhbmRsZSB0byBzZXJ2ZSBhcyB0aGUgc3RvcmFnZSByb290IGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZSB2aWFcbi8vIHRoZSBwaWNrZXIgLyBzdG9yZWQtcG9pbnRlciAvIHJlbW90ZSBmbG93LiBTZXQgdGhpcyBpbiBhIGNvbnRleHQgdGhhdCBjYW4ndCBydW5cbi8vIHRoZSBpbnRlcmFjdGl2ZSByZXNvbHV0aW9uIOKAlCBtb3N0IGltcG9ydGFudGx5IGEgV2ViIFdvcmtlciwgd2hpY2ggaGFzIG5vIERPTSB0b1xuLy8gcHJvbXB0IHdpdGggYW5kIG5vIGxvY2FsU3RvcmFnZSBwb2ludGVyLiBUaGUgb3duaW5nIHdpbmRvdyByZXNvbHZlcyB0aGUgaGFuZGxlXG4vLyAod2l0aCBpdHMgcGVybWlzc2lvbiBncmFudCkgYW5kIHBvc3RNZXNzYWdlcyBpdCBpbjsgdGhlIHdvcmtlciBjYWxscyB0aGlzIGJlZm9yZVxuLy8gdG91Y2hpbmcgYW55IHN0b3JhZ2UuIFdoZW4gc2V0LCBnZXREaXJlY3RvcnlIYW5kbGUgcmV0dXJucyBpdCBkaXJlY3RseSBhbmQgc2tpcHNcbi8vIGV2ZXJ5IERPTSAvIGxvY2FsU3RvcmFnZSBicmFuY2ggYmVsb3cuXG5sZXQgc3RvcmFnZVJvb3RPdmVycmlkZTogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdG9yYWdlUm9vdE92ZXJyaWRlKGhhbmRsZTogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHN0b3JhZ2VSb290T3ZlcnJpZGUgPSBoYW5kbGU7XG59XG5cbi8vIC0tLS0gcmVtb3RlIChzZXJ2ZXIpIHN0b3JhZ2UgY29uZmlnIC0tLS1cbi8vIEluc3RlYWQgb2YgYSBsb2NhbCBmb2xkZXIsIHRoZSB1c2VyIGNhbiBwb2ludCBhdCBhIHJlbW90ZUZpbGVTZXJ2ZXIuanMgaW5zdGFuY2UgKFVSTCArIHBhc3N3b3JkKS4gV2hlbiBjb25maWd1cmVkLCBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgc2VydmVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGF0IHNlcnZlci4gUGVyc2lzdGVkIGluIGxvY2FsU3RvcmFnZS5cbnR5cGUgUmVtb3RlQ29uZmlnID0geyB1cmw6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuZnVuY3Rpb24gcmVtb3RlQ29uZmlnS2V5KCkgeyByZXR1cm4gZ2V0RmlsZUFQSUtleSgpICsgXCI6cmVtb3RlXCI7IH1cbmZ1bmN0aW9uIGxvYWRSZW1vdGVDb25maWcoKTogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocmVtb3RlQ29uZmlnS2V5KCkpO1xuICAgICAgICBpZiAoIXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGMgPSBKU09OLnBhcnNlKHMpO1xuICAgICAgICBpZiAoYyAmJiB0eXBlb2YgYy51cmwgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGMucGFzc3dvcmQgPT09IFwic3RyaW5nXCIpIHJldHVybiBjO1xuICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBzYXZlUmVtb3RlQ29uZmlnKGM6IFJlbW90ZUNvbmZpZykgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShyZW1vdGVDb25maWdLZXkoKSwgSlNPTi5zdHJpbmdpZnkoYykpOyB9XG5cbi8vIFRoZSBzZXJ2ZXIgaXMgYWx3YXlzIEhUVFBTIG9uIHRoZSBmaWxlaG9zdGVyJ3MgZGVmYXVsdCBwb3J0LCBzbyB0aGUgdXNlciBvbmx5IG5lZWRzIHRvIHR5cGUgdGhlIGhvc3QgKGUuZy4gXCI2NS4xMDkuOTMuMTEzXCIpLiBXZSBzdHJpcCBhbnkgc2NoZW1lL3BhdGggdGhleSBpbmNsdWRlIGFuZCBkZWZhdWx0IHRoZSBwb3J0IGlmIG9taXR0ZWQuXG5jb25zdCBERUZBVUxUX1JFTU9URV9QT1JUID0gODc4NzsgLy8gbWF0Y2hlcyByZW1vdGVGaWxlU2VydmVyLmpzJ3MgZGVmYXVsdFxuZnVuY3Rpb24gbm9ybWFsaXplU2VydmVyVXJsKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcyA9IHJhdy50cmltKCkucmVwbGFjZSgvXlxcdys6XFwvXFwvLywgXCJcIikucmVwbGFjZSgvXFwvLiokLywgXCJcIik7XG4gICAgaWYgKCFzKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoIS86XFxkKyQvLnRlc3QocykpIHMgKz0gXCI6XCIgKyBERUZBVUxUX1JFTU9URV9QT1JUO1xuICAgIHJldHVybiBcImh0dHBzOi8vXCIgKyBzO1xufVxuXG4vLyBPbmUgc2hhcmVkIHJlbW90ZSBEaXJlY3RvcnlXcmFwcGVyIChhbmQgdGhlcmVmb3JlIG9uZSBzaGFyZWQgcmFuZ2UgY2FjaGUpIHBlciByZW1vdGUgY29uZmlnLlxubGV0IHJlbW90ZUhhbmRsZTogeyBrZXk6IHN0cmluZzsgaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyIH0gfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRSZW1vdGVIYW5kbGUocmVtb3RlOiBSZW1vdGVDb25maWcpOiBEaXJlY3RvcnlXcmFwcGVyIHtcbiAgICBjb25zdCBrZXkgPSByZW1vdGUudXJsICsgXCJcXDBcIiArIHJlbW90ZS5wYXNzd29yZDtcbiAgICBpZiAoIXJlbW90ZUhhbmRsZSB8fCByZW1vdGVIYW5kbGUua2V5ICE9PSBrZXkpIHtcbiAgICAgICAgcmVtb3RlSGFuZGxlID0geyBrZXksIGhhbmRsZTogZ2V0UmVtb3RlRGlyZWN0b3J5SGFuZGxlKHJlbW90ZS51cmwsIHJlbW90ZS5wYXNzd29yZCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZUhhbmRsZS5oYW5kbGU7XG59XG5cbkBvYnNlcnZlclxuY2xhc3MgRGlyZWN0b3J5UHJvbXB0ZXIgZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICghZGlzcGxheURhdGEudWkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgY3NzLnBvc2l0aW9uKFwiZml4ZWRcIikucG9zKDAsIDApLnNpemUoXCIxMDB2d1wiLCBcIjEwMHZoXCIpXG4gICAgICAgICAgICAgICAgICAgIC56SW5kZXgoMjE0NzQ4MzY0NylcbiAgICAgICAgICAgICAgICAgICAgLmJhY2tncm91bmQoXCJ3aGl0ZVwiKVxuICAgICAgICAgICAgICAgICAgICAuY2VudGVyXG4gICAgICAgICAgICAgICAgICAgIC5mb250U2l6ZSg0MClcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAge2Rpc3BsYXlEYXRhLnVpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG4vLyBcIkNvbm5lY3QgdG8gYSBzZXJ2ZXJcIiBvcHRpb24gZm9yIHRoZSBkaXJlY3RvcnkgcHJvbXB0OiBjb2xsYXBzZXMgdG8gYSBidXR0b24sIGV4cGFuZHMgdG8gYWRkcmVzcyArIHBhc3N3b3JkIGZpZWxkcy4gT24gY29ubmVjdCBpdCBBQ1RVQUxMWSBjb25uZWN0cyAodGVzdFJlbW90ZUNvbm5lY3Rpb24pOyBvbmx5IG9uIHN1Y2Nlc3MgZG9lcyBpdCBwZXJzaXN0IHRoZSBjb25maWcgYW5kIGNhbGwgb25Db25uZWN0ZWQsIHNvIHRoZSBjYWxsZXIgKGdldERpcmVjdG9yeUhhbmRsZSkgcmVzb2x2ZXMgd2l0aCBhIHdvcmtpbmcgcmVtb3RlIGhhbmRsZS4gRmFpbHVyZXMgYXJlIHNob3duIHRvIHRoZSB1c2VyIChhbmQgbG9nZ2VkLCB3aXRob3V0IHRoZSBwYXNzd29yZCksIG5ldmVyIHN3YWxsb3dlZC4gYGluaXRpYWxgIHByZS1maWxscyArIGV4cGFuZHMgdGhlIGZvcm0gKHVzZWQgdG8gcmV0cnkgYSByZW1lbWJlcmVkIHNlcnZlciB0aGF0IHN0b3BwZWQgd29ya2luZykuXG5Ab2JzZXJ2ZXJcbmNsYXNzIFNlcnZlckNvbm5lY3RGb3JtIGV4dGVuZHMgcHJlYWN0LkNvbXBvbmVudDx7IG9uQ29ubmVjdGVkOiAoY29uZmlnOiBSZW1vdGVDb25maWcpID0+IHZvaWQ7IGluaXRpYWw/OiBSZW1vdGVDb25maWcgfT4ge1xuICAgIHByaXZhdGUgb2JzID0gb2JzZXJ2YWJsZSh7XG4gICAgICAgIGV4cGFuZGVkOiAhIXRoaXMucHJvcHMuaW5pdGlhbCxcbiAgICAgICAgdXJsOiB0aGlzLnByb3BzLmluaXRpYWw/LnVybCB8fCBcIlwiLFxuICAgICAgICBwYXNzd29yZDogdGhpcy5wcm9wcy5pbml0aWFsPy5wYXNzd29yZCB8fCBcIlwiLFxuICAgICAgICBlcnJvcjogXCJcIiwgY29ubmVjdGluZzogZmFsc2UsIG5lZWRzQ2VydDogZmFsc2UsIHNob3dQYXNzd29yZDogZmFsc2UsXG4gICAgfSk7XG4gICAgcHJpdmF0ZSBjbGVhblVybCgpIHsgcmV0dXJuIG5vcm1hbGl6ZVNlcnZlclVybCh0aGlzLm9icy51cmwpOyB9XG4gICAgcHJpdmF0ZSBjb25uZWN0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzID0gdGhpcy5vYnM7XG4gICAgICAgIHMuZXJyb3IgPSBcIlwiO1xuICAgICAgICBzLm5lZWRzQ2VydCA9IGZhbHNlO1xuICAgICAgICBzLmNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jbGVhblVybCgpO1xuICAgICAgICAgICAgaWYgKCF1cmwpIHsgcy5lcnJvciA9IFwiRW50ZXIgYSBzZXJ2ZXIgYWRkcmVzcy5cIjsgcmV0dXJuOyB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXN0UmVtb3RlQ29ubmVjdGlvbih1cmwsIHMucGFzc3dvcmQudHJpbSgpKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcIm9rXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWc6IFJlbW90ZUNvbmZpZyA9IHsgdXJsLCBwYXNzd29yZDogcy5wYXNzd29yZC50cmltKCkgfTtcbiAgICAgICAgICAgICAgICBzYXZlUmVtb3RlQ29uZmlnKGNvbmZpZyk7ICAgICAgICAgICAgIC8vIHJlbWVtYmVyIGZvciBuZXh0IHNlc3Npb25cbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ29ubmVjdGVkKGNvbmZpZyk7ICAgICAgIC8vIGhhbmQgdGhlIHZlcmlmaWVkIHNlcnZlciBiYWNrIHRvIGdldERpcmVjdG9yeUhhbmRsZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInVuYXV0aG9yaXplZFwiKSB7XG4gICAgICAgICAgICAgICAgcy5lcnJvciA9IFwiVGhlIHNlcnZlciByZWplY3RlZCB0aGF0IHBhc3N3b3JkLlwiO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZW1vdGUgY29ubmVjdDogdW5hdXRob3JpemVkIGZvclwiLCB1cmwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBHb3Qgbm90aGluZyBiYWNrIOKAlCB1c3VhbGx5IHRoZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBpc24ndCB0cnVzdGVkIHlldCwgYnV0IHNob3cgdGhlIGFjdHVhbCBlcnJvciB0b28gc28gYSB3cm9uZyBhZGRyZXNzIC8gZG93biBzZXJ2ZXIgLyBDT1JTIGlzc3VlIGlzIGRpYWdub3NhYmxlLlxuICAgICAgICAgICAgICAgIHMubmVlZHNDZXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzLmVycm9yID0gXCJDb3VsZG4ndCByZWFjaCB0aGUgc2VydmVyOiBcIiArIHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVtb3RlIGNvbm5lY3Q6IHVucmVhY2hhYmxlXCIsIHVybCwgXCItXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHMuZXJyb3IgPSBcIkNvbm5lY3Rpb24gZXJyb3I6IFwiICsgKChlIGFzIEVycm9yKS5tZXNzYWdlIHx8IFN0cmluZyhlKSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVtb3RlIGNvbm5lY3QgdGhyZXc6XCIsIGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcy5jb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMub2JzO1xuICAgICAgICBjb25zdCBpbnB1dENzcyA9IGNzcy5mb250U2l6ZSgyOCkucGFkMigyNCwgMTQpLndpZHRoKDU2MCkubWF4V2lkdGgoXCI4MHZ3XCIpO1xuICAgICAgICBjb25zdCBidG5Dc3MgPSBjc3MuZm9udFNpemUoMzIpLnBhZDIoNjAsIDMwKTtcbiAgICAgICAgaWYgKCFzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gPGJ1dHRvbiBjbGFzc05hbWU9e2J0bkNzc30gb25DbGljaz17KCkgPT4gcy5leHBhbmRlZCA9IHRydWV9PkNvbm5lY3QgdG8gYSBzZXJ2ZXI8L2J1dHRvbj47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgxNikuY2VudGVyfT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPXtpbnB1dENzc30gcGxhY2Vob2xkZXI9XCJzZXJ2ZXIgYWRkcmVzcyAoZS5nLiA2NS4xMDkuOTMuMTEzLCBvciBob3N0OnBvcnQpXCIgdmFsdWU9e3MudXJsfVxuICAgICAgICAgICAgICAgICAgICBvbklucHV0PXtlID0+IHMudXJsID0gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlfSAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MuaGJveCgxMCkuY2VudGVyfT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT17aW5wdXRDc3N9IHR5cGU9e3Muc2hvd1Bhc3N3b3JkID8gXCJ0ZXh0XCIgOiBcInBhc3N3b3JkXCJ9IHBsYWNlaG9sZGVyPVwicGFzc3dvcmQgKHNpeCB3b3JkcylcIiB2YWx1ZT17cy5wYXNzd29yZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9e2UgPT4gcy5wYXNzd29yZCA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSgyMikucGFkMigyNCwgMTIpfSBvbkNsaWNrPXsoKSA9PiBzLnNob3dQYXNzd29yZCA9ICFzLnNob3dQYXNzd29yZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cy5zaG93UGFzc3dvcmQgPyBcIkhpZGVcIiA6IFwiU2hvd1wifVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7cy5lcnJvciA/IDxkaXYgY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoMjIpLmNvbG9yKFwicmVkXCIpLm1heFdpZHRoKFwiODB2d1wiKX0+e3MuZXJyb3J9PC9kaXY+IDogbnVsbH1cbiAgICAgICAgICAgICAgICB7cy5uZWVkc0NlcnQgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgxMCkuY2VudGVyLmZvbnRTaXplKDIwKS5tYXhXaWR0aCg2MjApLm1heFdpZHRoKFwiODB2d1wiKS50ZXh0QWxpZ24oXCJjZW50ZXJcIikuY29sb3IoXCJoc2woMCwgMCUsIDI1JSlcIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5UaGlzIHNlcnZlciB1c2VzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUsIHNvIHlvdXIgYnJvd3NlciBoYXMgdG8gdHJ1c3QgaXQgb25jZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+MS4gT3BlbiB0aGUgc2VydmVyIGluIGEgbmV3IHRhYiAoYnV0dG9uIGJlbG93KS4gJm5ic3A7IDIuIEFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZyAoQWR2YW5jZWQg4oaSIFByb2NlZWQpLiAmbmJzcDsgMy4gQ29tZSBiYWNrIGFuZCBjbGljayBSZXRyeS48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoMjYpLnBhZDIoNDAsIDIwKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7IGNvbnN0IHUgPSB0aGlzLmNsZWFuVXJsKCk7IGlmICh1KSB3aW5kb3cub3Blbih1ICsgXCIvXCIsIFwiX2JsYW5rXCIpOyB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuIHNlcnZlciAmYW1wOyBhY2NlcHQgY2VydGlmaWNhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzLmhib3goMTYpfT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2J0bkNzc30gZGlzYWJsZWQ9e3MuY29ubmVjdGluZ30gb25DbGljaz17dGhpcy5jb25uZWN0fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtzLmNvbm5lY3RpbmcgPyBcIkNvbm5lY3RpbmfigKZcIiA6IHMubmVlZHNDZXJ0ID8gXCJSZXRyeVwiIDogXCJDb25uZWN0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17YnRuQ3NzfSBvbkNsaWNrPXsoKSA9PiB7IHMuZXhwYW5kZWQgPSBmYWxzZTsgcy5lcnJvciA9IFwiXCI7IHMubmVlZHNDZXJ0ID0gZmFsc2U7IH19PkJhY2s8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyIGltcGxlbWVudHMgRmlsZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIH1cbiAgICByZWFkb25seSBraW5kID0gXCJmaWxlXCIgYXMgY29uc3Q7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiBwYXRoLmJhc2VuYW1lKHRoaXMuZmlsZVBhdGgpOyB9XG5cbiAgICBhc3luYyBnZXRGaWxlKCkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQodGhpcy5maWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IHN0YXRzLnNpemUsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLmJ1ZmZlci5zbGljZShidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVPZmZzZXQgKyBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xpY2U6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFtcGVkU3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChzdGFydCwgMCksIHN0YXRzLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFtcGVkRW5kID0gTWF0aC5taW4oTWF0aC5tYXgoZW5kLCBjbGFtcGVkU3RhcnQpLCBzdGF0cy5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY2xhbXBlZEVuZCAtIGNsYW1wZWRTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4oZmlsZVBhdGgsIFwiclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmlsZUhhbmRsZS5yZWFkKGJ1ZmZlciwgMCwgbGVuZ3RoLCBjbGFtcGVkU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5idWZmZXIuc2xpY2UoYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlT2Zmc2V0ICsgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmlsZUhhbmRsZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRVUkwoKSB7XG4gICAgICAgIHJldHVybiBcImZpbGU6Ly9cIiArIHBhdGgucmVzb2x2ZSh0aGlzLmZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVXcml0YWJsZShjb25maWc/OiB7IGtlZXBFeGlzdGluZ0RhdGE/OiBib29sZWFuIH0pIHtcbiAgICAgICAgbGV0IGZpbGVIYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gY29uZmlnPy5rZWVwRXhpc3RpbmdEYXRhID8gXCJyK1wiIDogXCJ3XCI7XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gT3BlbiBvciBjcmVhdGUgdGhlIGZpbGVcbiAgICAgICAgaWYgKGNvbmZpZz8ua2VlcEV4aXN0aW5nRGF0YSAmJiBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3ModGhpcy5maWxlUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSkpIHtcbiAgICAgICAgICAgIGZpbGVIYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHRoaXMuZmlsZVBhdGgsIGZsYWdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbGVIYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHRoaXMuZmlsZVBhdGgsIFwid1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlZWs6IGFzeW5jIChvZmZzZXQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gb2Zmc2V0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRlOiBhc3luYyAodmFsdWU6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGVIYW5kbGUud3JpdGUodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGVIYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyIGltcGxlbWVudHMgRGlyZWN0b3J5V3JhcHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb290UGF0aDogc3RyaW5nKSB7XG4gICAgfVxuICAgIHJlYWRvbmx5IGtpbmQgPSBcImRpcmVjdG9yeVwiIGFzIGNvbnN0O1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gcGF0aC5iYXNlbmFtZSh0aGlzLnJvb3RQYXRoKTsgfVxuICAgIGdldCBmdWxsUGF0aCgpIHsgcmV0dXJuIHRoaXMucm9vdFBhdGg7IH1cbiAgICBlbnRyaWVzKCkgeyByZXR1cm4gdGhpc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTsgfVxuXG4gICAgYXN5bmMgcmVtb3ZlRW50cnkoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSkge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwga2V5KTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZW50cnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZW50cnlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEZpbGVIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RmlsZVdyYXBwZXI+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwga2V5KTtcblxuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MoZmlsZVBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpO1xuXG4gICAgICAgIGlmICghZXhpc3RzICYmIG9wdGlvbnM/LmNyZWF0ZSkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsZVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBCdWZmZXIuYWxsb2MoMCkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgIC8vIFRhZyBhcyBFTk9FTlQgc28gcmVhZFdpdGhSZXRyeSB0cmVhdHMgaXQgYXMgYSBnZW51aW5lbHktbWlzc2luZyBmaWxlIChyZXR1cm4gdW5kZWZpbmVkIG5vdykgcmF0aGVyIHRoYW4gYSB0cmFuc2llbnQgcmVhZCBmYWlsdXJlIHRvIHJldHJ5IDbDlyB3aXRoIGJhY2tvZmYg4oCUIG1pc3NpbmcgZmlsZXMgYXJlIG5vcm1hbCAoYSBjb25jdXJyZW50IG1lcmdlIGRlbGV0ZXMgYSBmaWxlIG1pZC1yZWFkKSwgYW5kIHJldHJ5aW5nIHRoZW0gaXMgY2F0YXN0cm9waGljYWxseSBzbG93LlxuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKSBhcyBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9O1xuICAgICAgICAgICAgZXJyLmNvZGUgPSBcIkVOT0VOVFwiO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlSlNGaWxlSGFuZGxlV3JhcHBlcihmaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RGlyZWN0b3J5SGFuZGxlKGtleTogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuIH0pOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+IHtcbiAgICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBrZXkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5jcmVhdGUpIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgZnMucHJvbWlzZXMuYWNjZXNzKGRpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpcmVjdG9yeSBub3QgZm91bmQ6ICR7ZGlyUGF0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTm9kZUpTRGlyZWN0b3J5SGFuZGxlV3JhcHBlcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgRmlsZVdyYXBwZXIgfCBEaXJlY3RvcnlXcmFwcGVyXT4ge1xuICAgICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLnJvb3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aGlzLnJvb3RQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwgZW50cnkubmFtZSk7XG4gICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbZW50cnkubmFtZSwgbmV3IE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyKGNoaWxkUGF0aCldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW2VudHJ5Lm5hbWUsIG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKGNoaWxkUGF0aCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdoZW4gc2V0LCBnZXREaXJlY3RvcnlIYW5kbGUgc2tpcHMgZXZlcnkgcHJvbXB0ICsgcmVtb3RlIGNoZWNrIGFuZCBzZXJ2ZXMgZnJvbSB0aGUgYnJvd3NlcidzIE9yaWdpbiBQcml2YXRlIEZpbGUgU3lzdGVtIChPUEZTKS4gT25lIG5hbWVkIHN1YmZvbGRlciBpcyBcImN1cnJlbnRcIiBwZXIgZmlsZUFQSUtleTsgcGlja1ByaXZhdGVGb2xkZXIgLyByZXNldFN0b3JhZ2VMb2NhdGlvbiBzd2l0Y2ggd2hpY2ggb25lLiBTZXQgdGhpcyBpbiBhcHAgc3RhcnR1cCBCRUZPUkUgdGhlIGZpcnN0IGdldERpcmVjdG9yeUhhbmRsZS5cbmxldCBvcGZzRW5hYmxlZCA9IGZhbHNlO1xuY29uc3QgT1BGU19GT0xERVJTX0RJUiA9IFwiZm9sZGVyc1wiO1xuY29uc3QgT1BGU19ERUZBVUxUX0ZPTERFUiA9IFwiZGVmYXVsdFwiO1xuZnVuY3Rpb24gb3Bmc0N1cnJlbnRLZXkoKSB7IHJldHVybiBnZXRGaWxlQVBJS2V5KCkgKyBcIjpvcGZzOmN1cnJlbnRcIjsgfVxuZnVuY3Rpb24gZ2V0Q3VycmVudE9wZnNGb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0ob3Bmc0N1cnJlbnRLZXkoKSkgfHwgT1BGU19ERUZBVUxUX0ZPTERFUjtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRPcGZzRm9sZGVyKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG9wZnNDdXJyZW50S2V5KCksIG5hbWUpO1xufVxuXG4vLyBTd2l0Y2hlcyBnZXREaXJlY3RvcnlIYW5kbGUgdG8gdGhlIE9yaWdpbiBQcml2YXRlIEZpbGUgU3lzdGVtLiBObyBkaXJlY3RvcnkgcGlja2VyLCBubyBwZXJtaXNzaW9uIHByb21wdCwgbm8gcmVtb3RlIHNlcnZlciBjaGVjay4gUGVyc2lzdHMgbm90aGluZyDigJQgY2FsbCBvbiBldmVyeSBhcHAgc3RhcnQgYmVmb3JlIHJlYWRpbmcgc3RvcmFnZS5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcml2YXRlRmlsZVN5c3RlbSgpOiB2b2lkIHtcbiAgICBvcGZzRW5hYmxlZCA9IHRydWU7XG59XG5cbi8vIFdoZXRoZXIgdGhlIE9QRlMgYnJhbmNoIGlzIGluIGVmZmVjdCAoc28gb3RoZXIgY2FsbGVycyBjYW4gYWRhcHQg4oCUIGUuZy4gc2tpcCB0aGUgXCJmaW5kIGRhdGEgc3ViZGlyXCIgaGFjayBpbiBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgc2luY2UgT1BGUyBpcyBhbHdheXMgYSBjbGVhbiByb290IHdlIG93biBlbmQtdG8tZW5kKS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVGaWxlU3lzdGVtQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcGZzRW5hYmxlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3Bmc0ZvbGRlcnNEaXIoKTogUHJvbWlzZTxGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlPiB7XG4gICAgaWYgKCFuYXZpZ2F0b3Iuc3RvcmFnZT8uZ2V0RGlyZWN0b3J5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByaXZhdGUgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbiAgICB9XG4gICAgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSBcImZpbGU6XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJpdmF0ZSBGaWxlIFN5c3RlbSBBUEkgaXMgZGlzYWxsb3dlZCBpbiBmaWxlOi8vIGxvY2F0aW9ucy4gSG9zdCBvbiBhbiBhY3R1YWwgb3JpZ2luLlwiKTtcbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IGF3YWl0IG5hdmlnYXRvci5zdG9yYWdlLmdldERpcmVjdG9yeSgpO1xuICAgIGNvbnN0IGtleWVkID0gYXdhaXQgcm9vdC5nZXREaXJlY3RvcnlIYW5kbGUoZ2V0RmlsZUFQSUtleSgpLCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYXdhaXQga2V5ZWQuZ2V0RGlyZWN0b3J5SGFuZGxlKE9QRlNfRk9MREVSU19ESVIsIHsgY3JlYXRlOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50T3Bmc0hhbmRsZSgpOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+IHtcbiAgICBjb25zdCBmb2xkZXJzID0gYXdhaXQgZ2V0T3Bmc0ZvbGRlcnNEaXIoKTtcbiAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCBmb2xkZXJzLmdldERpcmVjdG9yeUhhbmRsZShnZXRDdXJyZW50T3Bmc0ZvbGRlcigpLCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZm9sZGVyIGFzIHVua25vd24gYXMgRGlyZWN0b3J5V3JhcHBlcjtcbn1cblxuLy8gQWxsIHByZXZpb3VzbHktdXNlZCBPUEZTIHN1YmZvbGRlcnMgdW5kZXIgdGhpcyBmaWxlQVBJS2V5LCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgKHRpbWVzdGFtcC1uYW1lZCBhdXRvLWdlbmVyYXRlZCBmb2xkZXJzIHRoZXJlZm9yZSBzb3J0IGNocm9ub2xvZ2ljYWxseSkuIFVzZSB0aGlzIHRvIHN1cmZhY2UgYSBsaXN0LCB0aGVuIGNhbGwgcGlja1ByaXZhdGVGb2xkZXIobmFtZSkgdG8gc3dpdGNoLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RQcml2YXRlRm9sZGVycygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgaWYgKCFuYXZpZ2F0b3Iuc3RvcmFnZT8uZ2V0RGlyZWN0b3J5KSByZXR1cm4gW107XG4gICAgbGV0IGZvbGRlcnM6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGU7XG4gICAgdHJ5IHsgZm9sZGVycyA9IGF3YWl0IGdldE9wZnNGb2xkZXJzRGlyKCk7IH0gY2F0Y2ggeyByZXR1cm4gW107IH1cbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBoYW5kbGVdIG9mIChmb2xkZXJzIGFzIHVua25vd24gYXMgQXN5bmNJdGVyYWJsZTxbc3RyaW5nLCB7IGtpbmQ6IHN0cmluZyB9XT4pKSB7XG4gICAgICAgIGlmIChoYW5kbGUua2luZCA9PT0gXCJkaXJlY3RvcnlcIikgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzLnNvcnQoKTtcbn1cblxuLy8gU3dpdGNoIHRvIGEgc3BlY2lmaWMgT1BGUyBzdWJmb2xkZXIgYW5kIHJlbG9hZCBzbyBnZXREaXJlY3RvcnlIYW5kbGUgcmUtcmVzb2x2ZXMgdG8gaXQuIFRoZSBmb2xkZXIgaXMgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrUHJpdmF0ZUZvbGRlcihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRDdXJyZW50T3Bmc0ZvbGRlcihuYW1lKTtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG59XG5cbi8vIFJldHVybnMgdGhlIGRpcmVjdG9yeSBoYW5kbGUgdG8gdXNlIOKAlCBsb2NhbCAoTm9kZSAvIHBpY2tlZCBmb2xkZXIpIE9SIGEgcmVtb3RlIHNlcnZlciwgYm90aCBhcyB0aGUgc2FtZSBEaXJlY3RvcnlXcmFwcGVyLCBzbyBjYWxsZXJzIGRvbid0IGtub3cgb3IgY2FyZSB3aGljaCBpdCBpcy4gQSByZW1lbWJlcmVkIHNlcnZlciBpcyBWRVJJRklFRCAod2UgYWN0dWFsbHkgY29ubmVjdCkgYmVmb3JlIHVzZTsgaWYgaXQgbm8gbG9uZ2VyIHdvcmtzIHdlIHJlLXByb21wdCwganVzdCBsaWtlIGEgbG9jYWwgZm9sZGVyIHdob3NlIHBlcm1pc3Npb24gd2FzIGxvc3QuIEJsb2NrcyB1bnRpbCByZWFkeSAob3IgdGhlIHVzZXIgZGlzbWlzc2VzLCB3aGljaCByZWplY3RzKS5cbmV4cG9ydCBjb25zdCBnZXREaXJlY3RvcnlIYW5kbGUgPSBsYXp5KGFzeW5jIGZ1bmN0aW9uIGdldERpcmVjdG9yeUhhbmRsZSgpOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+IHtcbiAgICAvLyBBbiBpbmplY3RlZCByb290IChlLmcuIGEgV2ViIFdvcmtlciBoYW5kZWQgdGhlIGhhbmRsZSBieSBpdHMgb3duaW5nIHdpbmRvdylcbiAgICAvLyBzaG9ydC1jaXJjdWl0cyB0aGUgd2hvbGUgaW50ZXJhY3RpdmUgcmVzb2x1dGlvbiDigJQgbm8gcGlja2VyLCBubyBET00sIG5vXG4gICAgLy8gbG9jYWxTdG9yYWdlLiBNdXN0IGNvbWUgZmlyc3Qgc28gYSB3b3JrZXIgbmV2ZXIgcmVhY2hlcyB0aGUgYnJhbmNoZXMgYmVsb3cuXG4gICAgaWYgKHN0b3JhZ2VSb290T3ZlcnJpZGUpIHtcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2VSb290T3ZlcnJpZGUgYXMgdW5rbm93biBhcyBEaXJlY3RvcnlXcmFwcGVyO1xuICAgIH1cbiAgICAvLyBBIHdvcmtlciBjYW4ndCBzaG93IHRoZSBwaWNrZXIgKG5vIERPTSAvIG5vIHVzZXIgYWN0aXZhdGlvbikgYW5kIGNhbid0IHJlYWQgbG9jYWxTdG9yYWdlLCBidXQgaXQgQ0FOIG9wZW4gdGhlIHBvaW50ZXIgSW5kZXhlZERCIHRoZSBtYWluLXRocmVhZCBwaWNrZXIgcGVyc2lzdHMgdG8uIFBvbGwgaXQgZm9yIGEgaGFuZGxlIHdob3NlIHBlcm1pc3Npb24gaXMgYWxyZWFkeSBncmFudGVkOyB0aGUgb3duaW5nIHdpbmRvdyBtYXkgYWxzbyBwb3N0TWVzc2FnZSBhIGhhbmRsZSBpbiBtaWQtcG9sbCAoY2hlY2tlZCBlYWNoIGl0ZXJhdGlvbikuIFRoaXMgaGFzIHRvIGNvbWUgYmVmb3JlIHRoZSBpc05vZGUgYnJhbmNoOiB0eXBlc2FmZWNzcydzIGlzTm9kZSgpIHJldHVybnMgdHJ1ZSBpbiB3b3JrZXJzICh3aW5kb3cgaXMgdW5kZWZpbmVkKSwgc28gYSB3b3JrZXIgd291bGQgb3RoZXJ3aXNlIGZhbGwgaW50byB0aGUgTm9kZSBicmFuY2ggYW5kIHRyeSB0byB1c2UgZnMvcGF0aC5cbiAgICBpZiAoXCJXb3JrZXJHbG9iYWxTY29wZVwiIGluIGdsb2JhbFRoaXMpIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmIChzdG9yYWdlUm9vdE92ZXJyaWRlKSByZXR1cm4gc3RvcmFnZVJvb3RPdmVycmlkZSBhcyB1bmtub3duIGFzIERpcmVjdG9yeVdyYXBwZXI7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgZmluZEdyYW50ZWRQb2ludGVySGFuZGxlKFwicmVhZHdyaXRlXCIpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZSkgcmV0dXJuIGhhbmRsZSBhcyB1bmtub3duIGFzIERpcmVjdG9yeVdyYXBwZXI7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgV09SS0VSX1BPTExfSU5URVJWQUxfTVMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKHBhdGgucmVzb2x2ZShcIi4vZGF0YS9cIikpO1xuICAgIH1cbiAgICBpZiAob3Bmc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRPcGZzSGFuZGxlKCk7XG4gICAgfVxuXG4gICAgLy8gQSBzZXJ2ZXIgY29ubmVjdGVkIGluIGEgcHJldmlvdXMgc2Vzc2lvbjogb25seSByZXVzZSBpdCBpZiBpdCBzdGlsbCBhY3R1YWxseSB3b3Jrcy5cbiAgICBjb25zdCBzYXZlZFJlbW90ZSA9IGxvYWRSZW1vdGVDb25maWcoKTtcbiAgICBpZiAoc2F2ZWRSZW1vdGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGVzdFJlbW90ZUNvbm5lY3Rpb24oc2F2ZWRSZW1vdGUudXJsLCBzYXZlZFJlbW90ZS5wYXNzd29yZCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcIm9rXCIpIHJldHVybiBnZXRSZW1vdGVIYW5kbGUoc2F2ZWRSZW1vdGUpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFNhdmVkIHJlbW90ZSBzZXJ2ZXIgZGlkbid0IGNvbm5lY3QgKCR7cmVzdWx0LnN0YXR1c30pJHtyZXN1bHQuc3RhdHVzID09PSBcInVucmVhY2hhYmxlXCIgPyBcIjogXCIgKyByZXN1bHQuZXJyb3IgOiBcIlwifSDigJQgcmUtcHJvbXB0aW5nLmApO1xuICAgIH1cblxuICAgIGxldCByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJvb3QpO1xuICAgIHByZWFjdC5yZW5kZXIoPERpcmVjdG9yeVByb21wdGVyIC8+LCByb290KTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzb2x2ZUhhbmRsZSE6IChoOiBEaXJlY3RvcnlXcmFwcGVyKSA9PiB2b2lkO1xuICAgICAgICBsZXQgcmVqZWN0SGFuZGxlITogKGU6IEVycm9yKSA9PiB2b2lkO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj4oKHJlcywgcmVqKSA9PiB7IHJlc29sdmVIYW5kbGUgPSByZXM7IHJlamVjdEhhbmRsZSA9IHJlajsgfSk7XG5cbiAgICAgICAgY29uc3QgcGlja0xvY2FsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB3aW5kb3cuc2hvd0RpcmVjdG9yeVBpY2tlcigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5yZXF1ZXN0UGVybWlzc2lvbih7IG1vZGU6IFwicmVhZHdyaXRlXCIgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVkSWQgPSBhd2FpdCBzdG9yZUZpbGVTeXN0ZW1Qb2ludGVyKHsgbW9kZTogXCJyZWFkd3JpdGVcIiwgaGFuZGxlIH0pO1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGdldEZpbGVBUElLZXkoKSwgc3RvcmVkSWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVIYW5kbGUoaGFuZGxlIGFzIGFueSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkRpcmVjdG9yeSBwaWNrIGZhaWxlZC9jYW5jZWxsZWQ6XCIsIGUpOyAvLyBzdGF5IG9uIHRoZSBwcm9tcHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Db25uZWN0ZWQgPSAoY29uZmlnOiBSZW1vdGVDb25maWcpID0+IHsgc2F2ZVJlbW90ZUNvbmZpZyhjb25maWcpOyByZXNvbHZlSGFuZGxlKGdldFJlbW90ZUhhbmRsZShjb25maWcpKTsgfTtcbiAgICAgICAgLy8gVGhlIHRocmVlIG9wdGlvbnMsIHJlbmRlcmVkIGZyZXNoIGVhY2ggdGltZS4gSWYgYSBzYXZlZCBzZXJ2ZXIganVzdCBmYWlsZWQsIHByZS1maWxsICsgZXhwYW5kIHRoZSBjb25uZWN0IGZvcm0gc28gdGhlIHVzZXIgY2FuIHJldHJ5IG9yIGZpeCBpdC5cbiAgICAgICAgY29uc3QgcmVuZGVyT3B0aW9ucyA9ICgpID0+IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSg0MCkucGFkMig4MCwgNDApfSBvbkNsaWNrPXtwaWNrTG9jYWx9PlBpY2sgRGF0YSBEaXJlY3Rvcnk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8U2VydmVyQ29ubmVjdEZvcm0gb25Db25uZWN0ZWQ9e29uQ29ubmVjdGVkfSBpbml0aWFsPXtzYXZlZFJlbW90ZX0gLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17Y3NzLmZvbnRTaXplKDQwKS5wYWQyKDgwLCA0MCl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHJlamVjdEhhbmRsZShuZXcgRXJyb3IoXCJVc2VyIGRpc21pc3NlZCBmaWxlIHN5c3RlbSBhY2Nlc3MgcHJvbXB0XCIpKX0+RGlzbWlzczwvYnV0dG9uPlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQSBwcmV2aW91c2x5LXBpY2tlZCBsb2NhbCBmb2xkZXI6IHRyeSB0byByZXN0b3JlIGl0IChtYXkgbmVlZCBhIGNsaWNrKS4gU2tpcHBlZCB3aGVuIGEgc2F2ZWQgc2VydmVyIGZhaWxlZCDigJQgdGhhdCB1c2VyIHdhbnRzIHRoZSBzZXJ2ZXIsIHNvIGdvIHN0cmFpZ2h0IHRvIHRoZSAocHJlLWZpbGxlZCkgcHJvbXB0LlxuICAgICAgICBjb25zdCBzdG9yZWRJZCA9ICFzYXZlZFJlbW90ZSAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShnZXRGaWxlQVBJS2V5KCkpO1xuICAgICAgICBpZiAoc3RvcmVkSWQpIHtcbiAgICAgICAgICAgIGxldCBkb25lTG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICghZG9uZUxvYWQpIGRpc3BsYXlEYXRhLnVpID0gXCJDbGljayBhbnl3aGVyZSB0byBhbGxvdyBmaWxlIHN5c3RlbSBhY2Nlc3NcIjsgfSwgNTAwKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gYXdhaXQgdHJ5VG9Mb2FkUG9pbnRlcihzdG9yZWRJZCk7XG4gICAgICAgICAgICAgICAgZG9uZUxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHJldHVybiBoYW5kbGU7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZG9uZUxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpO1xuICAgICAgICAgICAgICAgIGlmIChtc2cuaW5jbHVkZXMoXCJ1c2VyIGFjdGl2YXRpb25cIikgfHwgbXNnLmluY2x1ZGVzKFwiVXNlciBhY3RpdmF0aW9uXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlEYXRhLnVpID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzcy52Ym94KDIwKS5jZW50ZXJ9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoNDApLnBhZDIoODAsIDQwKX0gb25DbGljaz17YXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RGF0YS51aSA9IFwiTG9hZGluZy4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IGF3YWl0IHRyeVRvTG9hZFBvaW50ZXIoc3RvcmVkSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgpIHsgcmVzb2x2ZUhhbmRsZShoKTsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJldHJ5RXJyb3IpIHsgY29uc29sZS5lcnJvcihcIlJldHJ5IGZhaWxlZDpcIiwgcmV0cnlFcnJvcik7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheURhdGEudWkgPSA8ZGl2IGNsYXNzTmFtZT17Y3NzLnZib3goMjApLmNlbnRlcn0+e3JlbmRlck9wdGlvbnMoKX08L2Rpdj47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0+Q2xpY2sgdG8gcmVzdG9yZSBmaWxlIHN5c3RlbSBhY2Nlc3M8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVuZGVyT3B0aW9ucygpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNwbGF5RGF0YS51aSA9IDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgyMCkuY2VudGVyfT57cmVuZGVyT3B0aW9ucygpfTwvZGl2PjtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcHJlYWN0LnJlbmRlcihudWxsLCByb290KTtcbiAgICAgICAgcm9vdC5yZW1vdmUoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVTdG9yYWdlTmVzdGVkID0gY2FjaGUoYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZVN0b3JhZ2UocGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgIGxldCBiYXNlID0gYXdhaXQgZ2V0RGlyZWN0b3J5SGFuZGxlKCk7XG4gICAgZm9yIChsZXQgcGFydCBvZiBwYXRoLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBiYXNlID0gYXdhaXQgYmFzZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwSGFuZGxlKGJhc2UpO1xufSk7XG4vLyBTdXBwb3J0cyBpZiB0aGUgdXNlciBzZWxlY3RzIHRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb2xkZXIgb3IgdGhlIGRhdGEgZm9sZGVyIGRpcmVjdGx5LiBJZiBwYXRoU3RyIGlzIGFuIGFic29sdXRlIHBhdGggKGFuZCB3ZSdyZSBpbiBub2RlanMpIHdlIHVzZSBpdCBkaXJlY3RseS5cbmV4cG9ydCBjb25zdCBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgPSBjYWNoZShhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3RvcmFnZShwYXRoU3RyOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdG9yYWdlPiB7XG4gICAgbGV0IGJhc2U6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAgcGF0aFN0ciA9IHBhdGhTdHIucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKHBhdGhTdHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcEhhbmRsZShuZXcgTm9kZUpTRGlyZWN0b3J5SGFuZGxlV3JhcHBlcihwYXRoU3RyKSk7XG4gICAgICAgIH1cbiAgICAgICAgYmFzZSA9IG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKHBhdGgucmVzb2x2ZShcIi4vZGF0YS9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2UgPSBhd2FpdCBnZXREaXJlY3RvcnlIYW5kbGUoKTtcbiAgICAgICAgLy8gU2tpcCB0aGUgXCJmaW5kIGRhdGEgc3ViZGlyXCIgaGFjayB1bmRlciBPUEZTIOKAlCB0aGF0J3MgZm9yIHBpY2tlZCBkaXJlY3RvcmllcyB3aGVyZSB0aGUgdXNlciBtaWdodCBoYXZlIHNlbGVjdGVkIGEgZm9sZGVyIHdpdGggdW5yZWxhdGVkIGZpbGVzOyBPUEZTIGlzIGEgY2xlYW4gcm9vdCB3ZSBvd24gZW5kLXRvLWVuZC5cbiAgICAgICAgaWYgKCFvcGZzRW5hYmxlZCkge1xuICAgICAgICAgICAgbGV0IGRpcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgYWxsczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBiYXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlycy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbGxzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIQUNLOiBJZiB0aGVyZSBhcmUgZW5vdWdoIGZpbGVzLCBpdCdzIGFsbW9zdCBjZXJ0YWlubHkgbm90IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgY29sbGVjdGlvbnMuIEl0J3MgcHJvYmFibHkgdGhlIHVzZXIncyBkYXRhIGluc3RlYWRcbiAgICAgICAgICAgIGlmIChkaXJzLmluY2x1ZGVzKFwiLmdpdFwiKSB8fCBkaXJzLmluY2x1ZGVzKFwiZGF0YVwiKSB8fCBhbGxzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgIGJhc2UgPSBhd2FpdCBiYXNlLmdldERpcmVjdG9yeUhhbmRsZShcImRhdGFcIiwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgcGFydCBvZiBwYXRoU3RyLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBiYXNlID0gYXdhaXQgYmFzZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwSGFuZGxlKGJhc2UpO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0RmlsZVN0b3JhZ2UgPSBsYXp5KGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVTdG9yYWdlKCk6IFByb21pc2U8RmlsZVN0b3JhZ2U+IHtcbiAgICBpZiAoVVNFX0lOREVYRURfREIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEZpbGVTdG9yYWdlSW5kZXhEQigpO1xuICAgIH1cbiAgICBsZXQgaGFuZGxlID0gYXdhaXQgZ2V0RGlyZWN0b3J5SGFuZGxlKCk7XG4gICAgcmV0dXJuIHdyYXBIYW5kbGUoaGFuZGxlKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0U3RvcmFnZUxvY2F0aW9uKCkge1xuICAgIGlmIChvcGZzRW5hYmxlZCkge1xuICAgICAgICAvLyBEb24ndCBkZWxldGUgcHJldmlvdXMgZm9sZGVyIOKAlCBsaXN0UHJpdmF0ZUZvbGRlcnMgLyBwaWNrUHJpdmF0ZUZvbGRlciBzdGlsbCBuZWVkIGl0LiBKdXN0IHBvaW50IFwiY3VycmVudFwiIGF0IGEgZnJlc2ggdGltZXN0YW1wLW5hbWVkIG9uZSBzbyB0aGUgbmV4dCByZWxvYWQgc3RhcnRzIGNsZWFuLlxuICAgICAgICBzZXRDdXJyZW50T3Bmc0ZvbGRlcihuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCBcIi1cIikpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0RmlsZUFQSUtleSgpKTtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShyZW1vdGVDb25maWdLZXkoKSk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbn1cblxuZXhwb3J0IHR5cGUgTmVzdGVkRmlsZVN0b3JhZ2UgPSB7XG4gICAgaGFzS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBnZXRTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RvcmFnZT47XG4gICAgcmVtb3ZlU3RvcmFnZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgZ2V0S2V5cyhpbmNsdWRlRm9sZGVycz86IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbGVTdG9yYWdlID0gSVN0b3JhZ2VSYXcgJiB7XG4gICAgZm9sZGVyOiBOZXN0ZWRGaWxlU3RvcmFnZTtcbiAgICAvLyBNaXJyb3JzIERpcmVjdG9yeVdyYXBwZXIuaXNSZW1vdGU6IHRydWUgd2hlbiB0aGlzIHN0b3JhZ2UgaXMgc2VydmVkIG92ZXIgdGhlIG5ldHdvcmsuIExldHMgY2FsbGVycyAoZS5nLiBCdWxrRGF0YWJhc2UyLCB3aGljaCBza2lwcyBhdXRvbWF0aWMgY29tcGFjdGlvbiBvdmVyIHRoZSBuZXR3b3JrIGJ5IGRlZmF1bHQpIGFkYXB0LlxuICAgIGlzUmVtb3RlPzogYm9vbGVhbjtcbn07XG5cbmxldCBhcHBlbmRRdWV1ZSA9IGNhY2hlKChrZXk6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBydW5JblNlcmlhbCgoZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBmbmMoKSk7XG59KTtcblxuXG5hc3luYyBmdW5jdGlvbiBmaXhlZEdldEZpbGVIYW5kbGUoY29uZmlnOiB7XG4gICAgaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGNyZWF0ZTogdHJ1ZTtcbn0pOiBQcm9taXNlPEZpbGVXcmFwcGVyPjtcbmFzeW5jIGZ1bmN0aW9uIGZpeGVkR2V0RmlsZUhhbmRsZShjb25maWc6IHtcbiAgICBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY3JlYXRlPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPEZpbGVXcmFwcGVyIHwgdW5kZWZpbmVkPjtcbmFzeW5jIGZ1bmN0aW9uIGZpeGVkR2V0RmlsZUhhbmRsZShjb25maWc6IHtcbiAgICBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY3JlYXRlPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPEZpbGVXcmFwcGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKGNvbmZpZy5rZXkuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSBmb2xkZXJzIGRpcmVjdGx5IGluIGZpbGUgc3lzdGVtIHJlYWQgLyB3cml0ZXMuIFVzZSBhIHdyYXBwZXIgd2hpY2ggaGFuZGxlcyB0aGUgZm9sZGVyIG5hdmlnYXRpb24uIFBhdGggd2FzICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmtleSl9YCk7XG4gICAgfVxuICAgIC8vIEFMV0FZUyB0cnkgd2l0aG91dCBjcmVhdGUsIGJlY2F1c2UgdGhlIHNzaGZzLXdpbiBzdWNrcyBhbmQgZG9lc24ndCBzdXBwb3J0IGBjcmVhdGU6IHRydWVgPyBXdGYuLi5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY29uZmlnLmhhbmRsZS5nZXRGaWxlSGFuZGxlKGNvbmZpZy5rZXkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICBpZiAoIWNvbmZpZy5jcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBjb25maWcuaGFuZGxlLmdldEZpbGVIYW5kbGUoY29uZmlnLmtleSwgeyBjcmVhdGU6IHRydWUgfSk7XG59XG5cbi8vIEEgZmlsZSB0aGF0IGdlbnVpbmVseSBkb2VzIG5vdCBleGlzdC4gV2UgbXVzdCBOT1QgcmV0cnkgdGhlc2UsIG90aGVyd2lzZSByZWFkaW5nIG1hbnkgbWlzc2luZyBmaWxlcyAoYSBjb21tb24gcGF0dGVybikgZ2V0cyBjYXRhc3Ryb3BoaWNhbGx5IHNsb3cuXG5mdW5jdGlvbiBpc01pc3NpbmdFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGxldCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBsZXQgY29kZSA9IChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgcmV0dXJuIG5hbWUgPT09IFwiTm90Rm91bmRFcnJvclwiIHx8IGNvZGUgPT09IFwiRU5PRU5UXCI7XG59XG5cbmNvbnN0IE1BWF9SRUFEX1JFVFJJRVMgPSA2O1xuXG4vLyBUaGUgYnJvd3NlciBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJIGNhbiB0cmFuc2llbnRseSBmYWlsIHJlYWRzIHVuZGVyIGhlYXZ5IGxvYWQgKGl0IGFwcGVhcnMgdG8gdGhyb3R0bGUgd2hlbiBhIHBhZ2UgaXNzdWVzIG1hbnkgcmVhZHMgYXQgb25jZSkuIFRob3NlIGZhaWx1cmVzIHN1cmZhY2UgYXMgZXJyb3JzIE9USEVSIHRoYW4gXCJub3QgZm91bmRcIiwgc28gd2UgcmV0cnkgdGhlbSB3aXRoIGJhY2tvZmYuIEEgcmVhbCBtaXNzaW5nIGZpbGUgKE5vdEZvdW5kRXJyb3IgLyBFTk9FTlQpIHJldHVybnMgdW5kZWZpbmVkIGltbWVkaWF0ZWx5IHdpdGggbm8gcmV0cnkuXG5hc3luYyBmdW5jdGlvbiByZWFkV2l0aFJldHJ5PFQ+KGxhYmVsOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZWFkOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGJhY2tvZmYgPSAyNTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWFkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNNaXNzaW5nRXJyb3IoZXJyb3IpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IG5hbWUgPSAoZXJyb3IgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lIHx8IFwiRXJyb3JcIjtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gKGVycm9yIGFzIHsgbWVzc2FnZT86IHN0cmluZyB9KT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGF0dGVtcHQgPj0gTUFYX1JFQURfUkVUUklFUykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtsYWJlbH0gZ2F2ZSB1cCBvbiAke0pTT04uc3RyaW5naWZ5KGtleSl9IGFmdGVyICR7YXR0ZW1wdH0gcmV0cmllcyAoJHtuYW1lfSk6ICR7bWVzc2FnZS5zbGljZSgwLCAyMDApfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7bGFiZWx9IHJldHJ5aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0sICR7bmFtZX0pOiAke21lc3NhZ2Uuc2xpY2UoMCwgMjAwKX1gKTtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBiYWNrb2ZmKSk7XG4gICAgICAgICAgICBiYWNrb2ZmID0gTWF0aC5taW4oYmFja29mZiAqIDIsIDEwMDApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cmFwSGFuZGxlRmlsZXMoaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyKTogSVN0b3JhZ2VSYXcge1xuICAgIC8vIExvZyB0aGUgZnVsbCBwYXRoIChyb290ICsgZmlsZW5hbWUpIHdoZW4gYXZhaWxhYmxlLCBzbyBhIGZhaWxpbmcgZmlsZSBpcyBpZGVudGlmaWFibGUuXG4gICAgY29uc3QgcGF0aE9mID0gKGtleTogc3RyaW5nKSA9PiBoYW5kbGUuZnVsbFBhdGggPyBoYW5kbGUuZnVsbFBhdGggKyBcIi9cIiArIGtleSA6IGtleTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZFdpdGhSZXRyeShcImdldEluZm9cIiwgcGF0aE9mKGtleSksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgaGFuZGxlLmdldEZpbGVIYW5kbGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IGZpbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGVDb250ZW50LnNpemUsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogZmlsZUNvbnRlbnQubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIHJldHVybiByZWFkV2l0aFJldHJ5KFwiZ2V0XCIsIHBhdGhPZihrZXkpLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGhhbmRsZS5nZXRGaWxlSGFuZGxlKGtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmaWxlLmdldEZpbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGVDb250ZW50LmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgLy8gVW5kZXIgbG9hZCB0aGUgRlMgQWNjZXNzIEFQSSBjYW4gcmVzb2x2ZSB3aXRoIGEgdHJ1bmNhdGVkIGJ1ZmZlciBhbmQgbm8gZXJyb3IuIFRyZWF0IGEgc2hvcnQgcmVhZCBhcyB0cmFuc2llbnQgc28gcmVhZFdpdGhSZXRyeSByZXRyaWVzIGl0LlxuICAgICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoICE9PSBmaWxlQ29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBTaG9ydCByZWFkOiBnb3QgJHthcnJheUJ1ZmZlci5ieXRlTGVuZ3RofSBvZiAke2ZpbGVDb250ZW50LnNpemV9IGJ5dGVzYCksIHsgbmFtZTogXCJTaG9ydFJlYWRFcnJvclwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0UmFuZ2Uoa2V5OiBzdHJpbmcsIGNvbmZpZzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIHJldHVybiByZWFkV2l0aFJldHJ5KFwiZ2V0UmFuZ2VcIiwgcGF0aE9mKGtleSksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgaGFuZGxlLmdldEZpbGVIYW5kbGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IGZpbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYW1wZWRTdGFydCA9IE1hdGgubWluKE1hdGgubWF4KGNvbmZpZy5zdGFydCwgMCksIGZpbGVDb250ZW50LnNpemUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYW1wZWRFbmQgPSBNYXRoLm1pbihNYXRoLm1heChjb25maWcuZW5kLCBjbGFtcGVkU3RhcnQpLCBmaWxlQ29udGVudC5zaXplKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGVDb250ZW50LnNsaWNlKGNvbmZpZy5zdGFydCwgY29uZmlnLmVuZCkuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAhPT0gY2xhbXBlZEVuZCAtIGNsYW1wZWRTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU2hvcnQgcmFuZ2UgcmVhZDogZ290ICR7YXJyYXlCdWZmZXIuYnl0ZUxlbmd0aH0gb2YgJHtjbGFtcGVkRW5kIC0gY2xhbXBlZFN0YXJ0fSBieXRlc2ApLCB7IG5hbWU6IFwiU2hvcnRSZWFkRXJyb3JcIiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGFwcGVuZChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgYXdhaXQgYXBwZW5kUXVldWUoa2V5KShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTk9URTogSW50ZXJlc3RpbmcgcG9pbnQuIENocm9tZSBkb2Vzbid0IG9wdGltaXplIHRoaXMgdG8gYmUgYW4gYXBwZW5kLCBhbmQgaW5zdGVhZCByZXdyaXRlcyB0aGUgZW50aXJlIGZpbGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZpeGVkR2V0RmlsZUhhbmRsZSh7IGhhbmRsZSwga2V5LCBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaWxlLmNyZWF0ZVdyaXRhYmxlKHsga2VlcEV4aXN0aW5nRGF0YTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gKGF3YWl0IGZpbGUuZ2V0RmlsZSgpKS5zaXplO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLnNlZWsob2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZpeGVkR2V0RmlsZUhhbmRsZSh7IGhhbmRsZSwga2V5LCBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IGF3YWl0IGZpbGUuY3JlYXRlV3JpdGFibGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRlKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUucmVtb3ZlRW50cnkoa2V5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXRLZXlzKGluY2x1ZGVGb2xkZXJzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSBcImZpbGVcIiB8fCBpbmNsdWRlRm9sZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IChlcnJvciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgfHwgXCJFcnJvclwiO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gKGVycm9yIGFzIHsgbWVzc2FnZT86IHN0cmluZyB9KT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgICAgICAgIC8vIEEgZmFpbHVyZSBtaWQtaXRlcmF0aW9uIHdvdWxkIHNpbGVudGx5IHRydW5jYXRlIHRoZSBsaXN0aW5nLCBzbyBzdXJmYWNlIGl0IGxvdWRseS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBnZXRLZXlzIGRpcmVjdG9yeSBpdGVyYXRpb24gZmFpbGVkIGFmdGVyICR7a2V5cy5sZW5ndGh9IGVudHJpZXMgKCR7bmFtZX0pOiAke21lc3NhZ2Uuc2xpY2UoMCwgMzAwKX1gKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgZW50cnldIG9mIGhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5yZW1vdmVFbnRyeShlbnRyeS5uYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiB3cmFwSGFuZGxlTmVzdGVkKGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcik6IE5lc3RlZEZpbGVTdG9yYWdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBoYXNLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0U3RvcmFnZShrZXk6IHN0cmluZyk6IFByb21pc2U8RmlsZVN0b3JhZ2U+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1YkRpcmVjdG9yeSA9IGF3YWl0IGhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUoa2V5LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwSGFuZGxlKHN1YkRpcmVjdG9yeSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcmVtb3ZlU3RvcmFnZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnJlbW92ZUVudHJ5KGtleSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgZW50cnldIG9mIGhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSBcImRpcmVjdG9yeVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcEhhbmRsZShoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXIpOiBGaWxlU3RvcmFnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4ud3JhcEhhbmRsZUZpbGVzKGhhbmRsZSksXG4gICAgICAgIGZvbGRlcjogd3JhcEhhbmRsZU5lc3RlZChoYW5kbGUpLFxuICAgICAgICBpc1JlbW90ZTogaGFuZGxlLmlzUmVtb3RlLFxuICAgIH07XG59XG5cbi8vIFJldHVybnMgYSBVUkwgZm9yIGEgZmlsZSdzIGJ5dGVzLCByZWFkeSB0byBkcm9wIGludG8gPHZpZGVvPi88aW1nPi9mZXRjaC4gQSBuYXRpdmUgKGxvY2FsKSBmaWxlIGJlY29tZXMgYW4gaW4tbWVtb3J5IGJsb2I6IFVSTDsgYSByZW1vdGUgZmlsZSBiZWNvbWVzIGFuIGh0dHBzIFVSTCBpbnRvIHRoZSBzZXJ2ZXIncyByYW5nZS1jYXBhYmxlIC9tZWRpYSBlbmRwb2ludCAoYXV0aCB0b2tlbiBpbiB0aGUgcXVlcnksIHNpbmNlIGEgbWVkaWEgZWxlbWVudCBjYW4ndCBzZW5kIGhlYWRlcnMpLiBCb3RoIHN1cHBvcnQgSFRUUCByYW5nZSAvIHNlZWtpbmcuIEFMV0FZUyBoYW5kIHRoZSByZXN1bHQgdG8gZGlzcG9zZUZpbGVVUkwgd2hlbiBmaW5pc2hlZCDigJQgZm9yIGJsb2I6IFVSTHMgdGhhdCBmcmVlcyBtZW1vcnkuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZVVSTChmaWxlOiBGaWxlV3JhcHBlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZpbGUuZ2V0VVJMKSByZXR1cm4gZmlsZS5nZXRVUkwoKTtcbiAgICAvLyBOYXRpdmUgRmlsZVN5c3RlbUZpbGVIYW5kbGUgKG9yIGFueSBCbG9iLWJhY2tlZCBmaWxlKTogYSBibG9iOiBVUkwgb3ZlciB0aGUgRmlsZSBpdHNlbGYuXG4gICAgY29uc3QgZiA9IGF3YWl0IGZpbGUuZ2V0RmlsZSgpO1xuICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGYgYXMgdW5rbm93biBhcyBCbG9iKTtcbn1cblxuLy8gUmVsZWFzZXMgYSBVUkwgZnJvbSBnZXRGaWxlVVJMLiBibG9iOiBVUkxzIGxlYWsgdW50aWwgdGhlIGRvY3VtZW50IGlzIGdvbmUgdW5sZXNzIHJldm9rZWQ7IGh0dHBzL2ZpbGU6IFVSTHMgbmVlZCBubyBjbGVhbnVwLCBzbyB0aGlzIGlzIGEgbm8tb3AgZm9yIHRoZW0uXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUZpbGVVUkwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXCJibG9iOlwiKSkge1xuICAgICAgICB0cnkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7IH0gY2F0Y2ggeyAvKiBub3QgaW4gYSBicm93c2VyLCBvciBhbHJlYWR5IHJldm9rZWQgKi8gfVxuICAgIH1cbn1cblxuLy8gQSBTdG9yYWdlRmFjdG9yeSBiYWNrZWQgYnkgYSByZW1vdGUgc2VydmVyIChwYXRoIC0+IEZpbGVTdG9yYWdlKSwgZm9yIGNvZGUgdGhhdCBpbmplY3RzIGl0cyBvd24gc3RvcmFnZSBpbnRvIEJ1bGtEYXRhYmFzZTIgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaCB0aGUgZGlyZWN0b3J5IHByb21wdC5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZW1vdGVGaWxlU3RvcmFnZUZhY3RvcnkodXJsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIG9wdGlvbnM/OiBSZW1vdGVPcHRpb25zKTogKHBhdGhTdHI6IHN0cmluZykgPT4gUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgIGNvbnN0IHJvb3QgPSBnZXRSZW1vdGVEaXJlY3RvcnlIYW5kbGUodXJsLCBwYXNzd29yZCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFzeW5jIChwYXRoU3RyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGJhc2U6IERpcmVjdG9yeVdyYXBwZXIgPSByb290O1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFN0ci5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikuc3BsaXQoXCIvXCIpKSB7XG4gICAgICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYmFzZSA9IGF3YWl0IGJhc2UuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwSGFuZGxlKGJhc2UpO1xuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlUb0xvYWRQb2ludGVyKHBvaW50ZXI6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUG9pbnRlcih7IHBvaW50ZXIgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybjtcbiAgICBsZXQgaGFuZGxlID0gYXdhaXQgcmVzdWx0Py5vblVzZXJBY3RpdmF0aW9uKCk7XG4gICAgaWYgKCFoYW5kbGUpIHJldHVybjtcbiAgICByZXR1cm4gaGFuZGxlIGFzIGFueSBhcyBEaXJlY3RvcnlXcmFwcGVyO1xufSJdfQ==
751
- /* _JS_SOURCE_HASH = "75c8e6414439d8fe38f6f4220f9932f80d4a8ff3aedf0a28faf2cb93cb9dd164"; */
751
+ /* _JS_SOURCE_HASH = "40f30251e3193734da28d8ef206eaca3f4e342e7c10875277cd8232e4e819682"; */