sliftutils 1.7.88 → 1.7.90
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/.claude/settings.local.json +3 -1
- package/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +679 -300
- 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/cloudflareHelpers.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +2 -2
- package/misc/https/dist/hostServer.ts.cache +49 -21
- package/misc/https/dist/hostsFile.ts.cache +82 -0
- package/misc/https/dist/httpsCerts.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/hostServer.d.ts +6 -2
- package/misc/https/hostServer.ts +52 -19
- package/misc/https/hostsFile.d.ts +7 -0
- package/misc/https/hostsFile.ts +66 -0
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/ArchivesDisk.d.ts +3 -6
- package/storage/ArchivesDisk.ts +26 -2
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
- 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 +3 -3
- 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/IArchives.d.ts +37 -24
- package/storage/IArchives.ts +47 -62
- package/storage/LogMap.d.ts +56 -0
- package/storage/LogMap.ts +220 -0
- package/storage/archiveHelpers.d.ts +36 -0
- package/storage/archiveHelpers.ts +103 -0
- package/storage/backblaze.d.ts +7 -12
- package/storage/backblaze.ts +53 -48
- package/storage/dist/ArchivesDisk.ts.cache +29 -3
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +17 -53
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/LogMap.ts.cache +212 -0
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/archiveHelpers.ts.cache +87 -0
- package/storage/dist/backblaze.ts.cache +59 -45
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
- package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
- package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
- package/storage/remoteStorage/ArchivesRemote.ts +26 -5
- package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
- package/storage/remoteStorage/ArchivesUrl.ts +2 -2
- package/storage/remoteStorage/accessPage.tsx +12 -0
- package/storage/remoteStorage/blobStore.d.ts +162 -189
- package/storage/remoteStorage/blobStore.ts +495 -952
- package/storage/remoteStorage/bucketDisk.d.ts +24 -3
- package/storage/remoteStorage/bucketDisk.ts +56 -22
- package/storage/remoteStorage/certTrustModal.d.ts +1 -0
- package/storage/remoteStorage/certTrustModal.tsx +48 -0
- package/storage/remoteStorage/cliArgs.d.ts +2 -0
- package/storage/remoteStorage/cliArgs.ts +5 -0
- package/storage/remoteStorage/createArchives.d.ts +8 -7
- package/storage/remoteStorage/createArchives.ts +65 -26
- package/storage/remoteStorage/deployTakeover.ts +1 -1
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +26 -6
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
- package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +484 -966
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
- package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +64 -27
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
- package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
- package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +33 -36
- package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
- package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
- package/storage/remoteStorage/dist/storageServerState.ts.cache +138 -707
- package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
- package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
- package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
- package/storage/remoteStorage/dist/storeSync.ts.cache +651 -0
- package/storage/remoteStorage/dist/validation.ts.cache +14 -4
- package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
- package/storage/remoteStorage/intermediateManagement.ts +264 -0
- package/storage/remoteStorage/remoteConfig.d.ts +32 -0
- package/storage/remoteStorage/remoteConfig.ts +115 -50
- package/storage/remoteStorage/serverConfig.d.ts +1 -1
- package/storage/remoteStorage/serverConfig.ts +1 -1
- package/storage/remoteStorage/sourceWrapper.ts +4 -8
- package/storage/remoteStorage/sourcesList.d.ts +0 -2
- package/storage/remoteStorage/sourcesList.ts +0 -3
- package/storage/remoteStorage/spec.md +18 -4
- package/storage/remoteStorage/storageController.d.ts +10 -0
- package/storage/remoteStorage/storageController.ts +37 -41
- package/storage/remoteStorage/storageServer.d.ts +2 -0
- package/storage/remoteStorage/storageServer.ts +28 -4
- package/storage/remoteStorage/storageServerCli.ts +5 -1
- package/storage/remoteStorage/storageServerState.d.ts +39 -26
- package/storage/remoteStorage/storageServerState.ts +149 -669
- package/storage/remoteStorage/storeConfig.d.ts +30 -0
- package/storage/remoteStorage/storeConfig.ts +62 -0
- package/storage/remoteStorage/storePlan.d.ts +29 -17
- package/storage/remoteStorage/storePlan.ts +112 -85
- package/storage/remoteStorage/storeSources.d.ts +11 -0
- package/storage/remoteStorage/storeSources.ts +47 -0
- package/storage/remoteStorage/storeSync.d.ts +53 -0
- package/storage/remoteStorage/storeSync.ts +632 -0
- package/storage/remoteStorage/validation.d.ts +2 -0
- package/storage/remoteStorage/validation.ts +10 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
// The important operations of an archive bucket (extracted from ArchivesBackblaze), so other backends (e.g. our own remote storage server) can be used interchangeably.
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
4
4
|
//exports.copyArchiveFile = exports.bufferChunkStream = exports.LARGE_SET_THRESHOLD = exports.windowsAcceptWrites = exports.windowAcceptsWrites = exports.VARIABLE_SHARD = exports.FULL_ROUTE = exports.STORAGE_WRONG_ROUTE = exports.STORAGE_WRONG_VALID_WINDOW = exports.FULL_VALID_WINDOW = exports.assertValidLastModified = exports.IMMUTABLE_CACHE_TIME = exports.MAX_LAST_MODIFIED_FUTURE = void 0;
|
|
@@ -34,63 +34,27 @@ function windowsAcceptWrites(validWindows) {
|
|
|
34
34
|
return validWindows.some(windowAcceptsWrites);
|
|
35
35
|
}
|
|
36
36
|
exports.windowsAcceptWrites = windowsAcceptWrites;
|
|
37
|
-
const LARGE_COPY_THRESHOLD = 64 * 1024 * 1024;
|
|
38
|
-
const LARGE_COPY_CHUNK = 32 * 1024 * 1024;
|
|
39
37
|
// Above this, set transparently streams through setLargeFile: one giant wire message would exceed the transport limit and lag every other client sharing the connection
|
|
40
38
|
exports.LARGE_SET_THRESHOLD = 8 * 1024 * 1024;
|
|
41
|
-
/**
|
|
39
|
+
/** The setLargeFile stream over an in-memory buffer, in LARGE_SET_THRESHOLD slices - how set transparently becomes setLargeFile for large buffers. Spread into the config: it provides both getNextData and restartStream (the buffer is still held, so a retry costs nothing). */
|
|
42
40
|
function bufferChunkStream(data) {
|
|
43
41
|
let offset = 0;
|
|
44
|
-
return
|
|
45
|
-
if (offset >= data.length)
|
|
46
|
-
return undefined;
|
|
47
|
-
let chunk = data.subarray(offset, offset + exports.LARGE_SET_THRESHOLD);
|
|
48
|
-
offset += chunk.length;
|
|
49
|
-
return chunk;
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
exports.bufferChunkStream = bufferChunkStream;
|
|
53
|
-
/** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. size/writeTime usually come from the caller's metadata scan; when either is omitted, getInfo fills them in. Returns the copied file's info, or undefined when the source doesn't have the file. */
|
|
54
|
-
async function copyArchiveFile(config) {
|
|
55
|
-
let { from, to, path } = config;
|
|
56
|
-
let size = config.size;
|
|
57
|
-
let writeTime = config.writeTime;
|
|
58
|
-
if (size === undefined || writeTime === undefined) {
|
|
59
|
-
let info = await from.getInfo(path, { noFallbacks: config.noFallbacks });
|
|
60
|
-
if (!info)
|
|
61
|
-
return undefined;
|
|
62
|
-
size = info.size;
|
|
63
|
-
writeTime = info.writeTime;
|
|
64
|
-
}
|
|
65
|
-
if (size <= LARGE_COPY_THRESHOLD) {
|
|
66
|
-
let result = await from.get2(path, { internal: config.internal, noFallbacks: config.noFallbacks });
|
|
67
|
-
// Empty counts as absent, never as content to copy: an empty file IS a deletion, set refuses empty buffers, and deletions travel through their own path (del / scan tombstones)
|
|
68
|
-
if (!result || !result.data || !result.data.length)
|
|
69
|
-
return undefined;
|
|
70
|
-
await to.set(path, result.data, { lastModified: result.writeTime, forceSetImmutable: config.forceSetImmutable, noChecks: config.noChecks, internal: config.internal });
|
|
71
|
-
return { writeTime: result.writeTime, size: result.data.length };
|
|
72
|
-
}
|
|
73
|
-
// Consts so the closure keeps the narrowed types
|
|
74
|
-
const totalSize = size;
|
|
75
|
-
const finalWriteTime = writeTime;
|
|
76
|
-
let offset = 0;
|
|
77
|
-
await to.setLargeFile({
|
|
78
|
-
path,
|
|
79
|
-
lastModified: finalWriteTime,
|
|
42
|
+
return {
|
|
80
43
|
getNextData: async () => {
|
|
81
|
-
if (offset >=
|
|
44
|
+
if (offset >= data.length)
|
|
82
45
|
return undefined;
|
|
83
|
-
let
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
offset
|
|
89
|
-
return data;
|
|
46
|
+
let chunk = data.subarray(offset, offset + exports.LARGE_SET_THRESHOLD);
|
|
47
|
+
offset += chunk.length;
|
|
48
|
+
return chunk;
|
|
49
|
+
},
|
|
50
|
+
restartStream: () => {
|
|
51
|
+
offset = 0;
|
|
90
52
|
},
|
|
91
|
-
}
|
|
92
|
-
return { writeTime: finalWriteTime, size: totalSize };
|
|
53
|
+
};
|
|
93
54
|
}
|
|
94
|
-
exports.
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUFyY2hpdmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSUFyY2hpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3S0FBd0s7OztBQUV4SyxzSkFBc0o7QUFDekksUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2RCx5TEFBeUw7QUFDNUssUUFBQSxvQkFBb0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pELFNBQWdCLHVCQUF1QixDQUFDLFlBQW9CO0lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQ0FBd0IsQ0FBQztJQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxZQUFZLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7QUFDTCxDQUFDO0FBTEQsMERBS0M7QUEwRVksUUFBQSxpQkFBaUIsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUEyR2hGLHdYQUF3WDtBQUMzVyxRQUFBLDBCQUEwQixHQUFHLDRDQUE0QyxDQUFDO0FBRXZGLDhMQUE4TDtBQUNqTCxRQUFBLG1CQUFtQixHQUFHLHFDQUFxQyxDQUFDO0FBRTVELFFBQUEsVUFBVSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVuRCwyUkFBMlI7QUFDOVEsUUFBQSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFDNUUsb0xBQW9MO0FBQ3BMLDhKQUE4SjtBQUM5SixTQUFnQixtQkFBbUIsQ0FBQyxXQUF5QztJQUN6RSxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBSEQsa0RBR0M7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SUFBSTtRQUNKLFlBQVksRUFBRSxjQUFjO1FBQzVCLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwQixJQUFJLE1BQU0sSUFBSSxTQUFTO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pELElBQUksSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMvSCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLE9BQU8sTUFBTSxJQUFJLEdBQUcsY0FBYyxHQUFHLEdBQUcsTUFBTSxlQUFlLFNBQVMsK0NBQStDLENBQUMsQ0FBQztZQUMxUCxDQUFDO1lBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUNKLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBOUNELDBDQThDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBpbXBvcnRhbnQgb3BlcmF0aW9ucyBvZiBhbiBhcmNoaXZlIGJ1Y2tldCAoZXh0cmFjdGVkIGZyb20gQXJjaGl2ZXNCYWNrYmxhemUpLCBzbyBvdGhlciBiYWNrZW5kcyAoZS5nLiBvdXIgb3duIHJlbW90ZSBzdG9yYWdlIHNlcnZlcikgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LlxuXG4vLyBBIHdyaXRlIG1heSBub3QgYmUgc3RhbXBlZCBtb3JlIHRoYW4gdGhpcyBmYXIgaW4gdGhlIGZ1dHVyZSwgb3IgY2xvY2sgc2tldyBiZXR3ZWVuIG1hY2hpbmVzIHdvdWxkIGxldCBhIGJhZCB0aW1lc3RhbXAgYmxvY2sgd3JpdGVzIGZvciBhIGxvbmcgdGltZS5cbmV4cG9ydCBjb25zdCBNQVhfTEFTVF9NT0RJRklFRF9GVVRVUkUgPSAxNSAqIDYwICogMTAwMDtcblxuLy8gSG93IGxvbmcgYnJvd3NlcnMgbWF5IGNhY2hlIGZpbGVzIGZyb20gaW1tdXRhYmxlIGJ1Y2tldHMgKHRoZSBDYWNoZS1Db250cm9sIG1heC1hZ2UpLCBzaGFyZWQgYnkgZXZlcnkgaG9zdGluZyBwYXRoIChiYWNrYmxhemUgYnVja2V0IHNldHRpbmdzIGFuZCBvdXIgb3duIHN0b3JhZ2Ugc2VydmVyJ3MgSFRUUCByb3V0ZSlcbmV4cG9ydCBjb25zdCBJTU1VVEFCTEVfQ0FDSEVfVElNRSA9IDg2NDAwICogMTAwMDtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBtYXggPSBEYXRlLm5vdygpICsgTUFYX0xBU1RfTU9ESUZJRURfRlVUVVJFO1xuICAgIGlmIChsYXN0TW9kaWZpZWQgPiBtYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBsYXN0TW9kaWZpZWQgaXMgdG9vIGZhciBpbiB0aGUgZnV0dXJlOiAke2xhc3RNb2RpZmllZH0gPiAke21heH0gKG5vdyArIDE1IG1pbnV0ZXMpYCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBOT1RFOiBWZXJzaW9uIGlzIHVzZWQgd2hlbiB1cGRhdGluZyB0aGUgY29uZmlndXJhdGlvbi4gVGhlIG5ld2VyIHZlcnNpb24gaXMgYWx3YXlzIHRha2VuLiBBIG1pc3NpbmcgdmVyc2lvbiBjb3VudHMgYXMgdmVyc2lvbiAtMS5cbiAgICB2ZXJzaW9uPzogbnVtYmVyO1xuICAgIHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXTtcbn07XG5cbi8qKlxuICAgIHN0cmluZyBhcmd1bWVudHMgd2lsbCBiZSBhIHVybCwgbG9va2luZyBsaWtlOlxuICAgICAgICBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvcXVlcnlzdWJ0ZXN0LWNvbS1wdWJsaWMtaW1tdXRhYmxlL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICAtIFRoZXNlIG1hcCB0byB7IHVybCB9LCB3aXRoIHRoZSB0eXBlIGluZmVycmVkIGZyb20gdGhlIHVybFxuICAgICAgICAtIEhvc3RlZCB1cmxzIGFyZSAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiwgYmFja2JsYXplIHVybHMgYXJlIC9maWxlLzxidWNrZXROYW1lPi8uLi5cblxuICAgIE5PVEU6IElmIHdlIGRvIG5vdCBoYXZlIHJpZ2h0IGFjY2VzcyB0byB0aGVzZSwgdGhlbiBpdCBiZWNvbWVzIGEgcmVhZC1vbmx5IElBcmNoaXZlcywgd2hlcmUgd2Ugc29sZWx5IHJlYWQgdXNpbmcgdGhlIHVybCBmb3JtICh3aGljaCBtaWdodCB0aHJvdyBkdWUgdG8gbm90IGhhdmluZyBhY2Nlc3MgYXMgd2VsbCkuIFVOTEVTUyBPdXIgY29uZmlndXJhdGlvbiBleHBsaWNpdGx5IGhhcyBwdWJsaWM6IGZhbHNlLCBpbiB3aGljaCBjYXNlLCB3ZSBkb24ndCBldmVuIGhpdCB0aGUgVVJMIGFuZCB3ZSB0aHJvdyBvbiBhY2Nlc3MuXG5cbiAgICBOT1RFOiBJZiB3ZSdyZSBpbiB0aGUgYnJvd3Nlciwgd2Ugc2hvdWxkIGFsbG93IGRvd25sb2FkaW5nIHRoZSBmaWxlcyB2aWEgdGhlIFVSTCBmb3JtIChpZiBpdCdzIGEgcHVibGljIGJ1Y2tldCksIGhvd2V2ZXIsIHdlIHdvbid0IGFsbG93IHdyaXRpbmcsIGJlY2F1c2UgdGhlaXIgc2VydmVycyBkbyBub3QgYWxsb3cgc2VjdXJlIGJyb3dzZXIgd3JpdGVzLlxuKi9cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZ0Jhc2UgPSBzdHJpbmcgfCBTb3VyY2VDb25maWc7XG5cbi8qKiBPbmUgY29uZmlndXJlZCBzb3VyY2UgaW4gYSByb3V0aW5nIGNvbmZpZzogYSBob3N0ZWQgKG91ciBzdG9yYWdlIHNlcnZlcikgb3IgYmFja2JsYXplIGVudHJ5LiBSZXF1ZXN0cyBjYXJyeSB0aGUgZXhhY3QgU291cmNlQ29uZmlnIHRoZXkgc2VsZWN0ZWQsIGFuZCB0aGUgc2VydmVyIG1hdGNoZXMgaXQgYWdhaW5zdCBpdHMgb3duIGVudHJpZXMgdG8gcGljayB0aGUgYmFja2luZyBzdG9yZS4gKi9cbmV4cG9ydCB0eXBlIFNvdXJjZUNvbmZpZyA9IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZztcblxuZXhwb3J0IHR5cGUgQ29tbW9uQ29uZmlnID0ge1xuICAgIC8qKiBCeSBkZWZhdWx0IGEgc2VydmVyIGhvc3RpbmcgdGhpcyBidWNrZXQgZWFnZXJseSBjb3BpZXMgdGhpcyBzb3VyY2UncyBmdWxsIGNvbnRlbnRzIG9udG8gaXRzIG93biBkaXNrIChvbiB0b3Agb2YgdGhlIGxhenkgcmVhZC10aHJvdWdoIGNhY2hpbmcpLiBTZXQgdGhpcyB0byBiZSBhIGZyb250IGVuZCBmb3IgYSB2ZXJ5IGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyB0aGUgZnVsbCBkYXRhYmFzZSAtIHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgaW5kaXZpZHVhbCBmaWxlcyBvbiBkZW1hbmQuICovXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQtY2FjaGUgdGhpcyBzZXJ2ZXIncyBkaXNrIG1heSBob2xkOyBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gZGlzayB0byBzdGF5IHVuZGVyIGl0IChvbmx5IGV2ZXIgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIHRoZSBmaWxlIC0gdGhlIG9ubHkgY29weSBpcyBuZXZlciBkZWxldGVkKS4gUmVxdWlyZXMgbm9GdWxsU3luYyAoYSBmdWxsIGNvcHkgY2FuJ3QgYmUgYm91bmRlZCkuICovXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgd3JpdGUgdGltZXMgKFtzdGFydE1zLCBlbmRNc10pIHRoaXMgc291cmNlIGlzIHZhbGlkIGZvciAoc2VlIEFyY2hpdmVzU291cmNlLnZhbGlkV2luZG93IGZvciB0aGUgc3luY2hyb25pemF0aW9uIHNlbWFudGljcykuIFJlcXVpcmVkIG9uIG9iamVjdCBjb25maWdzOiBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBTQ0hFRFVMRUQgKGEgbmV3IHNvdXJjZSBiZWNvbWVzIHZhbGlkIGF0IGEgZnV0dXJlIHRpbWUgd2hpbGUgdGhlIG9sZCBvbmUncyB3aW5kb3cgZW5kcyksIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gUGxhaW4gVVJMLXN0cmluZyBzb3VyY2VzIGRlZmF1bHQgdG8gRlVMTF9WQUxJRF9XSU5ET1cgLSBvbmNlIHlvdSdyZSB3cml0aW5nIG9iamVjdCBjb25maWdzLCB5b3UncmUgZG9pbmcgc29tZXRoaW5nIGNvbXBsaWNhdGVkIGVub3VnaCB0byB0aGluayBhYm91dCB3aGVuIHRoaW5ncyBjaGFuZ2UuICovXG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLyoqIFNoYXJkaW5nOiB0aGUgZnJhY3Rpb24gb2YgdGhlIGtleSBzcGFjZSB0aGlzIHNvdXJjZSBoYW5kbGVzLCBhcyBbc3RhcnQsIGVuZCkgb3ZlciBbMCwgMSkgKGtleXMgYXJlIHJvdXRlZCBieSBnZXRSb3V0ZSBpbiByZW1vdGVDb25maWcudHMpLiBEZWZhdWx0cyB0byBGVUxMX1JPVVRFICh1bnNoYXJkZWQpLiBBdCBldmVyeSBwb2ludCBpbiB0aW1lIHRoZSBzb3VyY2VzJyByb3V0ZXMgbXVzdCBmdWxseSBjb3ZlciBbMCwgMSksIG9yIHNvbWUga2V5cyBjb3VsZCBuZXZlciBiZSByZWFkLiAqL1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICAvKiogU2V0IG9uIGVudHJpZXMgaW5qZWN0ZWQgaW50byB0aGUgaW4tbWVtb3J5IGNvbmZpZyBieSBhbiBvdmVybGF5IChhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgd2luZG93KS4gTmV2ZXIgd3JpdHRlbiB0byBkaXNrOiByZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyBzdHJpcHMgdGhlc2UgYW5kIHJlam9pbnMgdGhlIHdpbmRvd3MgYXJvdW5kIHRoZW0sIHdoaWNoIGlzIGFsc28gaG93IGEgY2xpZW50IHRlbGxzIHdoZXRoZXIgYW4gdXBkYXRlIGlzIGEgcmVhbCBjb25maWd1cmF0aW9uIGNoYW5nZSBvciBqdXN0IGFuIG92ZXJsYXkuIFRoZSBWQUxVRSBpcyB0aGUgdXJsIG9mIHRoZSBzb3VyY2UgdGhpcyBpbnRlcm1lZGlhdGUgd2FzIHNwbGl0IG91dCBvZiAoaXRzIGFsdGVybmF0ZS1wb3J0IHZpZXcpIC0gc28gYSByZXF1ZXN0IG5hbWluZyB0aGUgaW50ZXJtZWRpYXRlIHN0aWxsIHJlc29sdmVzIHRvIHRoZSBPUklHSU5BTCBzb3VyY2UsIGV2ZW4gYWZ0ZXIgdGhlIGludGVybWVkaWF0ZSByZWpvaW5zIGFuZCB0aGUgZW50cnkgaXMgZ29uZS4gKi9cbiAgICBpbnRlcm1lZGlhdGU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBIb3N0ZWRDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJyZW1vdGVcIjtcblxuICAgIC8vIEV4OiBodHRwczovLzk5LTI1MC0xMjQtOTEucXVlcnlzdWJ0ZXN0LmNvbTo1MjMzL2ZpbGUvcm9vdC91bmlxdWVidWNrZXRuYW1lL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIC8vIE5PVEU6IFRoZSBhY2NvdW50IGFuZCBidWNrZXQgbmFtZSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuXG4gICAgLy8gTk9URTogQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCBieSBjZXJ0LnRzLCB2aWEgaGF2aW5nIHlvdXIgbWFjaGluZSB0cnVzdGVkIHRvIGFjY2VzcyB0aGlzIGFjY291bnQuIFxuXG4gICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAvLyBGYXN0IG1vZGU6IHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHdyaXRlcyBvbmNlIHRoZXkgYXJlIGluIG1lbW9yeSwgZmx1c2hpbmcgdG8gZGlzayBhZnRlciB3cml0ZURlbGF5IChkZWZhdWx0IDUgbWludXRlcykgYW5kIGNvYWxlc2Npbmcgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUuIEEgc2VydmVyIGNyYXNoIGxvc2VzIHdyaXRlcyB0aGF0IGhhdmVuJ3QgZmx1c2hlZCB5ZXQuXG4gICAgZmFzdD86IGJvb2xlYW47XG4gICAgd3JpdGVEZWxheT86IG51bWJlcjtcbiAgICAvLyBUaGUgYnVja2V0IGlzIHNlcnZlZCBzdHJhaWdodCBmcm9tIHRoZSBzZXJ2ZXIncyBkaXNrLCB3aXRoIG5vIGluZGV4IOKAlCBzbyBubyBmYXN0IHdyaXRlcywgbm8gZ2V0U3luY1N0YXR1cywgYW5kIGdldENoYW5nZXNBZnRlcjIgZmFsbHMgYmFjayB0byBhIGZ1bGwgbGlzdGluZy5cbiAgICByYXdEaXNrPzogYm9vbGVhbjtcbiAgICAvLyBXcml0ZXMgdG8gcGF0aHMgdGhhdCBhbHJlYWR5IGV4aXN0IGFyZSBkaXNhbGxvd2VkIChkZWxldGVzIHN0aWxsIHdvcmspLlxuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrYmxhemVDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJiYWNrYmxhemVcIjtcbiAgICAvLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbiAgICAvLyBOT1RFOiBUaGUgYnVja2V0IG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIFB1YmxpYyBidWNrZXRzIGFyZSBzZXJ2ZWQgb3ZlciBwbGFpbiBIVFRQUyBHRVRzIChnZXRVUkwpLiBQcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seS5cbiAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgIC8vIE5PVEU6IFRoaXMgaXNuJ3QgZW5mb3JjZWQgb24gdGhlIGJhY2tibGF6ZSBsZXZlbCwgc28gdGhpcyBpcyBqdXN0IGEgY2xpZW50LXNpZGUgZ3VhcmFudGVlLiBUaGlzIGNhbiBjaGFuZ2UgaG93IHdlIGNhY2hlIGZpbGVzLlxuICAgIC8vICAtIEJhY2tibGF6ZSBkb2VzIHN1cHBvcnQgaW1tdXRhYmlsaXR5LiBIb3dldmVyLCBhcHBhcmVudGx5LCBvbmNlIHdlIGVuYWJsZSBpdCBvbiBhIGJ1Y2tldCwgd2UgY2FuJ3QgZGlzYWJsZSBpdCwgd2hpY2ggaXMgcmVhbGx5IGJhZCwgYXMgaXQgbWVhbnMgaWYgb3VyIGNvZGUgY291bGQgZXZlciBlbmFibGUgaXQgYW5kIHdlIGFjY2lkZW50YWxseSBlbmFibGUgaXQgb24gYW4gaW1wb3J0YW50IGJ1Y2tldCwgd2UgZXNzZW50aWFsbHkganVzdCBicmlja2VkIHRoYXQgYnVja2V0LiBTbyB3ZSBzaG91bGQgbmV2ZXIgd3JpdGUgYW55IGNvZGUgdGhhdCBldmVyIHRyaWVzIHRvIHVzZSBiYWNrYmxhemUgdG8gbWFrZSB0aGluZ3MgaW1tdXRhYmxlLiBcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIC8vIENPUlMgb3JpZ2lucyBhbGxvd2VkIHRvIGNvbnN1bWUgdGhlIGJ1Y2tldCdzIGZpbGVzIGluIGEgYnJvd3Nlci4gTm90IGEgc2VjdXJpdHkgYm91bmRhcnkgKGFjY2VzcyBpcyBnYXRlZCBieSB0aGUgQVBJIGtleSAvIHNpZ25lZCBVUkxzLCBuZWl0aGVyIG9mIHdoaWNoIHJpZGVzIGluIGNvb2tpZXMpIC0gaXQgb25seSBjb250cm9scyB3aGljaCBzaXRlcycgaW4tcGFnZSBKYXZhU2NyaXB0IGNhbiByZWFkIHJlc3BvbnNlcy4gRGVmYXVsdHMgdG8gYW55IEhUVFBTIG9yaWdpbi5cbiAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuXG4gICAgLy8gTk9URTogV2Ugd2lsbCBhY2Nlc3MgdGhlIGFwaSBrZXkgZnJvbSBnZXRTZWNyZXQsIHNlZSBiYWNrYmxhemUudHMgZm9yIHRoZSBzcGVjaWZpYyBrZXlzLlxufTtcblxuXG5leHBvcnQgY29uc3QgRlVMTF9WQUxJRF9XSU5ET1c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdO1xuXG5cblxuXG5leHBvcnQgdHlwZSBHZXRDb25maWcgPSB7XG4gICAgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gICAgLyoqIFJlYWQgT05MWSBmcm9tIHRoZSBwcmltYXJ5IHNvdXJjZSAtIHRoZSBvbmUgd3JpdGVzIHdvdWxkIHRhcmdldCAtIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMuIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgeW91ciByZWFkcyBhbmQgd3JpdGVzIHRvIGJlIHNvbWV3aGF0IGF0b21pYzogdGhlcmUgd2lsbCBzdGlsbCBiZSBpc3N1ZXMgd2l0aCB0aGUgcm91bmQgdHJpcCwgYnV0IHdpdGhvdXQgaXQgeW91IGNvdWxkIHRhbGsgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBub2RlIGFuZCBnZXQgYSBtdWNoIG9sZGVyIHZhbHVlLiBNb3N0IHJlYWRzIGFyZW4ndCBmb2xsb3dlZCBieSBhIHdyaXRlIHRob3VnaCwgc28gZm9yIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIgdG8gZ2V0IGEgdmFsdWUgdGhhbiB0byBoYXZlIHRvIHdhaXQgKG9yIGV2ZW4gdGhyb3cpIHdoZW4gdGhlIHByaW1hcnkgbm9kZSBpcyBub3QgYXZhaWxhYmxlLiAqL1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU3RvcmUtdG8tc3RvcmUgY2FsbDogdGhlIHNlcnZpbmcgbm9kZSBhbnN3ZXJzIHB1cmVseSBmcm9tIGl0cyBvd24gZGlzaywgY29tcGxldGVseSBzaG9ydC1jaXJjdWl0aW5nIGl0cyBpbmRleCBob2xkZXJzIC0gY2hhc2luZyBpdHMgb3duIHJlbW90ZSBob2xkZXJzIHdoaWxlIGFuc3dlcmluZyBhbm90aGVyIHN0b3JlIGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybSAoQSBhc2tzIEIsIEIncyBpbmRleCBwb2ludHMgYmFjayBhdCBBLCAuLi4pLiBObyB3aW5kb3cgb3Igcm91dGUgY2hlY2tzIG9uIHJlYWRzOiBpZiB0aGUgYnl0ZXMgYXJlIG9uIGl0cyBkaXNrLCB0aGUgY2FsbGVyIG1heSBoYXZlIHRoZW0uICovXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8qKiBBbHNvIHJldHVybiBzaXplLTAgcmVzdWx0cyAodG9tYnN0b25lcyAtIGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpIGluc3RlYWQgb2YgdHJlYXRpbmcgdGhlbSBhcyBhYnNlbnQuIE9mZiBieSBkZWZhdWx0LCBtYXRjaGluZyBnZXRJbmZvJ3MgZmxhZyBvZiB0aGUgc2FtZSBuYW1lLiBTeW5jaHJvbml6YXRpb24gcGFzc2VzIHRoaXMgc28gYSBERUxFVEVEIGZpbGUgKHdpdGggaXRzIHdyaXRlIHRpbWUpIGlzIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZmlsZSB0aGF0IG5ldmVyIGV4aXN0ZWQuICovXG4gICAgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRmluZENvbmZpZyA9IHtcbiAgICBzaGFsbG93PzogYm9vbGVhbjtcbiAgICB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCI7XG4gICAgLyoqIExpc3RpbmdzIG5vcm1hbGx5IGNvbWUgT05MWSBmcm9tIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZXMgKHRoZSBzYW1lIG5vZGVzIHdyaXRlcyBnbyB0byAtIHJlYWQteW91ci13cml0ZXMpLiBXaXRoIGZhbGxiYWNrcywgYSBmYWlsaW5nIHNoYXJkJ3Mgcm91dGVzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBuZXh0IHNvdXJjZSBob2xkaW5nIHRoZW0gKGUuZy4gYSB3aWRlIHJlYWQgcmVwbGljYSkgaW5zdGVhZCBvZiB0aGUgY2FsbCBmYWlsaW5nIC0gaGlnaCBhdmFpbGFiaWxpdHkgYXQgdGhlIGNvc3Qgb2YgcG9zc2libHkgbWlzc2luZyBqdXN0LXdyaXR0ZW4gZGF0YS4gU2luZ2xlLXNvdXJjZSBhcmNoaXZlcyBpZ25vcmUgdGhlIGZsYWcuICovXG4gICAgZmFsbGJhY2tzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERlbENvbmZpZyA9IHtcbiAgICAvKiogU3RhbXBzIHRoZSBkZWxldGlvbiAoaXRzIHRvbWJzdG9uZSkgd2l0aCB0aGlzIHdyaXRlIHRpbWUgaW5zdGVhZCBvZiBub3cuIFN5bmNocm9uaXphdGlvbiBwYXNzZXMgdGhlIE9SSUdJTkFMIGRlbGV0aW9uIHRpbWUsIHNvIGRlbGV0aW9uIG9yZGVyaW5nIHN1cnZpdmVzIHByb3BhZ2F0aW9uIGV4YWN0bHkgbGlrZSBhbnkgb3RoZXIgd3JpdGUncyBvcmRlcmluZy4gKi9cbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7XG4gICAgLyoqIFNlZSBTZXRDb25maWcuaW50ZXJuYWwuICovXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8qKiBTZWUgU2V0Q29uZmlnLm5vQ2hlY2tzLiAqL1xuICAgIG5vQ2hlY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIFNldENvbmZpZy5mYWxsYmFja3MuICovXG4gICAgZmFsbGJhY2tzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEdldEluZm9Db25maWcgPSB7XG4gICAgLyoqIEFsc28gcmVwb3J0IHNpemUtMCBlbnRyaWVzICh0b21ic3RvbmVzIC0gYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSkuIE9mZiBieSBkZWZhdWx0LCBzbyBhIGRlbGV0ZWQga2V5IHJlcG9ydHMgdW5kZWZpbmVkLCBtYXRjaGluZyBnZXQuIFN5bmNocm9uaXphdGlvbi1zdHlsZSBjYWxsZXJzIHBhc3MgdGhpcyB3aGVuIHRoZXkgbmVlZCBhIGRlbGV0aW9uJ3Mgd3JpdGUgdGltZSAoZS5nLiB0byBjb21wYXJlIGl0IGFnYWluc3QgYSB3cml0ZSB0aGV5IGFyZSBhYm91dCB0byBtYWtlKS4gKi9cbiAgICBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBHZXRDb25maWcubm9GYWxsYmFja3M6IGFuc3dlciBPTkxZIGZyb20gdGhlIHByaW1hcnkgc291cmNlICh0aGUgb25lIHdyaXRlcyB3b3VsZCB0YXJnZXQpIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMuICovXG4gICAgbm9GYWxsYmFja3M/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0FmdGVyQ29uZmlnID0ge1xuICAgIHRpbWU6IG51bWJlcjtcbiAgICAvKiogT25seSBrZXlzIHJvdXRpbmcgaW50byBvbmUgb2YgdGhlc2UgW3N0YXJ0LCBlbmQpIHJhbmdlcy4gT25seSBzY2FubmluZyBwYXNzZXMgdGhpcyAtIGl0IGxldHMgYSBzdG9yZSBzeW5jaW5nIGEgcGFydGlhbCBzaGFyZCBhc2sgZm9yIGp1c3QgaXRzIHNsaWNlLiAqL1xuICAgIHJvdXRlcz86IFtudW1iZXIsIG51bWJlcl1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFNldENvbmZpZyA9IHtcbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7XG4gICAgLyoqIE1ha2VzIHRoZSB3cml0ZSBhY2NlcHRhYmxlIG9uIGltbXV0YWJsZSB0YXJnZXRzOiBhbiBleGlzdGluZyBwYXRoIGlzIHNpbXBseSBrZXB0IChpbW11dGFiaWxpdHkgd2lucyAtIG5vdGhpbmcgaXMgb3ZlcndyaXR0ZW4pIGluc3RlYWQgb2YgdGhlIHdyaXRlIHRocm93aW5nLiBSZXF1aXJlcyBsYXN0TW9kaWZpZWQuIFN5bmNocm9uaXphdGlvbiBNVVNUIHBhc3MgdGhpcyBvbiBldmVyeSBwdXNoIC0gYSBwbGFpbiBzZXQgdGhyb3dzIG9uIGltbXV0YWJsZSB0YXJnZXRzLCB3aGljaCB3b3VsZCBhYm9ydCByZWNvbmNpbGlhdGlvbiB3aGVuZXZlciBvbmUgc291cmNlIGluIGEgY2hhaW4gaXMgaW1tdXRhYmxlLiAqL1xuICAgIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICAvKiogU2tpcHMgUkVEVU5EQU5UIHRhcmdldC1zaWRlIHNhZmV0eSByZWFkcyBhcm91bmQgdGhlIHdyaXRlIChiYWNrYmxhemU6IHRoZSBwb3N0LXVwbG9hZCBleGlzdGVuY2UgcG9sbCkuIEl0IGRvZXMgTk9UIHNraXAgY2hlY2tzIHRoYXQgYXJlIHRoZSB0YXJnZXQncyBvbmx5IG9yZGVyaW5nIGd1YXJkOiBiYWNrYmxhemUncyBwcmUtd3JpdGUgY29tcGFyaXNvbiBzdGF5cywgYmVjYXVzZSBiMiBoYXMgbm8gc2VydmVyIG9mIG91cnMgZW5mb3JjaW5nIG9ubHktdGFrZS10aGUtbGF0ZXN0IC0gd2l0aG91dCBpdCBhIHN0YWxlIHB1c2ggbGFuZHMgb3ZlciBhIG5ld2VyIHZhbHVlIG9yIHRvbWJzdG9uZSBhbmQgYjIncyBzZWxmLXN0YW1wZWQgdXBsb2FkIHRpbWUgbGF1bmRlcnMgaXQgaW50byB0aGUgbmV3ZXN0IGNvcHkgaW4gdGhlIHN5c3RlbSAoZ2xvYmFsIHJlc3VycmVjdGlvbikuIEhvc3RlZCB0YXJnZXRzIHJlLWNoZWNrIHNlcnZlci1zaWRlLCBzbyB0aGVpciBjbGllbnQtc2lkZSBzaG9ydGN1dHMgYXJlIHNhZmUuICovXG4gICAgbm9DaGVja3M/OiBib29sZWFuO1xuICAgIC8qKiBTdG9yZS10by1zdG9yZSBwdXNoOiB0aGUgcmVjZWl2aW5nIG5vZGUgd3JpdGVzIHB1cmVseSB0byBpdHMgb3duIGRpc2sgYW5kIGluZGV4LCB3aXRoIE5PIGRvd25zdHJlYW0gZmFuLW91dCAodGhlIHB1c2hpbmcgc3RvcmUgb3ducyBwcm9wYWdhdGlvbiAtIGZhbm5pbmcgaXRzIHB1c2hlcyBiYWNrIG91dCBpcyBob3cgd3JpdGUgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybSkuIFdpbmRvdyBhbmQgcm91dGUgQVJFIHN0aWxsIGNoZWNrZWQ6IHRoZSBzdGFtcCBtdXN0IGZhbGwgaW5zaWRlIG9uZSBvZiB0aGUgcmVjZWl2ZXIncyBjb25maWd1cmVkIHdpbmRvd3MgYW5kIHJvdXRlcywgc28gYSBjb25mdXNlZCBwZWVyIGNhbm5vdCBzdHVmZiBkYXRhIG9udG8gYSBub2RlIHRoYXQgd2FzIG5ldmVyIG1lYW50IHRvIGhvbGQgaXQuIFJlcXVpcmVzIGxhc3RNb2RpZmllZC4gKi9cbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG4gICAgLyoqIFdyaXRlcyBub3JtYWxseSBnbyBPTkxZIHRvIHRoZSB3cml0ZSBub2RlICh0aGUgZmlyc3QgY3VycmVudC13aW5kb3cgc291cmNlIGNvdmVyaW5nIHRoZSBrZXkpLCByZXRyeWluZyBpdCBldmVuIHdoaWxlIGl0IGlzIGRvd24gLSBjb25zaXN0ZW50LCBidXQgdW5hdmFpbGFibGUgd2hlbiB0aGF0IG5vZGUgaXMuIFdpdGggZmFsbGJhY2tzLCB0aGUgd3JpdGUgbm9kZSBpcyBzdGlsbCB0cmllZCBmaXJzdCwgYnV0IG9uIGZhaWx1cmUgdGhlIHdyaXRlIGxhbmRzIG9uIHRoZSBuZXh0IGN1cnJlbnQtd2luZG93IHNvdXJjZSBjb3ZlcmluZyB0aGUga2V5IChzeW5jaHJvbml6YXRpb24gbW92ZXMgaXQgdG8gdGhlIHdyaXRlIG5vZGUgbGF0ZXIpIC0gYXZhaWxhYmlsaXR5IGF0IHRoZSBjb3N0IG9mIHJlYWRzIHBvc3NpYmx5IG1pc3NpbmcgdGhlIHdyaXRlIHVudGlsIGl0IHByb3BhZ2F0ZXMuIFNpbmdsZS1zb3VyY2UgYXJjaGl2ZXMgaWdub3JlIHRoZSBmbGFnLiAqL1xuICAgIGZhbGxiYWNrcz86IGJvb2xlYW47XG59O1xuXG4vLyBjcmVhdGVUaW1lIGlzIGEgbWlzbm9tZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eSDigJQgaXQgaXMgcmVhbGx5IHRoZSBMQVNULVdSSVRFIHRpbWUsIHNhbWUgYXMgZ2V0SW5mbydzIHdyaXRlVGltZS4gTmVpdGhlciBCYWNrYmxhemUgbm9yIG91ciByZW1vdGUgc3RvcmFnZSB0cmFja3MgYSBkaXN0aW5jdCBjcmVhdGlvbiBkYXRlOiBlYWNoIHdyaXRlIHN0YW1wcyBhIGZyZXNoIHRpbWVzdGFtcCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyBib3RoIGZpZWxkcyBhcmUganVzdCBcIndoZW4gdGhlIGJ5dGVzIHNlcnZlZCBieSBnZXQoKSB3ZXJlIG1vc3QgcmVjZW50bHkgd3JpdHRlblwiLlxuZXhwb3J0IHR5cGUgQXJjaGl2ZUZpbGVJbmZvID0geyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07XG5cbi8vIEFuIGluLXByb2dyZXNzIGJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIHRhc2sgKHNlZSBBcmNoaXZlc0NvbmZpZy5zeW5jaW5nKVxuZXhwb3J0IHR5cGUgU3luY0FjdGl2aXR5ID0ge1xuICAgIC8vIEEgbWV0YWRhdGEgc2NhbiBpcyBhIHNpbmdsZSBsaXN0aW5nIGNhbGwsIHNvIGl0IGhhcyBubyBpbmNyZW1lbnRhbCBwcm9ncmVzcyAtIGp1c3QgdGhhdCBpdCdzIHJ1bm5pbmcgYW5kIHNpbmNlIHdoZW4uIEEgZnVsbCBzeW5jIGtub3dzIGl0cyBleGFjdCBmaWxlL2J5dGUgcHJvZ3Jlc3MuXG4gICAgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiB8IFwiZnVsbFN5bmNcIjtcbiAgICBzb3VyY2VEZWJ1Z05hbWU6IHN0cmluZztcbiAgICBzdGFydFRpbWU6IG51bWJlcjtcbiAgICBkb25lRmlsZXM/OiBudW1iZXI7XG4gICAgdG90YWxGaWxlcz86IG51bWJlcjtcbiAgICBkb25lQnl0ZXM/OiBudW1iZXI7XG4gICAgdG90YWxCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzQ29uZmlnID0ge1xuICAgIC8vIFdoZXRoZXIgZ2V0Q2hhbmdlc0FmdGVyMiBpcyBuYXRpdmVseSBpbmRleC1iYWNrZWQgKGZhc3QgY2hhbmdlIHBvbGxpbmc7IGV2ZXJ5IGJhY2tlbmQgc3RpbGwgc2VydmVzIGl0LCBidXQgdGhlIG90aGVycyBlbXVsYXRlIGl0IHdpdGggYSBmdWxsIGxpc3RpbmcpXG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI/OiBib29sZWFuO1xuICAgIC8vIFRoZSBidWNrZXQncyBmdWxsIHJvdXRpbmcgY29uZmlnIChST1VUSU5HX0ZJTEUpLiBBYnNlbnQgZm9yIHNvdXJjZXMgdGhhdCBkb24ndCBoYXZlIG9uZSAoYSBiYXJlIGRpc2sgc291cmNlLCBvciBhIGJ1Y2tldCB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0KS5cbiAgICByZW1vdGVDb25maWc/OiBSZW1vdGVDb25maWc7XG4gICAgLy8gTGl2ZSBpbmRleCB0b3RhbHMgKHRvbWJzdG9uZXMgZXhjbHVkZWQpLCBrZXB0IHVwIHRvIGRhdGUgaW4gbWVtb3J5IG9uIGV2ZXJ5IG11dGF0aW9uIGFuZCByZWNvbXB1dGVkIG9uIGxvYWQgLSBzbyBhbnkgZHJpZnQgaGVhbHMgb24gcmVzdGFydFxuICAgIGluZGV4PzogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfTtcbiAgICAvLyBUaGUgc2FtZSB0b3RhbHMgYnJva2VuIGRvd24gYnkgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyBlYWNoIGZpbGUncyBieXRlcyAodGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBzZXJ2ZXIncyBvd24gZGlzaylcbiAgICBpbmRleFNvdXJjZXM/OiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyBjb25maWd1cmVkIHJlYWRlckRpc2tMaW1pdCwgd2hlbiBpdCBydW5zIGFzIGEgYm91bmRlZCByZWFkIGNhY2hlXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8vIEJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAoZW1wdHkgd2hlbiBpZGxlKVxuICAgIHN5bmNpbmc/OiBTeW5jQWN0aXZpdHlbXTtcbn07XG5cbi8vIEEgc3luY2hyb25pemF0aW9uIHNvdXJjZSBvZiBhIEJsb2JTdG9yZSAod2hpY2ggc3luY2hyb25pemVzIGFuIGluZGV4ICsgbG9jYWwgY2FjaGUgZnJvbSB0aGVtKVxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTb3VyY2UgPSB7XG4gICAgc291cmNlOiBJQXJjaGl2ZXM7XG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IGlkZW50aXR5IG9mIHRoZSBlbmRwb2ludDogaXRzIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSwgb3IgdGhlIGRpc2sgZm9sZGVyIHBhdGggZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlLiBUaGUgc3RvcmUgcGVyc2lzdHMgdGhpcyAodmlhIGl0cyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QpIGFzIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCwgc28gaXQgbXVzdCBtZWFuIHRoZSBzYW1lIGVuZHBvaW50IGZvcmV2ZXIuICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnLCBidXQgQUxMIG9mIHRoZW06IHRoZSBzYW1lIGVuZHBvaW50IChzYW1lIHVybCtyb3V0ZSwgaWdub3JpbmcgdGhlIHdpbmRvdykgY2FuIGFwcGVhciBpbiB0aGUgcm91dGluZyBjb25maWcgdW5kZXIgc2V2ZXJhbCB3aW5kb3dzIGF0IG9uY2UgLSBtb3N0IGNvbW1vbmx5IHdoZW4gYSBkZXBsb3kgc3dpdGNob3ZlciBoYXMgc3BsaXQgb25lIHdpbmRvdyBpbiB0d28gYXJvdW5kIGFuIGludGVybWVkaWF0ZS4gSXQgaXMgT05FIHNvdXJjZSB0aGF0IGtub3dzIGFsbCBpdHMgd2luZG93cywgbmV2ZXIgc2V2ZXJhbCBzb3VyY2VzLiBUaGUgd2luZG93IHJvdXRlcyBXUklURVM6IHRoZSBzb3VyY2UgcmVjZWl2ZXMgd3JpdGVzIHdoaWxlIEFOWSBvZiBpdHMgd2luZG93cyBpcyBzdGlsbCBvcGVuIChzZWUgd2luZG93c0FjY2VwdFdyaXRlcykuIFdpbmRvd3MgZG8gTk9UIGZpbHRlciBzY2FubmluZzogYSBzY2FuIGlzIHVzIGFza2luZyB0aGUgc291cmNlIHdoYXQgaXQgYWxyZWFkeSBob2xkcywgYW5kIGV4aXN0aW5nIHZhbHVlcyBzeW5jaHJvbml6ZSByZWdhcmRsZXNzIG9mIHRoZWlyIHdyaXRlIHRpbWVzICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS5cbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICAvLyBGcm9tIHRoZSBzb3VyY2UncyBDb21tb25Db25maWcgKGludGVyc2VjdGVkIHdpdGggdGhlIG93bmluZyBzdG9yZSdzIG93biByb3V0ZSk6IG9ubHkga2V5cyByb3V0aW5nIGludG8gW3N0YXJ0LCBlbmQpIGFyZSBhY2NlcHRlZCBmcm9tIHRoaXMgc291cmNlJ3Mgc2NhbnMgYW5kIHNlbnQgdG8gaXQgaW4gd3JpdGVzL3JlY29uY2lsaWF0aW9uLiBUaGUgcm91dGluZyBmaWxlIGlzIGV4ZW1wdCAtIGNvbmZpZyBmbG93cyBldmVyeXdoZXJlLiBBYnNlbnQgPSBhbGwga2V5cy5cbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOyBzZWUgdGhlcmUuXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOiBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZS1wb3J0IGVudHJ5ICh0aGUgdmFsdWUgaXMgdGhlIHVybCBvZiB0aGUgc291cmNlIGl0IHdhcyBzcGxpdCBvdXQgb2YpLiBPbmNlIGl0cyB3aW5kb3cgaXMgcGFzdCwgdGhlIHBvcnQgaXQgcG9pbnRzIGF0IGlzIGdvbmUgZm9yIGdvb2QgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkIHRoZW4sIGFuZCBzY2FuIGZhaWx1cmVzIGFyZSBuZXZlciByZXRyaWVkLlxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBUaGUgcm91dGluZy1jb25maWcgZW50cnkgdGhpcyBzb3VyY2Ugd2FzIGJ1aWx0IGZyb20gKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpLiBJdHMgYHR5cGVgIGRlY2lkZXMgZmFzdC13cml0ZSBmbHVzaCB0aW1pbmc6IHR5cGUtXCJyZW1vdGVcIiBkb3duc3RyZWFtIHNvdXJjZXMgKG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzKSBmbHVzaCBxdWlja2x5IChjaGVhcCwgYW5kIHdlIHdhbnQgY3Jvc3Mtbm9kZSByZWR1bmRhbmN5IGZhc3QpLCB3aGlsZSBvdGhlcnMgKGUuZy4gYmFja2JsYXplKSBrZWVwIHRoZSBmdWxsIHdyaXRlRGVsYXkgc28gZXhwZW5zaXZlIGV4dGVybmFsIHdyaXRlcyBzdGF5IGNvYWxlc2NlZC4gVGhlIHdpbmRvdy9yb3V0ZSBPTiB0aGlzIGNvbmZpZyBhcmUgdGhlIFNPVVJDRSdzIG93bjsgQXJjaGl2ZXNTb3VyY2UudmFsaWRXaW5kb3cvcm91dGUgYXJlIHdoYXQgdGhlIG93bmluZyBzdG9yZSBhY3R1YWxseSB1c2VzIChyb3V0ZSBpcyBpbnRlcnNlY3RlZCB3aXRoIHRoZSBzdG9yZSdzIHJvdXRlKS5cbiAgICBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7XG4gICAgLy8gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSB1bmRlcmx5aW5nIGVuZHBvaW50IChpdHMgY29uZmlnIHdpdGggd2luZG93cy9yb3V0ZXMgc3RyaXBwZWQpIC0gaG93IEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzIHJlY29nbml6ZXMgYSBzb3VyY2UgYWNyb3NzIGNvbmZpZyBjaGFuZ2VzIHNvIGl0IGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiByZW1vdmluZyBhbmQgcmUtYWRkaW5nIGl0XG4gICAgaWRlbnRpdHk/OiBzdHJpbmc7XG59O1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSByZWFjaGVzIGl0IG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvd3MgKHRoZSBjbGllbnQgcmVzb2x2ZWQgaXRzIHRhcmdldCwgdGhlbiB0aW1lIGNyb3NzZWQgYSB3aW5kb3cgYm91bmRhcnkgYmVmb3JlIHRoZSB3cml0ZSBsYW5kZWQpLiBDbGllbnRzIGRldGVjdCB0aGlzIG1hcmtlciBhbmQgcmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5LXZhbGlkIHNvdXJjZSwgcmV0cnlpbmcgT05DRSAtIGJvdW5kYXJpZXMgYXJlIGZhciBhcGFydCwgc28gaGl0dGluZyBpdCB0d2ljZSBpbiBvbmUgYXR0ZW1wdCBtZWFucyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgd3JvbmcuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cgPSBcIlJFTU9URV9TVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV19hN2MxZjA0ZVwiO1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSdzIGtleSByb3V0ZXMgb3V0c2lkZSB0aGUgc2hhcmRzIHRoaXMgc2VydmVyIGhhbmRsZXMgKHRoZSBjbGllbnQncyBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIC0gY2xpZW50cyByZS1yZXNvbHZlIG9uY2UpXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19ST1VURSA9IFwiUkVNT1RFX1NUT1JBR0VfV1JPTkdfUk9VVEVfYzk0ZDJlMTdcIjtcblxuZXhwb3J0IGNvbnN0IEZVTExfUk9VVEU6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMV07XG5cbi8vIEEga2V5IGNvbnRhaW5pbmcgdGhpcyBzZW50aW5lbCBkb2Vzbid0IGhhdmUgYSBmaXhlZCBzaGFyZDogc2V0VmFyaWFibGVTaGFyZCBwaWNrcyB0aGUgKGxvd2VzdCBsYXRlbmN5LCB1cCkgd3JpdGUgc2hhcmQsIGFwcGVuZHMgXCJfPHZhbHVlIGluIHRoZSBzaGFyZCdzIHJvdXRlPlwiIGRpcmVjdGx5IGFmdGVyIHRoZSBzZW50aW5lbCwgYW5kIHJldHVybnMgdGhlIG1hdGVyaWFsaXplZCBrZXkuIGdldFJvdXRlIHRyZWF0cyB0aGF0IHN1ZmZpeCBhcyBhIGNvbXBsZXRlIHJvdXRlIG92ZXJyaWRlLlxuZXhwb3J0IGNvbnN0IFZBUklBQkxFX1NIQVJEID0gXCJWQVJJQUJMRV9TSEFSRF9mMDIzNGpmYWgwOGZneWhmZ3lzc2Rkczgzbm1wXCI7XG4vLyBObyBncmFjZSBwYXN0IHRoZSBlbmQ6IGEgd2luZG93IGJvdW5kYXJ5IGlzIGEgaGFyZCBoYW5kb2ZmIChjbGllbnRzIHJldHJ5IGEgcmVqZWN0ZWQgd3JpdGUgYWdhaW5zdCB0aGUgbmV3bHktdmFsaWQgc291cmNlLCBzbyBsZW5pZW5jeSBoZXJlIHdvdWxkIG9ubHkgZGVzeW5jaHJvbml6ZSB0aGUgaGFuZG9mZilcbi8vICAtIFdyaXRpbmcgdG8gb2xkZXIgdmFsaWQgc3RhdGUgd2luZG93cyBpcyBmaW5lLCB0aG91Z2guIFdlIG5lZWQgdGhpcyB0byBpbmdlc3QgdGhlIG9sZCBkYXRhIHdoZW4gd2UncmUgc3luY2hyb25pemluZyBub2RlcyB0byBnZXQgdGhlbSB1cCB0byBkYXRlIGFueXdheS4gXG5leHBvcnQgZnVuY3Rpb24gd2luZG93QWNjZXB0c1dyaXRlcyh2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsaWRXaW5kb3cpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB2YWxpZFdpbmRvd1sxXSA+IERhdGUubm93KCk7XG59XG4vLyBBIHNvdXJjZSAod2hpY2ggY2FuIGhvbGQgc2V2ZXJhbCB3aW5kb3dzKSBhY2NlcHRzIHdyaXRlcyB3aGlsZSBBTlkgb2YgaXRzIHdpbmRvd3MgaXMgc3RpbGwgb3Blbi4gTm8gd2luZG93cyA9IHRoZSBiYXNlIGRpc2sgb2YgYW4gaW5lcnQgc3RvcmUgKG5vdCBpbiB0aGUgY29uZmlnKSwgd2hpY2ggbmV2ZXIgcmVjZWl2ZXMgZmFuLW91dCB3cml0ZXMgYW55d2F5LlxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsaWRXaW5kb3dzLnNvbWUod2luZG93QWNjZXB0c1dyaXRlcyk7XG59XG5cbmNvbnN0IExBUkdFX0NPUFlfVEhSRVNIT0xEID0gNjQgKiAxMDI0ICogMTAyNDtcbmNvbnN0IExBUkdFX0NPUFlfQ0hVTksgPSAzMiAqIDEwMjQgKiAxMDI0O1xuXG4vLyBBYm92ZSB0aGlzLCBzZXQgdHJhbnNwYXJlbnRseSBzdHJlYW1zIHRocm91Z2ggc2V0TGFyZ2VGaWxlOiBvbmUgZ2lhbnQgd2lyZSBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgdHJhbnNwb3J0IGxpbWl0IGFuZCBsYWcgZXZlcnkgb3RoZXIgY2xpZW50IHNoYXJpbmcgdGhlIGNvbm5lY3Rpb25cbmV4cG9ydCBjb25zdCBMQVJHRV9TRVRfVEhSRVNIT0xEID0gOCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogQSBnZXROZXh0RGF0YSBzdHJlYW0gb3ZlciBhbiBpbi1tZW1vcnkgYnVmZmVyLCBpbiBMQVJHRV9TRVRfVEhSRVNIT0xEIHNsaWNlcyAtIGhvdyBzZXQgdHJhbnNwYXJlbnRseSBiZWNvbWVzIHNldExhcmdlRmlsZSBmb3IgbGFyZ2UgYnVmZmVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJDaHVua1N0cmVhbShkYXRhOiBCdWZmZXIpOiAoKSA9PiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBjaHVuayA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9TRVRfVEhSRVNIT0xEKTtcbiAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH07XG59XG5cbi8qKiBDb3BpZXMgb25lIGZpbGUgYmV0d2VlbiB0d28gYXJjaGl2ZXMuIFNtYWxsIGZpbGVzIGdvIGFzIGEgc2luZ2xlIGdldDIrc2V0OyBwYXN0IExBUkdFX0NPUFlfVEhSRVNIT0xEIHRoZSBjb3B5IHN0cmVhbXMgdGhyb3VnaCBzZXRMYXJnZUZpbGUgaW4gTEFSR0VfQ09QWV9DSFVOSyByYW5nZWQgcmVhZHMsIHNvIHRoZSB3aG9sZSBmaWxlIGlzIG5ldmVyIGluIG1lbW9yeS4gc2l6ZS93cml0ZVRpbWUgdXN1YWxseSBjb21lIGZyb20gdGhlIGNhbGxlcidzIG1ldGFkYXRhIHNjYW47IHdoZW4gZWl0aGVyIGlzIG9taXR0ZWQsIGdldEluZm8gZmlsbHMgdGhlbSBpbi4gUmV0dXJucyB0aGUgY29waWVkIGZpbGUncyBpbmZvLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc291cmNlIGRvZXNuJ3QgaGF2ZSB0aGUgZmlsZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5QXJjaGl2ZUZpbGUoY29uZmlnOiB7XG4gICAgZnJvbTogSUFyY2hpdmVzO1xuICAgIHRvOiBJQXJjaGl2ZXM7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHNpemU/OiBudW1iZXI7XG4gICAgd3JpdGVUaW1lPzogbnVtYmVyO1xuICAgIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHsgZnJvbSwgdG8sIHBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgc2l6ZSA9IGNvbmZpZy5zaXplO1xuICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWcud3JpdGVUaW1lO1xuICAgIGlmIChzaXplID09PSB1bmRlZmluZWQgfHwgd3JpdGVUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBmcm9tLmdldEluZm8ocGF0aCwgeyBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgICAgICBpZiAoIWluZm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHNpemUgPSBpbmZvLnNpemU7XG4gICAgICAgIHdyaXRlVGltZSA9IGluZm8ud3JpdGVUaW1lO1xuICAgIH1cbiAgICBpZiAoc2l6ZSA8PSBMQVJHRV9DT1BZX1RIUkVTSE9MRCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZnJvbS5nZXQyKHBhdGgsIHsgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAgICAgLy8gRW1wdHkgY291bnRzIGFzIGFic2VudCwgbmV2ZXIgYXMgY29udGVudCB0byBjb3B5OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24sIHNldCByZWZ1c2VzIGVtcHR5IGJ1ZmZlcnMsIGFuZCBkZWxldGlvbnMgdHJhdmVsIHRocm91Z2ggdGhlaXIgb3duIHBhdGggKGRlbCAvIHNjYW4gdG9tYnN0b25lcylcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGF3YWl0IHRvLnNldChwYXRoLCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUsIG5vQ2hlY2tzOiBjb25maWcubm9DaGVja3MsIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwgfSk7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoIH07XG4gICAgfVxuICAgIC8vIENvbnN0cyBzbyB0aGUgY2xvc3VyZSBrZWVwcyB0aGUgbmFycm93ZWQgdHlwZXNcbiAgICBjb25zdCB0b3RhbFNpemUgPSBzaXplO1xuICAgIGNvbnN0IGZpbmFsV3JpdGVUaW1lID0gd3JpdGVUaW1lO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGF3YWl0IHRvLnNldExhcmdlRmlsZSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGxhc3RNb2RpZmllZDogZmluYWxXcml0ZVRpbWUsXG4gICAgICAgIGdldE5leHREYXRhOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IHRvdGFsU2l6ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihvZmZzZXQgKyBMQVJHRV9DT1BZX0NIVU5LLCB0b3RhbFNpemUpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcm9tLmdldChwYXRoLCB7IHJhbmdlOiB7IHN0YXJ0OiBvZmZzZXQsIGVuZCB9LCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsLCBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2VkIHJlYWQgb2YgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IHJldHVybmVkICR7ZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCBcIm5vdGhpbmdcIn0gYXQgJHtvZmZzZXR9LSR7ZW5kfSAoZXhwZWN0ZWQgJHtlbmQgLSBvZmZzZXR9IGJ5dGVzIG9mIGEgJHt0b3RhbFNpemV9IGJ5dGUgZmlsZSAtIGl0IGNoYW5nZWQgb3IgdmFuaXNoZWQgbWlkLWNvcHkpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4geyB3cml0ZVRpbWU6IGZpbmFsV3JpdGVUaW1lLCBzaXplOiB0b3RhbFNpemUgfTtcbn1cblxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTeW5jU291cmNlU3RhdHVzID0ge1xuICAgIGRlYnVnTmFtZTogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBcmNoaXZlc1N5bmNTdGF0dXMgPSB7XG4gICAgYWxsU2NhbnNDb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBOdW1iZXIgb2YgZmlsZXMgaW4gdGhlIGluZGV4XG4gICAgaW5kZXhTaXplOiBudW1iZXI7XG4gICAgc291cmNlczogQXJjaGl2ZXNTeW5jU291cmNlU3RhdHVzW107XG59O1xuXG4vLyBOT1RFOiBXZSBkb24ndCBwcmVzZW50bHkgaGF2ZSBhbiBhcHBlbmQgZnVuY3Rpb24gaGVyZSBiZWNhdXNlIGEgc3VycHJpc2luZyBudW1iZXIgb2Ygc3RvcmFnZSBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgaXQgKGJhY2tibGF6ZSwgZmlsZSBzeXN0ZW0gYXBpKS4gSXQgd291bGQgYWxzbyBjb21wbGljYXRlIHRoaW5ncyBhcyBub3cgdGhlcmUgbmVlZHMgdG8gYmUgcmVhbGx5IGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBvZiBhIGZpbGUsIGFuZCBpZiB5b3UgYXBwZW5kIHRvIHRoZSB3cm9uZyBzaW5nbGUgc291cmNlIG9mIHRydXRoLCB0aGluZ3MganVzdCBiZWNvbWUgdmVyeSBjb21wbGljYXRlZC4gXG5leHBvcnQgaW50ZXJmYWNlIElBcmNoaXZlcyB7XG4gICAgZ2V0RGVidWdOYW1lKCk6IHN0cmluZztcbiAgICAvKiogV2hldGhlciB3cml0ZXMgd291bGQgYmUgYWNjZXB0ZWQgKGNyZWRlbnRpYWxzIGV4aXN0LCB0aGUgYWNjb3VudCB0cnVzdHMgdGhpcyBtYWNoaW5lLCBldGMpLiBDaGVja2VkIHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gKi9cbiAgICBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMgdW5sZXNzIGNvbmZpZy5ub0ZhbGxiYWNrcyBpcyBzZXQuXG4gICAgICogQSBmYWxsYmFjayBjb3B5IGNhbiBsYWcgdGhlIHdyaXRlIHRhcmdldCwgc28gYSBjYWxsZXIgcmVhZGluZyBzdGF0ZSBpbiBvcmRlciB0byBtdXRhdGUgaXRcbiAgICAgKiAoZS5nLiB4KyspLCB3aGVyZSBhY3Rpbmcgb24gcHJldmlvdXMgc3RhdGUgd291bGQgY2F1c2UgYmlnIGlzc3Vlcywgc2hvdWxkIHBhc3Mgbm9GYWxsYmFja3MgLVxuICAgICAqIGFuZCB0cnkvY2F0Y2ggdGhlIHJlYWQsIGhhbmRsaW5nIHRoZSBjYXRjaCBjYXNlIChhIGRvd24gcHJpbWFyeSBpcyByZXRyaWVkIGZvciBhIHdoaWxlLCB0aGVuXG4gICAgICogdGhyb3dzIGluc3RlYWQgb2YgZGVncmFkaW5nIHRvIGEgc3RhbGUgY29weSkuXG4gICAgICovXG4gICAgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjtcbiAgICAvKiogU2VlIGdldCBmb3IgdGhlIGZhbGxiYWNrIHNlbWFudGljcyAoYW5kIHdoZW4gdG8gcGFzcyBub0ZhbGxiYWNrcykuIHVybCBpcyB0aGUgY29uZmlnIFVSTCBvZiB0aGUgc291cmNlIHRoYXQgYW5zd2VyZWQgLSB0aGUgYXV0aG9yaXR5IHRoZSBkYXRhIChvciB0aGUgXCJkb2VzIG5vdCBleGlzdFwiKSBjYW1lIGZyb20uIE11bHRpLXNvdXJjZSBpbXBsZW1lbnRhdGlvbnMgKEFyY2hpdmVzQ2hhaW4pIEFMV0FZUyByZXR1cm4gYW4gb2JqZWN0OiB3aGVuIHRoZSB2YWx1ZSBkb2Vzbid0IGV4aXN0IHRoZXJlIGlzIHN0aWxsIGEgc2VydmVyIHNheWluZyBpdCBkb2Vzbid0IGV4aXN0LCBzbyB0aGV5IHJldHVybiB7IHVybCB9IGFsb25lIHJhdGhlciB0aGFuIHVuZGVmaW5lZC4gU2luZ2xlLXNvdXJjZSBiYWNrZW5kcyByZXR1cm4gdW5kZWZpbmVkIGZvciBhYnNlbnQgKHRoZXkgQVJFIHRoZSBhdXRob3JpdHkpLiAqL1xuICAgIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsPzogc3RyaW5nIH0gfCB7IGRhdGE/OiB1bmRlZmluZWQ7IHdyaXRlVGltZT86IHVuZGVmaW5lZDsgc2l6ZT86IHVuZGVmaW5lZDsgdXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD47XG4gICAgLyoqXG4gICAgICogbGFzdE1vZGlmaWVkIHN0YW1wcyB0aGUgd3JpdGUgd2l0aCB0aGF0IGxhc3Qtd3JpdGUgdGltZSBpbnN0ZWFkIG9mIG5vdy4gSWYgaXQgaXMgT0xERVIgdGhhblxuICAgICAqIHRoZSBmaWxlJ3MgY3VycmVudCBsYXN0LXdyaXRlIHRpbWUgdGhlIHdyaXRlIG5vLW9wcyAoc28gZGVsYXllZCAvIHN5bmNocm9uaXplZCB3cml0ZXMgY2FuXG4gICAgICogbmV2ZXIgY2xvYmJlciBuZXdlciBkYXRhKS4gVGltZXMgbW9yZSB0aGFuIDE1IG1pbnV0ZXMgaW4gdGhlIGZ1dHVyZSBhcmUgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIGtleSBhY3R1YWxseSB3cml0dGVuIC0gaWRlbnRpY2FsIHRvIGZpbGVOYW1lLCBFWENFUFQgZm9yIGtleXMgY29udGFpbmluZ1xuICAgICAqIFZBUklBQkxFX1NIQVJELCB3aGVyZSB0aGUgc2hhcmQgdmFsdWUgaXMgbWF0ZXJpYWxpemVkIGludG8gdGhlIGtleSAocGlja2VkIGJ5IHNoYXJkIGxhdGVuY3ksXG4gICAgICogc2VlIEFyY2hpdmVzQ2hhaW4pIGFuZCB0aGUgY2FsbGVyIG5lZWRzIHRoZSByZXR1cm5lZCBrZXkgdG8gZXZlciByZWFkIHRoZSB2YWx1ZSBiYWNrLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFRIUk9XUyBvbiBhbiBlbXB0eSBidWZmZXI6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSAodGhlIHRvbWJzdG9uZSksIHNvIGFcbiAgICAgKiBzZXQtZW1wdHkgd291bGQgcmVhZCBiYWNrIGFzIFwidGhlIGZpbGUgaXMgZ29uZVwiIC0gd2hpY2ggaXMganVzdCBhc2tpbmcgZm9yIHByb2JsZW1zLiBJZiB5b3VcbiAgICAgKiB3YW50IHRoZSBmaWxlIGRlbGV0ZWQsIGNhbGwgZGVsOyBkZWxldGlvbnMgdGFrZSB0aGVpciBvd24gcGF0aC5cbiAgICAgKi9cbiAgICBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IERlbENvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIFN0cmVhbXMgYSBmaWxlIHRvbyBsYXJnZSB0byBob2xkIGluIG1lbW9yeS4gZ2V0TmV4dERhdGEgcmV0dXJucyB1bmRlZmluZWQgd2hlbiBkb25lLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIHdoZW4geW91IENBTk5PVCBtYXRlcmlhbGl6ZSB0aGUgZW50aXJlIGZpbGUgaW4gbWVtb3J5IC0gaWYgeW91IGNhbiwganVzdCBjYWxsIHNldDogYWJvdmUgTEFSR0VfU0VUX1RIUkVTSE9MRCBpdCBzdHJlYW1zIHRocm91Z2ggc2V0TGFyZ2VGaWxlIGludGVybmFsbHksIGtlZXBpbmcgdGhlIGNsaWVudCByZXNwb25zaXZlIGFuZCBub3Qgb3ZlcndoZWxtaW5nIHRoZSBzZXJ2ZXIuIGxhc3RNb2RpZmllZCBzdGFtcHMgdGhlIGZpbmlzaGVkIGZpbGUgbGlrZSBzZXQncyAoc3luY2hyb25pemVkIGNvcGllcyBuZWVkIGl0IHRvIGtlZXAgd3JpdGUgb3JkZXJpbmcpOyBiYWNrZW5kcyB0aGF0IHN0YW1wIHRoZWlyIG93biB0aW1lcyAoYmFja2JsYXplKSBhY2NlcHQgYW5kIGlnbm9yZSBpdC4gVEhST1dTIHdoZW4gdGhlIHN0cmVhbSBwcm9kdWNlcyBubyBkYXRhIGF0IGFsbCAtIHNhbWUgcnVsZSBhcyBzZXQ6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcuICovXG4gICAgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiB3cml0ZVRpbWUgaXMgdGhlIGxhc3Qtd3JpdGUgdGltZSDigJQgc2VlIEFyY2hpdmVGaWxlSW5mby5jcmVhdGVUaW1lLCB3aGljaCBpcyB0aGUgc2FtZSB2YWx1ZS4gdXJsIGFzIGluIGdldDIuIFNpemUtMCBlbnRyaWVzICh0b21ic3RvbmVzKSByZXBvcnQgdW5kZWZpbmVkIHVubGVzcyBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMuICovXG4gICAgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybD86IHN0cmluZyB9IHwgdW5kZWZpbmVkPjtcbiAgICAvKipcbiAgICAgKiBFbXB0eSAoc2l6ZS0wKSBmaWxlcyBhcmUgTkVWRVIgcmV0dXJuZWQgYnkgaW5kZXgtYmFja2VkIHN0b3JlcyAoQmxvYlN0b3JlLCBhbmQgdGhlcmVmb3JlIHRoZVxuICAgICAqIGNoYWluKTogYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSAtIHRoZSB0b21ic3RvbmUgb2YgYSBkZWxldGlvbi4gSWYgeW91IHdhbnQgYSBtYXJrZXJcbiAgICAgKiBmaWxlIHRoYXQgc2hvd3MgdXAgaW4gbGlzdGluZ3MsIGFkZCBzb21lIGNvbnRlbnQgdG8gaXQuIFJhdyBzb3VyY2VzIChkaXNrLCBiYWNrYmxhemUpIERPIGxpc3RcbiAgICAgKiB0aGVpciBlbXB0eSBmaWxlcyAtIHRoYXQgaXMgaG93IHNjYW5zIGxlYXJuIG9mIGRlbGV0aW9ucyAtIGJ1dCBub3RoaW5nIGJ1aWx0IG9uIHRoZSBpbmRleFxuICAgICAqIGV2ZXIgc3VyZmFjZXMgdGhlbS5cbiAgICAgKi9cbiAgICBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgLyoqIFNlZSBmaW5kIGZvciB0aGUgZW1wdHktZmlsZSAodG9tYnN0b25lKSBydWxlLiAqL1xuICAgIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgLyoqIE9ubHkgd29ya3MgZm9yIHB1YmxpYyBidWNrZXRzIChwcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seSkuICovXG4gICAgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAvKiogVGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24sIHdoaWNoIHRlbGxzIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLiAqL1xuICAgIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPjtcbiAgICAvKipcbiAgICAgKiBBbGwgZmlsZXMgY2hhbmdlZCBhZnRlciBjb25maWcudGltZSwgb3B0aW9uYWxseSByZXN0cmljdGVkIHRvIGtleXMgcm91dGluZyBpbnRvIG9uZSBvZlxuICAgICAqIGNvbmZpZy5yb3V0ZXMgKHVzZWQgYnkgc2Nhbm5pbmcsIHNvIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZHMgb25seSByZWNlaXZlIHRoZWlyIHNsaWNlKS5cbiAgICAgKiBXaGVuIGdldENvbmZpZygpLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCB0aGlzIGlzIGJhY2tlZCBieSBhbiBpbmRleCAoZmFzdCwgYW5kIGRlbGV0aW9ucyBBUkVcbiAgICAgKiByZXBvcnRlZCwgYXMgc2l6ZS0wIHRvbWJzdG9uZSBlbnRyaWVzKS4gRXZlcnkgb3RoZXIgYmFja2VuZCBlbXVsYXRlcyBpdDogYSBmdWxsIGZpbmRJbmZvXG4gICAgICogbGlzdGluZyBmaWx0ZXJlZCBpbiBtZW1vcnkgLSBjb3JyZWN0LCBidXQgbm8gY2hlYXBlciB0aGFuIHRoZSBsaXN0aW5nIGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgLyoqIFN5bmNocm9uaXphdGlvbiBpbnRyb3NwZWN0aW9uLCBmb3IgYmFja2VuZHMgdGhhdCBzeW5jaHJvbml6ZSBmcm9tIHNvdXJjZXMgKHNlZSBCbG9iU3RvcmUpLiAqL1xuICAgIGdldFN5bmNTdGF0dXM/KCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPjtcbn1cbiJdfQ==
|
|
96
|
-
|
|
55
|
+
exports.bufferChunkStream = bufferChunkStream;
|
|
56
|
+
// Re-exported for the existing importers - the implementations (and moveArchiveFile) live in archiveHelpers.ts, beside this interface rather than in it
|
|
57
|
+
var archiveHelpers_1 = require("./archiveHelpers");
|
|
58
|
+
Object.defineProperty(exports, "copyArchiveFile", { enumerable: true, get: function () { return archiveHelpers_1.copyArchiveFile; } , configurable: true});
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUFyY2hpdmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSUFyY2hpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3S0FBd0s7OztBQUV4SyxzSkFBc0o7QUFDekksUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2RCx5TEFBeUw7QUFDNUssUUFBQSxvQkFBb0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pELFNBQWdCLHVCQUF1QixDQUFDLFlBQW9CO0lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQ0FBd0IsQ0FBQztJQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxZQUFZLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7QUFDTCxDQUFDO0FBTEQsMERBS0M7QUF1RlksUUFBQSxpQkFBaUIsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFtSGhGLHdYQUF3WDtBQUMzVyxRQUFBLDBCQUEwQixHQUFHLDRDQUE0QyxDQUFDO0FBRXZGLDhMQUE4TDtBQUNqTCxRQUFBLG1CQUFtQixHQUFHLHFDQUFxQyxDQUFDO0FBRTVELFFBQUEsVUFBVSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVuRCwyUkFBMlI7QUFDOVEsUUFBQSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFDNUUsb0xBQW9MO0FBQ3BMLDhKQUE4SjtBQUM5SixTQUFnQixtQkFBbUIsQ0FBQyxXQUF5QztJQUN6RSxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBSEQsa0RBR0M7QUFDRCxpTkFBaU47QUFDak4sU0FBZ0IsbUJBQW1CLENBQUMsWUFBZ0M7SUFDaEUsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUZELGtEQUVDO0FBRUQsd0tBQXdLO0FBQzNKLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFbkQsbVJBQW1SO0FBQ25SLFNBQWdCLGlCQUFpQixDQUFDLElBQVk7SUFDMUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsT0FBTztRQUNILFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwQixJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM1QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsMkJBQW1CLENBQUMsQ0FBQztZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsYUFBYSxFQUFFLEdBQUcsRUFBRTtZQUNoQixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDO0FBYkQsOENBYUM7QUFFRCx3SkFBd0o7QUFDeEosbURBQW1EO0FBQTFDLGlIQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBpbXBvcnRhbnQgb3BlcmF0aW9ucyBvZiBhbiBhcmNoaXZlIGJ1Y2tldCAoZXh0cmFjdGVkIGZyb20gQXJjaGl2ZXNCYWNrYmxhemUpLCBzbyBvdGhlciBiYWNrZW5kcyAoZS5nLiBvdXIgb3duIHJlbW90ZSBzdG9yYWdlIHNlcnZlcikgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LlxuXG4vLyBBIHdyaXRlIG1heSBub3QgYmUgc3RhbXBlZCBtb3JlIHRoYW4gdGhpcyBmYXIgaW4gdGhlIGZ1dHVyZSwgb3IgY2xvY2sgc2tldyBiZXR3ZWVuIG1hY2hpbmVzIHdvdWxkIGxldCBhIGJhZCB0aW1lc3RhbXAgYmxvY2sgd3JpdGVzIGZvciBhIGxvbmcgdGltZS5cbmV4cG9ydCBjb25zdCBNQVhfTEFTVF9NT0RJRklFRF9GVVRVUkUgPSAxNSAqIDYwICogMTAwMDtcblxuLy8gSG93IGxvbmcgYnJvd3NlcnMgbWF5IGNhY2hlIGZpbGVzIGZyb20gaW1tdXRhYmxlIGJ1Y2tldHMgKHRoZSBDYWNoZS1Db250cm9sIG1heC1hZ2UpLCBzaGFyZWQgYnkgZXZlcnkgaG9zdGluZyBwYXRoIChiYWNrYmxhemUgYnVja2V0IHNldHRpbmdzIGFuZCBvdXIgb3duIHN0b3JhZ2Ugc2VydmVyJ3MgSFRUUCByb3V0ZSlcbmV4cG9ydCBjb25zdCBJTU1VVEFCTEVfQ0FDSEVfVElNRSA9IDg2NDAwICogMTAwMDtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBtYXggPSBEYXRlLm5vdygpICsgTUFYX0xBU1RfTU9ESUZJRURfRlVUVVJFO1xuICAgIGlmIChsYXN0TW9kaWZpZWQgPiBtYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBsYXN0TW9kaWZpZWQgaXMgdG9vIGZhciBpbiB0aGUgZnV0dXJlOiAke2xhc3RNb2RpZmllZH0gPiAke21heH0gKG5vdyArIDE1IG1pbnV0ZXMpYCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBOT1RFOiBWZXJzaW9uIGlzIHVzZWQgd2hlbiB1cGRhdGluZyB0aGUgY29uZmlndXJhdGlvbi4gVGhlIG5ld2VyIHZlcnNpb24gaXMgYWx3YXlzIHRha2VuLiBBIG1pc3NpbmcgdmVyc2lvbiBjb3VudHMgYXMgdmVyc2lvbiAtMS5cbiAgICB2ZXJzaW9uPzogbnVtYmVyO1xuICAgIHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXTtcbn07XG5cbi8qKlxuICAgIHN0cmluZyBhcmd1bWVudHMgd2lsbCBiZSBhIHVybCwgbG9va2luZyBsaWtlOlxuICAgICAgICBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvcXVlcnlzdWJ0ZXN0LWNvbS1wdWJsaWMtaW1tdXRhYmxlL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICAtIFRoZXNlIG1hcCB0byB7IHVybCB9LCB3aXRoIHRoZSB0eXBlIGluZmVycmVkIGZyb20gdGhlIHVybFxuICAgICAgICAtIEhvc3RlZCB1cmxzIGFyZSAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiwgYmFja2JsYXplIHVybHMgYXJlIC9maWxlLzxidWNrZXROYW1lPi8uLi5cblxuICAgIE5PVEU6IElmIHdlIGRvIG5vdCBoYXZlIHJpZ2h0IGFjY2VzcyB0byB0aGVzZSwgdGhlbiBpdCBiZWNvbWVzIGEgcmVhZC1vbmx5IElBcmNoaXZlcywgd2hlcmUgd2Ugc29sZWx5IHJlYWQgdXNpbmcgdGhlIHVybCBmb3JtICh3aGljaCBtaWdodCB0aHJvdyBkdWUgdG8gbm90IGhhdmluZyBhY2Nlc3MgYXMgd2VsbCkuIFVOTEVTUyBPdXIgY29uZmlndXJhdGlvbiBleHBsaWNpdGx5IGhhcyBwdWJsaWM6IGZhbHNlLCBpbiB3aGljaCBjYXNlLCB3ZSBkb24ndCBldmVuIGhpdCB0aGUgVVJMIGFuZCB3ZSB0aHJvdyBvbiBhY2Nlc3MuXG5cbiAgICBOT1RFOiBJZiB3ZSdyZSBpbiB0aGUgYnJvd3Nlciwgd2Ugc2hvdWxkIGFsbG93IGRvd25sb2FkaW5nIHRoZSBmaWxlcyB2aWEgdGhlIFVSTCBmb3JtIChpZiBpdCdzIGEgcHVibGljIGJ1Y2tldCksIGhvd2V2ZXIsIHdlIHdvbid0IGFsbG93IHdyaXRpbmcsIGJlY2F1c2UgdGhlaXIgc2VydmVycyBkbyBub3QgYWxsb3cgc2VjdXJlIGJyb3dzZXIgd3JpdGVzLlxuKi9cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZ0Jhc2UgPSBzdHJpbmcgfCBTb3VyY2VDb25maWc7XG5cbi8qKiBPbmUgY29uZmlndXJlZCBzb3VyY2UgaW4gYSByb3V0aW5nIGNvbmZpZzogYSBob3N0ZWQgKG91ciBzdG9yYWdlIHNlcnZlcikgb3IgYmFja2JsYXplIGVudHJ5LiBSZXF1ZXN0cyBjYXJyeSB0aGUgZXhhY3QgU291cmNlQ29uZmlnIHRoZXkgc2VsZWN0ZWQsIGFuZCB0aGUgc2VydmVyIG1hdGNoZXMgaXQgYWdhaW5zdCBpdHMgb3duIGVudHJpZXMgdG8gcGljayB0aGUgYmFja2luZyBzdG9yZS4gKi9cbmV4cG9ydCB0eXBlIFNvdXJjZUNvbmZpZyA9IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZztcblxuZXhwb3J0IHR5cGUgQ29tbW9uQ29uZmlnID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdG9yYWdlIHRoaXMgZW50cnkgbmFtZXMsIGFzIG9wcG9zZWQgdG8gdGhlIHJ1bGVzIGZvciB1c2luZyBpdC4gRXZlcnkgZW50cnkgd2l0aCB0aGUgc2FtZVxuICAgICAqIG5hbWUgKGZvciB0aGUgc2FtZSBhY2NvdW50IGFuZCBidWNrZXQpIElTIHRoZSBzYW1lIHN0b3JhZ2U6IG9uZSBmb2xkZXIgb24gdGhlIHNlcnZlciwgb25lXG4gICAgICogc3RvcmUsIG9uZSBpbmRleCAtIGhvd2V2ZXIgbWFueSBlbnRyaWVzIHRoZXJlIGFyZSBhbmQgd2hhdGV2ZXIgdGhlaXIgd2luZG93cyBhbmQgcm91dGVzIHNheS5cbiAgICAgKiBFdmVyeXRoaW5nIGFib3V0IFdIRU4gYW5kIFdISUNIIEtFWVMgKHZhbGlkV2luZG93LCByb3V0ZSkgaXMgcG9saWN5IGxheWVyZWQgb24gdG9wIG9mIGl0LCBhbmRcbiAgICAgKiBjaGFuZ2luZyB0aGF0IHBvbGljeSBuZXZlciBtb3ZlcyBkYXRhLlxuICAgICAqXG4gICAgICogTGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZSwgZGFzaCBhbmQgcGVyaW9kcywgdXAgdG8gNjQgY2hhcmFjdGVycyAtIHNvIGEgaG9zdCBvciBhIHZlcnNpb25cbiAgICAgKiBjYW4gYmUgdXNlZCBhcy1pcy4gSXQgaXMgdGhlIGZvbGRlciBuYW1lLCBzbyBpdCBtdXN0IHN0YXkgdW5pcXVlIGFuZCBtdXN0IG5ldmVyIGJlIHJldXNlZCBmb3JcbiAgICAgKiBkaWZmZXJlbnQgc3RvcmFnZTpcbiAgICAgKiBwb2ludGluZyB0d28gdW5yZWxhdGVkIGVudHJpZXMgYXQgb25lIG5hbWUgbWVyZ2VzIHRoZWlyIGRhdGEsIGFuZCByZS11c2luZyBhIHJldGlyZWQgbmFtZVxuICAgICAqIGhhbmRzIHRoZSBuZXcgZW50cnkgdGhlIHJldGlyZWQgb25lJ3MgZmlsZXMuIERlY2lkaW5nIHRoYXQgaXMgdGhlIGRldmVsb3BlcidzIGpvYiAtIHRoZSBzZXJ2ZXJcbiAgICAgKiBvbmx5IGV2ZXIgZG9lcyB3aGF0IHRoZSBuYW1lIHNheXMuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBCeSBkZWZhdWx0IGEgc2VydmVyIGhvc3RpbmcgdGhpcyBidWNrZXQgZWFnZXJseSBjb3BpZXMgdGhpcyBzb3VyY2UncyBmdWxsIGNvbnRlbnRzIG9udG8gaXRzIG93biBkaXNrIChvbiB0b3Agb2YgdGhlIGxhenkgcmVhZC10aHJvdWdoIGNhY2hpbmcpLiBTZXQgdGhpcyB0byBiZSBhIGZyb250IGVuZCBmb3IgYSB2ZXJ5IGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyB0aGUgZnVsbCBkYXRhYmFzZSAtIHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgaW5kaXZpZHVhbCBmaWxlcyBvbiBkZW1hbmQuICovXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQtY2FjaGUgdGhpcyBzZXJ2ZXIncyBkaXNrIG1heSBob2xkOyBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gZGlzayB0byBzdGF5IHVuZGVyIGl0IChvbmx5IGV2ZXIgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIHRoZSBmaWxlIC0gdGhlIG9ubHkgY29weSBpcyBuZXZlciBkZWxldGVkKS4gUmVxdWlyZXMgbm9GdWxsU3luYyAoYSBmdWxsIGNvcHkgY2FuJ3QgYmUgYm91bmRlZCkuICovXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgd3JpdGUgdGltZXMgKFtzdGFydE1zLCBlbmRNc10pIHRoaXMgc291cmNlIGlzIHZhbGlkIGZvciAoc2VlIEFyY2hpdmVzU291cmNlLnZhbGlkV2luZG93IGZvciB0aGUgc3luY2hyb25pemF0aW9uIHNlbWFudGljcykuIFJlcXVpcmVkIG9uIG9iamVjdCBjb25maWdzOiBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBTQ0hFRFVMRUQgKGEgbmV3IHNvdXJjZSBiZWNvbWVzIHZhbGlkIGF0IGEgZnV0dXJlIHRpbWUgd2hpbGUgdGhlIG9sZCBvbmUncyB3aW5kb3cgZW5kcyksIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gUGxhaW4gVVJMLXN0cmluZyBzb3VyY2VzIGRlZmF1bHQgdG8gRlVMTF9WQUxJRF9XSU5ET1cgLSBvbmNlIHlvdSdyZSB3cml0aW5nIG9iamVjdCBjb25maWdzLCB5b3UncmUgZG9pbmcgc29tZXRoaW5nIGNvbXBsaWNhdGVkIGVub3VnaCB0byB0aGluayBhYm91dCB3aGVuIHRoaW5ncyBjaGFuZ2UuICovXG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLyoqIFNoYXJkaW5nOiB0aGUgZnJhY3Rpb24gb2YgdGhlIGtleSBzcGFjZSB0aGlzIHNvdXJjZSBoYW5kbGVzLCBhcyBbc3RhcnQsIGVuZCkgb3ZlciBbMCwgMSkgKGtleXMgYXJlIHJvdXRlZCBieSBnZXRSb3V0ZSBpbiByZW1vdGVDb25maWcudHMpLiBEZWZhdWx0cyB0byBGVUxMX1JPVVRFICh1bnNoYXJkZWQpLiBBdCBldmVyeSBwb2ludCBpbiB0aW1lIHRoZSBzb3VyY2VzJyByb3V0ZXMgbXVzdCBmdWxseSBjb3ZlciBbMCwgMSksIG9yIHNvbWUga2V5cyBjb3VsZCBuZXZlciBiZSByZWFkLiAqL1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICAvKiogU2V0IG9uIGVudHJpZXMgaW5qZWN0ZWQgaW50byB0aGUgaW4tbWVtb3J5IGNvbmZpZyBieSBhbiBvdmVybGF5IChhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgd2luZG93KS4gTmV2ZXIgd3JpdHRlbiB0byBkaXNrOiByZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyBzdHJpcHMgdGhlc2UgYW5kIHJlam9pbnMgdGhlIHdpbmRvd3MgYXJvdW5kIHRoZW0sIHdoaWNoIGlzIGFsc28gaG93IGEgY2xpZW50IHRlbGxzIHdoZXRoZXIgYW4gdXBkYXRlIGlzIGEgcmVhbCBjb25maWd1cmF0aW9uIGNoYW5nZSBvciBqdXN0IGFuIG92ZXJsYXkuIFRoZSBWQUxVRSBpcyB0aGUgdXJsIG9mIHRoZSBzb3VyY2UgdGhpcyBpbnRlcm1lZGlhdGUgd2FzIHNwbGl0IG91dCBvZiAoaXRzIGFsdGVybmF0ZS1wb3J0IHZpZXcpIC0gc28gYSByZXF1ZXN0IG5hbWluZyB0aGUgaW50ZXJtZWRpYXRlIHN0aWxsIHJlc29sdmVzIHRvIHRoZSBPUklHSU5BTCBzb3VyY2UsIGV2ZW4gYWZ0ZXIgdGhlIGludGVybWVkaWF0ZSByZWpvaW5zIGFuZCB0aGUgZW50cnkgaXMgZ29uZS4gKi9cbiAgICBpbnRlcm1lZGlhdGU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBIb3N0ZWRDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJyZW1vdGVcIjtcblxuICAgIC8vIEV4OiBodHRwczovLzk5LTI1MC0xMjQtOTEucXVlcnlzdWJ0ZXN0LmNvbTo1MjMzL2ZpbGUvcm9vdC91bmlxdWVidWNrZXRuYW1lL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIC8vIE5PVEU6IFRoZSBhY2NvdW50IGFuZCBidWNrZXQgbmFtZSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuXG4gICAgLy8gTk9URTogQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCBieSBjZXJ0LnRzLCB2aWEgaGF2aW5nIHlvdXIgbWFjaGluZSB0cnVzdGVkIHRvIGFjY2VzcyB0aGlzIGFjY291bnQuIFxuXG4gICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAvLyBGYXN0IG1vZGU6IHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHdyaXRlcyBvbmNlIHRoZXkgYXJlIGluIG1lbW9yeSwgZmx1c2hpbmcgdG8gZGlzayBhZnRlciB3cml0ZURlbGF5IChkZWZhdWx0IDUgbWludXRlcykgYW5kIGNvYWxlc2Npbmcgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUuIEEgc2VydmVyIGNyYXNoIGxvc2VzIHdyaXRlcyB0aGF0IGhhdmVuJ3QgZmx1c2hlZCB5ZXQuXG4gICAgZmFzdD86IGJvb2xlYW47XG4gICAgd3JpdGVEZWxheT86IG51bWJlcjtcbiAgICAvLyBXcml0ZXMgdG8gcGF0aHMgdGhhdCBhbHJlYWR5IGV4aXN0IGFyZSBkaXNhbGxvd2VkIChkZWxldGVzIHN0aWxsIHdvcmspLlxuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrYmxhemVDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJiYWNrYmxhemVcIjtcbiAgICAvLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbiAgICAvLyBOT1RFOiBUaGUgYnVja2V0IG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIFB1YmxpYyBidWNrZXRzIGFyZSBzZXJ2ZWQgb3ZlciBwbGFpbiBIVFRQUyBHRVRzIChnZXRVUkwpLiBQcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seS5cbiAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgIC8vIE5PVEU6IFRoaXMgaXNuJ3QgZW5mb3JjZWQgb24gdGhlIGJhY2tibGF6ZSBsZXZlbCwgc28gdGhpcyBpcyBqdXN0IGEgY2xpZW50LXNpZGUgZ3VhcmFudGVlLiBUaGlzIGNhbiBjaGFuZ2UgaG93IHdlIGNhY2hlIGZpbGVzLlxuICAgIC8vICAtIEJhY2tibGF6ZSBkb2VzIHN1cHBvcnQgaW1tdXRhYmlsaXR5LiBIb3dldmVyLCBhcHBhcmVudGx5LCBvbmNlIHdlIGVuYWJsZSBpdCBvbiBhIGJ1Y2tldCwgd2UgY2FuJ3QgZGlzYWJsZSBpdCwgd2hpY2ggaXMgcmVhbGx5IGJhZCwgYXMgaXQgbWVhbnMgaWYgb3VyIGNvZGUgY291bGQgZXZlciBlbmFibGUgaXQgYW5kIHdlIGFjY2lkZW50YWxseSBlbmFibGUgaXQgb24gYW4gaW1wb3J0YW50IGJ1Y2tldCwgd2UgZXNzZW50aWFsbHkganVzdCBicmlja2VkIHRoYXQgYnVja2V0LiBTbyB3ZSBzaG91bGQgbmV2ZXIgd3JpdGUgYW55IGNvZGUgdGhhdCBldmVyIHRyaWVzIHRvIHVzZSBiYWNrYmxhemUgdG8gbWFrZSB0aGluZ3MgaW1tdXRhYmxlLiBcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIC8vIENPUlMgb3JpZ2lucyBhbGxvd2VkIHRvIGNvbnN1bWUgdGhlIGJ1Y2tldCdzIGZpbGVzIGluIGEgYnJvd3Nlci4gTm90IGEgc2VjdXJpdHkgYm91bmRhcnkgKGFjY2VzcyBpcyBnYXRlZCBieSB0aGUgQVBJIGtleSAvIHNpZ25lZCBVUkxzLCBuZWl0aGVyIG9mIHdoaWNoIHJpZGVzIGluIGNvb2tpZXMpIC0gaXQgb25seSBjb250cm9scyB3aGljaCBzaXRlcycgaW4tcGFnZSBKYXZhU2NyaXB0IGNhbiByZWFkIHJlc3BvbnNlcy4gRGVmYXVsdHMgdG8gYW55IEhUVFBTIG9yaWdpbi5cbiAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuXG4gICAgLy8gTk9URTogV2Ugd2lsbCBhY2Nlc3MgdGhlIGFwaSBrZXkgZnJvbSBnZXRTZWNyZXQsIHNlZSBiYWNrYmxhemUudHMgZm9yIHRoZSBzcGVjaWZpYyBrZXlzLlxufTtcblxuXG5leHBvcnQgY29uc3QgRlVMTF9WQUxJRF9XSU5ET1c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdO1xuXG5cblxuXG5leHBvcnQgdHlwZSBHZXRDb25maWcgPSB7XG4gICAgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gICAgLyoqIFJlYWQgT05MWSBmcm9tIHRoZSBwcmltYXJ5IHNvdXJjZSAtIHRoZSBvbmUgd3JpdGVzIHdvdWxkIHRhcmdldCAtIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMuIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgeW91ciByZWFkcyBhbmQgd3JpdGVzIHRvIGJlIHNvbWV3aGF0IGF0b21pYzogdGhlcmUgd2lsbCBzdGlsbCBiZSBpc3N1ZXMgd2l0aCB0aGUgcm91bmQgdHJpcCwgYnV0IHdpdGhvdXQgaXQgeW91IGNvdWxkIHRhbGsgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBub2RlIGFuZCBnZXQgYSBtdWNoIG9sZGVyIHZhbHVlLiBNb3N0IHJlYWRzIGFyZW4ndCBmb2xsb3dlZCBieSBhIHdyaXRlIHRob3VnaCwgc28gZm9yIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIgdG8gZ2V0IGEgdmFsdWUgdGhhbiB0byBoYXZlIHRvIHdhaXQgKG9yIGV2ZW4gdGhyb3cpIHdoZW4gdGhlIHByaW1hcnkgbm9kZSBpcyBub3QgYXZhaWxhYmxlLiAqL1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU3RvcmUtdG8tc3RvcmUgY2FsbDogdGhlIHNlcnZpbmcgbm9kZSBhbnN3ZXJzIHB1cmVseSBmcm9tIGl0cyBvd24gZGlzaywgY29tcGxldGVseSBzaG9ydC1jaXJjdWl0aW5nIGl0cyBpbmRleCBob2xkZXJzIC0gY2hhc2luZyBpdHMgb3duIHJlbW90ZSBob2xkZXJzIHdoaWxlIGFuc3dlcmluZyBhbm90aGVyIHN0b3JlIGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybSAoQSBhc2tzIEIsIEIncyBpbmRleCBwb2ludHMgYmFjayBhdCBBLCAuLi4pLiBObyB3aW5kb3cgb3Igcm91dGUgY2hlY2tzIG9uIHJlYWRzOiBpZiB0aGUgYnl0ZXMgYXJlIG9uIGl0cyBkaXNrLCB0aGUgY2FsbGVyIG1heSBoYXZlIHRoZW0uICovXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8qKiBBbHNvIHJldHVybiBzaXplLTAgcmVzdWx0cyAodG9tYnN0b25lcyAtIGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpIGluc3RlYWQgb2YgdHJlYXRpbmcgdGhlbSBhcyBhYnNlbnQuIE9mZiBieSBkZWZhdWx0LCBtYXRjaGluZyBnZXRJbmZvJ3MgZmxhZyBvZiB0aGUgc2FtZSBuYW1lLiBTeW5jaHJvbml6YXRpb24gcGFzc2VzIHRoaXMgc28gYSBERUxFVEVEIGZpbGUgKHdpdGggaXRzIHdyaXRlIHRpbWUpIGlzIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZmlsZSB0aGF0IG5ldmVyIGV4aXN0ZWQuICovXG4gICAgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRmluZENvbmZpZyA9IHtcbiAgICBzaGFsbG93PzogYm9vbGVhbjtcbiAgICB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCI7XG4gICAgLyoqIExpc3RpbmdzIG5vcm1hbGx5IGNvbWUgT05MWSBmcm9tIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZXMgKHRoZSBzYW1lIG5vZGVzIHdyaXRlcyBnbyB0byAtIHJlYWQteW91ci13cml0ZXMpLiBXaXRoIGZhbGxiYWNrcywgYSBmYWlsaW5nIHNoYXJkJ3Mgcm91dGVzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBuZXh0IHNvdXJjZSBob2xkaW5nIHRoZW0gKGUuZy4gYSB3aWRlIHJlYWQgcmVwbGljYSkgaW5zdGVhZCBvZiB0aGUgY2FsbCBmYWlsaW5nIC0gaGlnaCBhdmFpbGFiaWxpdHkgYXQgdGhlIGNvc3Qgb2YgcG9zc2libHkgbWlzc2luZyBqdXN0LXdyaXR0ZW4gZGF0YS4gU2luZ2xlLXNvdXJjZSBhcmNoaXZlcyBpZ25vcmUgdGhlIGZsYWcuICovXG4gICAgZmFsbGJhY2tzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERlbENvbmZpZyA9IHtcbiAgICAvKiogU3RhbXBzIHRoZSBkZWxldGlvbiAoaXRzIHRvbWJzdG9uZSkgd2l0aCB0aGlzIHdyaXRlIHRpbWUgaW5zdGVhZCBvZiBub3cuIFN5bmNocm9uaXphdGlvbiBwYXNzZXMgdGhlIE9SSUdJTkFMIGRlbGV0aW9uIHRpbWUsIHNvIGRlbGV0aW9uIG9yZGVyaW5nIHN1cnZpdmVzIHByb3BhZ2F0aW9uIGV4YWN0bHkgbGlrZSBhbnkgb3RoZXIgd3JpdGUncyBvcmRlcmluZy4gKi9cbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7XG4gICAgLyoqIFNlZSBTZXRDb25maWcuaW50ZXJuYWwuICovXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8qKiBTZWUgU2V0Q29uZmlnLm5vQ2hlY2tzLiAqL1xuICAgIG5vQ2hlY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIFNldENvbmZpZy5mYWxsYmFja3MuICovXG4gICAgZmFsbGJhY2tzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEdldEluZm9Db25maWcgPSB7XG4gICAgLyoqIEFsc28gcmVwb3J0IHNpemUtMCBlbnRyaWVzICh0b21ic3RvbmVzIC0gYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSkuIE9mZiBieSBkZWZhdWx0LCBzbyBhIGRlbGV0ZWQga2V5IHJlcG9ydHMgdW5kZWZpbmVkLCBtYXRjaGluZyBnZXQuIFN5bmNocm9uaXphdGlvbi1zdHlsZSBjYWxsZXJzIHBhc3MgdGhpcyB3aGVuIHRoZXkgbmVlZCBhIGRlbGV0aW9uJ3Mgd3JpdGUgdGltZSAoZS5nLiB0byBjb21wYXJlIGl0IGFnYWluc3QgYSB3cml0ZSB0aGV5IGFyZSBhYm91dCB0byBtYWtlKS4gKi9cbiAgICBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBHZXRDb25maWcubm9GYWxsYmFja3M6IGFuc3dlciBPTkxZIGZyb20gdGhlIHByaW1hcnkgc291cmNlICh0aGUgb25lIHdyaXRlcyB3b3VsZCB0YXJnZXQpIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMuICovXG4gICAgbm9GYWxsYmFja3M/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0FmdGVyQ29uZmlnID0ge1xuICAgIHRpbWU6IG51bWJlcjtcbiAgICAvKiogT25seSBrZXlzIHJvdXRpbmcgaW50byBvbmUgb2YgdGhlc2UgW3N0YXJ0LCBlbmQpIHJhbmdlcy4gT25seSBzY2FubmluZyBwYXNzZXMgdGhpcyAtIGl0IGxldHMgYSBzdG9yZSBzeW5jaW5nIGEgcGFydGlhbCBzaGFyZCBhc2sgZm9yIGp1c3QgaXRzIHNsaWNlLiAqL1xuICAgIHJvdXRlcz86IFtudW1iZXIsIG51bWJlcl1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFNldENvbmZpZyA9IHtcbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7XG4gICAgLyoqIE1ha2VzIHRoZSB3cml0ZSBhY2NlcHRhYmxlIG9uIGltbXV0YWJsZSB0YXJnZXRzOiBhbiBleGlzdGluZyBwYXRoIGlzIHNpbXBseSBrZXB0IChpbW11dGFiaWxpdHkgd2lucyAtIG5vdGhpbmcgaXMgb3ZlcndyaXR0ZW4pIGluc3RlYWQgb2YgdGhlIHdyaXRlIHRocm93aW5nLiBSZXF1aXJlcyBsYXN0TW9kaWZpZWQuIFN5bmNocm9uaXphdGlvbiBNVVNUIHBhc3MgdGhpcyBvbiBldmVyeSBwdXNoIC0gYSBwbGFpbiBzZXQgdGhyb3dzIG9uIGltbXV0YWJsZSB0YXJnZXRzLCB3aGljaCB3b3VsZCBhYm9ydCByZWNvbmNpbGlhdGlvbiB3aGVuZXZlciBvbmUgc291cmNlIGluIGEgY2hhaW4gaXMgaW1tdXRhYmxlLiAqL1xuICAgIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICAvKiogU2tpcHMgUkVEVU5EQU5UIHRhcmdldC1zaWRlIHNhZmV0eSByZWFkcyBhcm91bmQgdGhlIHdyaXRlIChiYWNrYmxhemU6IHRoZSBwb3N0LXVwbG9hZCBleGlzdGVuY2UgcG9sbCkuIEl0IGRvZXMgTk9UIHNraXAgY2hlY2tzIHRoYXQgYXJlIHRoZSB0YXJnZXQncyBvbmx5IG9yZGVyaW5nIGd1YXJkOiBiYWNrYmxhemUncyBwcmUtd3JpdGUgY29tcGFyaXNvbiBzdGF5cywgYmVjYXVzZSBiMiBoYXMgbm8gc2VydmVyIG9mIG91cnMgZW5mb3JjaW5nIG9ubHktdGFrZS10aGUtbGF0ZXN0IC0gd2l0aG91dCBpdCBhIHN0YWxlIHB1c2ggbGFuZHMgb3ZlciBhIG5ld2VyIHZhbHVlIG9yIHRvbWJzdG9uZSBhbmQgYjIncyBzZWxmLXN0YW1wZWQgdXBsb2FkIHRpbWUgbGF1bmRlcnMgaXQgaW50byB0aGUgbmV3ZXN0IGNvcHkgaW4gdGhlIHN5c3RlbSAoZ2xvYmFsIHJlc3VycmVjdGlvbikuIEhvc3RlZCB0YXJnZXRzIHJlLWNoZWNrIHNlcnZlci1zaWRlLCBzbyB0aGVpciBjbGllbnQtc2lkZSBzaG9ydGN1dHMgYXJlIHNhZmUuICovXG4gICAgbm9DaGVja3M/OiBib29sZWFuO1xuICAgIC8qKiBTdG9yZS10by1zdG9yZSBwdXNoOiB0aGUgcmVjZWl2aW5nIG5vZGUgd3JpdGVzIHB1cmVseSB0byBpdHMgb3duIGRpc2sgYW5kIGluZGV4LCB3aXRoIE5PIGRvd25zdHJlYW0gZmFuLW91dCAodGhlIHB1c2hpbmcgc3RvcmUgb3ducyBwcm9wYWdhdGlvbiAtIGZhbm5pbmcgaXRzIHB1c2hlcyBiYWNrIG91dCBpcyBob3cgd3JpdGUgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybSkuIFdpbmRvdyBhbmQgcm91dGUgQVJFIHN0aWxsIGNoZWNrZWQ6IHRoZSBzdGFtcCBtdXN0IGZhbGwgaW5zaWRlIG9uZSBvZiB0aGUgcmVjZWl2ZXIncyBjb25maWd1cmVkIHdpbmRvd3MgYW5kIHJvdXRlcywgc28gYSBjb25mdXNlZCBwZWVyIGNhbm5vdCBzdHVmZiBkYXRhIG9udG8gYSBub2RlIHRoYXQgd2FzIG5ldmVyIG1lYW50IHRvIGhvbGQgaXQuIFJlcXVpcmVzIGxhc3RNb2RpZmllZC4gKi9cbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG4gICAgLyoqIFdyaXRlcyBub3JtYWxseSBnbyBPTkxZIHRvIHRoZSB3cml0ZSBub2RlICh0aGUgZmlyc3QgY3VycmVudC13aW5kb3cgc291cmNlIGNvdmVyaW5nIHRoZSBrZXkpLCByZXRyeWluZyBpdCBldmVuIHdoaWxlIGl0IGlzIGRvd24gLSBjb25zaXN0ZW50LCBidXQgdW5hdmFpbGFibGUgd2hlbiB0aGF0IG5vZGUgaXMuIFdpdGggZmFsbGJhY2tzLCB0aGUgd3JpdGUgbm9kZSBpcyBzdGlsbCB0cmllZCBmaXJzdCwgYnV0IG9uIGZhaWx1cmUgdGhlIHdyaXRlIGxhbmRzIG9uIHRoZSBuZXh0IGN1cnJlbnQtd2luZG93IHNvdXJjZSBjb3ZlcmluZyB0aGUga2V5IChzeW5jaHJvbml6YXRpb24gbW92ZXMgaXQgdG8gdGhlIHdyaXRlIG5vZGUgbGF0ZXIpIC0gYXZhaWxhYmlsaXR5IGF0IHRoZSBjb3N0IG9mIHJlYWRzIHBvc3NpYmx5IG1pc3NpbmcgdGhlIHdyaXRlIHVudGlsIGl0IHByb3BhZ2F0ZXMuIFNpbmdsZS1zb3VyY2UgYXJjaGl2ZXMgaWdub3JlIHRoZSBmbGFnLiAqL1xuICAgIGZhbGxiYWNrcz86IGJvb2xlYW47XG59O1xuXG4vKiogc2V0TGFyZ2VGaWxlJ3MgY29uZmlnOiBhIFNldENvbmZpZyAoaXQgSVMgYSBzZXQgLSB0aGUgc2FtZSBpbW11dGFiaWxpdHksIG9yZGVyaW5nLCBpbnRlcm5hbCwgYW5kIGZhbGxiYWNrcyBydWxlcyBhcHBseSkgcGx1cyB0aGUgc3RyZWFtIGNhcnJ5aW5nIHRoZSBieXRlcy4gKi9cbmV4cG9ydCB0eXBlIFNldExhcmdlRmlsZUNvbmZpZyA9IFNldENvbmZpZyAmIHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+O1xuICAgIC8qKiBSZXdpbmRzIHRoZSBzdHJlYW0gdG8gaXRzIGZpcnN0IGJ5dGUuIFdpdGhvdXQgaXQgdGhlIHdyaXRlIGdldHMgZXhhY3RseSBPTkUgYXR0ZW1wdDogYSByZXRyeSAoYSBmYWxsYmFjayBzb3VyY2UsIG9yIHRoZSB3cml0ZSBub2RlIGNvbWluZyBiYWNrKSB3b3VsZCB1cGxvYWQgd2hhdGV2ZXIgaXMgbGVmdCBvZiBhbiBhbHJlYWR5LWNvbnN1bWVkIHN0cmVhbSBhcyBpZiBpdCB3ZXJlIHRoZSB3aG9sZSBmaWxlLiBDYWxsZXJzIGhvbGRpbmcgdGhlIGRhdGEgKGEgYnVmZmVyLCBvciBhIHNvdXJjZSB0aGV5IGNhbiByZS1yZWFkKSBhbHdheXMgcGFzcyBpdCAtIGEgbGFyZ2Ugc2V0IHdpdGggZmFsbGJhY2tzIGlzIG9ubHkgYXMgYXZhaWxhYmxlIGFzIHRoaXMuICovXG4gICAgcmVzdGFydFN0cmVhbT8oKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59O1xuXG4vLyBjcmVhdGVUaW1lIGlzIGEgbWlzbm9tZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eSDigJQgaXQgaXMgcmVhbGx5IHRoZSBMQVNULVdSSVRFIHRpbWUsIHNhbWUgYXMgZ2V0SW5mbydzIHdyaXRlVGltZS4gTmVpdGhlciBCYWNrYmxhemUgbm9yIG91ciByZW1vdGUgc3RvcmFnZSB0cmFja3MgYSBkaXN0aW5jdCBjcmVhdGlvbiBkYXRlOiBlYWNoIHdyaXRlIHN0YW1wcyBhIGZyZXNoIHRpbWVzdGFtcCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyBib3RoIGZpZWxkcyBhcmUganVzdCBcIndoZW4gdGhlIGJ5dGVzIHNlcnZlZCBieSBnZXQoKSB3ZXJlIG1vc3QgcmVjZW50bHkgd3JpdHRlblwiLlxuZXhwb3J0IHR5cGUgQXJjaGl2ZUZpbGVJbmZvID0geyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07XG5cbi8vIEFuIGluLXByb2dyZXNzIGJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIHRhc2sgKHNlZSBBcmNoaXZlc0NvbmZpZy5zeW5jaW5nKVxuZXhwb3J0IHR5cGUgU3luY0FjdGl2aXR5ID0ge1xuICAgIC8vIEEgbWV0YWRhdGEgc2NhbiBpcyBhIHNpbmdsZSBsaXN0aW5nIGNhbGwsIHNvIGl0IGhhcyBubyBpbmNyZW1lbnRhbCBwcm9ncmVzcyAtIGp1c3QgdGhhdCBpdCdzIHJ1bm5pbmcgYW5kIHNpbmNlIHdoZW4uIEEgZnVsbCBzeW5jIGtub3dzIGl0cyBleGFjdCBmaWxlL2J5dGUgcHJvZ3Jlc3MuXG4gICAgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiB8IFwiZnVsbFN5bmNcIjtcbiAgICBzb3VyY2VEZWJ1Z05hbWU6IHN0cmluZztcbiAgICBzdGFydFRpbWU6IG51bWJlcjtcbiAgICBkb25lRmlsZXM/OiBudW1iZXI7XG4gICAgdG90YWxGaWxlcz86IG51bWJlcjtcbiAgICBkb25lQnl0ZXM/OiBudW1iZXI7XG4gICAgdG90YWxCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzQ29uZmlnID0ge1xuICAgIC8vIFdoZXRoZXIgZ2V0Q2hhbmdlc0FmdGVyMiBpcyBuYXRpdmVseSBpbmRleC1iYWNrZWQgKGZhc3QgY2hhbmdlIHBvbGxpbmc7IGV2ZXJ5IGJhY2tlbmQgc3RpbGwgc2VydmVzIGl0LCBidXQgdGhlIG90aGVycyBlbXVsYXRlIGl0IHdpdGggYSBmdWxsIGxpc3RpbmcpXG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI/OiBib29sZWFuO1xuICAgIC8vIFRoZSBidWNrZXQncyBmdWxsIHJvdXRpbmcgY29uZmlnIChST1VUSU5HX0ZJTEUpLiBBYnNlbnQgZm9yIHNvdXJjZXMgdGhhdCBkb24ndCBoYXZlIG9uZSAoYSBiYXJlIGRpc2sgc291cmNlLCBvciBhIGJ1Y2tldCB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0KS5cbiAgICByZW1vdGVDb25maWc/OiBSZW1vdGVDb25maWc7XG4gICAgLy8gTGl2ZSBpbmRleCB0b3RhbHMgKHRvbWJzdG9uZXMgZXhjbHVkZWQpLCBrZXB0IHVwIHRvIGRhdGUgaW4gbWVtb3J5IG9uIGV2ZXJ5IG11dGF0aW9uIGFuZCByZWNvbXB1dGVkIG9uIGxvYWQgLSBzbyBhbnkgZHJpZnQgaGVhbHMgb24gcmVzdGFydFxuICAgIGluZGV4PzogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfTtcbiAgICAvLyBUaGUgc2FtZSB0b3RhbHMgYnJva2VuIGRvd24gYnkgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyBlYWNoIGZpbGUncyBieXRlcyAodGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBzZXJ2ZXIncyBvd24gZGlzaylcbiAgICBpbmRleFNvdXJjZXM/OiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyBjb25maWd1cmVkIHJlYWRlckRpc2tMaW1pdCwgd2hlbiBpdCBydW5zIGFzIGEgYm91bmRlZCByZWFkIGNhY2hlXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8vIEJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAoZW1wdHkgd2hlbiBpZGxlKVxuICAgIHN5bmNpbmc/OiBTeW5jQWN0aXZpdHlbXTtcbn07XG5cbi8vIEEgc3luY2hyb25pemF0aW9uIHNvdXJjZSBvZiBhIEJsb2JTdG9yZSAod2hpY2ggc3luY2hyb25pemVzIGFuIGluZGV4ICsgbG9jYWwgY2FjaGUgZnJvbSB0aGVtKVxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTb3VyY2UgPSB7XG4gICAgc291cmNlOiBJQXJjaGl2ZXM7XG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IGlkZW50aXR5IG9mIHRoZSBlbmRwb2ludDogaXRzIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSwgb3IgdGhlIGRpc2sgZm9sZGVyIHBhdGggZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlLiBUaGUgc3RvcmUgcGVyc2lzdHMgdGhpcyAodmlhIGl0cyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QpIGFzIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCwgc28gaXQgbXVzdCBtZWFuIHRoZSBzYW1lIGVuZHBvaW50IGZvcmV2ZXIuICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnLCBidXQgQUxMIG9mIHRoZW06IHRoZSBzYW1lIGVuZHBvaW50IChzYW1lIHVybCtyb3V0ZSwgaWdub3JpbmcgdGhlIHdpbmRvdykgY2FuIGFwcGVhciBpbiB0aGUgcm91dGluZyBjb25maWcgdW5kZXIgc2V2ZXJhbCB3aW5kb3dzIGF0IG9uY2UgLSBtb3N0IGNvbW1vbmx5IHdoZW4gYSBkZXBsb3kgc3dpdGNob3ZlciBoYXMgc3BsaXQgb25lIHdpbmRvdyBpbiB0d28gYXJvdW5kIGFuIGludGVybWVkaWF0ZS4gSXQgaXMgT05FIHNvdXJjZSB0aGF0IGtub3dzIGFsbCBpdHMgd2luZG93cywgbmV2ZXIgc2V2ZXJhbCBzb3VyY2VzLiBUaGUgd2luZG93IHJvdXRlcyBXUklURVM6IHRoZSBzb3VyY2UgcmVjZWl2ZXMgd3JpdGVzIHdoaWxlIEFOWSBvZiBpdHMgd2luZG93cyBpcyBzdGlsbCBvcGVuIChzZWUgd2luZG93c0FjY2VwdFdyaXRlcykuIFdpbmRvd3MgZG8gTk9UIGZpbHRlciBzY2FubmluZzogYSBzY2FuIGlzIHVzIGFza2luZyB0aGUgc291cmNlIHdoYXQgaXQgYWxyZWFkeSBob2xkcywgYW5kIGV4aXN0aW5nIHZhbHVlcyBzeW5jaHJvbml6ZSByZWdhcmRsZXNzIG9mIHRoZWlyIHdyaXRlIHRpbWVzICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS5cbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICAvLyBGcm9tIHRoZSBzb3VyY2UncyBDb21tb25Db25maWcgKGludGVyc2VjdGVkIHdpdGggdGhlIG93bmluZyBzdG9yZSdzIG93biByb3V0ZSk6IG9ubHkga2V5cyByb3V0aW5nIGludG8gW3N0YXJ0LCBlbmQpIGFyZSBhY2NlcHRlZCBmcm9tIHRoaXMgc291cmNlJ3Mgc2NhbnMgYW5kIHNlbnQgdG8gaXQgaW4gd3JpdGVzL3JlY29uY2lsaWF0aW9uLiBUaGUgcm91dGluZyBmaWxlIGlzIGV4ZW1wdCAtIGNvbmZpZyBmbG93cyBldmVyeXdoZXJlLiBBYnNlbnQgPSBhbGwga2V5cy5cbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOyBzZWUgdGhlcmUuXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOiBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZS1wb3J0IGVudHJ5ICh0aGUgdmFsdWUgaXMgdGhlIHVybCBvZiB0aGUgc291cmNlIGl0IHdhcyBzcGxpdCBvdXQgb2YpLiBPbmNlIGl0cyB3aW5kb3cgaXMgcGFzdCwgdGhlIHBvcnQgaXQgcG9pbnRzIGF0IGlzIGdvbmUgZm9yIGdvb2QgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkIHRoZW4sIGFuZCBzY2FuIGZhaWx1cmVzIGFyZSBuZXZlciByZXRyaWVkLlxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBUaGUgcm91dGluZy1jb25maWcgZW50cnkgdGhpcyBzb3VyY2Ugd2FzIGJ1aWx0IGZyb20gKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpLiBJdHMgYHR5cGVgIGRlY2lkZXMgZmFzdC13cml0ZSBmbHVzaCB0aW1pbmc6IHR5cGUtXCJyZW1vdGVcIiBkb3duc3RyZWFtIHNvdXJjZXMgKG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzKSBmbHVzaCBxdWlja2x5IChjaGVhcCwgYW5kIHdlIHdhbnQgY3Jvc3Mtbm9kZSByZWR1bmRhbmN5IGZhc3QpLCB3aGlsZSBvdGhlcnMgKGUuZy4gYmFja2JsYXplKSBrZWVwIHRoZSBmdWxsIHdyaXRlRGVsYXkgc28gZXhwZW5zaXZlIGV4dGVybmFsIHdyaXRlcyBzdGF5IGNvYWxlc2NlZC4gVGhlIHdpbmRvdy9yb3V0ZSBPTiB0aGlzIGNvbmZpZyBhcmUgdGhlIFNPVVJDRSdzIG93bjsgQXJjaGl2ZXNTb3VyY2UudmFsaWRXaW5kb3cvcm91dGUgYXJlIHdoYXQgdGhlIG93bmluZyBzdG9yZSBhY3R1YWxseSB1c2VzIChyb3V0ZSBpcyBpbnRlcnNlY3RlZCB3aXRoIHRoZSBzdG9yZSdzIHJvdXRlKS5cbiAgICBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7XG4gICAgLy8gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSB1bmRlcmx5aW5nIGVuZHBvaW50IChpdHMgY29uZmlnIHdpdGggd2luZG93cy9yb3V0ZXMgc3RyaXBwZWQpIC0gaG93IEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzIHJlY29nbml6ZXMgYSBzb3VyY2UgYWNyb3NzIGNvbmZpZyBjaGFuZ2VzIHNvIGl0IGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiByZW1vdmluZyBhbmQgcmUtYWRkaW5nIGl0XG4gICAgaWRlbnRpdHk/OiBzdHJpbmc7XG59O1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSByZWFjaGVzIGl0IG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvd3MgKHRoZSBjbGllbnQgcmVzb2x2ZWQgaXRzIHRhcmdldCwgdGhlbiB0aW1lIGNyb3NzZWQgYSB3aW5kb3cgYm91bmRhcnkgYmVmb3JlIHRoZSB3cml0ZSBsYW5kZWQpLiBDbGllbnRzIGRldGVjdCB0aGlzIG1hcmtlciBhbmQgcmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5LXZhbGlkIHNvdXJjZSwgcmV0cnlpbmcgT05DRSAtIGJvdW5kYXJpZXMgYXJlIGZhciBhcGFydCwgc28gaGl0dGluZyBpdCB0d2ljZSBpbiBvbmUgYXR0ZW1wdCBtZWFucyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgd3JvbmcuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cgPSBcIlJFTU9URV9TVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV19hN2MxZjA0ZVwiO1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSdzIGtleSByb3V0ZXMgb3V0c2lkZSB0aGUgc2hhcmRzIHRoaXMgc2VydmVyIGhhbmRsZXMgKHRoZSBjbGllbnQncyBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIC0gY2xpZW50cyByZS1yZXNvbHZlIG9uY2UpXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19ST1VURSA9IFwiUkVNT1RFX1NUT1JBR0VfV1JPTkdfUk9VVEVfYzk0ZDJlMTdcIjtcblxuZXhwb3J0IGNvbnN0IEZVTExfUk9VVEU6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMV07XG5cbi8vIEEga2V5IGNvbnRhaW5pbmcgdGhpcyBzZW50aW5lbCBkb2Vzbid0IGhhdmUgYSBmaXhlZCBzaGFyZDogc2V0VmFyaWFibGVTaGFyZCBwaWNrcyB0aGUgKGxvd2VzdCBsYXRlbmN5LCB1cCkgd3JpdGUgc2hhcmQsIGFwcGVuZHMgXCJfPHZhbHVlIGluIHRoZSBzaGFyZCdzIHJvdXRlPlwiIGRpcmVjdGx5IGFmdGVyIHRoZSBzZW50aW5lbCwgYW5kIHJldHVybnMgdGhlIG1hdGVyaWFsaXplZCBrZXkuIGdldFJvdXRlIHRyZWF0cyB0aGF0IHN1ZmZpeCBhcyBhIGNvbXBsZXRlIHJvdXRlIG92ZXJyaWRlLlxuZXhwb3J0IGNvbnN0IFZBUklBQkxFX1NIQVJEID0gXCJWQVJJQUJMRV9TSEFSRF9mMDIzNGpmYWgwOGZneWhmZ3lzc2Rkczgzbm1wXCI7XG4vLyBObyBncmFjZSBwYXN0IHRoZSBlbmQ6IGEgd2luZG93IGJvdW5kYXJ5IGlzIGEgaGFyZCBoYW5kb2ZmIChjbGllbnRzIHJldHJ5IGEgcmVqZWN0ZWQgd3JpdGUgYWdhaW5zdCB0aGUgbmV3bHktdmFsaWQgc291cmNlLCBzbyBsZW5pZW5jeSBoZXJlIHdvdWxkIG9ubHkgZGVzeW5jaHJvbml6ZSB0aGUgaGFuZG9mZilcbi8vICAtIFdyaXRpbmcgdG8gb2xkZXIgdmFsaWQgc3RhdGUgd2luZG93cyBpcyBmaW5lLCB0aG91Z2guIFdlIG5lZWQgdGhpcyB0byBpbmdlc3QgdGhlIG9sZCBkYXRhIHdoZW4gd2UncmUgc3luY2hyb25pemluZyBub2RlcyB0byBnZXQgdGhlbSB1cCB0byBkYXRlIGFueXdheS4gXG5leHBvcnQgZnVuY3Rpb24gd2luZG93QWNjZXB0c1dyaXRlcyh2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsaWRXaW5kb3cpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB2YWxpZFdpbmRvd1sxXSA+IERhdGUubm93KCk7XG59XG4vLyBBIHNvdXJjZSAod2hpY2ggY2FuIGhvbGQgc2V2ZXJhbCB3aW5kb3dzKSBhY2NlcHRzIHdyaXRlcyB3aGlsZSBBTlkgb2YgaXRzIHdpbmRvd3MgaXMgc3RpbGwgb3Blbi4gTm8gd2luZG93cyA9IHRoZSBiYXNlIGRpc2sgb2YgYW4gaW5lcnQgc3RvcmUgKG5vdCBpbiB0aGUgY29uZmlnKSwgd2hpY2ggbmV2ZXIgcmVjZWl2ZXMgZmFuLW91dCB3cml0ZXMgYW55d2F5LlxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsaWRXaW5kb3dzLnNvbWUod2luZG93QWNjZXB0c1dyaXRlcyk7XG59XG5cbi8vIEFib3ZlIHRoaXMsIHNldCB0cmFuc3BhcmVudGx5IHN0cmVhbXMgdGhyb3VnaCBzZXRMYXJnZUZpbGU6IG9uZSBnaWFudCB3aXJlIG1lc3NhZ2Ugd291bGQgZXhjZWVkIHRoZSB0cmFuc3BvcnQgbGltaXQgYW5kIGxhZyBldmVyeSBvdGhlciBjbGllbnQgc2hhcmluZyB0aGUgY29ubmVjdGlvblxuZXhwb3J0IGNvbnN0IExBUkdFX1NFVF9USFJFU0hPTEQgPSA4ICogMTAyNCAqIDEwMjQ7XG5cbi8qKiBUaGUgc2V0TGFyZ2VGaWxlIHN0cmVhbSBvdmVyIGFuIGluLW1lbW9yeSBidWZmZXIsIGluIExBUkdFX1NFVF9USFJFU0hPTEQgc2xpY2VzIC0gaG93IHNldCB0cmFuc3BhcmVudGx5IGJlY29tZXMgc2V0TGFyZ2VGaWxlIGZvciBsYXJnZSBidWZmZXJzLiBTcHJlYWQgaW50byB0aGUgY29uZmlnOiBpdCBwcm92aWRlcyBib3RoIGdldE5leHREYXRhIGFuZCByZXN0YXJ0U3RyZWFtICh0aGUgYnVmZmVyIGlzIHN0aWxsIGhlbGQsIHNvIGEgcmV0cnkgY29zdHMgbm90aGluZykuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyQ2h1bmtTdHJlYW0oZGF0YTogQnVmZmVyKTogeyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD47IHJlc3RhcnRTdHJlYW0oKTogdm9pZCB9IHtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXROZXh0RGF0YTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBkYXRhLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBjaHVuayA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9TRVRfVEhSRVNIT0xEKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gY2h1bms7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RhcnRTdHJlYW06ICgpID0+IHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuLy8gUmUtZXhwb3J0ZWQgZm9yIHRoZSBleGlzdGluZyBpbXBvcnRlcnMgLSB0aGUgaW1wbGVtZW50YXRpb25zIChhbmQgbW92ZUFyY2hpdmVGaWxlKSBsaXZlIGluIGFyY2hpdmVIZWxwZXJzLnRzLCBiZXNpZGUgdGhpcyBpbnRlcmZhY2UgcmF0aGVyIHRoYW4gaW4gaXRcbmV4cG9ydCB7IGNvcHlBcmNoaXZlRmlsZSB9IGZyb20gXCIuL2FyY2hpdmVIZWxwZXJzXCI7XG5cbi8qKiBtb3ZlJ3MgY29uZmlnLiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gbGFzdE1vZGlmaWVkOiB0aGUgZGVzdGluYXRpb24gaXMgQUxXQVlTIHN0YW1wZWQgZnJlc2ggKHNlZSBJQXJjaGl2ZXMubW92ZSkgLSBhIG1vdmUgaXMgYSBuZXcgd3JpdGUgYXQgdGhlIG5ldyBwYXRoLCBhbmQgYSBwcmVzZXJ2ZWQgb2xkIHN0YW1wIGlzIGhvdyBhIG1vdmVkIGZpbGUgbG9zZXMgdG8gYSBzdGFsZSB0b21ic3RvbmUgdGhlcmUgYW5kIHZhbmlzaGVzLiAqL1xuZXhwb3J0IHR5cGUgTW92ZUZpbGVDb25maWcgPSB7XG4gICAgZnJvbVBhdGg6IHN0cmluZztcbiAgICB0b1BhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzU3luY1NvdXJjZVN0YXR1cyA9IHtcbiAgICBkZWJ1Z05hbWU6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGJvb2xlYW47XG4gICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBGaWxlcyBzZWVuIGluIHRoaXMgc291cmNlJ3Mgc2NhbnMgLyBjaGFuZ2UgcG9sbHMgc28gZmFyXG4gICAgc2Nhbm5lZENvdW50OiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTeW5jU3RhdHVzID0ge1xuICAgIGFsbFNjYW5zQ29tcGxldGU6IGJvb2xlYW47XG4gICAgLy8gTnVtYmVyIG9mIGZpbGVzIGluIHRoZSBpbmRleFxuICAgIGluZGV4U2l6ZTogbnVtYmVyO1xuICAgIHNvdXJjZXM6IEFyY2hpdmVzU3luY1NvdXJjZVN0YXR1c1tdO1xufTtcblxuLy8gTk9URTogV2UgZG9uJ3QgcHJlc2VudGx5IGhhdmUgYW4gYXBwZW5kIGZ1bmN0aW9uIGhlcmUgYmVjYXVzZSBhIHN1cnByaXNpbmcgbnVtYmVyIG9mIHN0b3JhZ2Ugc3lzdGVtcyBkb24ndCBzdXBwb3J0IGl0IChiYWNrYmxhemUsIGZpbGUgc3lzdGVtIGFwaSkuIEl0IHdvdWxkIGFsc28gY29tcGxpY2F0ZSB0aGluZ3MgYXMgbm93IHRoZXJlIG5lZWRzIHRvIGJlIHJlYWxseSBhIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggb2YgYSBmaWxlLCBhbmQgaWYgeW91IGFwcGVuZCB0byB0aGUgd3Jvbmcgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCwgdGhpbmdzIGp1c3QgYmVjb21lIHZlcnkgY29tcGxpY2F0ZWQuIFxuZXhwb3J0IGludGVyZmFjZSBJQXJjaGl2ZXMge1xuICAgIGdldERlYnVnTmFtZSgpOiBzdHJpbmc7XG4gICAgLyoqIFdoZXRoZXIgd3JpdGVzIHdvdWxkIGJlIGFjY2VwdGVkIChjcmVkZW50aWFscyBleGlzdCwgdGhlIGFjY291bnQgdHJ1c3RzIHRoaXMgbWFjaGluZSwgZXRjKS4gQ2hlY2tlZCB3aXRob3V0IHdyaXRpbmcgYW55dGhpbmcuICovXG4gICAgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhdXRvbWF0aWNhbGx5IGZhbGwgYmFjayBhY3Jvc3MgdGhlIHJlZHVuZGFudCBzb3VyY2VzIHVubGVzcyBjb25maWcubm9GYWxsYmFja3MgaXMgc2V0LlxuICAgICAqIEEgZmFsbGJhY2sgY29weSBjYW4gbGFnIHRoZSB3cml0ZSB0YXJnZXQsIHNvIGEgY2FsbGVyIHJlYWRpbmcgc3RhdGUgaW4gb3JkZXIgdG8gbXV0YXRlIGl0XG4gICAgICogKGUuZy4geCsrKSwgd2hlcmUgYWN0aW5nIG9uIHByZXZpb3VzIHN0YXRlIHdvdWxkIGNhdXNlIGJpZyBpc3N1ZXMsIHNob3VsZCBwYXNzIG5vRmFsbGJhY2tzIC1cbiAgICAgKiBhbmQgdHJ5L2NhdGNoIHRoZSByZWFkLCBoYW5kbGluZyB0aGUgY2F0Y2ggY2FzZSAoYSBkb3duIHByaW1hcnkgaXMgcmV0cmllZCBmb3IgYSB3aGlsZSwgdGhlblxuICAgICAqIHRocm93cyBpbnN0ZWFkIG9mIGRlZ3JhZGluZyB0byBhIHN0YWxlIGNvcHkpLlxuICAgICAqL1xuICAgIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD47XG4gICAgLyoqIFNlZSBnZXQgZm9yIHRoZSBmYWxsYmFjayBzZW1hbnRpY3MgKGFuZCB3aGVuIHRvIHBhc3Mgbm9GYWxsYmFja3MpLiB1cmwgaXMgdGhlIGNvbmZpZyBVUkwgb2YgdGhlIHNvdXJjZSB0aGF0IGFuc3dlcmVkIC0gdGhlIGF1dGhvcml0eSB0aGUgZGF0YSAob3IgdGhlIFwiZG9lcyBub3QgZXhpc3RcIikgY2FtZSBmcm9tLiBNdWx0aS1zb3VyY2UgaW1wbGVtZW50YXRpb25zIChBcmNoaXZlc0NoYWluKSBBTFdBWVMgcmV0dXJuIGFuIG9iamVjdDogd2hlbiB0aGUgdmFsdWUgZG9lc24ndCBleGlzdCB0aGVyZSBpcyBzdGlsbCBhIHNlcnZlciBzYXlpbmcgaXQgZG9lc24ndCBleGlzdCwgc28gdGhleSByZXR1cm4geyB1cmwgfSBhbG9uZSByYXRoZXIgdGhhbiB1bmRlZmluZWQuIFNpbmdsZS1zb3VyY2UgYmFja2VuZHMgcmV0dXJuIHVuZGVmaW5lZCBmb3IgYWJzZW50ICh0aGV5IEFSRSB0aGUgYXV0aG9yaXR5KS4gKi9cbiAgICBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybD86IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+O1xuICAgIC8qKlxuICAgICAqIGxhc3RNb2RpZmllZCBzdGFtcHMgdGhlIHdyaXRlIHdpdGggdGhhdCBsYXN0LXdyaXRlIHRpbWUgaW5zdGVhZCBvZiBub3cuIElmIGl0IGlzIE9MREVSIHRoYW5cbiAgICAgKiB0aGUgZmlsZSdzIGN1cnJlbnQgbGFzdC13cml0ZSB0aW1lIHRoZSB3cml0ZSBuby1vcHMgKHNvIGRlbGF5ZWQgLyBzeW5jaHJvbml6ZWQgd3JpdGVzIGNhblxuICAgICAqIG5ldmVyIGNsb2JiZXIgbmV3ZXIgZGF0YSkuIFRpbWVzIG1vcmUgdGhhbiAxNSBtaW51dGVzIGluIHRoZSBmdXR1cmUgYXJlIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgZnVsbCBrZXkgYWN0dWFsbHkgd3JpdHRlbiAtIGlkZW50aWNhbCB0byBmaWxlTmFtZSwgRVhDRVBUIGZvciBrZXlzIGNvbnRhaW5pbmdcbiAgICAgKiBWQVJJQUJMRV9TSEFSRCwgd2hlcmUgdGhlIHNoYXJkIHZhbHVlIGlzIG1hdGVyaWFsaXplZCBpbnRvIHRoZSBrZXkgKHBpY2tlZCBieSBzaGFyZCBsYXRlbmN5LFxuICAgICAqIHNlZSBBcmNoaXZlc0NoYWluKSBhbmQgdGhlIGNhbGxlciBuZWVkcyB0aGUgcmV0dXJuZWQga2V5IHRvIGV2ZXIgcmVhZCB0aGUgdmFsdWUgYmFjay5cbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBUSFJPV1Mgb24gYW4gZW1wdHkgYnVmZmVyOiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gKHRoZSB0b21ic3RvbmUpLCBzbyBhXG4gICAgICogc2V0LWVtcHR5IHdvdWxkIHJlYWQgYmFjayBhcyBcInRoZSBmaWxlIGlzIGdvbmVcIiAtIHdoaWNoIGlzIGp1c3QgYXNraW5nIGZvciBwcm9ibGVtcy4gSWYgeW91XG4gICAgICogd2FudCB0aGUgZmlsZSBkZWxldGVkLCBjYWxsIGRlbDsgZGVsZXRpb25zIHRha2UgdGhlaXIgb3duIHBhdGguXG4gICAgICovXG4gICAgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIGRlbChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBEZWxDb25maWcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiBNb3ZlcyBhIGZpbGUgdG8gYSBuZXcgcGF0aCB3aXRoaW4gVEhJUyBhcmNoaXZlcywgYmFja2VuZC1zaWRlIHdoZXJlIHRoZSBiYWNrZW5kIGNhbiAoYmFja2JsYXplIGNvcGllcyBzZXJ2ZXItc2lkZSwgZGlzayByZW5hbWVzLCB0aGUgc3RvcmFnZSBzZXJ2ZXIgcmVsb2NhdGVzIG5vZGUtc2lkZSkgLSB0aGUgYnl0ZXMgbmV2ZXIgdHJhdmVsIHRocm91Z2ggdGhlIGNhbGxlci4gVGhlIGRlc3RpbmF0aW9uIGlzIHN0YW1wZWQgd2l0aCBhIEZSRVNIIHdyaXRlIHRpbWUsIGV2ZW4gd2hlbiB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24gKGEgcmVuYW1lKSB3b3VsZCBwcmVzZXJ2ZSB0aGUgb2xkIG9uZSwgc28gdGhlIG1vdmVkIGZpbGUgY2Fubm90IGltbWVkaWF0ZWx5IGxvc2UgdG8gc29tZXRoaW5nIG5ld2VyIHNpdHRpbmcgYXQgaXRzIG5ldyBwYXRoIChlLmcuIHRoZSB0b21ic3RvbmUgb2YgYW4gZWFybGllciBkZWxldGlvbiB0aGVyZSk7IHRoZSBzb3VyY2UgaXMgdGhlbiBkZWxldGVkLCBleGFjdGx5IGxpa2UgZGVsLiBUSFJPV1Mgd2hlbiB0aGUgc291cmNlIGZpbGUgZG9lcyBub3QgZXhpc3QuIE9wdGlvbmFsIC0gY2FsbGVycyBnbyB0aHJvdWdoIG1vdmVBcmNoaXZlRmlsZSAoYXJjaGl2ZUhlbHBlcnMudHMpLCB3aGljaCBmYWxscyBiYWNrIHRvIGNvcHkgKyBjb25maXJtICsgZGVsZXRlLiAqL1xuICAgIG1vdmU/KGNvbmZpZzogTW92ZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiBTdHJlYW1zIGEgZmlsZSB0b28gbGFyZ2UgdG8gaG9sZCBpbiBtZW1vcnkuIGdldE5leHREYXRhIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gZG9uZS4gVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCB3aGVuIHlvdSBDQU5OT1QgbWF0ZXJpYWxpemUgdGhlIGVudGlyZSBmaWxlIGluIG1lbW9yeSAtIGlmIHlvdSBjYW4sIGp1c3QgY2FsbCBzZXQ6IGFib3ZlIExBUkdFX1NFVF9USFJFU0hPTEQgaXQgc3RyZWFtcyB0aHJvdWdoIHNldExhcmdlRmlsZSBpbnRlcm5hbGx5LCBrZWVwaW5nIHRoZSBjbGllbnQgcmVzcG9uc2l2ZSBhbmQgbm90IG92ZXJ3aGVsbWluZyB0aGUgc2VydmVyLiBUaGUgcmVzdCBvZiB0aGUgY29uZmlnIGlzIGEgcGxhaW4gU2V0Q29uZmlnIGFuZCBtZWFucyBleGFjdGx5IHdoYXQgaXQgbWVhbnMgb24gc2V0ICh0aGF0IGlzIHdoYXQgbWFrZXMgYSBsYXJnZSBzZXQgYmVoYXZlIGxpa2UgYSBzbWFsbCBvbmUgaW5zdGVhZCBvZiBxdWlldGx5IGxvc2luZyBpbW11dGFiaWxpdHksIG9yZGVyaW5nLCBpbnRlcm5hbCwgb3IgZmFsbGJhY2tzIHNlbWFudGljcyBhcyB0aGUgZmlsZSBjcm9zc2VzIHRoZSB0aHJlc2hvbGQpOyBiYWNrZW5kcyB0aGF0IHN0YW1wIHRoZWlyIG93biB0aW1lcyAoYmFja2JsYXplKSBhY2NlcHQgYW5kIGlnbm9yZSBsYXN0TW9kaWZpZWQuIFRIUk9XUyB3aGVuIHRoZSBzdHJlYW0gcHJvZHVjZXMgbm8gZGF0YSBhdCBhbGwgLSBzYW1lIHJ1bGUgYXMgc2V0OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nLiAqL1xuICAgIHNldExhcmdlRmlsZShjb25maWc6IFNldExhcmdlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIHdyaXRlVGltZSBpcyB0aGUgbGFzdC13cml0ZSB0aW1lIOKAlCBzZWUgQXJjaGl2ZUZpbGVJbmZvLmNyZWF0ZVRpbWUsIHdoaWNoIGlzIHRoZSBzYW1lIHZhbHVlLiB1cmwgYXMgaW4gZ2V0Mi4gU2l6ZS0wIGVudHJpZXMgKHRvbWJzdG9uZXMpIHJlcG9ydCB1bmRlZmluZWQgdW5sZXNzIGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcy4gKi9cbiAgICBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ+O1xuICAgIC8qKlxuICAgICAqIEVtcHR5IChzaXplLTApIGZpbGVzIGFyZSBORVZFUiByZXR1cm5lZCBieSBpbmRleC1iYWNrZWQgc3RvcmVzIChCbG9iU3RvcmUsIGFuZCB0aGVyZWZvcmUgdGhlXG4gICAgICogY2hhaW4pOiBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlIC0gdGhlIHRvbWJzdG9uZSBvZiBhIGRlbGV0aW9uLiBJZiB5b3Ugd2FudCBhIG1hcmtlclxuICAgICAqIGZpbGUgdGhhdCBzaG93cyB1cCBpbiBsaXN0aW5ncywgYWRkIHNvbWUgY29udGVudCB0byBpdC4gUmF3IHNvdXJjZXMgKGRpc2ssIGJhY2tibGF6ZSkgRE8gbGlzdFxuICAgICAqIHRoZWlyIGVtcHR5IGZpbGVzIC0gdGhhdCBpcyBob3cgc2NhbnMgbGVhcm4gb2YgZGVsZXRpb25zIC0gYnV0IG5vdGhpbmcgYnVpbHQgb24gdGhlIGluZGV4XG4gICAgICogZXZlciBzdXJmYWNlcyB0aGVtLlxuICAgICAqL1xuICAgIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgICAvKiogU2VlIGZpbmQgZm9yIHRoZSBlbXB0eS1maWxlICh0b21ic3RvbmUpIHJ1bGUuICovXG4gICAgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICAvKiogT25seSB3b3JrcyBmb3IgcHVibGljIGJ1Y2tldHMgKHByaXZhdGUgYnVja2V0cyBhcmUgQVBJLWFjY2VzcyBvbmx5KS4gKi9cbiAgICBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgYnVja2V0J3MgY29uZmlndXJhdGlvbiwgd2hpY2ggdGVsbHMgd2hldGhlciB0aGUgb3B0aW9uYWwgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuICovXG4gICAgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+O1xuICAgIC8qKlxuICAgICAqIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIGNvbmZpZy50aW1lLCBvcHRpb25hbGx5IHJlc3RyaWN0ZWQgdG8ga2V5cyByb3V0aW5nIGludG8gb25lIG9mXG4gICAgICogY29uZmlnLnJvdXRlcyAodXNlZCBieSBzY2FubmluZywgc28gcGFydGlhbGx5LW92ZXJsYXBwaW5nIHNoYXJkcyBvbmx5IHJlY2VpdmUgdGhlaXIgc2xpY2UpLlxuICAgICAqIFdoZW4gZ2V0Q29uZmlnKCkuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIHRoaXMgaXMgYmFja2VkIGJ5IGFuIGluZGV4IChmYXN0LCBhbmQgZGVsZXRpb25zIEFSRVxuICAgICAqIHJlcG9ydGVkLCBhcyBzaXplLTAgdG9tYnN0b25lIGVudHJpZXMpLiBFdmVyeSBvdGhlciBiYWNrZW5kIGVtdWxhdGVzIGl0OiBhIGZ1bGwgZmluZEluZm9cbiAgICAgKiBsaXN0aW5nIGZpbHRlcmVkIGluIG1lbW9yeSAtIGNvcnJlY3QsIGJ1dCBubyBjaGVhcGVyIHRoYW4gdGhlIGxpc3RpbmcgaXRzZWxmLlxuICAgICAqL1xuICAgIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICAvKiogU3luY2hyb25pemF0aW9uIGludHJvc3BlY3Rpb24sIGZvciBiYWNrZW5kcyB0aGF0IHN5bmNocm9uaXplIGZyb20gc291cmNlcyAoc2VlIEJsb2JTdG9yZSkuICovXG4gICAgZ2V0U3luY1N0YXR1cz8oKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+O1xufVxuIl19
|
|
60
|
+
/* _JS_SOURCE_HASH = "9b32f9bb675bc61c1946f81468a648a73741d637e993f16bffc43e0f0423af2e"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.getFileStorageIndexDB = void 0;
|
|
4
4
|
const caching_1 = require("socket-function/src/caching");
|
|
@@ -145,4 +145,4 @@ exports.getFileStorageIndexDB = (0, caching_1.lazy)(async () => {
|
|
|
145
145
|
return new VirtualFileStorage(db, "/");
|
|
146
146
|
});
|
|
147
147
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZXhlZERCRmlsZUZvbGRlckFQSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkluZGV4ZWREQkZpbGVGb2xkZXJBUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQW1EO0FBSW5ELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBT3JCLE1BQU0sa0JBQWtCO0lBR3BCLFlBQ0ksRUFBZSxFQUNDLEVBQVU7UUFBVixPQUFFLEdBQUYsRUFBRSxDQUFRO1FBOEc5QixtQ0FBbUM7UUFDbkMsV0FBTSxHQUFHO1lBQ0wsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFXLEVBQW9CLEVBQUU7Z0JBQzVDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUVELFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBVyxFQUF3QixFQUFFO2dCQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Z0JBQ3BDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxhQUFhLEVBQUUsS0FBSyxFQUFFLEdBQVcsRUFBaUIsRUFBRTtnQkFDaEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRSxNQUFNLE1BQU0sQ0FBQyxL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Q0FBQyxNQUFNLENBQUM7WUFDckQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0MsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgSVN0b3JhZ2VSYXcgfSBmcm9tIFwiLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2UgfSBmcm9tIFwiLi9GaWxlRm9sZGVyQVBJXCI7XG5cbmNvbnN0IERCX05BTUUgPSBcIkZpbGVTdG9yYWdlXCI7XG5jb25zdCBTVE9SRV9OQU1FID0gXCJmaWxlc1wiO1xuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmludGVyZmFjZSBGaWxlUmVjb3JkIHtcbiAgICBkYXRhOiBCdWZmZXI7XG4gICAgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG59XG5cbmNsYXNzIFZpcnR1YWxGaWxlU3RvcmFnZSBpbXBsZW1lbnRzIEZpbGVTdG9yYWdlIHtcbiAgICBwcml2YXRlIGRiOiBJREJEYXRhYmFzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBkYjogSURCRGF0YWJhc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGlmICghZGIpIGRlYnVnZ2VyO1xuICAgICAgICB0aGlzLmRiID0gZGI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdG9yZShtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUgPSBcInJlYWRvbmx5XCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsIG1vZGUpO1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0PFQ+KHJlcXVlc3Q6IElEQlJlcXVlc3Q8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLy8gSVN0b3JhZ2VSYXcgaW1wbGVtZW50YXRpb25cbiAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuZ2V0U3RvcmUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0PEZpbGVSZWNvcmQgfCB1bmRlZmluZWQ+KHN0b3JlLmdldCh0aGlzLmlkICsga2V5KSk7XG4gICAgICAgIGxldCBiYWRCdWZmZXIgPSByZXN1bHQ/LmRhdGE7XG4gICAgICAgIGlmIChiYWRCdWZmZXIpIGJhZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhZEJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBiYWRCdWZmZXI7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UmFuZ2Uoa2V5OiBzdHJpbmcsIGNvbmZpZzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgZnVsbEJ1ZmZlciA9IGF3YWl0IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgIGlmICghZnVsbEJ1ZmZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGZ1bGxCdWZmZXIuc3ViYXJyYXkoY29uZmlnLnN0YXJ0LCBjb25maWcuZW5kKTtcbiAgICB9XG5cbiAgICBhc3luYyBhcHBlbmQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmdldFN0b3JlKFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMuaWQgKyBrZXk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5yZXF1ZXN0PEZpbGVSZWNvcmQgfCB1bmRlZmluZWQ+KHN0b3JlLmdldChmdWxsUGF0aCkpO1xuXG4gICAgICAgIGNvbnN0IG5ld1JlY29yZDogRmlsZVJlY29yZCA9IHtcbiAgICAgICAgICAgIGRhdGE6IGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgPyBCdWZmZXIuY29uY2F0KFtleGlzdGluZy5kYXRhLCB2YWx1ZV0pXG4gICAgICAgICAgICAgICAgOiB2YWx1ZSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKVxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChzdG9yZS5wdXQobmV3UmVjb3JkLCBmdWxsUGF0aCkpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuZ2V0U3RvcmUoXCJyZWFkd3JpdGVcIik7XG4gICAgICAgIGNvbnN0IHJlY29yZDogRmlsZVJlY29yZCA9IHtcbiAgICAgICAgICAgIGRhdGE6IHZhbHVlLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChzdG9yZS5wdXQocmVjb3JkLCB0aGlzLmlkICsga2V5KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5nZXRTdG9yZShcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHN0b3JlLmRlbGV0ZSh0aGlzLmlkICsga2V5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRLZXlzV2l0aFByZWZpeChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmdldFN0b3JlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQocHJlZml4LCBwcmVmaXggKyBcIlxcdWZmZmZcIiwgZmFsc2UsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLm9wZW5DdXJzb3IocmFuZ2UpO1xuXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3IgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdLZXkgPSBjdXJzb3Iua2V5IGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgbmV3S2V5ID0gbmV3S2V5LnNsaWNlKHRoaXMuaWQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKG5ld0tleSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoa2V5cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBrZXlzID0gYXdhaXQgdGhpcy5nZXRLZXlzV2l0aFByZWZpeCh0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIGtleXMuZmlsdGVyKHggPT4gIXguaW5jbHVkZXMoXCIvXCIpKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKTogUHJvbWlzZTx7IHNpemU6IG51bWJlcjsgbGFzdE1vZGlmaWVkOiBudW1iZXI7IH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmdldFN0b3JlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdDxGaWxlUmVjb3JkIHwgdW5kZWZpbmVkPihzdG9yZS5nZXQodGhpcy5pZCArIGtleSkpO1xuXG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHJlc3VsdC5sYXN0TW9kaWZpZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGtleXMgPSBhd2FpdCB0aGlzLmdldEtleXNXaXRoUHJlZml4KHRoaXMuaWQpO1xuICAgICAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5lc3RlZEZpbGVTdG9yYWdlIGltcGxlbWVudGF0aW9uXG4gICAgZm9sZGVyID0ge1xuICAgICAgICBoYXNLZXk6IGFzeW5jIChrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9sZGVyUGF0aCA9IHRoaXMuaWQgKyBrZXkgKyBcIi9cIjtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLmdldEtleXNXaXRoUHJlZml4KGZvbGRlclBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoID4gMDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRTdG9yYWdlOiBhc3luYyAoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdG9yYWdlPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gdGhpcy5pZCArIGtleSArIFwiL1wiO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWaXJ0dWFsRmlsZVN0b3JhZ2UodGhpcy5kYiwgbmV3UGF0aCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlU3RvcmFnZTogYXN5bmMgKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBsZXQgbmVzdGVkID0gbmV3IFZpcnR1YWxGaWxlU3RvcmFnZSh0aGlzLmRiLCB0aGlzLmlkICsga2V5ICsgXCIvXCIpO1xuICAgICAgICAgICAgYXdhaXQgbmVzdGVkLnJlc2V0KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0S2V5czogYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgICAgICAgICAgIGxldCBrZXlzID0gYXdhaXQgdGhpcy5nZXRLZXlzV2l0aFByZWZpeCh0aGlzLmlkKTtcbiAgICAgICAgICAgIGxldCBmb2xkZXJLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFwiL1wiKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnRzID0ga2V5LnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgICAgICBmb2xkZXJLZXlzLmFkZChwYXJ0c1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmb2xkZXJLZXlzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlU3RvcmFnZUluZGV4REIgPSBsYXp5KGFzeW5jICgpOiBQcm9taXNlPEZpbGVTdG9yYWdlPiA9PiB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCBuZXcgUHJvbWlzZTxJREJEYXRhYmFzZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oREJfTkFNRSwgREJfVkVSU0lPTik7XG5cbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuXG4gICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFZpcnR1YWxGaWxlU3RvcmFnZShkYiwgXCIvXCIpO1xufSk7Il19
|
|
148
|
-
/* _JS_SOURCE_HASH = "
|
|
148
|
+
/* _JS_SOURCE_HASH = "35575d7b40168300db97c6a012ddab111b6b1f19daab4bd2d621c420b88e500f"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.JSONStorage = void 0;
|
|
4
4
|
class JSONStorage {
|
|
@@ -39,4 +39,4 @@ class JSONStorage {
|
|
|
39
39
|
}
|
|
40
40
|
exports.JSONStorage = JSONStorage;
|
|
41
41
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSlNPTlN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJKU09OU3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFhLFdBQVc7SUFDcEIsWUFBb0IsT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7SUFBSSxDQUFDO0lBQzNDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUN4QixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFRO1FBQ2xDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNNLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBVztRQUMzQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDTSxLQUFLLENBQUMsT0FBTztRQUNoQixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ00sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFXO1FBQzVCLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBR00sV0FBVyxDQUFDLFFBQW9COztRQUNuQyxNQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sRUFBQyxXQUFXLG1EQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNkLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0o7QUFsQ0Qsa0NBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVN0b3JhZ2UgfSBmcm9tIFwiLi9JU3RvcmFnZVwiO1xuXG5leHBvcnQgY2xhc3MgSlNPTlN0b3JhZ2U8VD4gaW1wbGVtZW50cyBJU3RvcmFnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yYWdlOiBJU3RvcmFnZTxCdWZmZXI+KSB7IH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWZmZXIgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KGtleSk7XG4gICAgICAgIGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSBKU09OIGZvciBrZXk6ICR7a2V5fWAsIGJ1ZmZlci50b1N0cmluZygpLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2V0KGtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0S2V5cygpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLmdldEluZm8oa2V5KTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyB3YXRjaFJlc3luYyhjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3JhZ2Uud2F0Y2hSZXN5bmM/LihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UucmVzZXQoKTtcbiAgICB9XG59Il19
|
|
42
|
-
/* _JS_SOURCE_HASH = "
|
|
42
|
+
/* _JS_SOURCE_HASH = "f03428270acaeee0f8ce5c36431ab07129e822c838b99d45a1a085eb16bfaf86"; */
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
+
//exports.LogMap = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const caching_1 = require("socket-function/src/caching");
|
|
10
|
+
// A persistent Map that knows about time and about deletions. Every value carries the time it was written, so a write that arrives out of order is simply not applied - the map cannot be made to go backwards. A deleted key keeps its time too, as a tombstone in a second map, so "was this deleted, and when" is as cheap to ask as "does this exist", and expiring old tombstones is a walk of the tombstones alone rather than of everything.
|
|
11
|
+
//
|
|
12
|
+
// On disk it is one append-only log of the sets, deletes and purges that produced both maps, rewritten from them whenever it has grown to several times their size.
|
|
13
|
+
// The log is rewritten once it holds this many times more records than there are keys (a log of 3 records per surviving key is mostly history)
|
|
14
|
+
const COMPACT_RATIO = 3;
|
|
15
|
+
// ...but never for a small log, where the rewrite would cost more than the history it removes
|
|
16
|
+
const MIN_COMPACT_RECORDS = 1000;
|
|
17
|
+
// Appends are coalesced for this long. A crash loses at most this much - the callers of this class treat their data as reconstructible - and the alternative is a file write per set.
|
|
18
|
+
const FLUSH_DELAY = 500;
|
|
19
|
+
class LogMap {
|
|
20
|
+
constructor(filePath) {
|
|
21
|
+
this.filePath = filePath;
|
|
22
|
+
this.values = new Map();
|
|
23
|
+
this.deleted = new Map();
|
|
24
|
+
// Records the log holds (written plus pending) - what compaction is decided against, NOT the number of keys
|
|
25
|
+
this.logRecords = 0;
|
|
26
|
+
this.pending = [];
|
|
27
|
+
// Serializes everything that touches the file, so an append can never interleave with a rewrite
|
|
28
|
+
this.writeChain = Promise.resolve();
|
|
29
|
+
/** Reads the log and replays it into memory. Every other method assumes this has finished. */
|
|
30
|
+
this.load = (0, caching_1.lazy)(async () => {
|
|
31
|
+
let data;
|
|
32
|
+
try {
|
|
33
|
+
data = await fs_1.default.promises.readFile(this.filePath, "utf8");
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
if (e.code === "ENOENT")
|
|
37
|
+
return;
|
|
38
|
+
throw e;
|
|
39
|
+
}
|
|
40
|
+
let applied = 0;
|
|
41
|
+
let damaged = 0;
|
|
42
|
+
for (let line of data.split("\n")) {
|
|
43
|
+
if (!line)
|
|
44
|
+
continue;
|
|
45
|
+
let record;
|
|
46
|
+
try {
|
|
47
|
+
record = JSON.parse(line);
|
|
48
|
+
}
|
|
49
|
+
catch (_a) {
|
|
50
|
+
// A crash mid-append leaves a torn final line; anything earlier means real damage. Either way the rest of the log is still worth having - this is an index, and scanning rebuilds whatever we lose.
|
|
51
|
+
damaged++;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
applied++;
|
|
55
|
+
// Replayed through the same ordering rules that produced it, so a log written out of order still lands on the same state
|
|
56
|
+
if (record.p) {
|
|
57
|
+
this.values.delete(record.k);
|
|
58
|
+
this.deleted.delete(record.k);
|
|
59
|
+
}
|
|
60
|
+
else if (record.d) {
|
|
61
|
+
this.applyDelete(record.k, record.t, record.t);
|
|
62
|
+
}
|
|
63
|
+
else if (record.v !== undefined) {
|
|
64
|
+
this.applySet(record.k, record.v, record.t, record.t);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
this.logRecords = applied;
|
|
68
|
+
if (damaged) {
|
|
69
|
+
console.error(`${damaged} damaged record(s) in ${this.filePath} were skipped; ${applied} applied, leaving ${this.values.size} values and ${this.deleted.size} tombstones`);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
this.directory = (0, caching_1.lazy)(async () => {
|
|
73
|
+
await fs_1.default.promises.mkdir(path_1.default.dirname(this.filePath), { recursive: true });
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** The live value, or undefined when the key does not exist here (deleted included - a deletion is an absence, see getDeleted for its time). */
|
|
77
|
+
get(key) {
|
|
78
|
+
return this.values.get(key);
|
|
79
|
+
}
|
|
80
|
+
/** When the key was deleted, if it was. Absent both here and in get means we have never heard of it. */
|
|
81
|
+
getDeleted(key) {
|
|
82
|
+
return this.deleted.get(key);
|
|
83
|
+
}
|
|
84
|
+
/** The time the key last changed either way, or 0 if we have never heard of it - what a new write has to beat. */
|
|
85
|
+
timeOf(key) {
|
|
86
|
+
var _a;
|
|
87
|
+
let live = this.values.get(key);
|
|
88
|
+
if (live)
|
|
89
|
+
return live.time;
|
|
90
|
+
return ((_a = this.deleted.get(key)) === null || _a === void 0 ? void 0 : _a.time) || 0;
|
|
91
|
+
}
|
|
92
|
+
/** O(1), and counts only what exists. */
|
|
93
|
+
get size() {
|
|
94
|
+
return this.values.size;
|
|
95
|
+
}
|
|
96
|
+
get deletedSize() {
|
|
97
|
+
return this.deleted.size;
|
|
98
|
+
}
|
|
99
|
+
/** Live values only. Live, in insertion order - deleting during iteration is safe (JS skips entries removed before they are reached), which is what the passes that walk everything and prune as they go rely on. */
|
|
100
|
+
entries() {
|
|
101
|
+
return this.values.entries();
|
|
102
|
+
}
|
|
103
|
+
/** The tombstones, which is a much smaller walk than the values - so expiring them, or listing what was deleted since some time, costs what it should. */
|
|
104
|
+
deletedEntries() {
|
|
105
|
+
return this.deleted.entries();
|
|
106
|
+
}
|
|
107
|
+
/** Stores a value as of `time`. Returns false when something at least as new is already here, in which case nothing changed - an out-of-order write is not an error, it is just late. */
|
|
108
|
+
set(key, value, time) {
|
|
109
|
+
if (!this.applySet(key, value, time, Date.now()))
|
|
110
|
+
return false;
|
|
111
|
+
this.append({ k: key, t: time, v: value });
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
/** Deletes as of `time`, keeping the tombstone. Returns false when something at least as new is already here. */
|
|
115
|
+
delete(key, time) {
|
|
116
|
+
if (!this.applyDelete(key, time, Date.now()))
|
|
117
|
+
return false;
|
|
118
|
+
this.append({ k: key, t: time, d: 1 });
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
/** Forgets the key entirely, tombstone included - for a tombstone old enough that nobody needs to hear about the deletion any more, and for an entry that turned out never to have existed. Not a deletion: it leaves nothing behind to propagate. */
|
|
122
|
+
purge(key) {
|
|
123
|
+
let had = this.values.delete(key);
|
|
124
|
+
had = this.deleted.delete(key) || had;
|
|
125
|
+
if (!had)
|
|
126
|
+
return;
|
|
127
|
+
this.append({ k: key, t: Date.now(), p: 1 });
|
|
128
|
+
}
|
|
129
|
+
applySet(key, value, time, changedAt) {
|
|
130
|
+
if (time < this.timeOf(key))
|
|
131
|
+
return false;
|
|
132
|
+
this.deleted.delete(key);
|
|
133
|
+
this.values.set(key, { value, time, changedAt });
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
applyDelete(key, time, changedAt) {
|
|
137
|
+
if (time < this.timeOf(key))
|
|
138
|
+
return false;
|
|
139
|
+
this.values.delete(key);
|
|
140
|
+
this.deleted.set(key, { time, changedAt });
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
append(record) {
|
|
144
|
+
this.pending.push(JSON.stringify(record));
|
|
145
|
+
this.logRecords++;
|
|
146
|
+
this.scheduleFlush();
|
|
147
|
+
}
|
|
148
|
+
scheduleFlush() {
|
|
149
|
+
var _a, _b;
|
|
150
|
+
if (this.flushTimer !== undefined)
|
|
151
|
+
return;
|
|
152
|
+
this.flushTimer = setTimeout(() => {
|
|
153
|
+
this.flushTimer = undefined;
|
|
154
|
+
void this.flush().catch((e) => { var _a; return console.error(`Flushing ${this.filePath} failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
155
|
+
}, FLUSH_DELAY);
|
|
156
|
+
(_b = (_a = this.flushTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
157
|
+
}
|
|
158
|
+
/** Writes everything pending (rewriting the log first if it has grown too far past what it describes). */
|
|
159
|
+
async flush() {
|
|
160
|
+
let result = this.writeChain.then(() => this.write());
|
|
161
|
+
// The chain only exists to serialize writes, so it must not stay rejected: a failure belongs to the caller that asked for this flush, not to every flush after it
|
|
162
|
+
this.writeChain = result.catch(() => { });
|
|
163
|
+
await result;
|
|
164
|
+
}
|
|
165
|
+
async write() {
|
|
166
|
+
if (this.logRecords > Math.max(MIN_COMPACT_RECORDS, (this.values.size + this.deleted.size) * COMPACT_RATIO)) {
|
|
167
|
+
await this.compact();
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
await this.appendPending();
|
|
171
|
+
}
|
|
172
|
+
async appendPending() {
|
|
173
|
+
if (!this.pending.length)
|
|
174
|
+
return;
|
|
175
|
+
let records = this.pending;
|
|
176
|
+
this.pending = [];
|
|
177
|
+
await this.directory();
|
|
178
|
+
try {
|
|
179
|
+
await fs_1.default.promises.appendFile(this.filePath, records.join("\n") + "\n");
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
// Put them back rather than lose them: the values are still in memory, so all that is at risk is having to rebuild them by scanning
|
|
183
|
+
this.pending = records.concat(this.pending);
|
|
184
|
+
this.scheduleFlush();
|
|
185
|
+
throw e;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Rewrites the log as the current contents of both maps. They are the truth - the log only exists to rebuild them - so the snapshot IS the new log.
|
|
189
|
+
async compact() {
|
|
190
|
+
let records = [];
|
|
191
|
+
for (let [key, entry] of this.values) {
|
|
192
|
+
records.push(JSON.stringify({ k: key, t: entry.time, v: entry.value }));
|
|
193
|
+
}
|
|
194
|
+
for (let [key, tombstone] of this.deleted) {
|
|
195
|
+
records.push(JSON.stringify({ k: key, t: tombstone.time, d: 1 }));
|
|
196
|
+
}
|
|
197
|
+
// Cleared with the snapshot: every pending record is already reflected in the maps, so the snapshot contains it. Anything appended from here on is NOT in the snapshot, and lands in the new log after the rename.
|
|
198
|
+
this.pending = [];
|
|
199
|
+
let startedWith = this.logRecords;
|
|
200
|
+
let tempPath = `${this.filePath}.compacting`;
|
|
201
|
+
await this.directory();
|
|
202
|
+
await fs_1.default.promises.writeFile(tempPath, records.length && `${records.join("\n")}\n` || "");
|
|
203
|
+
// Replaces the old log in one step, so a crash leaves either the whole old log or the whole new one
|
|
204
|
+
await fs_1.default.promises.rename(tempPath, this.filePath);
|
|
205
|
+
this.logRecords = records.length + this.pending.length;
|
|
206
|
+
console.log(`Rewrote ${this.filePath}: ${startedWith} log records for ${this.values.size} values and ${this.deleted.size} tombstones`);
|
|
207
|
+
await this.appendPending();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.LogMap = LogMap;
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nTWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTG9nTWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBRW5ELG9iQUFvYjtBQUNwYixFQUFFO0FBQ0Ysb0tBQW9LO0FBRXBLLCtJQUErSTtBQUMvSSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIsOEZBQThGO0FBQzlGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLHNMQUFzTDtBQUN0TCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFrQnhCLE1BQWEsTUFBTTtJQUNmLFlBQW9CLFFBQWdCO1FBQWhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFFNUIsV0FBTSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQ3hDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQUNsRCw0R0FBNEc7UUFDcEcsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFFL0IsZ0dBQWdHO1FBQ3hGLGVBQVUsR0FBa0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXRELDhGQUE4RjtRQUN2RixTQUFJLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7WUFDMUIsSUFBSSxJQUFZLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNELElBQUksR0FBRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsSUFBSyxDQUF1QixDQUFDLElBQUksS0FBSyxRQUFRO29CQUFFLE9BQU87Z0JBQ3ZELE1BQU0sQ0FBQyxDQUFDO1lBQ1osQ0FBQztZQUNELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJ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bXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcblxuLy8gQSBwZXJzaXN0ZW50IE1hcCB0aGF0IGtub3dzIGFib3V0IHRpbWUgYW5kIGFib3V0IGRlbGV0aW9ucy4gRXZlcnkgdmFsdWUgY2FycmllcyB0aGUgdGltZSBpdCB3YXMgd3JpdHRlbiwgc28gYSB3cml0ZSB0aGF0IGFycml2ZXMgb3V0IG9mIG9yZGVyIGlzIHNpbXBseSBub3QgYXBwbGllZCAtIHRoZSBtYXAgY2Fubm90IGJlIG1hZGUgdG8gZ28gYmFja3dhcmRzLiBBIGRlbGV0ZWQga2V5IGtlZXBzIGl0cyB0aW1lIHRvbywgYXMgYSB0b21ic3RvbmUgaW4gYSBzZWNvbmQgbWFwLCBzbyBcIndhcyB0aGlzIGRlbGV0ZWQsIGFuZCB3aGVuXCIgaXMgYXMgY2hlYXAgdG8gYXNrIGFzIFwiZG9lcyB0aGlzIGV4aXN0XCIsIGFuZCBleHBpcmluZyBvbGQgdG9tYnN0b25lcyBpcyBhIHdhbGsgb2YgdGhlIHRvbWJzdG9uZXMgYWxvbmUgcmF0aGVyIHRoYW4gb2YgZXZlcnl0aGluZy5cbi8vXG4vLyBPbiBkaXNrIGl0IGlzIG9uZSBhcHBlbmQtb25seSBsb2cgb2YgdGhlIHNldHMsIGRlbGV0ZXMgYW5kIHB1cmdlcyB0aGF0IHByb2R1Y2VkIGJvdGggbWFwcywgcmV3cml0dGVuIGZyb20gdGhlbSB3aGVuZXZlciBpdCBoYXMgZ3Jvd24gdG8gc2V2ZXJhbCB0aW1lcyB0aGVpciBzaXplLlxuXG4vLyBUaGUgbG9nIGlzIHJld3JpdHRlbiBvbmNlIGl0IGhvbGRzIHRoaXMgbWFueSB0aW1lcyBtb3JlIHJlY29yZHMgdGhhbiB0aGVyZSBhcmUga2V5cyAoYSBsb2cgb2YgMyByZWNvcmRzIHBlciBzdXJ2aXZpbmcga2V5IGlzIG1vc3RseSBoaXN0b3J5KVxuY29uc3QgQ09NUEFDVF9SQVRJTyA9IDM7XG4vLyAuLi5idXQgbmV2ZXIgZm9yIGEgc21hbGwgbG9nLCB3aGVyZSB0aGUgcmV3cml0ZSB3b3VsZCBjb3N0IG1vcmUgdGhhbiB0aGUgaGlzdG9yeSBpdCByZW1vdmVzXG5jb25zdCBNSU5fQ09NUEFDVF9SRUNPUkRTID0gMTAwMDtcbi8vIEFwcGVuZHMgYXJlIGNvYWxlc2NlZCBmb3IgdGhpcyBsb25nLiBBIGNyYXNoIGxvc2VzIGF0IG1vc3QgdGhpcyBtdWNoIC0gdGhlIGNhbGxlcnMgb2YgdGhpcyBjbGFzcyB0cmVhdCB0aGVpciBkYXRhIGFzIHJlY29uc3RydWN0aWJsZSAtIGFuZCB0aGUgYWx0ZXJuYXRpdmUgaXMgYSBmaWxlIHdyaXRlIHBlciBzZXQuXG5jb25zdCBGTFVTSF9ERUxBWSA9IDUwMDtcblxuLyoqIEEgbGl2ZSB2YWx1ZTogd2hhdCB3YXMgc3RvcmVkLCB3aGVuIGl0IHdhcyB3cml0dGVuICh0aGUgY2FsbGVyJ3Mgb3JkZXJpbmcpLCBhbmQgd2hlbiB3ZSBsYXN0IGNoYW5nZWQgaXQgKG91cnMpLiAqL1xuZXhwb3J0IHR5cGUgTG9nRW50cnk8VD4gPSB7IHZhbHVlOiBUOyB0aW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH07XG4vKiogQSBkZWxldGVkIGtleTogd2hlbiBpdCB3YXMgZGVsZXRlZCwgYW5kIHdoZW4gd2UgbGVhcm5lZC4gVGhlIHZhbHVlIGlzIGdvbmU7IHRoZSB0aW1lIGlzIHRoZSBwb2ludCBvZiBhIHRvbWJzdG9uZS4gKi9cbmV4cG9ydCB0eXBlIExvZ1RvbWJzdG9uZSA9IHsgdGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9O1xuXG4vLyBPbmUgbGluZSBvZiB0aGUgbG9nLiBKU09OLnN0cmluZ2lmeSBlc2NhcGVzIG5ld2xpbmVzIGluc2lkZSBrZXlzIGFuZCB2YWx1ZXMsIHNvIGEgcmVjb3JkIGNhbiBuZXZlciBjb250YWluIHRoZSBzZXBhcmF0b3IuXG50eXBlIExvZ1JlY29yZDxUPiA9IHtcbiAgICBrOiBzdHJpbmc7XG4gICAgLy8gVGhlIGNhbGxlcidzIHRpbWUgZm9yIHRoaXMgY2hhbmdlIC0gd2hhdCBvcmRlcmluZyBpcyBkZWNpZGVkIGJ5XG4gICAgdDogbnVtYmVyO1xuICAgIC8vIEEgc2V0IGNhcnJpZXMgdGhlIHZhbHVlOyBhIGRlbGV0ZSBjYXJyaWVzIGQ7IGEgcHVyZ2UgY2FycmllcyBwIChmb3JnZXQgdGhlIGtleSBlbnRpcmVseSwgdG9tYnN0b25lIGluY2x1ZGVkKVxuICAgIHY/OiBUO1xuICAgIGQ/OiAxO1xuICAgIHA/OiAxO1xufTtcblxuZXhwb3J0IGNsYXNzIExvZ01hcDxUPiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgdmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIExvZ0VudHJ5PFQ+PigpO1xuICAgIHByaXZhdGUgZGVsZXRlZCA9IG5ldyBNYXA8c3RyaW5nLCBMb2dUb21ic3RvbmU+KCk7XG4gICAgLy8gUmVjb3JkcyB0aGUgbG9nIGhvbGRzICh3cml0dGVuIHBsdXMgcGVuZGluZykgLSB3aGF0IGNvbXBhY3Rpb24gaXMgZGVjaWRlZCBhZ2FpbnN0LCBOT1QgdGhlIG51bWJlciBvZiBrZXlzXG4gICAgcHJpdmF0ZSBsb2dSZWNvcmRzID0gMDtcbiAgICBwcml2YXRlIHBlbmRpbmc6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXJpYWxpemVzIGV2ZXJ5dGhpbmcgdGhhdCB0b3VjaGVzIHRoZSBmaWxlLCBzbyBhbiBhcHBlbmQgY2FuIG5ldmVyIGludGVybGVhdmUgd2l0aCBhIHJld3JpdGVcbiAgICBwcml2YXRlIHdyaXRlQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIC8qKiBSZWFkcyB0aGUgbG9nIGFuZCByZXBsYXlzIGl0IGludG8gbWVtb3J5LiBFdmVyeSBvdGhlciBtZXRob2QgYXNzdW1lcyB0aGlzIGhhcyBmaW5pc2hlZC4gKi9cbiAgICBwdWJsaWMgbG9hZCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZGF0YTogc3RyaW5nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRoaXMuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKChlIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcHBsaWVkID0gMDtcbiAgICAgICAgbGV0IGRhbWFnZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGRhdGEuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgICAgICAgIGlmICghbGluZSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcmVjb3JkOiBMb2dSZWNvcmQ8VD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IEpTT04ucGFyc2UobGluZSkgYXMgTG9nUmVjb3JkPFQ+O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gQSBjcmFzaCBtaWQtYXBwZW5kIGxlYXZlcyBhIHRvcm4gZmluYWwgbGluZTsgYW55dGhpbmcgZWFybGllciBtZWFucyByZWFsIGRhbWFnZS4gRWl0aGVyIHdheSB0aGUgcmVzdCBvZiB0aGUgbG9nIGlzIHN0aWxsIHdvcnRoIGhhdmluZyAtIHRoaXMgaXMgYW4gaW5kZXgsIGFuZCBzY2FubmluZyByZWJ1aWxkcyB3aGF0ZXZlciB3ZSBsb3NlLlxuICAgICAgICAgICAgICAgIGRhbWFnZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGxpZWQrKztcbiAgICAgICAgICAgIC8vIFJlcGxheWVkIHRocm91Z2ggdGhlIHNhbWUgb3JkZXJpbmcgcnVsZXMgdGhhdCBwcm9kdWNlZCBpdCwgc28gYSBsb2cgd3JpdHRlbiBvdXQgb2Ygb3JkZXIgc3RpbGwgbGFuZHMgb24gdGhlIHNhbWUgc3RhdGVcbiAgICAgICAgICAgIGlmIChyZWNvcmQucCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLmRlbGV0ZShyZWNvcmQuayk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkLmRlbGV0ZShyZWNvcmQuayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseURlbGV0ZShyZWNvcmQuaywgcmVjb3JkLnQsIHJlY29yZC50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTZXQocmVjb3JkLmssIHJlY29yZC52LCByZWNvcmQudCwgcmVjb3JkLnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nUmVjb3JkcyA9IGFwcGxpZWQ7XG4gICAgICAgIGlmIChkYW1hZ2VkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2RhbWFnZWR9IGRhbWFnZWQgcmVjb3JkKHMpIGluICR7dGhpcy5maWxlUGF0aH0gd2VyZSBza2lwcGVkOyAke2FwcGxpZWR9IGFwcGxpZWQsIGxlYXZpbmcgJHt0aGlzLnZhbHVlcy5zaXplfSB2YWx1ZXMgYW5kICR7dGhpcy5kZWxldGVkLnNpemV9IHRvbWJzdG9uZXNgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqIFRoZSBsaXZlIHZhbHVlLCBvciB1bmRlZmluZWQgd2hlbiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGhlcmUgKGRlbGV0ZWQgaW5jbHVkZWQgLSBhIGRlbGV0aW9uIGlzIGFuIGFic2VuY2UsIHNlZSBnZXREZWxldGVkIGZvciBpdHMgdGltZSkuICovXG4gICAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IExvZ0VudHJ5PFQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLmdldChrZXkpO1xuICAgIH1cbiAgICAvKiogV2hlbiB0aGUga2V5IHdhcyBkZWxldGVkLCBpZiBpdCB3YXMuIEFic2VudCBib3RoIGhlcmUgYW5kIGluIGdldCBtZWFucyB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIGl0LiAqL1xuICAgIHB1YmxpYyBnZXREZWxldGVkKGtleTogc3RyaW5nKTogTG9nVG9tYnN0b25lIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlZC5nZXQoa2V5KTtcbiAgICB9XG4gICAgLyoqIFRoZSB0aW1lIHRoZSBrZXkgbGFzdCBjaGFuZ2VkIGVpdGhlciB3YXksIG9yIDAgaWYgd2UgaGF2ZSBuZXZlciBoZWFyZCBvZiBpdCAtIHdoYXQgYSBuZXcgd3JpdGUgaGFzIHRvIGJlYXQuICovXG4gICAgcHVibGljIHRpbWVPZihrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCBsaXZlID0gdGhpcy52YWx1ZXMuZ2V0KGtleSk7XG4gICAgICAgIGlmIChsaXZlKSByZXR1cm4gbGl2ZS50aW1lO1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkLmdldChrZXkpPy50aW1lIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqIE8oMSksIGFuZCBjb3VudHMgb25seSB3aGF0IGV4aXN0cy4gKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLnNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZGVsZXRlZFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlZC5zaXplO1xuICAgIH1cbiAgICAvKiogTGl2ZSB2YWx1ZXMgb25seS4gTGl2ZSwgaW4gaW5zZXJ0aW9uIG9yZGVyIC0gZGVsZXRpbmcgZHVyaW5nIGl0ZXJhdGlvbiBpcyBzYWZlIChKUyBza2lwcyBlbnRyaWVzIHJlbW92ZWQgYmVmb3JlIHRoZXkgYXJlIHJlYWNoZWQpLCB3aGljaCBpcyB3aGF0IHRoZSBwYXNzZXMgdGhhdCB3YWxrIGV2ZXJ5dGhpbmcgYW5kIHBydW5lIGFzIHRoZXkgZ28gcmVseSBvbi4gKi9cbiAgICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIExvZ0VudHJ5PFQ+XT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuZW50cmllcygpO1xuICAgIH1cbiAgICAvKiogVGhlIHRvbWJzdG9uZXMsIHdoaWNoIGlzIGEgbXVjaCBzbWFsbGVyIHdhbGsgdGhhbiB0aGUgdmFsdWVzIC0gc28gZXhwaXJpbmcgdGhlbSwgb3IgbGlzdGluZyB3aGF0IHdhcyBkZWxldGVkIHNpbmNlIHNvbWUgdGltZSwgY29zdHMgd2hhdCBpdCBzaG91bGQuICovXG4gICAgcHVibGljIGRlbGV0ZWRFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgTG9nVG9tYnN0b25lXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkLmVudHJpZXMoKTtcbiAgICB9XG5cbiAgICAvKiogU3RvcmVzIGEgdmFsdWUgYXMgb2YgYHRpbWVgLiBSZXR1cm5zIGZhbHNlIHdoZW4gc29tZXRoaW5nIGF0IGxlYXN0IGFzIG5ldyBpcyBhbHJlYWR5IGhlcmUsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBjaGFuZ2VkIC0gYW4gb3V0LW9mLW9yZGVyIHdyaXRlIGlzIG5vdCBhbiBlcnJvciwgaXQgaXMganVzdCBsYXRlLiAqL1xuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBULCB0aW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcGx5U2V0KGtleSwgdmFsdWUsIHRpbWUsIERhdGUubm93KCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgazoga2V5LCB0OiB0aW1lLCB2OiB2YWx1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIERlbGV0ZXMgYXMgb2YgYHRpbWVgLCBrZWVwaW5nIHRoZSB0b21ic3RvbmUuIFJldHVybnMgZmFsc2Ugd2hlbiBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IGlzIGFscmVhZHkgaGVyZS4gKi9cbiAgICBwdWJsaWMgZGVsZXRlKGtleTogc3RyaW5nLCB0aW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcGx5RGVsZXRlKGtleSwgdGltZSwgRGF0ZS5ub3coKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyBrOiBrZXksIHQ6IHRpbWUsIGQ6IDEgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBGb3JnZXRzIHRoZSBrZXkgZW50aXJlbHksIHRvbWJzdG9uZSBpbmNsdWRlZCAtIGZvciBhIHRvbWJzdG9uZSBvbGQgZW5vdWdoIHRoYXQgbm9ib2R5IG5lZWRzIHRvIGhlYXIgYWJvdXQgdGhlIGRlbGV0aW9uIGFueSBtb3JlLCBhbmQgZm9yIGFuIGVudHJ5IHRoYXQgdHVybmVkIG91dCBuZXZlciB0byBoYXZlIGV4aXN0ZWQuIE5vdCBhIGRlbGV0aW9uOiBpdCBsZWF2ZXMgbm90aGluZyBiZWhpbmQgdG8gcHJvcGFnYXRlLiAqL1xuICAgIHB1YmxpYyBwdXJnZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgaGFkID0gdGhpcy52YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGhhZCA9IHRoaXMuZGVsZXRlZC5kZWxldGUoa2V5KSB8fCBoYWQ7XG4gICAgICAgIGlmICghaGFkKSByZXR1cm47XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgazoga2V5LCB0OiBEYXRlLm5vdygpLCBwOiAxIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlTZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBULCB0aW1lOiBudW1iZXIsIGNoYW5nZWRBdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aW1lIDwgdGhpcy50aW1lT2Yoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRlbGV0ZWQuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMudmFsdWVzLnNldChrZXksIHsgdmFsdWUsIHRpbWUsIGNoYW5nZWRBdCB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseURlbGV0ZShrZXk6IHN0cmluZywgdGltZTogbnVtYmVyLCBjaGFuZ2VkQXQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGltZSA8IHRoaXMudGltZU9mKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMuZGVsZXRlZC5zZXQoa2V5LCB7IHRpbWUsIGNoYW5nZWRBdCB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmQocmVjb3JkOiBMb2dSZWNvcmQ8VD4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnB1c2goSlNPTi5zdHJpbmdpZnkocmVjb3JkKSk7XG4gICAgICAgIHRoaXMubG9nUmVjb3JkcysrO1xuICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjaGVkdWxlRmx1c2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoVGltZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5mbHVzaCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRmx1c2hpbmcgJHt0aGlzLmZpbGVQYXRofSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgRkxVU0hfREVMQVkpO1xuICAgICAgICAodGhpcy5mbHVzaFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgcGVuZGluZyAocmV3cml0aW5nIHRoZSBsb2cgZmlyc3QgaWYgaXQgaGFzIGdyb3duIHRvbyBmYXIgcGFzdCB3aGF0IGl0IGRlc2NyaWJlcykuICovXG4gICAgcHVibGljIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy53cml0ZUNoYWluLnRoZW4oKCkgPT4gdGhpcy53cml0ZSgpKTtcbiAgICAgICAgLy8gVGhlIGNoYWluIG9ubHkgZXhpc3RzIHRvIHNlcmlhbGl6ZSB3cml0ZXMsIHNvIGl0IG11c3Qgbm90IHN0YXkgcmVqZWN0ZWQ6IGEgZmFpbHVyZSBiZWxvbmdzIHRvIHRoZSBjYWxsZXIgdGhhdCBhc2tlZCBmb3IgdGhpcyBmbHVzaCwgbm90IHRvIGV2ZXJ5IGZsdXNoIGFmdGVyIGl0XG4gICAgICAgIHRoaXMud3JpdGVDaGFpbiA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXJlY3RvcnkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKHRoaXMuZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ1JlY29yZHMgPiBNYXRoLm1heChNSU5fQ09NUEFDVF9SRUNPUkRTLCAodGhpcy52YWx1ZXMuc2l6ZSArIHRoaXMuZGVsZXRlZC5zaXplKSAqIENPTVBBQ1RfUkFUSU8pKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBhY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZFBlbmRpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFwcGVuZFBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZztcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgICAgIGF3YWl0IHRoaXMuZGlyZWN0b3J5KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5hcHBlbmRGaWxlKHRoaXMuZmlsZVBhdGgsIHJlY29yZHMuam9pbihcIlxcblwiKSArIFwiXFxuXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQdXQgdGhlbSBiYWNrIHJhdGhlciB0aGFuIGxvc2UgdGhlbTogdGhlIHZhbHVlcyBhcmUgc3RpbGwgaW4gbWVtb3J5LCBzbyBhbGwgdGhhdCBpcyBhdCByaXNrIGlzIGhhdmluZyB0byByZWJ1aWxkIHRoZW0gYnkgc2Nhbm5pbmdcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHJlY29yZHMuY29uY2F0KHRoaXMucGVuZGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXdyaXRlcyB0aGUgbG9nIGFzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGJvdGggbWFwcy4gVGhleSBhcmUgdGhlIHRydXRoIC0gdGhlIGxvZyBvbmx5IGV4aXN0cyB0byByZWJ1aWxkIHRoZW0gLSBzbyB0aGUgc25hcHNob3QgSVMgdGhlIG5ldyBsb2cuXG4gICAgcHJpdmF0ZSBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVjb3Jkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMudmFsdWVzKSB7XG4gICAgICAgICAgICByZWNvcmRzLnB1c2goSlNPTi5zdHJpbmdpZnkoeyBrOiBrZXksIHQ6IGVudHJ5LnRpbWUsIHY6IGVudHJ5LnZhbHVlIH0gc2F0aXNmaWVzIExvZ1JlY29yZDxUPikpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5kZWxldGVkKSB7XG4gICAgICAgICAgICByZWNvcmRzLnB1c2goSlNPTi5zdHJpbmdpZnkoeyBrOiBrZXksIHQ6IHRvbWJzdG9uZS50aW1lLCBkOiAxIH0gc2F0aXNmaWVzIExvZ1JlY29yZDxUPikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyZWQgd2l0aCB0aGUgc25hcHNob3Q6IGV2ZXJ5IHBlbmRpbmcgcmVjb3JkIGlzIGFscmVhZHkgcmVmbGVjdGVkIGluIHRoZSBtYXBzLCBzbyB0aGUgc25hcHNob3QgY29udGFpbnMgaXQuIEFueXRoaW5nIGFwcGVuZGVkIGZyb20gaGVyZSBvbiBpcyBOT1QgaW4gdGhlIHNuYXBzaG90LCBhbmQgbGFuZHMgaW4gdGhlIG5ldyBsb2cgYWZ0ZXIgdGhlIHJlbmFtZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgICAgIGxldCBzdGFydGVkV2l0aCA9IHRoaXMubG9nUmVjb3JkcztcbiAgICAgICAgbGV0IHRlbXBQYXRoID0gYCR7dGhpcy5maWxlUGF0aH0uY29tcGFjdGluZ2A7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlyZWN0b3J5KCk7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0ZW1wUGF0aCwgcmVjb3Jkcy5sZW5ndGggJiYgYCR7cmVjb3Jkcy5qb2luKFwiXFxuXCIpfVxcbmAgfHwgXCJcIik7XG4gICAgICAgIC8vIFJlcGxhY2VzIHRoZSBvbGQgbG9nIGluIG9uZSBzdGVwLCBzbyBhIGNyYXNoIGxlYXZlcyBlaXRoZXIgdGhlIHdob2xlIG9sZCBsb2cgb3IgdGhlIHdob2xlIG5ldyBvbmVcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHRlbXBQYXRoLCB0aGlzLmZpbGVQYXRoKTtcbiAgICAgICAgdGhpcy5sb2dSZWNvcmRzID0gcmVjb3Jkcy5sZW5ndGggKyB0aGlzLnBlbmRpbmcubGVuZ3RoO1xuICAgICAgICBjb25zb2xlLmxvZyhgUmV3cm90ZSAke3RoaXMuZmlsZVBhdGh9OiAke3N0YXJ0ZWRXaXRofSBsb2cgcmVjb3JkcyBmb3IgJHt0aGlzLnZhbHVlcy5zaXplfSB2YWx1ZXMgYW5kICR7dGhpcy5kZWxldGVkLnNpemV9IHRvbWJzdG9uZXNgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBlbmRQZW5kaW5nKCk7XG4gICAgfVxufVxuIl19
|
|
212
|
+
/* _JS_SOURCE_HASH = "aeba79c00c289c774d94ca3a91c2d66c41614210f4534b7e06025a13d8e8cf00"; */
|