@pipeline-builder/api-server 3.4.129 → 3.4.131

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
  import type { OpenApiSpecOptions } from '@pipeline-builder/api-core';
2
2
  import { type Express } from 'express';
3
+ import { type IdempotencyStore } from './idempotency-middleware.js';
3
4
  import { SSEManager } from '../http/sse-connection-manager.js';
4
5
  /**
5
6
  * Options for creating an Express application
@@ -31,6 +32,14 @@ export interface CreateAppOptions {
31
32
  openApiOptions?: OpenApiSpecOptions;
32
33
  /** Enable gzip/deflate response compression (default: true) */
33
34
  enableCompression?: boolean;
35
+ /**
36
+ * Idempotency replay-cache backend for keyed mutation retries. When omitted,
37
+ * createApp auto-wires the shared env Redis store (multi-replica dedup) if
38
+ * Redis is configured, else keeps the in-memory default (single-replica).
39
+ * Pass an explicit store to inject a bespoke backend (e.g. a service's own
40
+ * ioredis connection).
41
+ */
42
+ idempotencyStore?: IdempotencyStore;
34
43
  /**
35
44
  * Extra warmup callbacks invoked by `GET /warmup` in addition to the
36
45
  * default Postgres ping. Use for services that depend on Mongo, Redis,
@@ -11,9 +11,11 @@ import helmet from 'helmet';
11
11
  import swaggerUi from 'swagger-ui-express';
12
12
  import { v7 as uuid } from 'uuid';
13
13
  import { etagMiddleware } from './etag-middleware.js';
14
+ import { createEnvRedisIdempotencyStore, setIdempotencyStore } from './idempotency-middleware.js';
14
15
  import { metricsMiddleware, metricsHandler, incCounter } from './metrics.js';
15
16
  import { readinessGuard } from './readiness.js';
16
17
  import { SSEManager, SSE_REQUEST_ID_RE } from '../http/sse-connection-manager.js';
18
+ import { createEnvRedisTicketStore } from '../http/sse-ticket-store.js';
17
19
  // Wire api-core's counter shim to the real prom-client registry. This is
18
20
  // a no-op until incCounter is called for the first time (lazy registration
19
21
  // in metrics.ts), and lets api-core helpers like the quota client record
@@ -47,11 +49,25 @@ setCounterEmitter(incCounter);
47
49
  * ```
48
50
  */
