sliftutils 1.7.20 → 1.7.22
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/index.d.ts +24 -4
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesRemote.d.ts +3 -1
- package/storage/remoteStorage/ArchivesRemote.ts +7 -7
- package/storage/remoteStorage/blobStore.d.ts +0 -1
- package/storage/remoteStorage/blobStore.ts +4 -10
- package/storage/remoteStorage/createArchives.d.ts +1 -0
- package/storage/remoteStorage/createArchives.ts +38 -7
- package/storage/remoteStorage/deployTakeover.d.ts +7 -0
- package/storage/remoteStorage/deployTakeover.ts +59 -12
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +3 -3
- package/storage/remoteStorage/dist/blobStore.ts.cache +16 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +52 -10
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +84 -40
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +11 -4
- package/storage/remoteStorage/dist/storageController.ts.cache +9 -4
- package/storage/remoteStorage/dist/storageServerState.ts.cache +22 -9
- package/storage/remoteStorage/sourceWrapper.d.ts +4 -0
- package/storage/remoteStorage/sourceWrapper.ts +11 -1
- package/storage/remoteStorage/spec.md +1 -1
- package/storage/remoteStorage/storageController.d.ts +9 -2
- package/storage/remoteStorage/storageController.ts +31 -10
- package/storage/remoteStorage/storageServerState.ts +9 -5
- package/yarn.lock +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -224,4 +224,4 @@ function getStreamColumnIndex(keys, byKey, column) {
|
|
|
224
224
|
// streamReaderFromEntries call produces a fresh map, so this is effectively per-reader).
|
|
225
225
|
const columnIndexCache = new WeakMap();
|
|
226
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 = "
|
|
227
|
+
/* _JS_SOURCE_HASH = "08eaba4c0c9769af93ebb263b95b81e1794078b5b393f952ec461f32722944e8"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
// Browser-side cross-tab write sync for BulkDatabase2, over BroadcastChannel (one channel per
|
|
3
3
|
// collection, same-origin tabs and workers). It does NOT persist anything — each side writes to disk
|
|
4
4
|
// itself; this just relays live writes to other open tabs/workers and, when one starts up, asks peers
|
|
@@ -101,4 +101,4 @@ function broadcastSeal(collection) {
|
|
|
101
101
|
}
|
|
102
102
|
exports.broadcastSeal = broadcastSeal;
|
|
103
103
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY0NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN5bmNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhGQUE4RjtBQUM5RixxR0FBcUc7QUFDckcsc0dBQXNHO0FBQ3RHLHNGQUFzRjtBQUN0RiwrRkFBK0Y7QUFDL0YsNkNBQTZDOzs7QUFJN0MsaUdBQWlHO0FBQ2pHLHNGQUFzRjtBQUN0RixNQUFNLGdCQUFnQixHQUFHLEtBQU0sQ0FBQztBQVdoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUU1QyxTQUFnQixlQUFlO0lBQzNCLCtGQUErRjtJQUMvRix5RkFBeUY7SUFDekYsSUFBSSxpQkFBaUIsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXO1dBQzlDLG1CQUFtQixJQUFJLFVBQVUsQ0FBQztJQUN6QyxPQUFPLGlCQUFpQixJQUFJLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxDQUFDO0FBQ3hFLENBQUM7QUFORCwwQ0FNQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWdCO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztJQUM3QyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsT0FBZ0IsRUFBRSxLQUFrQjtJQUNqRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXO1FBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxVQUFrQjtJQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1Qiw4RkFBOEY7SUFDOUYsc0RBQXNEO0lBQ3RELE1BQU0sRUFBRSxHQUFHLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDL0QsTUFBTSxPQUFPLEdBQVksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNsRixFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO1FBQ25DLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFxRSxDQUFDO1FBQ3hGLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO2FBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0MsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTTtnQkFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7YUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDN0IsdUZBQXVGO1lBQ3ZGLHdGQUF3RjtZQUN4RixLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxlQUFlO2dCQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3JELENBQUM7YUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDOUIsNEZBQTRGO1lBQzVGLHlGQUF5RjtZQUN6RixnRUFBZ0U7WUFDaEUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEcsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUNGLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFFRCx1R0FBdUc7QUFDdkcsdUdBQXVHO0FBQ3ZHLHlEQUF5RDtBQUN6RCxTQUFnQixPQUFPLENBQUMsVUFBa0IsRUFBRSxPQUFxQyxFQUFFLE1BQW1CO0lBQ2xHLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxJQUFJLE1BQU07UUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBUEQsMEJBT0M7QUFFRCxTQUFnQixTQUFTLENBQUMsVUFBa0IsRUFBRSxLQUFrQjtJQUM1RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPO0lBQ3JCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBTkQsOEJBTUM7QUFFRCxzR0FBc0c7QUFDdEcsdUdBQXVHO0FBQ3ZHLG9HQUFvRztBQUNwRyxzRUFBc0U7QUFDdEUsU0FBZ0IsYUFBYSxDQUFDLFVBQWtCO0lBQzVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU87SUFDckIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBSkQsc0NBSUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCcm93c2VyLXNpZGUgY3Jvc3MtdGFiIHdyaXRlIHN5bmMgZm9yIEJ1bGtEYXRhYmFzZTIsIG92ZXIgQnJvYWRjYXN0Q2hhbm5lbCAob25lIGNoYW5uZWwgcGVyXG4vLyBjb2xsZWN0aW9uLCBzYW1lLW9yaWdpbiB0YWJzIGFuZCB3b3JrZXJzKS4gSXQgZG9lcyBOT1QgcGVyc2lzdCBhbnl0aGluZyDigJQgZWFjaCBzaWRlIHdyaXRlcyB0byBkaXNrXG4vLyBpdHNlbGY7IHRoaXMganVzdCByZWxheXMgbGl2ZSB3cml0ZXMgdG8gb3RoZXIgb3BlbiB0YWJzL3dvcmtlcnMgYW5kLCB3aGVuIG9uZSBzdGFydHMgdXAsIGFza3MgcGVlcnNcbi8vIGZvciB3cml0ZXMgdGhleSd2ZSBtYWRlIHJlY2VudGx5IHRoYXQgbWF5IG5vdCBiZSBvbiBkaXNrIHlldC4gTm8tb3AgaW4gTm9kZSAvIHdoZXJlXG4vLyBCcm9hZGNhc3RDaGFubmVsIGlzIHVuYXZhaWxhYmxlLCBzbyBCdWxrRGF0YWJhc2UyIGNhbiBjYWxsIHRoZXNlIHVuY29uZGl0aW9uYWxseS4gVGhpcyBpcyBhblxuLy8gb3B0aW9uYWwgZmVhdHVyZSwgc28gdGhlcmUgaXMgbm8gZmFsbGJhY2suXG5cbmV4cG9ydCB0eXBlIFJlbW90ZVdyaXRlID0geyBrZXk6IHN0cmluZzsgdGltZTogbnVtYmVyOyBkZWxldGVkPzogYm9vbGVhbjsgdmFsdWU/OiB1bmtub3duIH07XG5cbi8vIFdyaXRlcyBvbGRlciB0aGFuIHRoaXMgYXJlIGFzc3VtZWQgYWxyZWFkeSBmbHVzaGVkIHRvIGRpc2sgKGEgZnJlc2hseS1vcGVuZWQgdGFiIGdldHMgdGhvc2UgYnlcbi8vIHJlYWRpbmcgZGlzayksIHNvIGEgdGFiIG9ubHkgcmVwbGF5cyB3cml0ZXMgbmV3ZXIgdGhhbiB0aGlzIHdoZW4gYSBwZWVyIHNheXMgaGVsbG8uXG5jb25zdCBSRUNFTlRfV0lORE9XX01TID0gNjBfMDAwO1xuXG50eXBlIENoYW5uZWwgPSB7XG4gICAgYmM6IEJyb2FkY2FzdENoYW5uZWw7XG4gICAgc3Vic2NyaWJlcnM6ICgod3JpdGU6IFJlbW90ZVdyaXRlKSA9PiB2b2lkKVtdO1xuICAgIC8vIENhbGxlZCB3aGVuIGEgcGVlciBhc2tzIGV2ZXJ5b25lIHRvIHNlYWwgKHN0b3AgYXBwZW5kaW5nIHRvKSB0aGVpciBjdXJyZW50IHN0cmVhbSBmaWxlLlxuICAgIHNlYWxTdWJzY3JpYmVyczogKCgpID0+IHZvaWQpW107XG4gICAgLy8gVGhpcyB0YWIncyBvd24gcmVjZW50IHdyaXRlcywga2VwdCBzbyBpdCBjYW4gYW5zd2VyIGFub3RoZXIgdGFiJ3MgXCJoZWxsb1wiLlxuICAgIHJlY2VudDogUmVtb3RlV3JpdGVbXTtcbn07XG5cbmNvbnN0IGNoYW5uZWxzID0gbmV3IE1hcDxzdHJpbmcsIENoYW5uZWw+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bmNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gd2luZG93IChtYWluLXRocmVhZCBicm93c2VyKSBvciBXb3JrZXJHbG9iYWxTY29wZSAoV2ViL1NlcnZpY2UvU2hhcmVkIHdvcmtlcikg4oCUIGJ1dCBub3QgTm9kZVxuICAgIC8vICh0eXBlc2FmZWNzcydzIGlzTm9kZSBpcyBgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcImAsIHdoaWNoIG1pc2NsYXNzaWZpZXMgd29ya2VycylcbiAgICBsZXQgaXNCcm93c2VyT3JXb3JrZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIHx8IFwiV29ya2VyR2xvYmFsU2NvcGVcIiBpbiBnbG9iYWxUaGlzO1xuICAgIHJldHVybiBpc0Jyb3dzZXJPcldvcmtlciAmJiB0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVSZWNlbnQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNvbnN0IGN1dG9mZiA9IERhdGUubm93KCkgLSBSRUNFTlRfV0lORE9XX01TO1xuICAgIGNoYW5uZWwucmVjZW50ID0gY2hhbm5lbC5yZWNlbnQuZmlsdGVyKHcgPT4gdy50aW1lID49IGN1dG9mZik7XG59XG5cbmZ1bmN0aW9uIGRlbGl2ZXIoY2hhbm5lbDogQ2hhbm5lbCwgd3JpdGU6IFJlbW90ZVdyaXRlKSB7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgY2hhbm5lbC5zdWJzY3JpYmVycykgc3ViKHdyaXRlKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlKGNvbGxlY3Rpb246IHN0cmluZyk6IENoYW5uZWwgfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNTeW5jU3VwcG9ydGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGNoYW5uZWwgPSBjaGFubmVscy5nZXQoY29sbGVjdGlvbik7XG4gICAgaWYgKGNoYW5uZWwpIHJldHVybiBjaGFubmVsO1xuICAgIC8vIEJyb2FkY2FzdENoYW5uZWwgbmV2ZXIgZGVsaXZlcnMgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGluc3RhbmNlIHRoYXQgc2VudCBpdCwgc28gYSB0YWIgbmV2ZXJcbiAgICAvLyBoZWFycyBpdHMgb3duIHdyaXRlcyDigJQgb25seSB0aGUgb3RoZXIgb3BlbiB0YWJzIGRvLlxuICAgIGNvbnN0IGJjID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoYGJ1bGtEYXRhYmFzZTI6JHtjb2xsZWN0aW9ufWApO1xuICAgIGNvbnN0IGNyZWF0ZWQ6IENoYW5uZWwgPSB7IGJjLCBzdWJzY3JpYmVyczogW10sIHNlYWxTdWJzY3JpYmVyczogW10sIHJlY2VudDogW10gfTtcbiAgICBiYy5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBtc2cgPSBldmVudC5kYXRhIGFzIHsgdHlwZTogc3RyaW5nOyB3cml0ZT86IFJlbW90ZVdyaXRlOyB3cml0ZXM/OiBSZW1vdGVXcml0ZVtdIH07XG4gICAgICAgIGlmICghbXNnKSByZXR1cm47XG4gICAgICAgIGlmIChtc2cudHlwZSA9PT0gXCJ3cml0ZVwiICYmIG1zZy53cml0ZSkge1xuICAgICAgICAgICAgZGVsaXZlcihjcmVhdGVkLCBtc2cud3JpdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09PSBcInJlY2VudFwiICYmIG1zZy53cml0ZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgd3JpdGUgb2YgbXNnLndyaXRlcykgZGVsaXZlcihjcmVhdGVkLCB3cml0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobXNnLnR5cGUgPT09IFwic2VhbFwiKSB7XG4gICAgICAgICAgICAvLyBBIHBlZXIgaXMgYWJvdXQgdG8gZm9sZCByZWNlbnQgZGF0YTsgc3RvcCBhcHBlbmRpbmcgdG8gb3VyIGN1cnJlbnQgc3RyZWFtIGZpbGUgc28gaXRcbiAgICAgICAgICAgIC8vIGJlY29tZXMgY29tcGxldGUgYW5kIHRoZSBtZXJnZSBjYW4gZm9sZCBpdCB3aG9sZS4gT3VyIG5leHQgd3JpdGUgc3RhcnRzIGEgZnJlc2ggZmlsZS5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGNyZWF0ZWQuc2VhbFN1YnNjcmliZXJzKSBzdWIoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJoZWxsb1wiKSB7XG4gICAgICAgICAgICAvLyBBbm90aGVyIHRhYiBqdXN0IHN0YXJ0ZWQ7IHJlcGxheSBvdXIgcmVjZW50IHdyaXRlcyBzbyBpdCBkb2Vzbid0IG1pc3MgYW55LiBUaGUgcmVwbHkgZ29lc1xuICAgICAgICAgICAgLy8gdG8gZXZlcnkgdGFiLCBidXQgcGVlcnMgdGhhdCBhbHJlYWR5IGhhdmUgYSB3cml0ZSBpZ25vcmUgaXQgKGl0cyB0aW1lc3RhbXAgaXNuJ3QgbmV3ZXJcbiAgICAgICAgICAgIC8vIHRoYW4gd2hhdCB0aGV5IGhvbGQpLCBzbyB0aGUgcmVkdW5kYW50IGJyb2FkY2FzdCBpcyBoYXJtbGVzcy5cbiAgICAgICAgICAgIHBydW5lUmVjZW50KGNyZWF0ZWQpO1xuICAgICAgICAgICAgaWYgKGNyZWF0ZWQucmVjZW50Lmxlbmd0aCkgY3JlYXRlZC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwicmVjZW50XCIsIHdyaXRlczogY3JlYXRlZC5yZWNlbnQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNoYW5uZWxzLnNldChjb2xsZWN0aW9uLCBjcmVhdGVkKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbn1cblxuLy8gU3Vic2NyaWJlIHRvIHJlbW90ZSB3cml0ZXMgZm9yIGEgY29sbGVjdGlvbi4gUmVjZW50IHdyaXRlcyBmcm9tIGFscmVhZHktb3BlbiB0YWJzIGFycml2ZSB0aHJvdWdoIHRoZVxuLy8gc2FtZSBvbldyaXRlIGNhbGxiYWNrIChhcyB0aGUgcmVwbHkgdG8gb3VyIGhlbGxvKSwgc28gdGhlIHJldHVybmVkIGFycmF5IGlzIGFsd2F5cyBlbXB0eSDigJQgaXQncyBrZXB0XG4vLyBvbmx5IGZvciBBUEkgY29tcGF0aWJpbGl0eSB3aXRoIGNhbGxlcnMgdGhhdCBhd2FpdCBpdC5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0KGNvbGxlY3Rpb246IHN0cmluZywgb25Xcml0ZTogKHdyaXRlOiBSZW1vdGVXcml0ZSkgPT4gdm9pZCwgb25TZWFsPzogKCkgPT4gdm9pZCk6IFByb21pc2U8UmVtb3RlV3JpdGVbXT4ge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBlbnN1cmUoY29sbGVjdGlvbik7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICBjaGFubmVsLnN1YnNjcmliZXJzLnB1c2gob25Xcml0ZSk7XG4gICAgaWYgKG9uU2VhbCkgY2hhbm5lbC5zZWFsU3Vic2NyaWJlcnMucHVzaChvblNlYWwpO1xuICAgIGNoYW5uZWwuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcImhlbGxvXCIgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicm9hZGNhc3QoY29sbGVjdGlvbjogc3RyaW5nLCB3cml0ZTogUmVtb3RlV3JpdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gZW5zdXJlKGNvbGxlY3Rpb24pO1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuICAgIGNoYW5uZWwucmVjZW50LnB1c2god3JpdGUpO1xuICAgIHBydW5lUmVjZW50KGNoYW5uZWwpO1xuICAgIGNoYW5uZWwuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIndyaXRlXCIsIHdyaXRlIH0pO1xufVxuXG4vLyBBc2sgZXZlcnkgb3RoZXIgb3BlbiB0YWIgb2YgdGhpcyBjb2xsZWN0aW9uIHRvIHNlYWwgKHN0b3AgYXBwZW5kaW5nIHRvKSBpdHMgY3VycmVudCBzdHJlYW0gZmlsZSwgc29cbi8vIGEgbWVyZ2UgY2FuIGZvbGQgcmVjZW50IGRhdGEgdXAgdG8gdGhlIHByZXNlbnQgd2l0aG91dCByYWNpbmcgYW4gYXBwZW5kLiBCZXN0LWVmZm9ydDogbm8tb3AgaW4gTm9kZSxcbi8vIGFuZCBhIHBlZXIgdGhhdCBtaXNzZXMgaXQganVzdCBrZWVwcyBhcHBlbmRpbmcg4oCUIHdvcnN0IGNhc2UgdGhlIG1lcmdlIGZvbGRzIGEgcHJlZml4IGFuZCB0aGUgcmVzdFxuLy8gZm9sZHMgbGF0ZXIgKGR1cGxpY2F0aW9uLCByZXNvbHZlZCBieSB3cml0ZS10aW1lKSwgbmV2ZXIgZGF0YSBsb3NzLlxuZXhwb3J0IGZ1bmN0aW9uIGJyb2FkY2FzdFNlYWwoY29sbGVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGVuc3VyZShjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVybjtcbiAgICBjaGFubmVsLmJjLnBvc3RNZXNzYWdlKHsgdHlwZTogXCJzZWFsXCIgfSk7XG59XG4iXX0=
|
|
104
|
-
/* _JS_SOURCE_HASH = "
|
|
104
|
+
/* _JS_SOURCE_HASH = "b93362d0415ac9f4de1e50ad306197d3fe8c05e347176699d05643c2663e079a"; */
|
|
@@ -29,7 +29,9 @@ export declare class ArchivesRemote implements IArchives {
|
|
|
29
29
|
private lastDeniedLog;
|
|
30
30
|
getDebugName(): string;
|
|
31
31
|
isConnected(): boolean;
|
|
32
|
-
ping(): Promise<
|
|
32
|
+
ping(): Promise<{
|
|
33
|
+
takeover?: string;
|
|
34
|
+
}>;
|
|
33
35
|
private authenticate;
|
|
34
36
|
private callAuthed;
|
|
35
37
|
waitingForAccess(): Promise<{
|
|
@@ -46,13 +46,13 @@ export async function authenticateStorage(config: { address: string; port: numbe
|
|
|
46
46
|
let rootDomain = config.address.split(".").slice(-2).join(".");
|
|
47
47
|
await loadIdentityCA(rootDomain);
|
|
48
48
|
let ca = getIdentityCA(rootDomain);
|
|
49
|
-
let
|
|
50
|
-
let signature = sign({ key: ca.key }, {
|
|
49
|
+
let data = {
|
|
51
50
|
purpose: STORAGE_AUTH_PURPOSE,
|
|
52
|
-
time,
|
|
51
|
+
time: Date.now(),
|
|
53
52
|
server: `${config.address}:${config.port}`,
|
|
54
|
-
}
|
|
55
|
-
|
|
53
|
+
};
|
|
54
|
+
let signature = sign({ key: ca.key }, data);
|
|
55
|
+
return await RemoteStorageController.nodes[config.nodeId].authenticate({ certPem: ca.cert.toString(), signature, data });
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
export class ArchivesRemote implements IArchives {
|
|
@@ -77,8 +77,8 @@ export class ArchivesRemote implements IArchives {
|
|
|
77
77
|
return SocketFunction.isNodeConnected(this.nodeId);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
public async ping(): Promise<
|
|
81
|
-
await this.controller.ping();
|
|
80
|
+
public async ping(): Promise<{ takeover?: string }> {
|
|
81
|
+
return await this.controller.ping();
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
private async authenticate(): Promise<void> {
|
|
@@ -169,7 +169,6 @@ export declare class BlobStore implements IBucketStore {
|
|
|
169
169
|
cancelLargeUpload(id: string): Promise<void>;
|
|
170
170
|
private flushOverlay;
|
|
171
171
|
private evicting;
|
|
172
|
-
private loggedFlushDeadline;
|
|
173
172
|
private enforceDiskLimit;
|
|
174
173
|
private cleanupTombstones;
|
|
175
174
|
}
|
|
@@ -361,11 +361,10 @@ export class BlobStore implements IBucketStore {
|
|
|
361
361
|
let { source } = this.sources[sourceIndex];
|
|
362
362
|
let state = this.sourceStates[sourceIndex];
|
|
363
363
|
let scanStart = Date.now();
|
|
364
|
-
let scanLogged = false;
|
|
365
364
|
let activity: SyncActivity = { type: "metadataScan", sourceDebugName: source.getDebugName(), startTime: scanStart };
|
|
366
365
|
this.syncActivities.add(activity);
|
|
366
|
+
console.log(`Metadata scan of ${source.getDebugName()} starting (store ${this.folder})`);
|
|
367
367
|
let progressTimer = setInterval(() => {
|
|
368
|
-
scanLogged = true;
|
|
369
368
|
console.log(`Metadata scan of ${source.getDebugName()} still running (${Math.round((Date.now() - scanStart) / 1000)}s, store ${this.folder})`);
|
|
370
369
|
}, SYNC_PROGRESS_LOG_INTERVAL);
|
|
371
370
|
(progressTimer as { unref?: () => void }).unref?.();
|
|
@@ -376,9 +375,7 @@ export class BlobStore implements IBucketStore {
|
|
|
376
375
|
clearInterval(progressTimer);
|
|
377
376
|
this.syncActivities.delete(activity);
|
|
378
377
|
}
|
|
379
|
-
|
|
380
|
-
console.log(`Metadata scan of ${source.getDebugName()} finished: ${files.length} files in ${Math.round((Date.now() - scanStart) / 1000)}s (store ${this.folder})`);
|
|
381
|
-
}
|
|
378
|
+
console.log(`Metadata scan of ${source.getDebugName()} finished: ${files.length} files in ${Math.round((Date.now() - scanStart) / 1000)}s (store ${this.folder})`);
|
|
382
379
|
let seen = new Map<string, number>();
|
|
383
380
|
for (let file of files) {
|
|
384
381
|
seen.set(file.path, file.createTime);
|
|
@@ -673,11 +670,9 @@ export class BlobStore implements IBucketStore {
|
|
|
673
670
|
let flushAt = Date.now() + writeDelay;
|
|
674
671
|
let deadline = this.config?.getFlushDeadline?.();
|
|
675
672
|
if (deadline !== undefined) {
|
|
673
|
+
// Past the deadline fast writes write through (deployTakeover logs the transition
|
|
674
|
+
// once, with the times - a per-store log here would repeat on every store rebuild)
|
|
676
675
|
if (Date.now() >= deadline) {
|
|
677
|
-
if (!this.loggedFlushDeadline) {
|
|
678
|
-
this.loggedFlushDeadline = true;
|
|
679
|
-
console.log(`Deploy switchover flush deadline passed (store ${this.folder}): fast writes now write through immediately`);
|
|
680
|
-
}
|
|
681
676
|
this.overlay.delete(key);
|
|
682
677
|
await this.writeToSources(key, data, writeTime);
|
|
683
678
|
return key;
|
|
@@ -858,7 +853,6 @@ export class BlobStore implements IBucketStore {
|
|
|
858
853
|
// holds a same-or-newer copy (the only copy of a file is never deleted), and the index entry
|
|
859
854
|
// repoints to that source so reads keep working (re-caching on the next read).
|
|
860
855
|
private evicting = false;
|
|
861
|
-
private loggedFlushDeadline = false;
|
|
862
856
|
private async enforceDiskLimit(): Promise<void> {
|
|
863
857
|
let limit = this.config?.readerDiskLimit;
|
|
864
858
|
if (!limit || this.evicting) return;
|
|
@@ -223,6 +223,29 @@ export class ArchivesChain implements IArchives {
|
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
|
+
// The server may be MID deploy-takeover: its getConfig returns the in-memory
|
|
227
|
+
// interpretation (window splits pointing at a successor's port), which is never in the
|
|
228
|
+
// routing file. A client connecting during the takeover must start on that
|
|
229
|
+
// interpretation, not discover it minutes later.
|
|
230
|
+
try {
|
|
231
|
+
let probeApi = found.probe.api;
|
|
232
|
+
if (probeApi) {
|
|
233
|
+
let servedConfig = (await probeApi.getConfig()).remoteConfig;
|
|
234
|
+
if (servedConfig) {
|
|
235
|
+
let served = normalizeRemoteConfig(servedConfig);
|
|
236
|
+
if (JSON.stringify(served) !== JSON.stringify(active) && getConfigVersion(served) >= getConfigVersion(active)) {
|
|
237
|
+
console.log(`Adopting the server's in-memory routing interpretation at init for ${this.getDebugName()} (deploy takeover in progress)`);
|
|
238
|
+
active = served;
|
|
239
|
+
for (let source of sources) {
|
|
240
|
+
source.dispose();
|
|
241
|
+
}
|
|
242
|
+
sources = await this.buildSources(active);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
} catch {
|
|
247
|
+
// The raw routing config we already adopted still works
|
|
248
|
+
}
|
|
226
249
|
// The routing fetches double as our first latency measurements: variable-shard picking
|
|
227
250
|
// works immediately, instead of waiting for the first ping pass to land
|
|
228
251
|
for (let source of sources) {
|
|
@@ -241,13 +264,23 @@ export class ArchivesChain implements IArchives {
|
|
|
241
264
|
}
|
|
242
265
|
}
|
|
243
266
|
|
|
267
|
+
private async createChainSource(sourceConfig: HostedConfig | BackblazeConfig): Promise<SourceWrapper> {
|
|
268
|
+
let source = await SourceWrapper.create(sourceConfig);
|
|
269
|
+
// A takeover stamp change in a ping means the server's routing interpretation changed
|
|
270
|
+
// (deploy takeover started/ended); refresh so we learn within one ping interval
|
|
271
|
+
source.onServedConfigChanged = () => {
|
|
272
|
+
console.log(`Storage ${source.getDebugName()} advertised a routing change (deploy takeover); refreshing config for ${this.getDebugName()}`);
|
|
273
|
+
void this.refreshActiveConfig().catch((e: Error) => console.error(`Config refresh failed for ${this.getDebugName()}: ${e.stack ?? e}`));
|
|
274
|
+
};
|
|
275
|
+
// Latency (for variable-shard target preference) is tracked from initialization on
|
|
276
|
+
source.startPinging();
|
|
277
|
+
return source;
|
|
278
|
+
}
|
|
279
|
+
|
|
244
280
|
private async buildSources(config: RemoteConfig): Promise<SourceWrapper[]> {
|
|
245
281
|
let sources: SourceWrapper[] = [];
|
|
246
282
|
for (let sourceConfig of config.sources.map(normalizeSource)) {
|
|
247
|
-
|
|
248
|
-
// Latency (for variable-shard target preference) is tracked from initialization on
|
|
249
|
-
source.startPinging();
|
|
250
|
-
sources.push(source);
|
|
283
|
+
sources.push(await this.createChainSource(sourceConfig));
|
|
251
284
|
}
|
|
252
285
|
return sources;
|
|
253
286
|
}
|
|
@@ -320,9 +353,7 @@ export class ArchivesChain implements IArchives {
|
|
|
320
353
|
oldByConfig.delete(key);
|
|
321
354
|
sources.push(old);
|
|
322
355
|
} else {
|
|
323
|
-
|
|
324
|
-
source.startPinging();
|
|
325
|
-
sources.push(source);
|
|
356
|
+
sources.push(await this.createChainSource(sourceConfig));
|
|
326
357
|
}
|
|
327
358
|
}
|
|
328
359
|
// In-flight requests still hold the old wrappers and finish fine; dispose just stops any
|
|
@@ -16,6 +16,13 @@ export declare function onTakeoverEvent(listener: (event: TakeoverEvent) => void
|
|
|
16
16
|
* of the deploy overlap points at the alternate port. Pure, in-memory only - the stored routing
|
|
17
17
|
* config is never modified, and this must never be applied to data that gets persisted. */
|
|
18
18
|
export declare function applyDeployRemap(routing: RemoteConfig): RemoteConfig;
|
|
19
|
+
/** A stamp of the current remap interpretation, advertised in ping responses - so every connected
|
|
20
|
+
* client learns of a takeover within one ping interval, instead of waiting for its config poll
|
|
21
|
+
* or a write rejection. */
|
|
22
|
+
export declare function getTakeoverStamp(): string | undefined;
|
|
23
|
+
/** The middle-window alternate port of an active remap. The OTHER process of the takeover lives on
|
|
24
|
+
* this port on OUR machine (same disk!), so sources pointing at it are self, never sync targets. */
|
|
25
|
+
export declare function getTakeoverAltPort(): number | undefined;
|
|
19
26
|
/** For the dying process: fast-write flush delays must never extend past this time, and after it
|
|
20
27
|
* fast writes flush immediately - so nothing is left in memory when the write window transfers. */
|
|
21
28
|
export declare function getFlushDeadline(): number | undefined;
|
|
@@ -202,18 +202,50 @@ function scheduleEvents(): void {
|
|
|
202
202
|
(timer as { unref?: () => void }).unref?.();
|
|
203
203
|
eventTimers.push(timer);
|
|
204
204
|
};
|
|
205
|
-
|
|
205
|
+
const remap = current.remap;
|
|
206
206
|
if (remap) {
|
|
207
207
|
let altPort = remap.altPort;
|
|
208
208
|
schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
209
|
-
schedule(remap.boundaryA, () => console.log(
|
|
209
|
+
schedule(remap.boundaryA, () => console.log(`${logPrefix()} Deploy switchover write handoff boundary ${iso(remap.boundaryA)} passed: fresh writes now belong to the alternate-port side (port ${altPort})`));
|
|
210
210
|
schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
211
|
-
schedule(remap.boundaryB, () => console.log(
|
|
211
|
+
schedule(remap.boundaryB, () => console.log(`${logPrefix()} Deploy switchover second boundary ${iso(remap.boundaryB)} passed: fresh writes return to the main port`));
|
|
212
212
|
schedule(remap.expire, () => void recompute().catch((e: Error) => console.error(`Deploy takeover recompute failed: ${e.stack ?? e}`)));
|
|
213
213
|
}
|
|
214
|
+
let dying = current.dying;
|
|
215
|
+
if (dying) {
|
|
216
|
+
let deadline = dying.successorStart + dying.overlap * FLUSH_DEADLINE_FRACTION;
|
|
217
|
+
let killTime = dying.successorStart + dying.overlap;
|
|
218
|
+
let logDeadline = () => {
|
|
219
|
+
if (loggedFlushDeadlineFor === deadline) return;
|
|
220
|
+
loggedFlushDeadlineFor = deadline;
|
|
221
|
+
console.log(`${logPrefix()} Deploy switchover flush deadline ${iso(deadline)} reached (now ${iso(Date.now())}): fast writes write through immediately until we are killed at ${iso(killTime)}`);
|
|
222
|
+
};
|
|
223
|
+
if (deadline <= now) {
|
|
224
|
+
logDeadline();
|
|
225
|
+
} else {
|
|
226
|
+
schedule(deadline, logDeadline);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Multiple processes (predecessor + successor) often share one journal during a switchover, so
|
|
232
|
+
// every lifecycle line identifies its process
|
|
233
|
+
function logPrefix(): string {
|
|
234
|
+
return `[pid ${process.pid}]`;
|
|
214
235
|
}
|
|
236
|
+
let loggedFlushDeadlineFor: number | undefined;
|
|
215
237
|
|
|
216
|
-
|
|
238
|
+
// Recompute is invoked from init, registerAltPort, the poll, and the expiry timer - possibly
|
|
239
|
+
// concurrently. Runs are serialized, or two in-flight runs would both pass the changed-state check
|
|
240
|
+
// and double-fire every transition (logs, rebuild events, timers).
|
|
241
|
+
let recomputeChain = Promise.resolve();
|
|
242
|
+
function recompute(): Promise<void> {
|
|
243
|
+
let next = recomputeChain.then(() => recomputeNow());
|
|
244
|
+
recomputeChain = next.then(() => { }, () => { });
|
|
245
|
+
return next;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async function recomputeNow(): Promise<void> {
|
|
217
249
|
if (!initialized || !timelineFolder) return;
|
|
218
250
|
let now = Date.now();
|
|
219
251
|
let entries = await readTimelineEntries();
|
|
@@ -227,11 +259,11 @@ async function recompute(): Promise<void> {
|
|
|
227
259
|
// Matching failures must be loud, or takeover detection fails silently forever
|
|
228
260
|
if (!us && entries.length && !loggedNoMatch) {
|
|
229
261
|
loggedNoMatch = true;
|
|
230
|
-
console.warn(
|
|
262
|
+
console.warn(`${logPrefix()} No deploy timeline entry matches our pid chain (${[...ancestorPids].join(", ")}) - takeover detection cannot work. Entries: ${entries.map(x => `pid=${x.pid ?? "none"} releaseTime=${x.parameters.releaseTime}`).join(" | ")}`);
|
|
231
263
|
}
|
|
232
264
|
if (us && !loggedIdentity) {
|
|
233
265
|
loggedIdentity = true;
|
|
234
|
-
console.log(
|
|
266
|
+
console.log(`${logPrefix()} Deploy timeline entry matched: we are pid=${us.pid}, releaseTime=${us.parameters.releaseTime !== undefined && iso(us.parameters.releaseTime) || "unknown"}, ${entries.length} entries total`);
|
|
235
267
|
}
|
|
236
268
|
let computed: TakeoverComputed = {};
|
|
237
269
|
let usRelease = us?.parameters.releaseTime;
|
|
@@ -294,16 +326,16 @@ function iso(time: number): string {
|
|
|
294
326
|
function logTransitions(prev: TakeoverComputed, next: TakeoverComputed): void {
|
|
295
327
|
if (!prev.dying && next.dying) {
|
|
296
328
|
let { successorStart, overlap } = next.dying;
|
|
297
|
-
console.log(
|
|
329
|
+
console.log(`${logPrefix()} Deploy switchover scheduled: our successor starts at ${iso(successorStart)}; fast-write flushes drain by ${iso(successorStart + overlap * FLUSH_DEADLINE_FRACTION)}, fresh writes hand off at ${iso(successorStart + overlap * BOUNDARY_A_FRACTION)}, and we are killed at ${iso(successorStart + overlap)}`);
|
|
298
330
|
}
|
|
299
331
|
if (!prev.predecessorEnd && next.predecessorEnd) {
|
|
300
|
-
console.log(
|
|
332
|
+
console.log(`${logPrefix()} We are a deploy successor: our predecessor holds the main port until ${iso(next.predecessorEnd)}`);
|
|
301
333
|
}
|
|
302
334
|
if (!prev.remap && next.remap) {
|
|
303
|
-
console.log(
|
|
335
|
+
console.log(`${logPrefix()} Deploy switchover remap active: sources pointing at us are split so [${iso(next.remap.boundaryA)} .. ${iso(next.remap.boundaryB)}] routes to alternate port ${next.remap.altPort} (remap expires at ${iso(next.remap.expire)})`);
|
|
304
336
|
}
|
|
305
337
|
if (prev.remap && !next.remap) {
|
|
306
|
-
console.log(
|
|
338
|
+
console.log(`${logPrefix()} Deploy switchover remap ended; running on the plain stored routing config`);
|
|
307
339
|
}
|
|
308
340
|
}
|
|
309
341
|
|
|
@@ -316,9 +348,9 @@ export async function initDeployTakeover(config: { domain: string; mainPort: num
|
|
|
316
348
|
timelineFolder = getTimelineFolder();
|
|
317
349
|
let entries = await readTimelineEntries();
|
|
318
350
|
if (!entries.length) {
|
|
319
|
-
console.log(
|
|
351
|
+
console.log(`${logPrefix()} No deploy timeline entries in ${timelineFolder}; deploy takeover inactive until they appear (port fallback still works)`);
|
|
320
352
|
} else {
|
|
321
|
-
console.log(
|
|
353
|
+
console.log(`${logPrefix()} Deploy timeline found at ${timelineFolder} (${entries.length} entries); our pid chain: ${[...ancestorPids].join(" -> ")}`);
|
|
322
354
|
}
|
|
323
355
|
await recompute();
|
|
324
356
|
let poll = setInterval(() => {
|
|
@@ -392,6 +424,21 @@ export function applyDeployRemap(routing: RemoteConfig): RemoteConfig {
|
|
|
392
424
|
return { version: routing.version, sources };
|
|
393
425
|
}
|
|
394
426
|
|
|
427
|
+
/** A stamp of the current remap interpretation, advertised in ping responses - so every connected
|
|
428
|
+
* client learns of a takeover within one ping interval, instead of waiting for its config poll
|
|
429
|
+
* or a write rejection. */
|
|
430
|
+
export function getTakeoverStamp(): string | undefined {
|
|
431
|
+
let remap = current.remap;
|
|
432
|
+
if (!remap) return undefined;
|
|
433
|
+
return JSON.stringify(remap);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/** The middle-window alternate port of an active remap. The OTHER process of the takeover lives on
|
|
437
|
+
* this port on OUR machine (same disk!), so sources pointing at it are self, never sync targets. */
|
|
438
|
+
export function getTakeoverAltPort(): number | undefined {
|
|
439
|
+
return current.remap?.altPort;
|
|
440
|
+
}
|
|
441
|
+
|
|
395
442
|
/** For the dying process: fast-write flush delays must never extend past this time, and after it
|
|
396
443
|
* fast writes flush immediately - so nothing is left in memory when the write window transfers. */
|
|
397
444
|
export function getFlushDeadline(): number | undefined {
|
|
@@ -59,7 +59,7 @@ class ArchivesRemote {
|
|
|
59
59
|
return SocketFunction_1.SocketFunction.isNodeConnected(this.nodeId);
|
|
60
60
|
}
|
|
61
61
|
async ping() {
|
|
62
|
-
await this.controller.ping();
|
|
62
|
+
return await this.controller.ping();
|
|
63
63
|
}
|
|
64
64
|
async authenticate() {
|
|
65
65
|
await authenticateStorage({ address: this.parsed.address, port: this.parsed.port, nodeId: this.nodeId });
|
|
@@ -194,5 +194,5 @@ class ArchivesRemote {
|
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
exports.ArchivesRemote = ArchivesRemote;
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNSZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1JlbW90ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQixtRUFBZ0U7QUFDaEUsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxrREFBNkU7QUFFN0UsaURBQWdGO0FBQ2hGLDJEQUc2QjtBQUU3QixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLGlHQUFpRztBQUNqRyxzREFBc0Q7QUFFdEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFhN0MsU0FBZ0IsZUFBZSxDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBTkQsMENBTUM7QUFFRCx1RkFBdUY7QUFDaEYsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQXlEO0lBQy9GLDRGQUE0RjtJQUM1RiwwREFBMEQ7SUFDMUQsK0JBQWMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDekMsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FB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dXJjZXNDb250ZW50IjpbIm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHlDQSwgbG9hZElkZW50aXR5Q0EsIHNpZ24gfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBwYXJzZUhvc3RlZFVybCwgZ2V0QnVja2V0QmFzZVVybCwgYnVpbGRGaWxlVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLCBTVE9SQUdFX0FVVEhfUFVSUE9TRSxcbiAgICBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVELCBTVE9SQUdFX0FDQ0VTU19ERU5JRUQsXG59IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5cbi8vIEEgYnVja2V0IG9uIG91ciByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIgKHN0b3JhZ2VTZXJ2ZXIudHMpLCB1c2VkIGxpa2UgQXJjaGl2ZXNCYWNrYmxhemUuIFdvcmtzIGluXG4vLyBOb2RlLmpzIGFuZCB0aGUgYnJvd3Nlci4gQXV0aGVudGljYXRlcyB3aXRoIHRoaXMgbWFjaGluZSdzIGNlcnRzLnRzIGlkZW50aXR5OyBpZiB0aGUgYWNjb3VudFxuLy8gaGFzbid0IHRydXN0ZWQgdGhpcyBtYWNoaW5lIHlldCBpdCByZXF1ZXN0cyBhY2Nlc3MsIGFuZCBieSBkZWZhdWx0IHdhaXRzLCBsb2dnaW5nIGluc3RydWN0aW9uc1xuLy8gZXZlcnkgbWludXRlIChjYWxscyBibG9jayB1bnRpbCBhY2Nlc3MgaXMgZ3JhbnRlZCkuXG5cbmNvbnN0IEFDQ0VTU19SRVRSWV9ERUxBWSA9IDEwMDAgKiAzMDtcbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc1JlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBUaGUgYnVja2V0J3Mgcm91dGluZyBVUkwsIHdoaWNoIGFkZHJlc3NlcyB0aGUgc2VydmVyLCBhY2NvdW50LCBhbmQgYnVja2V0IGluIG9uZTpcbiAgICAvLyAgaHR0cHM6Ly9zdG9yYWdlLmV4YW1wbGUuY29tOjQ0NDQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIEFjY2VzcyBpcyBjaGVja2VkIGFnYWluc3QgdGhpcyBhY2NvdW50IChkZWZhdWx0cyB0byB0aGUgYWNjb3VudCBpbiB0aGUgdXJsKVxuICAgIGFjY291bnROYW1lPzogc3RyaW5nO1xuICAgIC8vIGZhbHNlOiBhY2Nlc3MtZGVuaWVkIGNhbGxzIHRocm93IGltbWVkaWF0ZWx5ICh0aGUgZXJyb3IgaW5jbHVkZXMgdGhlIGFjY2VzcyBwYWdlIGxpbmspXG4gICAgLy8gaW5zdGVhZCBvZiByZXF1ZXN0aW5nIGFjY2VzcyBhbmQgYmxvY2tpbmcgdW50aWwgaXQgaXMgZ3JhbnRlZCAodGhlIGRlZmF1bHQpLlxuICAgIHdhaXRGb3JBY2Nlc3M/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RvcmFnZVVybCh1cmw6IHN0cmluZyk6IHsgYWRkcmVzczogc3RyaW5nOyBwb3J0OiBudW1iZXIgfSB7XG4gICAgbGV0IHUgPSBuZXcgVVJMKHVybCk7XG4gICAgaWYgKHUucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIFVSTCBtdXN0IHVzZSBodHRwcywgZ290ICR7SlNPTi5zdHJpbmdpZnkodS5wcm90b2NvbCl9IGluICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWRkcmVzczogdS5ob3N0bmFtZSwgcG9ydDogK3UucG9ydCB8fCA0NDMgfTtcbn1cblxuLy8gQXV0aGVudGljYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBzdG9yYWdlIHNlcnZlciB3aXRoIHRoaXMgbWFjaGluZSdzIGNlcnRzLnRzIGlkZW50aXR5XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXV0aGVudGljYXRlU3RvcmFnZShjb25maWc6IHsgYWRkcmVzczogc3RyaW5nOyBwb3J0OiBudW1iZXI7IG5vZGVJZDogc3RyaW5nIH0pOiBQcm9taXNlPHsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfT4ge1xuICAgIC8vIGhvc3RTZXJ2ZXIgbm9kZUlkcyBhcmUgbWFjaGluZS1zcGVjaWZpYywgc28gY29ubmVjdGlvbnMgYnkgZG9tYWluIG11c3QgdGFyZ2V0IFwiYW55IHNlcnZlclxuICAgIC8vIGF0IHRoaXMgYWRkcmVzc1wiICh3aGljaCBpcyBob3cgYnJvd3NlcnMgYWx3YXlzIGNvbm5lY3QpXG4gICAgU29ja2V0RnVuY3Rpb24uRU5BQkxFX0NMSUVOVF9NT0RFID0gdHJ1ZTtcbiAgICBsZXQgcm9vdERvbWFpbiA9IGNvbmZpZy5hZGRyZXNzLnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG4gICAgYXdhaXQgbG9hZElkZW50aXR5Q0Eocm9vdERvbWFpbik7XG4gICAgbGV0IGNhID0gZ2V0SWRlbnRpdHlDQShyb290RG9tYWluKTtcbiAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHNpZ25hdHVyZSA9IHNpZ24oeyBrZXk6IGNhLmtleSB9LCB7XG4gICAgICAgIHB1cnBvc2U6IFNUT1JBR0VfQVVUSF9QVVJQT1NFLFxuICAgICAgICB0aW1lLFxuICAgICAgICBzZXJ2ZXI6IGAke2NvbmZpZy5hZGRyZXNzfToke2NvbmZpZy5wb3J0fWAsXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW2NvbmZpZy5ub2RlSWRdLmF1dGhlbnRpY2F0ZSh7IGNlcnRQZW06IGNhLmNlcnQudG9TdHJpbmcoKSwgdGltZSwgc2lnbmF0dXJlIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNSZW1vdGUgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBBcmNoaXZlc1JlbW90ZUNvbmZpZykge1xuICAgICAgICAvLyBob3N0U2VydmVyIG5vZGVJZHMgYXJlIG1hY2hpbmUtc3BlY2lmaWMsIHNvIGNvbm5lY3Rpb25zIGJ5IGRvbWFpbiBtdXN0IHRhcmdldCBcImFueVxuICAgICAgICAvLyBzZXJ2ZXIgYXQgdGhpcyBhZGRyZXNzXCIgKHdoaWNoIGlzIGhvdyBicm93c2VycyBhbHdheXMgY29ubmVjdClcbiAgICAgICAgU29ja2V0RnVuY3Rpb24uRU5BQkxFX0NMSUVOVF9NT0RFID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHRoaXMuY29uZmlnLnVybCk7XG4gICAgcHJpdmF0ZSBhY2NvdW50ID0gdGhpcy5jb25maWcuYWNjb3VudE5hbWUgfHwgdGhpcy5wYXJzZWQuYWNjb3VudDtcbiAgICBwcml2YXRlIGJ1Y2tldE5hbWUgPSB0aGlzLnBhcnNlZC5idWNrZXROYW1lO1xuICAgIHByaXZhdGUgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHRoaXMucGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHRoaXMucGFyc2VkLnBvcnQgfSk7XG4gICAgcHJpdmF0ZSBjb250cm9sbGVyID0gUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbdGhpcy5ub2RlSWRdO1xuICAgIHByaXZhdGUgbGFzdERlbmllZExvZyA9IDA7XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYHJlbW90ZVN0b3JhZ2UvJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9LyR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLmlzTm9kZUNvbm5lY3RlZCh0aGlzLm5vZGVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5waW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRoZW50aWNhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGF1dGhlbnRpY2F0ZVN0b3JhZ2UoeyBhZGRyZXNzOiB0aGlzLnBhcnNlZC5hZGRyZXNzLCBwb3J0OiB0aGlzLnBhcnNlZC5wb3J0LCBub2RlSWQ6IHRoaXMubm9kZUlkIH0pO1xuICAgIH1cblxuICAgIC8vIFJ1bnMgYSBjYWxsLCBhdXRoZW50aWNhdGluZyAoYW5kIHJlLWF1dGhlbnRpY2F0aW5nIGFmdGVyIHJlY29ubmVjdHMpIGFzIG5lZWRlZC4gVW5saWtlXG4gICAgLy8gY2FsbCgpLCBkb2VzIE5PVCB3YWl0IGZvciBhY2NvdW50IGFjY2Vzcy5cbiAgICBwcml2YXRlIGFzeW5jIGNhbGxBdXRoZWQ8VD4oZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKCFTdHJpbmcoZS5zdGFjayB8fCBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGlzIG1hY2hpbmUgaGFzIGFjY2VzcyB0byB0aGUgYWNjb3VudC4gT3RoZXJ3aXNlIHB1dHMgaW4gYW4gYWNjZXNzXG4gICAgLy8gcmVxdWVzdCBhbmQgcmV0dXJucyBvdXIgbWFjaGluZUlkICsgaXAgKHNvIHRoZSBjYWxsZXIgY2FuIGRpc3BsYXkgdGhlbSBhbG9uZ3NpZGUgdGhlIGxpbmssXG4gICAgLy8gZm9yIHRoZSBhcHByb3ZlciB0byBtYXRjaCB0aGUgaW5jb21pbmcgcmVxdWVzdCkgYW5kIHRoZSBsaW5rIHRvIHRoZSBncmFudCBwYWdlLlxuICAgIHB1YmxpYyBhc3luYyB3YWl0aW5nRm9yQWNjZXNzKCk6IFByb21pc2U8eyBsaW5rOiBzdHJpbmc7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5jYWxsQXV0aGVkKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRBY2Nlc3NTdGF0ZSh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgaWYgKHN0YXRlLmhhc0FjY2VzcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHJlcXVlc3RlZCA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIucmVxdWVzdEFjY2Vzcyh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbms6IGBodHRwczovLyR7dGhpcy5wYXJzZWQuYWRkcmVzc306JHt0aGlzLnBhcnNlZC5wb3J0fS8ke3RoaXMuYWNjb3VudH1gLFxuICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0ZWQubWFjaGluZUlkLFxuICAgICAgICAgICAgaXA6IHJlcXVlc3RlZC5pcCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjZXNzU3RhdGUodGhpcy5hY2NvdW50KSk7XG4gICAgICAgIHJldHVybiAhIXN0YXRlLmhhc0FjY2VzcztcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlcnMgb3VyIGFjY2VzcyByZXF1ZXN0IHNlcnZlci1zaWRlIChzbyBhbiBhZG1pbiBoYXMgYSByZXF1ZXN0SWQgdG8gZ3JhbnQpIGFuZCBsb2dzIHRoZVxuICAgIC8vIGdyYW50IGluc3RydWN0aW9ucywgYXQgbW9zdCBvbmNlIGEgbWludXRlXG4gICAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckFjY2Vzc1JlcXVlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXF1ZXN0ZWQgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLnJlcXVlc3RBY2Nlc3ModGhpcy5hY2NvdW50KSk7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0RGVuaWVkTG9nID4gdGltZUluTWludXRlKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3REZW5pZWRMb2cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE5vIGFjY2VzcyB0byBzdG9yYWdlIGFjY291bnQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFjY291bnQpfSBvbiAke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0gKG91ciBtYWNoaW5lICR7cmVxdWVzdGVkLm1hY2hpbmVJZH0sIGlwICR7cmVxdWVzdGVkLmlwfSkuIFNlZSBodHRwczovLyR7dGhpcy5wYXJzZWQuYWRkcmVzc306JHt0aGlzLnBhcnNlZC5wb3J0fS8ke3RoaXMuYWNjb3VudH0gLSBvciBncmFudCBpdCB3aXRoOiAke3JlcXVlc3RlZC5ncmFudEFjY2Vzc0NvbW1hbmR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSdW5zIGEgY2FsbCwgYXV0aGVudGljYXRpbmcgKGFuZCByZS1hdXRoZW50aWNhdGluZyBhZnRlciByZWNvbm5lY3RzKSBhbmQgd2FpdGluZyBmb3IgYWNjb3VudFxuICAgIC8vIGFjY2VzcyBhcyBuZWVkZWQuIFdpdGggd2FpdEZvckFjY2VzcyBmYWxzZSwgZGVuaWVkIGNhbGxzIHRocm93IGltbWVkaWF0ZWx5IGluc3RlYWQgLSBidXQgdGhlXG4gICAgLy8gYWNjZXNzIHJlcXVlc3QgaXMgc3RpbGwgcmVnaXN0ZXJlZCAoaW4gdGhlIGJhY2tncm91bmQpLCBzbyB0aGUgZGVuaWFsIGlzIGdyYW50YWJsZS5cbiAgICBwcml2YXRlIGFzeW5jIGNhbGw8VD4oZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKGUuc3RhY2sgfHwgZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfQUNDRVNTX0RFTklFRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLndhaXRGb3JBY2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMucmVnaXN0ZXJBY2Nlc3NSZXF1ZXN0KCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckFjY2Vzc1JlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoQUNDRVNTX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0Mih0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGNvbmZpZz8ucmFuZ2UpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiB7IGRhdGE6IEJ1ZmZlci5mcm9tKHJlc3VsdC5kYXRhKSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9IHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLnNldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGRhdGEsIGNvbmZpZz8ubGFzdE1vZGlmaWVkKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZGVsKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmZpbmRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBwcmVmaXgsIGNvbmZpZykpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldENoYW5nZXNBZnRlcih0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgdGltZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0QXJjaGl2ZXNDb25maWcodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0U3luY1N0YXR1cyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGF1dGhlbnRpY2F0ZWQgd2l0aCBhY2Nlc3MgQkVGT1JFIGNvbnN1bWluZyBhbnkgZGF0YSAodGhlIHN0cmVhbSBjYW5ub3QgYmVcbiAgICAgICAgLy8gcmV3b3VuZCwgc28gd2UgY2FuJ3QgdXNlIHRoZSByZXRyeSBsb29wIGFyb3VuZCB0aGUgYWN0dWFsIHVwbG9hZClcbiAgICAgICAgYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBjb25maWcucGF0aCkpO1xuICAgICAgICBsZXQgdXBsb2FkSWQgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuc3RhcnRMYXJnZUZpbGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLnVwbG9hZFBhcnQodXBsb2FkSWQsIGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9GSUxFX1BBUlRfU0laRSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5maW5pc2hMYXJnZUZpbGUodXBsb2FkSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5jYW5jZWxMYXJnZUZpbGUodXBsb2FkSWQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIE9ubHkgYWN0dWFsbHkgbG9hZHMgZm9yIHB1YmxpYyBidWNrZXRzICh0aGUgc2VydmVyIHJlamVjdHMgcGxhaW4gVVJMIHJlYWRzIG90aGVyd2lzZSlcbiAgICAgICAgcmV0dXJuIGJ1aWxkRmlsZVVybChnZXRCdWNrZXRCYXNlVXJsKHRoaXMuY29uZmlnLnVybCksIHBhdGgpO1xuICAgIH1cbn1cbiJdfQ==
|
|
198
|
-
/* _JS_SOURCE_HASH = "
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNSZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1JlbW90ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQixtRUFBZ0U7QUFDaEUsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxrREFBNkU7QUFFN0UsaURBQWdGO0FBQ2hGLDJEQUc2QjtBQUU3QixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLGlHQUFpRztBQUNqRyxzREFBc0Q7QUFFdEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFhN0MsU0FBZ0IsZUFBZSxDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBTkQsMENBTUM7QUFFRCx1RkFBdUY7QUFDaEYsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQXlEO0lBQy9GLDRGQUE0RjtJQUM1RiwwREFBMEQ7SUFDMUQsK0JBQWMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDekMsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FB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Iiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRJZGVudGl0eUNBLCBsb2FkSWRlbnRpdHlDQSwgc2lnbiB9IGZyb20gXCIuLi8uLi9taXNjL2h0dHBzL2NlcnRzXCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsIEFyY2hpdmVzU3luY1N0YXR1cyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IHBhcnNlSG9zdGVkVXJsLCBnZXRCdWNrZXRCYXNlVXJsLCBidWlsZEZpbGVVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7XG4gICAgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfQVVUSF9QVVJQT1NFLFxuICAgIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQsIFNUT1JBR0VfQUNDRVNTX0RFTklFRCxcbn0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcblxuLy8gQSBidWNrZXQgb24gb3VyIHJlbW90ZSBzdG9yYWdlIHNlcnZlciAoc3RvcmFnZVNlcnZlci50cyksIHVzZWQgbGlrZSBBcmNoaXZlc0JhY2tibGF6ZS4gV29ya3MgaW5cbi8vIE5vZGUuanMgYW5kIHRoZSBicm93c2VyLiBBdXRoZW50aWNhdGVzIHdpdGggdGhpcyBtYWNoaW5lJ3MgY2VydHMudHMgaWRlbnRpdHk7IGlmIHRoZSBhY2NvdW50XG4vLyBoYXNuJ3QgdHJ1c3RlZCB0aGlzIG1hY2hpbmUgeWV0IGl0IHJlcXVlc3RzIGFjY2VzcywgYW5kIGJ5IGRlZmF1bHQgd2FpdHMsIGxvZ2dpbmcgaW5zdHJ1Y3Rpb25zXG4vLyBldmVyeSBtaW51dGUgKGNhbGxzIGJsb2NrIHVudGlsIGFjY2VzcyBpcyBncmFudGVkKS5cblxuY29uc3QgQUNDRVNTX1JFVFJZX0RFTEFZID0gMTAwMCAqIDMwO1xuY29uc3QgTEFSR0VfRklMRV9QQVJUX1NJWkUgPSA4ICogMTAyNCAqIDEwMjQ7XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzUmVtb3RlQ29uZmlnID0ge1xuICAgIC8vIFRoZSBidWNrZXQncyByb3V0aW5nIFVSTCwgd2hpY2ggYWRkcmVzc2VzIHRoZSBzZXJ2ZXIsIGFjY291bnQsIGFuZCBidWNrZXQgaW4gb25lOlxuICAgIC8vICBodHRwczovL3N0b3JhZ2UuZXhhbXBsZS5jb206NDQ0NC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gQWNjZXNzIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGlzIGFjY291bnQgKGRlZmF1bHRzIHRvIHRoZSBhY2NvdW50IGluIHRoZSB1cmwpXG4gICAgYWNjb3VudE5hbWU/OiBzdHJpbmc7XG4gICAgLy8gZmFsc2U6IGFjY2Vzcy1kZW5pZWQgY2FsbHMgdGhyb3cgaW1tZWRpYXRlbHkgKHRoZSBlcnJvciBpbmNsdWRlcyB0aGUgYWNjZXNzIHBhZ2UgbGluaylcbiAgICAvLyBpbnN0ZWFkIG9mIHJlcXVlc3RpbmcgYWNjZXNzIGFuZCBibG9ja2luZyB1bnRpbCBpdCBpcyBncmFudGVkICh0aGUgZGVmYXVsdCkuXG4gICAgd2FpdEZvckFjY2Vzcz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdG9yYWdlVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9IHtcbiAgICBsZXQgdSA9IG5ldyBVUkwodXJsKTtcbiAgICBpZiAodS5wcm90b2NvbCAhPT0gXCJodHRwczpcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0b3JhZ2UgVVJMIG11c3QgdXNlIGh0dHBzLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh1LnByb3RvY29sKX0gaW4gJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MyB9O1xufVxuXG4vLyBBdXRoZW50aWNhdGVzIGEgY29ubmVjdGlvbiB0byBhIHN0b3JhZ2Ugc2VydmVyIHdpdGggdGhpcyBtYWNoaW5lJ3MgY2VydHMudHMgaWRlbnRpdHlcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVTdG9yYWdlKGNvbmZpZzogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgbm9kZUlkOiBzdHJpbmcgfSk6IFByb21pc2U8eyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9PiB7XG4gICAgLy8gaG9zdFNlcnZlciBub2RlSWRzIGFyZSBtYWNoaW5lLXNwZWNpZmljLCBzbyBjb25uZWN0aW9ucyBieSBkb21haW4gbXVzdCB0YXJnZXQgXCJhbnkgc2VydmVyXG4gICAgLy8gYXQgdGhpcyBhZGRyZXNzXCIgKHdoaWNoIGlzIGhvdyBicm93c2VycyBhbHdheXMgY29ubmVjdClcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCByb290RG9tYWluID0gY29uZmlnLmFkZHJlc3Muc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcbiAgICBhd2FpdCBsb2FkSWRlbnRpdHlDQShyb290RG9tYWluKTtcbiAgICBsZXQgY2EgPSBnZXRJZGVudGl0eUNBKHJvb3REb21haW4pO1xuICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc2lnbmF0dXJlID0gc2lnbih7IGtleTogY2Eua2V5IH0sIHtcbiAgICAgICAgcHVycG9zZTogU1RPUkFHRV9BVVRIX1BVUlBPU0UsXG4gICAgICAgIHRpbWUsXG4gICAgICAgIHNlcnZlcjogYCR7Y29uZmlnLmFkZHJlc3N9OiR7Y29uZmlnLnBvcnR9YCxcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbY29uZmlnLm5vZGVJZF0uYXV0aGVudGljYXRlKHsgY2VydFBlbTogY2EuY2VydC50b1N0cmluZygpLCB0aW1lLCBzaWduYXR1cmUgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc1JlbW90ZSBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IEFyY2hpdmVzUmVtb3RlQ29uZmlnKSB7XG4gICAgICAgIC8vIGhvc3RTZXJ2ZXIgbm9kZUlkcyBhcmUgbWFjaGluZS1zcGVjaWZpYywgc28gY29ubmVjdGlvbnMgYnkgZG9tYWluIG11c3QgdGFyZ2V0IFwiYW55XG4gICAgICAgIC8vIHNlcnZlciBhdCB0aGlzIGFkZHJlc3NcIiAod2hpY2ggaXMgaG93IGJyb3dzZXJzIGFsd2F5cyBjb25uZWN0KVxuICAgICAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwodGhpcy5jb25maWcudXJsKTtcbiAgICBwcml2YXRlIGFjY291bnQgPSB0aGlzLmNvbmZpZy5hY2NvdW50TmFtZSB8fCB0aGlzLnBhcnNlZC5hY2NvdW50O1xuICAgIHByaXZhdGUgYnVja2V0TmFtZSA9IHRoaXMucGFyc2VkLmJ1Y2tldE5hbWU7XG4gICAgcHJpdmF0ZSBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5jb25uZWN0KHsgYWRkcmVzczogdGhpcy5wYXJzZWQuYWRkcmVzcywgcG9ydDogdGhpcy5wYXJzZWQucG9ydCB9KTtcbiAgICBwcml2YXRlIGNvbnRyb2xsZXIgPSBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1t0aGlzLm5vZGVJZF07XG4gICAgcHJpdmF0ZSBsYXN0RGVuaWVkTG9nID0gMDtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgcmVtb3RlU3RvcmFnZS8ke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0vJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU29ja2V0RnVuY3Rpb24uaXNOb2RlQ29ubmVjdGVkKHRoaXMubm9kZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcGluZygpOiBQcm9taXNlPHsgdGFrZW92ZXI/OiBzdHJpbmcgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250cm9sbGVyLnBpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGF1dGhlbnRpY2F0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHRoaXMucGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHRoaXMucGFyc2VkLnBvcnQsIG5vZGVJZDogdGhpcy5ub2RlSWQgfSk7XG4gICAgfVxuXG4gICAgLy8gUnVucyBhIGNhbGwsIGF1dGhlbnRpY2F0aW5nIChhbmQgcmUtYXV0aGVudGljYXRpbmcgYWZ0ZXIgcmVjb25uZWN0cykgYXMgbmVlZGVkLiBVbmxpa2VcbiAgICAvLyBjYWxsKCksIGRvZXMgTk9UIHdhaXQgZm9yIGFjY291bnQgYWNjZXNzLlxuICAgIHByaXZhdGUgYXN5bmMgY2FsbEF1dGhlZDxUPihmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIVN0cmluZyhlLnN0YWNrIHx8IGUpLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB0aHJvdyBlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoaXMgbWFjaGluZSBoYXMgYWNjZXNzIHRvIHRoZSBhY2NvdW50LiBPdGhlcndpc2UgcHV0cyBpbiBhbiBhY2Nlc3NcbiAgICAvLyByZXF1ZXN0IGFuZCByZXR1cm5zIG91ciBtYWNoaW5lSWQgKyBpcCAoc28gdGhlIGNhbGxlciBjYW4gZGlzcGxheSB0aGVtIGFsb25nc2lkZSB0aGUgbGluayxcbiAgICAvLyBmb3IgdGhlIGFwcHJvdmVyIHRvIG1hdGNoIHRoZSBpbmNvbWluZyByZXF1ZXN0KSBhbmQgdGhlIGxpbmsgdG8gdGhlIGdyYW50IHBhZ2UuXG4gICAgcHVibGljIGFzeW5jIHdhaXRpbmdGb3JBY2Nlc3MoKTogUHJvbWlzZTx7IGxpbms6IHN0cmluZzsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEFjY2Vzc1N0YXRlKHRoaXMuYWNjb3VudCkpO1xuICAgICAgICBpZiAoc3RhdGUuaGFzQWNjZXNzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmVxdWVzdGVkID0gYXdhaXQgdGhpcy5jYWxsQXV0aGVkKCgpID0+IHRoaXMuY29udHJvbGxlci5yZXF1ZXN0QWNjZXNzKHRoaXMuYWNjb3VudCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluazogYGh0dHBzOi8vJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9LyR7dGhpcy5hY2NvdW50fWAsXG4gICAgICAgICAgICBtYWNoaW5lSWQ6IHJlcXVlc3RlZC5tYWNoaW5lSWQsXG4gICAgICAgICAgICBpcDogcmVxdWVzdGVkLmlwLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5jYWxsQXV0aGVkKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRBY2Nlc3NTdGF0ZSh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgcmV0dXJuICEhc3RhdGUuaGFzQWNjZXNzO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVycyBvdXIgYWNjZXNzIHJlcXVlc3Qgc2VydmVyLXNpZGUgKHNvIGFuIGFkbWluIGhhcyBhIHJlcXVlc3RJZCB0byBncmFudCkgYW5kIGxvZ3MgdGhlXG4gICAgLy8gZ3JhbnQgaW5zdHJ1Y3Rpb25zLCBhdCBtb3N0IG9uY2UgYSBtaW51dGVcbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RlZCA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIucmVxdWVzdEFjY2Vzcyh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3REZW5pZWRMb2cgPiB0aW1lSW5NaW51dGUpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdERlbmllZExvZyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTm8gYWNjZXNzIHRvIHN0b3JhZ2UgYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KHRoaXMuYWNjb3VudCl9IG9uICR7dGhpcy5wYXJzZWQuYWRkcmVzc306JHt0aGlzLnBhcnNlZC5wb3J0fSAob3VyIG1hY2hpbmUgJHtyZXF1ZXN0ZWQubWFjaGluZUlkfSwgaXAgJHtyZXF1ZXN0ZWQuaXB9KS4gU2VlIGh0dHBzOi8vJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9LyR7dGhpcy5hY2NvdW50fSAtIG9yIGdyYW50IGl0IHdpdGg6ICR7cmVxdWVzdGVkLmdyYW50QWNjZXNzQ29tbWFuZH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1bnMgYSBjYWxsLCBhdXRoZW50aWNhdGluZyAoYW5kIHJlLWF1dGhlbnRpY2F0aW5nIGFmdGVyIHJlY29ubmVjdHMpIGFuZCB3YWl0aW5nIGZvciBhY2NvdW50XG4gICAgLy8gYWNjZXNzIGFzIG5lZWRlZC4gV2l0aCB3YWl0Rm9yQWNjZXNzIGZhbHNlLCBkZW5pZWQgY2FsbHMgdGhyb3cgaW1tZWRpYXRlbHkgaW5zdGVhZCAtIGJ1dCB0aGVcbiAgICAvLyBhY2Nlc3MgcmVxdWVzdCBpcyBzdGlsbCByZWdpc3RlcmVkIChpbiB0aGUgYmFja2dyb3VuZCksIHNvIHRoZSBkZW5pYWwgaXMgZ3JhbnRhYmxlLlxuICAgIHByaXZhdGUgYXN5bmMgY2FsbDxUPihmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYygpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoZS5zdGFjayB8fCBlKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9BQ0NFU1NfREVOSUVEKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcud2FpdEZvckFjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5yZWdpc3RlckFjY2Vzc1JlcXVlc3QoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShBQ0NFU1NfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXQyKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgY29uZmlnPy5yYW5nZSkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgZGF0YTogQnVmZmVyLmZyb20ocmVzdWx0LmRhdGEpLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH0gfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuc2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnPy5sYXN0TW9kaWZpZWQpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5kZWwodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEluZm8odGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZmluZEluZm8odGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIHByZWZpeCwgY29uZmlnKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyKHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0Q2hhbmdlc0FmdGVyKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCB0aW1lKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRBcmNoaXZlc0NvbmZpZyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRTeW5jU3RhdHVzKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBFbnN1cmUgd2UncmUgYXV0aGVudGljYXRlZCB3aXRoIGFjY2VzcyBCRUZPUkUgY29uc3VtaW5nIGFueSBkYXRhICh0aGUgc3RyZWFtIGNhbm5vdCBiZVxuICAgICAgICAvLyByZXdvdW5kLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIHJldHJ5IGxvb3AgYXJvdW5kIHRoZSBhY3R1YWwgdXBsb2FkKVxuICAgICAgICBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEluZm8odGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGNvbmZpZy5wYXRoKSk7XG4gICAgICAgIGxldCB1cGxvYWRJZCA9IGF3YWl0IHRoaXMuY29udHJvbGxlci5zdGFydExhcmdlRmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgY29uZmlnLnBhdGgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGF0YS5sZW5ndGg7IG9mZnNldCArPSBMQVJHRV9GSUxFX1BBUlRfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIudXBsb2FkUGFydCh1cGxvYWRJZCwgZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX0ZJTEVfUEFSVF9TSVpFKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLmZpbmlzaExhcmdlRmlsZSh1cGxvYWRJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLmNhbmNlbExhcmdlRmlsZSh1cGxvYWRJZCk7XG4gICAgICAgICAgICB9IGNhdGNoIHsgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gT25seSBhY3R1YWxseSBsb2FkcyBmb3IgcHVibGljIGJ1Y2tldHMgKHRoZSBzZXJ2ZXIgcmVqZWN0cyBwbGFpbiBVUkwgcmVhZHMgb3RoZXJ3aXNlKVxuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwodGhpcy5jb25maWcudXJsKSwgcGF0aCk7XG4gICAgfVxufVxuIl19
|
|
198
|
+
/* _JS_SOURCE_HASH = "55cf7230420406cbba724f2c2949db5aea36ebd5f8f1a0bc4bf8c2fb71b37623"; */
|