sliftutils 1.7.29 → 1.7.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builders/extensionBuild.ts +1 -1
- package/bundler/bundleEntry.ts +1 -3
- package/bundler/bundler.ts +2 -4
- package/bundler/sourceMaps.ts +1 -2
- package/examplestorage/browser.tsx +1 -2
- package/examplestorage/exampleserver.ts +1 -2
- package/index.d.ts +106 -99
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +7 -16
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/dns.d.ts +1 -4
- package/misc/https/dns.ts +5 -14
- package/misc/https/hostServer.d.ts +2 -0
- package/misc/https/hostServer.ts +6 -7
- package/misc/https/httpsCerts.ts +4 -10
- package/misc/openrouter.ts +1 -2
- package/package.json +1 -1
- package/render-utils/FullscreenModal.tsx +1 -4
- package/render-utils/GenericFormat.tsx +2 -8
- package/render-utils/Input.tsx +5 -13
- package/render-utils/InputLabel.tsx +4 -6
- package/render-utils/InputPicker.tsx +1 -2
- package/render-utils/URLParam.ts +2 -3
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/render-utils/mobxTyped.ts +2 -3
- package/render-utils/niceStringify.ts +2 -4
- package/storage/ArchivesDisk.ts +4 -14
- package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
- package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
- package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
- package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
- package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
- package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
- package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
- package/storage/BulkDatabase2/blockCache.ts +12 -28
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
- package/storage/BulkDatabase2/mergeLock.ts +7 -26
- package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
- package/storage/BulkDatabase2/streamLog.ts +14 -40
- package/storage/BulkDatabase2/syncClient.ts +8 -24
- package/storage/FileFolderAPI.tsx +28 -75
- package/storage/IArchives.d.ts +3 -3
- package/storage/IArchives.ts +21 -50
- package/storage/IStorage.ts +2 -4
- package/storage/PendingManager.tsx +2 -3
- package/storage/TransactionStorage.ts +11 -24
- package/storage/backblaze.ts +12 -43
- package/storage/dist/ArchivesDisk.ts.cache +7 -17
- package/storage/dist/FileFolderAPI.tsx.cache +25 -63
- package/storage/dist/IArchives.ts.cache +10 -20
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +5 -6
- package/storage/dist/TransactionStorage.ts.cache +14 -27
- package/storage/dist/backblaze.ts.cache +15 -46
- package/storage/dist/embeddingFormats.ts.cache +11 -24
- package/storage/dist/fileSystemPointer.ts.cache +4 -7
- package/storage/dist/remoteFileStorage.ts.cache +17 -36
- package/storage/embeddingFormats.ts +11 -27
- package/storage/fileSystemPointer.ts +2 -7
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
- package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
- package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
- package/storage/proxydatabase/transactionSet.ts +2 -5
- package/storage/remoteFileServer.ts +20 -48
- package/storage/remoteFileStorage.ts +14 -33
- package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
- package/storage/remoteStorage/ArchivesRemote.ts +11 -26
- package/storage/remoteStorage/ArchivesUrl.ts +2 -4
- package/storage/remoteStorage/accessPage.tsx +1 -5
- package/storage/remoteStorage/blobStore.d.ts +5 -13
- package/storage/remoteStorage/blobStore.ts +52 -130
- package/storage/remoteStorage/createArchives.d.ts +9 -13
- package/storage/remoteStorage/createArchives.ts +43 -187
- package/storage/remoteStorage/deployTakeover.d.ts +18 -32
- package/storage/remoteStorage/deployTakeover.ts +70 -384
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
- package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +54 -186
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
- package/storage/remoteStorage/dist/storageClientController.ts.cache +32 -0
- package/storage/remoteStorage/dist/storageController.ts.cache +30 -64
- package/storage/remoteStorage/dist/storageServerState.ts.cache +269 -186
- package/storage/remoteStorage/grantAccessCli.ts +1 -3
- package/storage/remoteStorage/intermediateSources.d.ts +21 -0
- package/storage/remoteStorage/intermediateSources.ts +117 -0
- package/storage/remoteStorage/remoteConfig.ts +33 -20
- package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
- package/storage/remoteStorage/sourceWrapper.ts +19 -41
- package/storage/remoteStorage/storageClientController.ts +1 -3
- package/storage/remoteStorage/storageController.d.ts +5 -3
- package/storage/remoteStorage/storageController.ts +12 -83
- package/storage/remoteStorage/storageServer.ts +20 -34
- package/storage/remoteStorage/storageServerState.d.ts +28 -6
- package/storage/remoteStorage/storageServerState.ts +275 -221
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Best-effort "only one tab merges this collection at a time" guard. This is purely an efficiency
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// merging at once only waste work and briefly duplicate data, never corrupt or lose it. The lock just
|
|
6
|
-
// stops that wasted work. It uses localStorage (shared across same-origin tabs) and is a no-op where
|
|
7
|
-
// localStorage is unavailable (Node) — there concurrent merges are harmless, which the Node stress
|
|
8
|
-
// tests exercise. localStorage has no atomic compare-and-swap, so we write-then-reread to shrink the
|
|
9
|
-
// race window, and a TTL frees a lock left behind by a tab that crashed or closed mid-merge.
|
|
10
|
-
//
|
|
11
|
-
// File-lock layer (see acquireMergeFileLock at the bottom): for cross-PROCESS safety (different
|
|
12
|
-
// browsers, different machines pointing at the same remote storage), we ALSO write a `.merge-lock`
|
|
13
|
-
// file inside the collection's storage with our ID. The protocol is check-write-wait-recheck — last
|
|
14
|
-
// writer wins after the 15s settle window. The localStorage lock above covers same-origin tabs; this
|
|
15
|
-
// covers everything else (separate processes, remote shared storage).
|
|
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
|
+
// Best-effort "only one tab merges this collection at a time" guard. This is purely an efficiency measure: correctness does NOT depend on it. Reads resolve by per-row write-time, merges write new files before deleting consumed ones, and a duplicate-heavy region gets re-merged — so two tabs merging at once only waste work and briefly duplicate data, never corrupt or lose it. The lock just stops that wasted work. It uses localStorage (shared across same-origin tabs) and is a no-op where localStorage is unavailable (Node) — there concurrent merges are harmless, which the Node stress tests exercise. localStorage has no atomic compare-and-swap, so we write-then-reread to shrink the race window, and a TTL frees a lock left behind by a tab that crashed or closed mid-merge.
|
|
3
|
+
//
|
|
4
|
+
// File-lock layer (see acquireMergeFileLock at the bottom): for cross-PROCESS safety (different browsers, different machines pointing at the same remote storage), we ALSO write a `.merge-lock` file inside the collection's storage with our ID. The protocol is check-write-wait-recheck — last writer wins after the 15s settle window. The localStorage lock above covers same-origin tabs; this covers everything else (separate processes, remote shared storage).
|
|
16
5
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
17
6
|
exports.releaseMergeFileLock = exports.startMergeFileLockHeartbeat = exports.tryAcquireMergeFileLock = exports.peekMergeFileLock = exports.releaseMergeLock = exports.peekMergeLock = exports.tryAcquireMergeLock = void 0;
|
|
18
7
|
const LOCK_TTL_MS = 30 * 1000;
|
|
@@ -36,10 +25,7 @@ function getLocalStorage() {
|
|
|
36
25
|
function lockKey(collection) {
|
|
37
26
|
return "bulkDatabase2-merge:" + collection;
|
|
38
27
|
}
|
|
39
|
-
// Returns true if we now hold the lock (or there's no localStorage to coordinate through, in which case
|
|
40
|
-
// we proceed — concurrent merges are harmless). Returns false only if a DIFFERENT holder has a fresh
|
|
41
|
-
// lock. Re-stamping our own lock always succeeds, so this doubles as a heartbeat: call it periodically
|
|
42
|
-
// during a long, spaced-out merge to keep the lock alive (and detect if another tab took it over).
|
|
28
|
+
// Returns true if we now hold the lock (or there's no localStorage to coordinate through, in which case we proceed — concurrent merges are harmless). Returns false only if a DIFFERENT holder has a fresh lock. Re-stamping our own lock always succeeds, so this doubles as a heartbeat: call it periodically during a long, spaced-out merge to keep the lock alive (and detect if another tab took it over).
|
|
43
29
|
function tryAcquireMergeLock(collection, holderId) {
|
|
44
30
|
const ls = getLocalStorage();
|
|
45
31
|
if (!ls)
|
|
@@ -58,8 +44,7 @@ function tryAcquireMergeLock(collection, holderId) {
|
|
|
58
44
|
return ls.getItem(key) === token;
|
|
59
45
|
}
|
|
60
46
|
exports.tryAcquireMergeLock = tryAcquireMergeLock;
|
|
61
|
-
// Non-mutating look at the tab lock: who holds it and how long until it goes stale (negative = already
|
|
62
|
-
// stale). For logging why a merge was skipped.
|
|
47
|
+
// Non-mutating look at the tab lock: who holds it and how long until it goes stale (negative = already stale). For logging why a merge was skipped.
|
|
63
48
|
function peekMergeLock(collection) {
|
|
64
49
|
const ls = getLocalStorage();
|
|
65
50
|
if (!ls)
|
|
@@ -110,9 +95,7 @@ exports.peekMergeFileLock = peekMergeFileLock;
|
|
|
110
95
|
async function writeMergeFileLock(storage, holderId, time) {
|
|
111
96
|
await storage.set(FILE_LOCK_KEY, Buffer.from(`${holderId}:${time}`, "utf8"));
|
|
112
97
|
}
|
|
113
|
-
// Acquire the cross-process file lock. Resolves to true ONLY if, after writing our ID and waiting
|
|
114
|
-
// FILE_LOCK_SETTLE_MS for concurrent writers to settle, the file still names us. Caller must
|
|
115
|
-
// releaseMergeFileLock() on the same storage + holderId when done.
|
|
98
|
+
// Acquire the cross-process file lock. Resolves to true ONLY if, after writing our ID and waiting FILE_LOCK_SETTLE_MS for concurrent writers to settle, the file still names us. Caller must releaseMergeFileLock() on the same storage + holderId when done.
|
|
116
99
|
async function tryAcquireMergeFileLock(storage, holderId) {
|
|
117
100
|
const now = Date.now();
|
|
118
101
|
const existing = await readMergeFileLock(storage);
|
|
@@ -124,9 +107,7 @@ async function tryAcquireMergeFileLock(storage, holderId) {
|
|
|
124
107
|
return !!after && after.holderId === holderId;
|
|
125
108
|
}
|
|
126
109
|
exports.tryAcquireMergeFileLock = tryAcquireMergeFileLock;
|
|
127
|
-
// Keep the lock fresh. The merge might run longer than FILE_LOCK_TTL_MS; without periodic re-stamping,
|
|
128
|
-
// another process would see the lock as stale and acquire it. Returns a stop function the caller calls
|
|
129
|
-
// in `finally`. Heartbeat is best-effort: a failed write is logged but not propagated.
|
|
110
|
+
// Keep the lock fresh. The merge might run longer than FILE_LOCK_TTL_MS; without periodic re-stamping, another process would see the lock as stale and acquire it. Returns a stop function the caller calls in `finally`. Heartbeat is best-effort: a failed write is logged but not propagated.
|
|
130
111
|
function startMergeFileLockHeartbeat(storage, holderId) {
|
|
131
112
|
var _a, _b;
|
|
132
113
|
const interval = setInterval(() => {
|
|
@@ -145,5 +126,5 @@ async function releaseMergeFileLock(storage, holderId) {
|
|
|
145
126
|
catch ( /* ignore */_a) { /* ignore */ }
|
|
146
127
|
}
|
|
147
128
|
exports.releaseMergeFileLock = releaseMergeFileLock;
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VMb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VMb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrR0FBa0c7QUFDbEcsb0dBQW9HO0FBQ3BHLGlHQUFpRztBQUNqRyxzR0FBc0c7QUFDdEcscUdBQXFHO0FBQ3JHLG1HQUFtRztBQUNuRyxxR0FBcUc7QUFDckcsNkZBQTZGO0FBQzdGLEVBQUU7QUFDRixnR0FBZ0c7QUFDaEcsbUdBQW1HO0FBQ25HLG9HQUFvRztBQUNwRyxxR0FBcUc7QUFDckcsc0VBQXNFOzs7QUFJdEUsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUk5QixTQUFTLGNBQWMsQ0FBQyxLQUFhO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsSUFBSSxLQUFLLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGVBQWU7SUFDcEIsSUFBSSxDQUFDO1FBQ0QsT0FBTyxPQUFPLFlBQVksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFFLENBQUM7SUFBQyxXQUFNLENBQUM7UUFDTCxPQUFPLFNBQVMsQ0FBQyxDQUFDLDJEQUEyRDtJQUNqRixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMs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QUMsUUFBUSxLQUFLLFFBQVE7WUFBRSxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUFDLFFBQVEsWUFBWSxJQUFkLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBTEQsb0RBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCZXN0LWVmZm9ydCBcIm9ubHkgb25lIHRhYiBtZXJnZXMgdGhpcyBjb2xsZWN0aW9uIGF0IGEgdGltZVwiIGd1YXJkLiBUaGlzIGlzIHB1cmVseSBhbiBlZmZpY2llbmN5XG4vLyBtZWFzdXJlOiBjb3JyZWN0bmVzcyBkb2VzIE5PVCBkZXBlbmQgb24gaXQuIFJlYWRzIHJlc29sdmUgYnkgcGVyLXJvdyB3cml0ZS10aW1lLCBtZXJnZXMgd3JpdGUgbmV3XG4vLyBmaWxlcyBiZWZvcmUgZGVsZXRpbmcgY29uc3VtZWQgb25lcywgYW5kIGEgZHVwbGljYXRlLWhlYXZ5IHJlZ2lvbiBnZXRzIHJlLW1lcmdlZCDigJQgc28gdHdvIHRhYnNcbi8vIG1lcmdpbmcgYXQgb25jZSBvbmx5IHdhc3RlIHdvcmsgYW5kIGJyaWVmbHkgZHVwbGljYXRlIGRhdGEsIG5ldmVyIGNvcnJ1cHQgb3IgbG9zZSBpdC4gVGhlIGxvY2sganVzdFxuLy8gc3RvcHMgdGhhdCB3YXN0ZWQgd29yay4gSXQgdXNlcyBsb2NhbFN0b3JhZ2UgKHNoYXJlZCBhY3Jvc3Mgc2FtZS1vcmlnaW4gdGFicykgYW5kIGlzIGEgbm8tb3Agd2hlcmVcbi8vIGxvY2FsU3RvcmFnZSBpcyB1bmF2YWlsYWJsZSAoTm9kZSkg4oCUIHRoZXJlIGNvbmN1cnJlbnQgbWVyZ2VzIGFyZSBoYXJtbGVzcywgd2hpY2ggdGhlIE5vZGUgc3RyZXNzXG4vLyB0ZXN0cyBleGVyY2lzZS4gbG9jYWxTdG9yYWdlIGhhcyBubyBhdG9taWMgY29tcGFyZS1hbmQtc3dhcCwgc28gd2Ugd3JpdGUtdGhlbi1yZXJlYWQgdG8gc2hyaW5rIHRoZVxuLy8gcmFjZSB3aW5kb3csIGFuZCBhIFRUTCBmcmVlcyBhIGxvY2sgbGVmdCBiZWhpbmQgYnkgYSB0YWIgdGhhdCBjcmFzaGVkIG9yIGNsb3NlZCBtaWQtbWVyZ2UuXG4vL1xuLy8gRmlsZS1sb2NrIGxheWVyIChzZWUgYWNxdWlyZU1lcmdlRmlsZUxvY2sgYXQgdGhlIGJvdHRvbSk6IGZvciBjcm9zcy1QUk9DRVNTIHNhZmV0eSAoZGlmZmVyZW50XG4vLyBicm93c2VycywgZGlmZmVyZW50IG1hY2hpbmVzIHBvaW50aW5nIGF0IHRoZSBzYW1lIHJlbW90ZSBzdG9yYWdlKSwgd2UgQUxTTyB3cml0ZSBhIGAubWVyZ2UtbG9ja2Bcbi8vIGZpbGUgaW5zaWRlIHRoZSBjb2xsZWN0aW9uJ3Mgc3RvcmFnZSB3aXRoIG91ciBJRC4gVGhlIHByb3RvY29sIGlzIGNoZWNrLXdyaXRlLXdhaXQtcmVjaGVjayDigJQgbGFzdFxuLy8gd3JpdGVyIHdpbnMgYWZ0ZXIgdGhlIDE1cyBzZXR0bGUgd2luZG93LiBUaGUgbG9jYWxTdG9yYWdlIGxvY2sgYWJvdmUgY292ZXJzIHNhbWUtb3JpZ2luIHRhYnM7IHRoaXNcbi8vIGNvdmVycyBldmVyeXRoaW5nIGVsc2UgKHNlcGFyYXRlIHByb2Nlc3NlcywgcmVtb3RlIHNoYXJlZCBzdG9yYWdlKS5cblxuaW1wb3J0IHR5cGUgeyBGaWxlU3RvcmFnZSB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5cbmNvbnN0IExPQ0tfVFRMX01TID0gMzAgKiAxMDAwO1xuXG5leHBvcnQgdHlwZSBNZXJnZUxvY2tJbmZvID0geyBob2xkZXJJZDogc3RyaW5nOyBleHBpcmVzSW5NczogbnVtYmVyIH07XG5cbmZ1bmN0aW9uIHBhcnNlTG9ja1Rva2VuKHRva2VuOiBzdHJpbmcpOiB7IGhvbGRlcklkOiBzdHJpbmc7IHRpbWU6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvbiA9IHRva2VuLmxhc3RJbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb24gPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWUgPSBwYXJzZUludCh0b2tlbi5zbGljZShjb2xvbiArIDEpLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGltZSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgaG9sZGVySWQ6IHRva2VuLnNsaWNlKDAsIGNvbG9uKSwgdGltZSB9O1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKTogU3RvcmFnZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhbFN0b3JhZ2UgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGFjY2Vzc2luZyBsb2NhbFN0b3JhZ2UgY2FuIHRocm93IChlLmcuIGRpc2FibGVkIGNvb2tpZXMpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2NrS2V5KGNvbGxlY3Rpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYnVsa0RhdGFiYXNlMi1tZXJnZTpcIiArIGNvbGxlY3Rpb247XG59XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBub3cgaG9sZCB0aGUgbG9jayAob3IgdGhlcmUncyBubyBsb2NhbFN0b3JhZ2UgdG8gY29vcmRpbmF0ZSB0aHJvdWdoLCBpbiB3aGljaCBjYXNlXG4vLyB3ZSBwcm9jZWVkIOKAlCBjb25jdXJyZW50IG1lcmdlcyBhcmUgaGFybWxlc3MpLiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgYSBESUZGRVJFTlQgaG9sZGVyIGhhcyBhIGZyZXNoXG4vLyBsb2NrLiBSZS1zdGFtcGluZyBvdXIgb3duIGxvY2sgYWx3YXlzIHN1Y2NlZWRzLCBzbyB0aGlzIGRvdWJsZXMgYXMgYSBoZWFydGJlYXQ6IGNhbGwgaXQgcGVyaW9kaWNhbGx5XG4vLyBkdXJpbmcgYSBsb25nLCBzcGFjZWQtb3V0IG1lcmdlIHRvIGtlZXAgdGhlIGxvY2sgYWxpdmUgKGFuZCBkZXRlY3QgaWYgYW5vdGhlciB0YWIgdG9vayBpdCBvdmVyKS5cbmV4cG9ydCBmdW5jdGlvbiB0cnlBY3F1aXJlTWVyZ2VMb2NrKGNvbGxlY3Rpb246IHN0cmluZywgaG9sZGVySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxzID0gZ2V0TG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKCFscykgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qga2V5ID0gbG9ja0tleShjb2xsZWN0aW9uKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbHMuZ2V0SXRlbShrZXkpO1xuICAgIGlmIChleGlzdGluZyAmJiAhZXhpc3Rpbmcuc3RhcnRzV2l0aChob2xkZXJJZCArIFwiOlwiKSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUxvY2tUb2tlbihleGlzdGluZyk7XG4gICAgICAgIGlmIChwYXJzZWQgJiYgbm93IC0gcGFyc2VkLnRpbWUgPCBMT0NLX1RUTF9NUykgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGhvbGRlcklkICsgXCI6XCIgKyBub3c7XG4gICAgbHMuc2V0SXRlbShrZXksIHRva2VuKTtcbiAgICAvLyBSZS1yZWFkIHRvIGNhdGNoIGEgcmFjaW5nIHNldEl0ZW0gZnJvbSBhbm90aGVyIHRhYiAoYmVzdC1lZmZvcnQsIG5vdCBhdG9taWMpLlxuICAgIHJldHVybiBscy5nZXRJdGVtKGtleSkgPT09IHRva2VuO1xufVxuXG4vLyBOb24tbXV0YXRpbmcgbG9vayBhdCB0aGUgdGFiIGxvY2s6IHdobyBob2xkcyBpdCBhbmQgaG93IGxvbmcgdW50aWwgaXQgZ29lcyBzdGFsZSAobmVnYXRpdmUgPSBhbHJlYWR5XG4vLyBzdGFsZSkuIEZvciBsb2dnaW5nIHdoeSBhIG1lcmdlIHdhcyBza2lwcGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHBlZWtNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nKTogTWVyZ2VMb2NrSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbHMuZ2V0SXRlbShsb2NrS2V5KGNvbGxlY3Rpb24pKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTG9ja1Rva2VuKGV4aXN0aW5nKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBob2xkZXJJZDogcGFyc2VkLmhvbGRlcklkLCBleHBpcmVzSW5NczogcGFyc2VkLnRpbWUgKyBMT0NLX1RUTF9NUyAtIERhdGUubm93KCkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2VNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nLCBob2xkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gbG9ja0tleShjb2xsZWN0aW9uKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGxzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3Rpbmcuc3RhcnRzV2l0aChob2xkZXJJZCArIFwiOlwiKSkgbHMucmVtb3ZlSXRlbShrZXkpO1xufVxuXG4vLyDilIDilIAgRmlsZS1iYXNlZCBsb2NrIChjcm9zcy1wcm9jZXNzIC8gc2hhcmVkIHN0b3JhZ2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuY29uc3QgRklMRV9MT0NLX0tFWSA9IFwiLm1lcmdlLWxvY2tcIjtcbmNvbnN0IEZJTEVfTE9DS19UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgRklMRV9MT0NLX1NFVFRMRV9NUyA9IDE1ICogMTAwMDtcbmNvbnN0IEZJTEVfTE9DS19IRUFSVEJFQVRfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlOiBGaWxlU3RvcmFnZSk6IFByb21pc2U8eyBob2xkZXJJZDogc3RyaW5nOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHN0b3JhZ2UuZ2V0KEZJTEVfTE9DS19LRVkpO1xuICAgICAgICBpZiAoIWJ1ZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9ja1Rva2VuKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH0gY2F0Y2ggeyByZXR1cm4gdW5kZWZpbmVkOyB9XG59XG5cbi8vIE5vbi1tdXRhdGluZyBsb29rIGF0IHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgZmlsZSAoc2VlIHBlZWtNZXJnZUxvY2spLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlZWtNZXJnZUZpbGVMb2NrKHN0b3JhZ2U6IEZpbGVTdG9yYWdlKTogUHJvbWlzZTxNZXJnZUxvY2tJbmZvIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGhvbGRlcklkOiBleGlzdGluZy5ob2xkZXJJZCwgZXhwaXJlc0luTXM6IGV4aXN0aW5nLnRpbWUgKyBGSUxFX0xPQ0tfVFRMX01TIC0gRGF0ZS5ub3coKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcsIHRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KEZJTEVfTE9DS19LRVksIEJ1ZmZlci5mcm9tKGAke2hvbGRlcklkfToke3RpbWV9YCwgXCJ1dGY4XCIpIGFzIEJ1ZmZlcik7XG59XG5cbi8vIEFjcXVpcmUgdGhlIGNyb3NzLXByb2Nlc3MgZmlsZSBsb2NrLiBSZXNvbHZlcyB0byB0cnVlIE9OTFkgaWYsIGFmdGVyIHdyaXRpbmcgb3VyIElEIGFuZCB3YWl0aW5nXG4vLyBGSUxFX0xPQ0tfU0VUVExFX01TIGZvciBjb25jdXJyZW50IHdyaXRlcnMgdG8gc2V0dGxlLCB0aGUgZmlsZSBzdGlsbCBuYW1lcyB1cy4gQ2FsbGVyIG11c3Rcbi8vIHJlbGVhc2VNZXJnZUZpbGVMb2NrKCkgb24gdGhlIHNhbWUgc3RvcmFnZSArIGhvbGRlcklkIHdoZW4gZG9uZS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlBY3F1aXJlTWVyZ2VGaWxlTG9jayhzdG9yYWdlOiBGaWxlU3RvcmFnZSwgaG9sZGVySWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuaG9sZGVySWQgIT09IGhvbGRlcklkICYmIG5vdyAtIGV4aXN0aW5nLnRpbWUgPCBGSUxFX0xPQ0tfVFRMX01TKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgd3JpdGVNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIGhvbGRlcklkLCBub3cpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBGSUxFX0xPQ0tfU0VUVExFX01TKSk7XG4gICAgY29uc3QgYWZ0ZXIgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICByZXR1cm4gISFhZnRlciAmJiBhZnRlci5ob2xkZXJJZCA9PT0gaG9sZGVySWQ7XG59XG5cbi8vIEtlZXAgdGhlIGxvY2sgZnJlc2guIFRoZSBtZXJnZSBtaWdodCBydW4gbG9uZ2VyIHRoYW4gRklMRV9MT0NLX1RUTF9NUzsgd2l0aG91dCBwZXJpb2RpYyByZS1zdGFtcGluZyxcbi8vIGFub3RoZXIgcHJvY2VzcyB3b3VsZCBzZWUgdGhlIGxvY2sgYXMgc3RhbGUgYW5kIGFjcXVpcmUgaXQuIFJldHVybnMgYSBzdG9wIGZ1bmN0aW9uIHRoZSBjYWxsZXIgY2FsbHNcbi8vIGluIGBmaW5hbGx5YC4gSGVhcnRiZWF0IGlzIGJlc3QtZWZmb3J0OiBhIGZhaWxlZCB3cml0ZSBpcyBsb2dnZWQgYnV0IG5vdCBwcm9wYWdhdGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0TWVyZ2VGaWxlTG9ja0hlYXJ0YmVhdChzdG9yYWdlOiBGaWxlU3RvcmFnZSwgaG9sZGVySWQ6IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIHdyaXRlTWVyZ2VGaWxlTG9jayhzdG9yYWdlLCBob2xkZXJJZCwgRGF0ZS5ub3coKSkuY2F0Y2goKCkgPT4geyAvKiBiZXN0LWVmZm9ydCAqLyB9KTtcbiAgICB9LCBGSUxFX0xPQ0tfSEVBUlRCRUFUX01TKTtcbiAgICAoaW50ZXJ2YWwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGludGVydmFsKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VNZXJnZUZpbGVMb2NrKHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBob2xkZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLmhvbGRlcklkID09PSBob2xkZXJJZCkgYXdhaXQgc3RvcmFnZS5yZW1vdmUoRklMRV9MT0NLX0tFWSk7XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG59XG4iXX0=
|
|
149
|
-
/* _JS_SOURCE_HASH = "
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VMb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VMb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5d0JBQXl3QjtBQUN6d0IsR0FBRztBQUNILDBjQUEwYzs7O0FBSTFjLE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFJOUIsU0FBUyxjQUFjLENBQUMsS0FBYTtJQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3BCLElBQUksQ0FBQztRQUNELE9BQU8sT0FBTyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxRSxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxTQUFTLENBQUMsQ0FBQywyREFBMkQ7SUFDakYsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxVQUFrQjtJQUMvQixPQUFPLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsaVpBQWlaO0FBQ2paLFNBQWdCLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsUUFBZ0I7SUFDcEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxF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bUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQ2xELENBQUM7QUFSRCwwREFRQztBQUVELGlTQUFpUztBQUNqUyxTQUFnQiwyQkFBMkIsQ0FBQyxPQUFvQixFQUFFLFFBQWdCOztJQUM5RSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQzlCLEtBQUssa0JBQWtCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQzlGLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNCLE1BQUEsTUFBQyxRQUFtQyxFQUFDLEtBQUssa0RBQUksQ0FBQztJQUMvQyxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBTkQsa0VBTUM7QUFFTSxLQUFLLFVBQVUsb0JBQW9CLENBQUMsT0FBb0IsRUFBRSxRQUFnQjtJQUM3RSxJQUFJLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUTtZQUFFLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQUMsUUFBUSxZQUFZLElBQWQsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFMRCxvREFLQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEJlc3QtZWZmb3J0IFwib25seSBvbmUgdGFiIG1lcmdlcyB0aGlzIGNvbGxlY3Rpb24gYXQgYSB0aW1lXCIgZ3VhcmQuIFRoaXMgaXMgcHVyZWx5IGFuIGVmZmljaWVuY3kgbWVhc3VyZTogY29ycmVjdG5lc3MgZG9lcyBOT1QgZGVwZW5kIG9uIGl0LiBSZWFkcyByZXNvbHZlIGJ5IHBlci1yb3cgd3JpdGUtdGltZSwgbWVyZ2VzIHdyaXRlIG5ldyBmaWxlcyBiZWZvcmUgZGVsZXRpbmcgY29uc3VtZWQgb25lcywgYW5kIGEgZHVwbGljYXRlLWhlYXZ5IHJlZ2lvbiBnZXRzIHJlLW1lcmdlZCDigJQgc28gdHdvIHRhYnMgbWVyZ2luZyBhdCBvbmNlIG9ubHkgd2FzdGUgd29yayBhbmQgYnJpZWZseSBkdXBsaWNhdGUgZGF0YSwgbmV2ZXIgY29ycnVwdCBvciBsb3NlIGl0LiBUaGUgbG9jayBqdXN0IHN0b3BzIHRoYXQgd2FzdGVkIHdvcmsuIEl0IHVzZXMgbG9jYWxTdG9yYWdlIChzaGFyZWQgYWNyb3NzIHNhbWUtb3JpZ2luIHRhYnMpIGFuZCBpcyBhIG5vLW9wIHdoZXJlIGxvY2FsU3RvcmFnZSBpcyB1bmF2YWlsYWJsZSAoTm9kZSkg4oCUIHRoZXJlIGNvbmN1cnJlbnQgbWVyZ2VzIGFyZSBoYXJtbGVzcywgd2hpY2ggdGhlIE5vZGUgc3RyZXNzIHRlc3RzIGV4ZXJjaXNlLiBsb2NhbFN0b3JhZ2UgaGFzIG5vIGF0b21pYyBjb21wYXJlLWFuZC1zd2FwLCBzbyB3ZSB3cml0ZS10aGVuLXJlcmVhZCB0byBzaHJpbmsgdGhlIHJhY2Ugd2luZG93LCBhbmQgYSBUVEwgZnJlZXMgYSBsb2NrIGxlZnQgYmVoaW5kIGJ5IGEgdGFiIHRoYXQgY3Jhc2hlZCBvciBjbG9zZWQgbWlkLW1lcmdlLlxuLy8gXG4vLyBGaWxlLWxvY2sgbGF5ZXIgKHNlZSBhY3F1aXJlTWVyZ2VGaWxlTG9jayBhdCB0aGUgYm90dG9tKTogZm9yIGNyb3NzLVBST0NFU1Mgc2FmZXR5IChkaWZmZXJlbnQgYnJvd3NlcnMsIGRpZmZlcmVudCBtYWNoaW5lcyBwb2ludGluZyBhdCB0aGUgc2FtZSByZW1vdGUgc3RvcmFnZSksIHdlIEFMU08gd3JpdGUgYSBgLm1lcmdlLWxvY2tgIGZpbGUgaW5zaWRlIHRoZSBjb2xsZWN0aW9uJ3Mgc3RvcmFnZSB3aXRoIG91ciBJRC4gVGhlIHByb3RvY29sIGlzIGNoZWNrLXdyaXRlLXdhaXQtcmVjaGVjayDigJQgbGFzdCB3cml0ZXIgd2lucyBhZnRlciB0aGUgMTVzIHNldHRsZSB3aW5kb3cuIFRoZSBsb2NhbFN0b3JhZ2UgbG9jayBhYm92ZSBjb3ZlcnMgc2FtZS1vcmlnaW4gdGFiczsgdGhpcyBjb3ZlcnMgZXZlcnl0aGluZyBlbHNlIChzZXBhcmF0ZSBwcm9jZXNzZXMsIHJlbW90ZSBzaGFyZWQgc3RvcmFnZSkuXG5cbmltcG9ydCB0eXBlIHsgRmlsZVN0b3JhZ2UgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuXG5jb25zdCBMT0NLX1RUTF9NUyA9IDMwICogMTAwMDtcblxuZXhwb3J0IHR5cGUgTWVyZ2VMb2NrSW5mbyA9IHsgaG9sZGVySWQ6IHN0cmluZzsgZXhwaXJlc0luTXM6IG51bWJlciB9O1xuXG5mdW5jdGlvbiBwYXJzZUxvY2tUb2tlbih0b2tlbjogc3RyaW5nKTogeyBob2xkZXJJZDogc3RyaW5nOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29sb24gPSB0b2tlbi5sYXN0SW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGNvbG9uIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lID0gcGFyc2VJbnQodG9rZW4uc2xpY2UoY29sb24gKyAxKSwgMTApO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRpbWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGhvbGRlcklkOiB0b2tlbi5zbGljZSgwLCBjb2xvbiksIHRpbWUgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYWxTdG9yYWdlKCk6IFN0b3JhZ2UgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSBcInVuZGVmaW5lZFwiID8gbG9jYWxTdG9yYWdlIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBhY2Nlc3NpbmcgbG9jYWxTdG9yYWdlIGNhbiB0aHJvdyAoZS5nLiBkaXNhYmxlZCBjb29raWVzKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbG9ja0tleShjb2xsZWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJ1bGtEYXRhYmFzZTItbWVyZ2U6XCIgKyBjb2xsZWN0aW9uO1xufVxuXG4vLyBSZXR1cm5zIHRydWUgaWYgd2Ugbm93IGhvbGQgdGhlIGxvY2sgKG9yIHRoZXJlJ3Mgbm8gbG9jYWxTdG9yYWdlIHRvIGNvb3JkaW5hdGUgdGhyb3VnaCwgaW4gd2hpY2ggY2FzZSB3ZSBwcm9jZWVkIOKAlCBjb25jdXJyZW50IG1lcmdlcyBhcmUgaGFybWxlc3MpLiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgYSBESUZGRVJFTlQgaG9sZGVyIGhhcyBhIGZyZXNoIGxvY2suIFJlLXN0YW1waW5nIG91ciBvd24gbG9jayBhbHdheXMgc3VjY2VlZHMsIHNvIHRoaXMgZG91YmxlcyBhcyBhIGhlYXJ0YmVhdDogY2FsbCBpdCBwZXJpb2RpY2FsbHkgZHVyaW5nIGEgbG9uZywgc3BhY2VkLW91dCBtZXJnZSB0byBrZWVwIHRoZSBsb2NrIGFsaXZlIChhbmQgZGV0ZWN0IGlmIGFub3RoZXIgdGFiIHRvb2sgaXQgb3ZlcikuXG5leHBvcnQgZnVuY3Rpb24gdHJ5QWNxdWlyZU1lcmdlTG9jayhjb2xsZWN0aW9uOiBzdHJpbmcsIGhvbGRlcklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBscyA9IGdldExvY2FsU3RvcmFnZSgpO1xuICAgIGlmICghbHMpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGtleSA9IGxvY2tLZXkoY29sbGVjdGlvbik7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGxzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgIWV4aXN0aW5nLnN0YXJ0c1dpdGgoaG9sZGVySWQgKyBcIjpcIikpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VMb2NrVG9rZW4oZXhpc3RpbmcpO1xuICAgICAgICBpZiAocGFyc2VkICYmIG5vdyAtIHBhcnNlZC50aW1lIDwgTE9DS19UVExfTVMpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBob2xkZXJJZCArIFwiOlwiICsgbm93O1xuICAgIGxzLnNldEl0ZW0oa2V5LCB0b2tlbik7XG4gICAgLy8gUmUtcmVhZCB0byBjYXRjaCBhIHJhY2luZyBzZXRJdGVtIGZyb20gYW5vdGhlciB0YWIgKGJlc3QtZWZmb3J0LCBub3QgYXRvbWljKS5cbiAgICByZXR1cm4gbHMuZ2V0SXRlbShrZXkpID09PSB0b2tlbjtcbn1cblxuLy8gTm9uLW11dGF0aW5nIGxvb2sgYXQgdGhlIHRhYiBsb2NrOiB3aG8gaG9sZHMgaXQgYW5kIGhvdyBsb25nIHVudGlsIGl0IGdvZXMgc3RhbGUgKG5lZ2F0aXZlID0gYWxyZWFkeSBzdGFsZSkuIEZvciBsb2dnaW5nIHdoeSBhIG1lcmdlIHdhcyBza2lwcGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHBlZWtNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nKTogTWVyZ2VMb2NrSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbHMuZ2V0SXRlbShsb2NrS2V5KGNvbGxlY3Rpb24pKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTG9ja1Rva2VuKGV4aXN0aW5nKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBob2xkZXJJZDogcGFyc2VkLmhvbGRlcklkLCBleHBpcmVzSW5NczogcGFyc2VkLnRpbWUgKyBMT0NLX1RUTF9NUyAtIERhdGUubm93KCkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2VNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nLCBob2xkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gbG9ja0tleShjb2xsZWN0aW9uKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGxzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3Rpbmcuc3RhcnRzV2l0aChob2xkZXJJZCArIFwiOlwiKSkgbHMucmVtb3ZlSXRlbShrZXkpO1xufVxuXG4vLyDilIDilIAgRmlsZS1iYXNlZCBsb2NrIChjcm9zcy1wcm9jZXNzIC8gc2hhcmVkIHN0b3JhZ2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuY29uc3QgRklMRV9MT0NLX0tFWSA9IFwiLm1lcmdlLWxvY2tcIjtcbmNvbnN0IEZJTEVfTE9DS19UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgRklMRV9MT0NLX1NFVFRMRV9NUyA9IDE1ICogMTAwMDtcbmNvbnN0IEZJTEVfTE9DS19IRUFSVEJFQVRfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlOiBGaWxlU3RvcmFnZSk6IFByb21pc2U8eyBob2xkZXJJZDogc3RyaW5nOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHN0b3JhZ2UuZ2V0KEZJTEVfTE9DS19LRVkpO1xuICAgICAgICBpZiAoIWJ1ZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9ja1Rva2VuKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH0gY2F0Y2ggeyByZXR1cm4gdW5kZWZpbmVkOyB9XG59XG5cbi8vIE5vbi1tdXRhdGluZyBsb29rIGF0IHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgZmlsZSAoc2VlIHBlZWtNZXJnZUxvY2spLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlZWtNZXJnZUZpbGVMb2NrKHN0b3JhZ2U6IEZpbGVTdG9yYWdlKTogUHJvbWlzZTxNZXJnZUxvY2tJbmZvIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGhvbGRlcklkOiBleGlzdGluZy5ob2xkZXJJZCwgZXhwaXJlc0luTXM6IGV4aXN0aW5nLnRpbWUgKyBGSUxFX0xPQ0tfVFRMX01TIC0gRGF0ZS5ub3coKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcsIHRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KEZJTEVfTE9DS19LRVksIEJ1ZmZlci5mcm9tKGAke2hvbGRlcklkfToke3RpbWV9YCwgXCJ1dGY4XCIpIGFzIEJ1ZmZlcik7XG59XG5cbi8vIEFjcXVpcmUgdGhlIGNyb3NzLXByb2Nlc3MgZmlsZSBsb2NrLiBSZXNvbHZlcyB0byB0cnVlIE9OTFkgaWYsIGFmdGVyIHdyaXRpbmcgb3VyIElEIGFuZCB3YWl0aW5nIEZJTEVfTE9DS19TRVRUTEVfTVMgZm9yIGNvbmN1cnJlbnQgd3JpdGVycyB0byBzZXR0bGUsIHRoZSBmaWxlIHN0aWxsIG5hbWVzIHVzLiBDYWxsZXIgbXVzdCByZWxlYXNlTWVyZ2VGaWxlTG9jaygpIG9uIHRoZSBzYW1lIHN0b3JhZ2UgKyBob2xkZXJJZCB3aGVuIGRvbmUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5QWNxdWlyZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZE1lcmdlRmlsZUxvY2soc3RvcmFnZSk7XG4gICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLmhvbGRlcklkICE9PSBob2xkZXJJZCAmJiBub3cgLSBleGlzdGluZy50aW1lIDwgRklMRV9MT0NLX1RUTF9NUykgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHdyaXRlTWVyZ2VGaWxlTG9jayhzdG9yYWdlLCBob2xkZXJJZCwgbm93KTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgRklMRV9MT0NLX1NFVFRMRV9NUykpO1xuICAgIGNvbnN0IGFmdGVyID0gYXdhaXQgcmVhZE1lcmdlRmlsZUxvY2soc3RvcmFnZSk7XG4gICAgcmV0dXJuICEhYWZ0ZXIgJiYgYWZ0ZXIuaG9sZGVySWQgPT09IGhvbGRlcklkO1xufVxuXG4vLyBLZWVwIHRoZSBsb2NrIGZyZXNoLiBUaGUgbWVyZ2UgbWlnaHQgcnVuIGxvbmdlciB0aGFuIEZJTEVfTE9DS19UVExfTVM7IHdpdGhvdXQgcGVyaW9kaWMgcmUtc3RhbXBpbmcsIGFub3RoZXIgcHJvY2VzcyB3b3VsZCBzZWUgdGhlIGxvY2sgYXMgc3RhbGUgYW5kIGFjcXVpcmUgaXQuIFJldHVybnMgYSBzdG9wIGZ1bmN0aW9uIHRoZSBjYWxsZXIgY2FsbHMgaW4gYGZpbmFsbHlgLiBIZWFydGJlYXQgaXMgYmVzdC1lZmZvcnQ6IGEgZmFpbGVkIHdyaXRlIGlzIGxvZ2dlZCBidXQgbm90IHByb3BhZ2F0ZWQuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRNZXJnZUZpbGVMb2NrSGVhcnRiZWF0KHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBob2xkZXJJZDogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHZvaWQgd3JpdGVNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIGhvbGRlcklkLCBEYXRlLm5vdygpKS5jYXRjaCgoKSA9PiB7IC8qIGJlc3QtZWZmb3J0ICovIH0pO1xuICAgIH0sIEZJTEVfTE9DS19IRUFSVEJFQVRfTVMpO1xuICAgIChpbnRlcnZhbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRNZXJnZUZpbGVMb2NrKHN0b3JhZ2UpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuaG9sZGVySWQgPT09IGhvbGRlcklkKSBhd2FpdCBzdG9yYWdlLnJlbW92ZShGSUxFX0xPQ0tfS0VZKTtcbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbn1cbiJdfQ==
|
|
130
|
+
/* _JS_SOURCE_HASH = "4835586d08d4f89d124b3f45f798b450a1de03dea4f9332b3dd22ae53f266c1f"; */
|
|
@@ -1,19 +1,12 @@
|
|
|
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
|
// Deletion markers: how a merge retires the input files it consumed WITHOUT deleting them inline.
|
|
3
|
-
//
|
|
4
|
-
// The old approach deleted consumed inputs on a 15-min timer. If the tab closed before the timer fired
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// EXCLUDED from reads the moment the marker exists (so they're never re-merged), and their physical
|
|
8
|
-
// deletion is driven off the marker on a later read instead of an in-process timer.
|
|
9
|
-
//
|
|
10
|
-
// A marker names the input files it wants gone (`deleteFiles`) and the output files that supersede them
|
|
11
|
-
// (`replacedBy`). On every read we:
|
|
3
|
+
//
|
|
4
|
+
// The old approach deleted consumed inputs on a 15-min timer. If the tab closed before the timer fired the inputs survived AND were still read — so the next merge re-merged the same duplicates, forever (the "1739 files, 155GB, 99% duplicate" loop). Markers fix both halves: the consumed inputs are EXCLUDED from reads the moment the marker exists (so they're never re-merged), and their physical deletion is driven off the marker on a later read instead of an in-process timer.
|
|
5
|
+
//
|
|
6
|
+
// A marker names the input files it wants gone (`deleteFiles`) and the output files that supersede them (`replacedBy`). On every read we:
|
|
12
7
|
// 1) exclude every `deleteFiles` entry from the active file set (unconditionally — that's the loop fix);
|
|
13
|
-
// 2) delete a marker's `deleteFiles` once its `replacedBy` outputs all exist OR the marker is older than
|
|
14
|
-
//
|
|
15
|
-
// 3) once a marker's `deleteFiles` are all gone, and the marker has aged past the grace window, delete
|
|
16
|
-
// the marker itself (kept around briefly so a concurrent reader still excludes the files consistently).
|
|
8
|
+
// 2) delete a marker's `deleteFiles` once its `replacedBy` outputs all exist OR the marker is older than the grace window (a crash-safety floor so a marker whose outputs never landed still gets cleaned);
|
|
9
|
+
// 3) once a marker's `deleteFiles` are all gone, and the marker has aged past the grace window, delete the marker itself (kept around briefly so a concurrent reader still excludes the files consistently).
|
|
17
10
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
18
11
|
exports.processDeleteMarkers = exports.markerExclusions = exports.readDeleteMarkers = exports.writeDeleteMarker = exports.isMarkerFile = void 0;
|
|
19
12
|
const logColors_1 = require("socket-function/src/formatting/logColors");
|
|
@@ -63,8 +56,7 @@ function markerExclusions(markers) {
|
|
|
63
56
|
return excluded;
|
|
64
57
|
}
|
|
65
58
|
exports.markerExclusions = markerExclusions;
|
|
66
|
-
// Act on each marker (see file header). Idempotent and best-effort: every removal is guarded, so two
|
|
67
|
-
// processes (or two reads) running this at once just race to the same already-correct end state.
|
|
59
|
+
// Act on each marker (see file header). Idempotent and best-effort: every removal is guarded, so two processes (or two reads) running this at once just race to the same already-correct end state.
|
|
68
60
|
async function processDeleteMarkers(name, storage, markers, allNames) {
|
|
69
61
|
const present = new Set(allNames);
|
|
70
62
|
const now = Date.now();
|
|
@@ -97,5 +89,5 @@ async function processDeleteMarkers(name, storage, markers, allNames) {
|
|
|
97
89
|
}
|
|
98
90
|
}
|
|
99
91
|
exports.processDeleteMarkers = processDeleteMarkers;
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VNYXJrZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VNYXJrZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrR0FBa0c7QUFDbEcsRUFBRTtBQUNGLHVHQUF1RztBQUN2RyxxR0FBcUc7QUFDckcsa0dBQWtHO0FBQ2xHLG9HQUFvRztBQUNwRyxvRkFBb0Y7QUFDcEYsRUFBRTtBQUNGLHdHQUF3RztBQUN4RyxvQ0FBb0M7QUFDcEMsMkdBQTJHO0FBQzNHLDJHQUEyRztBQUMzRywwR0FBMEc7QUFDMUcseUdBQXlHO0FBQ3pHLDZHQUE2Rzs7O0FBRzdHLHdFQUF5RTtBQUV6RSxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztBQUN4QyxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQVN0QyxTQUFnQixZQUFZLENBQUMsSUFBWTtJQUNyQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUZELG9DQUVDO0FBRU0sS0FBSyxVQUFVLGlCQUFpQixDQUFDLE9BQW9CLEVBQUUsTUFBdUQ7SUFDakgsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLEdBQUcsYUFBYSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENB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Q2IsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxJQUFJLGNBQWMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUN4RCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDakgsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQztvQkFBQyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUMsQ0FBQztnQkFBQyxRQUFRLGtCQUFrQixJQUFwQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBQ0QsSUFBSSxPQUFPO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxDQUFDLElBQUksSUFBQSxtQkFBTyxFQUFDLFFBQVEsQ0FBQyxhQUFhLE9BQU8sK0JBQStCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDN0gsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBdEJELG9EQXNCQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIERlbGV0aW9uIG1hcmtlcnM6IGhvdyBhIG1lcmdlIHJldGlyZXMgdGhlIGlucHV0IGZpbGVzIGl0IGNvbnN1bWVkIFdJVEhPVVQgZGVsZXRpbmcgdGhlbSBpbmxpbmUuXG4vL1xuLy8gVGhlIG9sZCBhcHByb2FjaCBkZWxldGVkIGNvbnN1bWVkIGlucHV0cyBvbiBhIDE1LW1pbiB0aW1lci4gSWYgdGhlIHRhYiBjbG9zZWQgYmVmb3JlIHRoZSB0aW1lciBmaXJlZFxuLy8gdGhlIGlucHV0cyBzdXJ2aXZlZCBBTkQgd2VyZSBzdGlsbCByZWFkIOKAlCBzbyB0aGUgbmV4dCBtZXJnZSByZS1tZXJnZWQgdGhlIHNhbWUgZHVwbGljYXRlcywgZm9yZXZlclxuLy8gKHRoZSBcIjE3MzkgZmlsZXMsIDE1NUdCLCA5OSUgZHVwbGljYXRlXCIgbG9vcCkuIE1hcmtlcnMgZml4IGJvdGggaGFsdmVzOiB0aGUgY29uc3VtZWQgaW5wdXRzIGFyZVxuLy8gRVhDTFVERUQgZnJvbSByZWFkcyB0aGUgbW9tZW50IHRoZSBtYXJrZXIgZXhpc3RzIChzbyB0aGV5J3JlIG5ldmVyIHJlLW1lcmdlZCksIGFuZCB0aGVpciBwaHlzaWNhbFxuLy8gZGVsZXRpb24gaXMgZHJpdmVuIG9mZiB0aGUgbWFya2VyIG9uIGEgbGF0ZXIgcmVhZCBpbnN0ZWFkIG9mIGFuIGluLXByb2Nlc3MgdGltZXIuXG4vL1xuLy8gQSBtYXJrZXIgbmFtZXMgdGhlIGlucHV0IGZpbGVzIGl0IHdhbnRzIGdvbmUgKGBkZWxldGVGaWxlc2ApIGFuZCB0aGUgb3V0cHV0IGZpbGVzIHRoYXQgc3VwZXJzZWRlIHRoZW1cbi8vIChgcmVwbGFjZWRCeWApLiBPbiBldmVyeSByZWFkIHdlOlxuLy8gICAxKSBleGNsdWRlIGV2ZXJ5IGBkZWxldGVGaWxlc2AgZW50cnkgZnJvbSB0aGUgYWN0aXZlIGZpbGUgc2V0ICh1bmNvbmRpdGlvbmFsbHkg4oCUIHRoYXQncyB0aGUgbG9vcCBmaXgpO1xuLy8gICAyKSBkZWxldGUgYSBtYXJrZXIncyBgZGVsZXRlRmlsZXNgIG9uY2UgaXRzIGByZXBsYWNlZEJ5YCBvdXRwdXRzIGFsbCBleGlzdCBPUiB0aGUgbWFya2VyIGlzIG9sZGVyIHRoYW5cbi8vICAgICAgdGhlIGdyYWNlIHdpbmRvdyAoYSBjcmFzaC1zYWZldHkgZmxvb3Igc28gYSBtYXJrZXIgd2hvc2Ugb3V0cHV0cyBuZXZlciBsYW5kZWQgc3RpbGwgZ2V0cyBjbGVhbmVkKTtcbi8vICAgMykgb25jZSBhIG1hcmtlcidzIGBkZWxldGVGaWxlc2AgYXJlIGFsbCBnb25lLCBhbmQgdGhlIG1hcmtlciBoYXMgYWdlZCBwYXN0IHRoZSBncmFjZSB3aW5kb3csIGRlbGV0ZVxuLy8gICAgICB0aGUgbWFya2VyIGl0c2VsZiAoa2VwdCBhcm91bmQgYnJpZWZseSBzbyBhIGNvbmN1cnJlbnQgcmVhZGVyIHN0aWxsIGV4Y2x1ZGVzIHRoZSBmaWxlcyBjb25zaXN0ZW50bHkpLlxuXG5pbXBvcnQgdHlwZSB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IGJsdWUsIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG5jb25zdCBNQVJLRVJfUFJFRklYID0gXCIuZGVsZXRlLW1hcmtlcl9cIjtcbmNvbnN0IE1BUktFUl9HUkFDRV9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbmV4cG9ydCB0eXBlIERlbGV0ZU1hcmtlciA9IHtcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGRlbGV0ZUZpbGVzOiBzdHJpbmdbXTtcbiAgICByZXBsYWNlZEJ5OiBzdHJpbmdbXTtcbiAgICB0aW1lOiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXJrZXJGaWxlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoTUFSS0VSX1BSRUZJWCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZURlbGV0ZU1hcmtlcihzdG9yYWdlOiBGaWxlU3RvcmFnZSwgY29uZmlnOiB7IGRlbGV0ZUZpbGVzOiBzdHJpbmdbXTsgcmVwbGFjZWRCeTogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IG5hbWUgPSBgJHtNQVJLRVJfUFJFRklYfSR7dGltZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBkZWxldGVGaWxlczogY29uZmlnLmRlbGV0ZUZpbGVzLCByZXBsYWNlZEJ5OiBjb25maWcucmVwbGFjZWRCeSwgdGltZSB9KTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldChuYW1lLCBCdWZmZXIuZnJvbShib2R5LCBcInV0ZjhcIikgYXMgQnVmZmVyKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWREZWxldGVNYXJrZXJzKHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBhbGxOYW1lczogc3RyaW5nW10pOiBQcm9taXNlPERlbGV0ZU1hcmtlcltdPiB7XG4gICAgY29uc3QgbWFya2VyTmFtZXMgPSBhbGxOYW1lcy5maWx0ZXIoaXNNYXJrZXJGaWxlKTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwobWFya2VyTmFtZXMubWFwKGFzeW5jIChmaWxlTmFtZSk6IFByb21pc2U8RGVsZXRlTWFya2VyIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBidWYgPSBhd2FpdCBzdG9yYWdlLmdldChmaWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWJ1ZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSkgYXMgeyBkZWxldGVGaWxlcz86IHVua25vd247IHJlcGxhY2VkQnk/OiB1bmtub3duOyB0aW1lPzogdW5rbm93biB9O1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZC5kZWxldGVGaWxlcykgfHwgIUFycmF5LmlzQXJyYXkocGFyc2VkLnJlcGxhY2VkQnkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICBkZWxldGVGaWxlczogcGFyc2VkLmRlbGV0ZUZpbGVzIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VkQnk6IHBhcnNlZC5yZXBsYWNlZEJ5IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHRpbWU6IHR5cGVvZiBwYXJzZWQudGltZSA9PT0gXCJudW1iZXJcIiA/IHBhcnNlZC50aW1lIDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICByZXR1cm4gbWFya2Vycy5maWx0ZXIoKG0pOiBtIGlzIERlbGV0ZU1hcmtlciA9PiAhIW0pO1xufVxuXG4vLyBUaGUgc2V0IG9mIGZpbGVzIHRoYXQgYW55IG1hcmtlciB3YW50cyBkZWxldGVkIOKAlCB0aGVzZSBtdXN0IGJlIGRyb3BwZWQgZnJvbSB0aGUgYWN0aXZlIHJlYWQgc2V0LlxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckV4Y2x1c2lvbnMobWFya2VyczogRGVsZXRlTWFya2VyW10pOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgZXhjbHVkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbWFya2VycykgZm9yIChjb25zdCBuIG9mIG0uZGVsZXRlRmlsZXMpIGV4Y2x1ZGVkLmFkZChuKTtcbiAgICByZXR1cm4gZXhjbHVkZWQ7XG59XG5cbi8vIEFjdCBvbiBlYWNoIG1hcmtlciAoc2VlIGZpbGUgaGVhZGVyKS4gSWRlbXBvdGVudCBhbmQgYmVzdC1lZmZvcnQ6IGV2ZXJ5IHJlbW92YWwgaXMgZ3VhcmRlZCwgc28gdHdvXG4vLyBwcm9jZXNzZXMgKG9yIHR3byByZWFkcykgcnVubmluZyB0aGlzIGF0IG9uY2UganVzdCByYWNlIHRvIHRoZSBzYW1lIGFscmVhZHktY29ycmVjdCBlbmQgc3RhdGUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RlbGV0ZU1hcmtlcnMobmFtZTogc3RyaW5nLCBzdG9yYWdlOiBGaWxlU3RvcmFnZSwgbWFya2VyczogRGVsZXRlTWFya2VyW10sIGFsbE5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGFsbE5hbWVzKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgICAgY29uc3Qgc3RpbGxQcmVzZW50ID0gbWFya2VyLmRlbGV0ZUZpbGVzLmZpbHRlcihuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKCFzdGlsbFByZXNlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlsZXMgdGhpcyBtYXJrZXIgcmV0aXJlZCBhcmUgZ29uZTsgb25jZSBpdCdzIGFnZWQgcGFzdCB0aGUgZ3JhY2Ugd2luZG93LCByZXRpcmUgdGhlIG1hcmtlciB0b28uXG4gICAgICAgICAgICBpZiAobm93IC0gbWFya2VyLnRpbWUgPiBNQVJLRVJfR1JBQ0VfTVMpIHtcbiAgICAgICAgICAgICAgICB0cnkgeyBhd2FpdCBzdG9yYWdlLnJlbW92ZShtYXJrZXIuZmlsZU5hbWUpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkRXhpc3RzID0gbWFya2VyLnJlcGxhY2VkQnkubGVuZ3RoID4gMCAmJiBtYXJrZXIucmVwbGFjZWRCeS5ldmVyeShuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKHJlcGxhY2VkRXhpc3RzIHx8IG5vdyAtIG1hcmtlci50aW1lID4gTUFSS0VSX0dSQUNFX01TKSB7XG4gICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXBsYWNlZEV4aXN0cyA/IGByZXBsYWNlbWVudHMgbGFuZGVkYCA6IGBtYXJrZXIgYWdlZCAke01hdGgucm91bmQoKG5vdyAtIG1hcmtlci50aW1lKSAvIDEwMDApfXNgO1xuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHN0aWxsUHJlc2VudCkge1xuICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IHN0b3JhZ2UucmVtb3ZlKG4pOyBkZWxldGVkKys7IH0gY2F0Y2ggeyAvKiBhbHJlYWR5IGdvbmUgKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIGNvbnNvbGUubG9nKGAke2JsdWUobmFtZSl9ICR7bWFnZW50YShcInJldGlyZVwiKX06IGRlbGV0ZWQgJHtkZWxldGVkfSBtZXJnZWQtYXdheSBpbnB1dCBmaWxlKHMpICgke3JlYXNvbn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
101
|
-
/* _JS_SOURCE_HASH = "
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VNYXJrZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VNYXJrZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrR0FBa0c7QUFDbEcsR0FBRztBQUNILDhkQUE4ZDtBQUM5ZCxHQUFHO0FBQ0gsMElBQTBJO0FBQzFJLDJHQUEyRztBQUMzRyw4TUFBOE07QUFDOU0sK01BQStNOzs7QUFHL00sd0VBQXlFO0FBRXpFLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDO0FBQ3hDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBU3RDLFNBQWdCLFlBQVksQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRkQsb0NBRUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsT0FBb0IsRUFBRSxNQUF1RDtJQUNqSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDeEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxhQUFhLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFXLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBTEQsOENBS0M7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsT0FBb0IsRUFB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QUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxjQUFjLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDeEQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2pILElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUM7b0JBQUMsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsUUFBUSxrQkFBa0IsSUFBcEIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUNELElBQUksT0FBTztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLElBQUEsbUJBQU8sRUFBQyxRQUFRLENBQUMsYUFBYSxPQUFPLCtCQUErQixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdILENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQztBQXRCRCxvREFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZWxldGlvbiBtYXJrZXJzOiBob3cgYSBtZXJnZSByZXRpcmVzIHRoZSBpbnB1dCBmaWxlcyBpdCBjb25zdW1lZCBXSVRIT1VUIGRlbGV0aW5nIHRoZW0gaW5saW5lLlxuLy8gXG4vLyBUaGUgb2xkIGFwcHJvYWNoIGRlbGV0ZWQgY29uc3VtZWQgaW5wdXRzIG9uIGEgMTUtbWluIHRpbWVyLiBJZiB0aGUgdGFiIGNsb3NlZCBiZWZvcmUgdGhlIHRpbWVyIGZpcmVkIHRoZSBpbnB1dHMgc3Vydml2ZWQgQU5EIHdlcmUgc3RpbGwgcmVhZCDigJQgc28gdGhlIG5leHQgbWVyZ2UgcmUtbWVyZ2VkIHRoZSBzYW1lIGR1cGxpY2F0ZXMsIGZvcmV2ZXIgKHRoZSBcIjE3MzkgZmlsZXMsIDE1NUdCLCA5OSUgZHVwbGljYXRlXCIgbG9vcCkuIE1hcmtlcnMgZml4IGJvdGggaGFsdmVzOiB0aGUgY29uc3VtZWQgaW5wdXRzIGFyZSBFWENMVURFRCBmcm9tIHJlYWRzIHRoZSBtb21lbnQgdGhlIG1hcmtlciBleGlzdHMgKHNvIHRoZXkncmUgbmV2ZXIgcmUtbWVyZ2VkKSwgYW5kIHRoZWlyIHBoeXNpY2FsIGRlbGV0aW9uIGlzIGRyaXZlbiBvZmYgdGhlIG1hcmtlciBvbiBhIGxhdGVyIHJlYWQgaW5zdGVhZCBvZiBhbiBpbi1wcm9jZXNzIHRpbWVyLlxuLy8gXG4vLyBBIG1hcmtlciBuYW1lcyB0aGUgaW5wdXQgZmlsZXMgaXQgd2FudHMgZ29uZSAoYGRlbGV0ZUZpbGVzYCkgYW5kIHRoZSBvdXRwdXQgZmlsZXMgdGhhdCBzdXBlcnNlZGUgdGhlbSAoYHJlcGxhY2VkQnlgKS4gT24gZXZlcnkgcmVhZCB3ZTpcbi8vICAgMSkgZXhjbHVkZSBldmVyeSBgZGVsZXRlRmlsZXNgIGVudHJ5IGZyb20gdGhlIGFjdGl2ZSBmaWxlIHNldCAodW5jb25kaXRpb25hbGx5IOKAlCB0aGF0J3MgdGhlIGxvb3AgZml4KTtcbi8vICAgMikgZGVsZXRlIGEgbWFya2VyJ3MgYGRlbGV0ZUZpbGVzYCBvbmNlIGl0cyBgcmVwbGFjZWRCeWAgb3V0cHV0cyBhbGwgZXhpc3QgT1IgdGhlIG1hcmtlciBpcyBvbGRlciB0aGFuIHRoZSBncmFjZSB3aW5kb3cgKGEgY3Jhc2gtc2FmZXR5IGZsb29yIHNvIGEgbWFya2VyIHdob3NlIG91dHB1dHMgbmV2ZXIgbGFuZGVkIHN0aWxsIGdldHMgY2xlYW5lZCk7XG4vLyAgIDMpIG9uY2UgYSBtYXJrZXIncyBgZGVsZXRlRmlsZXNgIGFyZSBhbGwgZ29uZSwgYW5kIHRoZSBtYXJrZXIgaGFzIGFnZWQgcGFzdCB0aGUgZ3JhY2Ugd2luZG93LCBkZWxldGUgdGhlIG1hcmtlciBpdHNlbGYgKGtlcHQgYXJvdW5kIGJyaWVmbHkgc28gYSBjb25jdXJyZW50IHJlYWRlciBzdGlsbCBleGNsdWRlcyB0aGUgZmlsZXMgY29uc2lzdGVudGx5KS5cblxuaW1wb3J0IHR5cGUgeyBGaWxlU3RvcmFnZSB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQgeyBibHVlLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcblxuY29uc3QgTUFSS0VSX1BSRUZJWCA9IFwiLmRlbGV0ZS1tYXJrZXJfXCI7XG5jb25zdCBNQVJLRVJfR1JBQ0VfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG5leHBvcnQgdHlwZSBEZWxldGVNYXJrZXIgPSB7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICBkZWxldGVGaWxlczogc3RyaW5nW107XG4gICAgcmVwbGFjZWRCeTogc3RyaW5nW107XG4gICAgdGltZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya2VyRmlsZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKE1BUktFUl9QUkVGSVgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVEZWxldGVNYXJrZXIoc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGNvbmZpZzogeyBkZWxldGVGaWxlczogc3RyaW5nW107IHJlcGxhY2VkQnk6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBuYW1lID0gYCR7TUFSS0VSX1BSRUZJWH0ke3RpbWV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWA7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHsgZGVsZXRlRmlsZXM6IGNvbmZpZy5kZWxldGVGaWxlcywgcmVwbGFjZWRCeTogY29uZmlnLnJlcGxhY2VkQnksIHRpbWUgfSk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQobmFtZSwgQnVmZmVyLmZyb20oYm9keSwgXCJ1dGY4XCIpIGFzIEJ1ZmZlcik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRGVsZXRlTWFya2VycyhzdG9yYWdlOiBGaWxlU3RvcmFnZSwgYWxsTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxEZWxldGVNYXJrZXJbXT4ge1xuICAgIGNvbnN0IG1hcmtlck5hbWVzID0gYWxsTmFtZXMuZmlsdGVyKGlzTWFya2VyRmlsZSk7XG4gICAgY29uc3QgbWFya2VycyA9IGF3YWl0IFByb21pc2UuYWxsKG1hcmtlck5hbWVzLm1hcChhc3luYyAoZmlsZU5hbWUpOiBQcm9taXNlPERlbGV0ZU1hcmtlciB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgc3RvcmFnZS5nZXQoZmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFidWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpIGFzIHsgZGVsZXRlRmlsZXM/OiB1bmtub3duOyByZXBsYWNlZEJ5PzogdW5rbm93bjsgdGltZT86IHVua25vd24gfTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQuZGVsZXRlRmlsZXMpIHx8ICFBcnJheS5pc0FycmF5KHBhcnNlZC5yZXBsYWNlZEJ5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgZGVsZXRlRmlsZXM6IHBhcnNlZC5kZWxldGVGaWxlcyBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICByZXBsYWNlZEJ5OiBwYXJzZWQucmVwbGFjZWRCeSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICB0aW1lOiB0eXBlb2YgcGFyc2VkLnRpbWUgPT09IFwibnVtYmVyXCIgPyBwYXJzZWQudGltZSA6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgcmV0dXJuIG1hcmtlcnMuZmlsdGVyKChtKTogbSBpcyBEZWxldGVNYXJrZXIgPT4gISFtKTtcbn1cblxuLy8gVGhlIHNldCBvZiBmaWxlcyB0aGF0IGFueSBtYXJrZXIgd2FudHMgZGVsZXRlZCDigJQgdGhlc2UgbXVzdCBiZSBkcm9wcGVkIGZyb20gdGhlIGFjdGl2ZSByZWFkIHNldC5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJFeGNsdXNpb25zKG1hcmtlcnM6IERlbGV0ZU1hcmtlcltdKTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGV4Y2x1ZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtIG9mIG1hcmtlcnMpIGZvciAoY29uc3QgbiBvZiBtLmRlbGV0ZUZpbGVzKSBleGNsdWRlZC5hZGQobik7XG4gICAgcmV0dXJuIGV4Y2x1ZGVkO1xufVxuXG4vLyBBY3Qgb24gZWFjaCBtYXJrZXIgKHNlZSBmaWxlIGhlYWRlcikuIElkZW1wb3RlbnQgYW5kIGJlc3QtZWZmb3J0OiBldmVyeSByZW1vdmFsIGlzIGd1YXJkZWQsIHNvIHR3byBwcm9jZXNzZXMgKG9yIHR3byByZWFkcykgcnVubmluZyB0aGlzIGF0IG9uY2UganVzdCByYWNlIHRvIHRoZSBzYW1lIGFscmVhZHktY29ycmVjdCBlbmQgc3RhdGUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RlbGV0ZU1hcmtlcnMobmFtZTogc3RyaW5nLCBzdG9yYWdlOiBGaWxlU3RvcmFnZSwgbWFya2VyczogRGVsZXRlTWFya2VyW10sIGFsbE5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGFsbE5hbWVzKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgICAgY29uc3Qgc3RpbGxQcmVzZW50ID0gbWFya2VyLmRlbGV0ZUZpbGVzLmZpbHRlcihuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKCFzdGlsbFByZXNlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlsZXMgdGhpcyBtYXJrZXIgcmV0aXJlZCBhcmUgZ29uZTsgb25jZSBpdCdzIGFnZWQgcGFzdCB0aGUgZ3JhY2Ugd2luZG93LCByZXRpcmUgdGhlIG1hcmtlciB0b28uXG4gICAgICAgICAgICBpZiAobm93IC0gbWFya2VyLnRpbWUgPiBNQVJLRVJfR1JBQ0VfTVMpIHtcbiAgICAgICAgICAgICAgICB0cnkgeyBhd2FpdCBzdG9yYWdlLnJlbW92ZShtYXJrZXIuZmlsZU5hbWUpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkRXhpc3RzID0gbWFya2VyLnJlcGxhY2VkQnkubGVuZ3RoID4gMCAmJiBtYXJrZXIucmVwbGFjZWRCeS5ldmVyeShuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKHJlcGxhY2VkRXhpc3RzIHx8IG5vdyAtIG1hcmtlci50aW1lID4gTUFSS0VSX0dSQUNFX01TKSB7XG4gICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXBsYWNlZEV4aXN0cyA/IGByZXBsYWNlbWVudHMgbGFuZGVkYCA6IGBtYXJrZXIgYWdlZCAke01hdGgucm91bmQoKG5vdyAtIG1hcmtlci50aW1lKSAvIDEwMDApfXNgO1xuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHN0aWxsUHJlc2VudCkge1xuICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IHN0b3JhZ2UucmVtb3ZlKG4pOyBkZWxldGVkKys7IH0gY2F0Y2ggeyAvKiBhbHJlYWR5IGdvbmUgKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIGNvbnNvbGUubG9nKGAke2JsdWUobmFtZSl9ICR7bWFnZW50YShcInJldGlyZVwiKX06IGRlbGV0ZWQgJHtkZWxldGVkfSBtZXJnZWQtYXdheSBpbnB1dCBmaWxlKHMpICgke3JlYXNvbn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
93
|
+
/* _JS_SOURCE_HASH = "467563fc9e9ab0cb44c142e68d864cde7f3a0ac92c177b15c7b80ba76a9f88cd"; */
|
|
@@ -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
|
};
|
|
@@ -6,16 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true , configurable: true}
|
|
|
6
6
|
//exports.streamReaderFromEntries = exports.parseStream = exports.frameDeletes = exports.frameRows = exports.STREAM_EXTENSION = void 0;
|
|
7
7
|
const cbor_x_1 = __importDefault(require("cbor-x"));
|
|
8
8
|
const BulkDatabaseFormat_1 = require("./BulkDatabaseFormat");
|
|
9
|
-
// Tier-0 streaming format: an append log of whole-row writes and deletes (row-format, not columnar),
|
|
10
|
-
//
|
|
11
|
-
//
|
|
9
|
+
// Tier-0 streaming format: an append log of whole-row writes and deletes (row-format, not columnar), so small mutations are a single cheap append instead of rewriting a columnar file. Each block is:
|
|
10
|
+
//
|
|
12
11
|
// [u32 len][CBOR({ t, v }) or CBOR({ t, d })][u32 len]
|
|
13
|
-
//
|
|
14
|
-
// `t` is a per-write unique timestamp (getTimeUnique); `v` is a set row; `d` is a deleted key. Because
|
|
15
|
-
// every thread streams to its own file, the only way to recover the global mutation order — needed
|
|
16
|
-
// for newest-wins — is a per-write timestamp, with ties broken by file name. The trailing length must
|
|
17
|
-
// match the leading one; a torn/incomplete append leaves a mismatched or missing suffix, so we stop
|
|
18
|
-
// there and report trailing bad bytes instead of throwing. structuredClone preserves typed arrays.
|
|
12
|
+
//
|
|
13
|
+
// `t` is a per-write unique timestamp (getTimeUnique); `v` is a set row; `d` is a deleted key. Because every thread streams to its own file, the only way to recover the global mutation order — needed for newest-wins — is a per-write timestamp, with ties broken by file name. The trailing length must match the leading one; a torn/incomplete append leaves a mismatched or missing suffix, so we stop there and report trailing bad bytes instead of throwing. structuredClone preserves typed arrays.
|
|
19
14
|
exports.STREAM_EXTENSION = ".stream";
|
|
20
15
|
const cborEncoder = new cbor_x_1.default.Encoder({ structuredClone: true });
|
|
21
16
|
function frame(payload) {
|
|
@@ -23,12 +18,8 @@ function frame(payload) {
|
|
|
23
18
|
len.writeUInt32LE(payload.length, 0);
|
|
24
19
|
return Buffer.concat([len, payload, len]);
|
|
25
20
|
}
|
|
26
|
-
// Framing only — no batching here. BulkDatabase2 coalesces and flushes these framed bytes on a ramping
|
|
27
|
-
//
|
|
28
|
-
// API rewrites the whole file on every append, so one-append-per-write is quadratic. The first write
|
|
29
|
-
// after a lull still flushes immediately, so a single action then a tab close is saved at once.
|
|
30
|
-
// Times are assigned by the caller (BulkDatabase2) so the exact same timestamp lands on disk, in the
|
|
31
|
-
// in-memory overlay, and in the cross-tab broadcast — keeping the global write order consistent.
|
|
21
|
+
// Framing only — no batching here. BulkDatabase2 coalesces and flushes these framed bytes on a ramping per-collection schedule (see streamAppend in BulkDatabaseBase), because the browser File System Access API rewrites the whole file on every append, so one-append-per-write is quadratic. The first write after a lull still flushes immediately, so a single action then a tab close is saved at once.
|
|
22
|
+
// Times are assigned by the caller (BulkDatabase2) so the exact same timestamp lands on disk, in the in-memory overlay, and in the cross-tab broadcast — keeping the global write order consistent.
|
|
32
23
|
function frameRows(entries) {
|
|
33
24
|
return Buffer.concat(entries.map(e => frame(Buffer.from(cborEncoder.encode({ t: e.time, v: e.row })))));
|
|
34
25
|
}
|
|
@@ -64,12 +55,7 @@ function parseStream(buffer) {
|
|
|
64
55
|
return { entries, badBytes: buffer.length - pos };
|
|
65
56
|
}
|
|
66
57
|
exports.parseStream = parseStream;
|
|
67
|
-
// Wraps streamed entries (already ordered oldest-first) as a BaseBulkDatabaseReader. Each set MERGES
|
|
68
|
-
// its fields onto the key's current row (so a partial write/update only changes the columns it
|
|
69
|
-
// includes); a delete tombstones the key (exposed via deletedKeys so the join suppresses it in older
|
|
70
|
-
// bulk readers) and resets the merge. A column the merged row never set reads as ABSENT, so the join
|
|
71
|
-
// falls through to older readers for it. Also returns the latest timestamp seen per key (live or
|
|
72
|
-
// deleted), used for cross-tab conflict resolution.
|
|
58
|
+
// Wraps streamed entries (already ordered oldest-first) as a BaseBulkDatabaseReader. Each set MERGES its fields onto the key's current row (so a partial write/update only changes the columns it includes); a delete tombstones the key (exposed via deletedKeys so the join suppresses it in older bulk readers) and resets the merge. A column the merged row never set reads as ABSENT, so the join falls through to older readers for it. Also returns the latest timestamp seen per key (live or deleted), used for cross-tab conflict resolution.
|
|
73
59
|
function streamReaderFromEntries(entries, totalBytes) {
|
|
74
60
|
let byKey = new Map();
|
|
75
61
|
let deletedKeys = new Set();
|
|
@@ -103,8 +89,7 @@ function streamReaderFromEntries(entries, totalBytes) {
|
|
|
103
89
|
let deleteTimes = new Map();
|
|
104
90
|
for (let key of deletedKeys)
|
|
105
91
|
deleteTimes.set(key, times.get(key) || 0);
|
|
106
|
-
// Iterate to find min/max — NOT Math.min(...times)/Math.max(...times): spreading a large array as call
|
|
107
|
-
// arguments overflows the stack ("Maximum call stack size exceeded") once a stream has many keys.
|
|
92
|
+
// Iterate to find min/max — NOT Math.min(...times)/Math.max(...times): spreading a large array as call arguments overflows the stack ("Maximum call stack size exceeded") once a stream has many keys.
|
|
108
93
|
let minTime = Infinity, maxTime = -Infinity;
|
|
109
94
|
for (let t of times.values()) {
|
|
110
95
|
if (t < minTime)
|
|
@@ -123,8 +108,7 @@ function streamReaderFromEntries(entries, totalBytes) {
|
|
|
123
108
|
keyTimes: new Map(keys.map(key => [key, times.get(key) || 0])),
|
|
124
109
|
columns,
|
|
125
110
|
deleteTimes,
|
|
126
|
-
// A key's time is its latest write across all columns (per-key, not per-column). For a column
|
|
127
|
-
// it never set we return ABSENT so the join falls through to an older reader.
|
|
111
|
+
// A key's time is its latest write across all columns (per-key, not per-column). For a column it never set we return ABSENT so the join falls through to an older reader.
|
|
128
112
|
async getColumn(column) {
|
|
129
113
|
return keys.map(key => {
|
|
130
114
|
let row = byKey.get(key);
|
|
@@ -137,9 +121,7 @@ function streamReaderFromEntries(entries, totalBytes) {
|
|
|
137
121
|
return BulkDatabaseFormat_1.ABSENT;
|
|
138
122
|
return { value: row[column], time: times.get(key) || 0 };
|
|
139
123
|
},
|
|
140
|
-
// Stream values are decoded objects (CBOR), so unlike a bulk file we have to encode them to raw
|
|
141
|
-
// cells here. Stream data is small (tier-0, size-capped), so this is cheap. A column the row never
|
|
142
|
-
// set is omitted (ABSENT → fall through); a stored undefined is kept (a real clear).
|
|
124
|
+
// Stream values are decoded objects (CBOR), so unlike a bulk file we have to encode them to raw cells here. Stream data is small (tier-0, size-capped), so this is cheap. A column the row never set is omitted (ABSENT → fall through); a stored undefined is kept (a real clear).
|
|
143
125
|
async getRawColumn(column) {
|
|
144
126
|
let map = new Map();
|
|
145
127
|
for (let key of keys) {
|
|
@@ -150,10 +132,7 @@ function streamReaderFromEntries(entries, totalBytes) {
|
|
|
150
132
|
}
|
|
151
133
|
return map;
|
|
152
134
|
},
|
|
153
|
-
// Per-column index in the same shape a bulk file exposes, materialized in memory once (stream data
|
|
154
|
-
// is tier-0, size-capped, so the encode is cheap). Lets the planned merge treat stream + bulk
|
|
155
|
-
// sources uniformly: it loads each (source, column) index, uses offsets/types to plan the output's
|
|
156
|
-
// byte layout, and reads contiguous runs from this index's in-memory data buffer during execute.
|
|
135
|
+
// Per-column index in the same shape a bulk file exposes, materialized in memory once (stream data is tier-0, size-capped, so the encode is cheap). Lets the planned merge treat stream + bulk sources uniformly: it loads each (source, column) index, uses offsets/types to plan the output's byte layout, and reads contiguous runs from this index's in-memory data buffer during execute.
|
|
157
136
|
async getColumnIndex(column) {
|
|
158
137
|
return getStreamColumnIndex(keys, byKey, column);
|
|
159
138
|
},
|
|
@@ -164,18 +143,14 @@ function streamReaderFromEntries(entries, totalBytes) {
|
|
|
164
143
|
return { reader, times };
|
|
165
144
|
}
|
|
166
145
|
exports.streamReaderFromEntries = streamReaderFromEntries;
|
|
167
|
-
// keys[] is the column-side row order for this stream reader; rowOfKey is used by the planner to look up
|
|
168
|
-
// a winning cell's source row without going through a column read. Stays consistent with getColumnIndex,
|
|
169
|
-
// which builds its offsets/types over the same `keys` array in the same order.
|
|
146
|
+
// keys[] is the column-side row order for this stream reader; rowOfKey is used by the planner to look up a winning cell's source row without going through a column read. Stays consistent with getColumnIndex, which builds its offsets/types over the same `keys` array in the same order.
|
|
170
147
|
function buildKeyIndex(keys) {
|
|
171
148
|
const m = new Map();
|
|
172
149
|
for (let i = 0; i < keys.length; i++)
|
|
173
150
|
m.set(keys[i], i);
|
|
174
151
|
return m;
|
|
175
152
|
}
|
|
176
|
-
// Build a stream-side ColumnIndex (offsets + types + a contiguous-row byte slicer) over the in-memory
|
|
177
|
-
// merged rows. Encodes each row's value for this column once into a single backing buffer; readValueBytes
|
|
178
|
-
// then slices it. Cached per (reader, column) so a merge planning + execution pass doesn't re-encode.
|
|
153
|
+
// Build a stream-side ColumnIndex (offsets + types + a contiguous-row byte slicer) over the in-memory merged rows. Encodes each row's value for this column once into a single backing buffer; readValueBytes then slices it. Cached per (reader, column) so a merge planning + execution pass doesn't re-encode.
|
|
179
154
|
function getStreamColumnIndex(keys, byKey, column) {
|
|
180
155
|
var _a;
|
|
181
156
|
let cached = (_a = columnIndexCache.get(byKey)) === null || _a === void 0 ? void 0 : _a.get(column);
|
|
@@ -220,8 +195,7 @@ function getStreamColumnIndex(keys, byKey, column) {
|
|
|
220
195
|
perReader.set(column, idx);
|
|
221
196
|
return idx;
|
|
222
197
|
}
|
|
223
|
-
// Per stream-reader cache of its column indexes. Keyed by the reader's byKey map (a fresh
|
|
224
|
-
// streamReaderFromEntries call produces a fresh map, so this is effectively per-reader).
|
|
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).
|
|
225
199
|
const columnIndexCache = new WeakMap();
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyZWFtTG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUEyQjtBQUMzQiw2REFBd0k7QUFFeEkscUdBQXFHO0FBQ3JHLG9HQUFvRztBQUNwRyxFQUFFO0FBQ0YsMkRBQTJEO0FBQzNELEVBQUU7QUFDRix1R0FBdUc7QUFDdkcsbUdBQW1HO0FBQ25HLHNHQUFzRztBQUN0RyxvR0FBb0c7QUFDcEcsbUdBQW1HO0FBRXRGLFFBQUEsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0FBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUlqRSxTQUFTLEtBQUssQ0FBQyxPQUFlO0lBQzFCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLHlHQUF5RztBQUN6RyxxR0FBcUc7QUFDckcsZ0dBQWdHO0FBRWhHLHFHQUFxRztBQUNyRyxpR0FBaUc7QUFDakcsU0FBZ0IsU0FBUyxDQUFDLE9BQXlEO0lBQy9FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FB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RyxHQUFnQjtRQUNyQixPQUFPO1FBQ1AsS0FBSztRQUNMLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU07WUFDakMsSUFBSSxNQUFNLElBQUksUUFBUTtnQkFBRSxPQUFPLGlDQUFZLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsSUFBSSxLQUFLO2dCQUFFLE9BQU8saUNBQVksQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7S0FDSixDQUFDO0lBQ0YsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDbEYsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0IsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLHlGQUF5RjtBQUN6RixNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFrRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNib3J4IGZyb20gXCJjYm9yLXhcIjtcbmltcG9ydCB7IEFCU0VOVCwgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgQ29sdW1uSW5kZXgsIEVNUFRZX0JVRkZFUiwgZW5jb2RlVmFsdWUsIFJhd0NlbGwsIFRZUEVfQUJTRU5UX1RBRyB9IGZyb20gXCIuL0J1bGtEYXRhYmFzZUZvcm1hdFwiO1xuXG4vLyBUaWVyLTAgc3RyZWFtaW5nIGZvcm1hdDogYW4gYXBwZW5kIGxvZyBvZiB3aG9sZS1yb3cgd3JpdGVzIGFuZCBkZWxldGVzIChyb3ctZm9ybWF0LCBub3QgY29sdW1uYXIpLFxuLy8gc28gc21hbGwgbXV0YXRpb25zIGFyZSBhIHNpbmdsZSBjaGVhcCBhcHBlbmQgaW5zdGVhZCBvZiByZXdyaXRpbmcgYSBjb2x1bW5hciBmaWxlLiBFYWNoIGJsb2NrIGlzOlxuLy9cbi8vICAgW3UzMiBsZW5dW0NCT1IoeyB0LCB2IH0pICBvciAgQ0JPUih7IHQsIGQgfSldW3UzMiBsZW5dXG4vL1xuLy8gYHRgIGlzIGEgcGVyLXdyaXRlIHVuaXF1ZSB0aW1lc3RhbXAgKGdldFRpbWVVbmlxdWUpOyBgdmAgaXMgYSBzZXQgcm93OyBgZGAgaXMgYSBkZWxldGVkIGtleS4gQmVjYXVzZVxuLy8gZXZlcnkgdGhyZWFkIHN0cmVhbXMgdG8gaXRzIG93biBmaWxlLCB0aGUgb25seSB3YXkgdG8gcmVjb3ZlciB0aGUgZ2xvYmFsIG11dGF0aW9uIG9yZGVyIOKAlCBuZWVkZWRcbi8vIGZvciBuZXdlc3Qtd2lucyDigJQgaXMgYSBwZXItd3JpdGUgdGltZXN0YW1wLCB3aXRoIHRpZXMgYnJva2VuIGJ5IGZpbGUgbmFtZS4gVGhlIHRyYWlsaW5nIGxlbmd0aCBtdXN0XG4vLyBtYXRjaCB0aGUgbGVhZGluZyBvbmU7IGEgdG9ybi9pbmNvbXBsZXRlIGFwcGVuZCBsZWF2ZXMgYSBtaXNtYXRjaGVkIG9yIG1pc3Npbmcgc3VmZml4LCBzbyB3ZSBzdG9wXG4vLyB0aGVyZSBhbmQgcmVwb3J0IHRyYWlsaW5nIGJhZCBieXRlcyBpbnN0ZWFkIG9mIHRocm93aW5nLiBzdHJ1Y3R1cmVkQ2xvbmUgcHJlc2VydmVzIHR5cGVkIGFycmF5cy5cblxuZXhwb3J0IGNvbnN0IFNUUkVBTV9FWFRFTlNJT04gPSBcIi5zdHJlYW1cIjtcblxuY29uc3QgY2JvckVuY29kZXIgPSBuZXcgY2JvcnguRW5jb2Rlcih7IHN0cnVjdHVyZWRDbG9uZTogdHJ1ZSB9KTtcblxuZXhwb3J0IHR5cGUgU3RyZWFtRW50cnkgPSB7IHRpbWU6IG51bWJlcjsgcm93PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGRlbGV0ZWRLZXk/OiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gZnJhbWUocGF5bG9hZDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBsZXQgbGVuID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGxlbi53cml0ZVVJbnQzMkxFKHBheWxvYWQubGVuZ3RoLCAwKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbbGVuLCBwYXlsb2FkLCBsZW5dKTtcbn1cblxuLy8gRnJhbWluZyBvbmx5IOKAlCBubyBiYXRjaGluZyBoZXJlLiBCdWxrRGF0YWJhc2UyIGNvYWxlc2NlcyBhbmQgZmx1c2hlcyB0aGVzZSBmcmFtZWQgYnl0ZXMgb24gYSByYW1waW5nXG4vLyBwZXItY29sbGVjdGlvbiBzY2hlZHVsZSAoc2VlIHN0cmVhbUFwcGVuZCBpbiBCdWxrRGF0YWJhc2VCYXNlKSwgYmVjYXVzZSB0aGUgYnJvd3NlciBGaWxlIFN5c3RlbSBBY2Nlc3Ncbi8vIEFQSSByZXdyaXRlcyB0aGUgd2hvbGUgZmlsZSBvbiBldmVyeSBhcHBlbmQsIHNvIG9uZS1hcHBlbmQtcGVyLXdyaXRlIGlzIHF1YWRyYXRpYy4gVGhlIGZpcnN0IHdyaXRlXG4vLyBhZnRlciBhIGx1bGwgc3RpbGwgZmx1c2hlcyBpbW1lZGlhdGVseSwgc28gYSBzaW5nbGUgYWN0aW9uIHRoZW4gYSB0YWIgY2xvc2UgaXMgc2F2ZWQgYXQgb25jZS5cblxuLy8gVGltZXMgYXJlIGFzc2lnbmVkIGJ5IHRoZSBjYWxsZXIgKEJ1bGtEYXRhYmFzZTIpIHNvIHRoZSBleGFjdCBzYW1lIHRpbWVzdGFtcCBsYW5kcyBvbiBkaXNrLCBpbiB0aGVcbi8vIGluLW1lbW9yeSBvdmVybGF5LCBhbmQgaW4gdGhlIGNyb3NzLXRhYiBicm9hZGNhc3Qg4oCUIGtlZXBpbmcgdGhlIGdsb2JhbCB3cml0ZSBvcmRlciBjb25zaXN0ZW50LlxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1lUm93cyhlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9W10pOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGVudHJpZXMubWFwKGUgPT4gZnJhbWUoQnVmZmVyLmZyb20oY2JvckVuY29kZXIuZW5jb2RlKHsgdDogZS50aW1lLCB2OiBlLnJvdyB9KSkpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZURlbGV0ZXMoZW50cmllczogeyB0aW1lOiBudW1iZXI7IGtleTogc3RyaW5nIH1bXSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZW50cmllcy5tYXAoZSA9PiBmcmFtZShCdWZmZXIuZnJvbShjYm9yRW5jb2Rlci5lbmNvZGUoeyB0OiBlLnRpbWUsIGQ6IGUua2V5IH0pKSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogeyBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdOyBiYWRCeXRlczogbnVtYmVyIH0ge1xuICAgIGxldCBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgd2hpbGUgKHBvcyArIDQgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgbGVuID0gYnVmZmVyLnJlYWRVSW50MzJMRShwb3MpO1xuICAgICAgICBsZXQgcGF5bG9hZFN0YXJ0ID0gcG9zICsgNDtcbiAgICAgICAgbGV0IHN1ZmZpeFN0YXJ0ID0gcGF5bG9hZFN0YXJ0ICsgbGVuO1xuICAgICAgICBpZiAoc3VmZml4U3RhcnQgKyA0ID4gYnVmZmVyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIGlmIChidWZmZXIucmVhZFVJbnQzMkxFKHN1ZmZpeFN0YXJ0KSAhPT0gbGVuKSBicmVhaztcbiAgICAgICAgbGV0IGRlY29kZWQ6IHsgdDogbnVtYmVyOyB2PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlY29kZWQgPSBjYm9yRW5jb2Rlci5kZWNvZGUoYnVmZmVyLnN1YmFycmF5KHBheWxvYWRTdGFydCwgc3VmZml4U3RhcnQpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjb2RlZCAmJiBkZWNvZGVkLmQgIT09IHVuZGVmaW5lZCkgZW50cmllcy5wdXNoKHsgdGltZTogZGVjb2RlZC50LCBkZWxldGVkS2V5OiBkZWNvZGVkLmQgfSk7XG4gICAgICAgIGVsc2UgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC52KSBlbnRyaWVzLnB1c2goeyB0aW1lOiBkZWNvZGVkLnQsIHJvdzogZGVjb2RlZC52IH0pO1xuICAgICAgICBwb3MgPSBzdWZmaXhTdGFydCArIDQ7XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXMsIGJhZEJ5dGVzOiBidWZmZXIubGVuZ3RoIC0gcG9zIH07XG59XG5cbi8vIFdyYXBzIHN0cmVhbWVkIGVudHJpZXMgKGFscmVhZHkgb3JkZXJlZCBvbGRlc3QtZmlyc3QpIGFzIGEgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlci4gRWFjaCBzZXQgTUVSR0VTXG4vLyBpdHMgZmllbGRzIG9udG8gdGhlIGtleSdzIGN1cnJlbnQgcm93IChzbyBhIHBhcnRpYWwgd3JpdGUvdXBkYXRlIG9ubHkgY2hhbmdlcyB0aGUgY29sdW1ucyBpdFxuLy8gaW5jbHVkZXMpOyBhIGRlbGV0ZSB0b21ic3RvbmVzIHRoZSBrZXkgKGV4cG9zZWQgdmlhIGRlbGV0ZWRLZXlzIHNvIHRoZSBqb2luIHN1cHByZXNzZXMgaXQgaW4gb2xkZXJcbi8vIGJ1bGsgcmVhZGVycykgYW5kIHJlc2V0cyB0aGUgbWVyZ2UuIEEgY29sdW1uIHRoZSBtZXJnZWQgcm93IG5ldmVyIHNldCByZWFkcyBhcyBBQlNFTlQsIHNvIHRoZSBqb2luXG4vLyBmYWxscyB0aHJvdWdoIHRvIG9sZGVyIHJlYWRlcnMgZm9yIGl0LiBBbHNvIHJldHVybnMgdGhlIGxhdGVzdCB0aW1lc3RhbXAgc2VlbiBwZXIga2V5IChsaXZlIG9yXG4vLyBkZWxldGVkKSwgdXNlZCBmb3IgY3Jvc3MtdGFiIGNvbmZsaWN0IHJlc29sdXRpb24uXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMoZW50cmllczogU3RyZWFtRW50cnlbXSwgdG90YWxCeXRlczogbnVtYmVyKTogeyByZWFkZXI6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI7IHRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+IH0ge1xuICAgIGxldCBieUtleSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBsZXQgZGVsZXRlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgdGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmRlbGV0ZWRLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnlLZXkuZGVsZXRlKGVudHJ5LmRlbGV0ZWRLZXkpO1xuICAgICAgICAgICAgZGVsZXRlZEtleXMuYWRkKGVudHJ5LmRlbGV0ZWRLZXkpO1xuICAgICAgICAgICAgdGltZXMuc2V0KGVudHJ5LmRlbGV0ZWRLZXksIGVudHJ5LnRpbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnJvdykge1xuICAgICAgICAgICAgbGV0IGtleSA9IGVudHJ5LnJvdy5rZXkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgYnlLZXkuc2V0KGtleSwgeyAuLi5ieUtleS5nZXQoa2V5KSwgLi4uZW50cnkucm93IH0pO1xuICAgICAgICAgICAgZGVsZXRlZEtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aW1lcy5zZXQoa2V5LCBlbnRyeS50aW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5cyA9IFsuLi5ieUtleS5rZXlzKCldO1xuICAgIGxldCBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAobGV0IHJvdyBvZiBieUtleS52YWx1ZXMoKSkge1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoZmllbGQpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNlZW4uYWRkKGZpZWxkKTtcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb2x1bW5zID0gY29sdW1uTmFtZXMubWFwKGNvbHVtbiA9PiAoeyBjb2x1bW4sIGJ5dGVTaXplOiAwIH0pKTtcbiAgICAvLyBQZXIta2V5IHRvbWJzdG9uZSB0aW1lcyBmb3IgdGhlIGpvaW4ncyBkZWxldGUgcmVzb2x1dGlvbi5cbiAgICBsZXQgZGVsZXRlVGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGtleSBvZiBkZWxldGVkS2V5cykgZGVsZXRlVGltZXMuc2V0KGtleSwgdGltZXMuZ2V0KGtleSkgfHwgMCk7XG4gICAgLy8gSXRlcmF0ZSB0byBmaW5kIG1pbi9tYXgg4oCUIE5PVCBNYXRoLm1pbiguLi50aW1lcykvTWF0aC5tYXgoLi4udGltZXMpOiBzcHJlYWRpbmcgYSBsYXJnZSBhcnJheSBhcyBjYWxsXG4gICAgLy8gYXJndW1lbnRzIG92ZXJmbG93cyB0aGUgc3RhY2sgKFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIikgb25jZSBhIHN0cmVhbSBoYXMgbWFueSBrZXlzLlxuICAgIGxldCBtaW5UaW1lID0gSW5maW5pdHksIG1heFRpbWUgPSAtSW5maW5pdHk7XG4gICAgZm9yIChsZXQgdCBvZiB0aW1lcy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodCA8IG1pblRpbWUpIG1pblRpbWUgPSB0O1xuICAgICAgICBpZiAodCA+IG1heFRpbWUpIG1heFRpbWUgPSB0O1xuICAgIH1cbiAgICBjb25zdCBrZXlJbmRleE1hcCA9IGJ1aWxkS2V5SW5kZXgoa2V5cyk7XG4gICAgbGV0IHJlYWRlcjogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciA9IHtcbiAgICAgICAgbmFtZTogXCIoc3RyZWFtcylcIixcbiAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgcm93Q291bnQ6IGtleXMubGVuZ3RoLFxuICAgICAgICBtaW5UaW1lOiB0aW1lcy5zaXplID8gbWluVGltZSA6IDAsXG4gICAgICAgIG1heFRpbWU6IHRpbWVzLnNpemUgPyBtYXhUaW1lIDogMCxcbiAgICAgICAga2V5cyxcbiAgICAgICAga2V5VGltZXM6IG5ldyBNYXAoa2V5cy5tYXAoa2V5ID0+IFtrZXksIHRpbWVzLmdldChrZXkpIHx8IDBdKSksXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGRlbGV0ZVRpbWVzLFxuICAgICAgICAvLyBBIGtleSdzIHRpbWUgaXMgaXRzIGxhdGVzdCB3cml0ZSBhY3Jvc3MgYWxsIGNvbHVtbnMgKHBlci1rZXksIG5vdCBwZXItY29sdW1uKS4gRm9yIGEgY29sdW1uXG4gICAgICAgIC8vIGl0IG5ldmVyIHNldCB3ZSByZXR1cm4gQUJTRU5UIHNvIHRoZSBqb2luIGZhbGxzIHRocm91Z2ggdG8gYW4gb2xkZXIgcmVhZGVyLlxuICAgICAgICBhc3luYyBnZXRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcm93ID0gYnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcm93ICYmIGNvbHVtbiBpbiByb3cgPyByb3dbY29sdW1uXSA6IEFCU0VOVCwgdGltZTogdGltZXMuZ2V0KGtleSkgfHwgMCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gYnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoIXJvdyB8fCAhKGNvbHVtbiBpbiByb3cpKSByZXR1cm4gQUJTRU5UO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJvd1tjb2x1bW5dLCB0aW1lOiB0aW1lcy5nZXQoa2V5KSB8fCAwIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFN0cmVhbSB2YWx1ZXMgYXJlIGRlY29kZWQgb2JqZWN0cyAoQ0JPUiksIHNvIHVubGlrZSBhIGJ1bGsgZmlsZSB3ZSBoYXZlIHRvIGVuY29kZSB0aGVtIHRvIHJhd1xuICAgICAgICAvLyBjZWxscyBoZXJlLiBTdHJlYW0gZGF0YSBpcyBzbWFsbCAodGllci0wLCBzaXplLWNhcHBlZCksIHNvIHRoaXMgaXMgY2hlYXAuIEEgY29sdW1uIHRoZSByb3cgbmV2ZXJcbiAgICAgICAgLy8gc2V0IGlzIG9taXR0ZWQgKEFCU0VOVCDihpIgZmFsbCB0aHJvdWdoKTsgYSBzdG9yZWQgdW5kZWZpbmVkIGlzIGtlcHQgKGEgcmVhbCBjbGVhcikuXG4gICAgICAgIGFzeW5jIGdldFJhd0NvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUmF3Q2VsbD4oKTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IGJ5S2V5LmdldChrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghcm93IHx8ICEoY29sdW1uIGluIHJvdykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBlbmNvZGVWYWx1ZShyb3dbY29sdW1uXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUGVyLWNvbHVtbiBpbmRleCBpbiB0aGUgc2FtZSBzaGFwZSBhIGJ1bGsgZmlsZSBleHBvc2VzLCBtYXRlcmlhbGl6ZWQgaW4gbWVtb3J5IG9uY2UgKHN0cmVhbSBkYXRhXG4gICAgICAgIC8vIGlzIHRpZXItMCwgc2l6ZS1jYXBwZWQsIHNvIHRoZSBlbmNvZGUgaXMgY2hlYXApLiBMZXRzIHRoZSBwbGFubmVkIG1lcmdlIHRyZWF0IHN0cmVhbSArIGJ1bGtcbiAgICAgICAgLy8gc291cmNlcyB1bmlmb3JtbHk6IGl0IGxvYWRzIGVhY2ggKHNvdXJjZSwgY29sdW1uKSBpbmRleCwgdXNlcyBvZmZzZXRzL3R5cGVzIHRvIHBsYW4gdGhlIG91dHB1dCdzXG4gICAgICAgIC8vIGJ5dGUgbGF5b3V0LCBhbmQgcmVhZHMgY29udGlndW91cyBydW5zIGZyb20gdGhpcyBpbmRleCdzIGluLW1lbW9yeSBkYXRhIGJ1ZmZlciBkdXJpbmcgZXhlY3V0ZS5cbiAgICAgICAgYXN5bmMgZ2V0Q29sdW1uSW5kZXgoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0U3RyZWFtQ29sdW1uSW5kZXgoa2V5cywgYnlLZXksIGNvbHVtbik7XG4gICAgICAgIH0sXG4gICAgICAgIHJvd09mS2V5KGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleUluZGV4TWFwLmdldChrZXkpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHsgcmVhZGVyLCB0aW1lcyB9O1xufVxuXG4vLyBrZXlzW10gaXMgdGhlIGNvbHVtbi1zaWRlIHJvdyBvcmRlciBmb3IgdGhpcyBzdHJlYW0gcmVhZGVyOyByb3dPZktleSBpcyB1c2VkIGJ5IHRoZSBwbGFubmVyIHRvIGxvb2sgdXBcbi8vIGEgd2lubmluZyBjZWxsJ3Mgc291cmNlIHJvdyB3aXRob3V0IGdvaW5nIHRocm91Z2ggYSBjb2x1bW4gcmVhZC4gU3RheXMgY29uc2lzdGVudCB3aXRoIGdldENvbHVtbkluZGV4LFxuLy8gd2hpY2ggYnVpbGRzIGl0cyBvZmZzZXRzL3R5cGVzIG92ZXIgdGhlIHNhbWUgYGtleXNgIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gYnVpbGRLZXlJbmRleChrZXlzOiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgbS5zZXQoa2V5c1tpXSwgaSk7XG4gICAgcmV0dXJuIG07XG59XG5cbi8vIEJ1aWxkIGEgc3RyZWFtLXNpZGUgQ29sdW1uSW5kZXggKG9mZnNldHMgKyB0eXBlcyArIGEgY29udGlndW91cy1yb3cgYnl0ZSBzbGljZXIpIG92ZXIgdGhlIGluLW1lbW9yeVxuLy8gbWVyZ2VkIHJvd3MuIEVuY29kZXMgZWFjaCByb3cncyB2YWx1ZSBmb3IgdGhpcyBjb2x1bW4gb25jZSBpbnRvIGEgc2luZ2xlIGJhY2tpbmcgYnVmZmVyOyByZWFkVmFsdWVCeXRlc1xuLy8gdGhlbiBzbGljZXMgaXQuIENhY2hlZCBwZXIgKHJlYWRlciwgY29sdW1uKSBzbyBhIG1lcmdlIHBsYW5uaW5nICsgZXhlY3V0aW9uIHBhc3MgZG9lc24ndCByZS1lbmNvZGUuXG5mdW5jdGlvbiBnZXRTdHJlYW1Db2x1bW5JbmRleChrZXlzOiBzdHJpbmdbXSwgYnlLZXk6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgY29sdW1uOiBzdHJpbmcpOiBDb2x1bW5JbmRleCB7XG4gICAgbGV0IGNhY2hlZCA9IGNvbHVtbkluZGV4Q2FjaGUuZ2V0KGJ5S2V5KT8uZ2V0KGNvbHVtbik7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtleXMubGVuZ3RoICsgMSk7XG4gICAgY29uc3QgdHlwZXMgPSBuZXcgVWludDhBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IGJ5S2V5LmdldChrZXlzW2ldKTtcbiAgICAgICAgb2Zmc2V0c1tpXSA9IHBvcztcbiAgICAgICAgaWYgKCFyb3cgfHwgIShjb2x1bW4gaW4gcm93KSkge1xuICAgICAgICAgICAgdHlwZXNbaV0gPSBUWVBFX0FCU0VOVF9UQUc7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJ5dGVzIH0gPSBlbmNvZGVWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICAgIHR5cGVzW2ldID0gdHlwZTtcbiAgICAgICAgcGFydHMucHVzaChieXRlcyk7XG4gICAgICAgIHBvcyArPSBieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIG9mZnNldHNba2V5cy5sZW5ndGhdID0gcG9zO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJ0cy5sZW5ndGggPyBCdWZmZXIuY29uY2F0KHBhcnRzKSA6IEVNUFRZX0JVRkZFUjtcbiAgICBjb25zdCBpZHg6IENvbHVtbkluZGV4ID0ge1xuICAgICAgICBvZmZzZXRzLFxuICAgICAgICB0eXBlcyxcbiAgICAgICAgYXN5bmMgcmVhZFZhbHVlQnl0ZXMoc3RhcnRSb3csIGVuZFJvdykge1xuICAgICAgICAgICAgaWYgKGVuZFJvdyA8PSBzdGFydFJvdykgcmV0dXJuIEVNUFRZX0JVRkZFUjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gb2Zmc2V0c1tzdGFydFJvd107XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBvZmZzZXRzW2VuZFJvd107XG4gICAgICAgICAgICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBsZXQgcGVyUmVhZGVyID0gY29sdW1uSW5kZXhDYWNoZS5nZXQoYnlLZXkpO1xuICAgIGlmICghcGVyUmVhZGVyKSB7IHBlclJlYWRlciA9IG5ldyBNYXAoKTsgY29sdW1uSW5kZXhDYWNoZS5zZXQoYnlLZXksIHBlclJlYWRlcik7IH1cbiAgICBwZXJSZWFkZXIuc2V0KGNvbHVtbiwgaWR4KTtcbiAgICByZXR1cm4gaWR4O1xufVxuXG4vLyBQZXIgc3RyZWFtLXJlYWRlciBjYWNoZSBvZiBpdHMgY29sdW1uIGluZGV4ZXMuIEtleWVkIGJ5IHRoZSByZWFkZXIncyBieUtleSBtYXAgKGEgZnJlc2hcbi8vIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzIGNhbGwgcHJvZHVjZXMgYSBmcmVzaCBtYXAsIHNvIHRoaXMgaXMgZWZmZWN0aXZlbHkgcGVyLXJlYWRlcikuXG5jb25zdCBjb2x1bW5JbmRleENhY2hlID0gbmV3IFdlYWtNYXA8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCBNYXA8c3RyaW5nLCBDb2x1bW5JbmRleD4+KCk7XG4iXX0=
|
|
227
|
-
/* _JS_SOURCE_HASH = "
|
|
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 = "efc43db21e50b2804f6d23b6c8b9202622e7616e222981c9cb612fd3ed580fd5"; */
|