49
51
  export function createApp(options = {}) {
50
- const { enableCors = true, enableHelmet = true, enableRateLimit = true, enableJsonBody = true, jsonLimit = '1mb', enableUrlEncoded = true, urlEncodedLimit = '1mb', sseManager = new SSEManager(), checkDependencies, enableOpenApi = true, openApiOptions, enableCompression = true, warmupHooks = [], } = options;
52
+ const { enableCors = true, enableHelmet = true, enableRateLimit = true, enableJsonBody = true, jsonLimit = '1mb', enableUrlEncoded = true, urlEncodedLimit = '1mb',
53
+ // Default SSE manager wired to the shared env Redis ticket/ownership store
54
+ // when Redis is configured (multi-pod correctness + cross-service stream
55
+ // ownership), else the in-memory default. A caller-supplied `sseManager`
56
+ // skips this entirely.
57
+ sseManager = new SSEManager({ ticketStore: createEnvRedisTicketStore() ?? undefined }), checkDependencies, enableOpenApi = true, openApiOptions, enableCompression = true, warmupHooks = [], idempotencyStore, } = options;
51
58
  // Fail fast if JWT_SECRET is not configured — prevents silent auth failures at runtime
52
59
  if (!process.env.JWT_SECRET) {
53
60
  throw new Error('JWT_SECRET environment variable is required. Set it before starting the server.');
54
61
  }
62
+ // Wire the idempotency replay-cache backend used by the post-auth route
63
+ // factories (createProtectedRoute / createAuthenticatedWithOrgRoute). Prefer
64
+ // an explicitly injected store; otherwise auto-construct from the shared env
65
+ // Redis so keyed mutation retries dedupe across replicas. Falls back to the
66
+ // in-memory default when no Redis is configured (single-replica correctness).
67
+ const resolvedIdempotencyStore = idempotencyStore ?? createEnvRedisIdempotencyStore();
68
+ if (resolvedIdempotencyStore) {
69
+ setIdempotencyStore(resolvedIdempotencyStore);
70
+ }
55
71
  // OpenTelemetry is NOT initialized here: by the time createApp runs, express
56
72
  // and http have already been required, so the auto-instrumentation hooks
57
73
  // would have nothing to patch (no inbound span → no trace id). Tracing is
@@ -257,7 +273,7 @@ export function createApp(options = {}) {
257
273
  // the JWT out of query strings / access logs while enforcing org ownership,
258
274
  // per-subject authorization, and the per-org connection cap on the stream.
259
275
  // Mirrors the message-service notifications SSE ticket exchange.
260
- app.post('/logs/ticket', requireAuth, (req, res) => {
276
+ app.post('/logs/ticket', requireAuth, async (req, res) => {
261
277
  const orgId = req.user?.organizationId?.toLowerCase();
262
278
  if (!orgId) {
263
279
  sendError(res, 400, 'Token missing organization', ErrorCode.VALIDATION_ERROR);
@@ -272,9 +288,14 @@ export function createApp(options = {}) {
272
288
  sendError(res, 400, 'Missing or invalid requestId', ErrorCode.VALIDATION_ERROR);
273
289
  return;
274
290
  }
275
- const result = sseManager.createTicket(orgId, requestId);
291
+ const result = await sseManager.createTicket(orgId, requestId);
276
292
  if (!result.ok) {
277
- if (result.reason === 'org-limit') {
293
+ if (result.reason === 'forbidden') {
294
+ // The subject is owned by another org — do not confirm it exists; a plain
295
+ // 403 is enough and leaks nothing about which requestIds are live.
296
+ sendError(res, 403, 'Not authorized for this log stream', ErrorCode.INSUFFICIENT_PERMISSIONS);
297
+ }
298
+ else if (result.reason === 'org-limit') {
278
299
  sendError(res, 429, 'Too many log stream tickets issued', ErrorCode.QUOTA_EXCEEDED);
279
300
  }
280
301
  else {
@@ -289,4 +310,4 @@ export function createApp(options = {}) {
289
310
  app.get('/logs/:requestId', sseManager.middleware());
290
311
  return { app, sseManager };
291
312
  }
292
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqTixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sT0FBTyxFQUFFLEVBQWdFLE1BQU0sU0FBUyxDQUFDO0FBQ2hHLE9BQU8sU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWxGLHlFQUF5RTtBQUN6RSwyRUFBMkU7QUFDM0UseUVBQXlFO0FB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RSxDQUFDO1lBQ3hFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLDhCQUE4QixFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hGLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNmLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDbEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsb0NBQW9DLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxxQ0FBcUMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRTdWNjZXNzLCBzZW5kRXJyb3IsIGdlbmVyYXRlT3BlbkFwaVNwZWMsIEVycm9yQ29kZSwgY3JlYXRlTG9nZ2VyLCB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsLCBjcmVhdGVIZWFsdGhSb3V0ZXIsIHNldENvdW50ZXJFbWl0dGVyLCBzYWZlQ3JlYXRlUmVxdWlyZSwgcmVxdWlyZUF1dGggfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IE9wZW5BcGlTcGVjT3B0aW9ucyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q29ubmVjdGlvbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IGNvbXByZXNzaW9uIGZyb20gJ2NvbXByZXNzaW9uJztcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnO1xuaW1wb3J0IGV4cHJlc3MsIHsgdHlwZSBFeHByZXNzLCB0eXBlIE5leHRGdW5jdGlvbiwgdHlwZSBSZXF1ZXN0LCB0eXBlIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgcmF0ZUxpbWl0LCB7IGlwS2V5R2VuZXJhdG9yIH0gZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBzd2FnZ2VyVWkgZnJvbSAnc3dhZ2dlci11aS1leHByZXNzJztcbmltcG9ydCB7IHY3IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGV0YWdNaWRkbGV3YXJlIH0gZnJvbSAnLi9ldGFnLW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgbWV0cmljc01pZGRsZXdhcmUsIG1ldHJpY3NIYW5kbGVyLCBpbmNDb3VudGVyIH0gZnJvbSAnLi9tZXRyaWNzLmpzJztcbmltcG9ydCB7IHJlYWRpbmVzc0d1YXJkIH0gZnJvbSAnLi9yZWFkaW5lc3MuanMnO1xuaW1wb3J0IHsgU1NFTWFuYWdlciwgU1NFX1JFUVVFU1RfSURfUkUgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG4vLyBXaXJlIGFwaS1jb3JlJ3MgY291bnRlciBzaGltIHRvIHRoZSByZWFsIHByb20tY2xpZW50IHJlZ2lzdHJ5LiBUaGlzIGlzXG4vLyBhIG5vLW9wIHVudGlsIGluY0NvdW50ZXIgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAobGF6eSByZWdpc3RyYXRpb25cbi8vIGluIG1ldHJpY3MudHMpLCBhbmQgbGV0cyBhcGktY29yZSBoZWxwZXJzIGxpa2UgdGhlIHF1b3RhIGNsaWVudCByZWNvcmRcbi8vIGBxdW90YV9mYWlsX29wZW5fdG90YWxgIHdpdGhvdXQgdGFraW5nIGEgaGFyZCBkZXAgb24gYXBpLXNlcnZlci5cbnNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBPcHRpb25zIHtcbiAgLyoqIEVuYWJsZSBDT1JTIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb3JzPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVycyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlSGVsbWV0PzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVSYXRlTGltaXQ/OiBib29sZWFuO1xuICAvKiogUmVkaXMgVVJMIGZvciBzaGFyZWQgcmF0ZS1saW1pdCBzdGF0ZSAoZS5nLiAncmVkaXM6Ly9ob3N0OjYzNzknKS4gSW4tbWVtb3J5IHdoZW4gb21pdHRlZC4gKi9cbiAgcmVkaXNVcmw/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgSlNPTiBib2R5IHBhcnNpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUpzb25Cb2R5PzogYm9vbGVhbjtcbiAgLyoqIEpTT04gYm9keSBzaXplIGxpbWl0IChkZWZhdWx0OiAnMW1iJykgKi9cbiAganNvbkxpbWl0Pzogc3RyaW5nO1xuICAvKiogRW5hYmxlIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlVXJsRW5jb2RlZD86IGJvb2xlYW47XG4gIC8qKiBVUkwtZW5jb2RlZCBib2R5IHNpemUgbGltaXQgKGRlZmF1bHQ6ICcxbWInKSAqL1xuICB1cmxFbmNvZGVkTGltaXQ/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBIZWFsdGggY2hlY2sgZGVwZW5kZW5jeSBjaGVja2VyIOKAlCBpZiBwcm92aWRlZCwgL2hlYWx0aCByZXBvcnRzIGRlcGVuZGVuY3kgc3RhdHVzICovXG4gIGNoZWNrRGVwZW5kZW5jaWVzPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnIHwgJ3Vua25vd24nPj47XG4gIC8qKiBFbmFibGUgT3BlbkFQSSBzcGVjIGF0IC9kb2NzL29wZW5hcGkuanNvbiBhbmQgU3dhZ2dlciBVSSBhdCAvZG9jcyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlT3BlbkFwaT86IGJvb2xlYW47XG4gIC8qKiBPcGVuQVBJIHNwZWMgY3VzdG9taXphdGlvbiBvcHRpb25zICovXG4gIG9wZW5BcGlPcHRpb25zPzogT3BlbkFwaVNwZWNPcHRpb25zO1xuICAvKiogRW5hYmxlIGd6aXAvZGVmbGF0ZSByZXNwb25zZSBjb21wcmVzc2lvbiAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgd2FybXVwIGNhbGxiYWNrcyBpbnZva2VkIGJ5IGBHRVQgL3dhcm11cGAgaW4gYWRkaXRpb24gdG8gdGhlXG4gICAqIGRlZmF1bHQgUG9zdGdyZXMgcGluZy4gVXNlIGZvciBzZXJ2aWNlcyB0aGF0IGRlcGVuZCBvbiBNb25nbywgUmVkaXMsXG4gICAqIFNRUywgZXRjLiDigJQgcHJlLXdhcm1pbmcgb3BlbnMgY29ubmVjdGlvbiBwb29scyBiZWZvcmUgcmVhbCB0cmFmZmljXG4gICAqIGFycml2ZXMuIEVhY2ggY2FsbGJhY2sgc2hvdWxkIHJlc29sdmUgd2hlbiBpdHMgZGVwZW5kZW5jeSBpcyByZWFkeTtcbiAgICogYW55IHJlamVjdGlvbiBjYXVzZXMgL3dhcm11cCB0byByZXR1cm4gNTAzLlxuICAgKi9cbiAgd2FybXVwSG9va3M/OiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+Pjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY3JlYXRpbmcgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFwcFJlc3VsdCB7XG4gIC8qKiBDb25maWd1cmVkIEV4cHJlc3MgYXBwbGljYXRpb24gKi9cbiAgYXBwOiBFeHByZXNzO1xuICAvKiogU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcjogU1NFTWFuYWdlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhbiBFeHByZXNzIGFwcGxpY2F0aW9uIHdpdGggY29tbW9uIG1pZGRsZXdhcmVcbiAqXG4gKiBTZXRzIHVwOlxuICogLSBDT1JTIHdpdGggY29uZmlndXJlZCBvcmlnaW5zXG4gKiAtIEhlbG1ldCBzZWN1cml0eSBoZWFkZXJzXG4gKiAtIFJhdGUgbGltaXRpbmdcbiAqIC0gSlNPTiBhbmQgVVJMLWVuY29kZWQgYm9keSBwYXJzaW5nXG4gKiAtIFRydXN0IHByb3h5IHNldHRpbmdzXG4gKiAtIEhlYWx0aCBjaGVjayBlbmRwb2ludCAoL2hlYWx0aClcbiAqIC0gTWV0cmljcyBlbmRwb2ludCAoL21ldHJpY3MpXG4gKiAtIFNTRSBsb2dzIGVuZHBvaW50ICgvbG9ncy86cmVxdWVzdElkKVxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEV4cHJlc3MgYXBwIGFuZCBTU0UgbWFuYWdlclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKlxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgIC8vIFlvdXIgcm91dGUgaGFuZGxlclxuICogfSk7XG4gKlxuICogc3RhcnRTZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJyB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBwKG9wdGlvbnM6IENyZWF0ZUFwcE9wdGlvbnMgPSB7fSk6IENyZWF0ZUFwcFJlc3VsdCB7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVDb3JzID0gdHJ1ZSxcbiAgICBlbmFibGVIZWxtZXQgPSB0cnVlLFxuICAgIGVuYWJsZVJhdGVMaW1pdCA9IHRydWUsXG4gICAgZW5hYmxlSnNvbkJvZHkgPSB0cnVlLFxuICAgIGpzb25MaW1pdCA9ICcxbWInLFxuICAgIGVuYWJsZVVybEVuY29kZWQgPSB0cnVlLFxuICAgIHVybEVuY29kZWRMaW1pdCA9ICcxbWInLFxuICAgIHNzZU1hbmFnZXIgPSBuZXcgU1NFTWFuYWdlcigpLFxuICAgIGNoZWNrRGVwZW5kZW5jaWVzLFxuICAgIGVuYWJsZU9wZW5BcGkgPSB0cnVlLFxuICAgIG9wZW5BcGlPcHRpb25zLFxuICAgIGVuYWJsZUNvbXByZXNzaW9uID0gdHJ1ZSxcbiAgICB3YXJtdXBIb29rcyA9IFtdLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBGYWlsIGZhc3QgaWYgSldUX1NFQ1JFVCBpcyBub3QgY29uZmlndXJlZCDigJQgcHJldmVudHMgc2lsZW50IGF1dGggZmFpbHVyZXMgYXQgcnVudGltZVxuICBpZiAoIXByb2Nlc3MuZW52LkpXVF9TRUNSRVQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQuIFNldCBpdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlci4nKTtcbiAgfVxuXG4gIC8vIE9wZW5UZWxlbWV0cnkgaXMgTk9UIGluaXRpYWxpemVkIGhlcmU6IGJ5IHRoZSB0aW1lIGNyZWF0ZUFwcCBydW5zLCBleHByZXNzXG4gIC8vIGFuZCBodHRwIGhhdmUgYWxyZWFkeSBiZWVuIHJlcXVpcmVkLCBzbyB0aGUgYXV0by1pbnN0cnVtZW50YXRpb24gaG9va3NcbiAgLy8gd291bGQgaGF2ZSBub3RoaW5nIHRvIHBhdGNoIChubyBpbmJvdW5kIHNwYW4g4oaSIG5vIHRyYWNlIGlkKS4gVHJhY2luZyBpc1xuICAvLyBzdGFydGVkIGJ5IHRoZSBgb3RlbC1ib290c3RyYXAuanNgIHByZWxvYWQgaW5zdGVhZCAobm9kZSAtciDigKYg4oCUIHNlZSBlYWNoXG4gIC8vIHNlcnZpY2UncyBEb2NrZXJmaWxlIENNRCAvIHN0YXJ0IHNjcmlwdCksIHdoaWNoIHJ1bnMgYmVmb3JlIGFueVxuICAvLyBpbnN0cnVtZW50ZWQgbW9kdWxlIGxvYWRzLiBgY3VycmVudFRyYWNlSWQoKWAgdGhlbiByZWFkcyB0aGUgYWN0aXZlIHNwYW4uXG5cbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBTZWN1cml0eSBtaWRkbGV3YXJlLlxuICAvL1xuICAvLyBTd2FnZ2VyIFVJIG5lZWRzIHVuc2FmZS1pbmxpbmUgKyB1bnNhZmUtZXZhbCBmb3IgaXRzIGJ1bmRsZWQgc2NyaXB0cyDigJRcbiAgLy8gYnV0IHdlIG9ubHkgcmVsYXggQ1NQIHRoYXQgZmFyIHdoZW4gKGEpIE9wZW5BUEkgaXMgZW5hYmxlZCBBTkQgKGIpIHdlJ3JlXG4gIC8vIG5vdCBpbiBwcm9kdWN0aW9uLiBJbiBwcm9kLCBTd2FnZ2VyIHNob3VsZCBiZSBzZXJ2ZWQgYmVoaW5kIGEgc2VwYXJhdGVcbiAgLy8gaG9zdCBvciBhdXRoLWdhdGVkIHJvdXRlOyB0aGUgbWFpbiBhcHAga2VlcHMgdGhlIHN0cmljdCBDU1Agc28gYSBTdG9yZWRcbiAgLy8gWFNTIGluIGFueSBoYW5kbGVyIGNhbid0IGBldmFsKClgIGFyYml0cmFyeSBzY3JpcHQuXG4gIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGFsbG93U3dhZ2dlckNzcCA9IGVuYWJsZU9wZW5BcGkgJiYgIWlzUHJvZHVjdGlvbjtcbiAgaWYgKGVuYWJsZUhlbG1ldCkge1xuICAgIGFwcC51c2UoaGVsbWV0KHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICBkaXJlY3RpdmVzOiB7XG4gICAgICAgICAgZGVmYXVsdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHNjcmlwdFNyYzogYWxsb3dTd2FnZ2VyQ3NwXG4gICAgICAgICAgICA/IFtcIidzZWxmJ1wiLCBcIid1bnNhZmUtaW5saW5lJ1wiLCBcIid1bnNhZmUtZXZhbCdcIl1cbiAgICAgICAgICAgIDogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHN0eWxlU3JjOiBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIl0sXG4gICAgICAgICAgaW1nU3JjOiBbXCInc2VsZidcIiwgJ2RhdGE6JywgJ2Jsb2I6J10sXG4gICAgICAgICAgY29ubmVjdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIGZvbnRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBvYmplY3RTcmM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBmcmFtZUFuY2VzdG9yczogW1wiJ25vbmUnXCJdLFxuICAgICAgICAgIGJhc2VVcmk6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb3JtQWN0aW9uOiBbXCInc2VsZidcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChlbmFibGVDb3JzKSB7XG4gICAgYXBwLnVzZShjb3JzKHNlcnZlckNvbmZpZy5jb3JzKSk7XG4gIH1cblxuICAvLyBSZXNwb25zZSBjb21wcmVzc2lvbiAoZ3ppcC9kZWZsYXRlKSDigJQgc2tpcCBTU0Ugc3RyZWFtc1xuICBpZiAoZW5hYmxlQ29tcHJlc3Npb24pIHtcbiAgICBhcHAudXNlKGNvbXByZXNzaW9uKHtcbiAgICAgIGZpbHRlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBjb21wcmVzcyBTU0Ugc3RyZWFtcy4gTWF0Y2ggYnkgaW5jbHVzaW9uOiB0aGUgQWNjZXB0IGhlYWRlciBpc1xuICAgICAgICAvLyBvZnRlbiBhIGxpc3QgKGUuZy4gXCJ0ZXh0L2V2ZW50LXN0cmVhbSwgKi8qXCIpLCBzbyBleGFjdCBlcXVhbGl0eSBtaXNzZWRcbiAgICAgICAgLy8gdGhvc2UgYW5kIGNvbXByZXNzZWQvYnVmZmVyZWQgdGhlIHN0cmVhbS5cbiAgICAgICAgaWYgKChyZXEuaGVhZGVycy5hY2NlcHQgfHwgJycpLmluY2x1ZGVzKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb21wcmVzc2lvbi5maWx0ZXIocmVxLCByZXMpO1xuICAgICAgfSxcbiAgICAgIHRocmVzaG9sZDogQ29yZUNvbnN0YW50cy5DT01QUkVTU0lPTl9USFJFU0hPTERfQllURVMsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gRVRhZyBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBHRVQgcmVxdWVzdHMgKDMwNCBOb3QgTW9kaWZpZWQpXG4gIGFwcC51c2UoZXRhZ01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gQm9keSBwYXJzaW5nXG4gIGlmIChlbmFibGVKc29uQm9keSkge1xuICAgIGFwcC51c2UoZXhwcmVzcy5qc29uKHsgbGltaXQ6IGpzb25MaW1pdCB9KSk7XG4gIH1cblxuICBpZiAoZW5hYmxlVXJsRW5jb2RlZCkge1xuICAgIGFwcC51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUsIGxpbWl0OiB1cmxFbmNvZGVkTGltaXQgfSkpO1xuICB9XG5cbiAgLy8gVHJ1c3QgcHJveHkgKG11c3QgYmUgc2V0IGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gcmVxLmlwIHJlc29sdmVzIGNvcnJlY3RseSlcbiAgYXBwLnNldCgndHJ1c3QgcHJveHknLCBzZXJ2ZXJDb25maWcudHJ1c3RQcm94eSk7XG5cbiAgLy8gUmVxdWVzdCBJRCDigJQgcHJlZmVyIGV4aXN0aW5nIGhlYWRlciBmcm9tIG5naW54LCBvdGhlcndpc2UgZ2VuZXJhdGUgb25lXG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3QgaGRyID0gcmVxLmhlYWRlcnNbJ3gtcmVxdWVzdC1pZCddO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChBcnJheS5pc0FycmF5KGhkcikgPyBoZHJbMF0gOiBoZHIpIHx8IHV1aWQoKTtcbiAgICByZXEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtUmVxdWVzdC1JZCcsIHJlcXVlc3RJZCk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBIZWFsdGggY2hlY2sgcmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyIHNvIGl0IGlzIG5ldmVyIHRocm90dGxlZFxuICBhcHAudXNlKGNyZWF0ZUhlYWx0aFJvdXRlcih7XG4gICAgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJyxcbiAgICBjaGVja0RlcGVuZGVuY2llcyxcbiAgfSkpO1xuXG4gIC8vIFJlYWRpbmVzcyBndWFyZCDigJQgNTAzcyBidXNpbmVzcyB0cmFmZmljIHdoaWxlIHRoZSBzZXJ2aWNlIGlzIE5vdFJlYWR5XG4gIC8vIChkYXRhc3RvcmUgc3RpbGwgY29ubmVjdGluZyBhdCBzdGFydHVwLCBvciBkcm9wcGVkKS4gTW91bnRlZCByaWdodCBhZnRlclxuICAvLyB0aGUgaGVhbHRoIHJvdXRlciBhbmQgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBzbyBhIE5vdFJlYWR5IHJlcXVlc3QgaXNcbiAgLy8gcmVqZWN0ZWQgY2hlYXBseSwgYmVmb3JlIHJhdGUtbGltaXQgLyBpZGVtcG90ZW5jeSAvIGJ1c2luZXNzIGhhbmRsZXJzIGV2ZXJcbiAgLy8gdG91Y2ggYSBkaXNjb25uZWN0ZWQgZGF0YXN0b3JlLiBJdCBhbGxvd2xpc3RzIHRoZSBpbmZyYSBlbmRwb2ludHNcbiAgLy8gKC9tZXRyaWNzLCAvd2FybXVwLCAvZG9jcywgL2xvZ3MpIHJlZ2lzdGVyZWQgYmVsb3csIHBsdXMgL2hlYWx0aCArIC9yZWFkeS5cbiAgYXBwLnVzZShyZWFkaW5lc3NHdWFyZCgpKTtcblxuICAvLyBXYXJtLXVwIGVuZHBvaW50IOKAlCBwcmUtb3BlbnMgY29ubmVjdGlvbiBwb29scyBzbyB0aGUgZmlyc3QgcmVhbCByZXF1ZXN0XG4gIC8vIGRvZXNuJ3QgcGF5IGNvbGQtc3RhcnQgbGF0ZW5jeS4gQWx3YXlzIHBpbmdzIFBvc3RncmVzOyBzZXJ2aWNlcyB1c2luZ1xuICAvLyBNb25nbyAvIFJlZGlzIC8gU1FTIHBhc3MgYHdhcm11cEhvb2tzYCBzbyB0aG9zZSBhcmUgd2FybWVkIGluIHBhcmFsbGVsLlxuICBhcHAuZ2V0KCcvd2FybXVwJywgYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSxcbiAgICAgICAgLi4ud2FybXVwSG9va3MubWFwKChob29rKSA9PiBob29rKCkpLFxuICAgICAgXSk7XG4gICAgICBzZW5kU3VjY2VzcyhyZXMsIDIwMCwgeyB3YXJtZWQ6IHRydWUsIGhvb2tzOiB3YXJtdXBIb29rcy5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdXYXJtdXAgZmFpbGVkJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgZW5kcG9pbnQg4oCUIGFsd2F5cyByZWdpc3RlcmVkIChuZXZlciB0aHJvdHRsZWQpXG4gIGFwcC5nZXQoJy9tZXRyaWNzJywgbWV0cmljc0hhbmRsZXIoKSk7XG5cbiAgLy8gT3BlbkFQSSBzcGVjIGFuZCBTd2FnZ2VyIFVJIChyZWdpc3RlcmVkIGJlZm9yZSByYXRlIGxpbWl0ZXIpXG4gIGlmIChlbmFibGVPcGVuQXBpKSB7XG4gICAgY29uc3Qgc3BlYyA9IGdlbmVyYXRlT3BlbkFwaVNwZWMob3BlbkFwaU9wdGlvbnMpO1xuICAgIGFwcC5nZXQoJy9kb2NzL29wZW5hcGkuanNvbicsIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICByZXMuanNvbihzcGVjKTtcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvZG9jcycsIHN3YWdnZXJVaS5zZXJ2ZSwgc3dhZ2dlclVpLnNldHVwKHNwZWMsIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogb3BlbkFwaU9wdGlvbnM/LnRpdGxlID8/ICdQaXBlbGluZSBCdWlsZGVyIEFQSSBEb2NzJyxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBSYXRlIGxpbWl0aW5nIOKAlCB1c2VzIFJlZGlzIHdoZW4gcmVkaXNVcmwgaXMgcHJvdmlkZWQgZm9yIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgaW5zdGFuY2VzXG4gIGlmIChlbmFibGVSYXRlTGltaXQpIHtcbiAgICBjb25zdCByYXRlTGltaXRDb25maWcgPSBDb25maWcuZ2V0KCdyYXRlTGltaXQnKTtcblxuICAgIGNvbnN0IHJhdGVMaW1pdE9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgICBtYXg6IHJhdGVMaW1pdENvbmZpZy5tYXgsXG4gICAgICB3aW5kb3dNczogcmF0ZUxpbWl0Q29uZmlnLndpbmRvd01zLFxuICAgICAgc3RhbmRhcmRIZWFkZXJzOiB0cnVlLFxuICAgICAgbGVnYWN5SGVhZGVyczogZmFsc2UsXG4gICAgICAvLyBTa2lwIHJhdGUgbGltaXRpbmcgb25seSBmb3IgQ1JZUFRPR1JBUEhJQ0FMTFktVkVSSUZJRUQgaW50ZXJuYWwgc2VydmljZVxuICAgICAgLy8gY2FsbGVycy4gVGhlIGxpbWl0ZXIgcnVucyBiZWZvcmUgcmVxdWlyZUF1dGgsIHNvIHRoZSBwcmV2aW91c2x5LXRydXN0ZWRcbiAgICAgIC8vIHBsYWludGV4dCBgeC1pbnRlcm5hbC1zZXJ2aWNlYCBoZWFkZXIgd2FzIHNwb29mYWJsZSBieSBhbnkgZXh0ZXJuYWxcbiAgICAgIC8vIGNsaWVudCDihpIgdG90YWwgYnlwYXNzLiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsIHZlcmlmaWVzIHRoZSBzaWduZWRcbiAgICAgIC8vIHNlcnZpY2UgSldUIGluc3RlYWQ7IGludGVyLXNlcnZpY2UgY2FsbGVycyBhbGwgc2VuZCBvbmVcbiAgICAgIC8vIChnZXRTZXJ2aWNlQXV0aEhlYWRlcikuXG4gICAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcSksXG4gICAgICAvLyBLZXkgb24gY2xpZW50IElQIG9ubHkuIFRoZSBsaW1pdGVyIHJ1bnMgcHJlLWF1dGgsIHNvIGByZXEudXNlcmAgaXMgdW5zZXRcbiAgICAgIC8vIGFuZCBhbnkgb3JnIGlkIHdvdWxkIGNvbWUgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGB4LW9yZy1pZGAgaGVhZGVyIOKAlFxuICAgICAgLy8gc3Bvb2ZhYmxlLCBsZXR0aW5nIGFuIGF0dGFja2VyIHJvdGF0ZSB2YWx1ZXMgdG8gZXZhZGUgdGhlIGJ1Y2tldCBvclxuICAgICAgLy8gZmxvb2QgYSB2aWN0aW0gb3JnJ3MgYnVja2V0LiBpcEtleUdlbmVyYXRvciBub3JtYWxpemVzIElQdjYgdG8gYSAvNjRcbiAgICAgIC8vIHByZWZpeCAoYWxzbyByZXF1aXJlZCBieSBleHByZXNzLXJhdGUtbGltaXQgOC54J3MgdmFsaWRhdG9yKS5cbiAgICAgIGtleUdlbmVyYXRvcjogKHJlcTogUmVxdWVzdCkgPT4gaXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpLFxuICAgICAgaGFuZGxlcjogKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCAnVG9vIG1hbnkgcmVxdWVzdHMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERUQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIFJlZGlzIHN0b3JlIHdoZW4gYXZhaWxhYmxlIGZvciBzaGFyZWQgc3RhdGUgYWNyb3NzIGluc3RhbmNlc1xuICAgIGlmIChvcHRpb25zLnJlZGlzVXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBFU00gaGFzIG5vIGdsb2JhbCBgcmVxdWlyZWA7IHNhZmVDcmVhdGVSZXF1aXJlIGxvYWRzIHRoZSBvcHRpb25hbFxuICAgICAgICAvLyByZWRpcyBkZXBzIHN5bmNocm9ub3VzbHkgaGVyZSAob25seSB3aGVuIGEgcmVkaXNVcmwgaXMgY29uZmlndXJlZCkuXG4gICAgICAgIC8vIChDSlMtYnVuZGxlIHNhZmUg4oCUIHNlZSBhcGktY29yZSdzIHNhZmUtcmVxdWlyZS50cy4pXG4gICAgICAgIGNvbnN0IHJlcXVpcmUgPSBzYWZlQ3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICBjb25zdCB7IFJlZGlzU3RvcmUgfSA9IHJlcXVpcmUoJ3JhdGUtbGltaXQtcmVkaXMnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgY29uc3QgUmVkaXMgPSByZXF1aXJlKCdpb3JlZGlzJyk7XG4gICAgICAgIGNvbnN0IHJlZGlzQ2xpZW50ID0gbmV3IFJlZGlzKG9wdGlvbnMucmVkaXNVcmwpO1xuICAgICAgICAvLyBpb3JlZGlzIGVtaXRzICdlcnJvcicgb24gY29ubmVjdGlvbiBsb3NzOyB3aXRob3V0IGEgbGlzdGVuZXIgTm9kZVxuICAgICAgICAvLyB0cmVhdHMgaXQgYXMgYW4gdW5oYW5kbGVkICdlcnJvcicgZXZlbnQgYW5kIENSQVNIRVMgdGhlIHByb2Nlc3MuIExvZ1xuICAgICAgICAvLyBhbmQgbGV0IGlvcmVkaXMgYXV0by1yZWNvbm5lY3QgKHJhdGUgbGltaXRpbmcgZmFsbHMgYmFjayBwZXItc3RvcmUpLlxuICAgICAgICByZWRpc0NsaWVudC5vbignZXJyb3InLCAoZTogdW5rbm93bikgPT5cbiAgICAgICAgICBjcmVhdGVMb2dnZXIoJ3JhdGUtbGltaXQnKS53YXJuKCdSZWRpcyByYXRlLWxpbWl0IHN0b3JlIGVycm9yJywgeyBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpIH0pKTtcbiAgICAgICAgcmF0ZUxpbWl0T3B0aW9ucy5zdG9yZSA9IG5ldyBSZWRpc1N0b3JlKHtcbiAgICAgICAgICBzZW5kQ29tbWFuZDogKC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiByZWRpc0NsaWVudC5jYWxsKC4uLmFyZ3MpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3JhdGUtbGltaXQnKS53YXJuKCdSZWRpcyBzdG9yZSB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGluLW1lbW9yeSByYXRlIGxpbWl0aW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwLnVzZShyYXRlTGltaXQocmF0ZUxpbWl0T3B0aW9ucykpO1xuICB9XG5cbiAgLy8gRXhwcmVzcyByZXF1ZXN0IHRpbWVvdXQg4oCUIHVzZXMgQ29yZUNvbnN0YW50cyB0byBzaGFyZSB0aGUgc2FtZSBkZWZhdWx0IGFzIExhbWJkYSBoYW5kbGVyc1xuICBjb25zdCB0aW1lb3V0TXMgPSBDb3JlQ29uc3RhbnRzLkhBTkRMRVJfVElNRU9VVF9NUztcbiAgYXBwLnVzZSgoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgcmVzLnNldFRpbWVvdXQodGltZW91dE1zLCAoKSA9PiB7XG4gICAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdSZXF1ZXN0IHRpbWVvdXQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIFJlcXVlc3QgZHVyYXRpb24gbG9nZ2luZ1xuICBjb25zdCBkdXJhdGlvbkxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVxdWVzdC1kdXJhdGlvbicpO1xuICBhcHAudXNlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgZHVyYXRpb25Mb2dnZXIuaW5mbyhgJHtyZXEubWV0aG9kfSAke3JlcS5vcmlnaW5hbFVybH0gJHtyZXMuc3RhdHVzQ29kZX0gJHtkdXJhdGlvbn1tc2AsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEub3JpZ2luYWxVcmwsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICBkdXJhdGlvbk1zOiBkdXJhdGlvbixcbiAgICAgICAgcmVxdWVzdElkOiByZXEucmVxdWVzdElkLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgbWlkZGxld2FyZSDigJQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudFxuICBhcHAudXNlKG1ldHJpY3NNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIE5PVEU6IGlkZW1wb3RlbmN5IGlzIGludGVudGlvbmFsbHkgTk9UIG1vdW50ZWQgaGVyZS4gSXQgbmVlZHMgdGhlIFZFUklGSUVEXG4gIC8vIG9yZyBpZCB0byBuYW1lc3BhY2UgaXRzIHJlcGxheSBjYWNoZSwgYnV0IHRoaXMgcHJlLWF1dGggcG9zaXRpb24gcnVucyBiZWZvcmVcbiAgLy8gYHJlcXVpcmVBdXRoYC9gYXR0YWNoUmVxdWVzdENvbnRleHRgIHBvcHVsYXRlIGlkZW50aXR5LCBzbyBhIGdsb2JhbCBtb3VudFxuICAvLyBoZXJlIGlzIGEgcGVybWFuZW50IG5vLW9wIChvcmcgYWx3YXlzIHVuZGVmaW5lZCDihpIgc2tpcCkuIEl0IGlzIGluc3RlYWQgd2lyZWRcbiAgLy8gaW50byB0aGUgcG9zdC1hdXRoIHJvdXRlIGNoYWlucyDigJQgc2VlIGBjcmVhdGVQcm90ZWN0ZWRSb3V0ZWAgL1xuICAvLyBgY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZWAgaW4gbWlkZGxld2FyZS1mYWN0b3J5LnRzLlxuXG4gIC8vIFNTRSBsb2dzIGVuZHBvaW50IOKAlCB0aWNrZXQtZ2F0ZWQgKFdhdmUgMmIpLlxuICAvLyBUaGUgc3RyZWFtIGNhcnJpZXMgcGVyLW9yZyBidWlsZCBsb2dzLCBzbyBpdCBtdXN0IG5vdCBiZSB3b3JsZC1yZWFkYWJsZS5cbiAgLy8gQ2xpZW50cyBmaXJzdCBQT1NUIC9sb2dzL3RpY2tldCAoSldULWF1dGhlbnRpY2F0ZWQpIHRvIG1pbnQgYSBzaG9ydC1saXZlZCxcbiAgLy8gc2luZ2xlLXVzZSB0aWNrZXQgYm91bmQgdG8gdGhlaXIgb3JnIEFORCB0byB0aGUgc3BlY2lmaWMgYHJlcXVlc3RJZGAgc3RyZWFtXG4gIC8vIHRoZXkgaW50ZW5kIHRvIG9wZW4sIHRoZW4gb3BlbiB0aGUgRXZlbnRTb3VyY2Ugd2l0aCA/dGlja2V0PTx0Pi4gVGhpcyBrZWVwc1xuICAvLyB0aGUgSldUIG91dCBvZiBxdWVyeSBzdHJpbmdzIC8gYWNjZXNzIGxvZ3Mgd2hpbGUgZW5mb3JjaW5nIG9yZyBvd25lcnNoaXAsXG4gIC8vIHBlci1zdWJqZWN0IGF1dGhvcml6YXRpb24sIGFuZCB0aGUgcGVyLW9yZyBjb25uZWN0aW9uIGNhcCBvbiB0aGUgc3RyZWFtLlxuICAvLyBNaXJyb3JzIHRoZSBtZXNzYWdlLXNlcnZpY2Ugbm90aWZpY2F0aW9ucyBTU0UgdGlja2V0IGV4Y2hhbmdlLlxuICBhcHAucG9zdCgnL2xvZ3MvdGlja2V0JywgcmVxdWlyZUF1dGgsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIW9yZ0lkKSB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDAsICdUb2tlbiBtaXNzaW5nIG9yZ2FuaXphdGlvbicsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIGNhbGxlciBtdXN0IG5hbWUgdGhlIHN0cmVhbSBzdWJqZWN0IHVwIGZyb250IHNvIHRoZSB0aWNrZXQgaXMgYm91bmQgdG9cbiAgICAvLyBpdC4gV2l0aG91dCB0aGlzLCBhIHRpY2tldCBjb3VsZCBiZSByZXBsYXllZCBhZ2FpbnN0IEFOWSByZXF1ZXN0SWQgdGhlXG4gICAgLy8gb3JnIGNvdWxkIGd1ZXNzLCBsZXR0aW5nIGl0IGF0dGFjaCB0byBhbm90aGVyIG9yZydzIGxvZyBzdHJlYW0uIFN0cmljdGx5XG4gICAgLy8gZm9ybWF0LXZhbGlkYXRlZCBzbyBpdCBjYW4ndCBjYXJyeSBhbiBpbmplY3Rpb24gcGF5bG9hZCBpbnRvIHRoZSBzdWJqZWN0LlxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChyZXEuYm9keSBhcyB7IHJlcXVlc3RJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlcXVlc3RJZDtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RJZCAhPT0gJ3N0cmluZycgfHwgIVNTRV9SRVFVRVNUX0lEX1JFLnRlc3QocmVxdWVzdElkKSkge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDAwLCAnTWlzc2luZyBvciBpbnZhbGlkIHJlcXVlc3RJZCcsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gc3NlTWFuYWdlci5jcmVhdGVUaWNrZXQob3JnSWQsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAnb3JnLWxpbWl0Jykge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA0MjksICdUb28gbWFueSBsb2cgc3RyZWFtIHRpY2tldHMgaXNzdWVkJywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ0xvZyBzdHJlYW1pbmcgc3Vic3lzdGVtIGF0IGNhcGFjaXR5JywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VuZFN1Y2Nlc3MocmVzLCAyMDAsIHsgdGlja2V0OiByZXN1bHQudGlja2V0IH0pO1xuICB9KTtcblxuICAvLyBUaGUgc3RyZWFtIGl0c2VsZiByZXNvbHZlcyArIGNvbnN1bWVzIHRoZSB0aWNrZXQgaW5zaWRlIG1pZGRsZXdhcmUoKSBhbmRcbiAgLy8gcmVqZWN0cyBhbnkgYW5vbnltb3VzIC8gaW52YWxpZCAvIGV4cGlyZWQgLyBhbHJlYWR5LXVzZWQgdGlja2V0IHdpdGggNDAxLlxuICBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuXG4gIHJldHVybiB7IGFwcCwgc3NlTWFuYWdlciB9O1xufVxuIl19
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqTixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sT0FBTyxFQUFFLEVBQWdFLE1BQU0sU0FBUyxDQUFDO0FBQ2hHLE9BQU8sU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsbUJBQW1CLEVBQXlCLE1BQU0sNkJBQTZCLENBQUM7QUFDekgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUs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QUFDO1lBQ3RGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxxQ0FBcUMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRTdWNjZXNzLCBzZW5kRXJyb3IsIGdlbmVyYXRlT3BlbkFwaVNwZWMsIEVycm9yQ29kZSwgY3JlYXRlTG9nZ2VyLCB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsLCBjcmVhdGVIZWFsdGhSb3V0ZXIsIHNldENvdW50ZXJFbWl0dGVyLCBzYWZlQ3JlYXRlUmVxdWlyZSwgcmVxdWlyZUF1dGggfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IE9wZW5BcGlTcGVjT3B0aW9ucyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q29ubmVjdGlvbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IGNvbXByZXNzaW9uIGZyb20gJ2NvbXByZXNzaW9uJztcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnO1xuaW1wb3J0IGV4cHJlc3MsIHsgdHlwZSBFeHByZXNzLCB0eXBlIE5leHRGdW5jdGlvbiwgdHlwZSBSZXF1ZXN0LCB0eXBlIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgcmF0ZUxpbWl0LCB7IGlwS2V5R2VuZXJhdG9yIH0gZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBzd2FnZ2VyVWkgZnJvbSAnc3dhZ2dlci11aS1leHByZXNzJztcbmltcG9ydCB7IHY3IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGV0YWdNaWRkbGV3YXJlIH0gZnJvbSAnLi9ldGFnLW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNJZGVtcG90ZW5jeVN0b3JlLCBzZXRJZGVtcG90ZW5jeVN0b3JlLCB0eXBlIElkZW1wb3RlbmN5U3RvcmUgfSBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgbWV0cmljc01pZGRsZXdhcmUsIG1ldHJpY3NIYW5kbGVyLCBpbmNDb3VudGVyIH0gZnJvbSAnLi9tZXRyaWNzLmpzJztcbmltcG9ydCB7IHJlYWRpbmVzc0d1YXJkIH0gZnJvbSAnLi9yZWFkaW5lc3MuanMnO1xuaW1wb3J0IHsgU1NFTWFuYWdlciwgU1NFX1JFUVVFU1RfSURfUkUgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNUaWNrZXRTdG9yZSB9IGZyb20gJy4uL2h0dHAvc3NlLXRpY2tldC1zdG9yZS5qcyc7XG5cbi8vIFdpcmUgYXBpLWNvcmUncyBjb3VudGVyIHNoaW0gdG8gdGhlIHJlYWwgcHJvbS1jbGllbnQgcmVnaXN0cnkuIFRoaXMgaXNcbi8vIGEgbm8tb3AgdW50aWwgaW5jQ291bnRlciBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIChsYXp5IHJlZ2lzdHJhdGlvblxuLy8gaW4gbWV0cmljcy50cyksIGFuZCBsZXRzIGFwaS1jb3JlIGhlbHBlcnMgbGlrZSB0aGUgcXVvdGEgY2xpZW50IHJlY29yZFxuLy8gYHF1b3RhX2ZhaWxfb3Blbl90b3RhbGAgd2l0aG91dCB0YWtpbmcgYSBoYXJkIGRlcCBvbiBhcGktc2VydmVyLlxuc2V0Q291bnRlckVtaXR0ZXIoaW5jQ291bnRlcik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFwcE9wdGlvbnMge1xuICAvKiogRW5hYmxlIENPUlMgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUNvcnM/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIEhlbG1ldCBzZWN1cml0eSBoZWFkZXJzIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVIZWxtZXQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZVJhdGVMaW1pdD86IGJvb2xlYW47XG4gIC8qKiBSZWRpcyBVUkwgZm9yIHNoYXJlZCByYXRlLWxpbWl0IHN0YXRlIChlLmcuICdyZWRpczovL2hvc3Q6NjM3OScpLiBJbi1tZW1vcnkgd2hlbiBvbWl0dGVkLiAqL1xuICByZWRpc1VybD86IHN0cmluZztcbiAgLyoqIEVuYWJsZSBKU09OIGJvZHkgcGFyc2luZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlSnNvbkJvZHk/OiBib29sZWFuO1xuICAvKiogSlNPTiBib2R5IHNpemUgbGltaXQgKGRlZmF1bHQ6ICcxbWInKSAqL1xuICBqc29uTGltaXQ/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgVVJMLWVuY29kZWQgYm9keSBwYXJzaW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVVcmxFbmNvZGVkPzogYm9vbGVhbjtcbiAgLyoqIFVSTC1lbmNvZGVkIGJvZHkgc2l6ZSBsaW1pdCAoZGVmYXVsdDogJzFtYicpICovXG4gIHVybEVuY29kZWRMaW1pdD86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBTU0UgbWFuYWdlciBpbnN0YW5jZSAqL1xuICBzc2VNYW5hZ2VyPzogU1NFTWFuYWdlcjtcbiAgLyoqIEhlYWx0aCBjaGVjayBkZXBlbmRlbmN5IGNoZWNrZXIg4oCUIGlmIHByb3ZpZGVkLCAvaGVhbHRoIHJlcG9ydHMgZGVwZW5kZW5jeSBzdGF0dXMgKi9cbiAgY2hlY2tEZXBlbmRlbmNpZXM/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+PjtcbiAgLyoqIEVuYWJsZSBPcGVuQVBJIHNwZWMgYXQgL2RvY3Mvb3BlbmFwaS5qc29uIGFuZCBTd2FnZ2VyIFVJIGF0IC9kb2NzIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVPcGVuQXBpPzogYm9vbGVhbjtcbiAgLyoqIE9wZW5BUEkgc3BlYyBjdXN0b21pemF0aW9uIG9wdGlvbnMgKi9cbiAgb3BlbkFwaU9wdGlvbnM/OiBPcGVuQXBpU3BlY09wdGlvbnM7XG4gIC8qKiBFbmFibGUgZ3ppcC9kZWZsYXRlIHJlc3BvbnNlIGNvbXByZXNzaW9uIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb21wcmVzc2lvbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZGVtcG90ZW5jeSByZXBsYXktY2FjaGUgYmFja2VuZCBmb3Iga2V5ZWQgbXV0YXRpb24gcmV0cmllcy4gV2hlbiBvbWl0dGVkLFxuICAgKiBjcmVhdGVBcHAgYXV0by13aXJlcyB0aGUgc2hhcmVkIGVudiBSZWRpcyBzdG9yZSAobXVsdGktcmVwbGljYSBkZWR1cCkgaWZcbiAgICogUmVkaXMgaXMgY29uZmlndXJlZCwgZWxzZSBrZWVwcyB0aGUgaW4tbWVtb3J5IGRlZmF1bHQgKHNpbmdsZS1yZXBsaWNhKS5cbiAgICogUGFzcyBhbiBleHBsaWNpdCBzdG9yZSB0byBpbmplY3QgYSBiZXNwb2tlIGJhY2tlbmQgKGUuZy4gYSBzZXJ2aWNlJ3Mgb3duXG4gICAqIGlvcmVkaXMgY29ubmVjdGlvbikuXG4gICAqL1xuICBpZGVtcG90ZW5jeVN0b3JlPzogSWRlbXBvdGVuY3lTdG9yZTtcbiAgLyoqXG4gICAqIEV4dHJhIHdhcm11cCBjYWxsYmFja3MgaW52b2tlZCBieSBgR0VUIC93YXJtdXBgIGluIGFkZGl0aW9uIHRvIHRoZVxuICAgKiBkZWZhdWx0IFBvc3RncmVzIHBpbmcuIFVzZSBmb3Igc2VydmljZXMgdGhhdCBkZXBlbmQgb24gTW9uZ28sIFJlZGlzLFxuICAgKiBTUVMsIGV0Yy4g4oCUIHByZS13YXJtaW5nIG9wZW5zIGNvbm5lY3Rpb24gcG9vbHMgYmVmb3JlIHJlYWwgdHJhZmZpY1xuICAgKiBhcnJpdmVzLiBFYWNoIGNhbGxiYWNrIHNob3VsZCByZXNvbHZlIHdoZW4gaXRzIGRlcGVuZGVuY3kgaXMgcmVhZHk7XG4gICAqIGFueSByZWplY3Rpb24gY2F1c2VzIC93YXJtdXAgdG8gcmV0dXJuIDUwMy5cbiAgICovXG4gIHdhcm11cEhvb2tzPzogQXJyYXk8KCkgPT4gUHJvbWlzZTx2b2lkPj47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBSZXN1bHQge1xuICAvKiogQ29uZmlndXJlZCBFeHByZXNzIGFwcGxpY2F0aW9uICovXG4gIGFwcDogRXhwcmVzcztcbiAgLyoqIFNTRSBtYW5hZ2VyIGluc3RhbmNlICovXG4gIHNzZU1hbmFnZXI6IFNTRU1hbmFnZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYW4gRXhwcmVzcyBhcHBsaWNhdGlvbiB3aXRoIGNvbW1vbiBtaWRkbGV3YXJlXG4gKlxuICogU2V0cyB1cDpcbiAqIC0gQ09SUyB3aXRoIGNvbmZpZ3VyZWQgb3JpZ2luc1xuICogLSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVyc1xuICogLSBSYXRlIGxpbWl0aW5nXG4gKiAtIEpTT04gYW5kIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZ1xuICogLSBUcnVzdCBwcm94eSBzZXR0aW5nc1xuICogLSBIZWFsdGggY2hlY2sgZW5kcG9pbnQgKC9oZWFsdGgpXG4gKiAtIE1ldHJpY3MgZW5kcG9pbnQgKC9tZXRyaWNzKVxuICogLSBTU0UgbG9ncyBlbmRwb2ludCAoL2xvZ3MvOnJlcXVlc3RJZClcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29uZmlndXJlZCBFeHByZXNzIGFwcCBhbmQgU1NFIG1hbmFnZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICpcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAvLyBZb3VyIHJvdXRlIGhhbmRsZXJcbiAqIH0pO1xuICpcbiAqIHN0YXJ0U2VydmVyKGFwcCwgeyBuYW1lOiAnTXkgU2VydmljZScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwcChvcHRpb25zOiBDcmVhdGVBcHBPcHRpb25zID0ge30pOiBDcmVhdGVBcHBSZXN1bHQge1xuICBjb25zdCB7XG4gICAgZW5hYmxlQ29ycyA9IHRydWUsXG4gICAgZW5hYmxlSGVsbWV0ID0gdHJ1ZSxcbiAgICBlbmFibGVSYXRlTGltaXQgPSB0cnVlLFxuICAgIGVuYWJsZUpzb25Cb2R5ID0gdHJ1ZSxcbiAgICBqc29uTGltaXQgPSAnMW1iJyxcbiAgICBlbmFibGVVcmxFbmNvZGVkID0gdHJ1ZSxcbiAgICB1cmxFbmNvZGVkTGltaXQgPSAnMW1iJyxcbiAgICAvLyBEZWZhdWx0IFNTRSBtYW5hZ2VyIHdpcmVkIHRvIHRoZSBzaGFyZWQgZW52IFJlZGlzIHRpY2tldC9vd25lcnNoaXAgc3RvcmVcbiAgICAvLyB3aGVuIFJlZGlzIGlzIGNvbmZpZ3VyZWQgKG11bHRpLXBvZCBjb3JyZWN0bmVzcyArIGNyb3NzLXNlcnZpY2Ugc3RyZWFtXG4gICAgLy8gb3duZXJzaGlwKSwgZWxzZSB0aGUgaW4tbWVtb3J5IGRlZmF1bHQuIEEgY2FsbGVyLXN1cHBsaWVkIGBzc2VNYW5hZ2VyYFxuICAgIC8vIHNraXBzIHRoaXMgZW50aXJlbHkuXG4gICAgc3NlTWFuYWdlciA9IG5ldyBTU0VNYW5hZ2VyKHsgdGlja2V0U3RvcmU6IGNyZWF0ZUVudlJlZGlzVGlja2V0U3RvcmUoKSA/PyB1bmRlZmluZWQgfSksXG4gICAgY2hlY2tEZXBlbmRlbmNpZXMsXG4gICAgZW5hYmxlT3BlbkFwaSA9IHRydWUsXG4gICAgb3BlbkFwaU9wdGlvbnMsXG4gICAgZW5hYmxlQ29tcHJlc3Npb24gPSB0cnVlLFxuICAgIHdhcm11cEhvb2tzID0gW10sXG4gICAgaWRlbXBvdGVuY3lTdG9yZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gRmFpbCBmYXN0IGlmIEpXVF9TRUNSRVQgaXMgbm90IGNvbmZpZ3VyZWQg4oCUIHByZXZlbnRzIHNpbGVudCBhdXRoIGZhaWx1cmVzIGF0IHJ1bnRpbWVcbiAgaWYgKCFwcm9jZXNzLmVudi5KV1RfU0VDUkVUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkLiBTZXQgaXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuJyk7XG4gIH1cblxuICAvLyBXaXJlIHRoZSBpZGVtcG90ZW5jeSByZXBsYXktY2FjaGUgYmFja2VuZCB1c2VkIGJ5IHRoZSBwb3N0LWF1dGggcm91dGVcbiAgLy8gZmFjdG9yaWVzIChjcmVhdGVQcm90ZWN0ZWRSb3V0ZSAvIGNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGUpLiBQcmVmZXJcbiAgLy8gYW4gZXhwbGljaXRseSBpbmplY3RlZCBzdG9yZTsgb3RoZXJ3aXNlIGF1dG8tY29uc3RydWN0IGZyb20gdGhlIHNoYXJlZCBlbnZcbiAgLy8gUmVkaXMgc28ga2V5ZWQgbXV0YXRpb24gcmV0cmllcyBkZWR1cGUgYWNyb3NzIHJlcGxpY2FzLiBGYWxscyBiYWNrIHRvIHRoZVxuICAvLyBpbi1tZW1vcnkgZGVmYXVsdCB3aGVuIG5vIFJlZGlzIGlzIGNvbmZpZ3VyZWQgKHNpbmdsZS1yZXBsaWNhIGNvcnJlY3RuZXNzKS5cbiAgY29uc3QgcmVzb2x2ZWRJZGVtcG90ZW5jeVN0b3JlID0gaWRlbXBvdGVuY3lTdG9yZSA/PyBjcmVhdGVFbnZSZWRpc0lkZW1wb3RlbmN5U3RvcmUoKTtcbiAgaWYgKHJlc29sdmVkSWRlbXBvdGVuY3lTdG9yZSkge1xuICAgIHNldElkZW1wb3RlbmN5U3RvcmUocmVzb2x2ZWRJZGVtcG90ZW5jeVN0b3JlKTtcbiAgfVxuXG4gIC8vIE9wZW5UZWxlbWV0cnkgaXMgTk9UIGluaXRpYWxpemVkIGhlcmU6IGJ5IHRoZSB0aW1lIGNyZWF0ZUFwcCBydW5zLCBleHByZXNzXG4gIC8vIGFuZCBodHRwIGhhdmUgYWxyZWFkeSBiZWVuIHJlcXVpcmVkLCBzbyB0aGUgYXV0by1pbnN0cnVtZW50YXRpb24gaG9va3NcbiAgLy8gd291bGQgaGF2ZSBub3RoaW5nIHRvIHBhdGNoIChubyBpbmJvdW5kIHNwYW4g4oaSIG5vIHRyYWNlIGlkKS4gVHJhY2luZyBpc1xuICAvLyBzdGFydGVkIGJ5IHRoZSBgb3RlbC1ib290c3RyYXAuanNgIHByZWxvYWQgaW5zdGVhZCAobm9kZSAtciDigKYg4oCUIHNlZSBlYWNoXG4gIC8vIHNlcnZpY2UncyBEb2NrZXJmaWxlIENNRCAvIHN0YXJ0IHNjcmlwdCksIHdoaWNoIHJ1bnMgYmVmb3JlIGFueVxuICAvLyBpbnN0cnVtZW50ZWQgbW9kdWxlIGxvYWRzLiBgY3VycmVudFRyYWNlSWQoKWAgdGhlbiByZWFkcyB0aGUgYWN0aXZlIHNwYW4uXG5cbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBTZWN1cml0eSBtaWRkbGV3YXJlLlxuICAvL1xuICAvLyBTd2FnZ2VyIFVJIG5lZWRzIHVuc2FmZS1pbmxpbmUgKyB1bnNhZmUtZXZhbCBmb3IgaXRzIGJ1bmRsZWQgc2NyaXB0cyDigJRcbiAgLy8gYnV0IHdlIG9ubHkgcmVsYXggQ1NQIHRoYXQgZmFyIHdoZW4gKGEpIE9wZW5BUEkgaXMgZW5hYmxlZCBBTkQgKGIpIHdlJ3JlXG4gIC8vIG5vdCBpbiBwcm9kdWN0aW9uLiBJbiBwcm9kLCBTd2FnZ2VyIHNob3VsZCBiZSBzZXJ2ZWQgYmVoaW5kIGEgc2VwYXJhdGVcbiAgLy8gaG9zdCBvciBhdXRoLWdhdGVkIHJvdXRlOyB0aGUgbWFpbiBhcHAga2VlcHMgdGhlIHN0cmljdCBDU1Agc28gYSBTdG9yZWRcbiAgLy8gWFNTIGluIGFueSBoYW5kbGVyIGNhbid0IGBldmFsKClgIGFyYml0cmFyeSBzY3JpcHQuXG4gIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGFsbG93U3dhZ2dlckNzcCA9IGVuYWJsZU9wZW5BcGkgJiYgIWlzUHJvZHVjdGlvbjtcbiAgaWYgKGVuYWJsZUhlbG1ldCkge1xuICAgIGFwcC51c2UoaGVsbWV0KHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICBkaXJlY3RpdmVzOiB7XG4gICAgICAgICAgZGVmYXVsdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHNjcmlwdFNyYzogYWxsb3dTd2FnZ2VyQ3NwXG4gICAgICAgICAgICA/IFtcIidzZWxmJ1wiLCBcIid1bnNhZmUtaW5saW5lJ1wiLCBcIid1bnNhZmUtZXZhbCdcIl1cbiAgICAgICAgICAgIDogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHN0eWxlU3JjOiBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIl0sXG4gICAgICAgICAgaW1nU3JjOiBbXCInc2VsZidcIiwgJ2RhdGE6JywgJ2Jsb2I6J10sXG4gICAgICAgICAgY29ubmVjdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIGZvbnRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBvYmplY3RTcmM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBmcmFtZUFuY2VzdG9yczogW1wiJ25vbmUnXCJdLFxuICAgICAgICAgIGJhc2VVcmk6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb3JtQWN0aW9uOiBbXCInc2VsZidcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChlbmFibGVDb3JzKSB7XG4gICAgYXBwLnVzZShjb3JzKHNlcnZlckNvbmZpZy5jb3JzKSk7XG4gIH1cblxuICAvLyBSZXNwb25zZSBjb21wcmVzc2lvbiAoZ3ppcC9kZWZsYXRlKSDigJQgc2tpcCBTU0Ugc3RyZWFtc1xuICBpZiAoZW5hYmxlQ29tcHJlc3Npb24pIHtcbiAgICBhcHAudXNlKGNvbXByZXNzaW9uKHtcbiAgICAgIGZpbHRlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBjb21wcmVzcyBTU0Ugc3RyZWFtcy4gTWF0Y2ggYnkgaW5jbHVzaW9uOiB0aGUgQWNjZXB0IGhlYWRlciBpc1xuICAgICAgICAvLyBvZnRlbiBhIGxpc3QgKGUuZy4gXCJ0ZXh0L2V2ZW50LXN0cmVhbSwgKi8qXCIpLCBzbyBleGFjdCBlcXVhbGl0eSBtaXNzZWRcbiAgICAgICAgLy8gdGhvc2UgYW5kIGNvbXByZXNzZWQvYnVmZmVyZWQgdGhlIHN0cmVhbS5cbiAgICAgICAgaWYgKChyZXEuaGVhZGVycy5hY2NlcHQgfHwgJycpLmluY2x1ZGVzKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb21wcmVzc2lvbi5maWx0ZXIocmVxLCByZXMpO1xuICAgICAgfSxcbiAgICAgIHRocmVzaG9sZDogQ29yZUNvbnN0YW50cy5DT01QUkVTU0lPTl9USFJFU0hPTERfQllURVMsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gRVRhZyBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBHRVQgcmVxdWVzdHMgKDMwNCBOb3QgTW9kaWZpZWQpXG4gIGFwcC51c2UoZXRhZ01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gQm9keSBwYXJzaW5nXG4gIGlmIChlbmFibGVKc29uQm9keSkge1xuICAgIGFwcC51c2UoZXhwcmVzcy5qc29uKHsgbGltaXQ6IGpzb25MaW1pdCB9KSk7XG4gIH1cblxuICBpZiAoZW5hYmxlVXJsRW5jb2RlZCkge1xuICAgIGFwcC51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUsIGxpbWl0OiB1cmxFbmNvZGVkTGltaXQgfSkpO1xuICB9XG5cbiAgLy8gVHJ1c3QgcHJveHkgKG11c3QgYmUgc2V0IGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gcmVxLmlwIHJlc29sdmVzIGNvcnJlY3RseSlcbiAgYXBwLnNldCgndHJ1c3QgcHJveHknLCBzZXJ2ZXJDb25maWcudHJ1c3RQcm94eSk7XG5cbiAgLy8gUmVxdWVzdCBJRCDigJQgcHJlZmVyIGV4aXN0aW5nIGhlYWRlciBmcm9tIG5naW54LCBvdGhlcndpc2UgZ2VuZXJhdGUgb25lXG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3QgaGRyID0gcmVxLmhlYWRlcnNbJ3gtcmVxdWVzdC1pZCddO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChBcnJheS5pc0FycmF5KGhkcikgPyBoZHJbMF0gOiBoZHIpIHx8IHV1aWQoKTtcbiAgICByZXEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtUmVxdWVzdC1JZCcsIHJlcXVlc3RJZCk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBIZWFsdGggY2hlY2sgcmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyIHNvIGl0IGlzIG5ldmVyIHRocm90dGxlZFxuICBhcHAudXNlKGNyZWF0ZUhlYWx0aFJvdXRlcih7XG4gICAgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJyxcbiAgICBjaGVja0RlcGVuZGVuY2llcyxcbiAgfSkpO1xuXG4gIC8vIFJlYWRpbmVzcyBndWFyZCDigJQgNTAzcyBidXNpbmVzcyB0cmFmZmljIHdoaWxlIHRoZSBzZXJ2aWNlIGlzIE5vdFJlYWR5XG4gIC8vIChkYXRhc3RvcmUgc3RpbGwgY29ubmVjdGluZyBhdCBzdGFydHVwLCBvciBkcm9wcGVkKS4gTW91bnRlZCByaWdodCBhZnRlclxuICAvLyB0aGUgaGVhbHRoIHJvdXRlciBhbmQgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBzbyBhIE5vdFJlYWR5IHJlcXVlc3QgaXNcbiAgLy8gcmVqZWN0ZWQgY2hlYXBseSwgYmVmb3JlIHJhdGUtbGltaXQgLyBpZGVtcG90ZW5jeSAvIGJ1c2luZXNzIGhhbmRsZXJzIGV2ZXJcbiAgLy8gdG91Y2ggYSBkaXNjb25uZWN0ZWQgZGF0YXN0b3JlLiBJdCBhbGxvd2xpc3RzIHRoZSBpbmZyYSBlbmRwb2ludHNcbiAgLy8gKC9tZXRyaWNzLCAvd2FybXVwLCAvZG9jcywgL2xvZ3MpIHJlZ2lzdGVyZWQgYmVsb3csIHBsdXMgL2hlYWx0aCArIC9yZWFkeS5cbiAgYXBwLnVzZShyZWFkaW5lc3NHdWFyZCgpKTtcblxuICAvLyBXYXJtLXVwIGVuZHBvaW50IOKAlCBwcmUtb3BlbnMgY29ubmVjdGlvbiBwb29scyBzbyB0aGUgZmlyc3QgcmVhbCByZXF1ZXN0XG4gIC8vIGRvZXNuJ3QgcGF5IGNvbGQtc3RhcnQgbGF0ZW5jeS4gQWx3YXlzIHBpbmdzIFBvc3RncmVzOyBzZXJ2aWNlcyB1c2luZ1xuICAvLyBNb25nbyAvIFJlZGlzIC8gU1FTIHBhc3MgYHdhcm11cEhvb2tzYCBzbyB0aG9zZSBhcmUgd2FybWVkIGluIHBhcmFsbGVsLlxuICBhcHAuZ2V0KCcvd2FybXVwJywgYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSxcbiAgICAgICAgLi4ud2FybXVwSG9va3MubWFwKChob29rKSA9PiBob29rKCkpLFxuICAgICAgXSk7XG4gICAgICBzZW5kU3VjY2VzcyhyZXMsIDIwMCwgeyB3YXJtZWQ6IHRydWUsIGhvb2tzOiB3YXJtdXBIb29rcy5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdXYXJtdXAgZmFpbGVkJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgZW5kcG9pbnQg4oCUIGFsd2F5cyByZWdpc3RlcmVkIChuZXZlciB0aHJvdHRsZWQpXG4gIGFwcC5nZXQoJy9tZXRyaWNzJywgbWV0cmljc0hhbmRsZXIoKSk7XG5cbiAgLy8gT3BlbkFQSSBzcGVjIGFuZCBTd2FnZ2VyIFVJIChyZWdpc3RlcmVkIGJlZm9yZSByYXRlIGxpbWl0ZXIpXG4gIGlmIChlbmFibGVPcGVuQXBpKSB7XG4gICAgY29uc3Qgc3BlYyA9IGdlbmVyYXRlT3BlbkFwaVNwZWMob3BlbkFwaU9wdGlvbnMpO1xuICAgIGFwcC5nZXQoJy9kb2NzL29wZW5hcGkuanNvbicsIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICByZXMuanNvbihzcGVjKTtcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvZG9jcycsIHN3YWdnZXJVaS5zZXJ2ZSwgc3dhZ2dlclVpLnNldHVwKHNwZWMsIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogb3BlbkFwaU9wdGlvbnM/LnRpdGxlID8/ICdQaXBlbGluZSBCdWlsZGVyIEFQSSBEb2NzJyxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBSYXRlIGxpbWl0aW5nIOKAlCB1c2VzIFJlZGlzIHdoZW4gcmVkaXNVcmwgaXMgcHJvdmlkZWQgZm9yIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgaW5zdGFuY2VzXG4gIGlmIChlbmFibGVSYXRlTGltaXQpIHtcbiAgICBjb25zdCByYXRlTGltaXRDb25maWcgPSBDb25maWcuZ2V0KCdyYXRlTGltaXQnKTtcblxuICAgIGNvbnN0IHJhdGVMaW1pdE9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgICBtYXg6IHJhdGVMaW1pdENvbmZpZy5tYXgsXG4gICAgICB3aW5kb3dNczogcmF0ZUxpbWl0Q29uZmlnLndpbmRvd01zLFxuICAgICAgc3RhbmRhcmRIZWFkZXJzOiB0cnVlLFxuICAgICAgbGVnYWN5SGVhZGVyczogZmFsc2UsXG4gICAgICAvLyBTa2lwIHJhdGUgbGltaXRpbmcgb25seSBmb3IgQ1JZUFRPR1JBUEhJQ0FMTFktVkVSSUZJRUQgaW50ZXJuYWwgc2VydmljZVxuICAgICAgLy8gY2FsbGVycy4gVGhlIGxpbWl0ZXIgcnVucyBiZWZvcmUgcmVxdWlyZUF1dGgsIHNvIHRoZSBwcmV2aW91c2x5LXRydXN0ZWRcbiAgICAgIC8vIHBsYWludGV4dCBgeC1pbnRlcm5hbC1zZXJ2aWNlYCBoZWFkZXIgd2FzIHNwb29mYWJsZSBieSBhbnkgZXh0ZXJuYWxcbiAgICAgIC8vIGNsaWVudCDihpIgdG90YWwgYnlwYXNzLiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsIHZlcmlmaWVzIHRoZSBzaWduZWRcbiAgICAgIC8vIHNlcnZpY2UgSldUIGluc3RlYWQ7IGludGVyLXNlcnZpY2UgY2FsbGVycyBhbGwgc2VuZCBvbmVcbiAgICAgIC8vIChnZXRTZXJ2aWNlQXV0aEhlYWRlcikuXG4gICAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcSksXG4gICAgICAvLyBLZXkgb24gY2xpZW50IElQIG9ubHkuIFRoZSBsaW1pdGVyIHJ1bnMgcHJlLWF1dGgsIHNvIGByZXEudXNlcmAgaXMgdW5zZXRcbiAgICAgIC8vIGFuZCBhbnkgb3JnIGlkIHdvdWxkIGNvbWUgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGB4LW9yZy1pZGAgaGVhZGVyIOKAlFxuICAgICAgLy8gc3Bvb2ZhYmxlLCBsZXR0aW5nIGFuIGF0dGFja2VyIHJvdGF0ZSB2YWx1ZXMgdG8gZXZhZGUgdGhlIGJ1Y2tldCBvclxuICAgICAgLy8gZmxvb2QgYSB2aWN0aW0gb3JnJ3MgYnVja2V0LiBpcEtleUdlbmVyYXRvciBub3JtYWxpemVzIElQdjYgdG8gYSAvNjRcbiAgICAgIC8vIHByZWZpeCAoYWxzbyByZXF1aXJlZCBieSBleHByZXNzLXJhdGUtbGltaXQgOC54J3MgdmFsaWRhdG9yKS5cbiAgICAgIGtleUdlbmVyYXRvcjogKHJlcTogUmVxdWVzdCkgPT4gaXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpLFxuICAgICAgaGFuZGxlcjogKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCAnVG9vIG1hbnkgcmVxdWVzdHMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERUQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIFJlZGlzIHN0b3JlIHdoZW4gYXZhaWxhYmxlIGZvciBzaGFyZWQgc3RhdGUgYWNyb3NzIGluc3RhbmNlc1xuICAgIGlmIChvcHRpb25zLnJlZGlzVXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBFU00gaGFzIG5vIGdsb2JhbCBgcmVxdWlyZWA7IHNhZmVDcmVhdGVSZXF1aXJlIGxvYWRzIHRoZSBvcHRpb25hbFxuICAgICAgICAvLyByZWRpcyBkZXBzIHN5bmNocm9ub3VzbHkgaGVyZSAob25seSB3aGVuIGEgcmVkaXNVcmwgaXMgY29uZmlndXJlZCkuXG4gICAgICAgIC8vIChDSlMtYnVuZGxlIHNhZmUg4oCUIHNlZSBhcGktY29yZSdzIHNhZmUtcmVxdWlyZS50cy4pXG4gICAgICAgIGNvbnN0IHJlcXVpcmUgPSBzYWZlQ3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICBjb25zdCB7IFJlZGlzU3RvcmUgfSA9IHJlcXVpcmUoJ3JhdGUtbGltaXQtcmVkaXMnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgY29uc3QgUmVkaXMgPSByZXF1aXJlKCdpb3JlZGlzJyk7XG4gICAgICAgIGNvbnN0IHJlZGlzQ2xpZW50ID0gbmV3IFJlZGlzKG9wdGlvbnMucmVkaXNVcmwpO1xuICAgICAgICAvLyBpb3JlZGlzIGVtaXRzICdlcnJvcicgb24gY29ubmVjdGlvbiBsb3NzOyB3aXRob3V0IGEgbGlzdGVuZXIgTm9kZVxuICAgICAgICAvLyB0cmVhdHMgaXQgYXMgYW4gdW5oYW5kbGVkICdlcnJvcicgZXZlbnQgYW5kIENSQVNIRVMgdGhlIHByb2Nlc3MuIExvZ1xuICAgICAgICAvLyBhbmQgbGV0IGlvcmVkaXMgYXV0by1yZWNvbm5lY3QgKHJhdGUgbGltaXRpbmcgZmFsbHMgYmFjayBwZXItc3RvcmUpLlxuICAgICAgICByZWRpc0NsaWVudC5vbignZXJyb3InLCAoZTogdW5rbm93bikgPT5cbiAgICAgICAgICBjcmVhdGVMb2dnZXIoJ3JhdGUtbGltaXQnKS53YXJuKCdSZWRpcyByYXRlLWxpbWl0IHN0b3JlIGVycm9yJywgeyBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpIH0pKTtcbiAgICAgICAgcmF0ZUxpbWl0T3B0aW9ucy5zdG9yZSA9IG5ldyBSZWRpc1N0b3JlKHtcbiAgICAgICAgICBzZW5kQ29tbWFuZDogKC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiByZWRpc0NsaWVudC5jYWxsKC4uLmFyZ3MpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3JhdGUtbGltaXQnKS53YXJuKCdSZWRpcyBzdG9yZSB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGluLW1lbW9yeSByYXRlIGxpbWl0aW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwLnVzZShyYXRlTGltaXQocmF0ZUxpbWl0T3B0aW9ucykpO1xuICB9XG5cbiAgLy8gRXhwcmVzcyByZXF1ZXN0IHRpbWVvdXQg4oCUIHVzZXMgQ29yZUNvbnN0YW50cyB0byBzaGFyZSB0aGUgc2FtZSBkZWZhdWx0IGFzIExhbWJkYSBoYW5kbGVyc1xuICBjb25zdCB0aW1lb3V0TXMgPSBDb3JlQ29uc3RhbnRzLkhBTkRMRVJfVElNRU9VVF9NUztcbiAgYXBwLnVzZSgoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgcmVzLnNldFRpbWVvdXQodGltZW91dE1zLCAoKSA9PiB7XG4gICAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdSZXF1ZXN0IHRpbWVvdXQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIFJlcXVlc3QgZHVyYXRpb24gbG9nZ2luZ1xuICBjb25zdCBkdXJhdGlvbkxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVxdWVzdC1kdXJhdGlvbicpO1xuICBhcHAudXNlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgZHVyYXRpb25Mb2dnZXIuaW5mbyhgJHtyZXEubWV0aG9kfSAke3JlcS5vcmlnaW5hbFVybH0gJHtyZXMuc3RhdHVzQ29kZX0gJHtkdXJhdGlvbn1tc2AsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEub3JpZ2luYWxVcmwsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICBkdXJhdGlvbk1zOiBkdXJhdGlvbixcbiAgICAgICAgcmVxdWVzdElkOiByZXEucmVxdWVzdElkLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgbWlkZGxld2FyZSDigJQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudFxuICBhcHAudXNlKG1ldHJpY3NNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIE5PVEU6IGlkZW1wb3RlbmN5IGlzIGludGVudGlvbmFsbHkgTk9UIG1vdW50ZWQgaGVyZS4gSXQgbmVlZHMgdGhlIFZFUklGSUVEXG4gIC8vIG9yZyBpZCB0byBuYW1lc3BhY2UgaXRzIHJlcGxheSBjYWNoZSwgYnV0IHRoaXMgcHJlLWF1dGggcG9zaXRpb24gcnVucyBiZWZvcmVcbiAgLy8gYHJlcXVpcmVBdXRoYC9gYXR0YWNoUmVxdWVzdENvbnRleHRgIHBvcHVsYXRlIGlkZW50aXR5LCBzbyBhIGdsb2JhbCBtb3VudFxuICAvLyBoZXJlIGlzIGEgcGVybWFuZW50IG5vLW9wIChvcmcgYWx3YXlzIHVuZGVmaW5lZCDihpIgc2tpcCkuIEl0IGlzIGluc3RlYWQgd2lyZWRcbiAgLy8gaW50byB0aGUgcG9zdC1hdXRoIHJvdXRlIGNoYWlucyDigJQgc2VlIGBjcmVhdGVQcm90ZWN0ZWRSb3V0ZWAgL1xuICAvLyBgY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZWAgaW4gbWlkZGxld2FyZS1mYWN0b3J5LnRzLlxuXG4gIC8vIFNTRSBsb2dzIGVuZHBvaW50IOKAlCB0aWNrZXQtZ2F0ZWQgKFdhdmUgMmIpLlxuICAvLyBUaGUgc3RyZWFtIGNhcnJpZXMgcGVyLW9yZyBidWlsZCBsb2dzLCBzbyBpdCBtdXN0IG5vdCBiZSB3b3JsZC1yZWFkYWJsZS5cbiAgLy8gQ2xpZW50cyBmaXJzdCBQT1NUIC9sb2dzL3RpY2tldCAoSldULWF1dGhlbnRpY2F0ZWQpIHRvIG1pbnQgYSBzaG9ydC1saXZlZCxcbiAgLy8gc2luZ2xlLXVzZSB0aWNrZXQgYm91bmQgdG8gdGhlaXIgb3JnIEFORCB0byB0aGUgc3BlY2lmaWMgYHJlcXVlc3RJZGAgc3RyZWFtXG4gIC8vIHRoZXkgaW50ZW5kIHRvIG9wZW4sIHRoZW4gb3BlbiB0aGUgRXZlbnRTb3VyY2Ugd2l0aCA/dGlja2V0PTx0Pi4gVGhpcyBrZWVwc1xuICAvLyB0aGUgSldUIG91dCBvZiBxdWVyeSBzdHJpbmdzIC8gYWNjZXNzIGxvZ3Mgd2hpbGUgZW5mb3JjaW5nIG9yZyBvd25lcnNoaXAsXG4gIC8vIHBlci1zdWJqZWN0IGF1dGhvcml6YXRpb24sIGFuZCB0aGUgcGVyLW9yZyBjb25uZWN0aW9uIGNhcCBvbiB0aGUgc3RyZWFtLlxuICAvLyBNaXJyb3JzIHRoZSBtZXNzYWdlLXNlcnZpY2Ugbm90aWZpY2F0aW9ucyBTU0UgdGlja2V0IGV4Y2hhbmdlLlxuICBhcHAucG9zdCgnL2xvZ3MvdGlja2V0JywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIW9yZ0lkKSB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDAsICdUb2tlbiBtaXNzaW5nIG9yZ2FuaXphdGlvbicsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIGNhbGxlciBtdXN0IG5hbWUgdGhlIHN0cmVhbSBzdWJqZWN0IHVwIGZyb250IHNvIHRoZSB0aWNrZXQgaXMgYm91bmQgdG9cbiAgICAvLyBpdC4gV2l0aG91dCB0aGlzLCBhIHRpY2tldCBjb3VsZCBiZSByZXBsYXllZCBhZ2FpbnN0IEFOWSByZXF1ZXN0SWQgdGhlXG4gICAgLy8gb3JnIGNvdWxkIGd1ZXNzLCBsZXR0aW5nIGl0IGF0dGFjaCB0byBhbm90aGVyIG9yZydzIGxvZyBzdHJlYW0uIFN0cmljdGx5XG4gICAgLy8gZm9ybWF0LXZhbGlkYXRlZCBzbyBpdCBjYW4ndCBjYXJyeSBhbiBpbmplY3Rpb24gcGF5bG9hZCBpbnRvIHRoZSBzdWJqZWN0LlxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChyZXEuYm9keSBhcyB7IHJlcXVlc3RJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlcXVlc3RJZDtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RJZCAhPT0gJ3N0cmluZycgfHwgIVNTRV9SRVFVRVNUX0lEX1JFLnRlc3QocmVxdWVzdElkKSkge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDAwLCAnTWlzc2luZyBvciBpbnZhbGlkIHJlcXVlc3RJZCcsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3NlTWFuYWdlci5jcmVhdGVUaWNrZXQob3JnSWQsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICAvLyBUaGUgc3ViamVjdCBpcyBvd25lZCBieSBhbm90aGVyIG9yZyDigJQgZG8gbm90IGNvbmZpcm0gaXQgZXhpc3RzOyBhIHBsYWluXG4gICAgICAgIC8vIDQwMyBpcyBlbm91Z2ggYW5kIGxlYWtzIG5vdGhpbmcgYWJvdXQgd2hpY2ggcmVxdWVzdElkcyBhcmUgbGl2ZS5cbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDAzLCAnTm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgbG9nIHN0cmVhbScsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVhc29uID09PSAnb3JnLWxpbWl0Jykge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA0MjksICdUb28gbWFueSBsb2cgc3RyZWFtIHRpY2tldHMgaXNzdWVkJywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ0xvZyBzdHJlYW1pbmcgc3Vic3lzdGVtIGF0IGNhcGFjaXR5JywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VuZFN1Y2Nlc3MocmVzLCAyMDAsIHsgdGlja2V0OiByZXN1bHQudGlja2V0IH0pO1xuICB9KTtcblxuICAvLyBUaGUgc3RyZWFtIGl0c2VsZiByZXNvbHZlcyArIGNvbnN1bWVzIHRoZSB0aWNrZXQgaW5zaWRlIG1pZGRsZXdhcmUoKSBhbmRcbiAgLy8gcmVqZWN0cyBhbnkgYW5vbnltb3VzIC8gaW52YWxpZCAvIGV4cGlyZWQgLyBhbHJlYWR5LXVzZWQgdGlja2V0IHdpdGggNDAxLlxuICBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuXG4gIHJldHVybiB7IGFwcCwgc3NlTWFuYWdlciB9O1xufVxuIl19
@@ -30,9 +30,39 @@ export interface IdempotencyStore {
30
30
  }
31
31
  /** Default in-memory store. Single-replica only. Exported for testing. */
32
32
  export declare function createMemoryStore(): IdempotencyStore;
33
+ /**
34
+ * Minimal Redis surface the idempotency store needs (an ioredis subset).
35
+ * `set` supports the variadic option tail: `SET key val EX <ttl> [NX]`, which
36
+ * returns `'OK'` on success and `null` when an `NX` set was refused.
37
+ */
38
+ export interface RedisIdempotencyClient {
39
+ get(key: string): Promise<string | null>;
40
+ set(key: string, value: string, ...args: (string | number)[]): Promise<string | null>;
41
+ del(key: string): Promise<number>;
42
+ }
43
+ /**
44
+ * Redis-backed {@link IdempotencyStore} for correct deduplication across
45
+ * horizontally-scaled replicas. `reserve` maps to an atomic `SET … NX` so two
46
+ * pods behind a load-balancer can't both win a first-time request sharing an
47
+ * Idempotency-Key; a retry landing on ANY pod sees the same committed response.
48
+ * Redis TTL owns expiry (the `CachedEntry.expiresAt` field is carried only for
49
+ * API-shape parity with the memory store).
50
+ */
51
+ export declare function createRedisIdempotencyStore(redis: RedisIdempotencyClient): IdempotencyStore;
52
+ /**
53
+ * Build a Redis-backed idempotency store from the shared env Redis (the same
54
+ * `REDIS_URL` / `REDIS_HOST` wiring the rate-limiter and audit-spool use).
55
+ * Returns `null` when Redis isn't configured/available so the caller keeps the
56
+ * in-memory default (single-replica correctness). Never throws.
57
+ */
58
+ export declare function createEnvRedisIdempotencyStore(): IdempotencyStore | null;
59
+ /** Inject the process-wide idempotency store (e.g. a Redis-backed one). */
60
+ export declare function setIdempotencyStore(store: IdempotencyStore): void;
61
+ /** The current process-wide default store (in-memory unless overridden). */
62
+ export declare function getIdempotencyStore(): IdempotencyStore;
33
63
  export interface IdempotencyMiddlewareOptions {
34
- /** Custom store backend (default: in-memory). Pass a Redis-backed store
35
- * for multi-replica deployments. */
64
+ /** Custom store backend. Defaults to the process-wide store set via
65
+ * {@link setIdempotencyStore} (in-memory until `createApp` wires Redis). */
36
66
  store?: IdempotencyStore;
37
67
  }
38
68
  /**
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { createHash } from 'crypto';
4
- import { createLogger, sendError, ErrorCode } from '@pipeline-builder/api-core';
4
+ import { createLogger, sendError, ErrorCode, createEnvRedisClient } from '@pipeline-builder/api-core';
5
5
  import { CoreConstants } from '@pipeline-builder/pipeline-core';
6
6
  const logger = createLogger('idempotency');
7
7
  /**
@@ -94,7 +94,73 @@ export function createMemoryStore() {
94
94
  },
95
95
  };
96
96
  }
97
+ const REDIS_KEY_PREFIX = 'idem:';
98
+ /**
99
+ * Redis-backed {@link IdempotencyStore} for correct deduplication across
100
+ * horizontally-scaled replicas. `reserve` maps to an atomic `SET … NX` so two
101
+ * pods behind a load-balancer can't both win a first-time request sharing an
102
+ * Idempotency-Key; a retry landing on ANY pod sees the same committed response.
103
+ * Redis TTL owns expiry (the `CachedEntry.expiresAt` field is carried only for
104
+ * API-shape parity with the memory store).
105
+ */
106
+ export function createRedisIdempotencyStore(redis) {
107
+ const k = (key) => `${REDIS_KEY_PREFIX}${key}`;
108
+ return {
109
+ async get(key) {
110
+ const raw = await redis.get(k(key));
111
+ if (!raw)
112
+ return null;
113
+ try {
114
+ return JSON.parse(raw);
115
+ }
116
+ catch {
117
+ // Corrupt entry → treat as absent so the request proceeds fresh.
118
+ return null;
119
+ }
120
+ },
121
+ async set(key, entry, ttlSeconds) {
122
+ await redis.set(k(key), JSON.stringify(entry), 'EX', Math.max(1, ttlSeconds));
123
+ },
124
+ async reserve(key, entry, ttlSeconds) {
125
+ // Atomic claim: SET key val EX ttl NX → 'OK' only if the key was absent.
126
+ const res = await redis.set(k(key), JSON.stringify(entry), 'EX', Math.max(1, ttlSeconds), 'NX');
127
+ return res === 'OK';
128
+ },
129
+ async delete(key) {
130
+ await redis.del(k(key));
131
+ },
132
+ };
133
+ }
134
+ /**
135
+ * Build a Redis-backed idempotency store from the shared env Redis (the same
136
+ * `REDIS_URL` / `REDIS_HOST` wiring the rate-limiter and audit-spool use).
137
+ * Returns `null` when Redis isn't configured/available so the caller keeps the
138
+ * in-memory default (single-replica correctness). Never throws.
139
+ */
140
+ export function createEnvRedisIdempotencyStore() {
141
+ const client = createEnvRedisClient('idempotency');
142
+ if (!client)
143
+ return null;
144
+ logger.info('Redis idempotency store initialized');
145
+ return createRedisIdempotencyStore(client);
146
+ }
97
147
  const memoryStore = createMemoryStore();
148
+ /**
149
+ * Process-wide default store used by `idempotencyMiddleware()` when no explicit
150
+ * `store` is passed. Defaults to the in-memory store; `createApp` promotes it to
151
+ * the shared env-Redis store (multi-replica dedup) at startup via
152
+ * {@link setIdempotencyStore}. The route factories keep calling
153
+ * `idempotencyMiddleware()` with no args and transparently pick this up.
154
+ */
155
+ let defaultStore = memoryStore;
156
+ /** Inject the process-wide idempotency store (e.g. a Redis-backed one). */
157
+ export function setIdempotencyStore(store) {
158
+ defaultStore = store;
159
+ }
160
+ /** The current process-wide default store (in-memory unless overridden). */
161
+ export function getIdempotencyStore() {
162
+ return defaultStore;
163
+ }
98
164
  /**
99
165
  * Middleware that supports idempotency keys for POST/PUT/DELETE mutations.
100
166
  *
@@ -107,10 +173,14 @@ const memoryStore = createMemoryStore();
107
173
  * replicas.
108
174
  */
109
175
  export function idempotencyMiddleware(options = {}) {
110
- const store = options.store ?? memoryStore;
176
+ // Resolve the store PER REQUEST (not at factory time) so a store injected by
177
+ // createApp AFTER the route chains are built still takes effect. An explicit
178
+ // `options.store` always wins.
179
+ const explicitStore = options.store;
111
180
  const ttlMs = CoreConstants.IDEMPOTENCY_TTL_MS;
112
181
  const ttlSec = Math.floor(ttlMs / 1000);
113
182
  return (req, res, next) => {
183
+ const store = explicitStore ?? defaultStore;
114
184
  const key = req.headers['idempotency-key'];
115
185
  if (!key)
116
186
  return next();
@@ -248,4 +318,4 @@ export function idempotencyMiddleware(options = {}) {
248
318
  });
249
319
  };
250
320
  }
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaWRlbXBvdGVuY3ktbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDeEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FB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LEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFO29CQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO3dCQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0UsT0FBTyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUVELHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUseUVBQXlFO1lBQ3pFLHNFQUFzRTtZQUN0RSwwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2YsMEVBQTBFO1lBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0RBQXdELEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pKLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBzZW5kRXJyb3IsIEVycm9yQ29kZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvcmVDb25zdGFudHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2lkZW1wb3RlbmN5Jyk7XG5cbi8qKlxuICogQ2Fub25pY2FsIChrZXktc29ydGVkKSBKU09OIHNlcmlhbGl6YXRpb24gc28gdGhlIFNBTUUgbG9naWNhbCBwYXlsb2FkIGhhc2hlc1xuICogaWRlbnRpY2FsbHkgcmVnYXJkbGVzcyBvZiBwcm9wZXJ0eSBpbnNlcnRpb24gb3JkZXIg4oCUIGEgcGxhaW4gYEpTT04uc3RyaW5naWZ5YFxuICogd291bGQgbGV0IGB7YSxifWAgYW5kIGB7YixhfWAgcHJvZHVjZSBkaWZmZXJlbnQgZmluZ2VycHJpbnRzIGZvciBvbmUgcmVxdWVzdC5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlU3RyaW5naWZ5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPz8gJ251bGwnO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnWycgKyB2YWx1ZS5tYXAoc3RhYmxlU3RyaW5naWZ5KS5qb2luKCcsJykgKyAnXSc7XG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gJ3snICsgT2JqZWN0LmtleXMob2JqKS5zb3J0KCkubWFwKChrKSA9PiBKU09OLnN0cmluZ2lmeShrKSArICc6JyArIHN0YWJsZVN0cmluZ2lmeShvYmpba10pKS5qb2luKCcsJykgKyAnfSc7XG59XG5cbi8qKlxuICogU2hvcnQsIHN0YWJsZSBmaW5nZXJwcmludCBvZiBhIHJlcXVlc3QgYm9keS4gRm9sZHMgdGhlIHBheWxvYWQgaW50byB0aGVcbiAqIGlkZW1wb3RlbmN5IGtleSBzbyByZXBsYXlpbmcgdGhlIFNBTUUga2V5IHdpdGggYSBESUZGRVJFTlQgYm9keSBpcyB0cmVhdGVkIGFzXG4gKiBhIGRpc3RpbmN0IG9wZXJhdGlvbiAoZnJlc2ggZXhlY3V0aW9uKSByYXRoZXIgdGhhbiByZXBsYXlpbmcgdGhlIG9sZCByZXNwb25zZS5cbiAqIEVtcHR5L2Fic2VudCBib2RpZXMgY29sbGFwc2UgdG8gJy0nIHNvIGJvZHktbGVzcyBtdXRhdGlvbnMgc3RheSB1bmFmZmVjdGVkLlxuICovXG5mdW5jdGlvbiBib2R5RmluZ2VycHJpbnQoYm9keTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChib2R5ID09PSB1bmRlZmluZWQgfHwgYm9keSA9PT0gbnVsbCkgcmV0dXJuICctJztcbiAgaWYgKHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhib2R5IGFzIG9iamVjdCkubGVuZ3RoID09PSAwKSByZXR1cm4gJy0nO1xuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc3RhYmxlU3RyaW5naWZ5KGJvZHkpKS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIDE2KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm9uLXNlcmlhbGl6YWJsZSBib2R5IChlLmcuIGEgc3RyZWFtL2NpcmN1bGFyIHJlZik6IHNraXAgZmluZ2VycHJpbnRpbmdcbiAgICAvLyByYXRoZXIgdGhhbiBmYWlsIHRoZSByZXF1ZXN0IOKAlCBrZXkgc3RheXMgc2NvcGVkIGJ5IG1ldGhvZCtyb3V0ZStvcmcuXG4gICAgcmV0dXJuICctJztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2FjaGVkRW50cnkge1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIGJvZHk6IHVua25vd247XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xuICAvKiogUmVzZXJ2YXRpb24gcGxhY2Vob2xkZXI6IHRoZSByZXF1ZXN0IGlzIGluLWZsaWdodCwgbm8gcmVhbCByZXNwb25zZSB5ZXQuXG4gICAqICBBIGR1cGxpY2F0ZSB0aGF0IHNlZXMgYSBwZW5kaW5nIGVudHJ5IGlzIHJlamVjdGVkIHdpdGggNDA5LCBub3QgcmVwbGF5ZWQuICovXG4gIHBlbmRpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBsdWdnYWJsZSBiYWNrZW5kIGZvciBpZGVtcG90ZW5jeS1rZXkgcmVwbGF5IGNhY2hlLiBUaGUgZGVmYXVsdCBpbi1tZW1vcnlcbiAqIGltcGxlbWVudGF0aW9uIHdvcmtzIGZpbmUgc2luZ2xlLXJlcGxpY2E7IGEgUmVkaXMtYmFja2VkIGltcGxlbWVudGF0aW9uXG4gKiBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCBkZWR1cGxpY2F0aW9uIGFjcm9zcyBob3Jpem9udGFsbHktc2NhbGVkIHJlcGxpY2FzXG4gKiAob3RoZXJ3aXNlIHR3byByZXBsaWNhcyBiZWhpbmQgYSBsb2FkLWJhbGFuY2VyIGNhY2hlIGluZGVwZW5kZW50bHkgYW5kIGFcbiAqIHJldHJ5IGhpdHRpbmcgYSBkaWZmZXJlbnQgcG9kIHdvbid0IHJlcGxheSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbXBvdGVuY3lTdG9yZSB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8Q2FjaGVkRW50cnkgfCBudWxsPjtcbiAgc2V0KGtleTogc3RyaW5nLCBlbnRyeTogQ2FjaGVkRW50cnksIHR0bFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGNsYWltIGBrZXlgIElGRiBpdCBpcyBjdXJyZW50bHkgYWJzZW50LiBSZXR1cm5zIGB0cnVlYCB3aGVuIFRISVNcbiAgICogY2FsbGVyIHNldCB0aGUgZW50cnkgKHdvbiB0aGUgcmFjZSksIGBmYWxzZWAgd2hlbiBhbiBlbnRyeSBhbHJlYWR5IGV4aXN0cy5cbiAgICogVGhpcyBpcyB3aGF0IHNlcmlhbGl6ZXMgY29uY3VycmVudCBmaXJzdC10aW1lIHJlcXVlc3RzIHRoYXQgc2hhcmUgYW5cbiAgICogSWRlbXBvdGVuY3ktS2V5IOKAlCBhIHBsYWluIGdldC10aGVuLXNldCBsZWF2ZXMgYSB3aW5kb3cgd2hlcmUgdHdvIHJlcXVlc3RzXG4gICAqIGJvdGggc2VlIFwibm90IGNhY2hlZFwiIGFuZCBib3RoIGV4ZWN1dGUgdGhlIG11dGF0aW9uLlxuICAgKi9cbiAgcmVzZXJ2ZShrZXk6IHN0cmluZywgZW50cnk6IENhY2hlZEVudHJ5LCB0dGxTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogUmVtb3ZlIGEga2V5IOKAlCByZWxlYXNlcyBhIHJlc2VydmF0aW9uIGFmdGVyIGEgbm9uLWNhY2hlYWJsZSAobm9uLTJ4eCkgcmVzcG9uc2UuICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBEZWZhdWx0IGluLW1lbW9yeSBzdG9yZS4gU2luZ2xlLXJlcGxpY2Egb25seS4gRXhwb3J0ZWQgZm9yIHRlc3RpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtb3J5U3RvcmUoKTogSWRlbXBvdGVuY3lTdG9yZSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRFbnRyeT4oKTtcbiAgY29uc3QgY2xlYW51cFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgbWFwKSB7XG4gICAgICBpZiAobm93ID4gdi5leHBpcmVzQXQpIG1hcC5kZWxldGUoayk7XG4gICAgfVxuICB9LCBDb3JlQ29uc3RhbnRzLklERU1QT1RFTkNZX0NMRUFOVVBfSU5URVJWQUxfTVMpO1xuICBjbGVhbnVwVGltZXIudW5yZWYoKTtcblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIChub24tZXhwaXJlZCkgZW50cnksIGV2aWN0aW5nIGl0IGxhemlseSBpZiBleHBpcmVkLiAqL1xuICBjb25zdCBsaXZlID0gKGtleTogc3RyaW5nKTogQ2FjaGVkRW50cnkgfCBudWxsID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IG1hcC5nZXQoa2V5KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4gbnVsbDtcbiAgICBpZiAoRGF0ZS5ub3coKSA+IGVudHJ5LmV4cGlyZXNBdCkge1xuICAgICAgbWFwLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfTtcbiAgLyoqXG4gICAqIEF0IGNhcGFjaXR5LCBldmljdCB0aGUgT0xERVNUIGVudHJ5IChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlcikgcmF0aGVyXG4gICAqIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgdGhlIE5FVyBrZXkg4oCUIG90aGVyd2lzZSwgb25jZSBmdWxsLCB0aGUgc3RvcmUgc3RvcHNcbiAgICogZGVkdXBsaWNhdGluZyBmcmVzaCByZXF1ZXN0cyB1bnRpbCB0aGUgVFRMIHN3ZWVwIHJ1bnMuIFN0YXlzIGJvdW5kZWQ7IGZhdm9yc1xuICAgKiByZWNlbnQga2V5cyAobW9zdCBsaWtlbHkgdG8gYmUgcmV0cmllZCkuXG4gICAqL1xuICBjb25zdCBldmljdElmRnVsbCA9IChrZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICghbWFwLmhhcyhrZXkpICYmIG1hcC5zaXplID49IENvcmVDb25zdGFudHMuSURFTVBPVEVOQ1lfTUFYX1NUT1JFX1NJWkUpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IG1hcC5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSBtYXAuZGVsZXRlKG9sZGVzdCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBsaXZlKGtleSk7XG4gICAgfSxcbiAgICBhc3luYyBzZXQoa2V5LCBlbnRyeSkge1xuICAgICAgZXZpY3RJZkZ1bGwoa2V5KTtcbiAgICAgIG1hcC5zZXQoa2V5LCBlbnRyeSk7XG4gICAgfSxcbiAgICBhc3luYyByZXNlcnZlKGtleSwgZW50cnkpIHtcbiAgICAgIC8vIEF0b21pYyBpbiBhIHNpbmdsZS10aHJlYWRlZCBydW50aW1lOiBubyBhd2FpdCBiZXR3ZWVuIHRoZSBsaXZlbmVzcyBjaGVja1xuICAgICAgLy8gYW5kIHRoZSBzZXQsIHNvIHR3byBjb25jdXJyZW50IGNhbGxlcnMgY2FuJ3QgYm90aCBvYnNlcnZlIFwiYWJzZW50XCIuXG4gICAgICBpZiAobGl2ZShrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBldmljdElmRnVsbChrZXkpO1xuICAgICAgbWFwLnNldChrZXksIGVudHJ5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgYXN5bmMgZGVsZXRlKGtleSkge1xuICAgICAgbWFwLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IG1lbW9yeVN0b3JlID0gY3JlYXRlTWVtb3J5U3RvcmUoKTtcblxuZXhwb3J0IGludGVyZmFjZSBJZGVtcG90ZW5jeU1pZGRsZXdhcmVPcHRpb25zIHtcbiAgLyoqIEN1c3RvbSBzdG9yZSBiYWNrZW5kIChkZWZhdWx0OiBpbi1tZW1vcnkpLiBQYXNzIGEgUmVkaXMtYmFja2VkIHN0b3JlXG4gICAqICBmb3IgbXVsdGktcmVwbGljYSBkZXBsb3ltZW50cy4gKi9cbiAgc3RvcmU/OiBJZGVtcG90ZW5jeVN0b3JlO1xufVxuXG4vKipcbiAqIE1pZGRsZXdhcmUgdGhhdCBzdXBwb3J0cyBpZGVtcG90ZW5jeSBrZXlzIGZvciBQT1NUL1BVVC9ERUxFVEUgbXV0YXRpb25zLlxuICpcbiAqIFdoZW4gYSByZXF1ZXN0IGluY2x1ZGVzIHRoZSBgSWRlbXBvdGVuY3ktS2V5YCBoZWFkZXI6XG4gKiAtIEZpcnN0IGNhbGw6IHByb2Nlc3NlcyBub3JtYWxseSwgY2FjaGVzIHRoZSByZXNwb25zZVxuICogLSBTdWJzZXF1ZW50IGNhbGxzIHdpdGggc2FtZSBrZXk6IHJldHVybnMgY2FjaGVkIHJlc3BvbnNlIChwcmV2ZW50cyBkdXBsaWNhdGUgbXV0YXRpb25zKVxuICpcbiAqIERlZmF1bHRzIHRvIGFuIGluLW1lbW9yeSBzdG9yZSAoc2luZ2xlLXJlcGxpY2EpLiBQYXNzIGEgY3VzdG9tXG4gKiBjcm9zcy1yZXBsaWNhIGB7IHN0b3JlIH1gIGltcGxlbWVudGluZyBgSWRlbXBvdGVuY3lTdG9yZWAgdG8gZGVkdXBlIGFjcm9zc1xuICogcmVwbGljYXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVtcG90ZW5jeU1pZGRsZXdhcmUob3B0aW9uczogSWRlbXBvdGVuY3lNaWRkbGV3YXJlT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHN0b3JlID0gb3B0aW9ucy5zdG9yZSA/PyBtZW1vcnlTdG9yZTtcbiAgY29uc3QgdHRsTXMgPSBDb3JlQ29uc3RhbnRzLklERU1QT1RFTkNZX1RUTF9NUztcbiAgY29uc3QgdHRsU2VjID0gTWF0aC5mbG9vcih0dGxNcyAvIDEwMDApO1xuXG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBrZXkgPSByZXEuaGVhZGVyc1snaWRlbXBvdGVuY3kta2V5J10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gT25seSBhcHBseSB0byBtdXRhdGlvbiBtZXRob2RzXG4gICAgaWYgKCFbJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddLmluY2x1ZGVzKHJlcS5tZXRob2QpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gTmFtZXNwYWNlIGJ5IG9yZ0lkIHRvIHByZXZlbnQgY3Jvc3Mtb3JnIGNhY2hlIGNvbGxpc2lvbnMuIFByZWZlciB0aGVcbiAgICAvLyBWRVJJRklFRCBhdXRoIG9yZyAoYHJlcS51c2VyYCwgcG9wdWxhdGVkIGJ5IHJlcXVpcmVBdXRoIGFmdGVyIHNpZ25hdHVyZVxuICAgIC8vIHZlcmlmaWNhdGlvbikgb3ZlciBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCB3aGljaCBzb21lIHNlcnZpY2VzIHBvcHVsYXRlXG4gICAgLy8gcHJlLWF1dGggZnJvbSBhbiBVTlZFUklGSUVEIHRva2VuIHBlZWsg4oCUIG5hbWVzcGFjaW5nIGEgbXV0YXRpb24ncyByZXBsYXlcbiAgICAvLyBjYWNoZSBvbiBhbiB1bnZlcmlmaWVkLCBjYWxsZXItaW5mbHVlbmNlZCBvcmcgaWQgd291bGQgYmUgdW5zYWZlLlxuICAgIGNvbnN0IG9yZ0lkID0gcmVxLnVzZXI/Lm9yZ2FuaXphdGlvbklkIHx8IHJlcS5jb250ZXh0Py5pZGVudGl0eT8ub3JnSWQ7XG4gICAgaWYgKCFvcmdJZCkgcmV0dXJuIG5leHQoKTsgLy8gc2tpcCBpZGVtcG90ZW5jeSBmb3IgdW5hdXRoZW50aWNhdGVkIHJlcXVlc3RzXG5cbiAgICAvLyBOYW1lc3BhY2UgdGhlIHN0b3JlZCBrZXkgYnkgKG1ldGhvZCwgcm91dGUsIG9yZywgYm9keSkgc28gYW4gSWRlbXBvdGVuY3ktS2V5XG4gICAgLy8gaXMgc2NvcGVkIHRvIE9ORSBzcGVjaWZpYyBlbmRwb2ludCtwYXlsb2FkLiBSZXVzaW5nIGEgc2luZ2xlIGtleSBhY3Jvc3MgdHdvXG4gICAgLy8gcm91dGVzIChlLmcuIFBPU1QgL3BpcGVsaW5lcyB0aGVuIFBPU1QgL3BsdWdpbnMpIHByZXZpb3VzbHkgcmVwbGF5ZWQgdGhlXG4gICAgLy8gZmlyc3QgZW5kcG9pbnQncyAyeHggZm9yIHRoZSBzZWNvbmQg4oCUIHRoZSBzdG9yZSBpcyBhIG1vZHVsZS1sZXZlbCBzaW5nbGV0b25cbiAgICAvLyBzaGFyZWQgYnkgZXZlcnkgcm91dGUuIEZvbGRpbmcgaW4gbWV0aG9kICsgcm91dGUgcGF0aCArIGEgYm9keSBmaW5nZXJwcmludFxuICAgIC8vIG9ubHkgbWFrZXMga2V5cyBNT1JFIHNwZWNpZmljLCBzbyB0aGVyZSBpcyBubyBjcm9zcy1jb250YW1pbmF0aW9uIHJpc2suXG4gICAgY29uc3Qgcm91dGVQYXRoID0gKHJlcS5iYXNlVXJsID8/ICcnKSArIChyZXEucm91dGU/LnBhdGggPz8gcmVxLnBhdGggPz8gJycpO1xuICAgIGNvbnN0IGZ1bGxLZXkgPSBgJHtyZXEubWV0aG9kfToke3JvdXRlUGF0aH06JHtvcmdJZH06JHtib2R5RmluZ2VycHJpbnQocmVxLmJvZHkpfToke2tleX1gO1xuXG4gICAgLyoqIFJlamVjdCBhIGR1cGxpY2F0ZSB3aG9zZSBvcmlnaW5hbCBpcyBzdGlsbCBpbi1mbGlnaHQuICovXG4gICAgY29uc3Qgc2VuZEluUHJvZ3Jlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICByZXMuc2V0SGVhZGVyKCdSZXRyeS1BZnRlcicsICcxJyk7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDksICdBIHJlcXVlc3Qgd2l0aCB0aGlzIElkZW1wb3RlbmN5LUtleSBpcyBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCcsIEVycm9yQ29kZS5DT05GTElDVCk7XG4gICAgfTtcblxuICAgIHN0b3JlLmdldChmdWxsS2V5KS50aGVuKGFzeW5jIChjYWNoZWQpID0+IHtcbiAgICAgIGlmIChjYWNoZWQgJiYgIWNhY2hlZC5wZW5kaW5nKSB7XG4gICAgICAgIC8vIENvbXBsZXRlZCByZXNwb25zZSBvbiByZWNvcmQg4oaSIHJlcGxheSBpdC5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZGVtcG90ZW50IHJlcXVlc3QgcmVwbGF5ZWQnLCB7IGtleTogZnVsbEtleSB9KTtcbiAgICAgICAgcmVzLnNldEhlYWRlcignWC1JZGVtcG90ZW50LVJlcGxheWVkJywgJ3RydWUnKTtcbiAgICAgICAgcmVzLnN0YXR1cyhjYWNoZWQuc3RhdHVzQ29kZSkuanNvbihjYWNoZWQuYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnBlbmRpbmcpIHtcbiAgICAgICAgLy8gVGhlIG9yaWdpbmFsIGlzIHN0aWxsIHJ1bm5pbmcg4oCUIGRvbid0IHJ1biB0aGUgbXV0YXRpb24gYSBzZWNvbmQgdGltZS5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZGVtcG90ZW50IHJlcXVlc3QgcmVqZWN0ZWQgKGluIHByb2dyZXNzKScsIHsga2V5OiBmdWxsS2V5IH0pO1xuICAgICAgICByZXR1cm4gc2VuZEluUHJvZ3Jlc3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXRvbWljYWxseSByZXNlcnZlIHRoZSBrZXkuIExvc2luZyB0aGlzIHJhY2UgbWVhbnMgYSBjb25jdXJyZW50IHJlcXVlc3RcbiAgICAgIC8vIHdpdGggdGhlIHNhbWUga2V5IGdvdCB0aGVyZSBmaXJzdCBhbmQgaXMgaW4tZmxpZ2h0IOKGkiA0MDkuXG4gICAgICBjb25zdCB3b24gPSBhd2FpdCBzdG9yZS5yZXNlcnZlKFxuICAgICAgICBmdWxsS2V5LFxuICAgICAgICB7IHN0YXR1c0NvZGU6IDAsIGJvZHk6IG51bGwsIHBlbmRpbmc6IHRydWUsIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zIH0sXG4gICAgICAgIHR0bFNlYyxcbiAgICAgICk7XG4gICAgICBpZiAoIXdvbikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0lkZW1wb3RlbnQgcmVxdWVzdCByZWplY3RlZCAobG9zdCByZXNlcnZlIHJhY2UpJywgeyBrZXk6IGZ1bGxLZXkgfSk7XG4gICAgICAgIHJldHVybiBzZW5kSW5Qcm9ncmVzcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvd24gdGhlIHJlc2VydmF0aW9uLiBJdCBNVVNUIGJlIHJlc29sdmVkIGV4YWN0bHkgb25jZSDigJQgZWl0aGVyIHRoZVxuICAgICAgLy8gcmVhbCAyeHggcmVzcG9uc2UgaXMgY2FjaGVkIGZvciByZXBsYXksIG9yIHRoZSByZXNlcnZhdGlvbiBpcyByZWxlYXNlZCBzb1xuICAgICAgLy8gYSByZXRyeSBjYW4gcHJvY2VlZC4gYHNldHRsZWRgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlLXJlc29sdmUuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGNhcHR1cmVkQm9keTogdW5rbm93bjtcbiAgICAgIGxldCBib2R5Q2FwdHVyZWQgPSBmYWxzZTtcblxuICAgICAgLyoqIFJlbWVtYmVyIHRoZSByZXNwb25zZSBib2R5IGZvciByZXBsYXkgKGZpcnN0IGNhcHR1cmUgd2lucykuICovXG4gICAgICBjb25zdCBjYXB0dXJlQm9keSA9IChib2R5OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghYm9keUNhcHR1cmVkKSB7XG4gICAgICAgICAgY2FwdHVyZWRCb2R5ID0gYm9keTtcbiAgICAgICAgICBib2R5Q2FwdHVyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZWxlYXNlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGZ1bGxLZXkpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignSWRlbXBvdGVuY3kgcmVzZXJ2YXRpb24gcmVsZWFzZSBmYWlsZWQnLCB7IGtleTogZnVsbEtleSwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWNoZVN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzdG9yZS5zZXQoZnVsbEtleSwge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICAgIGJvZHk6IGJvZHlDYXB0dXJlZCA/IGNhcHR1cmVkQm9keSA6IG51bGwsXG4gICAgICAgICAgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdHRsTXMsXG4gICAgICAgIH0sIHR0bFNlYykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdJZGVtcG90ZW5jeSBzdG9yZS5zZXQgZmFpbGVkJywgeyBrZXk6IGZ1bGxLZXksIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgLyoqIFJlc29sdmUgdGhlIHJlc2VydmF0aW9uIGZyb20gdGhlIEFDVFVBTCBmaW5hbCBzdGF0dXM6IGNhY2hlIDJ4eCwgZWxzZSByZWxlYXNlLiAqL1xuICAgICAgY29uc3Qgc2V0dGxlRnJvbVN0YXR1cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMCkgY2FjaGVTdWNjZXNzKCk7XG4gICAgICAgIGVsc2UgcmVsZWFzZSgpO1xuICAgICAgfTtcblxuICAgICAgLy8gRmFzdCBwYXRoOiByZXMuanNvbiBpcyB0aGUgY29tbW9uIGNvbXBsZXRpb24uIENhcHR1cmUgdGhlIGJvZHkgYW5kIHNldHRsZVxuICAgICAgLy8gaW1tZWRpYXRlbHkgb2ZmIHRoZSBzdGF0dXMgc2V0IGJ5IHJlcy5zdGF0dXMoLi4uKS5qc29uKC4uLikuXG4gICAgICBjb25zdCBvcmlnaW5hbEpzb24gPSByZXMuanNvbi5iaW5kKHJlcyk7XG4gICAgICByZXMuanNvbiA9IChib2R5OiB1bmtub3duKSA9PiB7XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoJ1gtSWRlbXBvdGVudC1SZXBsYXllZCcsICdmYWxzZScpO1xuICAgICAgICBjYXB0dXJlQm9keShib2R5KTtcbiAgICAgICAgc2V0dGxlRnJvbVN0YXR1cygpO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxKc29uKGJvZHkpO1xuICAgICAgfTtcblxuICAgICAgLy8gQm9keS1jYXB0dXJlIGJhY2tzdG9wcyBmb3IgY29tcGxldGlvbnMgdGhhdCBieXBhc3MgcmVzLmpzb25cbiAgICAgIC8vIChyZXMuc2VuZCAvIHJlcy5lbmQgLyByZXMuc2VuZEZpbGUg4oaSIHJlcy5lbmQpLiBUaGVzZSBvbmx5IFJFQ09SRCB0aGUgYm9keTtcbiAgICAgIC8vIHRoZSBhY3R1YWwgc2V0dGxlIGhhcHBlbnMgb24gYGZpbmlzaGAgZnJvbSB0aGUgcmVhbCBzdGF0dXMgY29kZS4gRmlyc3RcbiAgICAgIC8vIGNhcHR1cmUgd2lucywgc28gcmVzLmpzb24ncyBib2R5IGlzIG5ldmVyIGNsb2JiZXJlZCBieSBpdHMgaW50ZXJuYWxcbiAgICAgIC8vIHJlcy5zZW5kL3Jlcy5lbmQgY2FsbHMuXG4gICAgICBjb25zdCBwYXRjaGVkID0gcmVzIGFzIHVua25vd24gYXMge1xuICAgICAgICBzZW5kPzogKGJvZHk/OiB1bmtub3duKSA9PiB1bmtub3duO1xuICAgICAgICBlbmQ/OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgICBvbj86IChldmVudDogc3RyaW5nLCBjYjogKCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgICAgIH07XG4gICAgICBpZiAodHlwZW9mIHBhdGNoZWQuc2VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFNlbmQgPSBwYXRjaGVkLnNlbmQuYmluZChyZXMpO1xuICAgICAgICBwYXRjaGVkLnNlbmQgPSAoYm9keT86IHVua25vd24pID0+IHtcbiAgICAgICAgICBjYXB0dXJlQm9keShib2R5KTtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTZW5kKGJvZHkpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwYXRjaGVkLmVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IHBhdGNoZWQuZW5kLmJpbmQocmVzKTtcbiAgICAgICAgcGF0Y2hlZC5lbmQgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2h1bmsgPSBhcmdzWzBdO1xuICAgICAgICAgIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjaHVuayAhPT0gJ2Z1bmN0aW9uJykgY2FwdHVyZUJvZHkoY2h1bmspO1xuICAgICAgICAgIHJldHVybiBvcmlnaW5hbEVuZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFja3N0b3AgZm9yIEFOWSBjb21wbGV0aW9uIHBhdGgg4oCUIGluY2x1ZGluZyBhIDJ4eCB0aGF0IGZpbmlzaGVkIHZpYVxuICAgICAgLy8gcmVzLnNlbmQvcmVzLmVuZC9yZXMuc2VuZEZpbGUvMjA0IGFuZCBuZXZlciBoaXQgdGhlIHBhdGNoZWQgcmVzLmpzb24uXG4gICAgICAvLyBEZWNpZGluZyBvbiB0aGUgcmVhbCBmaW5hbCBzdGF0dXMgaGVyZSBtZWFucyBhIHN1Y2Nlc3NmdWwgb3AgaXMgY2FjaGVkXG4gICAgICAvLyAob3IgYSBmYWlsZWQgb25lIHJlbGVhc2VkKSBpbnN0ZWFkIG9mIHN0cmFuZGluZyB0aGUgcmVzZXJ2YXRpb24gYW5kXG4gICAgICAvLyA0MDktaW5nIGV2ZXJ5IHJldHJ5IGZvciB0aGUgZnVsbCBUVEwuIEd1YXJkZWQg4oCUIHRlc3QgZG91YmxlcyBtYXkgbm90IGJlXG4gICAgICAvLyBFdmVudEVtaXR0ZXJzOyByZXMuanNvbidzIGZhc3QgcGF0aCBhbHJlYWR5IHNldHRsZWQgdGhlIGNvbW1vbiBjYXNlLlxuICAgICAgaWYgKHR5cGVvZiBwYXRjaGVkLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBhdGNoZWQub24oJ2ZpbmlzaCcsIHNldHRsZUZyb21TdGF0dXMpO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgLy8gSWYgdGhlIHN0b3JlIGJhY2tlbmQgaXMgZG93biwgZmFpbCBvcGVuIOKAlCBwcm9jZXNzIHRoZSByZXF1ZXN0IG5vcm1hbGx5LlxuICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHN0b3JlLmdldCBmYWlsZWQ7IHByb2NlZWRpbmcgd2l0aG91dCBkZWR1cCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuIl19
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaWRlbXBvdGVuY3ktbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDeEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcs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LENBQUM7b0JBQzNFLE9BQU8sV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLENBQUMsQ0FBQztZQUNKLENBQUM7WUFFRCx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLHlFQUF5RTtZQUN6RSxzRUFBc0U7WUFDdEUsMEVBQTBFO1lBQzFFLHVFQUF1RTtZQUN2RSxJQUFJLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBRUQsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNmLDBFQUEwRTtZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqSixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgc2VuZEVycm9yLCBFcnJvckNvZGUsIGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaWRlbXBvdGVuY3knKTtcblxuLyoqXG4gKiBDYW5vbmljYWwgKGtleS1zb3J0ZWQpIEpTT04gc2VyaWFsaXphdGlvbiBzbyB0aGUgU0FNRSBsb2dpY2FsIHBheWxvYWQgaGFzaGVzXG4gKiBpZGVudGljYWxseSByZWdhcmRsZXNzIG9mIHByb3BlcnR5IGluc2VydGlvbiBvcmRlciDigJQgYSBwbGFpbiBgSlNPTi5zdHJpbmdpZnlgXG4gKiB3b3VsZCBsZXQgYHthLGJ9YCBhbmQgYHtiLGF9YCBwcm9kdWNlIGRpZmZlcmVudCBmaW5nZXJwcmludHMgZm9yIG9uZSByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBzdGFibGVTdHJpbmdpZnkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKSA/PyAnbnVsbCc7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdbJyArIHZhbHVlLm1hcChzdGFibGVTdHJpbmdpZnkpLmpvaW4oJywnKSArICddJztcbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAneycgKyBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5tYXAoKGspID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RhYmxlU3RyaW5naWZ5KG9ialtrXSkpLmpvaW4oJywnKSArICd9Jztcbn1cblxuLyoqXG4gKiBTaG9ydCwgc3RhYmxlIGZpbmdlcnByaW50IG9mIGEgcmVxdWVzdCBib2R5LiBGb2xkcyB0aGUgcGF5bG9hZCBpbnRvIHRoZVxuICogaWRlbXBvdGVuY3kga2V5IHNvIHJlcGxheWluZyB0aGUgU0FNRSBrZXkgd2l0aCBhIERJRkZFUkVOVCBib2R5IGlzIHRyZWF0ZWQgYXNcbiAqIGEgZGlzdGluY3Qgb3BlcmF0aW9uIChmcmVzaCBleGVjdXRpb24pIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgb2xkIHJlc3BvbnNlLlxuICogRW1wdHkvYWJzZW50IGJvZGllcyBjb2xsYXBzZSB0byAnLScgc28gYm9keS1sZXNzIG11dGF0aW9ucyBzdGF5IHVuYWZmZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGJvZHlGaW5nZXJwcmludChib2R5OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCB8fCBib2R5ID09PSBudWxsKSByZXR1cm4gJy0nO1xuICBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGJvZHkgYXMgb2JqZWN0KS5sZW5ndGggPT09IDApIHJldHVybiAnLSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzdGFibGVTdHJpbmdpZnkoYm9keSkpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgMTYpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb24tc2VyaWFsaXphYmxlIGJvZHkgKGUuZy4gYSBzdHJlYW0vY2lyY3VsYXIgcmVmKTogc2tpcCBmaW5nZXJwcmludGluZ1xuICAgIC8vIHJhdGhlciB0aGFuIGZhaWwgdGhlIHJlcXVlc3Qg4oCUIGtleSBzdGF5cyBzY29wZWQgYnkgbWV0aG9kK3JvdXRlK29yZy5cbiAgICByZXR1cm4gJy0nO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWNoZWRFbnRyeSB7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgYm9keTogdW5rbm93bjtcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIC8qKiBSZXNlcnZhdGlvbiBwbGFjZWhvbGRlcjogdGhlIHJlcXVlc3QgaXMgaW4tZmxpZ2h0LCBubyByZWFsIHJlc3BvbnNlIHlldC5cbiAgICogIEEgZHVwbGljYXRlIHRoYXQgc2VlcyBhIHBlbmRpbmcgZW50cnkgaXMgcmVqZWN0ZWQgd2l0aCA0MDksIG5vdCByZXBsYXllZC4gKi9cbiAgcGVuZGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIGJhY2tlbmQgZm9yIGlkZW1wb3RlbmN5LWtleSByZXBsYXkgY2FjaGUuIFRoZSBkZWZhdWx0IGluLW1lbW9yeVxuICogaW1wbGVtZW50YXRpb24gd29ya3MgZmluZSBzaW5nbGUtcmVwbGljYTsgYSBSZWRpcy1iYWNrZWQgaW1wbGVtZW50YXRpb25cbiAqIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IGRlZHVwbGljYXRpb24gYWNyb3NzIGhvcml6b250YWxseS1zY2FsZWQgcmVwbGljYXNcbiAqIChvdGhlcndpc2UgdHdvIHJlcGxpY2FzIGJlaGluZCBhIGxvYWQtYmFsYW5jZXIgY2FjaGUgaW5kZXBlbmRlbnRseSBhbmQgYVxuICogcmV0cnkgaGl0dGluZyBhIGRpZmZlcmVudCBwb2Qgd29uJ3QgcmVwbGF5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxDYWNoZWRFbnRyeSB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIGVudHJ5OiBDYWNoZWRFbnRyeSwgdHRsU2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgY2xhaW0gYGtleWAgSUZGIGl0IGlzIGN1cnJlbnRseSBhYnNlbnQuIFJldHVybnMgYHRydWVgIHdoZW4gVEhJU1xuICAgKiBjYWxsZXIgc2V0IHRoZSBlbnRyeSAod29uIHRoZSByYWNlKSwgYGZhbHNlYCB3aGVuIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLlxuICAgKiBUaGlzIGlzIHdoYXQgc2VyaWFsaXplcyBjb25jdXJyZW50IGZpcnN0LXRpbWUgcmVxdWVzdHMgdGhhdCBzaGFyZSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXkg4oCUIGEgcGxhaW4gZ2V0LXRoZW4tc2V0IGxlYXZlcyBhIHdpbmRvdyB3aGVyZSB0d28gcmVxdWVzdHNcbiAgICogYm90aCBzZWUgXCJub3QgY2FjaGVkXCIgYW5kIGJvdGggZXhlY3V0ZSB0aGUgbXV0YXRpb24uXG4gICAqL1xuICByZXNlcnZlKGtleTogc3RyaW5nLCBlbnRyeTogQ2FjaGVkRW50cnksIHR0bFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKiBSZW1vdmUgYSBrZXkg4oCUIHJlbGVhc2VzIGEgcmVzZXJ2YXRpb24gYWZ0ZXIgYSBub24tY2FjaGVhYmxlIChub24tMnh4KSByZXNwb25zZS4gKi9cbiAgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIERlZmF1bHQgaW4tbWVtb3J5IHN0b3JlLiBTaW5nbGUtcmVwbGljYSBvbmx5LiBFeHBvcnRlZCBmb3IgdGVzdGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlTdG9yZSgpOiBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZEVudHJ5PigpO1xuICBjb25zdCBjbGVhbnVwVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtYXApIHtcbiAgICAgIGlmIChub3cgPiB2LmV4cGlyZXNBdCkgbWFwLmRlbGV0ZShrKTtcbiAgICB9XG4gIH0sIENvcmVDb25zdGFudHMuSURFTVBPVEVOQ1lfQ0xFQU5VUF9JTlRFUlZBTF9NUyk7XG4gIGNsZWFudXBUaW1lci51bnJlZigpO1xuXG4gIC8qKiBSZXR1cm4gdGhlIGxpdmUgKG5vbi1leHBpcmVkKSBlbnRyeSwgZXZpY3RpbmcgaXQgbGF6aWx5IGlmIGV4cGlyZWQuICovXG4gIGNvbnN0IGxpdmUgPSAoa2V5OiBzdHJpbmcpOiBDYWNoZWRFbnRyeSB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gbWFwLmdldChrZXkpO1xuICAgIGlmICghZW50cnkpIHJldHVybiBudWxsO1xuICAgIGlmIChEYXRlLm5vdygpID4gZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICBtYXAuZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9O1xuICAvKipcbiAgICogQXQgY2FwYWNpdHksIGV2aWN0IHRoZSBPTERFU1QgZW50cnkgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKSByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBkcm9wcGluZyB0aGUgTkVXIGtleSDigJQgb3RoZXJ3aXNlLCBvbmNlIGZ1bGwsIHRoZSBzdG9yZSBzdG9wc1xuICAgKiBkZWR1cGxpY2F0aW5nIGZyZXNoIHJlcXVlc3RzIHVudGlsIHRoZSBUVEwgc3dlZXAgcnVucy4gU3RheXMgYm91bmRlZDsgZmF2b3JzXG4gICAqIHJlY2VudCBrZXlzIChtb3N0IGxpa2VseSB0byBiZSByZXRyaWVkKS5cbiAgICovXG4gIGNvbnN0IGV2aWN0SWZGdWxsID0gKGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKCFtYXAuaGFzKGtleSkgJiYgbWFwLnNpemUgPj0gQ29yZUNvbnN0YW50cy5JREVNUE9URU5DWV9NQVhfU1RPUkVfU0laRSkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gbWFwLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIG1hcC5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGxpdmUoa2V5KTtcbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXksIGVudHJ5KSB7XG4gICAgICBldmljdElmRnVsbChrZXkpO1xuICAgICAgbWFwLnNldChrZXksIGVudHJ5KTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2VydmUoa2V5LCBlbnRyeSkge1xuICAgICAgLy8gQXRvbWljIGluIGEgc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWU6IG5vIGF3YWl0IGJldHdlZW4gdGhlIGxpdmVuZXNzIGNoZWNrXG4gICAgICAvLyBhbmQgdGhlIHNldCwgc28gdHdvIGNvbmN1cnJlbnQgY2FsbGVycyBjYW4ndCBib3RoIG9ic2VydmUgXCJhYnNlbnRcIi5cbiAgICAgIGlmIChsaXZlKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGV2aWN0SWZGdWxsKGtleSk7XG4gICAgICBtYXAuc2V0KGtleSwgZW50cnkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICBtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIHN1cmZhY2UgdGhlIGlkZW1wb3RlbmN5IHN0b3JlIG5lZWRzIChhbiBpb3JlZGlzIHN1YnNldCkuXG4gKiBgc2V0YCBzdXBwb3J0cyB0aGUgdmFyaWFkaWMgb3B0aW9uIHRhaWw6IGBTRVQga2V5IHZhbCBFWCA8dHRsPiBbTlhdYCwgd2hpY2hcbiAqIHJldHVybnMgYCdPSydgIG9uIHN1Y2Nlc3MgYW5kIGBudWxsYCB3aGVuIGFuIGBOWGAgc2V0IHdhcyByZWZ1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzSWRlbXBvdGVuY3lDbGllbnQge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmNvbnN0IFJFRElTX0tFWV9QUkVGSVggPSAnaWRlbTonO1xuXG4vKipcbiAqIFJlZGlzLWJhY2tlZCB7QGxpbmsgSWRlbXBvdGVuY3lTdG9yZX0gZm9yIGNvcnJlY3QgZGVkdXBsaWNhdGlvbiBhY3Jvc3NcbiAqIGhvcml6b250YWxseS1zY2FsZWQgcmVwbGljYXMuIGByZXNlcnZlYCBtYXBzIHRvIGFuIGF0b21pYyBgU0VUIOKApiBOWGAgc28gdHdvXG4gKiBwb2RzIGJlaGluZCBhIGxvYWQtYmFsYW5jZXIgY2FuJ3QgYm90aCB3aW4gYSBmaXJzdC10aW1lIHJlcXVlc3Qgc2hhcmluZyBhblxuICogSWRlbXBvdGVuY3ktS2V5OyBhIHJldHJ5IGxhbmRpbmcgb24gQU5ZIHBvZCBzZWVzIHRoZSBzYW1lIGNvbW1pdHRlZCByZXNwb25zZS5cbiAqIFJlZGlzIFRUTCBvd25zIGV4cGlyeSAodGhlIGBDYWNoZWRFbnRyeS5leHBpcmVzQXRgIGZpZWxkIGlzIGNhcnJpZWQgb25seSBmb3JcbiAqIEFQSS1zaGFwZSBwYXJpdHkgd2l0aCB0aGUgbWVtb3J5IHN0b3JlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzSWRlbXBvdGVuY3lTdG9yZShyZWRpczogUmVkaXNJZGVtcG90ZW5jeUNsaWVudCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICBjb25zdCBrID0gKGtleTogc3RyaW5nKTogc3RyaW5nID0+IGAke1JFRElTX0tFWV9QUkVGSVh9JHtrZXl9YDtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoa2V5KSB7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXQoayhrZXkpKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2FjaGVkRW50cnk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ29ycnVwdCBlbnRyeSDihpIgdHJlYXQgYXMgYWJzZW50IHNvIHRoZSByZXF1ZXN0IHByb2NlZWRzIGZyZXNoLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXksIGVudHJ5LCB0dGxTZWNvbmRzKSB7XG4gICAgICBhd2FpdCByZWRpcy5zZXQoayhrZXkpLCBKU09OLnN0cmluZ2lmeShlbnRyeSksICdFWCcsIE1hdGgubWF4KDEsIHR0bFNlY29uZHMpKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2VydmUoa2V5LCBlbnRyeSwgdHRsU2Vjb25kcykge1xuICAgICAgLy8gQXRvbWljIGNsYWltOiBTRVQga2V5IHZhbCBFWCB0dGwgTlgg4oaSICdPSycgb25seSBpZiB0aGUga2V5IHdhcyBhYnNlbnQuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZWRpcy5zZXQoayhrZXkpLCBKU09OLnN0cmluZ2lmeShlbnRyeSksICdFWCcsIE1hdGgubWF4KDEsIHR0bFNlY29uZHMpLCAnTlgnKTtcbiAgICAgIHJldHVybiByZXMgPT09ICdPSyc7XG4gICAgfSxcbiAgICBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICBhd2FpdCByZWRpcy5kZWwoayhrZXkpKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgUmVkaXMtYmFja2VkIGlkZW1wb3RlbmN5IHN0b3JlIGZyb20gdGhlIHNoYXJlZCBlbnYgUmVkaXMgKHRoZSBzYW1lXG4gKiBgUkVESVNfVVJMYCAvIGBSRURJU19IT1NUYCB3aXJpbmcgdGhlIHJhdGUtbGltaXRlciBhbmQgYXVkaXQtc3Bvb2wgdXNlKS5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZC9hdmFpbGFibGUgc28gdGhlIGNhbGxlciBrZWVwcyB0aGVcbiAqIGluLW1lbW9yeSBkZWZhdWx0IChzaW5nbGUtcmVwbGljYSBjb3JyZWN0bmVzcykuIE5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzSWRlbXBvdGVuY3lTdG9yZSgpOiBJZGVtcG90ZW5jeVN0b3JlIHwgbnVsbCB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzSWRlbXBvdGVuY3lDbGllbnQ+KCdpZGVtcG90ZW5jeScpO1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIG51bGw7XG4gIGxvZ2dlci5pbmZvKCdSZWRpcyBpZGVtcG90ZW5jeSBzdG9yZSBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gY3JlYXRlUmVkaXNJZGVtcG90ZW5jeVN0b3JlKGNsaWVudCk7XG59XG5cbmNvbnN0IG1lbW9yeVN0b3JlID0gY3JlYXRlTWVtb3J5U3RvcmUoKTtcblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgZGVmYXVsdCBzdG9yZSB1c2VkIGJ5IGBpZGVtcG90ZW5jeU1pZGRsZXdhcmUoKWAgd2hlbiBubyBleHBsaWNpdFxuICogYHN0b3JlYCBpcyBwYXNzZWQuIERlZmF1bHRzIHRvIHRoZSBpbi1tZW1vcnkgc3RvcmU7IGBjcmVhdGVBcHBgIHByb21vdGVzIGl0IHRvXG4gKiB0aGUgc2hhcmVkIGVudi1SZWRpcyBzdG9yZSAobXVsdGktcmVwbGljYSBkZWR1cCkgYXQgc3RhcnR1cCB2aWFcbiAqIHtAbGluayBzZXRJZGVtcG90ZW5jeVN0b3JlfS4gVGhlIHJvdXRlIGZhY3RvcmllcyBrZWVwIGNhbGxpbmdcbiAqIGBpZGVtcG90ZW5jeU1pZGRsZXdhcmUoKWAgd2l0aCBubyBhcmdzIGFuZCB0cmFuc3BhcmVudGx5IHBpY2sgdGhpcyB1cC5cbiAqL1xubGV0IGRlZmF1bHRTdG9yZTogSWRlbXBvdGVuY3lTdG9yZSA9IG1lbW9yeVN0b3JlO1xuXG4vKiogSW5qZWN0IHRoZSBwcm9jZXNzLXdpZGUgaWRlbXBvdGVuY3kgc3RvcmUgKGUuZy4gYSBSZWRpcy1iYWNrZWQgb25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRJZGVtcG90ZW5jeVN0b3JlKHN0b3JlOiBJZGVtcG90ZW5jeVN0b3JlKTogdm9pZCB7XG4gIGRlZmF1bHRTdG9yZSA9IHN0b3JlO1xufVxuXG4vKiogVGhlIGN1cnJlbnQgcHJvY2Vzcy13aWRlIGRlZmF1bHQgc3RvcmUgKGluLW1lbW9yeSB1bmxlc3Mgb3ZlcnJpZGRlbikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRlbXBvdGVuY3lTdG9yZSgpOiBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgcmV0dXJuIGRlZmF1bHRTdG9yZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJZGVtcG90ZW5jeU1pZGRsZXdhcmVPcHRpb25zIHtcbiAgLyoqIEN1c3RvbSBzdG9yZSBiYWNrZW5kLiBEZWZhdWx0cyB0byB0aGUgcHJvY2Vzcy13aWRlIHN0b3JlIHNldCB2aWFcbiAgICogIHtAbGluayBzZXRJZGVtcG90ZW5jeVN0b3JlfSAoaW4tbWVtb3J5IHVudGlsIGBjcmVhdGVBcHBgIHdpcmVzIFJlZGlzKS4gKi9cbiAgc3RvcmU/OiBJZGVtcG90ZW5jeVN0b3JlO1xufVxuXG4vKipcbiAqIE1pZGRsZXdhcmUgdGhhdCBzdXBwb3J0cyBpZGVtcG90ZW5jeSBrZXlzIGZvciBQT1NUL1BVVC9ERUxFVEUgbXV0YXRpb25zLlxuICpcbiAqIFdoZW4gYSByZXF1ZXN0IGluY2x1ZGVzIHRoZSBgSWRlbXBvdGVuY3ktS2V5YCBoZWFkZXI6XG4gKiAtIEZpcnN0IGNhbGw6IHByb2Nlc3NlcyBub3JtYWxseSwgY2FjaGVzIHRoZSByZXNwb25zZVxuICogLSBTdWJzZXF1ZW50IGNhbGxzIHdpdGggc2FtZSBrZXk6IHJldHVybnMgY2FjaGVkIHJlc3BvbnNlIChwcmV2ZW50cyBkdXBsaWNhdGUgbXV0YXRpb25zKVxuICpcbiAqIERlZmF1bHRzIHRvIGFuIGluLW1lbW9yeSBzdG9yZSAoc2luZ2xlLXJlcGxpY2EpLiBQYXNzIGEgY3VzdG9tXG4gKiBjcm9zcy1yZXBsaWNhIGB7IHN0b3JlIH1gIGltcGxlbWVudGluZyBgSWRlbXBvdGVuY3lTdG9yZWAgdG8gZGVkdXBlIGFjcm9zc1xuICogcmVwbGljYXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVtcG90ZW5jeU1pZGRsZXdhcmUob3B0aW9uczogSWRlbXBvdGVuY3lNaWRkbGV3YXJlT3B0aW9ucyA9IHt9KSB7XG4gIC8vIFJlc29sdmUgdGhlIHN0b3JlIFBFUiBSRVFVRVNUIChub3QgYXQgZmFjdG9yeSB0aW1lKSBzbyBhIHN0b3JlIGluamVjdGVkIGJ5XG4gIC8vIGNyZWF0ZUFwcCBBRlRFUiB0aGUgcm91dGUgY2hhaW5zIGFyZSBidWlsdCBzdGlsbCB0YWtlcyBlZmZlY3QuIEFuIGV4cGxpY2l0XG4gIC8vIGBvcHRpb25zLnN0b3JlYCBhbHdheXMgd2lucy5cbiAgY29uc3QgZXhwbGljaXRTdG9yZSA9IG9wdGlvbnMuc3RvcmU7XG4gIGNvbnN0IHR0bE1zID0gQ29yZUNvbnN0YW50cy5JREVNUE9URU5DWV9UVExfTVM7XG4gIGNvbnN0IHR0bFNlYyA9IE1hdGguZmxvb3IodHRsTXMgLyAxMDAwKTtcblxuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSBleHBsaWNpdFN0b3JlID8/IGRlZmF1bHRTdG9yZTtcbiAgICBjb25zdCBrZXkgPSByZXEuaGVhZGVyc1snaWRlbXBvdGVuY3kta2V5J10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gT25seSBhcHBseSB0byBtdXRhdGlvbiBtZXRob2RzXG4gICAgaWYgKCFbJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddLmluY2x1ZGVzKHJlcS5tZXRob2QpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gTmFtZXNwYWNlIGJ5IG9yZ0lkIHRvIHByZXZlbnQgY3Jvc3Mtb3JnIGNhY2hlIGNvbGxpc2lvbnMuIFByZWZlciB0aGVcbiAgICAvLyBWRVJJRklFRCBhdXRoIG9yZyAoYHJlcS51c2VyYCwgcG9wdWxhdGVkIGJ5IHJlcXVpcmVBdXRoIGFmdGVyIHNpZ25hdHVyZVxuICAgIC8vIHZlcmlmaWNhdGlvbikgb3ZlciBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCB3aGljaCBzb21lIHNlcnZpY2VzIHBvcHVsYXRlXG4gICAgLy8gcHJlLWF1dGggZnJvbSBhbiBVTlZFUklGSUVEIHRva2VuIHBlZWsg4oCUIG5hbWVzcGFjaW5nIGEgbXV0YXRpb24ncyByZXBsYXlcbiAgICAvLyBjYWNoZSBvbiBhbiB1bnZlcmlmaWVkLCBjYWxsZXItaW5mbHVlbmNlZCBvcmcgaWQgd291bGQgYmUgdW5zYWZlLlxuICAgIGNvbnN0IG9yZ0lkID0gcmVxLnVzZXI/Lm9yZ2FuaXphdGlvbklkIHx8IHJlcS5jb250ZXh0Py5pZGVudGl0eT8ub3JnSWQ7XG4gICAgaWYgKCFvcmdJZCkgcmV0dXJuIG5leHQoKTsgLy8gc2tpcCBpZGVtcG90ZW5jeSBmb3IgdW5hdXRoZW50aWNhdGVkIHJlcXVlc3RzXG5cbiAgICAvLyBOYW1lc3BhY2UgdGhlIHN0b3JlZCBrZXkgYnkgKG1ldGhvZCwgcm91dGUsIG9yZywgYm9keSkgc28gYW4gSWRlbXBvdGVuY3ktS2V5XG4gICAgLy8gaXMgc2NvcGVkIHRvIE9ORSBzcGVjaWZpYyBlbmRwb2ludCtwYXlsb2FkLiBSZXVzaW5nIGEgc2luZ2xlIGtleSBhY3Jvc3MgdHdvXG4gICAgLy8gcm91dGVzIChlLmcuIFBPU1QgL3BpcGVsaW5lcyB0aGVuIFBPU1QgL3BsdWdpbnMpIHByZXZpb3VzbHkgcmVwbGF5ZWQgdGhlXG4gICAgLy8gZmlyc3QgZW5kcG9pbnQncyAyeHggZm9yIHRoZSBzZWNvbmQg4oCUIHRoZSBzdG9yZSBpcyBhIG1vZHVsZS1sZXZlbCBzaW5nbGV0b25cbiAgICAvLyBzaGFyZWQgYnkgZXZlcnkgcm91dGUuIEZvbGRpbmcgaW4gbWV0aG9kICsgcm91dGUgcGF0aCArIGEgYm9keSBmaW5nZXJwcmludFxuICAgIC8vIG9ubHkgbWFrZXMga2V5cyBNT1JFIHNwZWNpZmljLCBzbyB0aGVyZSBpcyBubyBjcm9zcy1jb250YW1pbmF0aW9uIHJpc2suXG4gICAgY29uc3Qgcm91dGVQYXRoID0gKHJlcS5iYXNlVXJsID8/ICcnKSArIChyZXEucm91dGU/LnBhdGggPz8gcmVxLnBhdGggPz8gJycpO1xuICAgIGNvbnN0IGZ1bGxLZXkgPSBgJHtyZXEubWV0aG9kfToke3JvdXRlUGF0aH06JHtvcmdJZH06JHtib2R5RmluZ2VycHJpbnQocmVxLmJvZHkpfToke2tleX1gO1xuXG4gICAgLyoqIFJlamVjdCBhIGR1cGxpY2F0ZSB3aG9zZSBvcmlnaW5hbCBpcyBzdGlsbCBpbi1mbGlnaHQuICovXG4gICAgY29uc3Qgc2VuZEluUHJvZ3Jlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICByZXMuc2V0SGVhZGVyKCdSZXRyeS1BZnRlcicsICcxJyk7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDksICdBIHJlcXVlc3Qgd2l0aCB0aGlzIElkZW1wb3RlbmN5LUtleSBpcyBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCcsIEVycm9yQ29kZS5DT05GTElDVCk7XG4gICAgfTtcblxuICAgIHN0b3JlLmdldChmdWxsS2V5KS50aGVuKGFzeW5jIChjYWNoZWQpID0+IHtcbiAgICAgIGlmIChjYWNoZWQgJiYgIWNhY2hlZC5wZW5kaW5nKSB7XG4gICAgICAgIC8vIENvbXBsZXRlZCByZXNwb25zZSBvbiByZWNvcmQg4oaSIHJlcGxheSBpdC5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZGVtcG90ZW50IHJlcXVlc3QgcmVwbGF5ZWQnLCB7IGtleTogZnVsbEtleSB9KTtcbiAgICAgICAgcmVzLnNldEhlYWRlcignWC1JZGVtcG90ZW50LVJlcGxheWVkJywgJ3RydWUnKTtcbiAgICAgICAgcmVzLnN0YXR1cyhjYWNoZWQuc3RhdHVzQ29kZSkuanNvbihjYWNoZWQuYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnBlbmRpbmcpIHtcbiAgICAgICAgLy8gVGhlIG9yaWdpbmFsIGlzIHN0aWxsIHJ1bm5pbmcg4oCUIGRvbid0IHJ1biB0aGUgbXV0YXRpb24gYSBzZWNvbmQgdGltZS5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZGVtcG90ZW50IHJlcXVlc3QgcmVqZWN0ZWQgKGluIHByb2dyZXNzKScsIHsga2V5OiBmdWxsS2V5IH0pO1xuICAgICAgICByZXR1cm4gc2VuZEluUHJvZ3Jlc3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXRvbWljYWxseSByZXNlcnZlIHRoZSBrZXkuIExvc2luZyB0aGlzIHJhY2UgbWVhbnMgYSBjb25jdXJyZW50IHJlcXVlc3RcbiAgICAgIC8vIHdpdGggdGhlIHNhbWUga2V5IGdvdCB0aGVyZSBmaXJzdCBhbmQgaXMgaW4tZmxpZ2h0IOKGkiA0MDkuXG4gICAgICBjb25zdCB3b24gPSBhd2FpdCBzdG9yZS5yZXNlcnZlKFxuICAgICAgICBmdWxsS2V5LFxuICAgICAgICB7IHN0YXR1c0NvZGU6IDAsIGJvZHk6IG51bGwsIHBlbmRpbmc6IHRydWUsIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zIH0sXG4gICAgICAgIHR0bFNlYyxcbiAgICAgICk7XG4gICAgICBpZiAoIXdvbikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0lkZW1wb3RlbnQgcmVxdWVzdCByZWplY3RlZCAobG9zdCByZXNlcnZlIHJhY2UpJywgeyBrZXk6IGZ1bGxLZXkgfSk7XG4gICAgICAgIHJldHVybiBzZW5kSW5Qcm9ncmVzcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvd24gdGhlIHJlc2VydmF0aW9uLiBJdCBNVVNUIGJlIHJlc29sdmVkIGV4YWN0bHkgb25jZSDigJQgZWl0aGVyIHRoZVxuICAgICAgLy8gcmVhbCAyeHggcmVzcG9uc2UgaXMgY2FjaGVkIGZvciByZXBsYXksIG9yIHRoZSByZXNlcnZhdGlvbiBpcyByZWxlYXNlZCBzb1xuICAgICAgLy8gYSByZXRyeSBjYW4gcHJvY2VlZC4gYHNldHRsZWRgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlLXJlc29sdmUuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGNhcHR1cmVkQm9keTogdW5rbm93bjtcbiAgICAgIGxldCBib2R5Q2FwdHVyZWQgPSBmYWxzZTtcblxuICAgICAgLyoqIFJlbWVtYmVyIHRoZSByZXNwb25zZSBib2R5IGZvciByZXBsYXkgKGZpcnN0IGNhcHR1cmUgd2lucykuICovXG4gICAgICBjb25zdCBjYXB0dXJlQm9keSA9IChib2R5OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghYm9keUNhcHR1cmVkKSB7XG4gICAgICAgICAgY2FwdHVyZWRCb2R5ID0gYm9keTtcbiAgICAgICAgICBib2R5Q2FwdHVyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZWxlYXNlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGZ1bGxLZXkpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignSWRlbXBvdGVuY3kgcmVzZXJ2YXRpb24gcmVsZWFzZSBmYWlsZWQnLCB7IGtleTogZnVsbEtleSwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWNoZVN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzdG9yZS5zZXQoZnVsbEtleSwge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICAgIGJvZHk6IGJvZHlDYXB0dXJlZCA/IGNhcHR1cmVkQm9keSA6IG51bGwsXG4gICAgICAgICAgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdHRsTXMsXG4gICAgICAgIH0sIHR0bFNlYykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdJZGVtcG90ZW5jeSBzdG9yZS5zZXQgZmFpbGVkJywgeyBrZXk6IGZ1bGxLZXksIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgLyoqIFJlc29sdmUgdGhlIHJlc2VydmF0aW9uIGZyb20gdGhlIEFDVFVBTCBmaW5hbCBzdGF0dXM6IGNhY2hlIDJ4eCwgZWxzZSByZWxlYXNlLiAqL1xuICAgICAgY29uc3Qgc2V0dGxlRnJvbVN0YXR1cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMCkgY2FjaGVTdWNjZXNzKCk7XG4gICAgICAgIGVsc2UgcmVsZWFzZSgpO1xuICAgICAgfTtcblxuICAgICAgLy8gRmFzdCBwYXRoOiByZXMuanNvbiBpcyB0aGUgY29tbW9uIGNvbXBsZXRpb24uIENhcHR1cmUgdGhlIGJvZHkgYW5kIHNldHRsZVxuICAgICAgLy8gaW1tZWRpYXRlbHkgb2ZmIHRoZSBzdGF0dXMgc2V0IGJ5IHJlcy5zdGF0dXMoLi4uKS5qc29uKC4uLikuXG4gICAgICBjb25zdCBvcmlnaW5hbEpzb24gPSByZXMuanNvbi5iaW5kKHJlcyk7XG4gICAgICByZXMuanNvbiA9IChib2R5OiB1bmtub3duKSA9PiB7XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoJ1gtSWRlbXBvdGVudC1SZXBsYXllZCcsICdmYWxzZScpO1xuICAgICAgICBjYXB0dXJlQm9keShib2R5KTtcbiAgICAgICAgc2V0dGxlRnJvbVN0YXR1cygpO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxKc29uKGJvZHkpO1xuICAgICAgfTtcblxuICAgICAgLy8gQm9keS1jYXB0dXJlIGJhY2tzdG9wcyBmb3IgY29tcGxldGlvbnMgdGhhdCBieXBhc3MgcmVzLmpzb25cbiAgICAgIC8vIChyZXMuc2VuZCAvIHJlcy5lbmQgLyByZXMuc2VuZEZpbGUg4oaSIHJlcy5lbmQpLiBUaGVzZSBvbmx5IFJFQ09SRCB0aGUgYm9keTtcbiAgICAgIC8vIHRoZSBhY3R1YWwgc2V0dGxlIGhhcHBlbnMgb24gYGZpbmlzaGAgZnJvbSB0aGUgcmVhbCBzdGF0dXMgY29kZS4gRmlyc3RcbiAgICAgIC8vIGNhcHR1cmUgd2lucywgc28gcmVzLmpzb24ncyBib2R5IGlzIG5ldmVyIGNsb2JiZXJlZCBieSBpdHMgaW50ZXJuYWxcbiAgICAgIC8vIHJlcy5zZW5kL3Jlcy5lbmQgY2FsbHMuXG4gICAgICBjb25zdCBwYXRjaGVkID0gcmVzIGFzIHVua25vd24gYXMge1xuICAgICAgICBzZW5kPzogKGJvZHk/OiB1bmtub3duKSA9PiB1bmtub3duO1xuICAgICAgICBlbmQ/OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgICBvbj86IChldmVudDogc3RyaW5nLCBjYjogKCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgICAgIH07XG4gICAgICBpZiAodHlwZW9mIHBhdGNoZWQuc2VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFNlbmQgPSBwYXRjaGVkLnNlbmQuYmluZChyZXMpO1xuICAgICAgICBwYXRjaGVkLnNlbmQgPSAoYm9keT86IHVua25vd24pID0+IHtcbiAgICAgICAgICBjYXB0dXJlQm9keShib2R5KTtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTZW5kKGJvZHkpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwYXRjaGVkLmVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IHBhdGNoZWQuZW5kLmJpbmQocmVzKTtcbiAgICAgICAgcGF0Y2hlZC5lbmQgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2h1bmsgPSBhcmdzWzBdO1xuICAgICAgICAgIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjaHVuayAhPT0gJ2Z1bmN0aW9uJykgY2FwdHVyZUJvZHkoY2h1bmspO1xuICAgICAgICAgIHJldHVybiBvcmlnaW5hbEVuZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFja3N0b3AgZm9yIEFOWSBjb21wbGV0aW9uIHBhdGgg4oCUIGluY2x1ZGluZyBhIDJ4eCB0aGF0IGZpbmlzaGVkIHZpYVxuICAgICAgLy8gcmVzLnNlbmQvcmVzLmVuZC9yZXMuc2VuZEZpbGUvMjA0IGFuZCBuZXZlciBoaXQgdGhlIHBhdGNoZWQgcmVzLmpzb24uXG4gICAgICAvLyBEZWNpZGluZyBvbiB0aGUgcmVhbCBmaW5hbCBzdGF0dXMgaGVyZSBtZWFucyBhIHN1Y2Nlc3NmdWwgb3AgaXMgY2FjaGVkXG4gICAgICAvLyAob3IgYSBmYWlsZWQgb25lIHJlbGVhc2VkKSBpbnN0ZWFkIG9mIHN0cmFuZGluZyB0aGUgcmVzZXJ2YXRpb24gYW5kXG4gICAgICAvLyA0MDktaW5nIGV2ZXJ5IHJldHJ5IGZvciB0aGUgZnVsbCBUVEwuIEd1YXJkZWQg4oCUIHRlc3QgZG91YmxlcyBtYXkgbm90IGJlXG4gICAgICAvLyBFdmVudEVtaXR0ZXJzOyByZXMuanNvbidzIGZhc3QgcGF0aCBhbHJlYWR5IHNldHRsZWQgdGhlIGNvbW1vbiBjYXNlLlxuICAgICAgaWYgKHR5cGVvZiBwYXRjaGVkLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBhdGNoZWQub24oJ2ZpbmlzaCcsIHNldHRsZUZyb21TdGF0dXMpO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgLy8gSWYgdGhlIHN0b3JlIGJhY2tlbmQgaXMgZG93biwgZmFpbCBvcGVuIOKAlCBwcm9jZXNzIHRoZSByZXF1ZXN0IG5vcm1hbGx5LlxuICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHN0b3JlLmdldCBmYWlsZWQ7IHByb2NlZWRpbmcgd2l0aG91dCBkZWR1cCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuIl19
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { getIdentity, createLogger } from '@pipeline-builder/api-core';
3
+ import { getIdentity, createLogger, redactSensitive } from '@pipeline-builder/api-core';
4
4
  import { v7 as uuid } from 'uuid';
5
5
  import { SSEManager } from '../http/sse-connection-manager.js';
6
6
  const logger = createLogger('api-server');
@@ -49,7 +49,12 @@ export function createRequestContext(req, sseManager) {
49
49
  logger.info(message, meta);
50
50
  break;
51
51
  }
52
- sseManager.send(requestId, type, message, data);
52
+ // The Winston call above is redacted by the logger's `redactFormat`, but the
53
+ // SSE frame bypasses the logger entirely — apply the SAME key-pattern
54
+ // redaction to `data` before it's pushed to the client so a secret in the
55
+ // log payload (e.g. an accidental `token`/`password` field) isn't streamed
56
+ // out over the build-log SSE channel.
57
+ sseManager.send(requestId, type, message, redactSensitive(data));
53
58
  };
54
59
  return {
55
60
  requestId,
@@ -57,4 +62,4 @@ export function createRequestContext(req, sseManager) {
57
62
  log,
58
63
  };
59
64
  }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVxdWVzdC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUEwQyxNQUFNLDRCQUE0QixDQUFDO0FBRS9HLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0sbUNBQW1DLENBQUM7QUFjbEYsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBbUIxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsR0FBWSxFQUNaLFVBQXNCO0lBRXRCLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFrQixDQUFDLENBQUM7SUFDakQsbUVBQW1FO0lBQ25FLHlEQUF5RDtJQUN6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFaEUsZ0RBQWdEO0lBQ2hELE1BQU0sR0FBRyxHQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDakQsTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlELFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLE9BQU87Z0JBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU07WUFDUjtnQkFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0IsTUFBTTtRQUNWLENBQUM7UUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgY3JlYXRlTG9nZ2VyLCB0eXBlIFJlcXVlc3RJZGVudGl0eSwgdHlwZSBIdHRwUmVxdWVzdCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgU1NFTWFuYWdlciwgdHlwZSBTU0VFdmVudFR5cGUgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG4vLyBDb25zb2xpZGF0ZWQgRXhwcmVzcyBSZXF1ZXN0IGF1Z21lbnRhdGlvbnNcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIC8qKiBVbmlxdWUgcmVxdWVzdCBJRCAoc2V0IGJ5IGFwcC1mYWN0b3J5IG1pZGRsZXdhcmUpICovXG4gICAgICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gICAgICAvKiogUmVxdWVzdCBjb250ZXh0IHdpdGggaWRlbnRpdHksIGxvZ2dpbmcsIGFuZCBTU0UgKi9cbiAgICAgIGNvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhcGktc2VydmVyJyk7XG5cbi8qKlxuICogUmVxdWVzdCBsb2dnZXIgZnVuY3Rpb24gdHlwZVxuICovXG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nZ2VyID0gKHR5cGU6IFNTRUV2ZW50VHlwZSwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgLyoqIFVuaXF1ZSByZXF1ZXN0IElEICovXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xuICAvKiogSWRlbnRpdHkgZnJvbSBoZWFkZXJzICovXG4gIGlkZW50aXR5OiBSZXF1ZXN0SWRlbnRpdHk7XG4gIC8qKiBMb2dnaW5nIGZ1bmN0aW9uIHRoYXQgc2VuZHMgdG8gY29uc29sZSBhbmQgU1NFICovXG4gIGxvZzogUmVxdWVzdExvZ2dlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2luZ1xuICpcbiAqIENyZWF0ZXMgYSBsb2dnZXIgdGhhdCBvdXRwdXRzIHRvIGJvdGggY29uc29sZSBhbmQgU1NFLlxuICpcbiAqIEBwYXJhbSByZXEgLSBFeHByZXNzIHJlcXVlc3RcbiAqIEBwYXJhbSBzc2VNYW5hZ2VyIC0gU1NFIG1hbmFnZXIgZm9yIHJlYWwtdGltZSBsb2dzXG4gKiBAcmV0dXJucyBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2VyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICBjb25zdCBjdHggPSBjcmVhdGVSZXF1ZXN0Q29udGV4dChyZXEsIHNzZU1hbmFnZXIpO1xuICpcbiAqICAgY3R4LmxvZygnSU5GTycsICdQcm9jZXNzaW5nIHJlcXVlc3QnLCB7IGRhdGE6IHJlcS5ib2R5IH0pO1xuICpcbiAqICAgaWYgKCFjdHguaWRlbnRpdHkub3JnSWQpIHtcbiAqICAgICBjdHgubG9nKCdFUlJPUicsICdNaXNzaW5nIG9yZ2FuaXphdGlvbiBJRCcpO1xuICogICAgIHJldHVybiBzZW5kQmFkUmVxdWVzdChyZXMsICd4LW9yZy1pZCBoZWFkZXIgcmVxdWlyZWQnKTtcbiAqICAgfVxuICpcbiAqICAgLy8gUHJvY2VzcyByZXF1ZXN0Li4uXG4gKiAgIGN0eC5sb2coJ0NPTVBMRVRFRCcsICdSZXF1ZXN0IHByb2Nlc3NlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgcmVxOiBSZXF1ZXN0LFxuICBzc2VNYW5hZ2VyOiBTU0VNYW5hZ2VyLFxuKTogUmVxdWVzdENvbnRleHQge1xuICBjb25zdCBpZGVudGl0eSA9IGdldElkZW50aXR5KHJlcSBhcyBIdHRwUmVxdWVzdCk7XG4gIC8vIFByZWZlciB0aGUgYWxyZWFkeS1wYXJzZWQgcmVxdWVzdElkIGZyb20gYXBwLWZhY3RvcnkgbWlkZGxld2FyZSxcbiAgLy8gZmFsbCBiYWNrIHRvIGlkZW50aXR5IGhlYWRlciwgdGhlbiBnZW5lcmF0ZSBhIG5ldyBvbmUuXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHJlcS5yZXF1ZXN0SWQgfHwgaWRlbnRpdHkucmVxdWVzdElkIHx8IHV1aWQoKTtcblxuICAvLyBDcmVhdGUgbG9nZ2VyIHRoYXQgb3V0cHV0cyB0byBXaW5zdG9uIGFuZCBTU0VcbiAgY29uc3QgbG9nOiBSZXF1ZXN0TG9nZ2VyID0gKHR5cGUsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICBjb25zdCBtZXRhID0geyByZXF1ZXN0SWQsIG9yZ0lkOiBpZGVudGl0eS5vcmdJZCwgdHlwZSwgZGF0YSB9O1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV0FSTic6XG4gICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UsIG1ldGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2UsIG1ldGEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc3NlTWFuYWdlci5zZW5kKHJlcXVlc3RJZCwgdHlwZSwgbWVzc2FnZSwgZGF0YSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0SWQsXG4gICAgaWRlbnRpdHksXG4gICAgbG9nLFxuICB9O1xufVxuIl19
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVxdWVzdC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBMEMsTUFBTSw0QkFBNEIsQ0FBQztBQUVoSSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLG1DQUFtQyxDQUFDO0FBY2xGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQW1CMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEdBQVksRUFDWixVQUFzQjtJQUV0QixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBa0IsQ0FBQyxDQUFDO0lBQ2pELG1FQUFtRTtJQUNuRSx5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRWhFLGdEQUFnRDtJQUNoRCxNQUFNLEdBQUcsR0FBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pELE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxPQUFPO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU07UUFDVixDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHNDQUFzQztRQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgY3JlYXRlTG9nZ2VyLCByZWRhY3RTZW5zaXRpdmUsIHR5cGUgUmVxdWVzdElkZW50aXR5LCB0eXBlIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyB2NyBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyLCB0eXBlIFNTRUV2ZW50VHlwZSB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5cbi8vIENvbnNvbGlkYXRlZCBFeHByZXNzIFJlcXVlc3QgYXVnbWVudGF0aW9uc1xuZGVjbGFyZSBnbG9iYWwge1xuICBuYW1lc3BhY2UgRXhwcmVzcyB7XG4gICAgaW50ZXJmYWNlIFJlcXVlc3Qge1xuICAgICAgLyoqIFVuaXF1ZSByZXF1ZXN0IElEIChzZXQgYnkgYXBwLWZhY3RvcnkgbWlkZGxld2FyZSkgKi9cbiAgICAgIHJlcXVlc3RJZD86IHN0cmluZztcbiAgICAgIC8qKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSwgbG9nZ2luZywgYW5kIFNTRSAqL1xuICAgICAgY29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2FwaS1zZXJ2ZXInKTtcblxuLyoqXG4gKiBSZXF1ZXN0IGxvZ2dlciBmdW5jdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dnZXIgPSAodHlwZTogU1NFRXZlbnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuXG4vKipcbiAqIFJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHQge1xuICAvKiogVW5pcXVlIHJlcXVlc3QgSUQgKi9cbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIC8qKiBJZGVudGl0eSBmcm9tIGhlYWRlcnMgKi9cbiAgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eTtcbiAgLyoqIExvZ2dpbmcgZnVuY3Rpb24gdGhhdCBzZW5kcyB0byBjb25zb2xlIGFuZCBTU0UgKi9cbiAgbG9nOiBSZXF1ZXN0TG9nZ2VyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnaW5nXG4gKlxuICogQ3JlYXRlcyBhIGxvZ2dlciB0aGF0IG91dHB1dHMgdG8gYm90aCBjb25zb2xlIGFuZCBTU0UuXG4gKlxuICogQHBhcmFtIHJlcSAtIEV4cHJlc3MgcmVxdWVzdFxuICogQHBhcmFtIHNzZU1hbmFnZXIgLSBTU0UgbWFuYWdlciBmb3IgcmVhbC10aW1lIGxvZ3NcbiAqIEByZXR1cm5zIFJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgIGNvbnN0IGN0eCA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0KHJlcSwgc3NlTWFuYWdlcik7XG4gKlxuICogICBjdHgubG9nKCdJTkZPJywgJ1Byb2Nlc3NpbmcgcmVxdWVzdCcsIHsgZGF0YTogcmVxLmJvZHkgfSk7XG4gKlxuICogICBpZiAoIWN0eC5pZGVudGl0eS5vcmdJZCkge1xuICogICAgIGN0eC5sb2coJ0VSUk9SJywgJ01pc3Npbmcgb3JnYW5pemF0aW9uIElEJyk7XG4gKiAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KHJlcywgJ3gtb3JnLWlkIGhlYWRlciByZXF1aXJlZCcpO1xuICogICB9XG4gKlxuICogICAvLyBQcm9jZXNzIHJlcXVlc3QuLi5cbiAqICAgY3R4LmxvZygnQ09NUExFVEVEJywgJ1JlcXVlc3QgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseScpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICByZXE6IFJlcXVlc3QsXG4gIHNzZU1hbmFnZXI6IFNTRU1hbmFnZXIsXG4pOiBSZXF1ZXN0Q29udGV4dCB7XG4gIGNvbnN0IGlkZW50aXR5ID0gZ2V0SWRlbnRpdHkocmVxIGFzIEh0dHBSZXF1ZXN0KTtcbiAgLy8gUHJlZmVyIHRoZSBhbHJlYWR5LXBhcnNlZCByZXF1ZXN0SWQgZnJvbSBhcHAtZmFjdG9yeSBtaWRkbGV3YXJlLFxuICAvLyBmYWxsIGJhY2sgdG8gaWRlbnRpdHkgaGVhZGVyLCB0aGVuIGdlbmVyYXRlIGEgbmV3IG9uZS5cbiAgY29uc3QgcmVxdWVzdElkID0gcmVxLnJlcXVlc3RJZCB8fCBpZGVudGl0eS5yZXF1ZXN0SWQgfHwgdXVpZCgpO1xuXG4gIC8vIENyZWF0ZSBsb2dnZXIgdGhhdCBvdXRwdXRzIHRvIFdpbnN0b24gYW5kIFNTRVxuICBjb25zdCBsb2c6IFJlcXVlc3RMb2dnZXIgPSAodHlwZSwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IG1ldGEgPSB7IHJlcXVlc3RJZCwgb3JnSWQ6IGlkZW50aXR5Lm9yZ0lkLCB0eXBlLCBkYXRhIH07XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXQVJOJzpcbiAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBUaGUgV2luc3RvbiBjYWxsIGFib3ZlIGlzIHJlZGFjdGVkIGJ5IHRoZSBsb2dnZXIncyBgcmVkYWN0Rm9ybWF0YCwgYnV0IHRoZVxuICAgIC8vIFNTRSBmcmFtZSBieXBhc3NlcyB0aGUgbG9nZ2VyIGVudGlyZWx5IOKAlCBhcHBseSB0aGUgU0FNRSBrZXktcGF0dGVyblxuICAgIC8vIHJlZGFjdGlvbiB0byBgZGF0YWAgYmVmb3JlIGl0J3MgcHVzaGVkIHRvIHRoZSBjbGllbnQgc28gYSBzZWNyZXQgaW4gdGhlXG4gICAgLy8gbG9nIHBheWxvYWQgKGUuZy4gYW4gYWNjaWRlbnRhbCBgdG9rZW5gL2BwYXNzd29yZGAgZmllbGQpIGlzbid0IHN0cmVhbWVkXG4gICAgLy8gb3V0IG92ZXIgdGhlIGJ1aWxkLWxvZyBTU0UgY2hhbm5lbC5cbiAgICBzc2VNYW5hZ2VyLnNlbmQocmVxdWVzdElkLCB0eXBlLCBtZXNzYWdlLCByZWRhY3RTZW5zaXRpdmUoZGF0YSkpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcmVxdWVzdElkLFxuICAgIGlkZW50aXR5LFxuICAgIGxvZyxcbiAgfTtcbn1cbiJdfQ==