@pipeline-builder/api-core 3.4.109 → 3.4.111
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/lib/helpers/index.d.ts +1 -0
- package/lib/helpers/index.js +2 -1
- package/lib/helpers/org-hierarchy-http.d.ts +12 -0
- package/lib/helpers/org-hierarchy-http.js +29 -1
- package/lib/helpers/restore-helpers.d.ts +25 -0
- package/lib/helpers/restore-helpers.js +39 -0
- package/lib/helpers/sse-helpers.d.ts +7 -0
- package/lib/helpers/sse-helpers.js +13 -4
- package/lib/middleware/step-up.js +26 -13
- package/lib/services/compliance-client.js +24 -41
- package/lib/services/env-redis.d.ts +28 -4
- package/lib/services/env-redis.js +56 -9
- package/lib/services/index.d.ts +3 -1
- package/lib/services/index.js +4 -2
- package/lib/services/leader-lock.d.ts +11 -0
- package/lib/services/leader-lock.js +23 -1
- package/lib/services/remote-audit-client.d.ts +1 -1
- package/lib/services/remote-audit-client.js +2 -1
- package/lib/services/service-boot.d.ts +20 -0
- package/lib/services/service-boot.js +28 -0
- package/lib/services/sse-ticket-store.d.ts +44 -0
- package/lib/services/sse-ticket-store.js +125 -0
- package/lib/types/error-codes.d.ts +6 -0
- package/lib/types/error-codes.js +14 -1
- package/lib/utils/alias-resolver.d.ts +12 -0
- package/lib/utils/alias-resolver.js +18 -1
- package/lib/utils/compliance-attributes.d.ts +6 -0
- package/lib/utils/compliance-attributes.js +69 -0
- package/lib/utils/env.d.ts +28 -0
- package/lib/utils/env.js +54 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.js +3 -1
- package/lib/utils/secret-encryption.d.ts +0 -29
- package/lib/utils/secret-encryption.js +25 -36
- package/lib/validation/common-schemas.d.ts +6 -1
- package/lib/validation/common-schemas.js +9 -3
- package/lib/validation/message-schemas.d.ts +35 -1
- package/lib/validation/message-schemas.js +49 -2
- package/package.json +1 -1
|
@@ -3,14 +3,39 @@
|
|
|
3
3
|
import { createRequire } from 'module';
|
|
4
4
|
import { createLogger } from '../utils/logger.js';
|
|
5
5
|
const logger = createLogger('env-redis');
|
|
6
|
+
/**
|
|
7
|
+
* Parse `REDIS_SENTINELS` (comma-separated `host:port` list) into the ioredis
|
|
8
|
+
* `{ host, port }[]` sentinel array. Blank/garbage entries are skipped; a
|
|
9
|
+
* missing port defaults to the Sentinel default 26379. Returns an empty array
|
|
10
|
+
* when the env is unset/empty (→ non-sentinel mode).
|
|
11
|
+
*/
|
|
12
|
+
export function parseSentinels(raw) {
|
|
13
|
+
if (!raw)
|
|
14
|
+
return [];
|
|
15
|
+
return raw.split(',').map((s) => s.trim()).filter(Boolean).map((entry) => {
|
|
16
|
+
const [host, port] = entry.split(':');
|
|
17
|
+
return { host, port: parseInt(port ?? '26379', 10) || 26379 };
|
|
18
|
+
}).filter((s) => !!s.host);
|
|
19
|
+
}
|
|
6
20
|
/**
|
|
7
21
|
* Construct an ioredis client from the standard `REDIS_URL` or
|
|
8
|
-
* `REDIS_HOST`/`REDIS_PORT` env —
|
|
9
|
-
*
|
|
22
|
+
* `REDIS_HOST`/`REDIS_PORT` env — OR, for HA, from Redis Sentinel via
|
|
23
|
+
* `REDIS_SENTINELS` + `REDIS_SENTINEL_MASTER`. The shared construction was
|
|
24
|
+
* previously duplicated across the leader-lock, audit-spool, and
|
|
25
|
+
* token-revocation env factories.
|
|
26
|
+
*
|
|
27
|
+
* Connection modes (first that matches wins):
|
|
28
|
+
* 1. SENTINEL — `REDIS_SENTINELS` set (comma-separated `host:port`): ioredis
|
|
29
|
+
* resolves the current master from the sentinels (`name` = `REDIS_SENTINEL_MASTER`,
|
|
30
|
+
* default `mymaster`) and transparently reconnects to the new master after a
|
|
31
|
+
* failover. This is how the app gets HA against a single-node Redis loss —
|
|
32
|
+
* also the shape a managed ElastiCache (cluster-mode-disabled) speaks.
|
|
33
|
+
* 2. URL — `REDIS_URL`.
|
|
34
|
+
* 3. HOST/PORT — `REDIS_HOST`(+`REDIS_PORT`).
|
|
10
35
|
*
|
|
11
36
|
* Semantics every caller relies on (kept identical across the consolidation):
|
|
12
|
-
* - Returns `null` when
|
|
13
|
-
*
|
|
37
|
+
* - Returns `null` when NONE of sentinels/url/host is set, so a caller degrades
|
|
38
|
+
* to its no-Redis fallback (run-on-every-pod / best-effort / fail-open).
|
|
14
39
|
* - FAIL-SAFE: any ioredis load or construction error is swallowed and returns
|
|
15
40
|
* `null` — Redis being unavailable must never crash the importing service.
|
|
16
41
|
* - `ioredis` is a runtime-only optional dep loaded via `createRequire`, so this
|
|
@@ -20,21 +45,43 @@ const logger = createLogger('env-redis');
|
|
|
20
45
|
* - An `error` listener is attached (ioredis auto-reconnects) so a dropped
|
|
21
46
|
* connection can't surface as an unhandled `'error'` event that crashes Node.
|
|
22
47
|
*
|
|
48
|
+
* Optional auth: `REDIS_PASSWORD` (data-node AUTH) and `REDIS_SENTINEL_PASSWORD`
|
|
49
|
+
* (sentinel AUTH, sentinel mode only) are threaded through when set.
|
|
50
|
+
*
|
|
23
51
|
* @param label short human name for this client, used in the two warn logs.
|
|
24
52
|
*/
|
|
25
53
|
export function createEnvRedisClient(label) {
|
|
26
54
|
try {
|
|
55
|
+
const sentinels = parseSentinels(process.env.REDIS_SENTINELS);
|
|
27
56
|
const url = process.env.REDIS_URL;
|
|
28
57
|
const host = process.env.REDIS_HOST;
|
|
29
|
-
if (!url && !host)
|
|
58
|
+
if (sentinels.length === 0 && !url && !host)
|
|
30
59
|
return null;
|
|
31
60
|
const req = createRequire(import.meta.url);
|
|
32
61
|
const mod = req('ioredis');
|
|
33
62
|
const RedisCtor = (mod.Redis ?? mod.default ?? mod);
|
|
34
63
|
const redisOpts = { maxRetriesPerRequest: 1, enableOfflineQueue: false };
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
64
|
+
if (process.env.REDIS_PASSWORD)
|
|
65
|
+
redisOpts.password = process.env.REDIS_PASSWORD;
|
|
66
|
+
let inst;
|
|
67
|
+
if (sentinels.length > 0) {
|
|
68
|
+
// Sentinel mode: ioredis tracks the master via the sentinels + auto-fails-over.
|
|
69
|
+
const sentinelOpts = {
|
|
70
|
+
sentinels,
|
|
71
|
+
name: process.env.REDIS_SENTINEL_MASTER || 'mymaster',
|
|
72
|
+
...redisOpts,
|
|
73
|
+
};
|
|
74
|
+
if (process.env.REDIS_SENTINEL_PASSWORD)
|
|
75
|
+
sentinelOpts.sentinelPassword = process.env.REDIS_SENTINEL_PASSWORD;
|
|
76
|
+
inst = new RedisCtor(sentinelOpts);
|
|
77
|
+
logger.info(`Redis ${label}: Sentinel mode`, { master: sentinelOpts.name, sentinels: sentinels.length });
|
|
78
|
+
}
|
|
79
|
+
else if (url) {
|
|
80
|
+
inst = new RedisCtor(url, redisOpts);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
inst = new RedisCtor({ host, port: parseInt(process.env.REDIS_PORT ?? '6379', 10), ...redisOpts });
|
|
84
|
+
}
|
|
38
85
|
inst
|
|
39
86
|
.on('error', (e) => logger.warn(`Redis ${label} client error`, { error: e instanceof Error ? e.message : String(e) }));
|
|
40
87
|
return inst;
|
|
@@ -44,4 +91,4 @@ export function createEnvRedisClient(label) {
|
|
|
44
91
|
return null;
|
|
45
92
|
}
|
|
46
93
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFjLEtBQWE7SUFDN0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FHeEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBa0MsQ0FBQztRQUNyRixNQUFNLFNBQVMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN6RSxNQUFNLElBQUksR0FBRyxHQUFHO1lBQ2QsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMvRixJQUEyRTthQUN6RSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7XG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignZW52LXJlZGlzJyk7XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIGlvcmVkaXMgY2xpZW50IGZyb20gdGhlIHN0YW5kYXJkIGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfSE9TVGAvYFJFRElTX1BPUlRgIGVudiDigJQgdGhlIHNoYXJlZCBjb25zdHJ1Y3Rpb24gcHJldmlvdXNseSBkdXBsaWNhdGVkXG4gKiBhY3Jvc3MgdGhlIGxlYWRlci1sb2NrLCBhdWRpdC1zcG9vbCwgYW5kIHRva2VuLXJldm9jYXRpb24gZW52IGZhY3Rvcmllcy5cbiAqXG4gKiBTZW1hbnRpY3MgZXZlcnkgY2FsbGVyIHJlbGllcyBvbiAoa2VwdCBpZGVudGljYWwgYWNyb3NzIHRoZSBjb25zb2xpZGF0aW9uKTpcbiAqIC0gUmV0dXJucyBgbnVsbGAgd2hlbiBuZWl0aGVyIGBSRURJU19VUkxgIG5vciBgUkVESVNfSE9TVGAgaXMgc2V0LCBzbyBhIGNhbGxlclxuICogICBkZWdyYWRlcyB0byBpdHMgbm8tUmVkaXMgZmFsbGJhY2sgKHJ1bi1vbi1ldmVyeS1wb2QgLyBiZXN0LWVmZm9ydCAvIGZhaWwtb3BlbikuXG4gKiAtIEZBSUwtU0FGRTogYW55IGlvcmVkaXMgbG9hZCBvciBjb25zdHJ1Y3Rpb24gZXJyb3IgaXMgc3dhbGxvd2VkIGFuZCByZXR1cm5zXG4gKiAgIGBudWxsYCDigJQgUmVkaXMgYmVpbmcgdW5hdmFpbGFibGUgbXVzdCBuZXZlciBjcmFzaCB0aGUgaW1wb3J0aW5nIHNlcnZpY2UuXG4gKiAtIGBpb3JlZGlzYCBpcyBhIHJ1bnRpbWUtb25seSBvcHRpb25hbCBkZXAgbG9hZGVkIHZpYSBgY3JlYXRlUmVxdWlyZWAsIHNvIHRoaXNcbiAqICAgbW9kdWxlIHN0YXlzIGltcG9ydGFibGUgaW4gQ0pTIGJ1bmRsZXMgYW5kIHdoZXJlIFJlZGlzIGlzbid0IGluc3RhbGxlZC5cbiAqIC0gYG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxYCArIGBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlYDogY29tbWFuZHMgZmFpbCBmYXN0XG4gKiAgIHJhdGhlciB0aGFuIHF1ZXVlaW5nIGR1cmluZyBhbiBvdXRhZ2UgKGNhbGxlcnMgYXJlIGZhaWwtb3Blbi9iZXN0LWVmZm9ydCkuXG4gKiAtIEFuIGBlcnJvcmAgbGlzdGVuZXIgaXMgYXR0YWNoZWQgKGlvcmVkaXMgYXV0by1yZWNvbm5lY3RzKSBzbyBhIGRyb3BwZWRcbiAqICAgY29ubmVjdGlvbiBjYW4ndCBzdXJmYWNlIGFzIGFuIHVuaGFuZGxlZCBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBjcmFzaGVzIE5vZGUuXG4gKlxuICogQHBhcmFtIGxhYmVsIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoaXMgY2xpZW50LCB1c2VkIGluIHRoZSB0d28gd2FybiBsb2dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNDbGllbnQ8VCA9IHVua25vd24+KGxhYmVsOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gcHJvY2Vzcy5lbnYuUkVESVNfVVJMO1xuICAgIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5SRURJU19IT1NUO1xuICAgIGlmICghdXJsICYmICFob3N0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXEgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgbW9kID0gcmVxKCdpb3JlZGlzJykgYXMge1xuICAgICAgUmVkaXM/OiBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICAgIGRlZmF1bHQ/OiBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IFJlZGlzQ3RvciA9IChtb2QuUmVkaXMgPz8gbW9kLmRlZmF1bHQgPz8gbW9kKSBhcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gVDtcbiAgICBjb25zdCByZWRpc09wdHMgPSB7IG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxLCBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlIH07XG4gICAgY29uc3QgaW5zdCA9IHVybFxuICAgICAgPyBuZXcgUmVkaXNDdG9yKHVybCwgcmVkaXNPcHRzKVxuICAgICAgOiBuZXcgUmVkaXNDdG9yKHsgaG9zdCwgcG9ydDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUkVESVNfUE9SVCA/PyAnNjM3OScsIDEwKSwgLi4ucmVkaXNPcHRzIH0pO1xuICAgIChpbnN0IGFzIHVua25vd24gYXMgeyBvbjogKGV2dDogc3RyaW5nLCBjYjogKGU6IHVua25vd24pID0+IHZvaWQpID0+IHZvaWQgfSlcbiAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gbG9nZ2VyLndhcm4oYFJlZGlzICR7bGFiZWx9IGNsaWVudCBlcnJvcmAsIHsgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9KSk7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBSZWRpcyB1bmF2YWlsYWJsZSBmb3IgJHtsYWJlbH1gLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBdUI7SUFDcEQsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDdkUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ2hFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFjLEtBQWE7SUFDN0QsSUFBSSxDQUFDO1FBQ0gsTUFB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InNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdlbnYtcmVkaXMnKTtcblxuLyoqXG4gKiBQYXJzZSBgUkVESVNfU0VOVElORUxTYCAoY29tbWEtc2VwYXJhdGVkIGBob3N0OnBvcnRgIGxpc3QpIGludG8gdGhlIGlvcmVkaXNcbiAqIGB7IGhvc3QsIHBvcnQgfVtdYCBzZW50aW5lbCBhcnJheS4gQmxhbmsvZ2FyYmFnZSBlbnRyaWVzIGFyZSBza2lwcGVkOyBhXG4gKiBtaXNzaW5nIHBvcnQgZGVmYXVsdHMgdG8gdGhlIFNlbnRpbmVsIGRlZmF1bHQgMjYzNzkuIFJldHVybnMgYW4gZW1wdHkgYXJyYXlcbiAqIHdoZW4gdGhlIGVudiBpcyB1bnNldC9lbXB0eSAo4oaSIG5vbi1zZW50aW5lbCBtb2RlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VudGluZWxzKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogQXJyYXk8eyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9PiB7XG4gIGlmICghcmF3KSByZXR1cm4gW107XG4gIHJldHVybiByYXcuc3BsaXQoJywnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikubWFwKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IFtob3N0LCBwb3J0XSA9IGVudHJ5LnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydDogcGFyc2VJbnQocG9ydCA/PyAnMjYzNzknLCAxMCkgfHwgMjYzNzkgfTtcbiAgfSkuZmlsdGVyKChzKSA9PiAhIXMuaG9zdCk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIGlvcmVkaXMgY2xpZW50IGZyb20gdGhlIHN0YW5kYXJkIGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfSE9TVGAvYFJFRElTX1BPUlRgIGVudiDigJQgT1IsIGZvciBIQSwgZnJvbSBSZWRpcyBTZW50aW5lbCB2aWFcbiAqIGBSRURJU19TRU5USU5FTFNgICsgYFJFRElTX1NFTlRJTkVMX01BU1RFUmAuIFRoZSBzaGFyZWQgY29uc3RydWN0aW9uIHdhc1xuICogcHJldmlvdXNseSBkdXBsaWNhdGVkIGFjcm9zcyB0aGUgbGVhZGVyLWxvY2ssIGF1ZGl0LXNwb29sLCBhbmRcbiAqIHRva2VuLXJldm9jYXRpb24gZW52IGZhY3Rvcmllcy5cbiAqXG4gKiBDb25uZWN0aW9uIG1vZGVzIChmaXJzdCB0aGF0IG1hdGNoZXMgd2lucyk6XG4gKiAxLiBTRU5USU5FTCDigJQgYFJFRElTX1NFTlRJTkVMU2Agc2V0IChjb21tYS1zZXBhcmF0ZWQgYGhvc3Q6cG9ydGApOiBpb3JlZGlzXG4gKiAgICByZXNvbHZlcyB0aGUgY3VycmVudCBtYXN0ZXIgZnJvbSB0aGUgc2VudGluZWxzIChgbmFtZWAgPSBgUkVESVNfU0VOVElORUxfTUFTVEVSYCxcbiAqICAgIGRlZmF1bHQgYG15bWFzdGVyYCkgYW5kIHRyYW5zcGFyZW50bHkgcmVjb25uZWN0cyB0byB0aGUgbmV3IG1hc3RlciBhZnRlciBhXG4gKiAgICBmYWlsb3Zlci4gVGhpcyBpcyBob3cgdGhlIGFwcCBnZXRzIEhBIGFnYWluc3QgYSBzaW5nbGUtbm9kZSBSZWRpcyBsb3NzIOKAlFxuICogICAgYWxzbyB0aGUgc2hhcGUgYSBtYW5hZ2VkIEVsYXN0aUNhY2hlIChjbHVzdGVyLW1vZGUtZGlzYWJsZWQpIHNwZWFrcy5cbiAqIDIuIFVSTCDigJQgYFJFRElTX1VSTGAuXG4gKiAzLiBIT1NUL1BPUlQg4oCUIGBSRURJU19IT1NUYCgrYFJFRElTX1BPUlRgKS5cbiAqXG4gKiBTZW1hbnRpY3MgZXZlcnkgY2FsbGVyIHJlbGllcyBvbiAoa2VwdCBpZGVudGljYWwgYWNyb3NzIHRoZSBjb25zb2xpZGF0aW9uKTpcbiAqIC0gUmV0dXJucyBgbnVsbGAgd2hlbiBOT05FIG9mIHNlbnRpbmVscy91cmwvaG9zdCBpcyBzZXQsIHNvIGEgY2FsbGVyIGRlZ3JhZGVzXG4gKiAgIHRvIGl0cyBuby1SZWRpcyBmYWxsYmFjayAocnVuLW9uLWV2ZXJ5LXBvZCAvIGJlc3QtZWZmb3J0IC8gZmFpbC1vcGVuKS5cbiAqIC0gRkFJTC1TQUZFOiBhbnkgaW9yZWRpcyBsb2FkIG9yIGNvbnN0cnVjdGlvbiBlcnJvciBpcyBzd2FsbG93ZWQgYW5kIHJldHVybnNcbiAqICAgYG51bGxgIOKAlCBSZWRpcyBiZWluZyB1bmF2YWlsYWJsZSBtdXN0IG5ldmVyIGNyYXNoIHRoZSBpbXBvcnRpbmcgc2VydmljZS5cbiAqIC0gYGlvcmVkaXNgIGlzIGEgcnVudGltZS1vbmx5IG9wdGlvbmFsIGRlcCBsb2FkZWQgdmlhIGBjcmVhdGVSZXF1aXJlYCwgc28gdGhpc1xuICogICBtb2R1bGUgc3RheXMgaW1wb3J0YWJsZSBpbiBDSlMgYnVuZGxlcyBhbmQgd2hlcmUgUmVkaXMgaXNuJ3QgaW5zdGFsbGVkLlxuICogLSBgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDFgICsgYGVuYWJsZU9mZmxpbmVRdWV1ZTogZmFsc2VgOiBjb21tYW5kcyBmYWlsIGZhc3RcbiAqICAgcmF0aGVyIHRoYW4gcXVldWVpbmcgZHVyaW5nIGFuIG91dGFnZSAoY2FsbGVycyBhcmUgZmFpbC1vcGVuL2Jlc3QtZWZmb3J0KS5cbiAqIC0gQW4gYGVycm9yYCBsaXN0ZW5lciBpcyBhdHRhY2hlZCAoaW9yZWRpcyBhdXRvLXJlY29ubmVjdHMpIHNvIGEgZHJvcHBlZFxuICogICBjb25uZWN0aW9uIGNhbid0IHN1cmZhY2UgYXMgYW4gdW5oYW5kbGVkIGAnZXJyb3InYCBldmVudCB0aGF0IGNyYXNoZXMgTm9kZS5cbiAqXG4gKiBPcHRpb25hbCBhdXRoOiBgUkVESVNfUEFTU1dPUkRgIChkYXRhLW5vZGUgQVVUSCkgYW5kIGBSRURJU19TRU5USU5FTF9QQVNTV09SRGBcbiAqIChzZW50aW5lbCBBVVRILCBzZW50aW5lbCBtb2RlIG9ubHkpIGFyZSB0aHJlYWRlZCB0aHJvdWdoIHdoZW4gc2V0LlxuICpcbiAqIEBwYXJhbSBsYWJlbCBzaG9ydCBodW1hbiBuYW1lIGZvciB0aGlzIGNsaWVudCwgdXNlZCBpbiB0aGUgdHdvIHdhcm4gbG9ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzQ2xpZW50PFQgPSB1bmtub3duPihsYWJlbDogc3RyaW5nKTogVCB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHNlbnRpbmVscyA9IHBhcnNlU2VudGluZWxzKHByb2Nlc3MuZW52LlJFRElTX1NFTlRJTkVMUyk7XG4gICAgY29uc3QgdXJsID0gcHJvY2Vzcy5lbnYuUkVESVNfVVJMO1xuICAgIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5SRURJU19IT1NUO1xuICAgIGlmIChzZW50aW5lbHMubGVuZ3RoID09PSAwICYmICF1cmwgJiYgIWhvc3QpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJlcSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBtb2QgPSByZXEoJ2lvcmVkaXMnKSBhcyB7XG4gICAgICBSZWRpcz86IG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgZGVmYXVsdD86IG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgUmVkaXNDdG9yID0gKG1vZC5SZWRpcyA/PyBtb2QuZGVmYXVsdCA/PyBtb2QpIGFzIG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBUO1xuICAgIGNvbnN0IHJlZGlzT3B0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxLCBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlIH07XG4gICAgaWYgKHByb2Nlc3MuZW52LlJFRElTX1BBU1NXT1JEKSByZWRpc09wdHMucGFzc3dvcmQgPSBwcm9jZXNzLmVudi5SRURJU19QQVNTV09SRDtcblxuICAgIGxldCBpbnN0OiBUO1xuICAgIGlmIChzZW50aW5lbHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2VudGluZWwgbW9kZTogaW9yZWRpcyB0cmFja3MgdGhlIG1hc3RlciB2aWEgdGhlIHNlbnRpbmVscyArIGF1dG8tZmFpbHMtb3Zlci5cbiAgICAgIGNvbnN0IHNlbnRpbmVsT3B0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIHNlbnRpbmVscyxcbiAgICAgICAgbmFtZTogcHJvY2Vzcy5lbnYuUkVESVNfU0VOVElORUxfTUFTVEVSIHx8ICdteW1hc3RlcicsXG4gICAgICAgIC4uLnJlZGlzT3B0cyxcbiAgICAgIH07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuUkVESVNfU0VOVElORUxfUEFTU1dPUkQpIHNlbnRpbmVsT3B0cy5zZW50aW5lbFBhc3N3b3JkID0gcHJvY2Vzcy5lbnYuUkVESVNfU0VOVElORUxfUEFTU1dPUkQ7XG4gICAgICBpbnN0ID0gbmV3IFJlZGlzQ3RvcihzZW50aW5lbE9wdHMpO1xuICAgICAgbG9nZ2VyLmluZm8oYFJlZGlzICR7bGFiZWx9OiBTZW50aW5lbCBtb2RlYCwgeyBtYXN0ZXI6IHNlbnRpbmVsT3B0cy5uYW1lLCBzZW50aW5lbHM6IHNlbnRpbmVscy5sZW5ndGggfSk7XG4gICAgfSBlbHNlIGlmICh1cmwpIHtcbiAgICAgIGluc3QgPSBuZXcgUmVkaXNDdG9yKHVybCwgcmVkaXNPcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdCA9IG5ldyBSZWRpc0N0b3IoeyBob3N0LCBwb3J0OiBwYXJzZUludChwcm9jZXNzLmVudi5SRURJU19QT1JUID8/ICc2Mzc5JywgMTApLCAuLi5yZWRpc09wdHMgfSk7XG4gICAgfVxuICAgIChpbnN0IGFzIHVua25vd24gYXMgeyBvbjogKGV2dDogc3RyaW5nLCBjYjogKGU6IHVua25vd24pID0+IHZvaWQpID0+IHZvaWQgfSlcbiAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gbG9nZ2VyLndhcm4oYFJlZGlzICR7bGFiZWx9IGNsaWVudCBlcnJvcmAsIHsgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9KSk7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBSZWRpcyB1bmF2YWlsYWJsZSBmb3IgJHtsYWJlbH1gLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
|
package/lib/services/index.d.ts
CHANGED
|
@@ -5,10 +5,12 @@ export * from './compliance-client.js';
|
|
|
5
5
|
export * from './compliance-event-subscriber.js';
|
|
6
6
|
export * from './entity-events.js';
|
|
7
7
|
export * from './http-client.js';
|
|
8
|
-
export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff,
|
|
8
|
+
export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
|
|
9
9
|
export type { RetryConfig, RetryDecision } from './retry-strategy.js';
|
|
10
10
|
export * from './quota.js';
|
|
11
11
|
export * from './remote-audit-client.js';
|
|
12
12
|
export * from './audit-spool.js';
|
|
13
13
|
export * from './env-redis.js';
|
|
14
14
|
export * from './token-revocation.js';
|
|
15
|
+
export * from './sse-ticket-store.js';
|
|
16
|
+
export * from './service-boot.js';
|
package/lib/services/index.js
CHANGED
|
@@ -7,10 +7,12 @@ export * from './compliance-client.js';
|
|
|
7
7
|
export * from './compliance-event-subscriber.js';
|
|
8
8
|
export * from './entity-events.js';
|
|
9
9
|
export * from './http-client.js';
|
|
10
|
-
export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff,
|
|
10
|
+
export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
|
|
11
11
|
export * from './quota.js';
|
|
12
12
|
export * from './remote-audit-client.js';
|
|
13
13
|
export * from './audit-spool.js';
|
|
14
14
|
export * from './env-redis.js';
|
|
15
15
|
export * from './token-revocation.js';
|
|
16
|
-
|
|
16
|
+
export * from './sse-ticket-store.js';
|
|
17
|
+
export * from './service-boot.js';
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUtc2VydmljZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2xlYWRlci1sb2NrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NoZWR1bGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWV2ZW50LXN1YnNjcmliZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnRpdHktZXZlbnRzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICBjYWxjdWxhdGVCYWNrb2ZmLFxuICBnZXRSZXRyeURlY2lzaW9uLFxuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHR5cGUgeyBSZXRyeUNvbmZpZywgUmV0cnlEZWNpc2lvbiB9IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdW90YS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlbW90ZS1hdWRpdC1jbGllbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2Vudi1yZWRpcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc2UtdGlja2V0LXN0b3JlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZS1ib290LmpzJztcbiJdfQ==
|
|
@@ -9,7 +9,18 @@ export interface LockRedis {
|
|
|
9
9
|
/** Optional Lua eval (ioredis has it). When present, release uses an atomic
|
|
10
10
|
* compare-and-delete so a lapsed holder can't free a successor's lock. */
|
|
11
11
|
eval?(script: string, numKeys: number, ...args: unknown[]): Promise<unknown>;
|
|
12
|
+
/** Graceful close (ioredis `quit`) — called on shutdown so the connection
|
|
13
|
+
* doesn't keep the event loop alive. */
|
|
14
|
+
quit?(): Promise<unknown>;
|
|
15
|
+
/** Immediate close (ioredis `disconnect`) — the fallback if `quit` fails. */
|
|
16
|
+
disconnect?(): void;
|
|
12
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Best-effort close of a leader-lock Redis client on shutdown. Prefers graceful
|
|
20
|
+
* `quit`; falls back to `disconnect`. No-op for a null client / one without
|
|
21
|
+
* either method. Never throws.
|
|
22
|
+
*/
|
|
23
|
+
export declare function closeLeaderLock(redis: LockRedis | null | undefined): Promise<void>;
|
|
13
24
|
/**
|
|
14
25
|
* Run `fn` only if this process wins a short-lived distributed lock — the
|
|
15
26
|
* across-pods "single runner" guard for periodic jobs (digest flushes, etc.).
|
|
@@ -4,6 +4,28 @@ import { randomUUID } from 'crypto';
|
|
|
4
4
|
import { createEnvRedisClient } from './env-redis.js';
|
|
5
5
|
import { createLogger } from '../utils/logger.js';
|
|
6
6
|
const lockLogger = createLogger('leader-lock');
|
|
7
|
+
/**
|
|
8
|
+
* Best-effort close of a leader-lock Redis client on shutdown. Prefers graceful
|
|
9
|
+
* `quit`; falls back to `disconnect`. No-op for a null client / one without
|
|
10
|
+
* either method. Never throws.
|
|
11
|
+
*/
|
|
12
|
+
export async function closeLeaderLock(redis) {
|
|
13
|
+
if (!redis)
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
if (typeof redis.quit === 'function') {
|
|
17
|
+
await redis.quit();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// fall through to disconnect
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
redis.disconnect?.();
|
|
26
|
+
}
|
|
27
|
+
catch { /* best-effort */ }
|
|
28
|
+
}
|
|
7
29
|
/** Atomic "delete only if I still own it" — closes the get-then-del race where
|
|
8
30
|
* the lock expires and is re-acquired between the two calls. */
|
|
9
31
|
const RELEASE_IF_OWNER = 'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end';
|
|
@@ -60,4 +82,4 @@ export function createEnvRedisLock() {
|
|
|
60
82
|
lockLogger.info('Redis leader-lock client initialized');
|
|
61
83
|
return inst;
|
|
62
84
|
}
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZGVyLWxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbGVhZGVyLWxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUFvQi9DOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxLQUFtQztJQUN2RSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU87SUFDbkIsSUFBSSxDQUFDO1FBQ0gsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO0lBQ3ZFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw2QkFBNkI7SUFDL0IsQ0FBQztJQUNELElBQUksQ0FBQztRQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEO2lFQUNpRTtBQUNqRSxNQUFNLGdCQUFnQixHQUNwQixtR0FBbUcsQ0FBQztBQUV0Rzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQWdCLEVBQ2hCLEdBQVcsRUFDWCxLQUFhLEVBQ2IsRUFBdUI7SUFFdkIsTUFBTSxLQUFLLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUNiLENBQUM7WUFBUyxDQUFDO1FBQ1QsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUscURBQXFEO1FBQ3JELElBQUksQ0FBQztZQUNILElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxDQUFDO2lCQUFNLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asb0RBQW9EO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFZLGFBQWEsQ0FBQyxDQUFDO0lBQzVELElBQUksSUFBSTtRQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNsRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvY2tMb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2xlYWRlci1sb2NrJyk7XG5cbi8qKlxuICogTWluaW1hbCBSZWRpcyBjbGllbnQgc3VyZmFjZSBuZWVkZWQgZm9yIGEgbGVhZGVyIGxvY2sgKGEgc3Vic2V0IG9mIGlvcmVkaXMpLlxuICogYHNldGAgaXMgdmFyaWFkaWMgc28gY2FsbGVycyBjYW4gcGFzcyBgJ1BYJywgdHRsLCAnTlgnYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NrUmVkaXMge1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIE9wdGlvbmFsIEx1YSBldmFsIChpb3JlZGlzIGhhcyBpdCkuIFdoZW4gcHJlc2VudCwgcmVsZWFzZSB1c2VzIGFuIGF0b21pY1xuICAgKiAgY29tcGFyZS1hbmQtZGVsZXRlIHNvIGEgbGFwc2VkIGhvbGRlciBjYW4ndCBmcmVlIGEgc3VjY2Vzc29yJ3MgbG9jay4gKi9cbiAgZXZhbD8oc2NyaXB0OiBzdHJpbmcsIG51bUtleXM6IG51bWJlciwgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIEdyYWNlZnVsIGNsb3NlIChpb3JlZGlzIGBxdWl0YCkg4oCUIGNhbGxlZCBvbiBzaHV0ZG93biBzbyB0aGUgY29ubmVjdGlvblxuICAgKiAgZG9lc24ndCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLiAqL1xuICBxdWl0PygpOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogSW1tZWRpYXRlIGNsb3NlIChpb3JlZGlzIGBkaXNjb25uZWN0YCkg4oCUIHRoZSBmYWxsYmFjayBpZiBgcXVpdGAgZmFpbHMuICovXG4gIGRpc2Nvbm5lY3Q/KCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgY2xvc2Ugb2YgYSBsZWFkZXItbG9jayBSZWRpcyBjbGllbnQgb24gc2h1dGRvd24uIFByZWZlcnMgZ3JhY2VmdWxcbiAqIGBxdWl0YDsgZmFsbHMgYmFjayB0byBgZGlzY29ubmVjdGAuIE5vLW9wIGZvciBhIG51bGwgY2xpZW50IC8gb25lIHdpdGhvdXRcbiAqIGVpdGhlciBtZXRob2QuIE5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlTGVhZGVyTG9jayhyZWRpczogTG9ja1JlZGlzIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlZGlzKSByZXR1cm47XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiByZWRpcy5xdWl0ID09PSAnZnVuY3Rpb24nKSB7IGF3YWl0IHJlZGlzLnF1aXQoKTsgcmV0dXJuOyB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byBkaXNjb25uZWN0XG4gIH1cbiAgdHJ5IHsgcmVkaXMuZGlzY29ubmVjdD8uKCk7IH0gY2F0Y2ggeyAvKiBiZXN0LWVmZm9ydCAqLyB9XG59XG5cbi8qKiBBdG9taWMgXCJkZWxldGUgb25seSBpZiBJIHN0aWxsIG93biBpdFwiIOKAlCBjbG9zZXMgdGhlIGdldC10aGVuLWRlbCByYWNlIHdoZXJlXG4gKiAgdGhlIGxvY2sgZXhwaXJlcyBhbmQgaXMgcmUtYWNxdWlyZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiAqL1xuY29uc3QgUkVMRUFTRV9JRl9PV05FUiA9XG4gICdpZiByZWRpcy5jYWxsKFwiZ2V0XCIsIEtFWVNbMV0pID09IEFSR1ZbMV0gdGhlbiByZXR1cm4gcmVkaXMuY2FsbChcImRlbFwiLCBLRVlTWzFdKSBlbHNlIHJldHVybiAwIGVuZCc7XG5cbi8qKlxuICogUnVuIGBmbmAgb25seSBpZiB0aGlzIHByb2Nlc3Mgd2lucyBhIHNob3J0LWxpdmVkIGRpc3RyaWJ1dGVkIGxvY2sg4oCUIHRoZVxuICogYWNyb3NzLXBvZHMgXCJzaW5nbGUgcnVubmVyXCIgZ3VhcmQgZm9yIHBlcmlvZGljIGpvYnMgKGRpZ2VzdCBmbHVzaGVzLCBldGMuKS5cbiAqXG4gKiBVc2VzIGBTRVQga2V5IHRva2VuIE5YIFBYIHR0bGAsIHNvIGV4YWN0bHkgb25lIGhvbGRlciBydW5zIHBlciB3aW5kb3cgYW5kIHRoZVxuICogbG9jayBhdXRvLWV4cGlyZXMgaWYgdGhhdCBob2xkZXIgZGllcyBtaWQtcnVuIChubyBzdHVjayBsb2NrKS4gVGhlIGxvY2sgaXNcbiAqIHJlbGVhc2VkIG9uIGNvbXBsZXRpb24sIGJ1dCBvbmx5IGlmIHdlIHN0aWxsIG93biBpdCDigJQgYSBzbG93ZXIgcHJlZGVjZXNzb3JcbiAqIG5ldmVyIGRlbGV0ZXMgYSBzdWNjZXNzb3IncyBsb2NrLiBgdHRsTXNgIHNob3VsZCBjb21mb3J0YWJseSBleGNlZWQgb25lIHJ1bi5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHdlIGhlbGQgdGhlIGxvY2sgYW5kIHJhbiBgZm5gOyBmYWxzZSBpZiBhbm90aGVyIGhvbGRlciBkaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoTGVhZGVyTG9jayhcbiAgcmVkaXM6IExvY2tSZWRpcyxcbiAga2V5OiBzdHJpbmcsXG4gIHR0bE1zOiBudW1iZXIsXG4gIGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHRva2VuID0gcmFuZG9tVVVJRCgpO1xuICBjb25zdCBhY3F1aXJlZCA9IGF3YWl0IHJlZGlzLnNldChrZXksIHRva2VuLCAnUFgnLCB0dGxNcywgJ05YJyk7XG4gIGlmIChhY3F1aXJlZCAhPT0gJ09LJykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIG9ubHkgaWYgdGhlIGxvY2sgaXMgc3RpbGwgb3VycyDigJQgaWYgb3VyIHJ1biBvdmVycmFuIHRoZSBUVEwgYW5kXG4gICAgLy8gYW5vdGhlciBob2xkZXIgdG9vayBvdmVyLCByZWxlYXNpbmcgaGVyZSB3b3VsZCBmcmVlIHRoZWlyIGxvY2sgZWFybHkuXG4gICAgLy8gUHJlZmVyIGFuIGF0b21pYyBDQVMgKEx1YSk7IGZhbGwgYmFjayB0byBnZXQtdGhlbi1kZWwgZm9yIGNsaWVudHMgd2l0aG91dFxuICAgIC8vIGV2YWwgKHRoZSBzbWFsbCBub24tYXRvbWljIHdpbmRvdyBpcyBUVEwtYm91bmRlZCkuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgcmVkaXMuZXZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhd2FpdCByZWRpcy5ldmFsKFJFTEVBU0VfSUZfT1dORVIsIDEsIGtleSwgdG9rZW4pO1xuICAgICAgfSBlbHNlIGlmICgoYXdhaXQgcmVkaXMuZ2V0KGtleSkpID09PSB0b2tlbikge1xuICAgICAgICBhd2FpdCByZWRpcy5kZWwoa2V5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgVFRMIGV4cGlyZXMgdGhlIGxvY2sgcmVnYXJkbGVzcy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBgTG9ja1JlZGlzYCBiYWNrZWQgYnkgYW4gZW52LWNvbmZpZ3VyZWQgaW9yZWRpcyBjbGllbnQgKGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfSE9TVGApIOKAlCB0aGUgbGVhZGVyLWxvY2sgY291bnRlcnBhcnQgdG8gYGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbGAgL1xuICogYGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmVgLCBmb3IgYSBzZXJ2aWNlIHRoYXQgaGFzIG5vIEJ1bGxNUSBjbGllbnQgdG9cbiAqIGJvcnJvdy4gUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkLCBzbyBhIGNhbGxlciBjYW4gZGVncmFkZSB0b1xuICogcnVubmluZyBvbiBldmVyeSBwb2QgKHRoZSBhdG9taWMgZ3VhcmRzIGl0IHdyYXBzIG11c3Qgc3RpbGwgbWFrZSB0aGF0IHNhZmUpLlxuICogVGhlIGNsaWVudCBpcyBhIHJlYWwgaW9yZWRpcyBpbnN0YW5jZTsgaW9yZWRpcyBleHBvc2VzIGBzZXRgL2BnZXRgL2BkZWxgL2BldmFsYCxcbiAqIHNhdGlzZnlpbmcgYExvY2tSZWRpc2AgaW5jbHVkaW5nIHRoZSBhdG9taWMgQ0FTIHJlbGVhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0xvY2soKTogTG9ja1JlZGlzIHwgbnVsbCB7XG4gIGNvbnN0IGluc3QgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxMb2NrUmVkaXM+KCdsZWFkZXItbG9jaycpO1xuICBpZiAoaW5zdCkgbG9ja0xvZ2dlci5pbmZvKCdSZWRpcyBsZWFkZXItbG9jayBjbGllbnQgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGluc3Q7XG59XG4iXX0=
|
|
@@ -10,7 +10,7 @@ import { type AuditSpool } from './audit-spool.js';
|
|
|
10
10
|
* (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
|
|
11
11
|
* this list free of any platform-only action.
|
|
12
12
|
*/
|
|
13
|
-
export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.delete', 'plugin.restore', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.cancel', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'message.announcement.create', 'message.delete', 'message.restore', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'authz.denied'];
|
|
13
|
+
export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.delete', 'plugin.restore', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.cancel', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'message.announcement.create', 'message.delete', 'message.restore', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'authz.denied'];
|
|
14
14
|
export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
|
|
15
15
|
/** Whether `value` is an action a remote service may emit (the ingest allow-list). */
|
|
16
16
|
export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;
|
|
@@ -40,6 +40,7 @@ export const REMOTE_AUDIT_ACTIONS = [
|
|
|
40
40
|
// source upload, and deploy-to-cluster. `targetId` is the plugin id.
|
|
41
41
|
'plugin.delete',
|
|
42
42
|
'plugin.restore',
|
|
43
|
+
'plugin.update',
|
|
43
44
|
'plugin.upload',
|
|
44
45
|
'plugin.deploy',
|
|
45
46
|
// Plugin bulk mutations (api/plugin bulk-plugin route) + DLQ purge (drops all
|
|
@@ -363,4 +364,4 @@ export function createRemoteAuditAccessor(serviceName) {
|
|
|
363
364
|
emit: (event) => svc().emit(event),
|
|
364
365
|
};
|
|
365
366
|
}
|
|
366
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGVBQWU7SUFDZiw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLGdFQUFnRTtJQUNoRSxxRUFBcUU7SUFDckUsb0RBQW9EO0lBQ3BELGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsaUJBQWlCO0lB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O1FBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi5yZXN0b3JlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBQaXBlbGluZSBtdXRhdGlvbnMg4oCUIGVtaXR0ZWQgYnkgYXBpL3BpcGVsaW5lJ3Mgcm91dGUgaGFuZGxlcnNcbiAgLy8gKGNyZWF0ZS91cGRhdGUvZGVsZXRlICsgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiB0cmlnZ2VyL2NhbmNlbCkgYW5kXG4gIC8vIHBvc3RlZCB0byBwbGF0Zm9ybSdzIGBQT1NUIC9hdWRpdC9ldmVudHNgIGluZ2VzdC5cbiAgJ3BpcGVsaW5lLmNyZWF0ZScsXG4gICdwaXBlbGluZS51cGRhdGUnLFxuICAncGlwZWxpbmUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lLnJlc3RvcmUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuY3JlYXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLnVwZGF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS5kZWxldGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUucmVzdG9yZScsXG4gICdwaXBlbGluZS5leGVjdXRpb24uc3RhcnQnLFxuICAncGlwZWxpbmUuZXhlY3V0aW9uLmNhbmNlbCcsXG4gIC8vIENvZGVQaXBlbGluZSBBUk4tcmVnaXN0cnkgY29uZmlnIChhcGkvcGlwZWxpbmUgcmVnaXN0cnkgcm91dGUpIOKAlCByZWdpc3RlcmluZyAvXG4gIC8vIGRlcmVnaXN0ZXJpbmcgdGhlIGV4dGVybmFsIENvZGVQaXBlbGluZSB0aGF0IGJhY2tzIGEgcGlwZWxpbmUgKGRlcGxveS1hZmZlY3RpbmcpLlxuICAncGlwZWxpbmUucmVnaXN0cnkucmVnaXN0ZXInLFxuICAncGlwZWxpbmUucmVnaXN0cnkuZGVyZWdpc3RlcicsXG4gIC8vIFF1b3RhIGFkbWluaXN0cmF0aW9uIChhcGkvcXVvdGEpIOKAlCBhIHN1cGVyYWRtaW4gcmVzZXR0aW5nIGFuIG9yZydzIHVzYWdlXG4gIC8vIGNvdW50ZXIgb3IgZWRpdGluZyBpdHMgdGllciBsaW1pdHMuIGBhZmZlY3RlZE9yZ0lkYCBpcyB0aGUgb3JnIGNoYW5nZWQ7XG4gIC8vIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSBxdW90YVR5cGUgKyBvbGQvbmV3IHZhbHVlLlxuICAncXVvdGEucmVzZXQnLFxuICAncXVvdGEubGltaXQudXBkYXRlJyxcbiAgLy8gQSBzdXBlcmFkbWluIGRlbGV0aW5nIGFuIG9yZydzIGVudGlyZSBxdW90YSBkb2N1bWVudC5cbiAgJ3F1b3RhLmRlbGV0ZScsXG4gIC8vIENvbXBsaWFuY2UgYWRtaW5pc3RyYXRpb24gKGFwaS9jb21wbGlhbmNlKSDigJQgdGhlIGVuZm9yY2VtZW50LXBvc3R1cmUgc3VyZmFjZS5cbiAgLy8gQXBwcm92aW5nL3Jldm9raW5nIGFuIGV4ZW1wdGlvbiwgdG9nZ2xpbmcvYXV0aG9yaW5nL2RlbGV0aW5nIGEgcnVsZSxcbiAgLy8gYXV0aG9yaW5nL2RlbGV0aW5nIGEgcG9saWN5LCBtYW5hZ2luZyBzY2FuIHNjaGVkdWxlcywgYXBwbHlpbmcgYSB0ZW1wbGF0ZSxcbiAgLy8gb3IgY2FuY2VsbGluZyBhIHJ1bm5pbmcgc2Nhbi4gYHRhcmdldElkYCBpcyB0aGUgcnVsZS9wb2xpY3kvZXhlbXB0aW9uL3NjYW4gaWQuXG4gICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5hcHByb3ZlJyxcbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLnJldm9rZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudG9nZ2xlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5yZXN0b3JlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS51cGRhdGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnJlc3RvcmUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS50ZW1wbGF0ZS5hcHBseScsXG4gICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gQ3Jvc3MtcmVwbyB0YWcvaW1hZ2UgY29weSAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2FwaS9pbWFnZXMvY29weSkuIEFcbiAgLy8gY3Jvc3MtdGVuYW50IGNvcHkgbW92ZXMgZGF0YSBhY3Jvc3MgY3VzdG9tZXIgYm91bmRhcmllcywgc28gaXQgbmVlZHMgdGhlXG4gIC8vIGR1cmFibGUsIHRhbXBlci1ldmlkZW50IHRyYWlsIOKAlCBub3QganVzdCB0aGUgTG9raSBvcGVyYXRvciBsaW5lLlxuICAncmVnaXN0cnkuaW1hZ2UuY29weScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAnbWVzc2FnZS5yZXN0b3JlJyxcbiAgLy8gQmlsbGluZyAoYXBpL2JpbGxpbmcpIOKAlCBzdWJzY3JpcHRpb24gKyBlbnRpdGxlbWVudCBtdXRhdGlvbnMsIG1pcnJvcmVkIHRvIHRoZVxuICAvLyBjZW50cmFsIGF1ZGl0IHRyYWlsICh0aGVzZSBhbHNvIHdyaXRlIHRvIHRoZSBzZXJ2aWNlLWxvY2FsIGJpbGxpbmdfZXZlbnRzXG4gIC8vIGNvbGxlY3Rpb24pLiBgZGV0YWlsc2AgY2FycnkgcGxhbi90aWVyL2FkZG9uIGlkcyBvbmx5IOKAlCBuZXZlciBjYXJkL3BheW1lbnRcbiAgLy8gc2VjcmV0cyBvciBhbiBBV1MgYWNjb3VudCBpZC5cbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmNhbmNlbCcsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5kZWxldGUnLFxuICAnYmlsbGluZy50aWVyLm92ZXJyaWRlJyxcbiAgJ2JpbGxpbmcuYWRkb24uYWRkJyxcbiAgJ2JpbGxpbmcuYWRkb24ucmVtb3ZlJyxcbiAgLy8gU3lzdGVtLWluaXRpYXRlZCByZW1vdmFsIG9mIGEgdGllci1pbmNsdWRlZCBhZGQtb24gb24gYSBwbGFuIHVwZ3JhZGUgKHRoZVxuICAvLyBhY2NvdW50J3MgbmV3IHRpZXIgbm93IGJ1bmRsZXMgdGhlIGZlYXR1cmUpIOKAlCBkaXN0aW5jdCBmcm9tIGEgdXNlci1pbml0aWF0ZWRcbiAgLy8gYHJlbW92ZWAgc28gZmluYW5jZSBjYW4gdGVsbCBhbiBhdXRvLXBydW5lIGZyb20gYSBjdXN0b21lciBhY3Rpb24uXG4gICdiaWxsaW5nLmFkZG9uLnBydW5lJyxcbiAgLy8gRGlzY291bnRzIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kKSDigJQgbWludC9pc3N1ZS9hcHBseS9yZW1vdmUvcmV2b2tlIG9mIGFcbiAgLy8gcHJpY2UgY291cG9uIG9yIHVzYWdlIGNyZWRpdC4gYGRldGFpbHNgIGNhcnJ5IHRoZSBkaXNjb3VudCBpZCArIGtpbmQvdmFsdWVcbiAgLy8gb25seSwgbmV2ZXIgdGhlIG9wYXF1ZSB0b2tlbiBvciBzaWduaW5nIGtleS5cbiAgJ2JpbGxpbmcuZGlzY291bnQuZ2VuZXJhdGUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5pc3N1ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50LmFwcGx5JyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmVtb3ZlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmV2b2tlJyxcbiAgLy8gUHJvbW90aW9ucyAoZG9jcy9iaWxsaW5nLWRpc2NvdW50cy5tZCNwcm9tb3Rpb25zKSDigJQgcnVsZS1kcml2ZW4gYXV0by1ncmFudFxuICAvLyBjYW1wYWlnbnMuIGBkZXRhaWxzYCBjYXJyeSB0aGUgcHJvbW90aW9uIGlkICsgY2VudHMvZXZlbnQgb25seS5cbiAgJ2JpbGxpbmcucHJvbW90aW9uLmNyZWF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi51cGRhdGUnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24ucmV2b2tlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmdyYW50JyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmFjdGl2YXRlJyxcbiAgLy8gVXNhZ2UtY3JlZGl0IHJlYWxpemF0aW9uIOKAlCBhIGN1c3RvbWVyL2NvbXBsaWFuY2UtdmlzaWJsZSByZWNvcmQgb2YgY3JlZGl0XG4gIC8vIG1vdmVtZW50OiBgY29uc3VtZWRgIChNYXJrZXRwbGFjZSBtZXRlcmVkIGRyYXdkb3duKSwgYGV4aGF1c3RlZGAgKGJhbGFuY2UgaGl0XG4gIC8vIHplcm8pLCBhbmQgYSBjb21ibyBlbmRpbmcuIGBkZXRhaWxzYCBjYXJyeSBjZW50cy9pZHMgb25seSwgbm8gcGF5bWVudCBzZWNyZXRzLlxuICAnYmlsbGluZy5jcmVkaXQuY29uc3VtZWQnLFxuICAnYmlsbGluZy5jcmVkaXQuZXhoYXVzdGVkJyxcbiAgJ2JpbGxpbmcuY29tYm8uZXhwaXJlZCcsXG4gIC8vIERlbmllZCBhdXRob3JpemF0aW9uIGF0dGVtcHQg4oCUIGVtaXR0ZWQgYmVzdC1lZmZvcnQgYnkgdGhlIHNoYXJlZFxuICAvLyBgcmVxdWlyZVBlcm1pc3Npb25gIC8gYHJlcXVpcmVTeXN0ZW1BZG1pbmAgZ2F0ZSB3aGVuIGEgc3RhdGUtY2hhbmdpbmdcbiAgLy8gKG5vbi1HRVQpIHJlcXVlc3QgaXMgcmVqZWN0ZWQsIHNvIHByb2JpbmcvZXNjYWxhdGlvbiBhdHRlbXB0cyBhcmUgdmlzaWJsZVxuICAvLyByYXRoZXIgdGhhbiBpbnZpc2libGUuIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uICsgcGF0aDtcbiAgLy8gYG91dGNvbWVgIGlzICdmYWlsdXJlJy5cbiAgJ2F1dGh6LmRlbmllZCcsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9IHR5cGVvZiBSRU1PVEVfQVVESVRfQUNUSU9OU1tudW1iZXJdO1xuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIGFjdGlvbiBhIHJlbW90ZSBzZXJ2aWNlIG1heSBlbWl0ICh0aGUgaW5nZXN0IGFsbG93LWxpc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlQXVkaXRBY3Rpb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFJlbW90ZUF1ZGl0QWN0aW9uIHtcbiAgcmV0dXJuIChSRU1PVEVfQVVESVRfQUNUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9IT1NUID8/ICdwbGF0Zm9ybScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDMwMDAsXG4gIH07XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sO1xuICBjb25zdCBkcmFpbkJhdGNoU2l6ZSA9IGNvbmZpZy5kcmFpbkJhdGNoU2l6ZSA/PyAxMDA7XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgT05FIGxpdmUgZGVsaXZlcnkuIFJlc29sdmVzIGB0cnVlYCBvbiBhIDJ4eCBhY2NlcHQsIGBmYWxzZWAgb24gYW55XG4gICAqIG5vbi0yeHggLyB0aHJvd24gZXJyb3IgKHRoZSBodHRwLWNsaWVudCBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSByZXRyeVxuICAgKiBidWRnZXQpLiBBIHN0YWJsZSBwZXItZW1pc3Npb24gYElkZW1wb3RlbmN5LUtleWAgbWFrZXMgdGhpcyBub24taWRlbXBvdGVudFxuICAgKiBQT1NUIHJldHJ5LXNhZmUgYW5kIGxldHMgdGhlIHBsYXRmb3JtIGluZ2VzdCBkZWR1cCBhIHJlLWRlbGl2ZXJlZCBldmVudFxuICAgKiBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBkdXBsaWNhdGUgYXVkaXQgcm93IChhbmQgZHVwbGljYXRlIGNoYWluIGxpbmspLlxuICAgKiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBkZXJpdmVkIGZyb20gdGhlIGV2ZW50IHNvIGEgU1BPT0xFRCByZS1kZWxpdmVyeSByZXVzZXNcbiAgICogdGhlIHNhbWUga2V5IGFzIGl0cyBvcmlnaW5hbCBsaXZlIGF0dGVtcHQg4oCUIHRoZSB0d28gY29sbGFwc2UgdG8gb25lIHJvdy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXIoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ0F1dGhvcml6YXRpb24nOiBhdXRoSGVhZGVyLFxuICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBzcG9vbCBkcmFpbnMgc28gYSBwZXJpb2RpYyB0aWNrIGFuZCBhbiBvbi1zdWNjZXNzIGRyYWluIGNhbid0IGJvdGhcbiAgLy8gcHVsbCB0aGUgc2FtZSBiYXRjaC4gU3RvcHMgZWFybHkgdGhlIG1vbWVudCBhIHJlLWRlbGl2ZXJ5IGZhaWxzIChwbGF0Zm9ybVxuICAvLyBzdGlsbCBkb3duKSBzbyB3ZSBkb24ndCBoYW1tZXIgaXQgb3IgY2h1cm4gdGhlIGJ1ZmZlci5cbiAgbGV0IGRyYWluaW5nID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIGRyYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc3Bvb2wgfHwgZHJhaW5pbmcpIHJldHVybjtcbiAgICBkcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBhd2FpdCBzcG9vbC50YWtlKGRyYWluQmF0Y2hTaXplKTtcbiAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWxpdmVyZWQ6IEF1ZGl0U3Bvb2xFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IGZhaWxlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgbGV0IHBsYXRmb3JtRG93biA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhdGNoKSB7XG4gICAgICAgICAgaWYgKHBsYXRmb3JtRG93bikgeyBmYWlsZWQucHVzaChlbnRyeSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCBkZWxpdmVyKGVudHJ5LmV2ZW50LCBlbnRyeS5zZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICBkZWxpdmVyZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfcmVkZWxpdmVyZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbGF0Zm9ybURvd24gPSB0cnVlO1xuICAgICAgICAgICAgZmFpbGVkLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBY2tub3dsZWRnZSB0aGUgZGVsaXZlcmVkIHByZWZpeCBzbyBpdCBjbGVhcnMgdGhlIGluLXByb2dyZXNzIGxpc3Q7IHRoZVxuICAgICAgICAvLyByZWxpYWJsZSB0YWtlKCkgbW92ZWQgdGhlIHdob2xlIGJhdGNoIHRoZXJlLCBzbyB1bmFja2VkIHN1cnZpdm9ycyBhcmVcbiAgICAgICAgLy8gcmVjbGFpbWVkIGJ5IHJlY292ZXIoKSBhZnRlciBhIGNyYXNoIHJhdGhlciB0aGFuIGJlaW5nIHNpbGVudGx5IGxvc3QuXG4gICAgICAgIGlmIChkZWxpdmVyZWQubGVuZ3RoID4gMCkgYXdhaXQgc3Bvb2wuYWNrKGRlbGl2ZXJlZCk7XG4gICAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHNwb29sLnJlcXVldWUoZmFpbGVkKTtcbiAgICAgICAgICByZXR1cm47IC8vIHN0aWxsIGRvd24g4oCUIHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCB0aWNrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBkcmFpbiBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IGRyYWluVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHNwb29sKSB7XG4gICAgLy8gUmVjbGFpbSBhbnkgYmF0Y2ggc3RyYW5kZWQgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgYnkgYSBwcmlvciBjcmFzaCwgdGhlblxuICAgIC8vIGF0dGVtcHQgdG8gZmx1c2ggaXQuIEJvdGggYXJlIGJlc3QtZWZmb3J0ICh0aGUgc3Bvb2wgc3dhbGxvd3MgaXRzIGVycm9ycykuXG4gICAgdm9pZCBzcG9vbC5yZWNvdmVyKCkudGhlbigoKSA9PiBkcmFpbigpKTtcbiAgICBkcmFpblRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB2b2lkIGRyYWluKCk7IH0sIGNvbmZpZy5kcmFpbkludGVydmFsTXMgPz8gMzBfMDAwKTtcbiAgICAvLyBEb24ndCBsZXQgdGhlIGRyYWluIHRpbWVyIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgb24gc2h1dGRvd24uXG4gICAgKGRyYWluVGltZXIgYXMgdW5rbm93biBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlY29yZChldmVudCwgc2VydmljZU5hbWUpIHtcbiAgICAgIC8vIFN0YW1wIHdoZW4gdGhlIGFjdGlvbiBhY3R1YWxseSBvY2N1cnJlZCAoc3Vydml2ZXMgc3Bvb2wgZGVsYXkpIGFuZCBwaW4gYVxuICAgICAgLy8gc3RhYmxlIGlkZW1wb3RlbmN5IGtleSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIHNwb29sZWQgcmV0cnkgZGVkdXAuXG4gICAgICBjb25zdCBzdGFtcGVkOiBSZW1vdGVBdWRpdEV2ZW50ID0ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgb2NjdXJyZWRBdDogZXZlbnQub2NjdXJyZWRBdCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGlkZW1wb3RlbmN5S2V5OiBldmVudC5pZGVtcG90ZW5jeUtleSA/PyByYW5kb21VVUlEKCksXG4gICAgICB9O1xuICAgICAgdm9pZCBkZWxpdmVyKHN0YW1wZWQsIHNlcnZpY2VOYW1lKS50aGVuKChvaykgPT4ge1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZW1pdHRlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUsIG91dGNvbWU6IHN0YW1wZWQub3V0Y29tZSA/PyAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgaWYgKHNwb29sKSB2b2lkIGRyYWluKCk7IC8vIHBsYXRmb3JtIGlzIHJlYWNoYWJsZSDigJQgZmx1c2ggYW55IGJhY2tsb2dcbiAgICAgICAgfSBlbHNlIGlmIChzcG9vbCkge1xuICAgICAgICAgIHZvaWQgc3Bvb2wuZW5xdWV1ZSh7IGV2ZW50OiBzdGFtcGVkLCBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZHJvcHBlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoZHJhaW5UaW1lcikgeyBjbGVhckludGVydmFsKGRyYWluVGltZXIpOyBkcmFpblRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgc3RhbmRhcmQgYGF1dGh6LmRlbmllZGAgc2luayB1c2VkIGJ5IGV2ZXJ5IHJlbW90ZS1hdWRpdCBzZXJ2aWNlXG4gKiAocGlwZWxpbmUsIHBsdWdpbiwgY29tcGxpYW5jZSwgcXVvdGEsIG1lc3NhZ2UsIGJpbGxpbmcsIHJlcG9ydGluZywg4oCmKS5cbiAqXG4gKiBUaGUgc2hhcmVkIGByZXF1aXJlQXV0aGAgZ2F0ZSBmb3J3YXJkcyBlYWNoIERFTklFRCBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IHRvXG4gKiB0aGUgYXVkaXRvciBzZXQgdmlhIHtAbGluayBzZXRBdXRoekRlbmlhbEF1ZGl0b3J9OyB0aGlzIHdpcmVzIHRoYXQgaG9vayB0byB0aGVcbiAqIHNlcnZpY2UncyB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9LCBmb3J3YXJkaW5nIGEgYGZhaWx1cmVgLW91dGNvbWVcbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50IHNvIHByb2JpbmcgLyBwcml2aWxlZ2UtZXNjYWxhdGlvbiBhdHRlbXB0cyBsZWF2ZSBhIHRyYWlsLlxuICogRW1pc3Npb24gaXMgZmlyZS1hbmQtZm9yZ2V0ICh0aGUgY2xpZW50IG5ldmVyIHRocm93cykuIGBnZXRDbGllbnRgIGlzIGEgZ2V0dGVyXG4gKiBzbyB0aGUgY2xpZW50IHN0YXlzIGxhemlseSBjb25zdHJ1Y3RlZCAoc2VydmljZXMgbWVtb2l6ZSBpdCBvbiBmaXJzdCB1c2UpLlxuICpcbiAqIFBsYXRmb3JtIGlzIGludGVudGlvbmFsbHkgTk9UIGEgY2FsbGVyIOKAlCBpdCBpcyB0aGUgYXVkaXQgYXV0aG9yaXR5IGFuZCB3cml0ZXNcbiAqIGBhdXRoei5kZW5pZWRgIHN0cmFpZ2h0IHRvIGl0cyBsb2NhbCBzdG9yZSAod2l0aCBgYWZmZWN0ZWRPcmdJZGApLCBub3QgdGhyb3VnaFxuICogYSBSZW1vdGVBdWRpdENsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgZ2V0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gZ2V0Q2xpZW50KCkucmVjb3JkKHtcbiAgICBhY3Rpb246ICdhdXRoei5kZW5pZWQnLFxuICAgIGFjdG9ySWQ6IGluZm8uYWN0b3JJZCA/PyAnYW5vbnltb3VzJyxcbiAgICBhY3RvckVtYWlsOiBpbmZvLmFjdG9yRW1haWwsXG4gICAgb3JnSWQ6IGluZm8ub3JnSWQsXG4gICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgIGRldGFpbHM6IHsgbWV0aG9kOiBpbmZvLm1ldGhvZCwgcGF0aDogaW5mby5wYXRoLCByZXF1aXJlZDogaW5mby5yZXF1aXJlZCB9LFxuICB9LCBzZXJ2aWNlTmFtZSkpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZS1zY29wZWQgYXVkaXQgY2xpZW50OiBhIGR1cmFibGUtc3Bvb2wtYmFja2VkIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH1cbiAqIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBwcmUtYm91bmQgZm9yIGVtaXNzaW9uLiBSZXBsYWNlcyB0aGUgcGVyLXNlcnZpY2VcbiAqIGJvaWxlcnBsYXRlIG9mIGBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCh7IHNwb29sOiBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQgfSlgXG4gKiBwbHVzIGEgaGFuZC1yb2xsZWQgYGVtaXQ8U2VydmljZT5BdWRpdGAgd3JhcHBlciB0aGF0IHJlcGVhdHMgdGhlIHNlcnZpY2UgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICAvKiogRW1pdCBhbiBhdWRpdCBldmVudCB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYm91bmQuIEZpcmUtYW5kLWZvcmdldC4gKi9cbiAgZW1pdChldmVudDogUmVtb3RlQXVkaXRFdmVudCk6IHZvaWQ7XG4gIC8qKiBUaGUgdW5kZXJseWluZyByZW1vdGUgY2xpZW50IOKAlCBmb3IgYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgICsgYGNsb3NlKClgLiAqL1xuICByZWFkb25seSBjbGllbnQ6IFJlbW90ZUF1ZGl0Q2xpZW50O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc2VydmljZSdzIGF1ZGl0IGNsaWVudDogYSBSZW1vdGVBdWRpdENsaWVudCB3aXJlZCB0byB0aGUgZHVyYWJsZSBSZWRpc1xuICogc3Bvb2wgKGZyb20gYW1iaWVudCBlbnY7IG51bGwg4oaSIG5vIHNwb29sKSB3aXRoIGBzZXJ2aWNlTmFtZWAgYm91bmQuIENvbnN0cnVjdFxuICogT05DRSBwZXIgcHJvY2VzcyDigJQgbWVtb2l6ZSBiZWhpbmQgYSBsYXp5IGBnZXRBdWRpdENsaWVudCgpYCBpbiB0aGUgc2VydmljZSdzXG4gKiBgc2VydmljZXMvYXVkaXQudHNgLiBQYXNzIGBjb25maWcuc3Bvb2xgIHRvIG92ZXJyaWRlIHRoZSBlbnYtZGVyaXZlZCBzcG9vbFxuICogKGUuZy4gcmV1c2UgYSBzZXJ2aWNlJ3MgZXhpc3RpbmcgaW9yZWRpcyBjb25uZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZTogc3RyaW5nLCBjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbCA/PyBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgLi4uY29uZmlnLCBzcG9vbCB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbWl0OiAoZXZlbnQpID0+IGNsaWVudC5yZWNvcmQoZXZlbnQsIHNlcnZpY2VOYW1lKSxcbiAgICBjbGllbnQsXG4gIH07XG59XG5cbi8qKlxuICogTGF6aWx5LWNvbnN0cnVjdGVkIHJlbW90ZS1hdWRpdCBhY2Nlc3NvciBmb3IgYSBzZXJ2aWNlLiBFdmVyeSBzZXJ2aWNlJ3NcbiAqIGBzZXJ2aWNlcy9hdWRpdC50c2AgdXNlZCB0byBoYW5kLXJvbGwgdGhlIHNhbWUgbW9kdWxlIHNpbmdsZXRvbiAoYSBgbGV0IGF1ZGl0YFxuICogKyBgc3ZjKClgIHRoYXQgYnVpbGRzIGEge0BsaW5rIFNlcnZpY2VBdWRpdENsaWVudH0gb24gZmlyc3QgdXNlLCB0aGVuIGFcbiAqIGBnZXRBdWRpdENsaWVudCgpYCByZXR1cm5pbmcgYC5jbGllbnRgIGFuZCBhbiBgZW1pdChldmVudClgIGZvcndhcmRpbmcgdG9cbiAqIGAuZW1pdGApLiBUaGlzIHBhY2thZ2VzIHRoYXQgcGF0dGVybiBpbiBPTkUgcGxhY2Ugc28gZWFjaCBzZXJ2aWNlJ3MgYXVkaXRcbiAqIHdpcmluZyBpcyBhIG9uZS1saW5lciBhbmQgY2FuJ3QgZHJpZnQuXG4gKlxuICogTGF6eSBvbiBwdXJwb3NlOiB0aGUgdW5kZXJseWluZyBjbGllbnQgd2lyZXMgYW4gZW52LVJlZGlzIGF1ZGl0IHNwb29sLCBzb1xuICogYnVpbGRpbmcgaXQgYXQgaW1wb3J0IHRpbWUgd291bGQgZm9yY2UgdGhhdCBjb25uZWN0aW9uIHdoZXJldmVyIHRoZSBtb2R1bGUgaXNcbiAqIG1lcmVseSBpbXBvcnRlZCAoZS5nLiB0ZXN0cykuIGBnZXRBdWRpdENsaWVudGAgaXMgcGFzc2VkIHRvXG4gKiBgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmA7IGBlbWl0YCBiYWNrcyB0aGUgcGVyLXNlcnZpY2UgYGVtaXRYQXVkaXRgIGhlbHBlcnMuXG4gKiBCb3RoIHN0YXkgRklSRS1BTkQtRk9SR0VUIChyZWNvcmQgbmV2ZXIgdGhyb3dzIC8gaXMgbm90IGF3YWl0ZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlQXVkaXRBY2Nlc3NvcihzZXJ2aWNlTmFtZTogc3RyaW5nKToge1xuICBnZXRBdWRpdENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQ7XG4gIGVtaXQ6IChldmVudDogUmVtb3RlQXVkaXRFdmVudCkgPT4gdm9pZDtcbn0ge1xuICBsZXQgYXVkaXQ6IFNlcnZpY2VBdWRpdENsaWVudCB8IG51bGwgPSBudWxsO1xuICBjb25zdCBzdmMgPSAoKTogU2VydmljZUF1ZGl0Q2xpZW50ID0+IHtcbiAgICBpZiAoIWF1ZGl0KSBhdWRpdCA9IGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZSk7XG4gICAgcmV0dXJuIGF1ZGl0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBzdmMoKS5jbGllbnQsXG4gICAgZW1pdDogKGV2ZW50KSA9PiBzdmMoKS5lbWl0KGV2ZW50KSxcbiAgfTtcbn1cbiJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGVBQWU7SUFDZixlQUFlO0lBQ2YsOEVBQThFO0lBQzlFLDRFQUE0RTtJQUM1RSxvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixnRUFBZ0U7SUFDaEUscUVBQXFFO0lBQ3JFLG9EQUFvRDtJQUNwRCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsMkJBQTJCO0lBQzNCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsaUZBQWlGO0lBQ2pGLG9GQUFvRjtJQUNwRiw0QkFBNEI7SUFDNUIsOEJBQThCO0lBQzlCLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsbURBQW1EO0lBQ25ELGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsd0RBQXdEO0lBQ3hELGNBQWM7SUFDZCxnRkFBZ0Y7SUFDaEYsdUVBQXVFO0lBQ3ZFLDZFQUE2RTtJQUM3RSxpRkFBaUY7SUFDakYsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDJCQUEyQjtJQUMzQixpQ0FBaUM7SUFDakMsaUNBQWlDO0lBQ2pDLGlDQUFpQztJQUNqQywyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsYUFBYTtJQUNiLHVCQUF1QjtJQUN2QiwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUNuRSxxQkFBcUI7SUFDckIsd0VBQXdFO0lBQ3hFLCtFQUErRTtJQUMvRSxzRUFBc0U7SUFDdEUsb0RBQW9EO0lBQ3BELDZCQUE2QjtJQUM3QixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGdGQUFnRjtJQUNoRiw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLGdDQUFnQztJQUNoQyw2QkFBNkI7SUFDN0IsNkJBQTZCO0lBQzdCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLDRFQUE0RTtJQUM1RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLHFCQUFxQjtJQUNyQiw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLCtDQUErQztJQUMvQywyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLDZFQUE2RTtJQUM3RSxrRUFBa0U7SUFDbEUsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1Qiw0RUFBNEU7SUFDNUUsZ0ZBQWdGO0lBQ2hGLGlGQUFpRjtJQUNqRix5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLHVCQUF1QjtJQUN2QixtRUFBbUU7SUFDbkUsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsMEJBQTBCO0lBQzFCLGNBQWM7Q0FDTixDQUFDO0FBSVgsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQVEsb0JBQTBDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUEwRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsTUFBTSxHQUE0QixFQUFFO0lBQzFFLE1BQU0sYUFBYSxHQUFrQjtRQUNuQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVU7UUFDcEUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUM5RSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJO0tBQ2hDLENBQUM7SUFDRixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksR0FBRyxDQUFDO0lBRXBEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF1QixFQUFFLFdBQW1CO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sT0FBTyxHQUEyQjtZQUN0QyxlQUFlLEVBQUUsVUFBVTtZQUMzQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLFVBQVUsRUFBRTtTQUN4RCxDQUFDO1FBQ0YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDbEcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNqRixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN4RyxDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1SCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLDRFQUE0RTtJQUM1RSx5REFBeUQ7SUFDekQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLEtBQUssVUFBVSxLQUFLO1FBQ2xCLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUTtZQUFFLE9BQU87UUFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUM7WUFDSCxTQUFTLENBQUM7Z0JBQ1IsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPO2dCQUMvQixNQUFNLFNBQVMsR0FBc0IsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLE1BQU0sR0FBc0IsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQzFCLElBQUksWUFBWSxFQUFFLENBQUM7d0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFBQyxTQUFTO29CQUFDLENBQUM7b0JBQ25ELE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN6RCxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNQLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3RCLFdBQVcsQ0FBQywrQkFBK0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDL0UsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFlBQVksR0FBRyxJQUFJLENBQUM7d0JBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JCLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCwwRUFBMEU7Z0JBQzFFLHdFQUF3RTtnQkFDeEUsd0VBQXdFO2dCQUN4RSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFBRSxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1QixPQUFPLENBQUMsMENBQTBDO2dCQUNwRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7Z0JBQVMsQ0FBQztZQUNULFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFVBQXNELENBQUM7SUFDM0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDLENBQUM7UUFDcEYsZ0VBQWdFO1FBQy9ELFVBQWdELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVztZQUN2QiwyRUFBMkU7WUFDM0Usd0VBQXdFO1lBQ3hFLE1BQU0sT0FBTyxHQUFxQjtnQkFDaEMsR0FBRyxLQUFLO2dCQUNSLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUN4RCxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxVQUFVLEVBQUU7YUFDckQsQ0FBQztZQUNGLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDN0MsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDUCxXQUFXLENBQUMscUJBQXFCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7b0JBQ3BHLElBQUksS0FBSzt3QkFBRSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsNENBQTRDO2dCQUN2RSxDQUFDO3FCQUFNLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ2pCLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDdEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSztZQUNILElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFBQyxDQUFDO1FBQ3hFLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLFdBQW1CLEVBQUUsU0FBa0M7SUFDNUYscUJBQXFCLENBQUMsQ0FBQyxJQUFxQixFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDbEUsTUFBTSxFQUFFLGNBQWM7UUFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksV0FBVztRQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7UUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO0tBQzNFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBZUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFdBQW1CLEVBQUUsTUFBTSxHQUE0QixFQUFFO0lBQ2hHLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksd0JBQXdCLEVBQUUsSUFBSSxTQUFTLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzdELE9BQU87UUFDTCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQztRQUNsRCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFdBQW1CO0lBSTNELElBQUksS0FBSyxHQUE4QixJQUFJLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsR0FBdUIsRUFBRTtRQUNuQyxJQUFJLENBQUMsS0FBSztZQUFFLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTTtRQUNsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsIHR5cGUgQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sRW50cnkgfSBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyLCBzZXRBdXRoekRlbmlhbEF1ZGl0b3IsIHR5cGUgQXV0aHpEZW5pYWxJbmZvIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVtb3RlLWF1ZGl0Jyk7XG5cbi8qKlxuICogQXVkaXQgaW5nZXN0IGlzIGJlc3QtZWZmb3J0IGFuZCBNVVNUIE5PVCBibG9jayB0aGUgY2FsbGVyLCBidXQgYSB0cmFuc2llbnRcbiAqIGZhaWx1cmUgKDQyOSAvIDV4eCAvIGNvbm5lY3Rpb24gcmVzZXQgLyB0aW1lb3V0KSBzaG91bGQgbm90IHNpbGVudGx5IGRyb3AgdGhlXG4gKiByb3cgb24gdGhlIGZpcnN0IGF0dGVtcHQuIEVhY2ggZW1pc3Npb24gY2FycmllcyBhIHN0YWJsZSBwZXItZXZlbnRcbiAqIGBJZGVtcG90ZW5jeS1LZXlgIChzZWUgYHJlY29yZGApLCBzbyB0aGUgaHR0cC1jbGllbnQgdHJlYXRzIHRoZSBQT1NUIGFzXG4gKiByZXRyeS1zYWZlIGFuZCB0aGUgcGxhdGZvcm0gY2FuIGRlZHVwIGEgcmV0cmllZCBkZWxpdmVyeSBpbnN0ZWFkIG9mIHdyaXRpbmcgYVxuICogZHVwbGljYXRlIHJvdy4gQnVkZ2V0IGlzIGtlcHQgc21hbGwgc28gYSBoYXJkLWRvd24gcGxhdGZvcm0gY2FuJ3QgYmFjayB0aGVcbiAqIHdvcmtlciB1cCBmb3IgbG9uZzogYmFzZSBkZWxheSDDlygyIHJldHJpZXMpICsgYSBjb3VwbGUgb2YgNDI5IGJhY2tvZmZzLlxuICovXG5jb25zdCBBVURJVF9SRVFVRVNUX09QVElPTlM6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJz4gPSB7XG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IDIsXG4gIG1heFJldHJpZXM6IDIsXG59O1xuXG4vKipcbiAqIFRoZSBleGFjdCBzZXQgb2YgYXVkaXQgYWN0aW9ucyBhIE5PTi1QTEFURk9STSAocmVtb3RlKSBzZXJ2aWNlIGlzIHBlcm1pdHRlZCB0b1xuICogZW1pdCB0aHJvdWdoIGBQT1NUIC9hdWRpdC9ldmVudHNgLiBUaGlzIGlzIHRoZSBTSU5HTEUgU09VUkNFIOKAlCBgUmVtb3RlQXVkaXRBY3Rpb25gXG4gKiBpcyBkZXJpdmVkIGZyb20gaXQsIHNvIHRoZSB0eXBlIGFuZCB0aGUgcnVudGltZSBhbGxvdy1saXN0IGNhbiBuZXZlciBkcmlmdC5cbiAqXG4gKiBTRUNVUklUWTogcGxhdGZvcm0ncyBpbmdlc3QgdmFsaWRhdGVzIGBhY3Rpb25gIGFnYWluc3QgdGhpcyBzdWJzZXQgKHZpYVxuICoge0BsaW5rIGlzUmVtb3RlQXVkaXRBY3Rpb259KSwgTk9UIHRoZSBmdWxsIHBsYXRmb3JtIGBBdWRpdEFjdGlvbmAgdW5pb24g4oCUIGFcbiAqIGBzZXJ2aWNlOipgIHRva2VuIG11c3Qgbm90IGJlIGFibGUgdG8gZm9yZ2UgcGxhdGZvcm0tYXV0aG9yaXR5IGV2ZW50c1xuICogKGBhZG1pbi5zdXBlcmFkbWluLmdyYW50YCwgYG9yZy5vd25lcnNoaXAudHJhbnNmZXJgLCBgdXNlci5sb2dpbmAsIOKApikuIEtlZXBcbiAqIHRoaXMgbGlzdCBmcmVlIG9mIGFueSBwbGF0Zm9ybS1vbmx5IGFjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFTU9URV9BVURJVF9BQ1RJT05TID0gW1xuICAncGx1Z2luLmJ1aWxkLmNvbXBsZXRlZCcsXG4gICdwbHVnaW4uYnVpbGQuZmFpbGVkJyxcbiAgJ3BsdWdpbi5idWlsZC50aW1lb3V0JyxcbiAgLy8gUGx1Z2luIGxpZmVjeWNsZSBtdXRhdGlvbnMgKGFwaS9wbHVnaW4gcm91dGUgaGFuZGxlcnMpIOKAlCB0aGUgZGVzdHJ1Y3RpdmUgL1xuICAvLyBwdWJsaXNoaW5nIHN1cmZhY2UgdGhhdCBidWlsZHMgYWxyZWFkeSBhdWRpdCdzIGNvdW50ZXJwYXJ0OiByZWdpc3RyeSBkZWxldGUsXG4gIC8vIHNvdXJjZSB1cGxvYWQsIGFuZCBkZXBsb3ktdG8tY2x1c3Rlci4gYHRhcmdldElkYCBpcyB0aGUgcGx1Z2luIGlkLlxuICAncGx1Z2luLmRlbGV0ZScsXG4gICdwbHVnaW4ucmVzdG9yZScsXG4gICdwbHVnaW4udXBkYXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBQaXBlbGluZSBtdXRhdGlvbnMg4oCUIGVtaXR0ZWQgYnkgYXBpL3BpcGVsaW5lJ3Mgcm91dGUgaGFuZGxlcnNcbiAgLy8gKGNyZWF0ZS91cGRhdGUvZGVsZXRlICsgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiB0cmlnZ2VyL2NhbmNlbCkgYW5kXG4gIC8vIHBvc3RlZCB0byBwbGF0Zm9ybSdzIGBQT1NUIC9hdWRpdC9ldmVudHNgIGluZ2VzdC5cbiAgJ3BpcGVsaW5lLmNyZWF0ZScsXG4gICdwaXBlbGluZS51cGRhdGUnLFxuICAncGlwZWxpbmUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lLnJlc3RvcmUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuY3JlYXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLnVwZGF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS5kZWxldGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUucmVzdG9yZScsXG4gICdwaXBlbGluZS5leGVjdXRpb24uc3RhcnQnLFxuICAncGlwZWxpbmUuZXhlY3V0aW9uLmNhbmNlbCcsXG4gIC8vIENvZGVQaXBlbGluZSBBUk4tcmVnaXN0cnkgY29uZmlnIChhcGkvcGlwZWxpbmUgcmVnaXN0cnkgcm91dGUpIOKAlCByZWdpc3RlcmluZyAvXG4gIC8vIGRlcmVnaXN0ZXJpbmcgdGhlIGV4dGVybmFsIENvZGVQaXBlbGluZSB0aGF0IGJhY2tzIGEgcGlwZWxpbmUgKGRlcGxveS1hZmZlY3RpbmcpLlxuICAncGlwZWxpbmUucmVnaXN0cnkucmVnaXN0ZXInLFxuICAncGlwZWxpbmUucmVnaXN0cnkuZGVyZWdpc3RlcicsXG4gIC8vIFF1b3RhIGFkbWluaXN0cmF0aW9uIChhcGkvcXVvdGEpIOKAlCBhIHN1cGVyYWRtaW4gcmVzZXR0aW5nIGFuIG9yZydzIHVzYWdlXG4gIC8vIGNvdW50ZXIgb3IgZWRpdGluZyBpdHMgdGllciBsaW1pdHMuIGBhZmZlY3RlZE9yZ0lkYCBpcyB0aGUgb3JnIGNoYW5nZWQ7XG4gIC8vIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSBxdW90YVR5cGUgKyBvbGQvbmV3IHZhbHVlLlxuICAncXVvdGEucmVzZXQnLFxuICAncXVvdGEubGltaXQudXBkYXRlJyxcbiAgLy8gQSBzdXBlcmFkbWluIGRlbGV0aW5nIGFuIG9yZydzIGVudGlyZSBxdW90YSBkb2N1bWVudC5cbiAgJ3F1b3RhLmRlbGV0ZScsXG4gIC8vIENvbXBsaWFuY2UgYWRtaW5pc3RyYXRpb24gKGFwaS9jb21wbGlhbmNlKSDigJQgdGhlIGVuZm9yY2VtZW50LXBvc3R1cmUgc3VyZmFjZS5cbiAgLy8gQXBwcm92aW5nL3Jldm9raW5nIGFuIGV4ZW1wdGlvbiwgdG9nZ2xpbmcvYXV0aG9yaW5nL2RlbGV0aW5nIGEgcnVsZSxcbiAgLy8gYXV0aG9yaW5nL2RlbGV0aW5nIGEgcG9saWN5LCBtYW5hZ2luZyBzY2FuIHNjaGVkdWxlcywgYXBwbHlpbmcgYSB0ZW1wbGF0ZSxcbiAgLy8gb3IgY2FuY2VsbGluZyBhIHJ1bm5pbmcgc2Nhbi4gYHRhcmdldElkYCBpcyB0aGUgcnVsZS9wb2xpY3kvZXhlbXB0aW9uL3NjYW4gaWQuXG4gICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5hcHByb3ZlJyxcbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLnJldm9rZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudG9nZ2xlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5yZXN0b3JlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS51cGRhdGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnJlc3RvcmUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS50ZW1wbGF0ZS5hcHBseScsXG4gICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gQ3Jvc3MtcmVwbyB0YWcvaW1hZ2UgY29weSAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2FwaS9pbWFnZXMvY29weSkuIEFcbiAgLy8gY3Jvc3MtdGVuYW50IGNvcHkgbW92ZXMgZGF0YSBhY3Jvc3MgY3VzdG9tZXIgYm91bmRhcmllcywgc28gaXQgbmVlZHMgdGhlXG4gIC8vIGR1cmFibGUsIHRhbXBlci1ldmlkZW50IHRyYWlsIOKAlCBub3QganVzdCB0aGUgTG9raSBvcGVyYXRvciBsaW5lLlxuICAncmVnaXN0cnkuaW1hZ2UuY29weScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAnbWVzc2FnZS5yZXN0b3JlJyxcbiAgLy8gQmlsbGluZyAoYXBpL2JpbGxpbmcpIOKAlCBzdWJzY3JpcHRpb24gKyBlbnRpdGxlbWVudCBtdXRhdGlvbnMsIG1pcnJvcmVkIHRvIHRoZVxuICAvLyBjZW50cmFsIGF1ZGl0IHRyYWlsICh0aGVzZSBhbHNvIHdyaXRlIHRvIHRoZSBzZXJ2aWNlLWxvY2FsIGJpbGxpbmdfZXZlbnRzXG4gIC8vIGNvbGxlY3Rpb24pLiBgZGV0YWlsc2AgY2FycnkgcGxhbi90aWVyL2FkZG9uIGlkcyBvbmx5IOKAlCBuZXZlciBjYXJkL3BheW1lbnRcbiAgLy8gc2VjcmV0cyBvciBhbiBBV1MgYWNjb3VudCBpZC5cbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmNhbmNlbCcsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5kZWxldGUnLFxuICAnYmlsbGluZy50aWVyLm92ZXJyaWRlJyxcbiAgJ2JpbGxpbmcuYWRkb24uYWRkJyxcbiAgJ2JpbGxpbmcuYWRkb24ucmVtb3ZlJyxcbiAgLy8gU3lzdGVtLWluaXRpYXRlZCByZW1vdmFsIG9mIGEgdGllci1pbmNsdWRlZCBhZGQtb24gb24gYSBwbGFuIHVwZ3JhZGUgKHRoZVxuICAvLyBhY2NvdW50J3MgbmV3IHRpZXIgbm93IGJ1bmRsZXMgdGhlIGZlYXR1cmUpIOKAlCBkaXN0aW5jdCBmcm9tIGEgdXNlci1pbml0aWF0ZWRcbiAgLy8gYHJlbW92ZWAgc28gZmluYW5jZSBjYW4gdGVsbCBhbiBhdXRvLXBydW5lIGZyb20gYSBjdXN0b21lciBhY3Rpb24uXG4gICdiaWxsaW5nLmFkZG9uLnBydW5lJyxcbiAgLy8gRGlzY291bnRzIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kKSDigJQgbWludC9pc3N1ZS9hcHBseS9yZW1vdmUvcmV2b2tlIG9mIGFcbiAgLy8gcHJpY2UgY291cG9uIG9yIHVzYWdlIGNyZWRpdC4gYGRldGFpbHNgIGNhcnJ5IHRoZSBkaXNjb3VudCBpZCArIGtpbmQvdmFsdWVcbiAgLy8gb25seSwgbmV2ZXIgdGhlIG9wYXF1ZSB0b2tlbiBvciBzaWduaW5nIGtleS5cbiAgJ2JpbGxpbmcuZGlzY291bnQuZ2VuZXJhdGUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5pc3N1ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50LmFwcGx5JyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmVtb3ZlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmV2b2tlJyxcbiAgLy8gUHJvbW90aW9ucyAoZG9jcy9iaWxsaW5nLWRpc2NvdW50cy5tZCNwcm9tb3Rpb25zKSDigJQgcnVsZS1kcml2ZW4gYXV0by1ncmFudFxuICAvLyBjYW1wYWlnbnMuIGBkZXRhaWxzYCBjYXJyeSB0aGUgcHJvbW90aW9uIGlkICsgY2VudHMvZXZlbnQgb25seS5cbiAgJ2JpbGxpbmcucHJvbW90aW9uLmNyZWF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi51cGRhdGUnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24ucmV2b2tlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmdyYW50JyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmFjdGl2YXRlJyxcbiAgLy8gVXNhZ2UtY3JlZGl0IHJlYWxpemF0aW9uIOKAlCBhIGN1c3RvbWVyL2NvbXBsaWFuY2UtdmlzaWJsZSByZWNvcmQgb2YgY3JlZGl0XG4gIC8vIG1vdmVtZW50OiBgY29uc3VtZWRgIChNYXJrZXRwbGFjZSBtZXRlcmVkIGRyYXdkb3duKSwgYGV4aGF1c3RlZGAgKGJhbGFuY2UgaGl0XG4gIC8vIHplcm8pLCBhbmQgYSBjb21ibyBlbmRpbmcuIGBkZXRhaWxzYCBjYXJyeSBjZW50cy9pZHMgb25seSwgbm8gcGF5bWVudCBzZWNyZXRzLlxuICAnYmlsbGluZy5jcmVkaXQuY29uc3VtZWQnLFxuICAnYmlsbGluZy5jcmVkaXQuZXhoYXVzdGVkJyxcbiAgJ2JpbGxpbmcuY29tYm8uZXhwaXJlZCcsXG4gIC8vIERlbmllZCBhdXRob3JpemF0aW9uIGF0dGVtcHQg4oCUIGVtaXR0ZWQgYmVzdC1lZmZvcnQgYnkgdGhlIHNoYXJlZFxuICAvLyBgcmVxdWlyZVBlcm1pc3Npb25gIC8gYHJlcXVpcmVTeXN0ZW1BZG1pbmAgZ2F0ZSB3aGVuIGEgc3RhdGUtY2hhbmdpbmdcbiAgLy8gKG5vbi1HRVQpIHJlcXVlc3QgaXMgcmVqZWN0ZWQsIHNvIHByb2JpbmcvZXNjYWxhdGlvbiBhdHRlbXB0cyBhcmUgdmlzaWJsZVxuICAvLyByYXRoZXIgdGhhbiBpbnZpc2libGUuIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uICsgcGF0aDtcbiAgLy8gYG91dGNvbWVgIGlzICdmYWlsdXJlJy5cbiAgJ2F1dGh6LmRlbmllZCcsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9IHR5cGVvZiBSRU1PVEVfQVVESVRfQUNUSU9OU1tudW1iZXJdO1xuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIGFjdGlvbiBhIHJlbW90ZSBzZXJ2aWNlIG1heSBlbWl0ICh0aGUgaW5nZXN0IGFsbG93LWxpc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlQXVkaXRBY3Rpb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFJlbW90ZUF1ZGl0QWN0aW9uIHtcbiAgcmV0dXJuIChSRU1PVEVfQVVESVRfQUNUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9IT1NUID8/ICdwbGF0Zm9ybScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDMwMDAsXG4gIH07XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sO1xuICBjb25zdCBkcmFpbkJhdGNoU2l6ZSA9IGNvbmZpZy5kcmFpbkJhdGNoU2l6ZSA/PyAxMDA7XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgT05FIGxpdmUgZGVsaXZlcnkuIFJlc29sdmVzIGB0cnVlYCBvbiBhIDJ4eCBhY2NlcHQsIGBmYWxzZWAgb24gYW55XG4gICAqIG5vbi0yeHggLyB0aHJvd24gZXJyb3IgKHRoZSBodHRwLWNsaWVudCBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSByZXRyeVxuICAgKiBidWRnZXQpLiBBIHN0YWJsZSBwZXItZW1pc3Npb24gYElkZW1wb3RlbmN5LUtleWAgbWFrZXMgdGhpcyBub24taWRlbXBvdGVudFxuICAgKiBQT1NUIHJldHJ5LXNhZmUgYW5kIGxldHMgdGhlIHBsYXRmb3JtIGluZ2VzdCBkZWR1cCBhIHJlLWRlbGl2ZXJlZCBldmVudFxuICAgKiBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBkdXBsaWNhdGUgYXVkaXQgcm93IChhbmQgZHVwbGljYXRlIGNoYWluIGxpbmspLlxuICAgKiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBkZXJpdmVkIGZyb20gdGhlIGV2ZW50IHNvIGEgU1BPT0xFRCByZS1kZWxpdmVyeSByZXVzZXNcbiAgICogdGhlIHNhbWUga2V5IGFzIGl0cyBvcmlnaW5hbCBsaXZlIGF0dGVtcHQg4oCUIHRoZSB0d28gY29sbGFwc2UgdG8gb25lIHJvdy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXIoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ0F1dGhvcml6YXRpb24nOiBhdXRoSGVhZGVyLFxuICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBzcG9vbCBkcmFpbnMgc28gYSBwZXJpb2RpYyB0aWNrIGFuZCBhbiBvbi1zdWNjZXNzIGRyYWluIGNhbid0IGJvdGhcbiAgLy8gcHVsbCB0aGUgc2FtZSBiYXRjaC4gU3RvcHMgZWFybHkgdGhlIG1vbWVudCBhIHJlLWRlbGl2ZXJ5IGZhaWxzIChwbGF0Zm9ybVxuICAvLyBzdGlsbCBkb3duKSBzbyB3ZSBkb24ndCBoYW1tZXIgaXQgb3IgY2h1cm4gdGhlIGJ1ZmZlci5cbiAgbGV0IGRyYWluaW5nID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIGRyYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc3Bvb2wgfHwgZHJhaW5pbmcpIHJldHVybjtcbiAgICBkcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBhd2FpdCBzcG9vbC50YWtlKGRyYWluQmF0Y2hTaXplKTtcbiAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWxpdmVyZWQ6IEF1ZGl0U3Bvb2xFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IGZhaWxlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgbGV0IHBsYXRmb3JtRG93biA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhdGNoKSB7XG4gICAgICAgICAgaWYgKHBsYXRmb3JtRG93bikgeyBmYWlsZWQucHVzaChlbnRyeSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCBkZWxpdmVyKGVudHJ5LmV2ZW50LCBlbnRyeS5zZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICBkZWxpdmVyZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfcmVkZWxpdmVyZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbGF0Zm9ybURvd24gPSB0cnVlO1xuICAgICAgICAgICAgZmFpbGVkLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBY2tub3dsZWRnZSB0aGUgZGVsaXZlcmVkIHByZWZpeCBzbyBpdCBjbGVhcnMgdGhlIGluLXByb2dyZXNzIGxpc3Q7IHRoZVxuICAgICAgICAvLyByZWxpYWJsZSB0YWtlKCkgbW92ZWQgdGhlIHdob2xlIGJhdGNoIHRoZXJlLCBzbyB1bmFja2VkIHN1cnZpdm9ycyBhcmVcbiAgICAgICAgLy8gcmVjbGFpbWVkIGJ5IHJlY292ZXIoKSBhZnRlciBhIGNyYXNoIHJhdGhlciB0aGFuIGJlaW5nIHNpbGVudGx5IGxvc3QuXG4gICAgICAgIGlmIChkZWxpdmVyZWQubGVuZ3RoID4gMCkgYXdhaXQgc3Bvb2wuYWNrKGRlbGl2ZXJlZCk7XG4gICAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHNwb29sLnJlcXVldWUoZmFpbGVkKTtcbiAgICAgICAgICByZXR1cm47IC8vIHN0aWxsIGRvd24g4oCUIHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCB0aWNrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBkcmFpbiBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IGRyYWluVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHNwb29sKSB7XG4gICAgLy8gUmVjbGFpbSBhbnkgYmF0Y2ggc3RyYW5kZWQgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgYnkgYSBwcmlvciBjcmFzaCwgdGhlblxuICAgIC8vIGF0dGVtcHQgdG8gZmx1c2ggaXQuIEJvdGggYXJlIGJlc3QtZWZmb3J0ICh0aGUgc3Bvb2wgc3dhbGxvd3MgaXRzIGVycm9ycykuXG4gICAgdm9pZCBzcG9vbC5yZWNvdmVyKCkudGhlbigoKSA9PiBkcmFpbigpKTtcbiAgICBkcmFpblRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB2b2lkIGRyYWluKCk7IH0sIGNvbmZpZy5kcmFpbkludGVydmFsTXMgPz8gMzBfMDAwKTtcbiAgICAvLyBEb24ndCBsZXQgdGhlIGRyYWluIHRpbWVyIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgb24gc2h1dGRvd24uXG4gICAgKGRyYWluVGltZXIgYXMgdW5rbm93biBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlY29yZChldmVudCwgc2VydmljZU5hbWUpIHtcbiAgICAgIC8vIFN0YW1wIHdoZW4gdGhlIGFjdGlvbiBhY3R1YWxseSBvY2N1cnJlZCAoc3Vydml2ZXMgc3Bvb2wgZGVsYXkpIGFuZCBwaW4gYVxuICAgICAgLy8gc3RhYmxlIGlkZW1wb3RlbmN5IGtleSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIHNwb29sZWQgcmV0cnkgZGVkdXAuXG4gICAgICBjb25zdCBzdGFtcGVkOiBSZW1vdGVBdWRpdEV2ZW50ID0ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgb2NjdXJyZWRBdDogZXZlbnQub2NjdXJyZWRBdCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGlkZW1wb3RlbmN5S2V5OiBldmVudC5pZGVtcG90ZW5jeUtleSA/PyByYW5kb21VVUlEKCksXG4gICAgICB9O1xuICAgICAgdm9pZCBkZWxpdmVyKHN0YW1wZWQsIHNlcnZpY2VOYW1lKS50aGVuKChvaykgPT4ge1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZW1pdHRlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUsIG91dGNvbWU6IHN0YW1wZWQub3V0Y29tZSA/PyAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgaWYgKHNwb29sKSB2b2lkIGRyYWluKCk7IC8vIHBsYXRmb3JtIGlzIHJlYWNoYWJsZSDigJQgZmx1c2ggYW55IGJhY2tsb2dcbiAgICAgICAgfSBlbHNlIGlmIChzcG9vbCkge1xuICAgICAgICAgIHZvaWQgc3Bvb2wuZW5xdWV1ZSh7IGV2ZW50OiBzdGFtcGVkLCBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZHJvcHBlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoZHJhaW5UaW1lcikgeyBjbGVhckludGVydmFsKGRyYWluVGltZXIpOyBkcmFpblRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgc3RhbmRhcmQgYGF1dGh6LmRlbmllZGAgc2luayB1c2VkIGJ5IGV2ZXJ5IHJlbW90ZS1hdWRpdCBzZXJ2aWNlXG4gKiAocGlwZWxpbmUsIHBsdWdpbiwgY29tcGxpYW5jZSwgcXVvdGEsIG1lc3NhZ2UsIGJpbGxpbmcsIHJlcG9ydGluZywg4oCmKS5cbiAqXG4gKiBUaGUgc2hhcmVkIGByZXF1aXJlQXV0aGAgZ2F0ZSBmb3J3YXJkcyBlYWNoIERFTklFRCBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IHRvXG4gKiB0aGUgYXVkaXRvciBzZXQgdmlhIHtAbGluayBzZXRBdXRoekRlbmlhbEF1ZGl0b3J9OyB0aGlzIHdpcmVzIHRoYXQgaG9vayB0byB0aGVcbiAqIHNlcnZpY2UncyB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9LCBmb3J3YXJkaW5nIGEgYGZhaWx1cmVgLW91dGNvbWVcbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50IHNvIHByb2JpbmcgLyBwcml2aWxlZ2UtZXNjYWxhdGlvbiBhdHRlbXB0cyBsZWF2ZSBhIHRyYWlsLlxuICogRW1pc3Npb24gaXMgZmlyZS1hbmQtZm9yZ2V0ICh0aGUgY2xpZW50IG5ldmVyIHRocm93cykuIGBnZXRDbGllbnRgIGlzIGEgZ2V0dGVyXG4gKiBzbyB0aGUgY2xpZW50IHN0YXlzIGxhemlseSBjb25zdHJ1Y3RlZCAoc2VydmljZXMgbWVtb2l6ZSBpdCBvbiBmaXJzdCB1c2UpLlxuICpcbiAqIFBsYXRmb3JtIGlzIGludGVudGlvbmFsbHkgTk9UIGEgY2FsbGVyIOKAlCBpdCBpcyB0aGUgYXVkaXQgYXV0aG9yaXR5IGFuZCB3cml0ZXNcbiAqIGBhdXRoei5kZW5pZWRgIHN0cmFpZ2h0IHRvIGl0cyBsb2NhbCBzdG9yZSAod2l0aCBgYWZmZWN0ZWRPcmdJZGApLCBub3QgdGhyb3VnaFxuICogYSBSZW1vdGVBdWRpdENsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgZ2V0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gZ2V0Q2xpZW50KCkucmVjb3JkKHtcbiAgICBhY3Rpb246ICdhdXRoei5kZW5pZWQnLFxuICAgIGFjdG9ySWQ6IGluZm8uYWN0b3JJZCA/PyAnYW5vbnltb3VzJyxcbiAgICBhY3RvckVtYWlsOiBpbmZvLmFjdG9yRW1haWwsXG4gICAgb3JnSWQ6IGluZm8ub3JnSWQsXG4gICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgIGRldGFpbHM6IHsgbWV0aG9kOiBpbmZvLm1ldGhvZCwgcGF0aDogaW5mby5wYXRoLCByZXF1aXJlZDogaW5mby5yZXF1aXJlZCB9LFxuICB9LCBzZXJ2aWNlTmFtZSkpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZS1zY29wZWQgYXVkaXQgY2xpZW50OiBhIGR1cmFibGUtc3Bvb2wtYmFja2VkIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH1cbiAqIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBwcmUtYm91bmQgZm9yIGVtaXNzaW9uLiBSZXBsYWNlcyB0aGUgcGVyLXNlcnZpY2VcbiAqIGJvaWxlcnBsYXRlIG9mIGBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCh7IHNwb29sOiBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQgfSlgXG4gKiBwbHVzIGEgaGFuZC1yb2xsZWQgYGVtaXQ8U2VydmljZT5BdWRpdGAgd3JhcHBlciB0aGF0IHJlcGVhdHMgdGhlIHNlcnZpY2UgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICAvKiogRW1pdCBhbiBhdWRpdCBldmVudCB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYm91bmQuIEZpcmUtYW5kLWZvcmdldC4gKi9cbiAgZW1pdChldmVudDogUmVtb3RlQXVkaXRFdmVudCk6IHZvaWQ7XG4gIC8qKiBUaGUgdW5kZXJseWluZyByZW1vdGUgY2xpZW50IOKAlCBmb3IgYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgICsgYGNsb3NlKClgLiAqL1xuICByZWFkb25seSBjbGllbnQ6IFJlbW90ZUF1ZGl0Q2xpZW50O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc2VydmljZSdzIGF1ZGl0IGNsaWVudDogYSBSZW1vdGVBdWRpdENsaWVudCB3aXJlZCB0byB0aGUgZHVyYWJsZSBSZWRpc1xuICogc3Bvb2wgKGZyb20gYW1iaWVudCBlbnY7IG51bGwg4oaSIG5vIHNwb29sKSB3aXRoIGBzZXJ2aWNlTmFtZWAgYm91bmQuIENvbnN0cnVjdFxuICogT05DRSBwZXIgcHJvY2VzcyDigJQgbWVtb2l6ZSBiZWhpbmQgYSBsYXp5IGBnZXRBdWRpdENsaWVudCgpYCBpbiB0aGUgc2VydmljZSdzXG4gKiBgc2VydmljZXMvYXVkaXQudHNgLiBQYXNzIGBjb25maWcuc3Bvb2xgIHRvIG92ZXJyaWRlIHRoZSBlbnYtZGVyaXZlZCBzcG9vbFxuICogKGUuZy4gcmV1c2UgYSBzZXJ2aWNlJ3MgZXhpc3RpbmcgaW9yZWRpcyBjb25uZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZTogc3RyaW5nLCBjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbCA/PyBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgLi4uY29uZmlnLCBzcG9vbCB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbWl0OiAoZXZlbnQpID0+IGNsaWVudC5yZWNvcmQoZXZlbnQsIHNlcnZpY2VOYW1lKSxcbiAgICBjbGllbnQsXG4gIH07XG59XG5cbi8qKlxuICogTGF6aWx5LWNvbnN0cnVjdGVkIHJlbW90ZS1hdWRpdCBhY2Nlc3NvciBmb3IgYSBzZXJ2aWNlLiBFdmVyeSBzZXJ2aWNlJ3NcbiAqIGBzZXJ2aWNlcy9hdWRpdC50c2AgdXNlZCB0byBoYW5kLXJvbGwgdGhlIHNhbWUgbW9kdWxlIHNpbmdsZXRvbiAoYSBgbGV0IGF1ZGl0YFxuICogKyBgc3ZjKClgIHRoYXQgYnVpbGRzIGEge0BsaW5rIFNlcnZpY2VBdWRpdENsaWVudH0gb24gZmlyc3QgdXNlLCB0aGVuIGFcbiAqIGBnZXRBdWRpdENsaWVudCgpYCByZXR1cm5pbmcgYC5jbGllbnRgIGFuZCBhbiBgZW1pdChldmVudClgIGZvcndhcmRpbmcgdG9cbiAqIGAuZW1pdGApLiBUaGlzIHBhY2thZ2VzIHRoYXQgcGF0dGVybiBpbiBPTkUgcGxhY2Ugc28gZWFjaCBzZXJ2aWNlJ3MgYXVkaXRcbiAqIHdpcmluZyBpcyBhIG9uZS1saW5lciBhbmQgY2FuJ3QgZHJpZnQuXG4gKlxuICogTGF6eSBvbiBwdXJwb3NlOiB0aGUgdW5kZXJseWluZyBjbGllbnQgd2lyZXMgYW4gZW52LVJlZGlzIGF1ZGl0IHNwb29sLCBzb1xuICogYnVpbGRpbmcgaXQgYXQgaW1wb3J0IHRpbWUgd291bGQgZm9yY2UgdGhhdCBjb25uZWN0aW9uIHdoZXJldmVyIHRoZSBtb2R1bGUgaXNcbiAqIG1lcmVseSBpbXBvcnRlZCAoZS5nLiB0ZXN0cykuIGBnZXRBdWRpdENsaWVudGAgaXMgcGFzc2VkIHRvXG4gKiBgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmA7IGBlbWl0YCBiYWNrcyB0aGUgcGVyLXNlcnZpY2UgYGVtaXRYQXVkaXRgIGhlbHBlcnMuXG4gKiBCb3RoIHN0YXkgRklSRS1BTkQtRk9SR0VUIChyZWNvcmQgbmV2ZXIgdGhyb3dzIC8gaXMgbm90IGF3YWl0ZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlQXVkaXRBY2Nlc3NvcihzZXJ2aWNlTmFtZTogc3RyaW5nKToge1xuICBnZXRBdWRpdENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQ7XG4gIGVtaXQ6IChldmVudDogUmVtb3RlQXVkaXRFdmVudCkgPT4gdm9pZDtcbn0ge1xuICBsZXQgYXVkaXQ6IFNlcnZpY2VBdWRpdENsaWVudCB8IG51bGwgPSBudWxsO1xuICBjb25zdCBzdmMgPSAoKTogU2VydmljZUF1ZGl0Q2xpZW50ID0+IHtcbiAgICBpZiAoIWF1ZGl0KSBhdWRpdCA9IGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZSk7XG4gICAgcmV0dXJuIGF1ZGl0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBzdmMoKS5jbGllbnQsXG4gICAgZW1pdDogKGV2ZW50KSA9PiBzdmMoKS5lbWl0KGV2ZW50KSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RemoteAuditClient } from './remote-audit-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wire the two boot-security concerns every stateless service sets up
|
|
4
|
+
* identically at startup:
|
|
5
|
+
* 1. forward denied (non-GET) authorizations to the shared `authz.denied`
|
|
6
|
+
* audit sink (`wireAuthzDenialAuditor`);
|
|
7
|
+
* 2. register the env-Redis token-revocation reader (fail-open) so
|
|
8
|
+
* `requireAuth` can reject a token behind the platform-published
|
|
9
|
+
* `tokenVersion` (`setTokenRevocationStore(createEnvRedisTokenRevocationStore())`).
|
|
10
|
+
*
|
|
11
|
+
* Collapses the two copy-pasted lines in each service's `index.ts` into one call.
|
|
12
|
+
*
|
|
13
|
+
* NOTE: the PLUGIN service opts out — it shares its health-check Redis
|
|
14
|
+
* connection via `createRedisTokenRevocationStore(getHealthRedisConnection())`
|
|
15
|
+
* instead of the env-Redis store — so it wires these two concerns by hand.
|
|
16
|
+
*
|
|
17
|
+
* @param serviceName short service name minted into the `authz.denied` records
|
|
18
|
+
* @param getAuditClient lazy accessor for the service's RemoteAuditClient
|
|
19
|
+
*/
|
|
20
|
+
export declare function wireServiceSecurity(serviceName: string, getAuditClient: () => RemoteAuditClient): void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { wireAuthzDenialAuditor } from './remote-audit-client.js';
|
|
4
|
+
import { createEnvRedisTokenRevocationStore } from './token-revocation.js';
|
|
5
|
+
import { setTokenRevocationStore } from '../middleware/auth.js';
|
|
6
|
+
/**
|
|
7
|
+
* Wire the two boot-security concerns every stateless service sets up
|
|
8
|
+
* identically at startup:
|
|
9
|
+
* 1. forward denied (non-GET) authorizations to the shared `authz.denied`
|
|
10
|
+
* audit sink (`wireAuthzDenialAuditor`);
|
|
11
|
+
* 2. register the env-Redis token-revocation reader (fail-open) so
|
|
12
|
+
* `requireAuth` can reject a token behind the platform-published
|
|
13
|
+
* `tokenVersion` (`setTokenRevocationStore(createEnvRedisTokenRevocationStore())`).
|
|
14
|
+
*
|
|
15
|
+
* Collapses the two copy-pasted lines in each service's `index.ts` into one call.
|
|
16
|
+
*
|
|
17
|
+
* NOTE: the PLUGIN service opts out — it shares its health-check Redis
|
|
18
|
+
* connection via `createRedisTokenRevocationStore(getHealthRedisConnection())`
|
|
19
|
+
* instead of the env-Redis store — so it wires these two concerns by hand.
|
|
20
|
+
*
|
|
21
|
+
* @param serviceName short service name minted into the `authz.denied` records
|
|
22
|
+
* @param getAuditClient lazy accessor for the service's RemoteAuditClient
|
|
23
|
+
*/
|
|
24
|
+
export function wireServiceSecurity(serviceName, getAuditClient) {
|
|
25
|
+
wireAuthzDenialAuditor(serviceName, getAuditClient);
|
|
26
|
+
setTokenRevocationStore(createEnvRedisTokenRevocationStore());
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1ib290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2UtYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhFOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUFtQixFQUFFLGNBQXVDO0lBQzlGLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNwRCx1QkFBdUIsQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlbW90ZUF1ZGl0Q2xpZW50IH0gZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmltcG9ydCB7IHdpcmVBdXRoekRlbmlhbEF1ZGl0b3IgfSBmcm9tICcuL3JlbW90ZS1hdWRpdC1jbGllbnQuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSB9IGZyb20gJy4vdG9rZW4tcmV2b2NhdGlvbi5qcyc7XG5pbXBvcnQgeyBzZXRUb2tlblJldm9jYXRpb25TdG9yZSB9IGZyb20gJy4uL21pZGRsZXdhcmUvYXV0aC5qcyc7XG5cbi8qKlxuICogV2lyZSB0aGUgdHdvIGJvb3Qtc2VjdXJpdHkgY29uY2VybnMgZXZlcnkgc3RhdGVsZXNzIHNlcnZpY2Ugc2V0cyB1cFxuICogaWRlbnRpY2FsbHkgYXQgc3RhcnR1cDpcbiAqICAgMS4gZm9yd2FyZCBkZW5pZWQgKG5vbi1HRVQpIGF1dGhvcml6YXRpb25zIHRvIHRoZSBzaGFyZWQgYGF1dGh6LmRlbmllZGBcbiAqICAgICAgYXVkaXQgc2luayAoYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgKTtcbiAqICAgMi4gcmVnaXN0ZXIgdGhlIGVudi1SZWRpcyB0b2tlbi1yZXZvY2F0aW9uIHJlYWRlciAoZmFpbC1vcGVuKSBzb1xuICogICAgICBgcmVxdWlyZUF1dGhgIGNhbiByZWplY3QgYSB0b2tlbiBiZWhpbmQgdGhlIHBsYXRmb3JtLXB1Ymxpc2hlZFxuICogICAgICBgdG9rZW5WZXJzaW9uYCAoYHNldFRva2VuUmV2b2NhdGlvblN0b3JlKGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUoKSlgKS5cbiAqXG4gKiBDb2xsYXBzZXMgdGhlIHR3byBjb3B5LXBhc3RlZCBsaW5lcyBpbiBlYWNoIHNlcnZpY2UncyBgaW5kZXgudHNgIGludG8gb25lIGNhbGwuXG4gKlxuICogTk9URTogdGhlIFBMVUdJTiBzZXJ2aWNlIG9wdHMgb3V0IOKAlCBpdCBzaGFyZXMgaXRzIGhlYWx0aC1jaGVjayBSZWRpc1xuICogY29ubmVjdGlvbiB2aWEgYGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUoZ2V0SGVhbHRoUmVkaXNDb25uZWN0aW9uKCkpYFxuICogaW5zdGVhZCBvZiB0aGUgZW52LVJlZGlzIHN0b3JlIOKAlCBzbyBpdCB3aXJlcyB0aGVzZSB0d28gY29uY2VybnMgYnkgaGFuZC5cbiAqXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgc2hvcnQgc2VydmljZSBuYW1lIG1pbnRlZCBpbnRvIHRoZSBgYXV0aHouZGVuaWVkYCByZWNvcmRzXG4gKiBAcGFyYW0gZ2V0QXVkaXRDbGllbnQgbGF6eSBhY2Nlc3NvciBmb3IgdGhlIHNlcnZpY2UncyBSZW1vdGVBdWRpdENsaWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lyZVNlcnZpY2VTZWN1cml0eShzZXJ2aWNlTmFtZTogc3RyaW5nLCBnZXRBdWRpdENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQpOiB2b2lkIHtcbiAgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcihzZXJ2aWNlTmFtZSwgZ2V0QXVkaXRDbGllbnQpO1xuICBzZXRUb2tlblJldm9jYXRpb25TdG9yZShjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCkpO1xufVxuIl19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Result of {@link SseTicketStore.issue}. */
|
|
2
|
+
export type SseTicketIssueResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
ticket: string;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: 'total' | 'org';
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Store for short-lived, single-use SSE auth tickets. A client exchanges its JWT
|
|
11
|
+
* for a ticket (so the token never lands in an EventSource query string / access
|
|
12
|
+
* log), then redeems it on the SSE `GET`.
|
|
13
|
+
*
|
|
14
|
+
* The store is the multi-replica correctness boundary: a ticket minted on pod A
|
|
15
|
+
* MUST be redeemable on pod B. The Redis backend makes that true; the in-memory
|
|
16
|
+
* backend is a single-process fallback for dev / single-replica installs.
|
|
17
|
+
*/
|
|
18
|
+
export interface SseTicketStore {
|
|
19
|
+
/** Mint a ticket for `orgId`, or reject when a rate window is saturated. */
|
|
20
|
+
issue(orgId: string): Promise<SseTicketIssueResult>;
|
|
21
|
+
/** Atomically redeem a ticket exactly once; returns its org or null if invalid/expired/spent. */
|
|
22
|
+
consume(ticketId: string): Promise<{
|
|
23
|
+
orgId: string;
|
|
24
|
+
} | null>;
|
|
25
|
+
/** Release timers/resources. In-memory clears its sweep interval; Redis is a no-op. */
|
|
26
|
+
stop(): void;
|
|
27
|
+
}
|
|
28
|
+
/** Caps + TTL for the ticket store. */
|
|
29
|
+
export interface SseTicketStoreConfig {
|
|
30
|
+
/** Ticket lifetime — long enough for the client to open the EventSource. */
|
|
31
|
+
ttlMs: number;
|
|
32
|
+
/** Hard cap on tickets minted per TTL window across all orgs (abuse bound). */
|
|
33
|
+
maxTotal: number;
|
|
34
|
+
/** Per-org cap on tickets minted per TTL window (single-tenant abuse bound). */
|
|
35
|
+
maxPerOrg: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build an {@link SseTicketStore} from the standard Redis env (`REDIS_URL` or
|
|
39
|
+
* `REDIS_HOST`/`REDIS_PORT`). Uses the Redis backend when configured
|
|
40
|
+
* (multi-replica safe), otherwise falls back to the in-memory single-process
|
|
41
|
+
* backend. A service opts in with one boot line:
|
|
42
|
+
* `const tickets = createEnvSseTicketStore({ ttlMs, maxTotal, maxPerOrg });`
|
|
43
|
+
*/
|
|
44
|
+
export declare function createEnvSseTicketStore(config: SseTicketStoreConfig): SseTicketStore;
|