@pipeline-builder/api-core 4.1.13 → 4.1.14
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 +3 -2
- package/lib/constants/index.d.ts +0 -1
- package/lib/constants/index.js +1 -2
- package/lib/errors/app-errors.d.ts +8 -3
- package/lib/errors/app-errors.js +10 -5
- package/lib/helpers/access-helpers.d.ts +4 -6
- package/lib/helpers/access-helpers.js +6 -8
- package/lib/helpers/index.d.ts +3 -3
- package/lib/helpers/index.js +4 -4
- package/lib/helpers/org-hierarchy-http.d.ts +11 -10
- package/lib/helpers/org-hierarchy-http.js +24 -35
- package/lib/helpers/org-hierarchy.d.ts +37 -3
- package/lib/helpers/org-hierarchy.js +45 -4
- package/lib/helpers/restore-helpers.d.ts +44 -24
- package/lib/helpers/restore-helpers.js +41 -52
- package/lib/helpers/sse-helpers.d.ts +29 -7
- package/lib/helpers/sse-helpers.js +36 -9
- package/lib/index.d.ts +16 -14
- package/lib/index.js +17 -15
- package/lib/middleware/assurance.d.ts +116 -0
- package/lib/middleware/assurance.js +176 -0
- package/lib/middleware/auth.d.ts +5 -427
- package/lib/middleware/auth.js +36 -789
- package/lib/middleware/ecosystem-guard.d.ts +47 -0
- package/lib/middleware/ecosystem-guard.js +60 -0
- package/lib/middleware/index.d.ts +11 -4
- package/lib/middleware/index.js +12 -5
- package/lib/middleware/jwt-verify.d.ts +52 -0
- package/lib/middleware/jwt-verify.js +105 -0
- package/lib/middleware/permission-gates.d.ts +133 -0
- package/lib/middleware/permission-gates.js +260 -0
- package/lib/middleware/revocation.d.ts +96 -0
- package/lib/middleware/revocation.js +162 -0
- package/lib/middleware/route-table.d.ts +11 -0
- package/lib/middleware/route-table.js +4 -1
- package/lib/middleware/service-tokens.d.ts +83 -0
- package/lib/middleware/service-tokens.js +158 -0
- package/lib/middleware/step-up.d.ts +2 -2
- package/lib/middleware/step-up.js +8 -7
- package/lib/middleware/system-org.d.ts +20 -0
- package/lib/middleware/system-org.js +25 -0
- package/lib/openapi/routes/plugin-routes.js +133 -10
- package/lib/openapi/schema-registry.js +2 -5
- package/lib/routes/index.d.ts +1 -1
- package/lib/routes/index.js +2 -2
- package/lib/services/api-key-exchange.js +7 -5
- package/lib/services/audit-spool.d.ts +34 -10
- package/lib/services/audit-spool.js +75 -34
- package/lib/services/cache-service.d.ts +7 -0
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.d.ts +14 -1
- package/lib/services/circuit-breaker.js +36 -10
- package/lib/services/compliance-client.d.ts +10 -2
- package/lib/services/compliance-client.js +17 -10
- package/lib/services/compliance-event-subscriber.js +6 -6
- package/lib/services/durable-event-bus.js +8 -11
- package/lib/services/ecosystem-notify-client.d.ts +32 -0
- package/lib/services/ecosystem-notify-client.js +71 -0
- package/lib/services/env-redis.d.ts +4 -1
- package/lib/services/env-redis.js +32 -3
- package/lib/services/http-client.d.ts +19 -0
- package/lib/services/http-client.js +98 -19
- package/lib/services/index.d.ts +25 -24
- package/lib/services/index.js +25 -22
- package/lib/services/jwks-cache.js +5 -4
- package/lib/services/leader-lock.d.ts +22 -5
- package/lib/services/leader-lock.js +61 -6
- package/lib/services/quota.d.ts +9 -4
- package/lib/services/quota.js +34 -40
- package/lib/services/remote-audit-client.d.ts +28 -32
- package/lib/services/remote-audit-client.js +166 -49
- package/lib/services/retry-forever.js +5 -11
- package/lib/services/retry-strategy.d.ts +1 -1
- package/lib/services/retry-strategy.js +5 -4
- package/lib/services/scheduler.d.ts +8 -3
- package/lib/services/scheduler.js +17 -5
- package/lib/services/service-boot.d.ts +14 -13
- package/lib/services/service-boot.js +18 -15
- package/lib/services/service-keys.d.ts +1 -1
- package/lib/services/service-keys.js +12 -18
- package/lib/services/sse-ticket-store.d.ts +9 -1
- package/lib/services/sse-ticket-store.js +24 -9
- package/lib/services/system-notification.d.ts +27 -0
- package/lib/services/system-notification.js +50 -0
- package/lib/services/token-revocation.d.ts +50 -1
- package/lib/services/token-revocation.js +103 -3
- package/lib/types/audit-events.d.ts +6 -6
- package/lib/types/audit-events.js +1 -1
- package/lib/types/common.d.ts +32 -13
- package/lib/types/common.js +2 -1
- package/lib/types/ecosystem-notifications.d.ts +142 -0
- package/lib/types/ecosystem-notifications.js +210 -0
- package/lib/types/ecosystem.d.ts +77 -0
- package/lib/types/ecosystem.js +119 -0
- package/lib/types/error-codes.d.ts +81 -0
- package/lib/types/error-codes.js +108 -1
- package/lib/types/feature-flags.d.ts +21 -1
- package/lib/types/feature-flags.js +36 -2
- package/lib/types/index.d.ts +14 -9
- package/lib/types/index.js +15 -10
- package/lib/types/permissions.d.ts +46 -8
- package/lib/types/permissions.js +75 -12
- package/lib/types/plugin-catalog.d.ts +35 -0
- package/lib/types/plugin-catalog.js +39 -0
- package/lib/types/plugin-health.d.ts +102 -0
- package/lib/types/plugin-health.js +184 -0
- package/lib/types/quota-tiers.d.ts +15 -0
- package/lib/types/quota-tiers.js +23 -3
- package/lib/types/wire-vocabulary.d.ts +102 -0
- package/lib/types/wire-vocabulary.js +94 -0
- package/lib/utils/alias-resolver.js +2 -2
- package/lib/utils/audit.d.ts +5 -2
- package/lib/utils/audit.js +6 -3
- package/lib/utils/compliance-attributes.js +3 -4
- package/lib/utils/concurrency.d.ts +7 -0
- package/lib/utils/concurrency.js +13 -1
- package/lib/utils/env.d.ts +3 -4
- package/lib/utils/env.js +4 -5
- package/lib/utils/identity.d.ts +13 -4
- package/lib/utils/identity.js +18 -10
- package/lib/utils/index.d.ts +13 -10
- package/lib/utils/index.js +13 -10
- package/lib/utils/jwk.d.ts +4 -0
- package/lib/utils/jwk.js +13 -1
- package/lib/utils/logger.d.ts +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/object.d.ts +11 -0
- package/lib/utils/object.js +24 -1
- package/lib/utils/params.d.ts +8 -22
- package/lib/utils/params.js +15 -43
- package/lib/utils/plugin-compliance.d.ts +98 -0
- package/lib/utils/plugin-compliance.js +78 -0
- package/lib/utils/proof-of-work.d.ts +69 -0
- package/lib/utils/proof-of-work.js +139 -0
- package/lib/utils/response.d.ts +16 -6
- package/lib/utils/response.js +18 -15
- package/lib/utils/retention.d.ts +17 -0
- package/lib/utils/retention.js +30 -0
- package/lib/utils/secret-encryption.d.ts +7 -7
- package/lib/utils/secret-encryption.js +9 -10
- package/lib/utils/secret-rotation.js +2 -2
- package/lib/utils/sensitive-patterns.js +4 -5
- package/lib/utils/service-registry.d.ts +15 -0
- package/lib/utils/service-registry.js +24 -0
- package/lib/utils/ssrf.d.ts +11 -2
- package/lib/utils/ssrf.js +112 -33
- package/lib/validation/ai-schemas.js +3 -2
- package/lib/validation/common-schemas.d.ts +0 -9
- package/lib/validation/common-schemas.js +1 -7
- package/lib/validation/dockerfile-static.d.ts +26 -0
- package/lib/validation/dockerfile-static.js +210 -0
- package/lib/validation/index.d.ts +13 -4
- package/lib/validation/index.js +14 -5
- package/lib/validation/message-schemas.js +6 -4
- package/lib/validation/pipeline-schemas.d.ts +8 -2
- package/lib/validation/pipeline-schemas.js +30 -4
- package/lib/validation/plugin-base-images.d.ts +20 -0
- package/lib/validation/plugin-base-images.js +17 -0
- package/lib/validation/plugin-catalog-detect.d.ts +86 -0
- package/lib/validation/plugin-catalog-detect.js +237 -0
- package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
- package/lib/validation/plugin-catalog-metadata.js +162 -0
- package/lib/validation/plugin-heuristics.d.ts +41 -0
- package/lib/validation/plugin-heuristics.js +211 -0
- package/lib/validation/plugin-lint.d.ts +18 -0
- package/lib/validation/plugin-lint.js +136 -0
- package/lib/validation/plugin-name-confusable.d.ts +15 -0
- package/lib/validation/plugin-name-confusable.js +81 -0
- package/lib/validation/plugin-schemas.d.ts +40 -26
- package/lib/validation/plugin-schemas.js +26 -23
- package/lib/validation/plugin-spec-schema.d.ts +112 -0
- package/lib/validation/plugin-spec-schema.js +163 -0
- package/lib/validation/plugin-template-contract.d.ts +64 -0
- package/lib/validation/plugin-template-contract.js +113 -0
- package/package.json +69 -4
- package/lib/testing/mock-api-core.d.ts +0 -150
- package/lib/testing/mock-api-core.js +0 -246
- package/lib/testing/mock-drizzle.d.ts +0 -6
- package/lib/testing/mock-drizzle.js +0 -57
- package/lib/testing/route-coverage.d.ts +0 -64
- package/lib/testing/route-coverage.js +0 -183
- package/lib/testing/service-tokens.d.ts +0 -66
- package/lib/testing/service-tokens.js +0 -137
- package/lib/testing/tier-mock.d.ts +0 -44
- package/lib/testing/tier-mock.js +0 -65
- package/lib/testing/user-tokens.d.ts +0 -75
- package/lib/testing/user-tokens.js +0 -115
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reporting-retention bounds, shared by billing (which computes and pushes
|
|
3
|
+
* an org's effective entitlement), reporting (which accepts it and caps report
|
|
4
|
+
* ranges) and the data layer (which sweeps).
|
|
5
|
+
*/
|
|
6
|
+
export declare const RETENTION_MIN_DAYS = 1;
|
|
7
|
+
/** Absolute ceiling (days) for retained data and report ranges. */
|
|
8
|
+
export declare const RETENTION_MAX_DAYS = 730;
|
|
9
|
+
/** The "keep forever" sentinel an unlimited tier carries. */
|
|
10
|
+
export declare const RETENTION_UNLIMITED = -1;
|
|
11
|
+
/** Clamp a retention to the ceiling; the unlimited sentinel passes through. */
|
|
12
|
+
export declare function clampRetentionDays(days: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Validate an untrusted retention value: the unlimited sentinel, or an integer
|
|
15
|
+
* ≥ 1 clamped to the ceiling. Anything else (non-integer, 0, < -1) → `null`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeRetentionDays(value: unknown): number | null;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* The reporting-retention bounds, shared by billing (which computes and pushes
|
|
5
|
+
* an org's effective entitlement), reporting (which accepts it and caps report
|
|
6
|
+
* ranges) and the data layer (which sweeps).
|
|
7
|
+
*/
|
|
8
|
+
export const RETENTION_MIN_DAYS = 1;
|
|
9
|
+
/** Absolute ceiling (days) for retained data and report ranges. */
|
|
10
|
+
export const RETENTION_MAX_DAYS = 730;
|
|
11
|
+
/** The "keep forever" sentinel an unlimited tier carries. */
|
|
12
|
+
export const RETENTION_UNLIMITED = -1;
|
|
13
|
+
/** Clamp a retention to the ceiling; the unlimited sentinel passes through. */
|
|
14
|
+
export function clampRetentionDays(days) {
|
|
15
|
+
return days === RETENTION_UNLIMITED ? RETENTION_UNLIMITED : Math.min(days, RETENTION_MAX_DAYS);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate an untrusted retention value: the unlimited sentinel, or an integer
|
|
19
|
+
* ≥ 1 clamped to the ceiling. Anything else (non-integer, 0, < -1) → `null`.
|
|
20
|
+
*/
|
|
21
|
+
export function normalizeRetentionDays(value) {
|
|
22
|
+
if (typeof value !== 'number' || !Number.isInteger(value))
|
|
23
|
+
return null;
|
|
24
|
+
if (value === RETENTION_UNLIMITED)
|
|
25
|
+
return RETENTION_UNLIMITED;
|
|
26
|
+
if (value < RETENTION_MIN_DAYS)
|
|
27
|
+
return null;
|
|
28
|
+
return clampRetentionDays(value);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0ZW50aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JldGVudGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDcEMsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUN0Qyw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFdEMsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQzdDLE9BQU8sSUFBSSxLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEtBQWM7SUFDbkQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZFLElBQUksS0FBSyxLQUFLLG1CQUFtQjtRQUFFLE9BQU8sbUJBQW1CLENBQUM7SUFDOUQsSUFBSSxLQUFLLEdBQUcsa0JBQWtCO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDNUMsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIHJlcG9ydGluZy1yZXRlbnRpb24gYm91bmRzLCBzaGFyZWQgYnkgYmlsbGluZyAod2hpY2ggY29tcHV0ZXMgYW5kIHB1c2hlc1xuICogYW4gb3JnJ3MgZWZmZWN0aXZlIGVudGl0bGVtZW50KSwgcmVwb3J0aW5nICh3aGljaCBhY2NlcHRzIGl0IGFuZCBjYXBzIHJlcG9ydFxuICogcmFuZ2VzKSBhbmQgdGhlIGRhdGEgbGF5ZXIgKHdoaWNoIHN3ZWVwcykuXG4gKi9cbmV4cG9ydCBjb25zdCBSRVRFTlRJT05fTUlOX0RBWVMgPSAxO1xuLyoqIEFic29sdXRlIGNlaWxpbmcgKGRheXMpIGZvciByZXRhaW5lZCBkYXRhIGFuZCByZXBvcnQgcmFuZ2VzLiAqL1xuZXhwb3J0IGNvbnN0IFJFVEVOVElPTl9NQVhfREFZUyA9IDczMDtcbi8qKiBUaGUgXCJrZWVwIGZvcmV2ZXJcIiBzZW50aW5lbCBhbiB1bmxpbWl0ZWQgdGllciBjYXJyaWVzLiAqL1xuZXhwb3J0IGNvbnN0IFJFVEVOVElPTl9VTkxJTUlURUQgPSAtMTtcblxuLyoqIENsYW1wIGEgcmV0ZW50aW9uIHRvIHRoZSBjZWlsaW5nOyB0aGUgdW5saW1pdGVkIHNlbnRpbmVsIHBhc3NlcyB0aHJvdWdoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wUmV0ZW50aW9uRGF5cyhkYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gZGF5cyA9PT0gUkVURU5USU9OX1VOTElNSVRFRCA/IFJFVEVOVElPTl9VTkxJTUlURUQgOiBNYXRoLm1pbihkYXlzLCBSRVRFTlRJT05fTUFYX0RBWVMpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuIHVudHJ1c3RlZCByZXRlbnRpb24gdmFsdWU6IHRoZSB1bmxpbWl0ZWQgc2VudGluZWwsIG9yIGFuIGludGVnZXJcbiAqIOKJpSAxIGNsYW1wZWQgdG8gdGhlIGNlaWxpbmcuIEFueXRoaW5nIGVsc2UgKG5vbi1pbnRlZ2VyLCAwLCA8IC0xKSDihpIgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmV0ZW50aW9uRGF5cyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHJldHVybiBudWxsO1xuICBpZiAodmFsdWUgPT09IFJFVEVOVElPTl9VTkxJTUlURUQpIHJldHVybiBSRVRFTlRJT05fVU5MSU1JVEVEO1xuICBpZiAodmFsdWUgPCBSRVRFTlRJT05fTUlOX0RBWVMpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXBSZXRlbnRpb25EYXlzKHZhbHVlKTtcbn1cbiJdfQ==
|
|
@@ -138,13 +138,13 @@ export declare class PerOrgKmsKeyProvider implements KeyProvider {
|
|
|
138
138
|
* RESOLVED — either it has a per-org master (use it) or it provably has no
|
|
139
139
|
* per-org config (the fallback is then the right answer).
|
|
140
140
|
*
|
|
141
|
-
* For an UNRESOLVED org this THROWS rather than guessing.
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* both-kids-present mismatch guard could never fire —
|
|
145
|
-
* undecryptable once the org warmed
|
|
146
|
-
* auth-tag error with no diagnostic. Failing loud here matches
|
|
147
|
-
* `KmsKeyProvider.deriveKey`, which
|
|
141
|
+
* For an UNRESOLVED org this THROWS rather than guessing. Falling through to
|
|
142
|
+
* the fallback would silently encrypt that org's secrets under the SHARED
|
|
143
|
+
* master and — because `kidFor` also returns undefined, so the
|
|
144
|
+
* both-kids-present mismatch guard could never fire — leave them permanently
|
|
145
|
+
* undecryptable once the org warmed (`decipher.final()` throws an opaque
|
|
146
|
+
* auth-tag error with no diagnostic). Failing loud here matches
|
|
147
|
+
* `KmsKeyProvider.deriveKey`, which refuses to work cold.
|
|
148
148
|
*
|
|
149
149
|
* `encryptSecret`/`decryptSecret` are async and await `deriveKeyAsync`, so
|
|
150
150
|
* they resolve the org first and never hit this path; it is the backstop for
|
|
@@ -93,8 +93,7 @@ export class EnvKeyProvider {
|
|
|
93
93
|
*/
|
|
94
94
|
/**
|
|
95
95
|
* KMS-decrypt a base64 ciphertext into a 32-byte key. Shared by both KMS key
|
|
96
|
-
* providers (single-master + per-org)
|
|
97
|
-
* dynamic-import + Decrypt + empty/length guards. `@aws-sdk/client-kms` is
|
|
96
|
+
* providers (single-master + per-org). `@aws-sdk/client-kms` is
|
|
98
97
|
* dynamically imported so EnvKeyProvider-only envs never load the SDK.
|
|
99
98
|
*/
|
|
100
99
|
async function kmsDecrypt32(keyId, ciphertextB64, region, endpoint) {
|
|
@@ -257,13 +256,13 @@ export class PerOrgKmsKeyProvider {
|
|
|
257
256
|
* RESOLVED — either it has a per-org master (use it) or it provably has no
|
|
258
257
|
* per-org config (the fallback is then the right answer).
|
|
259
258
|
*
|
|
260
|
-
* For an UNRESOLVED org this THROWS rather than guessing.
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
* both-kids-present mismatch guard could never fire —
|
|
264
|
-
* undecryptable once the org warmed
|
|
265
|
-
* auth-tag error with no diagnostic. Failing loud here matches
|
|
266
|
-
* `KmsKeyProvider.deriveKey`, which
|
|
259
|
+
* For an UNRESOLVED org this THROWS rather than guessing. Falling through to
|
|
260
|
+
* the fallback would silently encrypt that org's secrets under the SHARED
|
|
261
|
+
* master and — because `kidFor` also returns undefined, so the
|
|
262
|
+
* both-kids-present mismatch guard could never fire — leave them permanently
|
|
263
|
+
* undecryptable once the org warmed (`decipher.final()` throws an opaque
|
|
264
|
+
* auth-tag error with no diagnostic). Failing loud here matches
|
|
265
|
+
* `KmsKeyProvider.deriveKey`, which refuses to work cold.
|
|
267
266
|
*
|
|
268
267
|
* `encryptSecret`/`decryptSecret` are async and await `deriveKeyAsync`, so
|
|
269
268
|
* they resolve the org first and never hit this path; it is the backstop for
|
|
@@ -464,4 +463,4 @@ export function isEncryptedBlob(value) {
|
|
|
464
463
|
&& typeof value.iv === 'string'
|
|
465
464
|
&& typeof value.ciphertext === 'string');
|
|
466
465
|
}
|
|
467
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjcmV0LWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUE2QmpGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNSLFNBQVMsQ0FBUztJQUVuQyxZQUFZLGlCQUEwQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNy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TSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxPQUFPLENBQUUsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUM3QixLQUFLLEtBQUssSUFBSTtXQUNiLEtBQTJCLENBQUMsR0FBRyxLQUFLLGdCQUFnQjtXQUNyRCxPQUFRLEtBQTBCLENBQUMsRUFBRSxLQUFLLFFBQVE7V0FDbEQsT0FBUSxLQUFrQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQ3RFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogIFBlci1vcmcgZW52ZWxvcGUgZW5jcnlwdGlvbiBmb3Igc2VjcmV0IGNvbHVtbnMuXG4gKlxuICogVG9kYXkncyBwb3N0dXJlIGZvciBvcmctc2NvcGVkIHNlY3JldHMgKGFpUHJvdmlkZXJLZXlzLCB3ZWJob29rIFVSTHMsXG4gKiByZWdpc3RyeSBjcmVkZW50aWFscykgaXMgY2xlYXItdGV4dCBpbiBNb25nbyAvIFBvc3RncmVzIHdpdGggYXBwLWxheWVyXG4gKiBtYXNraW5nIG9uIG91dHB1dC4gVGhpcyBtb2R1bGUgaXMgdGhlIGVuY3J5cHRpb24gcHJpbWl0aXZlIHRoYXQgbGV0cyB0aGVcbiAqIG1vZGVsIGxheWVyIHN3YXAgY2xlYXItdGV4dCBzdHJpbmdzIGZvciBgRW5jcnlwdGVkQmxvYmAgdmFsdWVzIGF0IHdyaXRlXG4gKiB0aW1lIGFuZCBkZWNyeXB0IGF0IHJlYWQgdGltZS5cbiAqXG4gKiBDcnlwdG9ncmFwaHkgKiAtIEFFUy0yNTYtR0NNIChhdXRoZW50aWNhdGVkIGVuY3J5cHRpb24pLlxuICogLSBQZXItb3JnIGtleSBkZXJpdmVkIHZpYSBIS0RGLVNIQTI1NihtYXN0ZXJLZXksIHNhbHQ9b3JnSWQsIGluZm89J3NlY3JldHMtdjEnKS5cbiAqIEVhY2ggb3JnIGdldHMgYSB1bmlxdWUga2V5IHdpdGhvdXQgb3BlcmF0b3Iga2V5LW1hbmFnZW1lbnQgY2VyZW1vbnkuXG4gKiAtIDEyLWJ5dGUgSVYgZ2VuZXJhdGVkIHBlciBlbmNyeXB0aW9uIHdpdGggYGNyeXB0by5yYW5kb21CeXRlc2AuXG4gKiAtIDE2LWJ5dGUgYXV0aGVudGljYXRpb24gdGFnIGNvbmNhdGVuYXRlZCB3aXRoIGNpcGhlcnRleHQgKHN0YW5kYXJkIEdDTSkuXG4gKlxuICogT3BlcmF0b3IgY29uZmlndXJhdGlvbiAqIC0gYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAgZW52OiBoZXgtIG9yIGJhc2U2NC1lbmNvZGVkIDMyLWJ5dGUgbWFzdGVyIGtleS5cbiAqIFJlcXVpcmVkIHdoZW4gYGVuY3J5cHRTZWNyZXRgL2BkZWNyeXB0U2VjcmV0YCBhcmUgY2FsbGVkLiBNaXNzaW5nIGtleVxuICogdGhyb3dzICBlbmNyeXB0aW9uIGlzIGZhaWwtY2xvc2VkOyB3ZSBuZXZlciBzaWxlbnRseSByb3VuZC10cmlwIGFcbiAqIHNlY3JldCBhcyBwbGFpbnRleHQuXG4gKlxuICogS01TIG1pZ3JhdGlvbiBwYXRoICogLSBUaGUgdHdvIGV4cG9ydGVkIGZ1bmN0aW9ucyB0YWtlIGEgYHByb3ZpZGVyYCBwYXJhbWV0ZXIuIFRoZSBkZWZhdWx0XG4gKiBgRW52S2V5UHJvdmlkZXJgIGltcGxlbWVudHMgSEtERiBkZXJpdmF0aW9uLiBBIGZ1dHVyZSBgQXdzS21zUHJvdmlkZXJgXG4gKiBwbHVncyBpbiBoZXJlOiBpdCBjYW4gY2FsbCBLTVMgYEVuY3J5cHRgIC8gYERlY3J5cHRgIHRvIHdyYXAgYSBERUtcbiAqIHJhdGhlciB0aGFuIGhvbGRpbmcgYSBtYXN0ZXIga2V5IGluIGVudi4gVGhlIG9uLWRpc2sgYmxvYiBzaGFwZVxuICogKGB7IGFsZywgaXYsIGNpcGhlcnRleHQsIGtpZD8gfWApIGlzIGZvcndhcmQtY29tcGF0aWJsZSAgYGtpZGBcbiAqIGNhcnJpZXMgdGhlIEtNUyBrZXkgaWQgd2hlbiB0aGUgcHJvdmlkZXIgbmVlZHMgaXQuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQ2lwaGVyaXYsIGNyZWF0ZURlY2lwaGVyaXYsIGhrZGZTeW5jLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbi8qKiBPbi1kaXNrIHNoYXBlIG9mIGFuIGVuY3J5cHRlZCBzZWNyZXQuIEpTT04tc2VyaWFsaXphYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0ZWRCbG9iIHtcbiAgLyoqIEFsZ29yaXRobSB0YWcuIEJ1bXAgb24gZm9ybWF0IGNoYW5nZSBzbyBhIGZ1dHVyZSBtaWdyYXRpb24gY2FuIGRldGVjdCBvbGQgYmxvYnMuICovXG4gIGFsZzogJ2Flcy0yNTYtZ2NtLXYxJztcbiAgLyoqIEJhc2U2NC1lbmNvZGVkIDEyLWJ5dGUgSVYuICovXG4gIGl2OiBzdHJpbmc7XG4gIC8qKiBCYXNlNjQtZW5jb2RlZCBjaXBoZXJ0ZXh0ICsgMTYtYnl0ZSBhdXRoZW50aWNhdGlvbiB0YWcgY29uY2F0ZW5hdGVkLiAqL1xuICBjaXBoZXJ0ZXh0OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBrZXkgaWQgIHBvcHVsYXRlZCBieSBLTVMtYmFja2VkIHByb3ZpZGVycywgaWdub3JlZCBieSB0aGUgZW52IHByb3ZpZGVyLiAqL1xuICBraWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQbHVnZ2FibGUga2V5IHNvdXJjZS4gRW52LWJhY2tlZCBieSBkZWZhdWx0OyBLTVMtYmFja2VkIGF2YWlsYWJsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5UHJvdmlkZXIge1xuICAvKiogRGVyaXZlIGEgMzItYnl0ZSBzeW1tZXRyaWMga2V5IGJvdW5kIHRvIGBvcmdJZGAuICovXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyO1xuICAvKiogT3B0aW9uYWwgYXN5bmMgdmFyaWFudCBmb3IgcHJvdmlkZXJzIHRoYXQgbmVlZCB0byBkbyBJL08gKGUuZy5cbiAgICogIHBlci1vcmcgS01TIGxvb2t1cCB0aGUgZmlyc3QgdGltZSBhbiBvcmcgaXMgc2VlbikuIERlZmF1bHRcbiAgICogIGltcGxlbWVudGF0aW9uIGZvcndhcmRzIHRvIHRoZSBzeW5jIGBkZXJpdmVLZXlgLiAqL1xuICBkZXJpdmVLZXlBc3luYz8ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgLyoqIE9wdGlvbmFsIEtNUy1rZXktaWQgdGhpcyBwcm92aWRlciB1c2VkIGZvciBgb3JnSWRgLiBFbWJlZGRlZCBpbiB0aGVcbiAgICogIGBFbmNyeXB0ZWRCbG9iLmtpZGAgZmllbGQgb24gd3JpdGUgc28gZGVjcnlwdCBjYW4gdmVyaWZ5IHRoZSByaWdodFxuICAgKiAgS01TIENNSyBpcyBiZWluZyB1c2VkIChkZWZlbnNlIGFnYWluc3QgYW4gYXR0YWNrZXIgd2hvIHN3YXBzIGEgYmxvYlxuICAgKiAgYmV0d2VlbiBvcmdzKS4gRGVmYXVsdCByZXR1cm5zIHVuZGVmaW5lZCAoZW52IHByb3ZpZGVyKS4gKi9cbiAga2lkRm9yPyhvcmdJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlZmF1bHQgcHJvdmlkZXIgIGRlcml2ZXMgYSBwZXItb3JnIGtleSBmcm9tIGBTRUNSRVRfRU5DUllQVElPTl9LRVlgIHZpYVxuICogSEtERi1TSEEyNTYuIFN1aXRhYmxlIGZvciBzZWxmLWhvc3RlZCAvIGRldiB3aGVyZSBvcGVyYXRvcnMgZG9uJ3QgaGF2ZSBLTVMuXG4gKlxuICogRmFpbHMgZmFzdCBpZiB0aGUgZW52IGlzIG1pc3Npbmcgb3IgdGhlIGtleSBpcyB0aGUgd3JvbmcgbGVuZ3RoIHNvIG1pc2NvbmZpZ1xuICogc3VyZmFjZXMgYXQgZmlyc3QgdXNlIHJhdGhlciB0aGFuIHNpbGVudGx5IGZpbmdlcnByaW50aW5nIGFsbCB3cml0ZXMgd2l0aFxuICogYSBkZWZhdWx0IHplcm8ga2V5LlxuICovXG5leHBvcnQgY2xhc3MgRW52S2V5UHJvdmlkZXIgaW1wbGVtZW50cyBLZXlQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyS2V5OiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobWFzdGVyS2V5T3ZlcnJpZGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByYXcgPSBtYXN0ZXJLZXlPdmVycmlkZSA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LRVk7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS0VZIGVudiBpcyByZXF1aXJlZCBmb3Igc2VjcmV0IGVuY3J5cHRpb24nKTtcbiAgICB9XG4gICAgLy8gQWNjZXB0IGVpdGhlciBoZXggKDY0IGNoYXJzKSBvciBiYXNlNjQgKDQ0IGNoYXJzIGluY2x1ZGluZyBwYWRkaW5nKSBmb3JcbiAgICAvLyBvcGVyYXRvciBjb252ZW5pZW5jZSAgYm90aCBkZWNvZGUgdG8gYSAzMi1ieXRlIGtleS5cbiAgICBjb25zdCBkZWNvZGVkID0gcmF3Lmxlbmd0aCA9PT0gNjQgJiYgL15bMC05YS1mXSskL2kudGVzdChyYXcpXG4gICAgICA/IEJ1ZmZlci5mcm9tKHJhdywgJ2hleCcpXG4gICAgICA6IEJ1ZmZlci5mcm9tKHJhdywgJ2Jhc2U2NCcpO1xuICAgIGlmIChkZWNvZGVkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU0VDUkVUX0VOQ1JZUFRJT05fS0VZIG11c3QgZGVjb2RlIHRvIDMyIGJ5dGVzIChnb3QgJHtkZWNvZGVkLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHRoaXMubWFzdGVyS2V5ID0gZGVjb2RlZDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICAvLyBIS0RGIGJpbmRzIHRoZSBtYXN0ZXIga2V5IHRvIHRoZSBvcmcgc28gdHdvIG9yZ3MgZW5jcnlwdGluZyB0aGUgc2FtZVxuICAgIC8vIHBsYWludGV4dCBwcm9kdWNlIGRpZmZlcmVudCBjaXBoZXJ0ZXh0cyAga2VlcHMgYSBzdG9sZW4gREIgdW5hYmxlIHRvXG4gICAgLy8gdGVsbCB3aGljaCBvcmdzIHNoYXJlIHNlY3JldHMgdmlhIGNpcGhlcnRleHQgY29tcGFyaXNvbi5cbiAgICBjb25zdCBkZXJpdmVkID0gaGtkZlN5bmMoICdzaGEyNTYnLFxuICAgICAgdGhpcy5tYXN0ZXJLZXksXG4gICAgICBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSxcbiAgICAgICdzZWNyZXRzLXYxJyxcbiAgICAgIDMyLFxuICAgICk7XG4gICAgLy8gaGtkZlN5bmMgcmV0dXJucyBBcnJheUJ1ZmZlciBpbiBvbGRlciBOb2RlIHR5cGluZ3M7IG5vcm1hbGl6ZSB0byBCdWZmZXIuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG59XG5cbi8qKlxuICogIEFXUy1LTVMtYmFja2VkIEtleVByb3ZpZGVyLlxuICpcbiAqIFRyYWRlLW9mZiBwaWNrZWQ6IHN0b3JlIE9ORSBtYXN0ZXIga2V5IGVuY3J5cHRlZCB1bmRlciBhIEtNUyBDTUs7IG9uXG4gKiBmaXJzdCB1c2UsIGNhbGwgYGttczpEZWNyeXB0YCB0byByZWNvdmVyIHRoZSBtYXN0ZXIga2V5IGJ5dGVzOyBIS0RGLVxuICogZGVyaXZlIHBlci1vcmcgZnJvbSBpdCAoc2FtZSBhcyBFbnZLZXlQcm92aWRlcikuIFRoZSBwcm9jZXNzIHRoZW4gaG9sZHNcbiAqIHRoZSBwbGFpbnRleHQgbWFzdGVyIGtleSBpbiBtZW1vcnkgdW50aWwgcmVzdGFydC5cbiAqXG4gKiBQUk9TOiBvbmUgS01TIGNhbGwgcGVyIHByb2Nlc3MgbGlmZXRpbWUgKGNoZWFwLCBsb3cgcDk5IGltcGFjdCksXG4gKiB0aGUgZW5jcnlwdGVkLW1hc3Rlci1rZXkgYmxvYiBpcyBzYWZlIHRvIGNvbW1pdC9sb2cvY2hlY2tpbixcbiAqIEtNUyBhdWRpdCBsb2cgcmVjb3JkcyB3aGVuIHRoZSBtYXN0ZXIgaXMgcmVjb3ZlcmVkLlxuICogQ09OUzogcHJvY2VzcyBtZW1vcnkgc3RpbGwgaG9sZHMgdGhlIG1hc3RlciBrZXkgIHNhbWUgcG9zdHVyZSBhc1xuICogRW52S2V5UHJvdmlkZXIgb25jZSB3YXJtZWQgdXAuIEZvciBzdHJvbmdlciBpc29sYXRpb24gYW5cbiAqIG9wZXJhdG9yIGNhbiBtb3ZlIHRvIHBlci1yZWNvcmQgZW52ZWxvcGUgZW5jcnlwdGlvbiAoY2FsbFxuICogR2VuZXJhdGVEYXRhS2V5IG9uIGV2ZXJ5IHdyaXRlKTsgdGhhdCdzIGEgZm9sbG93LW9uLlxuICpcbiAqIE9wZXJhdG9yIHNldHVwICogMS4gQ3JlYXRlIGEgS01TIENNSyB3aXRoIGtleSBwb2xpY3kgYWxsb3dpbmcgdGhlIHBsYXRmb3JtIHNlcnZpY2Unc1xuICogSUFNIHJvbGUga21zOkRlY3J5cHQuXG4gKiAyLiBHZW5lcmF0ZSBhIHJhbmRvbSAzMi1ieXRlIG1hc3RlciAqIGhlYWQgLWMgMzIgL2Rldi91cmFuZG9tIHwgYmFzZTY0XG4gKiAzLiBXcmFwIGl0IHdpdGggS01TICogYXdzIGttcyBlbmNyeXB0IC0ta2V5LWlkIDxLRVlfSUQ+IFxcXG4gKiAtLXBsYWludGV4dCA8YmFzZTY0LWZyb20tc3RlcC0yPiAtLW91dHB1dCB0ZXh0IFxcXG4gKiAtLXF1ZXJ5IENpcGhlcnRleHRCbG9iXG4gKiA0LiBTZXQgb24gdGhlIHNlcnZpY2UgKiBTRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEPTxLRVlfSUQ+XG4gKiBTRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVD08YmFzZTY0LW91dHB1dC1vZi1zdGVwLTM+XG4gKiA1LiBQaWNrIHRoaXMgcHJvdmlkZXIgdmlhIGBzZXRLZXlQcm92aWRlcihuZXcgS21zS2V5UHJvdmlkZXIoKSlgLlxuICpcbiAqIENvbnN0cnVjdCBsYXppbHkgIGltcG9ydGluZyB0aGUgQVdTIFNESyBoYXMgYSBub24tdHJpdmlhbCBjb2xkLXN0YXJ0XG4gKiBjb3N0IHNvIGVudnMgdGhhdCBzdGF5IG9uIEVudktleVByb3ZpZGVyIG5ldmVyIGxvYWQgaXQuXG4gKi9cbi8qKlxuICogS01TLWRlY3J5cHQgYSBiYXNlNjQgY2lwaGVydGV4dCBpbnRvIGEgMzItYnl0ZSBrZXkuIFNoYXJlZCBieSBib3RoIEtNUyBrZXlcbiAqIHByb3ZpZGVycyAoc2luZ2xlLW1hc3RlciArIHBlci1vcmcpLCB3aGljaCBwcmV2aW91c2x5IGNvcHktcGFzdGVkIHRoaXNcbiAqIGR5bmFtaWMtaW1wb3J0ICsgRGVjcnlwdCArIGVtcHR5L2xlbmd0aCBndWFyZHMuIGBAYXdzLXNkay9jbGllbnQta21zYCBpc1xuICogZHluYW1pY2FsbHkgaW1wb3J0ZWQgc28gRW52S2V5UHJvdmlkZXItb25seSBlbnZzIG5ldmVyIGxvYWQgdGhlIFNESy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24ga21zRGVjcnlwdDMyKGtleUlkOiBzdHJpbmcsIGNpcGhlcnRleHRCNjQ6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBlbmRwb2ludD86IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHsgS01TQ2xpZW50LCBEZWNyeXB0Q29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQta21zJyk7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBLTVNDbGllbnQoeyByZWdpb24sIC4uLihlbmRwb2ludCA/IHsgZW5kcG9pbnQgfSA6IHt9KSB9KTtcbiAgY29uc3QgcmVzcCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZWNyeXB0Q29tbWFuZCh7XG4gICAgS2V5SWQ6IGtleUlkLFxuICAgIENpcGhlcnRleHRCbG9iOiBCdWZmZXIuZnJvbShjaXBoZXJ0ZXh0QjY0LCAnYmFzZTY0JyksXG4gIH0pKTtcbiAgaWYgKCFyZXNwLlBsYWludGV4dCkgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCBhbiBlbXB0eSBQbGFpbnRleHQgZm9yIGtleSAke2tleUlkfWApO1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShyZXNwLlBsYWludGV4dCk7XG4gIGlmIChidWYubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCAke2J1Zi5sZW5ndGh9LWJ5dGUga2V5IGZvciAke2tleUlkfTsgZXhwZWN0ZWQgMzJgKTtcbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IGNsYXNzIEttc0tleVByb3ZpZGVyIGltcGxlbWVudHMgS2V5UHJvdmlkZXIge1xuICBwcml2YXRlIG1hc3RlcktleUNhY2hlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBrZXlJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNpcGhlcnRleHRCNjQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgZGVjcnlwdEluRmxpZ2h0OiBQcm9taXNlPEJ1ZmZlcj4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihvcHRzPzogeyBrZXlJZD86IHN0cmluZzsgY2lwaGVydGV4dEJhc2U2ND86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBlbmRwb2ludD86IHN0cmluZyB9KSB7XG4gICAgY29uc3Qga2V5SWQgPSBvcHRzPy5rZXlJZCA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEO1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBvcHRzPy5jaXBoZXJ0ZXh0QmFzZTY0ID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUO1xuICAgIGlmICgha2V5SWQpIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRCBlbnYgaXMgcmVxdWlyZWQgZm9yIEttc0tleVByb3ZpZGVyJyk7XG4gICAgaWYgKCFjaXBoZXJ0ZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ1NFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUIGVudiBpcyByZXF1aXJlZCBmb3IgS21zS2V5UHJvdmlkZXInKTtcbiAgICB0aGlzLmtleUlkID0ga2V5SWQ7XG4gICAgdGhpcy5jaXBoZXJ0ZXh0QjY0ID0gY2lwaGVydGV4dDtcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHM/LnJlZ2lvbiA/PyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID8/IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjtcbiAgICB0aGlzLmVuZHBvaW50ID0gb3B0cz8uZW5kcG9pbnQgPz8gcHJvY2Vzcy5lbnYuQVdTX0tNU19FTkRQT0lOVDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMubWFzdGVyS2V5Q2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvciggJ0ttc0tleVByb3ZpZGVyIGlzIG5vdCB3YXJtZWQgdXAuIENhbGwgYGF3YWl0IHByb3ZpZGVyLndhcm11cCgpYCBvbmNlIGF0IHNlcnZpY2Ugc3RhcnR1cCBiZWZvcmUgYW55IGVuY3J5cHQvZGVjcnlwdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IGhrZGZTeW5jKCdzaGEyNTYnLCB0aGlzLm1hc3RlcktleUNhY2hlLCBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSwgJ3NlY3JldHMtdjEnLCAzMik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVhZ2VybHkgcmVjb3ZlciB0aGUgbWFzdGVyIGtleSBmcm9tIEtNUyBzbyBzdWJzZXF1ZW50IGBkZXJpdmVLZXlgXG4gICAqIGNhbGxzIGFyZSBzeW5jLiBJZGVtcG90ZW50ICBjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgdGhlIHNhbWUgaW4tXG4gICAqIGZsaWdodCBwcm9taXNlIHNvIHdlIGRvbid0IHNwYXduIG11bHRpcGxlIEtNUyBEZWNyeXB0IHJlcXVlc3RzIGF0XG4gICAqIGJvb3QuIFRocm93cyBvbiBhbnkgS01TIGZhaWx1cmU7IHRoZSBjYWxsZXIgKHR5cGljYWxseSB0aGUgc2VydmljZSdzXG4gICAqIG9uQmVmb3JlU3RhcnQgaG9vaykgZGVjaWRlcyB3aGV0aGVyIHRvIGZhbGwgYmFjayB0byBhIGRpZmZlcmVudFxuICAgKiBwcm92aWRlciBvciBmYWlsLXN0YXJ0dXAuXG4gICAqL1xuICBhc3luYyB3YXJtdXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWFzdGVyS2V5Q2FjaGUpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuZGVjcnlwdEluRmxpZ2h0KSB7XG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IHRoaXMuZmV0Y2hBbmREZWNyeXB0KCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm1hc3RlcktleUNhY2hlID0gYXdhaXQgdGhpcy5kZWNyeXB0SW5GbGlnaHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHRyYW5zaWVudCBLTVMgZmFpbHVyZSBtdXN0IG5vdCBwZXJtYW5lbnRseSBwb2lzb24gdGhlIHByb3ZpZGVyOiBjbGVhclxuICAgICAgLy8gdGhlIHJlamVjdGVkIGluLWZsaWdodCBwcm9taXNlIHNvIGEgbGF0ZXIgd2FybXVwKCkgcmV0cmllcyBpbnN0ZWFkIG9mXG4gICAgICAvLyByZS1hd2FpdGluZyB0aGUgc2FtZSByZWplY3Rpb24gZm9yZXZlciAobWF0Y2hlcyBQZXJPcmdLbXNLZXlQcm92aWRlcikuXG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IG51bGw7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEFuZERlY3J5cHQoKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICByZXR1cm4ga21zRGVjcnlwdDMyKHRoaXMua2V5SWQsIHRoaXMuY2lwaGVydGV4dEI2NCwgdGhpcy5yZWdpb24sIHRoaXMuZW5kcG9pbnQpO1xuICB9XG59XG5cbi8vIExhenkgc2luZ2xldG9uICBvcGVyYXRvciBjb2RlIGluIGxvbmctbGl2ZWQgc2VydmljZXMgcGF5cyB0aGUgZW52LXBhcnNlXG4vLyBjb3N0IG9uY2UsIGFuZCB0ZXN0cyBjYW4gbWludCB0aGVpciBvd24gcHJvdmlkZXIgd2l0aCBhIGxpdGVyYWwga2V5LlxubGV0IGRlZmF1bHRQcm92aWRlcjogS2V5UHJvdmlkZXIgfCBudWxsID0gbnVsbDtcbmZ1bmN0aW9uIGdldERlZmF1bHRQcm92aWRlcigpOiBLZXlQcm92aWRlciB7XG4gIGlmICghZGVmYXVsdFByb3ZpZGVyKSBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRW52S2V5UHJvdmlkZXIoKTtcbiAgcmV0dXJuIGRlZmF1bHRQcm92aWRlcjtcbn1cblxuLyoqIFJlYWQgdGhlIGFjdGl2ZSBkZWZhdWx0IHByb3ZpZGVyLiBFeHBvc2VkIHNvIHNlcnZpY2UgY29kZSAoZS5nLiBhblxuICogIGFkbWluIGVuZHBvaW50IHRoYXQganVzdCByb3RhdGVkIGFuIG9yZydzIEtNUyBjb25maWcpIGNhbiBjYWxsXG4gKiAgYHByb3ZpZGVyLmV2aWN0KG9yZ0lkKWAgb24gdGhlIGxpdmUgcHJvdmlkZXIgcmF0aGVyIHRoYW4gcmVjb25zdHJ1Y3RpbmdcbiAqICBvbmUuIFRyaWdnZXJzIGxhenkgaW5pdGlhbGl6YXRpb24gb24gZmlyc3QgYWNjZXNzLCBzYW1lIGFzIHRoZSBpbnRlcm5hbFxuICogIGNhbGxlcnMgYmVsb3cuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEtleVByb3ZpZGVyKCk6IEtleVByb3ZpZGVyIHtcbiAgcmV0dXJuIGdldERlZmF1bHRQcm92aWRlcigpO1xufVxuXG4vKipcbiAqIFJvdGF0aW9uIGZhbGxiYWNrOiBhbiBgRW52S2V5UHJvdmlkZXJgIG92ZXIgYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VU2AsXG4gKiBvciBudWxsIHdoZW4gdGhhdCBlbnYgaXMgdW5zZXQuIGB1bmRlZmluZWRgID0gbm90IHlldCByZXNvbHZlZC4gV2hpbGUgYVxuICogbWFzdGVyLWtleSByb3RhdGlvbiBpcyBpbiBwcm9ncmVzcywgYGRlY3J5cHRTZWNyZXRgIHJldHJpZXMgYSBmYWlsZWQgZGVjcnlwdFxuICogdW5kZXIgdGhpcyBrZXksIHNvIHJvd3Mgd3JpdHRlbiB1bmRlciB0aGUgb2xkIG1hc3RlciBzdGF5IHJlYWRhYmxlIHVudGlsIHRoZVxuICogcmUtZW5jcnlwdGlvbiB0b29sIChwbGF0Zm9ybSBgc2NyaXB0cy9yZWVuY3J5cHQtc2VjcmV0cy5qc2ApIGhhcyByZXdyaXR0ZW5cbiAqIHRoZW0gdW5kZXIgdGhlIG5ldyBvbmUuIEVuY3J5cHRpb24gTkVWRVIgdXNlcyBpdC5cbiAqL1xubGV0IHByZXZpb3VzUHJvdmlkZXI6IEtleVByb3ZpZGVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldFByZXZpb3VzUHJvdmlkZXIoKTogS2V5UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByZXZpb3VzUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUztcbiAgICBwcmV2aW91c1Byb3ZpZGVyID0gcmF3ID8gbmV3IEVudktleVByb3ZpZGVyKHJhdykgOiBudWxsO1xuICB9XG4gIHJldHVybiBwcmV2aW91c1Byb3ZpZGVyO1xufVxuXG4vKiogUmVhZCB0aGUgcm90YXRpb24tZmFsbGJhY2sgcHJvdmlkZXIgKG51bGwgb3V0c2lkZSBhIG1hc3Rlci1rZXkgcm90YXRpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZpb3VzS2V5UHJvdmlkZXIoKTogS2V5UHJvdmlkZXIgfCBudWxsIHtcbiAgcmV0dXJuIGdldFByZXZpb3VzUHJvdmlkZXIoKTtcbn1cblxuLyoqIFJlc2V0IHRoZSBjYWNoZWQgZGVmYXVsdCAoYW5kIHByZXZpb3VzKSBwcm92aWRlciAgZm9yIHRlc3RzIHRoYXQgbXV0YXRlIGBwcm9jZXNzLmVudmAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREZWZhdWx0S2V5UHJvdmlkZXIoKTogdm9pZCB7IGRlZmF1bHRQcm92aWRlciA9IG51bGw7IHByZXZpb3VzUHJvdmlkZXIgPSB1bmRlZmluZWQ7IH1cblxuLyoqIFJlcGxhY2UgdGhlIGRlZmF1bHQgcHJvdmlkZXIgIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gS01TIGNhbGwgdGhpc1xuICogb25jZSBhdCBzdGFydHVwIHdpdGggYSB3YXJtZWQtdXAgYEttc0tleVByb3ZpZGVyYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRLZXlQcm92aWRlcihwcm92aWRlcjogS2V5UHJvdmlkZXIpOiB2b2lkIHsgZGVmYXVsdFByb3ZpZGVyID0gcHJvdmlkZXI7IH1cblxuLyoqIFBlci1vcmcgS01TIGNvbmZpZyB0aGUgb3BlcmF0b3Igc3VwcGxpZXMuIFRoZSBga2V5SWRgIGlkZW50aWZpZXMgdGhlXG4gKiAgS01TIENNSyB0byBjYWxsIERlY3J5cHQgb247IGBjaXBoZXJ0ZXh0QmFzZTY0YCBpcyB0aGUgd3JhcHBlZCAzMi1ieXRlXG4gKiAgbWFzdGVyIGdlbmVyYXRlZCBieSBgYXdzIGttcyBlbmNyeXB0YCBhZ2FpbnN0IHRoYXQga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJPcmdLbXNDb25maWcge1xuICBrZXlJZDogc3RyaW5nO1xuICBjaXBoZXJ0ZXh0QmFzZTY0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXN5bmMgcmVzb2x2ZXIgdGhhdCBtYXBzIGFuIG9yZyBpZCB0byBpdHMgS01TIGNvbmZpZy4gUmV0dXJucyBgbnVsbGAgd2hlblxuICogdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBwcm92aWRlciB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiBgZmFsbGJhY2tgIHByb3ZpZGVyIHN1cHBsaWVkIGF0IGNvbnN0cnVjdGlvbiAodXN1YWxseSBhbiBFbnZLZXlQcm92aWRlclxuICogb3IgYSBkZWZhdWx0IEttc0tleVByb3ZpZGVyKS5cbiAqL1xuZXhwb3J0IHR5cGUgUGVyT3JnS21zUmVzb2x2ZXIgPSAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxQZXJPcmdLbXNDb25maWcgfCBudWxsPjtcblxuLyoqXG4gKiBQZXItb3JnIEtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuIFRoZSBibGFzdCByYWRpdXMgb2YgYSBLTVMga2V5IGNvbXByb21pc2VcbiAqIGlzIG9uZSBvcmcgaW5zdGVhZCBvZiBldmVyeSBvcmcgdW5kZXIgYSBzaGFyZWQgbWFzdGVyLlxuICpcbiAqIEVhY2ggb3JnIGhhcyBpdHMgb3duIEtNUyBDTUsgKyBpdHMgb3duIHdyYXBwZWQgbWFzdGVyIChzdG9yZWQgaW4gTW9uZ29cbiAqIHZpYSB0aGUgb3BlcmF0b3IncyBzZXR1cCBzY3JpcHQpLiBPbiBmaXJzdCBlbmNyeXB0L2RlY3J5cHQgZm9yIGFuIG9yZyxcbiAqIHRoZSBwcm92aWRlcjpcbiAqICAgMS4gQ2FsbHMgdGhlIHJlc29sdmVyIHRvIGZldGNoIHRoZSBvcmcncyBLTVMgY29uZmlnLlxuICogICAyLiBDYWxscyBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIDMyLWJ5dGUgbWFzdGVyLlxuICogICAzLiBDYWNoZXMgdGhlIHJlY292ZXJlZCBtYXN0ZXIgaW4tbWVtb3J5IGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS5cbiAqICAgNC4gSEtERi1kZXJpdmVzIHBlci1jYWxsIGZyb20gdGhhdCBtYXN0ZXIgKyB0aGUgb3JnIGlkIHNhbHQuXG4gKlxuICogQmxvYnMgZW5jcnlwdGVkIGJ5IHRoaXMgcHJvdmlkZXIgY2FycnkgYGtpZCA9IDxrbXMta2V5LWlkPmAgc28gdGhlXG4gKiBkZWNyeXB0IHBhdGggZGV0ZWN0cyBhIHN0YWxlIGNvbmZpZyAob3BlcmF0b3Igcm90YXRlZCB0aGUga2V5IGJ1dFxuICogZXhpc3Rpbmcgcm93cyB3ZXJlbid0IHJlLWVuY3J5cHRlZCkgQkVGT1JFIEFFUy1HQ00gdGhyb3dzIGFuIG9wYXF1ZVxuICogYXV0aGVudGljYXRpb24tdGFnIGVycm9yLlxuICpcbiAqIE9yZ3Mgd2l0aG91dCBwZXItb3JnIGNvbmZpZyBmYWxsIHRocm91Z2ggdG8gdGhlIGBmYWxsYmFja2AgcHJvdmlkZXIg4oCUXG4gKiBtaXhlZC1tb2RlIGRlcGxveW1lbnRzIHdoZXJlIHNvbWUgb3JncyBoYXZlIEtNUyBpc29sYXRpb24gYW5kIG90aGVyc1xuICogc3RheSBvbiB0aGUgc2hhcmVkIG1hc3RlciBhcmUgZXhwbGljaXRseSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJPcmdLbXNLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgLyoqIENhY2hlZCBwZXItb3JnIG1hc3RlciBrZXlzLCBrZXllZCBieSBvcmdJZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsga2V5OiBCdWZmZXI7IGtpZDogc3RyaW5nIH0+KCk7XG4gIC8qKiBSZXNvbHZlZCBwZXItb3JnIGNvbmZpZ3MgY2FjaGVkIGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdzID0gbmV3IE1hcDxzdHJpbmcsIFBlck9yZ0ttc0NvbmZpZz4oKTtcbiAgLyoqIEluLWZsaWdodCByZXNvbHZlciBwcm9taXNlcyBzbyBjb25jdXJyZW50IGZpcnN0LXRvdWNoIGNhbGxlcnMgc2hhcmUgb25lIEtNUyBEZWNyeXB0LlxuICAgKiAgUmVzb2x2ZXMgdG8gYG51bGxgIGZvciBvcmdzIHdpdGggbm8gcGVyLW9yZyBjb25maWcg4oCUIGNhbGxlciB0cmVhdHMgbnVsbCBhc1xuICAgKiAgXCJmYWxsIHRocm91Z2ggdG8gdGhlIGZhbGxiYWNrIHByb3ZpZGVyXCIsIHNhbWUgYXMgYSBjb2xkIGNhY2hlIG1pc3MuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4+KCk7XG4gIC8qKiBPcmdzIHRoZSByZXNvbHZlciBoYXMgUFJPVkVOIGhhdmUgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBmYWxsYmFjayBwcm92aWRlclxuICAgKiAgaXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciB0aGVzZSwgYW5kIGBkZXJpdmVLZXlgIG1heSBzZXJ2ZSB0aGVtXG4gICAqICBzeW5jaHJvbm91c2x5LiBEaXN0aW5jdCBmcm9tIFwibm90IHlldCByZXNvbHZlZFwiLCB3aGljaCBtdXN0IG5vdCBndWVzcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZE5vUGVyT3JnQ29uZmlnID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBQcm92aWRlciB1c2VkIGZvciBvcmdzIHRoYXQgaGF2ZSBubyBwZXItb3JnIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFjazogS2V5UHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRzOiB7XG4gICAgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICAgIGZhbGxiYWNrOiBLZXlQcm92aWRlcjtcbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnJlc29sdmVyID0gb3B0cy5yZXNvbHZlcjtcbiAgICB0aGlzLmZhbGxiYWNrID0gb3B0cy5mYWxsYmFjaztcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHMucmVnaW9uID8/IHByb2Nlc3MuZW52LkFXU19SRUdJT04gPz8gcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBvcHRzLmVuZHBvaW50ID8/IHByb2Nlc3MuZW52LkFXU19LTVNfRU5EUE9JTlQ7XG4gIH1cblxuICAvKipcbiAgICogU3luYyBkZXJpdmUuIE9ubHkgY29ycmVjdCBmb3IgYW4gb3JnIHdob3NlIGNvbmZpZyBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIFJFU09MVkVEIOKAlCBlaXRoZXIgaXQgaGFzIGEgcGVyLW9yZyBtYXN0ZXIgKHVzZSBpdCkgb3IgaXQgcHJvdmFibHkgaGFzIG5vXG4gICAqIHBlci1vcmcgY29uZmlnICh0aGUgZmFsbGJhY2sgaXMgdGhlbiB0aGUgcmlnaHQgYW5zd2VyKS5cbiAgICpcbiAgICogRm9yIGFuIFVOUkVTT0xWRUQgb3JnIHRoaXMgVEhST1dTIHJhdGhlciB0aGFuIGd1ZXNzaW5nLiBJdCB1c2VkIHRvIGZhbGxcbiAgICogdGhyb3VnaCB0byB0aGUgZmFsbGJhY2ssIHdoaWNoIHNpbGVudGx5IGVuY3J5cHRlZCB0aGF0IG9yZydzIHNlY3JldHMgdW5kZXJcbiAgICogdGhlIFNIQVJFRCBtYXN0ZXIgYW5kIOKAlCBiZWNhdXNlIGBraWRGb3JgIGFsc28gcmV0dXJuZWQgdW5kZWZpbmVkLCBzbyB0aGVcbiAgICogYm90aC1raWRzLXByZXNlbnQgbWlzbWF0Y2ggZ3VhcmQgY291bGQgbmV2ZXIgZmlyZSDigJQgbGVmdCB0aGVtIHBlcm1hbmVudGx5XG4gICAqIHVuZGVjcnlwdGFibGUgb25jZSB0aGUgb3JnIHdhcm1lZDogYGRlY2lwaGVyLmZpbmFsKClgIHRoZW4gdGhyZXcgYW4gb3BhcXVlXG4gICAqIGF1dGgtdGFnIGVycm9yIHdpdGggbm8gZGlhZ25vc3RpYy4gRmFpbGluZyBsb3VkIGhlcmUgbWF0Y2hlc1xuICAgKiBgS21zS2V5UHJvdmlkZXIuZGVyaXZlS2V5YCwgd2hpY2ggaGFzIGFsd2F5cyByZWZ1c2VkIHRvIHdvcmsgY29sZC5cbiAgICpcbiAgICogYGVuY3J5cHRTZWNyZXRgL2BkZWNyeXB0U2VjcmV0YCBhcmUgYXN5bmMgYW5kIGF3YWl0IGBkZXJpdmVLZXlBc3luY2AsIHNvXG4gICAqIHRoZXkgcmVzb2x2ZSB0aGUgb3JnIGZpcnN0IGFuZCBuZXZlciBoaXQgdGhpcyBwYXRoOyBpdCBpcyB0aGUgYmFja3N0b3AgZm9yXG4gICAqIGEgY2FsbGVyIHRoYXQgcmVhY2hlcyBmb3IgdGhlIHN5bmMgQVBJIGRpcmVjdGx5LlxuICAgKi9cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubWFzdGVycy5nZXQob3JnSWQpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBpZiAodGhpcy5yZXNvbHZlZE5vUGVyT3JnQ29uZmlnLmhhcyhvcmdJZCkpIHJldHVybiB0aGlzLmZhbGxiYWNrLmRlcml2ZUtleShvcmdJZCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoIGBQZXJPcmdLbXNLZXlQcm92aWRlciBoYXMgbm90IHJlc29sdmVkIG9yZyAke29yZ0lkfS4gYFxuICAgICAgICArICdDYWxsIGBhd2FpdCBwcm92aWRlci5lbnN1cmVXYXJtZWQob3JnSWQpYCAob3IgdXNlIHRoZSBhc3luYyBlbmNyeXB0U2VjcmV0L2RlY3J5cHRTZWNyZXQpICdcbiAgICAgICAgKyAnYmVmb3JlIGRlcml2aW5nIGEga2V5IOKAlCBndWVzc2luZyB0aGUgc2hhcmVkIG1hc3RlciB3b3VsZCB3cml0ZSBzZWNyZXRzIHRoYXQgY2Fubm90IGJlIGRlY3J5cHRlZCBsYXRlci4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IGhrZGZTeW5jKCdzaGEyNTYnLCBjYWNoZWQua2V5LCBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSwgJ3NlY3JldHMtdjEnLCAzMik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG5cbiAgYXN5bmMgZGVyaXZlS2V5QXN5bmMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXYXJtZWQob3JnSWQpO1xuICAgIHJldHVybiB0aGlzLmRlcml2ZUtleShvcmdJZCk7XG4gIH1cblxuICBraWRGb3Iob3JnSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5tYXN0ZXJzLmdldChvcmdJZCk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZC5raWQ7XG4gICAgLy8gT25seSBzcGVhayBmb3IgYW4gb3JnIHdob3NlIGNvbmZpZyBpcyByZXNvbHZlZDsgYW4gdW5yZXNvbHZlZCBvcmcgaGFzIG5vXG4gICAgLy8gbWVhbmluZ2Z1bCBraWQsIGFuZCBjbGFpbWluZyBvbmUgd291bGQgZGVmZWF0IHRoZSBtaXNtYXRjaCBndWFyZC5cbiAgICBpZiAodGhpcy5yZXNvbHZlZE5vUGVyT3JnQ29uZmlnLmhhcyhvcmdJZCkpIHJldHVybiB0aGlzLmZhbGxiYWNrLmtpZEZvcj8uKG9yZ0lkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIG9yZydzIEtNUyBjb25maWcsIGNhbGwgRGVjcnlwdCwgY2FjaGUgdGhlIG1hc3Rlci4gU3Vic2VxdWVudFxuICAgKiBjYWxscyBmb3IgdGhlIHNhbWUgb3JnIGFyZSBuby1vcHMuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSB0aGUgaW4tZmxpZ2h0XG4gICAqIERlY3J5cHQgcHJvbWlzZS5cbiAgICpcbiAgICogUmV0dXJucyBzaWxlbnRseSB3aGVuIHRoZSBvcmcgaGFzIG5vIHBlci1vcmcgY29uZmlnIOKAlCB0aGUgZmFsbGJhY2tcbiAgICogcHJvdmlkZXIgaGFuZGxlcyB0aG9zZSBvcmdzLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlV2FybWVkKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tYXN0ZXJzLmhhcyhvcmdJZCkpIHJldHVybjtcbiAgICAvLyBJbnN0YWxsIHRoZSBpbi1mbGlnaHQgcHJvbWlzZSBTWU5DSFJPTk9VU0xZIGJlZm9yZSB5aWVsZGluZyBzbyBjb25jdXJyZW50XG4gICAgLy8gY2FsbGVycyBmaW5kIGl0IG9uIHRoZSBzZWNvbmQtYW5kLWxhdGVyIHBhc3Nlcy4gQXdhaXRpbmcgdGhlIHJlc29sdmVyXG4gICAgLy8gYmVmb3JlIHBvcHVsYXRpbmcgdGhlIG1hcCBpcyB0aGUgYnVnIHRoYXQgbGV0cyBhIFByb21pc2UuYWxsIG9mIDNcbiAgICAvLyBjYWxsZXJzIGZpcmUgMyBLTVMgRGVjcnlwdHMuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLmluRmxpZ2h0LmdldChvcmdJZCk7XG4gICAgaWYgKCFwcm9taXNlKSB7XG4gICAgICBwcm9taXNlID0gdGhpcy5yZXNvbHZlQW5kRGVjcnlwdChvcmdJZCk7XG4gICAgICB0aGlzLmluRmxpZ2h0LnNldChvcmdJZCwgcHJvbWlzZSk7XG4gICAgICB2b2lkIHByb21pc2UuZmluYWxseSgoKSA9PiB7IGlmICh0aGlzLmluRmxpZ2h0LmdldChvcmdJZCkgPT09IHByb21pc2UpIHRoaXMuaW5GbGlnaHQuZGVsZXRlKG9yZ0lkKTsgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21pc2U7XG4gICAgaWYgKHJlc3VsdCkgdGhpcy5tYXN0ZXJzLnNldChvcmdJZCwgcmVzdWx0KTtcbiAgICAvLyBSZW1lbWJlciB0aGUgTkVHQVRJVkUgb3V0Y29tZSB0b28sIHNvIHRoZSBzeW5jIGBkZXJpdmVLZXlgIGNhbiB0ZWxsXG4gICAgLy8gXCJubyBwZXItb3JnIGNvbmZpZywgZmFsbGJhY2sgaXMgY29ycmVjdFwiIGZyb20gXCJub3QgcmVzb2x2ZWQgeWV0XCIuXG4gICAgZWxzZSB0aGlzLnJlc29sdmVkTm9QZXJPcmdDb25maWcuYWRkKG9yZ0lkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUFuZERlY3J5cHQob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8eyBrZXk6IEJ1ZmZlcjsga2lkOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBsZXQgY2ZnID0gdGhpcy5jb25maWdzLmdldChvcmdJZCk7XG4gICAgaWYgKCFjZmcpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5yZXNvbHZlcihvcmdJZCk7XG4gICAgICBpZiAoIXJlc29sdmVkKSByZXR1cm4gbnVsbDsgLy8gbm8gcGVyLW9yZyBjb25maWcg4oaSIGNhbGxlciB1c2VzIGZhbGxiYWNrXG4gICAgICBjZmcgPSByZXNvbHZlZDtcbiAgICAgIHRoaXMuY29uZmlncy5zZXQob3JnSWQsIGNmZyk7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZmV0Y2hBbmREZWNyeXB0KGNmZyk7XG4gICAgcmV0dXJuIHsga2V5LCBraWQ6IGNmZy5rZXlJZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEFuZERlY3J5cHQoY2ZnOiBQZXJPcmdLbXNDb25maWcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIHJldHVybiBrbXNEZWNyeXB0MzIoY2ZnLmtleUlkLCBjZmcuY2lwaGVydGV4dEJhc2U2NCwgdGhpcy5yZWdpb24sIHRoaXMuZW5kcG9pbnQpO1xuICB9XG5cbiAgLyoqIEV2aWN0IGEgY2FjaGVkIHBlci1vcmcgbWFzdGVyLiBVc2UgYWZ0ZXIgYSBrZXkgcm90YXRpb24gc28gdGhlIG5leHRcbiAgICogIHRvdWNoIHJlLWZldGNoZXMgdGhlIG5ldyB3cmFwcGVkIG1hc3RlciBmcm9tIHRoZSByZXNvbHZlci4gKi9cbiAgZXZpY3Qob3JnSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFzdGVycy5kZWxldGUob3JnSWQpO1xuICAgIHRoaXMuY29uZmlncy5kZWxldGUob3JnSWQpO1xuICAgIC8vIEFsc28gZm9yZ2V0IGEgTkVHQVRJVkUgcmVzb2x1dGlvbiwgb3IgYW4gb3JnIHRoYXQgZ2FpbnMgYSBwZXItb3JnIGNvbmZpZ1xuICAgIC8vIGFmdGVyIGJlaW5nIHJlc29sdmVkIGFzIFwibm8gY29uZmlnXCIgd291bGQga2VlcCB1c2luZyB0aGUgc2hhcmVkIG1hc3Rlci5cbiAgICB0aGlzLnJlc29sdmVkTm9QZXJPcmdDb25maWcuZGVsZXRlKG9yZ0lkKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSB0aGUga2V5IGZvciBgb3JnSWRgLCBnaXZpbmcgdGhlIHByb3ZpZGVyIGEgY2hhbmNlIHRvIGRvIEkvTyBmaXJzdC5cbiAqXG4gKiBUaGlzIGlzIHdoeSBgZW5jcnlwdFNlY3JldGAvYGRlY3J5cHRTZWNyZXRgIGFyZSBhc3luYzogYFBlck9yZ0ttc0tleVByb3ZpZGVyYFxuICogbmVlZHMgb25lIEtNUyBEZWNyeXB0IHRoZSBmaXJzdCB0aW1lIGl0IHNlZXMgYW4gb3JnLCBhbmQgZGVyaXZpbmdcbiAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoYXQgcmVzb2x2ZXMgd291bGQgc2lsZW50bHkgZmFsbCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAqIG1hc3RlciBhbmQgcHJvZHVjZSBzZWNyZXRzIHRoYXQgY2Fubm90IGJlIGRlY3J5cHRlZCBhZnRlcndhcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXJpdmVLZXlGb3IocHJvdmlkZXI6IEtleVByb3ZpZGVyLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgcmV0dXJuIHByb3ZpZGVyLmRlcml2ZUtleUFzeW5jID8gcHJvdmlkZXIuZGVyaXZlS2V5QXN5bmMob3JnSWQpIDogcHJvdmlkZXIuZGVyaXZlS2V5KG9yZ0lkKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGEgcGxhaW50ZXh0IHN0cmluZyBmb3Igc3RvcmFnZS4gUmV0dXJucyBhbiBgRW5jcnlwdGVkQmxvYmAgdGhhdFxuICogY2FuIGJlIEpTT04tc2VyaWFsaXplZCBpbnRvIHRoZSB1bmRlcmx5aW5nIGNvbHVtbiAvIE1vbmdvIGRvY3VtZW50LlxuICpcbiAqIEVtcHR5IHN0cmluZ3Mgcm91bmQtdHJpcCBhcyBgbnVsbGAgc28gdGhlIGNhbGxpbmcgbW9kZWwgbGF5ZXIgY2FuIHRyZWF0XG4gKiBcIm5vIHNlY3JldCBzZXRcIiBpZGVudGljYWxseSB0byBcImZpZWxkIGFic2VudFwiLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdFNlY3JldCggcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHByb3ZpZGVyOiBLZXlQcm92aWRlciA9IGdldERlZmF1bHRQcm92aWRlcigpLFxuKTogUHJvbWlzZTxFbmNyeXB0ZWRCbG9iPiB7XG4gIGlmICghcGxhaW50ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWZ1c2luZyB0byBlbmNyeXB0IGVtcHR5IHN0cmluZzsgY2FsbGVyIHNob3VsZCBzdG9yZSBudWxsIGluc3RlYWQnKTtcbiAgfVxuICAvLyBSZXNvbHZlIChhbmQgd2FybSkgdGhlIG9yZyBCRUZPUkUgcmVhZGluZyBga2lkRm9yYCBiZWxvdywgc28gYSBwZXItb3JnIEtNU1xuICAvLyBibG9iIGlzIGFsd2F5cyBzdGFtcGVkIHdpdGggdGhlIGtleSBpdCB3YXMgYWN0dWFsbHkgZW5jcnlwdGVkIHVuZGVyLlxuICBjb25zdCBrZXkgPSBhd2FpdCBkZXJpdmVLZXlGb3IocHJvdmlkZXIsIG9yZ0lkKTtcbiAgY29uc3QgaXYgPSByYW5kb21CeXRlcygxMik7XG4gIGNvbnN0IGNpcGhlciA9IGNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWdjbScsIGtleSwgaXYpO1xuICBjb25zdCBlbmMgPSBCdWZmZXIuY29uY2F0KFtjaXBoZXIudXBkYXRlKHBsYWludGV4dCwgJ3V0ZjgnKSwgY2lwaGVyLmZpbmFsKCldKTtcbiAgY29uc3QgdGFnID0gY2lwaGVyLmdldEF1dGhUYWcoKTtcbiAgLy8gUGVyT3JnS21zS2V5UHJvdmlkZXIgdGFncyBibG9icyB3aXRoIHRoZSBLTVMga2V5IGlkIHVzZWQgc28gdGhlXG4gIC8vIGRlY3J5cHQgcGF0aCBjYW4gcmVmdXNlIHRvIG9wZXJhdGUgaWYgdGhlIG9wZXJhdG9yIGxhdGVyIHN3YXBzIGluIGFcbiAgLy8gZGlmZmVyZW50IHBlci1vcmcgY29uZmlnIChhIG1pc2NvbmZpZ3VyZWQgc3dhcCBzaG91bGRuJ3Qgc2lsZW50bHlcbiAgLy8gYWNjZXB0IGEgc3RhbGUgYmxvYiBpdCBjYW4ndCB2ZXJpZnkgYWdhaW5zdCB0aGUgcmlnaHQgQ01LKS5cbiAgY29uc3Qga2lkID0gcHJvdmlkZXIua2lkRm9yPy4ob3JnSWQpO1xuICByZXR1cm4ge1xuICAgIGFsZzogJ2Flcy0yNTYtZ2NtLXYxJyxcbiAgICBpdjogaXYudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIC8vIEdDTSB0YWcgTVVTVCB0cmF2ZWwgd2l0aCB0aGUgY2lwaGVydGV4dCBvciBgZGVjcnlwdFNlY3JldGAgY2FuJ3RcbiAgICAvLyB2ZXJpZnkgaW50ZWdyaXR5ICBjb25jYXRlbmF0ZSBzbyB0aGUgb24tZGlzayBzaGFwZSBpcyBvbmUgZmllbGQuXG4gICAgY2lwaGVydGV4dDogQnVmZmVyLmNvbmNhdChbZW5jLCB0YWddKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgLi4uKGtpZCAhPT0gdW5kZWZpbmVkID8geyBraWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGFuIGBFbmNyeXB0ZWRCbG9iYCB3cml0dGVuIGJ5IGBlbmNyeXB0U2VjcmV0YC4gVGhyb3dzIG9uICogLSB1bmtub3duIGBhbGdgIChmb3JjZXMgYW4gZXhwbGljaXQgbWlncmF0aW9uIHdoZW4gdGhlIGZvcm1hdCBjaGFuZ2VzKVxuICogLSB3cm9uZyBvcmdJZCAoSEtERiBiaW5kaW5nIG1pc21hdGNoIGZhaWxzIHRoZSBhdXRoIHRhZylcbiAqIC0gdGFtcGVyZWQgY2lwaGVydGV4dCAoR0NNIGF1dGggdGFnIGNoZWNrIGZhaWxzKVxuICpcbiAqIENhbGxlcnMgaGFuZGxlIHRoZSB0aHJvdyAgbWFza2luZyB0aGUgZmFpbHVyZSBhcyBgbnVsbGAgd291bGQgaGlkZVxuICogc2lsZW50IGNvcnJ1cHRpb24gLyB3cm9uZy1vcmcgcmVhZHMuXG4gKlxuICogYHByZXZpb3VzYCAoZGVmYXVsdDogYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VU2AsIHdoZW4gc2V0KSBpcyB0cmllZFxuICogb25seSBhZnRlciB0aGUgcHJpbWFyeSBrZXkgZmFpbHMsIGFuZCBvbmx5IGZvciBraWQtbGVzcyBibG9icy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRTZWNyZXQoIGJsb2I6IEVuY3J5cHRlZEJsb2IsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHByb3ZpZGVyOiBLZXlQcm92aWRlciA9IGdldERlZmF1bHRQcm92aWRlcigpLFxuICBwcmV2aW91czogS2V5UHJvdmlkZXIgfCBudWxsID0gZ2V0UHJldmlvdXNQcm92aWRlcigpLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKGJsb2IuYWxnICE9PSAnYWVzLTI1Ni1nY20tdjEnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZzogJHtibG9iLmFsZ31gKTtcbiAgfVxuICAvLyBXYXJtIGZpcnN0OiBga2lkRm9yYCBhbmQgYGRlcml2ZUtleWAgYmVsb3cgbXVzdCBib3RoIHNwZWFrIGZvciB0aGUgb3JnJ3NcbiAgLy8gcmVhbCBjb25maWcsIG9yIHRoZSBtaXNtYXRjaCBndWFyZCBzaWxlbnRseSBuby1vcHMuXG4gIGNvbnN0IGtleSA9IGF3YWl0IGRlcml2ZUtleUZvcihwcm92aWRlciwgb3JnSWQpO1xuICAvLyBJZiBib3RoIHRoZSBwcm92aWRlciBBTkQgdGhlIGJsb2IgcmVwb3J0IGEga2lkLCB0aGV5IG11c3QgbWF0Y2guXG4gIC8vIE1pc21hdGNoIHVzdWFsbHkgbWVhbnMgYW4gb3BlcmF0b3Igcm90YXRlZC9yZXBsYWNlZCBhbiBvcmcncyBLTVNcbiAgLy8gY29uZmlnIGFuZCBpcyBub3cgcmVhZGluZyBhIGJsb2IgZW5jcnlwdGVkIHVuZGVyIHRoZSBPTEQga2V5IOKAlFxuICAvLyBmYWlsaW5nIGxvdWQgaGVyZSBiZWF0cyBsZXR0aW5nIEFFUy1HQ00gdGhyb3cgYW4gb3BhcXVlIGF1dGgtdGFnIGVycm9yLlxuICBjb25zdCBwcm92aWRlcktpZCA9IHByb3ZpZGVyLmtpZEZvcj8uKG9yZ0lkKTtcbiAgaWYgKHByb3ZpZGVyS2lkICE9PSB1bmRlZmluZWQgJiYgYmxvYi5raWQgIT09IHVuZGVmaW5lZCAmJiBwcm92aWRlcktpZCAhPT0gYmxvYi5raWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEtNUyBrZXkgaWQgbWlzbWF0Y2g6IGJsb2Igd2FzIGVuY3J5cHRlZCB1bmRlciAke2Jsb2Iua2lkfSwgY3VycmVudCBwcm92aWRlciB1c2VzICR7cHJvdmlkZXJLaWR9IGZvciBvcmcgJHtvcmdJZH1gKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBkZWNyeXB0V2l0aEtleShibG9iLCBrZXkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBNYXN0ZXIta2V5IHJvdGF0aW9uIHdpbmRvdzogcmV0cnkgdW5kZXIgU0VDUkVUX0VOQ1JZUFRJT05fS0VZX1BSRVZJT1VTLlxuICAgIC8vIE9ubHkgZm9yIGEga2lkLWxlc3MgYmxvYiAodGhlIGVudi1rZXllZCBzaGFwZSkg4oCUIGEgcGVyLW9yZyBLTVMgYmxvYiBpc1xuICAgIC8vIGJvdW5kIHRvIGl0cyBDTUsgYW5kIHRoZSBzaGFyZWQgcHJldmlvdXMgbWFzdGVyIGNhbiBuZXZlciBvcGVuIGl0LiBUaGVcbiAgICAvLyBPUklHSU5BTCBlcnJvciBzdXJmYWNlcyB3aGVuIHRoZSBwcmV2aW91cyBrZXkgZmFpbHMgdG9vLCBzbyBhIHRhbXBlcmVkIG9yXG4gICAgLy8gd3Jvbmctb3JnIGJsb2Igc3RpbGwgZmFpbHMgbG91ZCBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICBpZiAocHJldmlvdXMgJiYgYmxvYi5raWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRXaXRoS2V5KGJsb2IsIGF3YWl0IGRlcml2ZUtleUZvcihwcmV2aW91cywgb3JnSWQpKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBmYWxsIHRocm91Z2ggdG8gdGhlIHByaW1hcnkgZXJyb3IgKi8gfVxuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqIEFFUy0yNTYtR0NNIG9wZW4gb2YgYSBibG9iIHVuZGVyIG9uZSBkZXJpdmVkIGtleS4gVGhyb3dzIG9uIGFueSBhdXRoLXRhZyBmYWlsdXJlLiAqL1xuZnVuY3Rpb24gZGVjcnlwdFdpdGhLZXkoYmxvYjogRW5jcnlwdGVkQmxvYiwga2V5OiBCdWZmZXIpOiBzdHJpbmcge1xuICBjb25zdCBpdiA9IEJ1ZmZlci5mcm9tKGJsb2IuaXYsICdiYXNlNjQnKTtcbiAgY29uc3QgYWxsID0gQnVmZmVyLmZyb20oYmxvYi5jaXBoZXJ0ZXh0LCAnYmFzZTY0Jyk7XG4gIC8vIFNwbGl0IG9mZiB0aGUgMTYtYnl0ZSBhdXRoIHRhZyBhcHBlbmRlZCBpbiBlbmNyeXB0U2VjcmV0LiBBbnkgdGFtcGVyaW5nXG4gIC8vICB0byBlaXRoZXIgdGhlIGNpcGhlcnRleHQgT1IgdGhlIHRhZyAgY2F1c2VzIHRoZSBuZXh0IGBmaW5hbCgpYCB0b1xuICAvLyB0aHJvdyB3aXRoIFwiVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhXCIuXG4gIGNvbnN0IHRhZyA9IGFsbC5zdWJhcnJheShhbGwubGVuZ3RoIC0gMTYpO1xuICBjb25zdCBlbmMgPSBhbGwuc3ViYXJyYXkoMCwgYWxsLmxlbmd0aCAtIDE2KTtcbiAgY29uc3QgZGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWdjbScsIGtleSwgaXYpO1xuICBkZWNpcGhlci5zZXRBdXRoVGFnKHRhZyk7XG4gIGNvbnN0IGRlYyA9IEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZShlbmMpLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gIHJldHVybiBkZWMudG9TdHJpbmcoJ3V0ZjgnKTtcbn1cblxuLyoqXG4gKiBTaGFwZSBndWFyZCBmb3IgYSBwYXJzZWQgYEVuY3J5cHRlZEJsb2JgLiBDYWxsZXJzIGhvbGQgYSB2YWx1ZSB0aGF0IHdhcyBKU09OLVxuICogZGVjb2RlZCBmcm9tIGEgc2VjcmV0IGNvbHVtbiBhbmQgbXVzdCBub3QgaGFuZCBhbnl0aGluZyBlbHNlIHRvXG4gKiBgZGVjcnlwdFNlY3JldGA7IHRoaXMgbmFycm93cyBpdCAob3IgdGhlIGNhbGxlciByZWplY3RzIHRoZSB2YWx1ZSkuIENsZWFyIHRleHRcbiAqIGlzIE5PVCBhIHN1cHBvcnRlZCBzdG9yZWQgZm9ybSDigJQgdGhlIG9ubHkgY29uc3VtZXIgdGhyb3dzIG9uIGEgbm9uLWJsb2IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VuY3J5cHRlZEJsb2IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFbmNyeXB0ZWRCbG9iIHtcbiAgcmV0dXJuICggdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgKHZhbHVlIGFzIHsgYWxnPzogdW5rbm93biB9KS5hbGcgPT09ICdhZXMtMjU2LWdjbS12MSdcbiAgICAmJiB0eXBlb2YgKHZhbHVlIGFzIHsgaXY/OiB1bmtub3duIH0pLml2ID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiAodmFsdWUgYXMgeyBjaXBoZXJ0ZXh0PzogdW5rbm93biB9KS5jaXBoZXJ0ZXh0ID09PSAnc3RyaW5nJ1xuICApO1xufVxuIl19
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjcmV0LWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUE2QmpGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNSLFNBQVMsQ0FBUztJQUVuQyxZQUFZLGlCQUEwQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNyQix1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLDJEQUEyRDtRQUMzRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUUsUUFBUSxFQUNoQyxJQUFJLENBQUMsU0FBUyxFQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUMxQixZQUFZLEVBQ1osRUFBRSxDQUNILENBQUM7UUFDRiwyRUFBMkU7UUFDM0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0g7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxZQUFZLENBQUMsS0FBYSxFQUFFLGFBQXFCLEVBQUUsTUFBZSxFQUFFLFFBQWlCO0lBQ2xHLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDO1FBQ2hELEtBQUssRUFBRSxLQUFLO1FBQ1osY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQztLQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakcsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLENBQUMsTUFBTSxpQkFBaUIsS0FBSyxlQUFlLENBQUMsQ0FBQztJQUNoSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLE9BQU8sY0FBYztJQUNqQixjQUFjLEdBQWtCLElBQUksQ0FBQztJQUM1QixLQUFLLENBQVM7SUFDZCxhQUFhLENBQVM7SUFDdEIsTUFBTSxDQUFVO0lBQ2hCLFFBQVEsQ0FBVTtJQUMzQixlQUFlLEdBQTJCLElBQUksQ0FBQztJQUV2RCxZQUFZLElBQXdGO1FBQ2xHLE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUN0RSxNQUFNLFVBQVUsR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQztRQUMxRixJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsVUFBVTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUN4RyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUN2RixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRSxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFFLHFIQUFxSCxDQUNySSxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEcsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE1BQU07UUFDVixJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNuRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSx3RUFBd0U7WUFDeEUseUVBQXlFO1lBQ3pFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRixDQUFDO0NBQ0Y7QUFFRCwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBQ3ZFLElBQUksZUFBZSxHQUF1QixJQUFJLENBQUM7QUFDL0MsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGVBQWU7UUFBRSxlQUFlLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUM3RCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7cUJBSXFCO0FBQ3JCLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxrQkFBa0IsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsSUFBSSxnQkFBZ0QsQ0FBQztBQUNyRCxTQUFTLG1CQUFtQjtJQUMxQixJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUM7UUFDdkQsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPLG1CQUFtQixFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsdUJBQXVCLEtBQVcsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFekc7d0RBQ3dEO0FBQ3hELE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBcUIsSUFBVSxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQWtCM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixrREFBa0Q7SUFDakMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUF3QyxDQUFDO0lBQzNFLGdFQUFnRTtJQUMvQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFDOUQ7OzhFQUUwRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXdELENBQUM7SUFDNUY7O2lGQUU2RTtJQUM1RCxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzVELDBEQUEwRDtJQUN6QyxRQUFRLENBQWM7SUFDdEIsUUFBUSxDQUFvQjtJQUM1QixNQUFNLENBQVU7SUFDaEIsUUFBUSxDQUFVO0lBRW5DLFlBQVksSUFLWDtRQUNDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFDdEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsU0FBUyxDQUFDLEtBQWE7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sSUFBSSxLQUFLLENBQUUsNkNBQTZDLEtBQUssSUFBSTtrQkFDbkUsMkZBQTJGO2tCQUMzRix3R0FBd0csQ0FDM0csQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFhO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM5QiwyRUFBMkU7UUFDM0Usb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWE7UUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ3BDLDRFQUE0RTtRQUM1RSx3RUFBd0U7UUFDeEUsb0VBQW9FO1FBQ3BFLCtCQUErQjtRQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsQyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxPQUFPO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDO1FBQzdCLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxzRUFBc0U7UUFDdEUsb0VBQW9FOztZQUMvRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYTtRQUMzQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQywyQ0FBMkM7WUFDdkUsR0FBRyxHQUFHLFFBQVEsQ0FBQztZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQW9CO1FBQzFDLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDtxRUFDaUU7SUFDakUsS0FBSyxDQUFDLEtBQWE7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQXFCLEVBQUUsS0FBYTtJQUM5RCxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFFLFNBQWlCLEVBQ3BELEtBQWEsRUFDYixRQUFRLEdBQWdCLGtCQUFrQixFQUFFO0lBRTVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLHVFQUF1RTtJQUN2RSxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNoQyxrRUFBa0U7SUFDbEUsc0VBQXNFO0lBQ3RFLG9FQUFvRTtJQUNwRSw4REFBOEQ7SUFDOUQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE9BQU87UUFDTCxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN6QixtRUFBbUU7UUFDbkUsbUVBQW1FO1FBQ25FLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN4RCxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3RDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFFLElBQW1CLEVBQ3RELEtBQWEsRUFDYixRQUFRLEdBQWdCLGtCQUFrQixFQUFFLEVBQzVDLFFBQVEsR0FBdUIsbUJBQW1CLEVBQUU7SUFFcEQsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGdCQUFnQixFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELDJFQUEyRTtJQUMzRSxzREFBc0Q7SUFDdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELG1FQUFtRTtJQUNuRSxtRUFBbUU7SUFDbkUsaUVBQWlFO0lBQ2pFLDBFQUEwRTtJQUMxRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsSUFBSSxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLFdBQVcsWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RJLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYiwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSw0RUFBNEU7UUFDNUUscURBQXFEO1FBQ3JELElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDO2dCQUNILE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0FBQ0gsQ0FBQztBQUVELHdGQUF3RjtBQUN4RixTQUFTLGNBQWMsQ0FBQyxJQUFtQixFQUFFLEdBQVc7SUFDdEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCwwRUFBMEU7SUFDMUUscUVBQXFFO0lBQ3JFLGlFQUFpRTtJQUNqRSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM3QyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFELFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sQ0FBRSxPQUFPLEtBQUssS0FBSyxRQUFRO1dBQzdCLEtBQUssS0FBSyxJQUFJO1dBQ2IsS0FBMkIsQ0FBQyxHQUFHLEtBQUssZ0JBQWdCO1dBQ3JELE9BQVEsS0FBMEIsQ0FBQyxFQUFFLEtBQUssUUFBUTtXQUNsRCxPQUFRLEtBQWtDLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FDdEUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiAgUGVyLW9yZyBlbnZlbG9wZSBlbmNyeXB0aW9uIGZvciBzZWNyZXQgY29sdW1ucy5cbiAqXG4gKiBUb2RheSdzIHBvc3R1cmUgZm9yIG9yZy1zY29wZWQgc2VjcmV0cyAoYWlQcm92aWRlcktleXMsIHdlYmhvb2sgVVJMcyxcbiAqIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzKSBpcyBjbGVhci10ZXh0IGluIE1vbmdvIC8gUG9zdGdyZXMgd2l0aCBhcHAtbGF5ZXJcbiAqIG1hc2tpbmcgb24gb3V0cHV0LiBUaGlzIG1vZHVsZSBpcyB0aGUgZW5jcnlwdGlvbiBwcmltaXRpdmUgdGhhdCBsZXRzIHRoZVxuICogbW9kZWwgbGF5ZXIgc3dhcCBjbGVhci10ZXh0IHN0cmluZ3MgZm9yIGBFbmNyeXB0ZWRCbG9iYCB2YWx1ZXMgYXQgd3JpdGVcbiAqIHRpbWUgYW5kIGRlY3J5cHQgYXQgcmVhZCB0aW1lLlxuICpcbiAqIENyeXB0b2dyYXBoeSAqIC0gQUVTLTI1Ni1HQ00gKGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbikuXG4gKiAtIFBlci1vcmcga2V5IGRlcml2ZWQgdmlhIEhLREYtU0hBMjU2KG1hc3RlcktleSwgc2FsdD1vcmdJZCwgaW5mbz0nc2VjcmV0cy12MScpLlxuICogRWFjaCBvcmcgZ2V0cyBhIHVuaXF1ZSBrZXkgd2l0aG91dCBvcGVyYXRvciBrZXktbWFuYWdlbWVudCBjZXJlbW9ueS5cbiAqIC0gMTItYnl0ZSBJViBnZW5lcmF0ZWQgcGVyIGVuY3J5cHRpb24gd2l0aCBgY3J5cHRvLnJhbmRvbUJ5dGVzYC5cbiAqIC0gMTYtYnl0ZSBhdXRoZW50aWNhdGlvbiB0YWcgY29uY2F0ZW5hdGVkIHdpdGggY2lwaGVydGV4dCAoc3RhbmRhcmQgR0NNKS5cbiAqXG4gKiBPcGVyYXRvciBjb25maWd1cmF0aW9uICogLSBgU0VDUkVUX0VOQ1JZUFRJT05fS0VZYCBlbnY6IGhleC0gb3IgYmFzZTY0LWVuY29kZWQgMzItYnl0ZSBtYXN0ZXIga2V5LlxuICogUmVxdWlyZWQgd2hlbiBgZW5jcnlwdFNlY3JldGAvYGRlY3J5cHRTZWNyZXRgIGFyZSBjYWxsZWQuIE1pc3Npbmcga2V5XG4gKiB0aHJvd3MgIGVuY3J5cHRpb24gaXMgZmFpbC1jbG9zZWQ7IHdlIG5ldmVyIHNpbGVudGx5IHJvdW5kLXRyaXAgYVxuICogc2VjcmV0IGFzIHBsYWludGV4dC5cbiAqXG4gKiBLTVMgbWlncmF0aW9uIHBhdGggKiAtIFRoZSB0d28gZXhwb3J0ZWQgZnVuY3Rpb25zIHRha2UgYSBgcHJvdmlkZXJgIHBhcmFtZXRlci4gVGhlIGRlZmF1bHRcbiAqIGBFbnZLZXlQcm92aWRlcmAgaW1wbGVtZW50cyBIS0RGIGRlcml2YXRpb24uIEEgZnV0dXJlIGBBd3NLbXNQcm92aWRlcmBcbiAqIHBsdWdzIGluIGhlcmU6IGl0IGNhbiBjYWxsIEtNUyBgRW5jcnlwdGAgLyBgRGVjcnlwdGAgdG8gd3JhcCBhIERFS1xuICogcmF0aGVyIHRoYW4gaG9sZGluZyBhIG1hc3RlciBrZXkgaW4gZW52LiBUaGUgb24tZGlzayBibG9iIHNoYXBlXG4gKiAoYHsgYWxnLCBpdiwgY2lwaGVydGV4dCwga2lkPyB9YCkgaXMgZm9yd2FyZC1jb21wYXRpYmxlICBga2lkYFxuICogY2FycmllcyB0aGUgS01TIGtleSBpZCB3aGVuIHRoZSBwcm92aWRlciBuZWVkcyBpdC5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiwgaGtkZlN5bmMsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqIE9uLWRpc2sgc2hhcGUgb2YgYW4gZW5jcnlwdGVkIHNlY3JldC4gSlNPTi1zZXJpYWxpemFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRlZEJsb2Ige1xuICAvKiogQWxnb3JpdGhtIHRhZy4gQnVtcCBvbiBmb3JtYXQgY2hhbmdlIHNvIGEgZnV0dXJlIG1pZ3JhdGlvbiBjYW4gZGV0ZWN0IG9sZCBibG9icy4gKi9cbiAgYWxnOiAnYWVzLTI1Ni1nY20tdjEnO1xuICAvKiogQmFzZTY0LWVuY29kZWQgMTItYnl0ZSBJVi4gKi9cbiAgaXY6IHN0cmluZztcbiAgLyoqIEJhc2U2NC1lbmNvZGVkIGNpcGhlcnRleHQgKyAxNi1ieXRlIGF1dGhlbnRpY2F0aW9uIHRhZyBjb25jYXRlbmF0ZWQuICovXG4gIGNpcGhlcnRleHQ6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGtleSBpZCAgcG9wdWxhdGVkIGJ5IEtNUy1iYWNrZWQgcHJvdmlkZXJzLCBpZ25vcmVkIGJ5IHRoZSBlbnYgcHJvdmlkZXIuICovXG4gIGtpZD86IHN0cmluZztcbn1cblxuLyoqIFBsdWdnYWJsZSBrZXkgc291cmNlLiBFbnYtYmFja2VkIGJ5IGRlZmF1bHQ7IEtNUy1iYWNrZWQgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlQcm92aWRlciB7XG4gIC8qKiBEZXJpdmUgYSAzMi1ieXRlIHN5bW1ldHJpYyBrZXkgYm91bmQgdG8gYG9yZ0lkYC4gKi9cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXI7XG4gIC8qKiBPcHRpb25hbCBhc3luYyB2YXJpYW50IGZvciBwcm92aWRlcnMgdGhhdCBuZWVkIHRvIGRvIEkvTyAoZS5nLlxuICAgKiAgcGVyLW9yZyBLTVMgbG9va3VwIHRoZSBmaXJzdCB0aW1lIGFuIG9yZyBpcyBzZWVuKS4gRGVmYXVsdFxuICAgKiAgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgdG8gdGhlIHN5bmMgYGRlcml2ZUtleWAuICovXG4gIGRlcml2ZUtleUFzeW5jPyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+O1xuICAvKiogT3B0aW9uYWwgS01TLWtleS1pZCB0aGlzIHByb3ZpZGVyIHVzZWQgZm9yIGBvcmdJZGAuIEVtYmVkZGVkIGluIHRoZVxuICAgKiAgYEVuY3J5cHRlZEJsb2Iua2lkYCBmaWVsZCBvbiB3cml0ZSBzbyBkZWNyeXB0IGNhbiB2ZXJpZnkgdGhlIHJpZ2h0XG4gICAqICBLTVMgQ01LIGlzIGJlaW5nIHVzZWQgKGRlZmVuc2UgYWdhaW5zdCBhbiBhdHRhY2tlciB3aG8gc3dhcHMgYSBibG9iXG4gICAqICBiZXR3ZWVuIG9yZ3MpLiBEZWZhdWx0IHJldHVybnMgdW5kZWZpbmVkIChlbnYgcHJvdmlkZXIpLiAqL1xuICBraWRGb3I/KG9yZ0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVmYXVsdCBwcm92aWRlciAgZGVyaXZlcyBhIHBlci1vcmcga2V5IGZyb20gYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAgdmlhXG4gKiBIS0RGLVNIQTI1Ni4gU3VpdGFibGUgZm9yIHNlbGYtaG9zdGVkIC8gZGV2IHdoZXJlIG9wZXJhdG9ycyBkb24ndCBoYXZlIEtNUy5cbiAqXG4gKiBGYWlscyBmYXN0IGlmIHRoZSBlbnYgaXMgbWlzc2luZyBvciB0aGUga2V5IGlzIHRoZSB3cm9uZyBsZW5ndGggc28gbWlzY29uZmlnXG4gKiBzdXJmYWNlcyBhdCBmaXJzdCB1c2UgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmluZ2VycHJpbnRpbmcgYWxsIHdyaXRlcyB3aXRoXG4gKiBhIGRlZmF1bHQgemVybyBrZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJLZXk6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihtYXN0ZXJLZXlPdmVycmlkZT86IHN0cmluZykge1xuICAgIGNvbnN0IHJhdyA9IG1hc3RlcktleU92ZXJyaWRlID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWTtcbiAgICBpZiAoIXJhdykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTRUNSRVRfRU5DUllQVElPTl9LRVkgZW52IGlzIHJlcXVpcmVkIGZvciBzZWNyZXQgZW5jcnlwdGlvbicpO1xuICAgIH1cbiAgICAvLyBBY2NlcHQgZWl0aGVyIGhleCAoNjQgY2hhcnMpIG9yIGJhc2U2NCAoNDQgY2hhcnMgaW5jbHVkaW5nIHBhZGRpbmcpIGZvclxuICAgIC8vIG9wZXJhdG9yIGNvbnZlbmllbmNlICBib3RoIGRlY29kZSB0byBhIDMyLWJ5dGUga2V5LlxuICAgIGNvbnN0IGRlY29kZWQgPSByYXcubGVuZ3RoID09PSA2NCAmJiAvXlswLTlhLWZdKyQvaS50ZXN0KHJhdylcbiAgICAgID8gQnVmZmVyLmZyb20ocmF3LCAnaGV4JylcbiAgICAgIDogQnVmZmVyLmZyb20ocmF3LCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRlY29kZWQubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTRUNSRVRfRU5DUllQVElPTl9LRVkgbXVzdCBkZWNvZGUgdG8gMzIgYnl0ZXMgKGdvdCAke2RlY29kZWQubGVuZ3RofSlgKTtcbiAgICB9XG4gICAgdGhpcy5tYXN0ZXJLZXkgPSBkZWNvZGVkO1xuICB9XG5cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIC8vIEhLREYgYmluZHMgdGhlIG1hc3RlciBrZXkgdG8gdGhlIG9yZyBzbyB0d28gb3JncyBlbmNyeXB0aW5nIHRoZSBzYW1lXG4gICAgLy8gcGxhaW50ZXh0IHByb2R1Y2UgZGlmZmVyZW50IGNpcGhlcnRleHRzICBrZWVwcyBhIHN0b2xlbiBEQiB1bmFibGUgdG9cbiAgICAvLyB0ZWxsIHdoaWNoIG9yZ3Mgc2hhcmUgc2VjcmV0cyB2aWEgY2lwaGVydGV4dCBjb21wYXJpc29uLlxuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYyggJ3NoYTI1NicsXG4gICAgICB0aGlzLm1hc3RlcktleSxcbiAgICAgIEJ1ZmZlci5mcm9tKG9yZ0lkLCAndXRmOCcpLFxuICAgICAgJ3NlY3JldHMtdjEnLFxuICAgICAgMzIsXG4gICAgKTtcbiAgICAvLyBoa2RmU3luYyByZXR1cm5zIEFycmF5QnVmZmVyIGluIG9sZGVyIE5vZGUgdHlwaW5nczsgbm9ybWFsaXplIHRvIEJ1ZmZlci5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVyaXZlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiAgQVdTLUtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuXG4gKlxuICogVHJhZGUtb2ZmIHBpY2tlZDogc3RvcmUgT05FIG1hc3RlciBrZXkgZW5jcnlwdGVkIHVuZGVyIGEgS01TIENNSzsgb25cbiAqIGZpcnN0IHVzZSwgY2FsbCBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIG1hc3RlciBrZXkgYnl0ZXM7IEhLREYtXG4gKiBkZXJpdmUgcGVyLW9yZyBmcm9tIGl0IChzYW1lIGFzIEVudktleVByb3ZpZGVyKS4gVGhlIHByb2Nlc3MgdGhlbiBob2xkc1xuICogdGhlIHBsYWludGV4dCBtYXN0ZXIga2V5IGluIG1lbW9yeSB1bnRpbCByZXN0YXJ0LlxuICpcbiAqIFBST1M6IG9uZSBLTVMgY2FsbCBwZXIgcHJvY2VzcyBsaWZldGltZSAoY2hlYXAsIGxvdyBwOTkgaW1wYWN0KSxcbiAqIHRoZSBlbmNyeXB0ZWQtbWFzdGVyLWtleSBibG9iIGlzIHNhZmUgdG8gY29tbWl0L2xvZy9jaGVja2luLFxuICogS01TIGF1ZGl0IGxvZyByZWNvcmRzIHdoZW4gdGhlIG1hc3RlciBpcyByZWNvdmVyZWQuXG4gKiBDT05TOiBwcm9jZXNzIG1lbW9yeSBzdGlsbCBob2xkcyB0aGUgbWFzdGVyIGtleSAgc2FtZSBwb3N0dXJlIGFzXG4gKiBFbnZLZXlQcm92aWRlciBvbmNlIHdhcm1lZCB1cC4gRm9yIHN0cm9uZ2VyIGlzb2xhdGlvbiBhblxuICogb3BlcmF0b3IgY2FuIG1vdmUgdG8gcGVyLXJlY29yZCBlbnZlbG9wZSBlbmNyeXB0aW9uIChjYWxsXG4gKiBHZW5lcmF0ZURhdGFLZXkgb24gZXZlcnkgd3JpdGUpOyB0aGF0J3MgYSBmb2xsb3ctb24uXG4gKlxuICogT3BlcmF0b3Igc2V0dXAgKiAxLiBDcmVhdGUgYSBLTVMgQ01LIHdpdGgga2V5IHBvbGljeSBhbGxvd2luZyB0aGUgcGxhdGZvcm0gc2VydmljZSdzXG4gKiBJQU0gcm9sZSBrbXM6RGVjcnlwdC5cbiAqIDIuIEdlbmVyYXRlIGEgcmFuZG9tIDMyLWJ5dGUgbWFzdGVyICogaGVhZCAtYyAzMiAvZGV2L3VyYW5kb20gfCBiYXNlNjRcbiAqIDMuIFdyYXAgaXQgd2l0aCBLTVMgKiBhd3Mga21zIGVuY3J5cHQgLS1rZXktaWQgPEtFWV9JRD4gXFxcbiAqIC0tcGxhaW50ZXh0IDxiYXNlNjQtZnJvbS1zdGVwLTI+IC0tb3V0cHV0IHRleHQgXFxcbiAqIC0tcXVlcnkgQ2lwaGVydGV4dEJsb2JcbiAqIDQuIFNldCBvbiB0aGUgc2VydmljZSAqIFNFQ1JFVF9FTkNSWVBUSU9OX0tNU19LRVlfSUQ9PEtFWV9JRD5cbiAqIFNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUPTxiYXNlNjQtb3V0cHV0LW9mLXN0ZXAtMz5cbiAqIDUuIFBpY2sgdGhpcyBwcm92aWRlciB2aWEgYHNldEtleVByb3ZpZGVyKG5ldyBLbXNLZXlQcm92aWRlcigpKWAuXG4gKlxuICogQ29uc3RydWN0IGxhemlseSAgaW1wb3J0aW5nIHRoZSBBV1MgU0RLIGhhcyBhIG5vbi10cml2aWFsIGNvbGQtc3RhcnRcbiAqIGNvc3Qgc28gZW52cyB0aGF0IHN0YXkgb24gRW52S2V5UHJvdmlkZXIgbmV2ZXIgbG9hZCBpdC5cbiAqL1xuLyoqXG4gKiBLTVMtZGVjcnlwdCBhIGJhc2U2NCBjaXBoZXJ0ZXh0IGludG8gYSAzMi1ieXRlIGtleS4gU2hhcmVkIGJ5IGJvdGggS01TIGtleVxuICogcHJvdmlkZXJzIChzaW5nbGUtbWFzdGVyICsgcGVyLW9yZykuIGBAYXdzLXNkay9jbGllbnQta21zYCBpc1xuICogZHluYW1pY2FsbHkgaW1wb3J0ZWQgc28gRW52S2V5UHJvdmlkZXItb25seSBlbnZzIG5ldmVyIGxvYWQgdGhlIFNESy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24ga21zRGVjcnlwdDMyKGtleUlkOiBzdHJpbmcsIGNpcGhlcnRleHRCNjQ6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBlbmRwb2ludD86IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHsgS01TQ2xpZW50LCBEZWNyeXB0Q29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQta21zJyk7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBLTVNDbGllbnQoeyByZWdpb24sIC4uLihlbmRwb2ludCA/IHsgZW5kcG9pbnQgfSA6IHt9KSB9KTtcbiAgY29uc3QgcmVzcCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZWNyeXB0Q29tbWFuZCh7XG4gICAgS2V5SWQ6IGtleUlkLFxuICAgIENpcGhlcnRleHRCbG9iOiBCdWZmZXIuZnJvbShjaXBoZXJ0ZXh0QjY0LCAnYmFzZTY0JyksXG4gIH0pKTtcbiAgaWYgKCFyZXNwLlBsYWludGV4dCkgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCBhbiBlbXB0eSBQbGFpbnRleHQgZm9yIGtleSAke2tleUlkfWApO1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShyZXNwLlBsYWludGV4dCk7XG4gIGlmIChidWYubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCAke2J1Zi5sZW5ndGh9LWJ5dGUga2V5IGZvciAke2tleUlkfTsgZXhwZWN0ZWQgMzJgKTtcbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IGNsYXNzIEttc0tleVByb3ZpZGVyIGltcGxlbWVudHMgS2V5UHJvdmlkZXIge1xuICBwcml2YXRlIG1hc3RlcktleUNhY2hlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBrZXlJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNpcGhlcnRleHRCNjQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgZGVjcnlwdEluRmxpZ2h0OiBQcm9taXNlPEJ1ZmZlcj4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihvcHRzPzogeyBrZXlJZD86IHN0cmluZzsgY2lwaGVydGV4dEJhc2U2ND86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBlbmRwb2ludD86IHN0cmluZyB9KSB7XG4gICAgY29uc3Qga2V5SWQgPSBvcHRzPy5rZXlJZCA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEO1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBvcHRzPy5jaXBoZXJ0ZXh0QmFzZTY0ID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUO1xuICAgIGlmICgha2V5SWQpIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRCBlbnYgaXMgcmVxdWlyZWQgZm9yIEttc0tleVByb3ZpZGVyJyk7XG4gICAgaWYgKCFjaXBoZXJ0ZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ1NFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUIGVudiBpcyByZXF1aXJlZCBmb3IgS21zS2V5UHJvdmlkZXInKTtcbiAgICB0aGlzLmtleUlkID0ga2V5SWQ7XG4gICAgdGhpcy5jaXBoZXJ0ZXh0QjY0ID0gY2lwaGVydGV4dDtcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHM/LnJlZ2lvbiA/PyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID8/IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjtcbiAgICB0aGlzLmVuZHBvaW50ID0gb3B0cz8uZW5kcG9pbnQgPz8gcHJvY2Vzcy5lbnYuQVdTX0tNU19FTkRQT0lOVDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMubWFzdGVyS2V5Q2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvciggJ0ttc0tleVByb3ZpZGVyIGlzIG5vdCB3YXJtZWQgdXAuIENhbGwgYGF3YWl0IHByb3ZpZGVyLndhcm11cCgpYCBvbmNlIGF0IHNlcnZpY2Ugc3RhcnR1cCBiZWZvcmUgYW55IGVuY3J5cHQvZGVjcnlwdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IGhrZGZTeW5jKCdzaGEyNTYnLCB0aGlzLm1hc3RlcktleUNhY2hlLCBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSwgJ3NlY3JldHMtdjEnLCAzMik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVhZ2VybHkgcmVjb3ZlciB0aGUgbWFzdGVyIGtleSBmcm9tIEtNUyBzbyBzdWJzZXF1ZW50IGBkZXJpdmVLZXlgXG4gICAqIGNhbGxzIGFyZSBzeW5jLiBJZGVtcG90ZW50ICBjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgdGhlIHNhbWUgaW4tXG4gICAqIGZsaWdodCBwcm9taXNlIHNvIHdlIGRvbid0IHNwYXduIG11bHRpcGxlIEtNUyBEZWNyeXB0IHJlcXVlc3RzIGF0XG4gICAqIGJvb3QuIFRocm93cyBvbiBhbnkgS01TIGZhaWx1cmU7IHRoZSBjYWxsZXIgKHR5cGljYWxseSB0aGUgc2VydmljZSdzXG4gICAqIG9uQmVmb3JlU3RhcnQgaG9vaykgZGVjaWRlcyB3aGV0aGVyIHRvIGZhbGwgYmFjayB0byBhIGRpZmZlcmVudFxuICAgKiBwcm92aWRlciBvciBmYWlsLXN0YXJ0dXAuXG4gICAqL1xuICBhc3luYyB3YXJtdXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWFzdGVyS2V5Q2FjaGUpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuZGVjcnlwdEluRmxpZ2h0KSB7XG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IHRoaXMuZmV0Y2hBbmREZWNyeXB0KCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm1hc3RlcktleUNhY2hlID0gYXdhaXQgdGhpcy5kZWNyeXB0SW5GbGlnaHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHRyYW5zaWVudCBLTVMgZmFpbHVyZSBtdXN0IG5vdCBwZXJtYW5lbnRseSBwb2lzb24gdGhlIHByb3ZpZGVyOiBjbGVhclxuICAgICAgLy8gdGhlIHJlamVjdGVkIGluLWZsaWdodCBwcm9taXNlIHNvIGEgbGF0ZXIgd2FybXVwKCkgcmV0cmllcyBpbnN0ZWFkIG9mXG4gICAgICAvLyByZS1hd2FpdGluZyB0aGUgc2FtZSByZWplY3Rpb24gZm9yZXZlciAobWF0Y2hlcyBQZXJPcmdLbXNLZXlQcm92aWRlcikuXG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IG51bGw7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEFuZERlY3J5cHQoKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICByZXR1cm4ga21zRGVjcnlwdDMyKHRoaXMua2V5SWQsIHRoaXMuY2lwaGVydGV4dEI2NCwgdGhpcy5yZWdpb24sIHRoaXMuZW5kcG9pbnQpO1xuICB9XG59XG5cbi8vIExhenkgc2luZ2xldG9uICBvcGVyYXRvciBjb2RlIGluIGxvbmctbGl2ZWQgc2VydmljZXMgcGF5cyB0aGUgZW52LXBhcnNlXG4vLyBjb3N0IG9uY2UsIGFuZCB0ZXN0cyBjYW4gbWludCB0aGVpciBvd24gcHJvdmlkZXIgd2l0aCBhIGxpdGVyYWwga2V5LlxubGV0IGRlZmF1bHRQcm92aWRlcjogS2V5UHJvdmlkZXIgfCBudWxsID0gbnVsbDtcbmZ1bmN0aW9uIGdldERlZmF1bHRQcm92aWRlcigpOiBLZXlQcm92aWRlciB7XG4gIGlmICghZGVmYXVsdFByb3ZpZGVyKSBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRW52S2V5UHJvdmlkZXIoKTtcbiAgcmV0dXJuIGRlZmF1bHRQcm92aWRlcjtcbn1cblxuLyoqIFJlYWQgdGhlIGFjdGl2ZSBkZWZhdWx0IHByb3ZpZGVyLiBFeHBvc2VkIHNvIHNlcnZpY2UgY29kZSAoZS5nLiBhblxuICogIGFkbWluIGVuZHBvaW50IHRoYXQganVzdCByb3RhdGVkIGFuIG9yZydzIEtNUyBjb25maWcpIGNhbiBjYWxsXG4gKiAgYHByb3ZpZGVyLmV2aWN0KG9yZ0lkKWAgb24gdGhlIGxpdmUgcHJvdmlkZXIgcmF0aGVyIHRoYW4gcmVjb25zdHJ1Y3RpbmdcbiAqICBvbmUuIFRyaWdnZXJzIGxhenkgaW5pdGlhbGl6YXRpb24gb24gZmlyc3QgYWNjZXNzLCBzYW1lIGFzIHRoZSBpbnRlcm5hbFxuICogIGNhbGxlcnMgYmVsb3cuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEtleVByb3ZpZGVyKCk6IEtleVByb3ZpZGVyIHtcbiAgcmV0dXJuIGdldERlZmF1bHRQcm92aWRlcigpO1xufVxuXG4vKipcbiAqIFJvdGF0aW9uIGZhbGxiYWNrOiBhbiBgRW52S2V5UHJvdmlkZXJgIG92ZXIgYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VU2AsXG4gKiBvciBudWxsIHdoZW4gdGhhdCBlbnYgaXMgdW5zZXQuIGB1bmRlZmluZWRgID0gbm90IHlldCByZXNvbHZlZC4gV2hpbGUgYVxuICogbWFzdGVyLWtleSByb3RhdGlvbiBpcyBpbiBwcm9ncmVzcywgYGRlY3J5cHRTZWNyZXRgIHJldHJpZXMgYSBmYWlsZWQgZGVjcnlwdFxuICogdW5kZXIgdGhpcyBrZXksIHNvIHJvd3Mgd3JpdHRlbiB1bmRlciB0aGUgb2xkIG1hc3RlciBzdGF5IHJlYWRhYmxlIHVudGlsIHRoZVxuICogcmUtZW5jcnlwdGlvbiB0b29sIChwbGF0Zm9ybSBgc2NyaXB0cy9yZWVuY3J5cHQtc2VjcmV0cy5qc2ApIGhhcyByZXdyaXR0ZW5cbiAqIHRoZW0gdW5kZXIgdGhlIG5ldyBvbmUuIEVuY3J5cHRpb24gTkVWRVIgdXNlcyBpdC5cbiAqL1xubGV0IHByZXZpb3VzUHJvdmlkZXI6IEtleVByb3ZpZGVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldFByZXZpb3VzUHJvdmlkZXIoKTogS2V5UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByZXZpb3VzUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUztcbiAgICBwcmV2aW91c1Byb3ZpZGVyID0gcmF3ID8gbmV3IEVudktleVByb3ZpZGVyKHJhdykgOiBudWxsO1xuICB9XG4gIHJldHVybiBwcmV2aW91c1Byb3ZpZGVyO1xufVxuXG4vKiogUmVhZCB0aGUgcm90YXRpb24tZmFsbGJhY2sgcHJvdmlkZXIgKG51bGwgb3V0c2lkZSBhIG1hc3Rlci1rZXkgcm90YXRpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZpb3VzS2V5UHJvdmlkZXIoKTogS2V5UHJvdmlkZXIgfCBudWxsIHtcbiAgcmV0dXJuIGdldFByZXZpb3VzUHJvdmlkZXIoKTtcbn1cblxuLyoqIFJlc2V0IHRoZSBjYWNoZWQgZGVmYXVsdCAoYW5kIHByZXZpb3VzKSBwcm92aWRlciAgZm9yIHRlc3RzIHRoYXQgbXV0YXRlIGBwcm9jZXNzLmVudmAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREZWZhdWx0S2V5UHJvdmlkZXIoKTogdm9pZCB7IGRlZmF1bHRQcm92aWRlciA9IG51bGw7IHByZXZpb3VzUHJvdmlkZXIgPSB1bmRlZmluZWQ7IH1cblxuLyoqIFJlcGxhY2UgdGhlIGRlZmF1bHQgcHJvdmlkZXIgIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gS01TIGNhbGwgdGhpc1xuICogb25jZSBhdCBzdGFydHVwIHdpdGggYSB3YXJtZWQtdXAgYEttc0tleVByb3ZpZGVyYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRLZXlQcm92aWRlcihwcm92aWRlcjogS2V5UHJvdmlkZXIpOiB2b2lkIHsgZGVmYXVsdFByb3ZpZGVyID0gcHJvdmlkZXI7IH1cblxuLyoqIFBlci1vcmcgS01TIGNvbmZpZyB0aGUgb3BlcmF0b3Igc3VwcGxpZXMuIFRoZSBga2V5SWRgIGlkZW50aWZpZXMgdGhlXG4gKiAgS01TIENNSyB0byBjYWxsIERlY3J5cHQgb247IGBjaXBoZXJ0ZXh0QmFzZTY0YCBpcyB0aGUgd3JhcHBlZCAzMi1ieXRlXG4gKiAgbWFzdGVyIGdlbmVyYXRlZCBieSBgYXdzIGttcyBlbmNyeXB0YCBhZ2FpbnN0IHRoYXQga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJPcmdLbXNDb25maWcge1xuICBrZXlJZDogc3RyaW5nO1xuICBjaXBoZXJ0ZXh0QmFzZTY0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXN5bmMgcmVzb2x2ZXIgdGhhdCBtYXBzIGFuIG9yZyBpZCB0byBpdHMgS01TIGNvbmZpZy4gUmV0dXJucyBgbnVsbGAgd2hlblxuICogdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBwcm92aWRlciB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiBgZmFsbGJhY2tgIHByb3ZpZGVyIHN1cHBsaWVkIGF0IGNvbnN0cnVjdGlvbiAodXN1YWxseSBhbiBFbnZLZXlQcm92aWRlclxuICogb3IgYSBkZWZhdWx0IEttc0tleVByb3ZpZGVyKS5cbiAqL1xuZXhwb3J0IHR5cGUgUGVyT3JnS21zUmVzb2x2ZXIgPSAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxQZXJPcmdLbXNDb25maWcgfCBudWxsPjtcblxuLyoqXG4gKiBQZXItb3JnIEtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuIFRoZSBibGFzdCByYWRpdXMgb2YgYSBLTVMga2V5IGNvbXByb21pc2VcbiAqIGlzIG9uZSBvcmcgaW5zdGVhZCBvZiBldmVyeSBvcmcgdW5kZXIgYSBzaGFyZWQgbWFzdGVyLlxuICpcbiAqIEVhY2ggb3JnIGhhcyBpdHMgb3duIEtNUyBDTUsgKyBpdHMgb3duIHdyYXBwZWQgbWFzdGVyIChzdG9yZWQgaW4gTW9uZ29cbiAqIHZpYSB0aGUgb3BlcmF0b3IncyBzZXR1cCBzY3JpcHQpLiBPbiBmaXJzdCBlbmNyeXB0L2RlY3J5cHQgZm9yIGFuIG9yZyxcbiAqIHRoZSBwcm92aWRlcjpcbiAqICAgMS4gQ2FsbHMgdGhlIHJlc29sdmVyIHRvIGZldGNoIHRoZSBvcmcncyBLTVMgY29uZmlnLlxuICogICAyLiBDYWxscyBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIDMyLWJ5dGUgbWFzdGVyLlxuICogICAzLiBDYWNoZXMgdGhlIHJlY292ZXJlZCBtYXN0ZXIgaW4tbWVtb3J5IGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS5cbiAqICAgNC4gSEtERi1kZXJpdmVzIHBlci1jYWxsIGZyb20gdGhhdCBtYXN0ZXIgKyB0aGUgb3JnIGlkIHNhbHQuXG4gKlxuICogQmxvYnMgZW5jcnlwdGVkIGJ5IHRoaXMgcHJvdmlkZXIgY2FycnkgYGtpZCA9IDxrbXMta2V5LWlkPmAgc28gdGhlXG4gKiBkZWNyeXB0IHBhdGggZGV0ZWN0cyBhIHN0YWxlIGNvbmZpZyAob3BlcmF0b3Igcm90YXRlZCB0aGUga2V5IGJ1dFxuICogZXhpc3Rpbmcgcm93cyB3ZXJlbid0IHJlLWVuY3J5cHRlZCkgQkVGT1JFIEFFUy1HQ00gdGhyb3dzIGFuIG9wYXF1ZVxuICogYXV0aGVudGljYXRpb24tdGFnIGVycm9yLlxuICpcbiAqIE9yZ3Mgd2l0aG91dCBwZXItb3JnIGNvbmZpZyBmYWxsIHRocm91Z2ggdG8gdGhlIGBmYWxsYmFja2AgcHJvdmlkZXIg4oCUXG4gKiBtaXhlZC1tb2RlIGRlcGxveW1lbnRzIHdoZXJlIHNvbWUgb3JncyBoYXZlIEtNUyBpc29sYXRpb24gYW5kIG90aGVyc1xuICogc3RheSBvbiB0aGUgc2hhcmVkIG1hc3RlciBhcmUgZXhwbGljaXRseSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJPcmdLbXNLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgLyoqIENhY2hlZCBwZXItb3JnIG1hc3RlciBrZXlzLCBrZXllZCBieSBvcmdJZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsga2V5OiBCdWZmZXI7IGtpZDogc3RyaW5nIH0+KCk7XG4gIC8qKiBSZXNvbHZlZCBwZXItb3JnIGNvbmZpZ3MgY2FjaGVkIGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdzID0gbmV3IE1hcDxzdHJpbmcsIFBlck9yZ0ttc0NvbmZpZz4oKTtcbiAgLyoqIEluLWZsaWdodCByZXNvbHZlciBwcm9taXNlcyBzbyBjb25jdXJyZW50IGZpcnN0LXRvdWNoIGNhbGxlcnMgc2hhcmUgb25lIEtNUyBEZWNyeXB0LlxuICAgKiAgUmVzb2x2ZXMgdG8gYG51bGxgIGZvciBvcmdzIHdpdGggbm8gcGVyLW9yZyBjb25maWcg4oCUIGNhbGxlciB0cmVhdHMgbnVsbCBhc1xuICAgKiAgXCJmYWxsIHRocm91Z2ggdG8gdGhlIGZhbGxiYWNrIHByb3ZpZGVyXCIsIHNhbWUgYXMgYSBjb2xkIGNhY2hlIG1pc3MuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4+KCk7XG4gIC8qKiBPcmdzIHRoZSByZXNvbHZlciBoYXMgUFJPVkVOIGhhdmUgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBmYWxsYmFjayBwcm92aWRlclxuICAgKiAgaXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciB0aGVzZSwgYW5kIGBkZXJpdmVLZXlgIG1heSBzZXJ2ZSB0aGVtXG4gICAqICBzeW5jaHJvbm91c2x5LiBEaXN0aW5jdCBmcm9tIFwibm90IHlldCByZXNvbHZlZFwiLCB3aGljaCBtdXN0IG5vdCBndWVzcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZE5vUGVyT3JnQ29uZmlnID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBQcm92aWRlciB1c2VkIGZvciBvcmdzIHRoYXQgaGF2ZSBubyBwZXItb3JnIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFjazogS2V5UHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRzOiB7XG4gICAgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICAgIGZhbGxiYWNrOiBLZXlQcm92aWRlcjtcbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnJlc29sdmVyID0gb3B0cy5yZXNvbHZlcjtcbiAgICB0aGlzLmZhbGxiYWNrID0gb3B0cy5mYWxsYmFjaztcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHMucmVnaW9uID8/IHByb2Nlc3MuZW52LkFXU19SRUdJT04gPz8gcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBvcHRzLmVuZHBvaW50ID8/IHByb2Nlc3MuZW52LkFXU19LTVNfRU5EUE9JTlQ7XG4gIH1cblxuICAvKipcbiAgICogU3luYyBkZXJpdmUuIE9ubHkgY29ycmVjdCBmb3IgYW4gb3JnIHdob3NlIGNvbmZpZyBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIFJFU09MVkVEIOKAlCBlaXRoZXIgaXQgaGFzIGEgcGVyLW9yZyBtYXN0ZXIgKHVzZSBpdCkgb3IgaXQgcHJvdmFibHkgaGFzIG5vXG4gICAqIHBlci1vcmcgY29uZmlnICh0aGUgZmFsbGJhY2sgaXMgdGhlbiB0aGUgcmlnaHQgYW5zd2VyKS5cbiAgICpcbiAgICogRm9yIGFuIFVOUkVTT0xWRUQgb3JnIHRoaXMgVEhST1dTIHJhdGhlciB0aGFuIGd1ZXNzaW5nLiBGYWxsaW5nIHRocm91Z2ggdG9cbiAgICogdGhlIGZhbGxiYWNrIHdvdWxkIHNpbGVudGx5IGVuY3J5cHQgdGhhdCBvcmcncyBzZWNyZXRzIHVuZGVyIHRoZSBTSEFSRURcbiAgICogbWFzdGVyIGFuZCDigJQgYmVjYXVzZSBga2lkRm9yYCBhbHNvIHJldHVybnMgdW5kZWZpbmVkLCBzbyB0aGVcbiAgICogYm90aC1raWRzLXByZXNlbnQgbWlzbWF0Y2ggZ3VhcmQgY291bGQgbmV2ZXIgZmlyZSDigJQgbGVhdmUgdGhlbSBwZXJtYW5lbnRseVxuICAgKiB1bmRlY3J5cHRhYmxlIG9uY2UgdGhlIG9yZyB3YXJtZWQgKGBkZWNpcGhlci5maW5hbCgpYCB0aHJvd3MgYW4gb3BhcXVlXG4gICAqIGF1dGgtdGFnIGVycm9yIHdpdGggbm8gZGlhZ25vc3RpYykuIEZhaWxpbmcgbG91ZCBoZXJlIG1hdGNoZXNcbiAgICogYEttc0tleVByb3ZpZGVyLmRlcml2ZUtleWAsIHdoaWNoIHJlZnVzZXMgdG8gd29yayBjb2xkLlxuICAgKlxuICAgKiBgZW5jcnlwdFNlY3JldGAvYGRlY3J5cHRTZWNyZXRgIGFyZSBhc3luYyBhbmQgYXdhaXQgYGRlcml2ZUtleUFzeW5jYCwgc29cbiAgICogdGhleSByZXNvbHZlIHRoZSBvcmcgZmlyc3QgYW5kIG5ldmVyIGhpdCB0aGlzIHBhdGg7IGl0IGlzIHRoZSBiYWNrc3RvcCBmb3JcbiAgICogYSBjYWxsZXIgdGhhdCByZWFjaGVzIGZvciB0aGUgc3luYyBBUEkgZGlyZWN0bHkuXG4gICAqL1xuICBkZXJpdmVLZXkob3JnSWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5tYXN0ZXJzLmdldChvcmdJZCk7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGlmICh0aGlzLnJlc29sdmVkTm9QZXJPcmdDb25maWcuaGFzKG9yZ0lkKSkgcmV0dXJuIHRoaXMuZmFsbGJhY2suZGVyaXZlS2V5KG9yZ0lkKTtcbiAgICAgIHRocm93IG5ldyBFcnJvciggYFBlck9yZ0ttc0tleVByb3ZpZGVyIGhhcyBub3QgcmVzb2x2ZWQgb3JnICR7b3JnSWR9LiBgXG4gICAgICAgICsgJ0NhbGwgYGF3YWl0IHByb3ZpZGVyLmVuc3VyZVdhcm1lZChvcmdJZClgIChvciB1c2UgdGhlIGFzeW5jIGVuY3J5cHRTZWNyZXQvZGVjcnlwdFNlY3JldCkgJ1xuICAgICAgICArICdiZWZvcmUgZGVyaXZpbmcgYSBrZXkg4oCUIGd1ZXNzaW5nIHRoZSBzaGFyZWQgbWFzdGVyIHdvdWxkIHdyaXRlIHNlY3JldHMgdGhhdCBjYW5ub3QgYmUgZGVjcnlwdGVkIGxhdGVyLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkID0gaGtkZlN5bmMoJ3NoYTI1NicsIGNhY2hlZC5rZXksIEJ1ZmZlci5mcm9tKG9yZ0lkLCAndXRmOCcpLCAnc2VjcmV0cy12MScsIDMyKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVyaXZlZCk7XG4gIH1cblxuICBhc3luYyBkZXJpdmVLZXlBc3luYyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdhcm1lZChvcmdJZCk7XG4gICAgcmV0dXJuIHRoaXMuZGVyaXZlS2V5KG9yZ0lkKTtcbiAgfVxuXG4gIGtpZEZvcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm1hc3RlcnMuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkLmtpZDtcbiAgICAvLyBPbmx5IHNwZWFrIGZvciBhbiBvcmcgd2hvc2UgY29uZmlnIGlzIHJlc29sdmVkOyBhbiB1bnJlc29sdmVkIG9yZyBoYXMgbm9cbiAgICAvLyBtZWFuaW5nZnVsIGtpZCwgYW5kIGNsYWltaW5nIG9uZSB3b3VsZCBkZWZlYXQgdGhlIG1pc21hdGNoIGd1YXJkLlxuICAgIGlmICh0aGlzLnJlc29sdmVkTm9QZXJPcmdDb25maWcuaGFzKG9yZ0lkKSkgcmV0dXJuIHRoaXMuZmFsbGJhY2sua2lkRm9yPy4ob3JnSWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgb3JnJ3MgS01TIGNvbmZpZywgY2FsbCBEZWNyeXB0LCBjYWNoZSB0aGUgbWFzdGVyLiBTdWJzZXF1ZW50XG4gICAqIGNhbGxzIGZvciB0aGUgc2FtZSBvcmcgYXJlIG5vLW9wcy4gQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBpbi1mbGlnaHRcbiAgICogRGVjcnlwdCBwcm9taXNlLlxuICAgKlxuICAgKiBSZXR1cm5zIHNpbGVudGx5IHdoZW4gdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBmYWxsYmFja1xuICAgKiBwcm92aWRlciBoYW5kbGVzIHRob3NlIG9yZ3MuXG4gICAqL1xuICBhc3luYyBlbnN1cmVXYXJtZWQob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1hc3RlcnMuaGFzKG9yZ0lkKSkgcmV0dXJuO1xuICAgIC8vIEluc3RhbGwgdGhlIGluLWZsaWdodCBwcm9taXNlIFNZTkNIUk9OT1VTTFkgYmVmb3JlIHlpZWxkaW5nIHNvIGNvbmN1cnJlbnRcbiAgICAvLyBjYWxsZXJzIGZpbmQgaXQgb24gdGhlIHNlY29uZC1hbmQtbGF0ZXIgcGFzc2VzLiBBd2FpdGluZyB0aGUgcmVzb2x2ZXJcbiAgICAvLyBiZWZvcmUgcG9wdWxhdGluZyB0aGUgbWFwIGlzIHRoZSBidWcgdGhhdCBsZXRzIGEgUHJvbWlzZS5hbGwgb2YgM1xuICAgIC8vIGNhbGxlcnMgZmlyZSAzIEtNUyBEZWNyeXB0cy5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuaW5GbGlnaHQuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgIHByb21pc2UgPSB0aGlzLnJlc29sdmVBbmREZWNyeXB0KG9yZ0lkKTtcbiAgICAgIHRoaXMuaW5GbGlnaHQuc2V0KG9yZ0lkLCBwcm9taXNlKTtcbiAgICAgIHZvaWQgcHJvbWlzZS5maW5hbGx5KCgpID0+IHsgaWYgKHRoaXMuaW5GbGlnaHQuZ2V0KG9yZ0lkKSA9PT0gcHJvbWlzZSkgdGhpcy5pbkZsaWdodC5kZWxldGUob3JnSWQpOyB9KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcbiAgICBpZiAocmVzdWx0KSB0aGlzLm1hc3RlcnMuc2V0KG9yZ0lkLCByZXN1bHQpO1xuICAgIC8vIFJlbWVtYmVyIHRoZSBORUdBVElWRSBvdXRjb21lIHRvbywgc28gdGhlIHN5bmMgYGRlcml2ZUtleWAgY2FuIHRlbGxcbiAgICAvLyBcIm5vIHBlci1vcmcgY29uZmlnLCBmYWxsYmFjayBpcyBjb3JyZWN0XCIgZnJvbSBcIm5vdCByZXNvbHZlZCB5ZXRcIi5cbiAgICBlbHNlIHRoaXMucmVzb2x2ZWROb1Blck9yZ0NvbmZpZy5hZGQob3JnSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlQW5kRGVjcnlwdChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIGxldCBjZmcgPSB0aGlzLmNvbmZpZ3MuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIWNmZykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmVyKG9yZ0lkKTtcbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVybiBudWxsOyAvLyBubyBwZXItb3JnIGNvbmZpZyDihpIgY2FsbGVyIHVzZXMgZmFsbGJhY2tcbiAgICAgIGNmZyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5jb25maWdzLnNldChvcmdJZCwgY2ZnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5mZXRjaEFuZERlY3J5cHQoY2ZnKTtcbiAgICByZXR1cm4geyBrZXksIGtpZDogY2ZnLmtleUlkIH07XG4gIH1cblxuICBwcml2YXRlIGZldGNoQW5kRGVjcnlwdChjZmc6IFBlck9yZ0ttc0NvbmZpZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIGttc0RlY3J5cHQzMihjZmcua2V5SWQsIGNmZy5jaXBoZXJ0ZXh0QmFzZTY0LCB0aGlzLnJlZ2lvbiwgdGhpcy5lbmRwb2ludCk7XG4gIH1cblxuICAvKiogRXZpY3QgYSBjYWNoZWQgcGVyLW9yZyBtYXN0ZXIuIFVzZSBhZnRlciBhIGtleSByb3RhdGlvbiBzbyB0aGUgbmV4dFxuICAgKiAgdG91Y2ggcmUtZmV0Y2hlcyB0aGUgbmV3IHdyYXBwZWQgbWFzdGVyIGZyb20gdGhlIHJlc29sdmVyLiAqL1xuICBldmljdChvcmdJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0ZXJzLmRlbGV0ZShvcmdJZCk7XG4gICAgdGhpcy5jb25maWdzLmRlbGV0ZShvcmdJZCk7XG4gICAgLy8gQWxzbyBmb3JnZXQgYSBORUdBVElWRSByZXNvbHV0aW9uLCBvciBhbiBvcmcgdGhhdCBnYWlucyBhIHBlci1vcmcgY29uZmlnXG4gICAgLy8gYWZ0ZXIgYmVpbmcgcmVzb2x2ZWQgYXMgXCJubyBjb25maWdcIiB3b3VsZCBrZWVwIHVzaW5nIHRoZSBzaGFyZWQgbWFzdGVyLlxuICAgIHRoaXMucmVzb2x2ZWROb1Blck9yZ0NvbmZpZy5kZWxldGUob3JnSWQpO1xuICB9XG59XG5cbi8qKlxuICogRGVyaXZlIHRoZSBrZXkgZm9yIGBvcmdJZGAsIGdpdmluZyB0aGUgcHJvdmlkZXIgYSBjaGFuY2UgdG8gZG8gSS9PIGZpcnN0LlxuICpcbiAqIFRoaXMgaXMgd2h5IGBlbmNyeXB0U2VjcmV0YC9gZGVjcnlwdFNlY3JldGAgYXJlIGFzeW5jOiBgUGVyT3JnS21zS2V5UHJvdmlkZXJgXG4gKiBuZWVkcyBvbmUgS01TIERlY3J5cHQgdGhlIGZpcnN0IHRpbWUgaXQgc2VlcyBhbiBvcmcsIGFuZCBkZXJpdmluZ1xuICogc3luY2hyb25vdXNseSBiZWZvcmUgdGhhdCByZXNvbHZlcyB3b3VsZCBzaWxlbnRseSBmYWxsIGJhY2sgdG8gdGhlIHNoYXJlZFxuICogbWFzdGVyIGFuZCBwcm9kdWNlIHNlY3JldHMgdGhhdCBjYW5ub3QgYmUgZGVjcnlwdGVkIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcml2ZUtleUZvcihwcm92aWRlcjogS2V5UHJvdmlkZXIsIG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICByZXR1cm4gcHJvdmlkZXIuZGVyaXZlS2V5QXN5bmMgPyBwcm92aWRlci5kZXJpdmVLZXlBc3luYyhvcmdJZCkgOiBwcm92aWRlci5kZXJpdmVLZXkob3JnSWQpO1xufVxuXG4vKipcbiAqIEVuY3J5cHQgYSBwbGFpbnRleHQgc3RyaW5nIGZvciBzdG9yYWdlLiBSZXR1cm5zIGFuIGBFbmNyeXB0ZWRCbG9iYCB0aGF0XG4gKiBjYW4gYmUgSlNPTi1zZXJpYWxpemVkIGludG8gdGhlIHVuZGVybHlpbmcgY29sdW1uIC8gTW9uZ28gZG9jdW1lbnQuXG4gKlxuICogRW1wdHkgc3RyaW5ncyByb3VuZC10cmlwIGFzIGBudWxsYCBzbyB0aGUgY2FsbGluZyBtb2RlbCBsYXllciBjYW4gdHJlYXRcbiAqIFwibm8gc2VjcmV0IHNldFwiIGlkZW50aWNhbGx5IHRvIFwiZmllbGQgYWJzZW50XCIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0U2VjcmV0KCBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcHJvdmlkZXI6IEtleVByb3ZpZGVyID0gZ2V0RGVmYXVsdFByb3ZpZGVyKCksXG4pOiBQcm9taXNlPEVuY3J5cHRlZEJsb2I+IHtcbiAgaWYgKCFwbGFpbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnVzaW5nIHRvIGVuY3J5cHQgZW1wdHkgc3RyaW5nOyBjYWxsZXIgc2hvdWxkIHN0b3JlIG51bGwgaW5zdGVhZCcpO1xuICB9XG4gIC8vIFJlc29sdmUgKGFuZCB3YXJtKSB0aGUgb3JnIEJFRk9SRSByZWFkaW5nIGBraWRGb3JgIGJlbG93LCBzbyBhIHBlci1vcmcgS01TXG4gIC8vIGJsb2IgaXMgYWx3YXlzIHN0YW1wZWQgd2l0aCB0aGUga2V5IGl0IHdhcyBhY3R1YWxseSBlbmNyeXB0ZWQgdW5kZXIuXG4gIGNvbnN0IGtleSA9IGF3YWl0IGRlcml2ZUtleUZvcihwcm92aWRlciwgb3JnSWQpO1xuICBjb25zdCBpdiA9IHJhbmRvbUJ5dGVzKDEyKTtcbiAgY29uc3QgY2lwaGVyID0gY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBpdik7XG4gIGNvbnN0IGVuYyA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUocGxhaW50ZXh0LCAndXRmOCcpLCBjaXBoZXIuZmluYWwoKV0pO1xuICBjb25zdCB0YWcgPSBjaXBoZXIuZ2V0QXV0aFRhZygpO1xuICAvLyBQZXJPcmdLbXNLZXlQcm92aWRlciB0YWdzIGJsb2JzIHdpdGggdGhlIEtNUyBrZXkgaWQgdXNlZCBzbyB0aGVcbiAgLy8gZGVjcnlwdCBwYXRoIGNhbiByZWZ1c2UgdG8gb3BlcmF0ZSBpZiB0aGUgb3BlcmF0b3IgbGF0ZXIgc3dhcHMgaW4gYVxuICAvLyBkaWZmZXJlbnQgcGVyLW9yZyBjb25maWcgKGEgbWlzY29uZmlndXJlZCBzd2FwIHNob3VsZG4ndCBzaWxlbnRseVxuICAvLyBhY2NlcHQgYSBzdGFsZSBibG9iIGl0IGNhbid0IHZlcmlmeSBhZ2FpbnN0IHRoZSByaWdodCBDTUspLlxuICBjb25zdCBraWQgPSBwcm92aWRlci5raWRGb3I/LihvcmdJZCk7XG4gIHJldHVybiB7XG4gICAgYWxnOiAnYWVzLTI1Ni1nY20tdjEnLFxuICAgIGl2OiBpdi50b1N0cmluZygnYmFzZTY0JyksXG4gICAgLy8gR0NNIHRhZyBNVVNUIHRyYXZlbCB3aXRoIHRoZSBjaXBoZXJ0ZXh0IG9yIGBkZWNyeXB0U2VjcmV0YCBjYW4ndFxuICAgIC8vIHZlcmlmeSBpbnRlZ3JpdHkgIGNvbmNhdGVuYXRlIHNvIHRoZSBvbi1kaXNrIHNoYXBlIGlzIG9uZSBmaWVsZC5cbiAgICBjaXBoZXJ0ZXh0OiBCdWZmZXIuY29uY2F0KFtlbmMsIHRhZ10pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAuLi4oa2lkICE9PSB1bmRlZmluZWQgPyB7IGtpZCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIERlY3J5cHQgYW4gYEVuY3J5cHRlZEJsb2JgIHdyaXR0ZW4gYnkgYGVuY3J5cHRTZWNyZXRgLiBUaHJvd3Mgb24gKiAtIHVua25vd24gYGFsZ2AgKGZvcmNlcyBhbiBleHBsaWNpdCBtaWdyYXRpb24gd2hlbiB0aGUgZm9ybWF0IGNoYW5nZXMpXG4gKiAtIHdyb25nIG9yZ0lkIChIS0RGIGJpbmRpbmcgbWlzbWF0Y2ggZmFpbHMgdGhlIGF1dGggdGFnKVxuICogLSB0YW1wZXJlZCBjaXBoZXJ0ZXh0IChHQ00gYXV0aCB0YWcgY2hlY2sgZmFpbHMpXG4gKlxuICogQ2FsbGVycyBoYW5kbGUgdGhlIHRocm93ICBtYXNraW5nIHRoZSBmYWlsdXJlIGFzIGBudWxsYCB3b3VsZCBoaWRlXG4gKiBzaWxlbnQgY29ycnVwdGlvbiAvIHdyb25nLW9yZyByZWFkcy5cbiAqXG4gKiBgcHJldmlvdXNgIChkZWZhdWx0OiBgU0VDUkVUX0VOQ1JZUFRJT05fS0VZX1BSRVZJT1VTYCwgd2hlbiBzZXQpIGlzIHRyaWVkXG4gKiBvbmx5IGFmdGVyIHRoZSBwcmltYXJ5IGtleSBmYWlscywgYW5kIG9ubHkgZm9yIGtpZC1sZXNzIGJsb2JzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFNlY3JldCggYmxvYjogRW5jcnlwdGVkQmxvYixcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcHJvdmlkZXI6IEtleVByb3ZpZGVyID0gZ2V0RGVmYXVsdFByb3ZpZGVyKCksXG4gIHByZXZpb3VzOiBLZXlQcm92aWRlciB8IG51bGwgPSBnZXRQcmV2aW91c1Byb3ZpZGVyKCksXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoYmxvYi5hbGcgIT09ICdhZXMtMjU2LWdjbS12MScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnOiAke2Jsb2IuYWxnfWApO1xuICB9XG4gIC8vIFdhcm0gZmlyc3Q6IGBraWRGb3JgIGFuZCBgZGVyaXZlS2V5YCBiZWxvdyBtdXN0IGJvdGggc3BlYWsgZm9yIHRoZSBvcmcnc1xuICAvLyByZWFsIGNvbmZpZywgb3IgdGhlIG1pc21hdGNoIGd1YXJkIHNpbGVudGx5IG5vLW9wcy5cbiAgY29uc3Qga2V5ID0gYXdhaXQgZGVyaXZlS2V5Rm9yKHByb3ZpZGVyLCBvcmdJZCk7XG4gIC8vIElmIGJvdGggdGhlIHByb3ZpZGVyIEFORCB0aGUgYmxvYiByZXBvcnQgYSBraWQsIHRoZXkgbXVzdCBtYXRjaC5cbiAgLy8gTWlzbWF0Y2ggdXN1YWxseSBtZWFucyBhbiBvcGVyYXRvciByb3RhdGVkL3JlcGxhY2VkIGFuIG9yZydzIEtNU1xuICAvLyBjb25maWcgYW5kIGlzIG5vdyByZWFkaW5nIGEgYmxvYiBlbmNyeXB0ZWQgdW5kZXIgdGhlIE9MRCBrZXkg4oCUXG4gIC8vIGZhaWxpbmcgbG91ZCBoZXJlIGJlYXRzIGxldHRpbmcgQUVTLUdDTSB0aHJvdyBhbiBvcGFxdWUgYXV0aC10YWcgZXJyb3IuXG4gIGNvbnN0IHByb3ZpZGVyS2lkID0gcHJvdmlkZXIua2lkRm9yPy4ob3JnSWQpO1xuICBpZiAocHJvdmlkZXJLaWQgIT09IHVuZGVmaW5lZCAmJiBibG9iLmtpZCAhPT0gdW5kZWZpbmVkICYmIHByb3ZpZGVyS2lkICE9PSBibG9iLmtpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgS01TIGtleSBpZCBtaXNtYXRjaDogYmxvYiB3YXMgZW5jcnlwdGVkIHVuZGVyICR7YmxvYi5raWR9LCBjdXJyZW50IHByb3ZpZGVyIHVzZXMgJHtwcm92aWRlcktpZH0gZm9yIG9yZyAke29yZ0lkfWApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY3J5cHRXaXRoS2V5KGJsb2IsIGtleSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIE1hc3Rlci1rZXkgcm90YXRpb24gd2luZG93OiByZXRyeSB1bmRlciBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVMuXG4gICAgLy8gT25seSBmb3IgYSBraWQtbGVzcyBibG9iICh0aGUgZW52LWtleWVkIHNoYXBlKSDigJQgYSBwZXItb3JnIEtNUyBibG9iIGlzXG4gICAgLy8gYm91bmQgdG8gaXRzIENNSyBhbmQgdGhlIHNoYXJlZCBwcmV2aW91cyBtYXN0ZXIgY2FuIG5ldmVyIG9wZW4gaXQuIFRoZVxuICAgIC8vIE9SSUdJTkFMIGVycm9yIHN1cmZhY2VzIHdoZW4gdGhlIHByZXZpb3VzIGtleSBmYWlscyB0b28sIHNvIGEgdGFtcGVyZWQgb3JcbiAgICAvLyB3cm9uZy1vcmcgYmxvYiBzdGlsbCBmYWlscyBsb3VkIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIGlmIChwcmV2aW91cyAmJiBibG9iLmtpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjcnlwdFdpdGhLZXkoYmxvYiwgYXdhaXQgZGVyaXZlS2V5Rm9yKHByZXZpb3VzLCBvcmdJZCkpO1xuICAgICAgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCB0byB0aGUgcHJpbWFyeSBlcnJvciAqLyB9XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKiogQUVTLTI1Ni1HQ00gb3BlbiBvZiBhIGJsb2IgdW5kZXIgb25lIGRlcml2ZWQga2V5LiBUaHJvd3Mgb24gYW55IGF1dGgtdGFnIGZhaWx1cmUuICovXG5mdW5jdGlvbiBkZWNyeXB0V2l0aEtleShibG9iOiBFbmNyeXB0ZWRCbG9iLCBrZXk6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGNvbnN0IGl2ID0gQnVmZmVyLmZyb20oYmxvYi5pdiwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhbGwgPSBCdWZmZXIuZnJvbShibG9iLmNpcGhlcnRleHQsICdiYXNlNjQnKTtcbiAgLy8gU3BsaXQgb2ZmIHRoZSAxNi1ieXRlIGF1dGggdGFnIGFwcGVuZGVkIGluIGVuY3J5cHRTZWNyZXQuIEFueSB0YW1wZXJpbmdcbiAgLy8gIHRvIGVpdGhlciB0aGUgY2lwaGVydGV4dCBPUiB0aGUgdGFnICBjYXVzZXMgdGhlIG5leHQgYGZpbmFsKClgIHRvXG4gIC8vIHRocm93IHdpdGggXCJVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGFcIi5cbiAgY29uc3QgdGFnID0gYWxsLnN1YmFycmF5KGFsbC5sZW5ndGggLSAxNik7XG4gIGNvbnN0IGVuYyA9IGFsbC5zdWJhcnJheSgwLCBhbGwubGVuZ3RoIC0gMTYpO1xuICBjb25zdCBkZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBpdik7XG4gIGRlY2lwaGVyLnNldEF1dGhUYWcodGFnKTtcbiAgY29uc3QgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKGVuYyksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgcmV0dXJuIGRlYy50b1N0cmluZygndXRmOCcpO1xufVxuXG4vKipcbiAqIFNoYXBlIGd1YXJkIGZvciBhIHBhcnNlZCBgRW5jcnlwdGVkQmxvYmAuIENhbGxlcnMgaG9sZCBhIHZhbHVlIHRoYXQgd2FzIEpTT04tXG4gKiBkZWNvZGVkIGZyb20gYSBzZWNyZXQgY29sdW1uIGFuZCBtdXN0IG5vdCBoYW5kIGFueXRoaW5nIGVsc2UgdG9cbiAqIGBkZWNyeXB0U2VjcmV0YDsgdGhpcyBuYXJyb3dzIGl0IChvciB0aGUgY2FsbGVyIHJlamVjdHMgdGhlIHZhbHVlKS4gQ2xlYXIgdGV4dFxuICogaXMgTk9UIGEgc3VwcG9ydGVkIHN0b3JlZCBmb3JtIOKAlCB0aGUgb25seSBjb25zdW1lciB0aHJvd3Mgb24gYSBub24tYmxvYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkQmxvYih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVuY3J5cHRlZEJsb2Ige1xuICByZXR1cm4gKCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgJiYgdmFsdWUgIT09IG51bGxcbiAgICAmJiAodmFsdWUgYXMgeyBhbGc/OiB1bmtub3duIH0pLmFsZyA9PT0gJ2Flcy0yNTYtZ2NtLXYxJ1xuICAgICYmIHR5cGVvZiAodmFsdWUgYXMgeyBpdj86IHVua25vd24gfSkuaXYgPT09ICdzdHJpbmcnXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyB7IGNpcGhlcnRleHQ/OiB1bmtub3duIH0pLmNpcGhlcnRleHQgPT09ICdzdHJpbmcnXG4gICk7XG59XG4iXX0=
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* stays 1 past the overlap window. See docs/runbooks/secret-rotation.md.
|
|
15
15
|
*
|
|
16
16
|
* `SERVICE_SIGNING_KEY` is registered here because every service that loads
|
|
17
|
-
* api-core signs its internal SERVICE tokens with its own key
|
|
17
|
+
* api-core signs its internal SERVICE tokens with its own key. Its
|
|
18
18
|
* overlap is not an env value: while a rotation is open, the shared key bundle
|
|
19
19
|
* publishes TWO public keys for this service, so the probe asks the key loader
|
|
20
20
|
* whether the retiring one is still trusted. The ES256 user-token signing key is
|
|
@@ -51,4 +51,4 @@ export function previousSecretStates() {
|
|
|
51
51
|
return { secret, previousSet };
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LXJvdGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NlY3JldC1yb3RhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFNUUsc0RBQXNEO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLDhCQUE4QixDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsUUFBUSxDQUFDLElBQVk7SUFDbkMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzFDLENBQUM7QUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBd0I7SUFDNUMsQ0FBQyxxQkFBcUIsRUFBRSw2QkFBNkIsQ0FBQztDQUN2RCxDQUFDLENBQUM7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsTUFBYyxFQUFFLGFBQTRCO0lBQ3RGLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQ25ELElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUM7WUFBQyxXQUFXLEdBQUcsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDO1FBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSb3RhdGlvbi13aW5kb3cgdmlzaWJpbGl0eSBmb3IgXCJwcmV2aW91c1wiIHNlY3JldHMuXG4gKlxuICogRXZlcnkgcm90YXRhYmxlIHNlY3JldCBrZWVwcyBhIGAqX1BSRVZJT1VTYCB2YWx1ZSAob3IsIGZvciB0aGUgcmVnaXN0cnlcbiAqIHNpZ25pbmcgY2VydCwgYSBzZWNvbmQgY2VydCBpbiB0aGUgdHJ1c3QgYnVuZGxlKSB0aGF0IGlzIGFjY2VwdGVkIE9OTFkgZm9yXG4gKiB0aGUgb3ZlcmxhcCB3aW5kb3cgb2YgYSByb3RhdGlvbi4gTGVhdmluZyBpdCBzZXQgaW5kZWZpbml0ZWx5IHNpbGVudGx5IGtlZXBzXG4gKiB0aGUgb2xkIGNyZWRlbnRpYWwgdmFsaWQg4oCUIHRoZSB2ZXJ5IHRoaW5nIHRoZSByb3RhdGlvbiB3YXMgbWVhbnQgdG8gZW5kLlxuICpcbiAqIEVhY2ggc2VydmljZSByZWdpc3RlcnMgYSBwcm9iZSBwZXIgc2VjcmV0IGl0IG93bnM7IHRoZSBtZXRyaWNzIGxheWVyIGV4cG9ydHNcbiAqIHRoZW0gYXMgdGhlIGBzZWNyZXRfcm90YXRpb25fcHJldmlvdXNfc2V0e3NlY3JldH1gIGdhdWdlICgxIHdoaWxlIHRoZSBwcmV2aW91c1xuICogdmFsdWUgaXMgc2V0KSBhbmQgdGhlIGBTZWNyZXRSb3RhdGlvblByZXZpb3VzTGluZ2VyaW5nYCBhbGVydCBmaXJlcyB3aGVuIGl0XG4gKiBzdGF5cyAxIHBhc3QgdGhlIG92ZXJsYXAgd2luZG93LiBTZWUgZG9jcy9ydW5ib29rcy9zZWNyZXQtcm90YXRpb24ubWQuXG4gKlxuICogYFNFUlZJQ0VfU0lHTklOR19LRVlgIGlzIHJlZ2lzdGVyZWQgaGVyZSBiZWNhdXNlIGV2ZXJ5IHNlcnZpY2UgdGhhdCBsb2Fkc1xuICogYXBpLWNvcmUgc2lnbnMgaXRzIGludGVybmFsIFNFUlZJQ0UgdG9rZW5zIHdpdGggaXRzIG93biBrZXkuIEl0c1xuICogb3ZlcmxhcCBpcyBub3QgYW4gZW52IHZhbHVlOiB3aGlsZSBhIHJvdGF0aW9uIGlzIG9wZW4sIHRoZSBzaGFyZWQga2V5IGJ1bmRsZVxuICogcHVibGlzaGVzIFRXTyBwdWJsaWMga2V5cyBmb3IgdGhpcyBzZXJ2aWNlLCBzbyB0aGUgcHJvYmUgYXNrcyB0aGUga2V5IGxvYWRlclxuICogd2hldGhlciB0aGUgcmV0aXJpbmcgb25lIGlzIHN0aWxsIHRydXN0ZWQuIFRoZSBFUzI1NiB1c2VyLXRva2VuIHNpZ25pbmcga2V5IGlzXG4gKiBwbGF0Zm9ybSdzIGFsb25lLCBzbyBpdHMgcHJvYmUgaXMgcmVnaXN0ZXJlZCB0aGVyZS5cbiAqL1xuXG5pbXBvcnQgeyBpc1JldGlyaW5nU2VydmljZUtleVB1Ymxpc2hlZCB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5cbi8qKiBHYXVnZSBuYW1lIGV4cG9ydGVkIGJ5IGFwaS1zZXJ2ZXIgYW5kIHBsYXRmb3JtLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSA9ICdzZWNyZXRfcm90YXRpb25fcHJldmlvdXNfc2V0JztcblxuLyoqIFRydWUgd2hlbiBhbiBlbnYgdmFyIGhvbGRzIGEgbm9uLWVtcHR5IHZhbHVlIChhbiBlbXB0eSBgS0VZPWAgaW4gLmVudiBpcyB1bnNldCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbnZTZXQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAocHJvY2Vzcy5lbnZbbmFtZV0gPz8gJycpICE9PSAnJztcbn1cblxuY29uc3QgcHJvYmVzID0gbmV3IE1hcDxzdHJpbmcsICgpID0+IGJvb2xlYW4+KFtcbiAgWydTRVJWSUNFX1NJR05JTkdfS0VZJywgaXNSZXRpcmluZ1NlcnZpY2VLZXlQdWJsaXNoZWRdLFxuXSk7XG5cbi8qKlxuICogUmVnaXN0ZXIgKG9yIHJlcGxhY2UpIHRoZSBwcm9iZSBmb3IgYHNlY3JldGAg4oCUIHRoZSBiYXNlIG5hbWUsIGUuZy5cbiAqIGBTRUNSRVRfRU5DUllQVElPTl9LRVlgLCBvciBgVE9LRU5fU0lHTklOR19LRVlgIGZvciBhIGNyZWRlbnRpYWwgd2hvc2Ugb3ZlcmxhcFxuICogaXMgbm90IGFuIGVudiB2YWx1ZSBhdCBhbGwgKHRoZXJlLCB0aGUgcHJvYmUgYXNrcyB0aGUgc2lnbmVyIHdoZXRoZXIgYVxuICogcmV0aXJpbmcga2V5IGlzIHN0aWxsIHB1Ymxpc2hlZCkuIFRoZSBwcm9iZSBpcyBldmFsdWF0ZWQgYXQgZXZlcnkgbWV0cmljc1xuICogc2NyYXBlLCBzbyBpdCBtdXN0IGJlIGNoZWFwIGFuZCBtdXN0IG5vdCB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUHJldmlvdXNTZWNyZXRQcm9iZShzZWNyZXQ6IHN0cmluZywgaXNQcmV2aW91c1NldDogKCkgPT4gYm9vbGVhbik6IHZvaWQge1xuICBwcm9iZXMuc2V0KHNlY3JldCwgaXNQcmV2aW91c1NldCk7XG59XG5cbi8qKiBDdXJyZW50IHN0YXRlIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgcHJvYmU7IGEgdGhyb3dpbmcgcHJvYmUgcmVwb3J0cyBgZmFsc2VgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZpb3VzU2VjcmV0U3RhdGVzKCk6IEFycmF5PHsgc2VjcmV0OiBzdHJpbmc7IHByZXZpb3VzU2V0OiBib29sZWFuIH0+IHtcbiAgcmV0dXJuIFsuLi5wcm9iZXMuZW50cmllcygpXS5tYXAoKFtzZWNyZXQsIHByb2JlXSkgPT4ge1xuICAgIGxldCBwcmV2aW91c1NldCA9IGZhbHNlO1xuICAgIHRyeSB7IHByZXZpb3VzU2V0ID0gcHJvYmUoKSA9PT0gdHJ1ZTsgfSBjYXRjaCB7IC8qIGEgYnJva2VuIHByb2JlIG11c3Qgbm90IGJyZWFrIC9tZXRyaWNzICovIH1cbiAgICByZXR1cm4geyBzZWNyZXQsIHByZXZpb3VzU2V0IH07XG4gIH0pO1xufVxuIl19
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Single source of truth for "what counts as sensitive" across every masking
|
|
5
5
|
* layer.
|
|
6
6
|
*
|
|
7
|
-
* Four layers consume this module (see `docs/
|
|
7
|
+
* Four layers consume this module (see `docs/observability-logs.md`):
|
|
8
8
|
*
|
|
9
9
|
* L1 key-based, write-time — winston `redactFormat` (metadata keys)
|
|
10
10
|
* L2 value-based, write-time — winston `maskFormat` (the message string)
|
|
@@ -20,9 +20,8 @@
|
|
|
20
20
|
*
|
|
21
21
|
* Because L3 runs inside promtail (Go / RE2) and L1/L2/L4 run in Node, each
|
|
22
22
|
* pattern carries BOTH forms and a generator emits the promtail YAML from this
|
|
23
|
-
* list — see `scripts/gen-promtail-masking.mjs`. Keeping
|
|
24
|
-
*
|
|
25
|
-
* third would have made drift certain.
|
|
23
|
+
* list — see `scripts/gen-promtail-masking.mjs`. Keeping ONE list is the point:
|
|
24
|
+
* hand-synced copies drift.
|
|
26
25
|
*/
|
|
27
26
|
import { scrubAwsIdentifiersFromString } from './aws-scrub.js';
|
|
28
27
|
export const REDACTED = '[REDACTED]';
|
|
@@ -146,4 +145,4 @@ export function looksSensitive(input) {
|
|
|
146
145
|
return false;
|
|
147
146
|
return maskLine(input) !== input;
|
|
148
147
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vuc2l0aXZlLXBhdHRlcm5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NlbnNpdGl2ZS1wYXR0ZXJucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUVILE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7QUFFckM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0hBQXdILENBQUM7QUFxQjlKOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFxQztJQUN4RTtRQUNFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixFQUFFLEVBQUUsMkVBQTJFO1FBQy9FLEdBQUcsRUFBRSxJQUFJO1FBQ1QsV0FBVyxFQUFFLFFBQVE7S0FDdEI7SUFDRDtRQUNFLElBQUksRUFBRSx3QkFBd0I7UUFDOUIsRUFBRSxFQUFFLG9DQUFvQztRQUN4QyxHQUFHLEVBQUUsbUNBQW1DO1FBQ3hDLFdBQVcsRUFBRSxRQUFRO0tBQ3RCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsS0FBSztRQUNYLEVBQUUsRUFBRSwwREFBMEQ7UUFDOUQsR0FBRyxFQUFFLDJEQUEyRDtRQUNoRSxXQUFXLEVBQUUsUUFBUTtLQUN0QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLGNBQWM7UUFDcEIsRUFBRSxFQUFFLGlDQUFpQztRQUNyQyxHQUFHLEVBQUUsb0NBQW9DO1FBQ3pDLFdBQVcsRUFBRSxVQUFVLFFBQVEsRUFBRTtLQUNsQztJQUNEO1FBQ0UsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixFQUFFLEVBQUUsc0RBQXNEO1FBQzFELEdBQUcsRUFBRSxxREFBcUQ7UUFDMUQsV0FBVyxFQUFFLFFBQVE7S0FDdEI7SUFDRDtRQUNFLElBQUksRUFBRSxZQUFZO1FBQ2xCLEVBQUUsRUFBRSwrQ0FBK0M7UUFDbkQsR0FBRyxFQUFFLDRDQUE0QztRQUNqRCxXQUFXLEVBQUUsUUFBUTtLQUN0QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLGNBQWM7UUFDcEIsRUFBRSxFQUFFLGlDQUFpQztRQUNyQyxHQUFHLEVBQUUsa0NBQWtDO1FBQ3ZDLFdBQVcsRUFBRSxRQUFRO0tBQ3RCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsYUFBYTtRQUNuQixFQUFFLEVBQUUsbUNBQW1DO1FBQ3ZDLEdBQUcsRUFBRSxvQ0FBb0M7UUFDekMsV0FBVyxFQUFFLFFBQVE7S0FDdEI7SUFDRDtRQUNFLDBFQUEwRTtRQUMxRSxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLEVBQUUsRUFBRSxvREFBb0Q7UUFDeEQsR0FBRyxFQUFFLG1EQUFtRDtRQUN4RCxXQUFXLEVBQUUsS0FBSyxRQUFRLEdBQUc7S0FDOUI7SUFDRDtRQUNFLHdFQUF3RTtRQUN4RSxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLEVBQUUsRUFBRSxzR0FBc0c7UUFDMUcsR0FBRyxFQUFFLHdHQUF3RztRQUM3RyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7S0FDN0I7SUFDRDtRQUNFLGlFQUFpRTtRQUNqRSxrRUFBa0U7UUFDbEUsMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUNqRSxJQUFJLEVBQUUsMEJBQTBCO1FBQ2hDLEVBQUUsRUFBRSw0SEFBNEg7UUFDaEksR0FBRyxFQUFFLGdJQUFnSTtRQUNySSxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7S0FDN0I7Q0FDRixDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFhO0lBQ3BDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLEtBQUssTUFBTSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1FBQzNELDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDakIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhO0lBQzFDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBcIndoYXQgY291bnRzIGFzIHNlbnNpdGl2ZVwiIGFjcm9zcyBldmVyeSBtYXNraW5nXG4gKiBsYXllci5cbiAqXG4gKiBGb3VyIGxheWVycyBjb25zdW1lIHRoaXMgbW9kdWxlIChzZWUgYGRvY3MvcGxhbnMvZnJvbnRlbmQtbG9ncy5tZGAgwqczLjQpOlxuICpcbiAqICAgTDEgIGtleS1iYXNlZCwgd3JpdGUtdGltZSAgIOKAlCB3aW5zdG9uIGByZWRhY3RGb3JtYXRgIChtZXRhZGF0YSBrZXlzKVxuICogICBMMiAgdmFsdWUtYmFzZWQsIHdyaXRlLXRpbWUg4oCUIHdpbnN0b24gYG1hc2tGb3JtYXRgICh0aGUgbWVzc2FnZSBzdHJpbmcpXG4gKiAgIEwzICB2YWx1ZS1iYXNlZCwgaW5nZXN0LXRpbWUg4oCUIHByb210YWlsIGByZXBsYWNlYCBzdGFnZXMgIOKGkCBBVVRIT1JJVEFUSVZFXG4gKiAgIEw0ICB2YWx1ZS1iYXNlZCwgcmVhZC10aW1lICDigJQgcGxhdGZvcm0ncyBMb2tpIGNsaWVudCwgYmVmb3JlIHNlcnZpbmcvZXhwb3J0XG4gKlxuICogKipMMyBpcyB0aGUgZ3VhcmFudGVlLCBub3QgTDQuKiogUmVhZC10aW1lIG1hc2tpbmcgb25seSBtYXNrcyB0aGUgRElTUExBWTogdGhlXG4gKiBzZWNyZXQgaXMgc3RpbGwgaW4gTG9raSBhbmQgc3RpbGwgbWF0Y2hhYmxlLCBzbyBhIHVzZXIgY2FuIHNlYXJjaCBhIGNhbmRpZGF0ZVxuICogdmFsdWUgYW5kIGxlYXJuIGZyb20gdGhlIGhpdCB0aGF0IGl0IGlzIHByZXNlbnQsIGV2ZW4gdGhvdWdoIHRoZSBsaW5lIHJlbmRlcnNcbiAqIGBbUkVEQUNURURdYC4gUmVwZWF0IHRoYXQgYW5kIHNlYXJjaCBiZWNvbWVzIGFuIG9yYWNsZS4gTWFza2luZyB0aGVyZWZvcmUgaGFzXG4gKiB0byBoYXBwZW4gYmVmb3JlIHN0b3JhZ2UgZm9yIGFueXRoaW5nIHRoZSBzZWFyY2ggcGF0aCBjYW4gbWF0Y2g7IEw0IGV4aXN0cyB0b1xuICogY292ZXIgaGlzdG9yeSB3cml0dGVuIGJlZm9yZSBMMyBzaGlwcGVkLCBhbmQgYXMgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBCZWNhdXNlIEwzIHJ1bnMgaW5zaWRlIHByb210YWlsIChHbyAvIFJFMikgYW5kIEwxL0wyL0w0IHJ1biBpbiBOb2RlLCBlYWNoXG4gKiBwYXR0ZXJuIGNhcnJpZXMgQk9USCBmb3JtcyBhbmQgYSBnZW5lcmF0b3IgZW1pdHMgdGhlIHByb210YWlsIFlBTUwgZnJvbSB0aGlzXG4gKiBsaXN0IOKAlCBzZWUgYHNjcmlwdHMvZ2VuLXByb210YWlsLW1hc2tpbmcubWpzYC4gS2VlcGluZyBvbmUgbGlzdCBpcyB0aGUgcG9pbnQ6XG4gKiBgU0VOU0lUSVZFX0tFWV9QQVRURVJOYCBwcmV2aW91c2x5IGV4aXN0ZWQgaW4gdHdvIGhhbmQtc3luY2VkIGNvcGllcywgYW5kIGFcbiAqIHRoaXJkIHdvdWxkIGhhdmUgbWFkZSBkcmlmdCBjZXJ0YWluLlxuICovXG5cbmltcG9ydCB7IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnLi9hd3Mtc2NydWIuanMnO1xuXG5leHBvcnQgY29uc3QgUkVEQUNURUQgPSAnW1JFREFDVEVEXSc7XG5cbi8qKlxuICogS2V5cyB3aG9zZSBWQUxVRSBtdXN0IGJlIG1hc2tlZCB3aG9sZXNhbGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlJ3Mgc2hhcGUuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLCBhbmNob3JlZC1zdWJzdHJpbmcgbWF0Y2guXG4gKlxuICogQWRkIGEgdGVybSBvbmx5IGZvciBsZWFrYWdlIHlvdSd2ZSBhY3R1YWxseSBzZWVuIOKAlCBvdmVyLXJlZGFjdGlvbiBtYWtlc1xuICogaW5jaWRlbnQgZGVidWdnaW5nIGhhcmRlciwgYW5kIHRoZXNlIGxvZ3MgYXJlIG5vdyBhIHByb2R1Y3Qgc3VyZmFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFTlNJVElWRV9LRVlfUEFUVEVSTiA9IC9wYXNzd29yZHxzZWNyZXR8YmVhcmVyfGFwaVtfLV0/a2V5fGNvb2tpZXx0b2tlbnxeYXV0aChvcml6YXRpb258X2hlYWRlcik/JHxzdHJpcGVbXy1dPyhrZXl8c2VjcmV0KXxtb25nbyhkYik/W18tXT91cmkvaTtcblxuLyoqXG4gKiBPbmUgc2VjcmV0LXNoYXBlZCB2YWx1ZSBwYXR0ZXJuLlxuICpcbiAqIGBqc2AgaXMgdXNlZCBieSB0aGUgTm9kZS1zaWRlIGxheWVycy4gYHJlMmAgaXMgdGhlIGVxdWl2YWxlbnQgc291cmNlIGZvclxuICogcHJvbXRhaWwncyBgcmVwbGFjZWAgc3RhZ2Ug4oCUIEdvJ3MgUkUyIGhhcyBubyBsb29rYXJvdW5kLCBzbyBhIHBhdHRlcm4gdGhhdFxuICogbmVlZHMgaXQgaGFzIGByZTI6IG51bGxgIGFuZCBzdGF5cyBOb2RlLW9ubHkgKEwyL0w0IHN0aWxsIGNhdGNoIGl0OyBpdCBqdXN0XG4gKiBpc24ndCBzY3J1YmJlZCBiZWZvcmUgc3RvcmFnZSkuIGAoP2kpYCBpcyBzcGVsbGVkIGlubGluZSBmb3IgUkUyIGJlY2F1c2VcbiAqIHByb210YWlsIHRha2VzIGEgYmFyZSBzb3VyY2Ugc3RyaW5nLCB3aGlsZSB0aGUgSlMgZm9ybSB1c2VzIHRoZSBgaWAgZmxhZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5zaXRpdmVWYWx1ZVBhdHRlcm4ge1xuICAvKiogU3RhYmxlIGlkZW50aWZpZXIsIHVzZWQgYXMgdGhlIHByb210YWlsIHN0YWdlIGNvbW1lbnQuICovXG4gIG5hbWU6IHN0cmluZztcbiAganM6IFJlZ0V4cDtcbiAgLyoqIFJFMiBzb3VyY2UgZm9yIHByb210YWlsLCBvciBudWxsIHdoZW4gdGhlIHBhdHRlcm4gaXMgSlMtb25seS4gKi9cbiAgcmUyOiBzdHJpbmcgfCBudWxsO1xuICAvKiogUmVwbGFjZW1lbnQgdGV4dC4gYCQxYCBrZWVwcyBhIGxlYWRpbmcgY2FwdHVyZSAoZS5nLiB0aGUgYD90b2tlbj1gIHByZWZpeCkuICovXG4gIHJlcGxhY2VtZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3JkZXJlZCDigJQgZWFybGllciBwYXR0ZXJucyB3aW4sIHNvIHRoZSBzcGVjaWZpYyAoYSBTdHJpcGUga2V5KSBpcyBtYXNrZWRcbiAqIGJlZm9yZSB0aGUgZ2VuZXJpYyAoYSBgc2VjcmV0PWAgYXNzaWdubWVudCkgY2FuIHByb2R1Y2UgYSBtZXNzaWVyIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFTlNJVElWRV9WQUxVRV9QQVRURVJOUzogcmVhZG9ubHkgU2Vuc2l0aXZlVmFsdWVQYXR0ZXJuW10gPSBbXG4gIHtcbiAgICAvLyBBIFBFTSBibG9jayBzcGFucyBsaW5lcywgc28gcHJvbXRhaWwgKHdoaWNoIHJlcGxhY2VzIHBlciBsaW5lKSBjYW4ndCBzZWVcbiAgICAvLyB0aGUgd2hvbGUgdGhpbmcg4oCUIEpTLW9ubHkuIFRoZSBCRUdJTiBsaW5lIGFsb25lIGlzIHN0aWxsIGEgc3Ryb25nIHNpZ25hbC5cbiAgICBuYW1lOiAncGVtX3ByaXZhdGVfa2V5JyxcbiAgICBqczogLy0tLS0tQkVHSU5bQS1aIF0qUFJJVkFURSBLRVktLS0tLVtcXHNcXFNdKj8tLS0tLUVORFtBLVogXSpQUklWQVRFIEtFWS0tLS0tL2csXG4gICAgcmUyOiBudWxsLFxuICAgIHJlcGxhY2VtZW50OiBSRURBQ1RFRCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdwZW1fcHJpdmF0ZV9rZXlfaGVhZGVyJyxcbiAgICBqczogLy0tLS0tQkVHSU5bQS1aIF0qUFJJVkFURSBLRVktLS0tLS9nLFxuICAgIHJlMjogJy0tLS0tQkVHSU5bQS1aIF0qUFJJVkFURSBLRVktLS0tLScsXG4gICAgcmVwbGFjZW1lbnQ6IFJFREFDVEVELFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2p3dCcsXG4gICAganM6IC9leUpbQS1aYS16MC05Xy1dezgsfVxcLltBLVphLXowLTlfLV17OCx9XFwuW0EtWmEtejAtOV8tXSovZyxcbiAgICByZTI6ICdleUpbQS1aYS16MC05Xy1dezgsfVxcXFwuW0EtWmEtejAtOV8tXXs4LH1cXFxcLltBLVphLXowLTlfLV0qJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYmVhcmVyX3Rva2VuJyxcbiAgICBqczogL2JlYXJlclxccytbQS1aYS16MC05Ll9+Ky8tXSs9Ki9naSxcbiAgICByZTI6ICcoP2kpYmVhcmVyXFxcXHMrW0EtWmEtejAtOS5ffisvLV0rPSonLFxuICAgIHJlcGxhY2VtZW50OiBgQmVhcmVyICR7UkVEQUNURUR9YCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdhd3NfYWNjZXNzX2tleV9pZCcsXG4gICAganM6IC9cXGIoPzpBM1RbQS1aMC05XXxBS0lBfEFTSUF8QUJJQXxBQ0NBKVtBLVowLTldezE2fVxcYi9nLFxuICAgIHJlMjogJ1xcXFxiKEEzVFtBLVowLTldfEFLSUF8QVNJQXxBQklBfEFDQ0EpW0EtWjAtOV17MTZ9XFxcXGInLFxuICAgIHJlcGxhY2VtZW50OiBSRURBQ1RFRCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdzdHJpcGVfa2V5JyxcbiAgICBqczogL1xcYig/OnNrfHJrKV8oPzpsaXZlfHRlc3QpX1tBLVphLXowLTldezEwLH1cXGIvZyxcbiAgICByZTI6ICdcXFxcYihza3xyaylfKGxpdmV8dGVzdClfW0EtWmEtejAtOV17MTAsfVxcXFxiJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnZ2l0aHViX3Rva2VuJyxcbiAgICBqczogL1xcYmdoW3BvdXNyXV9bQS1aYS16MC05XXsyMCx9XFxiL2csXG4gICAgcmUyOiAnXFxcXGJnaFtwb3Vzcl1fW0EtWmEtejAtOV17MjAsfVxcXFxiJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc2xhY2tfdG9rZW4nLFxuICAgIGpzOiAvXFxieG94W2FicHJzXS1bQS1aYS16MC05LV17MTAsfVxcYi9nLFxuICAgIHJlMjogJ1xcXFxieG94W2FicHJzXS1bQS1aYS16MC05LV17MTAsfVxcXFxiJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICAvLyBgc2NoZW1lOi8vdXNlcjpwYXNzQGhvc3RgIOKAlCBrZWVwIHRoZSBzY2hlbWUgc28gdGhlIGxpbmUgc3RheXMgcmVhZGFibGUuXG4gICAgbmFtZTogJ3VybF9jcmVkZW50aWFscycsXG4gICAganM6IC8oW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6XFwvXFwvKVteOkAvXFxzXSs6W15AL1xcc10rQC9nLFxuICAgIHJlMjogJyhbYS16QS1aXVthLXpBLVowLTkrLi1dKjovLylbXjpAL1xcXFxzXSs6W15AL1xcXFxzXStAJyxcbiAgICByZXBsYWNlbWVudDogYCQxJHtSRURBQ1RFRH1AYCxcbiAgfSxcbiAge1xuICAgIC8vIGA/dG9rZW494oCmYCAvIGAmYXBpX2tleT3igKZgIGluIGEgVVJMLiBLZWVwcyB0aGUgcGFyYW1ldGVyIG5hbWUgdmlzaWJsZS5cbiAgICBuYW1lOiAndXJsX3NlY3JldF9wYXJhbScsXG4gICAganM6IC8oWz8mXSg/OmFjY2Vzc1tfLV0/dG9rZW58YXBpW18tXT9rZXl8YXBpa2V5fGF1dGh8cGFzc3dvcmR8c2VjcmV0fHNpZ3xzaWduYXR1cmV8dG9rZW4pPSlbXiZcXHNcIic8Pl0rL2dpLFxuICAgIHJlMjogJyg/aSkoWz8mXShhY2Nlc3NbXy1dP3Rva2VufGFwaVtfLV0/a2V5fGFwaWtleXxhdXRofHBhc3N3b3JkfHNlY3JldHxzaWd8c2lnbmF0dXJlfHRva2VuKT0pW14mXFxcXHNcIlxcJzw+XSsnLFxuICAgIHJlcGxhY2VtZW50OiBgJDEke1JFREFDVEVEfWAsXG4gIH0sXG4gIHtcbiAgICAvLyBgc2VjcmV0PeKApmAgLyBgXCJwYXNzd29yZFwiOiBcIuKAplwiYCBzdHlsZSBhc3NpZ25tZW50cyBpbiBmcmVlIHRleHQuXG4gICAgLy8gYCZgIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIHZhbHVlIGNsYXNzIHNvIHRoaXMgY2FuJ3QgcnVuIG9uIGFmdGVyXG4gICAgLy8gYHVybF9zZWNyZXRfcGFyYW1gIGFuZCBzd2FsbG93IHRoZSByZXN0IG9mIGEgcXVlcnkgc3RyaW5nIOKAlCB0aGUgVVJMIHJ1bGVcbiAgICAvLyBoYXMgYWxyZWFkeSBtYXNrZWQgdGhvc2UsIGFuZCB0aGlzIG9uZSBtdXN0IG5vdCBlYXQgYCZwYWdlPTJgLlxuICAgIG5hbWU6ICdpbmxpbmVfc2VjcmV0X2Fzc2lnbm1lbnQnLFxuICAgIGpzOiAvKCg/OmF3c18pPyg/OnNlY3JldF9hY2Nlc3Nfa2V5fGNsaWVudF9zZWNyZXR8YXBpW18tXT9rZXl8YXBpa2V5fHBhc3N3b3JkfHBhc3N3ZHxzZWNyZXR8dG9rZW4pXCI/XFxzKls9Ol1cXHMqXCI/KVteXFxzXCInLDt9Jl0rL2dpLFxuICAgIHJlMjogJyg/aSkoKChhd3NfKT8oc2VjcmV0X2FjY2Vzc19rZXl8Y2xpZW50X3NlY3JldHxhcGlbXy1dP2tleXxhcGlrZXl8cGFzc3dvcmR8cGFzc3dkfHNlY3JldHx0b2tlbikpXCI/XFxcXHMqWz06XVxcXFxzKlwiPylbXlxcXFxzXCJcXCcsO30mXSsnLFxuICAgIHJlcGxhY2VtZW50OiBgJDEke1JFREFDVEVEfWAsXG4gIH0sXG5dO1xuXG4vKipcbiAqIE1hc2sgc2VjcmV0LXNoYXBlZCB2YWx1ZXMgaW4gYSBzaW5nbGUgc3RyaW5nLlxuICpcbiAqIEFsc28gc2NydWJzIEFXUyBhY2NvdW50IGlkZW50aWZpZXJzIHZpYSB7QGxpbmsgc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmd9XG4gKiDigJQgYSBoYXJkIHJlcG8gcnVsZSAoYW4gQVdTIGFjY291bnQgaWQgbXVzdCBuZXZlciBiZSBwZXJzaXN0ZWQgb3Igc3VyZmFjZWQpLFxuICogY29tcG9zZWQgaGVyZSByYXRoZXIgdGhhbiBkdXBsaWNhdGVkIHNvIHRoZSB0d28gcnVsZXMgY2FuJ3QgZHJpZnQuXG4gKlxuICogTm9uLXRocm93aW5nIGFuZCBhbGxvY2F0aW9uLWxpZ2h0IG9uIHRoZSBjb21tb24gcGF0aDogc3RyaW5ncyB3aXRoIG5vIG1hdGNoXG4gKiBjb21lIGJhY2sgYnkgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrTGluZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGlucHV0O1xuICBsZXQgb3V0ID0gaW5wdXQ7XG4gIGZvciAoY29uc3QgeyBqcywgcmVwbGFjZW1lbnQgfSBvZiBTRU5TSVRJVkVfVkFMVUVfUEFUVEVSTlMpIHtcbiAgICAvLyBganNgIGNhcnJpZXMgdGhlIC9nIGZsYWcsIHNvIHJlc2V0IGxhc3RJbmRleCDigJQgYSBzaGFyZWQgUmVnRXhwIG9iamVjdCBpc1xuICAgIC8vIHN0YXRlZnVsIGFjcm9zcyBjYWxscyBhbmQgd291bGQgb3RoZXJ3aXNlIHNraXAgbWF0Y2hlcyBpbnRlcm1pdHRlbnRseS5cbiAgICBqcy5sYXN0SW5kZXggPSAwO1xuICAgIG91dCA9IG91dC5yZXBsYWNlKGpzLCByZXBsYWNlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKG91dCk7XG59XG5cbi8qKlxuICogRG9lcyB0aGlzIHN0cmluZyBsb29rIGxpa2UgaXQgQ09OVEFJTlMgYSBzZWNyZXQ/IFVzZWQgdG8gcmVqZWN0IGxvZy1zZWFyY2hcbiAqIHRlcm1zLCBjbG9zaW5nIHRoZSBvdGhlciBlbmQgb2YgdGhlIG9yYWNsZSBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGU6XG4gKiBtYXNraW5nIHRoZSByZXN1bHQgaXMgcG9pbnRsZXNzIGlmIHRoZSBxdWVyeSBpdHNlbGYgY2FuIGNvbmZpcm0gYSBndWVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2tzU2Vuc2l0aXZlKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbWFza0xpbmUoaW5wdXQpICE9PSBpbnB1dDtcbn1cbiJdfQ==
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vuc2l0aXZlLXBhdHRlcm5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NlbnNpdGl2ZS1wYXR0ZXJucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztBQUVyQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx3SEFBd0gsQ0FBQztBQXFCOUo7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXFDO0lBQ3hFO1FBQ0UsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLEVBQUUsRUFBRSwyRUFBMkU7UUFDL0UsR0FBRyxFQUFFLElBQUk7UUFDVCxXQUFXLEVBQUUsUUFBUTtLQUN0QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixFQUFFLEVBQUUsb0NBQW9DO1FBQ3hDLEdBQUcsRUFBRSxtQ0FBbUM7UUFDeEMsV0FBVyxFQUFFLFFBQVE7S0FDdEI7SUFDRDtRQUNFLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLDBEQUEwRDtRQUM5RCxHQUFHLEVBQUUsMkRBQTJEO1FBQ2hFLFdBQVcsRUFBRSxRQUFRO0tBQ3RCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsY0FBYztRQUNwQixFQUFFLEVBQUUsaUNBQWlDO1FBQ3JDLEdBQUcsRUFBRSxvQ0FBb0M7UUFDekMsV0FBVyxFQUFFLFVBQVUsUUFBUSxFQUFFO0tBQ2xDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLEVBQUUsRUFBRSxzREFBc0Q7UUFDMUQsR0FBRyxFQUFFLHFEQUFxRDtRQUMxRCxXQUFXLEVBQUUsUUFBUTtLQUN0QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFlBQVk7UUFDbEIsRUFBRSxFQUFFLCtDQUErQztRQUNuRCxHQUFHLEVBQUUsNENBQTRDO1FBQ2pELFdBQVcsRUFBRSxRQUFRO0tBQ3RCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsY0FBYztRQUNwQixFQUFFLEVBQUUsaUNBQWlDO1FBQ3JDLEdBQUcsRUFBRSxrQ0FBa0M7UUFDdkMsV0FBVyxFQUFFLFFBQVE7S0FDdEI7SUFDRDtRQUNFLElBQUksRUFBRSxhQUFhO1FBQ25CLEVBQUUsRUFBRSxtQ0FBbUM7UUFDdkMsR0FBRyxFQUFFLG9DQUFvQztRQUN6QyxXQUFXLEVBQUUsUUFBUTtLQUN0QjtJQUNEO1FBQ0UsMEVBQTBFO1FBQzFFLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsRUFBRSxFQUFFLG9EQUFvRDtRQUN4RCxHQUFHLEVBQUUsbURBQW1EO1FBQ3hELFdBQVcsRUFBRSxLQUFLLFFBQVEsR0FBRztLQUM5QjtJQUNEO1FBQ0Usd0VBQXdFO1FBQ3hFLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsRUFBRSxFQUFFLHNHQUFzRztRQUMxRyxHQUFHLEVBQUUsd0dBQXdHO1FBQzdHLFdBQVcsRUFBRSxLQUFLLFFBQVEsRUFBRTtLQUM3QjtJQUNEO1FBQ0UsaUVBQWlFO1FBQ2pFLGtFQUFrRTtRQUNsRSwyRUFBMkU7UUFDM0UsaUVBQWlFO1FBQ2pFLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsRUFBRSxFQUFFLDRIQUE0SDtRQUNoSSxHQUFHLEVBQUUsZ0lBQWdJO1FBQ3JJLFdBQVcsRUFBRSxLQUFLLFFBQVEsRUFBRTtLQUM3QjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQWE7SUFDcEMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDaEIsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDM0QsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNqQixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE9BQU8sNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWE7SUFDMUMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwid2hhdCBjb3VudHMgYXMgc2Vuc2l0aXZlXCIgYWNyb3NzIGV2ZXJ5IG1hc2tpbmdcbiAqIGxheWVyLlxuICpcbiAqIEZvdXIgbGF5ZXJzIGNvbnN1bWUgdGhpcyBtb2R1bGUgKHNlZSBgZG9jcy9vYnNlcnZhYmlsaXR5LWxvZ3MubWRgKTpcbiAqXG4gKiAgIEwxICBrZXktYmFzZWQsIHdyaXRlLXRpbWUgICDigJQgd2luc3RvbiBgcmVkYWN0Rm9ybWF0YCAobWV0YWRhdGEga2V5cylcbiAqICAgTDIgIHZhbHVlLWJhc2VkLCB3cml0ZS10aW1lIOKAlCB3aW5zdG9uIGBtYXNrRm9ybWF0YCAodGhlIG1lc3NhZ2Ugc3RyaW5nKVxuICogICBMMyAgdmFsdWUtYmFzZWQsIGluZ2VzdC10aW1lIOKAlCBwcm9tdGFpbCBgcmVwbGFjZWAgc3RhZ2VzICDihpAgQVVUSE9SSVRBVElWRVxuICogICBMNCAgdmFsdWUtYmFzZWQsIHJlYWQtdGltZSAg4oCUIHBsYXRmb3JtJ3MgTG9raSBjbGllbnQsIGJlZm9yZSBzZXJ2aW5nL2V4cG9ydFxuICpcbiAqICoqTDMgaXMgdGhlIGd1YXJhbnRlZSwgbm90IEw0LioqIFJlYWQtdGltZSBtYXNraW5nIG9ubHkgbWFza3MgdGhlIERJU1BMQVk6IHRoZVxuICogc2VjcmV0IGlzIHN0aWxsIGluIExva2kgYW5kIHN0aWxsIG1hdGNoYWJsZSwgc28gYSB1c2VyIGNhbiBzZWFyY2ggYSBjYW5kaWRhdGVcbiAqIHZhbHVlIGFuZCBsZWFybiBmcm9tIHRoZSBoaXQgdGhhdCBpdCBpcyBwcmVzZW50LCBldmVuIHRob3VnaCB0aGUgbGluZSByZW5kZXJzXG4gKiBgW1JFREFDVEVEXWAuIFJlcGVhdCB0aGF0IGFuZCBzZWFyY2ggYmVjb21lcyBhbiBvcmFjbGUuIE1hc2tpbmcgdGhlcmVmb3JlIGhhc1xuICogdG8gaGFwcGVuIGJlZm9yZSBzdG9yYWdlIGZvciBhbnl0aGluZyB0aGUgc2VhcmNoIHBhdGggY2FuIG1hdGNoOyBMNCBleGlzdHMgdG9cbiAqIGNvdmVyIGhpc3Rvcnkgd3JpdHRlbiBiZWZvcmUgTDMgc2hpcHBlZCwgYW5kIGFzIGRlZmVuc2UgaW4gZGVwdGguXG4gKlxuICogQmVjYXVzZSBMMyBydW5zIGluc2lkZSBwcm9tdGFpbCAoR28gLyBSRTIpIGFuZCBMMS9MMi9MNCBydW4gaW4gTm9kZSwgZWFjaFxuICogcGF0dGVybiBjYXJyaWVzIEJPVEggZm9ybXMgYW5kIGEgZ2VuZXJhdG9yIGVtaXRzIHRoZSBwcm9tdGFpbCBZQU1MIGZyb20gdGhpc1xuICogbGlzdCDigJQgc2VlIGBzY3JpcHRzL2dlbi1wcm9tdGFpbC1tYXNraW5nLm1qc2AuIEtlZXBpbmcgT05FIGxpc3QgaXMgdGhlIHBvaW50OlxuICogaGFuZC1zeW5jZWQgY29waWVzIGRyaWZ0LlxuICovXG5cbmltcG9ydCB7IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnLi9hd3Mtc2NydWIuanMnO1xuXG5leHBvcnQgY29uc3QgUkVEQUNURUQgPSAnW1JFREFDVEVEXSc7XG5cbi8qKlxuICogS2V5cyB3aG9zZSBWQUxVRSBtdXN0IGJlIG1hc2tlZCB3aG9sZXNhbGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlJ3Mgc2hhcGUuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLCBhbmNob3JlZC1zdWJzdHJpbmcgbWF0Y2guXG4gKlxuICogQWRkIGEgdGVybSBvbmx5IGZvciBsZWFrYWdlIHlvdSd2ZSBhY3R1YWxseSBzZWVuIOKAlCBvdmVyLXJlZGFjdGlvbiBtYWtlc1xuICogaW5jaWRlbnQgZGVidWdnaW5nIGhhcmRlciwgYW5kIHRoZXNlIGxvZ3MgYXJlIG5vdyBhIHByb2R1Y3Qgc3VyZmFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFTlNJVElWRV9LRVlfUEFUVEVSTiA9IC9wYXNzd29yZHxzZWNyZXR8YmVhcmVyfGFwaVtfLV0/a2V5fGNvb2tpZXx0b2tlbnxeYXV0aChvcml6YXRpb258X2hlYWRlcik/JHxzdHJpcGVbXy1dPyhrZXl8c2VjcmV0KXxtb25nbyhkYik/W18tXT91cmkvaTtcblxuLyoqXG4gKiBPbmUgc2VjcmV0LXNoYXBlZCB2YWx1ZSBwYXR0ZXJuLlxuICpcbiAqIGBqc2AgaXMgdXNlZCBieSB0aGUgTm9kZS1zaWRlIGxheWVycy4gYHJlMmAgaXMgdGhlIGVxdWl2YWxlbnQgc291cmNlIGZvclxuICogcHJvbXRhaWwncyBgcmVwbGFjZWAgc3RhZ2Ug4oCUIEdvJ3MgUkUyIGhhcyBubyBsb29rYXJvdW5kLCBzbyBhIHBhdHRlcm4gdGhhdFxuICogbmVlZHMgaXQgaGFzIGByZTI6IG51bGxgIGFuZCBzdGF5cyBOb2RlLW9ubHkgKEwyL0w0IHN0aWxsIGNhdGNoIGl0OyBpdCBqdXN0XG4gKiBpc24ndCBzY3J1YmJlZCBiZWZvcmUgc3RvcmFnZSkuIGAoP2kpYCBpcyBzcGVsbGVkIGlubGluZSBmb3IgUkUyIGJlY2F1c2VcbiAqIHByb210YWlsIHRha2VzIGEgYmFyZSBzb3VyY2Ugc3RyaW5nLCB3aGlsZSB0aGUgSlMgZm9ybSB1c2VzIHRoZSBgaWAgZmxhZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5zaXRpdmVWYWx1ZVBhdHRlcm4ge1xuICAvKiogU3RhYmxlIGlkZW50aWZpZXIsIHVzZWQgYXMgdGhlIHByb210YWlsIHN0YWdlIGNvbW1lbnQuICovXG4gIG5hbWU6IHN0cmluZztcbiAganM6IFJlZ0V4cDtcbiAgLyoqIFJFMiBzb3VyY2UgZm9yIHByb210YWlsLCBvciBudWxsIHdoZW4gdGhlIHBhdHRlcm4gaXMgSlMtb25seS4gKi9cbiAgcmUyOiBzdHJpbmcgfCBudWxsO1xuICAvKiogUmVwbGFjZW1lbnQgdGV4dC4gYCQxYCBrZWVwcyBhIGxlYWRpbmcgY2FwdHVyZSAoZS5nLiB0aGUgYD90b2tlbj1gIHByZWZpeCkuICovXG4gIHJlcGxhY2VtZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3JkZXJlZCDigJQgZWFybGllciBwYXR0ZXJucyB3aW4sIHNvIHRoZSBzcGVjaWZpYyAoYSBTdHJpcGUga2V5KSBpcyBtYXNrZWRcbiAqIGJlZm9yZSB0aGUgZ2VuZXJpYyAoYSBgc2VjcmV0PWAgYXNzaWdubWVudCkgY2FuIHByb2R1Y2UgYSBtZXNzaWVyIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFTlNJVElWRV9WQUxVRV9QQVRURVJOUzogcmVhZG9ubHkgU2Vuc2l0aXZlVmFsdWVQYXR0ZXJuW10gPSBbXG4gIHtcbiAgICAvLyBBIFBFTSBibG9jayBzcGFucyBsaW5lcywgc28gcHJvbXRhaWwgKHdoaWNoIHJlcGxhY2VzIHBlciBsaW5lKSBjYW4ndCBzZWVcbiAgICAvLyB0aGUgd2hvbGUgdGhpbmcg4oCUIEpTLW9ubHkuIFRoZSBCRUdJTiBsaW5lIGFsb25lIGlzIHN0aWxsIGEgc3Ryb25nIHNpZ25hbC5cbiAgICBuYW1lOiAncGVtX3ByaXZhdGVfa2V5JyxcbiAgICBqczogLy0tLS0tQkVHSU5bQS1aIF0qUFJJVkFURSBLRVktLS0tLVtcXHNcXFNdKj8tLS0tLUVORFtBLVogXSpQUklWQVRFIEtFWS0tLS0tL2csXG4gICAgcmUyOiBudWxsLFxuICAgIHJlcGxhY2VtZW50OiBSRURBQ1RFRCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdwZW1fcHJpdmF0ZV9rZXlfaGVhZGVyJyxcbiAgICBqczogLy0tLS0tQkVHSU5bQS1aIF0qUFJJVkFURSBLRVktLS0tLS9nLFxuICAgIHJlMjogJy0tLS0tQkVHSU5bQS1aIF0qUFJJVkFURSBLRVktLS0tLScsXG4gICAgcmVwbGFjZW1lbnQ6IFJFREFDVEVELFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2p3dCcsXG4gICAganM6IC9leUpbQS1aYS16MC05Xy1dezgsfVxcLltBLVphLXowLTlfLV17OCx9XFwuW0EtWmEtejAtOV8tXSovZyxcbiAgICByZTI6ICdleUpbQS1aYS16MC05Xy1dezgsfVxcXFwuW0EtWmEtejAtOV8tXXs4LH1cXFxcLltBLVphLXowLTlfLV0qJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYmVhcmVyX3Rva2VuJyxcbiAgICBqczogL2JlYXJlclxccytbQS1aYS16MC05Ll9+Ky8tXSs9Ki9naSxcbiAgICByZTI6ICcoP2kpYmVhcmVyXFxcXHMrW0EtWmEtejAtOS5ffisvLV0rPSonLFxuICAgIHJlcGxhY2VtZW50OiBgQmVhcmVyICR7UkVEQUNURUR9YCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdhd3NfYWNjZXNzX2tleV9pZCcsXG4gICAganM6IC9cXGIoPzpBM1RbQS1aMC05XXxBS0lBfEFTSUF8QUJJQXxBQ0NBKVtBLVowLTldezE2fVxcYi9nLFxuICAgIHJlMjogJ1xcXFxiKEEzVFtBLVowLTldfEFLSUF8QVNJQXxBQklBfEFDQ0EpW0EtWjAtOV17MTZ9XFxcXGInLFxuICAgIHJlcGxhY2VtZW50OiBSRURBQ1RFRCxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdzdHJpcGVfa2V5JyxcbiAgICBqczogL1xcYig/OnNrfHJrKV8oPzpsaXZlfHRlc3QpX1tBLVphLXowLTldezEwLH1cXGIvZyxcbiAgICByZTI6ICdcXFxcYihza3xyaylfKGxpdmV8dGVzdClfW0EtWmEtejAtOV17MTAsfVxcXFxiJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnZ2l0aHViX3Rva2VuJyxcbiAgICBqczogL1xcYmdoW3BvdXNyXV9bQS1aYS16MC05XXsyMCx9XFxiL2csXG4gICAgcmUyOiAnXFxcXGJnaFtwb3Vzcl1fW0EtWmEtejAtOV17MjAsfVxcXFxiJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc2xhY2tfdG9rZW4nLFxuICAgIGpzOiAvXFxieG94W2FicHJzXS1bQS1aYS16MC05LV17MTAsfVxcYi9nLFxuICAgIHJlMjogJ1xcXFxieG94W2FicHJzXS1bQS1aYS16MC05LV17MTAsfVxcXFxiJyxcbiAgICByZXBsYWNlbWVudDogUkVEQUNURUQsXG4gIH0sXG4gIHtcbiAgICAvLyBgc2NoZW1lOi8vdXNlcjpwYXNzQGhvc3RgIOKAlCBrZWVwIHRoZSBzY2hlbWUgc28gdGhlIGxpbmUgc3RheXMgcmVhZGFibGUuXG4gICAgbmFtZTogJ3VybF9jcmVkZW50aWFscycsXG4gICAganM6IC8oW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6XFwvXFwvKVteOkAvXFxzXSs6W15AL1xcc10rQC9nLFxuICAgIHJlMjogJyhbYS16QS1aXVthLXpBLVowLTkrLi1dKjovLylbXjpAL1xcXFxzXSs6W15AL1xcXFxzXStAJyxcbiAgICByZXBsYWNlbWVudDogYCQxJHtSRURBQ1RFRH1AYCxcbiAgfSxcbiAge1xuICAgIC8vIGA/dG9rZW494oCmYCAvIGAmYXBpX2tleT3igKZgIGluIGEgVVJMLiBLZWVwcyB0aGUgcGFyYW1ldGVyIG5hbWUgdmlzaWJsZS5cbiAgICBuYW1lOiAndXJsX3NlY3JldF9wYXJhbScsXG4gICAganM6IC8oWz8mXSg/OmFjY2Vzc1tfLV0/dG9rZW58YXBpW18tXT9rZXl8YXBpa2V5fGF1dGh8cGFzc3dvcmR8c2VjcmV0fHNpZ3xzaWduYXR1cmV8dG9rZW4pPSlbXiZcXHNcIic8Pl0rL2dpLFxuICAgIHJlMjogJyg/aSkoWz8mXShhY2Nlc3NbXy1dP3Rva2VufGFwaVtfLV0/a2V5fGFwaWtleXxhdXRofHBhc3N3b3JkfHNlY3JldHxzaWd8c2lnbmF0dXJlfHRva2VuKT0pW14mXFxcXHNcIlxcJzw+XSsnLFxuICAgIHJlcGxhY2VtZW50OiBgJDEke1JFREFDVEVEfWAsXG4gIH0sXG4gIHtcbiAgICAvLyBgc2VjcmV0PeKApmAgLyBgXCJwYXNzd29yZFwiOiBcIuKAplwiYCBzdHlsZSBhc3NpZ25tZW50cyBpbiBmcmVlIHRleHQuXG4gICAgLy8gYCZgIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIHZhbHVlIGNsYXNzIHNvIHRoaXMgY2FuJ3QgcnVuIG9uIGFmdGVyXG4gICAgLy8gYHVybF9zZWNyZXRfcGFyYW1gIGFuZCBzd2FsbG93IHRoZSByZXN0IG9mIGEgcXVlcnkgc3RyaW5nIOKAlCB0aGUgVVJMIHJ1bGVcbiAgICAvLyBoYXMgYWxyZWFkeSBtYXNrZWQgdGhvc2UsIGFuZCB0aGlzIG9uZSBtdXN0IG5vdCBlYXQgYCZwYWdlPTJgLlxuICAgIG5hbWU6ICdpbmxpbmVfc2VjcmV0X2Fzc2lnbm1lbnQnLFxuICAgIGpzOiAvKCg/OmF3c18pPyg/OnNlY3JldF9hY2Nlc3Nfa2V5fGNsaWVudF9zZWNyZXR8YXBpW18tXT9rZXl8YXBpa2V5fHBhc3N3b3JkfHBhc3N3ZHxzZWNyZXR8dG9rZW4pXCI/XFxzKls9Ol1cXHMqXCI/KVteXFxzXCInLDt9Jl0rL2dpLFxuICAgIHJlMjogJyg/aSkoKChhd3NfKT8oc2VjcmV0X2FjY2Vzc19rZXl8Y2xpZW50X3NlY3JldHxhcGlbXy1dP2tleXxhcGlrZXl8cGFzc3dvcmR8cGFzc3dkfHNlY3JldHx0b2tlbikpXCI/XFxcXHMqWz06XVxcXFxzKlwiPylbXlxcXFxzXCJcXCcsO30mXSsnLFxuICAgIHJlcGxhY2VtZW50OiBgJDEke1JFREFDVEVEfWAsXG4gIH0sXG5dO1xuXG4vKipcbiAqIE1hc2sgc2VjcmV0LXNoYXBlZCB2YWx1ZXMgaW4gYSBzaW5nbGUgc3RyaW5nLlxuICpcbiAqIEFsc28gc2NydWJzIEFXUyBhY2NvdW50IGlkZW50aWZpZXJzIHZpYSB7QGxpbmsgc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmd9XG4gKiDigJQgYSBoYXJkIHJlcG8gcnVsZSAoYW4gQVdTIGFjY291bnQgaWQgbXVzdCBuZXZlciBiZSBwZXJzaXN0ZWQgb3Igc3VyZmFjZWQpLFxuICogY29tcG9zZWQgaGVyZSByYXRoZXIgdGhhbiBkdXBsaWNhdGVkIHNvIHRoZSB0d28gcnVsZXMgY2FuJ3QgZHJpZnQuXG4gKlxuICogTm9uLXRocm93aW5nIGFuZCBhbGxvY2F0aW9uLWxpZ2h0IG9uIHRoZSBjb21tb24gcGF0aDogc3RyaW5ncyB3aXRoIG5vIG1hdGNoXG4gKiBjb21lIGJhY2sgYnkgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrTGluZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGlucHV0O1xuICBsZXQgb3V0ID0gaW5wdXQ7XG4gIGZvciAoY29uc3QgeyBqcywgcmVwbGFjZW1lbnQgfSBvZiBTRU5TSVRJVkVfVkFMVUVfUEFUVEVSTlMpIHtcbiAgICAvLyBganNgIGNhcnJpZXMgdGhlIC9nIGZsYWcsIHNvIHJlc2V0IGxhc3RJbmRleCDigJQgYSBzaGFyZWQgUmVnRXhwIG9iamVjdCBpc1xuICAgIC8vIHN0YXRlZnVsIGFjcm9zcyBjYWxscyBhbmQgd291bGQgb3RoZXJ3aXNlIHNraXAgbWF0Y2hlcyBpbnRlcm1pdHRlbnRseS5cbiAgICBqcy5sYXN0SW5kZXggPSAwO1xuICAgIG91dCA9IG91dC5yZXBsYWNlKGpzLCByZXBsYWNlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKG91dCk7XG59XG5cbi8qKlxuICogRG9lcyB0aGlzIHN0cmluZyBsb29rIGxpa2UgaXQgQ09OVEFJTlMgYSBzZWNyZXQ/IFVzZWQgdG8gcmVqZWN0IGxvZy1zZWFyY2hcbiAqIHRlcm1zLCBjbG9zaW5nIHRoZSBvdGhlciBlbmQgb2YgdGhlIG9yYWNsZSBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGU6XG4gKiBtYXNraW5nIHRoZSByZXN1bHQgaXMgcG9pbnRsZXNzIGlmIHRoZSBxdWVyeSBpdHNlbGYgY2FuIGNvbmZpcm0gYSBndWVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2tzU2Vuc2l0aXZlKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbWFza0xpbmUoaW5wdXQpICE9PSBpbnB1dDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every service in the internal fleet — the names services sign their service
|
|
3
|
+
* tokens with (`SERVICE_NAME`) and the default in-cluster hostnames.
|
|
4
|
+
*/
|
|
5
|
+
export declare const INTERNAL_SERVICES: readonly ['ask', 'billing', 'compliance', 'image-registry', 'message', 'pipeline', 'platform', 'plugin', 'quota', 'reporting'];
|
|
6
|
+
export type InternalService = typeof INTERNAL_SERVICES[number];
|
|
7
|
+
/**
|
|
8
|
+
* Where a sibling service listens: `<NAME>_SERVICE_HOST` / `<NAME>_SERVICE_PORT`
|
|
9
|
+
* (e.g. `IMAGE_REGISTRY_SERVICE_HOST`), defaulting to the service name and 3000.
|
|
10
|
+
* The single source every internal client resolves an address from.
|
|
11
|
+
*/
|
|
12
|
+
export declare function serviceEndpoint(service: InternalService): {
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { envInt, envStr } from './env.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every service in the internal fleet — the names services sign their service
|
|
6
|
+
* tokens with (`SERVICE_NAME`) and the default in-cluster hostnames.
|
|
7
|
+
*/
|
|
8
|
+
export const INTERNAL_SERVICES = [
|
|
9
|
+
'ask', 'billing', 'compliance', 'image-registry', 'message',
|
|
10
|
+
'pipeline', 'platform', 'plugin', 'quota', 'reporting',
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Where a sibling service listens: `<NAME>_SERVICE_HOST` / `<NAME>_SERVICE_PORT`
|
|
14
|
+
* (e.g. `IMAGE_REGISTRY_SERVICE_HOST`), defaulting to the service name and 3000.
|
|
15
|
+
* The single source every internal client resolves an address from.
|
|
16
|
+
*/
|
|
17
|
+
export function serviceEndpoint(service) {
|
|
18
|
+
const prefix = service.toUpperCase().replace(/-/g, '_');
|
|
19
|
+
return {
|
|
20
|
+
host: envStr(`${prefix}_SERVICE_HOST`, service),
|
|
21
|
+
port: envInt(`${prefix}_SERVICE_PORT`, 3000, { min: 1 }),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUztJQUMzRCxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsV0FBVztDQUM5QyxDQUFDO0FBSVg7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBd0I7SUFDdEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsT0FBTztRQUNMLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLGVBQWUsRUFBRSxPQUFPLENBQUM7UUFDL0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sZUFBZSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZJbnQsIGVudlN0ciB9IGZyb20gJy4vZW52LmpzJztcblxuLyoqXG4gKiBFdmVyeSBzZXJ2aWNlIGluIHRoZSBpbnRlcm5hbCBmbGVldCDigJQgdGhlIG5hbWVzIHNlcnZpY2VzIHNpZ24gdGhlaXIgc2VydmljZVxuICogdG9rZW5zIHdpdGggKGBTRVJWSUNFX05BTUVgKSBhbmQgdGhlIGRlZmF1bHQgaW4tY2x1c3RlciBob3N0bmFtZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBJTlRFUk5BTF9TRVJWSUNFUyA9IFtcbiAgJ2FzaycsICdiaWxsaW5nJywgJ2NvbXBsaWFuY2UnLCAnaW1hZ2UtcmVnaXN0cnknLCAnbWVzc2FnZScsXG4gICdwaXBlbGluZScsICdwbGF0Zm9ybScsICdwbHVnaW4nLCAncXVvdGEnLCAncmVwb3J0aW5nJyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsU2VydmljZSA9IHR5cGVvZiBJTlRFUk5BTF9TRVJWSUNFU1tudW1iZXJdO1xuXG4vKipcbiAqIFdoZXJlIGEgc2libGluZyBzZXJ2aWNlIGxpc3RlbnM6IGA8TkFNRT5fU0VSVklDRV9IT1NUYCAvIGA8TkFNRT5fU0VSVklDRV9QT1JUYFxuICogKGUuZy4gYElNQUdFX1JFR0lTVFJZX1NFUlZJQ0VfSE9TVGApLCBkZWZhdWx0aW5nIHRvIHRoZSBzZXJ2aWNlIG5hbWUgYW5kIDMwMDAuXG4gKiBUaGUgc2luZ2xlIHNvdXJjZSBldmVyeSBpbnRlcm5hbCBjbGllbnQgcmVzb2x2ZXMgYW4gYWRkcmVzcyBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUVuZHBvaW50KHNlcnZpY2U6IEludGVybmFsU2VydmljZSk6IHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXIgfSB7XG4gIGNvbnN0IHByZWZpeCA9IHNlcnZpY2UudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJyk7XG4gIHJldHVybiB7XG4gICAgaG9zdDogZW52U3RyKGAke3ByZWZpeH1fU0VSVklDRV9IT1NUYCwgc2VydmljZSksXG4gICAgcG9ydDogZW52SW50KGAke3ByZWZpeH1fU0VSVklDRV9QT1JUYCwgMzAwMCwgeyBtaW46IDEgfSksXG4gIH07XG59XG4iXX0=
|
package/lib/utils/ssrf.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* True for
|
|
3
|
-
*
|
|
2
|
+
* True for any address that is NOT publicly routable unicast — the ranges an
|
|
3
|
+
* outbound tenant webhook must never reach.
|
|
4
|
+
*
|
|
5
|
+
* An ALLOWLIST, not a denylist: an IPv6 address is acceptable only inside the
|
|
6
|
+
* global-unicast block `2000::/3` (so link-local `fe80::/10`, site-local
|
|
7
|
+
* `fec0::/10`, unique-local `fc00::/7`, multicast, loopback, unspecified and
|
|
8
|
+
* every future special range are refused by default). Formats that EMBED an
|
|
9
|
+
* IPv4 address are unwrapped and judged by that address — IPv4-mapped
|
|
10
|
+
* `::ffff:0:0/96` (dotted or hex), NAT64 `64:ff9b::/96` and 6to4 `2002::/16` —
|
|
11
|
+
* so `::ffff:7f00:1` or `2002:a9fe:a9fe::` can't smuggle loopback or the
|
|
12
|
+
* metadata endpoint past the check. Anything unparseable is refused.
|
|
4
13
|
*/
|
|
5
14
|
export declare function isPrivateAddress(ip: string): boolean;
|
|
6
15
|
/** Options for {@link assertSafeUrl}. */
|