sliftutils 1.7.69 → 1.7.70

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 (52) hide show
  1. package/dist/treeSummary.ts.cache +2 -2
  2. package/index.d.ts +4 -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 +2 -2
  10. package/render-utils/dist/observer.tsx.cache +2 -2
  11. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  12. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  13. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  14. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
  15. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  16. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  17. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  18. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  19. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  20. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  21. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  22. package/storage/IArchives.d.ts +4 -1
  23. package/storage/IArchives.ts +15 -1
  24. package/storage/backblaze.ts +12 -7
  25. package/storage/dist/ArchivesDisk.ts.cache +10 -6
  26. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  27. package/storage/dist/IArchives.ts.cache +5 -4
  28. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  29. package/storage/dist/JSONStorage.ts.cache +2 -2
  30. package/storage/dist/PendingManager.tsx.cache +2 -2
  31. package/storage/dist/TransactionStorage.ts.cache +2 -2
  32. package/storage/dist/backblaze.ts.cache +23 -6
  33. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  34. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  35. package/storage/remoteStorage/ArchivesRemote.ts +6 -1
  36. package/storage/remoteStorage/createArchives.ts +13 -3
  37. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
  38. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
  39. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  40. package/storage/remoteStorage/dist/blobStore.ts.cache +35 -14
  41. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  42. package/storage/remoteStorage/dist/createArchives.ts.cache +8 -5
  43. package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
  44. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  45. package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
  46. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
  47. package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
  48. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  49. package/storage/remoteStorage/dist/storageController.ts.cache +8 -5
  50. package/storage/remoteStorage/dist/storageServerState.ts.cache +27 -7
  51. package/storage/remoteStorage/storageServer.ts +0 -1
  52. package/yarn.lock +4 -4
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -198,4 +198,4 @@ function getStreamColumnIndex(keys, byKey, column) {
198
198
  // Per stream-reader cache of its column indexes. Keyed by the reader's byKey map (a fresh streamReaderFromEntries call produces a fresh map, so this is effectively per-reader).
199
199
  const columnIndexCache = new WeakMap();
200
200
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyZWFtTG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUEyQjtBQUMzQiw2REFBd0k7QUFFeEksdU1BQXVNO0FBQ3ZNLEdBQUc7QUFDSCwyREFBMkQ7QUFDM0QsR0FBRztBQUNILCtlQUErZTtBQUVsZSxRQUFBLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztBQUUxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLGdCQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFJakUsU0FBUyxLQUFLLENBQUMsT0FBZTtJQUMxQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELCtZQUErWTtBQUUvWSxvTUFBb007QUFDcE0sU0FBZ0IsU0FBUyxDQUFDLE9BQXlEO0lBQy9FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFGRCw4QkFFQztBQUVELFNBQWdCLFlBQVksQ0FBQyxPQUF3QztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcs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QztLQUNKLENBQUM7SUFDRixJQUFJLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUNsRixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxpTEFBaUw7QUFDakwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBa0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjYm9yeCBmcm9tIFwiY2Jvci14XCI7XG5pbXBvcnQgeyBBQlNFTlQsIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXIsIENvbHVtbkluZGV4LCBFTVBUWV9CVUZGRVIsIGVuY29kZVZhbHVlLCBSYXdDZWxsLCBUWVBFX0FCU0VOVF9UQUcgfSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VGb3JtYXRcIjtcblxuLy8gVGllci0wIHN0cmVhbWluZyBmb3JtYXQ6IGFuIGFwcGVuZCBsb2cgb2Ygd2hvbGUtcm93IHdyaXRlcyBhbmQgZGVsZXRlcyAocm93LWZvcm1hdCwgbm90IGNvbHVtbmFyKSwgc28gc21hbGwgbXV0YXRpb25zIGFyZSBhIHNpbmdsZSBjaGVhcCBhcHBlbmQgaW5zdGVhZCBvZiByZXdyaXRpbmcgYSBjb2x1bW5hciBmaWxlLiBFYWNoIGJsb2NrIGlzOlxuLy8gXG4vLyAgIFt1MzIgbGVuXVtDQk9SKHsgdCwgdiB9KSAgb3IgIENCT1IoeyB0LCBkIH0pXVt1MzIgbGVuXVxuLy8gXG4vLyBgdGAgaXMgYSBwZXItd3JpdGUgdW5pcXVlIHRpbWVzdGFtcCAoZ2V0VGltZVVuaXF1ZSk7IGB2YCBpcyBhIHNldCByb3c7IGBkYCBpcyBhIGRlbGV0ZWQga2V5LiBCZWNhdXNlIGV2ZXJ5IHRocmVhZCBzdHJlYW1zIHRvIGl0cyBvd24gZmlsZSwgdGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgdGhlIGdsb2JhbCBtdXRhdGlvbiBvcmRlciDigJQgbmVlZGVkIGZvciBuZXdlc3Qtd2lucyDigJQgaXMgYSBwZXItd3JpdGUgdGltZXN0YW1wLCB3aXRoIHRpZXMgYnJva2VuIGJ5IGZpbGUgbmFtZS4gVGhlIHRyYWlsaW5nIGxlbmd0aCBtdXN0IG1hdGNoIHRoZSBsZWFkaW5nIG9uZTsgYSB0b3JuL2luY29tcGxldGUgYXBwZW5kIGxlYXZlcyBhIG1pc21hdGNoZWQgb3IgbWlzc2luZyBzdWZmaXgsIHNvIHdlIHN0b3AgdGhlcmUgYW5kIHJlcG9ydCB0cmFpbGluZyBiYWQgYnl0ZXMgaW5zdGVhZCBvZiB0aHJvd2luZy4gc3RydWN0dXJlZENsb25lIHByZXNlcnZlcyB0eXBlZCBhcnJheXMuXG5cbmV4cG9ydCBjb25zdCBTVFJFQU1fRVhURU5TSU9OID0gXCIuc3RyZWFtXCI7XG5cbmNvbnN0IGNib3JFbmNvZGVyID0gbmV3IGNib3J4LkVuY29kZXIoeyBzdHJ1Y3R1cmVkQ2xvbmU6IHRydWUgfSk7XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUVudHJ5ID0geyB0aW1lOiBudW1iZXI7IHJvdz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBkZWxldGVkS2V5Pzogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIGZyYW1lKHBheWxvYWQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgbGV0IGxlbiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBsZW4ud3JpdGVVSW50MzJMRShwYXlsb2FkLmxlbmd0aCwgMCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2xlbiwgcGF5bG9hZCwgbGVuXSk7XG59XG5cbi8vIEZyYW1pbmcgb25seSDigJQgbm8gYmF0Y2hpbmcgaGVyZS4gQnVsa0RhdGFiYXNlMiBjb2FsZXNjZXMgYW5kIGZsdXNoZXMgdGhlc2UgZnJhbWVkIGJ5dGVzIG9uIGEgcmFtcGluZyBwZXItY29sbGVjdGlvbiBzY2hlZHVsZSAoc2VlIHN0cmVhbUFwcGVuZCBpbiBCdWxrRGF0YWJhc2VCYXNlKSwgYmVjYXVzZSB0aGUgYnJvd3NlciBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJIHJld3JpdGVzIHRoZSB3aG9sZSBmaWxlIG9uIGV2ZXJ5IGFwcGVuZCwgc28gb25lLWFwcGVuZC1wZXItd3JpdGUgaXMgcXVhZHJhdGljLiBUaGUgZmlyc3Qgd3JpdGUgYWZ0ZXIgYSBsdWxsIHN0aWxsIGZsdXNoZXMgaW1tZWRpYXRlbHksIHNvIGEgc2luZ2xlIGFjdGlvbiB0aGVuIGEgdGFiIGNsb3NlIGlzIHNhdmVkIGF0IG9uY2UuXG5cbi8vIFRpbWVzIGFyZSBhc3NpZ25lZCBieSB0aGUgY2FsbGVyIChCdWxrRGF0YWJhc2UyKSBzbyB0aGUgZXhhY3Qgc2FtZSB0aW1lc3RhbXAgbGFuZHMgb24gZGlzaywgaW4gdGhlIGluLW1lbW9yeSBvdmVybGF5LCBhbmQgaW4gdGhlIGNyb3NzLXRhYiBicm9hZGNhc3Qg4oCUIGtlZXBpbmcgdGhlIGdsb2JhbCB3cml0ZSBvcmRlciBjb25zaXN0ZW50LlxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1lUm93cyhlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9W10pOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGVudHJpZXMubWFwKGUgPT4gZnJhbWUoQnVmZmVyLmZyb20oY2JvckVuY29kZXIuZW5jb2RlKHsgdDogZS50aW1lLCB2OiBlLnJvdyB9KSkpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZURlbGV0ZXMoZW50cmllczogeyB0aW1lOiBudW1iZXI7IGtleTogc3RyaW5nIH1bXSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZW50cmllcy5tYXAoZSA9PiBmcmFtZShCdWZmZXIuZnJvbShjYm9yRW5jb2Rlci5lbmNvZGUoeyB0OiBlLnRpbWUsIGQ6IGUua2V5IH0pKSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogeyBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdOyBiYWRCeXRlczogbnVtYmVyIH0ge1xuICAgIGxldCBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgd2hpbGUgKHBvcyArIDQgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgbGVuID0gYnVmZmVyLnJlYWRVSW50MzJMRShwb3MpO1xuICAgICAgICBsZXQgcGF5bG9hZFN0YXJ0ID0gcG9zICsgNDtcbiAgICAgICAgbGV0IHN1ZmZpeFN0YXJ0ID0gcGF5bG9hZFN0YXJ0ICsgbGVuO1xuICAgICAgICBpZiAoc3VmZml4U3RhcnQgKyA0ID4gYnVmZmVyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIGlmIChidWZmZXIucmVhZFVJbnQzMkxFKHN1ZmZpeFN0YXJ0KSAhPT0gbGVuKSBicmVhaztcbiAgICAgICAgbGV0IGRlY29kZWQ6IHsgdDogbnVtYmVyOyB2PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlY29kZWQgPSBjYm9yRW5jb2Rlci5kZWNvZGUoYnVmZmVyLnN1YmFycmF5KHBheWxvYWRTdGFydCwgc3VmZml4U3RhcnQpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjb2RlZCAmJiBkZWNvZGVkLmQgIT09IHVuZGVmaW5lZCkgZW50cmllcy5wdXNoKHsgdGltZTogZGVjb2RlZC50LCBkZWxldGVkS2V5OiBkZWNvZGVkLmQgfSk7XG4gICAgICAgIGVsc2UgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC52KSBlbnRyaWVzLnB1c2goeyB0aW1lOiBkZWNvZGVkLnQsIHJvdzogZGVjb2RlZC52IH0pO1xuICAgICAgICBwb3MgPSBzdWZmaXhTdGFydCArIDQ7XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXMsIGJhZEJ5dGVzOiBidWZmZXIubGVuZ3RoIC0gcG9zIH07XG59XG5cbi8vIFdyYXBzIHN0cmVhbWVkIGVudHJpZXMgKGFscmVhZHkgb3JkZXJlZCBvbGRlc3QtZmlyc3QpIGFzIGEgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlci4gRWFjaCBzZXQgTUVSR0VTIGl0cyBmaWVsZHMgb250byB0aGUga2V5J3MgY3VycmVudCByb3cgKHNvIGEgcGFydGlhbCB3cml0ZS91cGRhdGUgb25seSBjaGFuZ2VzIHRoZSBjb2x1bW5zIGl0IGluY2x1ZGVzKTsgYSBkZWxldGUgdG9tYnN0b25lcyB0aGUga2V5IChleHBvc2VkIHZpYSBkZWxldGVkS2V5cyBzbyB0aGUgam9pbiBzdXBwcmVzc2VzIGl0IGluIG9sZGVyIGJ1bGsgcmVhZGVycykgYW5kIHJlc2V0cyB0aGUgbWVyZ2UuIEEgY29sdW1uIHRoZSBtZXJnZWQgcm93IG5ldmVyIHNldCByZWFkcyBhcyBBQlNFTlQsIHNvIHRoZSBqb2luIGZhbGxzIHRocm91Z2ggdG8gb2xkZXIgcmVhZGVycyBmb3IgaXQuIEFsc28gcmV0dXJucyB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBzZWVuIHBlciBrZXkgKGxpdmUgb3IgZGVsZXRlZCksIHVzZWQgZm9yIGNyb3NzLXRhYiBjb25mbGljdCByZXNvbHV0aW9uLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzKGVudHJpZXM6IFN0cmVhbUVudHJ5W10sIHRvdGFsQnl0ZXM6IG51bWJlcik6IHsgcmVhZGVyOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyOyB0aW1lczogTWFwPHN0cmluZywgbnVtYmVyPiB9IHtcbiAgICBsZXQgYnlLZXkgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gICAgbGV0IGRlbGV0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IHRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5kZWxldGVkS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJ5S2V5LmRlbGV0ZShlbnRyeS5kZWxldGVkS2V5KTtcbiAgICAgICAgICAgIGRlbGV0ZWRLZXlzLmFkZChlbnRyeS5kZWxldGVkS2V5KTtcbiAgICAgICAgICAgIHRpbWVzLnNldChlbnRyeS5kZWxldGVkS2V5LCBlbnRyeS50aW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5yb3cpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBlbnRyeS5yb3cua2V5IGFzIHN0cmluZztcbiAgICAgICAgICAgIGJ5S2V5LnNldChrZXksIHsgLi4uYnlLZXkuZ2V0KGtleSksIC4uLmVudHJ5LnJvdyB9KTtcbiAgICAgICAgICAgIGRlbGV0ZWRLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgdGltZXMuc2V0KGtleSwgZW50cnkudGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGtleXMgPSBbLi4uYnlLZXkua2V5cygpXTtcbiAgICBsZXQgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByb3cgb2YgYnlLZXkudmFsdWVzKCkpIHtcbiAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGZpZWxkKSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChmaWVsZCk7XG4gICAgICAgICAgICBjb2x1bW5OYW1lcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29sdW1ucyA9IGNvbHVtbk5hbWVzLm1hcChjb2x1bW4gPT4gKHsgY29sdW1uLCBieXRlU2l6ZTogMCB9KSk7XG4gICAgLy8gUGVyLWtleSB0b21ic3RvbmUgdGltZXMgZm9yIHRoZSBqb2luJ3MgZGVsZXRlIHJlc29sdXRpb24uXG4gICAgbGV0IGRlbGV0ZVRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgZGVsZXRlZEtleXMpIGRlbGV0ZVRpbWVzLnNldChrZXksIHRpbWVzLmdldChrZXkpIHx8IDApO1xuICAgIC8vIEl0ZXJhdGUgdG8gZmluZCBtaW4vbWF4IOKAlCBOT1QgTWF0aC5taW4oLi4udGltZXMpL01hdGgubWF4KC4uLnRpbWVzKTogc3ByZWFkaW5nIGEgbGFyZ2UgYXJyYXkgYXMgY2FsbCBhcmd1bWVudHMgb3ZlcmZsb3dzIHRoZSBzdGFjayAoXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiKSBvbmNlIGEgc3RyZWFtIGhhcyBtYW55IGtleXMuXG4gICAgbGV0IG1pblRpbWUgPSBJbmZpbml0eSwgbWF4VGltZSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCB0IG9mIHRpbWVzLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh0IDwgbWluVGltZSkgbWluVGltZSA9IHQ7XG4gICAgICAgIGlmICh0ID4gbWF4VGltZSkgbWF4VGltZSA9IHQ7XG4gICAgfVxuICAgIGNvbnN0IGtleUluZGV4TWFwID0gYnVpbGRLZXlJbmRleChrZXlzKTtcbiAgICBsZXQgcmVhZGVyOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyID0ge1xuICAgICAgICBuYW1lOiBcIihzdHJlYW1zKVwiLFxuICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICByb3dDb3VudDoga2V5cy5sZW5ndGgsXG4gICAgICAgIG1pblRpbWU6IHRpbWVzLnNpemUgPyBtaW5UaW1lIDogMCxcbiAgICAgICAgbWF4VGltZTogdGltZXMuc2l6ZSA/IG1heFRpbWUgOiAwLFxuICAgICAgICBrZXlzLFxuICAgICAgICBrZXlUaW1lczogbmV3IE1hcChrZXlzLm1hcChrZXkgPT4gW2tleSwgdGltZXMuZ2V0KGtleSkgfHwgMF0pKSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgZGVsZXRlVGltZXMsXG4gICAgICAgIC8vIEEga2V5J3MgdGltZSBpcyBpdHMgbGF0ZXN0IHdyaXRlIGFjcm9zcyBhbGwgY29sdW1ucyAocGVyLWtleSwgbm90IHBlci1jb2x1bW4pLiBGb3IgYSBjb2x1bW4gaXQgbmV2ZXIgc2V0IHdlIHJldHVybiBBQlNFTlQgc28gdGhlIGpvaW4gZmFsbHMgdGhyb3VnaCB0byBhbiBvbGRlciByZWFkZXIuXG4gICAgICAgIGFzeW5jIGdldENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBieUtleS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHZhbHVlOiByb3cgJiYgY29sdW1uIGluIHJvdyA/IHJvd1tjb2x1bW5dIDogQUJTRU5ULCB0aW1lOiB0aW1lcy5nZXQoa2V5KSB8fCAwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBieUtleS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICghcm93IHx8ICEoY29sdW1uIGluIHJvdykpIHJldHVybiBBQlNFTlQ7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcm93W2NvbHVtbl0sIHRpbWU6IHRpbWVzLmdldChrZXkpIHx8IDAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gU3RyZWFtIHZhbHVlcyBhcmUgZGVjb2RlZCBvYmplY3RzIChDQk9SKSwgc28gdW5saWtlIGEgYnVsayBmaWxlIHdlIGhhdmUgdG8gZW5jb2RlIHRoZW0gdG8gcmF3IGNlbGxzIGhlcmUuIFN0cmVhbSBkYXRhIGlzIHNtYWxsICh0aWVyLTAsIHNpemUtY2FwcGVkKSwgc28gdGhpcyBpcyBjaGVhcC4gQSBjb2x1bW4gdGhlIHJvdyBuZXZlciBzZXQgaXMgb21pdHRlZCAoQUJTRU5UIOKGkiBmYWxsIHRocm91Z2gpOyBhIHN0b3JlZCB1bmRlZmluZWQgaXMga2VwdCAoYSByZWFsIGNsZWFyKS5cbiAgICAgICAgYXN5bmMgZ2V0UmF3Q29sdW1uKGNvbHVtbikge1xuICAgICAgICAgICAgbGV0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSYXdDZWxsPigpO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93ID0gYnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3cgfHwgIShjb2x1bW4gaW4gcm93KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIGVuY29kZVZhbHVlKHJvd1tjb2x1bW5dKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LFxuICAgICAgICAvLyBQZXItY29sdW1uIGluZGV4IGluIHRoZSBzYW1lIHNoYXBlIGEgYnVsayBmaWxlIGV4cG9zZXMsIG1hdGVyaWFsaXplZCBpbiBtZW1vcnkgb25jZSAoc3RyZWFtIGRhdGEgaXMgdGllci0wLCBzaXplLWNhcHBlZCwgc28gdGhlIGVuY29kZSBpcyBjaGVhcCkuIExldHMgdGhlIHBsYW5uZWQgbWVyZ2UgdHJlYXQgc3RyZWFtICsgYnVsayBzb3VyY2VzIHVuaWZvcm1seTogaXQgbG9hZHMgZWFjaCAoc291cmNlLCBjb2x1bW4pIGluZGV4LCB1c2VzIG9mZnNldHMvdHlwZXMgdG8gcGxhbiB0aGUgb3V0cHV0J3MgYnl0ZSBsYXlvdXQsIGFuZCByZWFkcyBjb250aWd1b3VzIHJ1bnMgZnJvbSB0aGlzIGluZGV4J3MgaW4tbWVtb3J5IGRhdGEgYnVmZmVyIGR1cmluZyBleGVjdXRlLlxuICAgICAgICBhc3luYyBnZXRDb2x1bW5JbmRleChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRTdHJlYW1Db2x1bW5JbmRleChrZXlzLCBieUtleSwgY29sdW1uKTtcbiAgICAgICAgfSxcbiAgICAgICAgcm93T2ZLZXkoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5SW5kZXhNYXAuZ2V0KGtleSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4geyByZWFkZXIsIHRpbWVzIH07XG59XG5cbi8vIGtleXNbXSBpcyB0aGUgY29sdW1uLXNpZGUgcm93IG9yZGVyIGZvciB0aGlzIHN0cmVhbSByZWFkZXI7IHJvd09mS2V5IGlzIHVzZWQgYnkgdGhlIHBsYW5uZXIgdG8gbG9vayB1cCBhIHdpbm5pbmcgY2VsbCdzIHNvdXJjZSByb3cgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgY29sdW1uIHJlYWQuIFN0YXlzIGNvbnNpc3RlbnQgd2l0aCBnZXRDb2x1bW5JbmRleCwgd2hpY2ggYnVpbGRzIGl0cyBvZmZzZXRzL3R5cGVzIG92ZXIgdGhlIHNhbWUgYGtleXNgIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gYnVpbGRLZXlJbmRleChrZXlzOiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgbS5zZXQoa2V5c1tpXSwgaSk7XG4gICAgcmV0dXJuIG07XG59XG5cbi8vIEJ1aWxkIGEgc3RyZWFtLXNpZGUgQ29sdW1uSW5kZXggKG9mZnNldHMgKyB0eXBlcyArIGEgY29udGlndW91cy1yb3cgYnl0ZSBzbGljZXIpIG92ZXIgdGhlIGluLW1lbW9yeSBtZXJnZWQgcm93cy4gRW5jb2RlcyBlYWNoIHJvdydzIHZhbHVlIGZvciB0aGlzIGNvbHVtbiBvbmNlIGludG8gYSBzaW5nbGUgYmFja2luZyBidWZmZXI7IHJlYWRWYWx1ZUJ5dGVzIHRoZW4gc2xpY2VzIGl0LiBDYWNoZWQgcGVyIChyZWFkZXIsIGNvbHVtbikgc28gYSBtZXJnZSBwbGFubmluZyArIGV4ZWN1dGlvbiBwYXNzIGRvZXNuJ3QgcmUtZW5jb2RlLlxuZnVuY3Rpb24gZ2V0U3RyZWFtQ29sdW1uSW5kZXgoa2V5czogc3RyaW5nW10sIGJ5S2V5OiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sIGNvbHVtbjogc3RyaW5nKTogQ29sdW1uSW5kZXgge1xuICAgIGxldCBjYWNoZWQgPSBjb2x1bW5JbmRleENhY2hlLmdldChieUtleSk/LmdldChjb2x1bW4pO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShrZXlzLmxlbmd0aCArIDEpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFVpbnQ4QXJyYXkoa2V5cy5sZW5ndGgpO1xuICAgIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3cgPSBieUtleS5nZXQoa2V5c1tpXSk7XG4gICAgICAgIG9mZnNldHNbaV0gPSBwb3M7XG4gICAgICAgIGlmICghcm93IHx8ICEoY29sdW1uIGluIHJvdykpIHtcbiAgICAgICAgICAgIHR5cGVzW2ldID0gVFlQRV9BQlNFTlRfVEFHO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBieXRlcyB9ID0gZW5jb2RlVmFsdWUocm93W2NvbHVtbl0pO1xuICAgICAgICB0eXBlc1tpXSA9IHR5cGU7XG4gICAgICAgIHBhcnRzLnB1c2goYnl0ZXMpO1xuICAgICAgICBwb3MgKz0gYnl0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBvZmZzZXRzW2tleXMubGVuZ3RoXSA9IHBvcztcbiAgICBjb25zdCBkYXRhID0gcGFydHMubGVuZ3RoID8gQnVmZmVyLmNvbmNhdChwYXJ0cykgOiBFTVBUWV9CVUZGRVI7XG4gICAgY29uc3QgaWR4OiBDb2x1bW5JbmRleCA9IHtcbiAgICAgICAgb2Zmc2V0cyxcbiAgICAgICAgdHlwZXMsXG4gICAgICAgIGFzeW5jIHJlYWRWYWx1ZUJ5dGVzKHN0YXJ0Um93LCBlbmRSb3cpIHtcbiAgICAgICAgICAgIGlmIChlbmRSb3cgPD0gc3RhcnRSb3cpIHJldHVybiBFTVBUWV9CVUZGRVI7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IG9mZnNldHNbc3RhcnRSb3ddO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gb2Zmc2V0c1tlbmRSb3ddO1xuICAgICAgICAgICAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuIEVNUFRZX0JVRkZFUjtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgbGV0IHBlclJlYWRlciA9IGNvbHVtbkluZGV4Q2FjaGUuZ2V0KGJ5S2V5KTtcbiAgICBpZiAoIXBlclJlYWRlcikgeyBwZXJSZWFkZXIgPSBuZXcgTWFwKCk7IGNvbHVtbkluZGV4Q2FjaGUuc2V0KGJ5S2V5LCBwZXJSZWFkZXIpOyB9XG4gICAgcGVyUmVhZGVyLnNldChjb2x1bW4sIGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbn1cblxuLy8gUGVyIHN0cmVhbS1yZWFkZXIgY2FjaGUgb2YgaXRzIGNvbHVtbiBpbmRleGVzLiBLZXllZCBieSB0aGUgcmVhZGVyJ3MgYnlLZXkgbWFwIChhIGZyZXNoIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzIGNhbGwgcHJvZHVjZXMgYSBmcmVzaCBtYXAsIHNvIHRoaXMgaXMgZWZmZWN0aXZlbHkgcGVyLXJlYWRlcikuXG5jb25zdCBjb2x1bW5JbmRleENhY2hlID0gbmV3IFdlYWtNYXA8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCBNYXA8c3RyaW5nLCBDb2x1bW5JbmRleD4+KCk7XG4iXX0=
201
- /* _JS_SOURCE_HASH = "f675b4e03d8c41b4d0592b51bf6e9faf7386637c92404dc39863a0eb37f8693c"; */
201
+ /* _JS_SOURCE_HASH = "efc43db21e50b2804f6d23b6c8b9202622e7616e222981c9cb612fd3ed580fd5"; */
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  // Browser-side cross-tab write sync for BulkDatabase2, over BroadcastChannel (one channel per collection, same-origin tabs and workers). It does NOT persist anything — each side writes to disk itself; this just relays live writes to other open tabs/workers and, when one starts up, asks peers for writes they've made recently that may not be on disk yet. No-op in Node / where BroadcastChannel is unavailable, so BulkDatabase2 can call these unconditionally. This is an optional feature, so there is no fallback.
3
3
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
4
4
  //exports.broadcastSeal = exports.broadcast = exports.connect = exports.isSyncSupported = void 0;
@@ -85,4 +85,4 @@ function broadcastSeal(collection) {
85
85
  }
86
86
  exports.broadcastSeal = broadcastSeal;
87
87
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY0NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN5bmNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGlnQkFBaWdCOzs7QUFJamdCLHFMQUFxTDtBQUNyTCxNQUFNLGdCQUFnQixHQUFHLEtBQU0sQ0FBQztBQVdoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUU1QyxTQUFnQixlQUFlO0lBQzNCLHNMQUFzTDtJQUN0TCxJQUFJLGlCQUFpQixHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVc7V0FDOUMsbUJBQW1CLElBQUksVUFBVSxDQUFDO0lBQ3pDLE9BQU8saUJBQWlCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxXQUFXLENBQUM7QUFDeEUsQ0FBQztBQUxELDBDQUtDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDO0lBQzdDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxPQUFnQixFQUFFLEtBQWtCO0lBQ2pELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVc7UUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFVBQWtCO0lBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN6QyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzVCLGtKQUFrSjtJQUNsSixNQUFNLEVBQUUs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TSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTztJQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEJyb3dzZXItc2lkZSBjcm9zcy10YWIgd3JpdGUgc3luYyBmb3IgQnVsa0RhdGFiYXNlMiwgb3ZlciBCcm9hZGNhc3RDaGFubmVsIChvbmUgY2hhbm5lbCBwZXIgY29sbGVjdGlvbiwgc2FtZS1vcmlnaW4gdGFicyBhbmQgd29ya2VycykuIEl0IGRvZXMgTk9UIHBlcnNpc3QgYW55dGhpbmcg4oCUIGVhY2ggc2lkZSB3cml0ZXMgdG8gZGlzayBpdHNlbGY7IHRoaXMganVzdCByZWxheXMgbGl2ZSB3cml0ZXMgdG8gb3RoZXIgb3BlbiB0YWJzL3dvcmtlcnMgYW5kLCB3aGVuIG9uZSBzdGFydHMgdXAsIGFza3MgcGVlcnMgZm9yIHdyaXRlcyB0aGV5J3ZlIG1hZGUgcmVjZW50bHkgdGhhdCBtYXkgbm90IGJlIG9uIGRpc2sgeWV0LiBOby1vcCBpbiBOb2RlIC8gd2hlcmUgQnJvYWRjYXN0Q2hhbm5lbCBpcyB1bmF2YWlsYWJsZSwgc28gQnVsa0RhdGFiYXNlMiBjYW4gY2FsbCB0aGVzZSB1bmNvbmRpdGlvbmFsbHkuIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgc28gdGhlcmUgaXMgbm8gZmFsbGJhY2suXG5cbmV4cG9ydCB0eXBlIFJlbW90ZVdyaXRlID0geyBrZXk6IHN0cmluZzsgdGltZTogbnVtYmVyOyBkZWxldGVkPzogYm9vbGVhbjsgdmFsdWU/OiB1bmtub3duIH07XG5cbi8vIFdyaXRlcyBvbGRlciB0aGFuIHRoaXMgYXJlIGFzc3VtZWQgYWxyZWFkeSBmbHVzaGVkIHRvIGRpc2sgKGEgZnJlc2hseS1vcGVuZWQgdGFiIGdldHMgdGhvc2UgYnkgcmVhZGluZyBkaXNrKSwgc28gYSB0YWIgb25seSByZXBsYXlzIHdyaXRlcyBuZXdlciB0aGFuIHRoaXMgd2hlbiBhIHBlZXIgc2F5cyBoZWxsby5cbmNvbnN0IFJFQ0VOVF9XSU5ET1dfTVMgPSA2MF8wMDA7XG5cbnR5cGUgQ2hhbm5lbCA9IHtcbiAgICBiYzogQnJvYWRjYXN0Q2hhbm5lbDtcbiAgICBzdWJzY3JpYmVyczogKCh3cml0ZTogUmVtb3RlV3JpdGUpID0+IHZvaWQpW107XG4gICAgLy8gQ2FsbGVkIHdoZW4gYSBwZWVyIGFza3MgZXZlcnlvbmUgdG8gc2VhbCAoc3RvcCBhcHBlbmRpbmcgdG8pIHRoZWlyIGN1cnJlbnQgc3RyZWFtIGZpbGUuXG4gICAgc2VhbFN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbiAgICAvLyBUaGlzIHRhYidzIG93biByZWNlbnQgd3JpdGVzLCBrZXB0IHNvIGl0IGNhbiBhbnN3ZXIgYW5vdGhlciB0YWIncyBcImhlbGxvXCIuXG4gICAgcmVjZW50OiBSZW1vdGVXcml0ZVtdO1xufTtcblxuY29uc3QgY2hhbm5lbHMgPSBuZXcgTWFwPHN0cmluZywgQ2hhbm5lbD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3luY1N1cHBvcnRlZCgpOiBib29sZWFuIHtcbiAgICAvLyB3aW5kb3cgKG1haW4tdGhyZWFkIGJyb3dzZXIpIG9yIFdvcmtlckdsb2JhbFNjb3BlIChXZWIvU2VydmljZS9TaGFyZWQgd29ya2VyKSDigJQgYnV0IG5vdCBOb2RlICh0eXBlc2FmZWNzcydzIGlzTm9kZSBpcyBgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcImAsIHdoaWNoIG1pc2NsYXNzaWZpZXMgd29ya2VycylcbiAgICBsZXQgaXNCcm93c2VyT3JXb3JrZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIHx8IFwiV29ya2VyR2xvYmFsU2NvcGVcIiBpbiBnbG9iYWxUaGlzO1xuICAgIHJldHVybiBpc0Jyb3dzZXJPcldvcmtlciAmJiB0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVSZWNlbnQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNvbnN0IGN1dG9mZiA9IERhdGUubm93KCkgLSBSRUNFTlRfV0lORE9XX01TO1xuICAgIGNoYW5uZWwucmVjZW50ID0gY2hhbm5lbC5yZWNlbnQuZmlsdGVyKHcgPT4gdy50aW1lID49IGN1dG9mZik7XG59XG5cbmZ1bmN0aW9uIGRlbGl2ZXIoY2hhbm5lbDogQ2hhbm5lbCwgd3JpdGU6IFJlbW90ZVdyaXRlKSB7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgY2hhbm5lbC5zdWJzY3JpYmVycykgc3ViKHdyaXRlKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlKGNvbGxlY3Rpb246IHN0cmluZyk6IENoYW5uZWwgfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNTeW5jU3VwcG9ydGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGNoYW5uZWwgPSBjaGFubmVscy5nZXQoY29sbGVjdGlvbik7XG4gICAgaWYgKGNoYW5uZWwpIHJldHVybiBjaGFubmVsO1xuICAgIC8vIEJyb2FkY2FzdENoYW5uZWwgbmV2ZXIgZGVsaXZlcnMgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGluc3RhbmNlIHRoYXQgc2VudCBpdCwgc28gYSB0YWIgbmV2ZXIgaGVhcnMgaXRzIG93biB3cml0ZXMg4oCUIG9ubHkgdGhlIG90aGVyIG9wZW4gdGFicyBkby5cbiAgICBjb25zdCBiYyA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKGBidWxrRGF0YWJhc2UyOiR7Y29sbGVjdGlvbn1gKTtcbiAgICBjb25zdCBjcmVhdGVkOiBDaGFubmVsID0geyBiYywgc3Vic2NyaWJlcnM6IFtdLCBzZWFsU3Vic2NyaWJlcnM6IFtdLCByZWNlbnQ6IFtdIH07XG4gICAgYmMub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gZXZlbnQuZGF0YSBhcyB7IHR5cGU6IHN0cmluZzsgd3JpdGU/OiBSZW1vdGVXcml0ZTsgd3JpdGVzPzogUmVtb3RlV3JpdGVbXSB9O1xuICAgICAgICBpZiAoIW1zZykgcmV0dXJuO1xuICAgICAgICBpZiAobXNnLnR5cGUgPT09IFwid3JpdGVcIiAmJiBtc2cud3JpdGUpIHtcbiAgICAgICAgICAgIGRlbGl2ZXIoY3JlYXRlZCwgbXNnLndyaXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJyZWNlbnRcIiAmJiBtc2cud3JpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHdyaXRlIG9mIG1zZy53cml0ZXMpIGRlbGl2ZXIoY3JlYXRlZCwgd3JpdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09PSBcInNlYWxcIikge1xuICAgICAgICAgICAgLy8gQSBwZWVyIGlzIGFib3V0IHRvIGZvbGQgcmVjZW50IGRhdGE7IHN0b3AgYXBwZW5kaW5nIHRvIG91ciBjdXJyZW50IHN0cmVhbSBmaWxlIHNvIGl0IGJlY29tZXMgY29tcGxldGUgYW5kIHRoZSBtZXJnZSBjYW4gZm9sZCBpdCB3aG9sZS4gT3VyIG5leHQgd3JpdGUgc3RhcnRzIGEgZnJlc2ggZmlsZS5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGNyZWF0ZWQuc2VhbFN1YnNjcmliZXJzKSBzdWIoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJoZWxsb1wiKSB7XG4gICAgICAgICAgICAvLyBBbm90aGVyIHRhYiBqdXN0IHN0YXJ0ZWQ7IHJlcGxheSBvdXIgcmVjZW50IHdyaXRlcyBzbyBpdCBkb2Vzbid0IG1pc3MgYW55LiBUaGUgcmVwbHkgZ29lcyB0byBldmVyeSB0YWIsIGJ1dCBwZWVycyB0aGF0IGFscmVhZHkgaGF2ZSBhIHdyaXRlIGlnbm9yZSBpdCAoaXRzIHRpbWVzdGFtcCBpc24ndCBuZXdlciB0aGFuIHdoYXQgdGhleSBob2xkKSwgc28gdGhlIHJlZHVuZGFudCBicm9hZGNhc3QgaXMgaGFybWxlc3MuXG4gICAgICAgICAgICBwcnVuZVJlY2VudChjcmVhdGVkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVkLnJlY2VudC5sZW5ndGgpIGNyZWF0ZWQuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcInJlY2VudFwiLCB3cml0ZXM6IGNyZWF0ZWQucmVjZW50IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjaGFubmVscy5zZXQoY29sbGVjdGlvbiwgY3JlYXRlZCk7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG59XG5cbi8vIFN1YnNjcmliZSB0byByZW1vdGUgd3JpdGVzIGZvciBhIGNvbGxlY3Rpb24uIFJlY2VudCB3cml0ZXMgZnJvbSBhbHJlYWR5LW9wZW4gdGFicyBhcnJpdmUgdGhyb3VnaCB0aGUgc2FtZSBvbldyaXRlIGNhbGxiYWNrIChhcyB0aGUgcmVwbHkgdG8gb3VyIGhlbGxvKSwgc28gdGhlIHJldHVybmVkIGFycmF5IGlzIGFsd2F5cyBlbXB0eSDigJQgaXQncyBrZXB0IG9ubHkgZm9yIEFQSSBjb21wYXRpYmlsaXR5IHdpdGggY2FsbGVycyB0aGF0IGF3YWl0IGl0LlxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3QoY29sbGVjdGlvbjogc3RyaW5nLCBvbldyaXRlOiAod3JpdGU6IFJlbW90ZVdyaXRlKSA9PiB2b2lkLCBvblNlYWw/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTxSZW1vdGVXcml0ZVtdPiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGVuc3VyZShjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgIGNoYW5uZWwuc3Vic2NyaWJlcnMucHVzaChvbldyaXRlKTtcbiAgICBpZiAob25TZWFsKSBjaGFubmVsLnNlYWxTdWJzY3JpYmVycy5wdXNoKG9uU2VhbCk7XG4gICAgY2hhbm5lbC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwiaGVsbG9cIiB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyb2FkY2FzdChjb2xsZWN0aW9uOiBzdHJpbmcsIHdyaXRlOiBSZW1vdGVXcml0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBlbnN1cmUoY29sbGVjdGlvbik7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm47XG4gICAgY2hhbm5lbC5yZWNlbnQucHVzaCh3cml0ZSk7XG4gICAgcHJ1bmVSZWNlbnQoY2hhbm5lbCk7XG4gICAgY2hhbm5lbC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwid3JpdGVcIiwgd3JpdGUgfSk7XG59XG5cbi8vIEFzayBldmVyeSBvdGhlciBvcGVuIHRhYiBvZiB0aGlzIGNvbGxlY3Rpb24gdG8gc2VhbCAoc3RvcCBhcHBlbmRpbmcgdG8pIGl0cyBjdXJyZW50IHN0cmVhbSBmaWxlLCBzbyBhIG1lcmdlIGNhbiBmb2xkIHJlY2VudCBkYXRhIHVwIHRvIHRoZSBwcmVzZW50IHdpdGhvdXQgcmFjaW5nIGFuIGFwcGVuZC4gQmVzdC1lZmZvcnQ6IG5vLW9wIGluIE5vZGUsIGFuZCBhIHBlZXIgdGhhdCBtaXNzZXMgaXQganVzdCBrZWVwcyBhcHBlbmRpbmcg4oCUIHdvcnN0IGNhc2UgdGhlIG1lcmdlIGZvbGRzIGEgcHJlZml4IGFuZCB0aGUgcmVzdCBmb2xkcyBsYXRlciAoZHVwbGljYXRpb24sIHJlc29sdmVkIGJ5IHdyaXRlLXRpbWUpLCBuZXZlciBkYXRhIGxvc3MuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0U2VhbChjb2xsZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gZW5zdXJlKGNvbGxlY3Rpb24pO1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuICAgIGNoYW5uZWwuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcInNlYWxcIiB9KTtcbn1cbiJdfQ==
88
- /* _JS_SOURCE_HASH = "cdc761db7ccaac86e5229f930d16f0ed0ba5fca698c49d5e370e5c3c12b596d4"; */
88
+ /* _JS_SOURCE_HASH = "c3aed40d112d1e5210b8ee9a02d667a1c8f1331f529823f55959039b68084cfd"; */
@@ -128,6 +128,9 @@ export declare const STORAGE_WRONG_ROUTE = "REMOTE_STORAGE_WRONG_ROUTE_c94d2e17"
128
128
  export declare const FULL_ROUTE: [number, number];
129
129
  export declare const VARIABLE_SHARD = "VARIABLE_SHARD_f0234jfah08fgyhfgyssdds83nmp";
130
130
  export declare function windowAcceptsWrites(validWindow: [number, number] | undefined): boolean;
131
+ export declare const LARGE_SET_THRESHOLD: number;
132
+ /** A getNextData stream over an in-memory buffer, in LARGE_SET_THRESHOLD slices - how set transparently becomes setLargeFile for large buffers. */
133
+ export declare function bufferChunkStream(data: Buffer): () => Promise<Buffer | undefined>;
131
134
  /** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. size/writeTime usually come from the caller's metadata scan; when either is omitted, getInfo fills them in. Returns the copied file's info, or undefined when the source doesn't have the file. */
132
135
  export declare function copyArchiveFile(config: {
133
136
  from: IArchives;
@@ -196,7 +199,7 @@ export interface IArchives {
196
199
  */
197
200
  set(fileName: string, data: Buffer, config?: SetConfig): Promise<string>;
198
201
  del(fileName: string, config?: DelConfig): Promise<void>;
199
- /** Streams a file too large to hold in memory. getNextData returns undefined when done. lastModified stamps the finished file like set's (synchronized copies need it to keep write ordering); backends that stamp their own times (backblaze) accept and ignore it. THROWS when the stream produces no data at all - same rule as set: an empty file IS a deletion and would read back as missing. */
202
+ /** Streams a file too large to hold in memory. getNextData returns undefined when done. This only needs to be called when you CANNOT materialize the entire file in memory - if you can, just call set: above LARGE_SET_THRESHOLD it streams through setLargeFile internally, keeping the client responsive and not overwhelming the server. lastModified stamps the finished file like set's (synchronized copies need it to keep write ordering); backends that stamp their own times (backblaze) accept and ignore it. THROWS when the stream produces no data at all - same rule as set: an empty file IS a deletion and would read back as missing. */
200
203
  setLargeFile(config: {
201
204
  path: string;
202
205
  lastModified?: number;
@@ -191,6 +191,20 @@ export function windowAcceptsWrites(validWindow: [number, number] | undefined):
191
191
  const LARGE_COPY_THRESHOLD = 64 * 1024 * 1024;
192
192
  const LARGE_COPY_CHUNK = 32 * 1024 * 1024;
193
193
 
194
+ // Above this, set transparently streams through setLargeFile: one giant wire message would exceed the transport limit and lag every other client sharing the connection
195
+ export const LARGE_SET_THRESHOLD = 8 * 1024 * 1024;
196
+
197
+ /** A getNextData stream over an in-memory buffer, in LARGE_SET_THRESHOLD slices - how set transparently becomes setLargeFile for large buffers. */
198
+ export function bufferChunkStream(data: Buffer): () => Promise<Buffer | undefined> {
199
+ let offset = 0;
200
+ return async () => {
201
+ if (offset >= data.length) return undefined;
202
+ let chunk = data.subarray(offset, offset + LARGE_SET_THRESHOLD);
203
+ offset += chunk.length;
204
+ return chunk;
205
+ };
206
+ }
207
+
194
208
  /** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. size/writeTime usually come from the caller's metadata scan; when either is omitted, getInfo fills them in. Returns the copied file's info, or undefined when the source doesn't have the file. */
195
209
  export async function copyArchiveFile(config: {
196
210
  from: IArchives;
@@ -287,7 +301,7 @@ export interface IArchives {
287
301
  */
288
302
  set(fileName: string, data: Buffer, config?: SetConfig): Promise<string>;
289
303
  del(fileName: string, config?: DelConfig): Promise<void>;
290
- /** Streams a file too large to hold in memory. getNextData returns undefined when done. lastModified stamps the finished file like set's (synchronized copies need it to keep write ordering); backends that stamp their own times (backblaze) accept and ignore it. THROWS when the stream produces no data at all - same rule as set: an empty file IS a deletion and would read back as missing. */
304
+ /** Streams a file too large to hold in memory. getNextData returns undefined when done. This only needs to be called when you CANNOT materialize the entire file in memory - if you can, just call set: above LARGE_SET_THRESHOLD it streams through setLargeFile internally, keeping the client responsive and not overwhelming the server. lastModified stamps the finished file like set's (synchronized copies need it to keep write ordering); backends that stamp their own times (backblaze) accept and ignore it. THROWS when the stream produces no data at all - same rule as set: an empty file IS a deletion and would read back as missing. */
291
305
  setLargeFile(config: { path: string; lastModified?: number; getNextData(): Promise<Buffer | undefined> }): Promise<void>;
292
306
  /** writeTime is the last-write time — see ArchiveFileInfo.createTime, which is the same value. url as in get2. Size-0 entries (tombstones) report undefined unless config.includeTombstones. */
293
307
  getInfo(fileName: string, config?: GetInfoConfig): Promise<{ writeTime: number; size: number; url?: string } | undefined>;
@@ -9,7 +9,7 @@ import debugbreak from "debugbreak";
9
9
  import dns from "dns";
10
10
  import { getSecret } from "../misc/getSecret";
11
11
  import { httpsRequest, HttpsResponseInfo } from "socket-function/src/https";
12
- import { IArchives, ArchivesConfig, ChangesAfterConfig, ArchiveFileInfo, DelConfig, GetConfig, GetInfoConfig, SetConfig, assertValidLastModified, IMMUTABLE_CACHE_TIME } from "./IArchives";
12
+ import { IArchives, ArchivesConfig, ChangesAfterConfig, ArchiveFileInfo, DelConfig, GetConfig, GetInfoConfig, SetConfig, assertValidLastModified, bufferChunkStream, IMMUTABLE_CACHE_TIME } from "./IArchives";
13
13
  import { filterChanges } from "./remoteStorage/remoteConfig";
14
14
 
15
15
  type BackblazeCreds = {
@@ -27,6 +27,8 @@ let backblazeCreds = lazy(async (): Promise<BackblazeCreds> => {
27
27
  });
28
28
  // B2's minimum maxAgeSeconds is 60 - anything lower gets bumped to 60 server-side, so a smaller default would never match what the bucket actually stores and we would rewrite its settings on every startup
29
29
  const MIN_BUCKET_CACHE_TIME = 60 * 1000;
30
+ // Backblaze requires 5MB chunks for large files, but larger is more efficient for us (and their "last part" size check misbehaves on retries, which chunks this big sidestep - see setLargeFile)
31
+ const LARGE_FILE_MIN_CHUNK_SIZE = 32 * 1024 * 1024;
30
32
 
31
33
  // A B2 download/HEAD response's headers carry the file's metadata. content-range's total wins over content-length for ranged responses (which only report the slice's length).
32
34
  function parseFileMetadataHeaders(response: HttpsResponseInfo): { size: number; uploadTimestamp: number } {
@@ -720,6 +722,11 @@ export class ArchivesBackblaze implements IArchives {
720
722
  if (existing && config.forceSetImmutable && this.config.immutable) return fileName;
721
723
  }
722
724
  }
725
+ // Big buffers stream through the large-file API: a failed part retries alone instead of restarting the whole upload. The threshold MUST stay at two full chunks - below that setLargeFile falls back to plain set, which would recurse right back here.
726
+ if (data.length >= LARGE_FILE_MIN_CHUNK_SIZE * 2) {
727
+ await this.setLargeFile({ path: fileName, lastModified: config?.lastModified, getNextData: bufferChunkStream(data) });
728
+ return fileName;
729
+ }
723
730
  this.log(`backblaze upload (${formatNumber(data.length)}B) ${fileName}`);
724
731
  let f = fileName;
725
732
  await this.apiRetryLogic(`uploadFile ${fileName}`, async (api) => {
@@ -772,15 +779,13 @@ export class ArchivesBackblaze implements IArchives {
772
779
  let time = Date.now();
773
780
  try {
774
781
  let { path } = config;
775
- // Backblaze requires 5MB chunks. But, larger is more efficient for us.
776
- const MIN_CHUNK_SIZE = 32 * 1024 * 1024;
777
782
  let dataQueue: Buffer[] = [];
778
783
  async function getNextData(): Promise<Buffer | undefined> {
779
784
  if (dataQueue.length) return dataQueue.shift();
780
785
  // Get buffers until we get 5MB, OR, end. Backblaze requires this for large files.
781
786
  let totalBytes = 0;
782
787
  let buffers: Buffer[] = [];
783
- while (totalBytes < MIN_CHUNK_SIZE) {
788
+ while (totalBytes < LARGE_FILE_MIN_CHUNK_SIZE) {
784
789
  let data = await config.getNextData();
785
790
  if (!data) break;
786
791
  totalBytes += data.length;
@@ -796,7 +801,7 @@ export class ArchivesBackblaze implements IArchives {
796
801
  throw new Error(`setLargeFile produced no data for ${JSON.stringify(config.path)} on ${this.getDebugName()}: an empty file IS a deletion in this system - call del to delete, never write empty files`);
797
802
  }
798
803
  // Backblaze disallows overly small files
799
- if (data.length < MIN_CHUNK_SIZE) {
804
+ if (data.length < LARGE_FILE_MIN_CHUNK_SIZE) {
800
805
  await this.set(fileName, data);
801
806
  return;
802
807
  }
@@ -807,7 +812,7 @@ export class ArchivesBackblaze implements IArchives {
807
812
  return;
808
813
  }
809
814
  // ALSO, if there are two chunks, but one is too small, combine it. This helps allow us never send small chunks.
810
- if (secondData.length < MIN_CHUNK_SIZE) {
815
+ if (secondData.length < LARGE_FILE_MIN_CHUNK_SIZE) {
811
816
  await this.set(fileName, Buffer.concat([data, secondData]));
812
817
  return;
813
818
  }
@@ -842,7 +847,7 @@ export class ArchivesBackblaze implements IArchives {
842
847
  if (partSha1Array.length > 0) {
843
848
  let maybeLastData = await getNextData();
844
849
  if (maybeLastData) {
845
- if (maybeLastData.length < MIN_CHUNK_SIZE) {
850
+ if (maybeLastData.length < LARGE_FILE_MIN_CHUNK_SIZE) {
846
851
  // It's the last one, so consume it now
847
852
  data = Buffer.concat([data, maybeLastData]);
848
853
  } else {
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -138,6 +138,9 @@ class ArchivesDisk {
138
138
  }
139
139
  // forceSetImmutable is accepted and needs no handling: disk sources are never immutable, and the older-write no-op below already gives synchronization its only-take-the-latest semantics
140
140
  async set(key, data, config) {
141
+ if (!data.length) {
142
+ throw new Error(`set was called with an empty buffer for ${JSON.stringify(key)} on ${this.getDebugName()}: an empty file IS a deletion in this system and would read back as missing - call del instead`);
143
+ }
141
144
  await this.init();
142
145
  let lastModified = config === null || config === void 0 ? void 0 : config.lastModified;
143
146
  if (lastModified) {
@@ -161,7 +164,8 @@ class ArchivesDisk {
161
164
  });
162
165
  return key;
163
166
  }
164
- async del(key) {
167
+ // config is accepted and ignored: a disk deletion is a physical remove (no tombstone to stamp - BlobStore's index carries the tombstone for disk sources)
168
+ async del(key, config) {
165
169
  await this.init();
166
170
  let filePath = this.filePath(key);
167
171
  await this.handles.run(filePath, async () => {
@@ -316,8 +320,8 @@ class ArchivesDisk {
316
320
  catch (e) {
317
321
  if (e.code !== "ENOENT")
318
322
  throw e;
319
- // Nothing was ever appended, so the upload file was never created
320
- await fs_1.default.promises.writeFile(filePath, Buffer.alloc(0));
323
+ // Either nothing was ever appended, or the temp file was destroyed under us - both must fail loudly. Materializing an empty file here (the old behavior) silently turned the upload into a DELETION, since an empty file IS a missing file in this system.
324
+ throw new Error(`Large upload of ${JSON.stringify(key)} has no data: the upload temp file ${tmpPath} does not exist. Either no data was ever appended (empty files are forbidden - they read back as deletions; use del to delete) or the temp file was removed while the upload was running.`);
321
325
  }
322
326
  // The rename preserves the temp file's mtime, which is just when the last append happened - the logical write time has to be stamped explicitly (it is the metadata scans order everything by)
323
327
  if (lastModified) {
@@ -383,5 +387,5 @@ function applyFindInfoShape(files, prefix, config) {
383
387
  return files;
384
388
  }
385
389
  exports.applyFindInfoShape = applyFindInfoShape;
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQTJKO0FBQzNKLCtEQUE2RDtBQUU3RCw0YkFBNGI7QUFFNWIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4Qyw2UEFBNlA7QUFDN1AsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBUXJELDhjQUE4YztBQUM5YyxNQUFNLGVBQWU7SUFNakI7UUFMUSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDakQsMERBQTBEO1FBQ2xELFFBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUcvQyxJQUFBLDBCQUFlLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxHQUFHLENBQUksUUFBZ0IsRUFBRSxHQUFxQjtRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FB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QUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQXJCRCxnREFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzb3J0LCBiaW5hcnlTZWFyY2hCYXNpYyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIFNldENvbmZpZywgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGZpbHRlckNoYW5nZXMgfSBmcm9tIFwiLi9yZW1vdGVTdG9yYWdlL3JlbW90ZUNvbmZpZ1wiO1xuXG4vLyBUaGUgYmFzZSBmaWxlLXN5c3RlbSBJQXJjaGl2ZXM6IHN0b3JhZ2UgaXMgb25lLXRvLW9uZSB3aXRoIHRoZSBmaWxlIHN5c3RlbSwgZXZlcnkga2V5IGlzIGV4YWN0bHkgb25lIHJlYWwgZmlsZSB1bmRlciA8Zm9sZGVyPi9maWxlcywgc28gdGhlIGZpbGUgc3lzdGVtIGl0c2VsZiBpcyB0aGUgaW5kZXguIEZpbGUgaGFuZGxlcyBhcmUgY2FjaGVkIGFuZCByZXVzZWQsIGFuZCBjbG9zZWQgb25jZSBpZGxlIChzZWUgRmlsZUhhbmRsZUNhY2hlKS4gQWxsIG9wZXJhdGlvbnMgb24gYSBmaWxlIHJ1biBpbiBzZXJpYWwsIHNvIHRoZXkgY2FuJ3QgY29sbGlkZSB3aXRoIGVhY2ggb3RoZXIgb3Igd2l0aCBoYW5kbGUgY2xvc2luZy4gVXNlZCBhcyB0aGUgZGlzayBzeW5jaHJvbml6YXRpb24gc291cmNlIG9mIEJsb2JTdG9yZSAoc2VlIHJlbW90ZVN0b3JhZ2UvYmxvYlN0b3JlLnRzKS5cblxuY29uc3QgSEFORExFX0lETEVfVElNRU9VVCA9IDEwMDAgKiA2MDtcbmNvbnN0IEhBTkRMRV9TV0VFUF9JTlRFUlZBTCA9IDEwMDAgKiAxNTtcbi8vIFVwbG9hZCB0ZW1wIGZpbGVzIGFyZSBvbmx5IGdhcmJhZ2Ugb25jZSB0aGV5IGFyZSBjbGVhcmx5IGFiYW5kb25lZC4gQW5vdGhlciBwcm9jZXNzIGNhbiBzaGFyZSBvdXIgZm9sZGVyIChldmVyeSBkZXBsb3kgb3ZlcmxhcCBkb2VzKSwgc28gYSBmcmVzaCB0ZW1wIGZpbGUgbWF5IGJlIElUUyBpbi1wcm9ncmVzcyB1cGxvYWQgLSBkZWxldGluZyBpdCB3b3VsZCBzaWxlbnRseSB0dXJuIHRoYXQgdXBsb2FkIGludG8gYW4gZW1wdHkgZmlsZS5cbmNvbnN0IFVQTE9BRF9BQkFORE9ORURfQUdFID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDM7XG5cbnR5cGUgSGFuZGxlRW50cnkgPSB7XG4gICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICBoYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgbGFzdFVzZTogbnVtYmVyO1xufTtcblxuLy8gQ2FjaGVzIG9wZW4gZmlsZSBoYW5kbGVzLCBjbG9zaW5nIHRoZW0gb25jZSBpZGxlIGZvciBIQU5ETEVfSURMRV9USU1FT1VULiBJbnN0ZWFkIG9mIG9uZSBzZXRUaW1lb3V0IHBlciBoYW5kbGUsIGEgbGlzdCBzb3J0ZWQgYnkgbGFzdCB1c2UgaXMgc3dlcHQgcGVyaW9kaWNhbGx5IChlbnRyaWVzIGFyZSBtb3ZlZCB2aWEgYmluYXJ5IHNlYXJjaCBvbiBhY2Nlc3MsIGFuZCBsYXN0VXNlIHZhbHVlcyBvbmx5IGluY3JlYXNlLCBzbyB0b3VjaGVkIGVudHJpZXMgYXBwZW5kIGF0IHRoZSBlbmQpLiBBbHNvIHNlcmlhbGl6ZXMgb3BlcmF0aW9ucyBwZXIgZmlsZTogZWFjaCBvcGVyYXRpb24gb25seSBzdGFydHMgb25jZSB0aGUgcHJldmlvdXMgb25lIG9uIHRoZSBzYW1lIGZpbGUgZmluaXNoZWQsIGFuZCBhIGhhbmRsZSBpcyBuZXZlciBjbG9zZWQgd2hpbGUgYW4gb3BlcmF0aW9uIGlzIHBlbmRpbmcgb24gaXQuXG5jbGFzcyBGaWxlSGFuZGxlQ2FjaGUge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVFbnRyeT4oKTtcbiAgICAvLyBTb3J0ZWQgYnkgbGFzdFVzZSBhc2NlbmRpbmcgKGxlYXN0IHJlY2VudGx5IHVzZWQgZmlyc3QpXG4gICAgcHJpdmF0ZSBscnU6IEhhbmRsZUVudHJ5W10gPSBbXTtcbiAgICBwcml2YXRlIHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoSEFORExFX1NXRUVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLnN3ZWVwKCkpO1xuICAgIH1cblxuICAgIC8vIFJ1bnMgZm5jIGFmdGVyIGV2ZXJ5IHByZXZpb3VzbHkgc2NoZWR1bGVkIG9wZXJhdGlvbiBvbiBmaWxlUGF0aCBoYXMgZmluaXNoZWRcbiAgICBwdWJsaWMgcnVuPFQ+KGZpbGVQYXRoOiBzdHJpbmcsIGZuYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgcHJldiA9IHRoaXMucGVuZGluZy5nZXQoZmlsZVBhdGgpIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gcHJldi50aGVuKGZuYyk7XG4gICAgICAgIC8vIFRoZSBwZW5kaW5nIGNoYWluIG11c3QgbmV2ZXIgcmVqZWN0LCBvciBvbmUgZmFpbGVkIG9wZXJhdGlvbiB3b3VsZCBwb2lzb24gYWxsIGxhdGVyIG9uZXNcbiAgICAgICAgbGV0IGxhc3QgPSByZXN1bHQudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgICAgIHRoaXMucGVuZGluZy5zZXQoZmlsZVBhdGgsIGxhc3QpO1xuICAgICAgICB2b2lkIGxhc3QudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBzdGlsbCB0aGUgbGFzdCBwZW5kaW5nIG9wZXJhdGlvbiBvbiB0aGlzIGZpbGUsIGNsZWFyIG91cnNlbHZlc1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZy5nZXQoZmlsZVBhdGgpID09PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIE9ubHkgY2FsbCBpbnNpZGUgcnVuKCkgZm9yIHRoZSBzYW1lIGZpbGVQYXRoIChzbyBvcGVucyBjYW4ndCBjb2xsaWRlIHdpdGggY2xvc2VzKVxuICAgIHB1YmxpYyBhc3luYyBnZXRIYW5kbGUoZmlsZVBhdGg6IHN0cmluZywgZmxhZ3M6IG51bWJlcik6IFByb21pc2U8ZnMucHJvbWlzZXMuRmlsZUhhbmRsZT4ge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZyb21MUlUoZW50cnkpO1xuICAgICAgICAgICAgZW50cnkubGFzdFVzZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB0aGlzLmxydS5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5oYW5kbGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhhbmRsZSA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4oZmlsZVBhdGgsIGZsYWdzKTtcbiAgICAgICAgZW50cnkgPSB7IGZpbGVQYXRoLCBoYW5kbGUsIGxhc3RVc2U6IERhdGUubm93KCkgfTtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChmaWxlUGF0aCwgZW50cnkpO1xuICAgICAgICB0aGlzLmxydS5wdXNoKGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGNhbGwgaW5zaWRlIHJ1bigpIGZvciB0aGUgc2FtZSBmaWxlUGF0aFxuICAgIHB1YmxpYyBhc3luYyBjbG9zZU5vdyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoZmlsZVBhdGgpO1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21MUlUoZW50cnkpO1xuICAgICAgICBhd2FpdCBlbnRyeS5oYW5kbGUuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUZyb21MUlUoZW50cnk6IEhhbmRsZUVudHJ5KSB7XG4gICAgICAgIGxldCBpbmRleCA9IGJpbmFyeVNlYXJjaEJhc2ljKHRoaXMubHJ1LCB4ID0+IHgubGFzdFVzZSwgZW50cnkubGFzdFVzZSk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBjYW4gc2hhcmUgYSBsYXN0VXNlLCBzbyBzY2FuIGZvciB0aGUgZXhhY3Qgb25lXG4gICAgICAgIHdoaWxlIChpbmRleCA8IHRoaXMubHJ1Lmxlbmd0aCAmJiB0aGlzLmxydVtpbmRleF0ubGFzdFVzZSA9PT0gZW50cnkubGFzdFVzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubHJ1W2luZGV4XSA9PT0gZW50cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxydS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN3ZWVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIEhBTkRMRV9JRExFX1RJTUVPVVQ7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IHRoaXMubHJ1Lmxlbmd0aCAmJiB0aGlzLmxydVtpbmRleF0ubGFzdFVzZSA8PSBjdXRvZmYpIHtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMubHJ1W2luZGV4XTtcbiAgICAgICAgICAgIC8vIENhbid0IGNsb3NlIGEgaGFuZGxlIHdpdGggYSBwZW5kaW5nIG9wZXJhdGlvbjsgaXQnbGwgYmUgc3dlcHQgYWZ0ZXIgaXQgZmluaXNoZXNcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmcuaGFzKGVudHJ5LmZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxydS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBlbnRyeS5oYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzRGlzayBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmb2xkZXI6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGZpbGVzRGlyID0gcGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcImZpbGVzXCIpO1xuICAgIHByaXZhdGUgdXBsb2Fkc0RpciA9IHBhdGguam9pbih0aGlzLmZvbGRlciwgXCJ1cGxvYWRzXCIpO1xuICAgIHByaXZhdGUgaGFuZGxlcyA9IG5ldyBGaWxlSGFuZGxlQ2FjaGUoKTtcbiAgICBwcml2YXRlIGxhcmdlVXBsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHRtcFBhdGg6IHN0cmluZyB9PigpO1xuICAgIHByaXZhdGUgbmV4dExhcmdlVXBsb2FkSWQgPSAxO1xuXG4gICAgcHVibGljIGluaXQgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGhpcy5maWxlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRoaXMudXBsb2Fkc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gVVBMT0FEX0FCQU5ET05FRF9BR0U7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aGlzLnVwbG9hZHNEaXIpKSB7XG4gICAgICAgICAgICBsZXQgdXBsb2FkUGF0aCA9IHBhdGguam9pbih0aGlzLnVwbG9hZHNEaXIsIGZpbGUpO1xuICAgICAgICAgICAgLy8gVGhlIG10aW1lIGFkdmFuY2VzIG9uIGV2ZXJ5IGFwcGVuZCwgc28gYW4gYWN0aXZlIHVwbG9hZCAoZXZlbiBhbm90aGVyIHByb2Nlc3MncykgYWx3YXlzIGxvb2tzIGZyZXNoXG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQodXBsb2FkUGF0aCk7XG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8IHN0YXRzLm10aW1lTXMgPiBjdXRvZmYpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIGFiYW5kb25lZCB1cGxvYWQgdGVtcCBmaWxlICR7dXBsb2FkUGF0aH0gKGxhc3Qgd3JpdHRlbiAke25ldyBEYXRlKHN0YXRzLm10aW1lTXMpLnRvSVNPU3RyaW5nKCl9KWApO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHVwbG9hZFBhdGgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGRpc2sgJHt0aGlzLmZvbGRlcn1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIC8vIE5vIG5hdGl2ZSBjaGFuZ2UgZmVlZCAtIGEgZnVsbCBsaXN0aW5nIGZpbHRlcmVkIGluIG1lbW9yeSAoc2VlIHRoZSBzY2FubmluZyBub3RlIGluIEJsb2JTdG9yZS5zY2FuU291cmNlIGZvciB3aHkgdGhlIGxpc3RpbmcgaXRzZWxmIHRha2VzIG5vIGZpbHRlcnMpXG4gICAgICAgIHJldHVybiBmaWx0ZXJDaGFuZ2VzKGF3YWl0IHRoaXMuZmluZEluZm8oXCJcIiksIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGVQYXRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBhdGguam9pbih0aGlzLmZpbGVzRGlyLCBrZXkpO1xuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydHNXaXRoKHRoaXMuZmlsZXNEaXIgKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkuc2xpY2UoMCwgMjAwKSl9LCBpdCBlc2NhcGVzIHRoZSBzdG9yZSBmb2xkZXJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIGZvcmNlU2V0SW1tdXRhYmxlIGlzIGFjY2VwdGVkIGFuZCBuZWVkcyBubyBoYW5kbGluZzogZGlzayBzb3VyY2VzIGFyZSBuZXZlciBpbW11dGFibGUsIGFuZCB0aGUgb2xkZXItd3JpdGUgbm8tb3AgYmVsb3cgYWxyZWFkeSBnaXZlcyBzeW5jaHJvbml6YXRpb24gaXRzIG9ubHktdGFrZS10aGUtbGF0ZXN0IHNlbWFudGljc1xuICAgIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWc/Lmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBsYXN0TW9kaWZpZWQgPCBleGlzdGluZy5tdGltZU1zKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuT19SRFdSIHwgZnMuY29uc3RhbnRzLk9fQ1JFQVQpO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnRydW5jYXRlKDApO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUudXRpbWVzKG5ldyBEYXRlKGxhc3RNb2RpZmllZCksIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGtleSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDIoa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bihmaWxlUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZShmaWxlUGF0aCwgZnMuY29uc3RhbnRzLk9fUkRXUik7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBoYW5kbGUuc3RhdCgpO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzdGF0cy5zaXplO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcmFuZ2UgJiYgTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIHNpemUpIHx8IDA7XG4gICAgICAgICAgICBsZXQgZW5kID0gcmFuZ2UgJiYgTWF0aC5taW4ocmFuZ2UuZW5kLCBzaXplKSB8fCBzaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemUgfTtcbiAgICAgICAgICAgIGxldCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoZW5kIC0gc3RhcnQpO1xuICAgICAgICAgICAgbGV0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBoYW5kbGUucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChieXRlc1JlYWQgIT09IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7YnVmZmVyLmxlbmd0aH0gYnl0ZXMgYXQgJHtmaWxlUGF0aH06JHtzdGFydH0sIHJlYWQgJHtieXRlc1JlYWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBidWZmZXIsIHdyaXRlVGltZTogc3RhdHMubXRpbWVNcywgc2l6ZSB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghc3RhdHMuc2l6ZSAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogc3RhdHMubXRpbWVNcywgc2l6ZTogc3RhdHMuc2l6ZSB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU/OiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoXCJcIiwgcHJlZml4LCBpbmZvcyk7XG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpO1xuICAgICAgICBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShmaWxlcywgcHJlZml4LCBjb25maWcpO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyByZWxEaXIgaXMgXCJcIiBvciBlbmRzIHdpdGggXCIvXCIuIE9ubHkgZGVzY2VuZHMgaW50byBkaXJlY3RvcmllcyB0aGF0IGNhbiBzdGlsbCBtYXRjaCB0aGUgcHJlZml4LlxuICAgIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJlbERpcjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgaW5mb3M6IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbERpciksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGxldCByZWxQYXRoID0gcmVsRGlyICsgZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpclBhdGggPSByZWxQYXRoICsgXCIvXCI7XG4gICAgICAgICAgICAgICAgaWYgKGRpclBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8IHByZWZpeC5zdGFydHNXaXRoKGRpclBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGRpclBhdGgsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZW50cnkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyZWxQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbFBhdGgpKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZWQgd2hpbGUgd2Ugd2VyZSB3YWxraW5nXG4gICAgICAgICAgICBpZiAoIXN0YXRzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGluZm9zLnNldChyZWxQYXRoLCB7IHBhdGg6IHJlbFBhdGgsIGNyZWF0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgdGhpcy5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgZmlsZXMgc3RyZWFtIGludG8gdGhlaXIgb3duIGZpbGUgdW5kZXIgdXBsb2Fkcy8sIHRoZW4gbW92ZSBpbnRvIHBsYWNlIG9uIGZpbmlzaC4gTm8gaGFuZGxlIGlzIG9wZW5lZCB1bnRpbCB0aGUgZmlyc3QgYXBwZW5kIGFjdHVhbGx5IGhhcHBlbnMuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpZCA9IGAke0RhdGUubm93KCl9XyR7dGhpcy5uZXh0TGFyZ2VVcGxvYWRJZCsrfWA7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLnNldChpZCwgeyB0bXBQYXRoOiBwYXRoLmpvaW4odGhpcy51cGxvYWRzRGlyLCBgdXBsb2FkXyR7aWR9LnRtcGApIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmRMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCB8IGZzLmNvbnN0YW50cy5PX0FQUEVORCk7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGUoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG1wUGF0aCA9IHVwbG9hZC50bXBQYXRoO1xuICAgICAgICB0aGlzLmxhcmdlVXBsb2Fkcy5kZWxldGUoaWQpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgKCkgPT4gdGhpcy5oYW5kbGVzLmNsb3NlTm93KHRtcFBhdGgpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bihmaWxlUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2xvc2UgYW55IGNhY2hlZCBoYW5kbGUgdG8gdGhlIGZpbGUgd2UncmUgcmVwbGFjaW5nLCBzbyBsYXRlciByZWFkcyByZW9wZW4gdGhlIG5ldyBmaWxlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZmlsZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0bXBQYXRoLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgd2FzIGV2ZXIgYXBwZW5kZWQsIHNvIHRoZSB1cGxvYWQgZmlsZSB3YXMgbmV2ZXIgY3JlYXRlZFxuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgQnVmZmVyLmFsbG9jKDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSByZW5hbWUgcHJlc2VydmVzIHRoZSB0ZW1wIGZpbGUncyBtdGltZSwgd2hpY2ggaXMganVzdCB3aGVuIHRoZSBsYXN0IGFwcGVuZCBoYXBwZW5lZCAtIHRoZSBsb2dpY2FsIHdyaXRlIHRpbWUgaGFzIHRvIGJlIHN0YW1wZWQgZXhwbGljaXRseSAoaXQgaXMgdGhlIG1ldGFkYXRhIHNjYW5zIG9yZGVyIGV2ZXJ5dGhpbmcgYnkpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudXRpbWVzKGZpbGVQYXRoLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cGxvYWQgPSB0aGlzLmxhcmdlVXBsb2Fkcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIXVwbG9hZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLmNsb3NlTm93KHRtcFBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodG1wUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZ2V0VVJMIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpc2sgYXJjaGl2ZXMgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIHBhdGggJHtwYXRofSlgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxmcy5TdGF0cyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbi8vIFRoZSBmb2xkZXJzL3NoYWxsb3cgcG9zdC1wcm9jZXNzaW5nIHNoYXJlZCBieSBmaW5kSW5mbyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBsaXN0IGZsYXQgZmlsZXMgKHVzZWQgYnkgQXJjaGl2ZXNEaXNrIG9uIHRoZSByYXcgZGlzayB3YWxrLCBhbmQgYnkgQmxvYlN0b3JlIG9uIGl0cyBpbmRleCkuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlGaW5kSW5mb1NoYXBlKGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSwgcHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU/OiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogQXJjaGl2ZUZpbGVJbmZvW10ge1xuICAgIGlmIChjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgIGxldCBmb2xkZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgbGV0IHJlc3QgPSBmaWxlLnBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICBsZXQgcmVzdFBhcnRzID0gcmVzdC5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICBpZiAocmVzdFBhcnRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGZvbGRlcjogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5zaGFsbG93KSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gcHJlZml4ICsgcmVzdFBhcnRzWzBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb2xkZXIgPSBmaWxlLnBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvbGRlcnMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZvbGRlcnMudmFsdWVzKCkpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnPy5zaGFsbG93KSB7XG4gICAgICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5wYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpLmluY2x1ZGVzKFwiL1wiKSk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlcztcbn1cbiJdfQ==
387
- /* _JS_SOURCE_HASH = "a0a5348f98dfc99c9445bd3e6c4077b922ea6af4071998febfd22a4ce4ecfc17"; */
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQXNLO0FBQ3RLLCtEQUE2RDtBQUU3RCw0YkFBNGI7QUFFNWIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4Qyw2UEFBNlA7QUFDN1AsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBUXJELDhjQUE4YztBQUM5YyxNQUFNLGVBQWU7SUFNakI7UUFMUSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDakQsMERBQTBEO1FBQ2xELFFBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUcvQyxJQUFBLDBCQUFlLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxHQUFHLENBQUksUUFBZ0IsRUFBRSxHQUFxQjtRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FB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LEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDbkMsSUFBSSxNQUFjLENBQUM7WUFDbkIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQXJCRCxnREFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzb3J0LCBiaW5hcnlTZWFyY2hCYXNpYyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBEZWxDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgU2V0Q29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbi8vIFRoZSBiYXNlIGZpbGUtc3lzdGVtIElBcmNoaXZlczogc3RvcmFnZSBpcyBvbmUtdG8tb25lIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBldmVyeSBrZXkgaXMgZXhhY3RseSBvbmUgcmVhbCBmaWxlIHVuZGVyIDxmb2xkZXI+L2ZpbGVzLCBzbyB0aGUgZmlsZSBzeXN0ZW0gaXRzZWxmIGlzIHRoZSBpbmRleC4gRmlsZSBoYW5kbGVzIGFyZSBjYWNoZWQgYW5kIHJldXNlZCwgYW5kIGNsb3NlZCBvbmNlIGlkbGUgKHNlZSBGaWxlSGFuZGxlQ2FjaGUpLiBBbGwgb3BlcmF0aW9ucyBvbiBhIGZpbGUgcnVuIGluIHNlcmlhbCwgc28gdGhleSBjYW4ndCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIGhhbmRsZSBjbG9zaW5nLiBVc2VkIGFzIHRoZSBkaXNrIHN5bmNocm9uaXphdGlvbiBzb3VyY2Ugb2YgQmxvYlN0b3JlIChzZWUgcmVtb3RlU3RvcmFnZS9ibG9iU3RvcmUudHMpLlxuXG5jb25zdCBIQU5ETEVfSURMRV9USU1FT1VUID0gMTAwMCAqIDYwO1xuY29uc3QgSEFORExFX1NXRUVQX0lOVEVSVkFMID0gMTAwMCAqIDE1O1xuLy8gVXBsb2FkIHRlbXAgZmlsZXMgYXJlIG9ubHkgZ2FyYmFnZSBvbmNlIHRoZXkgYXJlIGNsZWFybHkgYWJhbmRvbmVkLiBBbm90aGVyIHByb2Nlc3MgY2FuIHNoYXJlIG91ciBmb2xkZXIgKGV2ZXJ5IGRlcGxveSBvdmVybGFwIGRvZXMpLCBzbyBhIGZyZXNoIHRlbXAgZmlsZSBtYXkgYmUgSVRTIGluLXByb2dyZXNzIHVwbG9hZCAtIGRlbGV0aW5nIGl0IHdvdWxkIHNpbGVudGx5IHR1cm4gdGhhdCB1cGxvYWQgaW50byBhbiBlbXB0eSBmaWxlLlxuY29uc3QgVVBMT0FEX0FCQU5ET05FRF9BR0UgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogMztcblxudHlwZSBIYW5kbGVFbnRyeSA9IHtcbiAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgIGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICBsYXN0VXNlOiBudW1iZXI7XG59O1xuXG4vLyBDYWNoZXMgb3BlbiBmaWxlIGhhbmRsZXMsIGNsb3NpbmcgdGhlbSBvbmNlIGlkbGUgZm9yIEhBTkRMRV9JRExFX1RJTUVPVVQuIEluc3RlYWQgb2Ygb25lIHNldFRpbWVvdXQgcGVyIGhhbmRsZSwgYSBsaXN0IHNvcnRlZCBieSBsYXN0IHVzZSBpcyBzd2VwdCBwZXJpb2RpY2FsbHkgKGVudHJpZXMgYXJlIG1vdmVkIHZpYSBiaW5hcnkgc2VhcmNoIG9uIGFjY2VzcywgYW5kIGxhc3RVc2UgdmFsdWVzIG9ubHkgaW5jcmVhc2UsIHNvIHRvdWNoZWQgZW50cmllcyBhcHBlbmQgYXQgdGhlIGVuZCkuIEFsc28gc2VyaWFsaXplcyBvcGVyYXRpb25zIHBlciBmaWxlOiBlYWNoIG9wZXJhdGlvbiBvbmx5IHN0YXJ0cyBvbmNlIHRoZSBwcmV2aW91cyBvbmUgb24gdGhlIHNhbWUgZmlsZSBmaW5pc2hlZCwgYW5kIGEgaGFuZGxlIGlzIG5ldmVyIGNsb3NlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgcGVuZGluZyBvbiBpdC5cbmNsYXNzIEZpbGVIYW5kbGVDYWNoZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZUVudHJ5PigpO1xuICAgIC8vIFNvcnRlZCBieSBsYXN0VXNlIGFzY2VuZGluZyAobGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdClcbiAgICBwcml2YXRlIGxydTogSGFuZGxlRW50cnlbXSA9IFtdO1xuICAgIHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChIQU5ETEVfU1dFRVBfSU5URVJWQUwsICgpID0+IHRoaXMuc3dlZXAoKSk7XG4gICAgfVxuXG4gICAgLy8gUnVucyBmbmMgYWZ0ZXIgZXZlcnkgcHJldmlvdXNseSBzY2hlZHVsZWQgb3BlcmF0aW9uIG9uIGZpbGVQYXRoIGhhcyBmaW5pc2hlZFxuICAgIHB1YmxpYyBydW48VD4oZmlsZVBhdGg6IHN0cmluZywgZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBwcmV2LnRoZW4oZm5jKTtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgY2hhaW4gbXVzdCBuZXZlciByZWplY3QsIG9yIG9uZSBmYWlsZWQgb3BlcmF0aW9uIHdvdWxkIHBvaXNvbiBhbGwgbGF0ZXIgb25lc1xuICAgICAgICBsZXQgbGFzdCA9IHJlc3VsdC50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnNldChmaWxlUGF0aCwgbGFzdCk7XG4gICAgICAgIHZvaWQgbGFzdC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN0aWxsIHRoZSBsYXN0IHBlbmRpbmcgb3BlcmF0aW9uIG9uIHRoaXMgZmlsZSwgY2xlYXIgb3Vyc2VsdmVzXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgPT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBjYWxsIGluc2lkZSBydW4oKSBmb3IgdGhlIHNhbWUgZmlsZVBhdGggKHNvIG9wZW5zIGNhbid0IGNvbGxpZGUgd2l0aCBjbG9zZXMpXG4gICAgcHVibGljIGFzeW5jIGdldEhhbmRsZShmaWxlUGF0aDogc3RyaW5nLCBmbGFnczogbnVtYmVyKTogUHJvbWlzZTxmcy5wcm9taXNlcy5GaWxlSGFuZGxlPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5sYXN0VXNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihmaWxlUGF0aCwgZmxhZ3MpO1xuICAgICAgICBlbnRyeSA9IHsgZmlsZVBhdGgsIGhhbmRsZSwgbGFzdFVzZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGZpbGVQYXRoLCBlbnRyeSk7XG4gICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY2FsbCBpbnNpZGUgcnVuKCkgZm9yIHRoZSBzYW1lIGZpbGVQYXRoXG4gICAgcHVibGljIGFzeW5jIGNsb3NlTm93KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChmaWxlUGF0aCk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRnJvbUxSVShlbnRyeTogSGFuZGxlRW50cnkpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoQmFzaWModGhpcy5scnUsIHggPT4geC5sYXN0VXNlLCBlbnRyeS5sYXN0VXNlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgICAvLyBNdWx0aXBsZSBlbnRyaWVzIGNhbiBzaGFyZSBhIGxhc3RVc2UsIHNvIHNjYW4gZm9yIHRoZSBleGFjdCBvbmVcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlID09PSBlbnRyeS5sYXN0VXNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5scnVbaW5kZXhdID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3dlZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gSEFORExFX0lETEVfVElNRU9VVDtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlIDw9IGN1dG9mZikge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5scnVbaW5kZXhdO1xuICAgICAgICAgICAgLy8gQ2FuJ3QgY2xvc2UgYSBoYW5kbGUgd2l0aCBhIHBlbmRpbmcgb3BlcmF0aW9uOyBpdCdsbCBiZSBzd2VwdCBhZnRlciBpdCBmaW5pc2hlc1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZy5oYXMoZW50cnkuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNEaXNrIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvbGRlcjogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgZmlsZXNEaXIgPSBwYXRoLmpvaW4odGhpcy5mb2xkZXIsIFwiZmlsZXNcIik7XG4gICAgcHJpdmF0ZSB1cGxvYWRzRGlyID0gcGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcInVwbG9hZHNcIik7XG4gICAgcHJpdmF0ZSBoYW5kbGVzID0gbmV3IEZpbGVIYW5kbGVDYWNoZSgpO1xuICAgIHByaXZhdGUgbGFyZ2VVcGxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIHsgdG1wUGF0aDogc3RyaW5nIH0+KCk7XG4gICAgcHJpdmF0ZSBuZXh0TGFyZ2VVcGxvYWRJZCA9IDE7XG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLmZpbGVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGhpcy51cGxvYWRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBVUExPQURfQUJBTkRPTkVEX0FHRTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMudXBsb2Fkc0RpcikpIHtcbiAgICAgICAgICAgIGxldCB1cGxvYWRQYXRoID0gcGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgZmlsZSk7XG4gICAgICAgICAgICAvLyBUaGUgbXRpbWUgYWR2YW5jZXMgb24gZXZlcnkgYXBwZW5kLCBzbyBhbiBhY3RpdmUgdXBsb2FkIChldmVuIGFub3RoZXIgcHJvY2VzcydzKSBhbHdheXMgbG9va3MgZnJlc2hcbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZCh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgc3RhdHMubXRpbWVNcyA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgYWJhbmRvbmVkIHVwbG9hZCB0ZW1wIGZpbGUgJHt1cGxvYWRQYXRofSAobGFzdCB3cml0dGVuICR7bmV3IERhdGUoc3RhdHMubXRpbWVNcykudG9JU09TdHJpbmcoKX0pYCk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodXBsb2FkUGF0aCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgZGlzayAke3RoaXMuZm9sZGVyfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgLy8gTm8gbmF0aXZlIGNoYW5nZSBmZWVkIC0gYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgaW4gbWVtb3J5IChzZWUgdGhlIHNjYW5uaW5nIG5vdGUgaW4gQmxvYlN0b3JlLnNjYW5Tb3VyY2UgZm9yIHdoeSB0aGUgbGlzdGluZyBpdHNlbGYgdGFrZXMgbm8gZmlsdGVycylcbiAgICAgICAgcmV0dXJuIGZpbHRlckNoYW5nZXMoYXdhaXQgdGhpcy5maW5kSW5mbyhcIlwiKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsZVBhdGgoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIGtleSk7XG4gICAgICAgIGlmICghcmVzdWx0LnN0YXJ0c1dpdGgodGhpcy5maWxlc0RpciArIHBhdGguc2VwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSAke0pTT04uc3RyaW5naWZ5KGtleS5zbGljZSgwLCAyMDApKX0sIGl0IGVzY2FwZXMgdGhlIHN0b3JlIGZvbGRlcmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gZm9yY2VTZXRJbW11dGFibGUgaXMgYWNjZXB0ZWQgYW5kIG5lZWRzIG5vIGhhbmRsaW5nOiBkaXNrIHNvdXJjZXMgYXJlIG5ldmVyIGltbXV0YWJsZSwgYW5kIHRoZSBvbGRlci13cml0ZSBuby1vcCBiZWxvdyBhbHJlYWR5IGdpdmVzIHN5bmNocm9uaXphdGlvbiBpdHMgb25seS10YWtlLXRoZS1sYXRlc3Qgc2VtYW50aWNzXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWc/Lmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBsYXN0TW9kaWZpZWQgPCBleGlzdGluZy5tdGltZU1zKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuT19SRFdSIHwgZnMuY29uc3RhbnRzLk9fQ1JFQVQpO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnRydW5jYXRlKDApO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUudXRpbWVzKG5ldyBEYXRlKGxhc3RNb2RpZmllZCksIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICAvLyBjb25maWcgaXMgYWNjZXB0ZWQgYW5kIGlnbm9yZWQ6IGEgZGlzayBkZWxldGlvbiBpcyBhIHBoeXNpY2FsIHJlbW92ZSAobm8gdG9tYnN0b25lIHRvIHN0YW1wIC0gQmxvYlN0b3JlJ3MgaW5kZXggY2FycmllcyB0aGUgdG9tYnN0b25lIGZvciBkaXNrIHNvdXJjZXMpXG4gICAgcHVibGljIGFzeW5jIGRlbChrZXk6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGtleSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDIoa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aChrZXkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bihmaWxlUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZShmaWxlUGF0aCwgZnMuY29uc3RhbnRzLk9fUkRXUik7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBoYW5kbGUuc3RhdCgpO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzdGF0cy5zaXplO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcmFuZ2UgJiYgTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIHNpemUpIHx8IDA7XG4gICAgICAgICAgICBsZXQgZW5kID0gcmFuZ2UgJiYgTWF0aC5taW4ocmFuZ2UuZW5kLCBzaXplKSB8fCBzaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemUgfTtcbiAgICAgICAgICAgIGxldCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoZW5kIC0gc3RhcnQpO1xuICAgICAgICAgICAgbGV0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBoYW5kbGUucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChieXRlc1JlYWQgIT09IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7YnVmZmVyLmxlbmd0aH0gYnl0ZXMgYXQgJHtmaWxlUGF0aH06JHtzdGFydH0sIHJlYWQgJHtieXRlc1JlYWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBidWZmZXIsIHdyaXRlVGltZTogc3RhdHMubXRpbWVNcywgc2l6ZSB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghc3RhdHMuc2l6ZSAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogc3RhdHMubXRpbWVNcywgc2l6ZTogc3RhdHMuc2l6ZSB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU/OiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoXCJcIiwgcHJlZml4LCBpbmZvcyk7XG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpO1xuICAgICAgICBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShmaWxlcywgcHJlZml4LCBjb25maWcpO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyByZWxEaXIgaXMgXCJcIiBvciBlbmRzIHdpdGggXCIvXCIuIE9ubHkgZGVzY2VuZHMgaW50byBkaXJlY3RvcmllcyB0aGF0IGNhbiBzdGlsbCBtYXRjaCB0aGUgcHJlZml4LlxuICAgIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJlbERpcjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgaW5mb3M6IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbERpciksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGxldCByZWxQYXRoID0gcmVsRGlyICsgZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpclBhdGggPSByZWxQYXRoICsgXCIvXCI7XG4gICAgICAgICAgICAgICAgaWYgKGRpclBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8IHByZWZpeC5zdGFydHNXaXRoKGRpclBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGRpclBhdGgsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZW50cnkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyZWxQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbFBhdGgpKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZWQgd2hpbGUgd2Ugd2VyZSB3YWxraW5nXG4gICAgICAgICAgICBpZiAoIXN0YXRzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGluZm9zLnNldChyZWxQYXRoLCB7IHBhdGg6IHJlbFBhdGgsIGNyZWF0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgdGhpcy5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgZmlsZXMgc3RyZWFtIGludG8gdGhlaXIgb3duIGZpbGUgdW5kZXIgdXBsb2Fkcy8sIHRoZW4gbW92ZSBpbnRvIHBsYWNlIG9uIGZpbmlzaC4gTm8gaGFuZGxlIGlzIG9wZW5lZCB1bnRpbCB0aGUgZmlyc3QgYXBwZW5kIGFjdHVhbGx5IGhhcHBlbnMuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpZCA9IGAke0RhdGUubm93KCl9XyR7dGhpcy5uZXh0TGFyZ2VVcGxvYWRJZCsrfWA7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLnNldChpZCwgeyB0bXBQYXRoOiBwYXRoLmpvaW4odGhpcy51cGxvYWRzRGlyLCBgdXBsb2FkXyR7aWR9LnRtcGApIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmRMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCB8IGZzLmNvbnN0YW50cy5PX0FQUEVORCk7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGUoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG1wUGF0aCA9IHVwbG9hZC50bXBQYXRoO1xuICAgICAgICB0aGlzLmxhcmdlVXBsb2Fkcy5kZWxldGUoaWQpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgKCkgPT4gdGhpcy5oYW5kbGVzLmNsb3NlTm93KHRtcFBhdGgpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bihmaWxlUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2xvc2UgYW55IGNhY2hlZCBoYW5kbGUgdG8gdGhlIGZpbGUgd2UncmUgcmVwbGFjaW5nLCBzbyBsYXRlciByZWFkcyByZW9wZW4gdGhlIG5ldyBmaWxlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMuY2xvc2VOb3coZmlsZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0bXBQYXRoLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBub3RoaW5nIHdhcyBldmVyIGFwcGVuZGVkLCBvciB0aGUgdGVtcCBmaWxlIHdhcyBkZXN0cm95ZWQgdW5kZXIgdXMgLSBib3RoIG11c3QgZmFpbCBsb3VkbHkuIE1hdGVyaWFsaXppbmcgYW4gZW1wdHkgZmlsZSBoZXJlICh0aGUgb2xkIGJlaGF2aW9yKSBzaWxlbnRseSB0dXJuZWQgdGhlIHVwbG9hZCBpbnRvIGEgREVMRVRJT04sIHNpbmNlIGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUgaW4gdGhpcyBzeXN0ZW0uXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXJnZSB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBoYXMgbm8gZGF0YTogdGhlIHVwbG9hZCB0ZW1wIGZpbGUgJHt0bXBQYXRofSBkb2VzIG5vdCBleGlzdC4gRWl0aGVyIG5vIGRhdGEgd2FzIGV2ZXIgYXBwZW5kZWQgKGVtcHR5IGZpbGVzIGFyZSBmb3JiaWRkZW4gLSB0aGV5IHJlYWQgYmFjayBhcyBkZWxldGlvbnM7IHVzZSBkZWwgdG8gZGVsZXRlKSBvciB0aGUgdGVtcCBmaWxlIHdhcyByZW1vdmVkIHdoaWxlIHRoZSB1cGxvYWQgd2FzIHJ1bm5pbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgcmVuYW1lIHByZXNlcnZlcyB0aGUgdGVtcCBmaWxlJ3MgbXRpbWUsIHdoaWNoIGlzIGp1c3Qgd2hlbiB0aGUgbGFzdCBhcHBlbmQgaGFwcGVuZWQgLSB0aGUgbG9naWNhbCB3cml0ZSB0aW1lIGhhcyB0byBiZSBzdGFtcGVkIGV4cGxpY2l0bHkgKGl0IGlzIHRoZSBtZXRhZGF0YSBzY2FucyBvcmRlciBldmVyeXRoaW5nIGJ5KVxuICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnV0aW1lcyhmaWxlUGF0aCwgbmV3IERhdGUobGFzdE1vZGlmaWVkKSwgbmV3IERhdGUobGFzdE1vZGlmaWVkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgY2FuY2VsTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdG1wUGF0aCA9IHVwbG9hZC50bXBQYXRoO1xuICAgICAgICB0aGlzLmxhcmdlVXBsb2Fkcy5kZWxldGUoaWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKHRtcFBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyh0bXBQYXRoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHRtcFBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFVSTCBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXNrIGFyY2hpdmVzICgke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBwYXRoICR7cGF0aH0pYCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8ZnMuU3RhdHMgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChlLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuXG4vLyBUaGUgZm9sZGVycy9zaGFsbG93IHBvc3QtcHJvY2Vzc2luZyBzaGFyZWQgYnkgZmluZEluZm8gaW1wbGVtZW50YXRpb25zIHRoYXQgbGlzdCBmbGF0IGZpbGVzICh1c2VkIGJ5IEFyY2hpdmVzRGlzayBvbiB0aGUgcmF3IGRpc2sgd2FsaywgYW5kIGJ5IEJsb2JTdG9yZSBvbiBpdHMgaW5kZXgpLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RmluZEluZm9TaGFwZShmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10sIHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IEFyY2hpdmVGaWxlSW5mb1tdIHtcbiAgICBpZiAoY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICBsZXQgZm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGxldCByZXN0ID0gZmlsZS5wYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IHJlc3RQYXJ0cyA9IHJlc3Quc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgaWYgKHJlc3RQYXJ0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmb2xkZXI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChjb25maWcuc2hhbGxvdykge1xuICAgICAgICAgICAgICAgIGZvbGRlciA9IHByZWZpeCArIHJlc3RQYXJ0c1swXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gZmlsZS5wYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmb2xkZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUucGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5pbmNsdWRlcyhcIi9cIikpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4iXX0=
391
+ /* _JS_SOURCE_HASH = "f4426c97964b0ec88fd498e3af9d91b5e4c8b5ec798735fba342410c561ea167"; */