sliftutils 1.7.126 → 1.7.128
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/bin/testnotify.js +9 -0
- package/package.json +5 -3
- package/security/authorizedKeys/authorizedKeys.ts +49 -9
- package/security/authorizedKeys/daemon/authLog.ts +74 -5
- package/security/authorizedKeys/daemon/changes.ts +26 -0
- package/security/authorizedKeys/daemon/daemon.ts +58 -30
- package/security/authorizedKeys/daemon/git.ts +3 -3
- package/security/authorizedKeys/daemon/revocation.ts +60 -31
- package/security/authorizedKeys/daemon/rootKeys.ts +88 -25
- package/security/authorizedKeys/daemon/sessions.ts +139 -0
- package/security/authorizedKeys/daemon/state.ts +16 -2
- package/security/authorizedKeys/dist/authorizedKeys.ts.cache +49 -11
- package/security/authorizedKeys/dist/secureSSH.ts.cache +18 -31
- package/security/authorizedKeys/dist/unrevoke.ts.cache +36 -14
- package/security/authorizedKeys/revokeSource.ts +12 -2
- package/security/authorizedKeys/secureSSH.ts +116 -64
- package/security/authorizedKeys/sources.ts +47 -5
- package/security/authorizedKeys/unrevoke.ts +55 -20
- package/security/helpers/remoteSSH.ts +17 -6
- package/security/notifications/discord.ts +18 -1
- package/security/notifications/dist/discord.ts.cache +21 -4
- package/security/notifications/setupNotify.ts +17 -8
- package/security/notifications/testNotify.ts +48 -0
- package/security/signedFiles/dist/manifest.ts.cache +21 -4
- package/security/signedFiles/dist/signFiles.ts.cache +48 -13
- package/security/signedFiles/manifest.ts +19 -2
- package/security/signedFiles/signFiles.ts +51 -12
|
@@ -276,7 +276,17 @@ async function installDaemon(config) {
|
|
|
276
276
|
set -e
|
|
277
277
|
$SUDO mkdir -p "${path_1.default.posix.dirname(REMOTE_CHECKOUT_PATH)}"
|
|
278
278
|
if $SUDO test -d "${REMOTE_CHECKOUT_PATH}/.git"; then
|
|
279
|
+
# Stashed first, the way machine-alwaysup does it. Anything sitting modified in a host's
|
|
280
|
+
# checkout is either an accident or somebody editing the daemon in place, and either way it is
|
|
281
|
+
# worth keeping rather than quietly erasing. The identity is passed inline because a host has
|
|
282
|
+
# no git config of its own and stash writes a commit.
|
|
283
|
+
$SUDO git -C "${REMOTE_CHECKOUT_PATH}" add --all
|
|
284
|
+
$SUDO git -C "${REMOTE_CHECKOUT_PATH}" -c user.email=portsecure@localhost -c user.name=portsecure stash
|
|
279
285
|
$SUDO git -C "${REMOTE_CHECKOUT_PATH}" fetch --prune origin
|
|
286
|
+
# A stash and a pull cannot cross a branch that has diverged, and a drifted checkout must not be
|
|
287
|
+
# able to leave a host running old code, so it is put on the remote's state rather than merged
|
|
288
|
+
# with it. set-head so that is the remote's default branch now, not the one it had at clone.
|
|
289
|
+
$SUDO git -C "${REMOTE_CHECKOUT_PATH}" remote set-head origin --auto
|
|
280
290
|
$SUDO git -C "${REMOTE_CHECKOUT_PATH}" reset --hard origin/HEAD
|
|
281
291
|
else
|
|
282
292
|
$SUDO rm -rf "${REMOTE_CHECKOUT_PATH}"
|
|
@@ -437,37 +447,9 @@ $SUDO rm -rf "${(0, sources_1.sourceRepoPath)(repoURL)}"`,
|
|
|
437
447
|
}
|
|
438
448
|
/** Answers "who can log into this box, and which repo says so". The paths the daemon uses are
|
|
439
449
|
left out on purpose, they are plumbing rather than something to act on. */
|
|
440
|
-
/** The daemon is installed from this checkout, so the checkout is brought up to date first.
|
|
441
|
-
Anything that stops the pull - a conflict, local commits, no upstream - stops the update too,
|
|
442
|
-
rather than quietly installing whatever happened to be on disk. */
|
|
443
|
-
async function pullLocalCheckout() {
|
|
444
|
-
let topLevel = await (0, spawn_1.spawnPromise)({ command: "git", args: ["rev-parse", "--show-toplevel"], cwd: __dirname });
|
|
445
|
-
if (topLevel.status !== 0) {
|
|
446
|
-
throw new Error(`Expected ${__dirname} to be inside a git checkout, it is not.`
|
|
447
|
-
+ ` update installs the daemon from this checkout, so it has to be one.`);
|
|
448
|
-
}
|
|
449
|
-
let repoPath = topLevel.stdout.trim();
|
|
450
|
-
let pull = await (0, spawn_1.spawnPromise)({ command: "git", args: ["pull", "--ff-only"], cwd: repoPath });
|
|
451
|
-
if (pull.status !== 0) {
|
|
452
|
-
throw new Error(`Expected git pull in ${repoPath} to succeed, it did not, so nothing was installed.\n`
|
|
453
|
-
+ `${(pull.stdout + pull.stderr).trim().slice(0, MAX_ERROR_BODY_LENGTH)}`);
|
|
454
|
-
}
|
|
455
|
-
// The host installs from github, not from here, so local commits that have not been pushed
|
|
456
|
-
// are not what it will run.
|
|
457
|
-
let local = await (0, spawn_1.spawnPromise)({ command: "git", args: ["rev-parse", "HEAD"], cwd: repoPath });
|
|
458
|
-
let remote = await (0, spawn_1.spawnPromise)({ command: "git", args: ["rev-parse", "@{u}"], cwd: repoPath });
|
|
459
|
-
if (local.stdout.trim() !== remote.stdout.trim()) {
|
|
460
|
-
console.log(`WARNING: ${repoPath} has commits that are not pushed. The host installs from github,`);
|
|
461
|
-
console.log(` so it will run the pushed version, not what is here.`);
|
|
462
|
-
}
|
|
463
|
-
console.log(`Pulled ${repoPath}`);
|
|
464
|
-
}
|
|
465
450
|
/** Pushes the current daemon onto a host that already has one, for when this code has moved on.
|
|
466
451
|
Nothing about which keys the host trusts is touched. */
|
|
467
452
|
async function updateDaemon(host) {
|
|
468
|
-
// Pulled before anything else, so a checkout that cannot be brought up to date fails here
|
|
469
|
-
// rather than after we have already started changing the host.
|
|
470
|
-
await pullLocalCheckout();
|
|
471
453
|
let contents = await (0, remoteSSH_1.readRemoteFile)({ host, filePath: REMOTE_CONFIG_PATH });
|
|
472
454
|
if (!contents) {
|
|
473
455
|
throw new Error(`Expected ${host} to already have portsecure, ${REMOTE_CONFIG_PATH} does not exist.\n`
|
|
@@ -478,7 +460,12 @@ async function updateDaemon(host) {
|
|
|
478
460
|
await requireRemoteWebhook(host);
|
|
479
461
|
await ensureRevokeReposExist(repoSources);
|
|
480
462
|
await installDaemon({ host, hostLabel: parsed.hostLabel || host, repoSources });
|
|
481
|
-
console.log(`Updated the daemon on ${host}
|
|
463
|
+
console.log(`Updated the daemon on ${host}, and restarted it.`);
|
|
464
|
+
console.log(`Its ${repoSources.length} key source(s) were left as they are, along with the keys and`);
|
|
465
|
+
console.log(`signers it has already accepted. Only the daemon itself changed:`);
|
|
466
|
+
for (let repoURL of repoSources) {
|
|
467
|
+
console.log(` ${repoURL}`);
|
|
468
|
+
}
|
|
482
469
|
}
|
|
483
470
|
async function listSources(host) {
|
|
484
471
|
let remoteConfig = await readRemoteConfig(host);
|
|
@@ -548,5 +535,5 @@ async function main() {
|
|
|
548
535
|
await removeSource({ host, repoURL: await resolveRepoURL(rest[0]) });
|
|
549
536
|
}
|
|
550
537
|
exports.main = main;
|
|
551
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlU1NILmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlU1NILnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHNEQUF1RjtBQUN2RixxREFBNkU7QUFDN0UsdUNBQTBEO0FBQzFELGlEQUFrRjtBQUNsRix5Q0FBK0M7QUFDL0MsNENBQThDO0FBQzlDLDRDQUFnRDtBQUNoRCxvREFBdUg7QUFFdkgsTUFBTSxjQUFjLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFDNUUsa0dBQWtHO0FBQ2xHLG1HQUFtRztBQUNuRyxnQkFBZ0I7QUFDaEIsTUFBTSxjQUFjLEdBQUcsNENBQTRDLENBQUM7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxNQUFNLG1CQUFtQixHQUFHLHdDQUF3QyxDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsNkJBQTZCLENBQUM7QUFDekQsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDbEMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCw4RUFBOEU7QUFDOUUsTUFBTSxLQUFLLEdBQUc7Ozs7K0JBSWlCLENBQUM7QUFFaEMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxNQUFNLGtCQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsT0FBTyxLQUFLLENBQUM7SUFDakIs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aUIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsSCxDQUFDO1FBQ0QsTUFBTSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLE9BQU87SUFDWCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLElBQUksQ0FBQyxNQUFNLGlCQUFpQixLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFDRCxNQUFNLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUF6QkQsb0JBeUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEgsIHBhcnNlV2ViaG9va0ZpbGUgfSBmcm9tIFwiLi4vbm90aWZpY2F0aW9ucy9kaXNjb3JkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVLZXlzLCByZWFkUmVwb0tleXMsIHN1bW1hcml6ZUtleSB9IGZyb20gXCIuL2F1dGhvcml6ZWRLZXlzXCI7XG5pbXBvcnQgeyBzb3VyY2VLZXlQYXRoLCBzb3VyY2VSZXBvUGF0aCB9IGZyb20gXCIuL3NvdXJjZXNcIjtcbmltcG9ydCB7IGRlcml2ZVJldm9rZUtleSwgUkVWT0tFX0tFWV9MQUJFTCwgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgcmV2b2tlZEtleXNJblJlcG8gfSBmcm9tIFwiLi91bnJldm9rZVwiO1xuaW1wb3J0IHsgZXhwYW5kSG9tZSB9IGZyb20gXCIuLi9oZWxwZXJzL3BhdGhzXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuaW1wb3J0IHsgcmVhZFJlbW90ZUZpbGUsIHJlbW90ZUNvbW1hbmRFeGlzdHMsIHJ1bk92ZXJTU0gsIFNVRE9fUFJFQU1CTEUsIHdyaXRlUmVtb3RlRmlsZSB9IGZyb20gXCIuLi9oZWxwZXJzL3JlbW90ZVNTSFwiO1xuXG5jb25zdCBTRVJWSUNFX1NPVVJDRSA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiZGFlbW9uXCIsIFwicG9ydHNlY3VyZS5zZXJ2aWNlXCIpO1xuLy8gVGhlIGRhZW1vbiBydW5zIGZyb20gYSBjaGVja291dCBvZiB0aGlzIHJlcG8gb24gdGhlIGhvc3QsIHJhdGhlciB0aGFuIGZyb20gYSBjb3B5IHdlIHVwbG9hZCwgc29cbi8vIGEgaG9zdCB1cGRhdGVzIGl0c2VsZiBmcm9tIGdpdGh1YiB0aGUgc2FtZSB3YXkgYW55dGhpbmcgZWxzZSBkb2VzLiBzbGlmdHV0aWxzIGlzIHB1YmxpYywgc28gdGhpc1xuLy8gbmVlZHMgbm8ga2V5LlxuY29uc3QgU0xJRlRVVElMU19VUkwgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGlmdGlzdC9zbGlmdHV0aWxzLmdpdFwiO1xuY29uc3QgUkVNT1RFX0NIRUNLT1VUX1BBVEggPSBcIi9vcHQvcG9ydHNlY3VyZS9zbGlmdHV0aWxzXCI7XG5jb25zdCBSRU1PVEVfU0VSVklDRV9QQVRIID0gXCIvZXRjL3N5c3RlbWQvc3lzdGVtL3BvcnRzZWN1cmUuc2VydmljZVwiO1xuY29uc3QgUkVNT1RFX0NPTkZJR19QQVRIID0gXCIvZXRjL3BvcnRzZWN1cmUvZGFlbW9uLmpzb25cIjtcbmNvbnN0IFJPT1RfQVVUSE9SSVpFRF9LRVlTID0gXCIvcm9vdC8uc3NoL2F1dGhvcml6ZWRfa2V5c1wiO1xuY29uc3QgU0VSVklDRV9OQU1FID0gXCJwb3J0c2VjdXJlXCI7XG5jb25zdCBNQVhfRVJST1JfQk9EWV9MRU5HVEggPSA1MDA7XG5jb25zdCBWRVJCUyA9IFtcImFkZFwiLCBcInJlbW92ZVwiLCBcImxpc3RcIiwgXCJ1cGRhdGVcIl07XG4vLyBUaGUgcmVwbyB1cmwgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgcmVwbyB0aGUgY29tbWFuZCBpcyBydW4gZnJvbS5cbmNvbnN0IFVTQUdFID0gYFVzYWdlOlxuICB5YXJuIHNlY3VyZXNzaCA8aG9zdD4gYWRkIDxyZXBvLXByaXZhdGUta2V5PiBbcmVwby11cmxdXG4gIHlhcm4gc2VjdXJlc3NoIDxob3N0PiByZW1vdmUgW3JlcG8tdXJsXVxuICB5YXJuIHNlY3VyZXNzaCA8aG9zdD4gbGlzdFxuICB5YXJuIHNlY3VyZXNzaCA8aG9zdD4gdXBkYXRlYDtcblxuYXN5bmMgZnVuY3Rpb24gcGF0aEV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Mb2NhbChjb25maWc6IHsgY29tbWFuZDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgY3dkPzogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBjb21tYW5kLCBhcmdzLCBjd2QsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kLCBhcmdzLCBjd2QgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7Y29tbWFuZH0gdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gdG8gZXhpdCAwLCB3YXMgJHtyZXN1bHQuc3RhdHVzfS4gYFxuICAgICAgICAgICAgKyBgJHsocmVzdWx0LnN0ZG91dCArIHJlc3VsdC5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEEgcHJpdmF0ZSBrZXkgY2Fubm90IGF1dGhlbnRpY2F0ZSBhbiBodHRwcyByZW1vdGUsIHNvIGdpdGh1YiB1cmxzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIHNzaCBmb3JtXG4gICAgdGhlIGtleSBjYW4gYWN0dWFsbHkgYmUgdXNlZCB3aXRoLiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVwb1VSTChyZXBvVVJMOiBzdHJpbmcpIHtcbiAgICBsZXQgaHR0cHNNYXRjaCA9IHJlcG9VUkwubWF0Y2goL15odHRwcz86XFwvXFwvKFteL10rKVxcLyguKz8pKD86XFwuZ2l0KT9cXC8/JC8pO1xuICAgIGlmICghaHR0cHNNYXRjaCkge1xuICAgICAgICByZXR1cm4gcmVwb1VSTDtcbiAgICB9XG4gICAgbGV0IFssIGhvc3QsIHJlcG9QYXRoXSA9IGh0dHBzTWF0Y2g7XG4gICAgcmV0dXJuIGBnaXRAJHtob3N0fToke3JlcG9QYXRofS5naXRgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnaXRXaXRoS2V5KGNvbmZpZzogeyBrZXlQYXRoOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdOyBjd2Q/OiBzdHJpbmc7IGFsbG93RmFpbHVyZT86IGJvb2xlYW4gfSkge1xuICAgIGxldCB7IGtleVBhdGgsIGFyZ3MsIGN3ZCwgYWxsb3dGYWlsdXJlIH0gPSBjb25maWc7XG4gICAgLy8gY29yZS5zc2hDb21tYW5kIGtlZXBzIGtleSBzZWxlY3Rpb24gd2l0aCB0aGUgY29tbWFuZCBpbnN0ZWFkIG9mIGluIHRoZSBlbnZpcm9ubWVudC5cbiAgICBsZXQgc3NoQ29tbWFuZCA9IGBzc2ggLWkgJHtrZXlQYXRofSAtbyBJZGVudGl0aWVzT25seT15ZXMgLW8gQmF0Y2hNb2RlPXllcyAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9YWNjZXB0LW5ld2A7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHNwYXduUHJvbWlzZSh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3M6IFtcIi1jXCIsIGBjb3JlLnNzaENvbW1hbmQ9JHtzc2hDb21tYW5kfWAsIC4uLmFyZ3NdLCBjd2QgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGdpdCB0byBydW4sIGZhaWxlZCB3aXRoICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwICYmICFhbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGdpdCAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBBc2tzIHNzaCB3aGljaCBrZXkgaXQgYWN0dWFsbHkgYXV0aGVudGljYXRlZCB3aXRoLiBUaGlzIGlzIHRoZSBrZXkgdGhhdCBtdXN0IHN1cnZpdmUgdGhlXG4gICAgZGFlbW9uIHRha2luZyBvdmVyIGF1dGhvcml6ZWRfa2V5cywgb3RoZXJ3aXNlIGEgZGVwbG95IGxvY2tzIHVzIG91dC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRBdXRoZW50aWNhdGluZ0ZpbmdlcnByaW50KGhvc3Q6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2Uoe1xuICAgICAgICBjb21tYW5kOiBcInNzaFwiLFxuICAgICAgICBhcmdzOiBbXCItdlwiLCBcIi1vXCIsIFwiQmF0Y2hNb2RlPXllc1wiLCBcIi1vXCIsIFwiQ29ubmVjdFRpbWVvdXQ9MTBcIiwgaG9zdCwgXCJ0cnVlXCJdLFxuICAgIH0pO1xuICAgIGxldCB2ZXJib3NlT3V0cHV0ID0gcmVzdWx0LnN0ZGVyciB8fCBcIlwiO1xuICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdG8gc3NoIGludG8gJHtob3N0fSwgZmFpbGVkLiAke3ZlcmJvc2VPdXRwdXQuc2xpY2UoLU1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgfVxuICAgIGxldCBhY2NlcHRlZE1hdGNoID0gdmVyYm9zZU91dHB1dC5tYXRjaCgvU2VydmVyIGFjY2VwdHMga2V5Oi4qPyhTSEEyNTY6W0EtWmEtejAtOSsvPV0rKS8pO1xuICAgIGlmICghYWNjZXB0ZWRNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBhY2NlcHQgYSBwdWJsaWMga2V5LCBidXQgdGhlIHNlc3Npb24gZGlkIG5vdCBhdXRoZW50aWNhdGUgd2l0aCBvbmUuYFxuICAgICAgICAgICAgKyBgIHBvcnRzZWN1cmUgZGlzYWJsZXMgcGFzc3dvcmQgbG9naW4sIHNvIGtleSBiYXNlZCBhY2Nlc3MgaGFzIHRvIHdvcmsgZmlyc3QuYFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYWNjZXB0ZWRNYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnRLZXlzKGtleXM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLWtleXMtXCIpKTtcbiAgICBsZXQga2V5c1BhdGggPSBwYXRoLmpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcImF1dGhvcml6ZWRfa2V5c1wiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoa2V5c1BhdGgsIGAke2tleXMuam9pbihcIlxcblwiKX1cXG5gKTtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcInNzaC1rZXlnZW5cIiwgYXJnczogW1wiLWxmXCIsIGtleXNQYXRoXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIGxldCBmaW5nZXJwcmludHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiByZXN1bHQuc3Rkb3V0LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGxpbmUubWF0Y2goLyhTSEEyNTY6W0EtWmEtejAtOSsvPV0rKS8pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGZpbmdlcnByaW50cy5wdXNoKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmluZ2VycHJpbnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9uZVJlcG9Gb3JJbnNwZWN0aW9uKGNvbmZpZzogeyByZXBvVVJMOiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgcmVwb1VSTCwga2V5UGF0aCB9ID0gY29uZmlnO1xuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJlcG8tXCIpKTtcbiAgICBsZXQgcmVwb1BhdGggPSBwYXRoLmpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcInJlcG9cIik7XG4gICAgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGgsIGFyZ3M6IFtcImNsb25lXCIsIFwiLS1kZXB0aFwiLCBcIjFcIiwgcmVwb1VSTCwgcmVwb1BhdGhdIH0pO1xuICAgIHJldHVybiByZXBvUGF0aDtcbn1cblxuLyoqIFdpdGggbm8gcmVwbyB1cmwgZ2l2ZW4sIHRoZSByZXBvIHdlIGFyZSBzdGFuZGluZyBpbiBpcyB1c2VkLiBJdCBoYXMgdG8gYWN0dWFsbHkgaG9sZCBrZXlzXG4gICAgYmVmb3JlIHdlIGhhbmQgaXQgdG8gYSBob3N0LCBzbyBhIHN0cmF5IHdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXBsb3llZCBieSBhY2NpZGVudC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVSZXBvVVJMKHBhc3NlZFVSTDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHBhc3NlZFVSTCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplUmVwb1VSTChwYXNzZWRVUkwpO1xuICAgIH1cbiAgICBsZXQgdG9wTGV2ZWwgPSBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmICh0b3BMZXZlbC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHJlcG8gdXJsLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gYmUgaW5zaWRlIGEgZ2l0IHJlcG8sIGl0IGlzIG5vdC5cXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBsZXQgcmVwb1BhdGggPSB0b3BMZXZlbC5zdGRvdXQudHJpbSgpO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWRSZXBvS2V5cyhyZXBvUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgYSByZXBvIHVybCwgb3IgdGhlIGN1cnJlbnQgcmVwbyAoJHtyZXBvUGF0aH0pIHRvIGhvbGQga2V5cywgaXQgZG9lcyBub3QuXFxuJHtlfVxcbiR7VVNBR0V9YFxuICAgICAgICApO1xuICAgIH1cbiAgICBsZXQgb3JpZ2luID0gYXdhaXQgcnVuTG9jYWwoe1xuICAgICAgICBjb21tYW5kOiBcImdpdFwiLFxuICAgICAgICBhcmdzOiBbXCJyZW1vdGVcIiwgXCJnZXQtdXJsXCIsIFwib3JpZ2luXCJdLFxuICAgICAgICBjd2Q6IHJlcG9QYXRoLFxuICAgICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKG9yaWdpbi5zdGF0dXMgIT09IDAgfHwgIW9yaWdpbi5zdGRvdXQudHJpbSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUgY3VycmVudCByZXBvICgke3JlcG9QYXRofSkgdG8gaGF2ZSBhbiBvcmlnaW4gcmVtb3RlLCBpdCBoYXMgbm9uZS5gXG4gICAgICAgICAgICArIGAgVGhlIGhvc3QgY2xvbmVzIHRoZSBzb3VyY2UgaXRzZWxmLCBzbyBhIGxvY2FsIHBhdGggaXMgbm8gdXNlIHRvIGl0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IHJlcG9VUkwgPSBub3JtYWxpemVSZXBvVVJMKG9yaWdpbi5zdGRvdXQudHJpbSgpKTtcbiAgICBjb25zb2xlLmxvZyhgTm8gcmVwbyB1cmwgZ2l2ZW4sIHVzaW5nIHRoZSBjdXJyZW50IHJlcG86ICR7cmVwb1VSTH1gKTtcbiAgICByZXR1cm4gcmVwb1VSTDtcbn1cblxuLyoqIEV2ZXJ5IHNvdXJjZSdzIHJldm9rZSByZXBvIGhhcyB0byBleGlzdCBhbmQgaG9sZCBhdCBsZWFzdCBvbmUgY29tbWl0LCBvciB0aGUgaG9zdHMgdXNpbmcgaXRcbiAgICBjYW5ub3QgcmVjb3JkIGEgcmV2b2NhdGlvbi4gQ2hlY2tlZCB3aXRoIHRoaXMgbWFjaGluZSdzIG93biBnaXQgY3JlZGVudGlhbHMsIHNpbmNlIHVwZGF0ZSBpc1xuICAgIG5vdCBnaXZlbiBhbnkgZGVwbG95IGtleSwgYW5kIGFuIGVtcHR5IHJlcG8gaXMgaW5pdGlhbGlzZWQgcmF0aGVyIHRoYW4gbWVyZWx5IGNvbXBsYWluZWQgYWJvdXQuXG5cbiAgICBBIGhvc3QgdGhhdCBjYW5ub3Qgd3JpdGUgYSByZXZvY2F0aW9uIHNpbGVudGx5IGtlZXBzIGFjY2VwdGluZyBhIGtleSBpdCBqdXN0IHNhdyBiZWluZyBtaXN1c2VkLFxuICAgIHdoaWNoIGlzIHRoZSBvbmUgZmFpbHVyZSB0aGlzIHdob2xlIHRoaW5nIGV4aXN0cyB0byBwcmV2ZW50LCBzbyBpdCBpcyBjaGVja2VkIG9uIGV2ZXJ5IGRlcGxveVxuICAgIGFuZCBub3Qgb25seSB3aGVuIGEgc291cmNlIGlzIGZpcnN0IGFkZGVkLiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUmV2b2tlUmVwb3NFeGlzdChyZXBvU291cmNlczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGxldCByZXBvVVJMIG9mIHJlcG9Tb3VyY2VzKSB7XG4gICAgICAgIGxldCByZXZva2VVUkwgPSByZXZva2VSZXBvVVJMKHJlcG9VUkwpO1xuICAgICAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1yZXZva2UtXCIpKTtcbiAgICAgICAgbGV0IGNoZWNrb3V0UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwicmVwb1wiKTtcbiAgICAgICAgbGV0IGNsb25lID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCJjbG9uZVwiLCByZXZva2VVUkwsIGNoZWNrb3V0UGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgZnMucm0odGVtcG9yYXJ5RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkICR7cmV2b2tlVVJMfSB0byBleGlzdCwgaXQgZG9lcyBub3QsIHNvICR7cmVwb1VSTH0gaGFzIG5vd2hlcmUgdG8gcmVjb3JkIGFgXG4gICAgICAgICAgICAgICAgKyBgIHJldm9jYXRpb24uXFxuQ3JlYXRlIGl0LCB0aGVuIHJ1biBcInlhcm4gc2VjdXJlc3NoIDxob3N0PiBhZGRcIiBmb3IgdGhhdCBzb3VyY2UgdG9gXG4gICAgICAgICAgICAgICAgKyBgIHJlZ2lzdGVyIGl0cyBkZXBsb3kga2V5LlxcbiR7KGNsb25lLnN0ZG91dCArIGNsb25lLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZCA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wiLUNcIiwgY2hlY2tvdXRQYXRoLCBcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKGhlYWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIGVtcHR5LCBnaXZpbmcgaXQgYSBmaXJzdCBjb21taXRgKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY2hlY2tvdXRQYXRoLCBcIlJFQURNRS5tZFwiKSxcbiAgICAgICAgICAgICAgICBgIyByZXZva2VkIGtleXNcXG5cXG5Xcml0dGVuIGJ5IHBvcnRzZWN1cmUuIEVhY2ggZmlsZSB1bmRlciByZXZvY2F0aW9ucy8gaXMgb25lIGtleSB0aGF0IHdhcyB1c2VkIGZyb20gYW5cXG5gXG4gICAgICAgICAgICAgICAgKyBgYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLCBhbmQgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkIGFueXdoZXJlLlxcbmApO1xuICAgICAgICAgICAgZm9yIChsZXQgYXJncyBvZiBbXG4gICAgICAgICAgICAgICAgW1wiLUNcIiwgY2hlY2tvdXRQYXRoLCBcImFkZFwiLCBcIi1BXCJdLFxuICAgICAgICAgICAgICAgIFtcIi1DXCIsIGNoZWNrb3V0UGF0aCwgXCItY1wiLCBcInVzZXIuZW1haWw9cG9ydHNlY3VyZUBsb2NhbGhvc3RcIiwgXCItY1wiLCBcInVzZXIubmFtZT1wb3J0c2VjdXJlXCIsIFwiY29tbWl0XCIsIFwiLW1cIiwgXCJpbml0aWFsaXNlIHJldm9rZSByZXBvXCJdLFxuICAgICAgICAgICAgICAgIFtcIi1DXCIsIGNoZWNrb3V0UGF0aCwgXCJwdXNoXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3MgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZnMucm0odGVtcG9yYXJ5RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3Jldm9rZVVSTH0gaXMgcmVhZHlgKTtcbiAgICB9XG59XG5cbi8qKiBUaGUgcmV2b2tlIHJlcG8gaGFzIHRvIGV4aXN0IGFuZCBiZSB3cml0YWJsZSBiZWZvcmUgYSBob3N0IGlzIHNldCB1cCwgYmVjYXVzZSBhIGhvc3QgdGhhdFxuICAgIGNhbm5vdCB3cml0ZSBhIHJldm9jYXRpb24gY2Fubm90IHJldm9rZSBhIGtleSB0aGF0IGlzIGJlaW5nIG1pc3VzZWQuIFRoZSBrZXkgZm9yIGl0IGlzIGRlcml2ZWRcbiAgICBmcm9tIHRoZSBzb3VyY2Uncywgc2luY2UgZ2l0aHViIHdpbGwgbm90IHRha2Ugb25lIHB1YmxpYyBrZXkgb24gdHdvIHJlcG9zLiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUmV2b2tlUmVwbyhjb25maWc6IHsga2V5UGF0aDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGtleVBhdGgsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmV2b2tlVVJMID0gcmV2b2tlUmVwb1VSTChyZXBvVVJMKTtcbiAgICBsZXQgZGVyaXZlZCA9IGRlcml2ZVJldm9rZUtleShhd2FpdCBmcy5yZWFkRmlsZShrZXlQYXRoLCBcInV0ZjhcIikpO1xuXG4gICAgbGV0IHRlbXBvcmFyeURpcmVjdG9yeSA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInBvcnRzZWN1cmUtcmV2b2tlLVwiKSk7XG4gICAgbGV0IGRlcml2ZWRLZXlQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJrZXlcIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGRlcml2ZWRLZXlQYXRoLCBkZXJpdmVkLnByaXZhdGVLZXlGaWxlLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgIGxldCBjaGVja291dFBhdGggPSBwYXRoLmpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcInJlcG9cIik7XG5cbiAgICBsZXQgZXhwbGFpbiA9IChwcm9ibGVtOiBzdHJpbmcpID0+IG5ldyBFcnJvcihcbiAgICAgICAgYCR7cHJvYmxlbX1cXG5gXG4gICAgICAgICsgYENyZWF0ZSAke3Jldm9rZVVSTH0gYW5kIGFkZCB0aGlzIGFzIGEgZGVwbG95IGtleSBXSVRIIFdSSVRFIEFDQ0VTUzpcXG5gXG4gICAgICAgICsgYCAgJHtkZXJpdmVkLnB1YmxpY0tleX0gJHtSRVZPS0VfS0VZX0xBQkVMfVxcbmBcbiAgICAgICAgKyBgSXQgaGFzIHRvIGJlIHRoaXMga2V5OiBpdCBpcyBkZXJpdmVkIGZyb20gJHtrZXlQYXRofSwgYW5kIGdpdGh1YiB3aWxsIG5vdCBhY2NlcHQgdGhlIHNhbWVgXG4gICAgICAgICsgYCBwdWJsaWMga2V5IG9uIHR3byByZXBvc2l0b3JpZXMuYFxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgJHtyZXZva2VVUkx9YCk7XG4gICAgbGV0IGNsb25lID0gYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IGRlcml2ZWRLZXlQYXRoLCBhcmdzOiBbXCJjbG9uZVwiLCByZXZva2VVUkwsIGNoZWNrb3V0UGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAoY2xvbmUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkICR7cmV2b2tlVVJMfSB0byBiZSByZWFkYWJsZSB3aXRoIHRoZSBkZXJpdmVkIGtleSwgaXQgaXMgbm90LmApO1xuICAgIH1cblxuICAgIC8vIEFuIGVtcHR5IHJlcG8gaGFzIG5vIGJyYW5jaCBmb3IgdGhlIGRhZW1vbiB0byBjbG9uZSwgc28gaXQgZ2V0cyBpdHMgZmlyc3QgY29tbWl0IGhlcmUuIFRoYXRcbiAgICAvLyBkb3VibGVzIGFzIHRoZSBwcm9vZiB0aGF0IHdlIGNhbiB3cml0ZSB0byBpdC5cbiAgICBsZXQgaGVhZCA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgY3dkOiBjaGVja291dFBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAoaGVhZC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjaGVja291dFBhdGgsIFwiUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgYCMgcmV2b2tlZCBrZXlzXFxuXFxuV3JpdHRlbiBieSBwb3J0c2VjdXJlLiBFYWNoIGZpbGUgdW5kZXIgcmV2b2NhdGlvbnMvIGlzIG9uZSBrZXkgdGhhdCB3YXMgdXNlZCBmcm9tIGFuXFxuYFxuICAgICAgICAgICAgKyBgYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLCBhbmQgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkIGFueXdoZXJlLlxcbmApO1xuICAgICAgICBmb3IgKGxldCBhcmdzIG9mIFtcbiAgICAgICAgICAgIFtcImFkZFwiLCBcIi1BXCJdLFxuICAgICAgICAgICAgW1wiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIFwiaW5pdGlhbGlzZSByZXZva2UgcmVwb1wiXSxcbiAgICAgICAgXSkge1xuICAgICAgICAgICAgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IGRlcml2ZWRLZXlQYXRoLCBhcmdzLCBjd2Q6IGNoZWNrb3V0UGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHVzaCA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChwdXNoLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgZXhwbGFpbihgRXhwZWN0ZWQgd3JpdGUgYWNjZXNzIHRvICR7cmV2b2tlVVJMfSwgdGhlIGZpcnN0IHB1c2ggd2FzIHJlZnVzZWQuXFxuJHsocHVzaC5zdGRvdXQgKyBwdXNoLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZHJ5UnVuID0gYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IGRlcml2ZWRLZXlQYXRoLCBhcmdzOiBbXCJwdXNoXCIsIFwiLS1kcnktcnVuXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSwgY3dkOiBjaGVja291dFBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKGRyeVJ1bi5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkIHdyaXRlIGFjY2VzcyB0byAke3Jldm9rZVVSTH0sIGEgZHJ5IHJ1biBwdXNoIHdhcyByZWZ1c2VkLlxcbiR7KGRyeVJ1bi5zdGRvdXQgKyBkcnlSdW4uc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke3Jldm9rZVVSTH0gaXMgd3JpdGFibGVgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFJlbW90ZUNvbmZpZyhob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICByZXR1cm4geyBob3N0TGFiZWw6IGhvc3QsIHJlcG9Tb3VyY2VzOiBbXSBhcyBzdHJpbmdbXSB9O1xuICAgIH1cbiAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50cykgYXMgeyBob3N0TGFiZWw/OiBzdHJpbmc7IHJlcG9Tb3VyY2VzPzogc3RyaW5nW10gfTtcbiAgICByZXR1cm4geyBob3N0TGFiZWw6IHBhcnNlZC5ob3N0TGFiZWwgfHwgaG9zdCwgcmVwb1NvdXJjZXM6IHBhcnNlZC5yZXBvU291cmNlcyB8fCBbXSB9O1xufVxuXG4vKiogUmVhZHMgdGhlIGtleXMgYSBzb3VyY2UncyBjaGVja291dCBjdXJyZW50bHkgaG9sZHMgb24gdGhlIGhvc3QsIHNvIHRoZSBtZXJnZWQgcmVzdWx0IGNhbiBiZVxuICAgIHdvcmtlZCBvdXQgd2l0aG91dCBuZWVkaW5nIHRoYXQgc291cmNlJ3MgcHJpdmF0ZSBrZXkgbG9jYWxseS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVTb3VyY2VLZXlzKGNvbmZpZzogeyBob3N0OiBzdHJpbmc7IHJlcG9VUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgaG9zdCwgcmVwb1VSTCB9ID0gY29uZmlnO1xuICAgIGxldCByZXBvUGF0aCA9IHNvdXJjZVJlcG9QYXRoKHJlcG9VUkwpO1xuICAgIGxldCBvdXRwdXQgPSBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuaWYgJFNVRE8gdGVzdCAtZiBcIiR7cmVwb1BhdGh9L2F1dGhvcml6ZWRfa2V5c1wiOyB0aGVuXG4gICAgJFNVRE8gY2F0IFwiJHtyZXBvUGF0aH0vYXV0aG9yaXplZF9rZXlzXCJcbmVsaWYgJFNVRE8gdGVzdCAtZCBcIiR7cmVwb1BhdGh9XCI7IHRoZW5cbiAgICAkU1VETyBjYXQgXCIke3JlcG9QYXRofVwiLyoucHViIDI+L2Rldi9udWxsIHx8IHRydWVcbmZpYCxcbiAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBub3JtYWxpemVLZXlzKG91dHB1dC5zdGRvdXQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsRGFlbW9uKGNvbmZpZzogeyBob3N0OiBzdHJpbmc7IGhvc3RMYWJlbDogc3RyaW5nOyByZXBvU291cmNlczogc3RyaW5nW10gfSkge1xuICAgIGxldCB7IGhvc3QsIGhvc3RMYWJlbCwgcmVwb1NvdXJjZXMgfSA9IGNvbmZpZztcbiAgICBmb3IgKGxldCBjb21tYW5kIG9mIFtcIm5vZGVcIiwgXCJnaXRcIiwgXCJ5YXJuXCJdKSB7XG4gICAgICAgIGlmICghYXdhaXQgcmVtb3RlQ29tbWFuZEV4aXN0cyh7IGhvc3QsIGNvbW1hbmQgfSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtjb21tYW5kfSB0byBiZSBpbnN0YWxsZWQgb24gJHtob3N0fSwgaXQgaXMgbm90LiBJbnN0YWxsIGl0IGFuZCByZXJ1bi5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBjaGVja291dCBpcyBicm91Z2h0IHRvIHRoZSBsYXRlc3QgY29tbWl0IHJhdGhlciB0aGFuIGEgY29weSBiZWluZyBwdXNoZWQsIHNvIHdoYXQgcnVucyBvblxuICAgIC8vIHRoZSBob3N0IGlzIGV4YWN0bHkgd2hhdCBpcyBvbiBnaXRodWIuXG4gICAgY29uc29sZS5sb2coYFVwZGF0aW5nICR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9IG9uICR7aG9zdH1gKTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBta2RpciAtcCBcIiR7cGF0aC5wb3NpeC5kaXJuYW1lKFJFTU9URV9DSEVDS09VVF9QQVRIKX1cIlxuaWYgJFNVRE8gdGVzdCAtZCBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9Ly5naXRcIjsgdGhlblxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgZmV0Y2ggLS1wcnVuZSBvcmlnaW5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIHJlc2V0IC0taGFyZCBvcmlnaW4vSEVBRFxuZWxzZVxuICAgICRTVURPIHJtIC1yZiBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCJcbiAgICAkU1VETyBnaXQgY2xvbmUgXCIke1NMSUZUVVRJTFNfVVJMfVwiIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIlxuZmlcbiRTVURPIHlhcm4gLS1jd2QgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIGluc3RhbGwgLS1wcm9kdWN0aW9uIC0tbm9uLWludGVyYWN0aXZlXG4jIFRoZSBzaW5nbGUgZmlsZSBkYWVtb24gdGhpcyByZXBsYWNlZCwgbGVmdCBvdmVyIG9uIGEgaG9zdCBzZXQgdXAgYnkgYW4gb2xkZXIgdmVyc2lvbi5cbiRTVURPIHJtIC1mIC9vcHQvcG9ydHNlY3VyZS9wb3J0c2VjdXJlLWRhZW1vbi5qc2AsXG4gICAgfSk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IFJFTU9URV9DT05GSUdfUEFUSCxcbiAgICAgICAgLy8gT25seSB3aGF0IGRpZmZlcnMgYmV0d2VlbiBtYWNoaW5lcy4gRXZlcnkgcGF0aCB0aGUgZGFlbW9uIHVzZXMgaXMgZGVyaXZlZCBpbiB0aGUgZGFlbW9uXG4gICAgICAgIC8vIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBoZXJlIHRvIGRyaWZ0IG91dCBvZiBzeW5jLlxuICAgICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoeyBob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0sIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiLFxuICAgICAgICBmaWxlTW9kZTogXCI2MDBcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3MDBcIixcbiAgICB9KTtcbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogUkVNT1RFX1NFUlZJQ0VfUEFUSCxcbiAgICAgICAgY29udGVudHM6IGF3YWl0IGZzLnJlYWRGaWxlKFNFUlZJQ0VfU09VUkNFLCBcInV0ZjhcIiksXG4gICAgICAgIGZpbGVNb2RlOiBcIjY0NFwiLFxuICAgICAgICBkaXJlY3RvcnlNb2RlOiBcIjc1NVwiLFxuICAgIH0pO1xuICAgIGF3YWl0IHJ1bk92ZXJTU0goe1xuICAgICAgICBob3N0LFxuICAgICAgICBzY3JpcHQ6IGAke1NVRE9fUFJFQU1CTEV9XG5zZXQgLWVcbiRTVURPIHN5c3RlbWN0bCBkYWVtb24tcmVsb2FkXG4kU1VETyBzeXN0ZW1jdGwgZW5hYmxlICR7U0VSVklDRV9OQU1FfVxuJFNVRE8gc3lzdGVtY3RsIHJlc3RhcnQgJHtTRVJWSUNFX05BTUV9YCxcbiAgICB9KTtcblxuICAgIGxldCBzdGF0dXMgPSAoYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYHN5c3RlbWN0bCBpcy1hY3RpdmUgJHtTRVJWSUNFX05BTUV9IHx8IHRydWVgLFxuICAgICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgfSkpLnN0ZG91dC50cmltKCk7XG4gICAgaWYgKHN0YXR1cyAhPT0gXCJhY3RpdmVcIikge1xuICAgICAgICBsZXQgam91cm5hbCA9IChhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBzY3JpcHQ6IGAke1NVRE9fUFJFQU1CTEV9XG4kU1VETyBqb3VybmFsY3RsIC11ICR7U0VSVklDRV9OQU1FfSAtbiA0MCAtLW5vLXBhZ2VyIHx8IHRydWVgLFxuICAgICAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgICAgICB9KSkuc3Rkb3V0O1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7U0VSVklDRV9OQU1FfSB0byBiZSBhY3RpdmUgb24gJHtob3N0fSwgd2FzICR7c3RhdHVzfS5cXG4ke2pvdXJuYWwuc2xpY2UoLTIwMDApfWApO1xuICAgIH1cblxuICAgIGxldCBzdGlsbFJlYWNoYWJsZSA9IGF3YWl0IHJ1bk92ZXJTU0goeyBob3N0LCBzY3JpcHQ6IFwiZWNobyByZWFjaGFibGVcIiwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChzdGlsbFJlYWNoYWJsZS5zdGRvdXQudHJpbSgpICE9PSBcInJlYWNoYWJsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke2hvc3R9IHRvIHN0aWxsIGJlIHJlYWNoYWJsZSBhZnRlciB0aGUgZGFlbW9uIHN0YXJ0ZWQsIGl0IGlzIG5vdC5gXG4gICAgICAgICAgICArIGAgQ2hlY2sgY29uc29sZSBhY2Nlc3MgaW1tZWRpYXRlbHkuYFxuICAgICAgICApO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZVJlbW90ZVdlYmhvb2soaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCB9KTtcbiAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhIERpc2NvcmQgd2ViaG9vayBhdCAke0RFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEh9IG9uICR7aG9zdH0sIG5vIHN1Y2ggZmlsZSBleGlzdHMuYFxuICAgICAgICAgICAgKyBgIFRoZSBkYWVtb24gd2lsbCBub3Qgc3RhcnQgd2l0aG91dCBvbmUuXFxuYFxuICAgICAgICAgICAgKyBgU2V0IGl0IHVwIGZpcnN0OlxcbiAgeWFybiBzZXR1cG5vdGlmeSAke2hvc3R9IDxkaXNjb3JkLXdlYmhvb2stdXJsPmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlV2ViaG9va0ZpbGUoeyBjb250ZW50cywgc291cmNlTmFtZTogYCR7aG9zdH06JHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfWAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNvdXJjZShjb25maWc6IHsgaG9zdDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmc7IHJlcG9VUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgaG9zdCwga2V5UGF0aCwgcmVwb1VSTCB9ID0gY29uZmlnO1xuICAgIGlmICghYXdhaXQgcGF0aEV4aXN0cyhrZXlQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgcHJpdmF0ZSBrZXkgYXQgJHtrZXlQYXRofSwgbm8gc3VjaCBmaWxlIGV4aXN0c2ApO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyAke3JlcG9VUkx9IGlzIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH1gKTtcbiAgICBsZXQgcmVhY2hhYmxlID0gYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGgsIGFyZ3M6IFtcImxzLXJlbW90ZVwiLCByZXBvVVJMXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChyZWFjaGFibGUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGJlIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH0sIGdpdCBscy1yZW1vdGUgZmFpbGVkLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGZldGNoIGtleXMuXFxuYFxuICAgICAgICAgICAgKyBgJHsocmVhY2hhYmxlLnN0ZG91dCArIHJlYWNoYWJsZS5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAocmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmluY2x1ZGVzKHJlcG9VUkwpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2hvc3R9IGFscmVhZHkgaGFzICR7cmVwb1VSTH0sIHJlZnJlc2hpbmcgaXRzIGtleSBhbmQgdGhlIGRhZW1vbi5gKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWVyZ2VkIHJlc3VsdCBpcyB3aGF0IHJvb3QgZW5kcyB1cCB3aXRoLCBzbyBvdXIgb3duIGtleSBoYXMgdG8gYmUgc29tZXdoZXJlIGluIGl0LlxuICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBvdXIgYWNjZXNzIHRvICR7aG9zdH0gc3Vydml2ZXMgdGhlIG1lcmdlZCBrZXlzYCk7XG4gICAgbGV0IG91ckZpbmdlcnByaW50ID0gYXdhaXQgZmluZEF1dGhlbnRpY2F0aW5nRmluZ2VycHJpbnQoaG9zdCk7XG4gICAgbGV0IGluc3BlY3Rpb25QYXRoID0gYXdhaXQgY2xvbmVSZXBvRm9ySW5zcGVjdGlvbih7IHJlcG9VUkwsIGtleVBhdGggfSk7XG4gICAgbGV0IG5ld0tleXMgPSBhd2FpdCByZWFkUmVwb0tleXMoaW5zcGVjdGlvblBhdGgpO1xuICAgIC8vIFdoYXRldmVyIGlzIGFwcGxpZWQgb24gdGhlIGhvc3QgY2FtZSBmcm9tIHRoZSBleGlzdGluZyBzb3VyY2VzLCBzbyBpdCBzdGF5cyBpbiB0aGUgbWVyZ2UuXG4gICAgbGV0IGV4aXN0aW5nS2V5cyA9IG5vcm1hbGl6ZUtleXMoYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUk9PVF9BVVRIT1JJWkVEX0tFWVMgfSkgfHwgXCJcIik7XG4gICAgbGV0IG1lcmdlZEZpbmdlcnByaW50cyA9IGF3YWl0IGZpbmdlcnByaW50S2V5cyhbLi4uZXhpc3RpbmdLZXlzLCAuLi5uZXdLZXlzXSk7XG4gICAgaWYgKCFtZXJnZWRGaW5nZXJwcmludHMuaW5jbHVkZXMob3VyRmluZ2VycHJpbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBiZSBpbiB0aGUgbWVyZ2VkIGtleXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICArIGBPdXJzOiAgICR7b3VyRmluZ2VycHJpbnR9XFxuYFxuICAgICAgICAgICAgKyBgTWVyZ2VkOiAke21lcmdlZEZpbmdlcnByaW50cy5qb2luKFwiXFxuICAgICAgICBcIikgfHwgXCIobm9uZSlcIn1cXG5gXG4gICAgICAgICAgICArIGBUaGUgZGFlbW9uIHJlcGxhY2VzIHJvb3QncyBhdXRob3JpemVkX2tleXMgd2l0aCB0aGUgbWVyZ2VkIHNvdXJjZXMsIHNvIHRoaXMgd291bGRgXG4gICAgICAgICAgICArIGAgbG9jayB5b3Ugb3V0IG9mICR7aG9zdH0uIEFkZCB5b3VyIHB1YmxpYyBrZXkgdG8gJHtyZXBvVVJMfSBmaXJzdC5gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBPdXIga2V5ICR7b3VyRmluZ2VycHJpbnR9IGlzIGluIHRoZSBtZXJnZWQga2V5cywgYWNjZXNzIHdpbGwgc3Vydml2ZS5gKTtcblxuICAgIGF3YWl0IGVuc3VyZVJldm9rZVJlcG8oeyBrZXlQYXRoLCByZXBvVVJMIH0pO1xuXG4gICAgLy8gRGVwbG95aW5nIGEgcmVwbyB0aGF0IHN0aWxsIGhvbGRzIGEgcmV2b2tlZCBrZXkgd291bGQgaGFuZCBpdCBiYWNrIHRvIGV2ZXJ5IG1hY2hpbmUuXG4gICAgbGV0IHJldm9rZWQgPSBhd2FpdCByZXZva2VkS2V5c0luUmVwbyh7IHJlcG9QYXRoOiBpbnNwZWN0aW9uUGF0aCwgc291cmNlVVJMOiByZXBvVVJMIH0pO1xuICAgIGlmIChyZXZva2VkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtyZXBvVVJMfSB0byBob2xkIG5vIHJldm9rZWQga2V5cywgaXQgaG9sZHMgJHtyZXZva2VkLmxlbmd0aH06XFxuYFxuICAgICAgICAgICAgKyByZXZva2VkLm1hcChlbnRyeSA9PiBgICAke2VudHJ5LnJldm9jYXRpb24uZmluZ2VycHJpbnR9IHJldm9rZWQgYnlgXG4gICAgICAgICAgICAgICAgKyBgICR7ZW50cnkucmV2b2NhdGlvbi5yZXZva2VkQnkgfHwgXCI/XCJ9IGFmdGVyIHVzZSBmcm9tICR7ZW50cnkucmV2b2NhdGlvbi5hdHRlbXB0Py5pcCB8fCBcIj9cIn1gKS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICArIGBcXG5EZWxldGUgdGhlbSBmcm9tIHRoZSByZXBvLCBvciBydW4gXCJ5YXJuIHVucmV2b2tlXCIgdGhlcmUgdG8gYWxsb3cgdGhlbSBhZ2Fpbi5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHdlYmhvb2tVUkwgPSBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBjb25zb2xlLmxvZyhgJHtob3N0fSBub3RpZmllcyAke3dlYmhvb2tVUkx9YCk7XG5cbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogc291cmNlS2V5UGF0aChyZXBvVVJMKSxcbiAgICAgICAgY29udGVudHM6IGF3YWl0IGZzLnJlYWRGaWxlKGtleVBhdGgsIFwidXRmOFwiKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG5cbiAgICBsZXQgcmVwb1NvdXJjZXMgPSByZW1vdGVDb25maWcucmVwb1NvdXJjZXMuZmlsdGVyKHNvdXJjZSA9PiBzb3VyY2UgIT09IHJlcG9VUkwpO1xuICAgIHJlcG9Tb3VyY2VzLnB1c2gocmVwb1VSTCk7XG4gICAgYXdhaXQgaW5zdGFsbERhZW1vbih7IGhvc3QsIGhvc3RMYWJlbDogcmVtb3RlQ29uZmlnLmhvc3RMYWJlbCwgcmVwb1NvdXJjZXMgfSk7XG4gICAgY29uc29sZS5sb2coYCR7cmVwb1VSTH0gYWRkZWQgdG8gJHtob3N0fS4gJHtyZXBvU291cmNlcy5sZW5ndGh9IHNvdXJjZShzKSBub3cgbWVyZ2VkLmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVTb3VyY2UoY29uZmlnOiB7IGhvc3Q6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBob3N0LCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJlbW90ZUNvbmZpZyA9IGF3YWl0IHJlYWRSZW1vdGVDb25maWcoaG9zdCk7XG4gICAgaWYgKCFyZW1vdGVDb25maWcucmVwb1NvdXJjZXMuaW5jbHVkZXMocmVwb1VSTCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7cmVwb1VSTH0gdG8gYmUgYSBzb3VyY2Ugb24gJHtob3N0fSwgaXQgaXMgbm90LlxcbmBcbiAgICAgICAgICAgICsgYENvbmZpZ3VyZWQ6XFxuICAke3JlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5qb2luKFwiXFxuICBcIikgfHwgXCIobm9uZSlcIn1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXBvU291cmNlcyA9IHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5maWx0ZXIoc291cmNlID0+IHNvdXJjZSAhPT0gcmVwb1VSTCk7XG5cbiAgICBpZiAocmVwb1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRoZSBrZXlzIGxlZnQgb3ZlciBhcmUgd2hhdCByb290IGdldHMsIHNvIG91ciBvd24ga2V5IGhhcyB0byBiZSBhbW9uZyB0aGVtLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgb3VyIGFjY2VzcyB0byAke2hvc3R9IHN1cnZpdmVzIHdpdGhvdXQgJHtyZXBvVVJMfWApO1xuICAgICAgICBsZXQgb3VyRmluZ2VycHJpbnQgPSBhd2FpdCBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0KTtcbiAgICAgICAgbGV0IHJlbWFpbmluZ0tleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiByZXBvU291cmNlcykge1xuICAgICAgICAgICAgcmVtYWluaW5nS2V5cy5wdXNoKC4uLmF3YWl0IHJlYWRSZW1vdGVTb3VyY2VLZXlzKHsgaG9zdCwgcmVwb1VSTDogc291cmNlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVtYWluaW5nRmluZ2VycHJpbnRzID0gYXdhaXQgZmluZ2VycHJpbnRLZXlzKHJlbWFpbmluZ0tleXMpO1xuICAgICAgICBpZiAoIXJlbWFpbmluZ0ZpbmdlcnByaW50cy5pbmNsdWRlcyhvdXJGaW5nZXJwcmludCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgdGhlIGtleSB3ZSB1c2UgZm9yICR7aG9zdH0gdG8gc3RpbGwgYmUgaW4gdGhlIHJlbWFpbmluZyBzb3VyY2VzLCBpdCBpcyBub3QuXFxuYFxuICAgICAgICAgICAgICAgICsgYE91cnM6ICAgICAgJHtvdXJGaW5nZXJwcmludH1cXG5gXG4gICAgICAgICAgICAgICAgKyBgUmVtYWluaW5nOiAke3JlbWFpbmluZ0ZpbmdlcnByaW50cy5qb2luKFwiXFxuICAgICAgICAgICBcIikgfHwgXCIobm9uZSlcIn1cXG5gXG4gICAgICAgICAgICAgICAgKyBgUmVtb3ZpbmcgJHtyZXBvVVJMfSB3b3VsZCBsb2NrIHlvdSBvdXQgb2YgJHtob3N0fS5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIG1lcmdlLCBzbyB0aGUgZGFlbW9uIGxlYXZlcyByb290J3MgYXV0aG9yaXplZF9rZXlzIGV4YWN0bHkgYXMgaXQgaXMuXG4gICAgICAgIGNvbnNvbGUubG9nKGAke3JlcG9VUkx9IGlzIHRoZSBsYXN0IHNvdXJjZSwgc28gcm9vdCdzIGF1dGhvcml6ZWRfa2V5cyBzdGF5cyBhcyBpdCBpcyBub3cuYCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcmVxdWlyZVJlbW90ZVdlYmhvb2soaG9zdCk7XG4gICAgYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbiRTVURPIHJtIC1mIFwiJHtzb3VyY2VLZXlQYXRoKHJlcG9VUkwpfVwiXG4kU1VETyBybSAtcmYgXCIke3NvdXJjZVJlcG9QYXRoKHJlcG9VUkwpfVwiYCxcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiByZW1vdGVDb25maWcuaG9zdExhYmVsLCByZXBvU291cmNlcyB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXBvVVJMfSByZW1vdmVkIGZyb20gJHtob3N0fS4gJHtyZXBvU291cmNlcy5sZW5ndGh9IHNvdXJjZShzKSBsZWZ0LmApO1xufVxuXG4vKiogQW5zd2VycyBcIndobyBjYW4gbG9nIGludG8gdGhpcyBib3gsIGFuZCB3aGljaCByZXBvIHNheXMgc29cIi4gVGhlIHBhdGhzIHRoZSBkYWVtb24gdXNlcyBhcmVcbiAgICBsZWZ0IG91dCBvbiBwdXJwb3NlLCB0aGV5IGFyZSBwbHVtYmluZyByYXRoZXIgdGhhbiBzb21ldGhpbmcgdG8gYWN0IG9uLiAqL1xuLyoqIFRoZSBkYWVtb24gaXMgaW5zdGFsbGVkIGZyb20gdGhpcyBjaGVja291dCwgc28gdGhlIGNoZWNrb3V0IGlzIGJyb3VnaHQgdXAgdG8gZGF0ZSBmaXJzdC5cbiAgICBBbnl0aGluZyB0aGF0IHN0b3BzIHRoZSBwdWxsIC0gYSBjb25mbGljdCwgbG9jYWwgY29tbWl0cywgbm8gdXBzdHJlYW0gLSBzdG9wcyB0aGUgdXBkYXRlIHRvbyxcbiAgICByYXRoZXIgdGhhbiBxdWlldGx5IGluc3RhbGxpbmcgd2hhdGV2ZXIgaGFwcGVuZWQgdG8gYmUgb24gZGlzay4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxMb2NhbENoZWNrb3V0KCkge1xuICAgIGxldCB0b3BMZXZlbCA9IGF3YWl0IHNwYXduUHJvbWlzZSh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwgY3dkOiBfX2Rpcm5hbWUgfSk7XG4gICAgaWYgKHRvcExldmVsLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtfX2Rpcm5hbWV9IHRvIGJlIGluc2lkZSBhIGdpdCBjaGVja291dCwgaXQgaXMgbm90LmBcbiAgICAgICAgICAgICsgYCB1cGRhdGUgaW5zdGFsbHMgdGhlIGRhZW1vbiBmcm9tIHRoaXMgY2hlY2tvdXQsIHNvIGl0IGhhcyB0byBiZSBvbmUuYFxuICAgICAgICApO1xuICAgIH1cbiAgICBsZXQgcmVwb1BhdGggPSB0b3BMZXZlbC5zdGRvdXQudHJpbSgpO1xuICAgIGxldCBwdWxsID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wicHVsbFwiLCBcIi0tZmYtb25seVwiXSwgY3dkOiByZXBvUGF0aCB9KTtcbiAgICBpZiAocHVsbC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGdpdCBwdWxsIGluICR7cmVwb1BhdGh9IHRvIHN1Y2NlZWQsIGl0IGRpZCBub3QsIHNvIG5vdGhpbmcgd2FzIGluc3RhbGxlZC5cXG5gXG4gICAgICAgICAgICArIGAkeyhwdWxsLnN0ZG91dCArIHB1bGwuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBob3N0IGluc3RhbGxzIGZyb20gZ2l0aHViLCBub3QgZnJvbSBoZXJlLCBzbyBsb2NhbCBjb21taXRzIHRoYXQgaGF2ZSBub3QgYmVlbiBwdXNoZWRcbiAgICAvLyBhcmUgbm90IHdoYXQgaXQgd2lsbCBydW4uXG4gICAgbGV0IGxvY2FsID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgY3dkOiByZXBvUGF0aCB9KTtcbiAgICBsZXQgcmVtb3RlID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wicmV2LXBhcnNlXCIsIFwiQHt1fVwiXSwgY3dkOiByZXBvUGF0aCB9KTtcbiAgICBpZiAobG9jYWwuc3Rkb3V0LnRyaW0oKSAhPT0gcmVtb3RlLnN0ZG91dC50cmltKCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFdBUk5JTkc6ICR7cmVwb1BhdGh9IGhhcyBjb21taXRzIHRoYXQgYXJlIG5vdCBwdXNoZWQuIFRoZSBob3N0IGluc3RhbGxzIGZyb20gZ2l0aHViLGApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgICAgc28gaXQgd2lsbCBydW4gdGhlIHB1c2hlZCB2ZXJzaW9uLCBub3Qgd2hhdCBpcyBoZXJlLmApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUHVsbGVkICR7cmVwb1BhdGh9YCk7XG59XG5cbi8qKiBQdXNoZXMgdGhlIGN1cnJlbnQgZGFlbW9uIG9udG8gYSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgb25lLCBmb3Igd2hlbiB0aGlzIGNvZGUgaGFzIG1vdmVkIG9uLlxuICAgIE5vdGhpbmcgYWJvdXQgd2hpY2gga2V5cyB0aGUgaG9zdCB0cnVzdHMgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhZW1vbihob3N0OiBzdHJpbmcpIHtcbiAgICAvLyBQdWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UsIHNvIGEgY2hlY2tvdXQgdGhhdCBjYW5ub3QgYmUgYnJvdWdodCB1cCB0byBkYXRlIGZhaWxzIGhlcmVcbiAgICAvLyByYXRoZXIgdGhhbiBhZnRlciB3ZSBoYXZlIGFscmVhZHkgc3RhcnRlZCBjaGFuZ2luZyB0aGUgaG9zdC5cbiAgICBhd2FpdCBwdWxsTG9jYWxDaGVja291dCgpO1xuICAgIGxldCBjb250ZW50cyA9IGF3YWl0IHJlYWRSZW1vdGVGaWxlKHsgaG9zdCwgZmlsZVBhdGg6IFJFTU9URV9DT05GSUdfUEFUSCB9KTtcbiAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke2hvc3R9IHRvIGFscmVhZHkgaGF2ZSBwb3J0c2VjdXJlLCAke1JFTU9URV9DT05GSUdfUEFUSH0gZG9lcyBub3QgZXhpc3QuXFxuYFxuICAgICAgICAgICAgKyBgU2V0IGl0IHVwIHdpdGg6XFxuICB5YXJuIHNlY3VyZXNzaCAke2hvc3R9IGFkZCA8cmVwby1wcml2YXRlLWtleT4gW3JlcG8tdXJsXWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHsgaG9zdExhYmVsPzogc3RyaW5nOyByZXBvU291cmNlcz86IHN0cmluZ1tdIH07XG4gICAgbGV0IHJlcG9Tb3VyY2VzID0gcGFyc2VkLnJlcG9Tb3VyY2VzIHx8IFtdO1xuICAgIGF3YWl0IHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3QpO1xuICAgIGF3YWl0IGVuc3VyZVJldm9rZVJlcG9zRXhpc3QocmVwb1NvdXJjZXMpO1xuICAgIGF3YWl0IGluc3RhbGxEYWVtb24oeyBob3N0LCBob3N0TGFiZWw6IHBhcnNlZC5ob3N0TGFiZWwgfHwgaG9zdCwgcmVwb1NvdXJjZXMgfSk7XG4gICAgY29uc29sZS5sb2coYFVwZGF0ZWQgdGhlIGRhZW1vbiBvbiAke2hvc3R9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpLCB1bmNoYW5nZWQuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RTb3VyY2VzKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCByZW1vdGVDb25maWcgPSBhd2FpdCByZWFkUmVtb3RlQ29uZmlnKGhvc3QpO1xuICAgIGlmICghcmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtob3N0fSBoYXMgbm8ga2V5IHNvdXJjZXMuIHJvb3QncyBhdXRob3JpemVkX2tleXMgaXMgbGVmdCBleGFjdGx5IGFzIGl0IGlzLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2hvc3R9IGxldHMgcm9vdCBsb2cgaW4gd2l0aCB0aGUga2V5cyBmcm9tICR7cmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmxlbmd0aH0gcmVwbyhzKTpgKTtcbiAgICBsZXQgbWVyZ2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChsZXQgcmVwb1VSTCBvZiByZW1vdGVDb25maWcucmVwb1NvdXJjZXMpIHtcbiAgICAgICAgbGV0IGtleXMgPSBhd2FpdCByZWFkUmVtb3RlU291cmNlS2V5cyh7IGhvc3QsIHJlcG9VUkwgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7cmVwb1VSTH1gKTtcbiAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICBncmFudHMgbm8ga2V5cyAtIHRoZSBjaGVja291dCBpcyBtaXNzaW5nIG9yIGVtcHR5YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgICAgIGdyYW50cyAke2tleXMubGVuZ3RofSBrZXkocyk6YCk7XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgJHtzdW1tYXJpemVLZXkoa2V5KX1gKTtcbiAgICAgICAgICAgIG1lcmdlZC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbiR7bWVyZ2VkLnNpemV9IGtleShzKSBpbiB0b3RhbCBvbmNlIGR1cGxpY2F0ZXMgYXJlIG1lcmdlZC5gKTtcbiAgICB9XG59XG5cbi8qKiBUaGUgdmVyYiBpcyBhIGZpeGVkIHdvcmQgcmF0aGVyIHRoYW4gYSBwb3NpdGlvbiwgc28gaXQgaXMgcHVsbGVkIG91dCBvZiB0aGUgYXJndW1lbnRzIHdoZXJldmVyXG4gICAgaXQgd2FzIHR5cGVkIGFuZCBldmVyeXRoaW5nIGxlZnQgb3ZlciBpcyBwb3NpdGlvbmFsLiAqL1xuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHZlcmJzID0gYXJndi5maWx0ZXIoYXJnID0+IFZFUkJTLmluY2x1ZGVzKGFyZykpO1xuICAgIGlmICghdmVyYnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25lIG9mICR7VkVSQlMuam9pbihcIiwgXCIpfSBzb21ld2hlcmUgaW4gdGhlIGFyZ3VtZW50cywgd2FzICR7YXJndi5qb2luKFwiIFwiKSB8fCBcIihub3RoaW5nKVwifVxcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIGlmICh2ZXJicy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25lIG9mICR7VkVSQlMuam9pbihcIiwgXCIpfSwgd2FzICR7dmVyYnMuam9pbihcIiBhbmQgXCIpfVxcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIGxldCB2ZXJiID0gdmVyYnNbMF07XG4gICAgbGV0IFtob3N0LCAuLi5yZXN0XSA9IGFyZ3YuZmlsdGVyKGFyZyA9PiBhcmcgIT09IHZlcmIpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgaG9zdCwgd2FzIG5vdGhpbmdcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICByZXR1cm4geyB2ZXJiLCBob3N0LCByZXN0IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCB7IHZlcmIsIGhvc3QsIHJlc3QgfSA9IHBhcnNlQXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuXG4gICAgaWYgKHZlcmIgPT09IFwibGlzdFwiKSB7XG4gICAgICAgIGF3YWl0IGxpc3RTb3VyY2VzKGhvc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2ZXJiID09PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3RoaW5nIGFmdGVyIHVwZGF0ZSwgd2FzICR7cmVzdC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB1cGRhdGVEYWVtb24oaG9zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwiYWRkXCIpIHtcbiAgICAgICAgaWYgKCFyZXN0Lmxlbmd0aCB8fCByZXN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBwcml2YXRlIGtleSBhbmQgb3B0aW9uYWxseSBhIHJlcG8gdXJsLCB3YXMgJHtyZXN0Lmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGFkZFNvdXJjZSh7IGhvc3QsIGtleVBhdGg6IGV4cGFuZEhvbWUocmVzdFswXSksIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMV0pIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0IGEgcmVwbyB1cmwgdG8gcmVtb3ZlLCB3YXMgJHtyZXN0Lmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBhd2FpdCByZW1vdmVTb3VyY2UoeyBob3N0LCByZXBvVVJMOiBhd2FpdCByZXNvbHZlUmVwb1VSTChyZXN0WzBdKSB9KTtcbn1cbiJdfQ==
|
|
552
|
-
/* _JS_SOURCE_HASH = "
|
|
538
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlU1NILmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlU1NILnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHNEQUF1RjtBQUN2RixxREFBNkU7QUFDN0UsdUNBQTBEO0FBQzFELGlEQUFrRjtBQUNsRix5Q0FBK0M7QUFDL0MsNENBQThDO0FBQzlDLDRDQUFnRDtBQUNoRCxvREFBdUg7QUFFdkgsTUFBTSxjQUFjLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFDNUUsa0dBQWtHO0FBQ2xHLG1HQUFtRztBQUNuRyxnQkFBZ0I7QUFDaEIsTUFBTSxjQUFjLEdBQUcsNENBQTRDLENBQUM7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxNQUFNLG1CQUFtQixHQUFHLHdDQUF3QyxDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsNkJBQTZCLENBQUM7QUFDekQsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDbEMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCw4RUFBOEU7QUFDOUUsTUFBTSxLQUFLLEdBQUc7Ozs7K0JBSWlCLENBQUM7QUFFaEMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxNQUFNLGtCQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsT0FBTyxLQUFLLENBQUM7SUFDakIs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Q0FBQztRQUNoRyxPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxJQUFJLENBQUMsTUFBTSxpQkFBaUIsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBQ0QsTUFBTSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBekJELG9CQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBwYXJzZVdlYmhvb2tGaWxlIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplS2V5cywgcmVhZFJlcG9LZXlzLCBzdW1tYXJpemVLZXkgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgc291cmNlS2V5UGF0aCwgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBkZXJpdmVSZXZva2VLZXksIFJFVk9LRV9LRVlfTEFCRUwsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IHJldm9rZWRLZXlzSW5SZXBvIH0gZnJvbSBcIi4vdW5yZXZva2VcIjtcbmltcG9ydCB7IGV4cGFuZEhvbWUgfSBmcm9tIFwiLi4vaGVscGVycy9wYXRoc1wiO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlIH0gZnJvbSBcIi4uL2hlbHBlcnMvc3Bhd25cIjtcbmltcG9ydCB7IHJlYWRSZW1vdGVGaWxlLCByZW1vdGVDb21tYW5kRXhpc3RzLCBydW5PdmVyU1NILCBTVURPX1BSRUFNQkxFLCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcblxuY29uc3QgU0VSVklDRV9TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRhZW1vblwiLCBcInBvcnRzZWN1cmUuc2VydmljZVwiKTtcbi8vIFRoZSBkYWVtb24gcnVucyBmcm9tIGEgY2hlY2tvdXQgb2YgdGhpcyByZXBvIG9uIHRoZSBob3N0LCByYXRoZXIgdGhhbiBmcm9tIGEgY29weSB3ZSB1cGxvYWQsIHNvXG4vLyBhIGhvc3QgdXBkYXRlcyBpdHNlbGYgZnJvbSBnaXRodWIgdGhlIHNhbWUgd2F5IGFueXRoaW5nIGVsc2UgZG9lcy4gc2xpZnR1dGlscyBpcyBwdWJsaWMsIHNvIHRoaXNcbi8vIG5lZWRzIG5vIGtleS5cbmNvbnN0IFNMSUZUVVRJTFNfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3Qvc2xpZnR1dGlscy5naXRcIjtcbmNvbnN0IFJFTU9URV9DSEVDS09VVF9QQVRIID0gXCIvb3B0L3BvcnRzZWN1cmUvc2xpZnR1dGlsc1wiO1xuY29uc3QgUkVNT1RFX1NFUlZJQ0VfUEFUSCA9IFwiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9wb3J0c2VjdXJlLnNlcnZpY2VcIjtcbmNvbnN0IFJFTU9URV9DT05GSUdfUEFUSCA9IFwiL2V0Yy9wb3J0c2VjdXJlL2RhZW1vbi5qc29uXCI7XG5jb25zdCBST09UX0FVVEhPUklaRURfS0VZUyA9IFwiL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXNcIjtcbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IFwicG9ydHNlY3VyZVwiO1xuY29uc3QgTUFYX0VSUk9SX0JPRFlfTEVOR1RIID0gNTAwO1xuY29uc3QgVkVSQlMgPSBbXCJhZGRcIiwgXCJyZW1vdmVcIiwgXCJsaXN0XCIsIFwidXBkYXRlXCJdO1xuLy8gVGhlIHJlcG8gdXJsIGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gdGhlIHJlcG8gdGhlIGNvbW1hbmQgaXMgcnVuIGZyb20uXG5jb25zdCBVU0FHRSA9IGBVc2FnZTpcbiAgeWFybiBzZWN1cmVzc2ggPGhvc3Q+IGFkZCA8cmVwby1wcml2YXRlLWtleT4gW3JlcG8tdXJsXVxuICB5YXJuIHNlY3VyZXNzaCA8aG9zdD4gcmVtb3ZlIFtyZXBvLXVybF1cbiAgeWFybiBzZWN1cmVzc2ggPGhvc3Q+IGxpc3RcbiAgeWFybiBzZWN1cmVzc2ggPGhvc3Q+IHVwZGF0ZWA7XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTG9jYWwoY29uZmlnOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGN3ZD86IHN0cmluZzsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IHsgY29tbWFuZCwgYXJncywgY3dkLCBhbGxvd0ZhaWx1cmUgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZCwgYXJncywgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2NvbW1hbmR9IHRvIHJ1biwgZmFpbGVkIHdpdGggJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDAgJiYgIWFsbG93RmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtjb21tYW5kfSAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBBIHByaXZhdGUga2V5IGNhbm5vdCBhdXRoZW50aWNhdGUgYW4gaHR0cHMgcmVtb3RlLCBzbyBnaXRodWIgdXJscyBhcmUgY29udmVydGVkIHRvIHRoZSBzc2ggZm9ybVxuICAgIHRoZSBrZXkgY2FuIGFjdHVhbGx5IGJlIHVzZWQgd2l0aC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9VUkwocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IGh0dHBzTWF0Y2ggPSByZXBvVVJMLm1hdGNoKC9eaHR0cHM/OlxcL1xcLyhbXi9dKylcXC8oLis/KSg/OlxcLmdpdCk/XFwvPyQvKTtcbiAgICBpZiAoIWh0dHBzTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9VUkw7XG4gICAgfVxuICAgIGxldCBbLCBob3N0LCByZXBvUGF0aF0gPSBodHRwc01hdGNoO1xuICAgIHJldHVybiBgZ2l0QCR7aG9zdH06JHtyZXBvUGF0aH0uZ2l0YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2l0V2l0aEtleShjb25maWc6IHsga2V5UGF0aDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgY3dkPzogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCBhcmdzLCBjd2QsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIC8vIGNvcmUuc3NoQ29tbWFuZCBrZWVwcyBrZXkgc2VsZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgaW5zdGVhZCBvZiBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAgbGV0IHNzaENvbW1hbmQgPSBgc3NoIC1pICR7a2V5UGF0aH0gLW8gSWRlbnRpdGllc09ubHk9eWVzIC1vIEJhdGNoTW9kZT15ZXMgLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPWFjY2VwdC1uZXdgO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItY1wiLCBgY29yZS5zc2hDb21tYW5kPSR7c3NoQ29tbWFuZH1gLCAuLi5hcmdzXSwgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBnaXQgdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBleGl0IDAsIHdhcyAke3Jlc3VsdC5zdGF0dXN9LiBgXG4gICAgICAgICAgICArIGAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQXNrcyBzc2ggd2hpY2gga2V5IGl0IGFjdHVhbGx5IGF1dGhlbnRpY2F0ZWQgd2l0aC4gVGhpcyBpcyB0aGUga2V5IHRoYXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIGRhZW1vbiB0YWtpbmcgb3ZlciBhdXRob3JpemVkX2tleXMsIG90aGVyd2lzZSBhIGRlcGxveSBsb2NrcyB1cyBvdXQuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHtcbiAgICAgICAgY29tbWFuZDogXCJzc2hcIixcbiAgICAgICAgYXJnczogW1wiLXZcIiwgXCItb1wiLCBcIkJhdGNoTW9kZT15ZXNcIiwgXCItb1wiLCBcIkNvbm5lY3RUaW1lb3V0PTEwXCIsIGhvc3QsIFwidHJ1ZVwiXSxcbiAgICB9KTtcbiAgICBsZXQgdmVyYm9zZU91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgXCJcIjtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIHNzaCBpbnRvICR7aG9zdH0sIGZhaWxlZC4gJHt2ZXJib3NlT3V0cHV0LnNsaWNlKC1NQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgIH1cbiAgICBsZXQgYWNjZXB0ZWRNYXRjaCA9IHZlcmJvc2VPdXRwdXQubWF0Y2goL1NlcnZlciBhY2NlcHRzIGtleTouKj8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICBpZiAoIWFjY2VwdGVkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gYWNjZXB0IGEgcHVibGljIGtleSwgYnV0IHRoZSBzZXNzaW9uIGRpZCBub3QgYXV0aGVudGljYXRlIHdpdGggb25lLmBcbiAgICAgICAgICAgICsgYCBwb3J0c2VjdXJlIGRpc2FibGVzIHBhc3N3b3JkIGxvZ2luLCBzbyBrZXkgYmFzZWQgYWNjZXNzIGhhcyB0byB3b3JrIGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY2VwdGVkTWF0Y2hbMV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50S2V5cyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1rZXlzLVwiKSk7XG4gICAgbGV0IGtleXNQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJhdXRob3JpemVkX2tleXNcIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGtleXNQYXRoLCBgJHtrZXlzLmpvaW4oXCJcXG5cIil9XFxuYCk7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJzc2gta2V5Z2VuXCIsIGFyZ3M6IFtcIi1sZlwiLCBrZXlzUGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBsZXQgZmluZ2VycHJpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBmaW5nZXJwcmludHMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbmdlcnByaW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVSZXBvRm9ySW5zcGVjdGlvbihjb25maWc6IHsgcmVwb1VSTDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9VUkwsIGtleVBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1yZXBvLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoLCBhcmdzOiBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJlcG9VUkwsIHJlcG9QYXRoXSB9KTtcbiAgICByZXR1cm4gcmVwb1BhdGg7XG59XG5cbi8qKiBXaXRoIG5vIHJlcG8gdXJsIGdpdmVuLCB0aGUgcmVwbyB3ZSBhcmUgc3RhbmRpbmcgaW4gaXMgdXNlZC4gSXQgaGFzIHRvIGFjdHVhbGx5IGhvbGQga2V5c1xuICAgIGJlZm9yZSB3ZSBoYW5kIGl0IHRvIGEgaG9zdCwgc28gYSBzdHJheSB3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGVwbG95ZWQgYnkgYWNjaWRlbnQuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1VSTChwYXNzZWRVUkw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwYXNzZWRVUkwpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlcG9VUkwocGFzc2VkVVJMKTtcbiAgICB9XG4gICAgbGV0IHRvcExldmVsID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAodG9wTGV2ZWwuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSByZXBvIHVybCwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIGJlIGluc2lkZSBhIGdpdCByZXBvLCBpdCBpcyBub3QuXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHJlcG9QYXRoID0gdG9wTGV2ZWwuc3Rkb3V0LnRyaW0oKTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkUmVwb0tleXMocmVwb1BhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGEgcmVwbyB1cmwsIG9yIHRoZSBjdXJyZW50IHJlcG8gKCR7cmVwb1BhdGh9KSB0byBob2xkIGtleXMsIGl0IGRvZXMgbm90LlxcbiR7ZX1cXG4ke1VTQUdFfWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG9yaWdpbiA9IGF3YWl0IHJ1bkxvY2FsKHtcbiAgICAgICAgY29tbWFuZDogXCJnaXRcIixcbiAgICAgICAgYXJnczogW1wicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSxcbiAgICAgICAgY3dkOiByZXBvUGF0aCxcbiAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChvcmlnaW4uc3RhdHVzICE9PSAwIHx8ICFvcmlnaW4uc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdGhlIGN1cnJlbnQgcmVwbyAoJHtyZXBvUGF0aH0pIHRvIGhhdmUgYW4gb3JpZ2luIHJlbW90ZSwgaXQgaGFzIG5vbmUuYFxuICAgICAgICAgICAgKyBgIFRoZSBob3N0IGNsb25lcyB0aGUgc291cmNlIGl0c2VsZiwgc28gYSBsb2NhbCBwYXRoIGlzIG5vIHVzZSB0byBpdC5gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXBvVVJMID0gbm9ybWFsaXplUmVwb1VSTChvcmlnaW4uc3Rkb3V0LnRyaW0oKSk7XG4gICAgY29uc29sZS5sb2coYE5vIHJlcG8gdXJsIGdpdmVuLCB1c2luZyB0aGUgY3VycmVudCByZXBvOiAke3JlcG9VUkx9YCk7XG4gICAgcmV0dXJuIHJlcG9VUkw7XG59XG5cbi8qKiBFdmVyeSBzb3VyY2UncyByZXZva2UgcmVwbyBoYXMgdG8gZXhpc3QgYW5kIGhvbGQgYXQgbGVhc3Qgb25lIGNvbW1pdCwgb3IgdGhlIGhvc3RzIHVzaW5nIGl0XG4gICAgY2Fubm90IHJlY29yZCBhIHJldm9jYXRpb24uIENoZWNrZWQgd2l0aCB0aGlzIG1hY2hpbmUncyBvd24gZ2l0IGNyZWRlbnRpYWxzLCBzaW5jZSB1cGRhdGUgaXNcbiAgICBub3QgZ2l2ZW4gYW55IGRlcGxveSBrZXksIGFuZCBhbiBlbXB0eSByZXBvIGlzIGluaXRpYWxpc2VkIHJhdGhlciB0aGFuIG1lcmVseSBjb21wbGFpbmVkIGFib3V0LlxuXG4gICAgQSBob3N0IHRoYXQgY2Fubm90IHdyaXRlIGEgcmV2b2NhdGlvbiBzaWxlbnRseSBrZWVwcyBhY2NlcHRpbmcgYSBrZXkgaXQganVzdCBzYXcgYmVpbmcgbWlzdXNlZCxcbiAgICB3aGljaCBpcyB0aGUgb25lIGZhaWx1cmUgdGhpcyB3aG9sZSB0aGluZyBleGlzdHMgdG8gcHJldmVudCwgc28gaXQgaXMgY2hlY2tlZCBvbiBldmVyeSBkZXBsb3lcbiAgICBhbmQgbm90IG9ubHkgd2hlbiBhIHNvdXJjZSBpcyBmaXJzdCBhZGRlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG9zRXhpc3QocmVwb1NvdXJjZXM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChsZXQgcmVwb1VSTCBvZiByZXBvU291cmNlcykge1xuICAgICAgICBsZXQgcmV2b2tlVVJMID0gcmV2b2tlUmVwb1VSTChyZXBvVVJMKTtcbiAgICAgICAgbGV0IHRlbXBvcmFyeURpcmVjdG9yeSA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInBvcnRzZWN1cmUtcmV2b2tlLVwiKSk7XG4gICAgICAgIGxldCBjaGVja291dFBhdGggPSBwYXRoLmpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcInJlcG9cIik7XG4gICAgICAgIGxldCBjbG9uZSA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChjbG9uZS5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gZXhpc3QsIGl0IGRvZXMgbm90LCBzbyAke3JlcG9VUkx9IGhhcyBub3doZXJlIHRvIHJlY29yZCBhYFxuICAgICAgICAgICAgICAgICsgYCByZXZvY2F0aW9uLlxcbkNyZWF0ZSBpdCwgdGhlbiBydW4gXCJ5YXJuIHNlY3VyZXNzaCA8aG9zdD4gYWRkXCIgZm9yIHRoYXQgc291cmNlIHRvYFxuICAgICAgICAgICAgICAgICsgYCByZWdpc3RlciBpdHMgZGVwbG95IGtleS5cXG4keyhjbG9uZS5zdGRvdXQgKyBjbG9uZS5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhlYWQgPSBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3M6IFtcIi1DXCIsIGNoZWNrb3V0UGF0aCwgXCJyZXYtcGFyc2VcIiwgXCJIRUFEXCJdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChoZWFkLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7cmV2b2tlVVJMfSBpcyBlbXB0eSwgZ2l2aW5nIGl0IGEgZmlyc3QgY29tbWl0YCk7XG4gICAgICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNoZWNrb3V0UGF0aCwgXCJSRUFETUUubWRcIiksXG4gICAgICAgICAgICAgICAgYCMgcmV2b2tlZCBrZXlzXFxuXFxuV3JpdHRlbiBieSBwb3J0c2VjdXJlLiBFYWNoIGZpbGUgdW5kZXIgcmV2b2NhdGlvbnMvIGlzIG9uZSBrZXkgdGhhdCB3YXMgdXNlZCBmcm9tIGFuXFxuYFxuICAgICAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgICAgIGZvciAobGV0IGFyZ3Mgb2YgW1xuICAgICAgICAgICAgICAgIFtcIi1DXCIsIGNoZWNrb3V0UGF0aCwgXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIFwiaW5pdGlhbGlzZSByZXZva2UgcmVwb1wiXSxcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHJlYWR5YCk7XG4gICAgfVxufVxuXG4vKiogVGhlIHJldm9rZSByZXBvIGhhcyB0byBleGlzdCBhbmQgYmUgd3JpdGFibGUgYmVmb3JlIGEgaG9zdCBpcyBzZXQgdXAsIGJlY2F1c2UgYSBob3N0IHRoYXRcbiAgICBjYW5ub3Qgd3JpdGUgYSByZXZvY2F0aW9uIGNhbm5vdCByZXZva2UgYSBrZXkgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiBUaGUga2V5IGZvciBpdCBpcyBkZXJpdmVkXG4gICAgZnJvbSB0aGUgc291cmNlJ3MsIHNpbmNlIGdpdGh1YiB3aWxsIG5vdCB0YWtlIG9uZSBwdWJsaWMga2V5IG9uIHR3byByZXBvcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG8oY29uZmlnOiB7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgbGV0IGRlcml2ZWQgPSBkZXJpdmVSZXZva2VLZXkoYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpKTtcblxuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgIGxldCBkZXJpdmVkS2V5UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwia2V5XCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkZXJpdmVkS2V5UGF0aCwgZGVyaXZlZC5wcml2YXRlS2V5RmlsZSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuXG4gICAgbGV0IGV4cGxhaW4gPSAocHJvYmxlbTogc3RyaW5nKSA9PiBuZXcgRXJyb3IoXG4gICAgICAgIGAke3Byb2JsZW19XFxuYFxuICAgICAgICArIGBDcmVhdGUgJHtyZXZva2VVUkx9IGFuZCBhZGQgdGhpcyBhcyBhIGRlcGxveSBrZXkgV0lUSCBXUklURSBBQ0NFU1M6XFxuYFxuICAgICAgICArIGAgICR7ZGVyaXZlZC5wdWJsaWNLZXl9ICR7UkVWT0tFX0tFWV9MQUJFTH1cXG5gXG4gICAgICAgICsgYEl0IGhhcyB0byBiZSB0aGlzIGtleTogaXQgaXMgZGVyaXZlZCBmcm9tICR7a2V5UGF0aH0sIGFuZCBnaXRodWIgd2lsbCBub3QgYWNjZXB0IHRoZSBzYW1lYFxuICAgICAgICArIGAgcHVibGljIGtleSBvbiB0d28gcmVwb3NpdG9yaWVzLmBcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmV2b2tlVVJMfWApO1xuICAgIGxldCBjbG9uZSA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gYmUgcmVhZGFibGUgd2l0aCB0aGUgZGVyaXZlZCBrZXksIGl0IGlzIG5vdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBbiBlbXB0eSByZXBvIGhhcyBubyBicmFuY2ggZm9yIHRoZSBkYWVtb24gdG8gY2xvbmUsIHNvIGl0IGdldHMgaXRzIGZpcnN0IGNvbW1pdCBoZXJlLiBUaGF0XG4gICAgLy8gZG91YmxlcyBhcyB0aGUgcHJvb2YgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gaXQuXG4gICAgbGV0IGhlYWQgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGhlYWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY2hlY2tvdXRQYXRoLCBcIlJFQURNRS5tZFwiKSxcbiAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgZm9yIChsZXQgYXJncyBvZiBbXG4gICAgICAgICAgICBbXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgIFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgIF0pIHtcbiAgICAgICAgICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJncywgY3dkOiBjaGVja291dFBhdGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2ggPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IGNoZWNrb3V0UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkIHdyaXRlIGFjY2VzcyB0byAke3Jldm9rZVVSTH0sIHRoZSBmaXJzdCBwdXNoIHdhcyByZWZ1c2VkLlxcbiR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRyeVJ1biA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicHVzaFwiLCBcIi0tZHJ5LXJ1blwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChkcnlSdW4uc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCB3cml0ZSBhY2Nlc3MgdG8gJHtyZXZva2VVUkx9LCBhIGRyeSBydW4gcHVzaCB3YXMgcmVmdXNlZC5cXG4keyhkcnlSdW4uc3Rkb3V0ICsgZHJ5UnVuLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHdyaXRhYmxlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVDb25maWcoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgaG9zdExhYmVsOiBob3N0LCByZXBvU291cmNlczogW10gYXMgc3RyaW5nW10gfTtcbiAgICB9XG4gICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHsgaG9zdExhYmVsPzogc3RyaW5nOyByZXBvU291cmNlcz86IHN0cmluZ1tdIH07XG4gICAgcmV0dXJuIHsgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzOiBwYXJzZWQucmVwb1NvdXJjZXMgfHwgW10gfTtcbn1cblxuLyoqIFJlYWRzIHRoZSBrZXlzIGEgc291cmNlJ3MgY2hlY2tvdXQgY3VycmVudGx5IGhvbGRzIG9uIHRoZSBob3N0LCBzbyB0aGUgbWVyZ2VkIHJlc3VsdCBjYW4gYmVcbiAgICB3b3JrZWQgb3V0IHdpdGhvdXQgbmVlZGluZyB0aGF0IHNvdXJjZSdzIHByaXZhdGUga2V5IGxvY2FsbHkuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUmVtb3RlU291cmNlS2V5cyhjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBzb3VyY2VSZXBvUGF0aChyZXBvVVJMKTtcbiAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbmlmICRTVURPIHRlc3QgLWYgXCIke3JlcG9QYXRofS9hdXRob3JpemVkX2tleXNcIjsgdGhlblxuICAgICRTVURPIGNhdCBcIiR7cmVwb1BhdGh9L2F1dGhvcml6ZWRfa2V5c1wiXG5lbGlmICRTVURPIHRlc3QgLWQgXCIke3JlcG9QYXRofVwiOyB0aGVuXG4gICAgJFNVRE8gY2F0IFwiJHtyZXBvUGF0aH1cIi8qLnB1YiAyPi9kZXYvbnVsbCB8fCB0cnVlXG5maWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbm9ybWFsaXplS2V5cyhvdXRwdXQuc3Rkb3V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERhZW1vbihjb25maWc6IHsgaG9zdDogc3RyaW5nOyBob3N0TGFiZWw6IHN0cmluZzsgcmVwb1NvdXJjZXM6IHN0cmluZ1tdIH0pIHtcbiAgICBsZXQgeyBob3N0LCBob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0gPSBjb25maWc7XG4gICAgZm9yIChsZXQgY29tbWFuZCBvZiBbXCJub2RlXCIsIFwiZ2l0XCIsIFwieWFyblwiXSkge1xuICAgICAgICBpZiAoIWF3YWl0IHJlbW90ZUNvbW1hbmRFeGlzdHMoeyBob3N0LCBjb21tYW5kIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7Y29tbWFuZH0gdG8gYmUgaW5zdGFsbGVkIG9uICR7aG9zdH0sIGl0IGlzIG5vdC4gSW5zdGFsbCBpdCBhbmQgcmVydW4uYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY2hlY2tvdXQgaXMgYnJvdWdodCB0byB0aGUgbGF0ZXN0IGNvbW1pdCByYXRoZXIgdGhhbiBhIGNvcHkgYmVpbmcgcHVzaGVkLCBzbyB3aGF0IHJ1bnMgb25cbiAgICAvLyB0aGUgaG9zdCBpcyBleGFjdGx5IHdoYXQgaXMgb24gZ2l0aHViLlxuICAgIGNvbnNvbGUubG9nKGBVcGRhdGluZyAke1JFTU9URV9DSEVDS09VVF9QQVRIfSBvbiAke2hvc3R9YCk7XG4gICAgYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbnNldCAtZVxuJFNVRE8gbWtkaXIgLXAgXCIke3BhdGgucG9zaXguZGlybmFtZShSRU1PVEVfQ0hFQ0tPVVRfUEFUSCl9XCJcbmlmICRTVURPIHRlc3QgLWQgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfS8uZ2l0XCI7IHRoZW5cbiAgICAjIFN0YXNoZWQgZmlyc3QsIHRoZSB3YXkgbWFjaGluZS1hbHdheXN1cCBkb2VzIGl0LiBBbnl0aGluZyBzaXR0aW5nIG1vZGlmaWVkIGluIGEgaG9zdCdzXG4gICAgIyBjaGVja291dCBpcyBlaXRoZXIgYW4gYWNjaWRlbnQgb3Igc29tZWJvZHkgZWRpdGluZyB0aGUgZGFlbW9uIGluIHBsYWNlLCBhbmQgZWl0aGVyIHdheSBpdCBpc1xuICAgICMgd29ydGgga2VlcGluZyByYXRoZXIgdGhhbiBxdWlldGx5IGVyYXNpbmcuIFRoZSBpZGVudGl0eSBpcyBwYXNzZWQgaW5saW5lIGJlY2F1c2UgYSBob3N0IGhhc1xuICAgICMgbm8gZ2l0IGNvbmZpZyBvZiBpdHMgb3duIGFuZCBzdGFzaCB3cml0ZXMgYSBjb21taXQuXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiBhZGQgLS1hbGxcbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIC1jIHVzZXIuZW1haWw9cG9ydHNlY3VyZUBsb2NhbGhvc3QgLWMgdXNlci5uYW1lPXBvcnRzZWN1cmUgc3Rhc2hcbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIGZldGNoIC0tcHJ1bmUgb3JpZ2luXG4gICAgIyBBIHN0YXNoIGFuZCBhIHB1bGwgY2Fubm90IGNyb3NzIGEgYnJhbmNoIHRoYXQgaGFzIGRpdmVyZ2VkLCBhbmQgYSBkcmlmdGVkIGNoZWNrb3V0IG11c3Qgbm90IGJlXG4gICAgIyBhYmxlIHRvIGxlYXZlIGEgaG9zdCBydW5uaW5nIG9sZCBjb2RlLCBzbyBpdCBpcyBwdXQgb24gdGhlIHJlbW90ZSdzIHN0YXRlIHJhdGhlciB0aGFuIG1lcmdlZFxuICAgICMgd2l0aCBpdC4gc2V0LWhlYWQgc28gdGhhdCBpcyB0aGUgcmVtb3RlJ3MgZGVmYXVsdCBicmFuY2ggbm93LCBub3QgdGhlIG9uZSBpdCBoYWQgYXQgY2xvbmUuXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiByZW1vdGUgc2V0LWhlYWQgb3JpZ2luIC0tYXV0b1xuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgcmVzZXQgLS1oYXJkIG9yaWdpbi9IRUFEXG5lbHNlXG4gICAgJFNVRE8gcm0gLXJmIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIlxuICAgICRTVURPIGdpdCBjbG9uZSBcIiR7U0xJRlRVVElMU19VUkx9XCIgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiXG5maVxuJFNVRE8geWFybiAtLWN3ZCBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgaW5zdGFsbCAtLXByb2R1Y3Rpb24gLS1ub24taW50ZXJhY3RpdmVcbiMgVGhlIHNpbmdsZSBmaWxlIGRhZW1vbiB0aGlzIHJlcGxhY2VkLCBsZWZ0IG92ZXIgb24gYSBob3N0IHNldCB1cCBieSBhbiBvbGRlciB2ZXJzaW9uLlxuJFNVRE8gcm0gLWYgL29wdC9wb3J0c2VjdXJlL3BvcnRzZWN1cmUtZGFlbW9uLmpzYCxcbiAgICB9KTtcbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRILFxuICAgICAgICAvLyBPbmx5IHdoYXQgZGlmZmVycyBiZXR3ZWVuIG1hY2hpbmVzLiBFdmVyeSBwYXRoIHRoZSBkYWVtb24gdXNlcyBpcyBkZXJpdmVkIGluIHRoZSBkYWVtb25cbiAgICAgICAgLy8gaXRzZWxmLCBzbyB0aGVyZSBpcyBub3RoaW5nIGhlcmUgdG8gZHJpZnQgb3V0IG9mIHN5bmMuXG4gICAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeSh7IGhvc3RMYWJlbCwgcmVwb1NvdXJjZXMgfSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIsXG4gICAgICAgIGZpbGVNb2RlOiBcIjYwMFwiLFxuICAgICAgICBkaXJlY3RvcnlNb2RlOiBcIjcwMFwiLFxuICAgIH0pO1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBSRU1PVEVfU0VSVklDRV9QQVRILFxuICAgICAgICBjb250ZW50czogYXdhaXQgZnMucmVhZEZpbGUoU0VSVklDRV9TT1VSQ0UsIFwidXRmOFwiKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjQ0XCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzU1XCIsXG4gICAgfSk7XG4gICAgYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbnNldCAtZVxuJFNVRE8gc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWRcbiRTVURPIHN5c3RlbWN0bCBlbmFibGUgJHtTRVJWSUNFX05BTUV9XG4kU1VETyBzeXN0ZW1jdGwgcmVzdGFydCAke1NFUlZJQ0VfTkFNRX1gLFxuICAgIH0pO1xuXG4gICAgbGV0IHN0YXR1cyA9IChhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgc3lzdGVtY3RsIGlzLWFjdGl2ZSAke1NFUlZJQ0VfTkFNRX0gfHwgdHJ1ZWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KSkuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAoc3RhdHVzICE9PSBcImFjdGl2ZVwiKSB7XG4gICAgICAgIGxldCBqb3VybmFsID0gKGF3YWl0IHJ1bk92ZXJTU0goe1xuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbiRTVURPIGpvdXJuYWxjdGwgLXUgJHtTRVJWSUNFX05BTUV9IC1uIDQwIC0tbm8tcGFnZXIgfHwgdHJ1ZWAsXG4gICAgICAgICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgICAgIH0pKS5zdGRvdXQ7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtTRVJWSUNFX05BTUV9IHRvIGJlIGFjdGl2ZSBvbiAke2hvc3R9LCB3YXMgJHtzdGF0dXN9LlxcbiR7am91cm5hbC5zbGljZSgtMjAwMCl9YCk7XG4gICAgfVxuXG4gICAgbGV0IHN0aWxsUmVhY2hhYmxlID0gYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogXCJlY2hvIHJlYWNoYWJsZVwiLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKHN0aWxsUmVhY2hhYmxlLnN0ZG91dC50cmltKCkgIT09IFwicmVhY2hhYmxlXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gc3RpbGwgYmUgcmVhY2hhYmxlIGFmdGVyIHRoZSBkYWVtb24gc3RhcnRlZCwgaXQgaXMgbm90LmBcbiAgICAgICAgICAgICsgYCBDaGVjayBjb25zb2xlIGFjY2VzcyBpbW1lZGlhdGVseS5gXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGEgRGlzY29yZCB3ZWJob29rIGF0ICR7REVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSH0gb24gJHtob3N0fSwgbm8gc3VjaCBmaWxlIGV4aXN0cy5gXG4gICAgICAgICAgICArIGAgVGhlIGRhZW1vbiB3aWxsIG5vdCBzdGFydCB3aXRob3V0IG9uZS5cXG5gXG4gICAgICAgICAgICArIGBTZXQgaXQgdXAgZmlyc3Q6XFxuICB5YXJuIHNldHVwbm90aWZ5ICR7aG9zdH0gPGRpc2NvcmQtd2ViaG9vay11cmw+YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VXZWJob29rRmlsZSh7IGNvbnRlbnRzLCBzb3VyY2VOYW1lOiBgJHtob3N0fToke0RFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEh9YCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkU291cmNlKGNvbmZpZzogeyBob3N0OiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBob3N0LCBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgaWYgKCFhd2FpdCBwYXRoRXhpc3RzKGtleVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBwcml2YXRlIGtleSBhdCAke2tleVBhdGh9LCBubyBzdWNoIGZpbGUgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmVwb1VSTH0gaXMgcmVhY2hhYmxlIHdpdGggJHtrZXlQYXRofWApO1xuICAgIGxldCByZWFjaGFibGUgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aCwgYXJnczogW1wibHMtcmVtb3RlXCIsIHJlcG9VUkxdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKHJlYWNoYWJsZS5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7cmVwb1VSTH0gdG8gYmUgcmVhY2hhYmxlIHdpdGggJHtrZXlQYXRofSwgZ2l0IGxzLXJlbW90ZSBmYWlsZWQuYFxuICAgICAgICAgICAgKyBgIFRoZSBkYWVtb24gd291bGQgaGF2ZSBubyB3YXkgdG8gZmV0Y2gga2V5cy5cXG5gXG4gICAgICAgICAgICArIGAkeyhyZWFjaGFibGUuc3Rkb3V0ICsgcmVhY2hhYmxlLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCByZW1vdGVDb25maWcgPSBhd2FpdCByZWFkUmVtb3RlQ29uZmlnKGhvc3QpO1xuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMuaW5jbHVkZXMocmVwb1VSTCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7aG9zdH0gYWxyZWFkeSBoYXMgJHtyZXBvVVJMfSwgcmVmcmVzaGluZyBpdHMga2V5IGFuZCB0aGUgZGFlbW9uLmApO1xuICAgIH1cblxuICAgIC8vIFRoZSBtZXJnZWQgcmVzdWx0IGlzIHdoYXQgcm9vdCBlbmRzIHVwIHdpdGgsIHNvIG91ciBvd24ga2V5IGhhcyB0byBiZSBzb21ld2hlcmUgaW4gaXQuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nIG91ciBhY2Nlc3MgdG8gJHtob3N0fSBzdXJ2aXZlcyB0aGUgbWVyZ2VkIGtleXNgKTtcbiAgICBsZXQgb3VyRmluZ2VycHJpbnQgPSBhd2FpdCBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0KTtcbiAgICBsZXQgaW5zcGVjdGlvblBhdGggPSBhd2FpdCBjbG9uZVJlcG9Gb3JJbnNwZWN0aW9uKHsgcmVwb1VSTCwga2V5UGF0aCB9KTtcbiAgICBsZXQgbmV3S2V5cyA9IGF3YWl0IHJlYWRSZXBvS2V5cyhpbnNwZWN0aW9uUGF0aCk7XG4gICAgLy8gV2hhdGV2ZXIgaXMgYXBwbGllZCBvbiB0aGUgaG9zdCBjYW1lIGZyb20gdGhlIGV4aXN0aW5nIHNvdXJjZXMsIHNvIGl0IHN0YXlzIGluIHRoZSBtZXJnZS5cbiAgICBsZXQgZXhpc3RpbmdLZXlzID0gbm9ybWFsaXplS2V5cyhhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBST09UX0FVVEhPUklaRURfS0VZUyB9KSB8fCBcIlwiKTtcbiAgICBsZXQgbWVyZ2VkRmluZ2VycHJpbnRzID0gYXdhaXQgZmluZ2VycHJpbnRLZXlzKFsuLi5leGlzdGluZ0tleXMsIC4uLm5ld0tleXNdKTtcbiAgICBpZiAoIW1lcmdlZEZpbmdlcnByaW50cy5pbmNsdWRlcyhvdXJGaW5nZXJwcmludCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIHRoZSBrZXkgd2UgdXNlIGZvciAke2hvc3R9IHRvIGJlIGluIHRoZSBtZXJnZWQga2V5cywgaXQgaXMgbm90LlxcbmBcbiAgICAgICAgICAgICsgYE91cnM6ICAgJHtvdXJGaW5nZXJwcmludH1cXG5gXG4gICAgICAgICAgICArIGBNZXJnZWQ6ICR7bWVyZ2VkRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICsgYFRoZSBkYWVtb24gcmVwbGFjZXMgcm9vdCdzIGF1dGhvcml6ZWRfa2V5cyB3aXRoIHRoZSBtZXJnZWQgc291cmNlcywgc28gdGhpcyB3b3VsZGBcbiAgICAgICAgICAgICsgYCBsb2NrIHlvdSBvdXQgb2YgJHtob3N0fS4gQWRkIHlvdXIgcHVibGljIGtleSB0byAke3JlcG9VUkx9IGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYE91ciBrZXkgJHtvdXJGaW5nZXJwcmludH0gaXMgaW4gdGhlIG1lcmdlZCBrZXlzLCBhY2Nlc3Mgd2lsbCBzdXJ2aXZlLmApO1xuXG4gICAgYXdhaXQgZW5zdXJlUmV2b2tlUmVwbyh7IGtleVBhdGgsIHJlcG9VUkwgfSk7XG5cbiAgICAvLyBEZXBsb3lpbmcgYSByZXBvIHRoYXQgc3RpbGwgaG9sZHMgYSByZXZva2VkIGtleSB3b3VsZCBoYW5kIGl0IGJhY2sgdG8gZXZlcnkgbWFjaGluZS5cbiAgICBsZXQgcmV2b2tlZCA9IGF3YWl0IHJldm9rZWRLZXlzSW5SZXBvKHsgcmVwb1BhdGg6IGluc3BlY3Rpb25QYXRoLCBzb3VyY2VVUkw6IHJlcG9VUkwgfSk7XG4gICAgaWYgKHJldm9rZWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGhvbGQgbm8gcmV2b2tlZCBrZXlzLCBpdCBob2xkcyAke3Jldm9rZWQubGVuZ3RofTpcXG5gXG4gICAgICAgICAgICArIHJldm9rZWQubWFwKGVudHJ5ID0+IGAgICR7ZW50cnkucmV2b2NhdGlvbi5maW5nZXJwcmludH0gcmV2b2tlZCBieWBcbiAgICAgICAgICAgICAgICArIGAgJHtlbnRyeS5yZXZvY2F0aW9uLnJldm9rZWRCeSB8fCBcIj9cIn0gYWZ0ZXIgdXNlIGZyb20gJHtlbnRyeS5yZXZvY2F0aW9uLmF0dGVtcHQ/LmlwIHx8IFwiP1wifWApLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICsgYFxcbkRlbGV0ZSB0aGVtIGZyb20gdGhlIHJlcG8sIG9yIHJ1biBcInlhcm4gdW5yZXZva2VcIiB0aGVyZSB0byBhbGxvdyB0aGVtIGFnYWluLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2ViaG9va1VSTCA9IGF3YWl0IHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3QpO1xuICAgIGNvbnNvbGUubG9nKGAke2hvc3R9IG5vdGlmaWVzICR7d2ViaG9va1VSTH1gKTtcblxuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBzb3VyY2VLZXlQYXRoKHJlcG9VUkwpLFxuICAgICAgICBjb250ZW50czogYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpLFxuICAgICAgICBmaWxlTW9kZTogXCI2MDBcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3MDBcIixcbiAgICB9KTtcblxuICAgIGxldCByZXBvU291cmNlcyA9IHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5maWx0ZXIoc291cmNlID0+IHNvdXJjZSAhPT0gcmVwb1VSTCk7XG4gICAgcmVwb1NvdXJjZXMucHVzaChyZXBvVVJMKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiByZW1vdGVDb25maWcuaG9zdExhYmVsLCByZXBvU291cmNlcyB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXBvVVJMfSBhZGRlZCB0byAke2hvc3R9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIG5vdyBtZXJnZWQuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVNvdXJjZShjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAoIXJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5pbmNsdWRlcyhyZXBvVVJMKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtyZXBvVVJMfSB0byBiZSBhIHNvdXJjZSBvbiAke2hvc3R9LCBpdCBpcyBub3QuXFxuYFxuICAgICAgICAgICAgKyBgQ29uZmlndXJlZDpcXG4gICR7cmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmpvaW4oXCJcXG4gIFwiKSB8fCBcIihub25lKVwifWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IHJlcG9Tb3VyY2VzID0gcmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmZpbHRlcihzb3VyY2UgPT4gc291cmNlICE9PSByZXBvVVJMKTtcblxuICAgIGlmIChyZXBvU291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVGhlIGtleXMgbGVmdCBvdmVyIGFyZSB3aGF0IHJvb3QgZ2V0cywgc28gb3VyIG93biBrZXkgaGFzIHRvIGJlIGFtb25nIHRoZW0uXG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBvdXIgYWNjZXNzIHRvICR7aG9zdH0gc3Vydml2ZXMgd2l0aG91dCAke3JlcG9VUkx9YCk7XG4gICAgICAgIGxldCBvdXJGaW5nZXJwcmludCA9IGF3YWl0IGZpbmRBdXRoZW50aWNhdGluZ0ZpbmdlcnByaW50KGhvc3QpO1xuICAgICAgICBsZXQgcmVtYWluaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJlcG9Tb3VyY2VzKSB7XG4gICAgICAgICAgICByZW1haW5pbmdLZXlzLnB1c2goLi4uYXdhaXQgcmVhZFJlbW90ZVNvdXJjZUtleXMoeyBob3N0LCByZXBvVVJMOiBzb3VyY2UgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1haW5pbmdGaW5nZXJwcmludHMgPSBhd2FpdCBmaW5nZXJwcmludEtleXMocmVtYWluaW5nS2V5cyk7XG4gICAgICAgIGlmICghcmVtYWluaW5nRmluZ2VycHJpbnRzLmluY2x1ZGVzKG91ckZpbmdlcnByaW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBzdGlsbCBiZSBpbiB0aGUgcmVtYWluaW5nIHNvdXJjZXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICAgICAgKyBgT3VyczogICAgICAke291ckZpbmdlcnByaW50fVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1haW5pbmc6ICR7cmVtYWluaW5nRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1vdmluZyAke3JlcG9VUkx9IHdvdWxkIGxvY2sgeW91IG91dCBvZiAke2hvc3R9LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gbWVyZ2UsIHNvIHRoZSBkYWVtb24gbGVhdmVzIHJvb3QncyBhdXRob3JpemVkX2tleXMgZXhhY3RseSBhcyBpdCBpcy5cbiAgICAgICAgY29uc29sZS5sb2coYCR7cmVwb1VSTH0gaXMgdGhlIGxhc3Qgc291cmNlLCBzbyByb290J3MgYXV0aG9yaXplZF9rZXlzIHN0YXlzIGFzIGl0IGlzIG5vdy5gKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gcm0gLWYgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9XCJcbiRTVURPIHJtIC1yZiBcIiR7c291cmNlUmVwb1BhdGgocmVwb1VSTCl9XCJgLFxuICAgIH0pO1xuICAgIGF3YWl0IGluc3RhbGxEYWVtb24oeyBob3N0LCBob3N0TGFiZWw6IHJlbW90ZUNvbmZpZy5ob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke3JlcG9VUkx9IHJlbW92ZWQgZnJvbSAke2hvc3R9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIGxlZnQuYCk7XG59XG5cbi8qKiBBbnN3ZXJzIFwid2hvIGNhbiBsb2cgaW50byB0aGlzIGJveCwgYW5kIHdoaWNoIHJlcG8gc2F5cyBzb1wiLiBUaGUgcGF0aHMgdGhlIGRhZW1vbiB1c2VzIGFyZVxuICAgIGxlZnQgb3V0IG9uIHB1cnBvc2UsIHRoZXkgYXJlIHBsdW1iaW5nIHJhdGhlciB0aGFuIHNvbWV0aGluZyB0byBhY3Qgb24uICovXG5cbi8qKiBQdXNoZXMgdGhlIGN1cnJlbnQgZGFlbW9uIG9udG8gYSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgb25lLCBmb3Igd2hlbiB0aGlzIGNvZGUgaGFzIG1vdmVkIG9uLlxuICAgIE5vdGhpbmcgYWJvdXQgd2hpY2gga2V5cyB0aGUgaG9zdCB0cnVzdHMgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhZW1vbihob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBhbHJlYWR5IGhhdmUgcG9ydHNlY3VyZSwgJHtSRU1PVEVfQ09ORklHX1BBVEh9IGRvZXMgbm90IGV4aXN0LlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCB3aXRoOlxcbiAgeWFybiBzZWN1cmVzc2ggJHtob3N0fSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyB7IGhvc3RMYWJlbD86IHN0cmluZzsgcmVwb1NvdXJjZXM/OiBzdHJpbmdbXSB9O1xuICAgIGxldCByZXBvU291cmNlcyA9IHBhcnNlZC5yZXBvU291cmNlcyB8fCBbXTtcbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGBVcGRhdGVkIHRoZSBkYWVtb24gb24gJHtob3N0fSwgYW5kIHJlc3RhcnRlZCBpdC5gKTtcbiAgICBjb25zb2xlLmxvZyhgSXRzICR7cmVwb1NvdXJjZXMubGVuZ3RofSBrZXkgc291cmNlKHMpIHdlcmUgbGVmdCBhcyB0aGV5IGFyZSwgYWxvbmcgd2l0aCB0aGUga2V5cyBhbmRgKTtcbiAgICBjb25zb2xlLmxvZyhgc2lnbmVycyBpdCBoYXMgYWxyZWFkeSBhY2NlcHRlZC4gT25seSB0aGUgZGFlbW9uIGl0c2VsZiBjaGFuZ2VkOmApO1xuICAgIGZvciAobGV0IHJlcG9VUkwgb2YgcmVwb1NvdXJjZXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtyZXBvVVJMfWApO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdFNvdXJjZXMoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IHJlbW90ZUNvbmZpZyA9IGF3YWl0IHJlYWRSZW1vdGVDb25maWcoaG9zdCk7XG4gICAgaWYgKCFyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2hvc3R9IGhhcyBubyBrZXkgc291cmNlcy4gcm9vdCdzIGF1dGhvcml6ZWRfa2V5cyBpcyBsZWZ0IGV4YWN0bHkgYXMgaXQgaXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYCR7aG9zdH0gbGV0cyByb290IGxvZyBpbiB3aXRoIHRoZSBrZXlzIGZyb20gJHtyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RofSByZXBvKHMpOmApO1xuICAgIGxldCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByZXBvVVJMIG9mIHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcykge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHJlYWRSZW1vdGVTb3VyY2VLZXlzKHsgaG9zdCwgcmVwb1VSTCB9KTtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtyZXBvVVJMfWApO1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIGdyYW50cyBubyBrZXlzIC0gdGhlIGNoZWNrb3V0IGlzIG1pc3Npbmcgb3IgZW1wdHlgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgZ3JhbnRzICR7a2V5cy5sZW5ndGh9IGtleShzKTpgKTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAke3N1bW1hcml6ZUtleShrZXkpfWApO1xuICAgICAgICAgICAgbWVyZ2VkLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuJHttZXJnZWQuc2l6ZX0ga2V5KHMpIGluIHRvdGFsIG9uY2UgZHVwbGljYXRlcyBhcmUgbWVyZ2VkLmApO1xuICAgIH1cbn1cblxuLyoqIFRoZSB2ZXJiIGlzIGEgZml4ZWQgd29yZCByYXRoZXIgdGhhbiBhIHBvc2l0aW9uLCBzbyBpdCBpcyBwdWxsZWQgb3V0IG9mIHRoZSBhcmd1bWVudHMgd2hlcmV2ZXJcbiAgICBpdCB3YXMgdHlwZWQgYW5kIGV2ZXJ5dGhpbmcgbGVmdCBvdmVyIGlzIHBvc2l0aW9uYWwuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgdmVyYnMgPSBhcmd2LmZpbHRlcihhcmcgPT4gVkVSQlMuaW5jbHVkZXMoYXJnKSk7XG4gICAgaWYgKCF2ZXJicy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9IHNvbWV3aGVyZSBpbiB0aGUgYXJndW1lbnRzLCB3YXMgJHthcmd2LmpvaW4oXCIgXCIpIHx8IFwiKG5vdGhpbmcpXCJ9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9LCB3YXMgJHt2ZXJicy5qb2luKFwiIGFuZCBcIil9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHZlcmIgPSB2ZXJic1swXTtcbiAgICBsZXQgW2hvc3QsIC4uLnJlc3RdID0gYXJndi5maWx0ZXIoYXJnID0+IGFyZyAhPT0gdmVyYik7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0LCB3YXMgbm90aGluZ1xcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHZlcmIsIGhvc3QsIHJlc3QgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gICAgbGV0IHsgdmVyYiwgaG9zdCwgcmVzdCB9ID0gcGFyc2VBcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG5cbiAgICBpZiAodmVyYiA9PT0gXCJsaXN0XCIpIHtcbiAgICAgICAgYXdhaXQgbGlzdFNvdXJjZXMoaG9zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdGhpbmcgYWZ0ZXIgdXBkYXRlLCB3YXMgJHtyZXN0Lmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHVwZGF0ZURhZW1vbihob3N0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmVyYiA9PT0gXCJhZGRcIikge1xuICAgICAgICBpZiAoIXJlc3QubGVuZ3RoIHx8IHJlc3QubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHByaXZhdGUga2V5IGFuZCBvcHRpb25hbGx5IGEgcmVwbyB1cmwsIHdhcyAke3Jlc3QubGVuZ3RofSBhcmd1bWVudChzKVxcbiR7VVNBR0V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYWRkU291cmNlKHsgaG9zdCwga2V5UGF0aDogZXhwYW5kSG9tZShyZXN0WzBdKSwgcmVwb1VSTDogYXdhaXQgcmVzb2x2ZVJlcG9VUkwocmVzdFsxXSkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3QubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgYSByZXBvIHVybCB0byByZW1vdmUsIHdhcyAke3Jlc3QubGVuZ3RofSBhcmd1bWVudChzKVxcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVNvdXJjZSh7IGhvc3QsIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMF0pIH0pO1xufVxuIl19
|
|
539
|
+
/* _JS_SOURCE_HASH = "3c90444025671cc3213dcfd869a36bc1c8cca2b502d5ce035d38986a40c7cf9f"; */
|
|
@@ -10,16 +10,19 @@ const path_1 = __importDefault(require("path"));
|
|
|
10
10
|
const runPromise_1 = require("socket-function/src/runPromise");
|
|
11
11
|
const authorizedKeys_1 = require("./authorizedKeys");
|
|
12
12
|
const revokeSource_1 = require("./revokeSource");
|
|
13
|
+
const signFiles_1 = require("../signedFiles/signFiles");
|
|
13
14
|
const authorizedKeys_2 = require("./authorizedKeys");
|
|
14
15
|
const paths_1 = require("../helpers/paths");
|
|
15
16
|
const spawn_1 = require("../helpers/spawn");
|
|
16
17
|
const UNREVOKES_DIR = "unrevoked";
|
|
17
18
|
const REVOCATIONS_DIR = "revocations";
|
|
18
|
-
const
|
|
19
|
+
const GIT_KEYWORD = "git";
|
|
20
|
+
const COMMIT_MESSAGE = "unrevoke keys";
|
|
21
|
+
const USAGE = `Usage: yarn unrevoke [keys-repo] [${GIT_KEYWORD}]
|
|
19
22
|
|
|
20
23
|
Run this in a keys repo, or name one. It reads that repo's revoke repo and writes one unrevoke file
|
|
21
24
|
naming every revocation in it, so the keys are accepted again once each machine's hour long wait
|
|
22
|
-
passes.
|
|
25
|
+
passes. It signs the result, and with ${GIT_KEYWORD} it commits and pushes it too.
|
|
23
26
|
|
|
24
27
|
Keys that were revoked should normally be deleted from the repo instead. Unrevoking only matters
|
|
25
28
|
for a key you still want.`;
|
|
@@ -87,9 +90,13 @@ exports.revokedKeysInRepo = revokedKeysInRepo;
|
|
|
87
90
|
repo that actually holds keys and has an origin to clone from. */
|
|
88
91
|
async function resolveKeysRepo(named) {
|
|
89
92
|
let cwd = named && (0, paths_1.expandHome)(named) || undefined;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
+
// spawnPromise rather than runPromise, because these two are read for their value. runPromise
|
|
94
|
+
// returns stdout and stderr joined, so one git warning ends up glued to the front of the path.
|
|
95
|
+
let topLevel = await (0, spawn_1.spawnPromise)({ command: "git", args: ["rev-parse", "--show-toplevel"], cwd });
|
|
96
|
+
let repoPath = topLevel.stdout.trim();
|
|
97
|
+
if (topLevel.status !== 0 || !repoPath) {
|
|
98
|
+
throw new Error(`Expected ${named || "the current directory"} to be inside a git repo, it is not.\n`
|
|
99
|
+
+ `${(topLevel.stdout + topLevel.stderr).trim()}\n${USAGE}`);
|
|
93
100
|
}
|
|
94
101
|
try {
|
|
95
102
|
await (0, authorizedKeys_2.readRepoKeys)(repoPath);
|
|
@@ -97,8 +104,9 @@ async function resolveKeysRepo(named) {
|
|
|
97
104
|
catch (e) {
|
|
98
105
|
throw new Error(`Expected ${repoPath} to be a keys repo, it holds no keys.\n${e}\n${USAGE}`);
|
|
99
106
|
}
|
|
100
|
-
let
|
|
101
|
-
|
|
107
|
+
let origin = await (0, spawn_1.spawnPromise)({ command: "git", args: ["remote", "get-url", "origin"], cwd: repoPath });
|
|
108
|
+
let originURL = origin.stdout.trim();
|
|
109
|
+
if (origin.status !== 0 || !originURL) {
|
|
102
110
|
throw new Error(`Expected ${repoPath} to have an origin remote, it has none.\n${USAGE}`);
|
|
103
111
|
}
|
|
104
112
|
return { repoPath, originURL };
|
|
@@ -106,10 +114,12 @@ async function resolveKeysRepo(named) {
|
|
|
106
114
|
async function main() {
|
|
107
115
|
var _a;
|
|
108
116
|
let argv = process.argv.slice(2);
|
|
109
|
-
|
|
110
|
-
|
|
117
|
+
let pushToGit = argv.includes(GIT_KEYWORD);
|
|
118
|
+
let positional = argv.filter(arg => arg !== GIT_KEYWORD);
|
|
119
|
+
if (positional.length > 1) {
|
|
120
|
+
throw new Error(`Expected at most a keys repo, was ${positional.length} argument(s)\n${USAGE}`);
|
|
111
121
|
}
|
|
112
|
-
let { repoPath, originURL } = await resolveKeysRepo(
|
|
122
|
+
let { repoPath, originURL } = await resolveKeysRepo(positional[0]);
|
|
113
123
|
let revocations = await readRemoteRevocations({ sourceURL: originURL });
|
|
114
124
|
if (!revocations.length) {
|
|
115
125
|
console.log(`${(0, revokeSource_1.revokeRepoURL)(originURL)} lists no revocations, so there is nothing to undo.`);
|
|
@@ -137,9 +147,21 @@ async function main() {
|
|
|
137
147
|
for (let revocation of revocations) {
|
|
138
148
|
console.log(` ${revocation.fingerprint} revoked by ${revocation.revokedBy || "?"} from ${((_a = revocation.attempt) === null || _a === void 0 ? void 0 : _a.ip) || "?"}`);
|
|
139
149
|
}
|
|
140
|
-
|
|
141
|
-
|
|
150
|
+
// Signed here rather than left as a step to remember. An unrevoke nobody signed does nothing at
|
|
151
|
+
// all, and the repo would sit there looking done while every machine ignored it.
|
|
152
|
+
await (0, signFiles_1.signRepo)({ repoPath });
|
|
153
|
+
if (!pushToGit) {
|
|
154
|
+
console.log(`\nCommit and push it, and each machine will wait an hour after seeing it before`);
|
|
155
|
+
console.log(`those keys work again:`);
|
|
156
|
+
console.log(`\`\`\`\ngit add -A\ngit commit -m "${COMMIT_MESSAGE}"\ngit push\n\`\`\``);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
await (0, runPromise_1.runPromise)(`git add -A`, { cwd: repoPath });
|
|
160
|
+
await (0, runPromise_1.runPromise)(`git commit -m "${COMMIT_MESSAGE}"`, { cwd: repoPath });
|
|
161
|
+
await (0, runPromise_1.runPromise)(`git push`, { cwd: repoPath });
|
|
162
|
+
console.log(`\nCommitted and pushed. Each machine waits an hour after seeing it before those`);
|
|
163
|
+
console.log(`keys work again.`);
|
|
142
164
|
}
|
|
143
165
|
exports.main = main;
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5yZXZva2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1bnJldm9rZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QiwrREFBNEQ7QUFDNUQscURBQWlFO0FBQ2pFLGlEQUErQztBQUMvQyxxREFBZ0Q7QUFDaEQsNENBQThDO0FBQzlDLDRDQUFnRDtBQUVoRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDO0FBQ3RDLE1BQU0sS0FBSyxHQUFHOzs7Ozs7OzBCQU9ZLENBQUM7QUFXM0I7O3FEQUVxRDtBQUM5QyxLQUFLLFVBQVUscUJBQXFCLENBQUMsTUFBNkI7SUFDckUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUMzQixJQUFJLGtCQUFrQixHQUFHLE1BQU0sa0JBQUUsQ0FBQyxPQUFPLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvRSxJQUFJLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDO1FBQzNCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBQSw0QkFBYSxFQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUN0RSxDQUFDLENBQUM7SUFDSCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckIsTUFBTSxrQkFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFD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QUFDLE1BQU0saUJBQWlCLENBQUMsQ0FBQztJQUN2RyxLQUFLLElBQUksVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxVQUFVLENBQUMsV0FBVyxlQUFlLFVBQVUsQ0FBQyxTQUFTLElBQUksR0FBRyxTQUFTLENBQUEsTUFBQSxVQUFVLENBQUMsT0FBTywwQ0FBRSxFQUFFLEtBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQ3RGLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBdENELG9CQXNDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBydW5Qcm9taXNlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvcnVuUHJvbWlzZVwiO1xuaW1wb3J0IHsga2V5RmluZ2VycHJpbnQsIG5vcm1hbGl6ZUtleXMgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgcmVhZFJlcG9LZXlzIH0gZnJvbSBcIi4vYXV0aG9yaXplZEtleXNcIjtcbmltcG9ydCB7IGV4cGFuZEhvbWUgfSBmcm9tIFwiLi4vaGVscGVycy9wYXRoc1wiO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlIH0gZnJvbSBcIi4uL2hlbHBlcnMvc3Bhd25cIjtcblxuY29uc3QgVU5SRVZPS0VTX0RJUiA9IFwidW5yZXZva2VkXCI7XG5jb25zdCBSRVZPQ0FUSU9OU19ESVIgPSBcInJldm9jYXRpb25zXCI7XG5jb25zdCBVU0FHRSA9IGBVc2FnZTogeWFybiB1bnJldm9rZSBba2V5cy1yZXBvXVxuXG5SdW4gdGhpcyBpbiBhIGtleXMgcmVwbywgb3IgbmFtZSBvbmUuIEl0IHJlYWRzIHRoYXQgcmVwbydzIHJldm9rZSByZXBvIGFuZCB3cml0ZXMgb25lIHVucmV2b2tlIGZpbGVcbm5hbWluZyBldmVyeSByZXZvY2F0aW9uIGluIGl0LCBzbyB0aGUga2V5cyBhcmUgYWNjZXB0ZWQgYWdhaW4gb25jZSBlYWNoIG1hY2hpbmUncyBob3VyIGxvbmcgd2FpdFxucGFzc2VzLlxuXG5LZXlzIHRoYXQgd2VyZSByZXZva2VkIHNob3VsZCBub3JtYWxseSBiZSBkZWxldGVkIGZyb20gdGhlIHJlcG8gaW5zdGVhZC4gVW5yZXZva2luZyBvbmx5IG1hdHRlcnNcbmZvciBhIGtleSB5b3Ugc3RpbGwgd2FudC5gO1xuXG5leHBvcnQgdHlwZSBSZXZvY2F0aW9uID0ge1xuICAgIHJldm9jYXRpb25JZDogc3RyaW5nO1xuICAgIGZpbmdlcnByaW50OiBzdHJpbmc7XG4gICAga2V5Pzogc3RyaW5nO1xuICAgIHJldm9rZWRBdD86IHN0cmluZztcbiAgICByZXZva2VkQnk/OiBzdHJpbmc7XG4gICAgYXR0ZW1wdD86IHsgaXA/OiBzdHJpbmc7IHVzZXI/OiBzdHJpbmc7IHJlcXVpcmVkPzogc3RyaW5nIH07XG59O1xuXG4vKiogRXZlcnkgcmV2b2NhdGlvbiB0aGUgcmV2b2tlIHJlcG8gbGlzdHMuIENsb25lZCByZWFkIG9ubHkgaW50byBhIHRlbXAgZGlyZWN0b3J5LCB3aXRoIHdoYXRldmVyXG4gICAgY3JlZGVudGlhbHMgdGhpcyBtYWNoaW5lIGFscmVhZHkgaGFzIC0gdGhlIGRlcml2ZWQgZGVwbG95IGtleSBpcyBmb3Igc2VydmVycywgYW5kIGEgcGVyc29uXG4gICAgcnVubmluZyB0aGlzIGhhcyB0aGVpciBvd24gYWNjZXNzIHRvIHRoZSByZXBvLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVSZXZvY2F0aW9ucyhjb25maWc6IHsgc291cmNlVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gY29uZmlnO1xuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJ1bnJldm9rZS1cIikpO1xuICAgIGxldCByZXBvUGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwicmVwb1wiKTtcbiAgICBsZXQgY2xvbmUgPSBhd2FpdCBzcGF3blByb21pc2Uoe1xuICAgICAgICBjb21tYW5kOiBcImdpdFwiLFxuICAgICAgICBhcmdzOiBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJldm9rZVJlcG9VUkwoc291cmNlVVJMKSwgcmVwb1BhdGhdLFxuICAgIH0pO1xuICAgIGlmIChjbG9uZS5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgYXdhaXQgZnMucm0odGVtcG9yYXJ5RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0byBiZSBhYmxlIHRvIHJlYWQgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9LlxcbmBcbiAgICAgICAgICAgICsgYCR7KGNsb25lLnN0ZG91dCArIGNsb25lLnN0ZGVycikudHJpbSgpfWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IHJldm9jYXRpb25zOiBSZXZvY2F0aW9uW10gPSBbXTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBSRVZPQ0FUSU9OU19ESVIpO1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAobGV0IG5hbWUgb2YgKGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KSkuc29ydCgpKSB7XG4gICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV2b2NhdGlvbnMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTm8gcmV2b2NhdGlvbnMgZGlyZWN0b3J5IGF0IGFsbCBqdXN0IG1lYW5zIG5vdGhpbmcgaGFzIGV2ZXIgYmVlbiByZXZva2VkLlxuICAgIH1cbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcmV2b2NhdGlvbnM7XG59XG5cbi8qKiBXaGljaCBrZXlzIGluIGEgcmVwbyBhcmUgcmV2b2tlZC4gV2hhdCBzaWduZmlsZXMgYW5kIHNlY3VyZXNzaCByZWZ1c2Ugb3Zlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXZva2VkS2V5c0luUmVwbyhjb25maWc6IHsgcmVwb1BhdGg6IHN0cmluZzsgc291cmNlVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmV2b2NhdGlvbnMgPSBhd2FpdCByZWFkUmVtb3RlUmV2b2NhdGlvbnMoeyBzb3VyY2VVUkwgfSk7XG4gICAgbGV0IHJldm9rZWRGaW5nZXJwcmludHMgPSBuZXcgU2V0KHJldm9jYXRpb25zLm1hcChyZXZvY2F0aW9uID0+IHJldm9jYXRpb24uZmluZ2VycHJpbnQpKTtcbiAgICBsZXQgdW5yZXZva2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgVU5SRVZPS0VTX0RJUik7XG4gICAgICAgIGZvciAobGV0IG5hbWUgb2YgYXdhaXQgZnMucmVhZGRpcihkaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSksIFwidXRmOFwiKSk7XG4gICAgICAgICAgICBmb3IgKGxldCByZXZvY2F0aW9uSWQgb2YgcGFyc2VkLnJldm9jYXRpb25JZHMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICB1bnJldm9rZWQuYWRkKHJldm9jYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgaGFzIGJlZW4gdW5yZXZva2VkLlxuICAgIH1cbiAgICBsZXQgc3RpbGxSZXZva2VkID0gcmV2b2NhdGlvbnMuZmlsdGVyKHJldm9jYXRpb24gPT4gIXVucmV2b2tlZC5oYXMocmV2b2NhdGlvbi5yZXZvY2F0aW9uSWQpKTtcbiAgICBsZXQga2V5cyA9IG5vcm1hbGl6ZUtleXMoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHJlcG9QYXRoLCBcImF1dGhvcml6ZWRfa2V5c1wiKSwgXCJ1dGY4XCIpLmNhdGNoKCgpID0+IFwiXCIpKTtcbiAgICByZXR1cm4gc3RpbGxSZXZva2VkXG4gICAgICAgIC5maWx0ZXIocmV2b2NhdGlvbiA9PiBrZXlzLnNvbWUoa2V5ID0+IGtleUZpbmdlcnByaW50KGtleSkgPT09IHJldm9jYXRpb24uZmluZ2VycHJpbnQpKVxuICAgICAgICAubWFwKHJldm9jYXRpb24gPT4gKHsgcmV2b2NhdGlvbiwga2V5OiBrZXlzLmZpbmQoa2V5ID0+IGtleUZpbmdlcnByaW50KGtleSkgPT09IHJldm9jYXRpb24uZmluZ2VycHJpbnQpIHx8IFwiXCIgfSkpO1xufVxuXG4vKiogVGhlIHJlcG8gbmFtZWQsIG9yIHRoZSBvbmUgd2UgYXJlIHN0YW5kaW5nIGluLiBDaGVja2VkIHRoZSBzYW1lIHdheSBzZWN1cmVzc2ggY2hlY2tzIGl0OiBhIGdpdFxuICAgIHJlcG8gdGhhdCBhY3R1YWxseSBob2xkcyBrZXlzIGFuZCBoYXMgYW4gb3JpZ2luIHRvIGNsb25lIGZyb20uICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlS2V5c1JlcG8obmFtZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGxldCBjd2QgPSBuYW1lZCAmJiBleHBhbmRIb21lKG5hbWVkKSB8fCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9QYXRoID0gKGF3YWl0IHJ1blByb21pc2UoXCJnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbFwiLCB7IHF1aWV0OiB0cnVlLCBjd2QgfSkpLnRyaW0oKTtcbiAgICBpZiAoIXJlcG9QYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtuYW1lZCB8fCBcInRoZSBjdXJyZW50IGRpcmVjdG9yeVwifSB0byBiZSBpbnNpZGUgYSBnaXQgcmVwbywgaXQgaXMgbm90LlxcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWRSZXBvS2V5cyhyZXBvUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cmVwb1BhdGh9IHRvIGJlIGEga2V5cyByZXBvLCBpdCBob2xkcyBubyBrZXlzLlxcbiR7ZX1cXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBsZXQgb3JpZ2luVVJMID0gKGF3YWl0IHJ1blByb21pc2UoXCJnaXQgcmVtb3RlIGdldC11cmwgb3JpZ2luXCIsIHsgcXVpZXQ6IHRydWUsIGN3ZDogcmVwb1BhdGggfSkpLnRyaW0oKTtcbiAgICBpZiAoIW9yaWdpblVSTCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cmVwb1BhdGh9IHRvIGhhdmUgYW4gb3JpZ2luIHJlbW90ZSwgaXQgaGFzIG5vbmUuXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVwb1BhdGgsIG9yaWdpblVSTCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBsZXQgYXJndiA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBpZiAoYXJndi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbW9zdCBhIGtleXMgcmVwbywgd2FzICR7YXJndi5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHsgcmVwb1BhdGgsIG9yaWdpblVSTCB9ID0gYXdhaXQgcmVzb2x2ZUtleXNSZXBvKGFyZ3ZbMF0pO1xuXG4gICAgbGV0IHJldm9jYXRpb25zID0gYXdhaXQgcmVhZFJlbW90ZVJldm9jYXRpb25zKHsgc291cmNlVVJMOiBvcmlnaW5VUkwgfSk7XG4gICAgaWYgKCFyZXZvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cmV2b2tlUmVwb1VSTChvcmlnaW5VUkwpfSBsaXN0cyBubyByZXZvY2F0aW9ucywgc28gdGhlcmUgaXMgbm90aGluZyB0byB1bmRvLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgVU5SRVZPS0VTX0RJUik7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCBcIi1cIik7XG4gICAgbGV0IHVucmV2b2tlSWQgPSBgJHtzdGFtcH0tdW5yZXZva2VgO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBgJHt1bnJldm9rZUlkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdW5yZXZva2VJZCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIC8vIE5hbWVkIG9uZSBieSBvbmUgcmF0aGVyIHRoYW4gYXMgYSBibGFua2V0IFwiYWxsb3cgZXZlcnl0aGluZyBhZ2FpblwiLCBzbyB0aGlzIGZpbGUgb25seVxuICAgICAgICAvLyBldmVyIHVuZG9lcyB0aGUgcmV2b2NhdGlvbnMgdGhhdCBleGlzdGVkIHdoZW4gaXQgd2FzIHdyaXR0ZW4uXG4gICAgICAgIHJldm9jYXRpb25JZHM6IHJldm9jYXRpb25zLm1hcChyZXZvY2F0aW9uID0+IHJldm9jYXRpb24ucmV2b2NhdGlvbklkKSxcbiAgICAgICAgcmV2b2NhdGlvbnM6IHJldm9jYXRpb25zLm1hcChyZXZvY2F0aW9uID0+ICh7XG4gICAgICAgICAgICByZXZvY2F0aW9uSWQ6IHJldm9jYXRpb24ucmV2b2NhdGlvbklkLFxuICAgICAgICAgICAgZmluZ2VycHJpbnQ6IHJldm9jYXRpb24uZmluZ2VycHJpbnQsXG4gICAgICAgICAgICByZXZva2VkQXQ6IHJldm9jYXRpb24ucmV2b2tlZEF0LFxuICAgICAgICAgICAgcmV2b2tlZEJ5OiByZXZvY2F0aW9uLnJldm9rZWRCeSxcbiAgICAgICAgICAgIGF0dGVtcHQ6IHJldm9jYXRpb24uYXR0ZW1wdCxcbiAgICAgICAgfSkpLFxuICAgIH0sIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcblxuICAgIGNvbnNvbGUubG9nKGBXcm90ZSAke1VOUkVWT0tFU19ESVJ9LyR7dW5yZXZva2VJZH0uanNvbiBjb3ZlcmluZyAke3Jldm9jYXRpb25zLmxlbmd0aH0gcmV2b2NhdGlvbihzKTpgKTtcbiAgICBmb3IgKGxldCByZXZvY2F0aW9uIG9mIHJldm9jYXRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7cmV2b2NhdGlvbi5maW5nZXJwcmludH0gcmV2b2tlZCBieSAke3Jldm9jYXRpb24ucmV2b2tlZEJ5IHx8IFwiP1wifSBmcm9tICR7cmV2b2NhdGlvbi5hdHRlbXB0Py5pcCB8fCBcIj9cIn1gKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYEVhY2ggbWFjaGluZSB3YWl0cyBhbiBob3VyIGFmdGVyIHNlZWluZyBpdCBiZWZvcmUgdGhlIGtleXMgd29yayBhZ2Fpbi5gKTtcbiAgICBjb25zb2xlLmxvZyhgU2lnbiBhbmQgcHVibGlzaCBpdCB3aXRoOlxcbiAgeWFybiBzaWduZmlsZXMgZ2l0YCk7XG59XG4iXX0=
|
|
145
|
-
/* _JS_SOURCE_HASH = "
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5yZXZva2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1bnJldm9rZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QiwrREFBNEQ7QUFDNUQscURBQWlFO0FBQ2pFLGlEQUErQztBQUMvQyx3REFBb0Q7QUFDcEQscURBQWdEO0FBQ2hELDRDQUE4QztBQUM5Qyw0Q0FBZ0Q7QUFFaEQsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQ2xDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDMUIsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDO0FBQ3ZDLE1BQU0sS0FBSyxHQUFHLHFDQUFxQyxXQUFXOzs7O3dDQUl0QixXQUFXOzs7MEJBR3pCLENBQUM7QUFXM0I7O3FEQUVxRDtBQUM5QyxLQUFLLFVBQVUscUJBQXFCLENBQUMsTUFBNkI7SUFDckUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUMzQixJQUFJLGtCQUFrQixHQUFHLE1BQU0sa0JBQUUsQ0FBQyxPQUFPLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvRSxJQUFJLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDO1FBQzNCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBQSw0QkFBYSxFQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUN0RSxDQUFDLENBQUM7SUFDSCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFF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Q0FBQztRQUMvRixPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsY0FBYyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU87SUFDWCxDQUFDO0lBQ0QsTUFBTSxJQUFBLHVCQUFVLEVBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDbEQsTUFBTSxJQUFBLHVCQUFVLEVBQUMsa0JBQWtCLGNBQWMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDekUsTUFBTSxJQUFBLHVCQUFVLEVBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO0lBQy9GLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBdERELG9CQXNEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBydW5Qcm9taXNlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvcnVuUHJvbWlzZVwiO1xuaW1wb3J0IHsga2V5RmluZ2VycHJpbnQsIG5vcm1hbGl6ZUtleXMgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgc2lnblJlcG8gfSBmcm9tIFwiLi4vc2lnbmVkRmlsZXMvc2lnbkZpbGVzXCI7XG5pbXBvcnQgeyByZWFkUmVwb0tleXMgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgZXhwYW5kSG9tZSB9IGZyb20gXCIuLi9oZWxwZXJzL3BhdGhzXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuXG5jb25zdCBVTlJFVk9LRVNfRElSID0gXCJ1bnJldm9rZWRcIjtcbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcbmNvbnN0IEdJVF9LRVlXT1JEID0gXCJnaXRcIjtcbmNvbnN0IENPTU1JVF9NRVNTQUdFID0gXCJ1bnJldm9rZSBrZXlzXCI7XG5jb25zdCBVU0FHRSA9IGBVc2FnZTogeWFybiB1bnJldm9rZSBba2V5cy1yZXBvXSBbJHtHSVRfS0VZV09SRH1dXG5cblJ1biB0aGlzIGluIGEga2V5cyByZXBvLCBvciBuYW1lIG9uZS4gSXQgcmVhZHMgdGhhdCByZXBvJ3MgcmV2b2tlIHJlcG8gYW5kIHdyaXRlcyBvbmUgdW5yZXZva2UgZmlsZVxubmFtaW5nIGV2ZXJ5IHJldm9jYXRpb24gaW4gaXQsIHNvIHRoZSBrZXlzIGFyZSBhY2NlcHRlZCBhZ2FpbiBvbmNlIGVhY2ggbWFjaGluZSdzIGhvdXIgbG9uZyB3YWl0XG5wYXNzZXMuIEl0IHNpZ25zIHRoZSByZXN1bHQsIGFuZCB3aXRoICR7R0lUX0tFWVdPUkR9IGl0IGNvbW1pdHMgYW5kIHB1c2hlcyBpdCB0b28uXG5cbktleXMgdGhhdCB3ZXJlIHJldm9rZWQgc2hvdWxkIG5vcm1hbGx5IGJlIGRlbGV0ZWQgZnJvbSB0aGUgcmVwbyBpbnN0ZWFkLiBVbnJldm9raW5nIG9ubHkgbWF0dGVyc1xuZm9yIGEga2V5IHlvdSBzdGlsbCB3YW50LmA7XG5cbmV4cG9ydCB0eXBlIFJldm9jYXRpb24gPSB7XG4gICAgcmV2b2NhdGlvbklkOiBzdHJpbmc7XG4gICAgZmluZ2VycHJpbnQ6IHN0cmluZztcbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgcmV2b2tlZEF0Pzogc3RyaW5nO1xuICAgIHJldm9rZWRCeT86IHN0cmluZztcbiAgICBhdHRlbXB0PzogeyBpcD86IHN0cmluZzsgdXNlcj86IHN0cmluZzsgcmVxdWlyZWQ/OiBzdHJpbmcgfTtcbn07XG5cbi8qKiBFdmVyeSByZXZvY2F0aW9uIHRoZSByZXZva2UgcmVwbyBsaXN0cy4gQ2xvbmVkIHJlYWQgb25seSBpbnRvIGEgdGVtcCBkaXJlY3RvcnksIHdpdGggd2hhdGV2ZXJcbiAgICBjcmVkZW50aWFscyB0aGlzIG1hY2hpbmUgYWxyZWFkeSBoYXMgLSB0aGUgZGVyaXZlZCBkZXBsb3kga2V5IGlzIGZvciBzZXJ2ZXJzLCBhbmQgYSBwZXJzb25cbiAgICBydW5uaW5nIHRoaXMgaGFzIHRoZWlyIG93biBhY2Nlc3MgdG8gdGhlIHJlcG8uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFJlbW90ZVJldm9jYXRpb25zKGNvbmZpZzogeyBzb3VyY2VVUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgc291cmNlVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHRlbXBvcmFyeURpcmVjdG9yeSA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInVucmV2b2tlLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGxldCBjbG9uZSA9IGF3YWl0IHNwYXduUHJvbWlzZSh7XG4gICAgICAgIGNvbW1hbmQ6IFwiZ2l0XCIsXG4gICAgICAgIGFyZ3M6IFtcImNsb25lXCIsIFwiLS1kZXB0aFwiLCBcIjFcIiwgcmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpLCByZXBvUGF0aF0sXG4gICAgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gcmVhZCAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0uXFxuYFxuICAgICAgICAgICAgKyBgJHsoY2xvbmUuc3Rkb3V0ICsgY2xvbmUuc3RkZXJyKS50cmltKCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICBsZXQgcmV2b2NhdGlvbnM6IFJldm9jYXRpb25bXSA9IFtdO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiAoYXdhaXQgZnMucmVhZGRpcihkaXJlY3RvcnkpKS5zb3J0KCkpIHtcbiAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICByZXZvY2F0aW9ucy5wdXNoKEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSksIFwidXRmOFwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBObyByZXZvY2F0aW9ucyBkaXJlY3RvcnkgYXQgYWxsIGp1c3QgbWVhbnMgbm90aGluZyBoYXMgZXZlciBiZWVuIHJldm9rZWQuXG4gICAgfVxuICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIHJldHVybiByZXZvY2F0aW9ucztcbn1cblxuLyoqIFdoaWNoIGtleXMgaW4gYSByZXBvIGFyZSByZXZva2VkLiBXaGF0IHNpZ25maWxlcyBhbmQgc2VjdXJlc3NoIHJlZnVzZSBvdmVyLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldm9rZWRLZXlzSW5SZXBvKGNvbmZpZzogeyByZXBvUGF0aDogc3RyaW5nOyBzb3VyY2VVUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9ID0gY29uZmlnO1xuICAgIGxldCByZXZvY2F0aW9ucyA9IGF3YWl0IHJlYWRSZW1vdGVSZXZvY2F0aW9ucyh7IHNvdXJjZVVSTCB9KTtcbiAgICBsZXQgcmV2b2tlZEZpbmdlcnByaW50cyA9IG5ldyBTZXQocmV2b2NhdGlvbnMubWFwKHJldm9jYXRpb24gPT4gcmV2b2NhdGlvbi5maW5nZXJwcmludCkpO1xuICAgIGxldCB1bnJldm9rZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBVTlJFVk9LRVNfRElSKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBhd2FpdCBmcy5yZWFkZGlyKGRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKSwgXCJ1dGY4XCIpKTtcbiAgICAgICAgICAgIGZvciAobGV0IHJldm9jYXRpb25JZCBvZiBwYXJzZWQucmV2b2NhdGlvbklkcyB8fCBbXSkge1xuICAgICAgICAgICAgICAgIHVucmV2b2tlZC5hZGQocmV2b2NhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTm90aGluZyBoYXMgYmVlbiB1bnJldm9rZWQuXG4gICAgfVxuICAgIGxldCBzdGlsbFJldm9rZWQgPSByZXZvY2F0aW9ucy5maWx0ZXIocmV2b2NhdGlvbiA9PiAhdW5yZXZva2VkLmhhcyhyZXZvY2F0aW9uLnJldm9jYXRpb25JZCkpO1xuICAgIGxldCBrZXlzID0gbm9ybWFsaXplS2V5cyhhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4ocmVwb1BhdGgsIFwiYXV0aG9yaXplZF9rZXlzXCIpLCBcInV0ZjhcIikuY2F0Y2goKCkgPT4gXCJcIikpO1xuICAgIHJldHVybiBzdGlsbFJldm9rZWRcbiAgICAgICAgLmZpbHRlcihyZXZvY2F0aW9uID0+IGtleXMuc29tZShrZXkgPT4ga2V5RmluZ2VycHJpbnQoa2V5KSA9PT0gcmV2b2NhdGlvbi5maW5nZXJwcmludCkpXG4gICAgICAgIC5tYXAocmV2b2NhdGlvbiA9PiAoeyByZXZvY2F0aW9uLCBrZXk6IGtleXMuZmluZChrZXkgPT4ga2V5RmluZ2VycHJpbnQoa2V5KSA9PT0gcmV2b2NhdGlvbi5maW5nZXJwcmludCkgfHwgXCJcIiB9KSk7XG59XG5cbi8qKiBUaGUgcmVwbyBuYW1lZCwgb3IgdGhlIG9uZSB3ZSBhcmUgc3RhbmRpbmcgaW4uIENoZWNrZWQgdGhlIHNhbWUgd2F5IHNlY3VyZXNzaCBjaGVja3MgaXQ6IGEgZ2l0XG4gICAgcmVwbyB0aGF0IGFjdHVhbGx5IGhvbGRzIGtleXMgYW5kIGhhcyBhbiBvcmlnaW4gdG8gY2xvbmUgZnJvbS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVLZXlzUmVwbyhuYW1lZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgbGV0IGN3ZCA9IG5hbWVkICYmIGV4cGFuZEhvbWUobmFtZWQpIHx8IHVuZGVmaW5lZDtcbiAgICAvLyBzcGF3blByb21pc2UgcmF0aGVyIHRoYW4gcnVuUHJvbWlzZSwgYmVjYXVzZSB0aGVzZSB0d28gYXJlIHJlYWQgZm9yIHRoZWlyIHZhbHVlLiBydW5Qcm9taXNlXG4gICAgLy8gcmV0dXJucyBzdGRvdXQgYW5kIHN0ZGVyciBqb2luZWQsIHNvIG9uZSBnaXQgd2FybmluZyBlbmRzIHVwIGdsdWVkIHRvIHRoZSBmcm9udCBvZiB0aGUgcGF0aC5cbiAgICBsZXQgdG9wTGV2ZWwgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIGN3ZCB9KTtcbiAgICBsZXQgcmVwb1BhdGggPSB0b3BMZXZlbC5zdGRvdXQudHJpbSgpO1xuICAgIGlmICh0b3BMZXZlbC5zdGF0dXMgIT09IDAgfHwgIXJlcG9QYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWVkIHx8IFwidGhlIGN1cnJlbnQgZGlyZWN0b3J5XCJ9IHRvIGJlIGluc2lkZSBhIGdpdCByZXBvLCBpdCBpcyBub3QuXFxuYFxuICAgICAgICAgICAgKyBgJHsodG9wTGV2ZWwuc3Rkb3V0ICsgdG9wTGV2ZWwuc3RkZXJyKS50cmltKCl9XFxuJHtVU0FHRX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWRSZXBvS2V5cyhyZXBvUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cmVwb1BhdGh9IHRvIGJlIGEga2V5cyByZXBvLCBpdCBob2xkcyBubyBrZXlzLlxcbiR7ZX1cXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBsZXQgb3JpZ2luID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSwgY3dkOiByZXBvUGF0aCB9KTtcbiAgICBsZXQgb3JpZ2luVVJMID0gb3JpZ2luLnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG9yaWdpbi5zdGF0dXMgIT09IDAgfHwgIW9yaWdpblVSTCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cmVwb1BhdGh9IHRvIGhhdmUgYW4gb3JpZ2luIHJlbW90ZSwgaXQgaGFzIG5vbmUuXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVwb1BhdGgsIG9yaWdpblVSTCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBsZXQgYXJndiA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBsZXQgcHVzaFRvR2l0ID0gYXJndi5pbmNsdWRlcyhHSVRfS0VZV09SRCk7XG4gICAgbGV0IHBvc2l0aW9uYWwgPSBhcmd2LmZpbHRlcihhcmcgPT4gYXJnICE9PSBHSVRfS0VZV09SRCk7XG4gICAgaWYgKHBvc2l0aW9uYWwubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgYSBrZXlzIHJlcG8sIHdhcyAke3Bvc2l0aW9uYWwubGVuZ3RofSBhcmd1bWVudChzKVxcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIGxldCB7IHJlcG9QYXRoLCBvcmlnaW5VUkwgfSA9IGF3YWl0IHJlc29sdmVLZXlzUmVwbyhwb3NpdGlvbmFsWzBdKTtcblxuICAgIGxldCByZXZvY2F0aW9ucyA9IGF3YWl0IHJlYWRSZW1vdGVSZXZvY2F0aW9ucyh7IHNvdXJjZVVSTDogb3JpZ2luVVJMIH0pO1xuICAgIGlmICghcmV2b2NhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3Jldm9rZVJlcG9VUkwob3JpZ2luVVJMKX0gbGlzdHMgbm8gcmV2b2NhdGlvbnMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFVOUkVWT0tFU19ESVIpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IHN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgXCItXCIpO1xuICAgIGxldCB1bnJldm9rZUlkID0gYCR7c3RhbXB9LXVucmV2b2tlYDtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7dW5yZXZva2VJZH0uanNvbmApLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHVucmV2b2tlSWQsXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAvLyBOYW1lZCBvbmUgYnkgb25lIHJhdGhlciB0aGFuIGFzIGEgYmxhbmtldCBcImFsbG93IGV2ZXJ5dGhpbmcgYWdhaW5cIiwgc28gdGhpcyBmaWxlIG9ubHlcbiAgICAgICAgLy8gZXZlciB1bmRvZXMgdGhlIHJldm9jYXRpb25zIHRoYXQgZXhpc3RlZCB3aGVuIGl0IHdhcyB3cml0dGVuLlxuICAgICAgICByZXZvY2F0aW9uSWRzOiByZXZvY2F0aW9ucy5tYXAocmV2b2NhdGlvbiA9PiByZXZvY2F0aW9uLnJldm9jYXRpb25JZCksXG4gICAgICAgIHJldm9jYXRpb25zOiByZXZvY2F0aW9ucy5tYXAocmV2b2NhdGlvbiA9PiAoe1xuICAgICAgICAgICAgcmV2b2NhdGlvbklkOiByZXZvY2F0aW9uLnJldm9jYXRpb25JZCxcbiAgICAgICAgICAgIGZpbmdlcnByaW50OiByZXZvY2F0aW9uLmZpbmdlcnByaW50LFxuICAgICAgICAgICAgcmV2b2tlZEF0OiByZXZvY2F0aW9uLnJldm9rZWRBdCxcbiAgICAgICAgICAgIHJldm9rZWRCeTogcmV2b2NhdGlvbi5yZXZva2VkQnksXG4gICAgICAgICAgICBhdHRlbXB0OiByZXZvY2F0aW9uLmF0dGVtcHQsXG4gICAgICAgIH0pKSxcbiAgICB9LCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIik7XG5cbiAgICBjb25zb2xlLmxvZyhgV3JvdGUgJHtVTlJFVk9LRVNfRElSfS8ke3VucmV2b2tlSWR9Lmpzb24gY292ZXJpbmcgJHtyZXZvY2F0aW9ucy5sZW5ndGh9IHJldm9jYXRpb24ocyk6YCk7XG4gICAgZm9yIChsZXQgcmV2b2NhdGlvbiBvZiByZXZvY2F0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke3Jldm9jYXRpb24uZmluZ2VycHJpbnR9IHJldm9rZWQgYnkgJHtyZXZvY2F0aW9uLnJldm9rZWRCeSB8fCBcIj9cIn0gZnJvbSAke3Jldm9jYXRpb24uYXR0ZW1wdD8uaXAgfHwgXCI/XCJ9YCk7XG4gICAgfVxuXG4gICAgLy8gU2lnbmVkIGhlcmUgcmF0aGVyIHRoYW4gbGVmdCBhcyBhIHN0ZXAgdG8gcmVtZW1iZXIuIEFuIHVucmV2b2tlIG5vYm9keSBzaWduZWQgZG9lcyBub3RoaW5nIGF0XG4gICAgLy8gYWxsLCBhbmQgdGhlIHJlcG8gd291bGQgc2l0IHRoZXJlIGxvb2tpbmcgZG9uZSB3aGlsZSBldmVyeSBtYWNoaW5lIGlnbm9yZWQgaXQuXG4gICAgYXdhaXQgc2lnblJlcG8oeyByZXBvUGF0aCB9KTtcblxuICAgIGlmICghcHVzaFRvR2l0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5Db21taXQgYW5kIHB1c2ggaXQsIGFuZCBlYWNoIG1hY2hpbmUgd2lsbCB3YWl0IGFuIGhvdXIgYWZ0ZXIgc2VlaW5nIGl0IGJlZm9yZWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgdGhvc2Uga2V5cyB3b3JrIGFnYWluOmApO1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxgXFxgXFxgXFxuZ2l0IGFkZCAtQVxcbmdpdCBjb21taXQgLW0gXCIke0NPTU1JVF9NRVNTQUdFfVwiXFxuZ2l0IHB1c2hcXG5cXGBcXGBcXGBgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBydW5Qcm9taXNlKGBnaXQgYWRkIC1BYCwgeyBjd2Q6IHJlcG9QYXRoIH0pO1xuICAgIGF3YWl0IHJ1blByb21pc2UoYGdpdCBjb21taXQgLW0gXCIke0NPTU1JVF9NRVNTQUdFfVwiYCwgeyBjd2Q6IHJlcG9QYXRoIH0pO1xuICAgIGF3YWl0IHJ1blByb21pc2UoYGdpdCBwdXNoYCwgeyBjd2Q6IHJlcG9QYXRoIH0pO1xuICAgIGNvbnNvbGUubG9nKGBcXG5Db21taXR0ZWQgYW5kIHB1c2hlZC4gRWFjaCBtYWNoaW5lIHdhaXRzIGFuIGhvdXIgYWZ0ZXIgc2VlaW5nIGl0IGJlZm9yZSB0aG9zZWApO1xuICAgIGNvbnNvbGUubG9nKGBrZXlzIHdvcmsgYWdhaW4uYCk7XG59XG4iXX0=
|
|
167
|
+
/* _JS_SOURCE_HASH = "0fcca51775122c0bd892f4c8b9872f06ef62cdb278ee8668702a7ce402c07867"; */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { deriveEd25519Key } from "../keys/deriveKey";
|
|
2
2
|
import { formatOpenSSHPrivateKey, parseOpenSSHPrivateKey } from "../keys/sshKeyFile";
|
|
3
|
-
import
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { findKey, keysDir, LEGACY_REPO_KEYS_DIR, REPOS_DIR, sourceName } from "./sources";
|
|
4
5
|
|
|
5
6
|
// A source's revocations live in a repo beside it. Derived rather than configured, so adding a
|
|
6
7
|
// source brings its revoke repo with it and there is nothing extra to pass on the command line.
|
|
@@ -15,7 +16,16 @@ export function revokeRepoURL(sourceURL: string) {
|
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export function revokeKeyPath(sourceURL: string) {
|
|
18
|
-
return `${
|
|
19
|
+
return path.join(keysDir(), `${sourceName(sourceURL)}${REVOKED_SUFFIX}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function legacyRevokeKeyPath(sourceURL: string) {
|
|
23
|
+
return `${LEGACY_REPO_KEYS_DIR}/${sourceName(sourceURL)}${REVOKED_SUFFIX}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Wherever this source's revoke key already is, or nothing if it has not been derived yet. */
|
|
27
|
+
export async function findRevokeKey(sourceURL: string) {
|
|
28
|
+
return await findKey({ current: revokeKeyPath(sourceURL), legacy: legacyRevokeKeyPath(sourceURL) });
|
|
19
29
|
}
|
|
20
30
|
|
|
21
31
|
export function revokeRepoPath(sourceURL: string) {
|