sliftutils 1.7.32 → 1.7.33

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 (116) hide show
  1. package/builders/extensionBuild.ts +1 -1
  2. package/bundler/bundleEntry.ts +1 -3
  3. package/bundler/bundler.ts +2 -4
  4. package/bundler/sourceMaps.ts +1 -2
  5. package/examplestorage/browser.tsx +1 -2
  6. package/examplestorage/exampleserver.ts +1 -2
  7. package/index.d.ts +105 -100
  8. package/misc/dist/environment.ts.cache +2 -2
  9. package/misc/dist/getSecret.ts.cache +2 -2
  10. package/misc/dist/strings.ts.cache +2 -2
  11. package/misc/dist/zip.ts.cache +2 -2
  12. package/misc/https/dist/certs.ts.cache +2 -2
  13. package/misc/https/dist/dns.ts.cache +7 -16
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/dns.d.ts +1 -4
  16. package/misc/https/dns.ts +5 -14
  17. package/misc/https/hostServer.d.ts +2 -0
  18. package/misc/https/hostServer.ts +6 -7
  19. package/misc/https/httpsCerts.ts +4 -10
  20. package/misc/openrouter.ts +1 -2
  21. package/package.json +1 -1
  22. package/render-utils/FullscreenModal.tsx +1 -4
  23. package/render-utils/GenericFormat.tsx +2 -8
  24. package/render-utils/Input.tsx +5 -13
  25. package/render-utils/InputLabel.tsx +4 -6
  26. package/render-utils/InputPicker.tsx +1 -2
  27. package/render-utils/URLParam.ts +2 -3
  28. package/render-utils/dist/observer.tsx.cache +2 -2
  29. package/render-utils/mobxTyped.ts +2 -3
  30. package/render-utils/niceStringify.ts +2 -4
  31. package/storage/ArchivesDisk.ts +4 -14
  32. package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
  33. package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
  34. package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
  35. package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
  36. package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
  37. package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
  38. package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
  39. package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
  40. package/storage/BulkDatabase2/blockCache.ts +12 -28
  41. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
  42. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
  43. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
  44. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
  45. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
  46. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
  47. package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
  48. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
  49. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
  50. package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
  51. package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
  52. package/storage/BulkDatabase2/mergeLock.ts +7 -26
  53. package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
  54. package/storage/BulkDatabase2/streamLog.ts +14 -40
  55. package/storage/BulkDatabase2/syncClient.ts +8 -24
  56. package/storage/FileFolderAPI.tsx +28 -75
  57. package/storage/IArchives.d.ts +3 -3
  58. package/storage/IArchives.ts +21 -50
  59. package/storage/IStorage.ts +2 -4
  60. package/storage/PendingManager.tsx +2 -3
  61. package/storage/TransactionStorage.ts +11 -24
  62. package/storage/backblaze.ts +12 -43
  63. package/storage/dist/ArchivesDisk.ts.cache +7 -17
  64. package/storage/dist/FileFolderAPI.tsx.cache +25 -63
  65. package/storage/dist/IArchives.ts.cache +10 -20
  66. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  67. package/storage/dist/JSONStorage.ts.cache +2 -2
  68. package/storage/dist/PendingManager.tsx.cache +5 -6
  69. package/storage/dist/TransactionStorage.ts.cache +14 -27
  70. package/storage/dist/backblaze.ts.cache +15 -46
  71. package/storage/dist/embeddingFormats.ts.cache +11 -24
  72. package/storage/dist/fileSystemPointer.ts.cache +4 -7
  73. package/storage/dist/remoteFileStorage.ts.cache +17 -36
  74. package/storage/embeddingFormats.ts +11 -27
  75. package/storage/fileSystemPointer.ts +2 -7
  76. package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
  77. package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
  78. package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
  79. package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
  80. package/storage/proxydatabase/transactionSet.ts +2 -5
  81. package/storage/remoteFileServer.ts +20 -48
  82. package/storage/remoteFileStorage.ts +14 -33
  83. package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
  84. package/storage/remoteStorage/ArchivesRemote.ts +11 -26
  85. package/storage/remoteStorage/ArchivesUrl.ts +2 -4
  86. package/storage/remoteStorage/accessPage.tsx +1 -5
  87. package/storage/remoteStorage/blobStore.d.ts +5 -13
  88. package/storage/remoteStorage/blobStore.ts +52 -130
  89. package/storage/remoteStorage/createArchives.d.ts +9 -13
  90. package/storage/remoteStorage/createArchives.ts +43 -187
  91. package/storage/remoteStorage/deployTakeover.d.ts +18 -32
  92. package/storage/remoteStorage/deployTakeover.ts +70 -384
  93. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
  94. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
  95. package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
  96. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  97. package/storage/remoteStorage/dist/createArchives.ts.cache +48 -189
  98. package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
  99. package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
  100. package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
  101. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
  102. package/storage/remoteStorage/dist/storageClientController.ts.cache +4 -6
  103. package/storage/remoteStorage/dist/storageController.ts.cache +11 -73
  104. package/storage/remoteStorage/dist/storageServerState.ts.cache +265 -178
  105. package/storage/remoteStorage/grantAccessCli.ts +1 -3
  106. package/storage/remoteStorage/intermediateSources.d.ts +21 -0
  107. package/storage/remoteStorage/intermediateSources.ts +117 -0
  108. package/storage/remoteStorage/remoteConfig.ts +33 -20
  109. package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
  110. package/storage/remoteStorage/sourceWrapper.ts +19 -41
  111. package/storage/remoteStorage/storageClientController.ts +1 -3
  112. package/storage/remoteStorage/storageController.d.ts +4 -5
  113. package/storage/remoteStorage/storageController.ts +10 -81
  114. package/storage/remoteStorage/storageServer.ts +20 -34
  115. package/storage/remoteStorage/storageServerState.d.ts +28 -5
  116. package/storage/remoteStorage/storageServerState.ts +271 -207
