sliftutils 1.7.97 → 1.7.98

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 (53) hide show
  1. package/dist/treeSummary.ts.cache +2 -2
  2. package/index.d.ts +18 -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/dist/ArchivesDisk.ts.cache +2 -2
  12. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  13. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  14. package/storage/dist/JSONStorage.ts.cache +2 -2
  15. package/storage/dist/LogMap.ts.cache +2 -2
  16. package/storage/dist/PendingManager.tsx.cache +2 -2
  17. package/storage/dist/TransactionStorage.ts.cache +2 -2
  18. package/storage/dist/archiveHelpers.ts.cache +2 -2
  19. package/storage/dist/backblaze.ts.cache +2 -2
  20. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  21. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  22. package/storage/remoteStorage/blobStore.d.ts +2 -0
  23. package/storage/remoteStorage/blobStore.ts +19 -1
  24. package/storage/remoteStorage/chainStartup.d.ts +1 -0
  25. package/storage/remoteStorage/chainStartup.ts +6 -1
  26. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
  27. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
  28. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
  29. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  30. package/storage/remoteStorage/dist/blobStore.ts.cache +21 -2
  31. package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
  32. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
  33. package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -2
  34. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  35. package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
  36. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
  37. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  38. package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
  39. package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
  40. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
  41. package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
  42. package/storage/remoteStorage/dist/storageClientController.ts.cache +45 -4
  43. package/storage/remoteStorage/dist/storageServerState.ts.cache +15 -4
  44. package/storage/remoteStorage/dist/storeConfig.ts.cache +7 -2
  45. package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
  46. package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
  47. package/storage/remoteStorage/dist/storeSync.ts.cache +2 -2
  48. package/storage/remoteStorage/dist/validation.ts.cache +2 -2
  49. package/storage/remoteStorage/storageClientController.d.ts +14 -0
  50. package/storage/remoteStorage/storageClientController.ts +42 -1
  51. package/storage/remoteStorage/storageServerState.d.ts +1 -1
  52. package/storage/remoteStorage/storageServerState.ts +11 -2
  53. package/storage/remoteStorage/storeConfig.ts +5 -0
