@pipeline-builder/api-core 3.4.108 → 3.4.110

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.
@@ -1,5 +1,6 @@
1
1
  export * from './crud-helpers.js';
2
2
  export * from './access-helpers.js';
3
+ export * from './restore-helpers.js';
3
4
  export * from './sse-helpers.js';
4
5
  export * from './org-hierarchy.js';
5
6
  export * from './org-hierarchy-http.js';
@@ -2,7 +2,8 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export * from './crud-helpers.js';
4
4
  export * from './access-helpers.js';
5
+ export * from './restore-helpers.js';
5
6
  export * from './sse-helpers.js';
6
7
  export * from './org-hierarchy.js';
7
8
  export * from './org-hierarchy-http.js';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2NydWQtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzcy1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3NlLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmctaGllcmFyY2h5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vb3JnLWhpZXJhcmNoeS1odHRwLmpzJztcbiJdfQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN0b3JlLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc2UtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL29yZy1oaWVyYXJjaHkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmctaGllcmFyY2h5LWh0dHAuanMnO1xuIl19
@@ -0,0 +1,25 @@
1
+ import type { Request, Response } from 'express';
2
+ import type { Permission } from '../types/permissions.js';
3
+ /** Minimal shape a restore route needs from the entity it restores. */
4
+ export interface RestorableEntity {
5
+ orgId: string;
6
+ accessModifier?: string;
7
+ }
8
+ /** The slice of a service a restore route uses (satisfied by any CrudService). */
9
+ export interface RestorableService<T extends RestorableEntity> {
10
+ findDeletedById(id: string, orgId?: string): Promise<T | null>;
11
+ restore(id: string, orgId: string, userId: string): Promise<T | null>;
12
+ }
13
+ /**
14
+ * Shared skeleton for a step-up-gated entity restore route: extract `:id`, load
15
+ * the own-org tombstone, gate a PUBLIC entity on `publishPermission` (parity with
16
+ * delete), restore, and 404 on miss. Returns `{ existing, restored }` on success,
17
+ * or `null` when it has ALREADY sent a response (400/404/403) — the caller then
18
+ * does the entity-specific audit + response. DRYs the near-identical
19
+ * pipeline / plugin / pipeline_template restore routes (which differ only in
20
+ * service, audit action, and response shaping).
21
+ */
22
+ export declare function loadAndRestore<T extends RestorableEntity>(req: Request, res: Response, orgId: string, userId: string, service: RestorableService<T>, label: string, publishPermission: Permission): Promise<{
23
+ existing: T;
24
+ restored: T;
25
+ } | null>;
@@ -0,0 +1,39 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { requirePublicAccess } from './access-helpers.js';
4
+ import { sendEntityNotFound } from './crud-helpers.js';
5
+ import { ErrorCode } from '../types/error-codes.js';
6
+ import { getParam } from '../utils/params.js';
7
+ import { sendBadRequest } from '../utils/response.js';
8
+ /**
9
+ * Shared skeleton for a step-up-gated entity restore route: extract `:id`, load
10
+ * the own-org tombstone, gate a PUBLIC entity on `publishPermission` (parity with
11
+ * delete), restore, and 404 on miss. Returns `{ existing, restored }` on success,
12
+ * or `null` when it has ALREADY sent a response (400/404/403) — the caller then
13
+ * does the entity-specific audit + response. DRYs the near-identical
14
+ * pipeline / plugin / pipeline_template restore routes (which differ only in
15
+ * service, audit action, and response shaping).
16
+ */
17
+ export async function loadAndRestore(req, res, orgId, userId, service, label, publishPermission) {
18
+ const id = getParam(req.params, 'id');
19
+ if (!id) {
20
+ sendBadRequest(res, `${label} ID is required.`, ErrorCode.MISSING_REQUIRED_FIELD);
21
+ return null;
22
+ }
23
+ // Load the TOMBSTONE (own-org). A live row / unknown id / already-purged → 404.
24
+ const existing = await service.findDeletedById(id, orgId);
25
+ if (!existing) {
26
+ sendEntityNotFound(res, label);
27
+ return null;
28
+ }
29
+ // Public (shared) entities: same publish gate as delete.
30
+ if (!requirePublicAccess(req, res, existing, publishPermission))
31
+ return null;
32
+ const restored = await service.restore(id, orgId, userId || 'system');
33
+ if (!restored) {
34
+ sendEntityNotFound(res, label);
35
+ return null;
36
+ }
37
+ return { existing, restored };
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdG9yZS1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHBlcnMvcmVzdG9yZS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFjdEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsR0FBWSxFQUNaLEdBQWEsRUFDYixLQUFhLEVBQ2IsTUFBYyxFQUNkLE9BQTZCLEVBQzdCLEtBQWEsRUFDYixpQkFBNkI7SUFFN0IsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1IsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssa0JBQWtCLEVBQUUsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDbEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2Qsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUU3RSxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksUUFBUSxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2Qsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyByZXF1aXJlUHVibGljQWNjZXNzIH0gZnJvbSAnLi9hY2Nlc3MtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBzZW5kRW50aXR5Tm90Rm91bmQgfSBmcm9tICcuL2NydWQtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYXJhbSB9IGZyb20gJy4uL3V0aWxzL3BhcmFtcy5qcyc7XG5pbXBvcnQgeyBzZW5kQmFkUmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqIE1pbmltYWwgc2hhcGUgYSByZXN0b3JlIHJvdXRlIG5lZWRzIGZyb20gdGhlIGVudGl0eSBpdCByZXN0b3Jlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdG9yYWJsZUVudGl0eSB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIGFjY2Vzc01vZGlmaWVyPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIHNsaWNlIG9mIGEgc2VydmljZSBhIHJlc3RvcmUgcm91dGUgdXNlcyAoc2F0aXNmaWVkIGJ5IGFueSBDcnVkU2VydmljZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RvcmFibGVTZXJ2aWNlPFQgZXh0ZW5kcyBSZXN0b3JhYmxlRW50aXR5PiB7XG4gIGZpbmREZWxldGVkQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+O1xuICByZXN0b3JlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD47XG59XG5cbi8qKlxuICogU2hhcmVkIHNrZWxldG9uIGZvciBhIHN0ZXAtdXAtZ2F0ZWQgZW50aXR5IHJlc3RvcmUgcm91dGU6IGV4dHJhY3QgYDppZGAsIGxvYWRcbiAqIHRoZSBvd24tb3JnIHRvbWJzdG9uZSwgZ2F0ZSBhIFBVQkxJQyBlbnRpdHkgb24gYHB1Ymxpc2hQZXJtaXNzaW9uYCAocGFyaXR5IHdpdGhcbiAqIGRlbGV0ZSksIHJlc3RvcmUsIGFuZCA0MDQgb24gbWlzcy4gUmV0dXJucyBgeyBleGlzdGluZywgcmVzdG9yZWQgfWAgb24gc3VjY2VzcyxcbiAqIG9yIGBudWxsYCB3aGVuIGl0IGhhcyBBTFJFQURZIHNlbnQgYSByZXNwb25zZSAoNDAwLzQwNC80MDMpIOKAlCB0aGUgY2FsbGVyIHRoZW5cbiAqIGRvZXMgdGhlIGVudGl0eS1zcGVjaWZpYyBhdWRpdCArIHJlc3BvbnNlLiBEUllzIHRoZSBuZWFyLWlkZW50aWNhbFxuICogcGlwZWxpbmUgLyBwbHVnaW4gLyBwaXBlbGluZV90ZW1wbGF0ZSByZXN0b3JlIHJvdXRlcyAod2hpY2ggZGlmZmVyIG9ubHkgaW5cbiAqIHNlcnZpY2UsIGF1ZGl0IGFjdGlvbiwgYW5kIHJlc3BvbnNlIHNoYXBpbmcpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEFuZFJlc3RvcmU8VCBleHRlbmRzIFJlc3RvcmFibGVFbnRpdHk+KFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBzZXJ2aWNlOiBSZXN0b3JhYmxlU2VydmljZTxUPixcbiAgbGFiZWw6IHN0cmluZyxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4pOiBQcm9taXNlPHsgZXhpc3Rpbmc6IFQ7IHJlc3RvcmVkOiBUIH0gfCBudWxsPiB7XG4gIGNvbnN0IGlkID0gZ2V0UGFyYW0ocmVxLnBhcmFtcywgJ2lkJyk7XG4gIGlmICghaWQpIHtcbiAgICBzZW5kQmFkUmVxdWVzdChyZXMsIGAke2xhYmVsfSBJRCBpcyByZXF1aXJlZC5gLCBFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9GSUVMRCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBMb2FkIHRoZSBUT01CU1RPTkUgKG93bi1vcmcpLiBBIGxpdmUgcm93IC8gdW5rbm93biBpZCAvIGFscmVhZHktcHVyZ2VkIOKGkiA0MDQuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2VydmljZS5maW5kRGVsZXRlZEJ5SWQoaWQsIG9yZ0lkKTtcbiAgaWYgKCFleGlzdGluZykge1xuICAgIHNlbmRFbnRpdHlOb3RGb3VuZChyZXMsIGxhYmVsKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFB1YmxpYyAoc2hhcmVkKSBlbnRpdGllczogc2FtZSBwdWJsaXNoIGdhdGUgYXMgZGVsZXRlLlxuICBpZiAoIXJlcXVpcmVQdWJsaWNBY2Nlc3MocmVxLCByZXMsIGV4aXN0aW5nLCBwdWJsaXNoUGVybWlzc2lvbikpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3RvcmVkID0gYXdhaXQgc2VydmljZS5yZXN0b3JlKGlkLCBvcmdJZCwgdXNlcklkIHx8ICdzeXN0ZW0nKTtcbiAgaWYgKCFyZXN0b3JlZCkge1xuICAgIHNlbmRFbnRpdHlOb3RGb3VuZChyZXMsIGxhYmVsKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7IGV4aXN0aW5nLCByZXN0b3JlZCB9O1xufVxuIl19
@@ -1,2 +1,3 @@
1
1
  export * from './auth.js';
2
2
  export * from './mongo-sanitize.js';
3
+ export * from './step-up.js';
@@ -2,4 +2,5 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export * from './auth.js';
4
4
  export * from './mongo-sanitize.js';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9hdXRoLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9uZ28tc2FuaXRpemUuanMnO1xuIl19
5
+ export * from './step-up.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9hdXRoLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9uZ28tc2FuaXRpemUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGVwLXVwLmpzJztcbiJdfQ==
@@ -0,0 +1,45 @@
1
+ /**
2
+ * `requireStepUp` — a shared step-up (recent-password-reverify) gate for the
3
+ * stateless api services, mirroring the platform middleware of the same name.
4
+ *
5
+ * Flow: the UI hits `POST /api/auth/step-up` (platform) to re-verify the user's
6
+ * password; platform mints a short-lived (60s) `step-up` JWT signed with the
7
+ * SAME `JWT_SECRET` these services already verify access tokens with. The UI
8
+ * replays it as the `X-Step-Up-Token` header on the destructive/sensitive call;
9
+ * this middleware verifies it, binds it to the caller (`sub` match), and
10
+ * consumes its `jti` once (Redis-backed cross-instance when configured, else a
11
+ * bounded process-local set) so a replay inside the TTL is rejected.
12
+ *
13
+ * WHY here: restore endpoints on the api services (pipeline/plugin/...) are
14
+ * step-up-gated, but step-up previously lived only in `platform`. This ports the
15
+ * verify + single-use jti into api-core so any service can require it.
16
+ */
17
+ import type { Request, Response, NextFunction } from 'express';
18
+ /** Payload of a platform-issued step-up token (see platform issueStepUpToken). */
19
+ export interface StepUpTokenPayload {
20
+ type: 'step-up';
21
+ sub: string;
22
+ jti: string;
23
+ iat: number;
24
+ exp: number;
25
+ }
26
+ /**
27
+ * Verify a step-up token: valid signature (primary `JWT_SECRET`, or
28
+ * `JWT_SECRET_PREVIOUS` during a rotation), allow-listed algorithm, AND the
29
+ * `type: 'step-up'` + `jti` claims — a plain access token shares the secret and
30
+ * `sub`, so without asserting the step-up shape it would bypass the gate.
31
+ * Throws on any failure. Does NOT bind to a caller — `requireStepUp` does the
32
+ * `sub` match and single-use consume.
33
+ */
34
+ export declare function verifyStepUpToken(token: string): StepUpTokenPayload;
35
+ /**
36
+ * Consume a step-up `jti` exactly once. Returns true if this call claimed it
37
+ * (first use), false if it was already consumed (replay). `expEpochSeconds` is
38
+ * the token's `exp`, so the marker auto-expires with the token.
39
+ */
40
+ export declare function consumeStepUpJti(jti: string, expEpochSeconds: number): Promise<boolean>;
41
+ /**
42
+ * Express middleware: require a valid, caller-bound, single-use step-up token in
43
+ * the `X-Step-Up-Token` header. Must run AFTER `requireAuth` (needs `req.user`).
44
+ */
45
+ export declare function requireStepUp(req: Request, res: Response, next: NextFunction): Promise<void>;
@@ -0,0 +1,125 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import jwt from 'jsonwebtoken';
4
+ import { createEnvRedisClient } from '../services/env-redis.js';
5
+ import { getHeaderString } from '../utils/headers.js';
6
+ import { createLogger } from '../utils/logger.js';
7
+ import { sendError } from '../utils/response.js';
8
+ const logger = createLogger('step-up');
9
+ const HEADER = 'x-step-up-token';
10
+ function jwtAlgorithm() {
11
+ return (process.env.JWT_ALGORITHM || 'HS256');
12
+ }
13
+ /**
14
+ * Verify a step-up token: valid signature (primary `JWT_SECRET`, or
15
+ * `JWT_SECRET_PREVIOUS` during a rotation), allow-listed algorithm, AND the
16
+ * `type: 'step-up'` + `jti` claims — a plain access token shares the secret and
17
+ * `sub`, so without asserting the step-up shape it would bypass the gate.
18
+ * Throws on any failure. Does NOT bind to a caller — `requireStepUp` does the
19
+ * `sub` match and single-use consume.
20
+ */
21
+ export function verifyStepUpToken(token) {
22
+ const secret = process.env.JWT_SECRET;
23
+ if (!secret)
24
+ throw new Error('JWT_SECRET environment variable is required');
25
+ const opts = { algorithms: [jwtAlgorithm()] };
26
+ let payload;
27
+ try {
28
+ payload = jwt.verify(token, secret, opts);
29
+ }
30
+ catch (primaryErr) {
31
+ const previous = process.env.JWT_SECRET_PREVIOUS;
32
+ if (!previous)
33
+ throw primaryErr;
34
+ payload = jwt.verify(token, previous, opts);
35
+ }
36
+ if (payload.type !== 'step-up' || !payload.jti || !payload.sub) {
37
+ throw new Error('INVALID_STEP_UP_TOKEN');
38
+ }
39
+ return payload;
40
+ }
41
+ // -- Single-use jti store -----------------------------------------------------
42
+ // Redis SET NX EX when Redis is configured (cross-instance single-use); else a
43
+ // bounded process-local map with TTL sweep (per-process). A step-up token is
44
+ // 60s-lived. When Redis IS configured it's the authoritative store: a Redis
45
+ // error FAILS CLOSED (throws → STEP_UP_INVALID, user re-verifies) rather than
46
+ // degrading to the per-instance mem guard, which would accept a cross-instance
47
+ // replay during the outage. The mem guard is used ONLY when Redis is absent.
48
+ let _redis;
49
+ function redis() {
50
+ if (_redis === undefined) {
51
+ _redis = createEnvRedisClient('step-up-jti');
52
+ }
53
+ return _redis;
54
+ }
55
+ const memJti = new Map(); // jti -> expiry epoch ms
56
+ const memSweep = setInterval(() => {
57
+ const now = Date.now();
58
+ for (const [jti, exp] of memJti)
59
+ if (exp <= now)
60
+ memJti.delete(jti);
61
+ }, 30_000);
62
+ memSweep.unref?.();
63
+ /**
64
+ * Consume a step-up `jti` exactly once. Returns true if this call claimed it
65
+ * (first use), false if it was already consumed (replay). `expEpochSeconds` is
66
+ * the token's `exp`, so the marker auto-expires with the token.
67
+ */
68
+ export async function consumeStepUpJti(jti, expEpochSeconds) {
69
+ const ttlSeconds = Math.max(1, expEpochSeconds - Math.floor(Date.now() / 1000));
70
+ const client = redis();
71
+ if (client) {
72
+ // Redis configured ⇒ authoritative cross-instance store. SET NX EX → 'OK'
73
+ // when newly set, null when already consumed. A thrown Redis error is NOT
74
+ // caught here: it propagates so `requireStepUp` fails closed (STEP_UP_INVALID)
75
+ // instead of silently degrading to the per-instance mem guard.
76
+ const res = await client.set(`stepup:jti:${jti}`, '1', 'EX', ttlSeconds, 'NX');
77
+ return res === 'OK';
78
+ }
79
+ // No Redis ⇒ single-instance deployment; the process-local map IS the store.
80
+ if (memJti.has(jti))
81
+ return false;
82
+ memJti.set(jti, Date.now() + ttlSeconds * 1000);
83
+ return true;
84
+ }
85
+ /**
86
+ * Express middleware: require a valid, caller-bound, single-use step-up token in
87
+ * the `X-Step-Up-Token` header. Must run AFTER `requireAuth` (needs `req.user`).
88
+ */
89
+ export async function requireStepUp(req, res, next) {
90
+ const callerSub = req.user?.sub;
91
+ if (!callerSub) {
92
+ sendError(res, 401, 'Authentication required', 'UNAUTHORIZED');
93
+ return;
94
+ }
95
+ const token = getHeaderString(req.headers[HEADER]);
96
+ if (!token) {
97
+ sendError(res, 401, 'Step-up verification required', 'STEP_UP_REQUIRED');
98
+ return;
99
+ }
100
+ let payload;
101
+ try {
102
+ payload = verifyStepUpToken(token);
103
+ }
104
+ catch {
105
+ sendError(res, 401, 'Step-up token invalid or expired', 'STEP_UP_INVALID');
106
+ return;
107
+ }
108
+ if (payload.sub !== callerSub) {
109
+ sendError(res, 401, 'Step-up token does not match session', 'STEP_UP_MISMATCH');
110
+ return;
111
+ }
112
+ try {
113
+ if (!(await consumeStepUpJti(payload.jti, payload.exp))) {
114
+ sendError(res, 401, 'Step-up token already used or expired', 'STEP_UP_REPLAY');
115
+ return;
116
+ }
117
+ }
118
+ catch (err) {
119
+ logger.error('Step-up jti consume errored', { error: String(err) });
120
+ sendError(res, 401, 'Step-up verification failed', 'STEP_UP_INVALID');
121
+ return;
122
+ }
123
+ next();
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC11cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3N0ZXAtdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQW9CdEMsT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQztBQVdqQyxTQUFTLFlBQVk7SUFDbkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBa0IsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO0lBQ3RDLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sSUFBSSxHQUFzQixFQUFFLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVqRSxJQUFJLE9BQTJCLENBQUM7SUFDaEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQXVCLENBQUM7SUFDbEUsQ0FBQztJQUFDLE9BQU8sVUFBVSxFQUFFLENBQUM7UUFDcEIsTUFB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T0FBTztJQUNULENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQztBQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBgcmVxdWlyZVN0ZXBVcGAg4oCUIGEgc2hhcmVkIHN0ZXAtdXAgKHJlY2VudC1wYXNzd29yZC1yZXZlcmlmeSkgZ2F0ZSBmb3IgdGhlXG4gKiBzdGF0ZWxlc3MgYXBpIHNlcnZpY2VzLCBtaXJyb3JpbmcgdGhlIHBsYXRmb3JtIG1pZGRsZXdhcmUgb2YgdGhlIHNhbWUgbmFtZS5cbiAqXG4gKiBGbG93OiB0aGUgVUkgaGl0cyBgUE9TVCAvYXBpL2F1dGgvc3RlcC11cGAgKHBsYXRmb3JtKSB0byByZS12ZXJpZnkgdGhlIHVzZXInc1xuICogcGFzc3dvcmQ7IHBsYXRmb3JtIG1pbnRzIGEgc2hvcnQtbGl2ZWQgKDYwcykgYHN0ZXAtdXBgIEpXVCBzaWduZWQgd2l0aCB0aGVcbiAqIFNBTUUgYEpXVF9TRUNSRVRgIHRoZXNlIHNlcnZpY2VzIGFscmVhZHkgdmVyaWZ5IGFjY2VzcyB0b2tlbnMgd2l0aC4gVGhlIFVJXG4gKiByZXBsYXlzIGl0IGFzIHRoZSBgWC1TdGVwLVVwLVRva2VuYCBoZWFkZXIgb24gdGhlIGRlc3RydWN0aXZlL3NlbnNpdGl2ZSBjYWxsO1xuICogdGhpcyBtaWRkbGV3YXJlIHZlcmlmaWVzIGl0LCBiaW5kcyBpdCB0byB0aGUgY2FsbGVyIChgc3ViYCBtYXRjaCksIGFuZFxuICogY29uc3VtZXMgaXRzIGBqdGlgIG9uY2UgKFJlZGlzLWJhY2tlZCBjcm9zcy1pbnN0YW5jZSB3aGVuIGNvbmZpZ3VyZWQsIGVsc2UgYVxuICogYm91bmRlZCBwcm9jZXNzLWxvY2FsIHNldCkgc28gYSByZXBsYXkgaW5zaWRlIHRoZSBUVEwgaXMgcmVqZWN0ZWQuXG4gKlxuICogV0hZIGhlcmU6IHJlc3RvcmUgZW5kcG9pbnRzIG9uIHRoZSBhcGkgc2VydmljZXMgKHBpcGVsaW5lL3BsdWdpbi8uLi4pIGFyZVxuICogc3RlcC11cC1nYXRlZCwgYnV0IHN0ZXAtdXAgcHJldmlvdXNseSBsaXZlZCBvbmx5IGluIGBwbGF0Zm9ybWAuIFRoaXMgcG9ydHMgdGhlXG4gKiB2ZXJpZnkgKyBzaW5nbGUtdXNlIGp0aSBpbnRvIGFwaS1jb3JlIHNvIGFueSBzZXJ2aWNlIGNhbiByZXF1aXJlIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaGVhZGVycy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3N0ZXAtdXAnKTtcbmNvbnN0IEhFQURFUiA9ICd4LXN0ZXAtdXAtdG9rZW4nO1xuXG4vKiogUGF5bG9hZCBvZiBhIHBsYXRmb3JtLWlzc3VlZCBzdGVwLXVwIHRva2VuIChzZWUgcGxhdGZvcm0gaXNzdWVTdGVwVXBUb2tlbikuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBVcFRva2VuUGF5bG9hZCB7XG4gIHR5cGU6ICdzdGVwLXVwJztcbiAgc3ViOiBzdHJpbmc7XG4gIGp0aTogc3RyaW5nO1xuICBpYXQ6IG51bWJlcjtcbiAgZXhwOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGp3dEFsZ29yaXRobSgpOiBqd3QuQWxnb3JpdGhtIHtcbiAgcmV0dXJuIChwcm9jZXNzLmVudi5KV1RfQUxHT1JJVEhNIHx8ICdIUzI1NicpIGFzIGp3dC5BbGdvcml0aG07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgc3RlcC11cCB0b2tlbjogdmFsaWQgc2lnbmF0dXJlIChwcmltYXJ5IGBKV1RfU0VDUkVUYCwgb3JcbiAqIGBKV1RfU0VDUkVUX1BSRVZJT1VTYCBkdXJpbmcgYSByb3RhdGlvbiksIGFsbG93LWxpc3RlZCBhbGdvcml0aG0sIEFORCB0aGVcbiAqIGB0eXBlOiAnc3RlcC11cCdgICsgYGp0aWAgY2xhaW1zIOKAlCBhIHBsYWluIGFjY2VzcyB0b2tlbiBzaGFyZXMgdGhlIHNlY3JldCBhbmRcbiAqIGBzdWJgLCBzbyB3aXRob3V0IGFzc2VydGluZyB0aGUgc3RlcC11cCBzaGFwZSBpdCB3b3VsZCBieXBhc3MgdGhlIGdhdGUuXG4gKiBUaHJvd3Mgb24gYW55IGZhaWx1cmUuIERvZXMgTk9UIGJpbmQgdG8gYSBjYWxsZXIg4oCUIGByZXF1aXJlU3RlcFVwYCBkb2VzIHRoZVxuICogYHN1YmAgbWF0Y2ggYW5kIHNpbmdsZS11c2UgY29uc3VtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVN0ZXBVcFRva2VuKHRva2VuOiBzdHJpbmcpOiBTdGVwVXBUb2tlblBheWxvYWQge1xuICBjb25zdCBzZWNyZXQgPSBwcm9jZXNzLmVudi5KV1RfU0VDUkVUO1xuICBpZiAoIXNlY3JldCkgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gIGNvbnN0IG9wdHM6IGp3dC5WZXJpZnlPcHRpb25zID0geyBhbGdvcml0aG1zOiBband0QWxnb3JpdGhtKCldIH07XG5cbiAgbGV0IHBheWxvYWQ6IFN0ZXBVcFRva2VuUGF5bG9hZDtcbiAgdHJ5IHtcbiAgICBwYXlsb2FkID0gand0LnZlcmlmeSh0b2tlbiwgc2VjcmV0LCBvcHRzKSBhcyBTdGVwVXBUb2tlblBheWxvYWQ7XG4gIH0gY2F0Y2ggKHByaW1hcnlFcnIpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHByb2Nlc3MuZW52LkpXVF9TRUNSRVRfUFJFVklPVVM7XG4gICAgaWYgKCFwcmV2aW91cykgdGhyb3cgcHJpbWFyeUVycjtcbiAgICBwYXlsb2FkID0gand0LnZlcmlmeSh0b2tlbiwgcHJldmlvdXMsIG9wdHMpIGFzIFN0ZXBVcFRva2VuUGF5bG9hZDtcbiAgfVxuXG4gIGlmIChwYXlsb2FkLnR5cGUgIT09ICdzdGVwLXVwJyB8fCAhcGF5bG9hZC5qdGkgfHwgIXBheWxvYWQuc3ViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJTlZBTElEX1NURVBfVVBfVE9LRU4nKTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gLS0gU2luZ2xlLXVzZSBqdGkgc3RvcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZGlzIFNFVCBOWCBFWCB3aGVuIFJlZGlzIGlzIGNvbmZpZ3VyZWQgKGNyb3NzLWluc3RhbmNlIHNpbmdsZS11c2UpOyBlbHNlIGFcbi8vIGJvdW5kZWQgcHJvY2Vzcy1sb2NhbCBtYXAgd2l0aCBUVEwgc3dlZXAgKHBlci1wcm9jZXNzKS4gQSBzdGVwLXVwIHRva2VuIGlzXG4vLyA2MHMtbGl2ZWQuIFdoZW4gUmVkaXMgSVMgY29uZmlndXJlZCBpdCdzIHRoZSBhdXRob3JpdGF0aXZlIHN0b3JlOiBhIFJlZGlzXG4vLyBlcnJvciBGQUlMUyBDTE9TRUQgKHRocm93cyDihpIgU1RFUF9VUF9JTlZBTElELCB1c2VyIHJlLXZlcmlmaWVzKSByYXRoZXIgdGhhblxuLy8gZGVncmFkaW5nIHRvIHRoZSBwZXItaW5zdGFuY2UgbWVtIGd1YXJkLCB3aGljaCB3b3VsZCBhY2NlcHQgYSBjcm9zcy1pbnN0YW5jZVxuLy8gcmVwbGF5IGR1cmluZyB0aGUgb3V0YWdlLiBUaGUgbWVtIGd1YXJkIGlzIHVzZWQgT05MWSB3aGVuIFJlZGlzIGlzIGFic2VudC5cblxubGV0IF9yZWRpczogeyBzZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj4gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiByZWRpcygpOiB7IHNldDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPiB9IHwgbnVsbCB7XG4gIGlmIChfcmVkaXMgPT09IHVuZGVmaW5lZCkge1xuICAgIF9yZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PHsgc2V0OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IH0+KCdzdGVwLXVwLWp0aScpO1xuICB9XG4gIHJldHVybiBfcmVkaXM7XG59XG5cbmNvbnN0IG1lbUp0aSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7IC8vIGp0aSAtPiBleHBpcnkgZXBvY2ggbXNcbmNvbnN0IG1lbVN3ZWVwID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBmb3IgKGNvbnN0IFtqdGksIGV4cF0gb2YgbWVtSnRpKSBpZiAoZXhwIDw9IG5vdykgbWVtSnRpLmRlbGV0ZShqdGkpO1xufSwgMzBfMDAwKTtcbm1lbVN3ZWVwLnVucmVmPy4oKTtcblxuLyoqXG4gKiBDb25zdW1lIGEgc3RlcC11cCBganRpYCBleGFjdGx5IG9uY2UuIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNhbGwgY2xhaW1lZCBpdFxuICogKGZpcnN0IHVzZSksIGZhbHNlIGlmIGl0IHdhcyBhbHJlYWR5IGNvbnN1bWVkIChyZXBsYXkpLiBgZXhwRXBvY2hTZWNvbmRzYCBpc1xuICogdGhlIHRva2VuJ3MgYGV4cGAsIHNvIHRoZSBtYXJrZXIgYXV0by1leHBpcmVzIHdpdGggdGhlIHRva2VuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uc3VtZVN0ZXBVcEp0aShqdGk6IHN0cmluZywgZXhwRXBvY2hTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgdHRsU2Vjb25kcyA9IE1hdGgubWF4KDEsIGV4cEVwb2NoU2Vjb25kcyAtIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApKTtcbiAgY29uc3QgY2xpZW50ID0gcmVkaXMoKTtcbiAgaWYgKGNsaWVudCkge1xuICAgIC8vIFJlZGlzIGNvbmZpZ3VyZWQg4oeSIGF1dGhvcml0YXRpdmUgY3Jvc3MtaW5zdGFuY2Ugc3RvcmUuIFNFVCBOWCBFWCDihpIgJ09LJ1xuICAgIC8vIHdoZW4gbmV3bHkgc2V0LCBudWxsIHdoZW4gYWxyZWFkeSBjb25zdW1lZC4gQSB0aHJvd24gUmVkaXMgZXJyb3IgaXMgTk9UXG4gICAgLy8gY2F1Z2h0IGhlcmU6IGl0IHByb3BhZ2F0ZXMgc28gYHJlcXVpcmVTdGVwVXBgIGZhaWxzIGNsb3NlZCAoU1RFUF9VUF9JTlZBTElEKVxuICAgIC8vIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVncmFkaW5nIHRvIHRoZSBwZXItaW5zdGFuY2UgbWVtIGd1YXJkLlxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5zZXQoYHN0ZXB1cDpqdGk6JHtqdGl9YCwgJzEnLCAnRVgnLCB0dGxTZWNvbmRzLCAnTlgnKTtcbiAgICByZXR1cm4gcmVzID09PSAnT0snO1xuICB9XG4gIC8vIE5vIFJlZGlzIOKHkiBzaW5nbGUtaW5zdGFuY2UgZGVwbG95bWVudDsgdGhlIHByb2Nlc3MtbG9jYWwgbWFwIElTIHRoZSBzdG9yZS5cbiAgaWYgKG1lbUp0aS5oYXMoanRpKSkgcmV0dXJuIGZhbHNlO1xuICBtZW1KdGkuc2V0KGp0aSwgRGF0ZS5ub3coKSArIHR0bFNlY29uZHMgKiAxMDAwKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlOiByZXF1aXJlIGEgdmFsaWQsIGNhbGxlci1ib3VuZCwgc2luZ2xlLXVzZSBzdGVwLXVwIHRva2VuIGluXG4gKiB0aGUgYFgtU3RlcC1VcC1Ub2tlbmAgaGVhZGVyLiBNdXN0IHJ1biBBRlRFUiBgcmVxdWlyZUF1dGhgIChuZWVkcyBgcmVxLnVzZXJgKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTdGVwVXAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsbGVyU3ViID0gKHJlcSBhcyBSZXF1ZXN0ICYgeyB1c2VyPzogeyBzdWI/OiBzdHJpbmcgfSB9KS51c2VyPy5zdWI7XG4gIGlmICghY2FsbGVyU3ViKSB7XG4gICAgc2VuZEVycm9yKHJlcywgNDAxLCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCAnVU5BVVRIT1JJWkVEJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdG9rZW4gPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbSEVBREVSXSk7XG4gIGlmICghdG9rZW4pIHtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdTdGVwLXVwIHZlcmlmaWNhdGlvbiByZXF1aXJlZCcsICdTVEVQX1VQX1JFUVVJUkVEJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHBheWxvYWQ6IFN0ZXBVcFRva2VuUGF5bG9hZDtcbiAgdHJ5IHtcbiAgICBwYXlsb2FkID0gdmVyaWZ5U3RlcFVwVG9rZW4odG9rZW4pO1xuICB9IGNhdGNoIHtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdTdGVwLXVwIHRva2VuIGludmFsaWQgb3IgZXhwaXJlZCcsICdTVEVQX1VQX0lOVkFMSUQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF5bG9hZC5zdWIgIT09IGNhbGxlclN1Yikge1xuICAgIHNlbmRFcnJvcihyZXMsIDQwMSwgJ1N0ZXAtdXAgdG9rZW4gZG9lcyBub3QgbWF0Y2ggc2Vzc2lvbicsICdTVEVQX1VQX01JU01BVENIJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoIShhd2FpdCBjb25zdW1lU3RlcFVwSnRpKHBheWxvYWQuanRpLCBwYXlsb2FkLmV4cCkpKSB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdTdGVwLXVwIHRva2VuIGFscmVhZHkgdXNlZCBvciBleHBpcmVkJywgJ1NURVBfVVBfUkVQTEFZJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ1N0ZXAtdXAganRpIGNvbnN1bWUgZXJyb3JlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIHNlbmRFcnJvcihyZXMsIDQwMSwgJ1N0ZXAtdXAgdmVyaWZpY2F0aW9uIGZhaWxlZCcsICdTVEVQX1VQX0lOVkFMSUQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBuZXh0KCk7XG59XG4iXX0=
@@ -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.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', '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.policy.create', 'compliance.policy.update', 'compliance.policy.delete', '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', '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.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;
@@ -39,6 +39,7 @@ export const REMOTE_AUDIT_ACTIONS = [
39
39
  // publishing surface that builds already audit's counterpart: registry delete,
40
40
  // source upload, and deploy-to-cluster. `targetId` is the plugin id.
41
41
  'plugin.delete',
42
+ 'plugin.restore',
42
43
  'plugin.upload',
43
44
  'plugin.deploy',
44
45
  // Plugin bulk mutations (api/plugin bulk-plugin route) + DLQ purge (drops all
@@ -52,9 +53,11 @@ export const REMOTE_AUDIT_ACTIONS = [
52
53
  'pipeline.create',
53
54
  'pipeline.update',
54
55
  'pipeline.delete',
56
+ 'pipeline.restore',
55
57
  'pipeline_template.create',
56
58
  'pipeline_template.update',
57
59
  'pipeline_template.delete',
60
+ 'pipeline_template.restore',
58
61
  'pipeline.execution.start',
59
62
  'pipeline.execution.cancel',
60
63
  // CodePipeline ARN-registry config (api/pipeline registry route) — registering /
@@ -78,9 +81,11 @@ export const REMOTE_AUDIT_ACTIONS = [
78
81
  'compliance.rule.create',
79
82
  'compliance.rule.update',
80
83
  'compliance.rule.delete',
84
+ 'compliance.rule.restore',
81
85
  'compliance.policy.create',
82
86
  'compliance.policy.update',
83
87
  'compliance.policy.delete',
88
+ 'compliance.policy.restore',
84
89
  'compliance.scan-schedule.create',
85
90
  'compliance.scan-schedule.update',
86
91
  'compliance.scan-schedule.delete',
@@ -100,6 +105,7 @@ export const REMOTE_AUDIT_ACTIONS = [
100
105
  // (subject/type/scope), NEVER message body content.
101
106
  'message.announcement.create',
102
107
  'message.delete',
108
+ 'message.restore',
103
109
  // Billing (api/billing) — subscription + entitlement mutations, mirrored to the
104
110
  // central audit trail (these also write to the service-local billing_events
105
111
  // collection). `details` carry plan/tier/addon ids only — never card/payment
@@ -357,4 +363,4 @@ export function createRemoteAuditAccessor(serviceName) {
357
363
  emit: (event) => svc().emit(event),
358
364
  };
359
365
  }
360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDJCQUEyQjtJQUMzQixpRkFBaUY7SUFDakYsb0ZBQW9GO0lBQ3BGLDRCQUE0QjtJQUM1Qiw4QkFBOEI7SUFDOUIsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSxtREFBbUQ7SUFDbkQsYUFBYTtJQUNiLG9CQUFvQjtJQUNwQix3REFBd0Q7SUFDeEQsY0FBYztJQUNkLGdGQUFnRjtJQUNoRix1RUFBdUU7SUFDdkUsNkVBQTZFO0lBQzdFLGlGQUFpRjtJQUNqRiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQixpQ0FBaUM7SUFDakMsaUNBQWlDO0lBQ2pDLGlDQUFpQztJQUNqQywyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsYUFBYTtJQUNiLHVCQUF1QjtJQUN2QiwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUNuRSxxQkFBcUI7SUFDckIsd0VBQXdFO0lBQ3hFLCtFQUErRTtJQUMvRSxzRUFBc0U7SUFDdEUsb0RBQW9EO0lBQ3BELDZCQUE2QjtJQUM3QixnQkFBZ0I7SUFDaEIsZ0ZBQWdGO0lBQ2hGLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsZ0NBQWdDO0lBQ2hDLDZCQUE2QjtJQUM3Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsNEVBQTRFO0lBQzVFLCtFQUErRTtJQUMvRSxxRUFBcUU7SUFDckUscUJBQXFCO0lBQ3JCLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsK0NBQStDO0lBQy9DLDJCQUEyQjtJQUMzQix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIsNkVBQTZFO0lBQzdFLGtFQUFrRTtJQUNsRSwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQix5QkFBeUI7SUFDekIsNEJBQTRCO0lBQzVCLDRFQUE0RTtJQUM1RSxnRkFBZ0Y7SUFDaEYsaUZBQWlGO0lBQ2pGLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsdUJBQXVCO0lBQ3ZCLG1FQUFtRTtJQUNuRSx3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSwwQkFBMEI7SUFDMUIsY0FBYztDQUNOLENBQUM7QUFJWCxzRkFBc0Y7QUFDdEYsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWE7SUFDL0MsT0FBUSxvQkFBMEMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQTBFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQUFNLEdBQTRCLEVBQUU7SUFDMUUsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksVUFBVTtRQUNwRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzlFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7S0FDaEMsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUM7SUFFcEQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQXVCLEVBQUUsV0FBbUI7UUFDakUsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0YsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLGVBQWUsRUFBRSxVQUFVO1lBQzNCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxjQUFjLElBQUksVUFBVSxFQUFFO1NBQ3hELENBQUM7UUFDRixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUNsRyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3hHLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVILE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsNEVBQTRFO0lBQzVFLHlEQUF5RDtJQUN6RCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsS0FBSyxVQUFVLEtBQUs7UUFDbEIsSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRO1lBQUUsT0FBTztRQUMvQixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQztZQUNILFNBQVMsQ0FBQztnQkFDUixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQy9DLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUFFLE9BQU87Z0JBQy9CLE1BQU0sU0FBUyxHQUFzQixFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sTUFBTSxHQUFzQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDekIsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxZQUFZLEVBQUUsQ0FBQzt3QkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUFDLFNBQVM7b0JBQUMsQ0FBQztvQkFDbkQsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3pELElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdEIsV0FBVyxDQUFDLCtCQUErQixFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUMvRSxDQUFDO3lCQUFNLENBQUM7d0JBQ04sWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELDBFQUEwRTtnQkFDMUUsd0VBQXdFO2dCQUN4RSx3RUFBd0U7Z0JBQ3hFLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0QixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzVCLE9BQU8sQ0FBQywwQ0FBMEM7Z0JBQ3BELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkcsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksVUFBc0QsQ0FBQztJQUMzRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsNEVBQTRFO1FBQzVFLDZFQUE2RTtRQUM3RSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6QyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsQ0FBQztRQUNwRixnRUFBZ0U7UUFDL0QsVUFBZ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXO1lBQ3ZCLDJFQUEyRTtZQUMzRSx3RUFBd0U7WUFDeEUsTUFBTSxPQUFPLEdBQXFCO2dCQUNoQyxHQUFHLEtBQUs7Z0JBQ1IsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3hELGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLFVBQVUsRUFBRTthQUNyRCxDQUFDO1lBQ0YsS0FBSyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNQLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDcEcsSUFBSSxLQUFLO3dCQUFFLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyw0Q0FBNEM7Z0JBQ3ZFLENBQUM7cUJBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDakIsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sV0FBVyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQy9ELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxLQUFLO1lBQ0gsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUFDLENBQUM7UUFDeEUsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsV0FBbUIsRUFBRSxTQUFrQztJQUM1RixxQkFBcUIsQ0FBQyxDQUFDLElBQXFCLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNsRSxNQUFNLEVBQUUsY0FBYztRQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxXQUFXO1FBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtRQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7S0FDM0UsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFlRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsV0FBbUIsRUFBRSxNQUFNLEdBQTRCLEVBQUU7SUFDaEcsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO1FBQ2xELE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsV0FBbUI7SUFJM0QsSUFBSSxLQUFLLEdBQThCLElBQUksQ0FBQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxHQUF1QixFQUFFO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsT0FBTztRQUNMLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBQaXBlbGluZSBtdXRhdGlvbnMg4oCUIGVtaXR0ZWQgYnkgYXBpL3BpcGVsaW5lJ3Mgcm91dGUgaGFuZGxlcnNcbiAgLy8gKGNyZWF0ZS91cGRhdGUvZGVsZXRlICsgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiB0cmlnZ2VyL2NhbmNlbCkgYW5kXG4gIC8vIHBvc3RlZCB0byBwbGF0Zm9ybSdzIGBQT1NUIC9hdWRpdC9ldmVudHNgIGluZ2VzdC5cbiAgJ3BpcGVsaW5lLmNyZWF0ZScsXG4gICdwaXBlbGluZS51cGRhdGUnLFxuICAncGlwZWxpbmUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLmNyZWF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS51cGRhdGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5zdGFydCcsXG4gICdwaXBlbGluZS5leGVjdXRpb24uY2FuY2VsJyxcbiAgLy8gQ29kZVBpcGVsaW5lIEFSTi1yZWdpc3RyeSBjb25maWcgKGFwaS9waXBlbGluZSByZWdpc3RyeSByb3V0ZSkg4oCUIHJlZ2lzdGVyaW5nIC9cbiAgLy8gZGVyZWdpc3RlcmluZyB0aGUgZXh0ZXJuYWwgQ29kZVBpcGVsaW5lIHRoYXQgYmFja3MgYSBwaXBlbGluZSAoZGVwbG95LWFmZmVjdGluZykuXG4gICdwaXBlbGluZS5yZWdpc3RyeS5yZWdpc3RlcicsXG4gICdwaXBlbGluZS5yZWdpc3RyeS5kZXJlZ2lzdGVyJyxcbiAgLy8gUXVvdGEgYWRtaW5pc3RyYXRpb24gKGFwaS9xdW90YSkg4oCUIGEgc3VwZXJhZG1pbiByZXNldHRpbmcgYW4gb3JnJ3MgdXNhZ2VcbiAgLy8gY291bnRlciBvciBlZGl0aW5nIGl0cyB0aWVyIGxpbWl0cy4gYGFmZmVjdGVkT3JnSWRgIGlzIHRoZSBvcmcgY2hhbmdlZDtcbiAgLy8gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHF1b3RhVHlwZSArIG9sZC9uZXcgdmFsdWUuXG4gICdxdW90YS5yZXNldCcsXG4gICdxdW90YS5saW1pdC51cGRhdGUnLFxuICAvLyBBIHN1cGVyYWRtaW4gZGVsZXRpbmcgYW4gb3JnJ3MgZW50aXJlIHF1b3RhIGRvY3VtZW50LlxuICAncXVvdGEuZGVsZXRlJyxcbiAgLy8gQ29tcGxpYW5jZSBhZG1pbmlzdHJhdGlvbiAoYXBpL2NvbXBsaWFuY2UpIOKAlCB0aGUgZW5mb3JjZW1lbnQtcG9zdHVyZSBzdXJmYWNlLlxuICAvLyBBcHByb3ZpbmcvcmV2b2tpbmcgYW4gZXhlbXB0aW9uLCB0b2dnbGluZy9hdXRob3JpbmcvZGVsZXRpbmcgYSBydWxlLFxuICAvLyBhdXRob3JpbmcvZGVsZXRpbmcgYSBwb2xpY3ksIG1hbmFnaW5nIHNjYW4gc2NoZWR1bGVzLCBhcHBseWluZyBhIHRlbXBsYXRlLFxuICAvLyBvciBjYW5jZWxsaW5nIGEgcnVubmluZyBzY2FuLiBgdGFyZ2V0SWRgIGlzIHRoZSBydWxlL3BvbGljeS9leGVtcHRpb24vc2NhbiBpZC5cbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLmFwcHJvdmUnLFxuICAnY29tcGxpYW5jZS5leGVtcHRpb24ucmV2b2tlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS50b2dnbGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS50ZW1wbGF0ZS5hcHBseScsXG4gICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gQ3Jvc3MtcmVwbyB0YWcvaW1hZ2UgY29weSAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2FwaS9pbWFnZXMvY29weSkuIEFcbiAgLy8gY3Jvc3MtdGVuYW50IGNvcHkgbW92ZXMgZGF0YSBhY3Jvc3MgY3VzdG9tZXIgYm91bmRhcmllcywgc28gaXQgbmVlZHMgdGhlXG4gIC8vIGR1cmFibGUsIHRhbXBlci1ldmlkZW50IHRyYWlsIOKAlCBub3QganVzdCB0aGUgTG9raSBvcGVyYXRvciBsaW5lLlxuICAncmVnaXN0cnkuaW1hZ2UuY29weScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAvLyBCaWxsaW5nIChhcGkvYmlsbGluZykg4oCUIHN1YnNjcmlwdGlvbiArIGVudGl0bGVtZW50IG11dGF0aW9ucywgbWlycm9yZWQgdG8gdGhlXG4gIC8vIGNlbnRyYWwgYXVkaXQgdHJhaWwgKHRoZXNlIGFsc28gd3JpdGUgdG8gdGhlIHNlcnZpY2UtbG9jYWwgYmlsbGluZ19ldmVudHNcbiAgLy8gY29sbGVjdGlvbikuIGBkZXRhaWxzYCBjYXJyeSBwbGFuL3RpZXIvYWRkb24gaWRzIG9ubHkg4oCUIG5ldmVyIGNhcmQvcGF5bWVudFxuICAvLyBzZWNyZXRzIG9yIGFuIEFXUyBhY2NvdW50IGlkLlxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uY2FuY2VsJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmRlbGV0ZScsXG4gICdiaWxsaW5nLnRpZXIub3ZlcnJpZGUnLFxuICAnYmlsbGluZy5hZGRvbi5hZGQnLFxuICAnYmlsbGluZy5hZGRvbi5yZW1vdmUnLFxuICAvLyBTeXN0ZW0taW5pdGlhdGVkIHJlbW92YWwgb2YgYSB0aWVyLWluY2x1ZGVkIGFkZC1vbiBvbiBhIHBsYW4gdXBncmFkZSAodGhlXG4gIC8vIGFjY291bnQncyBuZXcgdGllciBub3cgYnVuZGxlcyB0aGUgZmVhdHVyZSkg4oCUIGRpc3RpbmN0IGZyb20gYSB1c2VyLWluaXRpYXRlZFxuICAvLyBgcmVtb3ZlYCBzbyBmaW5hbmNlIGNhbiB0ZWxsIGFuIGF1dG8tcHJ1bmUgZnJvbSBhIGN1c3RvbWVyIGFjdGlvbi5cbiAgJ2JpbGxpbmcuYWRkb24ucHJ1bmUnLFxuICAvLyBEaXNjb3VudHMgKGRvY3MvYmlsbGluZy1kaXNjb3VudHMubWQpIOKAlCBtaW50L2lzc3VlL2FwcGx5L3JlbW92ZS9yZXZva2Ugb2YgYVxuICAvLyBwcmljZSBjb3Vwb24gb3IgdXNhZ2UgY3JlZGl0LiBgZGV0YWlsc2AgY2FycnkgdGhlIGRpc2NvdW50IGlkICsga2luZC92YWx1ZVxuICAvLyBvbmx5LCBuZXZlciB0aGUgb3BhcXVlIHRva2VuIG9yIHNpZ25pbmcga2V5LlxuICAnYmlsbGluZy5kaXNjb3VudC5nZW5lcmF0ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50Lmlzc3VlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQuYXBwbHknLFxuICAnYmlsbGluZy5kaXNjb3VudC5yZW1vdmUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5yZXZva2UnLFxuICAvLyBQcm9tb3Rpb25zIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kI3Byb21vdGlvbnMpIOKAlCBydWxlLWRyaXZlbiBhdXRvLWdyYW50XG4gIC8vIGNhbXBhaWducy4gYGRldGFpbHNgIGNhcnJ5IHRoZSBwcm9tb3Rpb24gaWQgKyBjZW50cy9ldmVudCBvbmx5LlxuICAnYmlsbGluZy5wcm9tb3Rpb24uY3JlYXRlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLnVwZGF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi5yZXZva2UnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24uZ3JhbnQnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24uYWN0aXZhdGUnLFxuICAvLyBVc2FnZS1jcmVkaXQgcmVhbGl6YXRpb24g4oCUIGEgY3VzdG9tZXIvY29tcGxpYW5jZS12aXNpYmxlIHJlY29yZCBvZiBjcmVkaXRcbiAgLy8gbW92ZW1lbnQ6IGBjb25zdW1lZGAgKE1hcmtldHBsYWNlIG1ldGVyZWQgZHJhd2Rvd24pLCBgZXhoYXVzdGVkYCAoYmFsYW5jZSBoaXRcbiAgLy8gemVybyksIGFuZCBhIGNvbWJvIGVuZGluZy4gYGRldGFpbHNgIGNhcnJ5IGNlbnRzL2lkcyBvbmx5LCBubyBwYXltZW50IHNlY3JldHMuXG4gICdiaWxsaW5nLmNyZWRpdC5jb25zdW1lZCcsXG4gICdiaWxsaW5nLmNyZWRpdC5leGhhdXN0ZWQnLFxuICAnYmlsbGluZy5jb21iby5leHBpcmVkJyxcbiAgLy8gRGVuaWVkIGF1dGhvcml6YXRpb24gYXR0ZW1wdCDigJQgZW1pdHRlZCBiZXN0LWVmZm9ydCBieSB0aGUgc2hhcmVkXG4gIC8vIGByZXF1aXJlUGVybWlzc2lvbmAgLyBgcmVxdWlyZVN5c3RlbUFkbWluYCBnYXRlIHdoZW4gYSBzdGF0ZS1jaGFuZ2luZ1xuICAvLyAobm9uLUdFVCkgcmVxdWVzdCBpcyByZWplY3RlZCwgc28gcHJvYmluZy9lc2NhbGF0aW9uIGF0dGVtcHRzIGFyZSB2aXNpYmxlXG4gIC8vIHJhdGhlciB0aGFuIGludmlzaWJsZS4gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gKyBwYXRoO1xuICAvLyBgb3V0Y29tZWAgaXMgJ2ZhaWx1cmUnLlxuICAnYXV0aHouZGVuaWVkJyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFJlbW90ZUF1ZGl0QWN0aW9uID0gdHlwZW9mIFJFTU9URV9BVURJVF9BQ1RJT05TW251bWJlcl07XG5cbi8qKiBXaGV0aGVyIGB2YWx1ZWAgaXMgYW4gYWN0aW9uIGEgcmVtb3RlIHNlcnZpY2UgbWF5IGVtaXQgKHRoZSBpbmdlc3QgYWxsb3ctbGlzdCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZW1vdGVBdWRpdEFjdGlvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUmVtb3RlQXVkaXRBY3Rpb24ge1xuICByZXR1cm4gKFJFTU9URV9BVURJVF9BQ1RJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRFdmVudCB7XG4gIGFjdGlvbjogUmVtb3RlQXVkaXRBY3Rpb247XG4gIGFjdG9ySWQ6IHN0cmluZztcbiAgYWN0b3JFbWFpbD86IHN0cmluZztcbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIGFmZmVjdGVkT3JnSWQ/OiBzdHJpbmc7XG4gIHRhcmdldFR5cGU/OiBzdHJpbmc7XG4gIHRhcmdldElkPzogc3RyaW5nO1xuICAvKipcbiAgICogRGlkIHRoZSBhdWRpdGVkIGFjdGlvbiBzdWNjZWVkIG9yIGZhaWw/IERlZmF1bHRzIHRvICdzdWNjZXNzJyB3aGVuIG9taXR0ZWRcbiAgICogKHRoZSBwbGF0Zm9ybSBpbmdlc3QgYXBwbGllcyB0aGUgc2FtZSBkZWZhdWx0KS4gRGVuaWVkLWF1dGh6IGV2ZW50cyBzZXRcbiAgICogJ2ZhaWx1cmUnIHNvIGEgcmV2aWV3ZXIgY2FuIGZpbHRlciBhdHRlbXB0cyBmcm9tIGNvbXBsZXRlZCBhY3Rpb25zLlxuICAgKi9cbiAgb3V0Y29tZT86ICdzdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqXG4gICAqIFdoZW4gdGhlIGF1ZGl0ZWQgYWN0aW9uIGFjdHVhbGx5IE9DQ1VSUkVEIChJU08tODYwMSksIHN0YW1wZWQgYXQgZW1pc3Npb24uXG4gICAqIFRoZSBwbGF0Zm9ybSBzdG9yZXMgdGhpcyBmb3IgcmV2aWV3ZXJzOyBpdCBpcyBOT1QgdGhlIGNoYWluLW9yZGVyaW5nIGZpZWxkXG4gICAqICh0aGUgdGFtcGVyLWV2aWRlbnQgY2hhaW4gb3JkZXJzIGJ5IGluZ2VzdC9gY3JlYXRlZEF0YCkuIEl0IG1hdHRlcnMgZm9yXG4gICAqIFNQT09MRUQgZXZlbnRzOiBvbmUgYnVmZmVyZWQgZHVyaW5nIGEgcGxhdGZvcm0gb3V0YWdlIGlzIHJlLWRlbGl2ZXJlZCDigJQgYW5kXG4gICAqIHNvIGNoYWluZWQg4oCUIGxhdGVyLCBidXQgYG9jY3VycmVkQXRgIHByZXNlcnZlcyB3aGVuIGl0IHJlYWxseSBoYXBwZW5lZC5cbiAgICovXG4gIG9jY3VycmVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdGFibGUgcGVyLWVtaXNzaW9uIGRlZHVwIGtleSAoYWxzbyBzZW50IGFzIHRoZSBgSWRlbXBvdGVuY3ktS2V5YCBoZWFkZXIgdGhlXG4gICAqIHBsYXRmb3JtIGluZ2VzdCBkZWR1cHMgb24pLiBTdGFtcGVkIGJ5IGByZWNvcmQoKWAgYW5kIGNhcnJpZWQgb24gdGhlIHNwb29sZWRcbiAgICogY29weSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIGxhdGVyIHJlLWRlbGl2ZXJ5IGNvbGxhcHNlIHRvIE9ORSBzdG9yZWQgcm93LlxuICAgKi9cbiAgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDbGllbnQgZm9yIFBPU1RpbmcgYXVkaXQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGAvYXVkaXQtZXZlbnRzYCBpbmdlc3RcbiAqIGVuZHBvaW50LiBNaW50cyBhIGZyZXNoIHNlcnZpY2UgdG9rZW4gcGVyIGNhbGwgKDUgbWluIFRUTCkgIHRoZXJlJ3Mgbm9cbiAqIG1lYW5pbmdmdWwgY2FjaGluZyBiZW5lZml0IHdoZW4gZW1pc3Npb25zIGFyZSBzcGFyc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRDbGllbnQge1xuICAvKipcbiAgICogRmlyZS1hbmQtZm9yZ2V0IGF1ZGl0IGVtaXNzaW9uLiBGYWlsdXJlcyBhcmUgbG9nZ2VkIGF0IHdhcm4gbGV2ZWwgYnV0XG4gICAqIG5ldmVyIHRocm93biAgdGhlIG9yaWdpbmF0aW5nIGFjdGlvbiAoZS5nLiBhIHBsdWdpbiBidWlsZCkgaGFzIGl0c1xuICAgKiBvd24gc3VjY2Vzcy9mYWlsdXJlIHBhdGggdGhhdCBzaG91bGRuJ3QgZ2V0IHBvbGx1dGVkIGJ5IGEgZmxha3kgYXVkaXRcbiAgICogZG93bnN0cmVhbS4gV2hlbiBhIHtAbGluayBBdWRpdFNwb29sfSBpcyBjb25maWd1cmVkLCBhbiBlbWlzc2lvbiB0aGF0XG4gICAqIGV4aGF1c3RzIGl0cyBsaXZlIHJldHJpZXMgaXMgYnVmZmVyZWQgYW5kIHJlLWRlbGl2ZXJlZCBsYXRlciBpbnN0ZWFkIG9mXG4gICAqIGJlaW5nIGRyb3BwZWQuXG4gICAqL1xuICByZWNvcmQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogU3RvcCB0aGUgYmFja2dyb3VuZCBzcG9vbC1kcmFpbiB0aW1lciAoaWYgYW55KS4gU2FmZSB0byBjYWxsIHJlcGVhdGVkbHkuICovXG4gIGNsb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHJlbW90ZSBhdWRpdCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRDbGllbnRDb25maWcge1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9IT1NUIG9yICdwbGF0Zm9ybScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBQTEFURk9STV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBtcyAoZGVmYXVsdCAzMDAwICBhdWRpdCBzaG91bGRuJ3QgYmxvY2sgdGhlIHdvcmtlcikuICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkdXJhYmxlIGJ1ZmZlci4gV2hlbiBzZXQsIGFuIGVtaXNzaW9uIHRoYXQgZXhoYXVzdHMgaXRzIGxpdmUgcmV0cnlcbiAgICogYnVkZ2V0IChzdXN0YWluZWQgcGxhdGZvcm0gb3V0YWdlKSBpcyBzcG9vbGVkIGFuZCByZS1kZWxpdmVyZWQg4oCUIG9uIHRoZSBuZXh0XG4gICAqIHN1Y2Nlc3NmdWwgZW1pc3Npb24gYW5kIG9uIGEgcGVyaW9kaWMgdGltZXIg4oCUIGluc3RlYWQgb2YgYmVpbmcgbG9zdC5cbiAgICovXG4gIHNwb29sPzogQXVkaXRTcG9vbDtcbiAgLyoqIFNwb29sLWRyYWluIGludGVydmFsIG1zIChkZWZhdWx0IDMwXzAwMCkuIE9ubHkgdXNlZCB3aGVuIGBzcG9vbGAgaXMgc2V0LiAqL1xuICBkcmFpbkludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBNYXggZW50cmllcyBkcmFpbmVkIHBlciBzd2VlcCAoZGVmYXVsdCAxMDApLiAqL1xuICBkcmFpbkJhdGNoU2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSByZW1vdGUtYXVkaXQgY2xpZW50IHRhcmdldGVkIGF0IHRoZSBwbGF0Zm9ybSBzZXJ2aWNlLlxuICpcbiAqIFVzZWQgYnkgYXBpL3BsdWdpbidzIGJ1aWxkIHdvcmtlciB0byBwdXNoIGBwbHVnaW4uYnVpbGQuKmAgZXZlbnRzIGludG9cbiAqIHRoZSBwbGF0Zm9ybSdzIE1vbmdvREIgYGF1ZGl0X2V2ZW50c2AgY29sbGVjdGlvbi4gT3RoZXIgc2VydmljZXNcbiAqIHdpdGggd29ya2VyLXN0eWxlIGVtaXR0ZXJzIGNhbiB1c2UgdGhlIHNhbWUgY2xpZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhdWRpdENsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KCk7XG4gKiBhdWRpdENsaWVudC5yZWNvcmQoe1xuICogYWN0aW9uOiAncGx1Z2luLmJ1aWxkLmNvbXBsZXRlZCcsXG4gKiBhY3RvcklkOiAndXNlci0xMjMnLFxuICogb3JnSWQ6ICdvcmctYWNtZScsXG4gKiB0YXJnZXRUeXBlOiAncGx1Z2luJyxcbiAqIHRhcmdldElkOiAncGx1Z2luLWFiYycsXG4gKiBkZXRhaWxzOiB7IG5hbWU6ICdteS1wbHVnaW4nLCB2ZXJzaW9uOiAnMS4wLjAnIH0sXG4gKiB9LCAncGx1Z2luJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KGNvbmZpZzogUmVtb3RlQXVkaXRDbGllbnRDb25maWcgPSB7fSk6IFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX0hPU1QgPz8gJ3BsYXRmb3JtJyxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBwYXJzZUludChwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX1BPUlQgPz8gJzMwMDAnLCAxMCksXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMzAwMCxcbiAgfTtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChzZXJ2aWNlQ29uZmlnKTtcbiAgY29uc3Qgc3Bvb2wgPSBjb25maWcuc3Bvb2w7XG4gIGNvbnN0IGRyYWluQmF0Y2hTaXplID0gY29uZmlnLmRyYWluQmF0Y2hTaXplID8/IDEwMDtcblxuICAvKipcbiAgICogQXR0ZW1wdCBPTkUgbGl2ZSBkZWxpdmVyeS4gUmVzb2x2ZXMgYHRydWVgIG9uIGEgMnh4IGFjY2VwdCwgYGZhbHNlYCBvbiBhbnlcbiAgICogbm9uLTJ4eCAvIHRocm93biBlcnJvciAodGhlIGh0dHAtY2xpZW50IGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlIHJldHJ5XG4gICAqIGJ1ZGdldCkuIEEgc3RhYmxlIHBlci1lbWlzc2lvbiBgSWRlbXBvdGVuY3ktS2V5YCBtYWtlcyB0aGlzIG5vbi1pZGVtcG90ZW50XG4gICAqIFBPU1QgcmV0cnktc2FmZSBhbmQgbGV0cyB0aGUgcGxhdGZvcm0gaW5nZXN0IGRlZHVwIGEgcmUtZGVsaXZlcmVkIGV2ZW50XG4gICAqIGluc3RlYWQgb2Ygd3JpdGluZyBhIGR1cGxpY2F0ZSBhdWRpdCByb3cgKGFuZCBkdXBsaWNhdGUgY2hhaW4gbGluaykuXG4gICAqIGBJZGVtcG90ZW5jeS1LZXlgIGlzIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnQgc28gYSBTUE9PTEVEIHJlLWRlbGl2ZXJ5IHJldXNlc1xuICAgKiB0aGUgc2FtZSBrZXkgYXMgaXRzIG9yaWdpbmFsIGxpdmUgYXR0ZW1wdCDigJQgdGhlIHR3byBjb2xsYXBzZSB0byBvbmUgcm93LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZGVsaXZlcihldmVudDogUmVtb3RlQXVkaXRFdmVudCwgc2VydmljZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7IHNlcnZpY2VOYW1lLCBvcmdJZDogZXZlbnQub3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQXV0aG9yaXphdGlvbic6IGF1dGhIZWFkZXIsXG4gICAgICAnSWRlbXBvdGVuY3ktS2V5JzogZXZlbnQuaWRlbXBvdGVuY3lLZXkgPz8gcmFuZG9tVVVJRCgpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoJy9hdWRpdC9ldmVudHMnLCBldmVudCwgeyBoZWFkZXJzLCAuLi5BVURJVF9SRVFVRVNUX09QVElPTlMgfSk7XG4gICAgICBjb25zdCBvayA9ICEhcmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDMwMDtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3Qgbm9uLW9rJywgeyBhY3Rpb246IGV2ZW50LmFjdGlvbiwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2s7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignUmVtb3RlIGF1ZGl0IGluZ2VzdCB0aHJldycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplIHNwb29sIGRyYWlucyBzbyBhIHBlcmlvZGljIHRpY2sgYW5kIGFuIG9uLXN1Y2Nlc3MgZHJhaW4gY2FuJ3QgYm90aFxuICAvLyBwdWxsIHRoZSBzYW1lIGJhdGNoLiBTdG9wcyBlYXJseSB0aGUgbW9tZW50IGEgcmUtZGVsaXZlcnkgZmFpbHMgKHBsYXRmb3JtXG4gIC8vIHN0aWxsIGRvd24pIHNvIHdlIGRvbid0IGhhbW1lciBpdCBvciBjaHVybiB0aGUgYnVmZmVyLlxuICBsZXQgZHJhaW5pbmcgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gZHJhaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzcG9vbCB8fCBkcmFpbmluZykgcmV0dXJuO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGF3YWl0IHNwb29sLnRha2UoZHJhaW5CYXRjaFNpemUpO1xuICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGRlbGl2ZXJlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmFpbGVkOiBBdWRpdFNwb29sRW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhdGZvcm1Eb3duID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBpZiAocGxhdGZvcm1Eb3duKSB7IGZhaWxlZC5wdXNoKGVudHJ5KTsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IGRlbGl2ZXIoZW50cnkuZXZlbnQsIGVudHJ5LnNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIGRlbGl2ZXJlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWRlbGl2ZXJlZF90b3RhbCcsIHsgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsYXRmb3JtRG93biA9IHRydWU7XG4gICAgICAgICAgICBmYWlsZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFja25vd2xlZGdlIHRoZSBkZWxpdmVyZWQgcHJlZml4IHNvIGl0IGNsZWFycyB0aGUgaW4tcHJvZ3Jlc3MgbGlzdDsgdGhlXG4gICAgICAgIC8vIHJlbGlhYmxlIHRha2UoKSBtb3ZlZCB0aGUgd2hvbGUgYmF0Y2ggdGhlcmUsIHNvIHVuYWNrZWQgc3Vydml2b3JzIGFyZVxuICAgICAgICAvLyByZWNsYWltZWQgYnkgcmVjb3ZlcigpIGFmdGVyIGEgY3Jhc2ggcmF0aGVyIHRoYW4gYmVpbmcgc2lsZW50bHkgbG9zdC5cbiAgICAgICAgaWYgKGRlbGl2ZXJlZC5sZW5ndGggPiAwKSBhd2FpdCBzcG9vbC5hY2soZGVsaXZlcmVkKTtcbiAgICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3Bvb2wucmVxdWV1ZShmYWlsZWQpO1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgZG93biDigJQgdHJ5IGFnYWluIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIGRyYWluIGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgZHJhaW5UaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICBpZiAoc3Bvb2wpIHtcbiAgICAvLyBSZWNsYWltIGFueSBiYXRjaCBzdHJhbmRlZCBvbiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdCBieSBhIHByaW9yIGNyYXNoLCB0aGVuXG4gICAgLy8gYXR0ZW1wdCB0byBmbHVzaCBpdC4gQm90aCBhcmUgYmVzdC1lZmZvcnQgKHRoZSBzcG9vbCBzd2FsbG93cyBpdHMgZXJyb3JzKS5cbiAgICB2b2lkIHNwb29sLnJlY292ZXIoKS50aGVuKCgpID0+IGRyYWluKCkpO1xuICAgIGRyYWluVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IHZvaWQgZHJhaW4oKTsgfSwgY29uZmlnLmRyYWluSW50ZXJ2YWxNcyA/PyAzMF8wMDApO1xuICAgIC8vIERvbid0IGxldCB0aGUgZHJhaW4gdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBvbiBzaHV0ZG93bi5cbiAgICAoZHJhaW5UaW1lciBhcyB1bmtub3duIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgLy8gU3RhbXAgd2hlbiB0aGUgYWN0aW9uIGFjdHVhbGx5IG9jY3VycmVkIChzdXJ2aXZlcyBzcG9vbCBkZWxheSkgYW5kIHBpbiBhXG4gICAgICAvLyBzdGFibGUgaWRlbXBvdGVuY3kga2V5IHNvIGEgbGl2ZSBhdHRlbXB0IGFuZCBpdHMgc3Bvb2xlZCByZXRyeSBkZWR1cC5cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFJlbW90ZUF1ZGl0RXZlbnQgPSB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBvY2N1cnJlZEF0OiBldmVudC5vY2N1cnJlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICB2b2lkIGRlbGl2ZXIoc3RhbXBlZCwgc2VydmljZU5hbWUpLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9lbWl0dGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgb3V0Y29tZTogc3RhbXBlZC5vdXRjb21lID8/ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICBpZiAoc3Bvb2wpIHZvaWQgZHJhaW4oKTsgLy8gcGxhdGZvcm0gaXMgcmVhY2hhYmxlIOKAlCBmbHVzaCBhbnkgYmFja2xvZ1xuICAgICAgICB9IGVsc2UgaWYgKHNwb29sKSB7XG4gICAgICAgICAgdm9pZCBzcG9vbC5lbnF1ZXVlKHsgZXZlbnQ6IHN0YW1wZWQsIHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9zZSgpIHtcbiAgICAgIGlmIChkcmFpblRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoZHJhaW5UaW1lcik7IGRyYWluVGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBzdGFuZGFyZCBgYXV0aHouZGVuaWVkYCBzaW5rIHVzZWQgYnkgZXZlcnkgcmVtb3RlLWF1ZGl0IHNlcnZpY2VcbiAqIChwaXBlbGluZSwgcGx1Z2luLCBjb21wbGlhbmNlLCBxdW90YSwgbWVzc2FnZSwgYmlsbGluZywgcmVwb3J0aW5nLCDigKYpLlxuICpcbiAqIFRoZSBzaGFyZWQgYHJlcXVpcmVBdXRoYCBnYXRlIGZvcndhcmRzIGVhY2ggREVOSUVEIHN0YXRlLWNoYW5naW5nIHJlcXVlc3QgdG9cbiAqIHRoZSBhdWRpdG9yIHNldCB2aWEge0BsaW5rIHNldEF1dGh6RGVuaWFsQXVkaXRvcn07IHRoaXMgd2lyZXMgdGhhdCBob29rIHRvIHRoZVxuICogc2VydmljZSdzIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH0sIGZvcndhcmRpbmcgYSBgZmFpbHVyZWAtb3V0Y29tZVxuICogYGF1dGh6LmRlbmllZGAgZXZlbnQgc28gcHJvYmluZyAvIHByaXZpbGVnZS1lc2NhbGF0aW9uIGF0dGVtcHRzIGxlYXZlIGEgdHJhaWwuXG4gKiBFbWlzc2lvbiBpcyBmaXJlLWFuZC1mb3JnZXQgKHRoZSBjbGllbnQgbmV2ZXIgdGhyb3dzKS4gYGdldENsaWVudGAgaXMgYSBnZXR0ZXJcbiAqIHNvIHRoZSBjbGllbnQgc3RheXMgbGF6aWx5IGNvbnN0cnVjdGVkIChzZXJ2aWNlcyBtZW1vaXplIGl0IG9uIGZpcnN0IHVzZSkuXG4gKlxuICogUGxhdGZvcm0gaXMgaW50ZW50aW9uYWxseSBOT1QgYSBjYWxsZXIg4oCUIGl0IGlzIHRoZSBhdWRpdCBhdXRob3JpdHkgYW5kIHdyaXRlc1xuICogYGF1dGh6LmRlbmllZGAgc3RyYWlnaHQgdG8gaXRzIGxvY2FsIHN0b3JlICh3aXRoIGBhZmZlY3RlZE9yZ0lkYCksIG5vdCB0aHJvdWdoXG4gKiBhIFJlbW90ZUF1ZGl0Q2xpZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lyZUF1dGh6RGVuaWFsQXVkaXRvcihzZXJ2aWNlTmFtZTogc3RyaW5nLCBnZXRDbGllbnQ6ICgpID0+IFJlbW90ZUF1ZGl0Q2xpZW50KTogdm9pZCB7XG4gIHNldEF1dGh6RGVuaWFsQXVkaXRvcigoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiBnZXRDbGllbnQoKS5yZWNvcmQoe1xuICAgIGFjdGlvbjogJ2F1dGh6LmRlbmllZCcsXG4gICAgYWN0b3JJZDogaW5mby5hY3RvcklkID8/ICdhbm9ueW1vdXMnLFxuICAgIGFjdG9yRW1haWw6IGluZm8uYWN0b3JFbWFpbCxcbiAgICBvcmdJZDogaW5mby5vcmdJZCxcbiAgICBvdXRjb21lOiAnZmFpbHVyZScsXG4gICAgZGV0YWlsczogeyBtZXRob2Q6IGluZm8ubWV0aG9kLCBwYXRoOiBpbmZvLnBhdGgsIHJlcXVpcmVkOiBpbmZvLnJlcXVpcmVkIH0sXG4gIH0sIHNlcnZpY2VOYW1lKSk7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlLXNjb3BlZCBhdWRpdCBjbGllbnQ6IGEgZHVyYWJsZS1zcG9vbC1iYWNrZWQge0BsaW5rIFJlbW90ZUF1ZGl0Q2xpZW50fVxuICogd2l0aCB0aGUgc2VydmljZSBuYW1lIHByZS1ib3VuZCBmb3IgZW1pc3Npb24uIFJlcGxhY2VzIHRoZSBwZXItc2VydmljZVxuICogYm9pbGVycGxhdGUgb2YgYGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgc3Bvb2w6IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCgpID8/IHVuZGVmaW5lZCB9KWBcbiAqIHBsdXMgYSBoYW5kLXJvbGxlZCBgZW1pdDxTZXJ2aWNlPkF1ZGl0YCB3cmFwcGVyIHRoYXQgcmVwZWF0cyB0aGUgc2VydmljZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VBdWRpdENsaWVudCB7XG4gIC8qKiBFbWl0IGFuIGF1ZGl0IGV2ZW50IHdpdGggdGhlIHNlcnZpY2UgbmFtZSBib3VuZC4gRmlyZS1hbmQtZm9yZ2V0LiAqL1xuICBlbWl0KGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50KTogdm9pZDtcbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHJlbW90ZSBjbGllbnQg4oCUIGZvciBgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmAgKyBgY2xvc2UoKWAuICovXG4gIHJlYWRvbmx5IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBzZXJ2aWNlJ3MgYXVkaXQgY2xpZW50OiBhIFJlbW90ZUF1ZGl0Q2xpZW50IHdpcmVkIHRvIHRoZSBkdXJhYmxlIFJlZGlzXG4gKiBzcG9vbCAoZnJvbSBhbWJpZW50IGVudjsgbnVsbCDihpIgbm8gc3Bvb2wpIHdpdGggYHNlcnZpY2VOYW1lYCBib3VuZC4gQ29uc3RydWN0XG4gKiBPTkNFIHBlciBwcm9jZXNzIOKAlCBtZW1vaXplIGJlaGluZCBhIGxhenkgYGdldEF1ZGl0Q2xpZW50KClgIGluIHRoZSBzZXJ2aWNlJ3NcbiAqIGBzZXJ2aWNlcy9hdWRpdC50c2AuIFBhc3MgYGNvbmZpZy5zcG9vbGAgdG8gb3ZlcnJpZGUgdGhlIGVudi1kZXJpdmVkIHNwb29sXG4gKiAoZS5nLiByZXVzZSBhIHNlcnZpY2UncyBleGlzdGluZyBpb3JlZGlzIGNvbm5lY3Rpb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmljZUF1ZGl0Q2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbmZpZzogUmVtb3RlQXVkaXRDbGllbnRDb25maWcgPSB7fSk6IFNlcnZpY2VBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sID8/IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCgpID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoeyAuLi5jb25maWcsIHNwb29sIH0pO1xuICByZXR1cm4ge1xuICAgIGVtaXQ6IChldmVudCkgPT4gY2xpZW50LnJlY29yZChldmVudCwgc2VydmljZU5hbWUpLFxuICAgIGNsaWVudCxcbiAgfTtcbn1cblxuLyoqXG4gKiBMYXppbHktY29uc3RydWN0ZWQgcmVtb3RlLWF1ZGl0IGFjY2Vzc29yIGZvciBhIHNlcnZpY2UuIEV2ZXJ5IHNlcnZpY2Unc1xuICogYHNlcnZpY2VzL2F1ZGl0LnRzYCB1c2VkIHRvIGhhbmQtcm9sbCB0aGUgc2FtZSBtb2R1bGUgc2luZ2xldG9uIChhIGBsZXQgYXVkaXRgXG4gKiArIGBzdmMoKWAgdGhhdCBidWlsZHMgYSB7QGxpbmsgU2VydmljZUF1ZGl0Q2xpZW50fSBvbiBmaXJzdCB1c2UsIHRoZW4gYVxuICogYGdldEF1ZGl0Q2xpZW50KClgIHJldHVybmluZyBgLmNsaWVudGAgYW5kIGFuIGBlbWl0KGV2ZW50KWAgZm9yd2FyZGluZyB0b1xuICogYC5lbWl0YCkuIFRoaXMgcGFja2FnZXMgdGhhdCBwYXR0ZXJuIGluIE9ORSBwbGFjZSBzbyBlYWNoIHNlcnZpY2UncyBhdWRpdFxuICogd2lyaW5nIGlzIGEgb25lLWxpbmVyIGFuZCBjYW4ndCBkcmlmdC5cbiAqXG4gKiBMYXp5IG9uIHB1cnBvc2U6IHRoZSB1bmRlcmx5aW5nIGNsaWVudCB3aXJlcyBhbiBlbnYtUmVkaXMgYXVkaXQgc3Bvb2wsIHNvXG4gKiBidWlsZGluZyBpdCBhdCBpbXBvcnQgdGltZSB3b3VsZCBmb3JjZSB0aGF0IGNvbm5lY3Rpb24gd2hlcmV2ZXIgdGhlIG1vZHVsZSBpc1xuICogbWVyZWx5IGltcG9ydGVkIChlLmcuIHRlc3RzKS4gYGdldEF1ZGl0Q2xpZW50YCBpcyBwYXNzZWQgdG9cbiAqIGB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yYDsgYGVtaXRgIGJhY2tzIHRoZSBwZXItc2VydmljZSBgZW1pdFhBdWRpdGAgaGVscGVycy5cbiAqIEJvdGggc3RheSBGSVJFLUFORC1GT1JHRVQgKHJlY29yZCBuZXZlciB0aHJvd3MgLyBpcyBub3QgYXdhaXRlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdEFjY2Vzc29yKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB7XG4gIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudDtcbiAgZW1pdDogKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50KSA9PiB2b2lkO1xufSB7XG4gIGxldCBhdWRpdDogU2VydmljZUF1ZGl0Q2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHN2YyA9ICgpOiBTZXJ2aWNlQXVkaXRDbGllbnQgPT4ge1xuICAgIGlmICghYXVkaXQpIGF1ZGl0ID0gY3JlYXRlU2VydmljZUF1ZGl0Q2xpZW50KHNlcnZpY2VOYW1lKTtcbiAgICByZXR1cm4gYXVkaXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgZ2V0QXVkaXRDbGllbnQ6ICgpID0+IHN2YygpLmNsaWVudCxcbiAgICBlbWl0OiAoZXZlbnQpID0+IHN2YygpLmVtaXQoZXZlbnQpLFxuICB9O1xufVxuIl19
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==
package/package.json CHANGED
@@ -87,7 +87,7 @@
87
87
  "access": "public",
88
88
  "registry": "https://registry.npmjs.org/"
89
89
  },
90
- "version": "3.4.108",
90
+ "version": "3.4.110",
91
91
  "bugs": {
92
92
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
93
93
  },