sliftutils 1.7.20 → 1.7.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +15 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesRemote.d.ts +3 -1
- package/storage/remoteStorage/ArchivesRemote.ts +2 -2
- package/storage/remoteStorage/createArchives.d.ts +1 -0
- package/storage/remoteStorage/createArchives.ts +38 -7
- package/storage/remoteStorage/deployTakeover.d.ts +4 -0
- package/storage/remoteStorage/deployTakeover.ts +9 -0
- package/storage/remoteStorage/dist/blobStore.ts.cache +16 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +14 -3
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +73 -39
- package/storage/remoteStorage/dist/storageServerState.ts.cache +22 -9
- package/storage/remoteStorage/sourceWrapper.d.ts +4 -0
- package/storage/remoteStorage/sourceWrapper.ts +11 -1
- package/storage/remoteStorage/storageController.d.ts +3 -1
- package/storage/remoteStorage/storageController.ts +7 -2
- package/yarn.lock +4 -4
package/index.d.ts
CHANGED
|
@@ -2871,7 +2871,9 @@ declare module "sliftutils/storage/remoteStorage/ArchivesRemote" {
|
|
|
2871
2871
|
private lastDeniedLog;
|
|
2872
2872
|
getDebugName(): string;
|
|
2873
2873
|
isConnected(): boolean;
|
|
2874
|
-
ping(): Promise<
|
|
2874
|
+
ping(): Promise<{
|
|
2875
|
+
takeover?: string;
|
|
2876
|
+
}>;
|
|
2875
2877
|
private authenticate;
|
|
2876
2878
|
private callAuthed;
|
|
2877
2879
|
waitingForAccess(): Promise<{
|
|
@@ -3185,6 +3187,7 @@ declare module "sliftutils/storage/remoteStorage/createArchives" {
|
|
|
3185
3187
|
getDebugName(): string;
|
|
3186
3188
|
private getState;
|
|
3187
3189
|
private init;
|
|
3190
|
+
private createChainSource;
|
|
3188
3191
|
private buildSources;
|
|
3189
3192
|
private startConfigPoll;
|
|
3190
3193
|
private configRefreshInFlight;
|
|
@@ -3295,6 +3298,10 @@ declare module "sliftutils/storage/remoteStorage/deployTakeover" {
|
|
|
3295
3298
|
* of the deploy overlap points at the alternate port. Pure, in-memory only - the stored routing
|
|
3296
3299
|
* config is never modified, and this must never be applied to data that gets persisted. */
|
|
3297
3300
|
export declare function applyDeployRemap(routing: RemoteConfig): RemoteConfig;
|
|
3301
|
+
/** A stamp of the current remap interpretation, advertised in ping responses - so every connected
|
|
3302
|
+
* client learns of a takeover within one ping interval, instead of waiting for its config poll
|
|
3303
|
+
* or a write rejection. */
|
|
3304
|
+
export declare function getTakeoverStamp(): string | undefined;
|
|
3298
3305
|
/** For the dying process: fast-write flush delays must never extend past this time, and after it
|
|
3299
3306
|
* fast writes flush immediately - so nothing is left in memory when the write window transfers. */
|
|
3300
3307
|
export declare function getFlushDeadline(): number | undefined;
|
|
@@ -3375,6 +3382,10 @@ declare module "sliftutils/storage/remoteStorage/sourceWrapper" {
|
|
|
3375
3382
|
private pings;
|
|
3376
3383
|
private pingTimer;
|
|
3377
3384
|
private loggedConnected;
|
|
3385
|
+
private lastTakeoverStamp;
|
|
3386
|
+
/** Fired when the source's advertised takeover stamp changes (a deploy takeover started or
|
|
3387
|
+
* ended) - the chain refreshes its config, so connected clients learn within one ping. */
|
|
3388
|
+
onServedConfigChanged: (() => void) | undefined;
|
|
3378
3389
|
/** Starts measuring this source's latency (for variable-shard target preference). Only hosted
|
|
3379
3390
|
* remotes are pinged; our own local server counts as 0, everything else as Infinity. */
|
|
3380
3391
|
startPinging(): void;
|
|
@@ -3428,7 +3439,9 @@ declare module "sliftutils/storage/remoteStorage/storageController" {
|
|
|
3428
3439
|
trustedMachines?: TrustRecord[];
|
|
3429
3440
|
};
|
|
3430
3441
|
export declare const RemoteStorageController: import("socket-function/SocketFunctionTypes").SocketRegistered<{
|
|
3431
|
-
ping: () => Promise<
|
|
3442
|
+
ping: () => Promise<{
|
|
3443
|
+
takeover?: string;
|
|
3444
|
+
}>;
|
|
3432
3445
|
authenticate: (token: AuthToken) => Promise<{
|
|
3433
3446
|
machineId: string;
|
|
3434
3447
|
ip: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.ellipsize = void 0;
|
|
4
4
|
module.allowclient = true;
|
|
@@ -10,4 +10,4 @@ function ellipsize(text, maxLength) {
|
|
|
10
10
|
}
|
|
11
11
|
exports.ellipsize = ellipsize;
|
|
12
12
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsU0FBZ0IsU0FBUyxDQUFDLElBQVksRUFBRSxTQUFpQjtJQUNyRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNoRCxDQUFDO0FBTEQsOEJBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZWxsaXBzaXplKHRleHQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIG1heExlbmd0aCAtIDMpICsgXCIuLi5cIjtcbn1cbiJdfQ==
|
|
13
|
-
/* _JS_SOURCE_HASH = "
|
|
13
|
+
/* _JS_SOURCE_HASH = "939b0010ad0403d8fcaea1dade14b758df80a31a6c0bd92352e5373b6bcdd033"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
/// <reference path="./node-forge-ed25519.d.ts" />
|
|
3
3
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
4
|
if (k2 === undefined) k2 = k;
|
|
@@ -463,4 +463,4 @@ function getOwnNodeIdAllowUndefined() {
|
|
|
463
463
|
}
|
|
464
464
|
exports.getOwnNodeIdAllowUndefined = getOwnNodeIdAllowUndefined;
|
|
465
465
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0RBQWtEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVsRCxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQiwrbkJBQStuQjtBQUMvbkIsc0lBQXNJO0FBRXRJLGlEQUFpRDtBQUVqRCx1RUFBK0Q7QUFDL0Qsa0RBQW9DO0FBR3BDLHlEQUEwRDtBQUUxRCwwREFBK0I7QUFDL0Isb0RBQTRCO0FBQzVCLDZEQUFpRTtBQUNqRSxtRUFBOEY7QUFDOUYsNkRBQWtIO0FBQ2xILG1FQUFnRTtBQUNoRSw2REFBMEU7QUFDMUUscUVBQXVEO0FBQ3ZELHdDQUF1QztBQUV2QyxJQUFBLHNCQUFPLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsSUFBQSxzQkFBTyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRW5ELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUV6QixRQUFBLGtCQUFrQixHQUFHLHNDQUFzQyxDQUFDO0FBRTVELFFBQUEsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO0FBR2pELFNBQVMsZ0JBQWdCLENBQUMsTUFBYztJQUNwQyxPQUFPLElBQUEsb0NBQVcsRUFBc0IsTUFBTSxFQUFFLDBCQUFrQixDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUlELFNBQWdCLGFBQWEsQ0FBQyxJQUFxQjtJQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLGdCQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RCxJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcs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RUFBRSxFQUFFLENBQUMsSUFBQSxjQUFJLEVBQUMsR0FBRyxFQUFFO0lBQzdELElBQUksRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixPQUFPLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVKLFNBQWdCLFlBQVk7SUFDeEIsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxhQUFhLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTkQsb0NBTUM7QUFFRCxTQUFnQiwwQkFBMEI7SUFDdEMsT0FBTywrQkFBYyxDQUFDLGFBQWEsQ0FBQztBQUN4QyxDQUFDO0FBRkQsZ0VBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9ub2RlLWZvcmdlLWVkMjU1MTkuZC50c1wiIC8+XG5cbm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbi8vIE5PVEU6IFdlIGNhbid0IHVzZSBjcnlwdG8uc3VidGxlIChub24tZXh0cmFjdGFibGUgQ3J5cHRvS2V5cykgZm9yIG91ciBrZXlzLCBiZWNhdXNlIHN1YnRsZSBpcyBhc3luY2hyb25vdXMsIGFuZCBldmVyeXRoaW5nIGhlcmUgKGtleSBnZW5lcmF0aW9uLCBjZXJ0IGNyZWF0aW9uLCBzaWduaW5nKSBtdXN0IGJlIGF2YWlsYWJsZSBzeW5jaHJvbm91c2x5LiBUaGUgb25seSByZWFsIGJlbmVmaXQgb2Ygc3VidGxlIGlzIHRoYXQgYSBjcm9zcy1zaXRlIHNjcmlwdGluZyBhdHRhY2sgY2FuJ3QgZXhmaWx0cmF0ZSB0aGUga2V5LiBXaGljaCwgd2hpbGUgbmljZSwgaXMgb2YgbWlub3IgYmVuZWZpdCwgYXMgdGhlIGNyb3NzLXNpdGUgc2NyaXB0IGNhbiBhbHJlYWR5IGRvIHF1aXRlIGEgYml0IG9mIGRhbWFnZSBhbnl3YXkgd2l0aCBhY2Nlc3MuIEFuZCBpZiB0aGF0IGhhcHBlbnMsIHRoZSBmaXJzdCB0aGluZyB0aGUgdXNlciBpcyBwcm9iYWJseSBnb2luZyB0byBkbyBpcyByZXNldCBhbGwgdGhlaXIgY3JlZGVudGlhbHMsIHdoaWNoIHNvbHZlcyB0aGUgY2FzZSBvZiB0aGUga2V5IGJlaW5nIGV4ZmlsdHJhdGVkIGFueXdheSAoYnkgdGVsbGluZyB0aGUgc2VydmVyIHRvIHN0b3AgdHJ1c3RpbmcgYWxsIGlkZW50aXRpZXMpLlxuLy8gTk9URTogV2UgYXJlIGp1c3Qgbm90IGdvaW5nIHRvIHN1cHBvcnQgSFRUUFMgYnJvd3NlciBjZXJ0cy4gT3VyIGNvZGUgaXMgcHVyZWx5IGZvciBpZGVudGlmaWNhdGlvbiwgYW5kIHNvIGl0IG9ubHkgc3VwcG9ydHMgRUQyNTUxOS5cblxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyODAjcGFnZS00MlxuXG5pbXBvcnQgeyBzZXRGbGFnIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL2NvbXBpbGVGbGFnc1wiO1xuaW1wb3J0ICogYXMgZm9yZ2UgZnJvbSBcIm5vZGUtZm9yZ2VcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBmc1N5bmMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBjYWNoZSwgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCBzaGEyNjUgZnJvbSBcImpzLXNoYTI1NlwiO1xuaW1wb3J0IGNyeXB0byBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyB0cnVzdENlcnRpZmljYXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2VydFN0b3JlXCI7XG5pbXBvcnQgeyBtZWFzdXJlQmxvY2ssIG1lYXN1cmVGbmMsIG1lYXN1cmVXcmFwIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvcHJvZmlsaW5nL21lYXN1cmVcIjtcbmltcG9ydCB7IGdldE5vZGVJZERvbWFpbiwgZ2V0Tm9kZUlkRG9tYWluTWF5YmVVbmRlZmluZWQsIGdldE5vZGVJZExvY2F0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbm9kZUNhY2hlXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IHJlc2V0QWxsTm9kZUNhbGxGYWN0b3JpZXMgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IGdldEtleVN0b3JlIH0gZnJvbSBcIi4vcGVyc2lzdGVudExvY2FsU3RvcmFnZVwiO1xuaW1wb3J0IHsgZWxsaXBzaXplIH0gZnJvbSBcIi4uL3N0cmluZ3NcIjtcblxuc2V0RmxhZyhyZXF1aXJlLCBcIm5vZGUtZm9yZ2VcIiwgXCJhbGxvd2NsaWVudFwiLCB0cnVlKTtcbnNldEZsYWcocmVxdWlyZSwgXCJqcy1zaGEyNTZcIiwgXCJhbGxvd2NsaWVudFwiLCB0cnVlKTtcblxuY29uc3QgdGltZUluRGF5ID0gMTAwMCAqIDYwICogNjAgKiAyNDtcblxuZXhwb3J0IGNvbnN0IENBX05PVF9GT1VORF9FUlJPUiA9IFwiMThhYTczMTgtZjg4Zi00ZDJkLWI0MWYtM2RhZjRhNDMzODI3XCI7XG5cbmV4cG9ydCBjb25zdCBpZGVudGl0eVN0b3JhZ2VLZXkgPSBcIm1hY2hpbmVDQV8xNFwiO1xuZXhwb3J0IHR5cGUgSWRlbnRpdHlTdG9yYWdlVHlwZSA9IHsgZG9tYWluOiBzdHJpbmc7IGNlcnRCNjQ6IHN0cmluZzsga2V5QjY0OiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gZ2V0SWRlbnRpdHlTdG9yZShkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRLZXlTdG9yZTxJZGVudGl0eVN0b3JhZ2VUeXBlPihkb21haW4sIGlkZW50aXR5U3RvcmFnZUtleSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWDUwOUtleVBhaXIgeyBkb21haW46IHN0cmluZzsgY2VydDogQnVmZmVyOyBrZXk6IEJ1ZmZlcjsgfVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uTmFtZShjZXJ0OiBCdWZmZXIgfCBzdHJpbmcpIHtcbiAgICBsZXQgc3ViamVjdCA9IG5ldyBjcnlwdG8uWDUwOUNlcnRpZmljYXRlKGNlcnQpLnN1YmplY3Q7XG4gICAgbGV0IHN1YmplY3RLVlBzID0gbmV3IE1hcChzdWJqZWN0LnNwbGl0KFwiLFwiKS5tYXAoeCA9PiB4LnRyaW0oKS5zcGxpdChcIj1cIikpLm1hcCh4ID0+IFt4WzBdLCB4LnNsaWNlKDEpLmpvaW4oXCI9XCIpXSkpO1xuICAgIGxldCBjb21tb25OYW1lID0gc3ViamVjdEtWUHMuZ2V0KFwiQ05cIik7XG4gICAgaWYgKCFjb21tb25OYW1lKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1vbiBuYW1lIGluIHN1YmplY3Q6ICR7c3ViamVjdH1gKTtcbiAgICByZXR1cm4gY29tbW9uTmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVg1MDkoXG4gICAgY29uZmlnOiB7XG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xuICAgICAgICBpc3N1ZXI6IFg1MDlLZXlQYWlyIHwgXCJzZWxmXCI7XG4gICAgICAgIGxpZmVTcGFuOiBudW1iZXI7XG4gICAgICAgIGtleVBhaXI6IHtcbiAgICAgICAgICAgIHB1YmxpY0tleTogZm9yZ2UuRWQyNTUxOVB1YmxpY0tleTtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IGZvcmdlLkVkMjU1MTlQcml2YXRlS2V5O1xuICAgICAgICB9O1xuICAgIH1cbik6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIGNyZWF0ZVg1MDkoKSB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgaXNzdWVyLCBsaWZlU3Bhbiwga2V5UGFpciB9ID0gY29uZmlnO1xuXG4gICAgICAgIGxldCBjZXJ0T2JqID0gZm9yZ2UucGtpLmNyZWF0ZUNlcnRpZmljYXRlKCk7XG4gICAgICAgIGNlcnRPYmoucHVibGljS2V5ID0ga2V5UGFpci5wdWJsaWNLZXkgYXMgdW5rbm93biBhcyBmb3JnZS5wa2kuUHVibGljS2V5O1xuICAgICAgICBjZXJ0T2JqLnNlcmlhbE51bWJlciA9IFwiMDFcIjtcbiAgICAgICAgLy8gR2l2ZSBpdCA1IG1pbnV0ZXMgYmVmb3JlIG5vdy4gSWYgd2UgZ2l2ZSBpdCB0b28gbXVjaCB0aW1lLCBpdCBjYW4gbG9vayBsaWtlIHRoZSBjZXJ0IGlzIHJlYWxseSBvbGQsIHdoaWNoIHdpbGwgdHJpZ2dlciB2YXJpb3VzIHByb2Nlc3NlcyB0byB0cnkgdG8gZ2V0IGEgZnJlc2hlciBvbmUgKGFzIGlmIGl0IGxhc3RzIGZvciAxIGhvdXIsIGJ1dCB3ZSBzZXQgbm90QmVmb3JlIHRvIDEgbW9udGggYWdvLCBpdCBsb29rcyAxIG1vbnRoIG9sZCwgYW5kIHNvIGFsbW9zdCBleHBpcmVkLCB3aGVuIGl0IGlzbid0Li4uKVxuICAgICAgICBjZXJ0T2JqLnZhbGlkaXR5Lm5vdEJlZm9yZSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAxMDAwICogNjAgKiA1KTtcbiAgICAgICAgY2VydE9iai52YWxpZGl0eS5ub3RBZnRlciA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBsaWZlU3Bhbik7XG5cbiAgICAgICAgY29uc3QgY29tbW9uTmFtZUF0dHJzID0gW3sgbmFtZTogXCJjb21tb25OYW1lXCIsIHZhbHVlOiBkb21haW4gfV07XG4gICAgICAgIGNlcnRPYmouc2V0U3ViamVjdChjb21tb25OYW1lQXR0cnMpO1xuXG4gICAgICAgIGlmIChpc3N1ZXIgPT09IFwic2VsZlwiKSB7XG4gICAgICAgICAgICBjZXJ0T2JqLnNldElzc3Vlcihjb21tb25OYW1lQXR0cnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VydE9iai5zZXRJc3N1ZXIoZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbVBlbShpc3N1ZXIuY2VydC50b1N0cmluZygpKS5zdWJqZWN0LmF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgaXNDQSA9IGlzc3VlciA9PT0gXCJzZWxmXCI7XG4gICAgICAgIGlmIChpc0NBKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zLnB1c2goeyBuYW1lOiBcImJhc2ljQ29uc3RyYWludHNcIiwgY0E6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxIb3N0RG9tYWluID0gXCIxMjctMC0wLTEuXCIgKyBkb21haW4uc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgICAgICBleHRlbnNpb25zLnB1c2goLi4uW1xuICAgICAgICAgICAgeyBuYW1lOiBcImtleVVzYWdlXCIsIGtleUNlcnRTaWduOiBpc0NBLCBkaWdpdGFsU2lnbmF0dXJlOiB0cnVlLCBub25SZXB1ZGlhdGlvbjogdHJ1ZSwga2V5RW5jaXBoZXJtZW50OiB0cnVlLCBkYXRhRW5jaXBoZXJtZW50OiB0cnVlIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwic3ViamVjdEtleUlkZW50aWZpZXJcIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic3ViamVjdEFsdE5hbWVcIixcbiAgICAgICAgICAgICAgICBhbHROYW1lczogW1xuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBkb21haW4gfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAyLCB2YWx1ZTogXCIqLlwiICsgZG9tYWluIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogMiwgdmFsdWU6IGxvY2FsSG9zdERvbWFpbiB9LFxuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBObyBsb25nZXIgYWxsb3cgMTI3LjAuMC4xICh7IHR5cGU6IDcsIGlwOiBcIjEyNy4wLjAuMVwiIH0pLCB0byBtYWtlIHRoaXMgbW9yZSBzZWN1cmUuIFdlIG1pZ2h0IGVuYWJsZSB0aGlzIGJlaGF2aW9yIGJlaGluZCBhIGZsYWcsIGZvciBkZXZlbG9wbWVudC5cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gTk9URTogbmFtZUNvbnN0cmFpbnRzIHJlcXVpcmUgb3VyIGZvcmtlZCBub2RlLWZvcmdlIChcIm5vZGUtZm9yZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3QvZm9yZ2UjZTYxODE4MWI0NjliMDdiZGM3MGI5NjhiMDM5MWJlYjhlZjVmZWNkNlwiKS4gQ2hyb21lIGlnbm9yZXMgdGhlbSAoaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTA3MjA4MyksIGJ1dCBvdXIgb3duIHZhbGlkYXRpb24gKHZhbGlkYXRlQ0FDZXJ0L3ZhbGlkYXRlQ2VydGlmaWNhdGUpIGVuZm9yY2VzIHRoZW0uXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJuYW1lQ29uc3RyYWludHNcIixcbiAgICAgICAgICAgICAgICBwZXJtaXR0ZWRTdWJ0cmVlczogW1xuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBmb3JnZS51dGlsLmVuY29kZVV0ZjgoZG9tYWluKSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBmb3JnZS51dGlsLmVuY29kZVV0ZjgobG9jYWxIb3N0RG9tYWluKSB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBjZXJ0T2JqLnNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7XG5cblxuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gc2lnbigpIHtcbiAgICAgICAgICAgIGlmIChpc3N1ZXIgPT09IFwic2VsZlwiKSB7XG4gICAgICAgICAgICAgICAgY2VydE9iai5zaWduKGtleVBhaXIucHJpdmF0ZUtleSBhcyBhbnkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZXJ0T2JqLnNpZ24oZm9yZ2UuZWQyNTUxOS5wcml2YXRlS2V5RnJvbVBlbShpc3N1ZXIua2V5LnRvU3RyaW5nKCkpIGFzIGFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtZWFzdXJlQmxvY2soZnVuY3Rpb24gdG9QZW1zKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgICAgICAgY2VydDogQnVmZmVyLmZyb20oZm9yZ2UucGtpLmNlcnRpZmljYXRlVG9QZW0oY2VydE9iaikpLFxuICAgICAgICAgICAgICAgIGtleTogQnVmZmVyLmZyb20ocHJpdmF0ZUtleVRvUGVtKGtleVBhaXIucHJpdmF0ZUtleSkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUtleVRvUGVtKGtleTogZm9yZ2UuRWQyNTUxOVByaXZhdGVLZXkpIHtcbiAgICByZXR1cm4gZm9yZ2UuZWQyNTUxOS5wcml2YXRlS2V5VG9QZW0oa2V5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNlcnQoUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcikge1xuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVGcm9tUGVtKG5vcm1hbGl6ZUNlcnRUb1BFTShQRU1vckRFUikpO1xufVxuXG5mdW5jdGlvbiBnZXRFRDI1NTE5UHVibGljS2V5KGNlcnRQYXJzZWQ6IGZvcmdlLnBraS5DZXJ0aWZpY2F0ZSk6IGZvcmdlLkVkMjU1MTlQdWJsaWNLZXkge1xuICAgIGxldCBwdWJsaWNLZXkgPSBjZXJ0UGFyc2VkLnB1YmxpY0tleTtcbiAgICBpZiAoIShcInB1YmxpY0tleUJ5dGVzXCIgaW4gcHVibGljS2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgRUQyNTUxOSBjZXJ0aWZpY2F0ZXMgYXJlIHN1cHBvcnRlZCwgdGhlIGNlcnRpZmljYXRlIHB1YmxpYyBrZXkgaXMgbm90IEVEMjU1MTkgKHN1YmplY3Q6ICR7Y2VydFBhcnNlZC5zdWJqZWN0LmdldEZpZWxkKFwiQ05cIik/LnZhbHVlfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHB1YmxpY0tleSBhcyB1bmtub3duIGFzIGZvcmdlLkVkMjU1MTlQdWJsaWNLZXk7XG59XG5cbi8vIEdldHMgYSB1bmlxdWUgdmFsdWUgdG8gcmVwcmVzZW50IHRoZSBwdWJsaWMga2V5XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHVibGljSWRlbnRpZmllcihQRU1vckRFUjogc3RyaW5nIHwgQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZ2V0RUQyNTUxOVB1YmxpY0tleShwYXJzZUNlcnQoUEVNb3JERVIpKS5wdWJsaWNLZXlCeXRlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBzaWduID0gbWVhc3VyZVdyYXAoZnVuY3Rpb24gc2lnbihrZXlQYWlyOiB7IGtleTogc3RyaW5nIHwgQnVmZmVyIH0sIGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGxldCBkYXRhU3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgbGV0IHByaXZhdGVLZXkgPSBmb3JnZS5lZDI1NTE5LnByaXZhdGVLZXlGcm9tUGVtKGtleVBhaXIua2V5LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBwcml2YXRlS2V5LnNpZ24oZGF0YVN0cik7XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeShjZXJ0OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBkYXRhOiB1bmtub3duKSB7XG4gICAgbGV0IGNlcnRPYmogPSBwYXJzZUNlcnQoY2VydCk7XG4gICAgbGV0IHB1YmxpY0tleSA9IGdldEVEMjU1MTlQdWJsaWNLZXkoY2VydE9iaik7XG4gICAgbGV0IGRhdGFTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICBpZiAoIXB1YmxpY0tleS52ZXJpZnkoZGF0YVN0ciwgc2lnbmF0dXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLiBTaWduYXR1cmU6ICR7SlNPTi5zdHJpbmdpZnkoc2lnbmF0dXJlKX0gfCBEYXRhOiAke2VsbGlwc2l6ZShkYXRhU3RyLCAxMDI0KX1gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNlcnRUb1BFTShQRU1vckRFUjogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgICBpZiAoUEVNb3JERVIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXCIpKSB7XG4gICAgICAgIHJldHVybiBQRU1vckRFUi50b1N0cmluZygpO1xuICAgIH1cbiAgICBQRU1vckRFUiA9IFBFTW9yREVSLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIHJldHVybiBcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcblwiICsgUEVNb3JERVIgKyBcIlxcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cIjtcbn1cblxuLy8gQmFzZTMyIChSRkMgNDY0OCwgbG93ZXJjYXNlLCB1bnBhZGRlZCksIGFzIGRvbWFpbiBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgd2hpY2ggcnVsZXMgb3V0IGJhc2U2NC9oZXgtd2l0aC1jYXNlXG5jb25zdCBiYXNlMzJBbHBoYWJldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIjtcbmZ1bmN0aW9uIGVuY29kZUJhc2UzMihieXRlczogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgYml0Q291bnQgPSAwO1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgYnl0ZSBvZiBieXRlcykge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IGJ5dGU7XG4gICAgICAgIGJpdENvdW50ICs9IDg7XG4gICAgICAgIHdoaWxlIChiaXRDb3VudCA+PSA1KSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYmFzZTMyQWxwaGFiZXRbKHZhbHVlID4+PiAoYml0Q291bnQgLSA1KSkgJiAzMV07XG4gICAgICAgICAgICBiaXRDb3VudCAtPSA1O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiaXRDb3VudCA+IDApIHtcbiAgICAgICAgcmVzdWx0ICs9IGJhc2UzMkFscGhhYmV0Wyh2YWx1ZSA8PCAoNSAtIGJpdENvdW50KSkgJiAzMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KHB1YmxpY0tleTogeyBwdWJsaWNLZXlCeXRlczogQnVmZmVyIH0gfCBCdWZmZXIpIHtcbiAgICBsZXQgYnl0ZXM6IEJ1ZmZlcjtcbiAgICBpZiAoXCJwdWJsaWNLZXlCeXRlc1wiIGluIHB1YmxpY0tleSkge1xuICAgICAgICBieXRlcyA9IHB1YmxpY0tleS5wdWJsaWNLZXlCeXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBieXRlcyA9IHB1YmxpY0tleTtcbiAgICB9XG4gICAgcmV0dXJuIFwiYlwiICsgZW5jb2RlQmFzZTMyKEJ1ZmZlci5mcm9tKHNoYTI2NS5zaGEyNTYuYXJyYXkoQnVmZmVyLmZyb20oYnl0ZXMpKSkpLnNsaWNlKDAsIDIwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ0FDZXJ0KGRvbWFpbjogc3RyaW5nLCBjZXJ0OiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBsZXQgY2VydFBhcnNlZCA9IHBhcnNlQ2VydChjZXJ0KTtcblxuICAgIGxldCBzdWJqZWN0ID0gY2VydFBhcnNlZC5zdWJqZWN0LmdldEZpZWxkKFwiQ05cIikudmFsdWUgYXMgc3RyaW5nO1xuICAgIGxldCBsb2NhbGhvc3REb21haW4gPSBcIjEyNy0wLTAtMS5cIiArIHN1YmplY3Quc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgIGxldCBkb21haW5QYXJ0cyA9IHN1YmplY3Quc3BsaXQoXCIuXCIpLnJldmVyc2UoKTtcblxuICAgIGxldCByb290RG9tYWluUGFyc2VkID0gW2RvbWFpblBhcnRzLnNoaWZ0KCksIGRvbWFpblBhcnRzLnNoaWZ0KCldLnJldmVyc2UoKS5qb2luKFwiLlwiKTtcbiAgICBpZiAocm9vdERvbWFpblBhcnNlZCAhPT0gZG9tYWluKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBvdXIgdHJ1c3Qgc3RvcmUgY29udGFpbnMgbW9yZSB0aGVuIGp1c3QgT1VSIGNlcnRpZmljYXRlcywgc28gaWYgd2UgYWxsb3cgYW55IGRvbWFpbnMgdGhlbiByZWFsIGRvbWFpbnMgY2FuIGltcGVyc29uYXRlIGFueW9uZSEgSXQgaGFzIHRvIGJlIE9VUiBkb21haW4gdG8gYmUgdHJ1c3RlZCFcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSByb290IGRvbWFpbiBzaG91bGQgYmUgJHtkb21haW59LCBidXQgaXMgJHtyb290RG9tYWluUGFyc2VkfWApO1xuICAgIH1cbiAgICAvLyBUT0RPOiBNYXliZSBqdXN0IHNraXAgaWYgaXQgaXNuJ3QgYSBoYXNoIHN0cmluZz9cbiAgICBpZiAoZG9tYWluUGFydHNbMF0gPT09IFwibm9wcm94eVwiKSB7XG4gICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgbGV0IGNlcnRFeHBlY3RlZFB1YmxpY0tleVBhcnQgPSAoZG9tYWluUGFydHMuc2hpZnQoKSB8fCBcIlwiKS5zcGxpdChcIi1cIikuc2xpY2UoLTEpWzBdO1xuICAgIGxldCBjZXJ0QWN0dWFsUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGdldEVEMjU1MTlQdWJsaWNLZXkoY2VydFBhcnNlZCkpO1xuICAgIGlmIChjZXJ0RXhwZWN0ZWRQdWJsaWNLZXlQYXJ0ICE9PSBjZXJ0QWN0dWFsUHVibGljS2V5UGFydCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIHB1YmxpYyBrZXkgaW4gdGhlIHVybCBpcyAke2NlcnRFeHBlY3RlZFB1YmxpY0tleVBhcnR9LCBidXQgaW4gdGhlIGNlcnQgaXMgJHtjZXJ0QWN0dWFsUHVibGljS2V5UGFydH1gKTtcbiAgICB9XG5cbiAgICAvLyBBTFNPLCByZXF1aXJlIG5hbWUgY29uc3RyYWludHMgdG8gYmUgcHJlc2VudCwgYW5kIHRvIHJlc3RyaWN0IHRvIHRoZSBcIkNOXCJcbiAgICBsZXQgbmFtZUNvbnN0cmFpbnRzID0gY2VydFBhcnNlZC5nZXRFeHRlbnNpb24oXCJuYW1lQ29uc3RyYWludHNcIikgYXMgYW55O1xuICAgIGlmICghbmFtZUNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgbXVzdCBoYXZlIG5hbWVDb25zdHJhaW50c2ApO1xuICAgIH1cbiAgICBsZXQgc3VidHJlZXMgPSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXM7XG4gICAgaWYgKCFzdWJ0cmVlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIG11c3QgaGF2ZSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXNgKTtcbiAgICB9XG4gICAgbGV0IHN1YnRyZWVWYWx1ZXMgPSBzdWJ0cmVlcy5tYXAoKHg6IGFueSkgPT4geC52YWx1ZSk7XG4gICAgLy8gSWdub3JlIGxvY2FsaG9zdERvbWFpbiwgYXMgaXQgY2FuIGFsd2F5cyBzYWZlbHkgYmUgYWxsb3dlZCAodGhlIHNhbWUgbWFjaGluZSBpcyBhbHdheXMgYWxsb3dlZCkuXG4gICAgc3VidHJlZVZhbHVlcyA9IHN1YnRyZWVWYWx1ZXMuZmlsdGVyKCh4OiBzdHJpbmcpID0+IHggIT09IGxvY2FsaG9zdERvbWFpbik7XG4gICAgaWYgKHN1YnRyZWVWYWx1ZXMubGVuZ3RoICE9PSAxIHx8IHN1YnRyZWVWYWx1ZXNbMF0gIT09IHN1YmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgYSBzaW5nbGUgY29uc3RyYWluZWQgZG9tYWluIChoYWQgJHtKU09OLnN0cmluZ2lmeShzdWJ0cmVlVmFsdWVzKX0pYCk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVBbHROYW1lcyhjZXJ0UGFyc2VkLCBzdWJqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2VydGlmaWNhdGUoZG9tYWluOiBzdHJpbmcsIGNlcnQ6IEJ1ZmZlciB8IHN0cmluZywgaXNzdWVyQ2VydDogQnVmZmVyIHwgc3RyaW5nKSB7XG4gICAgdmFsaWRhdGVDQUNlcnQoZG9tYWluLCBpc3N1ZXJDZXJ0KTtcblxuICAgIGxldCBjZXJ0UGFyc2VkID0gcGFyc2VDZXJ0KGNlcnQpO1xuICAgIGxldCBzdWJqZWN0ID0gY2VydFBhcnNlZC5zdWJqZWN0LmdldEZpZWxkKFwiQ05cIikudmFsdWUgYXMgc3RyaW5nO1xuICAgIGxldCBsb2NhbGhvc3REb21haW4gPSBcIjEyNy0wLTAtMS5cIiArIHN1YmplY3Quc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgIGxldCBkb21haW5QYXJ0cyA9IHN1YmplY3Quc3BsaXQoXCIuXCIpLnJldmVyc2UoKTtcblxuICAgIGxldCByb290RG9tYWluUGFyc2VkID0gW2RvbWFpblBhcnRzLnNoaWZ0KCksIGRvbWFpblBhcnRzLnNoaWZ0KCldLnJldmVyc2UoKS5qb2luKFwiLlwiKTtcbiAgICBpZiAocm9vdERvbWFpblBhcnNlZCAhPT0gZG9tYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgcm9vdCBkb21haW4gc2hvdWxkIGJlICR7ZG9tYWlufSwgYnV0IGlzICR7cm9vdERvbWFpblBhcnNlZH1gKTtcbiAgICB9XG4gICAgLy8gVE9ETzogTWF5YmUganVzdCBza2lwIGlmIGl0IGlzbid0IGEgaGFzaCBzdHJpbmc/XG4gICAgaWYgKGRvbWFpblBhcnRzWzBdID09PSBcIm5vcHJveHlcIikge1xuICAgICAgICBkb21haW5QYXJ0cy5zaGlmdCgpO1xuICAgIH1cblxuICAgIGxldCBpc3N1ZXJDZXJ0UGFyc2VkID0gcGFyc2VDZXJ0KGlzc3VlckNlcnQpO1xuXG4gICAgbGV0IGlzc3VlckV4cGVjdGVkUHVibGljS2V5UGFydCA9IGRvbWFpblBhcnRzLnNoaWZ0KCkgfHwgXCJcIjtcbiAgICBsZXQgaXNzdWVyQWN0dWFsUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGdldEVEMjU1MTlQdWJsaWNLZXkoaXNzdWVyQ2VydFBhcnNlZCkpO1xuICAgIGlmIChpc3N1ZXJFeHBlY3RlZFB1YmxpY0tleVBhcnQgIT09IGlzc3VlckFjdHVhbFB1YmxpY0tleVBhcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJc3N1ZXIgcHVibGljIGtleSBpbiB0aGUgdXJsIGlzICR7aXNzdWVyRXhwZWN0ZWRQdWJsaWNLZXlQYXJ0fSwgYnV0IGluIHRoZSBjZXJ0IGlzICR7aXNzdWVyQWN0dWFsUHVibGljS2V5UGFydH1gKTtcbiAgICB9XG5cbiAgICAvLyBUYWtlIHRoZSBsYXN0IHBhcnRcbiAgICBsZXQgY2VydEV4cGVjdGVkUHVibGljS2V5UGFydCA9IGRvbWFpblBhcnRzLnNoaWZ0KCkgfHwgXCJcIjtcbiAgICBsZXQgY2VydEFjdHVhbFB1YmxpY0tleVBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShnZXRFRDI1NTE5UHVibGljS2V5KGNlcnRQYXJzZWQpKTtcbiAgICBpZiAoY2VydEV4cGVjdGVkUHVibGljS2V5UGFydCAhPT0gY2VydEFjdHVhbFB1YmxpY0tleVBhcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBwdWJsaWMga2V5IGluIHRoZSB1cmwgaXMgJHtjZXJ0RXhwZWN0ZWRQdWJsaWNLZXlQYXJ0fSwgYnV0IGluIHRoZSBjZXJ0IGlzICR7Y2VydEFjdHVhbFB1YmxpY0tleVBhcnR9YCk7XG4gICAgfVxuXG5cbiAgICBsZXQgbmFtZUNvbnN0cmFpbnRzID0gaXNzdWVyQ2VydFBhcnNlZC5nZXRFeHRlbnNpb24oXCJuYW1lQ29uc3RyYWludHNcIikgYXMgYW55O1xuICAgIGlmICghbmFtZUNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ0EgbXVzdCBoYXZlIG5hbWVDb25zdHJhaW50c2ApO1xuICAgIH1cbiAgICBsZXQgc3VidHJlZXMgPSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXM7XG4gICAgaWYgKCFzdWJ0cmVlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENBIG11c3QgaGF2ZSBuYW1lQ29uc3RyYWludHMucGVybWl0dGVkU3VidHJlZXNgKTtcbiAgICB9XG4gICAgbGV0IHN1YnRyZWVWYWx1ZXMgPSBzdWJ0cmVlcy5tYXAoKHg6IGFueSkgPT4geC52YWx1ZSk7XG4gICAgLy8gSWdub3JlIGxvY2FsaG9zdERvbWFpbiwgYXMgaXQgY2FuIGFsd2F5cyBzYWZlbHkgYmUgYWxsb3dlZCAodGhlIHNhbWUgbWFjaGluZSBpcyBhbHdheXMgYWxsb3dlZCkuXG4gICAgc3VidHJlZVZhbHVlcyA9IHN1YnRyZWVWYWx1ZXMuZmlsdGVyKCh4OiBzdHJpbmcpID0+IHggIT09IGxvY2FsaG9zdERvbWFpbik7XG4gICAgaWYgKHN1YnRyZWVWYWx1ZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ0EgbXVzdCBoYXZlIGEgc2luZ2xlIGNvbnN0cmFpbmVkIGRvbWFpbiAoaGFkICR7SlNPTi5zdHJpbmdpZnkoc3VidHJlZVZhbHVlcyl9KWApO1xuICAgIH1cblxuICAgIGxldCBzdWJ0cmVlID0gc3VidHJlZVZhbHVlc1swXTtcbiAgICBpZiAoc3VidHJlZSAhPT0gc3ViamVjdCAmJiAhc3ViamVjdC5lbmRzV2l0aChcIi5cIiArIHN1YnRyZWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgbXVzdCBiZSBhIHN1YnRyZWUgb2YgdGhlIENBIChDQTogJHtzdWJ0cmVlfSwgY2VydDogJHtzdWJqZWN0fSlgKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUFsdE5hbWVzKGNlcnRQYXJzZWQsIHN1YmplY3QpO1xuXG4gICAgLy8gVmVyaWZ5IGlzc3VlciBBQ1RVQUxMWSBzaWduZWQgY2VydFBhcnNlZFxuICAgIGlmICghaXNzdWVyQ2VydFBhcnNlZC52ZXJpZnkoY2VydFBhcnNlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJc3N1ZXIgZGlkIG5vdCBzaWduIGNlcnRpZmljYXRlYCk7XG4gICAgfVxufVxuXG4vLyBSZXF1aXJlIGFsdCBuYW1lcyB0byBiZSBlaXRoZXIgZXF1YWwgdG8gXCJDTlwiLCBvciBhIHN1YnRyZWUgb2YgXCJDTlwiXG5mdW5jdGlvbiB2YWxpZGF0ZUFsdE5hbWVzKGNlcnRQYXJzZWQ6IGZvcmdlLnBraS5DZXJ0aWZpY2F0ZSwgc3ViamVjdDogc3RyaW5nKSB7XG4gICAgbGV0IGxvY2FsaG9zdERvbWFpbiA9IFwiMTI3LTAtMC0xLlwiICsgc3ViamVjdC5zcGxpdChcIi5cIikuc2xpY2UoLTIpLmpvaW4oXCIuXCIpO1xuXG4gICAgbGV0IGFsdE5hbWVzT2JqID0gY2VydFBhcnNlZC5nZXRFeHRlbnNpb24oXCJzdWJqZWN0QWx0TmFtZVwiKSBhcyBhbnk7XG4gICAgbGV0IGFsdE5hbWVzID0gYWx0TmFtZXNPYmo/LmFsdE5hbWVzLm1hcCgoeDogYW55KSA9PiB4LnZhbHVlKTtcbiAgICAvLyBBbGxvdyBsb2NhbGhvc3REb21haW4sIGFzIGl0IGNhbiBhbHdheXMgc2FmZWx5IGJlIGFsbG93ZWRcbiAgICBhbHROYW1lcyA9IGFsdE5hbWVzLmZpbHRlcigoeDogc3RyaW5nKSA9PiB4ICE9PSBsb2NhbGhvc3REb21haW4pO1xuICAgIGlmIChcbiAgICAgICAgYWx0TmFtZXMuc29tZSgoeDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICB4ID09PSBzdWJqZWN0XG4gICAgICAgICAgICAgICAgfHwgeC5lbmRzV2l0aChcIi5cIiArIHN1YmplY3QpXG4gICAgICAgICAgICAgICAgLy8gTk9URTogV2UgZG9uJ3QgYWxsb3cgMTI3LjAuMC4xICh8fCB4ID09PSBCdWZmZXIuZnJvbShbMTI3LCAwLCAwLCAxXSkudG9TdHJpbmcoKSksIGJlY2F1c2UgaXQgaXMgc28gZWFzeSB0byBwdWJsaXNoIGEgMTI3LjAuMC4xIEEgcmVjb3JkLCBhbmQgZXZlbiB0byBnZW5lcmF0ZSBhIHJlYWwgY2VydCwgc28gd2Ugc2hvdWxkIGp1c3QgZG8gdGhhdCwgYW5kIGtlZXAgaXQgc2VjdXJlLiBJZiB3ZSBuZWVkIHRoaXMgZm9yIGRldmVsb3BtZW50IHdlIGNhbiBwdXQgaXQgYmVoaW5kIGEgZmxhZywgc28gbm9uLWRldmVsb3BtZW50IGluc3RhbmNlcyBhcmUgc3RpbGwgc2VjdXJlLlxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhbHQgbmFtZXMuIE11c3QgYmUgc3VidHJlZXMgb2YgdGhlIHN1YmplY3QgKENOKSAke0pTT04uc3RyaW5naWZ5KHN1YmplY3QpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkoYWx0TmFtZXMpfWApO1xuICAgIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVLZXlQYWlyKCkge1xuICAgIHJldHVybiBtZWFzdXJlQmxvY2soZnVuY3Rpb24gZ2VuZXJhdGVLZXlQYWlyKCkge1xuICAgICAgICAvLyBOT1RFOiBXZSB1c2UgRUQyNTUxOSBiZWNhdXNlIGl0IGNhbiBnZW5lcmF0ZSBrZXlzIGFib3V0IDEwWCBmYXN0ZXIgdGhhbiBSU0EgKHdoaWNoIGlzIHN0aWxsIHNsb3csIH42bXMgb24gbXkgbWFjaGluZSwgc28gd2UgREVGSU5JVEVMWSBkb24ndCB3YW50IGl0IHRvIGJlIDEwWCBzbG93ZXIhKSAtIGh0dHBzOi8vc2VjdXJpdHkuc3RhY2tleGNoYW5nZS5jb20vYS8yMzY5NDMvMjgyMzY3XG4gICAgICAgIHJldHVybiBmb3JnZS5lZDI1NTE5LmdlbmVyYXRlS2V5UGFpcigpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0Q0EoZG9tYWluOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXlQYWlyID0gZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgbGV0IGNhUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGtleVBhaXIucHVibGljS2V5KTtcbiAgICBsZXQgZnVsbERvbWFpbiA9IGAke2NhUHVibGljS2V5UGFydH0uJHtkb21haW59YDtcbiAgICByZXR1cm4gY3JlYXRlWDUwOSh7IGRvbWFpbjogZnVsbERvbWFpbiwgaXNzdWVyOiBcInNlbGZcIiwga2V5UGFpciwgbGlmZVNwYW46IHRpbWVJbkRheSAqIDM2NSAqIDIwIH0pO1xufVxuXG5sZXQgaWRlbnRpdHlDQSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4gbGF6eSgoKTogWDUwOUtleVBhaXIgPT4ge1xuICAgIGxldCBpZGVudGl0eUNBQ2FjaGVkID0gZ2V0SWRlbnRpdHlTdG9yZShkb21haW4pO1xuICAgIGxldCBjYUNhY2hlZCA9IGlkZW50aXR5Q0FDYWNoZWQuZ2V0KCk7XG4gICAgaWYgKCFjYUNhY2hlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGluZyBuZXcgaWRlbnRpdHkgQ0FgKTtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IGdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAgICBsZXQgY2FQdWJsaWNLZXlQYXJ0ID0gZ2V0RG9tYWluUGFydEZyb21QdWJsaWNLZXkoa2V5UGFpci5wdWJsaWNLZXkpO1xuICAgICAgICBsZXQgZnVsbERvbWFpbiA9IGAke2NhUHVibGljS2V5UGFydH0uJHtkb21haW59YDtcblxuICAgICAgICBsZXQgdmFsdWUgPSBjcmVhdGVYNTA5KHsgZG9tYWluOiBmdWxsRG9tYWluLCBpc3N1ZXI6IFwic2VsZlwiLCBrZXlQYWlyLCBsaWZlU3BhbjogdGltZUluRGF5ICogMzY1ICogMjAgfSk7XG5cbiAgICAgICAgY2FDYWNoZWQgPSB7XG4gICAgICAgICAgICBkb21haW46IHZhbHVlLmRvbWFpbixcbiAgICAgICAgICAgIGNlcnRCNjQ6IHZhbHVlLmNlcnQudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgICAgICBrZXlCNjQ6IHZhbHVlLmtleS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWRlbnRpdHlDQUNhY2hlZC5zZXQoY2FDYWNoZWQpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICBkb21haW46IGNhQ2FjaGVkLmRvbWFpbixcbiAgICAgICAgY2VydDogQnVmZmVyLmZyb20oY2FDYWNoZWQuY2VydEI2NCwgXCJiYXNlNjRcIiksXG4gICAgICAgIGtleTogQnVmZmVyLmZyb20oY2FDYWNoZWQua2V5QjY0LCBcImJhc2U2NFwiKSxcbiAgICB9O1xuICAgIHRydXN0Q2VydGlmaWNhdGUocmVzdWx0LmNlcnQudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0pKTtcblxuLy8gSU1QT1JUQU5UISBXZSBkbyBub3QgZW1iZWQgYW55IGRlYnVnIGluZm8gaW4gdGhpcyBkb21haW4uIElmIHdlIGRpZCwgaXQgd291bGQgYmUgdXNlZnVsLCBidXQuLi4gcG90ZW50YWxseSBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHksIGFzIGlmIHRoZSBkZWJ1ZyBpbmZvIChzdWNoIGFzIGEgcHJlZml4KSBpcyB1c2VkIHRvIGlkZW50aWZ5IHdoYXQgYSBjZXJ0aWZpY2F0ZSBpcyBmb3IsIGl0IHdvdWxkIGJlIGVhc3kgZm9yIGFuIGF0dGFjayB0byBmb3JnZSB0aGlzIChhcyB0aGUgZGVidWcgaW5mbyB3b24ndCBiZSBzZWN1cmVkKS4gU28gaXQgaXMgbXVjaCBiZXR0ZXIgdG8ga2VlcCB0aGUgY2VydGlmaWNhdGUgb3BhcXVlLCBhbmQgdGhlbiByZXF1aXJlIGFueSBtZXRhZGF0YSB0byBiZSBhY3R1YWxseSB2ZXR0ZWQgKGFuZCBob3BlZnVsbHkgc3RvcmVkIGluIGEgVUksIHNob3dpbmcgSVAsIHRpbWUsIGV0YykuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2VydEZyb21DQShjb25maWc6IHtcbiAgICBDQUtleVBhaXI6IFg1MDlLZXlQYWlyO1xufSk6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIGNyZWF0ZUNlcnRGcm9tQ0EoKSB7XG4gICAgICAgIGxldCB7IENBS2V5UGFpciB9ID0gY29uZmlnO1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICAgIGxldCBkb21haW5LZXlQYXJ0ID0gZ2V0RG9tYWluUGFydEZyb21QdWJsaWNLZXkoa2V5UGFpci5wdWJsaWNLZXkpO1xuICAgICAgICBsZXQgZnVsbERvbWFpbiA9IGAke2RvbWFpbktleVBhcnR9LiR7Y29uZmlnLkNBS2V5UGFpci5kb21haW59YDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVg1MDkoe1xuICAgICAgICAgICAgZG9tYWluOiBmdWxsRG9tYWluLFxuICAgICAgICAgICAgaXNzdWVyOiBDQUtleVBhaXIsXG4gICAgICAgICAgICBrZXlQYWlyLFxuICAgICAgICAgICAgbGlmZVNwYW46IHRpbWVJbkRheSAqIDM2NSAqIDEwLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hY2hpbmVJZChkb21haW5OYW1lT3JOb2RlSWQ6IHN0cmluZywgZG9tYWluOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGVjb2RlTm9kZUlkQXNzZXJ0KGRvbWFpbk5hbWVPck5vZGVJZCwgZG9tYWluLCBcImFsbG93TWlzc2luZ1RocmVhZElkXCIpLm1hY2hpbmVJZDtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZUlkUGFydHMgPSB7XG4gICAgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBkb21haW46IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU5vZGVJZChub2RlSWQ6IHN0cmluZywgZG9tYWluOiBzdHJpbmcsIGFsbG93TWlzc2luZ1RocmVhZElkPzogXCJhbGxvd01pc3NpbmdUaHJlYWRJZFwiKTogTm9kZUlkUGFydHMgfCB1bmRlZmluZWQge1xuICAgIGxldCBsb2NhdGlvbk9iaiA9IGdldE5vZGVJZExvY2F0aW9uKG5vZGVJZCk7XG4gICAgaWYgKCFsb2NhdGlvbk9iaikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcGFydHMgPSBsb2NhdGlvbk9iai5hZGRyZXNzLnNwbGl0KFwiLlwiKTtcbiAgICAvLyBOT1RFOiBXZSBoYXZlIHRvIG9ubHkgYWxsb3cgbG9jYWxob3N0IGRvbWFpbnMgb24gb3VyIG93biBkb21haW4sIGFzIHRoZSB1bmRlcmx5aW5nIGRvbWFpbiBnZXRzIHN0cmlwcGVkIHdoZW4gd2UncmUgbG9va2luZyBhdCB0aGUgbWFjaGluZUlkLiBTbyBpZiB3ZSBhbGxvd2VkIGxvY2FsaG9zdCBkb21haW5zIG9uIG90aGVyIGRvbWFpbnMsIGEgc2VydmVyIGNvdWxkIHRyaWNrIHVzIGludG8gY29ubmVjdGluZyB0byBpdCwgYW5kIHRoZW4gb25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgaXQgY291bGQgdGFsayBiYWNrIGFuZCB3ZSB3b3VsZCB0aGluayBpdCBoYXMgYSBsb2NhbGhvc3QgbWFjaGluZUlkLCB3aGljaCBpcyBpbXBsaWNpdGx5IHRydXN0ZWQsIHdoaWNoIHdvdWxkIHRoZW4gZ2l2ZSBpdCBhY2Nlc3MgdG8gZXZlcnl0aGluZy5cbiAgICBpZiAobG9jYXRpb25PYmouYWRkcmVzcyA9PT0gYDEyNy0wLTAtMS4ke2RvbWFpbn1gICYmIG5vZGVJZC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRocmVhZElkOiBcIlwiLFxuICAgICAgICAgICAgbWFjaGluZUlkOiBwYXJ0cy5hdCgtMykgfHwgXCJcIixcbiAgICAgICAgICAgIGRvbWFpbjogcGFydHMuc2xpY2UoLTIpLmpvaW4oXCIuXCIpLFxuICAgICAgICAgICAgcG9ydDogbG9jYXRpb25PYmoucG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbGV0IGlzVmFsaWQgPSBwYXJ0cy5sZW5ndGggPj0gNCB8fCBhbGxvd01pc3NpbmdUaHJlYWRJZCAmJiBwYXJ0cy5sZW5ndGggPT09IDM7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRocmVhZElkOiBwYXJ0cy5hdCgtNCkgfHwgXCJcIixcbiAgICAgICAgbWFjaGluZUlkOiBwYXJ0cy5hdCgtMykgfHwgXCJcIixcbiAgICAgICAgZG9tYWluOiBwYXJ0cy5zbGljZSgtMikuam9pbihcIi5cIikgfHwgXCJcIixcbiAgICAgICAgcG9ydDogbG9jYXRpb25PYmoucG9ydCxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU5vZGVJZEFzc2VydChub2RlSWQ6IHN0cmluZywgZG9tYWluOiBzdHJpbmcsIGFsbG93TWlzc2luZ1RocmVhZElkPzogXCJhbGxvd01pc3NpbmdUaHJlYWRJZFwiKTogTm9kZUlkUGFydHMge1xuICAgIGxldCByZXN1bHQgPSBkZWNvZGVOb2RlSWQobm9kZUlkLCBkb21haW4sIGFsbG93TWlzc2luZ1RocmVhZElkKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbm9kZUlkOiAke0pTT04uc3RyaW5naWZ5KG5vZGVJZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlTm9kZUlkKHBhcnRzOiBOb2RlSWRQYXJ0cykge1xuICAgIHJldHVybiBgJHtwYXJ0cy50aHJlYWRJZH0uJHtwYXJ0cy5tYWNoaW5lSWR9LiR7cGFydHMuZG9tYWlufToke3BhcnRzLnBvcnR9YDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldElkZW50aXR5Q0FSYXcoZG9tYWluOiBzdHJpbmcsIGpzb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eUNBQ2FjaGVkID0gZ2V0SWRlbnRpdHlTdG9yZShkb21haW4pO1xuICAgIGxldCBvYmogPSBKU09OLnBhcnNlKGpzb24pIGFzIHtcbiAgICAgICAgZG9tYWluOiBzdHJpbmc7XG4gICAgICAgIGNlcnRCNjQ6IHN0cmluZztcbiAgICAgICAga2V5QjY0OiBzdHJpbmc7XG4gICAgfTtcbiAgICBsZXQgY2EgPSB7XG4gICAgICAgIGRvbWFpbjogb2JqLmRvbWFpbixcbiAgICAgICAgY2VydDogQnVmZmVyLmZyb20ob2JqLmNlcnRCNjQsIFwiYmFzZTY0XCIpLFxuICAgICAgICBrZXk6IEJ1ZmZlci5mcm9tKG9iai5rZXlCNjQsIFwiYmFzZTY0XCIpLFxuICAgIH07XG4gICAgdHJ1c3RDZXJ0aWZpY2F0ZShjYS5jZXJ0LnRvU3RyaW5nKCkpO1xuICAgIGlkZW50aXR5Q0EoZG9tYWluKS5zZXQoY2EpO1xuICAgIGdldFRocmVhZEtleUNlcnRCYXNlKGRvbWFpbikucmVzZXQoKTtcbiAgICBpZGVudGl0eUNBQ2FjaGVkLnNldChvYmopO1xuICAgIHJlc2V0QWxsTm9kZUNhbGxGYWN0b3JpZXMoKTtcbn1cblxuLy8gTk9URTogVGhlIGlkZW50aXR5IENBIGlzIGF2YWlsYWJsZSBzeW5jaHJvbm91c2x5IChzdG9yYWdlIGlzIGZzL2xvY2FsU3RvcmFnZSwgYm90aCBzeW5jaHJvbm91cyksIHNvIHRoaXMgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggc3RhcnR1cCBjb2RlIHRoYXQgYXdhaXRzIGl0LlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRJZGVudGl0eUNBKGRvbWFpbjogc3RyaW5nKSB7XG4gICAgaWRlbnRpdHlDQShkb21haW4pKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRlbnRpdHlDQShkb21haW46IHN0cmluZyk6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gaWRlbnRpdHlDQShkb21haW4pKCk7XG59XG5cbi8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGEgZGF0YWJhc2UsIHNvIGl0IGlzIGVhc3kgZm9yIHVzIHRvIHRydXN0IENBcyBjcm9zcyBtYWNoaW5lLCBhbmQgZXZlbiBoYXZlIG11bHRpcGxlIHVzZXJzLCBldGMsIGV0Yy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVudGl0eUNBUHJvbWlzZShkb21haW46IHN0cmluZyk6IFg1MDlLZXlQYWlyIHtcbiAgICByZXR1cm4gaWRlbnRpdHlDQShkb21haW4pKCk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE93bk1hY2hpbmVJZChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRNYWNoaW5lSWQoZ2V0SWRlbnRpdHlDQShkb21haW4pLmRvbWFpbiwgZG9tYWluKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPd25UaHJlYWRJZChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBkZWNvZGVOb2RlSWRBc3NlcnQoZ2V0VGhyZWFkS2V5Q2VydChkb21haW4pLmRvbWFpbiwgZG9tYWluKS50aHJlYWRJZDtcbn1cblxuLyoqIFBhcnQgb2YgdGhlIG1hY2hpbmVJZCBjb21lcyBmcm9tIHRoZSBwdWJsaWNLZXksIHNvIHdlIGNhbiB1c2UgaXQgdG8gdmVyaWZ5ICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5TWFjaGluZUlkRm9yUHVibGljS2V5KGNvbmZpZzoge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIHB1YmxpY0tleTogQnVmZmVyO1xufSk6IGJvb2xlYW4ge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgcHVibGljS2V5IH0gPSBjb25maWc7XG4gICAgbGV0IGRvbWFpblBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIC8vIG1hY2hpbmVJZCBpcyB0aGUgYmFyZSBrZXktaGFzaCBsYWJlbCwgYnV0IGFsc28gYWNjZXB0IGxlZ2FjeSBcImhhc2guZG9tYWluLnRsZFwiIGZvcm1zXG4gICAgcmV0dXJuIG1hY2hpbmVJZC5zcGxpdChcIi5cIilbMF0gPT09IGRvbWFpblBhcnQ7XG59XG5cbi8vIE5PVEU6IFdlIGRvbid0IGhhdmUgYSBjYWNoZSBwZXIgQ0EsIGFzLi4uIHRoZSBDQSBzaG91bGQgYmUgc2V0IGZpcnN0XG4vLyBUT0RPOiBNYXliZSB0aHJvdyBpZiB0aGV5IHRyeSB0byBjaGFuZ2UgdGhlIENBIGFmdGVyIHRoZXkgZ2VuZXJhdGUgYW55IGNlcnRpZmljYXRlcz9cbi8vIFRPRE86IFJlZ2VuZXJhdGUgY2VydGlmaWNhdGVzIGFmdGVyIGVub3VnaCB0aW1lIChhcyB0aHJlYWQgY2VydHMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgc2hvcnQgbGl2ZWQsIHNvIGl0IGlzIHBsYXVzaWJsZSBmb3IgdGhlbSB0byBleHBpcmUpLiBXZSB3aWxsIGFsc28gbmVlZCB0byBwcm92aWRlIGEgY2FsbGJhY2sgc28gdGhhdCB1c2VycyBvZiB0aGUgY2VydCBjYW4gdXBkYXRlIHRoZSBjZXJ0IHRoZXkgYXJlIHVzaW5nIGFzIHdlbGwuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhyZWFkS2V5Q2VydChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRUaHJlYWRLZXlDZXJ0QmFzZShkb21haW4pKCk7XG59XG5jb25zdCBnZXRUaHJlYWRLZXlDZXJ0QmFzZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4gbGF6eSgoKSA9PiB7XG4gICAgbGV0IGNhID0gZ2V0SWRlbnRpdHlDQShkb21haW4pO1xuICAgIHJldHVybiBjcmVhdGVDZXJ0RnJvbUNBKHsgQ0FLZXlQYWlyOiBjYSB9KTtcbn0pKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE93bk5vZGVJZCgpOiBzdHJpbmcge1xuICAgIGxldCBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5tb3VudGVkTm9kZUlkO1xuICAgIGlmICghbm9kZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtdXN0IGJlIG1vdW50ZWQgYmVmb3JlIG5vZGVJZCBpcyBhY2Nlc3NlZGApO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZUlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duTm9kZUlkQWxsb3dVbmRlZmluZWQoKSB7XG4gICAgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLm1vdW50ZWROb2RlSWQ7XG59Il19
|
|
466
|
-
/* _JS_SOURCE_HASH = "
|
|
466
|
+
/* _JS_SOURCE_HASH = "f2009b20f0a3249a21e08f4352d1914e34bdadc2ead4b2316e6320dd28538de0"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -43,4 +43,4 @@ function getKeyStore(appName, key) {
|
|
|
43
43
|
}
|
|
44
44
|
exports.getKeyStore = getKeyStore;
|
|
45
45
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVudExvY2FsU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcnNpc3RlbnRMb2NhbFN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQWtEO0FBQ2xELDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFHcEIsU0FBZ0IsV0FBVyxDQUFJLE9BQWUsRUFBRSxHQUFXO0lBSXZELElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLEdBQUcsWUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsRSxPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUM7b0JBQUMsUUFBUSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQWU7Z0JBQ2YsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBZTtnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleVN0b3JlPFQ+KGFwcE5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiB7XG4gICAgZ2V0KCk6IFQgfCB1bmRlZmluZWQ7XG4gICAgc2V0KHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQ7XG59IHtcbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgbGV0IHBhdGggPSBvcy5ob21lZGlyKCkgKyBgL2tleXN0b3JlXyR7YXBwTmFtZX1fYCArIGtleSArIFwiLmpzb25cIjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0cnkgeyBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7IH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50cykgYXMgVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghanNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKSBhcyBUO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==
|
|
46
|
-
/* _JS_SOURCE_HASH = "
|
|
46
|
+
/* _JS_SOURCE_HASH = "58cffcfad7122960997b72d8b4809ea1c8f4b8d638bf51c327f012d95d941526"; */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sliftutils",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.21",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"node-forge": "https://github.com/sliftist/forge#e618181b469b07bdc70b968b0391beb8ef5fecd6",
|
|
58
58
|
"preact-old-types": "^10.28.1",
|
|
59
59
|
"shell-quote": "^1.8.3",
|
|
60
|
-
"socket-function": "^1.2.
|
|
60
|
+
"socket-function": "^1.2.26",
|
|
61
61
|
"typenode": "^6.6.1",
|
|
62
62
|
"typesafecss": "*",
|
|
63
63
|
"ws": "^8.18.3",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.BulkDatabaseBase = exports.noopReactiveDeps = exports.bulkDatabase2Timing = exports.BULK_ROOT_FOLDER = void 0;
|
|
4
4
|
const misc_1 = require("socket-function/src/misc");
|
|
@@ -1239,4 +1239,4 @@ BulkDatabaseBase.liveInstances = new Set();
|
|
|
1239
1239
|
BulkDatabaseBase.memoryWatchdogStarted = false;
|
|
1240
1240
|
BulkDatabaseBase.lastMemoryFlushMs = 0;
|
|
1241
1241
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsa0RhdGFiYXNlQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkJ1bGtEYXRhYmFzZUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWtFO0FBQ2xFLDJEQUEyRDtBQUMzRCxtREFBeUQ7QUFDekQseURBQW1EO0FBQ25ELDZDQUFxQztBQUVyQyw2REFNOEI7QUFDOUIsMkRBQXNEO0FBQ3RELDZDQUFrRTtBQUNsRSxrRUFBaUY7QUFDakYsd0VBQXlFO0FBQ3pFLDJDQUFpRztBQUNqRyw2Q0FBb0o7QUFDcEosaURBQXlDO0FBQ3pDLDJDQUFpTTtBQUNqTSxpREFBOEc7QUFDOUcsK0NBVXVCO0FBQ3ZCLDZEQUFvRTtBQUV2RCxRQUFBLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQ2pELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLGlCQUFpQixHQUFHLHNDQUFpQixHQUFHLENBQUMsQ0FBQztBQUNoRCxNQUFNLGVBQWUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsc0dBQXNHO0FBQ3RHLG9HQUFvRztBQUNwRyw4RUFBOEU7QUFDOUUsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHlCQUF5QixHQUFHLEdB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bXBvcnQgeyBzb3J0LCB0aHJvdHRsZUZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0VGltZVVuaXF1ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JpdHNcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwidHlwZXNhZmVjc3NcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN0b3JhZ2UgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHtcbiAgICBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyLFxuICAgIEJ1bGtIZWFkZXJJbmZvLFxuICAgIGJ1aWxkRmlsZUJ1ZmZlcixcbiAgICBsb2FkQnVsa0hlYWRlcixcbiAgICBUQVJHRVRfRklMRV9CWVRFUyxcbn0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlRm9ybWF0XCI7XG5pbXBvcnQgeyBydW5QbGFubmVkTWVyZ2UgfSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VNZXJnZVwiO1xuaW1wb3J0IHsgYmxvY2tDYWNoZSwgZW5jb2RlQ29tcHJlc3NlZEJsb2NrcyB9IGZyb20gXCIuL2Jsb2NrQ2FjaGVcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IFNUUkVBTV9FWFRFTlNJT04sIGZyYW1lRGVsZXRlcywgZnJhbWVSb3dzLCBzdHJlYW1SZWFkZXJGcm9tRW50cmllcyB9IGZyb20gXCIuL3N0cmVhbUxvZ1wiO1xuaW1wb3J0IHsgYnJvYWRjYXN0IGFzIHN5bmNCcm9hZGNhc3QsIGJyb2FkY2FzdFNlYWwgYXMgc3luY0Jyb2FkY2FzdFNlYWwsIGNvbm5lY3QgYXMgc3luY0Nvbm5lY3QsIGlzU3luY1N1cHBvcnRlZCwgUmVtb3RlV3JpdGUgfSBmcm9tIFwiLi9zeW5jQ2xpZW50XCI7XG5pbXBvcnQgeyBERUxFVEVEIH0gZnJvbSBcIi4vV3JpdGVPdmVybGF5XCI7XG5pbXBvcnQgeyBNZXJnZUxvY2tJbmZvLCBwZWVrTWVyZ2VGaWxlTG9jaywgcGVla01lcmdlTG9jaywgcmVsZWFzZU1lcmdlRmlsZUxvY2ssIHJlbGVhc2VNZXJnZUxvY2ssIHN0YXJ0TWVyZ2VGaWxlTG9ja0hlYXJ0YmVhdCwgdHJ5QWNxdWlyZU1lcmdlRmlsZUxvY2ssIHRyeUFjcXVpcmVNZXJnZUxvY2sgfSBmcm9tIFwiLi9tZXJnZUxvY2tcIjtcbmltcG9ydCB7IG1hcmtlckV4Y2x1c2lvbnMsIHByb2Nlc3NEZWxldGVNYXJrZXJzLCByZWFkRGVsZXRlTWFya2Vycywgd3JpdGVEZWxldGVNYXJrZXIgfSBmcm9tIFwiLi9tZXJnZU1hcmtlcnNcIjtcbmltcG9ydCB7XG4gICAgQnVsa0ZpbGVJbmZvLFxuICAgIExvYWRlZEluZGV4LFxuICAgIGxvYWRGaWxlUmVhZGVyLFxuICAgIGxvYWRTdHJlYW1FbnRyaWVzLFxuICAgIG1ha2VSYXdHZXRSYW5nZSxcbiAgICBNaXNzaW5nRmlsZUVycm9yLFxuICAgIG9yZGVyU3RyZWFtRW50cmllcyxcbiAgICBTdHJlYW1GaWxlSW5mbyxcbiAgICBTdWJSZWFkZXJDYWNoZXMsXG59IGZyb20gXCIuL0xvYWRlZEluZGV4XCI7XG5pbXBvcnQgeyBCdWxrRGF0YWJhc2VSZWFkZXIsIG51bGxKb2luIH0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlUmVhZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBCVUxLX1JPT1RfRk9MREVSID0gXCJidWxrRGF0YWJhc2VzMlwiO1xuY29uc3QgRklMRV9FWFRFTlNJT04gPSBcIi5idWxrXCI7XG5jb25zdCBST0xMT1ZFUl9ST1dTID0gNTAwMDtcbmNvbnN0IFJPTExPVkVSX0JZVEVTID0gNSAqIDEwMjQgKiAxMDI0O1xuY29uc3QgTUVNT1JZX1dBVENIRE9HX0lOVEVSVkFMX01TID0gNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfREVMRVRFX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbmNvbnN0IE1BWF9JTkRFWF9SRUxPQURfQVRURU1QVFMgPSAzO1xuY29uc3QgRklSU1RfTUVSR0VfQllURVMgPSBUQVJHRVRfRklMRV9CWVRFUyAvIDI7XG5jb25zdCBLRVlfR1JPVVBfQllURVMgPSA4MDAgKiAxMDI0ICogMTAyNDtcbmNvbnN0IERVUF9USFJFU0hPTEQgPSAwLjQ7XG4vLyBXaG9sZS10aWVyIGRlZHVwIHNob3J0LWNpcmN1aXQgKGFmdGVyIFBhc3MgMSk6IHdoZW4gdGhlIGJ1bGsgdGllciBpcyBvdmVyIHRoaXMgc2l6ZSBBTkQgdGhlIG92ZXJhbGxcbi8vIGtleSBkdXBsaWNhdGlvbiBmcmFjdGlvbiBpcyBvdmVyIHRoaXMgdGhyZXNob2xkLCBmb2xkIGV2ZXJ5IGJ1bGsgZmlsZSBpbiBvbmUgbWVyZ2UgaW5zdGVhZCBvZiB0aGVcbi8vIHBlci1rZXktZ3JvdXAgd2FsayAod2hpY2ggc3BhY2VzIG1lcmdlcyA1IG1pbiBhcGFydCDigJQgMTYgaCBmb3IgMjAwIGdyb3VwcykuXG5jb25zdCBERURVUF9UUklHR0VSX0JZVEVTID0gNTEyICogMTAyNCAqIDEwMjQ7XG5jb25zdCBERURVUF9UUklHR0VSX0ZSQUNUSU9OID0gMC41O1xuY29uc3QgV1JJVEVfRkxVU0hfRklSU1RfU1RFUF9NUyA9IDI1MDtcbi8vIFNraXAgbG9ncyBhcmUgdGhyb3R0bGVkIHBlciBjb2xsZWN0aW9uOiB0aGUgYmFja2dyb3VuZCB3cml0ZSBwYXRoIHJldHJpZXMgbWVyZ2VzIGFib3V0IG9uY2UgYSBzZWNvbmQsXG4vLyBzbyBhbiB1bnRocm90dGxlZCBsb2cgd291bGQgcmVwZWF0IGZvciB0aGUgd2hvbGUgZHVyYXRpb24gb2YgYW5vdGhlciB0YWIncyBtZXJnZS5cbmNvbnN0IE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TID0gMzAgKiAxMDAwO1xuXG5leHBvcnQgY29uc3QgYnVsa0RhdGFiYXNlMlRpbWluZyA9IHtcbiAgICBzdHJlYW1TZWFsQWdlTXM6IDEwICogNjAgKiA2MCAqIDEwMDAsXG4gICAgLy8gV2FpdCB0aGlzIGxvbmcgYWZ0ZXIgdGhlIHRhYiBiZWNvbWVzIHZpc2libGUgYmVmb3JlIHRoZSBmaXJzdCBtZXJnZSBjaGVjaywgdGhlbiBjaGVjayB0aGlzIG9mdGVuXG4gICAgLy8gYWZ0ZXJ3YXJkcy4gVGFiIGJlaW5nIGhpZGRlbiBjYW5jZWxzIHRoZSB0aW1lcnMgKG5vIG1lcmdlcyB3aGlsZSBpbiBiYWNrZ3JvdW5kKS4gQnJvd3Nlci1vbmx5O1xuICAgIC8vIE5vZGUgY29tcGFjdG9ycyAoZS5nLiByZW1vdGVGaWxlU2VydmVyKSBkcml2ZSB0aGVpciBvd24gcG9sbGluZy5cbiAgICB2aXNpYmxlTWVyZ2VJbnRlcnZhbE1zOiA1ICogNjAgKiAxMDAwLFxuICAgIG1lcmdlU3BhY2luZ01zOiA1ICogNjAgKiAxMDAwLFxuICAgIGZpcnN0TWVyZ2VUcmlnZ2VyRmlsZXM6IDIwLFxuICAgIGZpcnN0TWVyZ2VUcmlnZ2VyUmFuZ2VNczogMyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgc3RyZWFtRm9sZFRyaWdnZXJSb3dzOiAxMDAsXG4gICAgc3RyZWFtRm9sZFRyaWdnZXJCeXRlczogNjQgKiAxMDI0ICogMTAyNCxcbiAgICBzdHJlYW1GaWxlTWF4Qnl0ZXM6IDUwICogMTAyNCAqIDEwMjQsXG4gICAgc3RyZWFtRm9sZEhhcmRMaW1pdEJ5dGVzOiA3NjggKiAxMDI0ICogMTAyNCxcbiAgICAvLyAwID0gZmx1c2ggZXZlcnkgd3JpdGUgKE5vZGUg4oCUIGFwcGVuZCBpcyByZWFsIGFuZCBjaGVhcCk7IGJyb3dzZXIgcmFtcHMgdG8gMTVzIHRvIGF2b2lkIHJld3JpdGluZ1xuICAgIC8vIHRoZSB3aG9sZSBzdHJlYW0gZmlsZSBwZXIgd3JpdGUuXG4gICAgd3JpdGVGbHVzaE1heERlbGF5TXM6IGlzTm9kZSgpID8gMCA6IDE1ICogMTAwMCxcbiAgICBmaWxlU2V0UG9sbEludGVydmFsTXM6IDMwICogNjAgKiAxMDAwLFxuICAgIG1lbW9yeUZsdXNoSGVhcEJ5dGVzOiA1ICogMTAyNCAqIDEwMjQgKiAxMDI0LFxuICAgIG1lbW9yeUZsdXNoTWluQ29sbGVjdGlvbkJ5dGVzOiAxMDAgKiAxMDI0ICogMTAyNCxcbiAgICBtZW1vcnlGbHVzaFRocm90dGxlTXM6IDE1ICogNjAgKiAxMDAwLFxufTtcblxuZnVuY3Rpb24gZm10Qnl0ZXMobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobiA8IDEwMjQpIHJldHVybiBuICsgXCJCXCI7XG4gICAgaWYgKG4gPCAxMDI0ICogMTAyNCkgcmV0dXJuIChuIC8gMTAyNCkudG9GaXhlZCgxKSArIFwiS0JcIjtcbiAgICBpZiAobiA8IDEwMjQgKiAxMDI0ICogMTAyNCkgcmV0dXJuIChuIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIk1CXCI7XG4gICAgcmV0dXJuIChuIC8gMTAyNCAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDIpICsgXCJHQlwiO1xufVxuXG4vLyBSZWFjdGl2aXR5IHNlYW0gKG5vIG1vYnggZGVwZW5kZW5jeSBpbiB0aGlzIGZpbGUpLiBUaGUgbW9ieCBzdWJjbGFzcyBzdXBwbGllcyBhIFJlYWN0aXZlRGVwcyB0aGF0XG4vLyBtYXBzIHNpZ25hbCBzdHJpbmdzIHRvIGl0cyBvd24gZGVwZW5kZW5jeSB0cmFja2luZzsgbm9uLXJlYWN0aXZlIGNhbGxlcnMgcGFzcyBub29wUmVhY3RpdmVEZXBzLlxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZURlcHMge1xuICAgIG9ic2VydmUoc2lnbmFsOiBzdHJpbmcpOiB2b2lkO1xuICAgIGludmFsaWRhdGUoc2lnbmFsOiBzdHJpbmcpOiB2b2lkO1xuICAgIGJhdGNoKGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBPcHRpb25hbCDigJQgbGV0cyB3cml0ZXMgc2tpcCBwZXIta2V5IGludmFsaWRhdGlvbiBmb3Igcm93cyBub3RoaW5nIGlzIHdhdGNoaW5nLiBVbmRlZmluZWQgPVxuICAgIC8vIFwiYXNzdW1lIHdhdGNoZWRcIi5cbiAgICBpc09ic2VydmVkPyhzaWduYWw6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBub29wUmVhY3RpdmVEZXBzOiBSZWFjdGl2ZURlcHMgPSB7XG4gICAgb2JzZXJ2ZSgpIHsgfSxcbiAgICBpbnZhbGlkYXRlKCkgeyB9LFxuICAgIGJhdGNoKGZuKSB7IGZuKCk7IH0sXG4gICAgaXNPYnNlcnZlZCgpIHsgcmV0dXJuIGZhbHNlOyB9LFxufTtcblxuZXhwb3J0IHR5cGUgU3RvcmFnZUZhY3RvcnkgPSAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPEZpbGVTdG9yYWdlPjtcblxuZXhwb3J0IHR5cGUgQnVsa0RhdGFiYXNlMkNvbmZpZyA9IHtcbiAgICAvLyBTZWUgQnVsa0RhdGFiYXNlUmVhZGVyLmNmZy5tYXhUcmlnZ2VyVGhyb3R0bGVNcy5cbiAgICBtYXhUcmlnZ2VyVGhyb3R0bGVNcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE1lcmdlU2tpcFJlYXNvbiA9XG4gICAgLy8gVGhpcyBpbnN0YW5jZSBpcyBhbHJlYWR5IG1pZC1tZXJnZS5cbiAgICB8IFwibWVyZ2VJbkZsaWdodFwiXG4gICAgLy8gQW5vdGhlciBzYW1lLW9yaWdpbiB0YWIgaG9sZHMgdGhlIGxvY2FsU3RvcmFnZSBtZXJnZSBsb2NrLlxuICAgIHwgXCJ0YWJMb2NrSGVsZFwiXG4gICAgLy8gQW5vdGhlciBwcm9jZXNzIGhvbGRzIHRoZSBjcm9zcy1wcm9jZXNzIC5tZXJnZS1sb2NrIGZpbGUgKG9yIHdvbiB0aGUgc2V0dGxlIHJhY2UgZm9yIGl0KS5cbiAgICB8IFwiZmlsZUxvY2tIZWxkXCJcbiAgICAvLyBjb21wYWN0KCkgb25seTogdGhlIGNvbGxlY3Rpb24gaGFzIG5vIGZpbGVzIG9uIGRpc2suXG4gICAgfCBcIm5vdGhpbmdUb01lcmdlXCI7XG5cbi8vIFdoYXQgYSBjb21wYWN0KCkvdHJ5TWVyZ2VOb3coKSBjYWxsIGRpZC4gc2tpcFJlYXNvbiBpcyBzZXQgd2hlbiB0aGUgcGFzcyBuZXZlciByYW47IGZvciB0aGUgbG9ja1xuLy8gcmVhc29ucywgbG9ja0hvbGRlcklkL2xvY2tFeHBpcmVzSW5NcyByZXBvcnQgd2hvIGhvbGRzIHRoZSBsb2NrIGFuZCBob3cgbG9uZyB1bnRpbCBpdCBnb2VzIHN0YWxlXG4vLyAoc28gYSBzY2hlZHVsZXIga25vd3Mgd2hlbiByZXRyeWluZyBjb3VsZCBzdWNjZWVkKS5cbmV4cG9ydCB0eXBlIE1lcmdlQXR0ZW1wdFJlc3VsdCA9IHtcbiAgICBtZXJnZWQ6IGJvb2xlYW47XG4gICAgc2tpcFJlYXNvbj86IE1lcmdlU2tpcFJlYXNvbjtcbiAgICBsb2NrSG9sZGVySWQ/OiBzdHJpbmc7XG4gICAgbG9ja0V4cGlyZXNJbk1zPzogbnVtYmVyO1xufTtcblxubGV0IG5ldHdvcmtDb21wYWN0aW9uRW5hYmxlZCA9IGZhbHNlO1xuXG5sZXQgZmlsZU5hbWVDb3VudGVyID0gMDtcbi8vIFBlci1wcm9jZXNzIElEIHNvIHR3byB3cml0ZXJzIHBpY2tpbmcgdGhlIHNhbWUgdGltZXN0YW1wICsgY291bnRlciBuZXZlciBjb2xsaWRlIG9uIGEgbmFtZS5cbmNvbnN0IHdyaXRlcklkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApO1xuZnVuY3Rpb24gbmV4dENvdW50ZXIoKTogbnVtYmVyIHsgcmV0dXJuICsrZmlsZU5hbWVDb3VudGVyOyB9XG5cbmxldCBsYXN0RmlsZVRpbWUgPSAwO1xuLy8gU3RyaWN0bHktaW5jcmVhc2luZyBpbnRlZ2VyIHNvIG5ld2VzdC1maXJzdCBvcmRlcmluZyBpcyB1bmFtYmlndW91cyB3aXRoaW4gYSBtaWxsaXNlY29uZC5cbmZ1bmN0aW9uIG5leHRGaWxlVGltZSgpOiBudW1iZXIge1xuICAgIGxhc3RGaWxlVGltZSA9IE1hdGgubWF4KERhdGUubm93KCksIGxhc3RGaWxlVGltZSArIDEpO1xuICAgIHJldHVybiBsYXN0RmlsZVRpbWU7XG59XG5cbmZ1bmN0aW9uIG5ld0ZpbGVOYW1lKHRpbWVzdGFtcDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYDBfJHt0aW1lc3RhbXB9XyR7d3JpdGVySWR9XyR7bmV4dENvdW50ZXIoKX0ke0ZJTEVfRVhURU5TSU9OfWA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyZWFtRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IFN0cmVhbUZpbGVJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKFNUUkVBTV9FWFRFTlNJT04pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnRzID0gZmlsZU5hbWUuc2xpY2UoMCwgLVNUUkVBTV9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0c1swXSAhPT0gXCJzdHJlYW1cIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgZmlsZU5hbWUsIHRpbWVzdGFtcCB9O1xufVxuXG4vLyBBY2NlcHQgb2xkIDMtcGFydCAobGV2ZWxfdGltZXN0YW1wX2NvdW50ZXIpIGFuZCBuZXcgNC1wYXJ0IChsZXZlbF90aW1lc3RhbXBfd3JpdGVySWRfY291bnRlcikgc2hhcGVzLlxuZnVuY3Rpb24gcGFyc2VGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogQnVsa0ZpbGVJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKEZJTEVfRVhURU5TSU9OKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJ0cyA9IGZpbGVOYW1lLnNsaWNlKDAsIC1GSUxFX0VYVEVOU0lPTi5sZW5ndGgpLnNwbGl0KFwiX1wiKTtcbiAgICBpZiAocGFydHMubGVuZ3RoIDwgMykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBsZXZlbCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShsZXZlbCkgfHwgIU51bWJlci5pc0Zpbml0ZSh0aW1lc3RhbXApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGZpbGVOYW1lLCBsZXZlbCwgdGltZXN0YW1wIH07XG59XG5cbmV4cG9ydCBjbGFzcyBCdWxrRGF0YWJhc2VCYXNlPFQgZXh0ZW5kcyB7IGtleTogc3RyaW5nIH0+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIGRlcHM6IFJlYWN0aXZlRGVwcyxcbiAgICAgICAgcHJpdmF0ZSBzdG9yYWdlRmFjdG9yeTogU3RvcmFnZUZhY3RvcnksXG4gICAgICAgIHByaXZhdGUgY29uZmlnOiBCdWxrRGF0YWJhc2UyQ29uZmlnID0ge30sXG4gICAgKSB7IH1cblxuICAgIC8vIFRoZSByZWFkZXIgKGFuZCB0aGUgYmFja2dyb3VuZCBtYWNoaW5lcnkgdGhhdCByaWRlcyBhbG9uZyB3aXRoIGl0KSBtdXN0IE5PVCBiZSBzZXQgdXAganVzdFxuICAgIC8vIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gd2FzIGNvbnN0cnVjdGVkLiBNYW55IGNvbGxlY3Rpb25zIGFyZSBjb25zdHJ1Y3RlZCBhbmQgbmV2ZXIgdG91Y2hlZCwgYW5kXG4gICAgLy8gaW4gTm9kZSBhIG1lcmdlIHRpY2sgd291bGQgcG9rZSB0aGUgc3RvcmFnZSBmYWN0b3J5IChlLmcuIGluZGV4ZWREQikgYW5kIHRocm93LiBXZSBidWlsZCBpdFxuICAgIC8vIGxhemlseSBvbiBmaXJzdCBhY2Nlc3MgdG8gYHRoaXMucmVhZGVyYDogZXZlcnkgcmVhZCwgd3JpdGUsIGFuZCBtZXJnZSBnb2VzIHRocm91Z2ggdGhlIHJlYWRlcixcbiAgICAvLyB3aGlsZSBwdXJlIGNvbnN0cnVjdGlvbiBuZXZlciB0b3VjaGVzIGl0LlxuICAgIHByaXZhdGUgX3JlYWRlcjogQnVsa0RhdGFiYXNlUmVhZGVyPFQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgZ2V0IHJlYWRlcigpOiBCdWxrRGF0YWJhc2VSZWFkZXI8VD4ge1xuICAgICAgICBpZiAodGhpcy5fcmVhZGVyKSByZXR1cm4gdGhpcy5fcmVhZGVyO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVsa0RhdGFiYXNlUmVhZGVyPFQ+KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGRlcHM6IHRoaXMuZGVwcyxcbiAgICAgICAgICAgIG1heFRyaWdnZXJUaHJvdHRsZU1zOiB0aGlzLmNvbmZpZy5tYXhUcmlnZ2VyVGhyb3R0bGVNcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5zZXRFbnN1cmVJbmRleCgoKSA9PiB0aGlzLmVuc3VyZUluZGV4KCkpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgKCkgPT4gdm9pZCB0aGlzLmZsdXNoUGVuZGluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwiaGlkZGVuXCIpIHZvaWQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdCBpbiBhIERPTSBjb250ZXh0ICovIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVTZXRQb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIHRoaXMucG9sbEZpbGVTZXQoKSwgYnVsa0RhdGFiYXNlMlRpbWluZy5maWxlU2V0UG9sbEludGVydmFsTXMpO1xuICAgICAgICAodGhpcy5maWxlU2V0UG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgdGhpcy5zZXR1cFZpc2liaWxpdHlNZXJnZUNoZWNrKCk7XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2UubGl2ZUluc3RhbmNlcy5hZGQodGhpcyk7XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2Uuc3RhcnRNZW1vcnlXYXRjaGRvZygpO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IGB2aXNpYmxlTWVyZ2VJbnRlcnZhbE1zYCBvZiBiZWluZy12aXNpYmxlIHRpbWUsIHJ1biBhIG1lcmdlIGNoZWNrLiBGaXJzdCBjaGVjayBmaXJlc1xuICAgIC8vIGB2aXNpYmxlTWVyZ2VJbnRlcnZhbE1zYCBhZnRlciB0aGUgdGFiIGJlY29tZXMgdmlzaWJsZSAobm90IG9uIGluaXRpYWwgbG9hZCDigJQgZ2l2ZXMgdGhlIHVzZXIgYVxuICAgIC8vIG1vbWVudCBvZiBzZXNzaW9uIGNvbW1pdG1lbnQgYmVmb3JlIHdlIHN0YXJ0IGNodXJuaW5nIHRoZSBGUyksIHRoZW4gZXZlcnkgaW50ZXJ2YWwgYWZ0ZXIuIFRhYlxuICAgIC8vIGhpZGluZyBjYW5jZWxzIHRoZSB0aW1lcnM7IHZpc2libGUtYWdhaW4gcmVzdGFydHMuIE5vZGUgaGFzIG5vIGRvY3VtZW50IOKAlCB0aGVyZSB3ZSBjb25zaWRlclxuICAgIC8vIG91cnNlbHZlcyBhbHdheXMtdmlzaWJsZSBhbmQganVzdCBpbnN0YWxsIHRoZSBpbnRlcnZhbCBkaXJlY3RseS5cbiAgICBwcml2YXRlIHNldHVwVmlzaWJpbGl0eU1lcmdlQ2hlY2soKTogdm9pZCB7XG4gICAgICAgIGxldCBmaXJzdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGludGVydmFsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWVyKSB7IGNsZWFyVGltZW91dChmaXJzdFRpbWVyKTsgZmlyc3RUaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgaWYgKGludGVydmFsVGltZXIpIHsgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFRpbWVyKTsgaW50ZXJ2YWxUaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWVyIHx8IGludGVydmFsVGltZXIpIHJldHVybjtcbiAgICAgICAgICAgIGZpcnN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKCk7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHZvaWQgdGhpcy5tYXliZU1lcmdlKCksIGJ1bGtEYXRhYmFzZTJUaW1pbmcudmlzaWJsZU1lcmdlSW50ZXJ2YWxNcyk7XG4gICAgICAgICAgICAgICAgKGludGVydmFsVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgfSwgYnVsa0RhdGFiYXNlMlRpbWluZy52aXNpYmxlTWVyZ2VJbnRlcnZhbE1zKTtcbiAgICAgICAgICAgIChmaXJzdFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgeyBzdGFydCgpOyByZXR1cm47IH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSBcInZpc2libGVcIikgc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBlbHNlIHN0b3AoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIHN0YXJ0KCk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3QgaW4gYSBET00gY29udGV4dCAqLyB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJDYWNoZXM6IFN1YlJlYWRlckNhY2hlcyA9IHsgYnVsazogbmV3IE1hcCgpLCBzdHJlYW06IG5ldyBNYXAoKSB9O1xuXG4gICAgcHJpdmF0ZSBwZW5kaW5nQXBwZW5kczogeyBmcmFtZWQ6IEJ1ZmZlcjsgcm93czogbnVtYmVyIH1bXSA9IFtdO1xuICAgIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBmbHVzaENoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcHJpdmF0ZSBjdXJyZW50Rmx1c2hEZWxheSA9IDA7XG4gICAgcHJpdmF0ZSBsYXN0V3JpdGVUaW1lID0gMDtcblxuICAgIHByaXZhdGUgc3RyZWFtRmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGN1cnJlbnRTdHJlYW1GaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgY3VycmVudFN0cmVhbUZpbGVCeXRlcyA9IDA7XG4gICAgLy8gSW4tcHJvY2VzcyByZS1lbnRyeSBndWFyZDogaWYgYSBtZXJnZSBpcyBydW5uaW5nLCBhZGRpdGlvbmFsIHRyaWdnZXJzICh2aXNpYmlsaXR5IHRpbWVyLCB3cml0ZXMsXG4gICAgLy8gdHJ5TWVyZ2VOb3cgY2FsbHMpIHJldHVybiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHF1ZXVlaW5nLiBLZWVwcyB0aGUgdmlzaWJpbGl0eS10aW1lciBmaXJpbmdzXG4gICAgLy8gZnJvbSBzdGFja2luZyBiZWhpbmQgYSBsb25nIG1lcmdlLlxuICAgIHByaXZhdGUgbWVyZ2VJbkZsaWdodCA9IGZhbHNlO1xuICAgIHByaXZhdGUgbGFzdE1lcmdlU2tpcExvZ01zID0gMDtcbiAgICAvLyBSdW5uaW5nIGNvdW50ZXJzIG9mIHN0cmVhbS10aWVyIHJvd3MgKyBieXRlcyBvbiBkaXNrLiBTZWVkZWQgZnJvbSBlYWNoIExvYWRlZEluZGV4IGJ1aWxkLCB0aGVuXG4gICAgLy8gaW5jcmVtZW50ZWQgcGVyIGZsdXNoIHNvIHRoZSBmb2xkLXRyaWdnZXIgY2hlY2tzIGN1cnJlbnQgZGF0YSB3aXRob3V0IGFuIGV4dHJhIGRpcmVjdG9yeSBsaXN0aW5nLlxuICAgIHByaXZhdGUgc3RyZWFtUm93c09uRGlzayA9IDA7XG4gICAgcHJpdmF0ZSBzdHJlYW1CeXRlc09uRGlzayA9IDA7XG5cbiAgICBwcml2YXRlIGZpbGVTZXRQb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHJlYnVpbGRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVidWlsZERpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWJ1aWxkT3B0aW9uczogeyBkcm9wU3RhbGVGYWxsYmFjazogYm9vbGVhbiB9ID0geyBkcm9wU3RhbGVGYWxsYmFjazogZmFsc2UgfTtcblxuICAgIC8vIOKUgOKUgCBtZW1vcnktcHJlc3N1cmUgd2F0Y2hkb2cgKGdsb2JhbCwgYnJvd3Nlci1vbmx5KSDilIDilIBcbiAgICBwcml2YXRlIHN0YXRpYyBsaXZlSW5zdGFuY2VzID0gbmV3IFNldDxCdWxrRGF0YWJhc2VCYXNlPHsga2V5OiBzdHJpbmcgfT4+KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbWVtb3J5V2F0Y2hkb2dTdGFydGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbGFzdE1lbW9yeUZsdXNoTXMgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHN0YXJ0TWVtb3J5V2F0Y2hkb2coKSB7XG4gICAgICAgIGlmIChCdWxrRGF0YWJhc2VCYXNlLm1lbW9yeVdhdGNoZG9nU3RhcnRlZCkgcmV0dXJuO1xuICAgICAgICBCdWxrRGF0YWJhc2VCYXNlLm1lbW9yeVdhdGNoZG9nU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHVzZWRIZWFwID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICB0cnkgeyByZXR1cm4gKHBlcmZvcm1hbmNlIGFzIHVua25vd24gYXMgeyBtZW1vcnk/OiB7IHVzZWRKU0hlYXBTaXplPzogbnVtYmVyIH0gfSk/Lm1lbW9yeT8udXNlZEpTSGVhcFNpemU7IH1cbiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSBcInVuZGVmaW5lZFwiIHx8IHVzZWRIZWFwKCkgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVzZWQgPSB1c2VkSGVhcCgpO1xuICAgICAgICAgICAgaWYgKHVzZWQgIT09IHVuZGVmaW5lZCkgQnVsa0RhdGFiYXNlQmFzZS5jaGVja01lbW9yeVByZXNzdXJlKHVzZWQpO1xuICAgICAgICB9LCBNRU1PUllfV0FUQ0hET0dfSU5URVJWQUxfTVMpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrTWVtb3J5UHJlc3N1cmUodXNlZEhlYXBCeXRlczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh1c2VkSGVhcEJ5dGVzIDwgYnVsa0RhdGFiYXNlMlRpbWluZy5tZW1vcnlGbHVzaEhlYXBCeXRlcykgcmV0dXJuO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gQnVsa0RhdGFiYXNlQmFzZS5sYXN0TWVtb3J5Rmx1c2hNcyA8IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVtb3J5Rmx1c2hUaHJvdHRsZU1zKSByZXR1cm47XG4gICAgICAgIEJ1bGtEYXRhYmFzZUJhc2UubGFzdE1lbW9yeUZsdXNoTXMgPSBub3c7XG4gICAgICAgIGNvbnN0IGZsdXNoZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGIgb2YgQnVsa0RhdGFiYXNlQmFzZS5saXZlSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IGRiLnJlYWRlci5pbmRleD8udG90YWxCeXRlcyA/PyAwO1xuICAgICAgICAgICAgaWYgKGJ5dGVzID4gYnVsa0RhdGFiYXNlMlRpbWluZy5tZW1vcnlGbHVzaE1pbkNvbGxlY3Rpb25CeXRlcykge1xuICAgICAgICAgICAgICAgIGZsdXNoZWQucHVzaChgJHtkYi5uYW1lfSAoJHtmbXRCeXRlcyhieXRlcyl9KWApO1xuICAgICAgICAgICAgICAgIGRiLnJlbG9hZEZyb21EaXNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsdXNoZWQubGVuZ3RoKSBjb25zb2xlLmxvZyhgW2J1bGsyXSBoZWFwICR7Zm10Qnl0ZXModXNlZEhlYXBCeXRlcyl9IG92ZXIgJHtmbXRCeXRlcyhidWxrRGF0YWJhc2UyVGltaW5nLm1lbW9yeUZsdXNoSGVhcEJ5dGVzKX0gLSBmbHVzaGVkICR7Zmx1c2hlZC5sZW5ndGh9IGxhcmdlIGNvbGxlY3Rpb24ocyk6ICR7Zmx1c2hlZC5qb2luKFwiLCBcIil9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckNhY2hlKCkge1xuICAgICAgICBibG9ja0NhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbmFibGVOZXR3b3JrQ29tcGFjdGlvbigpIHtcbiAgICAgICAgbmV0d29ya0NvbXBhY3Rpb25FbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmFnZSA9IGxhenkoYXN5bmMgKCkgPT4gdGhpcy5zdG9yYWdlRmFjdG9yeShgJHtCVUxLX1JPT1RfRk9MREVSfS8ke3RoaXMubmFtZX1gKSk7XG5cbiAgICBwdWJsaWMgYXN5bmMgaXNSZW1vdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiAhIShhd2FpdCB0aGlzLnN0b3JhZ2UoKSkuaXNSZW1vdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdHJlYW1OZWVkc0ZvbGQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbVJvd3NPbkRpc2sgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1Gb2xkVHJpZ2dlclJvd3NcbiAgICAgICAgICAgICYmIHRoaXMuc3RyZWFtQnl0ZXNPbkRpc2sgPiBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZvbGRUcmlnZ2VyQnl0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRvbWF0aWNDb21wYWN0aW9uQWxsb3dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKG5ldHdvcmtDb21wYWN0aW9uRW5hYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChpc05vZGUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhKGF3YWl0IHRoaXMuc3RvcmFnZSgpKS5pc1JlbW90ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNLZXlXYXRjaGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0tleVdhdGNoZWQoa2V5KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgaW5kZXggbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5kZXgoKTogUHJvbWlzZTxMb2FkZWRJbmRleDxUPj4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkZXIuaW5kZXgpIHJldHVybiB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgaWYgKCFpZHgpIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5hbWV9OiBpbmRleCBmYWlsZWQgdG8gYnVpbGRgKTtcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICAvLyBDb2FsZXNjaW5nIHJlYnVpbGQgbG9vcDogdHJpZ2dlcnMgZHVyaW5nIGEgYnVpbGQgc2V0IHJlYnVpbGREaXJ0eSBzbyB0aGUgbG9vcCBpdGVyYXRlcyBvbmNlIG1vcmVcbiAgICAvLyB3aGVuIGl0IGZpbmlzaGVzIOKAlCBOIHJhcGlkIHRyaWdnZXJzIGNhdXNlIGF0IG1vc3QgT05FIGV4dHJhIHJlYnVpbGQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIGVuZHMuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyUmVidWlsZChvcHRzOiB7IGRyb3BTdGFsZUZhbGxiYWNrPzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKG9wdHMuZHJvcFN0YWxlRmFsbGJhY2spIHRoaXMucmVidWlsZE9wdGlvbnMuZHJvcFN0YWxlRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5yZWJ1aWxkUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZFByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWJ1aWxkUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kb09uZVJlYnVpbGQoKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlICh0aGlzLnJlYnVpbGREaXJ0eSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkT3B0aW9ucy5kcm9wU3RhbGVGYWxsYmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkUHJvbWlzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvT25lUmVidWlsZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gYXdhaXQgTG9hZGVkSW5kZXguYnVpbGQ8VD4oe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgIGJ1bGtGaWxlcyxcbiAgICAgICAgICAgIHN0cmVhbUZpbGVzLFxuICAgICAgICAgICAgc3ViQ2FjaGVzOiB0aGlzLnN1YkNhY2hlcyxcbiAgICAgICAgICAgIG9uVW5yZWFkYWJsZUZpbGU6IChmLCBtc2cpID0+IHRoaXMuaGFuZGxlVW5yZWFkYWJsZUZpbGUoZiwgbXNnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KG5ld0luZGV4LCB7IGRyb3BTdGFsZUZhbGxiYWNrOiB0aGlzLnJlYnVpbGRPcHRpb25zLmRyb3BTdGFsZUZhbGxiYWNrIH0pO1xuICAgICAgICB0aGlzLnN0cmVhbVJvd3NPbkRpc2sgPSBuZXdJbmRleC5zdHJlYW1Sb3dzT25EaXNrO1xuICAgICAgICB0aGlzLnN0cmVhbUJ5dGVzT25EaXNrID0gbmV3SW5kZXguc3RyZWFtQnl0ZXNPbkRpc2s7XG4gICAgICAgIGlmIChvbGRJbmRleCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmIG9mIG9sZEluZGV4LmZpbGVTZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5ld0luZGV4LmZpbGVTZXQuaGFzKGYpKSBibG9ja0NhY2hlLmV2aWN0KG51bGxKb2luKHRoaXMubmFtZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJvcCBldmVyeXRoaW5nIGluLW1lbW9yeSwgaGFyZCByZXNldC4gUGVuZGluZyB1bi1mbHVzaGVkIHdyaXRlcyBzdXJ2aXZlIChzdGlsbCBpbiBvdmVybGF5KS5cbiAgICBwdWJsaWMgcmVsb2FkRnJvbURpc2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3ViQ2FjaGVzLmJ1bGsuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zdWJDYWNoZXMuc3RyZWFtLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucmVhZGVyLmluZGV4Py5kcm9wTG9hZGVkVmFsdWVzKCk7XG4gICAgICAgIHZvaWQgdGhpcy50cmlnZ2VyUmVidWlsZCh7IGRyb3BTdGFsZUZhbGxiYWNrOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIEV4dGVybmFsLW1lcmdlIGRldGVjdGlvbjogaWYgc29tZSBvdGhlciB0YWIvcHJvY2VzcyBjaGFuZ2VkIHRoZSBmaWxlIHNldCB1bmRlciB1cywgcmVidWlsZC5cbiAgICBwcml2YXRlIGFzeW5jIHBvbGxGaWxlU2V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMucmVhZGVyLmluZGV4KSByZXR1cm47XG4gICAgICAgIGxldCBjdXJyZW50OiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgU2V0KFsuLi5idWxrRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSksIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpXSk7XG4gICAgICAgIH0gY2F0Y2ggeyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMucmVhZGVyLmluZGV4Py5maWxlU2V0O1xuICAgICAgICBpZiAoIXByZXYpIHJldHVybjtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IGN1cnJlbnQuc2l6ZSAhPT0gcHJldi5zaXplIHx8IFsuLi5jdXJyZW50XS5zb21lKG4gPT4gIXByZXYuaGFzKG4pKTtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHZvaWQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZFdpdGhSZXRyeTxSPihmbjogKCkgPT4gUHJvbWlzZTxSPik6IFByb21pc2U8Uj4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyA7IGF0dGVtcHQrKykge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgICAgICB0cnkgeyByZXR1cm4gYXdhaXQgZm4oKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWlzc2luZ0ZpbGVFcnJvcikgfHwgYXR0ZW1wdCA+PSBNQVhfSU5ERVhfUkVMT0FEX0FUVEVNUFRTKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWRlci5pbmRleCA9PT0gYmVmb3JlKSBhd2FpdCB0aGlzLnRyaWdnZXJSZWJ1aWxkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgY3Jvc3MtdGFiIHN5bmMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgcHJpdmF0ZSBzeW5jU2V0dXAgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1N5bmNTdXBwb3J0ZWQoKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IHJlY2VudCA9IGF3YWl0IHN5bmNDb25uZWN0KHRoaXMubmFtZSwgdyA9PiB0aGlzLmFwcGx5UmVtb3RlKHcpLCAoKSA9PiB7IHRoaXMuc3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7IH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgcmVjZW50KSB0aGlzLmFwcGx5UmVtb3RlKHcpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBhcHBseVJlbW90ZSh3cml0ZTogUmVtb3RlV3JpdGUpIHtcbiAgICAgICAgaWYgKHdyaXRlLnRpbWUgPD0gdGhpcy5yZWFkZXIubG9jYWxUaW1lKHdyaXRlLmtleSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5kZXBzLmJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh3cml0ZS5kZWxldGVkKSB0aGlzLnJlYWRlci5hcHBseURlbGV0ZSh3cml0ZS5rZXksIHdyaXRlLnRpbWUpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnJlYWRlci5hcHBseVdyaXRlKHdyaXRlLmtleSwgd3JpdGUudmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHdyaXRlLnRpbWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgd3JpdGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIHB1YmxpYyBhc3luYyB3cml0ZShlbnRyeTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJhdGNoKFtlbnRyeV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3cml0ZUJhdGNoKGVudHJpZXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgY29uc3Qgcm93cyA9IGVudHJpZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICAgICAgICBjb25zdCBzdGFtcGVkID0gcm93cy5tYXAocm93ID0+ICh7IHRpbWU6IGdldFRpbWVVbmlxdWUoKSwgcm93IH0pKTtcbiAgICAgICAgY29uc3QgZnJhbWVkID0gZnJhbWVSb3dzKHN0YW1wZWQpO1xuXG4gICAgICAgIC8vIEJpZyBiYXRjaGVzIHNraXAgdGhlIHN0cmVhbSBhbmQgYmVjb21lIGEgYnVsayBmaWxlIGRpcmVjdGx5IOKAlCBzdHJlYW1pbmcgdGhvdXNhbmRzIG9mIHJvd3NcbiAgICAgICAgLy8gb25lIGZyYW1lIGF0IGEgdGltZSB3b3VsZCBqdXN0IGNodXJuLlxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPj0gUk9MTE9WRVJfUk9XUyB8fCBmcmFtZWQubGVuZ3RoID49IFJPTExPVkVSX0JZVEVTKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlQnVsa0ZpbGUocm93cyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlcHMuYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpbWUsIHJvdyB9IG9mIHN0YW1wZWQpIHRoaXMucmVhZGVyLmFwcGx5V3JpdGUocm93LmtleSBhcyBzdHJpbmcsIHJvdywgdGltZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHsgdGltZSwgcm93IH0gb2Ygc3RhbXBlZCkgc3luY0Jyb2FkY2FzdCh0aGlzLm5hbWUsIHsga2V5OiByb3cua2V5IGFzIHN0cmluZywgdGltZSwgdmFsdWU6IHJvdyB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1BcHBlbmQoZnJhbWVkLCBzdGFtcGVkLmxlbmd0aCk7XG4gICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKHsgb25seUlmU3RyZWFtSGVhdnk6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVCYXRjaChba2V5XSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZUJhdGNoKGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICBjb25zdCBzdGFtcGVkID0ga2V5cy5tYXAoa2V5ID0+ICh7IHRpbWU6IGdldFRpbWVVbmlxdWUoKSwga2V5IH0pKTtcbiAgICAgICAgdGhpcy5kZXBzLmJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aW1lLCBrZXkgfSBvZiBzdGFtcGVkKSB0aGlzLnJlYWRlci5hcHBseURlbGV0ZShrZXksIHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCB7IHRpbWUsIGtleSB9IG9mIHN0YW1wZWQpIHN5bmNCcm9hZGNhc3QodGhpcy5uYW1lLCB7IGtleSwgdGltZSwgZGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1BcHBlbmQoZnJhbWVEZWxldGVzKHN0YW1wZWQpLCBzdGFtcGVkLmxlbmd0aCk7XG4gICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKHsgb25seUlmU3RyZWFtSGVhdnk6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29hbGVzY2Ugc3RyZWFtIGFwcGVuZHMgb24gYSByYW1waW5nIHBlci1jb2xsZWN0aW9uIHNjaGVkdWxlICh0aGUgYnJvd3NlciByZXdyaXRlcyB0aGUgd2hvbGVcbiAgICAvLyBmaWxlIHBlciBhcHBlbmQpLiBUaGUgZmlyc3Qgd3JpdGUgYWZ0ZXIgYSBsdWxsIGZsdXNoZXMgaW1tZWRpYXRlbHkgc28gYSBzaW5nbGUgZWRpdC10aGVuLWNsb3NlXG4gICAgLy8gaXMgc2F2ZWQgYXQgb25jZTsgc3VzdGFpbmVkIHdyaXRlcyByYW1wIHRvd2FyZCB3cml0ZUZsdXNoTWF4RGVsYXlNcy5cbiAgICBwcml2YXRlIGFzeW5jIHN0cmVhbUFwcGVuZChmcmFtZWQ6IEJ1ZmZlciwgcm93czogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0FwcGVuZHMucHVzaCh7IGZyYW1lZCwgcm93cyB9KTtcbiAgICAgICAgY29uc3QgbWF4ID0gYnVsa0RhdGFiYXNlMlRpbWluZy53cml0ZUZsdXNoTWF4RGVsYXlNcztcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG1heCA8PSAwIHx8IHRoaXMuY3VycmVudEZsdXNoRGVsYXkgPD0gMCB8fCBub3cgLSB0aGlzLmxhc3RXcml0ZVRpbWUgPiBtYXgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFdyaXRlVGltZSA9IG5vdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZsdXNoRGVsYXkgPSBtYXggPiAwID8gTWF0aC5taW4obWF4LCBXUklURV9GTFVTSF9GSVJTVF9TVEVQX01TKSA6IDA7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdFdyaXRlVGltZSA9IG5vdztcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hUaW1lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5mbHVzaFRpbWVyID0gdW5kZWZpbmVkOyB2b2lkIHRoaXMuZmx1c2hQZW5kaW5nKCk7IH0sIHRoaXMuY3VycmVudEZsdXNoRGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudEZsdXNoRGVsYXkgPSBNYXRoLm1pbihtYXgsIHRoaXMuY3VycmVudEZsdXNoRGVsYXkgKiAyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaFBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoVGltZXIgIT09IHVuZGVmaW5lZCkgeyBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKTsgdGhpcy5mbHVzaFRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgICAgIHRoaXMuZmx1c2hDaGFpbiA9IHRoaXMuZmx1c2hDaGFpbi50aGVuKCgpID0+IHRoaXMuZG9GbHVzaCgpKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBzdHJlYW0gZmx1c2ggZmFpbGVkLCB3aWxsIHJldHJ5OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2hDaGFpbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nQXBwZW5kcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLnBlbmRpbmdBcHBlbmRzLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gQnVmZmVyLmNvbmNhdChiYXRjaC5tYXAocCA9PiBwLmZyYW1lZCkpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRTdHJlYW1GaWxlTmFtZSgpO1xuICAgICAgICBpZiAoZmlsZU5hbWUgIT09IHRoaXMuY3VycmVudFN0cmVhbUZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbiBmYWlsdXJlIHRoZSB0aHJvdyBsZWF2ZXMgcGVuZGluZ0FwcGVuZHMgaW50YWN0IHNvIGEgbGF0ZXIgZmx1c2ggcmV0cmllcy5cbiAgICAgICAgYXdhaXQgc3RvcmFnZS5hcHBlbmQoZmlsZU5hbWUsIGNvbWJpbmVkKTtcbiAgICAgICAgLy8gTmV3IGVudHJpZXMgYXBwZW5kZWQgZHVyaW5nIHRoZSBhd2FpdCBhcmUgYWZ0ZXIgYGJhdGNoYCDigJQgcmVtb3ZpbmcgdGhlIGZyb250IGlzIGV4YWN0bHkgdGhlXG4gICAgICAgIC8vIGZsdXNoZWQgc2V0LlxuICAgICAgICB0aGlzLnBlbmRpbmdBcHBlbmRzLnNwbGljZSgwLCBiYXRjaC5sZW5ndGgpO1xuICAgICAgICB0aGlzLnN0cmVhbUJ5dGVzT25EaXNrICs9IGNvbWJpbmVkLmxlbmd0aDtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGJhdGNoKSB0aGlzLnN0cmVhbVJvd3NPbkRpc2sgKz0gcC5yb3dzO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlQnl0ZXMgKz0gY29tYmluZWQubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RyZWFtRmlsZUJ5dGVzID49IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtRmlsZU1heEJ5dGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RyZWFtRmlsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdHJlYW1GaWxlQnl0ZXMgPSAwO1xuICAgICAgICAgICAgdm9pZCB0aGlzLmZvbGRPd25TdHJlYW0oZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdHJlYW1GaWxlTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICAvLyBTZWFsIG91ciBjdXJyZW50IGZpbGUgb25jZSBpdCBhZ2VzIHBhc3QgdGhlIHNlYWwgdGhyZXNob2xkIOKAlCBubyBmaWxlIGlzIGV2ZXIgYXBwZW5kZWQgdG8gcGFzdFxuICAgICAgICAvLyBpdHMgc2VhbCBhZ2UsIHdoaWNoIGxldHMgYSBjb25zb2xpZGF0aW9uIHNhZmVseSBmb2xkIGl0IG9uY2UgYWdlZC5cbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtRmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSBwYXJzZVN0cmVhbUZpbGVOYW1lKHRoaXMuc3RyZWFtRmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKGluZm8gJiYgRGF0ZS5ub3coKSAtIGluZm8udGltZXN0YW1wID49IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtU2VhbEFnZU1zKSB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1GaWxlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IGBzdHJlYW1fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX0ke1NUUkVBTV9FWFRFTlNJT059YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW1GaWxlTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZvbGRPd25TdHJlYW0oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmZvID0gcGFyc2VTdHJlYW1GaWxlTmFtZShmaWxlTmFtZSk7XG4gICAgICAgIGlmICghaW5mbykgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXQoW10sIFtpbmZvXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogZm9sZGluZyBvd24gc3RyZWFtICR7ZmlsZU5hbWV9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoZW50cnk6IFBhcnRpYWw8VD4gJiB7IGtleTogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQmF0Y2goW2VudHJ5XSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZUJhdGNoKGVudHJpZXM6IChQYXJ0aWFsPFQ+ICYgeyBrZXk6IHN0cmluZyB9KVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgY29uc3QgcHJlc2VudDogVFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUVudHJ5ID0gdGhpcy5yZWFkZXIub3ZlcmxheS5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IG92ZXJsYXlFbnRyeSA/IG92ZXJsYXlFbnRyeS52YWx1ZSAhPT0gREVMRVRFRCA6IGluZGV4LmtleXMuaGFzKGVudHJ5LmtleSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9LnVwZGF0ZToga2V5ICR7SlNPTi5zdHJpbmdpZnkoZW50cnkua2V5KX0gaXMgbm90IGluIHRoZSBjb2xsZWN0aW9uLCBpZ25vcmluZ2ApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlc2VudC5wdXNoKGVudHJ5IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXNlbnQubGVuZ3RoKSBhd2FpdCB0aGlzLndyaXRlQmF0Y2gocHJlc2VudCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIGZpbGUgbGlzdGluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgcHJpdmF0ZSBhc3luYyBsaXN0RmlsZXMoKTogUHJvbWlzZTx7IGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW107IHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdIH0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGF3YWl0IHN0b3JhZ2UuZ2V0S2V5cygpO1xuICAgICAgICAvLyBBIGNvbnN1bWVkLW1lcmdlIGlucHV0IGlzIGhpZGRlbiBmcm9tIHJlYWRzIHRoZSBpbnN0YW50IGl0cyBkZWxldGlvbiBtYXJrZXIgZXhpc3RzIOKAlCB0aGF0J3NcbiAgICAgICAgLy8gd2hhdCBzdG9wcyBpdCBmcm9tIGJlaW5nIHJlLXJlYWQgYW5kIHJlLW1lcmdlZC4gUGh5c2ljYWwgZGVsZXRpb24gKyBtYXJrZXIgY2xlYW51cCBydW5zIG9uIGFcbiAgICAgICAgLy8gdGhyb3R0bGUgKG5vdCBpbmxpbmUpIHNvIGEgcmVhZCBpc24ndCBzbG93ZWQgYnkgaXQuXG4gICAgICAgIGNvbnN0IG1hcmtlcnMgPSBhd2FpdCByZWFkRGVsZXRlTWFya2VycyhzdG9yYWdlLCBuYW1lcyk7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gbWFya2VyRXhjbHVzaW9ucyhtYXJrZXJzKTtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoKSB2b2lkIHRoaXMucHJvY2Vzc01hcmtlcnMoKTtcbiAgICAgICAgY29uc3QgYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgbmFtZXMpIHtcbiAgICAgICAgICAgIGlmIChleGNsdWRlZC5oYXMobikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG4uZW5kc1dpdGgoRklMRV9FWFRFTlNJT04pKSB7IGNvbnN0IHAgPSBwYXJzZUZpbGVOYW1lKG4pOyBpZiAocCkgYnVsa0ZpbGVzLnB1c2gocCk7IH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG4uZW5kc1dpdGgoU1RSRUFNX0VYVEVOU0lPTikpIHsgY29uc3QgcCA9IHBhcnNlU3RyZWFtRmlsZU5hbWUobik7IGlmIChwKSBzdHJlYW1GaWxlcy5wdXNoKHApOyB9XG4gICAgICAgIH1cbiAgICAgICAgYnVsa0ZpbGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGlmIChhLnRpbWVzdGFtcCAhPT0gYi50aW1lc3RhbXApIHJldHVybiBiLnRpbWVzdGFtcCAtIGEudGltZXN0YW1wO1xuICAgICAgICAgICAgcmV0dXJuIGEuZmlsZU5hbWUgPCBiLmZpbGVOYW1lICYmIDEgfHwgYS5maWxlTmFtZSA+IGIuZmlsZU5hbWUgJiYgLTEgfHwgMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnQoc3RyZWFtRmlsZXMsIGYgPT4gZi50aW1lc3RhbXApO1xuICAgICAgICByZXR1cm4geyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH07XG4gICAgfVxuXG4gICAgLy8gVGhyb3R0bGVkIG1hcmtlciBob3VzZWtlZXBpbmc6IGRlbGV0ZSBpbnB1dHMgd2hvc2UgcmVwbGFjZW1lbnQgb3V0cHV0cyBoYXZlIGxhbmRlZCAob3Igd2hvc2VcbiAgICAvLyBtYXJrZXIgaGFzIGFnZWQgb3V0KSBhbmQgcmV0aXJlIGZ1bGZpbGxlZCBtYXJrZXJzLiBUcmlnZ2VyZWQgZnJvbSBsaXN0RmlsZXMsIHNvIGl0J3MgZ2F0ZWQgdG9cbiAgICAvLyBhdm9pZCBhIGRlbGV0ZSBzdG9ybSB1bmRlciBoZWF2eSByZWFkcy5cbiAgICBwcml2YXRlIHByb2Nlc3NNYXJrZXJzID0gdGhyb3R0bGVGdW5jdGlvbigzMCAqIDEwMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGF3YWl0IHN0b3JhZ2UuZ2V0S2V5cygpO1xuICAgICAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgcmVhZERlbGV0ZU1hcmtlcnMoc3RvcmFnZSwgbmFtZXMpO1xuICAgICAgICBpZiAobWFya2Vycy5sZW5ndGgpIGF3YWl0IHByb2Nlc3NEZWxldGVNYXJrZXJzKHRoaXMubmFtZSwgc3RvcmFnZSwgbWFya2VycywgbmFtZXMpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUJ1bGtGaWxlKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXh0RmlsZVRpbWUoKTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdGltZXMgPSByb3dzLm1hcCgoKSA9PiBub3cpO1xuICAgICAgICBmb3IgKGNvbnN0IGJ1aWx0IG9mIGJ1aWxkRmlsZUJ1ZmZlcihyb3dzLCB0aW1lcykpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuZXdGaWxlTmFtZSh0aW1lc3RhbXApO1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQobmFtZSwgZW5jb2RlQ29tcHJlc3NlZEJsb2NrcyhidWlsdC5idWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnRyaWdnZXJSZWJ1aWxkKCk7XG4gICAgICAgIHZvaWQgdGhpcy5tYXliZU1lcmdlKCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIG1lcmdlIHBvbGljeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDYWxsZWQgYm90aCBwZXJpb2RpY2FsbHkgKHZpc2liaWxpdHkgdGltZXIpIGFuZCBvbiB3cml0ZXMgKHdpdGggdGhlIHN0cmVhbU5lZWRzRm9sZCBnYXRlIHNvIGFcbiAgICAvLyBzbWFsbCB3cml0ZSBkb2Vzbid0IGRyYWcgdGhlIG1lcmdlIHRocm91Z2gpLiBUaGUgbWVyZ2VJbkZsaWdodCBjaGVjayBpbiB0cnlNZXJnZU5vdyBza2lwcyBhbnlcbiAgICAvLyBjYWxsIHRoYXQgYXJyaXZlcyB3aGlsZSBhIHByZXZpb3VzIG9uZSBpcyBzdGlsbCBydW5uaW5nIOKAlCBzbyA1LW1pbiB0aW1lciB0aWNrcyBkb24ndCBwaWxlIHVwLlxuICAgIHByaXZhdGUgYXN5bmMgbWF5YmVNZXJnZShvcHRzOiB7IG9ubHlJZlN0cmVhbUhlYXZ5PzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmF1dG9tYXRpY0NvbXBhY3Rpb25BbGxvd2VkKCkpIHJldHVybjtcbiAgICAgICAgaWYgKG9wdHMub25seUlmU3RyZWFtSGVhdnkgJiYgIXRoaXMuc3RyZWFtTmVlZHNGb2xkKCkpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudHJ5TWVyZ2VUaHJvdHRsZWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX06IGJhY2tncm91bmQgbWVyZ2UgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIFwid2UgZGlkbid0IG1lcmdlXCIgcmVzdWx0IGFuZCBsb2cgaXQgKHRocm90dGxlZCDigJQgc2VlIE1FUkdFX1NLSVBfTE9HX0lOVEVSVkFMX01TKS4gRm9yXG4gICAgLy8gbG9jayByZWFzb25zIHRoZSBsb2cgYW5kIHJlc3VsdCBpbmNsdWRlIHRoZSBob2xkZXIgYW5kIHRpbWUgdW50aWwgdGhlIGxvY2sgZ29lcyBzdGFsZS5cbiAgICBwcml2YXRlIGFzeW5jIG1lcmdlU2tpcChyZWFzb246IE1lcmdlU2tpcFJlYXNvbik6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIGxldCBsb2NrOiBNZXJnZUxvY2tJbmZvIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVhc29uID09PSBcInRhYkxvY2tIZWxkXCIpIHtcbiAgICAgICAgICAgIGxvY2sgPSBwZWVrTWVyZ2VMb2NrKHRoaXMubmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVhc29uID09PSBcImZpbGVMb2NrSGVsZFwiKSB7XG4gICAgICAgICAgICBsb2NrID0gYXdhaXQgcGVla01lcmdlRmlsZUxvY2soYXdhaXQgdGhpcy5zdG9yYWdlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0TWVyZ2VTa2lwTG9nTXMgPj0gTUVSR0VfU0tJUF9MT0dfSU5URVJWQUxfTVMpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdE1lcmdlU2tpcExvZ01zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGxvY2sgJiYgYCAoaGVsZCBieSAke2xvY2suaG9sZGVySWR9LCBleHBpcmVzIGluICR7Zm9ybWF0VGltZShNYXRoLm1heCgwLCBsb2NrLmV4cGlyZXNJbk1zKSl9KWAgfHwgXCJcIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKFwibWVyZ2VcIil9IHNraXBwZWQ6ICR7cmVhc29ufSR7ZGV0YWlsfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1lcmdlZDogZmFsc2UsIHNraXBSZWFzb246IHJlYXNvbiwgbG9ja0hvbGRlcklkOiBsb2NrPy5ob2xkZXJJZCwgbG9ja0V4cGlyZXNJbk1zOiBsb2NrPy5leHBpcmVzSW5NcyB9O1xuICAgIH1cblxuICAgIC8vIEFjcXVpcmUgYm90aCBtZXJnZSBsb2NrcyAoc2FtZS10YWIgbWVyZ2VJbkZsaWdodCwgY3Jvc3MtdGFiIGxvY2FsU3RvcmFnZSwgY3Jvc3MtcHJvY2VzcyBmaWxlKSxcbiAgICAvLyBydW4gdGhlIHBhc3MsIHJlbGVhc2UuIFNraXBzICh3aXRoIHRoZSByZWFzb24pIGluc3RlYWQgb2Ygd2FpdGluZyB3aGVuIGFueSBvZiB0aGVtIGlzIGhlbGQuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5Mb2NrZWRNZXJnZShydW46ICgpID0+IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0Pik6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIGlmICh0aGlzLm1lcmdlSW5GbGlnaHQpIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlU2tpcChcIm1lcmdlSW5GbGlnaHRcIik7XG4gICAgICAgIGlmICghdHJ5QWNxdWlyZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKSkgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VTa2lwKFwidGFiTG9ja0hlbGRcIik7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgaGF2ZUZpbGVMb2NrID0gYXdhaXQgdHJ5QWNxdWlyZU1lcmdlRmlsZUxvY2soc3RvcmFnZSwgd3JpdGVySWQpO1xuICAgICAgICBpZiAoIWhhdmVGaWxlTG9jaykge1xuICAgICAgICAgICAgcmVsZWFzZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlU2tpcChcImZpbGVMb2NrSGVsZFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lcmdlSW5GbGlnaHQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzdG9wSGVhcnRiZWF0ID0gc3RhcnRNZXJnZUZpbGVMb2NrSGVhcnRiZWF0KHN0b3JhZ2UsIHdyaXRlcklkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHN0b3BIZWFydGJlYXQoKTtcbiAgICAgICAgICAgIGF3YWl0IHJlbGVhc2VNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIHdyaXRlcklkKTtcbiAgICAgICAgICAgIHJlbGVhc2VNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCk7XG4gICAgICAgICAgICB0aGlzLm1lcmdlSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBiYWNrZ3JvdW5kIHBhdGggKG1heWJlTWVyZ2UpIGdvZXMgdGhyb3VnaCB0aGlzIHNvIHdyaXRlIGJ1cnN0cyBjb2FsZXNjZTsgZXhwbGljaXQgY2FsbGVycyB1c2VcbiAgICAvLyB0cnlNZXJnZU5vdyBkaXJlY3RseSBhbmQgZ2V0IHRoZSBwZXItY2FsbCByZXN1bHQuXG4gICAgcHJpdmF0ZSB0cnlNZXJnZVRocm90dGxlZCA9IHRocm90dGxlRnVuY3Rpb24oMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnRyeU1lcmdlTm93KCk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgYXN5bmMgdHJ5TWVyZ2VOb3coKTogUHJvbWlzZTxNZXJnZUF0dGVtcHRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuTG9ja2VkTWVyZ2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gYXdhaXQgdGhpcy50ZXN0TWVyZ2VJTlRFUk5BTF9ET19OT1RfQ0FMTCgpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVyZ2VkIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8TWVyZ2VBdHRlbXB0UmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZE1lcmdlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nKCk7XG4gICAgICAgICAgICBzeW5jQnJvYWRjYXN0U2VhbCh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1GaWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgICAgIGlmIChidWxrRmlsZXMubGVuZ3RoICsgc3RyZWFtRmlsZXMubGVuZ3RoIDwgMSkgcmV0dXJuIGF3YWl0IHRoaXMubWVyZ2VTa2lwKFwibm90aGluZ1RvTWVyZ2VcIik7XG4gICAgICAgICAgICAvLyBjb21wYWN0KCkgZm9sZHMgZXZlcnkgZmlsZSDihpIgbm8gb2xkZXIgZGF0YSBzdXJ2aXZlcyBvdXRzaWRlIGl0IOKGkiBzdXJ2aXZpbmcgdG9tYnN0b25lc1xuICAgICAgICAgICAgLy8gY2FuIGJlIGRyb3BwZWQgKG5vdGhpbmcgbGVmdCB0byBzdXBwcmVzcykuXG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChidWxrRmlsZXMsIHN0cmVhbUZpbGVzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1lcmdlZCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbWVyZ2UodGltZUxvOiBudW1iZXIsIHRpbWVIaTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aW1lSGkgPj0gRGF0ZS5ub3coKSkgeyBzeW5jQnJvYWRjYXN0U2VhbCh0aGlzLm5hbWUpOyB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkOyB9XG4gICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoZiA9PiB0aGlzLnJlYWRCdWxrSGVhZGVyKGYuZmlsZU5hbWUpKSk7XG4gICAgICAgIGNvbnN0IHNlbEJ1bGsgPSBidWxrRmlsZXMuZmlsdGVyKChmLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGlmICghaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFoLm1heFRpbWUgJiYgIWgubWluVGltZSkgcmV0dXJuIHRpbWVMbyA8PSAwO1xuICAgICAgICAgICAgcmV0dXJuIGgubWluVGltZSA8PSB0aW1lSGkgJiYgaC5tYXhUaW1lID49IHRpbWVMbztcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlbFN0cmVhbSA9IHN0cmVhbUZpbGVzLmZpbHRlcihmID0+XG4gICAgICAgICAgICBmLnRpbWVzdGFtcCA8PSB0aW1lSGkgJiYgZi50aW1lc3RhbXAgKyBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbVNlYWxBZ2VNcyA+PSB0aW1lTG8pO1xuICAgICAgICBpZiAoc2VsQnVsay5sZW5ndGggKyBzZWxTdHJlYW0ubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldChzZWxCdWxrLCBzZWxTdHJlYW0sIHRpbWVMbyA8PSAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlYWRCdWxrSGVhZGVyKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtIZWFkZXJJbmZvIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBtYWtlUmF3R2V0UmFuZ2Uoc3RvcmFnZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUlkID0gbnVsbEpvaW4odGhpcy5uYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvcGVuZWQgPSBhd2FpdCBibG9ja0NhY2hlLm9wZW4oZmlsZUlkLCByYXcuc2l6ZSwgcmF3LnJhd0dldFJhbmdlKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBsb2FkQnVsa0hlYWRlcihvcGVuZWQuZ2V0UmFuZ2UsIG9wZW5lZC51bmNvbXByZXNzZWRTaXplKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaWxlTG9naWNhbFNpemUoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBtYWtlUmF3R2V0UmFuZ2Uoc3RvcmFnZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUlkID0gbnVsbEpvaW4odGhpcy5uYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvcGVuZWQgPSBhd2FpdCBibG9ja0NhY2hlLm9wZW4oZmlsZUlkLCByYXcuc2l6ZSwgcmF3LnJhd0dldFJhbmdlKTtcbiAgICAgICAgICAgIHJldHVybiBvcGVuZWQudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBidWxrIGZpbGUgdGhhdCB3b24ndCBsb2FkIGlzIGVpdGhlciBhbiBpbi1wcm9ncmVzcyB3cml0ZSAocmVjZW50KSBvciBhIGNyYXNoZWQgcGFydGlhbCB3cml0ZVxuICAgIC8vIChzdGFsZSkuIFdhcm4gd2hpbGUgcmVjZW50LCBkZWxldGUgb25jZSBjbGVhcmx5IGFiYW5kb25lZCDigJQgZGVsZXRpbmcgaXMgc2FmZSBiZWNhdXNlIHRoZSB3cml0ZVxuICAgIC8vIHByb3RvY29sIGFsd2F5cyBsYW5kcyB0aGUgcmVwbGFjZW1lbnQgYmVmb3JlIHJlbW92aW5nIHRoZSBmaWxlIGl0IHN1cGVyc2VkZXMuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVVbnJlYWRhYmxlRmlsZShmaWxlOiBCdWxrRmlsZUluZm8sIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBhZ2VNcyA9IERhdGUubm93KCkgLSBmaWxlLnRpbWVzdGFtcDtcbiAgICAgICAgaWYgKGFnZU1zID4gU1RBTEVfREVMRVRFX01TKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5uYW1lfTogZGVsZXRpbmcgc3RhbGUgdW5yZWFkYWJsZSBidWxrIGZpbGUgJHtmaWxlLmZpbGVOYW1lfSAoJHtNYXRoLnJvdW5kKGFnZU1zIC8gODY0MDAwMDApfWQgb2xkKTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5yZW1vdmUoZmlsZS5maWxlTmFtZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZW1vdmVFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBmYWlsZWQgdG8gZGVsZXRlICR7ZmlsZS5maWxlTmFtZX06ICR7KHJlbW92ZUVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9OiBza2lwcGluZyB1bnJlYWRhYmxlIGJ1bGsgZmlsZSAke2ZpbGUuZmlsZU5hbWV9IChyZWNlbnQgLSBtYXkgYmUgaW4tcHJvZ3Jlc3MpOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG9uZSBtZXJnZSBwcmltaXRpdmUuIFJlYWRzICsgcGxhbnMgKyB3cml0ZXMgb3V0cHV0cyBiZWZvcmUgZGVsZXRpbmcgYW55IGlucHV0LCBzbyBhIGNyYXNoXG4gICAgLy8gbGVhdmVzIGR1cGxpY2F0ZXMgKG5leHQgbWVyZ2UgZGVkdXBlcykgcmF0aGVyIHRoYW4gYSBnYXAuIEFmdGVyIHRoZSBmaWxlIHNldCBjaGFuZ2VzIG9uIGRpc2ssXG4gICAgLy8gd2UgdHJpZ2dlciBhbiBpbmRleCByZWJ1aWxkICsgYXRvbWljIHN3YXA7IG9uY2Ugc3dhcCBjb21wbGV0ZXMsIHRoZSBjb25zdW1lZCBmaWxlcycgYmxvY2stY2FjaGVcbiAgICAvLyBlbnRyaWVzIGFyZSBldmljdGVkIChubyBjb25zdW1lciBjYW4gYXNrIGZvciB0aGVtIG5vdykuXG4gICAgLy9cbiAgICAvLyBTZXJpYWxpemVkOiBmb2xkT3duU3RyZWFtICsgbWVyZ2UodGltZUxvLCB0aW1lSGkpICsgdGVzdE1lcmdlJ3MgcnVuTWVyZ2UgYWxsIGhpdCB0aGlzOyB0aGUgbG9ja1xuICAgIC8vIGNvdmVycyB0cnlNZXJnZU5vdy9jb21wYWN0IGJ1dCB0aG9zZSB0d28gcGF0aHMgYnlwYXNzIGl0LiBydW5JblNlcmlhbCBxdWV1ZXMgc28gdGhleSBuZXZlclxuICAgIC8vIGNvbGxpZGUgb24gdGhlIGZpbGUgc2V0LlxuICAgIHByaXZhdGUgbWVyZ2VGaWxlU2V0ID0gcnVuSW5TZXJpYWwoYXN5bmMgKGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10sIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLCBpbmNsdWRlc09sZGVzdCA9IGZhbHNlLCBmb3JjZURlbGV0ZVN0cmVhbXMgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICB0aGlzLnJlYWRlci5iZWdpbkNvbXBhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1lcmdlRmlsZVNldElubmVyKGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMsIGluY2x1ZGVzT2xkZXN0LCBmb3JjZURlbGV0ZVN0cmVhbXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuZW5kQ29tcGFjdGlvbigpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGFzeW5jIG1lcmdlRmlsZVNldElubmVyKGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10sIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLCBpbmNsdWRlc09sZGVzdDogYm9vbGVhbiwgZm9yY2VEZWxldGVTdHJlYW1zOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV4dEZpbGVUaW1lKCk7XG5cbiAgICAgICAgLy8gVGhlIGNhbGxlcidzIGJ1bGtGaWxlcyBjYW1lIGZyb20gYSBgbGlzdEZpbGVzKClgIHNuYXBzaG90LiBCZXR3ZWVuIHRoZW4gYW5kIG5vdyBhbnkgZmlsZVxuICAgICAgICAvLyBjb3VsZCBiZSBnb25lIChhbm90aGVyIHRhYidzIGRlZmVycmVkIGRlbGV0ZSwgbWFudWFsIGNsZWFudXApLiBUaGUgc3ViQ2FjaGVzIHJlYWRlciBmb3IgYVxuICAgICAgICAvLyBkZWxldGVkIGZpbGUgaXMgc2lsZW50bHkgc3RhbGUg4oCUIGl0cyBpbi1tZW1vcnkgbWV0YWRhdGEgc3RpbGwgcmVzb2x2ZXMsIGJ1dCB0aGUgdmVyeSBuZXh0XG4gICAgICAgIC8vIGdldFJhbmdlIGFnYWluc3QgZGlzayB0aHJvd3MuIFJlLXZlcmlmeSBleGlzdGVuY2UgdXAtZnJvbnQgYW5kIGRyb3AgdGhlIGNhY2hlIGVudHJ5IGZvclxuICAgICAgICAvLyBhbnl0aGluZyB0aGF0IHZhbmlzaGVkLCBzbyB3ZSBkb24ndCBldmVuIHRyeSB0byBwbGFuIGFyb3VuZCBhIGdob3N0IGZpbGUuXG4gICAgICAgIGNvbnN0IHZlcmlmaWVkQnVsa0ZpbGVzID0gKGF3YWl0IFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzdG9yYWdlLmdldEluZm8oZi5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmZvKSB7IHRoaXMuc3ViQ2FjaGVzLmJ1bGsuZGVsZXRlKGYuZmlsZU5hbWUpOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YkNhY2hlcy5idWxrLmRlbGV0ZShmLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkpLmZpbHRlcigoZik6IGYgaXMgQnVsa0ZpbGVJbmZvID0+IGYgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGJ1bGtGaWxlcyA9IHZlcmlmaWVkQnVsa0ZpbGVzO1xuXG4gICAgICAgIGNvbnN0IGNvbnN1bWVkQnVsazogQnVsa0ZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3QgYnVsa1JlYWRlcnM6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXJbXSA9IFtdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gYXdhaXQgbG9hZEZpbGVSZWFkZXIodGhpcy5uYW1lLCBzdG9yYWdlLCBmLCB0aGlzLnN1YkNhY2hlcy5idWxrKTtcbiAgICAgICAgICAgICAgICBidWxrUmVhZGVycy5wdXNoKHIpO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkQnVsay5wdXNoKGYpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IC8qIG1pc3Npbmcgb3IgY29ycnVwdCDigJQgc2tpcDsgaXRzIGRhdGEgbGl2ZXMgaW4gYW5vdGhlciBmaWxlICovIH1cbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbURhdGEgPSBhd2FpdCBsb2FkU3RyZWFtRW50cmllcyh0aGlzLm5hbWUsIHN0b3JhZ2UsIHN0cmVhbUZpbGVzLCB0aGlzLnN1YkNhY2hlcy5zdHJlYW0pO1xuICAgICAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJTdHJlYW1FbnRyaWVzKHN0cmVhbURhdGEuZW50cmllcyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVJlYWRlciA9IG9yZGVyZWQubGVuZ3RoID8gc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMob3JkZXJlZCwgMCkucmVhZGVyIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHJlYWRlcnMgPSBzdHJlYW1SZWFkZXIgPyBbc3RyZWFtUmVhZGVyLCAuLi5idWxrUmVhZGVyc10gOiBidWxrUmVhZGVycztcbiAgICAgICAgY29uc3QgcmVhZGVyTmFtZXMgPSBzdHJlYW1SZWFkZXIgPyBbXCIoc3RyZWFtcylcIiwgLi4uY29uc3VtZWRCdWxrLm1hcChmID0+IGYuZmlsZU5hbWUpXSA6IGNvbnN1bWVkQnVsay5tYXAoZiA9PiBmLmZpbGVOYW1lKTtcbiAgICAgICAgaWYgKCFyZWFkZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgICAgICAgIC4uLmF3YWl0IFByb21pc2UuYWxsKGNvbnN1bWVkQnVsay5tYXAoYXN5bmMgZiA9PiAoeyBuYW1lOiBmLmZpbGVOYW1lLCBzaXplOiAoYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpPy5zaXplID8/IDAgfSkpKSxcbiAgICAgICAgICAgIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+ICh7IG5hbWU6IGYuZmlsZU5hbWUsIHNpemU6IHN0cmVhbURhdGEuc2l6ZXMuZ2V0KGYuZmlsZU5hbWUpID8/IDAgfSkpLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpblRvdGFsID0gaW5wdXRzLnJlZHVjZSgoYSwgZikgPT4gYSArIGYuc2l6ZSwgMCk7XG4gICAgICAgIGNvbnN0IG1lcmdlU3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIENvbGxlY3QgZWFjaCBzdGVwIGluc3RlYWQgb2YgbG9nZ2luZyBpdCBsaXZlOyBlbWl0dGVkIGF0IHRoZSBlbmQgYXMgb25lXG4gICAgICAgIC8vIGV4cGFuZGVkIGNvbnNvbGUuZ3JvdXAgc28gYSBtZXJnZSB0YWtlcyBvbmUgY29sbGFwc2libGUgYmxvY2ssIG5vdCBhXG4gICAgICAgIC8vIHNjcmVlbmZ1bCAoYW5kIG5ldmVyIHRoZSBwZXItZmlsZSBuYW1lIGR1bXAgaXQgdXNlZCB0byBzcGV3KS5cbiAgICAgICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEVhY2ggc3RlcCByZWNvcmRzIHRoZSB0aW1lIHNwZW50IHNpbmNlIHRoZSBwcmV2aW91cyBzdGVwIGluIGJsdWUgYXQgdGhlIGZyb250LCBzbyBjYWxsZXJzIGNhblxuICAgICAgICAvLyBqdXN0IGRlc2NyaWJlIHdoYXQgdGhleSBkaWQgYW5kIG5vdCBib3RoZXIgbWVhc3VyaW5nL2Zvcm1hdHRpbmcgZWxhcHNlZCB0aW1lcyB0aGVtc2VsdmVzLlxuICAgICAgICBsZXQgbGFzdFN0ZXBNcyA9IG1lcmdlU3RhcnRNcztcbiAgICAgICAgY29uc3QgbG9nID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBsaW5lRm9ybWF0dGVkID0gYCR7Ymx1ZShmb3JtYXRUaW1lKG5vdyAtIGxhc3RTdGVwTXMpKX0gJHtsaW5lfWA7XG4gICAgICAgICAgICAvLyBETyBOT1QgUkVNT1ZFIFRISVMgTE9HISBPYnZpb3VzbHksIHdlIHNob3VsZCBiZSBsb2dnaW5nIGFzIHdlIHJ1biwgb3IgZWxzZSB3ZSBkb24ndCBnZXQgcHJvZ3Jlc3MuIFdoeSB3b3VsZCB3ZSBzdG9wIGdldHRpbmcgcHJvZ3Jlc3M/IFByb2dyZXNzIGlzIGFsbW9zdCBtb3JlIGltcG9ydGFudCB0aGFuIHNob3dpbmcgYSBzdW1tYXJ5IGF0IHRoZSBlbmQuLi5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmVGb3JtYXR0ZWQpO1xuICAgICAgICAgICAgc3RlcHMucHVzaChsaW5lRm9ybWF0dGVkKTtcbiAgICAgICAgICAgIGxhc3RTdGVwTXMgPSBub3c7XG4gICAgICAgIH07XG4gICAgICAgIGxvZyhgJHttYWdlbnRhKFwicmVhZFwiKX06ICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgZmlsZShzKSwgJHtmbXRCeXRlcyhpblRvdGFsKX1gKTtcblxuICAgICAgICBjb25zdCBuZXdOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgbWVyZ2VSZXN1bHQgPSBhd2FpdCBydW5QbGFubmVkTWVyZ2Uoe1xuICAgICAgICAgICAgc291cmNlczogcmVhZGVycyxcbiAgICAgICAgICAgIHNvdXJjZU5hbWVzOiByZWFkZXJOYW1lcyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICB3cml0ZUZpbGU6IGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm5hbWUgPSBuZXdGaWxlTmFtZSh0aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KGZuYW1lLCBlbmNvZGVDb21wcmVzc2VkQmxvY2tzKGRhdGEpKTtcbiAgICAgICAgICAgICAgICBuZXdOYW1lcy5wdXNoKGZuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmbmFtZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk/LnNpemUgPz8gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBmbmFtZSwgc2l6ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2FycmllZERlbGV0ZXMgPSBpbmNsdWRlc09sZGVzdCA/IDAgOiBtZXJnZVJlc3VsdC5jYXJyaWVkRGVsZXRlcy5zaXplO1xuICAgICAgICBjb25zdCBvdXROYW1lcyA9IFsuLi5uZXdOYW1lc107XG4gICAgICAgIGlmIChjYXJyaWVkRGVsZXRlcykge1xuICAgICAgICAgICAgY29uc3QgY2FycnlOYW1lID0gYHN0cmVhbV8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfSR7U1RSRUFNX0VYVEVOU0lPTn1gO1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoY2FycnlOYW1lLCBmcmFtZURlbGV0ZXMoWy4uLm1lcmdlUmVzdWx0LmNhcnJpZWREZWxldGVzXS5tYXAoKFtrZXksIHRpbWVdKSA9PiAoeyB0aW1lLCBrZXkgfSkpKSk7XG4gICAgICAgICAgICBvdXROYW1lcy5wdXNoKGNhcnJ5TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXRzID0gYXdhaXQgUHJvbWlzZS5hbGwob3V0TmFtZXMubWFwKGFzeW5jIG4gPT4gKHsgbmFtZTogbiwgc2l6ZTogKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhuKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKT8uc2l6ZSA/PyAwIH0pKSk7XG4gICAgICAgIGNvbnN0IG91dFRvdGFsID0gb3V0cHV0cy5yZWR1Y2UoKGEsIGYpID0+IGEgKyBmLnNpemUsIDApO1xuICAgICAgICBsb2coYCR7bWFnZW50YShcIndyb3RlXCIpfTogJHtvdXRwdXRzLmxlbmd0aH0gb3V0cHV0IGZpbGUocyksICR7Zm10Qnl0ZXMob3V0VG90YWwpfSR7Y2FycmllZERlbGV0ZXMgPyBgLCAke2NhcnJpZWREZWxldGVzfSB0b21ic3RvbmVzIGNhcnJpZWRgIDogXCJcIn1gKTtcblxuICAgICAgICBjb25zb2xlLmdyb3VwKGAke2JsdWUodGhpcy5uYW1lKX0gJHttYWdlbnRhKFwibWVyZ2VcIil9OiAke2ZtdEJ5dGVzKGluVG90YWwpfSAtPiAke2ZtdEJ5dGVzKG91dFRvdGFsKX0gKCR7aW5wdXRzLmxlbmd0aH0tPiR7b3V0cHV0cy5sZW5ndGh9IGZpbGVzKSBpbiAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIG1lcmdlU3RhcnRNcyl9YCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdGVwcykgY29uc29sZS5sb2cobGluZSk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBzb3VyY2VzIHJ1blBsYW5uZWRNZXJnZSBhY3R1YWxseSB1c2VkIGNhbiBiZSByZXRpcmVkIOKAlCBhIHNvdXJjZSBpdCBkcm9wcGVkIG1pZC1wbGFuXG4gICAgICAgIC8vIChmaWxlIGdvbmUsIGNvcnJ1cHRpb24pIHN0aWxsIGhvbGRzIGRhdGEgd2UgY291bGRuJ3QgbWVyZ2UgaW4sIHNvIGxlYXZlIGl0IG9uIGRpc2sgYW5kIGxldCBhXG4gICAgICAgIC8vIGZ1dHVyZSBtZXJnZSByZS1hdHRlbXB0IGl0LlxuICAgICAgICBjb25zdCB1c2VkQ29uc3VtZWRCdWxrID0gY29uc3VtZWRCdWxrLmZpbHRlcihmID0+IG1lcmdlUmVzdWx0LnVzZWRTb3VyY2VOYW1lcy5oYXMoZi5maWxlTmFtZSkpO1xuICAgICAgICBjb25zdCB1c2VkU3RyZWFtRmlsZXMgPSBzdHJlYW1GaWxlcy5maWx0ZXIoZiA9PiBtZXJnZVJlc3VsdC51c2VkU291cmNlTmFtZXMuaGFzKGYuZmlsZU5hbWUpIHx8IG1lcmdlUmVzdWx0LnVzZWRTb3VyY2VOYW1lcy5oYXMoXCIoc3RyZWFtcylcIikpO1xuICAgICAgICAvLyBBIHN0cmVhbSBtYXkgc3RpbGwgYmUgYXBwZW5kZWQgdG8gYWZ0ZXIgd2UgcmVhZCBpdCAodGhlIHdyaXRlciBoYXNuJ3Qgc2VhbGVkL21vdmVkIG9uKTsgb25seVxuICAgICAgICAvLyByZXRpcmUgc3RyZWFtcyBjYW5EZWxldGVTdHJlYW0gY2xlYXJzIOKAlCB0aGUgcmVzdCBzdGF5IGxpdmUgYW5kIGEgbGF0ZXIgbWVyZ2UgcmUtZm9sZHMgdGhlbVxuICAgICAgICAvLyBvbmNlIHNlYWxlZC4gQnVsayBmaWxlcyBhcmUgaW1tdXRhYmxlLCBzbyBhIHVzZWQgb25lIGlzIGFsd2F5cyBzYWZlIHRvIHJldGlyZS5cbiAgICAgICAgY29uc3QgZGVsZXRhYmxlU3RyZWFtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHVzZWRTdHJlYW1GaWxlcykge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2FuRGVsZXRlU3RyZWFtKGYsIERhdGUubm93KCksIHN0cmVhbURhdGEuc2l6ZXMsIGZvcmNlRGVsZXRlU3RyZWFtcykpIGRlbGV0YWJsZVN0cmVhbXMucHVzaChmLmZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxldGVGaWxlcyA9IFsuLi51c2VkQ29uc3VtZWRCdWxrLm1hcChmID0+IGYuZmlsZU5hbWUpLCAuLi5kZWxldGFibGVTdHJlYW1zXTtcblxuICAgICAgICAvLyBXcml0ZSBhIGRlbGV0aW9uIG1hcmtlciBpbnN0ZWFkIG9mIGRlbGV0aW5nIGlubGluZS4gRnJvbSB0aGUgbmV4dCByZWFkIG9uLCBsaXN0RmlsZXMgaGlkZXNcbiAgICAgICAgLy8gdGhlc2UgaW5wdXRzIChzbyB0aGV5J3JlIG5ldmVyIHJlLW1lcmdlZCDigJQgdGhlIGxvb3AgZml4KSwgYW5kIHByb2Nlc3NNYXJrZXJzIHJlbW92ZXMgdGhlbVxuICAgICAgICAvLyBwaHlzaWNhbGx5IG9uY2UgdGhlIG91dHB1dHMgaGF2ZSBsYW5kZWQgb3IgdGhlIG1hcmtlciBhZ2VzIG91dC4gTWFya2VyIEJFRk9SRSB0aGUgcmVidWlsZCBzb1xuICAgICAgICAvLyB0aGUgZnJlc2hseS1zd2FwcGVkIGluZGV4IGFscmVhZHkgZXhjbHVkZXMgdGhlIHJldGlyZWQgaW5wdXRzLlxuICAgICAgICBpZiAoZGVsZXRlRmlsZXMubGVuZ3RoKSBhd2FpdCB3cml0ZURlbGV0ZU1hcmtlcihzdG9yYWdlLCB7IGRlbGV0ZUZpbGVzLCByZXBsYWNlZEJ5OiBvdXROYW1lcyB9KTtcblxuICAgICAgICAvLyBSZWJ1aWxkICsgc3dhcCBzbyB0aGUgaW5kZXggc2VlcyB0aGUgbmV3IG91dHB1dHMgYW5kIGRyb3BzIHRoZSByZXRpcmVkIGlucHV0cy4gQmxvY2stY2FjaGVcbiAgICAgICAgLy8gZXZpY3Rpb24gZm9yIHRoZSBkcm9wcGVkIGlucHV0cyBoYXBwZW5zIGhlcmUgKHRoZXkncmUgbm8gbG9uZ2VyIGluIHRoZSBuZXcgaW5kZXgncyBmaWxlU2V0KS5cbiAgICAgICAgYXdhaXQgdGhpcy50cmlnZ2VyUmVidWlsZCgpO1xuICAgICAgICByZXR1cm4gbmV3TmFtZXMubGVuZ3RoID4gMCB8fCBjYXJyaWVkRGVsZXRlcyA+IDA7XG4gICAgfVxuXG4gICAgLy8gQSBzdHJlYW0gaXMgc2FmZSB0byBkZWxldGUgaWZmIG5vIHdyaXRlciB3aWxsIGFwcGVuZCB0byBpdCBhZ2FpbjogaXQncyBhZ2VkIHBhc3QgdGhlIHNlYWwgYWdlXG4gICAgLy8gKHdyaXRlciBoYXMgcHJvdmFibHkgc3dpdGNoZWQgZmlsZXMpIE9SIGNyb3NzLXRhYiBzeW5jIGlzIG9uIEFORCBpdHMgc2l6ZSBkaWRuJ3QgY2hhbmdlIHdoaWxlXG4gICAgLy8gd2UgcmVhZCBpdC4gRWxzZSBsZWF2ZSBpdCDigJQgdGhlIGRhdGEgaXMgYWxzbyBpbiB0aGUgbmV3IGJ1bGsgZmlsZTsgYSBsYXRlciBtZXJnZSBkZWxldGVzIGl0XG4gICAgLy8gb25jZSBhZ2VkLlxuICAgIHByaXZhdGUgYXN5bmMgY2FuRGVsZXRlU3RyZWFtKGY6IFN0cmVhbUZpbGVJbmZvLCBub3c6IG51bWJlciwgc2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sIGZvcmNlID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKG5vdyAtIGYudGltZXN0YW1wID49IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtU2VhbEFnZU1zKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc1N5bmNTdXBwb3J0ZWQoKSAmJiAhZm9yY2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVhZFNpemUgPSBzaXplcy5nZXQoZi5maWxlTmFtZSk7XG4gICAgICAgIGlmIChyZWFkU2l6ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBpbmZvO1xuICAgICAgICB0cnkgeyBpbmZvID0gYXdhaXQgKGF3YWl0IHRoaXMuc3RvcmFnZSgpKS5nZXRJbmZvKGYuZmlsZU5hbWUpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHJldHVybiAhIWluZm8gJiYgaW5mby5zaXplID09PSByZWFkU2l6ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1lcmdlU3BhY2luZ0RlbGF5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB0b3RhbCA9IGJ1bGtEYXRhYmFzZTJUaW1pbmcubWVyZ2VTcGFjaW5nTXM7XG4gICAgICAgIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gdHJ5QWNxdWlyZU1lcmdlTG9jayh0aGlzLm5hbWUsIHdyaXRlcklkKTtcbiAgICAgICAgY29uc3Qgc3RlcCA9IDE1ICogMTAwMDtcbiAgICAgICAgbGV0IHdhaXRlZCA9IDA7XG4gICAgICAgIHdoaWxlICh3YWl0ZWQgPCB0b3RhbCkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ociA9PiBzZXRUaW1lb3V0KHIsIE1hdGgubWluKHN0ZXAsIHRvdGFsIC0gd2FpdGVkKSkpO1xuICAgICAgICAgICAgd2FpdGVkICs9IHN0ZXA7XG4gICAgICAgICAgICBpZiAoIXRyeUFjcXVpcmVNZXJnZUxvY2sodGhpcy5uYW1lLCB3cml0ZXJJZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWVyZ2UgcG9saWN5ICh0d28gcGFzc2VzLCBzcGFjZWQgYnkgbWVyZ2VTcGFjaW5nTXMpOlxuICAgIC8vICAgMSkgQ29uc29saWRhdGUgcmVjZW50IGZyYWdtZW50YXRpb246IHRha2UgbmV3ZXN0IGZpbGVzIHVwIHRvIH5GSVJTVF9NRVJHRV9CWVRFUzsgbWVyZ2UgdGhlbVxuICAgIC8vICAgICAgaW50byBvbmUgd2hlbiB0aGV5IGZyYWdtZW50IG9yIHNwYW4gdG9vIHdpZGUgYSB0aW1lIHJhbmdlLlxuICAgIC8vICAgMikgS2V5LXN0cmF0aWZ5OiB3YWxrIGFsbCBrZXlzIGluIH5LRVlfR1JPVVBfQllURVMgZ3JvdXBzOyByZXdyaXRlIGdyb3VwcyB3aG9zZSBkdXBsaWNhdGUta2V5XG4gICAgLy8gICAgICBmcmFjdGlvbiBwYXNzZXMgRFVQX1RIUkVTSE9MRCwgaGlnaGVzdCBmaXJzdC5cbiAgICAvLyBVc2UgdHJ5TWVyZ2UgaW5zdGVhZFxuICAgIHByaXZhdGUgYXN5bmMgdGVzdE1lcmdlSU5URVJOQUxfRE9fTk9UX0NBTEwoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmcoKTtcbiAgICAgICAgY29uc3QgcnVuTWVyZ2UgPSBhc3luYyAoYnVsazogQnVsa0ZpbGVJbmZvW10sIHN0cmVhbTogU3RyZWFtRmlsZUluZm9bXSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgaWYgKG1lcmdlZCAmJiAhYXdhaXQgdGhpcy5tZXJnZVNwYWNpbmdEZWxheSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXQoYnVsaywgc3RyZWFtKSkgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEhhcmQgc3RyZWFtIGxpbWl0OiBhIHN0cmVhbSB0aGlzIGJpZyBtYWtlcyBldmVyeSByZWFkIHB1bGwgYSBodWdlIGZpbGUg4oaSIGZvbGQgQUxMIG9mIGl0IG5vdyxcbiAgICAgICAgLy8gZm9yY2UtZGVsZXRlIChjYW5EZWxldGVTdHJlYW0gc3RpbGwgcmVxdWlyZXMgc2l6ZS1zdGFibGUsIHNvIGFuIGFjdGl2ZSB3cml0ZXIgbmV2ZXIgbG9zZXMgZGF0YSkuXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgICAgICBpZiAoc3RyZWFtRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIGYgPT4geyB0cnkgeyByZXR1cm4gKGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmLmZpbGVOYW1lKSk/LnNpemUgPz8gMDsgfSBjYXRjaCB7IHJldHVybiAwOyB9IH0pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFN0cmVhbUJ5dGVzID0gc2l6ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsU3RyZWFtQnl0ZXMgPiBidWxrRGF0YWJhc2UyVGltaW5nLnN0cmVhbUZvbGRIYXJkTGltaXRCeXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtibHVlKHRoaXMubmFtZSl9ICR7bWFnZW50YShcImZvbGRcIil9IHN0cmVhbSB0aWVyICR7Zm10Qnl0ZXModG90YWxTdHJlYW1CeXRlcyl9IG92ZXIgaGFyZCBsaW1pdCAke2ZtdEJ5dGVzKGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtRm9sZEhhcmRMaW1pdEJ5dGVzKX0gLSBmb2xkaW5nIGFsbCBzdHJlYW1zIG5vd2ApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5tZXJnZUZpbGVTZXQoW10sIHN0cmVhbUZpbGVzLCBmYWxzZSwgdHJ1ZSkpIG1lcmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFzcyAxOiBjb25zb2xpZGF0ZSByZWNlbnQuIE9ubHkgc2VhbCB3aGVuIGNyb3NzLXRhYiBzeW5jIGNhbiBmb2xkIHJlY2VudCBzdHJlYW1zIOKAlCBpbiBOb2RlXG4gICAgICAgIC8vIGNhbkRlbGV0ZVN0cmVhbSBuZWVkcyB0aGVtIGFnZWQgYW55d2F5LCBzbyBzZWFsaW5nIHdvdWxkIGp1c3QgZnJhZ21lbnQgc3RyZWFtcyBldmVyeSBwYXNzLlxuICAgICAgICBjb25zdCBmb2xkUmVjZW50U3RyZWFtcyA9IGlzU3luY1N1cHBvcnRlZCgpO1xuICAgICAgICBpZiAoZm9sZFJlY2VudFN0cmVhbXMpIHtcbiAgICAgICAgICAgIHN5bmNCcm9hZGNhc3RTZWFsKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1bGtNZXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChhc3luYyBmID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc2l6ZSwgaGVhZGVyXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmZpbGVMb2dpY2FsU2l6ZShmLmZpbGVOYW1lKSwgdGhpcy5yZWFkQnVsa0hlYWRlcihmLmZpbGVOYW1lKV0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtpbmQ6IFwiYnVsa1wiIGFzIGNvbnN0LCBmaWxlOiBmLCBieXRlczogc2l6ZSA/PyAwLCB0aW1lOiBoZWFkZXI/Lm1heFRpbWUgfHwgZi50aW1lc3RhbXAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU1ldGE6IHsga2luZDogXCJzdHJlYW1cIjsgZmlsZTogU3RyZWFtRmlsZUluZm87IGJ5dGVzOiBudW1iZXI7IHRpbWU6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBzdHJlYW1GaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZWQgPSBEYXRlLm5vdygpIC0gZi50aW1lc3RhbXAgPj0gYnVsa0RhdGFiYXNlMlRpbWluZy5zdHJlYW1TZWFsQWdlTXM7XG4gICAgICAgICAgICAgICAgaWYgKCFmb2xkUmVjZW50U3RyZWFtcyAmJiAhYWdlZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gMDtcbiAgICAgICAgICAgICAgICB0cnkgeyBjb25zdCBpbmZvID0gYXdhaXQgKGF3YWl0IHRoaXMuc3RvcmFnZSgpKS5nZXRJbmZvKGYuZmlsZU5hbWUpOyBieXRlcyA9IGluZm8/LnNpemUgPz8gMDsgfSBjYXRjaCB7IGJ5dGVzID0gMDsgfVxuICAgICAgICAgICAgICAgIHN0cmVhbU1ldGEucHVzaCh7IGtpbmQ6IFwic3RyZWFtXCIsIGZpbGU6IGYsIGJ5dGVzLCB0aW1lOiBmLnRpbWVzdGFtcCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLmJ1bGtNZXRhLCAuLi5zdHJlYW1NZXRhXS5zb3J0KChhLCBiKSA9PiBiLnRpbWUgLSBhLnRpbWUpO1xuICAgICAgICAgICAgY29uc3QgcmVjZW50OiB0eXBlb2YgaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIGxldCByZWNlbnRCeXRlcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgcmVjZW50LnB1c2goaXQpO1xuICAgICAgICAgICAgICAgIHJlY2VudEJ5dGVzICs9IGl0LmJ5dGVzO1xuICAgICAgICAgICAgICAgIGlmIChyZWNlbnRCeXRlcyA+PSBGSVJTVF9NRVJHRV9CWVRFUykgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzcGFuID0gcmVjZW50Lmxlbmd0aCA/IHJlY2VudFswXS50aW1lIC0gcmVjZW50W3JlY2VudC5sZW5ndGggLSAxXS50aW1lIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHJlY2VudFN0cmVhbUJ5dGVzID0gcmVjZW50LnJlZHVjZSgoYSwgaXQpID0+IGEgKyAoaXQua2luZCA9PT0gXCJzdHJlYW1cIiA/IGl0LmJ5dGVzIDogMCksIDApO1xuICAgICAgICAgICAgY29uc3QgaGVhdnlTdHJlYW0gPSByZWNlbnRTdHJlYW1CeXRlcyA+IGJ1bGtEYXRhYmFzZTJUaW1pbmcuc3RyZWFtRm9sZFRyaWdnZXJCeXRlcztcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9XG4gICAgICAgICAgICAgICAgcmVjZW50Lmxlbmd0aCA+PSAyICYmIChyZWNlbnQubGVuZ3RoID4gYnVsa0RhdGFiYXNlMlRpbWluZy5maXJzdE1lcmdlVHJpZ2dlckZpbGVzIHx8IHNwYW4gPiBidWxrRGF0YWJhc2UyVGltaW5nLmZpcnN0TWVyZ2VUcmlnZ2VyUmFuZ2VNcylcbiAgICAgICAgICAgICAgICB8fCBoZWF2eVN0cmVhbTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByYiA9IHJlY2VudC5maWx0ZXIoaSA9PiBpLmtpbmQgPT09IFwiYnVsa1wiKS5tYXAoaSA9PiAoaS5maWxlIGFzIEJ1bGtGaWxlSW5mbykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJzID0gcmVjZW50LmZpbHRlcihpID0+IGkua2luZCA9PT0gXCJzdHJlYW1cIikubWFwKGkgPT4gKGkuZmlsZSBhcyBTdHJlYW1GaWxlSW5mbykpO1xuICAgICAgICAgICAgICAgIGlmICghYXdhaXQgcnVuTWVyZ2UocmIsIHJzKSkgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdob2xlLXRpZXIgZGVkdXAgc2hvcnQtY2lyY3VpdCAoYmV0d2VlbiBQYXNzIDEgYW5kIHRoZSBwZXItZ3JvdXAgUGFzcyAyKTogd2hlbiB0aGUgYnVsayB0aWVyXG4gICAgICAgIC8vIGlzIGJpZyBlbm91Z2ggQU5EIG1vc3RseSBkdXBsaWNhdGVzLCBmb2xkIGV2ZXJ5IGJ1bGsgZmlsZSBpbiBvbmUgbWVyZ2UuIEF2b2lkcyB0aGUgcGVyLWdyb3VwXG4gICAgICAgIC8vIHdhbGsncyA1LW1pbiBzcGFjaW5nIMOXIE4tZ3JvdXBzIGxhdGVuY3kuXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVsa0ZpbGVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGaWxlcygpO1xuICAgICAgICAgICAgaWYgKGJ1bGtGaWxlcy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsU2xvdHMgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgYnVsa0ZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBhd2FpdCBsb2FkRmlsZVJlYWRlcih0aGlzLm5hbWUsIHN0b3JhZ2UsIGYsIHRoaXMuc3ViQ2FjaGVzLmJ1bGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSByZWFkZXIudG90YWxCeXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2xvdHMgKz0gcmVhZGVyLmtleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIHJlYWRlci5rZXlzKSB1bmlxdWVLZXlzLmFkZChrKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7IC8qIHNraXAgdW5yZWFkYWJsZSAqLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGR1cEZyYWN0aW9uID0gdG90YWxTbG90cyA/ICh0b3RhbFNsb3RzIC0gdW5pcXVlS2V5cy5zaXplKSAvIHRvdGFsU2xvdHMgOiAwO1xuICAgICAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzID4gREVEVVBfVFJJR0dFUl9CWVRFUyAmJiBkdXBGcmFjdGlvbiA+IERFRFVQX1RSSUdHRVJfRlJBQ1RJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7Ymx1ZSh0aGlzLm5hbWUpfSAke21hZ2VudGEoXCJkZWR1cFwiKX06ICR7Zm10Qnl0ZXModG90YWxCeXRlcyl9IGFjcm9zcyAke2J1bGtGaWxlcy5sZW5ndGh9IGJ1bGsgZmlsZShzKSwgJHtNYXRoLnJvdW5kKGR1cEZyYWN0aW9uICogMTAwKX0lIGR1cGxpY2F0ZSBrZXktc2xvdHMgLSBmb2xkaW5nIGFsbCBhdCBvbmNlYCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXdhaXQgcnVuTWVyZ2UoYnVsa0ZpbGVzLCBbXSkpIHJldHVybiBtZXJnZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFzcyAyOiBrZXktc3RyYXRpZmllZCBkZWR1cGxpY2F0aW9uLiBEaXNqb2ludCBrZXkgcmFuZ2VzIOKGkiBvbmUgZ3JvdXAncyBtZXJnZSBkb2Vzbid0XG4gICAgICAgIC8vIGNoYW5nZSBhbm90aGVyJ3MgZHVwbGljYXRpb247IHJlLXNlbGVjdCBlYWNoIGdyb3VwJ3MgZmlsZXMgYXQgbWVyZ2UgdGltZSAoc2V0IHNoaWZ0cykuXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGF3YWl0IHRoaXMuZmluZER1cGxpY2F0ZUdyb3VwcygpO1xuICAgICAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGYgPT4gdGhpcy5yZWFkQnVsa0hlYWRlcihmLmZpbGVOYW1lKSkpO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBGaWxlcyA9IGJ1bGtGaWxlcy5maWx0ZXIoKGYsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoaC5taW5LZXkgPT09IHVuZGVmaW5lZCB8fCBoLm1heEtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaC5taW5LZXkgPD0gZy5oaSAmJiBoLm1heEtleSA+PSBnLmxvO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBGaWxlcy5sZW5ndGggPj0gMikgeyBpZiAoIWF3YWl0IHJ1bk1lcmdlKGdyb3VwRmlsZXMsIFtdKSkgcmV0dXJuIG1lcmdlZDsgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmREdXBsaWNhdGVHcm91cHMoKTogUHJvbWlzZTx7IGxvOiBzdHJpbmc7IGhpOiBzdHJpbmc7IGR1cDogbnVtYmVyIH1bXT4ge1xuICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcyB9ID0gYXdhaXQgdGhpcy5saXN0RmlsZXMoKTtcbiAgICAgICAgaWYgKGJ1bGtGaWxlcy5sZW5ndGggPCAyKSByZXR1cm4gW107XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3QgaW5mb3MgPSBhd2FpdCBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBhd2FpdCBsb2FkRmlsZVJlYWRlcih0aGlzLm5hbWUsIHN0b3JhZ2UsIGYsIHRoaXMuc3ViQ2FjaGVzLmJ1bGspO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleXM6IHJlYWRlci5rZXlzLCBieXRlczogcmVhZGVyLnRvdGFsQnl0ZXMgfTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleXM6IFtdIGFzIHN0cmluZ1tdLCBieXRlczogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGtleUNvdW50ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgICAgbGV0IHRvdGFsU2xvdHMgPSAwLCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGluZm9zKSB7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGkuYnl0ZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgaS5rZXlzKSB7IGtleUNvdW50LnNldChrLCAoa2V5Q291bnQuZ2V0KGspIHx8IDApICsgMSk7IHRvdGFsU2xvdHMrKzsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0b3RhbFNsb3RzID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIGNvbnN0IGJ5dGVzUGVyU2xvdCA9IHRvdGFsQnl0ZXMgLyB0b3RhbFNsb3RzO1xuICAgICAgICBjb25zdCBzb3J0ZWRLZXlzID0gWy4uLmtleUNvdW50LmtleXMoKV0uc29ydCgpO1xuICAgICAgICBjb25zdCBncm91cHM6IHsgbG86IHN0cmluZzsgaGk6IHN0cmluZzsgZHVwOiBudW1iZXIgfVtdID0gW107XG4gICAgICAgIGxldCBnU3RhcnQgPSAwLCBnQnl0ZXMgPSAwLCBnU2xvdHMgPSAwLCBnVW5pcXVlID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0ga2V5Q291bnQuZ2V0KHNvcnRlZEtleXNbaV0pID8/IDA7XG4gICAgICAgICAgICBnQnl0ZXMgKz0gYyAqIGJ5dGVzUGVyU2xvdDsgZ1Nsb3RzICs9IGM7IGdVbmlxdWUgKz0gMTtcbiAgICAgICAgICAgIGlmIChnQnl0ZXMgPj0gS0VZX0dST1VQX0JZVEVTIHx8IGkgPT09IHNvcnRlZEtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR1cCA9IChnU2xvdHMgLSBnVW5pcXVlKSAvIGdTbG90cztcbiAgICAgICAgICAgICAgICBpZiAoZHVwID4gRFVQX1RIUkVTSE9MRCkgZ3JvdXBzLnB1c2goeyBsbzogc29ydGVkS2V5c1tnU3RhcnRdLCBoaTogc29ydGVkS2V5c1tpXSwgZHVwIH0pO1xuICAgICAgICAgICAgICAgIGdTdGFydCA9IGkgKyAxOyBnQnl0ZXMgPSAwOyBnU2xvdHMgPSAwOyBnVW5pcXVlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBncm91cHMuc29ydCgoYSwgYikgPT4gYi5kdXAgLSBhLmR1cCk7XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHJlYWRzIOKAlCBmb3J3YXJkZWQgdG8gQnVsa0RhdGFiYXNlUmVhZGVyLCB3aXRoIHJlYnVpbGQtb24tbWlzc2luZyByZXRyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2luZ2xlRmllbGQ8QyBleHRlbmRzIGtleW9mIFQ+KGtleTogc3RyaW5nLCBjb2x1bW46IEMpOiBQcm9taXNlPFRbQ10gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkV2l0aFJldHJ5KCgpID0+IHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFNpbmdsZUZpZWxkT2JqPEMgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IHN0cmluZywgY29sdW1uOiBDKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogVFtDXTsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkV2l0aFJldHJ5KCgpID0+IHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkT2JqKGtleSwgY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENvbHVtbjxDIGV4dGVuZHMga2V5b2YgVD4oY29sdW1uOiBDKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogVFtDXTsgdGltZTogbnVtYmVyIH1bXT4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRXaXRoUmV0cnkoKCkgPT4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkV2l0aFJldHJ5KCgpID0+IHRoaXMucmVhZGVyLmdldEtleXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbmdsZUZpZWxkU3luYzxDIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBzdHJpbmcsIGNvbHVtbjogQyk6IFRbQ10gfCB1bmRlZmluZWQge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5nZXRTaW5nbGVGaWVsZFN5bmMoa2V5LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaW5nbGVGaWVsZE9ialN5bmM8QyBleHRlbmRzIGtleW9mIFQ+KGtleTogc3RyaW5nLCBjb2x1bW46IEMpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogVFtDXTsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5nZXRTaW5nbGVGaWVsZE9ialN5bmMoa2V5LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb2x1bW5TeW5jPEMgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEMpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogVFtDXTsgdGltZTogbnVtYmVyIH1bXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zeW5jU2V0dXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldENvbHVtblN5bmMoY29sdW1uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGaWVsZExvYWRlZFN5bmM8QyBleHRlbmRzIGtleW9mIFQ+KGtleTogc3RyaW5nLCBjb2x1bW46IEMpOiBib29sZWFuIHtcbiAgICAgICAgdm9pZCB0aGlzLnN5bmNTZXR1cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuaXNGaWVsZExvYWRlZFN5bmMoa2V5LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbHVtbkxvYWRlZFN5bmM8QyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogQyk6IGJvb2xlYW4ge1xuICAgICAgICB2b2lkIHRoaXMuc3luY1NldHVwKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlci5pc0NvbHVtbkxvYWRlZFN5bmMoY29sdW1uKTtcbiAgICB9XG5cbiAgICAvLyBSZWFjdGl2ZTogdHJ1ZSB3aGlsZSBhIG1lcmdlIGlzIHJld3JpdGluZyB0aGlzIGNvbGxlY3Rpb24ncyBmaWxlcy4gVXNlIHRoaXMgaW4gVUkgdG8gc2hvdyBhXG4gICAgLy8gXCJjb21wYWN0aW5n4oCmXCIgaW5kaWNhdG9yLiBDb3VudHMgYm90aCBiYWNrZ3JvdW5kIG1lcmdlcyAobWF5YmVNZXJnZSkgYW5kIGV4cGxpY2l0IGNvbXBhY3QvbWVyZ2VcbiAgICAvLyBjYWxscy4gQmVjb21lcyBmYWxzZSBvbmNlIHRoZSBuZXcgaW5kZXggaXMgc3dhcHBlZCBpbiAodGhlIGRlZmVycmVkLWRlbGV0ZSB3aW5kb3cgaXMgTk9UIGNvdW50ZWQpLlxuICAgIHB1YmxpYyBpc0NvbXBhY3RpbmdTeW5jKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuaXNDb21wYWN0aW5nU3luYygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb2x1bW5JbmZvKCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgcmV0dXJuIGluZGV4LnJlYWRlci5jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRLZXlTdGF0cygpOiBQcm9taXNlPHsgcmF3S2V5czogbnVtYmVyOyBmaW5hbEtleXM6IG51bWJlcjsgd2FzdGVkS2V5czogbnVtYmVyOyBkdXBsaWNhdGlvbjogbnVtYmVyOyByZWFkZXJzOiBudW1iZXIgfT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgoKTtcbiAgICAgICAgY29uc3QgcmF3S2V5cyA9IGluZGV4LnJlYWRlci5yYXdLZXlDb3VudDtcbiAgICAgICAgY29uc3QgZmluYWxLZXlzID0gaW5kZXgucmVhZGVyLmtleXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmF3S2V5cyxcbiAgICAgICAgICAgIGZpbmFsS2V5cyxcbiAgICAgICAgICAgIHdhc3RlZEtleXM6IHJhd0tleXMgLSBmaW5hbEtleXMsXG4gICAgICAgICAgICBkdXBsaWNhdGlvbjogZmluYWxLZXlzID8gcmF3S2V5cyAvIGZpbmFsS2V5cyA6IDAsXG4gICAgICAgICAgICByZWFkZXJzOiBpbmRleC5yZWFkZXIucmVhZGVyQ291bnQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFJlYWRlckluZm8oKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5lbnN1cmVJbmRleCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93Q291bnQ6IGluZGV4LnJlYWRlci5yb3dDb3VudCxcbiAgICAgICAgICAgIHRvdGFsQnl0ZXM6IGluZGV4LnJlYWRlci50b3RhbEJ5dGVzLFxuICAgICAgICAgICAga2V5Q291bnQ6IGluZGV4LnJlYWRlci5rZXlzLmxlbmd0aCxcbiAgICAgICAgICAgIHNhbXBsZUtleTogaW5kZXgucmVhZGVyLmtleXNbMF0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29sdW1uczogaW5kZXgucmVhZGVyLmNvbHVtbnMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEZpbGVJbmZvKCk6IFByb21pc2U8QnVsa0ZpbGVJbmZvTGlzdGluZz4ge1xuICAgICAgICBjb25zdCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UoKTtcbiAgICAgICAgY29uc3Qgc3RhdE9mID0gYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgc3RvcmFnZS5nZXRJbmZvKG5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGJ5dGVzOiBpbmZvPy5zaXplID8/IDAsIGxhc3RNb2RpZmllZDogaW5mbz8ubGFzdE1vZGlmaWVkID8/IDAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyByZXR1cm4geyBieXRlczogMCwgbGFzdE1vZGlmaWVkOiAwIH07IH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYnVsa0luZm9zID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVsa0ZpbGVzLm1hcChhc3luYyBmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBzdGF0T2YoZi5maWxlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGYuZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJidWxrXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgYnl0ZXM6IHN0YXQuYnl0ZXMsXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBzdGF0Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgICAgICBnZXREZXRhaWxzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1bGs6IHJlYWRlciBoYXMga2V5cyArIHBlci1yb3cga2V5VGltZXMgKyBoZWFkZXIgbWluVGltZS9tYXhUaW1lLiBDYWNoZWQsIHNvIGNoZWFwLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBhd2FpdCBsb2FkRmlsZVJlYWRlcih0aGlzLm5hbWUsIHN0b3JhZ2UsIGYsIHRoaXMuc3ViQ2FjaGVzLmJ1bGspO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBrZXlzOiByZWFkZXIua2V5cywgbWluVGltZTogcmVhZGVyLm1pblRpbWUsIG1heFRpbWU6IHJlYWRlci5tYXhUaW1lIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mb3MgPSBhd2FpdCBQcm9taXNlLmFsbChzdHJlYW1GaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgc3RhdE9mKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyZWFtXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgYnl0ZXM6IHN0YXQuYnl0ZXMsXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBzdGF0Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgICAgICBnZXREZXRhaWxzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmVhbTogbXVzdCBwYXJzZSB0aGUgZmlsZSB0byB3YWxrIGV2ZXJ5IGVudHJ5IOKAlCBoZWFkZXIgaGFzIG5vIGtleS90aW1lIGJvdW5kcy4gQ2FjaGVkLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgbG9hZFN0cmVhbUVudHJpZXModGhpcy5uYW1lLCBzdG9yYWdlLCBbZl0sIHRoaXMuc3ViQ2FjaGVzLnN0cmVhbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pblRpbWUgPSBJbmZpbml0eSwgbWF4VGltZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGRhdGEuZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGltZSA8IG1pblRpbWUpIG1pblRpbWUgPSBlLnRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50aW1lID4gbWF4VGltZSkgbWF4VGltZSA9IGUudGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmVudHJ5LnJvdykga2V5cy5hZGQoZS5lbnRyeS5yb3cua2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLmVudHJ5LmRlbGV0ZWRLZXkgIT09IHVuZGVmaW5lZCkga2V5cy5hZGQoZS5lbnRyeS5kZWxldGVkS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5czogWy4uLmtleXNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluVGltZTogbWluVGltZSA9PT0gSW5maW5pdHkgPyAwIDogbWluVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWU6IG1heFRpbWUgPT09IC1JbmZpbml0eSA/IDAgOiBtYXhUaW1lLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gWy4uLmJ1bGtJbmZvcywgLi4uc3RyZWFtSW5mb3NdO1xuICAgICAgICByZXR1cm4geyBmaWxlcywgY291bnQ6IGZpbGVzLmxlbmd0aCwgdG90YWxCeXRlczogZmlsZXMucmVkdWNlKChhLCBmKSA9PiBhICsgZi5ieXRlcywgMCkgfTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEJ1bGtGaWxlRGV0YWlscyA9IHsga2V5czogc3RyaW5nW107IG1pblRpbWU6IG51bWJlcjsgbWF4VGltZTogbnVtYmVyIH07XG5leHBvcnQgdHlwZSBCdWxrRmlsZUVudHJ5ID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBcImJ1bGtcIiB8IFwic3RyZWFtXCI7XG4gICAgYnl0ZXM6IG51bWJlcjtcbiAgICAvLyBGaWxlc3lzdGVtIG10aW1lIChtcyBzaW5jZSBlcG9jaCkg4oCUIDAgaWYgdGhlIHN0b3JhZ2UgbGF5ZXIgZGlkbid0IHJldHVybiBvbmUuXG4gICAgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG4gICAgLy8gTGF6eTogcHVsbGVkIGZyb20gdGhlIGNhY2hlZCBzdWItcmVhZGVyIGZvciBidWxrIChmcmVlIGlmIGxvYWRlZCksIG9yIGZyb20gYSBwYXJzZSBvZiB0aGUgc3RyZWFtXG4gICAgLy8gZmlsZSAoc21hbGwg4oCUIHRpZXItMCBzaXplLWNhcHBlZCwgYWxzbyBjYWNoZWQpLiBDYWxsIG9ubHkgd2hlbiB5b3UgbmVlZCB0aGUgcGVyLWZpbGUgZGV0YWlsLlxuICAgIGdldERldGFpbHM6ICgpID0+IFByb21pc2U8QnVsa0ZpbGVEZXRhaWxzPjtcbn07XG5leHBvcnQgdHlwZSBCdWxrRmlsZUluZm9MaXN0aW5nID0geyBmaWxlczogQnVsa0ZpbGVFbnRyeVtdOyBjb3VudDogbnVtYmVyOyB0b3RhbEJ5dGVzOiBudW1iZXIgfTtcblxuIl19
|
|
1242
|
-
/* _JS_SOURCE_HASH = "
|
|
1242
|
+
/* _JS_SOURCE_HASH = "3b6d62958a073ea311c58075d9cba03308b546ab7e3884788c293653d91d8c95"; */
|