@@ -14,6 +14,11 @@ class StoreConfig {
14
14
  /** The routing config changed. Same store either way: its name did not change, so neither did its folder, its index, or the data in it. */
15
15
  /** No entries is a real state, not an error: a store exists as soon as its folder does, and it may never have heard of a configuration (see StorePolicy). */
16
16
  update(entries) {
17
+ // Never go from configured back to UNCONFIGURED: keep the last configuration that worked. There is no point in emptying it - if this store was genuinely removed from the config, nobody will request it again, and the stale entries are not worth cleaning up (they are tiny, named stores are rarely removed, and a service restart clears them eventually). Keeping them is REQUIRED for the out-of-sync cases: a bad config that stops naming us would otherwise leave the store rejecting every write, including the ones that would let the configuration converge - it just won't update until a restart, and a restart can't complete against an out-of-date configuration, which is an infinite loop.
18
+ if (!entries.length && this.entries.length) {
19
+ console.warn(`Ignoring a routing config update that would leave store ${JSON.stringify(this.name)} with NO entries: keeping its current ${this.entries.length} entr${this.entries.length === 1 && "y" || "ies"} ${JSON.stringify(this.entries.map(x => ({ validWindow: x.validWindow, route: x.route })))}`);
20
+ return;
21
+ }
17
22
  let ordered = [...entries];
18
23
  (0, misc_1.sort)(ordered, x => x.validWindow[0]);
19
24
  this.entries = ordered;
@@ -48,5 +53,5 @@ class StoreConfig {
48
53
  exports.StoreConfig = StoreConfig;
49
54
  // A store nobody has configured: always valid, the whole key space, no delays and no limits. Every one of these is the answer that does the least - it holds its own data and nothing else happens to it - which is what makes a store usable before it has ever seen a config.
50
55
  const UNCONFIGURED = { validWindow: IArchives_1.FULL_VALID_WINDOW };
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yZUNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBZ0Q7QUFDaEQsNENBQStEO0FBRS9ELDJZQUEyWTtBQUUzWSxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUM1QixPQUF1QjtRQURQLFNBQUksR0FBSixJQUFJLENBQVE7UUFNaEMsc0tBQXNLO1FBQzlKLFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBSmpDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUtELDJJQUEySTtJQUMzSSw2SkFBNko7SUFDdEosTUFBTSxDQUFDLE9BQXVCO1FBQ2pDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUVNLEdBQUc7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE9BQU87UUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLElBQUksVUFBVTtZQUFFLE9BQU8sVUFBVSxDQUFDO1FBQ2xDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7Q0FDSjtBQTNDRCxrQ0EyQ0M7QUFjRCxnUkFBZ1I7QUFDaFIsTUFBTSxZQUFZLEdBQWdCLEVBQUUsV0FBVyxFQUFFLDZCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgSG9zdGVkQ29uZmlnLCBGVUxMX1ZBTElEX1dJTkRPVyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcblxuLy8gVGhlIGNvbmZpZ3VyYXRpb24gb2YgT05FIHN0b3JlLCBrZXB0IGN1cnJlbnQuIEEgc3RvcmUgaXMgbmFtZWQgYnkgaXRzIGVudHJpZXMgKHNlZSBDb21tb25Db25maWcubmFtZSksIGFuZCBhdCBhbnkgaW5zdGFudCBleGFjdGx5IG9uZSBvZiB0aGVtIGlzIGluIGVmZmVjdCAtIHRoZSBjb25maWcgd3JpdGUgcGF0aCBlbmZvcmNlcyB0aGF0IC0gc28gXCJ0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIHN0b3JlIHJpZ2h0IG5vd1wiIGlzIGEgc2luZ2xlIGVudHJ5LCBhbmQgZXZlcnl0aGluZyB0aGUgc3RvcmUgZG9lcyB3aXRoIHJvdXRlcywgZmxhZ3MgYW5kIGxpbWl0cyByZWFkcyBpdCBmcm9tIGhlcmUgcmF0aGVyIHRoYW4gYmVpbmcgaGFuZGVkIGEgc25hcHNob3QgdGhhdCBnb2VzIHN0YWxlLlxuXG5leHBvcnQgY2xhc3MgU3RvcmVDb25maWcge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSxcbiAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGUoZW50cmllcyk7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgZW50cnkgbmFtaW5nIHRoaXMgc3RvcmUsIG9sZGVzdCB3aW5kb3cgZmlyc3QgLSBwYXN0IG9uZXMgaW5jbHVkZWQsIGJlY2F1c2UgYSBzdGFtcGVkIHdyaXRlIG9yIGEgc2NhbiBjYW4gbGVnaXRpbWF0ZWx5IGNvbmNlcm4gYSB3aW5kb3cgdGhhdCBoYXMgYWxyZWFkeSBlbmRlZFxuICAgIHByaXZhdGUgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcblxuICAgIC8qKiBUaGUgcm91dGluZyBjb25maWcgY2hhbmdlZC4gU2FtZSBzdG9yZSBlaXRoZXIgd2F5OiBpdHMgbmFtZSBkaWQgbm90IGNoYW5nZSwgc28gbmVpdGhlciBkaWQgaXRzIGZvbGRlciwgaXRzIGluZGV4LCBvciB0aGUgZGF0YSBpbiBpdC4gKi9cbiAgICAvKiogTm8gZW50cmllcyBpcyBhIHJlYWwgc3RhdGUsIG5vdCBhbiBlcnJvcjogYSBzdG9yZSBleGlzdHMgYXMgc29vbiBhcyBpdHMgZm9sZGVyIGRvZXMsIGFuZCBpdCBtYXkgbmV2ZXIgaGF2ZSBoZWFyZCBvZiBhIGNvbmZpZ3VyYXRpb24gKHNlZSBTdG9yZVBvbGljeSkuICovXG4gICAgcHVibGljIHVwZGF0ZShlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSk6IHZvaWQge1xuICAgICAgICBsZXQgb3JkZXJlZCA9IFsuLi5lbnRyaWVzXTtcbiAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHgudmFsaWRXaW5kb3dbMF0pO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBvcmRlcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhbGwoKTogSG9zdGVkQ29uZmlnW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlIHJpZ2h0IG5vdzogdGhlIGVudHJ5IHdob3NlIHdpbmRvdyBjb250YWlucyB0aGlzIG1vbWVudDtcbiAgICAgKiBmYWlsaW5nIHRoYXQgdGhlIG5leHQgb25lIGR1ZSB0byBzdGFydDsgZmFpbGluZyB0aGF0IHRoZSBsYXN0IG9uZSB0byBoYXZlIGVuZGVkLlxuICAgICAqXG4gICAgICogVGhlcmUgaXMgYWx3YXlzIGFuIGFuc3dlciwgYW5kIGl0IG1hdHRlcnMgdGhhdCB0aGVyZSBpczogYSBzdG9yZSBiZXR3ZWVuIHdpbmRvd3Mgc3RpbGwgaG9sZHNcbiAgICAgKiBkYXRhIGFuZCBzdGlsbCBoYXMgdG8gYW5zd2VyIGZvciBpdCwgc28gaXQgbmVlZHMgYSByb3V0ZSBhbmQgZmxhZ3MgZXZlbiB3aGVuIG5vdGhpbmcgaXNcbiAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgd3JpdGVzIGF0IGl0LiBXaGljaCBvZiB0aGUgdGhyZWUgY2FzZXMgcHJvZHVjZWQgdGhlIGFuc3dlciBpcyBkZWxpYmVyYXRlbHlcbiAgICAgKiBub3QgZXhwb3NlZCAtIHRoZSB2YWxpZCB3aW5kb3cgaXRzZWxmIGlzIHdoYXQgc2F5cyB3aGV0aGVyIHdyaXRlcyBiZWxvbmcgaGVyZSwgYW5kIGV2ZXJ5IHdyaXRlXG4gICAgICogaXMgY2hlY2tlZCBhZ2FpbnN0IGl0IHNlcGFyYXRlbHkuXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnQoKTogU3RvcmVQb2xpY3kge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNvbnRhaW5pbmcgPSB0aGlzLmVudHJpZXMuZmluZCh4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gbm93ICYmIG5vdyA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgICAgIGxldCB1cGNvbWluZyA9IHRoaXMuZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA+IG5vdyk7XG4gICAgICAgIGlmICh1cGNvbWluZykgcmV0dXJuIHVwY29taW5nO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuZW50cmllc1t0aGlzLmVudHJpZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0KSByZXR1cm4gbGFzdDtcbiAgICAgICAgcmV0dXJuIFVOQ09ORklHVVJFRDtcbiAgICB9XG59XG5cbi8qKiBUaGUgcGFydHMgb2YgYSBjb25maWcgZW50cnkgdGhhdCBkZXNjcmliZSB3aGF0IGEgc3RvcmUgSVMgLSBhcyBvcHBvc2VkIHRvIHdoaWNoIGVudHJ5IHNhaWQgc28uIEtlcHQgc2VwYXJhdGUgYmVjYXVzZSBhIHN0b3JlIHdpdGggbm8gZW50cmllcyBzdGlsbCBoYXMgYWxsIG9mIHRoZW0uICovXG5leHBvcnQgdHlwZSBTdG9yZVBvbGljeSA9IHtcbiAgICB2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgcHVibGljPzogYm9vbGVhbjtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhc3Q/OiBib29sZWFuO1xuICAgIHdyaXRlRGVsYXk/OiBudW1iZXI7XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xufTtcblxuLy8gQSBzdG9yZSBub2JvZHkgaGFzIGNvbmZpZ3VyZWQ6IGFsd2F5cyB2YWxpZCwgdGhlIHdob2xlIGtleSBzcGFjZSwgbm8gZGVsYXlzIGFuZCBubyBsaW1pdHMuIEV2ZXJ5IG9uZSBvZiB0aGVzZSBpcyB0aGUgYW5zd2VyIHRoYXQgZG9lcyB0aGUgbGVhc3QgLSBpdCBob2xkcyBpdHMgb3duIGRhdGEgYW5kIG5vdGhpbmcgZWxzZSBoYXBwZW5zIHRvIGl0IC0gd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHN0b3JlIHVzYWJsZSBiZWZvcmUgaXQgaGFzIGV2ZXIgc2VlbiBhIGNvbmZpZy5cbmNvbnN0IFVOQ09ORklHVVJFRDogU3RvcmVQb2xpY3kgPSB7IHZhbGlkV2luZG93OiBGVUxMX1ZBTElEX1dJTkRPVyB9O1xuIl19
52
- /* _JS_SOURCE_HASH = "685db5d01482183243c0f55d67f2b62ade2a472a3720019a17af08d567f3e98a"; */
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yZUNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBZ0Q7QUFDaEQsNENBQStEO0FBRS9ELDJZQUEyWTtBQUUzWSxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUM1QixPQUF1QjtRQURQLFNBQUksR0FBSixJQUFJLENBQVE7UUFNaEMsc0tBQXNLO1FBQzlKLFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBSmpDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUtELDJJQUEySTtJQUMzSSw2SkFBNko7SUFDdEosTUFBTSxDQUFDLE9BQXVCO1FBQ2pDLGdyQkFBZ3JCO1FBQ2hyQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkRBQTJELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3UyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUVNLEdBQUc7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE9BQU87UUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLElBQUksVUFBVTtZQUFFLE9BQU8sVUFBVSxDQUFDO1FBQ2xDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7Q0FDSjtBQWhERCxrQ0FnREM7QUFjRCxnUkFBZ1I7QUFDaFIsTUFBTSxZQUFZLEdBQWdCLEVBQUUsV0FBVyxFQUFFLDZCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgSG9zdGVkQ29uZmlnLCBGVUxMX1ZBTElEX1dJTkRPVyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcblxuLy8gVGhlIGNvbmZpZ3VyYXRpb24gb2YgT05FIHN0b3JlLCBrZXB0IGN1cnJlbnQuIEEgc3RvcmUgaXMgbmFtZWQgYnkgaXRzIGVudHJpZXMgKHNlZSBDb21tb25Db25maWcubmFtZSksIGFuZCBhdCBhbnkgaW5zdGFudCBleGFjdGx5IG9uZSBvZiB0aGVtIGlzIGluIGVmZmVjdCAtIHRoZSBjb25maWcgd3JpdGUgcGF0aCBlbmZvcmNlcyB0aGF0IC0gc28gXCJ0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIHN0b3JlIHJpZ2h0IG5vd1wiIGlzIGEgc2luZ2xlIGVudHJ5LCBhbmQgZXZlcnl0aGluZyB0aGUgc3RvcmUgZG9lcyB3aXRoIHJvdXRlcywgZmxhZ3MgYW5kIGxpbWl0cyByZWFkcyBpdCBmcm9tIGhlcmUgcmF0aGVyIHRoYW4gYmVpbmcgaGFuZGVkIGEgc25hcHNob3QgdGhhdCBnb2VzIHN0YWxlLlxuXG5leHBvcnQgY2xhc3MgU3RvcmVDb25maWcge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSxcbiAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGUoZW50cmllcyk7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgZW50cnkgbmFtaW5nIHRoaXMgc3RvcmUsIG9sZGVzdCB3aW5kb3cgZmlyc3QgLSBwYXN0IG9uZXMgaW5jbHVkZWQsIGJlY2F1c2UgYSBzdGFtcGVkIHdyaXRlIG9yIGEgc2NhbiBjYW4gbGVnaXRpbWF0ZWx5IGNvbmNlcm4gYSB3aW5kb3cgdGhhdCBoYXMgYWxyZWFkeSBlbmRlZFxuICAgIHByaXZhdGUgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcblxuICAgIC8qKiBUaGUgcm91dGluZyBjb25maWcgY2hhbmdlZC4gU2FtZSBzdG9yZSBlaXRoZXIgd2F5OiBpdHMgbmFtZSBkaWQgbm90IGNoYW5nZSwgc28gbmVpdGhlciBkaWQgaXRzIGZvbGRlciwgaXRzIGluZGV4LCBvciB0aGUgZGF0YSBpbiBpdC4gKi9cbiAgICAvKiogTm8gZW50cmllcyBpcyBhIHJlYWwgc3RhdGUsIG5vdCBhbiBlcnJvcjogYSBzdG9yZSBleGlzdHMgYXMgc29vbiBhcyBpdHMgZm9sZGVyIGRvZXMsIGFuZCBpdCBtYXkgbmV2ZXIgaGF2ZSBoZWFyZCBvZiBhIGNvbmZpZ3VyYXRpb24gKHNlZSBTdG9yZVBvbGljeSkuICovXG4gICAgcHVibGljIHVwZGF0ZShlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSk6IHZvaWQge1xuICAgICAgICAvLyBOZXZlciBnbyBmcm9tIGNvbmZpZ3VyZWQgYmFjayB0byBVTkNPTkZJR1VSRUQ6IGtlZXAgdGhlIGxhc3QgY29uZmlndXJhdGlvbiB0aGF0IHdvcmtlZC4gVGhlcmUgaXMgbm8gcG9pbnQgaW4gZW1wdHlpbmcgaXQgLSBpZiB0aGlzIHN0b3JlIHdhcyBnZW51aW5lbHkgcmVtb3ZlZCBmcm9tIHRoZSBjb25maWcsIG5vYm9keSB3aWxsIHJlcXVlc3QgaXQgYWdhaW4sIGFuZCB0aGUgc3RhbGUgZW50cmllcyBhcmUgbm90IHdvcnRoIGNsZWFuaW5nIHVwICh0aGV5IGFyZSB0aW55LCBuYW1lZCBzdG9yZXMgYXJlIHJhcmVseSByZW1vdmVkLCBhbmQgYSBzZXJ2aWNlIHJlc3RhcnQgY2xlYXJzIHRoZW0gZXZlbnR1YWxseSkuIEtlZXBpbmcgdGhlbSBpcyBSRVFVSVJFRCBmb3IgdGhlIG91dC1vZi1zeW5jIGNhc2VzOiBhIGJhZCBjb25maWcgdGhhdCBzdG9wcyBuYW1pbmcgdXMgd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSBzdG9yZSByZWplY3RpbmcgZXZlcnkgd3JpdGUsIGluY2x1ZGluZyB0aGUgb25lcyB0aGF0IHdvdWxkIGxldCB0aGUgY29uZmlndXJhdGlvbiBjb252ZXJnZSAtIGl0IGp1c3Qgd29uJ3QgdXBkYXRlIHVudGlsIGEgcmVzdGFydCwgYW5kIGEgcmVzdGFydCBjYW4ndCBjb21wbGV0ZSBhZ2FpbnN0IGFuIG91dC1vZi1kYXRlIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGlzIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIGlmICghZW50cmllcy5sZW5ndGggJiYgdGhpcy5lbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBJZ25vcmluZyBhIHJvdXRpbmcgY29uZmlnIHVwZGF0ZSB0aGF0IHdvdWxkIGxlYXZlIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5uYW1lKX0gd2l0aCBOTyBlbnRyaWVzOiBrZWVwaW5nIGl0cyBjdXJyZW50ICR7dGhpcy5lbnRyaWVzLmxlbmd0aH0gZW50ciR7dGhpcy5lbnRyaWVzLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSAke0pTT04uc3RyaW5naWZ5KHRoaXMuZW50cmllcy5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfSkpKX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3JkZXJlZCA9IFsuLi5lbnRyaWVzXTtcbiAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHgudmFsaWRXaW5kb3dbMF0pO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBvcmRlcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhbGwoKTogSG9zdGVkQ29uZmlnW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlIHJpZ2h0IG5vdzogdGhlIGVudHJ5IHdob3NlIHdpbmRvdyBjb250YWlucyB0aGlzIG1vbWVudDtcbiAgICAgKiBmYWlsaW5nIHRoYXQgdGhlIG5leHQgb25lIGR1ZSB0byBzdGFydDsgZmFpbGluZyB0aGF0IHRoZSBsYXN0IG9uZSB0byBoYXZlIGVuZGVkLlxuICAgICAqXG4gICAgICogVGhlcmUgaXMgYWx3YXlzIGFuIGFuc3dlciwgYW5kIGl0IG1hdHRlcnMgdGhhdCB0aGVyZSBpczogYSBzdG9yZSBiZXR3ZWVuIHdpbmRvd3Mgc3RpbGwgaG9sZHNcbiAgICAgKiBkYXRhIGFuZCBzdGlsbCBoYXMgdG8gYW5zd2VyIGZvciBpdCwgc28gaXQgbmVlZHMgYSByb3V0ZSBhbmQgZmxhZ3MgZXZlbiB3aGVuIG5vdGhpbmcgaXNcbiAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgd3JpdGVzIGF0IGl0LiBXaGljaCBvZiB0aGUgdGhyZWUgY2FzZXMgcHJvZHVjZWQgdGhlIGFuc3dlciBpcyBkZWxpYmVyYXRlbHlcbiAgICAgKiBub3QgZXhwb3NlZCAtIHRoZSB2YWxpZCB3aW5kb3cgaXRzZWxmIGlzIHdoYXQgc2F5cyB3aGV0aGVyIHdyaXRlcyBiZWxvbmcgaGVyZSwgYW5kIGV2ZXJ5IHdyaXRlXG4gICAgICogaXMgY2hlY2tlZCBhZ2FpbnN0IGl0IHNlcGFyYXRlbHkuXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnQoKTogU3RvcmVQb2xpY3kge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNvbnRhaW5pbmcgPSB0aGlzLmVudHJpZXMuZmluZCh4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gbm93ICYmIG5vdyA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgICAgIGxldCB1cGNvbWluZyA9IHRoaXMuZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA+IG5vdyk7XG4gICAgICAgIGlmICh1cGNvbWluZykgcmV0dXJuIHVwY29taW5nO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuZW50cmllc1t0aGlzLmVudHJpZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0KSByZXR1cm4gbGFzdDtcbiAgICAgICAgcmV0dXJuIFVOQ09ORklHVVJFRDtcbiAgICB9XG59XG5cbi8qKiBUaGUgcGFydHMgb2YgYSBjb25maWcgZW50cnkgdGhhdCBkZXNjcmliZSB3aGF0IGEgc3RvcmUgSVMgLSBhcyBvcHBvc2VkIHRvIHdoaWNoIGVudHJ5IHNhaWQgc28uIEtlcHQgc2VwYXJhdGUgYmVjYXVzZSBhIHN0b3JlIHdpdGggbm8gZW50cmllcyBzdGlsbCBoYXMgYWxsIG9mIHRoZW0uICovXG5leHBvcnQgdHlwZSBTdG9yZVBvbGljeSA9IHtcbiAgICB2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgcHVibGljPzogYm9vbGVhbjtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhc3Q/OiBib29sZWFuO1xuICAgIHdyaXRlRGVsYXk/OiBudW1iZXI7XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xufTtcblxuLy8gQSBzdG9yZSBub2JvZHkgaGFzIGNvbmZpZ3VyZWQ6IGFsd2F5cyB2YWxpZCwgdGhlIHdob2xlIGtleSBzcGFjZSwgbm8gZGVsYXlzIGFuZCBubyBsaW1pdHMuIEV2ZXJ5IG9uZSBvZiB0aGVzZSBpcyB0aGUgYW5zd2VyIHRoYXQgZG9lcyB0aGUgbGVhc3QgLSBpdCBob2xkcyBpdHMgb3duIGRhdGEgYW5kIG5vdGhpbmcgZWxzZSBoYXBwZW5zIHRvIGl0IC0gd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHN0b3JlIHVzYWJsZSBiZWZvcmUgaXQgaGFzIGV2ZXIgc2VlbiBhIGNvbmZpZy5cbmNvbnN0IFVOQ09ORklHVVJFRDogU3RvcmVQb2xpY3kgPSB7IHZhbGlkV2luZG93OiBGVUxMX1ZBTElEX1dJTkRPVyB9O1xuIl19
57
+ /* _JS_SOURCE_HASH = "b7b2f29d5b992b4aa2fb3890c73960bc15bae51aac380537934083b376729446"; */
@@ -1,4 +1,4 @@
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";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.previousWindowOwners = exports.selectEntryAt = exports.findSelfIndexes = exports.isSelfSource = void 0;
4
4
  const IArchives_1 = require("../IArchives");
@@ -132,4 +132,4 @@ function previousWindowOwners(config, windowStart, selfIndexes) {
132
132
  }
133
133
  exports.previousWindowOwners = previousWindowOwners;
134
134
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVQbGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDRDQUFvRjtBQUNwRixpREFBa0Y7QUFDbEYsaURBQThDO0FBRTlDLG9SQUFvUjtBQUVwUix3SUFBd0k7QUFDeEksU0FBZ0IsWUFBWSxDQUFDLE1BQW9CLEVBQUUsT0FBZSxFQUFFLFVBQWtCO0lBQ2xGLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0MsSUFBSSxNQUFNLEdBQUcsSUFBQSw2QkFBYyxFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2pGLE9BQU8sSUFBQSwyQkFBWSxFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFMRCxvQ0FLQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxPQUFxQixFQUFFLE9BQWUsRUFBRSxVQUFrQjtJQUN0RixJQUFJLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQ3pDLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7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O2dCQUFFLFNBQVM7WUFDekUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksc0JBQVUsQ0FBQyxDQUFDO1lBQ2pGLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLFNBQVM7WUFDYixDQUFDO1lBQ0QsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDO1FBQy9JLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUEzQ0Qsb0RBMkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBIb3N0ZWRDb25maWcsIFNvdXJjZUNvbmZpZywgRlVMTF9ST1VURSB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IHBhcnNlSG9zdGVkVXJsLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgaXNPd25BZGRyZXNzIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5cbi8vIFB1cmUgaGVscGVycyBvdmVyIGEgYnVja2V0J3Mgcm91dGluZyBjb25maWc6IHdoaWNoIGVudHJpZXMgYXJlIHRoaXMgc2VydmVyLCB3aGljaCBlbnRyeSBhcHBsaWVzIGF0IGEgbW9tZW50LCBhbmQgd2hvIG93bmVkIHdoYXQgYmVmb3JlIGEgd2luZG93IGJvdW5kYXJ5LiBDb25maWcgaW4sIGFuc3dlciBvdXQgLSBub3RoaW5nIGhlcmUgcmVhZHMgYSBzdG9yZSwgYSBjbG9jaywgb3IgdGhlIG5ldHdvcmsgKGV4Y2VwdCBzZWxlY3RFbnRyeUF0IGJlaW5nIGhhbmRlZCBhIHRpbWUpLlxuXG4vKiogV2hldGhlciBhIGNvbmZpZyBlbnRyeSBpcyBUSElTIHNlcnZlcidzIGNvcHkgb2YgdGhpcyBidWNrZXQgLSB0aGUgc2FtZSBhY2NvdW50IGFuZCBidWNrZXQsIGF0IGFuIGFkZHJlc3MgdGhpcyBwcm9jZXNzIGFuc3dlcnMgb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZWxmU291cmNlKHNvdXJjZTogU291cmNlQ29uZmlnLCBhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICBpZiAocGFyc2VkLmFjY291bnQgIT09IGFjY291bnQgfHwgcGFyc2VkLmJ1Y2tldE5hbWUgIT09IGJ1Y2tldE5hbWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaXNPd25BZGRyZXNzKHBhcnNlZC5hZGRyZXNzLCBwYXJzZWQucG9ydCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZkluZGV4ZXMocm91dGluZzogUmVtb3RlQ29uZmlnLCBhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc291cmNlID0gcm91dGluZy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgIGlmIChpc1NlbGZTb3VyY2Uoc291cmNlLCBhY2NvdW50LCBidWNrZXROYW1lKSkge1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RW50cnlBdChlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSwgdGltZTogbnVtYmVyLCByb3V0ZT86IG51bWJlcik6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJvdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGNvdmVyaW5nID0gZW50cmllcy5maWx0ZXIoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmIChjb3ZlcmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBjb3ZlcmluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29udGFpbmluZyA9IGVudHJpZXMuZmluZCh4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gdGltZSAmJiB0aW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgaWYgKGNvbnRhaW5pbmcpIHJldHVybiBjb250YWluaW5nO1xuICAgIGxldCBiZXN0OiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgbGV0IGRpc3RhbmNlID0gTWF0aC5taW4oTWF0aC5hYnModGltZSAtIGVudHJ5LnZhbGlkV2luZG93WzBdKSwgTWF0aC5hYnModGltZSAtIGVudHJ5LnZhbGlkV2luZG93WzFdKSk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICBiZXN0ID0gZW50cnk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5cbi8qKiBUaGUgcGFydHMgb2YgYHJhbmdlc2AgdGhhdCBgY3V0YCBkb2VzIG5vdCBjb3ZlciwgcGx1cyB0aGUgc2luZ2xlIHJhbmdlIHNwYW5uaW5nIHdoYXQgaXQgZGlkLiBSb3V0ZXMgYXJlIGhhbGYtb3BlbiBbc3RhcnQsIGVuZCksIHNvIHN1YnRyYWN0aW5nIG9uZSBmcm9tIGFub3RoZXIgbGVhdmVzIGF0IG1vc3QgYSBwaWVjZSBvbiBlYWNoIHNpZGUuICovXG5mdW5jdGlvbiBzdWJ0cmFjdFJvdXRlKHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdLCBjdXQ6IFtudW1iZXIsIG51bWJlcl0pOiB7IHJlbWFpbmluZzogW251bWJlciwgbnVtYmVyXVtdOyBjbGFpbWVkPzogW251bWJlciwgbnVtYmVyXSB9IHtcbiAgICBsZXQgcmVtYWluaW5nOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgY2xhaW1lZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgICAgbGV0IG92ZXJsYXAgPSByb3V0ZUludGVyc2VjdGlvbihyYW5nZSwgY3V0KTtcbiAgICAgICAgaWYgKCFvdmVybGFwKSB7XG4gICAgICAgICAgICByZW1haW5pbmcucHVzaChyYW5nZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjbGFpbWVkID0gY2xhaW1lZCAmJiBbTWF0aC5taW4oY2xhaW1lZFswXSwgb3ZlcmxhcFswXSksIE1hdGgubWF4KGNsYWltZWRbMV0sIG92ZXJsYXBbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IG92ZXJsYXA7XG4gICAgICAgIGlmIChyYW5nZVswXSA8IG92ZXJsYXBbMF0pIHJlbWFpbmluZy5wdXNoKFtyYW5nZVswXSwgb3ZlcmxhcFswXV0pO1xuICAgICAgICBpZiAob3ZlcmxhcFsxXSA8IHJhbmdlWzFdKSByZW1haW5pbmcucHVzaChbb3ZlcmxhcFsxXSwgcmFuZ2VbMV1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVtYWluaW5nLCBjbGFpbWVkIH07XG59XG5cbi8qKiBXaGF0IG9uZSBvZiBvdXIgc3RvcmVzIGhhcyB0byBwdWxsIGluIGF0IGEgdmFsaWQtd2luZG93IGJvdW5kYXJ5LCBzbyB0aGUgd3JpdGVzIHRoYXQgbGFuZGVkIGp1c3QgYmVmb3JlIHRoZSBoYW5kb3ZlciBhcmUgbm90IG1pc3NlZC4gKi9cbmV4cG9ydCB0eXBlIEJvdW5kYXJ5SGFuZG92ZXIgPSB7XG4gICAgLy8gVGhlIHN0b3JlIHRoYXQgbmVlZHMgdGhlIGRhdGE6IHRoZSBuYW1lIG9mIHRoZSBzZWxmIGVudHJ5IHRha2luZyBvdmVyIGF0IHRoZSBib3VuZGFyeVxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvLyBUaGUgcm91dGUgaXQgaXMgdGFraW5nIG92ZXIsIHdoaWNoIGlzIHRoZSBzbGljZSBvZiB0aGUga2V5IHNwYWNlIHRoZSBwdWxscyBiZWxvdyBhcmUgbGltaXRlZCB0b1xuICAgIHJvdXRlOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIC8vIFdlIGhlbGQgcGFydCBvZiB0aGlzIHJvdXRlIGluIHRoZSBwcmV2aW91cyB3aW5kb3cgdG9vLCBzbyB0aG9zZSB3cml0ZXMgYXJlIGFscmVhZHkgaW4gb3VyIG93biBmb2xkZXIgYW5kIGEgZGlzayByZXNjYW4gZmluZHMgdGhlbVxuICAgIHNjYW5Pd25EaXNrOiBib29sZWFuO1xuICAgIC8vIFBlciBzb3VyY2UgaW5kZXggaW4gdGhlIGNvbmZpZywgdGhlIHNsaWNlIG9mIG91ciByb3V0ZSBUSEFUIHNvdXJjZSBoZWxkIGluIHRoZSBwcmV2aW91cyB3aW5kb3cgLSBhIGJvdW5kYXJ5IHNjYW4gcHVsbHMgaXRzIHJlY2VudCBjaGFuZ2VzXG4gICAgcmVtb3RlczogTWFwPG51bWJlciwgW251bWJlciwgbnVtYmVyXT47XG59O1xuXG4vKipcbiAqIFdobyBoZWxkIGVhY2ggc2xpY2Ugb2Ygb3VyIHJvdXRlIGluIHRoZSB3aW5kb3cgYmVmb3JlIHdpbmRvd1N0YXJ0LCBmb3IgZXZlcnkgc2VsZiBlbnRyeSB3aG9zZVxuICogd2luZG93IHN0YXJ0cyBleGFjdGx5IHRoZW4uIFRoaXMgaXMgdGhlIHdob2xlIG9mIFwid2hvIGRvIHdlIHRha2Ugb3ZlciBmcm9tXCI6IGEgc3RvcmUgdGFraW5nIG92ZXIgYVxuICogcm91dGUgbWF5IGJlIHRha2luZyBpdCBmcm9tIHNldmVyYWwgcHJldmlvdXMgb3duZXJzIGF0IG9uY2UgKHRoZWlyIHNoYXJkcyBuZWVkIG5vdCBsaW5lIHVwIHdpdGhcbiAqIG91cnMpLCBhbmQgZnJvbSBpdHNlbGYgZm9yIHRoZSBwYXJ0cyBpdCBhbHJlYWR5IGhlbGQuXG4gKlxuICogQSBzZWxmIGVudHJ5IGlzIHNraXBwZWQgd2hlbiBhbiBFQVJMSUVSIGVudHJ5IHZhbGlkIGF0IHRoZSBib3VuZGFyeSBhbHJlYWR5IGNvdmVycyBpdHMgd2hvbGUgcm91dGU6XG4gKiBjb25maWcgb3JkZXIgaXMgcHJpb3JpdHksIHNvIHRoYXQgZW50cnkgaXMgdGhlIHdyaXRlIHRhcmdldCBhbmQgd2UgYXJlIG5vdCB0aGUgb25lIHRha2luZyBvdmVyLlxuICogT3duZXJzIGFyZSB0aGVuIHJlc29sdmVkIGluIGNvbmZpZyBvcmRlciB0b28sIGVhY2ggY2xhaW1pbmcgdGhlIHBhcnQgb2Ygb3VyIHJvdXRlIHN0aWxsIHVuY2xhaW1lZCAtXG4gKiB0aGUgc2FtZSBmaXJzdC1tYXRjaC13aW5zIHJ1bGUgdGhhdCBwaWNrcyBhIHdyaXRlIHRhcmdldCBhdCBhbnkgb3RoZXIgbW9tZW50LlxuICpcbiAqIFB1cmU6IGNvbmZpZyBpbiwgcGxhbiBvdXQuIE5vdGhpbmcgaGVyZSByZWFkcyBhIHN0b3JlLCBhIGNsb2NrLCBvciB0aGUgbmV0d29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZpb3VzV2luZG93T3duZXJzKGNvbmZpZzogUmVtb3RlQ29uZmlnLCB3aW5kb3dTdGFydDogbnVtYmVyLCBzZWxmSW5kZXhlczogbnVtYmVyW10pOiBCb3VuZGFyeUhhbmRvdmVyW10ge1xuICAgIGxldCBzZWxmSW5kZXhTZXQgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICBsZXQgcHJldmlvdXNUaW1lID0gd2luZG93U3RhcnQgLSAxO1xuICAgIGxldCB2YWxpZEF0ID0gKHNvdXJjZTogU291cmNlQ29uZmlnLCB0aW1lOiBudW1iZXIpID0+IHNvdXJjZS52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCBzb3VyY2UudmFsaWRXaW5kb3dbMV07XG4gICAgbGV0IGJ5Um91dGUgPSBuZXcgTWFwPHN0cmluZywgQm91bmRhcnlIYW5kb3Zlcj4oKTtcbiAgICBmb3IgKGxldCBzZWxmSW5kZXggb2Ygc2VsZkluZGV4ZXMpIHtcbiAgICAgICAgbGV0IHNlbGYgPSBjb25maWcuc291cmNlc1tzZWxmSW5kZXhdO1xuICAgICAgICBpZiAodHlwZW9mIHNlbGYgPT09IFwic3RyaW5nXCIgfHwgc2VsZi52YWxpZFdpbmRvd1swXSAhPT0gd2luZG93U3RhcnQpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc2VsZlJvdXRlID0gc2VsZi5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICBsZXQgc2hhZG93ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxmSW5kZXg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG90aGVyID0gY29uZmlnLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiIHx8ICF2YWxpZEF0KG90aGVyLCB3aW5kb3dTdGFydCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgIGlmIChyb3V0ZVswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJvdXRlWzFdKSB7XG4gICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFkb3dlZCkgY29udGludWU7XG4gICAgICAgIC8vIEtleWVkIGJ5IGJvdGg6IG9uZSBuYW1lIGNhbiB0YWtlIG92ZXIgc2V2ZXJhbCByb3V0ZXMgYXQgdGhlIHNhbWUgYm91bmRhcnksIGFuZCBlYWNoIGlzIHB1bGxlZCBzZXBhcmF0ZWx5XG4gICAgICAgIGxldCBoYW5kb3ZlcktleSA9IGAke3NlbGYubmFtZX18JHtKU09OLnN0cmluZ2lmeShzZWxmUm91dGUpfWA7XG4gICAgICAgIGxldCBoYW5kb3ZlciA9IGJ5Um91dGUuZ2V0KGhhbmRvdmVyS2V5KTtcbiAgICAgICAgaWYgKCFoYW5kb3Zlcikge1xuICAgICAgICAgICAgaGFuZG92ZXIgPSB7IG5hbWU6IHNlbGYubmFtZSwgcm91dGU6IHNlbGZSb3V0ZSwgc2Nhbk93bkRpc2s6IGZhbHNlLCByZW1vdGVzOiBuZXcgTWFwKCkgfTtcbiAgICAgICAgICAgIGJ5Um91dGUuc2V0KGhhbmRvdmVyS2V5LCBoYW5kb3Zlcik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuY2xhaW1lZDogW251bWJlciwgbnVtYmVyXVtdID0gW1tzZWxmUm91dGVbMF0sIHNlbGZSb3V0ZVsxXV1dO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmZpZy5zb3VyY2VzLmxlbmd0aCAmJiB1bmNsYWltZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvdGhlciA9IGNvbmZpZy5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIiB8fCAhdmFsaWRBdChvdGhlciwgcHJldmlvdXNUaW1lKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgeyByZW1haW5pbmcsIGNsYWltZWQgfSA9IHN1YnRyYWN0Um91dGUodW5jbGFpbWVkLCBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFKTtcbiAgICAgICAgICAgIHVuY2xhaW1lZCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc2VsZkluZGV4U2V0LmhhcyhpKSkge1xuICAgICAgICAgICAgICAgIGhhbmRvdmVyLnNjYW5Pd25EaXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGhhbmRvdmVyLnJlbW90ZXMuZ2V0KGkpO1xuICAgICAgICAgICAgaGFuZG92ZXIucmVtb3Rlcy5zZXQoaSwgZXhpc3RpbmcgJiYgW01hdGgubWluKGV4aXN0aW5nWzBdLCBjbGFpbWVkWzBdKSwgTWF0aC5tYXgoZXhpc3RpbmdbMV0sIGNsYWltZWRbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGNsYWltZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbLi4uYnlSb3V0ZS52YWx1ZXMoKV0uZmlsdGVyKHggPT4geC5zY2FuT3duRGlzayB8fCB4LnJlbW90ZXMuc2l6ZSk7XG59XG5cbiJdfQ==
135
- /* _JS_SOURCE_HASH = "96ddd2a7f79a975a2071de49b7902c4508a2cdb41bdc0b80cc2460f428c91d0f"; */
135
+ /* _JS_SOURCE_HASH = "13281f47f964117e77880e640758502933893081f631d576b59362f111f165cd"; */
@@ -1,4 +1,4 @@
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";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.applySourceConfig = exports.createStoreSource = exports.createApiArchives = void 0;
4
4
  const ArchivesDisk_1 = require("../ArchivesDisk");
@@ -48,4 +48,4 @@ function applySourceConfig(source, sourceConfig, writeDelay) {
48
48
  }
49
49
  exports.applySourceConfig = applySourceConfig;
50
50
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTb3VyY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTb3VyY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGtEQUErQztBQUMvQyw0Q0FBaUQ7QUFDakQscURBQWtEO0FBQ2xELGlEQUFtRDtBQUNuRCx1REFBOEU7QUFFOUUsOGdCQUE4Z0I7QUFFOWdCLGlHQUFpRztBQUNqRyxTQUFnQixpQkFBaUIsQ0FBQyxNQUFvQjtJQUNsRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLDZCQUFpQixDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUEsZ0NBQWlCLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDdEwsQ0FBQztJQUNELHlQQUF5UDtJQUN6UCxPQUFPLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQU5ELDhDQU1DO0FBRUQsOFVBQThVO0FBQzlVLFNBQWdCLGlCQUFpQixDQUFDLE1BQTRFO0lBQzFHLElBQUksTUFBaUIsQ0FBQztJQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxJQUFJLDJCQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLElBQUksaUNBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBWEQsOENBV0M7QUFLRCx1YkFBdWI7QUFDdmIsU0FBZ0IsaUJBQWlCLENBQUMsTUFBaUIsRUFBRSxZQUFzQyxFQUFFLFVBQW1COztJQUM1RyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQixNQUFBLElBQUEsMkJBQVMsRUFBQyxNQUFNLENBQUMsMENBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPO0lBQzFCLDhFQUE4RTtJQUM5RSxJQUFJLFlBQVksR0FBRyxJQUFBLCtCQUFhLEVBQUMsTUFBTSxDQUFnQyxDQUFDO0lBQ3hFLElBQUksT0FBTyxZQUFZLENBQUMsa0JBQWtCLEtBQUssVUFBVTtRQUFFLE9BQU87SUFDbEUsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFWRCw4Q0FVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElBcmNoaXZlcywgU291cmNlQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrIH0gZnJvbSBcIi4uL0FyY2hpdmVzRGlza1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNCYWNrYmxhemUgfSBmcm9tIFwiLi4vYmFja2JsYXplXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBwYXJzZUJhY2tibGF6ZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEZWxheWVkLCBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcblxuLy8gT05FIHNvdXJjZSwgdGFsa2VkIHRvIGRpcmVjdGx5IC0gdGhlIGNvdW50ZXJwYXJ0IG9mIGNyZWF0ZUFyY2hpdmVzLCB3aGljaCByZXNvbHZlcyBhIHdob2xlIHJvdXRpbmcgY29uZmlnIGludG8gYSBjaGFpbiB0aGF0IGZhbGxzIGJhY2sgYW5kIHJlLXJlc29sdmVzIGFjcm9zcyBtYW55IHNvdXJjZXMuIE5vdGhpbmcgaGVyZSBwaWNrcyBhIHNvdXJjZSBvciByZXRyaWVzIGFnYWluc3QgYW5vdGhlciBvbmU6IHRoZSBjYWxsZXIgKGEgY2hhaW4sIG9yIGEgc3RvcmUncyBzeW5jaHJvbml6YXRpb24pIGFscmVhZHkgZGVjaWRlZCB3aGljaCBlbmRwb2ludCBpdCB3YW50cywgYW5kIGdldHMgYSBjbGllbnQgYm91bmQgdG8gZXhhY3RseSB0aGF0IGVuZHBvaW50LiBTb3VyY2UgaWRlbnRpdHkgYW5kIGNvbmZpZyB1cGRhdGVzIGxpdmUgaGVyZSB0b28sIGJlY2F1c2UgdGhleSBhcmUgdGhlIHNhbWUgcXVlc3Rpb24gLSB3aGljaCBlbmRwb2ludCBpcyB0aGlzLCBhbmQgd2hhdCBwb2xpY3kgYXJlIHdlIGFwcGx5aW5nIHRvIGl0LlxuXG4vKiogVGhlIGNsaWVudCBmb3Igb25lIGNvbmZpZ3VyZWQgc291cmNlOiBiYWNrYmxhemUsIG9yIGEgc3RvcmFnZSBzZXJ2ZXIgLSBpbmNsdWRpbmcgdGhpcyBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlOiBTb3VyY2VDb25maWcpOiBJQXJjaGl2ZXMge1xuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJiYWNrYmxhemVcIikge1xuICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHsgYnVja2V0TmFtZTogcGFyc2VCYWNrYmxhemVVcmwoc291cmNlLnVybCkuYnVja2V0TmFtZSwgcHVibGljOiBzb3VyY2UucHVibGljLCBpbW11dGFibGU6IHNvdXJjZS5pbW11dGFibGUsIGFsbG93ZWRPcmlnaW5zOiBzb3VyY2UuYWxsb3dlZE9yaWdpbnMgfSk7XG4gICAgfVxuICAgIC8vIEluY2x1ZGluZyB3aGVuIHRoYXQgc2VydmVyIGlzIHVzOiBhIGNhbGwgdG8gb3Vyc2VsdmVzIGlzIGEgV2ViU29ja2V0IHRvIG91ciBvd24gcG9ydCwgd2hpY2ggYXV0aGVudGljYXRlcyBhcyB0aGlzIG1hY2hpbmUgKHNvIGl0IGlzIGFsd2F5cyBhbGxvd2VkKSBhbmQgY29zdHMgYSByb3VuZCB0cmlwIG9uIGxvb3BiYWNrLiBOb3Qgd29ydGggYSBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgZXZlcnkgb3BlcmF0aW9uIHRvIGF2b2lkLlxuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IHNvdXJjZS51cmwsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlLCBzb3VyY2VDb25maWc6IHNvdXJjZSB9KTtcbn1cblxuLyoqIFRoZSBPTkUgcGxhY2UgYSBzdG9yZSdzIHNvdXJjZSBpcyBidWlsdC4gRXZlcnkgc291cmNlIGEgc3RvcmUgc3luY2hyb25pemVzIHdpdGggaXMgb25lIG9mIGV4YWN0bHkgdHdvIHRoaW5nczogYSBjb25maWd1cmVkIHBlZXIsIG9yIHRoZSBzdG9yZSdzIG93biBkaXNrIGZvbGRlciAobm8gc291cmNlQ29uZmlnKS4gd3JpdGVEZWxheSB3cmFwcyBpdCBzbyBpdHMgd3JpdGVzIGFyZSBidWZmZXJlZCBpbiBtZW1vcnkgZm9yIHRoYXQgbG9uZyAoc2VlIEFyY2hpdmVzRGVsYXllZCkgLSB0aGUgd2hvbGUgb2YgXCJmYXN0IHdyaXRlc1wiLCBwZXIgc291cmNlLCBkZWNpZGVkIGhlcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RvcmVTb3VyY2UoY29uZmlnOiB7IHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZzsgZm9sZGVyOiBzdHJpbmc7IHdyaXRlRGVsYXk/OiBudW1iZXIgfSk6IElBcmNoaXZlcyB7XG4gICAgbGV0IHNvdXJjZTogSUFyY2hpdmVzO1xuICAgIGlmICghY29uZmlnLnNvdXJjZUNvbmZpZykge1xuICAgICAgICBzb3VyY2UgPSBuZXcgQXJjaGl2ZXNEaXNrKGNvbmZpZy5mb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZSA9IGNyZWF0ZUFwaUFyY2hpdmVzKGNvbmZpZy5zb3VyY2VDb25maWcpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLndyaXRlRGVsYXkpIHtcbiAgICAgICAgc291cmNlID0gbmV3IEFyY2hpdmVzRGVsYXllZChzb3VyY2UsIGNvbmZpZy53cml0ZURlbGF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqIEEgc291cmNlIHRoYXQgaG9sZHMgaXRzIG93biBTb3VyY2VDb25maWcgKHRvIHNlbmQgd2l0aCBldmVyeSByZXF1ZXN0LCBvciB0byByZWFkIHBvbGljeSBmbGFncyBvZmYpLiBEdWNrLXR5cGVkIHJhdGhlciB0aGFuIGEgYmFzZSBjbGFzczogdGhlIHRocmVlIGltcGxlbWVudGF0aW9ucyBoYXZlIG5vdGhpbmcgZWxzZSBpbiBjb21tb24sIGFuZCBhIHNvdXJjZSB0aGF0IGlnbm9yZXMgaXRzIGNvbmZpZyBzaW1wbHkgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QuICovXG50eXBlIENvbmZpZ3VyYWJsZVNvdXJjZSA9IHsgdXBkYXRlU291cmNlQ29uZmlnKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnKTogdm9pZCB9O1xuXG4vKiogQXBwbGllcyBhIGNoYW5nZWQgY29uZmlnIHRvIGFuIEFMUkVBRFkgUlVOTklORyBzb3VyY2UgKHNhbWUgZW5kcG9pbnQsIHNlZSBzb3VyY2VJZGVudGl0eSAtIG9ubHkgcG9saWN5IG1vdmVkKS4gU291cmNlcyB0aGF0IGNhcnJ5IHRoZWlyIGNvbmZpZyBpbnRvIGV2ZXJ5IHJlcXVlc3QgTVVTVCBiZSB1cGRhdGVkIGluIHBsYWNlLCBvciB0aGV5IGtlZXAgc2VuZGluZyB0aGUgb2xkIG9uZTogdGhlIHNlcnZlciBtYXRjaGVzIHRoZSBjb25maWcgaXQgaXMgaGFuZGVkIGFnYWluc3QgaXRzIG93biBlbnRyaWVzLCBzbyBhIHNvdXJjZSBsZWZ0IGhvbGRpbmcgYSBzdGFsZSBjb25maWcgZXZlbnR1YWxseSBzdG9wcyByZXNvbHZpbmcgdG8gYSBzdG9yZSBhdCBhbGwuIFRoZSB3cml0ZSBkZWxheSBpcyBwb2xpY3kgdG9vLCBzbyBpdCBtb3ZlcyBoZXJlIGFzIHdlbGwuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTb3VyY2VDb25maWcoc291cmNlOiBJQXJjaGl2ZXMsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB3cml0ZURlbGF5PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHdyaXRlRGVsYXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uc2V0RGVsYXkod3JpdGVEZWxheSk7XG4gICAgfVxuICAgIC8vIFRoZSBzdG9yZSdzIG93biBkaXNrIGhhcyBubyBjb25maWcgdG8gYXBwbHkgLSBvbmx5IGEgZGVsYXlcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykgcmV0dXJuO1xuICAgIC8vIFRoZSBjb25maWcgYmVsb25ncyB0byB0aGUgc291cmNlIGl0c2VsZiwgbm90IHRvIHRoZSBkZWxheSB3cmFwcGVkIGFyb3VuZCBpdFxuICAgIGxldCBjb25maWd1cmFibGUgPSB1bndyYXBEZWxheWVkKHNvdXJjZSkgYXMgUGFydGlhbDxDb25maWd1cmFibGVTb3VyY2U+O1xuICAgIGlmICh0eXBlb2YgY29uZmlndXJhYmxlLnVwZGF0ZVNvdXJjZUNvbmZpZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgY29uZmlndXJhYmxlLnVwZGF0ZVNvdXJjZUNvbmZpZyhzb3VyY2VDb25maWcpO1xufVxuIl19
51
- /* _JS_SOURCE_HASH = "86c01f59285478344041ca4e69032444fd0e824d6f33263ce616feefcdb4d3e6"; */
51
+ /* _JS_SOURCE_HASH = "d1518847ce26e2daa489a3b4e30465cd9bfe8e12506437f087d5fe0e81d5755d"; */
@@ -1,4 +1,4 @@
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";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.StoreSync = void 0;
4
4
  const batching_1 = require("socket-function/src/batching");
@@ -648,4 +648,4 @@ class StoreSync {
648
648
  }
649
649
  exports.StoreSync = StoreSync;
650
650
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUFzRTtBQUN0RSxtREFBMEU7QUFDMUUsa0VBQWlGO0FBQ2pGLDRDQUdzQjtBQUN0QixzREFBb0Q7QUFDcEQsNENBQWlEO0FBQ2pELGlEQUEyRztBQUczRyxrYkFBa2I7QUFFbGIseUVBQXlFO0FBQ3pFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxtTUFBbU07QUFDbk0sTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQyxrUUFBa1E7QUFDbFEsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QyxNQUFNLDhCQUE4QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxRCxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxvTEFBb0w7QUFDcEwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsbUZBQW1GO0FBQ25GLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM3QyxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDNUMsd0lBQXdJO0FBQ3hJLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLDhLQUE4SztBQUM5SyxNQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FB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QUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFBRSxTQUFTO2dCQUM5QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLElBQUEsK0JBQW1CLEVBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztvQkFBRSxTQUFTO2dCQUM3RCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksNkJBQWlCLENBQUM7b0JBQUUsU0FBUztnQkFDckQsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztvQkFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdHLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUE3aUJELDhCQTZpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwsIGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSwgc29ydCwgcHJvbWlzZU9iaiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1N5bmNTdGF0dXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VSb3V0aW5nRGF0YSwgZ2V0Q29uZmlnVmVyc2lvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBCbG9iU3RvcmUsIEluZGV4RW50cnkgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcblxuLy8gRXZlcnl0aGluZyB0aGF0IGtlZXBzIGEgc3RvcmUncyBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCBpdHMgc291cmNlcywgcGx1cyB0aGUgdHdvIG1haW50ZW5hbmNlIGxvb3BzIHRoYXQgZm9sbG93IGZyb20gaG9sZGluZyBhbiBpbmRleCAoZXZpY3RpbmcgYSBib3VuZGVkIGRpc2sgY2FjaGUsIGV4cGlyaW5nIHRvbWJzdG9uZXMpLiBUaGUgc3RvcmUgb3ducyB0aGUgc291cmNlcyBhbmQgZGVjaWRlcyB3aGVyZSB3cml0ZXMgZ287IHRoaXMgZGVjaWRlcyB3aGF0IGlzIHNjYW5uZWQsIHB1bGxlZCwgcHVzaGVkLCBldmljdGVkLCBhbmQgZm9yZ290dGVuIC0gc28gdGhlIHdyaXRlIHBhdGggc3RheXMgcmVhZGFibGUgd2l0aG91dCB0aGUgc2V2ZXJhbCBodW5kcmVkIGxpbmVzIG9mIHN5bmNocm9uaXphdGlvbiBtYWNoaW5lcnkgaW50ZXJsZWF2ZWQgaW50byBpdC5cblxuLy8gU291cmNlcyB3aXRoIGEgbmF0aXZlIChpbmRleC1iYWNrZWQpIGNoYW5nZSBmZWVkIGFyZSBwb2xsZWQgdGhpcyBvZnRlblxuY29uc3QgQ0hBTkdFU19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIGNoZWNrZWQgZm9yIG9uIGV2ZXJ5IHBlZXIgdGhpcyBvZnRlbiAtIGZhciBtb3JlIG9mdGVuIHRoYW4gYSBmdWxsIHJlc2NhbiwgYmVjYXVzZSBpdCBpcyB0aGUgZmlsZSB0aGF0IGRlY2lkZXMgd2hhdCBldmVyeXRoaW5nIGVsc2UgZG9lcywgYW5kIGl0IGlzIG9uZSBzbWFsbCByZWFkIHBlciBwZWVyXG5jb25zdCBDT05GSUdfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDU7XG4vLyBGdWxsIG1ldGFkYXRhIHJlc2NhbnMuIHN1cHBvcnRzQ2hhbmdlc0FmdGVyIGlzIHRoZSBoZXVyaXN0aWMgZm9yIFwib25lIG9mIG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzXCI6IHRoZWlyIGluZGV4LWJhY2tlZCBsaXN0aW5ncyBhcmUgY2hlYXAsIHNvIGhvdXJseSBpcyBmaW5lLiBFdmVyeXRoaW5nIGVsc2UgKGJhY2tibGF6ZSwgcGxhaW4gZGlzaykgcGF5cyB0aGUgZnVsbCBsaXN0aW5nIGNvc3QsIHNvIGl0IHJlc2NhbnMgbXVjaCBsZXNzIG9mdGVuLlxuY29uc3QgRlVMTF9SRVNDQU5fSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbmNvbnN0IEZVTExfUkVTQ0FOX1VOSU5ERVhFRF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwICogNjtcbi8vIENoYW5nZSBwb2xscyByZS1yZXF1ZXN0IHRoaXMgbXVjaCBvdmVybGFwLCBzbyBjbG9jayBza2V3IGJldHdlZW4gdXMgYW5kIGEgc291cmNlIGNhbid0IGRyb3AgY2hhbmdlc1xuY29uc3QgQ0hBTkdFU19QT0xMX09WRVJMQVAgPSB0aW1lSW5NaW51dGU7XG5jb25zdCBTQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDMwO1xuLy8gRGVsZXRlcyBhcmUgdG9tYnN0b25lcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSBzaXplLTAgaW5kZXggZW50cnkgaXMgd2hhdCBsZXRzIGEgZGVsZXRpb24gcHJvcGFnYXRlL3JlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgYW5kIGl0IGV4cGlyZXMgYWZ0ZXIgdGhpcyBsb25nXG5jb25zdCBUT01CU1RPTkVfRVhQSVJZID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5jb25zdCBUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gV2hpbGUgYSBtZXRhZGF0YSBzY2FuIG9yIGZ1bGwgc3luYyBpcyBydW5uaW5nLCBpdHMgcHJvZ3Jlc3MgaXMgbG9nZ2VkIHRoaXMgb2Z0ZW5cbmNvbnN0IFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuY29uc3QgRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIEZ1bGwgc3luY3MgZG93bmxvYWQgdGhpcyBtYW55IGZpbGVzIGNvbmN1cnJlbnRseSAoaGlnaC1sYXRlbmN5IHNvdXJjZXMgbGlrZSBiYWNrYmxhemUgd291bGQgb3RoZXJ3aXNlIGNyYXdsIG9uZSByb3VuZC10cmlwIGF0IGEgdGltZSlcbmNvbnN0IEZVTExfU1lOQ19QQVJBTExFTCA9IDg7XG4vLyBBIGZ1bGwgc3luYyBydW5uaW5nIGxvbmdlciB0aGFuIHRoaXMgaXMgY29uc29sZS5lcnJvcmVkIChhbmQgYWdhaW4gZXZlcnkgaW50ZXJ2YWwgYWZ0ZXIpLCBzbyBhIHN5bmMgdGhhdCB3aWxsIHRha2UgZGF5cyBpcyBsb3VkIGluc3RlYWQgb2YgYSBxdWlldCBjb25zb2xlLmxvZyBldmVyeSBtaW51dGVcbmNvbnN0IEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBBIHJlY29uY2lsZSBwYXNzIHNraXBzIGZhaWxpbmcgZmlsZXMgKG9uZSBiYWQgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCksIGJ1dCB0aGlzIG1hbnkgZmFpbHVyZXMgaW4gYSByb3cgbWVhbnMgdGhlIHRhcmdldCBpdHNlbGYgaXMgZG93biwgc28gdGhlIHBhc3MgYWJvcnRzIHVudGlsIHRoZSBuZXh0IHNjYW4gY3ljbGVcbmNvbnN0IFJFQ09OQ0lMRV9NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMgPSA1O1xuY29uc3QgUkVDT05DSUxFX0VSUk9SX0xPR19MSU1JVCA9IDM7XG5cbnR5cGUgU291cmNlU3RhdGUgPSB7XG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGJvb2xlYW47XG4gICAgaW5pdGlhbFNjYW46IFJldHVyblR5cGU8dHlwZW9mIHByb21pc2VPYmo+O1xuICAgIHNjYW5Db21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBGaWxlcyBzZWVuIGluIHRoaXMgc291cmNlJ3Mgc2NhbnMgLyBjaGFuZ2UgcG9sbHMgc28gZmFyXG4gICAgc2Nhbm5lZENvdW50OiBudW1iZXI7XG4gICAgLy8gV2F0ZXJtYXJrIGZvciBnZXRDaGFuZ2VzQWZ0ZXIyIHBvbGxzXG4gICAgY2hhbmdlc0FmdGVyVGltZTogbnVtYmVyO1xuICAgIC8vIFBlci1zbG90IHN0b3AgdG9rZW46IGEgcmVtb3ZlZCBzb3VyY2UncyBsb29wcyBzdG9wIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0b3JlXG4gICAgc3RvcHBlZDogeyBzdG9wOiBib29sZWFuIH07XG4gICAgLy8gQSByZW1vdmVkIHNvdXJjZSdzIHNsb3Qgc3RheXMgaW4gdGhlIGFycmF5cyAodGhleSBhcmUgbmV2ZXIgc3BsaWNlZCwgc28gc2xvdCBudW1iZXJzIGhlbGQgYnkgcnVubmluZyBsb29wcyBzdGF5IG1lYW5pbmdmdWwpLCBtYXJrZWQgZGVhZCAtIG5ldmVyIHNjYW5uZWQsIHdyaXR0ZW4sIG9yIHJlYWQuIEluZGV4IGVudHJpZXMgZG9uJ3QgcmVmZXJlbmNlIHNsb3RzIGF0IGFsbDsgdGhleSBwZXJzaXN0IHRoZSBzb3VyY2VzIGxpc3QncyBzb3VyY2VzTGlzdEluZGV4LlxuICAgIGRlYWQ/OiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gbmV3U291cmNlU3RhdGUoKTogU291cmNlU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBmYWxzZSxcbiAgICAgICAgaW5pdGlhbFNjYW46IHByb21pc2VPYmooKSxcbiAgICAgICAgc2NhbkNvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgc2Nhbm5lZENvdW50OiAwLFxuICAgICAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiAwLFxuICAgICAgICBzdG9wcGVkOiB7IHN0b3A6IGZhbHNlIH0sXG4gICAgfTtcbn1cblxuLy8gV2hhdCBhIHNjYW5uZWQgbGlzdGluZyBlbnRyeSBtZWFudCB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3VyIGluZGV4XG50eXBlIFNjYW5PdXRjb21lID0gXCJmaWx0ZXJlZFwiIHwgXCJuZXdcIiB8IFwidXBkYXRlZFwiIHwgXCJ0b21ic3RvbmVcIiB8IFwidW5jaGFuZ2VkXCI7XG50eXBlIFNjYW5UYWxseSA9IFJlY29yZDxTY2FuT3V0Y29tZSwgbnVtYmVyPjtcbmZ1bmN0aW9uIG5ld1NjYW5UYWxseSgpOiBTY2FuVGFsbHkge1xuICAgIHJldHVybiB7IGZpbHRlcmVkOiAwLCBuZXc6IDAsIHVwZGF0ZWQ6IDAsIHRvbWJzdG9uZTogMCwgdW5jaGFuZ2VkOiAwIH07XG59XG5mdW5jdGlvbiBmb3JtYXRTY2FuVGFsbHkodGFsbHk6IFNjYW5UYWxseSwgdG90YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IHBjdCA9IChuOiBudW1iZXIpID0+IGAke01hdGgucm91bmQobiAvIE1hdGgubWF4KHRvdGFsLCAxKSAqIDEwMDApIC8gMTB9JWA7XG4gICAgcmV0dXJuIGAke3RhbGx5Lm5ld30gbmV3IHBhdGhzICgke3BjdCh0YWxseS5uZXcpfSksICR7dGFsbHkudXBkYXRlZH0gbmV3ZXIgd3JpdGVzICgke3BjdCh0YWxseS51cGRhdGVkKX0pLCAke3RhbGx5LnRvbWJzdG9uZX0gZGVsZXRpb25zICgke3BjdCh0YWxseS50b21ic3RvbmUpfSksICR7dGFsbHkudW5jaGFuZ2VkfSB1bmNoYW5nZWQgKCR7cGN0KHRhbGx5LnVuY2hhbmdlZCl9KSwgJHt0YWxseS5maWx0ZXJlZH0gb3V0c2lkZSByb3V0ZSAoJHtwY3QodGFsbHkuZmlsdGVyZWQpfSlgO1xufVxuXG5leHBvcnQgY2xhc3MgU3RvcmVTeW5jIHtcbiAgICAvLyBQZXIgc291cmNlIHNsb3QsIGluIHN0ZXAgd2l0aCB0aGUgc3RvcmUncyBzb3VyY2VzIGFycmF5LiBTbG90cyBhcmUgbmV2ZXIgc3BsaWNlZCBvdXQgLSBhIHJlbW92ZWQgb25lIGlzIG1hcmtlZCBkZWFkIC0gc28gYSBzbG90IG51bWJlciBoZWxkIGJ5IGEgcnVubmluZyBsb29wIGFsd2F5cyBtZWFucyB0aGUgc2FtZSBzb3VyY2UuXG4gICAgcHJpdmF0ZSBzdGF0ZXM6IFNvdXJjZVN0YXRlW107XG4gICAgLy8gU2NhbnMgLyBmdWxsIHN5bmNzIGluIHByb2dyZXNzIChhIFNldCAtIG9uZSBzb3VyY2UgY2FuIGhhdmUgYSBjaGFuZ2UgcG9sbCdzIGZ1bGwgc3luYyBhbmQgYSByZXNjYW4gb3ZlcmxhcHBpbmcpXG4gICAgcHJpdmF0ZSBhY3Rpdml0aWVzID0gbmV3IFNldDxTeW5jQWN0aXZpdHk+KCk7XG4gICAgLy8gR3VhcmRzIGFnYWluc3QgYSBzZWNvbmQgZXZpY3Rpb24gcGFzcyBzdGFydGluZyB3aGlsZSBvbmUgaXMgc3RpbGwgd2Fsa2luZyB0aGUgaW5kZXhcbiAgICBwcml2YXRlIGV2aWN0aW5nID0gZmFsc2U7XG4gICAgLy8gV2hlbiBlYWNoIGtleSB3YXMgbGFzdCBzZXJ2ZWQsIGZvciByZWFkZXJEaXNrTGltaXQncyBMUlUgZXZpY3Rpb24uIE5ldmVyIHBlcnNpc3RlZCAoYSByZXN0YXJ0IGhhcyBubyBvcGluaW9uIGFib3V0IHJlY2VuY3kpLCBhbmQgb25seSBrZXB0IGZvciBrZXlzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIHJlYWQgLSBhbiBpbmRleCBlbnRyeSBubyBvbmUgaGFzIHRvdWNoZWQgZmFsbHMgYmFjayB0byB3aGVuIHdlIGxhc3QgY2hhbmdlZCBpdC5cbiAgICBwcml2YXRlIGxhc3RBY2Nlc3MgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogQmxvYlN0b3JlKSB7XG4gICAgICAgIHRoaXMuc3RhdGVzID0gc3RvcmUuc291cmNlcy5tYXAoKCkgPT4gbmV3U291cmNlU3RhdGUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFN0YXJ0cyBldmVyeSBsaXZlIHNvdXJjZSdzIHN5bmNocm9uaXphdGlvbiwgcGx1cyB0aGUgbWFpbnRlbmFuY2UgbG9vcHMuIENhbGxlZCBvbmNlLCBieSB0aGUgc3RvcmUncyBpbml0IC0gdGhlIHN0b3JlJ3MgaW5kZXggbXVzdCBhbHJlYWR5IGJlIGxvYWRlZCwgc2luY2Ugc2NhbnMgd3JpdGUgc3RyYWlnaHQgaW50byBpdC4gKi9cbiAgICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5Tb3VyY2VTeW5jKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChDT05GSUdfUE9MTF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5wb2xsUm91dGluZ0NvbmZpZygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuY2xlYW51cFRvbWJzdG9uZXMoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgLy8gUmVhZCBsaXZlOiB0aGUgbGltaXQgY29tZXMgZnJvbSB0aGUgY29uZmlnLCBzbyBhIHN0b3JlIHRoYXQgZ2FpbnMgb25lIGxhdGVyIHN0YXJ0cyBlbmZvcmNpbmcgaXQgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWRcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFza3MgZXZlcnkgcGVlciBmb3IgdGhlIHJvdXRpbmcgY29uZmlnLCBhbmQgdGFrZXMgaXQgaWYgaXQgaXMgbmV3ZXIgdGhhbiBvdXJzLiBUaGlzIGlzIHRoZSB3aG9sZVxuICAgICAqIG9mIGNvbmZpZ3VyYXRpb24gcHJvcGFnYXRpb246IGl0IHJpZGVzIGJlc2lkZSB0aGUgc2NhbnMgcmF0aGVyIHRoYW4gYmVpbmcgcGFydCBvZiB0aGVtLCBiZWNhdXNlXG4gICAgICogb25lIHNtYWxsIHJlYWQgaXMgd29ydGggZG9pbmcgZXZlcnkgZmV3IG1pbnV0ZXMgd2hpbGUgYSBmdWxsIGxpc3RpbmcgaXMgbm90LCBhbmQgYmVjYXVzZSBhXG4gICAgICogY29uZmlnIHdlIGFyZSBtaXNzaW5nIGlzIHdoYXQgc3RvcHMgZXZlcnl0aGluZyBlbHNlIGZyb20gYmVpbmcgcmlnaHQuXG4gICAgICpcbiAgICAgKiBUaGUgY29weSBpcyBzdG9yZWQgdGhlIHNhbWUgd2F5IGEgc2NhbiBzdG9yZXMgYW55dGhpbmcgaXQgcHVsbHMgLSBhbiBpbnRlcm5hbCB3cml0ZSBpbnRvIG91ciBvd25cbiAgICAgKiBzdG9yZSAtIGFuZCB0aGUgc3RvcmUgbm90aWNlcyB0aGF0IGZpbGUgbGFuZGluZyBhbmQgcmUtY29uZmlndXJlcyBpdHNlbGYuIE5vdGhpbmcgaGVyZSBrbm93cyB3aGF0XG4gICAgICogYSBjb25maWcgbWVhbnM7IGl0IG9ubHkga25vd3MgdGhpcyBvbmUgZmlsZSBpcyB3b3J0aCBhc2tpbmcgZm9yIG9mdGVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcG9sbFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbaV0uaW50ZXJtZWRpYXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldDIoUk9VVElOR19GSUxFLCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGhlaXJzIHx8ICF0aGVpcnMuZGF0YSB8fCAhdGhlaXJzLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbiA9IGdldENvbmZpZ1ZlcnNpb24ocGFyc2VSb3V0aW5nRGF0YSh0aGVpcnMuZGF0YSkpO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDw9IHRoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHt2ZXJzaW9ufSBmb3VuZCBvbiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHdlIGhhdmUgJHt0aGlzLnN0b3JlLnJvdXRpbmdWZXJzaW9uKCl9LCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHRha2luZyBpdGApO1xuICAgICAgICAgICAgICAgIC8vIFN0YW1wZWQgTk9XLCBub3Qgd2l0aCB0aGVpciB3cml0ZSB0aW1lOiBjb25maWdzIGFyZSBvcmRlcmVkIGJ5IHZlcnNpb24sIGFuZCB0aGlzIG9uZSBpcyBuZXdlciBieSB0aGF0IG9yZGVyaW5nLiBUaGVpciBmaWxlIGNhbiBlYXNpbHkgYmUgb2xkZXIgYnkgd3JpdGUgdGltZSAob3VycyB3YXMgcmV3cml0dGVuIGxvY2FsbHkgbW9yZSByZWNlbnRseSksIGFuZCB0aGUgc3RvcmUncyBvbmx5LXRha2UtdGhlLWxhdGVzdCBydWxlIHdvdWxkIHRoZW4gZHJvcCBpdCAtIGxlYXZpbmcgdXMgZmluZGluZyB0aGUgc2FtZSBuZXdlciB2ZXJzaW9uIG9uIGV2ZXJ5IHBvbGwgYW5kIG5ldmVyIGFkb3B0aW5nIGl0LlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2V0KHsgcGF0aDogUk9VVElOR19GSUxFLCBkYXRhOiB0aGVpcnMuZGF0YSwgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBIHBlZXIgdGhhdCBjYW5ub3QgYW5zd2VyIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgYSBzb3VyY2UgdGhhdCBpcyBkb3duOyB0aGUgbmV4dCBwb2xsIGFza3MgYWdhaW5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZm9yIGEgbmV3ZXIgcm91dGluZyBjb25maWcgZmFpbGVkIChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU3RvcHMgZXZlcnkgc291cmNlJ3MgbG9vcHMgKHRoZSBzdG9yZSdzIG93biBzdG9wIHRva2VuIHN0b3BzIHRoZSBtYWludGVuYW5jZSBsb29wcykuICovXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IHN0YXRlIG9mIHRoaXMuc3RhdGVzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgc2xvdCB0aGUgc3RvcmUganVzdCBhcHBlbmRlZCB0byBpdHMgc291cmNlcyBhcnJheTogaXQgc3RhcnRzIGZyb20gbm90aGluZywgc28gaXQgZ2V0cyBhIGZ1bGwgc2Nhbi4gKi9cbiAgICBwdWJsaWMgYWRkU291cmNlKHNsb3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlc1tzbG90XSA9IG5ld1NvdXJjZVN0YXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICB2b2lkIHRoaXMucnVuU291cmNlU3luYyhzbG90KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgc2xvdCBzdGF5cyBpbiB0aGUgc3RvcmUncyBhcnJheXMgZm9yZXZlciAocnVubmluZyBsb29wcyBob2xkIHNsb3QgbnVtYmVycyk7IGl0IGp1c3QgZ29lcyBkZWFkIC0gbG9vcHMgc3RvcCwgYW5kIGl0cyBpbmRleCBlbnRyaWVzIGRyb3AgKG90aGVyIHNvdXJjZXMnIHNjYW5zIHJlLWZpbmQgYW55IGNvcHkgdGhhdCdzIHN0aWxsIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBuZXcgY29uZmlnKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlU291cmNlKHNsb3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzbG90XTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc3RvcmUuc291cmNlc1tzbG90XS5zb3VyY2U7XG4gICAgICAgIHN0YXRlLmRlYWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGxldCBzb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zbG90U291cmNlc0xpc3RJbmRleChzbG90KTtcbiAgICAgICAgLy8gVGhlIHNhbWUgVVJMIGNhbiBiZSBhbm90aGVyIGxpdmUgc2xvdCAob25lIGVudHJ5IHBlciB2YWxpZCB3aW5kb3cpIC0gdGhlIGVuZHBvaW50IGlzIHN0aWxsIGNvbmZpZ3VyZWQsIHNvIGl0cyBlbnRyaWVzIHN0YXlcbiAgICAgICAgaWYgKHNvdXJjZXNMaXN0SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN0b3JlLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IHNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEZvcmdvdHRlbiwgbm90IGRlbGV0ZWQ6IHRoZSBmaWxlcyBzdGlsbCBleGlzdCB3aGVyZXZlciB0aGF0IHNvdXJjZSBwdXQgdGhlbSwgd2UganVzdCBubyBsb25nZXIgaGF2ZSBhIHdheSB0byByZWFjaCB0aGVtXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBkcm9wcGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIGFuZCAke2Ryb3BwZWR9IGluZGV4IGVudHJpZXMgaXQgaGVsZCB3ZXJlIGRyb3BwZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIHNjYW5zIGFyZSBzdG9wcGVkIChpdHMgVVJMIGlzIHN0aWxsIHNlcnZlZCBieSBhbm90aGVyIHNsb3QsIHNvIGl0cyBpbmRleCBlbnRyaWVzIHN0YXkpYCk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgYSBzbG90IGlzIHN0aWxsIGNvbmZpZ3VyZWQuIERlYWQgc2xvdHMgYXJlIG5ldmVyIHNjYW5uZWQsIHdyaXR0ZW4sIG9yIHJlYWQuICovXG4gICAgcHVibGljIGlzTGl2ZShzbG90OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdG9yZS5zb3VyY2VzW3Nsb3RdICYmICF0aGlzLnN0YXRlc1tzbG90XT8uZGVhZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWN0aXZpdGllcygpOiBTeW5jQWN0aXZpdHlbXSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5hY3Rpdml0aWVzXTtcbiAgICB9XG5cbiAgICAvKiogQSBrZXkgd2FzIGp1c3Qgc2VydmVkLCBzbyBpdCBnb2VzIHRvIHRoZSBiYWNrIG9mIHRoZSBldmljdGlvbiBxdWV1ZS4gKi9cbiAgICBwdWJsaWMgbm90ZUFjY2VzcyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3RBY2Nlc3Muc2V0KGtleSwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgaW5kZXggc3RpbGwgaG9sZHMgZXhhY3RseSB0aGUgZW50cnkgYSBwYXNzIHBpY2tlZCB1cCBlYXJsaWVyLiBJbmRleCByb3dzIGFyZSByZWFkIG91dCBvZiB0aGUgZGF0YWJhc2UgcGVyIGxvb2t1cCwgc28gdGhpcyBjb21wYXJlcyB0aGUgcm93LCBub3QgdGhlIG9iamVjdCAtIGEgd3JpdGUgbGFuZGluZyBtaWQtcGFzcyBjaGFuZ2VzIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSB0aHJlZS5cbiAgICBwcml2YXRlIGVudHJ5VW5jaGFuZ2VkKGtleTogc3RyaW5nLCBlbnRyeTogSW5kZXhFbnRyeSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQud3JpdGVUaW1lID09PSBlbnRyeS53cml0ZVRpbWUgJiYgY3VycmVudC5zaXplID09PSBlbnRyeS5zaXplICYmIGN1cnJlbnQuc291cmNlc0xpc3RJbmRleCA9PT0gZW50cnkuc291cmNlc0xpc3RJbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdHVzKCk6IEFyY2hpdmVzU3luY1N0YXR1cyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiB0aGlzLnN0YXRlcy5ldmVyeSh4ID0+IHguc2NhbkNvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogdGhpcy5zdG9yZS5pbmRleFNpemUoKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc3RvcmUuc291cmNlcy5tYXAoKHgsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3M6IHgudmFsaWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIHJvdXRlOiB4LnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHgubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdGhpcy5zdGF0ZXNbaV0uc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogdGhpcy5zdGF0ZXNbaV0uc2NhbkNvbXBsZXRlLFxuICAgICAgICAgICAgICAgIHNjYW5uZWRDb3VudDogdGhpcy5zdGF0ZXNbaV0uc2Nhbm5lZENvdW50LFxuICAgICAgICAgICAgfSkpLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBMaXN0aW5ncyBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LCBzbyB0aGV5IG11c3Qgd2FpdCBmb3Igb3VyIG93biBiYXNlIHNvdXJjZSdzIGluaXRpYWwgc2NhbiAod2hpY2ggbWlnaHQgbGFnIG1pbnV0ZXMpIGJlZm9yZSB0aGV5IGFyZSB0cnVzdHdvcnRoeS4gVGhlIGJhc2UgKGxvY2FsIGRpc2spIGlzIGltcGxpY2l0bHkgcmVxdWlyZWQgLSByZW1vdGUgc291cmNlcyBhcmUgbm90LCB0aGV5IGNvbWUgYW5kIGdvLiAqL1xuICAgIHB1YmxpYyBhc3luYyB3YWl0Rm9yUmVxdWlyZWRTY2FucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZXNbMF0uaW5pdGlhbFNjYW4ucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKiogUmVzY2FucyBvdXIgb3duIGRpc2sncyBtZXRhZGF0YSBpbnRvIHRoZSBpbmRleCAtIHVzZWQgYXJvdW5kIHZhbGlkIHdpbmRvdyBoYW5kb2Zmcywgd2hlcmUgYW5vdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNjYW5Tb3VyY2UoMCk7XG4gICAgfVxuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpOiBqdXN0IGl0cyBjaGFuZ2VzIHNpbmNlIHRoZSBib3VuZGFyeSBuZWlnaGJvcmhvb2QsIHdpdGggbWF0Y2hpbmcgdmFsdWVzIHB1bGxlZCBvbnRvIG91ciBvd24gZGlzay4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGFydGluZzogY2hhbmdlcyBzaW5jZSAke25ldyBEYXRlKGNvbmZpZy5zaW5jZSkudG9JU09TdHJpbmcoKX0sIHJvdXRlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pYCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBjb25maWcuc2luY2UsIHJvdXRlczogY29uZmlnLnJvdXRlICYmIFtjb25maWcucm91dGVdIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkuZmlsdGVyZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShmaWxlLnBhdGgpO1xuICAgICAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAoYW4gZW1wdHkgZmlsZSBpcyBhIG1pc3NpbmcgZmlsZSksIHNvIGl0IGlzIHRha2VuIGFzIG9uZVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB0YWxseS50b21ic3RvbmUrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiBzb3VyY2UsIHRvOiB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLCBwYXRoOiBmaWxlLnBhdGgsIHNpemU6IGZpbGUuc2l6ZSwgd3JpdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoIWNvcGllZCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoY29waWVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGNvcGllZC53cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51cGRhdGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbGx5Lm5ldysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmaW5pc2hlZCBpbiAke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cyAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAke2NoYW5nZXMubGVuZ3RofSBjaGFuZ2VzOiAke2Zvcm1hdFNjYW5UYWxseSh0YWxseSwgY2hhbmdlcy5sZW5ndGgpfWApO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBwZXItc291cmNlIGxvb3BzIOKUgOKUgFxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5Tb3VyY2VTeW5jKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5yZWdpc3RlclNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgLy8gUmVhZCBsaXZlIGZvciBldmVyeSBwYXNzLCBub3QgY2FwdHVyZWQgLSB0aGUgc3RvcmUncyBzb3VyY2UgbGlzdCBjYW4gY2hhbmdlIHdoaWxlIGxvb3BzIHJ1blxuICAgICAgICBsZXQgbm9GdWxsU3luYyA9ICgpID0+IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0ubm9GdWxsU3luYztcbiAgICAgICAgbGV0IGxpc3Rpbmc6IE1hcDxzdHJpbmcsIG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEFuIGludGVybWVkaWF0ZSBpcyBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZSBQT1JUIG9udG8gYSBzb3VyY2Ugd2UgYWxyZWFkeSBoYXZlOiB0aGUgc2FtZSBidWNrZXQsIHJlYWNoYWJsZSBhbm90aGVyIHdheSBmb3IgYSBmZXcgbWludXRlcy4gU2Nhbm5pbmcgaXQgd291bGQgbGlzdCBleGFjdGx5IHdoYXQgc2Nhbm5pbmcgdGhhdCBzb3VyY2UgbGlzdHMsIGFnYWluc3QgYSBwb3J0IHRoYXQgaXMgYWJvdXQgdG8gZGlzYXBwZWFyIC0gc28gaXQgaXMgbmV2ZXIgc2Nhbm5lZCwgYW5kIHRoZSBzb3VyY2UgaXQgd2FzIHNwbGl0IG91dCBvZiBjb3ZlcnMgaXQgZm9yIGFzIGxvbmcgYXMgaXQgZXhpc3RzIGFuZCBhZnRlciBpdCBpcyBnb25lLlxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCBzb3VyY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgPSAhIWNvbmZpZy5zdXBwb3J0c0NoYW5nZXNBZnRlcjtcbiAgICAgICAgICAgICAgICBsaXN0aW5nID0gYXdhaXQgdGhpcy5zY2FuU291cmNlKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBJbml0aWFsIHNjYW4gb2Ygc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZCwgcmV0cnlpbmc6YCwgZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU0NBTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgIGlmIChsaXN0aW5nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleCwgbGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvcHlpbmcgZmlsZXMgZnJvbSBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOmAsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlcikge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKENIQU5HRVNfUE9MTF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucG9sbENoYW5nZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9LCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgICAgIC8vIENoYW5nZSBwb2xscyBvbmx5IHNob3cgd2hhdCB0aGUgc291cmNlIEhBUywgbmV2ZXIgd2hhdCBpdCdzIG1pc3NpbmcsIHNvIHB1c2hlcyBydW4gb24gdGhlIGZ1bGwtcmVzY2FuIGNhZGVuY2UgKGZpbmRJbmZvIG9uIGFuIGluZGV4LWJhY2tlZCBzb3VyY2UgaXMgY2hlYXApXG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoRlVMTF9SRVNDQU5fSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIG5ldyBNYXAoZmlsZXMubWFwKHggPT4gW3gucGF0aCwgeC5jcmVhdGVUaW1lXSkpKTtcbiAgICAgICAgICAgIH0sIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZVTExfUkVTQ0FOX1VOSU5ERVhFRF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXNjYW4gPSBhd2FpdCB0aGlzLnNjYW5Tb3VyY2Uoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCByZXNjYW4pO1xuICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9LCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZ1bGwgbWV0YWRhdGEgc2NhbiAoc2l6ZSwgd3JpdGVUaW1lLCBwYXRoKSBvZiBvbmUgc291cmNlLCBhcHBsaWVkIHRvIHRoZSBpbmRleC4gUmV0dXJucyB0aGUgc291cmNlJ3MgbGlzdGluZyAocGF0aCAtPiB3cml0ZSB0aW1lKSwgd2hpY2ggcmVjb25jaWxlU291cmNlIHVzZXMgZm9yIHRoZSBwdXNoIGRpcmVjdGlvbi5cbiAgICBwcml2YXRlIGFzeW5jIHNjYW5Tb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPj4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHsgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiwgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHN0YXJ0VGltZTogc2NhblN0YXJ0IH07XG4gICAgICAgIHRoaXMuYWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gc3RhcnRpbmcgKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KWApO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGlsbCBydW5uaW5nICgke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cywgc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pYCk7XG4gICAgICAgIH0sIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAvLyBUaGUgbGlzdGluZyByZXF1ZXN0IGRlbGliZXJhdGVseSB0YWtlcyBubyB0aW1lIG9yIHJvdXRlIGZpbHRlcnM6IG91ciBzbG93ZXN0IHNvdXJjZXMgKGJhY2tibGF6ZSkgc3VwcG9ydCBuZWl0aGVyLCBzbyBmaWx0ZXJpbmcgd291bGQgaGFwcGVuIGFmdGVyIHRoZSBmdWxsIGZldGNoIGFueXdheSAtIGxpdHRsZSBiZW5lZml0LCBtb3JlIHJvb20gZm9yIGRlc3luY2hyb25pemF0aW9uLiBBbmQgaWYgYSBmdWxsIGxpc3RpbmcgZXZlciBiZWNvbWVzIHRvbyBiaWcgdG8gc2VuZCBvdmVyIHRoZSBuZXR3b3JrLCBpdCBpcyBhbHNvIHRvbyBiaWcgZm9yIHRoZSByZWNlaXZpbmcgcHJvY2VzcyB0byBob2xkIGluIG1lbW9yeSAtIHRoZSBmaXggaXMgbW9yZSByb3V0aW5nIHNoYXJkcyAoZWFjaCBzdG9yaW5nIGFuZCBzZW5kaW5nIGxlc3MpLCBub3QgZmlsdGVyaW5nLlxuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmRlbGV0ZShhY3Rpdml0eSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNvdXJjZSBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgd2hpbGUgdGhlIGxpc3Rpbmcgd2FzIGluIGZsaWdodDsgaXRzIHJlc3VsdHMgYXJlIGRlYWRcbiAgICAgICAgaWYgKHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuIG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IGluZGV4U2l6ZUJlZm9yZSA9IHRoaXMuc3RvcmUuaW5kZXhTaXplKCk7XG4gICAgICAgIGxldCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGxldCBuZXdQYXRocyA9IDA7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHNlZW4uc2V0KGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgICAgICBuZXdQYXRocysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFsbHlbdGhpcy51cGRhdGVTY2FuSW5kZXgoc291cmNlSW5kZXgsIGZpbGUpXSsrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCA9IGZpbGVzLmxlbmd0aDtcbiAgICAgICAgLy8gRW50cmllcyB0aGlzIHNvdXJjZSB3YXMgdGhlIGhvbGRlciBvZiwgYnV0IHRoYXQgaXRzIGxpc3RpbmcgZGlkIG5vdCBtZW50aW9uLCBhcmUgZm9yZ290dGVuIC0gd2Ugd2VyZSB3cm9uZyBhYm91dCB3aGVyZSB0aGV5IGFyZSwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIHRoZW0gaGF2aW5nIGJlZW4gZGVsZXRlZC4gRW50cmllcyBjaGFuZ2VkIGFmdGVyIHRoZSBzY2FuIHN0YXJ0ZWQgYXJlIGtlcHQ6IHRoZSBsaXN0aW5nIG1heSBzaW1wbHkgcHJlZGF0ZSB0aGVtLiBUb21ic3RvbmVzIGFyZSBub3Qgd2Fsa2VkIGhlcmUgYXQgYWxsLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBmaWxlcyBhIGxpc3RpbmcgY291bGQgdm91Y2ggZm9yLlxuICAgICAgICBsZXQgcmVtb3ZlZEZyb21JbmRleCA9IDA7XG4gICAgICAgIGxldCBtaXNzaW5nT25Tb3VyY2UgPSAwO1xuICAgICAgICBsZXQgc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ICYmIGVudHJ5LmNoYW5nZWRBdCA8IHNjYW5TdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZEZyb21JbmRleCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ291bnRlZCBvbmx5IHdoZW4gdGhlIHNvdXJjZSBTSE9VTEQgaG9sZCB0aGUgZW50cnkgKGl0cyByb3V0ZSBtYXRjaGVzKSAtIHRoZXNlIGFyZSB3aGF0IHRoZSByZWNvbmNpbGUgcGFzcyBwdXNoZXMgdG8gaXQgKHdoaWNoIGFsc28gaWdub3JlcyB0aGUgdmFsaWQgd2luZG93OiBzeW5jaHJvbml6YXRpb24gbW92ZXMgZXhpc3RpbmcgdmFsdWVzLCB0aGUgd2luZG93IG9ubHkgcm91dGVzIGZyZXNoIHdyaXRlcylcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGtleSkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIG1pc3NpbmdPblNvdXJjZSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBlcmNlbnRhZ2VzIGFyZSBvZiB0aGUgdW5pb24gb2YgYm90aCBzaWRlcyAob3VyIGluZGV4ICsgdGhlaXIgbGlzdGluZyksIHNvIGV2ZXJ5IGNvdW50IGhhcyBhIHN0YWJsZSBkZW5vbWluYXRvclxuICAgICAgICBsZXQgdW5pb24gPSBpbmRleFNpemVCZWZvcmUgKyBuZXdQYXRocztcbiAgICAgICAgbGV0IHBjdCA9IChuOiBudW1iZXIpID0+IGAke01hdGgucm91bmQobiAvIE1hdGgubWF4KHVuaW9uLCAxKSAqIDEwMDApIC8gMTB9JWA7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmaW5pc2hlZCBpbiAke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cyAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAke2ZpbGVzLmxlbmd0aH0gbGlzdGVkIHZzICR7aW5kZXhTaXplQmVmb3JlfSBpbmRleGVkICh1bmlvbiAke3VuaW9ufSk6ICR7Zm9ybWF0U2NhblRhbGx5KHRhbGx5LCB1bmlvbil9LCAke21pc3NpbmdPblNvdXJjZX0gaW4gaW5kZXggYnV0IG1pc3Npbmcgb24gc291cmNlICgke3BjdChtaXNzaW5nT25Tb3VyY2UpfSksICR7cmVtb3ZlZEZyb21JbmRleH0gcmVtb3ZlZCBmcm9tIGluZGV4ICgke3BjdChyZW1vdmVkRnJvbUluZGV4KX0pYCk7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBNYXRoLm1heChzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCBzY2FuU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUCk7XG4gICAgICAgIHJldHVybiBzZWVuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwdXNoIGRpcmVjdGlvbiBvZiBzeW5jaHJvbml6YXRpb246IGV2ZXJ5dGhpbmcgd2Uga25vdyB0aGF0IHRoZSBzb3VyY2UgaXMgbWlzc2luZyAob3IgaG9sZHMgYW4gb2xkZXIgY29weSBvZikgaXMgd3JpdHRlbiB0byBpdCDigJQgaW5jbHVkaW5nIGRlbGV0aW9ucywgYXMgdG9tYnN0b25lIHdyaXRlcy4gVGhpcyBpcyB3aGF0IGhlYWxzIGEgc291cmNlIHdob3NlIGJhY2tncm91bmQgd3JpdGVzIGZhaWxlZCAoZS5nLiBpdCB3YXMgZG93bik6IHRoZSBuZXh0IHNjYW4gc2VlcyB3aGF0J3MgbWlzc2luZyBhbmQgcmUtc2VuZHMgaXQuIEEgZmFpbGluZyBmaWxlIGlzIHNraXBwZWQsIG5vdCBmYXRhbCAoaW1tdXRhYmxlIHRhcmdldHMgYXJlIGhhbmRsZWQgYnkgZm9yY2VTZXRJbW11dGFibGUsIGFuZCBvbmUgdW5yZWFkYWJsZSB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IG9mIHRoZSBwYXNzKSAtIG9ubHkgYSBydW4gb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMgKHRoZSBzb3VyY2UgaXRzZWxmIGlzIGRvd24pIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBzY2FuIGN5Y2xlLlxuICAgIHByaXZhdGUgYXN5bmMgcmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIsIGxpc3Rpbmc6IE1hcDxzdHJpbmcsIG51bWJlcj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCB2YWxpZFdpbmRvd3MsIHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBhY2NlcHRzV3JpdGVzID0gd2luZG93c0FjY2VwdFdyaXRlcyh2YWxpZFdpbmRvd3MpO1xuICAgICAgICBsZXQgdGFyZ2V0U291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCBwdXNoZWQgPSAwO1xuICAgICAgICBsZXQgZmFpbGVkID0gMDtcbiAgICAgICAgbGV0IGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICAvLyBGaWxlcyBmaXJzdCwgdGhlbiB0aGUgZGVsZXRpb25zIC0gdHdvIHdhbGtzIG5vdyB0aGF0IHRoZXkgYXJlIHR3byBtYXBzLCBhbmQgdGhlIGRlbGV0aW9ucyBvbmUgaXMgdGhlIHNob3J0IG9uZVxuICAgICAgICBsZXQgcHVzaGFibGU6IHsga2V5OiBzdHJpbmc7IHdyaXRlVGltZTogbnVtYmVyOyBlbnRyeT86IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCA9PT0gdGFyZ2V0U291cmNlc0xpc3RJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBwdXNoYWJsZS5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgZW50cnkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLnN0b3JlLmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHB1c2hhYmxlLnB1c2goeyBrZXksIHdyaXRlVGltZTogdG9tYnN0b25lLndyaXRlVGltZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB7IGtleSwgd3JpdGVUaW1lLCBlbnRyeSB9IG9mIHB1c2hhYmxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIG5vdCByZWNvbmNpbGVkOiBpdCBwcm9wYWdhdGVzIGJ5IGJlaW5nIGFza2VkIGZvciwgb24gaXRzIG93biBzY2hlZHVsZSAoc2VlIHBvbGxSb3V0aW5nQ29uZmlnKVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghYWNjZXB0c1dyaXRlcykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGtleSkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB0aGVpclRpbWUgPSBsaXN0aW5nLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHRoZWlyVGltZSAhPT0gdW5kZWZpbmVkICYmIHRoZWlyVGltZSA+PSB3cml0ZVRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gb25seSBuZWVkcyBwdXNoaW5nIHdoaWxlIHRoZSBzb3VyY2Ugc3RpbGwgaG9sZHMgYW4gb2xkZXIgY29weS4gSXQgdHJhdmVscyBhcyBkZWwgKG5ldmVyIGFzIGFuIGVtcHR5IHNldCAtIHNldCByZWplY3RzIGVtcHR5IGJ1ZmZlcnMpLCB3aXRoIHRoZSBPUklHSU5BTCBkZWxldGlvbiB0aW1lIHNvIG9yZGVyaW5nIHN1cnZpdmVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhlaXJUaW1lID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzb3VyY2UuZGVsKGtleSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwdXNoZWQrKztcbiAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgaG9sZGVyID0gYXdhaXQgdGhpcy5zdG9yZS5nZXRFbnRyeUhvbGRlcihlbnRyeSk7XG4gICAgICAgICAgICAgICAgaWYgKCFob2xkZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiBob2xkZXIsIHRvOiBzb3VyY2UsIHBhdGg6IGtleSwgc2l6ZTogZW50cnkuc2l6ZSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3BpZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA8IFJFQ09OQ0lMRV9FUlJPUl9MT0dfTElNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7a2V5fTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gUkVDT05DSUxFX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY29uY2lsaW5nIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBwdXNoZWQgJHtwdXNoZWR9IGZpbGVzLCAke2ZhaWxlZH0gZmFpbGVkJHthYm9ydGVkICYmIGAgYmVmb3JlIGFib3J0aW5nIHRoZSBwYXNzICgke2NvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlIGZhaWx1cmVzIC0gdGhlIHNvdXJjZSBsb29rcyBkb3duOyB0aGUgbmV4dCBzY2FuIGN5Y2xlIHJldHJpZXMpYCB8fCBcIlwifS4gRmlyc3QgZXJyb3JzOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9IGVsc2UgaWYgKHB1c2hlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlY29uY2lsZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMgaXQgd2FzIG1pc3Npbmcgb3IgaGVsZCBvbGRlciBjb3BpZXMgb2ZgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IFNjYW5PdXRjb21lIHtcbiAgICAgICAgLy8gQW4gaW4tZmxpZ2h0IHNjYW4gY2FuIG91dGxpdmUgaXRzIHNvdXJjZSdzIHJlbW92YWw7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmICghdGhpcy5pc0xpdmUoc291cmNlSW5kZXgpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBORVZFUiBwdWxsZWQgZnJvbSBvdGhlciBzb3VyY2VzIC0gaXQgb25seSBldmVyIGFycml2ZXMgYXMgYW4gZXhwbGljaXQsIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCBhbmQgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzay4gUm91dGUgYW5kIHZhbGlkLXdpbmRvdyBmaWx0ZXJzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IGVpdGhlcjogaXQgaXMgdGhlIGZpbGUgREVGSU5JTkcgdGhlbSwgc28gZmlsdGVyaW5nIGl0IHdvdWxkIG1lYW4gY2VydGFpbiBzb3VyY2VzIGNvdWxkIG5ldmVyIGhhdmUgdGhlaXIgcm91dGluZyBjb25maWcgdXBkYXRlZCwgZXZlci5cbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB2YWxpZCB3aW5kb3cgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhcHBsaWVkIGhlcmU6IGl0IGRlY2lkZXMgd2hlcmUgV1JJVEVTIHJvdXRlLCBidXQgYSBzY2FuIGlzIHVzIGFza2luZyBhIHNvdXJjZSB3aGF0IGl0IGFscmVhZHkgaG9sZHMgLSBleGlzdGluZyB2YWx1ZXMgc3luY2hyb25pemUgcmVnYXJkbGVzcyBvZiB0aGUgd2luZG93ICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS4gT25seSB0aGUgcm91dGUgZmlsdGVyczogYSBwYXJ0aWFsbHktb3ZlcmxhcHBpbmcgc2hhcmQncyBsaXN0aW5nIGxlZ2l0aW1hdGVseSBpbmNsdWRlcyBrZXlzIHRoYXQgYXJlbid0IG91cnMuXG4gICAgICAgICAgICBsZXQgeyByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMsIGFuZCBhIHRpZSBrZWVwcyB3aGF0IHdlIGhhdmUgLSBvdGhlcndpc2UgZXZlcnkgcmVzY2FuIG9mIGFuIHVuY2hhbmdlZCBmaWxlIHdvdWxkIHJlLXJlY29yZCBpdCwgbW92aW5nIGl0cyBob2xkZXIgYW5kIHdyaXRpbmcgYSBsb2cgcmVjb3JkIGZvciBub3RoaW5nLiBjdXJyZW50V3JpdGVUaW1lIGNvdW50cyBkZWxldGlvbnMsIHNvIGEgbGlzdGluZyB0aGF0IHN0aWxsIHNob3dzIGEgZmlsZSB3ZSBrbm93IHdhcyBkZWxldGVkIGRvZXMgbm90IHJlc3VycmVjdCBpdC5cbiAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKSkgcmV0dXJuIFwidW5jaGFuZ2VkXCI7XG4gICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAtIGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUgLSBzbyB0aGF0IGlzIHdoYXQgaXQgaXMgdGFrZW4gYXNcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFwidG9tYnN0b25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBcInVwZGF0ZWRcIjtcbiAgICAgICAgcmV0dXJuIFwibmV3XCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsQ2hhbmdlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBvbGxTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCByb3V0ZXM6IHJvdXRlICYmIFtyb3V0ZV0gfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9sbHMgcnVuIGNvbnN0YW50bHksIHNvIG9ubHkgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBjaGFuZ2VkIHRoZSBpbmRleCBnZXQgYSBsaW5lXG4gICAgICAgIGlmICh0YWxseS5uZXcgfHwgdGFsbHkudXBkYXRlZCB8fCB0YWxseS50b21ic3RvbmUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDaGFuZ2VzIHBvbGwgb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7Y2hhbmdlcy5sZW5ndGh9IGNoYW5nZXM6ICR7Zm9ybWF0U2NhblRhbGx5KHRhbGx5LCBjaGFuZ2VzLmxlbmd0aCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ICs9IGNoYW5nZXMubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lID0gcG9sbFN0YXJ0IC0gQ0hBTkdFU19QT0xMX09WRVJMQVA7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWRzIHRoZSBmaWxlcyBhIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHByZXNlcnZpbmcgdGhlaXIgbW9kaWZpZWQgdGltZXMg4oCUIHNvIGEgbmV3ZXIgbG9jYWwgd3JpdGUgYWx3YXlzIHdpbnMuIFNraXBwZWQgZm9yIG5vRnVsbFN5bmMgc291cmNlcyAoZnJvbnRpbmcgYSBsYXJnZSBkYXRhYmFzZSB3aXRob3V0IGNvcHlpbmcgaXQpOyByZWFkcyBzdGlsbCBkb3duLWNhY2hlIGxhemlseS5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBlbmRpbmc6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGxldCBjb3BpZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBjb3BpZWRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVsbFN5bmNcIixcbiAgICAgICAgICAgIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZG9uZUZpbGVzOiAwLFxuICAgICAgICAgICAgdG90YWxGaWxlczogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgICAgICBkb25lQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbGV0IHByb2dyZXNzTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBsb2dQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyZXNzTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHthY3Rpdml0eS5kb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeygoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpYCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwobG9nUHJvZ3Jlc3MsIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgc2xvd0Vycm9yVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWU7XG4gICAgICAgICAgICBsZXQgZG9uZUZpbGVzID0gYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgZG9uZUJ5dGVzID0gYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgYnl0ZXNQZXJTZWNvbmQgPSBkb25lQnl0ZXMgLyAoZWxhcHNlZCAvIDEwMDApO1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZ0J5dGVzID0gdG90YWxCeXRlcyAtIGRvbmVCeXRlcztcbiAgICAgICAgICAgIGxldCBldGFUZXh0ID0gXCJ1bmtub3duIChubyBieXRlcyB0cmFuc2ZlcnJlZCB5ZXQpXCI7XG4gICAgICAgICAgICBpZiAoYnl0ZXNQZXJTZWNvbmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZ01zID0gcmVtYWluaW5nQnl0ZXMgLyBieXRlc1BlclNlY29uZCAqIDEwMDA7XG4gICAgICAgICAgICAgICAgZXRhVGV4dCA9IGAke2Zvcm1hdFRpbWUocmVtYWluaW5nTXMpfSByZW1haW5pbmcsIGNvbXBsZXRpbmcgYXJvdW5kICR7bmV3IERhdGUoRGF0ZS5ub3coKSArIHJlbWFpbmluZ01zKS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZ1bGwgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pIGhhcyBiZWVuIHJ1bm5pbmcgZm9yICR7Zm9ybWF0VGltZShlbGFwc2VkKX06ICR7ZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoZG9uZUZpbGVzIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGRvbmVCeXRlcyl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIGRvbmVCeXRlcyAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihieXRlc1BlclNlY29uZCl9Qi9zLiBFc3RpbWF0ZWQgJHtldGFUZXh0fS5gKTtcbiAgICAgICAgfSwgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwpO1xuICAgICAgICAoc2xvd0Vycm9yVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgZmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgY29weVdvcmtlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWZhaWxlZCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGtleSwgZW50cnkgfSA9IHBlbmRpbmdbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogc291cmNlLCB0bzogdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZSwgcGF0aDoga2V5LCBzaXplOiBlbnRyeS5zaXplLCB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvcGllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtb3ZlIHRoZSBlbnRyeSdzIHNvdXJjZSBpZiBpdCB3YXNuJ3QgY2hhbmdlZCB3aGlsZSB3ZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVudHJ5VW5jaGFuZ2VkKGtleSwgZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZG9uZUZpbGVzID0gKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVCeXRlcyA9IChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgKyBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgd29ya2VyczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKEZVTExfU1lOQ19QQVJBTExFTCwgcGVuZGluZy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJzLnB1c2goY29weVdvcmtlcigpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBvdGhlciB3b3JrZXJzIHB1bGxpbmcgbmV3IGZpbGVzLCB0aGVuIHN1cmZhY2UgdGhlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzbG93RXJyb3JUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmFjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgICAgIC8vIEEgc3luYyBzbG93IGVub3VnaCB0byBoYXZlIGxvZ2dlZCBwcm9ncmVzcyBhbHNvIGxvZ3MgaXRzIGNvbXBsZXRpb25cbiAgICAgICAgICAgIGlmIChwcm9ncmVzc0xvZ2dlZCkge1xuICAgICAgICAgICAgICAgIGxvZ1Byb2dyZXNzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgbWFpbnRlbmFuY2Ug4pSA4pSAXG5cbiAgICAvLyByZWFkZXJEaXNrTGltaXQ6IHRoZSBkaXNrIGlzIG9ubHkgYSBib3VuZGVkIHJlYWQgY2FjaGUsIHNvIG9uY2UgaXQgZXhjZWVkcyB0aGUgbGltaXQsIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gaXQgLSBidXQgT05MWSB3aGVuIGFub3RoZXIgc291cmNlIHZlcmlmaWFibHkgaG9sZHMgYSBzYW1lLW9yLW5ld2VyIGNvcHkgKHRoZSBvbmx5IGNvcHkgb2YgYSBmaWxlIGlzIG5ldmVyIGRlbGV0ZWQpLCBhbmQgdGhlIGluZGV4IGVudHJ5IHJlcG9pbnRzIHRvIHRoYXQgc291cmNlIHNvIHJlYWRzIGtlZXAgd29ya2luZyAocmUtY2FjaGluZyBvbiB0aGUgbmV4dCByZWFkKS5cbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VEaXNrTGltaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBsaW1pdCA9IHRoaXMuc3RvcmUucmVhZGVyRGlza0xpbWl0O1xuICAgICAgICBpZiAoIWxpbWl0IHx8IHRoaXMuZXZpY3RpbmcpIHJldHVybjtcbiAgICAgICAgbGV0IHRvdGFscyA9IHRoaXMuc3RvcmUuaW5kZXhUb3RhbHMoKTtcbiAgICAgICAgLy8gQ291bnRlZCBkb3duIGFzIHdlIGV2aWN0LCByYXRoZXIgdGhhbiByZS1yZWFkIHBlciBmaWxlOiBhIHBhc3Mgb25seSBldmVyIHJlbW92ZXMgYnl0ZXMgZnJvbSB0aGUgZGlzaywgYW5kIGFueXRoaW5nIHdyaXR0ZW4gZHVyaW5nIGl0IGlzIHBpY2tlZCB1cCBieSB0aGUgbmV4dCBwYXNzXG4gICAgICAgIGxldCBkaXNrQnl0ZXMgPSB0b3RhbHMuc2xvdHNbMF0uYnl0ZUNvdW50O1xuICAgICAgICBpZiAoZGlza0J5dGVzIDw9IGxpbWl0KSByZXR1cm47XG4gICAgICAgIHRoaXMuZXZpY3RpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZXZpY3RlZEZpbGVzID0gMDtcbiAgICAgICAgbGV0IGV2aWN0ZWRCeXRlcyA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYmFzZVNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCk7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlczogeyBrZXk6IHN0cmluZzsgZW50cnk6IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBiYXNlU291cmNlc0xpc3RJbmRleCB8fCBrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExlYXN0IHJlY2VudGx5IFJFQUQgZmlyc3Q7IGEga2V5IG5vYm9keSBoYXMgcmVhZCBzaW5jZSB3ZSBzdGFydGVkIGZhbGxzIGJhY2sgdG8gd2hlbiB3ZSBsYXN0IGNoYW5nZWQgaXRcbiAgICAgICAgICAgIHNvcnQoY2FuZGlkYXRlcywgeCA9PiB0aGlzLmxhc3RBY2Nlc3MuZ2V0KHgua2V5KSB8fCB4LmVudHJ5LmNoYW5nZWRBdCk7XG4gICAgICAgICAgICBmb3IgKGxldCB7IGtleSwgZW50cnkgfSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGRpc2tCeXRlcyA8PSBsaW1pdCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVudHJ5VW5jaGFuZ2VkKGtleSwgZW50cnkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgaG9sZGVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuc3RvcmUuc291cmNlc1tpXS5zb3VyY2UuZ2V0SW5mbyhrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gJiYgaW5mby53cml0ZVRpbWUgPj0gZW50cnkud3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGRvd24gc291cmNlIGp1c3QgY2FuJ3Qgdm91Y2ggZm9yIHRoaXMgZmlsZSByaWdodCBub3dcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaG9sZGVyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UuZGVsKGtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KGhvbGRlcikgfSk7XG4gICAgICAgICAgICAgICAgZXZpY3RlZEZpbGVzKys7XG4gICAgICAgICAgICAgICAgZXZpY3RlZEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICAgICAgZGlza0J5dGVzIC09IGVudHJ5LnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmV2aWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZXZpY3RlZEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYERpc2sgY2FjaGUgb3ZlciByZWFkZXJEaXNrTGltaXQgKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogZXZpY3RlZCAke2V2aWN0ZWRGaWxlc30gbGVhc3QtcmVjZW50bHktdXNlZCBmaWxlcyAoJHtmb3JtYXROdW1iZXIoZXZpY3RlZEJ5dGVzKX1CKSwgbm93IGF0ICR7Zm9ybWF0TnVtYmVyKGRpc2tCeXRlcyl9Qi8ke2Zvcm1hdE51bWJlcihsaW1pdCl9QmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVG9tYnN0b25lcyBvbmx5IG5lZWQgdG8gZXhpc3QgbG9uZyBlbm91Z2ggZm9yIGV2ZXJ5IHN0b3JlIHRvIGxlYXJuIG9mIHRoZSBkZWxldGlvbjsgZXhwaXJlZCBvbmVzIGFyZSBmb3Jnb3R0ZW4gZW50aXJlbHkuIEEgd2FsayBvZiB0aGUgdG9tYnN0b25lcyBhbG9uZSwgd2hpY2ggaXMgd2h5IGl0IGNhbiBydW4gb2Z0ZW4gYW5kIGNvc3Qgbm90aGluZy4gVGhlIHBoeXNpY2FsIGVtcHR5IGZpbGUgaXMgcmVtb3ZlZCBvbmx5IG9uIGJhY2tibGF6ZSBzb3VyY2VzOiByZW1vdGUgc3RvcmVzIGV4cGlyZSB0aGVpciBvd24gdG9tYnN0b25lcyAoYSBkZWwgdGhlcmUgd291bGQganVzdCBtaW50IGEgZnJlc2ggb25lKSwgYW5kIG91ciBvd24gZGlzayBuZXZlciBzdG9yZWQgYW55dGhpbmcgZm9yIGl0LlxuICAgIHByaXZhdGUgYXN5bmMgY2xlYW51cFRvbWJzdG9uZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gVE9NQlNUT05FX0VYUElSWTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLnN0b3JlLmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRvbWJzdG9uZS53cml0ZVRpbWUgPiBjdXRvZmYpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUVudHJ5ID0gdGhpcy5zdG9yZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93c0FjY2VwdFdyaXRlcyhzb3VyY2VFbnRyeS52YWxpZFdpbmRvd3MpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gc291cmNlRW50cnkuc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIEFyY2hpdmVzQmFja2JsYXplKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdm9pZCBzb3VyY2UuZGVsKGtleSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlbW92aW5nIGV4cGlyZWQgdG9tYnN0b25lICR7a2V5fSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
651
- /* _JS_SOURCE_HASH = "a14732572f676aa3de7e7d8addb418686b10a06af73bf893e3c5735ff26b8226"; */
651
+ /* _JS_SOURCE_HASH = "8630615623d805fe44e7b974bee25a8500af9da4fc13cef82631715d8ed26106"; */
@@ -1,4 +1,4 @@
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";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.assertValidArgs = exports.assertValidPath = exports.assertValidSourceName = exports.assertValidName = void 0;
4
4
  function assertValidName(value, kind) {
@@ -47,4 +47,4 @@ function assertValidArgs(target, key, descriptor) {
47
47
  }
48
48
  exports.assertValidArgs = assertValidArgs;
49
49
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsU0FBZ0IsZUFBZSxDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzdILENBQUM7QUFDTCxDQUFDO0FBSkQsMENBSUM7QUFFRCx1VEFBdVQ7QUFDdlQsU0FBZ0IscUJBQXFCLENBQUMsS0FBYTtJQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztJQUNySSxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUN0SSxDQUFDO0FBQ0wsQ0FBQztBQVBELHNEQU9DO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLElBQVk7SUFDeEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLE1BQU0sNkJBQTZCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM3SCxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLDhGQUE4RixDQUFDLENBQUM7SUFDdEssQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNqSCxDQUFDO0FBQ0wsQ0FBQztBQVZELDBDQVVDO0FBRUQsNFdBQTRXO0FBQzVXLFNBQWdCLGVBQWUsQ0FBQyxNQUFlLEVBQUUsR0FBVyxFQUFFLFVBQThCO0lBQ3hGLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUF3QyxDQUFDO0lBQ25FLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLElBQWU7UUFDM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBeUUsQ0FBQztRQUM3RixJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxJQUFJLFNBQVMsSUFBSSxNQUFNO2dCQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsT0FBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RSxJQUFJLFlBQVksSUFBSSxNQUFNO2dCQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBb0IsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN4RixJQUFJLE1BQU0sSUFBSSxNQUFNO2dCQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBYyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQVhELDBDQVdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkTmFtZSh2YWx1ZTogc3RyaW5nLCBraW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIS9eW1xcdy1dezEsNjR9JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7a2luZH0gJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9LCBleHBlY3RlZCAxLTY0IGNoYXJhY3RlcnMgb2YgbGV0dGVycy9udW1iZXJzL3VuZGVyc2NvcmUvZGFzaGApO1xuICAgIH1cbn1cblxuLyoqIEEgc3RvcmUncyBuYW1lIChzZWUgQ29tbW9uQ29uZmlnLm5hbWUpLCB3aGljaCBhbHNvIGFsbG93cyBkb3RzIC0gYSBuYW1lIGlzIG9mdGVuIGEgaG9zdCBvciBhIHZlcnNpb24sIGFuZCBib3RoIHJlYWQgd3Jvbmcgd2l0aG91dCB0aGVtLiBJdCBpcyBvbmUgcGF0aCBzZWdtZW50IG9mIHRoZSBzdG9yZSdzIGZvbGRlciwgc28gdGhlIHR3byBuYW1lcyB0aGF0IHdvdWxkIG1lYW4gYSBkaWZmZXJlbnQgZm9sZGVyIGVudGlyZWx5IGFyZSByZWplY3RlZDogZXZlcnl0aGluZyBlbHNlIGNvbnRhaW5pbmcgZG90cyBpcyBqdXN0IGEgbmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZFNvdXJjZU5hbWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghL15bXFx3Li1dezEsNjR9JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvdXJjZSBuYW1lICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSwgZXhwZWN0ZWQgMS02NCBjaGFyYWN0ZXJzIG9mIGxldHRlcnMvbnVtYmVycy91bmRlcnNjb3JlL2Rhc2gvZG90YCk7XG4gICAgfVxuICAgIGlmICgvXlxcLiskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc291cmNlIG5hbWUgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9OiBhIG5hbWUgb2Ygb25seSBkb3RzIHJlZmVycyB0byBhIGRpcmVjdG9yeSByYXRoZXIgdGhhbiBuYW1pbmcgb25lYCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChCdWZmZXIuZnJvbShwYXRoLCBcInV0ZjhcIikubGVuZ3RoID4gMTAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggdG9vIGxvbmc6ICR7cGF0aC5sZW5ndGh9IGNoYXJhY3RlcnMgPiAxMDAwLiBQYXRoOiAke3BhdGguc2xpY2UoMCwgMjAwKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXRoIHx8IHBhdGguc3RhcnRzV2l0aChcIi9cIikgfHwgcGF0aC5lbmRzV2l0aChcIi9cIikgfHwgcGF0aC5pbmNsdWRlcyhcIi8vXCIpIHx8IHBhdGguaW5jbHVkZXMoXCJcXFxcXCIpIHx8IHBhdGguaW5jbHVkZXMoXCJcXHgwMFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGguc2xpY2UoMCwgMjAwKSl9LCBwYXRocyBjYW5ub3QgYmUgZW1wdHksIHN0YXJ0IG9yIGVuZCB3aXRoIC8sIG9yIGNvbnRhaW4gLy8sIGJhY2tzbGFzaGVzLCBvciBudWxsIGNoYXJhY3RlcnNgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLnNvbWUocGFydCA9PiBwYXJ0ID09PSBcIi5cIiB8fCBwYXJ0ID09PSBcIi4uXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aC5zbGljZSgwLCAyMDApKX0sIHBhdGhzIGNhbm5vdCBjb250YWluIC4gb3IgLi4gc2VnbWVudHNgKTtcbiAgICB9XG59XG5cbi8qKiBNZXRob2QgZGVjb3JhdG9yOiB2YWxpZGF0ZXMgdGhlIHdlbGwta25vd24gZmllbGRzIG9mIHRoZSBtZXRob2QncyBzaW5nbGUgY29uZmlnLW9iamVjdCBhcmd1bWVudCAtIGFjY291bnQvYnVja2V0TmFtZSBhcyBuYW1lcywgcGF0aCBhcyBhIHBhdGggLSBiZWZvcmUgdGhlIG1ldGhvZCBydW5zLiBGaWVsZHMgdGhlIGNvbmZpZyBkb2Vzbid0IGhhdmUgYXJlIHNraXBwZWQsIHNvIGl0IGFwcGxpZXMgdG8gZXZlcnkgQVBJIG1ldGhvZCB1bmlmb3JtbHkuIHByZWZpeCBpcyBkZWxpYmVyYXRlbHkgTk9UIHZhbGlkYXRlZDogcHJlZml4ZXMgbWF5IGJlIGVtcHR5IG9yIGVuZCB3aXRoIFwiL1wiLCBib3RoIGludmFsaWQgZm9yIHBhdGhzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkQXJncyh0YXJnZXQ6IHVua25vd24sIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkIHtcbiAgICBsZXQgb3JpZ2luYWwgPSBkZXNjcmlwdG9yLnZhbHVlIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IGFyZ3NbMF0gYXMgeyBhY2NvdW50Pzogc3RyaW5nOyBidWNrZXROYW1lPzogc3RyaW5nOyBwYXRoPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjb25maWcgJiYgdHlwZW9mIGNvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKFwiYWNjb3VudFwiIGluIGNvbmZpZykgYXNzZXJ0VmFsaWROYW1lKGNvbmZpZy5hY2NvdW50IGFzIHN0cmluZywgXCJhY2NvdW50XCIpO1xuICAgICAgICAgICAgaWYgKFwiYnVja2V0TmFtZVwiIGluIGNvbmZpZykgYXNzZXJ0VmFsaWROYW1lKGNvbmZpZy5idWNrZXROYW1lIGFzIHN0cmluZywgXCJidWNrZXQgbmFtZVwiKTtcbiAgICAgICAgICAgIGlmIChcInBhdGhcIiBpbiBjb25maWcpIGFzc2VydFZhbGlkUGF0aChjb25maWcucGF0aCBhcyBzdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xufVxuIl19
50
- /* _JS_SOURCE_HASH = "3c47af61d817d76651ac4b91cc2d83a30a45619b8072517ce152b34b6075b1d8"; */
50
+ /* _JS_SOURCE_HASH = "52f73d0ef7e2f65848acc68373c50e34bd39c017c3ff908220fc66a6f3d0296f"; */
@@ -1,5 +1,19 @@
1
+ import { RemoteConfig } from "../IArchives";
1
2
  /** Subscribe to server-pushed routing change notifications. Returns the unsubscribe function. */
2
3
  export declare function onServerRoutingChanged(listener: () => void): () => void;
4
+ /** One chain's configs, as getRoutingConfigForName answers from them: the initial in-code config, and a getter for the synchronized one (adopted from the stored routing files, so it changes over time). */
5
+ type TrackedChainConfig = {
6
+ configured: RemoteConfig;
7
+ active: () => RemoteConfig;
8
+ };
9
+ /** Every chain tracks its configs here (see ChainStateManager), so a server can ask what config was intended for a store name. Returns the untrack function. */
10
+ export declare function trackChainConfig(entry: TrackedChainConfig): () => void;
3
11
  export declare const StorageClientController: import("socket-function/SocketFunctionTypes").SocketRegistered<{
4
12
  routingConfigChanged: () => Promise<void>;
13
+ getRoutingConfigForName: (config: {
14
+ account: string;
15
+ bucketName: string;
16
+ name: string;
17
+ }) => Promise<RemoteConfig | undefined>;
5
18
  }>;
19
+ export {};
@@ -1,6 +1,8 @@
1
1
  import { SocketFunction } from "socket-function/SocketFunction";
2
+ import { RemoteConfig } from "../IArchives";
3
+ import { parseHostedUrl } from "./remoteConfig";
2
4
 
3
- // The client half of routing-change broadcasts: the storage server tracks its connected clients (see trackCaller in storageController) and calls routingConfigChanged on every one of them the moment a routing config changes - clients react immediately instead of waiting for a poll.
5
+ // The client half of the storage protocol: the storage server tracks its connected clients (see trackCaller in storageController) and calls back into them - routingConfigChanged the moment a routing config changes (clients react immediately instead of waiting for a poll), and getRoutingConfigForName when a store one of our requests created needs the config we intended for it.
4
6
 
5
7
  const listeners = new Set<() => void>();
6
8
 
@@ -12,6 +14,32 @@ export function onServerRoutingChanged(listener: () => void): () => void {
12
14
  };
13
15
  }
14
16
 
17
+ /** One chain's configs, as getRoutingConfigForName answers from them: the initial in-code config, and a getter for the synchronized one (adopted from the stored routing files, so it changes over time). */
18
+ type TrackedChainConfig = { configured: RemoteConfig; active: () => RemoteConfig };
19
+ const chainConfigs = new Set<TrackedChainConfig>();
20
+
21
+ /** Every chain tracks its configs here (see ChainStateManager), so a server can ask what config was intended for a store name. Returns the untrack function. */
22
+ export function trackChainConfig(entry: TrackedChainConfig): () => void {
23
+ chainConfigs.add(entry);
24
+ return () => {
25
+ chainConfigs.delete(entry);
26
+ };
27
+ }
28
+
29
+ function configNamesStore(config: RemoteConfig, account: string, bucketName: string, name: string): boolean {
30
+ for (let source of config.sources) {
31
+ if (typeof source === "string" || source.type !== "remote") continue;
32
+ if (source.name !== name) continue;
33
+ try {
34
+ let parsed = parseHostedUrl(source.url);
35
+ if (parsed.account === account && parsed.bucketName === bucketName) return true;
36
+ } catch {
37
+ continue;
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+
15
43
  class StorageClientControllerBase {
16
44
  async routingConfigChanged(): Promise<void> {
17
45
  for (let listener of [...listeners]) {
@@ -22,6 +50,18 @@ class StorageClientControllerBase {
22
50
  }
23
51
  }
24
52
  }
53
+
54
+ /** A storage server asks: what routing config did this client INTEND for this store name? This is how a store our requests created - before any config ever reached its folder - configures itself: the same information as passing the config on every call, fetched lazily instead (the config is kilobytes and the calls are many). Preference: the synchronized config (adopted from the stored routing files); when that no longer names the store, the initial in-code config - older, but it MATCHES the name, which is what the asking store needs. */
55
+ async getRoutingConfigForName(config: { account: string; bucketName: string; name: string }): Promise<RemoteConfig | undefined> {
56
+ for (let entry of [...chainConfigs]) {
57
+ let active = entry.active();
58
+ if (configNamesStore(active, config.account, config.bucketName, config.name)) return active;
59
+ }
60
+ for (let entry of [...chainConfigs]) {
61
+ if (configNamesStore(entry.configured, config.account, config.bucketName, config.name)) return entry.configured;
62
+ }
63
+ return undefined;
64
+ }
25
65
  }
26
66
 
27
67
  export const StorageClientController = SocketFunction.register(
@@ -29,5 +69,6 @@ export const StorageClientController = SocketFunction.register(
29
69
  new StorageClientControllerBase(),
30
70
  () => ({
31
71
  routingConfigChanged: {},
72
+ getRoutingConfigForName: {},
32
73
  }),
33
74
  );
@@ -4,7 +4,7 @@ import { BlobStore } from "./blobStore";
4
4
  import { RemoteConfig, SourceConfig, IArchives, ArchivesConfig, ArchivesSyncStatus } from "../IArchives";
5
5
  import { BucketDiskInfo } from "./bucketDisk";
6
6
  import { BucketWriteStats } from "./accessStats";
7
- export declare function getStore(account: string, bucketName: string, name: string): BlobStore;
7
+ export declare function getStore(account: string, bucketName: string, name: string, callerNodeId?: string): BlobStore;
8
8
  /** The store serving a request: the one the client's selected entry NAMES. Account, name, and bucket ARE the folder, so this is a direct lookup, never a search of what exists - and a name this server has never seen is CREATED, never rejected, because asking for a name is the instruction to have that store (one name, one folder, one index; it configures itself once the routing config lands in it). Nothing else about the request is compared - not the window, not the route, not the flags - which is the whole point of naming it: a client a config version behind on some flag still reaches the right store. */
9
9
  export declare function findBucketStore(account: string, bucketName: string, sourceConfig: SourceConfig | undefined): BlobStore;
10
10
  /** The stores of a bucket as the DISK records them (a bucket is nothing more than the store folders sharing its name), opened - so the ones that weren't running yet start synchronizing. Empty when the bucket does not exist here. */
@@ -9,6 +9,8 @@ import { assertWritesAllowed } from "./serverConfig";
9
9
  import { assertValidSourceName } from "./validation";
10
10
  import { getBucketFolder, listAccountStoreFolders, listBucketStoreFolders, readRoutingFromDisk, getDiskInfo, BucketDiskInfo } from "./bucketDisk";
11
11
  import { scheduleBoundaryWork, reinjectIntermediates } from "./intermediateManagement";
12
+ import { SocketFunction } from "socket-function/SocketFunction";
13
+ import { StorageClientController } from "./storageClientController";
12
14
  import { isSelfSource } from "./storePlan";
13
15
  import { countBucketWrite, getBucketWriteStats, BucketWriteStats } from "./accessStats";
14
16
 
@@ -28,7 +30,7 @@ const stores = new Map<string, BlobStore>();
28
30
  // The opened stores of each `${account}/${bucketName}`, by name - which buckets are ACTIVE (something touched them), for deploy handoffs and the debug pages. Purely a registry of what getStore already made.
29
31
  const activeStores = new Map<string, Map<string, BlobStore>>();
30
32
 
31
- export function getStore(account: string, bucketName: string, name: string): BlobStore {
33
+ export function getStore(account: string, bucketName: string, name: string, callerNodeId?: string): BlobStore {
32
34
  // The one place a name becomes a folder, so the one place it is validated (it can come straight off the wire)
33
35
  assertValidSourceName(name);
34
36
  let folder = getBucketFolder(name, account, bucketName);
@@ -44,6 +46,8 @@ export function getStore(account: string, bucketName: string, name: string): Blo
44
46
  resolveSourceUrl: resolveSourceArchives,
45
47
  // The store is the one that knows when a config landed, and a config with upcoming windows is what boundary scans are armed from
46
48
  onRoutingApplied: routing => scheduleBoundaryWork(account, bucketName, routing),
49
+ // The store was created by this caller's request, so the caller knows exactly what config it intended for this name - the store asks it when its own folder holds no configuration (see BlobStore.init)
50
+ requestRoutingConfig: callerNodeId && (async () => await StorageClientController.nodes[callerNodeId].getRoutingConfigForName({ account, bucketName, name })) || undefined,
47
51
  });
48
52
  stores.set(folder, store);
49
53
  let key = `${account}/${bucketName}`;
@@ -63,7 +67,12 @@ export function findBucketStore(account: string, bucketName: string, sourceConfi
63
67
  if (!sourceConfig) {
64
68
  throw new Error(`No remote source configuration was provided for bucket ${account}/${bucketName}: every request must say which configured source it selected`);
65
69
  }
66
- return getStore(account, bucketName, sourceConfig.name);
70
+ // The caller's id, so a store this request CREATES can ask that caller for the config it intended (a store only ever exists because a config names it, and the requester holds that config)
71
+ let callerNodeId: string | undefined;
72
+ try {
73
+ callerNodeId = SocketFunction.getCaller()?.nodeId;
74
+ } catch { }
75
+ return getStore(account, bucketName, sourceConfig.name, callerNodeId);
67
76
  }
68
77
 
69
78
  /** The stores of a bucket as the DISK records them (a bucket is nothing more than the store folders sharing its name), opened - so the ones that weren't running yet start synchronizing. Empty when the bucket does not exist here. */
@@ -17,6 +17,11 @@ export class StoreConfig {
17
17
  /** The routing config changed. Same store either way: its name did not change, so neither did its folder, its index, or the data in it. */
18
18
  /** No entries is a real state, not an error: a store exists as soon as its folder does, and it may never have heard of a configuration (see StorePolicy). */
19
19
  public update(entries: HostedConfig[]): void {
20
+ // Never go from configured back to UNCONFIGURED: keep the last configuration that worked. There is no point in emptying it - if this store was genuinely removed from the config, nobody will request it again, and the stale entries are not worth cleaning up (they are tiny, named stores are rarely removed, and a service restart clears them eventually). Keeping them is REQUIRED for the out-of-sync cases: a bad config that stops naming us would otherwise leave the store rejecting every write, including the ones that would let the configuration converge - it just won't update until a restart, and a restart can't complete against an out-of-date configuration, which is an infinite loop.
21
+ if (!entries.length && this.entries.length) {
22
+ console.warn(`Ignoring a routing config update that would leave store ${JSON.stringify(this.name)} with NO entries: keeping its current ${this.entries.length} entr${this.entries.length === 1 && "y" || "ies"} ${JSON.stringify(this.entries.map(x => ({ validWindow: x.validWindow, route: x.route })))}`);
23
+ return;
24
+ }
20
25
  let ordered = [...entries];
21
26
  sort(ordered, x => x.validWindow[0]);
22
27
  this.entries = ordered;