@pagopa/dx-cli 0.24.0 → 0.25.0
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/README.md +14 -0
- package/bin/index.js +13 -3
- package/dist/adapters/azure/cloud-account-service.js +32 -1
- package/dist/adapters/azure-monitor/instrumentation.d.ts +26 -0
- package/dist/adapters/azure-monitor/instrumentation.js +84 -0
- package/dist/adapters/azure-monitor/telemetry.d.ts +19 -0
- package/dist/adapters/azure-monitor/telemetry.js +28 -0
- package/dist/adapters/commander/commands/add.d.ts +32 -7
- package/dist/adapters/commander/commands/add.js +197 -15
- package/dist/adapters/commander/commands/doctor.js +4 -1
- package/dist/adapters/octokit/index.d.ts +12 -0
- package/dist/adapters/octokit/index.js +26 -2
- package/dist/adapters/plop/actions/setup-pnpm.js +5 -1
- package/dist/adapters/plop/actions/sync-repository-environments.d.ts +15 -0
- package/dist/adapters/plop/actions/sync-repository-environments.js +98 -0
- package/dist/adapters/plop/generators/environment/actions.js +4 -1
- package/dist/adapters/plop/generators/environment/index.d.ts +3 -3
- package/dist/adapters/plop/generators/environment/index.js +6 -3
- package/dist/adapters/plop/generators/environment/prompts.d.ts +38 -0
- package/dist/adapters/plop/generators/environment/prompts.js +236 -91
- package/dist/adapters/plop/index.d.ts +3 -3
- package/dist/adapters/plop/index.js +5 -5
- package/dist/domain/authorization.js +4 -4
- package/dist/index.js +132 -8
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -66,6 +66,20 @@ npm run build
|
|
|
66
66
|
node ./apps/cli/bin/index.js --help
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
## 🔐 Authentication
|
|
70
|
+
|
|
71
|
+
The CLI requires GitHub authentication for every command **except** `--version`
|
|
72
|
+
and `--help`. Authenticate using one of the following (checked in this order):
|
|
73
|
+
|
|
74
|
+
1. The `GH_TOKEN` environment variable
|
|
75
|
+
2. The `GITHUB_TOKEN` environment variable
|
|
76
|
+
3. The [GitHub CLI](https://cli.github.com/) — run `gh auth login`
|
|
77
|
+
|
|
78
|
+
If no credential is found, the CLI exits with an error asking you to log in.
|
|
79
|
+
|
|
80
|
+
> Telemetry is emitted only for members of the `pagopa` GitHub organization;
|
|
81
|
+
> all other users can use the CLI normally with telemetry disabled.
|
|
82
|
+
|
|
69
83
|
## 🛠️ Usage
|
|
70
84
|
|
|
71
85
|
### Available Commands
|
package/bin/index.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
import
|
|
3
|
+
// The instrumentation module must be loaded first so that the OpenTelemetry
|
|
4
|
+
// module hook (import-in-the-middle) is registered before any of the CLI's
|
|
5
|
+
// modules are imported. Static imports are always hoisted before code runs, so
|
|
6
|
+
// sequential dynamic imports are the only way to guarantee this load order.
|
|
7
|
+
await import("../dist/adapters/azure-monitor/instrumentation.js");
|
|
5
8
|
|
|
6
|
-
runCli
|
|
9
|
+
const { runCli } = await import("../dist/index.js");
|
|
10
|
+
const { default: packageJson } = await import("../package.json", {
|
|
11
|
+
with: { type: "json" },
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
await runCli(packageJson.version).catch((error) =>
|
|
15
|
+
console.error(error.message),
|
|
16
|
+
);
|
|
@@ -11,6 +11,8 @@ import { getLogger } from "@logtape/logtape";
|
|
|
11
11
|
import { Client } from "@microsoft/microsoft-graph-client";
|
|
12
12
|
import * as assert from "node:assert/strict";
|
|
13
13
|
import { createHash } from "node:crypto";
|
|
14
|
+
import { lookup } from "node:dns/promises";
|
|
15
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
14
16
|
import { z } from "zod/v4";
|
|
15
17
|
import { environmentShort, } from "../../domain/environment.js";
|
|
16
18
|
import { terraformBackendSchema, } from "../../domain/remote-backend.js";
|
|
@@ -45,6 +47,11 @@ const bootstrapIdentityRoleDefinitionIds = [
|
|
|
45
47
|
builtInRoleDefinitionIds.contributor,
|
|
46
48
|
builtInRoleDefinitionIds.storageBlobDataContributor,
|
|
47
49
|
];
|
|
50
|
+
const keyVaultDnsErrorSchema = z.object({
|
|
51
|
+
code: z.enum(["EAI_AGAIN", "ENOTFOUND"]),
|
|
52
|
+
});
|
|
53
|
+
const keyVaultDnsReadyMaxAttempts = 30;
|
|
54
|
+
const keyVaultDnsReadyRetryDelayMs = 10_000;
|
|
48
55
|
export class AzureCloudAccountService {
|
|
49
56
|
#credential;
|
|
50
57
|
#requiredResourceProviders = [
|
|
@@ -498,6 +505,10 @@ export class AzureCloudAccountService {
|
|
|
498
505
|
}
|
|
499
506
|
async #storeRunnerAppSecrets({ cloudAccountId, keyVaultName, runnerAppCredentials, }) {
|
|
500
507
|
const logger = getLogger(["gen", "env"]);
|
|
508
|
+
await this.#waitForKeyVaultDnsResolution({
|
|
509
|
+
cloudAccountId,
|
|
510
|
+
keyVaultName,
|
|
511
|
+
});
|
|
501
512
|
const secretClient = new SecretClient(`https://${keyVaultName}.vault.azure.net/`, this.#credential);
|
|
502
513
|
await Promise.all([
|
|
503
514
|
secretClient.setSecret("github-runner-app-id", runnerAppCredentials.id),
|
|
@@ -506,5 +517,25 @@ export class AzureCloudAccountService {
|
|
|
506
517
|
]);
|
|
507
518
|
logger.debug("Created secrets in key vault {keyVaultName} in subscription {subscriptionId}", { keyVaultName, subscriptionId: cloudAccountId });
|
|
508
519
|
}
|
|
520
|
+
async #waitForKeyVaultDnsResolution({ cloudAccountId, keyVaultName, }) {
|
|
521
|
+
const logger = getLogger(["gen", "env"]);
|
|
522
|
+
const hostname = `${keyVaultName}.vault.azure.net`;
|
|
523
|
+
// Azure can report the vault as created before its public DNS name is ready.
|
|
524
|
+
// Wait here so writing runner app secrets does not fail with ENOTFOUND.
|
|
525
|
+
for (let attempt = 1; attempt <= keyVaultDnsReadyMaxAttempts; attempt++) {
|
|
526
|
+
try {
|
|
527
|
+
await lookup(hostname);
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
catch (cause) {
|
|
531
|
+
if (!keyVaultDnsErrorSchema.safeParse(cause).success ||
|
|
532
|
+
attempt === keyVaultDnsReadyMaxAttempts) {
|
|
533
|
+
throw new Error(`Key vault endpoint '${hostname}' is not resolvable`, { cause });
|
|
534
|
+
}
|
|
535
|
+
logger.debug("Waiting for key vault endpoint {hostname} to become resolvable in subscription {subscriptionId}", { hostname, subscriptionId: cloudAccountId });
|
|
536
|
+
await sleep(keyVaultDnsReadyRetryDelayMs);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
509
540
|
}
|
|
510
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYWNjb3VudC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2Nsb3VkLWFjY291bnQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU0zQixPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFNckMsT0FBTyxFQUVMLHNCQUFzQixHQUN2QixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxN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LENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTthQUNoRCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEtBQUssQ0FBQyxzREFBc0QsRUFBRTtZQUNuRSxlQUFlLEVBQUUscUJBQXFCO1lBQ3RDLGNBQWMsRUFBRSxjQUFjO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFDM0IsY0FBYyxFQUNkLFlBQVksRUFDWixvQkFBb0IsR0FLckI7UUFDQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FDbkMsV0FBVyxZQUFZLG1CQUFtQixFQUMxQyxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1FBRUYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLFlBQVksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxTQUFTLENBQ3BCLG1DQUFtQyxFQUNuQyxvQkFBb0IsQ0FBQyxjQUFjLENBQ3BDO1lBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FDcEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDbkM7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsS0FBSyxDQUNWLDhFQUE4RSxFQUM5RSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQ2pELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRva2VuQ3JlZGVudGlhbCB9IGZyb20gXCJAYXp1cmUvaWRlbnRpdHlcIjtcblxuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1hdXRob3JpemF0aW9uXCI7XG5pbXBvcnQgeyBLZXlWYXVsdE1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1rZXl2YXVsdFwiO1xuaW1wb3J0IHsgTWFuYWdlZFNlcnZpY2VJZGVudGl0eUNsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLW1zaVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFwaENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLXJlc291cmNlZ3JhcGhcIjtcbmltcG9ydCB7IFJlc291cmNlTWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VzLXN1YnNjcmlwdGlvbnNcIjtcbmltcG9ydCB7IFN0b3JhZ2VNYW5hZ2VtZW50Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tc3RvcmFnZVwiO1xuaW1wb3J0IHsgU2VjcmV0Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9rZXl2YXVsdC1zZWNyZXRzXCI7XG5pbXBvcnQgeyBCbG9iU2VydmljZUNsaWVudCB9IGZyb20gXCJAYXp1cmUvc3RvcmFnZS1ibG9iXCI7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBtaWNyb3NvZnQvbWljcm9zb2Z0LWdyYXBoLWNsaWVudFwiO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydC9zdHJpY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kL3Y0XCI7XG5cbmltcG9ydCB7XG4gIENsb3VkQWNjb3VudCxcbiAgdHlwZSBDbG91ZEFjY291bnRTZXJ2aWNlLFxufSBmcm9tIFwiLi4vLi4vZG9tYWluL2Nsb3VkLWFjY291bnQuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW52aXJvbm1lbnRJZCxcbiAgZW52aXJvbm1lbnRTaG9ydCxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRIdWJSZXBvIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWItcmVwby5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViQXBwQ3JlZGVudGlhbHMsXG4gIHR5cGUgR2l0SHViU2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVycmFmb3JtQmFja2VuZCxcbiAgdGVycmFmb3JtQmFja2VuZFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9yZW1vdGUtYmFja2VuZC5qc1wiO1xuaW1wb3J0IHsgaXNBenVyZUxvY2F0aW9uLCBsb2NhdGlvbnMsIGxvY2F0aW9uU2hvcnQgfSBmcm9tIFwiLi9sb2NhdGlvbnMuanNcIjtcblxuLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGVzZSBwcm9wZXJ0aWVzIGZvciBub3c7XG4vLyB0aGUgYWN0dWFsIHJlc3VsdCBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgY2xvdWQgcmVzb3VyY2Ugb2JqZWN0XG5leHBvcnQgY29uc3QgcmVzb3VyY2VHcmFwaERhdGFTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGxvY2F0aW9uOiB6LmVudW0obG9jYXRpb25zKSxcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgcmVzb3VyY2VHcm91cDogei5zdHJpbmcoKSxcbn0pO1xuXG5jb25zdCBncmFwaFVzZXJSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhHcm91cE1lbWJlcnNoaXBJdGVtU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbn0pO1xuXG5jb25zdCBncmFwaEdyb3VwTWVtYmVyc2hpcFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBcIkBvZGF0YS5uZXh0TGlua1wiOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHZhbHVlOiB6LmFycmF5KGdyYXBoR3JvdXBNZW1iZXJzaGlwSXRlbVNjaGVtYSksXG59KTtcblxuY29uc3QgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzID0ge1xuICBjb250cmlidXRvcjogXCJiMjQ5ODhhYy02MTgwLTQyYTAtYWI4OC0yMGY3MzgyZGQyNGNcIixcbiAga2V5VmF1bHRTZWNyZXRzT2ZmaWNlcjogXCJiODZhOGZlNC00NGNlLTQ5NDgtYWVlNS1lY2NiMmMxNTVjZDdcIixcbiAgb3duZXI6IFwiOGUzYWY2NTctYThmZi00NDNjLWE3NWMtMmZlOGM0YmNiNjM1XCIsXG4gIHJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yOiBcImY1ODMxMGQ5LWE5ZjYtNDM5YS05ZThkLWY2MmU3YjQxYTE2OFwiLFxuICBzdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcjogXCJiYTkyZjViNC0yZDExLTQ1M2QtYTQwMy1lOTZiMDAyOWM5ZmVcIixcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJvb3RzdHJhcElkZW50aXR5Um9sZURlZmluaXRpb25JZHMgPSBbXG4gIC8vIFRoZXNlIHJvbGVzIGxldCB0aGUgYm9vdHN0cmFwIGlkZW50aXR5IHJ1biB0aGUgYm9vdHN0cmFwcGVyIG1vZHVsZSBmcm9tIEdpdEh1YiBBY3Rpb25zIHdpdGhvdXQgZXh0cmEgbWFudWFsIGdyYW50cy5cbiAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLnJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuY29udHJpYnV0b3IsXG4gIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcixcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBBenVyZUNsb3VkQWNjb3VudFNlcnZpY2UgaW1wbGVtZW50cyBDbG91ZEFjY291bnRTZXJ2aWNlIHtcbiAgI2NyZWRlbnRpYWw6IFRva2VuQ3JlZGVudGlhbDtcbiAgI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMgPSBbXG4gICAgXCJNaWNyb3NvZnQuQWR2aXNvclwiLFxuICAgIFwiTWljcm9zb2Z0LkFsZXJ0c01hbmFnZW1lbnRcIixcbiAgICBcIk1pY3Jvc29mdC5BcGlNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuQXBwXCIsXG4gICAgXCJNaWNyb3NvZnQuQXV0aG9yaXphdGlvblwiLFxuICAgIFwiTWljcm9zb2Z0LkF6dXJlVGVycmFmb3JtXCIsXG4gICAgXCJNaWNyb3NvZnQuQ2FjaGVcIixcbiAgICBcIk1pY3Jvc29mdC5DZG5cIixcbiAgICBcIk1pY3Jvc29mdC5Db250YWluZXJJbnN0YW5jZVwiLFxuICAgIFwiTWljcm9zb2Z0LkNvc3RNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuREJmb3JQb3N0Z3JlU1FMXCIsXG4gICAgXCJNaWNyb3NvZnQuS2V5VmF1bHRcIixcbiAgICBcIk1pY3Jvc29mdC5TZXJ2aWNlQnVzXCIsXG4gICAgXCJNaWNyb3NvZnQuU3FsXCIsXG4gICAgXCJNaWNyb3NvZnQuU3RvcmFnZVwiLFxuICAgIFwiTWljcm9zb2Z0LldlYlwiLFxuICBdIGFzIGNvbnN0O1xuICAjcmVzb3VyY2VHcmFwaENsaWVudDogUmVzb3VyY2VHcmFwaENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsOiBUb2tlbkNyZWRlbnRpYWwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50ID0gbmV3IFJlc291cmNlR3JhcGhDbGllbnQoY3JlZGVudGlhbCk7XG4gICAgdGhpcy4jY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gIH1cblxuICBhc3luYyBnZXRUZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcbiAgICAvLyBDaGVjayBpZiBhIHN0b3JhZ2UgYWNjb3VudCB3aXRoIHRoZSBleHBlY3RlZCBuYW1lIGV4aXN0c1xuICAgIC8vICRwcmVmaXggKyBlbnZpcm9ubWVudCBzaG9ydCArIGxvY2F0aW9uICsgXCJ0ZnN0YXRlc3RcIiArIHN1ZmZpeCAoZS5nLiwgXCJkeHBpdG50ZnN0YXRlc3QwMVwiKVxuICAgIC8vIGl0IGNhbiByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cyAoZS5nLiBmb3IgZGlmZmVyZW50IGxvY2F0aW9uIG9yIGluc3RhbmNlIG51bWJlcilcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBgJHtwcmVmaXh9JHtzaG9ydEVudn0oJHthbGxMb2NhdGlvbnN9KXRmc3RhdGVzdCgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYHJlc291cmNlc1xuICAgICAgICAgICAgIHwgd2hlcmUgdHlwZSA9PSAnbWljcm9zb2Z0LnN0b3JhZ2Uvc3RvcmFnZWFjY291bnRzJ1xuICAgICAgICAgICAgIHwgd2hlcmUgbmFtZSBtYXRjaGVzIHJlZ2V4IEAnJHtyZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50LnJlc291cmNlcyh7XG4gICAgICBxdWVyeSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC50b3RhbFJlY29yZHMgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50cyA9IHouYXJyYXkocmVzb3VyY2VHcmFwaERhdGFTY2hlbWEpLnBhcnNlKHJlc3VsdC5kYXRhKTtcbiAgICAvLyBvbiBtdWx0aXBsZSByZXN1bHRzLCByYW5rIHN0b3JhZ2UgYWNjb3VudHMgYnkgbG9jYXRpb24gcHJpb3JpdHkgYW5kIGluc3RhbmNlIG51bWJlclxuICAgIGlmIChzdG9yYWdlQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgc3RvcmFnZUFjY291bnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gY29tcGFyZSBsb2NhdGlvbnMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgbG9jYXRpb25Db21wYXJpc29uID1cbiAgICAgICAgICBsb2NhdGlvbnMuaW5kZXhPZihhLmxvY2F0aW9uKSAtIGxvY2F0aW9ucy5pbmRleE9mKGIubG9jYXRpb24pO1xuICAgICAgICBpZiAobG9jYXRpb25Db21wYXJpc29uID09PSAwKSB7XG4gICAgICAgICAgLy8gc2FtZSBsb2NhdGlvbiwgY29tcGFyZSBieSBuYW1lICh0byBnZXQgdGhlIGhpZ2hlc3QgaW5zdGFuY2UgbnVtYmVyKVxuICAgICAgICAgIHJldHVybiBiLm5hbWUubG9jYWxlQ29tcGFyZShhLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhdGlvbkNvbXBhcmlzb247XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEucGFyc2Uoe1xuICAgICAgcmVzb3VyY2VHcm91cE5hbWU6IHN0b3JhZ2VBY2NvdW50c1swXS5yZXNvdXJjZUdyb3VwLFxuICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudHNbMF0ubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCxcbiAgICAgIHR5cGU6IFwiYXp1cmVybVwiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaGFzVXNlclBlcm1pc3Npb25Ub0luaXRpYWxpemUoXG4gICAgY2xvdWRBY2NvdW50SWQ6IENsb3VkQWNjb3VudFtcImlkXCJdLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQWxsIHByaW5jaXBhbCBJRHMgdG8gY2hlY2sgKHVzZXIgKyBhbGwgZ3JvdXBzKVxuICAgICAgY29uc3QgYWxsUHJpbmNpcGFsSWRzID0gYXdhaXQgdGhpcy4jZ2V0Q3VycmVudFByaW5jaXBhbElkcygpO1xuXG4gICAgICAvLyBHZXQgcm9sZSBhc3NpZ25tZW50cyBmb3IgdGhlIHN1YnNjcmlwdGlvblxuICAgICAgY29uc3QgYXV0aENsaWVudCA9IG5ldyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gW1xuICAgICAgICBidWlsdEluUm9sZURlZmluaXRpb25JZHMub3duZXIsIC8vIE93bmVyXG4gICAgICAgIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvciwgLy8gU3RvcmFnZSBCbG9iIERhdGEgQ29udHJpYnV0b3JcbiAgICAgICAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLmtleVZhdWx0U2VjcmV0c09mZmljZXIsIC8vIEtleSBWYXVsdCBTZWNyZXRzIE9mZmljZXJcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gYC9zdWJzY3JpcHRpb25zLyR7Y2xvdWRBY2NvdW50SWR9YDtcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgcm9sZSBkZWZpbml0aW9uIElEcyBhc3NpZ25lZCB0byB0aGUgdXNlciBvciB0aGVpciBncm91cHNcbiAgICAgIGNvbnN0IGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBhc3NpZ25tZW50IG9mIGF1dGhDbGllbnQucm9sZUFzc2lnbm1lbnRzLmxpc3RGb3JTY29wZShcbiAgICAgICAgc2NvcGUsXG4gICAgICApKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgYXNzaWdubWVudCBpcyBmb3IgdGhlIHVzZXIgb3IgYW55IG9mIHRoZWlyIGdyb3Vwc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYXNzaWdubWVudC5wcmluY2lwYWxJZCAmJlxuICAgICAgICAgIGFsbFByaW5jaXBhbElkcy5oYXMoYXNzaWdubWVudC5wcmluY2lwYWxJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCByb2xlIGRlZmluaXRpb24gSUQgZnJvbSB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgICAgICAgIC8vIEZvcm1hdDogL3N1YnNjcmlwdGlvbnMve3N1Yn0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy97cm9sZUlkfVxuICAgICAgICAgIGNvbnN0IHJvbGVEZWZJZCA9IGFzc2lnbm1lbnQucm9sZURlZmluaXRpb25JZD8uc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgICAgICAgIGlmIChyb2xlRGVmSWQpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMuYWRkKHJvbGVEZWZJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQtY2lyY3VpdDogc3RvcCBpZiBhbGwgcmVxdWlyZWQgcm9sZXMgaGF2ZSBiZWVuIGZvdW5kXG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1aXJlZFJvbGVzLmV2ZXJ5KChyZXF1aXJlZFJvbGUpID0+XG4gICAgICAgICAgICBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzLmhhcyhyZXF1aXJlZFJvbGUpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVkIHJvbGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNBbGxSb2xlcyA9IHJlcXVpcmVkUm9sZXMuZXZlcnkoKHJlcXVpcmVkUm9sZSkgPT5cbiAgICAgICAgYXNzaWduZWRSb2xlRGVmaW5pdGlvbklkcy5oYXMocmVxdWlyZWRSb2xlKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBoYXNBbGxSb2xlcztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gSGFuZGxlIGF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMgRm9yYmlkZGVuKSAtIHVzZXIgbGFja3MgcGVybWlzc2lvbnNcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IgJiZcbiAgICAgICAgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIFwic3RhdHVzQ29kZVwiIGluIGVycm9yICYmXG4gICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwM1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlLXRocm93IG90aGVyIGVycm9yc1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudCxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzOiBHaXRIdWJBcHBDcmVkZW50aWFscyxcbiAgICBnaXRodWI6IEdpdEh1YlJlcG8sXG4gICAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZSxcbiAgICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydC5lcXVhbChjbG91ZEFjY291bnQuY3NwLCBcImF6dXJlXCIsIFwiQ2xvdWQgYWNjb3VudCBtdXN0IGJlIEF6dXJlXCIpO1xuICAgIGFzc2VydC5vayhcbiAgICAgIGlzQXp1cmVMb2NhdGlvbihjbG91ZEFjY291bnQuZGVmYXVsdExvY2F0aW9uKSxcbiAgICAgIFwiVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGNsb3VkIGFjY291bnQgaXMgbm90IGEgdmFsaWQgQXp1cmUgbG9jYXRpb25cIixcbiAgICApO1xuXG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICAvLyBSZWdpc3RlciByZXF1aXJlZCByZXNvdXJjZSBwcm92aWRlcnMgYmVmb3JlIGNyZWF0aW5nIGFueSByZXNvdXJjZXNcbiAgICBhd2FpdCB0aGlzLiNyZWdpc3RlclByb3ZpZGVycyhjbG91ZEFjY291bnQuaWQpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc291cmNlR3JvdXBOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0LmVudn0tJHtzaG9ydC5sb2NhdGlvbn0tY29tbW9uLXJnLTAxYDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgQ3JlYXRlZEJ5OiBcIkRYIENMSVwiLFxuICAgICAgICBFbnZpcm9ubWVudDogbmFtZSxcbiAgICAgICAgLi4udGFncyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlkZW50aXR5TmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LWJvb3RzdHJhcC1pZC0wMWA7XG5cbiAgICAgIGNvbnN0IG1zaUNsaWVudCA9IG5ldyBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50KFxuICAgICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IG1zaUNsaWVudC51c2VyQXNzaWduZWRJZGVudGl0aWVzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgKTtcblxuICAgICAgYXNzZXJ0Lm9rKFxuICAgICAgICBpZGVudGl0eS5wcmluY2lwYWxJZCxcbiAgICAgICAgXCJNYW5hZ2VkIGlkZW50aXR5IHByaW5jaXBhbCBJRCBpcyB1bmRlZmluZWRcIixcbiAgICAgICk7XG4gICAgICBjb25zdCBpZGVudGl0eVByaW5jaXBhbElkID0gaWRlbnRpdHkucHJpbmNpcGFsSWQ7XG4gICAgICBhc3NlcnQub2soaWRlbnRpdHkuY2xpZW50SWQsIFwiTWFuYWdlZCBpZGVudGl0eSBjbGllbnQgSUQgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgY29uc3QgaWRlbnRpdHlDbGllbnRJZCA9IGlkZW50aXR5LmNsaWVudElkO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiQ3JlYXRlZCBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICB7IGlkZW50aXR5TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQgPSBuZXcgQXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQoXG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25DbGllbnQgPSBuZXcgU3Vic2NyaXB0aW9uQ2xpZW50KHRoaXMuI2NyZWRlbnRpYWwpO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYXdhaXQgc3Vic2NyaXB0aW9uQ2xpZW50LnN1YnNjcmlwdGlvbnMuZ2V0KFxuICAgICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgICApO1xuICAgICAgYXNzZXJ0Lm9rKHN1YnNjcmlwdGlvbi50ZW5hbnRJZCwgXCJTdWJzY3JpcHRpb24gdGVuYW50IElEIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGNvbnN0IHRlbmFudElkID0gc3Vic2NyaXB0aW9uLnRlbmFudElkO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2NvcGUgPSBgL3N1YnNjcmlwdGlvbnMvJHtjbG91ZEFjY291bnQuaWR9YDtcblxuICAgICAgLy8gR3JhbnQgdGhlIGJvb3RzdHJhcCBpZGVudGl0eSB0aGUgQXp1cmUgcGVybWlzc2lvbnMgaXQgbmVlZHMgdG8gb3BlcmF0ZSBhdXRvbm9tb3VzbHkgaW4gdGhlIGJvb3RzdHJhcCB3b3JrZmxvdy5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBib290c3RyYXBJZGVudGl0eVJvbGVEZWZpbml0aW9uSWRzLm1hcCgocm9sZURlZmluaXRpb25JZCkgPT5cbiAgICAgICAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudC5yb2xlQXNzaWdubWVudHMuY3JlYXRlKFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uU2NvcGUsXG4gICAgICAgICAgICB0aGlzLiNjcmVhdGVSb2xlQXNzaWdubWVudE5hbWUoXG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICBpZGVudGl0eVByaW5jaXBhbElkLFxuICAgICAgICAgICAgICByb2xlRGVmaW5pdGlvbklkLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcHJpbmNpcGFsSWQ6IGlkZW50aXR5UHJpbmNpcGFsSWQsXG4gICAgICAgICAgICAgIHByaW5jaXBhbFR5cGU6IFwiU2VydmljZVByaW5jaXBhbFwiLFxuICAgICAgICAgICAgICByb2xlRGVmaW5pdGlvbklkOiB0aGlzLiNjcmVhdGVSb2xlRGVmaW5pdGlvblJlc291cmNlSWQoXG4gICAgICAgICAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiQXNzaWduZWQgYm9vdHN0cmFwIHJvbGVzIHRvIGlkZW50aXR5IHtpZGVudGl0eU5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICAgIHsgaWRlbnRpdHlOYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkIH0sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBnaXRodWJFbnZpcm9ubWVudE5hbWUgPSBgYm9vdHN0cmFwcGVyLSR7bmFtZX0tY2RgO1xuICAgICAgY29uc3QgZmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUgPSB0aGlzLiNjcmVhdGVGZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSh7XG4gICAgICAgIGdpdGh1YixcbiAgICAgICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEluY2x1ZGUgYSByZXBvc2l0b3J5LWRlcml2ZWQgc3VmZml4IHNvIGRpZmZlcmVudCByZXBvc2l0b3JpZXMgY2FuIHNoYXJlXG4gICAgICAvLyB0aGUgc2FtZSBib290c3RyYXAgaWRlbnRpdHkgd2l0aG91dCBvdmVyd3JpdGluZyBlYWNoIG90aGVyJ3MgT0lEQyB0cnVzdC5cbiAgICAgIGF3YWl0IG1zaUNsaWVudC5mZWRlcmF0ZWRJZGVudGl0eUNyZWRlbnRpYWxzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgICBmZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSxcbiAgICAgICAge1xuICAgICAgICAgIGF1ZGllbmNlczogW1wiYXBpOi8vQXp1cmVBRFRva2VuRXhjaGFuZ2VcIl0sXG4gICAgICAgICAgaXNzdWVyOiBcImh0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgICAgICBzdWJqZWN0OiBgcmVwbzoke2dpdGh1Yi5vd25lcn0vJHtnaXRodWIucmVwb306ZW52aXJvbm1lbnQ6JHtnaXRodWJFbnZpcm9ubWVudE5hbWV9YCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJDb25maWd1cmVkIGZlZGVyYXRlZCBpZGVudGl0eSBjcmVkZW50aWFsIHtjcmVkZW50aWFsTmFtZX0gZm9yIGlkZW50aXR5IHtpZGVudGl0eU5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjcmVkZW50aWFsTmFtZTogZmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUsXG4gICAgICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBhd2FpdCB0aGlzLiNzdG9yZUJvb3RzdHJhcHBlckVudmlyb25tZW50U2VjcmV0cyh7XG4gICAgICAgIGNsb3VkQWNjb3VudElkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICAgIGdpdGh1YixcbiAgICAgICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICBpZGVudGl0eUNsaWVudElkLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qga2V5VmF1bHROYW1lID0gYXdhaXQgdGhpcy4jY3JlYXRlQ29tbW9uS2V5VmF1bHQoe1xuICAgICAgICBjbG91ZEFjY291bnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIHNob3J0RW52OiBzaG9ydC5lbnYsXG4gICAgICAgIHNob3J0TG9jYXRpb246IHNob3J0LmxvY2F0aW9uLFxuICAgICAgICB0YWdzLFxuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLiNzdG9yZVJ1bm5lckFwcFNlY3JldHMoe1xuICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICBrZXlWYXVsdE5hbWUsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgaW5pdGlhbGl6YXRpb24gZmFpbHNcbiAgICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5iZWdpbkRlbGV0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJEZWxldGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gZHVlIHRvIGluaXRpYWxpemF0aW9uIGZhaWx1cmVcIixcbiAgICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcbiAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihjYXVzZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xvdWQgYWNjb3VudGAsIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc0luaXRpYWxpemVkKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcblxuICAgIGNvbnN0IGlkZW50aXR5UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1ib290c3RyYXAtaWQtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3QgaWRlbnRpdHlRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5tYW5hZ2VkaWRlbnRpdHkvdXNlcmFzc2lnbmVkaWRlbnRpdGllcydcbiAgICAgICAgICAgICB8IHdoZXJlIG5hbWUgbWF0Y2hlcyByZWdleCBAJyR7aWRlbnRpdHlSZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcblxuICAgIGNvbnN0IGtleVZhdWx0UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1jb21tb24ta3YtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3Qga2V5VmF1bHRRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5rZXl2YXVsdC92YXVsdHMnXG4gICAgICAgICAgICAgfCB3aGVyZSBuYW1lIG1hdGNoZXMgcmVnZXggQCcke2tleVZhdWx0UmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG5cbiAgICBjb25zdCBbaWRlbnRpdHlSZXN1bHQsIGtleVZhdWx0UmVzdWx0LCBhcmVQcm92aWRlcnNSZWdpc3RlcmVkXSA9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuI3Jlc291cmNlR3JhcGhDbGllbnQucmVzb3VyY2VzKHtcbiAgICAgICAgICBxdWVyeTogaWRlbnRpdHlRdWVyeSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudC5yZXNvdXJjZXMoe1xuICAgICAgICAgIHF1ZXJ5OiBrZXlWYXVsdFF1ZXJ5LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKGNsb3VkQWNjb3VudElkKSxcbiAgICAgIF0pO1xuXG4gICAgY29uc3QgaW5pdGlhbGl6ZWQgPVxuICAgICAgaWRlbnRpdHlSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAga2V5VmF1bHRSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAgYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZDtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFwic3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gaW5pdGlhbGl6ZWQ6IHtpbml0aWFsaXplZH1cIiwge1xuICAgICAgaW5pdGlhbGl6ZWQsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBhc3luYyBwcm92aXNpb25UZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudDogQ2xvdWRBY2NvdW50LFxuICAgIHsgbmFtZSwgcHJlZml4IH06IEVudmlyb25tZW50SWQsXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQ+IHtcbiAgICBhc3NlcnQuZXF1YWwoY2xvdWRBY2NvdW50LmNzcCwgXCJhenVyZVwiLCBcIkNsb3VkIGFjY291bnQgbXVzdCBiZSBBenVyZVwiKTtcbiAgICBhc3NlcnQub2soXG4gICAgICBpc0F6dXJlTG9jYXRpb24oY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbiksXG4gICAgICBcIlRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBjbG91ZCBhY2NvdW50IGlzIG5vdCBhIHZhbGlkIEF6dXJlIGxvY2F0aW9uXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgIC4uLnRhZ3MsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LXRmc3RhdGUtcmctMDFgO1xuXG4gICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgcmVzb3VyY2UgZ3JvdXAge3Jlc291cmNlR3JvdXBOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdG9yYWdlTWFuYWdlbWVudENsaWVudCA9IG5ldyBTdG9yYWdlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50ID1cbiAgICAgIGF3YWl0IHN0b3JhZ2VNYW5hZ2VtZW50Q2xpZW50LnN0b3JhZ2VBY2NvdW50cy5iZWdpbkNyZWF0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBgJHtwcmVmaXh9JHtzaG9ydC5lbnZ9JHtzaG9ydC5sb2NhdGlvbn10ZnN0YXRlc3QwMWAsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBcIlN0b3JhZ2VWMlwiLFxuICAgICAgICAgIHNrdToge1xuICAgICAgICAgICAgbmFtZTogXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgIHRpZXI6IFwiU3RhbmRhcmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIFwiU3RvcmFnZSBhY2NvdW50IGJsb2IgZW5kcG9pbnQgaXMgdW5kZWZpbmVkXCIsXG4gICAgKTtcblxuICAgIGFzc2VydC5vayhzdG9yYWdlQWNjb3VudC5uYW1lLCBcIlN0b3JhZ2UgYWNjb3VudCBuYW1lIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBzdG9yYWdlIGFjY291bnQge3N0b3JhZ2VBY2NvdW50TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHtcbiAgICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudC5uYW1lLFxuICAgICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGJsb2JTZXJ2aWNlQ2xpZW50ID0gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9XG4gICAgICBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCJ0ZXJyYWZvcm0tc3RhdGVcIik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgYmxvYiBjb250YWluZXIgY3JlYXRpb24gZmFpbHNcbiAgICAgIC8vIHJlc291cmNlIGdyb3VwIGRlbGV0aW9uIGFsc28gZGVsZXRlcyBhbGwgY29udGFpbmVkIHJlc291cmNlc1xuICAgICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmJlZ2luRGVsZXRlQW5kV2FpdChcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBibG9iIGNvbnRhaW5lcmAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVycmFmb3JtQmFja2VuZFNjaGVtYS5wYXJzZSh7XG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICB0eXBlOiBcImF6dXJlcm1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5tYXAoYXN5bmMgKG5hbWVzcGFjZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IGF3YWl0IGNsaWVudC5wcm92aWRlcnMuZ2V0KG5hbWVzcGFjZSk7XG4gICAgICAgIHJldHVybiBwcm92aWRlci5yZWdpc3RyYXRpb25TdGF0ZSA9PT0gXCJSZWdpc3RlcmVkXCI7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KEJvb2xlYW4pO1xuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUNvbW1vbktleVZhdWx0KHtcbiAgICBjbG91ZEFjY291bnQsXG4gICAgbmFtZSxcbiAgICBwcmVmaXgsXG4gICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgc2hvcnRFbnYsXG4gICAgc2hvcnRMb2NhdGlvbixcbiAgICB0YWdzLFxuICAgIHRlbmFudElkLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50OiBDbG91ZEFjY291bnQ7XG4gICAgbmFtZTogRW52aXJvbm1lbnRJZFtcIm5hbWVcIl07XG4gICAgcHJlZml4OiBzdHJpbmc7XG4gICAgcmVzb3VyY2VHcm91cE5hbWU6IHN0cmluZztcbiAgICBzaG9ydEVudjogc3RyaW5nO1xuICAgIHNob3J0TG9jYXRpb246IHN0cmluZztcbiAgICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3Qga3ZDbGllbnQgPSBuZXcgS2V5VmF1bHRNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICApO1xuXG4gICAgY29uc3Qga2V5VmF1bHROYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0ke3Nob3J0TG9jYXRpb259LWNvbW1vbi1rdi0wMWA7XG4gICAgY29uc3Qgc2VjcmV0c1Byb3RlY3Rpb25FbmFibGVkID0gc2hvcnRFbnYgPT09IFwicFwiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga3ZDbGllbnQudmF1bHRzLmNoZWNrTmFtZUF2YWlsYWJpbGl0eSh7XG4gICAgICBuYW1lOiBrZXlWYXVsdE5hbWUsXG4gICAgICB0eXBlOiBcIk1pY3Jvc29mdC5LZXlWYXVsdC92YXVsdHNcIixcbiAgICB9KTtcblxuICAgIGF3YWl0IGt2Q2xpZW50LnZhdWx0cy5iZWdpbkNyZWF0ZU9yVXBkYXRlQW5kV2FpdChcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAga2V5VmF1bHROYW1lLFxuICAgICAge1xuICAgICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGNyZWF0ZU1vZGU6IHJlc3VsdC5uYW1lQXZhaWxhYmxlID8gXCJkZWZhdWx0XCIgOiBcInJlY292ZXJcIixcbiAgICAgICAgICBlbmFibGVkRm9yRGlza0VuY3J5cHRpb246IHRydWUsXG4gICAgICAgICAgZW5hYmxlUHVyZ2VQcm90ZWN0aW9uOiBzZWNyZXRzUHJvdGVjdGlvbkVuYWJsZWQgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVuYWJsZVJiYWNBdXRob3JpemF0aW9uOiB0cnVlLFxuICAgICAgICAgIHNrdToge1xuICAgICAgICAgICAgZmFtaWx5OiBcIkFcIixcbiAgICAgICAgICAgIG5hbWU6IFwic3RhbmRhcmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvZnREZWxldGVSZXRlbnRpb25JbkRheXM6IHNlY3JldHNQcm90ZWN0aW9uRW5hYmxlZCA/IDE0IDogNyxcbiAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgfSxcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIEVudmlyb25tZW50OiBuYW1lLFxuICAgICAgICAgIC4uLnRhZ3MsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQga2V5IHZhdWx0IHtrZXlWYXVsdE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IGtleVZhdWx0TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5VmF1bHROYW1lO1xuICB9XG5cbiAgI2NyZWF0ZUZlZGVyYXRlZENyZWRlbnRpYWxOYW1lKHtcbiAgICBnaXRodWIsXG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICB9OiB7XG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvO1xuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZTogc3RyaW5nO1xuICB9KTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvTmFtZSA9IGdpdGh1Yi5yZXBvLnJlcGxhY2VBbGwoL1teYS16QS1aMC05LV0vZywgXCItXCIpO1xuXG4gICAgcmV0dXJuIGAke3JlcG9OYW1lfS0ke2dpdGh1YkVudmlyb25tZW50TmFtZX1gO1xuICB9XG5cbiAgI2NyZWF0ZVJvbGVBc3NpZ25tZW50TmFtZShcbiAgICBzY29wZTogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcm9sZURlZmluaXRpb25JZDogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKGAke3Njb3BlfToke3ByaW5jaXBhbElkfToke3JvbGVEZWZpbml0aW9uSWR9YClcbiAgICAgIC5kaWdlc3QoXCJoZXhcIik7XG5cbiAgICByZXR1cm4gYCR7aGFzaC5zbGljZSgwLCA4KX0tJHtoYXNoLnNsaWNlKDgsIDEyKX0tJHtoYXNoLnNsaWNlKFxuICAgICAgMTIsXG4gICAgICAxNixcbiAgICApfS0ke2hhc2guc2xpY2UoMTYsIDIwKX0tJHtoYXNoLnNsaWNlKDIwLCAzMil9YDtcbiAgfVxuXG4gICNjcmVhdGVSb2xlRGVmaW5pdGlvblJlc291cmNlSWQoXG4gICAgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyxcbiAgICByb2xlRGVmaW5pdGlvbklkOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvc3Vic2NyaXB0aW9ucy8ke3N1YnNjcmlwdGlvbklkfS9wcm92aWRlcnMvTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZURlZmluaXRpb25zLyR7cm9sZURlZmluaXRpb25JZH1gO1xuICB9XG5cbiAgYXN5bmMgI2dldEN1cnJlbnRQcmluY2lwYWxJZHMoKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICAgIC8vIENyZWF0ZSBHcmFwaCBjbGllbnQgd2l0aCBjdXN0b20gYXV0aCBwcm92aWRlciB0aGF0IGZldGNoZXMgZnJlc2ggdG9rZW5zXG4gICAgY29uc3QgZ3JhcGhDbGllbnQgPSBDbGllbnQuaW5pdCh7XG4gICAgICBhdXRoUHJvdmlkZXI6IGFzeW5jIChkb25lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuI2NyZWRlbnRpYWwuZ2V0VG9rZW4oXG4gICAgICAgICAgICBcImh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS8uZGVmYXVsdFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XG4gICAgICAgICAgICBkb25lKFxuICAgICAgICAgICAgICBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gYWNxdWlyZSB0b2tlbiBmb3IgTWljcm9zb2Z0IEdyYXBoXCIpLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZG9uZShudWxsLCB0b2tlblJlc3BvbnNlLnRva2VuKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBkb25lKGVycm9yIGFzIEVycm9yLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEdldCBjdXJyZW50IHVzZXIncyBpbmZvXG4gICAgY29uc3QgbWVSZXNwb25zZSA9IGF3YWl0IGdyYXBoQ2xpZW50LmFwaShcIi9tZVwiKS5nZXQoKTtcbiAgICBjb25zdCBtZSA9IGdyYXBoVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKG1lUmVzcG9uc2UpO1xuICAgIGNvbnN0IHVzZXJPYmplY3RJZCA9IG1lLmlkO1xuXG4gICAgLy8gR2V0IGFsbCBncm91cCBtZW1iZXJzaGlwcyAodHJhbnNpdGl2ZSAtIGluY2x1ZGVzIG5lc3RlZCBncm91cHMpXG4gICAgY29uc3QgZ3JvdXBJZHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5leHRMaW5rOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBcIi9tZS90cmFuc2l0aXZlTWVtYmVyT2Y/JHNlbGVjdD1pZFwiO1xuXG4gICAgd2hpbGUgKG5leHRMaW5rKSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IGdyYXBoQ2xpZW50LmFwaShuZXh0TGluaykuZ2V0KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGdyYXBoR3JvdXBNZW1iZXJzaGlwUmVzcG9uc2VTY2hlbWEucGFyc2UocmF3UmVzcG9uc2UpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3BvbnNlLnZhbHVlKSB7XG4gICAgICAgIGdyb3VwSWRzLnB1c2goaXRlbS5pZCk7XG4gICAgICB9XG4gICAgICBuZXh0TGluayA9IHJlc3BvbnNlW1wiQG9kYXRhLm5leHRMaW5rXCJdO1xuICAgIH1cblxuICAgIC8vIEFsbCBwcmluY2lwYWwgSURzIHRvIGNoZWNrICh1c2VyICsgYWxsIGdyb3VwcylcbiAgICBjb25zdCBhbGxQcmluY2lwYWxJZHMgPSBuZXcgU2V0KFt1c2VyT2JqZWN0SWQsIC4uLmdyb3VwSWRzXSk7XG4gICAgcmV0dXJuIGFsbFByaW5jaXBhbElkcztcbiAgfVxuXG4gIGFzeW5jICNyZWdpc3RlclByb3ZpZGVycyhzdWJzY3JpcHRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImR4LWNsaVwiLCBcInJlZ2lzdGVyLXByb3ZpZGVyc1wiXSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBcIlJlZ2lzdGVyaW5nIHtjb3VudH0gcmVzb3VyY2UgcHJvdmlkZXJzIG9uIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IGNvdW50OiB0aGlzLiNyZXF1aXJlZFJlc291cmNlUHJvdmlkZXJzLmxlbmd0aCwgc3Vic2NyaXB0aW9uSWQgfSxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLiNyZXF1aXJlZFJlc291cmNlUHJvdmlkZXJzLm1hcChhc3luYyAobmFtZXNwYWNlKSA9PiB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5wcm92aWRlcnMucmVnaXN0ZXIobmFtZXNwYWNlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiUmVnaXN0ZXJlZCBwcm92aWRlciB7bmFtZXNwYWNlfVwiLCB7IG5hbWVzcGFjZSB9KTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIFwiQWxsIHJlc291cmNlIHByb3ZpZGVycyByZWdpc3RlcmVkIG9uIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IHN1YnNjcmlwdGlvbklkIH0sXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jICNzdG9yZUJvb3RzdHJhcHBlckVudmlyb25tZW50U2VjcmV0cyh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAgZ2l0aHViLFxuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICBnaXRIdWJTZXJ2aWNlLFxuICAgIGlkZW50aXR5Q2xpZW50SWQsXG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHMsXG4gICAgdGVuYW50SWQsXG4gIH06IHtcbiAgICBjbG91ZEFjY291bnRJZDogc3RyaW5nO1xuICAgIGdpdGh1YjogR2l0SHViUmVwbztcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IHN0cmluZztcbiAgICBnaXRIdWJTZXJ2aWNlOiBHaXRIdWJTZXJ2aWNlO1xuICAgIGlkZW50aXR5Q2xpZW50SWQ6IHN0cmluZztcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkFSTV9DTElFTlRfSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IGlkZW50aXR5Q2xpZW50SWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJBUk1fVEVOQU5UX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiB0ZW5hbnRJZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkFSTV9TVUJTQ1JJUFRJT05fSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IGNsb3VkQWNjb3VudElkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5pZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9DTElFTlRfSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IHJ1bm5lckFwcENyZWRlbnRpYWxzLmNsaWVudElkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0lOU1RBTExBVElPTl9JRFwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMuaW5zdGFsbGF0aW9uSWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJHSF9BUFBfS0VZXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5rZXkudHJpbUVuZCgpLFxuICAgICAgfSksXG4gICAgXSk7XG5cbiAgICBsb2dnZXIuZGVidWcoXCJTZXQgR2l0SHViIGVudmlyb25tZW50IHNlY3JldHMgZm9yIHtlbnZpcm9ubWVudE5hbWV9XCIsIHtcbiAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgI3N0b3JlUnVubmVyQXBwU2VjcmV0cyh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAga2V5VmF1bHROYW1lLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBrZXlWYXVsdE5hbWU6IHN0cmluZztcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGNvbnN0IHNlY3JldENsaWVudCA9IG5ldyBTZWNyZXRDbGllbnQoXG4gICAgICBgaHR0cHM6Ly8ke2tleVZhdWx0TmFtZX0udmF1bHQuYXp1cmUubmV0L2AsXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBzZWNyZXRDbGllbnQuc2V0U2VjcmV0KFwiZ2l0aHViLXJ1bm5lci1hcHAtaWRcIiwgcnVubmVyQXBwQ3JlZGVudGlhbHMuaWQpLFxuICAgICAgc2VjcmV0Q2xpZW50LnNldFNlY3JldChcbiAgICAgICAgXCJnaXRodWItcnVubmVyLWFwcC1pbnN0YWxsYXRpb24taWRcIixcbiAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMuaW5zdGFsbGF0aW9uSWQsXG4gICAgICApLFxuICAgICAgc2VjcmV0Q2xpZW50LnNldFNlY3JldChcbiAgICAgICAgXCJnaXRodWItcnVubmVyLWFwcC1rZXlcIixcbiAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMua2V5LnRyaW1FbmQoKSwgLy8gc3RyaXAgdHJhaWxpbmcgbmV3bGluZXMgZnJvbSBQRU0ga2V5c1xuICAgICAgKSxcbiAgICBdKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBzZWNyZXRzIGluIGtleSB2YXVsdCB7a2V5VmF1bHROYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBrZXlWYXVsdE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYWNjb3VudC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2Nsb3VkLWFjY291bnQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU0zQixPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFNckMsT0FBTyxFQUVMLHNCQUFzQixHQUN2QixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNFLHNEQUFzRDtBQUN0RCxzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDaEIsYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ2YsQ0FBQyxDQUFDO0FBRUgsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ2YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xELGlCQUFpQixFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUM7Q0FDL0MsQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELHNCQUFzQixFQUFFLHNDQUFzQztJQUM5RCxLQUFLLEVBQUUsc0NBQXNDO0lBQzdDLG1DQUFtQyxFQUFFLHNDQUFzQztJQUMzRSwwQkFBMEIsRUFBRSxzQ0FBc0M7Q0FDMUQsQ0FBQztBQUVYLE1BQU0sa0NBQWtDLEdBQUc7SUFDekMsc0hBQXNIO0lBQ3RILHdCQUF3QixDQUFDLG1DQUFtQztJQUM1RCx3QkFBd0IsQ0FBQyxXQUFXO0lBQ3BDLHdCQUF3QixDQUFDLDBCQUEwQjtDQUMzQyxDQUFDO0FBRVgsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3RDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUNILE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDLE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsV0FBVyxDQUFrQjtJQUM3QiwwQkFBMEIsR0FBRztRQUMzQixtQkFBbUI7UUFDbkIsNEJBQTRCO1FBQzVCLHlCQUF5QjtRQUN6QixlQUFlO1FBQ2YseUJBQXlCO1FBQ3pCLDBCQUEwQjtRQUMxQixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDZCQUE2QjtRQUM3QiwwQkFBMEI7UUFDMUIsMkJBQTJCO1FBQzNCLG9CQUFvQjtRQUNwQixzQkFBc0I7UUFDdEIsZUFBZTtRQUNmLG1CQUFtQjtRQUNuQixlQUFlO0tBQ1AsQ0FBQztJQUNYLG9CQUFvQixDQUFzQjtJQUUxQyxZQUFZLFVBQTJCO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLGNBQWtDLEVBQ2xDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBaUI7UUFFL0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsMkRBQTJEO1FBQzNELDRGQUE0RjtRQUM1RixrRkFBa0Y7UUFDbEYsTUFBTSxZQUFZLEdBQUcsR0FBRyxNQUFNLEdBQUcsUUFBUSxJQUFJLFlBQVksNkJBQTZCLENBQUM7UUFDdkYsTUFBTSxLQUFLLEdBQUc7OzRDQUUwQixZQUFZO2FBQzNDLENBQUM7UUFDVixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7WUFDdkQsS0FBSztZQUNMLGFBQWEsRUFBRSxDQUFDLGNBQWMsQ0FBQztTQUNoQyxDQUFDLENBQUM7UUFDSCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVFLHNGQUFzRjtRQUN0RixJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsNkJBQTZCO2dCQUM3QixNQUFNLGtCQUFrQixHQUN0QixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDN0Isc0VBQXNFO29CQUN0RSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztnQkFDRCxPQUFPLGtCQUFrQixDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sc0JBQXNCLENBQUMsS0FBSyxDQUFDO1lBQ2xDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQ25ELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzNDLGNBQWMsRUFBRSxjQUFjO1lBQzlCLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsNkJBQTZCLENBQ2pDLGNBQWtDO1FBRWxDLElBQUksQ0FBQztZQUNILGlEQUFpRDtZQUNqRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBRTdELDRDQUE0QztZQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUE2QixDQUNsRCxJQUFJLENBQUMsV0FBVyxFQUNoQixjQUFjLENBQ2YsQ0FBQztZQUVGLE1BQU0sYUFBYSxHQUFHO2dCQUNwQix3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsUUFBUTtnQkFDeEMsd0JBQXdCLENBQUMsMEJBQTBCLEVBQUUsZ0NBQWdDO2dCQUNyRix3QkFBd0IsQ0FBQyxzQkFBc0IsRUFBRSw0QkFBNEI7YUFDOUUsQ0FBQztZQUVGLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixjQUFjLEVBQUUsQ0FBQztZQUVqRCx1RUFBdUU7WUFDdkUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBRXBELElBQUksS0FBSyxFQUFFLE1BQU0sVUFBVSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUNwRSxLQUFLLENBQ04sRUFBRSxDQUFDO2dCQUNGLGtFQUFrRTtnQkFDbEUsSUFDRSxVQUFVLENBQUMsV0FBVztvQkFDdEIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQzNDLENBQUM7b0JBQ0QsdURBQXVEO29CQUN2RCwwRkFBMEY7b0JBQzFGLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2hFLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QseUJBQXlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsNERBQTREO2dCQUM1RCxJQUNFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUNuQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQzVDLEVBQ0QsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUVELDBDQUEwQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDdkQseUJBQXlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUM1QyxDQUFDO1lBRUYsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsdUVBQXVFO1lBQ3ZFLElBQ0UsS0FBSztnQkFDTCxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixZQUFZLElBQUksS0FBSztnQkFDckIsS0FBSyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQ3hCLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0Qsd0JBQXdCO1lBQ3hCLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLFlBQTBCLEVBQzFCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBaUIsRUFDL0Isb0JBQTBDLEVBQzFDLE1BQWtCLEVBQ2xCLGFBQTRCLEVBQzVCLE9BQStCLEVBQUU7UUFFakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxFQUFFLENBQ1AsZUFBZSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFDN0MseUVBQXlFLENBQzFFLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV6QyxxRUFBcUU7UUFDckUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSx3QkFBd0IsQ0FDM0QsSUFBSSxDQUFDLFdBQVcsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FDaEIsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHO1lBQ1osR0FBRyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUMzQixRQUFRLEVBQUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7U0FDdEQsQ0FBQztRQUVGLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxlQUFlLENBQUM7UUFFbEYsTUFBTSxVQUFVLEdBQUc7WUFDakIsUUFBUSxFQUFFLFlBQVksQ0FBQyxlQUFlO1lBQ3RDLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLEdBQUcsSUFBSTthQUNSO1NBQ0YsQ0FBQztRQUVGLE1BQU0sd0JBQXdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FDMUQsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FDViw2RUFBNkUsRUFDN0UsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUN2RCxDQUFDO1FBRUYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxrQkFBa0IsQ0FBQztZQUVoRixNQUFNLFNBQVMsR0FBRyxJQUFJLDRCQUE0QixDQUNoRCxJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUNwRSxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFVBQVUsQ0FDWCxDQUFDO1lBRUYsTUFBTSxDQUFDLEVBQUUsQ0FDUCxRQUFRLENBQUMsV0FBVyxFQUNwQiw0Q0FBNEMsQ0FDN0MsQ0FBQztZQUNGLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUseUNBQXlDLENBQUMsQ0FBQztZQUN4RSxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFFM0MsTUFBTSxDQUFDLEtBQUssQ0FDVixrRUFBa0UsRUFDbEUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FDbEQsQ0FBQztZQUVGLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSw2QkFBNkIsQ0FDckUsSUFBSSxDQUFDLFdBQVcsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FDaEIsQ0FBQztZQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUM3RCxZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1lBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUN2QyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7WUFFOUQsaUhBQWlIO1lBQ2pILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixrQ0FBa0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQzFELDZCQUE2QixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ2xELGlCQUFpQixFQUNqQixJQUFJLENBQUMseUJBQXlCLENBQzVCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsZ0JBQWdCLENBQ2pCLEVBQ0Q7Z0JBQ0UsV0FBVyxFQUFFLG1CQUFtQjtnQkFDaEMsYUFBYSxFQUFFLGtCQUFrQjtnQkFDakMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLCtCQUErQixDQUNwRCxZQUFZLENBQUMsRUFBRSxFQUNmLGdCQUFnQixDQUNqQjthQUNGLENBQ0YsQ0FDRixDQUNGLENBQUM7WUFFRixNQUFNLENBQUMsS0FBSyxDQUNWLHNGQUFzRixFQUN0RixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUNsRCxDQUFDO1lBRUYsTUFBTSxxQkFBcUIsR0FBRyxnQkFBZ0IsSUFBSSxLQUFLLENBQUM7WUFDeEQsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUM7Z0JBQ2xFLE1BQU07Z0JBQ04scUJBQXFCO2FBQ3RCLENBQUMsQ0FBQztZQUVILDBFQUEwRTtZQUMxRSwyRUFBMkU7WUFDM0UsTUFBTSxTQUFTLENBQUMsNEJBQTRCLENBQUMsY0FBYyxDQUN6RCxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLHVCQUF1QixFQUN2QjtnQkFDRSxTQUFTLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztnQkFDekMsTUFBTSxFQUFFLDZDQUE2QztnQkFDckQsT0FBTyxFQUFFLFFBQVEsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxnQkFBZ0IscUJBQXFCLEVBQUU7YUFDcEYsQ0FDRixDQUFDO1lBRUYsTUFBTSxDQUFDLEtBQUssQ0FDVix3SEFBd0gsRUFDeEg7Z0JBQ0UsY0FBYyxFQUFFLHVCQUF1QjtnQkFDdkMsWUFBWTtnQkFDWixjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUU7YUFDaEMsQ0FDRixDQUFDO1lBRUYsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUM7Z0JBQzlDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDL0IsTUFBTTtnQkFDTixxQkFBcUI7Z0JBQ3JCLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixvQkFBb0I7Z0JBQ3BCLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFFSCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEQsWUFBWTtnQkFDWixJQUFJO2dCQUNKLE1BQU07Z0JBQ04saUJBQWlCO2dCQUNqQixRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUc7Z0JBQ25CLGFBQWEsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDN0IsSUFBSTtnQkFDSixRQUFRO2FBQ1QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUM7Z0JBQ2hDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDL0IsWUFBWTtnQkFDWixvQkFBb0I7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixpREFBaUQ7WUFDakQsTUFBTSx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQzlELGlCQUFpQixDQUNsQixDQUFDO1lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FDViwyR0FBMkcsRUFDM0csRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUN2RCxDQUFDO1lBQ0YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxFQUFFO2dCQUN0RSxLQUFLO2FBQ04sQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUNqQixjQUFrQyxFQUNsQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQWlCO1FBRS9CLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxNQUFNLElBQUksUUFBUSxLQUFLLFlBQVksa0NBQWtDLENBQUM7UUFDdEcsTUFBTSxhQUFhLEdBQUc7OzRDQUVrQixvQkFBb0I7YUFDbkQsQ0FBQztRQUVWLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxNQUFNLElBQUksUUFBUSxLQUFLLFlBQVksK0JBQStCLENBQUM7UUFDbkcsTUFBTSxhQUFhLEdBQUc7OzRDQUVrQixvQkFBb0I7YUFDbkQsQ0FBQztRQUVWLE1BQU0sQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixDQUFDLEdBQzVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxLQUFLLEVBQUUsYUFBYTtnQkFDcEIsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxLQUFLLEVBQUUsYUFBYTtnQkFDcEIsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDO1NBQzdDLENBQUMsQ0FBQztRQUVMLE1BQU0sV0FBVyxHQUNmLGNBQWMsQ0FBQyxZQUFZLEdBQUcsQ0FBQztZQUMvQixjQUFjLENBQUMsWUFBWSxHQUFHLENBQUM7WUFDL0Isc0JBQXNCLENBQUM7UUFFekIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSxDQUFDLEtBQUssQ0FBQywwREFBMEQsRUFBRTtZQUN2RSxXQUFXO1lBQ1gsY0FBYyxFQUFFLGNBQWM7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FDN0IsWUFBMEIsRUFDMUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFpQixFQUMvQixPQUErQixFQUFFO1FBRWpDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsRUFBRSxDQUNQLGVBQWUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQzdDLHlFQUF5RSxDQUMxRSxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLHdCQUF3QixDQUMzRCxJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUc7WUFDWixHQUFHLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzNCLFFBQVEsRUFBRSxhQUFhLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztTQUN0RCxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUc7WUFDakIsUUFBUSxFQUFFLFlBQVksQ0FBQyxlQUFlO1lBQ3RDLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsSUFBSTtnQkFDakIsR0FBRyxJQUFJO2FBQ1I7U0FDRixDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLGdCQUFnQixDQUFDO1FBRW5GLE1BQU0sd0JBQXdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FDMUQsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FDViw2RUFBNkUsRUFDN0UsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUN2RCxDQUFDO1FBRUYsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLHVCQUF1QixDQUN6RCxJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQ2xCLE1BQU0sdUJBQXVCLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUM5RCxpQkFBaUIsRUFDakIsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxhQUFhLEVBQ25EO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsR0FBRyxFQUFFO2dCQUNILElBQUksRUFBRSxjQUFjO2dCQUNwQixJQUFJLEVBQUUsVUFBVTthQUNqQjtZQUNELEdBQUcsVUFBVTtTQUNkLENBQ0YsQ0FBQztRQUVKLE1BQU0sQ0FBQyxFQUFFLENBQ1AsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFDckMsNENBQTRDLENBQzdDLENBQUM7UUFFRixNQUFNLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUVwRSxNQUFNLENBQUMsS0FBSyxDQUNWLCtFQUErRSxFQUMvRTtZQUNFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxJQUFJO1lBQ3ZDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtTQUNoQyxDQUNGLENBQUM7UUFDRixNQUFNLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLENBQzdDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQ3JDLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7UUFFRixNQUFNLGVBQWUsR0FDbkIsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLDBEQUEwRDtZQUMxRCwrREFBK0Q7WUFDL0QsTUFBTSx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQzlELGlCQUFpQixDQUNsQixDQUFDO1lBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsRUFBRTtnQkFDakUsS0FBSyxFQUFFLENBQUM7YUFDVCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7WUFDbEMsaUJBQWlCO1lBQ2pCLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxJQUFJO1lBQ3ZDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtZQUMvQixJQUFJLEVBQUUsU0FBUztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGNBQXNCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQXdCLENBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sUUFBUSxDQUFDLGlCQUFpQixLQUFLLFlBQVksQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFDMUIsWUFBWSxFQUNaLElBQUksRUFDSixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixhQUFhLEVBQ2IsSUFBSSxFQUNKLFFBQVEsR0FVVDtRQUNDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sUUFBUSxHQUFHLElBQUksd0JBQXdCLENBQzNDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQ2hCLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxHQUFHLE1BQU0sSUFBSSxRQUFRLElBQUksYUFBYSxlQUFlLENBQUM7UUFDM0UsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLEtBQUssR0FBRyxDQUFDO1FBRWxELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztZQUN6RCxJQUFJLEVBQUUsWUFBWTtZQUNsQixJQUFJLEVBQUUsMkJBQTJCO1NBQ2xDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FDOUMsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWjtZQUNFLFFBQVEsRUFBRSxZQUFZLENBQUMsZUFBZTtZQUN0QyxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDeEQsd0JBQXdCLEVBQUUsSUFBSTtnQkFDOUIscUJBQXFCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDbEUsdUJBQXVCLEVBQUUsSUFBSTtnQkFDN0IsR0FBRyxFQUFFO29CQUNILE1BQU0sRUFBRSxHQUFHO29CQUNYLElBQUksRUFBRSxVQUFVO2lCQUNqQjtnQkFDRCx5QkFBeUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxRQUFRO2FBQ1Q7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLEdBQUcsSUFBSTthQUNSO1NBQ0YsQ0FDRixDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FDVixtRUFBbUUsRUFDbkUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FDbEQsQ0FBQztRQUVGLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxFQUM3QixNQUFNLEVBQ04scUJBQXFCLEdBSXRCO1FBQ0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFL0QsT0FBTyxHQUFHLFFBQVEsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCx5QkFBeUIsQ0FDdkIsS0FBYSxFQUNiLFdBQW1CLEVBQ25CLGdCQUF3QjtRQUV4QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO2FBQzlCLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxXQUFXLElBQUksZ0JBQWdCLEVBQUUsQ0FBQzthQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakIsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQzNELEVBQUUsRUFDRixFQUFFLENBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCwrQkFBK0IsQ0FDN0IsY0FBc0IsRUFDdEIsZ0JBQXdCO1FBRXhCLE9BQU8sa0JBQWtCLGNBQWMsc0RBQXNELGdCQUFnQixFQUFFLENBQUM7SUFDbEgsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUI7UUFDM0IsMEVBQTBFO1FBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUIsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxDQUFDO29CQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQ25ELHNDQUFzQyxDQUN2QyxDQUFDO29CQUNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxDQUNGLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLEVBQ3hELElBQUksQ0FDTCxDQUFDO3dCQUNGLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxLQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsMEJBQTBCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUUzQixrRUFBa0U7UUFDbEUsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLElBQUksUUFBUSxHQUF1QixtQ0FBbUMsQ0FBQztRQUV2RSxPQUFPLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxRCxNQUFNLFFBQVEsR0FBRyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkUsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxjQUFzQjtRQUM3QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQXdCLENBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBRUYsTUFBTSxDQUFDLElBQUksQ0FDVCx5RUFBeUUsRUFDekUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FDbEUsQ0FBQztRQUVGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUN0RCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLENBQUMsSUFBSSxDQUNULG9FQUFvRSxFQUNwRSxFQUFFLGNBQWMsRUFBRSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxFQUN6QyxjQUFjLEVBQ2QsTUFBTSxFQUNOLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixRQUFRLEdBU1Q7UUFDQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV6QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCO2dCQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLGVBQWU7Z0JBQzNCLFdBQVcsRUFBRSxnQkFBZ0I7YUFDOUIsQ0FBQztZQUNGLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsZUFBZSxFQUFFLHFCQUFxQjtnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixXQUFXLEVBQUUsUUFBUTthQUN0QixDQUFDO1lBQ0YsYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCO2dCQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLHFCQUFxQjtnQkFDakMsV0FBVyxFQUFFLGNBQWM7YUFDNUIsQ0FBQztZQUNGLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsZUFBZSxFQUFFLHFCQUFxQjtnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixXQUFXLEVBQUUsb0JBQW9CLENBQUMsRUFBRTthQUNyQyxDQUFDO1lBQ0YsYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCO2dCQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsV0FBVyxFQUFFLG9CQUFvQixDQUFDLFFBQVE7YUFDM0MsQ0FBQztZQUNGLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsZUFBZSxFQUFFLHFCQUFxQjtnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSx3QkFBd0I7Z0JBQ3BDLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxjQUFjO2FBQ2pELENBQUM7WUFDRixhQUFhLENBQUMsK0JBQStCLENBQUM7Z0JBQzVDLGVBQWUsRUFBRSxxQkFBcUI7Z0JBQ3RDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixVQUFVLEVBQUUsWUFBWTtnQkFDeEIsV0FBVyxFQUFFLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7YUFDaEQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxLQUFLLENBQUMsc0RBQXNELEVBQUU7WUFDbkUsZUFBZSxFQUFFLHFCQUFxQjtZQUN0QyxjQUFjLEVBQUUsY0FBYztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEVBQzNCLGNBQWMsRUFDZCxZQUFZLEVBQ1osb0JBQW9CLEdBS3JCO1FBQ0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUM7WUFDdkMsY0FBYztZQUNkLFlBQVk7U0FDYixDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FDbkMsV0FBVyxZQUFZLG1CQUFtQixFQUMxQyxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1FBRUYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLFlBQVksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxTQUFTLENBQ3BCLG1DQUFtQyxFQUNuQyxvQkFBb0IsQ0FBQyxjQUFjLENBQ3BDO1lBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FDcEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDbkM7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsS0FBSyxDQUNWLDhFQUE4RSxFQUM5RSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQ2pELENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQ2xDLGNBQWMsRUFDZCxZQUFZLEdBSWI7UUFDQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxHQUFHLFlBQVksa0JBQWtCLENBQUM7UUFFbkQsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksMkJBQTJCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUNFLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU87b0JBQ2hELE9BQU8sS0FBSywyQkFBMkIsRUFDdkMsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHVCQUF1QixRQUFRLHFCQUFxQixFQUNwRCxFQUFFLEtBQUssRUFBRSxDQUNWLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUNWLGlHQUFpRyxFQUNqRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQzdDLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVG9rZW5DcmVkZW50aWFsIH0gZnJvbSBcIkBhenVyZS9pZGVudGl0eVwiO1xuXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWF1dGhvcml6YXRpb25cIjtcbmltcG9ydCB7IEtleVZhdWx0TWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWtleXZhdWx0XCI7XG5pbXBvcnQgeyBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tbXNpXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYXBoQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VncmFwaFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25DbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1yZXNvdXJjZXMtc3Vic2NyaXB0aW9uc1wiO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1zdG9yYWdlXCI7XG5pbXBvcnQgeyBTZWNyZXRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2tleXZhdWx0LXNlY3JldHNcIjtcbmltcG9ydCB7IEJsb2JTZXJ2aWNlQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9zdG9yYWdlLWJsb2JcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQG1pY3Jvc29mdC9taWNyb3NvZnQtZ3JhcGgtY2xpZW50XCI7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbG9va3VwIH0gZnJvbSBcIm5vZGU6ZG5zL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSBcIm5vZGU6dGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuXG5pbXBvcnQge1xuICBDbG91ZEFjY291bnQsXG4gIHR5cGUgQ2xvdWRBY2NvdW50U2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9jbG91ZC1hY2NvdW50LmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudmlyb25tZW50SWQsXG4gIGVudmlyb25tZW50U2hvcnQsXG59IGZyb20gXCIuLi8uLi9kb21haW4vZW52aXJvbm1lbnQuanNcIjtcbmltcG9ydCB7IHR5cGUgR2l0SHViUmVwbyB9IGZyb20gXCIuLi8uLi9kb21haW4vZ2l0aHViLXJlcG8uanNcIjtcbmltcG9ydCB7XG4gIEdpdEh1YkFwcENyZWRlbnRpYWxzLFxuICB0eXBlIEdpdEh1YlNlcnZpY2UsXG59IGZyb20gXCIuLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlcnJhZm9ybUJhY2tlbmQsXG4gIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEsXG59IGZyb20gXCIuLi8uLi9kb21haW4vcmVtb3RlLWJhY2tlbmQuanNcIjtcbmltcG9ydCB7IGlzQXp1cmVMb2NhdGlvbiwgbG9jYXRpb25zLCBsb2NhdGlvblNob3J0IH0gZnJvbSBcIi4vbG9jYXRpb25zLmpzXCI7XG5cbi8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlc2UgcHJvcGVydGllcyBmb3Igbm93O1xuLy8gdGhlIGFjdHVhbCByZXN1bHQgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmdWxsIGNsb3VkIHJlc291cmNlIG9iamVjdFxuZXhwb3J0IGNvbnN0IHJlc291cmNlR3JhcGhEYXRhU2NoZW1hID0gei5vYmplY3Qoe1xuICBsb2NhdGlvbjogei5lbnVtKGxvY2F0aW9ucyksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHJlc291cmNlR3JvdXA6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxufSk7XG5cbmNvbnN0IGdyYXBoR3JvdXBNZW1iZXJzaGlwSXRlbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhHcm91cE1lbWJlcnNoaXBSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgXCJAb2RhdGEubmV4dExpbmtcIjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB2YWx1ZTogei5hcnJheShncmFwaEdyb3VwTWVtYmVyc2hpcEl0ZW1TY2hlbWEpLFxufSk7XG5cbmNvbnN0IGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcyA9IHtcbiAgY29udHJpYnV0b3I6IFwiYjI0OTg4YWMtNjE4MC00MmEwLWFiODgtMjBmNzM4MmRkMjRjXCIsXG4gIGtleVZhdWx0U2VjcmV0c09mZmljZXI6IFwiYjg2YThmZTQtNDRjZS00OTQ4LWFlZTUtZWNjYjJjMTU1Y2Q3XCIsXG4gIG93bmVyOiBcIjhlM2FmNjU3LWE4ZmYtNDQzYy1hNzVjLTJmZThjNGJjYjYzNVwiLFxuICByb2xlQmFzZWRBY2Nlc3NDb250cm9sQWRtaW5pc3RyYXRvcjogXCJmNTgzMTBkOS1hOWY2LTQzOWEtOWU4ZC1mNjJlN2I0MWExNjhcIixcbiAgc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3I6IFwiYmE5MmY1YjQtMmQxMS00NTNkLWE0MDMtZTk2YjAwMjljOWZlXCIsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBib290c3RyYXBJZGVudGl0eVJvbGVEZWZpbml0aW9uSWRzID0gW1xuICAvLyBUaGVzZSByb2xlcyBsZXQgdGhlIGJvb3RzdHJhcCBpZGVudGl0eSBydW4gdGhlIGJvb3RzdHJhcHBlciBtb2R1bGUgZnJvbSBHaXRIdWIgQWN0aW9ucyB3aXRob3V0IGV4dHJhIG1hbnVhbCBncmFudHMuXG4gIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5yb2xlQmFzZWRBY2Nlc3NDb250cm9sQWRtaW5pc3RyYXRvcixcbiAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLmNvbnRyaWJ1dG9yLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3IsXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBrZXlWYXVsdERuc0Vycm9yU2NoZW1hID0gei5vYmplY3Qoe1xuICBjb2RlOiB6LmVudW0oW1wiRUFJX0FHQUlOXCIsIFwiRU5PVEZPVU5EXCJdKSxcbn0pO1xuY29uc3Qga2V5VmF1bHREbnNSZWFkeU1heEF0dGVtcHRzID0gMzA7XG5jb25zdCBrZXlWYXVsdERuc1JlYWR5UmV0cnlEZWxheU1zID0gMTBfMDAwO1xuXG5leHBvcnQgY2xhc3MgQXp1cmVDbG91ZEFjY291bnRTZXJ2aWNlIGltcGxlbWVudHMgQ2xvdWRBY2NvdW50U2VydmljZSB7XG4gICNjcmVkZW50aWFsOiBUb2tlbkNyZWRlbnRpYWw7XG4gICNyZXF1aXJlZFJlc291cmNlUHJvdmlkZXJzID0gW1xuICAgIFwiTWljcm9zb2Z0LkFkdmlzb3JcIixcbiAgICBcIk1pY3Jvc29mdC5BbGVydHNNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuQXBpTWFuYWdlbWVudFwiLFxuICAgIFwiTWljcm9zb2Z0LkFwcFwiLFxuICAgIFwiTWljcm9zb2Z0LkF1dGhvcml6YXRpb25cIixcbiAgICBcIk1pY3Jvc29mdC5BenVyZVRlcnJhZm9ybVwiLFxuICAgIFwiTWljcm9zb2Z0LkNhY2hlXCIsXG4gICAgXCJNaWNyb3NvZnQuQ2RuXCIsXG4gICAgXCJNaWNyb3NvZnQuQ29udGFpbmVySW5zdGFuY2VcIixcbiAgICBcIk1pY3Jvc29mdC5Db3N0TWFuYWdlbWVudFwiLFxuICAgIFwiTWljcm9zb2Z0LkRCZm9yUG9zdGdyZVNRTFwiLFxuICAgIFwiTWljcm9zb2Z0LktleVZhdWx0XCIsXG4gICAgXCJNaWNyb3NvZnQuU2VydmljZUJ1c1wiLFxuICAgIFwiTWljcm9zb2Z0LlNxbFwiLFxuICAgIFwiTWljcm9zb2Z0LlN0b3JhZ2VcIixcbiAgICBcIk1pY3Jvc29mdC5XZWJcIixcbiAgXSBhcyBjb25zdDtcbiAgI3Jlc291cmNlR3JhcGhDbGllbnQ6IFJlc291cmNlR3JhcGhDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY3JlZGVudGlhbDogVG9rZW5DcmVkZW50aWFsKSB7XG4gICAgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudCA9IG5ldyBSZXNvdXJjZUdyYXBoQ2xpZW50KGNyZWRlbnRpYWwpO1xuICAgIHRoaXMuI2NyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGVycmFmb3JtQmFja2VuZChcbiAgICBjbG91ZEFjY291bnRJZDogQ2xvdWRBY2NvdW50W1wiaWRcIl0sXG4gICAgeyBuYW1lLCBwcmVmaXggfTogRW52aXJvbm1lbnRJZCxcbiAgKTogUHJvbWlzZTxUZXJyYWZvcm1CYWNrZW5kIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYWxsTG9jYXRpb25zID0gT2JqZWN0LnZhbHVlcyhsb2NhdGlvblNob3J0KS5qb2luKFwifFwiKTtcbiAgICBjb25zdCBzaG9ydEVudiA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG4gICAgLy8gQ2hlY2sgaWYgYSBzdG9yYWdlIGFjY291bnQgd2l0aCB0aGUgZXhwZWN0ZWQgbmFtZSBleGlzdHNcbiAgICAvLyAkcHJlZml4ICsgZW52aXJvbm1lbnQgc2hvcnQgKyBsb2NhdGlvbiArIFwidGZzdGF0ZXN0XCIgKyBzdWZmaXggKGUuZy4sIFwiZHhwaXRudGZzdGF0ZXN0MDFcIilcbiAgICAvLyBpdCBjYW4gcmV0dXJuIG11bHRpcGxlIHJlc3VsdHMgKGUuZy4gZm9yIGRpZmZlcmVudCBsb2NhdGlvbiBvciBpbnN0YW5jZSBudW1iZXIpXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fSR7c2hvcnRFbnZ9KCR7YWxsTG9jYXRpb25zfSl0ZnN0YXRlc3QoMFsxLTldfFsxLTldXFxcXGQpYDtcbiAgICBjb25zdCBxdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5zdG9yYWdlL3N0b3JhZ2VhY2NvdW50cydcbiAgICAgICAgICAgICB8IHdoZXJlIG5hbWUgbWF0Y2hlcyByZWdleCBAJyR7cmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudC5yZXNvdXJjZXMoe1xuICAgICAgcXVlcnksXG4gICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQudG90YWxSZWNvcmRzID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdG9yYWdlQWNjb3VudHMgPSB6LmFycmF5KHJlc291cmNlR3JhcGhEYXRhU2NoZW1hKS5wYXJzZShyZXN1bHQuZGF0YSk7XG4gICAgLy8gb24gbXVsdGlwbGUgcmVzdWx0cywgcmFuayBzdG9yYWdlIGFjY291bnRzIGJ5IGxvY2F0aW9uIHByaW9yaXR5IGFuZCBpbnN0YW5jZSBudW1iZXJcbiAgICBpZiAoc3RvcmFnZUFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0b3JhZ2VBY2NvdW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIGNvbXBhcmUgbG9jYXRpb25zIHByaW9yaXR5XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQ29tcGFyaXNvbiA9XG4gICAgICAgICAgbG9jYXRpb25zLmluZGV4T2YoYS5sb2NhdGlvbikgLSBsb2NhdGlvbnMuaW5kZXhPZihiLmxvY2F0aW9uKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uQ29tcGFyaXNvbiA9PT0gMCkge1xuICAgICAgICAgIC8vIHNhbWUgbG9jYXRpb24sIGNvbXBhcmUgYnkgbmFtZSAodG8gZ2V0IHRoZSBoaWdoZXN0IGluc3RhbmNlIG51bWJlcilcbiAgICAgICAgICByZXR1cm4gYi5uYW1lLmxvY2FsZUNvbXBhcmUoYS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYXRpb25Db21wYXJpc29uO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXJyYWZvcm1CYWNrZW5kU2NoZW1hLnBhcnNlKHtcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdG9yYWdlQWNjb3VudHNbMF0ucmVzb3VyY2VHcm91cCxcbiAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnRzWzBdLm5hbWUsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQsXG4gICAgICB0eXBlOiBcImF6dXJlcm1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGhhc1VzZXJQZXJtaXNzaW9uVG9Jbml0aWFsaXplKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFsbCBwcmluY2lwYWwgSURzIHRvIGNoZWNrICh1c2VyICsgYWxsIGdyb3VwcylcbiAgICAgIGNvbnN0IGFsbFByaW5jaXBhbElkcyA9IGF3YWl0IHRoaXMuI2dldEN1cnJlbnRQcmluY2lwYWxJZHMoKTtcblxuICAgICAgLy8gR2V0IHJvbGUgYXNzaWdubWVudHMgZm9yIHRoZSBzdWJzY3JpcHRpb25cbiAgICAgIGNvbnN0IGF1dGhDbGllbnQgPSBuZXcgQXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQoXG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICAgIGNsb3VkQWNjb3VudElkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IFtcbiAgICAgICAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLm93bmVyLCAvLyBPd25lclxuICAgICAgICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3IsIC8vIFN0b3JhZ2UgQmxvYiBEYXRhIENvbnRyaWJ1dG9yXG4gICAgICAgIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5rZXlWYXVsdFNlY3JldHNPZmZpY2VyLCAvLyBLZXkgVmF1bHQgU2VjcmV0cyBPZmZpY2VyXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBzY29wZSA9IGAvc3Vic2NyaXB0aW9ucy8ke2Nsb3VkQWNjb3VudElkfWA7XG5cbiAgICAgIC8vIENvbGxlY3QgYWxsIHJvbGUgZGVmaW5pdGlvbiBJRHMgYXNzaWduZWQgdG8gdGhlIHVzZXIgb3IgdGhlaXIgZ3JvdXBzXG4gICAgICBjb25zdCBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgYXNzaWdubWVudCBvZiBhdXRoQ2xpZW50LnJvbGVBc3NpZ25tZW50cy5saXN0Rm9yU2NvcGUoXG4gICAgICAgIHNjb3BlLFxuICAgICAgKSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGFzc2lnbm1lbnQgaXMgZm9yIHRoZSB1c2VyIG9yIGFueSBvZiB0aGVpciBncm91cHNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFzc2lnbm1lbnQucHJpbmNpcGFsSWQgJiZcbiAgICAgICAgICBhbGxQcmluY2lwYWxJZHMuaGFzKGFzc2lnbm1lbnQucHJpbmNpcGFsSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEV4dHJhY3Qgcm9sZSBkZWZpbml0aW9uIElEIGZyb20gdGhlIGZ1bGwgcmVzb3VyY2UgSURcbiAgICAgICAgICAvLyBGb3JtYXQ6IC9zdWJzY3JpcHRpb25zL3tzdWJ9L3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMve3JvbGVJZH1cbiAgICAgICAgICBjb25zdCByb2xlRGVmSWQgPSBhc3NpZ25tZW50LnJvbGVEZWZpbml0aW9uSWQ/LnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICAgICAgICBpZiAocm9sZURlZklkKSB7XG4gICAgICAgICAgICBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzLmFkZChyb2xlRGVmSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3J0LWNpcmN1aXQ6IHN0b3AgaWYgYWxsIHJlcXVpcmVkIHJvbGVzIGhhdmUgYmVlbiBmb3VuZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRSb2xlcy5ldmVyeSgocmVxdWlyZWRSb2xlKSA9PlxuICAgICAgICAgICAgYXNzaWduZWRSb2xlRGVmaW5pdGlvbklkcy5oYXMocmVxdWlyZWRSb2xlKSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCByb2xlcyBhcmUgcHJlc2VudFxuICAgICAgY29uc3QgaGFzQWxsUm9sZXMgPSByZXF1aXJlZFJvbGVzLmV2ZXJ5KChyZXF1aXJlZFJvbGUpID0+XG4gICAgICAgIGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMuaGFzKHJlcXVpcmVkUm9sZSksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gaGFzQWxsUm9sZXM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIEhhbmRsZSBhdXRob3JpemF0aW9uIGVycm9ycyAoNDAzIEZvcmJpZGRlbikgLSB1c2VyIGxhY2tzIHBlcm1pc3Npb25zXG4gICAgICBpZiAoXG4gICAgICAgIGVycm9yICYmXG4gICAgICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInN0YXR1c0NvZGVcIiBpbiBlcnJvciAmJlxuICAgICAgICBlcnJvci5zdGF0dXNDb2RlID09PSA0MDNcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoXG4gICAgY2xvdWRBY2NvdW50OiBDbG91ZEFjY291bnQsXG4gICAgeyBuYW1lLCBwcmVmaXggfTogRW52aXJvbm1lbnRJZCxcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHMsXG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvLFxuICAgIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2UsXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnQuZXF1YWwoY2xvdWRBY2NvdW50LmNzcCwgXCJhenVyZVwiLCBcIkNsb3VkIGFjY291bnQgbXVzdCBiZSBBenVyZVwiKTtcbiAgICBhc3NlcnQub2soXG4gICAgICBpc0F6dXJlTG9jYXRpb24oY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbiksXG4gICAgICBcIlRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBjbG91ZCBhY2NvdW50IGlzIG5vdCBhIHZhbGlkIEF6dXJlIGxvY2F0aW9uXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgLy8gUmVnaXN0ZXIgcmVxdWlyZWQgcmVzb3VyY2UgcHJvdmlkZXJzIGJlZm9yZSBjcmVhdGluZyBhbnkgcmVzb3VyY2VzXG4gICAgYXdhaXQgdGhpcy4jcmVnaXN0ZXJQcm92aWRlcnMoY2xvdWRBY2NvdW50LmlkKTtcblxuICAgIGNvbnN0IHJlc291cmNlTWFuYWdlbWVudENsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzaG9ydCA9IHtcbiAgICAgIGVudjogZW52aXJvbm1lbnRTaG9ydFtuYW1lXSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblNob3J0W2Nsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb25dLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LWNvbW1vbi1yZy0wMWA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgbG9jYXRpb246IGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIENyZWF0ZWRCeTogXCJEWCBDTElcIixcbiAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgIC4uLnRhZ3MsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCByZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQucmVzb3VyY2VHcm91cHMuY3JlYXRlT3JVcGRhdGUoXG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCByZXNvdXJjZSBncm91cCB7cmVzb3VyY2VHcm91cE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IHJlc291cmNlR3JvdXBOYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkIH0sXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpZGVudGl0eU5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnQuZW52fS0ke3Nob3J0LmxvY2F0aW9ufS1ib290c3RyYXAtaWQtMDFgO1xuXG4gICAgICBjb25zdCBtc2lDbGllbnQgPSBuZXcgTWFuYWdlZFNlcnZpY2VJZGVudGl0eUNsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBtc2lDbGllbnQudXNlckFzc2lnbmVkSWRlbnRpdGllcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5vayhcbiAgICAgICAgaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICAgIFwiTWFuYWdlZCBpZGVudGl0eSBwcmluY2lwYWwgSUQgaXMgdW5kZWZpbmVkXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgaWRlbnRpdHlQcmluY2lwYWxJZCA9IGlkZW50aXR5LnByaW5jaXBhbElkO1xuICAgICAgYXNzZXJ0Lm9rKGlkZW50aXR5LmNsaWVudElkLCBcIk1hbmFnZWQgaWRlbnRpdHkgY2xpZW50IElEIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGNvbnN0IGlkZW50aXR5Q2xpZW50SWQgPSBpZGVudGl0eS5jbGllbnRJZDtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBcIkNyZWF0ZWQgaWRlbnRpdHkge2lkZW50aXR5TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgICAgeyBpZGVudGl0eU5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50ID0gbmV3IEF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgICApO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uQ2xpZW50ID0gbmV3IFN1YnNjcmlwdGlvbkNsaWVudCh0aGlzLiNjcmVkZW50aWFsKTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGF3YWl0IHN1YnNjcmlwdGlvbkNsaWVudC5zdWJzY3JpcHRpb25zLmdldChcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcbiAgICAgIGFzc2VydC5vayhzdWJzY3JpcHRpb24udGVuYW50SWQsIFwiU3Vic2NyaXB0aW9uIHRlbmFudCBJRCBpcyB1bmRlZmluZWRcIik7XG4gICAgICBjb25zdCB0ZW5hbnRJZCA9IHN1YnNjcmlwdGlvbi50ZW5hbnRJZDtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvblNjb3BlID0gYC9zdWJzY3JpcHRpb25zLyR7Y2xvdWRBY2NvdW50LmlkfWA7XG5cbiAgICAgIC8vIEdyYW50IHRoZSBib290c3RyYXAgaWRlbnRpdHkgdGhlIEF6dXJlIHBlcm1pc3Npb25zIGl0IG5lZWRzIHRvIG9wZXJhdGUgYXV0b25vbW91c2x5IGluIHRoZSBib290c3RyYXAgd29ya2Zsb3cuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlSb2xlRGVmaW5pdGlvbklkcy5tYXAoKHJvbGVEZWZpbml0aW9uSWQpID0+XG4gICAgICAgICAgYXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQucm9sZUFzc2lnbm1lbnRzLmNyZWF0ZShcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvblNjb3BlLFxuICAgICAgICAgICAgdGhpcy4jY3JlYXRlUm9sZUFzc2lnbm1lbnROYW1lKFxuICAgICAgICAgICAgICBzdWJzY3JpcHRpb25TY29wZSxcbiAgICAgICAgICAgICAgaWRlbnRpdHlQcmluY2lwYWxJZCxcbiAgICAgICAgICAgICAgcm9sZURlZmluaXRpb25JZCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHByaW5jaXBhbElkOiBpZGVudGl0eVByaW5jaXBhbElkLFxuICAgICAgICAgICAgICBwcmluY2lwYWxUeXBlOiBcIlNlcnZpY2VQcmluY2lwYWxcIixcbiAgICAgICAgICAgICAgcm9sZURlZmluaXRpb25JZDogdGhpcy4jY3JlYXRlUm9sZURlZmluaXRpb25SZXNvdXJjZUlkKFxuICAgICAgICAgICAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgICAgICAgICByb2xlRGVmaW5pdGlvbklkLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBcIkFzc2lnbmVkIGJvb3RzdHJhcCByb2xlcyB0byBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICB7IGlkZW50aXR5TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZ2l0aHViRW52aXJvbm1lbnROYW1lID0gYGJvb3RzdHJhcHBlci0ke25hbWV9LWNkYDtcbiAgICAgIGNvbnN0IGZlZGVyYXRlZENyZWRlbnRpYWxOYW1lID0gdGhpcy4jY3JlYXRlRmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUoe1xuICAgICAgICBnaXRodWIsXG4gICAgICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbmNsdWRlIGEgcmVwb3NpdG9yeS1kZXJpdmVkIHN1ZmZpeCBzbyBkaWZmZXJlbnQgcmVwb3NpdG9yaWVzIGNhbiBzaGFyZVxuICAgICAgLy8gdGhlIHNhbWUgYm9vdHN0cmFwIGlkZW50aXR5IHdpdGhvdXQgb3ZlcndyaXRpbmcgZWFjaCBvdGhlcidzIE9JREMgdHJ1c3QuXG4gICAgICBhd2FpdCBtc2lDbGllbnQuZmVkZXJhdGVkSWRlbnRpdHlDcmVkZW50aWFscy5jcmVhdGVPclVwZGF0ZShcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgZmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICBhdWRpZW5jZXM6IFtcImFwaTovL0F6dXJlQURUb2tlbkV4Y2hhbmdlXCJdLFxuICAgICAgICAgIGlzc3VlcjogXCJodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tXCIsXG4gICAgICAgICAgc3ViamVjdDogYHJlcG86JHtnaXRodWIub3duZXJ9LyR7Z2l0aHViLnJlcG99OmVudmlyb25tZW50OiR7Z2l0aHViRW52aXJvbm1lbnROYW1lfWAsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiQ29uZmlndXJlZCBmZWRlcmF0ZWQgaWRlbnRpdHkgY3JlZGVudGlhbCB7Y3JlZGVudGlhbE5hbWV9IGZvciBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY3JlZGVudGlhbE5hbWU6IGZlZGVyYXRlZENyZWRlbnRpYWxOYW1lLFxuICAgICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgdGhpcy4jc3RvcmVCb290c3RyYXBwZXJFbnZpcm9ubWVudFNlY3JldHMoe1xuICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICBnaXRodWIsXG4gICAgICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgZ2l0SHViU2VydmljZSxcbiAgICAgICAgaWRlbnRpdHlDbGllbnRJZCxcbiAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMsXG4gICAgICAgIHRlbmFudElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGtleVZhdWx0TmFtZSA9IGF3YWl0IHRoaXMuI2NyZWF0ZUNvbW1vbktleVZhdWx0KHtcbiAgICAgICAgY2xvdWRBY2NvdW50LFxuICAgICAgICBuYW1lLFxuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBzaG9ydEVudjogc2hvcnQuZW52LFxuICAgICAgICBzaG9ydExvY2F0aW9uOiBzaG9ydC5sb2NhdGlvbixcbiAgICAgICAgdGFncyxcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy4jc3RvcmVSdW5uZXJBcHBTZWNyZXRzKHtcbiAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAga2V5VmF1bHROYW1lLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAvLyBDbGVhbnVwIHJlc291cmNlIGdyb3VwIGlmIGluaXRpYWxpemF0aW9uIGZhaWxzXG4gICAgICBhd2FpdCByZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQucmVzb3VyY2VHcm91cHMuYmVnaW5EZWxldGVBbmRXYWl0KFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiRGVsZXRlZCByZXNvdXJjZSBncm91cCB7cmVzb3VyY2VHcm91cE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9IGR1ZSB0byBpbml0aWFsaXphdGlvbiBmYWlsdXJlXCIsXG4gICAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICAgICk7XG4gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoY2F1c2UubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsb3VkIGFjY291bnRgLCB7XG4gICAgICAgIGNhdXNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNJbml0aWFsaXplZChcbiAgICBjbG91ZEFjY291bnRJZDogQ2xvdWRBY2NvdW50W1wiaWRcIl0sXG4gICAgeyBuYW1lLCBwcmVmaXggfTogRW52aXJvbm1lbnRJZCxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYWxsTG9jYXRpb25zID0gT2JqZWN0LnZhbHVlcyhsb2NhdGlvblNob3J0KS5qb2luKFwifFwiKTtcbiAgICBjb25zdCBzaG9ydEVudiA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCBpZGVudGl0eVJlc291cmNlTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydEVudn0tKCR7YWxsTG9jYXRpb25zfSktYm9vdHN0cmFwLWlkLSgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IGlkZW50aXR5UXVlcnkgPSBgcmVzb3VyY2VzXG4gICAgICAgICAgICAgfCB3aGVyZSB0eXBlID09ICdtaWNyb3NvZnQubWFuYWdlZGlkZW50aXR5L3VzZXJhc3NpZ25lZGlkZW50aXRpZXMnXG4gICAgICAgICAgICAgfCB3aGVyZSBuYW1lIG1hdGNoZXMgcmVnZXggQCcke2lkZW50aXR5UmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG5cbiAgICBjb25zdCBrZXlWYXVsdFJlc291cmNlTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydEVudn0tKCR7YWxsTG9jYXRpb25zfSktY29tbW9uLWt2LSgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IGtleVZhdWx0UXVlcnkgPSBgcmVzb3VyY2VzXG4gICAgICAgICAgICAgfCB3aGVyZSB0eXBlID09ICdtaWNyb3NvZnQua2V5dmF1bHQvdmF1bHRzJ1xuICAgICAgICAgICAgIHwgd2hlcmUgbmFtZSBtYXRjaGVzIHJlZ2V4IEAnJHtrZXlWYXVsdFJlc291cmNlTmFtZX0nXG4gICAgICAgICAgICBgO1xuXG4gICAgY29uc3QgW2lkZW50aXR5UmVzdWx0LCBrZXlWYXVsdFJlc3VsdCwgYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZF0gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50LnJlc291cmNlcyh7XG4gICAgICAgICAgcXVlcnk6IGlkZW50aXR5UXVlcnksXG4gICAgICAgICAgc3Vic2NyaXB0aW9uczogW2Nsb3VkQWNjb3VudElkXSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMuI3Jlc291cmNlR3JhcGhDbGllbnQucmVzb3VyY2VzKHtcbiAgICAgICAgICBxdWVyeToga2V5VmF1bHRRdWVyeSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4jYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZChjbG91ZEFjY291bnRJZCksXG4gICAgICBdKTtcblxuICAgIGNvbnN0IGluaXRpYWxpemVkID1cbiAgICAgIGlkZW50aXR5UmVzdWx0LnRvdGFsUmVjb3JkcyA+IDAgJiZcbiAgICAgIGtleVZhdWx0UmVzdWx0LnRvdGFsUmVjb3JkcyA+IDAgJiZcbiAgICAgIGFyZVByb3ZpZGVyc1JlZ2lzdGVyZWQ7XG5cbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcInN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9IGluaXRpYWxpemVkOiB7aW5pdGlhbGl6ZWR9XCIsIHtcbiAgICAgIGluaXRpYWxpemVkLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluaXRpYWxpemVkO1xuICB9XG5cbiAgYXN5bmMgcHJvdmlzaW9uVGVycmFmb3JtQmFja2VuZChcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudCxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICAgIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgKTogUHJvbWlzZTxUZXJyYWZvcm1CYWNrZW5kPiB7XG4gICAgYXNzZXJ0LmVxdWFsKGNsb3VkQWNjb3VudC5jc3AsIFwiYXp1cmVcIiwgXCJDbG91ZCBhY2NvdW50IG11c3QgYmUgQXp1cmVcIik7XG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgaXNBenVyZUxvY2F0aW9uKGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24pLFxuICAgICAgXCJUaGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgY2xvdWQgYWNjb3VudCBpcyBub3QgYSB2YWxpZCBBenVyZSBsb2NhdGlvblwiLFxuICAgICk7XG5cbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGNvbnN0IHJlc291cmNlTWFuYWdlbWVudENsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzaG9ydCA9IHtcbiAgICAgIGVudjogZW52aXJvbm1lbnRTaG9ydFtuYW1lXSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblNob3J0W2Nsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb25dLFxuICAgIH07XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgbG9jYXRpb246IGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIEVudmlyb25tZW50OiBuYW1lLFxuICAgICAgICAuLi50YWdzLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzb3VyY2VHcm91cE5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnQuZW52fS0ke3Nob3J0LmxvY2F0aW9ufS10ZnN0YXRlLXJnLTAxYDtcblxuICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RvcmFnZU1hbmFnZW1lbnRDbGllbnQgPSBuZXcgU3RvcmFnZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdG9yYWdlQWNjb3VudCA9XG4gICAgICBhd2FpdCBzdG9yYWdlTWFuYWdlbWVudENsaWVudC5zdG9yYWdlQWNjb3VudHMuYmVnaW5DcmVhdGVBbmRXYWl0KFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICAgYCR7cHJlZml4fSR7c2hvcnQuZW52fSR7c2hvcnQubG9jYXRpb259dGZzdGF0ZXN0MDFgLFxuICAgICAgICB7XG4gICAgICAgICAga2luZDogXCJTdG9yYWdlVjJcIixcbiAgICAgICAgICBza3U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RhbmRhcmRfTFJTXCIsXG4gICAgICAgICAgICB0aWVyOiBcIlN0YW5kYXJkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgIGFzc2VydC5vayhcbiAgICAgIHN0b3JhZ2VBY2NvdW50LnByaW1hcnlFbmRwb2ludHM/LmJsb2IsXG4gICAgICBcIlN0b3JhZ2UgYWNjb3VudCBibG9iIGVuZHBvaW50IGlzIHVuZGVmaW5lZFwiLFxuICAgICk7XG5cbiAgICBhc3NlcnQub2soc3RvcmFnZUFjY291bnQubmFtZSwgXCJTdG9yYWdlIGFjY291bnQgbmFtZSBpcyB1bmRlZmluZWRcIik7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgc3RvcmFnZSBhY2NvdW50IHtzdG9yYWdlQWNjb3VudE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7XG4gICAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBibG9iU2VydmljZUNsaWVudCA9IG5ldyBCbG9iU2VydmljZUNsaWVudChcbiAgICAgIHN0b3JhZ2VBY2NvdW50LnByaW1hcnlFbmRwb2ludHM/LmJsb2IsXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICk7XG5cbiAgICBjb25zdCBjb250YWluZXJDbGllbnQgPVxuICAgICAgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwidGVycmFmb3JtLXN0YXRlXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbnRhaW5lckNsaWVudC5jcmVhdGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBDbGVhbnVwIHJlc291cmNlIGdyb3VwIGlmIGJsb2IgY29udGFpbmVyIGNyZWF0aW9uIGZhaWxzXG4gICAgICAvLyByZXNvdXJjZSBncm91cCBkZWxldGlvbiBhbHNvIGRlbGV0ZXMgYWxsIGNvbnRhaW5lZCByZXNvdXJjZXNcbiAgICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5iZWdpbkRlbGV0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgYmxvYiBjb250YWluZXJgLCB7XG4gICAgICAgIGNhdXNlOiBlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEucGFyc2Uoe1xuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBzdG9yYWdlQWNjb3VudE5hbWU6IHN0b3JhZ2VBY2NvdW50Lm5hbWUsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgdHlwZTogXCJhenVyZXJtXCIsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyAjYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZChzdWJzY3JpcHRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMubWFwKGFzeW5jIChuYW1lc3BhY2UpID0+IHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBhd2FpdCBjbGllbnQucHJvdmlkZXJzLmdldChuYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gcHJvdmlkZXIucmVnaXN0cmF0aW9uU3RhdGUgPT09IFwiUmVnaXN0ZXJlZFwiO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeShCb29sZWFuKTtcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVDb21tb25LZXlWYXVsdCh7XG4gICAgY2xvdWRBY2NvdW50LFxuICAgIG5hbWUsXG4gICAgcHJlZml4LFxuICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgIHNob3J0RW52LFxuICAgIHNob3J0TG9jYXRpb24sXG4gICAgdGFncyxcbiAgICB0ZW5hbnRJZCxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudDogQ2xvdWRBY2NvdW50O1xuICAgIG5hbWU6IEVudmlyb25tZW50SWRbXCJuYW1lXCJdO1xuICAgIHByZWZpeDogc3RyaW5nO1xuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmc7XG4gICAgc2hvcnRFbnY6IHN0cmluZztcbiAgICBzaG9ydExvY2F0aW9uOiBzdHJpbmc7XG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGNvbnN0IGt2Q2xpZW50ID0gbmV3IEtleVZhdWx0TWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IGtleVZhdWx0TmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydEVudn0tJHtzaG9ydExvY2F0aW9ufS1jb21tb24ta3YtMDFgO1xuICAgIGNvbnN0IHNlY3JldHNQcm90ZWN0aW9uRW5hYmxlZCA9IHNob3J0RW52ID09PSBcInBcIjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGt2Q2xpZW50LnZhdWx0cy5jaGVja05hbWVBdmFpbGFiaWxpdHkoe1xuICAgICAgbmFtZToga2V5VmF1bHROYW1lLFxuICAgICAgdHlwZTogXCJNaWNyb3NvZnQuS2V5VmF1bHQvdmF1bHRzXCIsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBrdkNsaWVudC52YXVsdHMuYmVnaW5DcmVhdGVPclVwZGF0ZUFuZFdhaXQoXG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIGtleVZhdWx0TmFtZSxcbiAgICAgIHtcbiAgICAgICAgbG9jYXRpb246IGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBjcmVhdGVNb2RlOiByZXN1bHQubmFtZUF2YWlsYWJsZSA/IFwiZGVmYXVsdFwiIDogXCJyZWNvdmVyXCIsXG4gICAgICAgICAgZW5hYmxlZEZvckRpc2tFbmNyeXB0aW9uOiB0cnVlLFxuICAgICAgICAgIGVuYWJsZVB1cmdlUHJvdGVjdGlvbjogc2VjcmV0c1Byb3RlY3Rpb25FbmFibGVkID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbmFibGVSYmFjQXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgICBza3U6IHtcbiAgICAgICAgICAgIGZhbWlseTogXCJBXCIsXG4gICAgICAgICAgICBuYW1lOiBcInN0YW5kYXJkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb2Z0RGVsZXRlUmV0ZW50aW9uSW5EYXlzOiBzZWNyZXRzUHJvdGVjdGlvbkVuYWJsZWQgPyAxNCA6IDcsXG4gICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICBFbnZpcm9ubWVudDogbmFtZSxcbiAgICAgICAgICAuLi50YWdzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIGtleSB2YXVsdCB7a2V5VmF1bHROYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBrZXlWYXVsdE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGtleVZhdWx0TmFtZTtcbiAgfVxuXG4gICNjcmVhdGVGZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSh7XG4gICAgZ2l0aHViLFxuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgfToge1xuICAgIGdpdGh1YjogR2l0SHViUmVwbztcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IHN0cmluZztcbiAgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVwb05hbWUgPSBnaXRodWIucmVwby5yZXBsYWNlQWxsKC9bXmEtekEtWjAtOS1dL2csIFwiLVwiKTtcblxuICAgIHJldHVybiBgJHtyZXBvTmFtZX0tJHtnaXRodWJFbnZpcm9ubWVudE5hbWV9YDtcbiAgfVxuXG4gICNjcmVhdGVSb2xlQXNzaWdubWVudE5hbWUoXG4gICAgc2NvcGU6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHJvbGVEZWZpbml0aW9uSWQ6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShgJHtzY29wZX06JHtwcmluY2lwYWxJZH06JHtyb2xlRGVmaW5pdGlvbklkfWApXG4gICAgICAuZGlnZXN0KFwiaGV4XCIpO1xuXG4gICAgcmV0dXJuIGAke2hhc2guc2xpY2UoMCwgOCl9LSR7aGFzaC5zbGljZSg4LCAxMil9LSR7aGFzaC5zbGljZShcbiAgICAgIDEyLFxuICAgICAgMTYsXG4gICAgKX0tJHtoYXNoLnNsaWNlKDE2LCAyMCl9LSR7aGFzaC5zbGljZSgyMCwgMzIpfWA7XG4gIH1cblxuICAjY3JlYXRlUm9sZURlZmluaXRpb25SZXNvdXJjZUlkKFxuICAgIHN1YnNjcmlwdGlvbklkOiBzdHJpbmcsXG4gICAgcm9sZURlZmluaXRpb25JZDogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBgL3N1YnNjcmlwdGlvbnMvJHtzdWJzY3JpcHRpb25JZH0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy8ke3JvbGVEZWZpbml0aW9uSWR9YDtcbiAgfVxuXG4gIGFzeW5jICNnZXRDdXJyZW50UHJpbmNpcGFsSWRzKCk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgICAvLyBDcmVhdGUgR3JhcGggY2xpZW50IHdpdGggY3VzdG9tIGF1dGggcHJvdmlkZXIgdGhhdCBmZXRjaGVzIGZyZXNoIHRva2Vuc1xuICAgIGNvbnN0IGdyYXBoQ2xpZW50ID0gQ2xpZW50LmluaXQoe1xuICAgICAgYXV0aFByb3ZpZGVyOiBhc3luYyAoZG9uZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRva2VuUmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjcmVkZW50aWFsLmdldFRva2VuKFxuICAgICAgICAgICAgXCJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20vLmRlZmF1bHRcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgICAgICAgZG9uZShcbiAgICAgICAgICAgICAgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFjcXVpcmUgdG9rZW4gZm9yIE1pY3Jvc29mdCBHcmFwaFwiKSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvbmUobnVsbCwgdG9rZW5SZXNwb25zZS50b2tlbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZG9uZShlcnJvciBhcyBFcnJvciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBHZXQgY3VycmVudCB1c2VyJ3MgaW5mb1xuICAgIGNvbnN0IG1lUmVzcG9uc2UgPSBhd2FpdCBncmFwaENsaWVudC5hcGkoXCIvbWVcIikuZ2V0KCk7XG4gICAgY29uc3QgbWUgPSBncmFwaFVzZXJSZXNwb25zZVNjaGVtYS5wYXJzZShtZVJlc3BvbnNlKTtcbiAgICBjb25zdCB1c2VyT2JqZWN0SWQgPSBtZS5pZDtcblxuICAgIC8vIEdldCBhbGwgZ3JvdXAgbWVtYmVyc2hpcHMgKHRyYW5zaXRpdmUgLSBpbmNsdWRlcyBuZXN0ZWQgZ3JvdXBzKVxuICAgIGNvbnN0IGdyb3VwSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBuZXh0TGluazogc3RyaW5nIHwgdW5kZWZpbmVkID0gXCIvbWUvdHJhbnNpdGl2ZU1lbWJlck9mPyRzZWxlY3Q9aWRcIjtcblxuICAgIHdoaWxlIChuZXh0TGluaykge1xuICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPSBhd2FpdCBncmFwaENsaWVudC5hcGkobmV4dExpbmspLmdldCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBncmFwaEdyb3VwTWVtYmVyc2hpcFJlc3BvbnNlU2NoZW1hLnBhcnNlKHJhd1Jlc3BvbnNlKTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXNwb25zZS52YWx1ZSkge1xuICAgICAgICBncm91cElkcy5wdXNoKGl0ZW0uaWQpO1xuICAgICAgfVxuICAgICAgbmV4dExpbmsgPSByZXNwb25zZVtcIkBvZGF0YS5uZXh0TGlua1wiXTtcbiAgICB9XG5cbiAgICAvLyBBbGwgcHJpbmNpcGFsIElEcyB0byBjaGVjayAodXNlciArIGFsbCBncm91cHMpXG4gICAgY29uc3QgYWxsUHJpbmNpcGFsSWRzID0gbmV3IFNldChbdXNlck9iamVjdElkLCAuLi5ncm91cElkc10pO1xuICAgIHJldHVybiBhbGxQcmluY2lwYWxJZHM7XG4gIH1cblxuICBhc3luYyAjcmVnaXN0ZXJQcm92aWRlcnMoc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJyZWdpc3Rlci1wcm92aWRlcnNcIl0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgc3Vic2NyaXB0aW9uSWQsXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgXCJSZWdpc3RlcmluZyB7Y291bnR9IHJlc291cmNlIHByb3ZpZGVycyBvbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBjb3VudDogdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5sZW5ndGgsIHN1YnNjcmlwdGlvbklkIH0sXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5tYXAoYXN5bmMgKG5hbWVzcGFjZSkgPT4ge1xuICAgICAgICBhd2FpdCBjbGllbnQucHJvdmlkZXJzLnJlZ2lzdGVyKG5hbWVzcGFjZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlJlZ2lzdGVyZWQgcHJvdmlkZXIge25hbWVzcGFjZX1cIiwgeyBuYW1lc3BhY2UgfSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBcIkFsbCByZXNvdXJjZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBvbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBzdWJzY3JpcHRpb25JZCB9LFxuICAgICk7XG4gIH1cblxuICBhc3luYyAjc3RvcmVCb290c3RyYXBwZXJFbnZpcm9ubWVudFNlY3JldHMoe1xuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGdpdGh1YixcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgZ2l0SHViU2VydmljZSxcbiAgICBpZGVudGl0eUNsaWVudElkLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgIHRlbmFudElkLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBnaXRodWI6IEdpdEh1YlJlcG87XG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lOiBzdHJpbmc7XG4gICAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZTtcbiAgICBpZGVudGl0eUNsaWVudElkOiBzdHJpbmc7XG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHM6IEdpdEh1YkFwcENyZWRlbnRpYWxzO1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJBUk1fQ0xJRU5UX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBpZGVudGl0eUNsaWVudElkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiQVJNX1RFTkFOVF9JRFwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogdGVuYW50SWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJBUk1fU1VCU0NSSVBUSU9OX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBjbG91ZEFjY291bnRJZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9JRFwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMuaWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJHSF9BUFBfQ0xJRU5UX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5jbGllbnRJZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9JTlNUQUxMQVRJT05fSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IHJ1bm5lckFwcENyZWRlbnRpYWxzLmluc3RhbGxhdGlvbklkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0tFWVwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMua2V5LnRyaW1FbmQoKSxcbiAgICAgIH0pLFxuICAgIF0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFwiU2V0IEdpdEh1YiBlbnZpcm9ubWVudCBzZWNyZXRzIGZvciB7ZW52aXJvbm1lbnROYW1lfVwiLCB7XG4gICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICNzdG9yZVJ1bm5lckFwcFNlY3JldHMoe1xuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGtleVZhdWx0TmFtZSxcbiAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudElkOiBzdHJpbmc7XG4gICAga2V5VmF1bHROYW1lOiBzdHJpbmc7XG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHM6IEdpdEh1YkFwcENyZWRlbnRpYWxzO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICBhd2FpdCB0aGlzLiN3YWl0Rm9yS2V5VmF1bHREbnNSZXNvbHV0aW9uKHtcbiAgICAgIGNsb3VkQWNjb3VudElkLFxuICAgICAga2V5VmF1bHROYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VjcmV0Q2xpZW50ID0gbmV3IFNlY3JldENsaWVudChcbiAgICAgIGBodHRwczovLyR7a2V5VmF1bHROYW1lfS52YXVsdC5henVyZS5uZXQvYCxcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNlY3JldENsaWVudC5zZXRTZWNyZXQoXCJnaXRodWItcnVubmVyLWFwcC1pZFwiLCBydW5uZXJBcHBDcmVkZW50aWFscy5pZCksXG4gICAgICBzZWNyZXRDbGllbnQuc2V0U2VjcmV0KFxuICAgICAgICBcImdpdGh1Yi1ydW5uZXItYXBwLWluc3RhbGxhdGlvbi1pZFwiLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscy5pbnN0YWxsYXRpb25JZCxcbiAgICAgICksXG4gICAgICBzZWNyZXRDbGllbnQuc2V0U2VjcmV0KFxuICAgICAgICBcImdpdGh1Yi1ydW5uZXItYXBwLWtleVwiLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscy5rZXkudHJpbUVuZCgpLCAvLyBzdHJpcCB0cmFpbGluZyBuZXdsaW5lcyBmcm9tIFBFTSBrZXlzXG4gICAgICApLFxuICAgIF0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHNlY3JldHMgaW4ga2V5IHZhdWx0IHtrZXlWYXVsdE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IGtleVZhdWx0TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkIH0sXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jICN3YWl0Rm9yS2V5VmF1bHREbnNSZXNvbHV0aW9uKHtcbiAgICBjbG91ZEFjY291bnRJZCxcbiAgICBrZXlWYXVsdE5hbWUsXG4gIH06IHtcbiAgICBjbG91ZEFjY291bnRJZDogQ2xvdWRBY2NvdW50W1wiaWRcIl07XG4gICAga2V5VmF1bHROYW1lOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcbiAgICBjb25zdCBob3N0bmFtZSA9IGAke2tleVZhdWx0TmFtZX0udmF1bHQuYXp1cmUubmV0YDtcblxuICAgIC8vIEF6dXJlIGNhbiByZXBvcnQgdGhlIHZhdWx0IGFzIGNyZWF0ZWQgYmVmb3JlIGl0cyBwdWJsaWMgRE5TIG5hbWUgaXMgcmVhZHkuXG4gICAgLy8gV2FpdCBoZXJlIHNvIHdyaXRpbmcgcnVubmVyIGFwcCBzZWNyZXRzIGRvZXMgbm90IGZhaWwgd2l0aCBFTk9URk9VTkQuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0ga2V5VmF1bHREbnNSZWFkeU1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGxvb2t1cChob3N0bmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAha2V5VmF1bHREbnNFcnJvclNjaGVtYS5zYWZlUGFyc2UoY2F1c2UpLnN1Y2Nlc3MgfHxcbiAgICAgICAgICBhdHRlbXB0ID09PSBrZXlWYXVsdERuc1JlYWR5TWF4QXR0ZW1wdHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEtleSB2YXVsdCBlbmRwb2ludCAnJHtob3N0bmFtZX0nIGlzIG5vdCByZXNvbHZhYmxlYCxcbiAgICAgICAgICAgIHsgY2F1c2UgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIFwiV2FpdGluZyBmb3Iga2V5IHZhdWx0IGVuZHBvaW50IHtob3N0bmFtZX0gdG8gYmVjb21lIHJlc29sdmFibGUgaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgICAgICB7IGhvc3RuYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQgfSxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoa2V5VmF1bHREbnNSZWFkeVJldHJ5RGVsYXlNcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTel preload module for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* This module is a deliberate side-effect entrypoint. It MUST be the first
|
|
5
|
+
* module loaded by the process (via a sequential dynamic import in bin/index.js)
|
|
6
|
+
* so that import-in-the-middle can register its hook before any HTTP client
|
|
7
|
+
* libraries (undici/fetch, octokit, Azure SDKs) are loaded.
|
|
8
|
+
*
|
|
9
|
+
* Initialising the Azure Monitor exporter is deferred to `enableAzureMonitor()`
|
|
10
|
+
* so the CLI can decide at runtime whether to emit telemetry (only PagoPA org
|
|
11
|
+
* members do). The import-in-the-middle hook is still registered eagerly at
|
|
12
|
+
* preload because it must run before any instrumented module is imported.
|
|
13
|
+
*
|
|
14
|
+
* Reads APPLICATIONINSIGHTS_CONNECTION_STRING from process.env because this IS
|
|
15
|
+
* the configuration boundary — no higher caller can inject config at this point
|
|
16
|
+
* in the process lifecycle.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Initialises the Azure Monitor exporter and registers HTTP instrumentation.
|
|
20
|
+
*
|
|
21
|
+
* Deferred (not run at preload) so the CLI only emits telemetry once it has
|
|
22
|
+
* confirmed the user is a PagoPA org member. Idempotent: safe to call more than
|
|
23
|
+
* once. Must be called before logging is configured so the logtape OTel sink
|
|
24
|
+
* binds to the real (rather than no-op) LoggerProvider.
|
|
25
|
+
*/
|
|
26
|
+
export declare const enableAzureMonitor: () => void;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTel preload module for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* This module is a deliberate side-effect entrypoint. It MUST be the first
|
|
5
|
+
* module loaded by the process (via a sequential dynamic import in bin/index.js)
|
|
6
|
+
* so that import-in-the-middle can register its hook before any HTTP client
|
|
7
|
+
* libraries (undici/fetch, octokit, Azure SDKs) are loaded.
|
|
8
|
+
*
|
|
9
|
+
* Initialising the Azure Monitor exporter is deferred to `enableAzureMonitor()`
|
|
10
|
+
* so the CLI can decide at runtime whether to emit telemetry (only PagoPA org
|
|
11
|
+
* members do). The import-in-the-middle hook is still registered eagerly at
|
|
12
|
+
* preload because it must run before any instrumented module is imported.
|
|
13
|
+
*
|
|
14
|
+
* Reads APPLICATIONINSIGHTS_CONNECTION_STRING from process.env because this IS
|
|
15
|
+
* the configuration boundary — no higher caller can inject config at this point
|
|
16
|
+
* in the process lifecycle.
|
|
17
|
+
*/
|
|
18
|
+
import { useAzureMonitor } from "@azure/monitor-opentelemetry";
|
|
19
|
+
import { metrics, trace } from "@opentelemetry/api";
|
|
20
|
+
import { registerInstrumentations } from "@opentelemetry/instrumentation";
|
|
21
|
+
import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
|
|
22
|
+
// import-in-the-middle and module must be the first imports so that
|
|
23
|
+
// createAddHookMessageChannel / register run as early as possible.
|
|
24
|
+
import { createAddHookMessageChannel } from "import-in-the-middle";
|
|
25
|
+
import { register } from "module";
|
|
26
|
+
import os from "node:os";
|
|
27
|
+
const { registerOptions, waitForAllMessagesAcknowledged } = createAddHookMessageChannel();
|
|
28
|
+
// Register the ESM module hook so that subsequent dynamic imports are
|
|
29
|
+
// intercepted by OpenTelemetry's module instrumentation.
|
|
30
|
+
register("import-in-the-middle/hook.mjs", import.meta.url, registerOptions);
|
|
31
|
+
// Set service name before useAzureMonitor() initialises the Resource so
|
|
32
|
+
// that Azure Monitor picks it up as the cloud_RoleName.
|
|
33
|
+
process.env["OTEL_SERVICE_NAME"] = "cli";
|
|
34
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"] = [
|
|
35
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"],
|
|
36
|
+
"service.namespace=dx",
|
|
37
|
+
]
|
|
38
|
+
.filter(Boolean)
|
|
39
|
+
.join(",");
|
|
40
|
+
// os.platform() returns "win32" on Windows; the OTel os.type enum uses "windows".
|
|
41
|
+
const osPlatform = os.platform();
|
|
42
|
+
const osType = osPlatform === "win32" ? "windows" : osPlatform;
|
|
43
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"] = [
|
|
44
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"],
|
|
45
|
+
`os.type=${osType}`,
|
|
46
|
+
`os.version=${os.release()}`,
|
|
47
|
+
`os.machine=${os.machine()}`,
|
|
48
|
+
]
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.join(",");
|
|
51
|
+
let azureMonitorEnabled = false;
|
|
52
|
+
/**
|
|
53
|
+
* Initialises the Azure Monitor exporter and registers HTTP instrumentation.
|
|
54
|
+
*
|
|
55
|
+
* Deferred (not run at preload) so the CLI only emits telemetry once it has
|
|
56
|
+
* confirmed the user is a PagoPA org member. Idempotent: safe to call more than
|
|
57
|
+
* once. Must be called before logging is configured so the logtape OTel sink
|
|
58
|
+
* binds to the real (rather than no-op) LoggerProvider.
|
|
59
|
+
*/
|
|
60
|
+
export const enableAzureMonitor = () => {
|
|
61
|
+
if (azureMonitorEnabled) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
azureMonitorEnabled = true;
|
|
65
|
+
useAzureMonitor({
|
|
66
|
+
azureMonitorExporterOptions: {
|
|
67
|
+
connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING ||
|
|
68
|
+
"InstrumentationKey=e0ff8094-78fa-45e5-a21d-e62b453dc5d1;IngestionEndpoint=https://italynorth-0.in.applicationinsights.azure.com/;LiveEndpoint=https://italynorth.livediagnostics.monitor.azure.com/;ApplicationId=ce469d55-2ff7-4dfd-a249-cc787291e672",
|
|
69
|
+
},
|
|
70
|
+
enableLiveMetrics: true,
|
|
71
|
+
});
|
|
72
|
+
// Registered after useAzureMonitor() so the instrumentation binds to the
|
|
73
|
+
// real tracer/meter providers it installs (rather than the no-op defaults).
|
|
74
|
+
registerInstrumentations({
|
|
75
|
+
instrumentations: [new UndiciInstrumentation()],
|
|
76
|
+
meterProvider: metrics.getMeterProvider(),
|
|
77
|
+
tracerProvider: trace.getTracerProvider(),
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
// Block module evaluation until the hook is fully acknowledged.
|
|
81
|
+
// This ensures that when bin/index.js proceeds to import the CLI entry
|
|
82
|
+
// module, all transitive imports go through the registered hook.
|
|
83
|
+
await waitForAllMessagesAcknowledged();
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlLW1vbml0b3IvaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV6QixNQUFNLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixFQUFFLEdBQ3ZELDJCQUEyQixFQUFFLENBQUM7QUFFaEMsc0VBQXNFO0FBQ3RFLHlEQUF5RDtBQUN6RCxRQUFRLENBQUMsK0JBQStCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFFNUUsd0VBQXdFO0FBQ3hFLHdEQUF3RDtBQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZDLHNCQUFzQjtDQUN2QjtLQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFYixrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFHLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZDLFdBQVcsTUFBTSxFQUFFO0lBQ25CLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQzVCLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0NBQzdCO0tBQ0UsTUFBTSxDQUFDLE9BQU8sQ0FBQztLQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUViLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBRWhDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFTLEVBQUU7SUFDM0MsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hCLE9BQU87SUFDVCxDQUFDO0lBQ0QsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBRTNCLGVBQWUsQ0FBQztRQUNkLDJCQUEyQixFQUFFO1lBQzNCLGdCQUFnQixFQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDO2dCQUNqRCx3UEFBd1A7U0FDM1A7UUFDRCxpQkFBaUIsRUFBRSxJQUFJO0tBQ3hCLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsd0JBQXdCLENBQUM7UUFDdkIsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsYUFBYSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixFQUFFO0tBQzFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLGdFQUFnRTtBQUNoRSx1RUFBdUU7QUFDdkUsaUVBQWlFO0FBQ2pFLE1BQU0sOEJBQThCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT1RlbCBwcmVsb2FkIG1vZHVsZSBmb3IgdGhlIGR4IENMSS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBhIGRlbGliZXJhdGUgc2lkZS1lZmZlY3QgZW50cnlwb2ludC4gSXQgTVVTVCBiZSB0aGUgZmlyc3RcbiAqIG1vZHVsZSBsb2FkZWQgYnkgdGhlIHByb2Nlc3MgKHZpYSBhIHNlcXVlbnRpYWwgZHluYW1pYyBpbXBvcnQgaW4gYmluL2luZGV4LmpzKVxuICogc28gdGhhdCBpbXBvcnQtaW4tdGhlLW1pZGRsZSBjYW4gcmVnaXN0ZXIgaXRzIGhvb2sgYmVmb3JlIGFueSBIVFRQIGNsaWVudFxuICogbGlicmFyaWVzICh1bmRpY2kvZmV0Y2gsIG9jdG9raXQsIEF6dXJlIFNES3MpIGFyZSBsb2FkZWQuXG4gKlxuICogSW5pdGlhbGlzaW5nIHRoZSBBenVyZSBNb25pdG9yIGV4cG9ydGVyIGlzIGRlZmVycmVkIHRvIGBlbmFibGVBenVyZU1vbml0b3IoKWBcbiAqIHNvIHRoZSBDTEkgY2FuIGRlY2lkZSBhdCBydW50aW1lIHdoZXRoZXIgdG8gZW1pdCB0ZWxlbWV0cnkgKG9ubHkgUGFnb1BBIG9yZ1xuICogbWVtYmVycyBkbykuIFRoZSBpbXBvcnQtaW4tdGhlLW1pZGRsZSBob29rIGlzIHN0aWxsIHJlZ2lzdGVyZWQgZWFnZXJseSBhdFxuICogcHJlbG9hZCBiZWNhdXNlIGl0IG11c3QgcnVuIGJlZm9yZSBhbnkgaW5zdHJ1bWVudGVkIG1vZHVsZSBpcyBpbXBvcnRlZC5cbiAqXG4gKiBSZWFkcyBBUFBMSUNBVElPTklOU0lHSFRTX0NPTk5FQ1RJT05fU1RSSU5HIGZyb20gcHJvY2Vzcy5lbnYgYmVjYXVzZSB0aGlzIElTXG4gKiB0aGUgY29uZmlndXJhdGlvbiBib3VuZGFyeSDigJQgbm8gaGlnaGVyIGNhbGxlciBjYW4gaW5qZWN0IGNvbmZpZyBhdCB0aGlzIHBvaW50XG4gKiBpbiB0aGUgcHJvY2VzcyBsaWZlY3ljbGUuXG4gKi9cblxuaW1wb3J0IHsgdXNlQXp1cmVNb25pdG9yIH0gZnJvbSBcIkBhenVyZS9tb25pdG9yLW9wZW50ZWxlbWV0cnlcIjtcbmltcG9ydCB7IG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvblwiO1xuaW1wb3J0IHsgVW5kaWNpSW5zdHJ1bWVudGF0aW9uIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi11bmRpY2lcIjtcbi8vIGltcG9ydC1pbi10aGUtbWlkZGxlIGFuZCBtb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3QgaW1wb3J0cyBzbyB0aGF0XG4vLyBjcmVhdGVBZGRIb29rTWVzc2FnZUNoYW5uZWwgLyByZWdpc3RlciBydW4gYXMgZWFybHkgYXMgcG9zc2libGUuXG5pbXBvcnQgeyBjcmVhdGVBZGRIb29rTWVzc2FnZUNoYW5uZWwgfSBmcm9tIFwiaW1wb3J0LWluLXRoZS1taWRkbGVcIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmNvbnN0IHsgcmVnaXN0ZXJPcHRpb25zLCB3YWl0Rm9yQWxsTWVzc2FnZXNBY2tub3dsZWRnZWQgfSA9XG4gIGNyZWF0ZUFkZEhvb2tNZXNzYWdlQ2hhbm5lbCgpO1xuXG4vLyBSZWdpc3RlciB0aGUgRVNNIG1vZHVsZSBob29rIHNvIHRoYXQgc3Vic2VxdWVudCBkeW5hbWljIGltcG9ydHMgYXJlXG4vLyBpbnRlcmNlcHRlZCBieSBPcGVuVGVsZW1ldHJ5J3MgbW9kdWxlIGluc3RydW1lbnRhdGlvbi5cbnJlZ2lzdGVyKFwiaW1wb3J0LWluLXRoZS1taWRkbGUvaG9vay5tanNcIiwgaW1wb3J0Lm1ldGEudXJsLCByZWdpc3Rlck9wdGlvbnMpO1xuXG4vLyBTZXQgc2VydmljZSBuYW1lIGJlZm9yZSB1c2VBenVyZU1vbml0b3IoKSBpbml0aWFsaXNlcyB0aGUgUmVzb3VyY2Ugc29cbi8vIHRoYXQgQXp1cmUgTW9uaXRvciBwaWNrcyBpdCB1cCBhcyB0aGUgY2xvdWRfUm9sZU5hbWUuXG5wcm9jZXNzLmVudltcIk9URUxfU0VSVklDRV9OQU1FXCJdID0gXCJjbGlcIjtcbnByb2Nlc3MuZW52W1wiT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTXCJdID0gW1xuICBwcm9jZXNzLmVudltcIk9URUxfUkVTT1VSQ0VfQVRUUklCVVRFU1wiXSxcbiAgXCJzZXJ2aWNlLm5hbWVzcGFjZT1keFwiLFxuXVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiLFwiKTtcblxuLy8gb3MucGxhdGZvcm0oKSByZXR1cm5zIFwid2luMzJcIiBvbiBXaW5kb3dzOyB0aGUgT1RlbCBvcy50eXBlIGVudW0gdXNlcyBcIndpbmRvd3NcIi5cbmNvbnN0IG9zUGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuY29uc3Qgb3NUeXBlID0gb3NQbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJ3aW5kb3dzXCIgOiBvc1BsYXRmb3JtO1xucHJvY2Vzcy5lbnZbXCJPVEVMX1JFU09VUkNFX0FUVFJJQlVURVNcIl0gPSBbXG4gIHByb2Nlc3MuZW52W1wiT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTXCJdLFxuICBgb3MudHlwZT0ke29zVHlwZX1gLFxuICBgb3MudmVyc2lvbj0ke29zLnJlbGVhc2UoKX1gLFxuICBgb3MubWFjaGluZT0ke29zLm1hY2hpbmUoKX1gLFxuXVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiLFwiKTtcblxubGV0IGF6dXJlTW9uaXRvckVuYWJsZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBJbml0aWFsaXNlcyB0aGUgQXp1cmUgTW9uaXRvciBleHBvcnRlciBhbmQgcmVnaXN0ZXJzIEhUVFAgaW5zdHJ1bWVudGF0aW9uLlxuICpcbiAqIERlZmVycmVkIChub3QgcnVuIGF0IHByZWxvYWQpIHNvIHRoZSBDTEkgb25seSBlbWl0cyB0ZWxlbWV0cnkgb25jZSBpdCBoYXNcbiAqIGNvbmZpcm1lZCB0aGUgdXNlciBpcyBhIFBhZ29QQSBvcmcgbWVtYmVyLiBJZGVtcG90ZW50OiBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuXG4gKiBvbmNlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9nZ2luZyBpcyBjb25maWd1cmVkIHNvIHRoZSBsb2d0YXBlIE9UZWwgc2lua1xuICogYmluZHMgdG8gdGhlIHJlYWwgKHJhdGhlciB0aGFuIG5vLW9wKSBMb2dnZXJQcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZUF6dXJlTW9uaXRvciA9ICgpOiB2b2lkID0+IHtcbiAgaWYgKGF6dXJlTW9uaXRvckVuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXp1cmVNb25pdG9yRW5hYmxlZCA9IHRydWU7XG5cbiAgdXNlQXp1cmVNb25pdG9yKHtcbiAgICBhenVyZU1vbml0b3JFeHBvcnRlck9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmc6XG4gICAgICAgIHByb2Nlc3MuZW52LkFQUExJQ0FUSU9OSU5TSUdIVFNfQ09OTkVDVElPTl9TVFJJTkcgfHxcbiAgICAgICAgXCJJbnN0cnVtZW50YXRpb25LZXk9ZTBmZjgwOTQtNzhmYS00NWU1LWEyMWQtZTYyYjQ1M2RjNWQxO0luZ2VzdGlvbkVuZHBvaW50PWh0dHBzOi8vaXRhbHlub3J0aC0wLmluLmFwcGxpY2F0aW9uaW5zaWdodHMuYXp1cmUuY29tLztMaXZlRW5kcG9pbnQ9aHR0cHM6Ly9pdGFseW5vcnRoLmxpdmVkaWFnbm9zdGljcy5tb25pdG9yLmF6dXJlLmNvbS87QXBwbGljYXRpb25JZD1jZTQ2OWQ1NS0yZmY3LTRkZmQtYTI0OS1jYzc4NzI5MWU2NzJcIixcbiAgICB9LFxuICAgIGVuYWJsZUxpdmVNZXRyaWNzOiB0cnVlLFxuICB9KTtcblxuICAvLyBSZWdpc3RlcmVkIGFmdGVyIHVzZUF6dXJlTW9uaXRvcigpIHNvIHRoZSBpbnN0cnVtZW50YXRpb24gYmluZHMgdG8gdGhlXG4gIC8vIHJlYWwgdHJhY2VyL21ldGVyIHByb3ZpZGVycyBpdCBpbnN0YWxscyAocmF0aGVyIHRoYW4gdGhlIG5vLW9wIGRlZmF1bHRzKS5cbiAgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zKHtcbiAgICBpbnN0cnVtZW50YXRpb25zOiBbbmV3IFVuZGljaUluc3RydW1lbnRhdGlvbigpXSxcbiAgICBtZXRlclByb3ZpZGVyOiBtZXRyaWNzLmdldE1ldGVyUHJvdmlkZXIoKSxcbiAgICB0cmFjZXJQcm92aWRlcjogdHJhY2UuZ2V0VHJhY2VyUHJvdmlkZXIoKSxcbiAgfSk7XG59O1xuXG4vLyBCbG9jayBtb2R1bGUgZXZhbHVhdGlvbiB1bnRpbCB0aGUgaG9vayBpcyBmdWxseSBhY2tub3dsZWRnZWQuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGJpbi9pbmRleC5qcyBwcm9jZWVkcyB0byBpbXBvcnQgdGhlIENMSSBlbnRyeVxuLy8gbW9kdWxlLCBhbGwgdHJhbnNpdGl2ZSBpbXBvcnRzIGdvIHRocm91Z2ggdGhlIHJlZ2lzdGVyZWQgaG9vay5cbmF3YWl0IHdhaXRGb3JBbGxNZXNzYWdlc0Fja25vd2xlZGdlZCgpO1xuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry helpers for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* All functions are no-ops when the OTel SDK has not been initialised (i.e.,
|
|
5
|
+
* when telemetry is disabled or the connection string is absent).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Flush pending telemetry before the process exits.
|
|
9
|
+
*
|
|
10
|
+
* Uses shutdownAzureMonitor() which force-flushes AND shuts down every
|
|
11
|
+
* provider (traces, logs, metrics). Flushing only the logger provider is not
|
|
12
|
+
* enough: the root span ends right before the process exits, so without a
|
|
13
|
+
* trace flush it would never be exported and would not appear in the
|
|
14
|
+
* Application Insights timeline.
|
|
15
|
+
*
|
|
16
|
+
* Safe to call unconditionally — swallows all errors and is a no-op when the
|
|
17
|
+
* SDK was never initialised (telemetry disabled or no connection string).
|
|
18
|
+
*/
|
|
19
|
+
export declare const flushTelemetry: () => Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry helpers for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* All functions are no-ops when the OTel SDK has not been initialised (i.e.,
|
|
5
|
+
* when telemetry is disabled or the connection string is absent).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Flush pending telemetry before the process exits.
|
|
9
|
+
*
|
|
10
|
+
* Uses shutdownAzureMonitor() which force-flushes AND shuts down every
|
|
11
|
+
* provider (traces, logs, metrics). Flushing only the logger provider is not
|
|
12
|
+
* enough: the root span ends right before the process exits, so without a
|
|
13
|
+
* trace flush it would never be exported and would not appear in the
|
|
14
|
+
* Application Insights timeline.
|
|
15
|
+
*
|
|
16
|
+
* Safe to call unconditionally — swallows all errors and is a no-op when the
|
|
17
|
+
* SDK was never initialised (telemetry disabled or no connection string).
|
|
18
|
+
*/
|
|
19
|
+
export const flushTelemetry = async () => {
|
|
20
|
+
try {
|
|
21
|
+
const { shutdownAzureMonitor } = await import("@azure/monitor-opentelemetry");
|
|
22
|
+
await shutdownAzureMonitor();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Telemetry must never break the CLI.
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlLW1vbml0b3IvdGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxJQUFtQixFQUFFO0lBQ3RELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUM1QixNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sb0JBQW9CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asc0NBQXNDO0lBQ3hDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbGVtZXRyeSBoZWxwZXJzIGZvciB0aGUgZHggQ0xJLlxuICpcbiAqIEFsbCBmdW5jdGlvbnMgYXJlIG5vLW9wcyB3aGVuIHRoZSBPVGVsIFNESyBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgKGkuZS4sXG4gKiB3aGVuIHRlbGVtZXRyeSBpcyBkaXNhYmxlZCBvciB0aGUgY29ubmVjdGlvbiBzdHJpbmcgaXMgYWJzZW50KS5cbiAqL1xuXG4vKipcbiAqIEZsdXNoIHBlbmRpbmcgdGVsZW1ldHJ5IGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cy5cbiAqXG4gKiBVc2VzIHNodXRkb3duQXp1cmVNb25pdG9yKCkgd2hpY2ggZm9yY2UtZmx1c2hlcyBBTkQgc2h1dHMgZG93biBldmVyeVxuICogcHJvdmlkZXIgKHRyYWNlcywgbG9ncywgbWV0cmljcykuIEZsdXNoaW5nIG9ubHkgdGhlIGxvZ2dlciBwcm92aWRlciBpcyBub3RcbiAqIGVub3VnaDogdGhlIHJvb3Qgc3BhbiBlbmRzIHJpZ2h0IGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cywgc28gd2l0aG91dCBhXG4gKiB0cmFjZSBmbHVzaCBpdCB3b3VsZCBuZXZlciBiZSBleHBvcnRlZCBhbmQgd291bGQgbm90IGFwcGVhciBpbiB0aGVcbiAqIEFwcGxpY2F0aW9uIEluc2lnaHRzIHRpbWVsaW5lLlxuICpcbiAqIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHkg4oCUIHN3YWxsb3dzIGFsbCBlcnJvcnMgYW5kIGlzIGEgbm8tb3Agd2hlbiB0aGVcbiAqIFNESyB3YXMgbmV2ZXIgaW5pdGlhbGlzZWQgKHRlbGVtZXRyeSBkaXNhYmxlZCBvciBubyBjb25uZWN0aW9uIHN0cmluZykuXG4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaFRlbGVtZXRyeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHNodXRkb3duQXp1cmVNb25pdG9yIH0gPVxuICAgICAgYXdhaXQgaW1wb3J0KFwiQGF6dXJlL21vbml0b3Itb3BlbnRlbGVtZXRyeVwiKTtcbiAgICBhd2FpdCBzaHV0ZG93bkF6dXJlTW9uaXRvcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgQ0xJLlxuICB9XG59O1xuIl19
|
|
@@ -1,20 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Add command - Scaffold new components into existing workspaces
|
|
2
|
+
* Add command - Scaffold new components into existing workspaces.
|
|
3
3
|
*
|
|
4
|
-
* This module implements the `dx add` command
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - environment: Add a new deployment environment to the project
|
|
4
|
+
* This module implements the `dx add` command and keeps the CLI-specific flag
|
|
5
|
+
* parsing/validation close to the Commander adapter. It turns supported flags
|
|
6
|
+
* into prefilled answers for the plop generator so the command can run with a
|
|
7
|
+
* mix of non-interactive inputs and guided prompts.
|
|
9
8
|
*/
|
|
10
9
|
import { Command } from "commander";
|
|
11
10
|
import { ResultAsync } from "neverthrow";
|
|
12
|
-
import
|
|
11
|
+
import { z } from "zod/v4";
|
|
12
|
+
import type { InitialAnswers as DeploymentEnvironmentInitialAnswers, Payload as EnvironmentPayload } from "../../plop/generators/environment/index.js";
|
|
13
13
|
import type { CliEnv } from "../env.js";
|
|
14
14
|
import { AuthorizationResult, AuthorizationService } from "../../../domain/authorization.js";
|
|
15
15
|
import { GitHubAuthFactory } from "../../../domain/dependencies.js";
|
|
16
|
+
declare const addEnvironmentCommandOptionsSchema: z.ZodObject<{
|
|
17
|
+
account: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
18
|
+
businessUnit: z.ZodOptional<z.ZodString>;
|
|
19
|
+
clientId: z.ZodOptional<z.ZodString>;
|
|
20
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
21
|
+
installationId: z.ZodOptional<z.ZodString>;
|
|
22
|
+
location: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<{
|
|
23
|
+
accountId: string;
|
|
24
|
+
location: "italynorth" | "westeurope";
|
|
25
|
+
}, string>>>>;
|
|
26
|
+
managementTeam: z.ZodOptional<z.ZodString>;
|
|
27
|
+
name: z.ZodOptional<z.ZodEnum<{
|
|
28
|
+
dev: "dev";
|
|
29
|
+
prod: "prod";
|
|
30
|
+
uat: "uat";
|
|
31
|
+
}>>;
|
|
32
|
+
prefix: z.ZodOptional<z.ZodString>;
|
|
33
|
+
privateKeyPath: z.ZodOptional<z.ZodString>;
|
|
34
|
+
runnerAppId: z.ZodOptional<z.ZodString>;
|
|
35
|
+
yes: z.ZodOptional<z.ZodBoolean>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export type AddEnvironmentCommandOptions = z.infer<typeof addEnvironmentCommandOptionsSchema>;
|
|
38
|
+
export declare const parseAddEnvironmentCommandOptions: (input: unknown) => AddEnvironmentCommandOptions;
|
|
39
|
+
export declare const getEnvironmentInitialAnswers: (options: AddEnvironmentCommandOptions) => Promise<DeploymentEnvironmentInitialAnswers>;
|
|
16
40
|
/**
|
|
17
41
|
* Authorize a Cloud Account (Azure Subscription, AWS Account, ...), creating a Pull Request for each account that requires authorization.
|
|
18
42
|
*/
|
|
19
43
|
export declare const authorizeCloudAccounts: (authorizationService: AuthorizationService) => (envPayload: EnvironmentPayload) => ResultAsync<AuthorizationResult[], never>;
|
|
20
44
|
export declare const makeAddCommand: (requireGitHubAuth: GitHubAuthFactory, env: CliEnv) => Command;
|
|
45
|
+
export {};
|