@@ -137,8 +137,7 @@ const getAPI = lazy(async () => {
137
137
  if (path.endsWith("/")) path = path.slice(0, -1) + "%2F";
138
138
  // NOTE: For some reason, this won't render in the web UI correctly. BUT, it'll
139
139
  // work get get/set and find
140
- // - ALSO, it seems to add duplicate files? This might also be a web UI thing. It
141
- // seems to work though.
140
+ // - ALSO, it seems to add duplicate files? This might also be a web UI thing. It seems to work though.
142
141
  while (path.includes("//")) {
143
142
  path = path.replaceAll("//", "/%2F");
144
143
  }
@@ -167,7 +166,7 @@ const getAPI = lazy(async () => {
167
166
 
168
167
  // Oh... apparently, we can't reuse these? Huh...
169
168
  const getUploadURL = (async (bucketId: string) => {
170
- //setTimeout(() => getUploadURL.clear(bucketId), timeInHour * 1);
169
+ // setTimeout(() => getUploadURL.clear(bucketId), timeInHour * 1);
171
170
  let getUploadUrlRaw = await httpsRequest(auth.apiUrl + "/b2api/v2/b2_get_upload_url?bucketId=" + bucketId, undefined, "GET", undefined, {
172
171
  headers: {
173
172
  Authorization: auth.authorizationToken,
@@ -502,10 +501,7 @@ export class ArchivesBackblaze implements IArchives {
502
501
 
503
502
  // Keep track of when we last reset because of a 503
504
503
  private last503Reset = 0;
505
- // IMPORTANT! We must always CATCH AROUND the apiRetryLogic, NEVER inside of fnc. Otherwise we won't
506
- // be able to recreate the auth token.
507
- // `context` is a short label (verb + file path) included in every retry/error log so a stuck
508
- // silent-retry loop is identifiable from the logs.
504
+ // IMPORTANT! We must always CATCH AROUND the apiRetryLogic, NEVER inside of fnc. Otherwise we won't be able to recreate the auth token. `context` is a short label (verb + file path) included in every retry/error log so a stuck silent-retry loop is identifiable from the logs.
509
505
  private async apiRetryLogic<T>(
510
506
  context: string,
511
507
  fnc: (api: B2Api) => Promise<T>,
@@ -542,8 +538,7 @@ export class ArchivesBackblaze implements IArchives {
542
538
  return this.apiRetryLogic(context, fnc, retries - 1);
543
539
  }
544
540
 
545
- // If the error is that the authorization token is invalid, reset getBucketAPI and getAPI
546
- // If the error is that the bucket isn't found, reset getBucketAPI
541
+ // If the error is that the authorization token is invalid, reset getBucketAPI and getAPI If the error is that the bucket isn't found, reset getBucketAPI
547
542
  if (err.stack.includes(`"expired_auth_token"`)) {
548
543
  this.log(`[${context}] Authorization token expired`);
549
544
  getAPI.reset();
@@ -555,8 +550,7 @@ export class ArchivesBackblaze implements IArchives {
555
550
  err.stack.includes(`no tomes available`)
556
551
  || err.stack.includes(`ETIMEDOUT`)
557
552
  || err.stack.includes(`socket hang up`)
558
- // Eh... this might be bad, but... I think we just get random 400 errors. If this spams errors,
559
- // we can remove this line.
553
+ // Eh... this might be bad, but... I think we just get random 400 errors. If this spams errors, we can remove this line.
560
554
  || err.stack.includes(`400 Bad Request`)
561
555
  || err.stack.includes(`getaddrinfo ENOTFOUND`)
562
556
  || err.stack.includes(`ECONNRESET`)
@@ -665,8 +659,7 @@ export class ArchivesBackblaze implements IArchives {
665
659
  if (config?.lastModified) {
666
660
  assertValidLastModified(config.lastModified);
667
661
  let existing = await this.getInfo(fileName);
668
- // An older write never overwrites a newer one (see IArchives.set). B2 stamps its own
669
- // upload time, so the exact lastModified is not preserved on the stored file.
662
+ // An older write never overwrites a newer one (see IArchives.set). B2 stamps its own upload time, so the exact lastModified is not preserved on the stored file.
670
663
  if (existing && config.lastModified < existing.writeTime) return fileName;
671
664
  }
672
665
  this.log(`backblaze upload (${formatNumber(data.length)}B) ${fileName}`);
@@ -697,21 +690,7 @@ export class ArchivesBackblaze implements IArchives {
697
690
  this.log(`backblaze error in hide, possibly already hidden ${fileName}\n${e.stack}`);
698
691
  }
699
692
 
700
- // NOTE: Deletion SEEMS to work. This DOES break if we delete a file which keeps being recreated,
701
- // ex, the heartbeat.
702
- // let existsChecks = 10;
703
- // while (existsChecks > 0) {
704
- // let exists = await this.getInfo(fileName);
705
- // if (!exists) break;
706
- // await delay(1000);
707
- // existsChecks--;
708
- // }
709
- // if (existsChecks === 0) {
710
- // let exists = await this.getInfo(fileName);
711
- // devDebugbreak();
712
- // console.warn(`File ${fileName} was deleted, but was still found afterwards`);
713
- // exists = await this.getInfo(fileName);
714
- // }
693
+ // NOTE: Deletion SEEMS to work. This DOES break if we delete a file which keeps being recreated, ex, the heartbeat. let existsChecks = 10; while (existsChecks > 0) { let exists = await this.getInfo(fileName); if (!exists) break; await delay(1000); existsChecks--; } if (existsChecks === 0) { let exists = await this.getInfo(fileName); devDebugbreak(); console.warn(`File ${fileName} was deleted, but was still found afterwards`); exists = await this.getInfo(fileName); }
715
694
  }
716
695
 
717
696
  public async setLargeFile(config: { path: string; getNextData(): Promise<Buffer | undefined>; }): Promise<void> {
@@ -752,8 +731,7 @@ export class ArchivesBackblaze implements IArchives {
752
731
  await this.set(fileName, data);
753
732
  return;
754
733
  }
755
- // ALSO, if there are two chunks, but one is too small, combine it. This helps allow us never
756
- // send small chunks.
734
+ // ALSO, if there are two chunks, but one is too small, combine it. This helps allow us never send small chunks.
757
735
  if (secondData.length < MIN_CHUNK_SIZE) {
758
736
  await this.set(fileName, Buffer.concat([data, secondData]));
759
737
  return;
@@ -785,12 +763,7 @@ export class ArchivesBackblaze implements IArchives {
785
763
  while (true) {
786
764
  data = await getNextData();
787
765
  if (!data) break;
788
- // So... if the next chunk is the last one, combine it with the current one. This
789
- // prevents ANY uploads from being < the threshold, as apparently the "last part"
790
- // check in backblaze fails when we have to retry an upload (due to "no tomes available").
791
- // Well it can't fail if even the last part is > 5MB, now can it!
792
- // BUT, only if this isn't the first chunk, otherwise we might try to send
793
- // a single chunk, which we can't do.
766
+ // So... if the next chunk is the last one, combine it with the current one. This prevents ANY uploads from being < the threshold, as apparently the "last part" check in backblaze fails when we have to retry an upload (due to "no tomes available"). Well it can't fail if even the last part is > 5MB, now can it! BUT, only if this isn't the first chunk, otherwise we might try to send a single chunk, which we can't do.
794
767
  if (partSha1Array.length > 0) {
795
768
  let maybeLastData = await getNextData();
796
769
  if (maybeLastData) {
@@ -798,8 +771,7 @@ export class ArchivesBackblaze implements IArchives {
798
771
  // It's the last one, so consume it now
799
772
  data = Buffer.concat([data, maybeLastData]);
800
773
  } else {
801
- // It's not the last one. Put it back, in case the one AFTER is the last
802
- // one, in which case we need to merge maybeLastData with the next next data.
774
+ // It's not the last one. Put it back, in case the one AFTER is the last one, in which case we need to merge maybeLastData with the next next data.
803
775
  dataQueue.unshift(maybeLastData);
804
776
  }
805
777
  }
@@ -947,8 +919,7 @@ export class ArchivesBackblaze implements IArchives {
947
919
  let targetBucketId = target.bucketId;
948
920
  if (targetBucketId === this.bucketId && path === targetPath) return;
949
921
  await this.apiRetryLogic(`move ${path} -> ${targetPath}`, async (api) => {
950
- // Ugh... listing the file name sucks, but... I guess it's still better than
951
- // downloading and re-uploading the entire file.
922
+ // Ugh... listing the file name sucks, but... I guess it's still better than downloading and re-uploading the entire file.
952
923
  let info = await api.listFileNames({ bucketId: this.bucketId, prefix: path, maxFileCount: 10 });
953
924
  let file = info.files.find(x => x.fileName === path);
954
925
  if (!file) throw new Error(`File not found to move: ${path}`);
@@ -1042,9 +1013,7 @@ export const getArchivesBackblazePublicImmutable = cache((domain: string) => {
1042
1013
  });
1043
1014
  });
1044
1015
 
1045
- // NOTE: Cache by a minute. This might be a bad idea, but... usually whole reason for public is
1046
- // for cloudflare caching (as otherwise we can just access it through a server), or for large files
1047
- // (which should be cached anyways, and probably even use immutable caching).
1016
+ // NOTE: Cache by a minute. This might be a bad idea, but... usually whole reason for public is for cloudflare caching (as otherwise we can just access it through a server), or for large files (which should be cached anyways, and probably even use immutable caching).
1048
1017
  export const getArchivesBackblazePublic = cache((domain: string) => {
1049
1018
  return new ArchivesBackblaze({
1050
1019
  bucketName: domain + "-public",
@@ -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 __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -10,18 +10,10 @@ const caching_1 = require("socket-function/src/caching");
10
10
  const batching_1 = require("socket-function/src/batching");
11
11
  const misc_1 = require("socket-function/src/misc");
12
12
  const IArchives_1 = require("./IArchives");
13
- // The base file-system IArchives: storage is one-to-one with the file system, every key is exactly
14
- // one real file under <folder>/files, so the file system itself is the index. File handles are
15
- // cached and reused, and closed once idle (see FileHandleCache). All operations on a file run in
16
- // serial, so they can't collide with each other or with handle closing. Used as the disk
17
- // synchronization source of BlobStore (see remoteStorage/blobStore.ts).
13
+ // The base file-system IArchives: storage is one-to-one with the file system, every key is exactly one real file under <folder>/files, so the file system itself is the index. File handles are cached and reused, and closed once idle (see FileHandleCache). All operations on a file run in serial, so they can't collide with each other or with handle closing. Used as the disk synchronization source of BlobStore (see remoteStorage/blobStore.ts).
18
14
  const HANDLE_IDLE_TIMEOUT = 1000 * 60;
19
15
  const HANDLE_SWEEP_INTERVAL = 1000 * 15;
20
- // Caches open file handles, closing them once idle for HANDLE_IDLE_TIMEOUT. Instead of one
21
- // setTimeout per handle, a list sorted by last use is swept periodically (entries are moved via
22
- // binary search on access, and lastUse values only increase, so touched entries append at the
23
- // end). Also serializes operations per file: each operation only starts once the previous one on
24
- // the same file finished, and a handle is never closed while an operation is pending on it.
16
+ // Caches open file handles, closing them once idle for HANDLE_IDLE_TIMEOUT. Instead of one setTimeout per handle, a list sorted by last use is swept periodically (entries are moved via binary search on access, and lastUse values only increase, so touched entries append at the end). Also serializes operations per file: each operation only starts once the previous one on the same file finished, and a handle is never closed while an operation is pending on it.
25
17
  class FileHandleCache {
26
18
  constructor() {
27
19
  this.entries = new Map();
@@ -270,8 +262,7 @@ class ArchivesDisk {
270
262
  throw e;
271
263
  }
272
264
  }
273
- // Large files stream into their own file under uploads/, then move into place on finish. No
274
- // handle is opened until the first append actually happens.
265
+ // Large files stream into their own file under uploads/, then move into place on finish. No handle is opened until the first append actually happens.
275
266
  async startLargeUpload() {
276
267
  await this.init();
277
268
  let id = `${Date.now()}_${this.nextLargeUploadId++}`;
@@ -343,8 +334,7 @@ async function statOrUndefined(filePath) {
343
334
  throw e;
344
335
  }
345
336
  }
346
- // The folders/shallow post-processing shared by findInfo implementations that list flat files
347
- // (used by ArchivesDisk on the raw disk walk, and by BlobStore on its index).
337
+ // The folders/shallow post-processing shared by findInfo implementations that list flat files (used by ArchivesDisk on the raw disk walk, and by BlobStore on its index).
348
338
  function applyFindInfoShape(files, prefix, config) {
349
339
  if ((config === null || config === void 0 ? void 0 : config.type) === "folders") {
350
340
  let folders = new Map();
@@ -370,5 +360,5 @@ function applyFindInfoShape(files, prefix, config) {
370
360
  return files;
371
361
  }
372
362
  exports.applyFindInfoShape = applyFindInfoShape;
373
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQWtHO0FBRWxHLG1HQUFtRztBQUNuRywrRkFBK0Y7QUFDL0YsaUdBQWlHO0FBQ2pHLHlGQUF5RjtBQUN6Rix3RUFBd0U7QUFFeEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQVF4QywyRkFBMkY7QUFDM0YsZ0dBQWdHO0FBQ2hHLDhGQUE4RjtBQUM5RixpR0FBaUc7QUFDakcsNEZBQTRGO0FBQzVGLE1BQU0sZUFBZTtJQU1qQjtRQUxRLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUNqRCwwREFBMEQ7UUFDbEQsUUFBRyxHQUFrQixFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBRy9DLElBQUEsMEJBQWUsRUFBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsK0VBQStFO0lBQ3hFLEdBQUcsQ0FBSSxRQUFnQixFQUFFLEdBQXFCO1FBQ2pELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLDJGQUEyRjtRQUMzRixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFB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LEVBQUUsQ0FBQztnQkFDakIsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBckJELGdEQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHNvcnQsIGJpbmFyeVNlYXJjaEJhc2ljIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuXG4vLyBUaGUgYmFzZSBmaWxlLXN5c3RlbSBJQXJjaGl2ZXM6IHN0b3JhZ2UgaXMgb25lLXRvLW9uZSB3aXRoIHRoZSBmaWxlIHN5c3RlbSwgZXZlcnkga2V5IGlzIGV4YWN0bHlcbi8vIG9uZSByZWFsIGZpbGUgdW5kZXIgPGZvbGRlcj4vZmlsZXMsIHNvIHRoZSBmaWxlIHN5c3RlbSBpdHNlbGYgaXMgdGhlIGluZGV4LiBGaWxlIGhhbmRsZXMgYXJlXG4vLyBjYWNoZWQgYW5kIHJldXNlZCwgYW5kIGNsb3NlZCBvbmNlIGlkbGUgKHNlZSBGaWxlSGFuZGxlQ2FjaGUpLiBBbGwgb3BlcmF0aW9ucyBvbiBhIGZpbGUgcnVuIGluXG4vLyBzZXJpYWwsIHNvIHRoZXkgY2FuJ3QgY29sbGlkZSB3aXRoIGVhY2ggb3RoZXIgb3Igd2l0aCBoYW5kbGUgY2xvc2luZy4gVXNlZCBhcyB0aGUgZGlza1xuLy8gc3luY2hyb25pemF0aW9uIHNvdXJjZSBvZiBCbG9iU3RvcmUgKHNlZSByZW1vdGVTdG9yYWdlL2Jsb2JTdG9yZS50cykuXG5cbmNvbnN0IEhBTkRMRV9JRExFX1RJTUVPVVQgPSAxMDAwICogNjA7XG5jb25zdCBIQU5ETEVfU1dFRVBfSU5URVJWQUwgPSAxMDAwICogMTU7XG5cbnR5cGUgSGFuZGxlRW50cnkgPSB7XG4gICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICBoYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgbGFzdFVzZTogbnVtYmVyO1xufTtcblxuLy8gQ2FjaGVzIG9wZW4gZmlsZSBoYW5kbGVzLCBjbG9zaW5nIHRoZW0gb25jZSBpZGxlIGZvciBIQU5ETEVfSURMRV9USU1FT1VULiBJbnN0ZWFkIG9mIG9uZVxuLy8gc2V0VGltZW91dCBwZXIgaGFuZGxlLCBhIGxpc3Qgc29ydGVkIGJ5IGxhc3QgdXNlIGlzIHN3ZXB0IHBlcmlvZGljYWxseSAoZW50cmllcyBhcmUgbW92ZWQgdmlhXG4vLyBiaW5hcnkgc2VhcmNoIG9uIGFjY2VzcywgYW5kIGxhc3RVc2UgdmFsdWVzIG9ubHkgaW5jcmVhc2UsIHNvIHRvdWNoZWQgZW50cmllcyBhcHBlbmQgYXQgdGhlXG4vLyBlbmQpLiBBbHNvIHNlcmlhbGl6ZXMgb3BlcmF0aW9ucyBwZXIgZmlsZTogZWFjaCBvcGVyYXRpb24gb25seSBzdGFydHMgb25jZSB0aGUgcHJldmlvdXMgb25lIG9uXG4vLyB0aGUgc2FtZSBmaWxlIGZpbmlzaGVkLCBhbmQgYSBoYW5kbGUgaXMgbmV2ZXIgY2xvc2VkIHdoaWxlIGFuIG9wZXJhdGlvbiBpcyBwZW5kaW5nIG9uIGl0LlxuY2xhc3MgRmlsZUhhbmRsZUNhY2hlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlRW50cnk+KCk7XG4gICAgLy8gU29ydGVkIGJ5IGxhc3RVc2UgYXNjZW5kaW5nIChsZWFzdCByZWNlbnRseSB1c2VkIGZpcnN0KVxuICAgIHByaXZhdGUgbHJ1OiBIYW5kbGVFbnRyeVtdID0gW107XG4gICAgcHJpdmF0ZSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKEhBTkRMRV9TV0VFUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5zd2VlcCgpKTtcbiAgICB9XG5cbiAgICAvLyBSdW5zIGZuYyBhZnRlciBldmVyeSBwcmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24gb24gZmlsZVBhdGggaGFzIGZpbmlzaGVkXG4gICAgcHVibGljIHJ1bjxUPihmaWxlUGF0aDogc3RyaW5nLCBmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnBlbmRpbmcuZ2V0KGZpbGVQYXRoKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHByZXYudGhlbihmbmMpO1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBjaGFpbiBtdXN0IG5ldmVyIHJlamVjdCwgb3Igb25lIGZhaWxlZCBvcGVyYXRpb24gd291bGQgcG9pc29uIGFsbCBsYXRlciBvbmVzXG4gICAgICAgIGxldCBsYXN0ID0gcmVzdWx0LnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmcuc2V0KGZpbGVQYXRoLCBsYXN0KTtcbiAgICAgICAgdm9pZCBsYXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgc3RpbGwgdGhlIGxhc3QgcGVuZGluZyBvcGVyYXRpb24gb24gdGhpcyBmaWxlLCBjbGVhciBvdXJzZWx2ZXNcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmcuZ2V0KGZpbGVQYXRoKSA9PT0gbGFzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGNhbGwgaW5zaWRlIHJ1bigpIGZvciB0aGUgc2FtZSBmaWxlUGF0aCAoc28gb3BlbnMgY2FuJ3QgY29sbGlkZSB3aXRoIGNsb3NlcylcbiAgICBwdWJsaWMgYXN5bmMgZ2V0SGFuZGxlKGZpbGVQYXRoOiBzdHJpbmcsIGZsYWdzOiBudW1iZXIpOiBQcm9taXNlPGZzLnByb21pc2VzLkZpbGVIYW5kbGU+IHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChmaWxlUGF0aCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tTFJVKGVudHJ5KTtcbiAgICAgICAgICAgIGVudHJ5Lmxhc3RVc2UgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5scnUucHVzaChlbnRyeSk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuaGFuZGxlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKGZpbGVQYXRoLCBmbGFncyk7XG4gICAgICAgIGVudHJ5ID0geyBmaWxlUGF0aCwgaGFuZGxlLCBsYXN0VXNlOiBEYXRlLm5vdygpIH07XG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoZmlsZVBhdGgsIGVudHJ5KTtcbiAgICAgICAgdGhpcy5scnUucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfVxuXG4gICAgLy8gT25seSBjYWxsIGluc2lkZSBydW4oKSBmb3IgdGhlIHNhbWUgZmlsZVBhdGhcbiAgICBwdWJsaWMgYXN5bmMgY2xvc2VOb3coZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTFJVKGVudHJ5KTtcbiAgICAgICAgYXdhaXQgZW50cnkuaGFuZGxlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVGcm9tTFJVKGVudHJ5OiBIYW5kbGVFbnRyeSkge1xuICAgICAgICBsZXQgaW5kZXggPSBiaW5hcnlTZWFyY2hCYXNpYyh0aGlzLmxydSwgeCA9PiB4Lmxhc3RVc2UsIGVudHJ5Lmxhc3RVc2UpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgICAgIC8vIE11bHRpcGxlIGVudHJpZXMgY2FuIHNoYXJlIGEgbGFzdFVzZSwgc28gc2NhbiBmb3IgdGhlIGV4YWN0IG9uZVxuICAgICAgICB3aGlsZSAoaW5kZXggPCB0aGlzLmxydS5sZW5ndGggJiYgdGhpcy5scnVbaW5kZXhdLmxhc3RVc2UgPT09IGVudHJ5Lmxhc3RVc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxydVtpbmRleF0gPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5scnUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzd2VlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBIQU5ETEVfSURMRV9USU1FT1VUO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCB0aGlzLmxydS5sZW5ndGggJiYgdGhpcy5scnVbaW5kZXhdLmxhc3RVc2UgPD0gY3V0b2ZmKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmxydVtpbmRleF07XG4gICAgICAgICAgICAvLyBDYW4ndCBjbG9zZSBhIGhhbmRsZSB3aXRoIGEgcGVuZGluZyBvcGVyYXRpb247IGl0J2xsIGJlIHN3ZXB0IGFmdGVyIGl0IGZpbmlzaGVzXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmhhcyhlbnRyeS5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5scnUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoZW50cnkuZmlsZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgZW50cnkuaGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0Rpc2sgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9sZGVyOiBzdHJpbmcpIHsgfVxuXG4gICAgcHJpdmF0ZSBmaWxlc0RpciA9IHBhdGguam9pbih0aGlzLmZvbGRlciwgXCJmaWxlc1wiKTtcbiAgICBwcml2YXRlIHVwbG9hZHNEaXIgPSBwYXRoLmpvaW4odGhpcy5mb2xkZXIsIFwidXBsb2Fkc1wiKTtcbiAgICBwcml2YXRlIGhhbmRsZXMgPSBuZXcgRmlsZUhhbmRsZUNhY2hlKCk7XG4gICAgcHJpdmF0ZSBsYXJnZVVwbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgeyB0bXBQYXRoOiBzdHJpbmcgfT4oKTtcbiAgICBwcml2YXRlIG5leHRMYXJnZVVwbG9hZElkID0gMTtcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRoaXMuZmlsZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLnVwbG9hZHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAvLyBVcGxvYWRzIGRvbid0IHN1cnZpdmUgcmVzdGFydHMgKHRoZSB1cGxvYWRlciBzdHJlYW1zIGludG8gdGhlbSksIHNvIG9sZCBvbmVzIGFyZSBnYXJiYWdlXG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aGlzLnVwbG9hZHNEaXIpKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgZmlsZSkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGRpc2sgJHt0aGlzLmZvbGRlcn1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGVQYXRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCBrZXkpO1xuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydHNXaXRoKHRoaXMuZmlsZXNEaXIgKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkuc2xpY2UoMCwgMjAwKSl9LCBpdCBlc2NhcGVzIHRoZSBzdG9yZSBmb2xkZXJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnPy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgc3RhdE9yVW5kZWZpbmVkKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgbGFzdE1vZGlmaWVkIDwgZXhpc3RpbmcubXRpbWVNcykgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZShmaWxlUGF0aCwgZnMuY29uc3RhbnRzLk9fUkRXUiB8IGZzLmNvbnN0YW50cy5PX0NSRUFUKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50cnVuY2F0ZSgwKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS53cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnV0aW1lcyhuZXcgRGF0ZShsYXN0TW9kaWZpZWQpLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZmlsZVBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihrZXksIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGtleTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCByYW5nZSA9IGNvbmZpZz8ucmFuZ2U7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBoYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGhhbmRsZSA9IGF3YWl0IHRoaXMuaGFuZGxlcy5nZXRIYW5kbGUoZmlsZVBhdGgsIGZzLmNvbnN0YW50cy5PX1JEV1IpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXRzID0gYXdhaXQgaGFuZGxlLnN0YXQoKTtcbiAgICAgICAgICAgIGxldCBzaXplID0gc3RhdHMuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLnN0YXJ0LCBzaXplKSB8fCAwO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLmVuZCwgc2l6ZSkgfHwgc2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBzdGF0cy5tdGltZU1zLCBzaXplIH07XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGxldCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgaGFuZGxlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIGF0ICR7ZmlsZVBhdGh9OiR7c3RhcnR9LCByZWFkICR7Ynl0ZXNSZWFkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogYnVmZmVyLCB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMuaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpbmZvcyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKFwiXCIsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICBsZXQgZmlsZXMgPSBBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKTtcbiAgICAgICAgZmlsZXMgPSBhcHBseUZpbmRJbmZvU2hhcGUoZmlsZXMsIHByZWZpeCwgY29uZmlnKTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gcmVsRGlyIGlzIFwiXCIgb3IgZW5kcyB3aXRoIFwiL1wiLiBPbmx5IGRlc2NlbmRzIGludG8gZGlyZWN0b3JpZXMgdGhhdCBjYW4gc3RpbGwgbWF0Y2ggdGhlIHByZWZpeC5cbiAgICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGaWxlcyhyZWxEaXI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIGluZm9zOiBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCByZWxEaXIpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBsZXQgcmVsUGF0aCA9IHJlbERpciArIGVudHJ5Lm5hbWU7XG4gICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIGxldCBkaXJQYXRoID0gcmVsUGF0aCArIFwiL1wiO1xuICAgICAgICAgICAgICAgIGlmIChkaXJQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBwcmVmaXguc3RhcnRzV2l0aChkaXJQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhkaXJQYXRoLCBwcmVmaXgsIGluZm9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcmVsUGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHN0YXRzID0gYXdhaXQgc3RhdE9yVW5kZWZpbmVkKHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCByZWxQYXRoKSk7XG4gICAgICAgICAgICAvLyBEZWxldGVkIHdoaWxlIHdlIHdlcmUgd2Fsa2luZ1xuICAgICAgICAgICAgaWYgKCFzdGF0cykgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQocmVsUGF0aCwgeyBwYXRoOiByZWxQYXRoLCBjcmVhdGVUaW1lOiBzdGF0cy5tdGltZU1zLCBzaXplOiBzdGF0cy5zaXplIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCB0aGlzLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwZW5kTGFyZ2VVcGxvYWQoaWQsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5maW5pc2hMYXJnZVVwbG9hZChpZCwgY29uZmlnLnBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXJnZSBmaWxlcyBzdHJlYW0gaW50byB0aGVpciBvd24gZmlsZSB1bmRlciB1cGxvYWRzLywgdGhlbiBtb3ZlIGludG8gcGxhY2Ugb24gZmluaXNoLiBOb1xuICAgIC8vIGhhbmRsZSBpcyBvcGVuZWQgdW50aWwgdGhlIGZpcnN0IGFwcGVuZCBhY3R1YWxseSBoYXBwZW5zLlxuICAgIHB1YmxpYyBhc3luYyBzdGFydExhcmdlVXBsb2FkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgaWQgPSBgJHtEYXRlLm5vdygpfV8ke3RoaXMubmV4dExhcmdlVXBsb2FkSWQrK31gO1xuICAgICAgICB0aGlzLmxhcmdlVXBsb2Fkcy5zZXQoaWQsIHsgdG1wUGF0aDogcGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgYHVwbG9hZF8ke2lkfS50bXBgKSB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywgZGF0YTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cGxvYWQgPSB0aGlzLmxhcmdlVXBsb2Fkcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIXVwbG9hZCkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhcmdlIHVwbG9hZCAke2lkfWApO1xuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhhbmRsZSA9IGF3YWl0IHRoaXMuaGFuZGxlcy5nZXRIYW5kbGUodG1wUGF0aCwgZnMuY29uc3RhbnRzLk9fV1JPTkxZIHwgZnMuY29uc3RhbnRzLk9fQ1JFQVQgfCBmcy5jb25zdGFudHMuT19BUFBFTkQpO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5pc2hMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsYXJnZSB1cGxvYWQgJHtpZH1gKTtcbiAgICAgICAgY29uc3QgdG1wUGF0aCA9IHVwbG9hZC50bXBQYXRoO1xuICAgICAgICB0aGlzLmxhcmdlVXBsb2Fkcy5kZWxldGUoaWQpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgKCkgPT4gdGhpcy5oYW5kbGVzLmNsb3NlTm93KHRtcFBhdGgpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bihmaWxlUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2xvc2UgYW55IGNhY2hlZCBoYW5kbGUgdG8gdGhlIGZpbGUgd2UncmUgcmVwbGFjaW5nLCBzbyBsYXRlciByZWFkcyByZW9wZW4gdGhlIG5ldyBmaWxlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZmlsZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0bXBQYXRoLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgd2FzIGV2ZXIgYXBwZW5kZWQsIHNvIHRoZSB1cGxvYWQgZmlsZSB3YXMgbmV2ZXIgY3JlYXRlZFxuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgQnVmZmVyLmFsbG9jKDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cGxvYWQgPSB0aGlzLmxhcmdlVXBsb2Fkcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIXVwbG9hZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLmNsb3NlTm93KHRtcFBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodG1wUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZ2V0VVJMIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpc2sgYXJjaGl2ZXMgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIHBhdGggJHtwYXRofSlgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxmcy5TdGF0cyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbi8vIFRoZSBmb2xkZXJzL3NoYWxsb3cgcG9zdC1wcm9jZXNzaW5nIHNoYXJlZCBieSBmaW5kSW5mbyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBsaXN0IGZsYXQgZmlsZXNcbi8vICh1c2VkIGJ5IEFyY2hpdmVzRGlzayBvbiB0aGUgcmF3IGRpc2sgd2FsaywgYW5kIGJ5IEJsb2JTdG9yZSBvbiBpdHMgaW5kZXgpLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RmluZEluZm9TaGFwZShmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10sIHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IEFyY2hpdmVGaWxlSW5mb1tdIHtcbiAgICBpZiAoY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICBsZXQgZm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGxldCByZXN0ID0gZmlsZS5wYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IHJlc3RQYXJ0cyA9IHJlc3Quc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgaWYgKHJlc3RQYXJ0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmb2xkZXI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChjb25maWcuc2hhbGxvdykge1xuICAgICAgICAgICAgICAgIGZvbGRlciA9IHByZWZpeCArIHJlc3RQYXJ0c1swXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gZmlsZS5wYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmb2xkZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUucGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5pbmNsdWRlcyhcIi9cIikpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4iXX0=
374
- /* _JS_SOURCE_HASH = "7e94e2ee093ec91fbe31015f44368e9c32bd4ec0403c6f21c9cab937812857b3"; */
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQWtHO0FBRWxHLDRiQUE0YjtBQUU1YixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBUXhDLDhjQUE4YztBQUM5YyxNQUFNLGVBQWU7SUFNakI7UUFMUSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDakQsMERBQTBEO1FBQ2xELFFBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUcvQyxJQUFBLDBCQUFlLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxHQUFHLENBQUksUUFBZ0IsRUFBRSxHQUFxQjtRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLEtBQUss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LEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFyQkQsZ0RBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgc29ydCwgYmluYXJ5U2VhcmNoQmFzaWMgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkIH0gZnJvbSBcIi4vSUFyY2hpdmVzXCI7XG5cbi8vIFRoZSBiYXNlIGZpbGUtc3lzdGVtIElBcmNoaXZlczogc3RvcmFnZSBpcyBvbmUtdG8tb25lIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBldmVyeSBrZXkgaXMgZXhhY3RseSBvbmUgcmVhbCBmaWxlIHVuZGVyIDxmb2xkZXI+L2ZpbGVzLCBzbyB0aGUgZmlsZSBzeXN0ZW0gaXRzZWxmIGlzIHRoZSBpbmRleC4gRmlsZSBoYW5kbGVzIGFyZSBjYWNoZWQgYW5kIHJldXNlZCwgYW5kIGNsb3NlZCBvbmNlIGlkbGUgKHNlZSBGaWxlSGFuZGxlQ2FjaGUpLiBBbGwgb3BlcmF0aW9ucyBvbiBhIGZpbGUgcnVuIGluIHNlcmlhbCwgc28gdGhleSBjYW4ndCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIGhhbmRsZSBjbG9zaW5nLiBVc2VkIGFzIHRoZSBkaXNrIHN5bmNocm9uaXphdGlvbiBzb3VyY2Ugb2YgQmxvYlN0b3JlIChzZWUgcmVtb3RlU3RvcmFnZS9ibG9iU3RvcmUudHMpLlxuXG5jb25zdCBIQU5ETEVfSURMRV9USU1FT1VUID0gMTAwMCAqIDYwO1xuY29uc3QgSEFORExFX1NXRUVQX0lOVEVSVkFMID0gMTAwMCAqIDE1O1xuXG50eXBlIEhhbmRsZUVudHJ5ID0ge1xuICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgaGFuZGxlOiBmcy5wcm9taXNlcy5GaWxlSGFuZGxlO1xuICAgIGxhc3RVc2U6IG51bWJlcjtcbn07XG5cbi8vIENhY2hlcyBvcGVuIGZpbGUgaGFuZGxlcywgY2xvc2luZyB0aGVtIG9uY2UgaWRsZSBmb3IgSEFORExFX0lETEVfVElNRU9VVC4gSW5zdGVhZCBvZiBvbmUgc2V0VGltZW91dCBwZXIgaGFuZGxlLCBhIGxpc3Qgc29ydGVkIGJ5IGxhc3QgdXNlIGlzIHN3ZXB0IHBlcmlvZGljYWxseSAoZW50cmllcyBhcmUgbW92ZWQgdmlhIGJpbmFyeSBzZWFyY2ggb24gYWNjZXNzLCBhbmQgbGFzdFVzZSB2YWx1ZXMgb25seSBpbmNyZWFzZSwgc28gdG91Y2hlZCBlbnRyaWVzIGFwcGVuZCBhdCB0aGUgZW5kKS4gQWxzbyBzZXJpYWxpemVzIG9wZXJhdGlvbnMgcGVyIGZpbGU6IGVhY2ggb3BlcmF0aW9uIG9ubHkgc3RhcnRzIG9uY2UgdGhlIHByZXZpb3VzIG9uZSBvbiB0aGUgc2FtZSBmaWxlIGZpbmlzaGVkLCBhbmQgYSBoYW5kbGUgaXMgbmV2ZXIgY2xvc2VkIHdoaWxlIGFuIG9wZXJhdGlvbiBpcyBwZW5kaW5nIG9uIGl0LlxuY2xhc3MgRmlsZUhhbmRsZUNhY2hlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlRW50cnk+KCk7XG4gICAgLy8gU29ydGVkIGJ5IGxhc3RVc2UgYXNjZW5kaW5nIChsZWFzdCByZWNlbnRseSB1c2VkIGZpcnN0KVxuICAgIHByaXZhdGUgbHJ1OiBIYW5kbGVFbnRyeVtdID0gW107XG4gICAgcHJpdmF0ZSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKEhBTkRMRV9TV0VFUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5zd2VlcCgpKTtcbiAgICB9XG5cbiAgICAvLyBSdW5zIGZuYyBhZnRlciBldmVyeSBwcmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24gb24gZmlsZVBhdGggaGFzIGZpbmlzaGVkXG4gICAgcHVibGljIHJ1bjxUPihmaWxlUGF0aDogc3RyaW5nLCBmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnBlbmRpbmcuZ2V0KGZpbGVQYXRoKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHByZXYudGhlbihmbmMpO1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBjaGFpbiBtdXN0IG5ldmVyIHJlamVjdCwgb3Igb25lIGZhaWxlZCBvcGVyYXRpb24gd291bGQgcG9pc29uIGFsbCBsYXRlciBvbmVzXG4gICAgICAgIGxldCBsYXN0ID0gcmVzdWx0LnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmcuc2V0KGZpbGVQYXRoLCBsYXN0KTtcbiAgICAgICAgdm9pZCBsYXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgc3RpbGwgdGhlIGxhc3QgcGVuZGluZyBvcGVyYXRpb24gb24gdGhpcyBmaWxlLCBjbGVhciBvdXJzZWx2ZXNcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmcuZ2V0KGZpbGVQYXRoKSA9PT0gbGFzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGNhbGwgaW5zaWRlIHJ1bigpIGZvciB0aGUgc2FtZSBmaWxlUGF0aCAoc28gb3BlbnMgY2FuJ3QgY29sbGlkZSB3aXRoIGNsb3NlcylcbiAgICBwdWJsaWMgYXN5bmMgZ2V0SGFuZGxlKGZpbGVQYXRoOiBzdHJpbmcsIGZsYWdzOiBudW1iZXIpOiBQcm9taXNlPGZzLnByb21pc2VzLkZpbGVIYW5kbGU+IHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChmaWxlUGF0aCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tTFJVKGVudHJ5KTtcbiAgICAgICAgICAgIGVudHJ5Lmxhc3RVc2UgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5scnUucHVzaChlbnRyeSk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuaGFuZGxlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKGZpbGVQYXRoLCBmbGFncyk7XG4gICAgICAgIGVudHJ5ID0geyBmaWxlUGF0aCwgaGFuZGxlLCBsYXN0VXNlOiBEYXRlLm5vdygpIH07XG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoZmlsZVBhdGgsIGVudHJ5KTtcbiAgICAgICAgdGhpcy5scnUucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfVxuXG4gICAgLy8gT25seSBjYWxsIGluc2lkZSBydW4oKSBmb3IgdGhlIHNhbWUgZmlsZVBhdGhcbiAgICBwdWJsaWMgYXN5bmMgY2xvc2VOb3coZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTFJVKGVudHJ5KTtcbiAgICAgICAgYXdhaXQgZW50cnkuaGFuZGxlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVGcm9tTFJVKGVudHJ5OiBIYW5kbGVFbnRyeSkge1xuICAgICAgICBsZXQgaW5kZXggPSBiaW5hcnlTZWFyY2hCYXNpYyh0aGlzLmxydSwgeCA9PiB4Lmxhc3RVc2UsIGVudHJ5Lmxhc3RVc2UpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgICAgIC8vIE11bHRpcGxlIGVudHJpZXMgY2FuIHNoYXJlIGEgbGFzdFVzZSwgc28gc2NhbiBmb3IgdGhlIGV4YWN0IG9uZVxuICAgICAgICB3aGlsZSAoaW5kZXggPCB0aGlzLmxydS5sZW5ndGggJiYgdGhpcy5scnVbaW5kZXhdLmxhc3RVc2UgPT09IGVudHJ5Lmxhc3RVc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxydVtpbmRleF0gPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5scnUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzd2VlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBIQU5ETEVfSURMRV9USU1FT1VUO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCB0aGlzLmxydS5sZW5ndGggJiYgdGhpcy5scnVbaW5kZXhdLmxhc3RVc2UgPD0gY3V0b2ZmKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmxydVtpbmRleF07XG4gICAgICAgICAgICAvLyBDYW4ndCBjbG9zZSBhIGhhbmRsZSB3aXRoIGEgcGVuZGluZyBvcGVyYXRpb247IGl0J2xsIGJlIHN3ZXB0IGFmdGVyIGl0IGZpbmlzaGVzXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmhhcyhlbnRyeS5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5scnUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoZW50cnkuZmlsZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgZW50cnkuaGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0Rpc2sgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9sZGVyOiBzdHJpbmcpIHsgfVxuXG4gICAgcHJpdmF0ZSBmaWxlc0RpciA9IHBhdGguam9pbih0aGlzLmZvbGRlciwgXCJmaWxlc1wiKTtcbiAgICBwcml2YXRlIHVwbG9hZHNEaXIgPSBwYXRoLmpvaW4odGhpcy5mb2xkZXIsIFwidXBsb2Fkc1wiKTtcbiAgICBwcml2YXRlIGhhbmRsZXMgPSBuZXcgRmlsZUhhbmRsZUNhY2hlKCk7XG4gICAgcHJpdmF0ZSBsYXJnZVVwbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgeyB0bXBQYXRoOiBzdHJpbmcgfT4oKTtcbiAgICBwcml2YXRlIG5leHRMYXJnZVVwbG9hZElkID0gMTtcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRoaXMuZmlsZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLnVwbG9hZHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAvLyBVcGxvYWRzIGRvbid0IHN1cnZpdmUgcmVzdGFydHMgKHRoZSB1cGxvYWRlciBzdHJlYW1zIGludG8gdGhlbSksIHNvIG9sZCBvbmVzIGFyZSBnYXJiYWdlXG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aGlzLnVwbG9hZHNEaXIpKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgZmlsZSkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGRpc2sgJHt0aGlzLmZvbGRlcn1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGVQYXRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCBrZXkpO1xuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydHNXaXRoKHRoaXMuZmlsZXNEaXIgKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkuc2xpY2UoMCwgMjAwKSl9LCBpdCBlc2NhcGVzIHRoZSBzdG9yZSBmb2xkZXJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnPy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgc3RhdE9yVW5kZWZpbmVkKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgbGFzdE1vZGlmaWVkIDwgZXhpc3RpbmcubXRpbWVNcykgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZShmaWxlUGF0aCwgZnMuY29uc3RhbnRzLk9fUkRXUiB8IGZzLmNvbnN0YW50cy5PX0NSRUFUKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50cnVuY2F0ZSgwKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS53cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnV0aW1lcyhuZXcgRGF0ZShsYXN0TW9kaWZpZWQpLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZmlsZVBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihrZXksIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGtleTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCByYW5nZSA9IGNvbmZpZz8ucmFuZ2U7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBoYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGhhbmRsZSA9IGF3YWl0IHRoaXMuaGFuZGxlcy5nZXRIYW5kbGUoZmlsZVBhdGgsIGZzLmNvbnN0YW50cy5PX1JEV1IpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXRzID0gYXdhaXQgaGFuZGxlLnN0YXQoKTtcbiAgICAgICAgICAgIGxldCBzaXplID0gc3RhdHMuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLnN0YXJ0LCBzaXplKSB8fCAwO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLmVuZCwgc2l6ZSkgfHwgc2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBzdGF0cy5tdGltZU1zLCBzaXplIH07XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGxldCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgaGFuZGxlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIGF0ICR7ZmlsZVBhdGh9OiR7c3RhcnR9LCByZWFkICR7Ynl0ZXNSZWFkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogYnVmZmVyLCB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMuaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpbmZvcyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKFwiXCIsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICBsZXQgZmlsZXMgPSBBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKTtcbiAgICAgICAgZmlsZXMgPSBhcHBseUZpbmRJbmZvU2hhcGUoZmlsZXMsIHByZWZpeCwgY29uZmlnKTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gcmVsRGlyIGlzIFwiXCIgb3IgZW5kcyB3aXRoIFwiL1wiLiBPbmx5IGRlc2NlbmRzIGludG8gZGlyZWN0b3JpZXMgdGhhdCBjYW4gc3RpbGwgbWF0Y2ggdGhlIHByZWZpeC5cbiAgICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGaWxlcyhyZWxEaXI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIGluZm9zOiBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCByZWxEaXIpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBsZXQgcmVsUGF0aCA9IHJlbERpciArIGVudHJ5Lm5hbWU7XG4gICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIGxldCBkaXJQYXRoID0gcmVsUGF0aCArIFwiL1wiO1xuICAgICAgICAgICAgICAgIGlmIChkaXJQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBwcmVmaXguc3RhcnRzV2l0aChkaXJQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhkaXJQYXRoLCBwcmVmaXgsIGluZm9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcmVsUGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHN0YXRzID0gYXdhaXQgc3RhdE9yVW5kZWZpbmVkKHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCByZWxQYXRoKSk7XG4gICAgICAgICAgICAvLyBEZWxldGVkIHdoaWxlIHdlIHdlcmUgd2Fsa2luZ1xuICAgICAgICAgICAgaWYgKCFzdGF0cykgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQocmVsUGF0aCwgeyBwYXRoOiByZWxQYXRoLCBjcmVhdGVUaW1lOiBzdGF0cy5tdGltZU1zLCBzaXplOiBzdGF0cy5zaXplIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCB0aGlzLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwZW5kTGFyZ2VVcGxvYWQoaWQsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5maW5pc2hMYXJnZVVwbG9hZChpZCwgY29uZmlnLnBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXJnZSBmaWxlcyBzdHJlYW0gaW50byB0aGVpciBvd24gZmlsZSB1bmRlciB1cGxvYWRzLywgdGhlbiBtb3ZlIGludG8gcGxhY2Ugb24gZmluaXNoLiBObyBoYW5kbGUgaXMgb3BlbmVkIHVudGlsIHRoZSBmaXJzdCBhcHBlbmQgYWN0dWFsbHkgaGFwcGVucy5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnRMYXJnZVVwbG9hZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGlkID0gYCR7RGF0ZS5ub3coKX1fJHt0aGlzLm5leHRMYXJnZVVwbG9hZElkKyt9YDtcbiAgICAgICAgdGhpcy5sYXJnZVVwbG9hZHMuc2V0KGlkLCB7IHRtcFBhdGg6IHBhdGguam9pbih0aGlzLnVwbG9hZHNEaXIsIGB1cGxvYWRfJHtpZH0udG1wYCkgfSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsYXJnZSB1cGxvYWQgJHtpZH1gKTtcbiAgICAgICAgY29uc3QgdG1wUGF0aCA9IHVwbG9hZC50bXBQYXRoO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKHRtcFBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKHRtcFBhdGgsIGZzLmNvbnN0YW50cy5PX1dST05MWSB8IGZzLmNvbnN0YW50cy5PX0NSRUFUIHwgZnMuY29uc3RhbnRzLk9fQVBQRU5EKTtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS53cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgdGhpcy5sYXJnZVVwbG9hZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKHRtcFBhdGgsICgpID0+IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyh0bXBQYXRoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIENsb3NlIGFueSBjYWNoZWQgaGFuZGxlIHRvIHRoZSBmaWxlIHdlJ3JlIHJlcGxhY2luZywgc28gbGF0ZXIgcmVhZHMgcmVvcGVuIHRoZSBuZXcgZmlsZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLmNsb3NlTm93KGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodG1wUGF0aCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHdhcyBldmVyIGFwcGVuZGVkLCBzbyB0aGUgdXBsb2FkIGZpbGUgd2FzIG5ldmVyIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIEJ1ZmZlci5hbGxvYygwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgY2FuY2VsTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdG1wUGF0aCA9IHVwbG9hZC50bXBQYXRoO1xuICAgICAgICB0aGlzLmxhcmdlVXBsb2Fkcy5kZWxldGUoaWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKHRtcFBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyh0bXBQYXRoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHRtcFBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFVSTCBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXNrIGFyY2hpdmVzICgke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBwYXRoICR7cGF0aH0pYCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8ZnMuU3RhdHMgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChlLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuXG4vLyBUaGUgZm9sZGVycy9zaGFsbG93IHBvc3QtcHJvY2Vzc2luZyBzaGFyZWQgYnkgZmluZEluZm8gaW1wbGVtZW50YXRpb25zIHRoYXQgbGlzdCBmbGF0IGZpbGVzICh1c2VkIGJ5IEFyY2hpdmVzRGlzayBvbiB0aGUgcmF3IGRpc2sgd2FsaywgYW5kIGJ5IEJsb2JTdG9yZSBvbiBpdHMgaW5kZXgpLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RmluZEluZm9TaGFwZShmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10sIHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IEFyY2hpdmVGaWxlSW5mb1tdIHtcbiAgICBpZiAoY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICBsZXQgZm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGxldCByZXN0ID0gZmlsZS5wYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IHJlc3RQYXJ0cyA9IHJlc3Quc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgaWYgKHJlc3RQYXJ0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmb2xkZXI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChjb25maWcuc2hhbGxvdykge1xuICAgICAgICAgICAgICAgIGZvbGRlciA9IHByZWZpeCArIHJlc3RQYXJ0c1swXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gZmlsZS5wYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmb2xkZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUucGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5pbmNsdWRlcyhcIi9cIikpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4iXX0=
364
+ /* _JS_SOURCE_HASH = "750b6bff0c433e0bf1cde56447424f14fe01c46482c5eee319f956617ca092d5"; */