@workflow/core 5.0.0-beta.49 → 5.0.0-beta.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-hook.d.ts +3 -0
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/runtime/resume-hook.d.ts +59 -7
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +99 -38
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +1 -1
|
@@ -140,36 +140,87 @@ async function resolveHookEncryptionKey(hook, info) {
|
|
|
140
140
|
});
|
|
141
141
|
return rawKey ? await importKey(rawKey) : undefined;
|
|
142
142
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
143
|
+
/** Whether `metadata` on this record is already the lazy Promise accessor. */
|
|
144
|
+
function hasLazyMetadata(hook) {
|
|
145
|
+
const descriptor = Object.getOwnPropertyDescriptor(hook, 'metadata');
|
|
146
|
+
return descriptor !== undefined && typeof descriptor.get === 'function';
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Wraps a raw hook record from a World in a {@link Hook},
|
|
150
|
+
* replacing its serialized `metadata` with a memoized Promise getter that
|
|
151
|
+
* hydrates on first access.
|
|
152
|
+
*
|
|
153
|
+
* Nothing here touches the network: the wrap is a property definition. All of
|
|
154
|
+
* the cost — resolving the run's payload keys and decrypting — moves inside the
|
|
155
|
+
* getter, so a lookup that never reads metadata pays for exactly one
|
|
156
|
+
* `hooks.getByToken`.
|
|
157
|
+
*
|
|
158
|
+
* The getter is defined in place on the record the World returned (the same
|
|
159
|
+
* object the eager path used to mutate), so no copy is made.
|
|
160
|
+
*/
|
|
161
|
+
function withLazyMetadata(raw) {
|
|
162
|
+
const serialized = raw.metadata;
|
|
163
|
+
let hydrated;
|
|
154
164
|
let encryptionKey;
|
|
155
|
-
|
|
156
|
-
|
|
165
|
+
// Hydrating metadata is a decrypting READ, so it derives the full
|
|
166
|
+
// RunPayloadKeys (which open sealed `encp` metadata, not just symmetric
|
|
167
|
+
// `encr`) rather than the bare write key the resume path uses.
|
|
168
|
+
const hydrate = async () => {
|
|
169
|
+
const world = await getWorldLazy();
|
|
170
|
+
const info = await resolveHookResumeInfo(raw);
|
|
157
171
|
// On the fast path this resolves the key by runId + deploymentId (no run
|
|
158
172
|
// read); on the fallback path it reuses the already-fetched run.
|
|
159
173
|
const rawKey = info.run
|
|
160
174
|
? await world.getEncryptionKeyForRun?.(info.run)
|
|
161
|
-
: await world.getEncryptionKeyForRun?.(
|
|
175
|
+
: await world.getEncryptionKeyForRun?.(raw.runId, {
|
|
162
176
|
deploymentId: info.resumeContext.deploymentId,
|
|
163
177
|
});
|
|
164
178
|
encryptionKey = rawKey ? await deriveRunPayloadKeys(rawKey) : undefined;
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
|
|
179
|
+
return await hydrateStepArguments(serialized, raw.runId, encryptionKey);
|
|
180
|
+
};
|
|
181
|
+
const hook = raw;
|
|
182
|
+
Object.defineProperty(hook, 'metadata', {
|
|
183
|
+
// A hook with no metadata resolves `undefined` without any I/O, so callers
|
|
184
|
+
// can await unconditionally. Memoized either way: metadata is fixed at
|
|
185
|
+
// hook-creation time, so hydration runs at most once per hook object.
|
|
186
|
+
get: () => (hydrated ??=
|
|
187
|
+
typeof serialized === 'undefined'
|
|
188
|
+
? Promise.resolve(undefined)
|
|
189
|
+
: hydrate()),
|
|
190
|
+
// Non-enumerable, matching `Run.returnValue` (a prototype getter, so it is
|
|
191
|
+
// absent from an instance's own keys). Spreading or `JSON.stringify`-ing a
|
|
192
|
+
// hook therefore cannot trigger hydration nobody asked for — which would
|
|
193
|
+
// otherwise leave a floating rejection when the run key is unreachable, and
|
|
194
|
+
// an unconsumed rejected Promise crashes Node as an unhandledRejection.
|
|
195
|
+
enumerable: false,
|
|
196
|
+
configurable: true,
|
|
197
|
+
});
|
|
198
|
+
return { hook, metadataEncryptionKey: () => encryptionKey };
|
|
168
199
|
}
|
|
169
200
|
/**
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* the
|
|
201
|
+
* Normalizes any hook record the resume path accepted into a
|
|
202
|
+
* {@link Hook} to return to the caller. Idempotent: a hook that
|
|
203
|
+
* already carries the lazy accessor (one that came from `getHookByToken`) is
|
|
204
|
+
* returned as-is rather than double-wrapped, which would hand
|
|
205
|
+
* `hydrateStepArguments` a Promise.
|
|
206
|
+
*/
|
|
207
|
+
function asLazyMetadataHook(hook) {
|
|
208
|
+
return hasLazyMetadata(hook)
|
|
209
|
+
? hook
|
|
210
|
+
: withLazyMetadata(hook).hook;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get the hook by token to find the associated workflow run.
|
|
214
|
+
*
|
|
215
|
+
* This is a single read. The returned hook's `metadata` is a getter that
|
|
216
|
+
* resolves a Promise (see {@link Hook}), so the run fetch and
|
|
217
|
+
* `run-key` round trip that hydrating it can require are only paid by callers
|
|
218
|
+
* that actually await it:
|
|
219
|
+
*
|
|
220
|
+
* ```ts
|
|
221
|
+
* const hook = await getHookByToken(token);
|
|
222
|
+
* const metadata = await hook.metadata;
|
|
223
|
+
* ```
|
|
173
224
|
*
|
|
174
225
|
* A Hook kept by minimum retention remains available here after its run ends,
|
|
175
226
|
* but cannot be resumed.
|
|
@@ -177,8 +228,8 @@ async function getHookByTokenWithKey(token) {
|
|
|
177
228
|
* @param token - The unique token identifying the hook
|
|
178
229
|
*/
|
|
179
230
|
export async function getHookByToken(token) {
|
|
180
|
-
const
|
|
181
|
-
return hook;
|
|
231
|
+
const world = await getWorldLazy();
|
|
232
|
+
return withLazyMetadata(await world.hooks.getByToken(token)).hook;
|
|
182
233
|
}
|
|
183
234
|
/**
|
|
184
235
|
* Resumes a workflow run by sending a payload to a hook identified by its token.
|
|
@@ -493,7 +544,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
|
|
|
493
544
|
...(resumeId ? { idempotencyKey: `hook-${resumeId}` } : {}),
|
|
494
545
|
}), world.isDeploymentUnavailableError?.bind(world));
|
|
495
546
|
span?.setAttributes(Attribute.HookWakePublished(true));
|
|
496
|
-
return hook;
|
|
547
|
+
return asLazyMetadataHook(hook);
|
|
497
548
|
}
|
|
498
549
|
catch (err) {
|
|
499
550
|
span?.setAttributes({
|
|
@@ -547,7 +598,8 @@ export async function resumeWebhook(token, request) {
|
|
|
547
598
|
// and not inside `resumeHookImpl`; otherwise webhook resumes would report a
|
|
548
599
|
// systematically shorter total than `resumeHook` ones into the same metric.
|
|
549
600
|
const resumeRequestedAtMs = Date.now();
|
|
550
|
-
const
|
|
601
|
+
const world = await getWorldLazy();
|
|
602
|
+
const { hook, metadataEncryptionKey } = withLazyMetadata(await world.hooks.getByToken(token));
|
|
551
603
|
// Only webhooks can be resumed via the public endpoint.
|
|
552
604
|
// If the hook was created via createHook() (isWebhook !== true),
|
|
553
605
|
// throw the same "not found" error the world would throw for a missing
|
|
@@ -555,35 +607,44 @@ export async function resumeWebhook(token, request) {
|
|
|
555
607
|
if (hook.isWebhook === false) {
|
|
556
608
|
throw new HookNotFoundError(token);
|
|
557
609
|
}
|
|
610
|
+
// `respondWith` lives in the hook's metadata, so this is the one resume path
|
|
611
|
+
// that has to read it. Only a webhook that actually stored metadata pays for
|
|
612
|
+
// the hydration: the common default webhook — createWebhook() with no
|
|
613
|
+
// `respondWith` — stores none, so this resolves `undefined` with no ~350ms
|
|
614
|
+
// `run-key` API round trip, and hands `resumeHook` no key, leaving it free to
|
|
615
|
+
// seal the payload to the run's published public key instead.
|
|
616
|
+
const metadata = await hook.metadata;
|
|
558
617
|
let response;
|
|
559
618
|
let responseReadable;
|
|
560
|
-
if (
|
|
561
|
-
|
|
562
|
-
'respondWith' in hook.metadata) {
|
|
563
|
-
if (hook.metadata.respondWith === 'manual') {
|
|
619
|
+
if (metadata && typeof metadata === 'object' && 'respondWith' in metadata) {
|
|
620
|
+
if (metadata.respondWith === 'manual') {
|
|
564
621
|
const { readable, writable } = new TransformStream();
|
|
565
622
|
responseReadable = readable;
|
|
566
623
|
// The request instance includes the writable stream which will be used
|
|
567
624
|
// to write the response to the client from within the workflow run
|
|
568
625
|
request[WEBHOOK_RESPONSE_WRITABLE] = writable;
|
|
569
626
|
}
|
|
570
|
-
else if (
|
|
571
|
-
response =
|
|
627
|
+
else if (metadata.respondWith instanceof Response) {
|
|
628
|
+
response = metadata.respondWith;
|
|
572
629
|
}
|
|
573
630
|
else {
|
|
574
|
-
throw new WorkflowRuntimeError(`Invalid \`respondWith\` value: ${
|
|
631
|
+
throw new WorkflowRuntimeError(`Invalid \`respondWith\` value: ${metadata.respondWith}`, { slug: ERROR_SLUGS.WEBHOOK_INVALID_RESPOND_WITH_VALUE });
|
|
575
632
|
}
|
|
576
633
|
}
|
|
577
634
|
else {
|
|
578
635
|
// No `respondWith` value implies the default behavior of returning a 202
|
|
579
636
|
response = new Response(null, { status: 202 });
|
|
580
637
|
}
|
|
581
|
-
// `hook` was just fetched
|
|
582
|
-
//
|
|
583
|
-
//
|
|
584
|
-
//
|
|
585
|
-
//
|
|
586
|
-
|
|
638
|
+
// `hook` was just fetched by token above, so its response-only
|
|
639
|
+
// `resumeCapabilities` reflects the live backend. Call the internal
|
|
640
|
+
// implementation with the fresh attestation so the write's idempotency claim
|
|
641
|
+
// stays available without a second GET. (The public `resumeHook` never sets
|
|
642
|
+
// this, so a caller cannot forge it.)
|
|
643
|
+
//
|
|
644
|
+
// Reuse whatever key the metadata hydration above resolved (`undefined` when
|
|
645
|
+
// it resolved none) so a metadata-bearing webhook resolves the run key
|
|
646
|
+
// exactly once end to end.
|
|
647
|
+
await resumeHookImpl(hook, request, metadataEncryptionKey(), true, resumeRequestedAtMs);
|
|
587
648
|
if (responseReadable) {
|
|
588
649
|
// Wait for the readable stream to emit one chunk,
|
|
589
650
|
// which is the `Response` object
|
|
@@ -601,4 +662,4 @@ export async function resumeWebhook(token, request) {
|
|
|
601
662
|
}
|
|
602
663
|
return response;
|
|
603
664
|
}
|
|
604
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2Ysb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHlCQUF5QixFQUd6QixtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxF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LEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFOUUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGtEQUFrRDtRQUNsRCxpQ0FBaUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFO1lBQ3JFLElBQUksRUFBRSxXQUFXLENBQUMseUJBQXlCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRVJST1JfU0xVR1MsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0RFRFVQX1ZFUlNJT04sXG4gIHR5cGUgSG9vayxcbiAgdHlwZSBIb29rUmVzdW1lQ29udGV4dCxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IGdldFJ1bkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL2NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZGVjb2RlUnVuUHVibGljS2V5IH0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQgeyBkZXJpdmVSdW5QYXlsb2FkS2V5cyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICB0eXBlIFBheWxvYWRLZXksXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG4gIHNlYWxUbyxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGxpbmtUb1RyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5cbi8qKiBNb25vdG9uaWMgVUxJRCBmYWN0b3J5IGZvciBwZXItY2FsbCByZXN1bWUgaWRlbXBvdGVuY3kga2V5cy4gKi9cbmNvbnN0IGdlbmVyYXRlUmVzdW1lSWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogSGV4IFNIQS0yNTYgb2YgdGhlIHNlcmlhbGl6ZWQgcmVzdW1lIHBheWxvYWQgYnl0ZXMuIENvbXB1dGVkIG9uY2UgYnkgdGhlXG4gKiBwcm9kdWNlciBhbmQgc2VudCB3aXRoIGl0cyBkdXJhYmxlIGBob29rX3JlY2VpdmVkYCB3cml0ZSBzbyB0cmFuc3BvcnQgYW5kXG4gKiBzbG90IHJldHJpZXMgY29udmVyZ2UgdGhyb3VnaCB0aGUgc2VydmVyJ3MgYChydW5JZCwgcmVzdW1lSWQpYCBjb25zdHJhaW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlUmVzdW1lUGF5bG9hZERpZ2VzdChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgYnl0ZXMpO1xuICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGlnZXN0KTtcbiAgbGV0IGhleCA9ICcnO1xuICBmb3IgKGNvbnN0IGIgb2Ygdmlldykge1xuICAgIGhleCArPSBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG4gIHJldHVybiBoZXg7XG59XG5cbmNvbnN0IEhPT0tfV0FLRV9SRVRSWV9ERUxBWVNfTVMgPSBbMjUsIDEwMF0gYXMgY29uc3Q7XG5cbi8qKlxuICogQSB3YWtlIGZhaWx1cmUgd29ydGggcmV0cnlpbmcgaXMgdHJhbnNwb3J0LXNoYXBlZCAobmV0d29yayBlcnJvciwgNXh4LFxuICogdGhyb3R0bGUpLiBBIGRlZmluaXRpdmUgcmVqZWN0aW9uIHdpbGwgbm90IGNoYW5nZSBvbiBhIDI1bXMgcmV0cnksIHNvXG4gKiBzcGVuZGluZyB0aGUgYnVkZ2V0IG9uIGl0IG9ubHkgZGVsYXlzIHRoZSBjYWxsZXIncyBlcnJvci5cbiAqXG4gKiBgQHZlcmNlbC9xdWV1ZWAgZXJyb3JzIGNhcnJ5IG5vIGBzdGF0dXNgIGZpZWxkIOKAlCB0aGV5IGFyZSBiYXJlIGBFcnJvcmBcbiAqIHN1YmNsYXNzZXMgZGlzdGluZ3Vpc2hlZCBieSBgbmFtZWAg4oCUIHNvIGNsYXNzaWZpY2F0aW9uIGNoZWNrcyB0aGUgV29ybGQnc1xuICogZGVwbG95bWVudC11bmF2YWlsYWJsZSBob29rIGZpcnN0IChhIGRlcGxveW1lbnQgdGhlIHF1ZXVlIGNhbm5vdCBkaXNjb3ZlclxuICogd2lsbCBub3QgY29tZSBiYWNrIHdpdGhpbiB0aGlzIGZ1bmN0aW9uJ3MgfjEyNW1zIGJ1ZGdldCksIHRoZW4gYSBudW1lcmljXG4gKiBzdGF0dXMgd2hlbiBvbmUgZXhpc3RzIChub24tVmVyY2VsIHF1ZXVlIGltcGxlbWVudGF0aW9ucyksIHRoZW4gdGhlIHF1ZXVlXG4gKiBjbGllbnQncyBkZWZpbml0aXZlLTR4eCBlcnJvciBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVXYWtlRXJyb3IoXG4gIGVycm9yOiB1bmtub3duLFxuICBpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I/LihlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogdW5rbm93bjsgc3RhdHVzQ29kZT86IHVua25vd24gfSkgPz8ge307XG4gIGNvbnN0IGNvZGUgPSBzdGF0dXMuc3RhdHVzID8/IHN0YXR1cy5zdGF0dXNDb2RlO1xuICBpZiAodHlwZW9mIGNvZGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gNTAwIHx8IGNvZGUgPT09IDQwOCB8fCBjb2RlID09PSA0Mjk7XG4gIH1cbiAgY29uc3QgbmFtZSA9IChlcnJvciBhcyBFcnJvciB8IG51bGwpPy5uYW1lO1xuICByZXR1cm4gKFxuICAgIG5hbWUgIT09ICdCYWRSZXF1ZXN0RXJyb3InICYmXG4gICAgbmFtZSAhPT0gJ1VuYXV0aG9yaXplZEVycm9yJyAmJlxuICAgIG5hbWUgIT09ICdGb3JiaWRkZW5FcnJvcidcbiAgKTtcbn1cblxuLy8gQSBwdWJsaXNoIG1heSBzdWNjZWVkIGV2ZW4gd2hlbiBpdHMgcmVzcG9uc2UgaXMgbG9zdCwgc28gYSByZXRyeSBjYW5cbi8vIGVucXVldWUgYSBkdXBsaWNhdGUgd2FrZS4gVGhhdCBpcyBoYXJtbGVzczogdGhlIGV2ZW50IGlzIGFscmVhZHkgZHVyYWJsZSxcbi8vIGFuZCBkZXRlcm1pbmlzdGljIHJlcGxheSBtYWtlcyBhIHNlY29uZCBkZWxpdmVyeSBvZiB0aGUgc2FtZSBydW4gYSBuby1vcC5cbmFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hIb29rV2FrZVdpdGhSZXRyeShcbiAgcHVibGlzaDogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBsYXN0RXJyb3I6IHVua25vd247XG4gIGZvciAoXG4gICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgIGF0dGVtcHQgPD0gSE9PS19XQUtFX1JFVFJZX0RFTEFZU19NUy5sZW5ndGg7XG4gICAgYXR0ZW1wdCsrXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwdWJsaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgaWYgKCFpc1JldHJ5YWJsZVdha2VFcnJvcihlcnJvciwgaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcikpIGJyZWFrO1xuICAgICAgY29uc3QgZGVsYXlNcyA9IEhPT0tfV0FLRV9SRVRSWV9ERUxBWVNfTVNbYXR0ZW1wdF07XG4gICAgICBpZiAoZGVsYXlNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUaGUgd2FrZSBvbmx5IHJ1bnMgYWZ0ZXIgdGhlIGhvb2tfcmVjZWl2ZWQgd3JpdGUgY29tbWl0dGVkLCBzbyBhIHdha2VcbiAgLy8gZmFpbHVyZSBoZXJlIGlzIG5lY2Vzc2FyaWx5IFwiZHVyYWJsZSBidXQgbm90IHlldCBkaXNwYXRjaGVkXCI6IHRoZSBldmVudFxuICAvLyBzdXJ2aXZlcywgYW5kIGFueSBsYXRlciB3YWtlIG9mIHRoZSBydW4gZGVsaXZlcnMgaXQuIERvIG5vdCBsZXQgYSBxdWV1ZVxuICAvLyBpbXBsZW1lbnRhdGlvbiByZXVzZSBIb29rTm90Rm91bmRFcnJvciBhbmQgYWNjaWRlbnRhbGx5IGltcGx5IHRoYXQgbm9cbiAgLy8gaG9va19yZWNlaXZlZCBleGlzdHMuXG4gIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhsYXN0RXJyb3IpKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgJ1RoZSBob29rIHJlc3VtZSB3YXMgY29tbWl0dGVkLCBidXQgaXRzIHdvcmtmbG93IHdha2UgY291bGQgbm90IGJlIHB1Ymxpc2hlZCcsXG4gICAgICB7IGNhdXNlOiBsYXN0RXJyb3IgfVxuICAgICk7XG4gIH1cbiAgdGhyb3cgbGFzdEVycm9yO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bWUgY29udGV4dCBmb3IgYSBob29rIHBsdXMgd2hlcmUgaXQgY2FtZSBmcm9tLiBgcnVuYCBpcyBwcmVzZW50IG9ubHlcbiAqIG9uIHRoZSBmYWxsYmFjayBwYXRoIChwcmUtYHJlc3VtZUNvbnRleHRgIGhvb2tzKSwgd2hlcmUgaXQgYWxzbyBjYXJyaWVzIHRoZVxuICogcnVuJ3MgbXV0YWJsZSBzdGF0dXMgZm9yIHRoZSB0ZXJtaW5hbC1ydW4gY2hlY2suIEtleSByZXNvbHV0aW9uIGlzIGtlcHRcbiAqIHNlcGFyYXRlIHNvIGNhbGxlcnMgY2FuIGdhdGUgaXQgYmVoaW5kIHRoYXQgY2hlY2suXG4gKi9cbmludGVyZmFjZSBIb29rUmVzdW1lSW5mbyB7XG4gIHJlc3VtZUNvbnRleHQ6IEhvb2tSZXN1bWVDb250ZXh0O1xuICBzb3VyY2U6ICdob29rJyB8ICdydW5fZmFsbGJhY2snO1xuICBydW4/OiBXb3JrZmxvd1J1bjtcbn1cblxuLyoqIERlcml2ZSBhIHJlc3VtZSBjb250ZXh0IGZyb20gYSBmdWxsIHJ1biAoZmFsbGJhY2sgZm9yIHByZS1gcmVzdW1lQ29udGV4dGAgaG9va3MpLiAqL1xuZnVuY3Rpb24gcmVzdW1lQ29udGV4dEZyb21SdW4ocnVuOiBXb3JrZmxvd1J1bik6IEhvb2tSZXN1bWVDb250ZXh0IHtcbiAgY29uc3QgY29yZVZlcnNpb24gPSBydW4uZXhlY3V0aW9uQ29udGV4dD8ud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgY29uc3QgdHJhY2VDYXJyaWVyID0gcnVuLmV4ZWN1dGlvbkNvbnRleHQ/LnRyYWNlQ2FycmllcjtcbiAgY29uc3QgaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHJ1bi5leGVjdXRpb25Db250ZXh0Py5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICByZXR1cm4ge1xuICAgIGRlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgcnVuU3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbixcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOlxuICAgICAgdHlwZW9mIGNvcmVWZXJzaW9uID09PSAnc3RyaW5nJyA/IGNvcmVWZXJzaW9uIDogdW5kZWZpbmVkLFxuICAgIHRyYWNlQ2FycmllcjpcbiAgICAgIHRyYWNlQ2FycmllciAmJiB0eXBlb2YgdHJhY2VDYXJyaWVyID09PSAnb2JqZWN0J1xuICAgICAgICA/ICh0cmFjZUNhcnJpZXIgYXMgSG9va1Jlc3VtZUNvbnRleHRbJ3RyYWNlQ2FycmllciddKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBlbmNyeXB0aW9uUHVibGljS2V5OiBydW4uZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uOlxuICAgICAgdHlwZW9mIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPT09ICdudW1iZXInXG4gICAgICAgID8gaG9va1Jlc3VtZUlucHV0VmVyc2lvblxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHJlc3VtZSBjb250ZXh0IGZvciBhIGhvb2suIFVzZXMgdGhlIHN0b3JlZCBgcmVzdW1lQ29udGV4dGAgd2hlblxuICogcHJlc2VudCAoZmFzdCBwYXRoLCBubyBydW4gcmVhZCk7IG90aGVyd2lzZSBmZXRjaGVzIHRoZSBydW4gYW5kIHN5bnRoZXNpemVzXG4gKiBpdC4gRG9lcyBOT1QgcmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXk7IGNhbGxlcnMgZG8gdGhhdCBzZXBhcmF0ZWx5LiBPbmx5XG4gKiB0aGUgZmFsbGJhY2sgcGF0aCBjYW4gZ2F0ZSBrZXkgd29yayBiZWhpbmQgYSBsb2NhbCB0ZXJtaW5hbC1ydW4gY2hlY2sgKGl0XG4gKiBoYXMgdGhlIGZldGNoZWQgcnVuKTsgdGhlIGZhc3QgcGF0aCdzIHN0b3JlZCBjb250ZXh0IGNhcnJpZXMgbm8gc3RhdHVzLCBzb1xuICogc2VhbC9zZXJpYWxpemF0aW9uIHdvcmsgbWF5IHJ1biBiZWZvcmUgdGhlIHJlY2VpdmluZyBzaWRlIHJlamVjdHNcbiAqIGBob29rX3JlY2VpdmVkYCBmb3IgYW4gZW5kZWQgcnVuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSG9va1Jlc3VtZUluZm8oaG9vazogSG9vayk6IFByb21pc2U8SG9va1Jlc3VtZUluZm8+IHtcbiAgaWYgKGhvb2sucmVzdW1lQ29udGV4dCkge1xuICAgIHJldHVybiB7IHJlc3VtZUNvbnRleHQ6IGhvb2sucmVzdW1lQ29udGV4dCwgc291cmNlOiAnaG9vaycgfTtcbiAgfVxuICBjb25zdCBydW4gPSBhd2FpdCAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpLnJ1bnMuZ2V0KGhvb2sucnVuSWQpO1xuICByZXR1cm4ge1xuICAgIHJlc3VtZUNvbnRleHQ6IHJlc3VtZUNvbnRleHRGcm9tUnVuKHJ1biksXG4gICAgc291cmNlOiAncnVuX2ZhbGxiYWNrJyxcbiAgICBydW4sXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcnVuJ3Mgc3ltbWV0cmljIGtleSBmb3IgYSBwYXlsb2FkIFdSSVRFLCBhcyBhIGJhcmUgYENyeXB0b0tleWBcbiAqIChgaW1wb3J0S2V5YCk6IHRoZSBgZW5jcmAgd3JpdGUgZmFsbGJhY2sgdXNlZCB3aGVuIHRoZSBydW4gcHVibGlzaGVkIG5vXG4gKiBwdWJsaWMga2V5IHRvIHNlYWwgdG8uIFdyaXRpbmcgbmVlZHMgb25seSB0aGUgQUVTIGtleSwgbm90IHRoZSByZWFkLXNpZGVcbiAqIGtleXBhaXIuIE9uIHRoZSBmYXN0IHBhdGggdGhpcyBuZWVkcyBvbmx5IGBydW5JZGAgKyBgZGVwbG95bWVudElkYCAobm8gcnVuXG4gKiBlbnRpdHkpOyBvbiB0aGUgZmFsbGJhY2sgcGF0aCB0aGUgYWxyZWFkeSBmZXRjaGVkIHJ1biBpcyByZXVzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb29rRW5jcnlwdGlvbktleShcbiAgaG9vazogSG9vayxcbiAgaW5mbzogSG9va1Jlc3VtZUluZm9cbik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnRLZXk+PiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCByYXdLZXkgPSBpbmZvLnJ1blxuICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGluZm8ucnVuKVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhvb2sucnVuSWQsIHtcbiAgICAgICAgZGVwbG95bWVudElkOiBpbmZvLnJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgfSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgaG9vazogSG9vaztcbiAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgY29uc3QgaG9vayA9IGF3YWl0IHdvcmxkLmhvb2tzLmdldEJ5VG9rZW4odG9rZW4pO1xuXG4gIC8vIE9ubHkgYSBob29rIHRoYXQgYWN0dWFsbHkgY2FycmllcyBtZXRhZGF0YSBuZWVkcyB0aGUgcnVuJ3Mga2V5IHJlc29sdmVkXG4gIC8vIGhlcmU6IGh5ZHJhdGluZyB0aGF0IG1ldGFkYXRhIGlzIGEgUkVBRCwgc28gZGVyaXZlIHRoZSBmdWxsIFJ1blBheWxvYWRLZXlzXG4gIC8vICh3aGljaCBvcGVucyBzZWFsZWQgYGVuY3BgIG1ldGFkYXRhLCBub3QganVzdCBzeW1tZXRyaWMgYGVuY3JgKS4gVGhlIGNvbW1vblxuICAvLyBkZWZhdWx0IHdlYmhvb2sgKGNyZWF0ZVdlYmhvb2soKSB3aXRoIG5vIGByZXNwb25kV2l0aGApIHN0b3JlcyBub1xuICAvLyBtZXRhZGF0YSwgc28gaXQgc2tpcHMgdGhpcyBlbnRpcmVseTogbm8gfjM1MG1zIGBydW4ta2V5YCBBUEkgcm91bmQgdHJpcCxcbiAgLy8gYW5kLCBjcnVjaWFsbHksIG5vIHJlc29sdmVkIGtleSBoYW5kZWQgdG8gYHJlc3VtZUhvb2tgLCBsZWF2aW5nIGl0IGZyZWUgdG9cbiAgLy8gc2VhbCB0aGUgcGF5bG9hZCB0byB0aGUgcnVuJ3MgcHVibGlzaGVkIHB1YmxpYyBrZXkgaW5zdGVhZC4gTWV0YWRhdGEtXG4gIC8vIGJlYXJpbmcgd2ViaG9va3Mgc3RpbGwgbGVnaXRpbWF0ZWx5IHBheSBvbmUgbG9va3VwIHRvIGh5ZHJhdGUuXG4gIGxldCBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2subWV0YWRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHJlc29sdmVIb29rUmVzdW1lSW5mbyhob29rKTtcbiAgICAvLyBPbiB0aGUgZmFzdCBwYXRoIHRoaXMgcmVzb2x2ZXMgdGhlIGtleSBieSBydW5JZCArIGRlcGxveW1lbnRJZCAobm8gcnVuXG4gICAgLy8gcmVhZCk7IG9uIHRoZSBmYWxsYmFjayBwYXRoIGl0IHJldXNlcyB0aGUgYWxyZWFkeS1mZXRjaGVkIHJ1bi5cbiAgICBjb25zdCByYXdLZXkgPSBpbmZvLnJ1blxuICAgICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaW5mby5ydW4pXG4gICAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/Lihob29rLnJ1bklkLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkOiBpbmZvLnJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgICB9KTtcbiAgICBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICBob29rLm1ldGFkYXRhID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICBob29rLm1ldGFkYXRhIGFzIGFueSxcbiAgICAgIGhvb2sucnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5XG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBob29rLCBlbmNyeXB0aW9uS2V5IH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBob29rIGJ5IHRva2VuIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQgd29ya2Zsb3cgcnVuLFxuICogYW5kIGh5ZHJhdGUgdGhlIGBtZXRhZGF0YWAgcHJvcGVydHkgaWYgaXQgd2FzIHNldCBmcm9tIHdpdGhpblxuICogdGhlIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBBIEhvb2sga2VwdCBieSBtaW5pbXVtIHJldGVudGlvbiByZW1haW5zIGF2YWlsYWJsZSBoZXJlIGFmdGVyIGl0cyBydW4gZW5kcyxcbiAqIGJ1dCBjYW5ub3QgYmUgcmVzdW1lZC5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxIb29rPiB7XG4gIGNvbnN0IHsgaG9vayB9ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuKTtcbiAgcmV0dXJuIGhvb2s7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgcmVzdW1lSG9va306IGEge0BsaW5rIEhvb2t9IGF1Z21lbnRlZCB3aXRoIGFuIG9wdGlvbmFsXG4gKiByZXNpbGllbmNlIHNpZ25hbC5cbiAqXG4gKiBgcmVzaWxpZW50UmVzdW1lYCBpcyByZXRhaW5lZCBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgYW5kIGlzIG5ldmVyIHNldC5cbiAqIGByZXN1bWVIb29rKClgIG5vdyByZXF1aXJlcyB0aGUgZHVyYWJsZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgYW5kIHdvcmtmbG93XG4gKiB3YWtlIHRvIGJvdGggc3VjY2VlZCBiZWZvcmUgaXQgcmVzb2x2ZXMuIFRyZWF0IHRoZSByZXN1bHQgYXMgYSBwbGFpblxuICoge0BsaW5rIEhvb2t9LlxuICovXG5leHBvcnQgdHlwZSBSZXN1bWVkSG9vayA9IEhvb2sgJiB7IHJlc2lsaWVudFJlc3VtZT86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBSZXNvbHZpbmcgbWVhbnMgQk9USCB0aGF0IHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnQgaXMgZHVyYWJseSByZWNvcmRlZCBpblxuICogdGhlIHJ1bidzIGV2ZW50IGxvZyBhbmQgdGhhdCB0aGUgd29ya2Zsb3cgd2FrZSB3YXMgYWNjZXB0ZWQgYnkgdGhlIHF1ZXVlLCBpblxuICogdGhhdCBvcmRlci4gQSB7QGxpbmsgSG9va05vdEZvdW5kRXJyb3J9IG1lYW5zIHRoaXMgaW52b2NhdGlvbiBjb21taXR0ZWQgbm9cbiAqIGV2ZW50LiBBbnkgb3RoZXIgZXJyb3IgYWZ0ZXIgdGhlIHdyaXRlIGlzIGFtYmlndW91cyBvbmx5IGluIGRpc3BhdGNoLCBuZXZlclxuICogaW4gZHVyYWJpbGl0eTogdGhlIGV2ZW50IG1heSBhbHJlYWR5IGJlIGNvbW1pdHRlZCwgYW5kIGEgbGF0ZXIgd2FrZSBvZiB0aGVcbiAqIHJ1biAoZnJvbSBhbnkgc291cmNlKSB3aWxsIGRlbGl2ZXIgaXQuXG4gKlxuICogUHJlZmVyIHBhc3NpbmcgdGhlIHRva2VuIHN0cmluZyBvdmVyIGEgY2FjaGVkIHtAbGluayBIb29rfSBvYmplY3QuIEEgdG9rZW5cbiAqIGlzIGxvb2tlZCB1cCBmcmVzaCwgc28gdGhlIGxpdmUgYmFja2VuZCBjYW4gYXR0ZXN0IGl0cyBhdG9taWMgcmVzdW1lIGNsYWltXG4gKiBhbmQgdGhlIGR1cmFibGUgd3JpdGUgYmVjb21lcyBpZGVtcG90ZW50LW9uLXJldHJ5ICh0cmFuc3BvcnQgcmV0cmllcyBvZiB0aGVcbiAqIHNhbWUgd3JpdGUgY29udmVyZ2Ugb24gb25lIGV2ZW50KS4gQSBzdXBwbGllZCBIb29rIG9iamVjdCBtYXkgY2FycnkgYSBzdGFsZVxuICogYXR0ZXN0YXRpb24sIHNvIGl0IGlzIGRlbGliZXJhdGVseSBpZ25vcmVkIGFuZCB0aGUgd3JpdGUgaXMgY2xhaW0tbGVzcyDigJRcbiAqIG1lYW5pbmcgYSBsb3N0IHJlc3BvbnNlIGNhbm5vdCBiZSByZXRyaWVkIHNhZmVseTogcmV0cnlpbmcgYXQgdGhlXG4gKiBhcHBsaWNhdGlvbiBsZXZlbCBtaW50cyBhIGZyZXNoIGNsYWltIGFuZCBjYW4gY29tbWl0IGEgc2Vjb25kXG4gKiBgaG9va19yZWNlaXZlZGAuXG4gKlxuICogQHBhcmFtIHRva2VuT3JIb29rIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9vaywgb3IgdGhlIGhvb2sgb2JqZWN0IGl0c2VsZlxuICogQHBhcmFtIHBheWxvYWQgLSBUaGUgZGF0YSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB7QGxpbmsgUmVzdW1lZEhvb2t9XG4gKiBAdGhyb3dzIHtIb29rTm90Rm91bmRFcnJvcn0gSWYgdGhlIEhvb2sgZG9lcyBub3QgZXhpc3Qgb3IgaXRzIHJ1biBoYXMgZW5kZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGltcG9ydCB7IHJlc3VtZUhvb2sgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gKiAgIGNvbnN0IHsgdG9rZW4sIGRhdGEgfSA9IGF3YWl0IHJlcXVlc3QuanNvbigpO1xuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCBob29rID0gYXdhaXQgcmVzdW1lSG9vayh0b2tlbiwgZGF0YSk7XG4gKiAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oeyBydW5JZDogaG9vay5ydW5JZCB9KTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdIb29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lSG9vazxUID0gYW55PihcbiAgdG9rZW5Pckhvb2s6IHN0cmluZyB8IEhvb2ssXG4gIHBheWxvYWQ6IFQsXG4gIGVuY3J5cHRpb25LZXlPdmVycmlkZT86IFBheWxvYWRLZXlcbik6IFByb21pc2U8UmVzdW1lZEhvb2s+IHtcbiAgLy8gUHVibGljIGVudHJ5IHBvaW50LiBJdCBuZXZlciBhdHRlc3RzIGhvb2sgZnJlc2huZXNzLCBzbyBhIEhvb2sgb2JqZWN0XG4gIC8vIHN1cHBsaWVkIGhlcmUgKHdoaWNoIG1heSBjYXJyeSBhIGByZXN1bWVDYXBhYmlsaXRpZXNgIGNhY2hlZCBiZWZvcmUgYVxuICAvLyBzZXJ2ZXIgcm9sbGJhY2sgb3Iga2lsbCBzd2l0Y2gpIGlzIGlnbm9yZWQgYnkgdGhlIGR5bmFtaWMtZGVkdXAgZ2F0ZSBhbmRcbiAgLy8gZmFpbHMgY2xvc2VkIHRvIGEgcGxhaW4sIGNsYWltLWxlc3Mgd3JpdGUuIE9ubHkgYHJlc3VtZVdlYmhvb2tgLCB3aGljaFxuICAvLyBmZXRjaGVzIHRoZSBob29rIGJ5IHRva2VuIGluLWxpbmUgZHVyaW5nIHRoZSBzYW1lIHJlc3VtZSwgcmVhY2hlcyB0aGVcbiAgLy8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgZnJlc2ggYXR0ZXN0YXRpb24gc2V0LiBLZWVwaW5nIHRoZVxuICAvLyBmcmVzaG5lc3MgZmxhZyBvZmYgdGhlIGV4cG9ydGVkIHNpZ25hdHVyZSBwcmV2ZW50cyBhIGNhbGxlciBmcm9tIHBhc3NpbmcgYVxuICAvLyBzdGFsZSBIb29rIHBsdXMgYHRydWVgIGFuZCByZWFjdGl2YXRpbmcgZHluYW1pYyBkZWR1cCBhZ2FpbnN0IGFcbiAgLy8gcm9sbGVkLWJhY2sgYmFja2VuZC5cbiAgLy9cbiAgLy8gVDAgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cgaXMgdGFrZW4gSEVSRSwgYXQgdGhlIHB1YmxpYyBlbnRyeSBwb2ludCxcbiAgLy8gcmF0aGVyIHRoYW4gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvbjsgc2VlIHRoZSBwYXJhbWV0ZXIncyBkb2MgY29tbWVudC5cbiAgcmV0dXJuIHJlc3VtZUhvb2tJbXBsKFxuICAgIHRva2VuT3JIb29rLFxuICAgIHBheWxvYWQsXG4gICAgZW5jcnlwdGlvbktleU92ZXJyaWRlLFxuICAgIGZhbHNlLFxuICAgIERhdGUubm93KClcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgcmVzdW1lSG9va30uIE5PVCBleHBvcnRlZDogdGhlXG4gKiBgaG9va0ZyZXNobHlMb29rZWRVcGAgYXR0ZXN0YXRpb24gbXVzdCBuZXZlciBiZSByZWFjaGFibGUgYnkgcHVibGljIGNhbGxlcnNcbiAqIChzZWUgdGhlIHdyYXBwZXIgYWJvdmUpLlxuICpcbiAqIEBwYXJhbSBob29rRnJlc2hseUxvb2tlZFVwIC0gQXR0ZXN0cyB0aGF0IGEgc3VwcGxpZWQgSG9vayBvYmplY3Qgd2FzIGZldGNoZWRcbiAqICAgYnkgdG9rZW4gZHVyaW5nIFRISVMgcmVzdW1lLCBzbyBpdHMgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYFxuICogICByZWZsZWN0cyB0aGUgbGl2ZSBiYWNrZW5kIGFuZCBtYXkgYmUgdHJ1c3RlZCBmb3IgdGhlIGR5bmFtaWMtZGVkdXAgZ2F0ZS5cbiAqICAgQSB0b2tlbiBzdHJpbmcgaXMgYWx3YXlzIGZldGNoZWQgZnJlc2ggaGVyZSwgc28gaXQgaXMgaW1wbGljaXRseSBmcmVzaC5cbiAqIEBwYXJhbSByZXN1bWVSZXF1ZXN0ZWRBdE1zIC0gVDAgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cgKHNlZVxuICogICBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKSwgc3RhbXBlZCBieSB0aGUgUFVCTElDIGVudHJ5IHBvaW50IHRoZSBjYWxsZXJcbiAqICAgdXNlZC4gSXQgaXMgYSBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gYSBsb2NhbCBiZWNhdXNlIGByZXN1bWVXZWJob29rYCBkb2VzXG4gKiAgIHJlYWwgd29yayBiZWZvcmUgaXQgZ2V0cyBoZXJlICh0aGUgYnktdG9rZW4gbG9va3VwLCB0aGUgcnVuLWtleVxuICogICByZXNvbHV0aW9uIHRoYXQgaHlkcmF0ZXMgaG9vayBtZXRhZGF0YSwgYW5kIHRoZSBgcmVzcG9uZFdpdGhgIHNldHVwKSBhbmRcbiAqICAgc3RhbXBpbmcgbG9jYWxseSB3b3VsZCBzaWxlbnRseSBleGNsdWRlIGFsbCBvZiBpdCwgc28gdGhlIHR3byBlbnRyeSBwb2ludHNcbiAqICAgd291bGQgcmVwb3J0IHRoZSBzYW1lIG1ldHJpYyBvdmVyIGRpZmZlcmVudCB3aW5kb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXN1bWVIb29rSW1wbDxUID0gYW55PihcbiAgdG9rZW5Pckhvb2s6IHN0cmluZyB8IEhvb2ssXG4gIHBheWxvYWQ6IFQsXG4gIGVuY3J5cHRpb25LZXlPdmVycmlkZTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgaG9va0ZyZXNobHlMb29rZWRVcDogYm9vbGVhbixcbiAgcmVzdW1lUmVxdWVzdGVkQXRNczogbnVtYmVyXG4pOiBQcm9taXNlPFJlc3VtZWRIb29rPiB7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgcmV0dXJuIHRyYWNlKCdob29rLnJlc3VtZScsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdXBwbGllZFRva2VuID0gdHlwZW9mIHRva2VuT3JIb29rID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgaG9vazogSG9vayA9IHN1cHBsaWVkVG9rZW5cbiAgICAgICAgICA/IGF3YWl0IHdvcmxkLmhvb2tzLmdldEJ5VG9rZW4odG9rZW5Pckhvb2spXG4gICAgICAgICAgOiB0b2tlbk9ySG9vaztcbiAgICAgICAgLy8gVGhlIGR5bmFtaWMsIHJlc3BvbnNlLW9ubHkgYHJlc3VtZUNhcGFiaWxpdGllc2AgbWF5IG9ubHkgYmUgdHJ1c3RlZFxuICAgICAgICAvLyB3aGVuIGl0IGNhbWUgZnJvbSBhIGJ5LXRva2VuIGxvb2t1cCBwZXJmb3JtZWQgZHVyaW5nIHRoaXMgcmVzdW1lLlxuICAgICAgICBjb25zdCBob29rUmVzdW1lQ2FwYWJpbGl0aWVzQXJlRnJlc2ggPVxuICAgICAgICAgIHN1cHBsaWVkVG9rZW4gfHwgaG9va0ZyZXNobHlMb29rZWRVcDtcblxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUhvb2tSZXN1bWVJbmZvKGhvb2spO1xuICAgICAgICBjb25zdCB7IHJlc3VtZUNvbnRleHQgfSA9IGluZm87XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihob29rLnRva2VuKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0lkKGhvb2suaG9va0lkKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChob29rLnJ1bklkKSxcbiAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfY29udGV4dF9zb3VyY2UnOiBpbmZvLnNvdXJjZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhlIHN0b3JlZCBgcmVzdW1lQ29udGV4dGAgaW50ZW50aW9uYWxseSBvbWl0cyB0aGUgcnVuJ3MgbXV0YWJsZVxuICAgICAgICAvLyBzdGF0dXMsIHNvIHRoaXMgZWFybHkgY2xpZW50LXNpZGUgcmVqZWN0aW9uIG9ubHkgcnVucyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgcGF0aCAod2hpY2ggZmV0Y2hlZCB0aGUgcnVuKS4gT24gdGhlIGZhc3QgcGF0aCB0aGUgdGVybWluYWxcbiAgICAgICAgLy8gY2hlY2sgaGFwcGVucyBzZXJ2ZXItc2lkZTogYGhvb2tfcmVjZWl2ZWRgIGFnYWluc3QgYW4gZW5kZWQgcnVuIGlzXG4gICAgICAgIC8vIHJlamVjdGVkLCB3aGljaCB0aGUgY2F0Y2ggYXJvdW5kIGB3b3JsZC5ldmVudHMuY3JlYXRlYCBiZWxvdyByZS1rZXlzXG4gICAgICAgIC8vIHRvIEhvb2tOb3RGb3VuZEVycm9yOiBzYW1lIHB1YmxpYyBjb250cmFjdCwgbm8gcnVuIHByZS1mZXRjaC5cbiAgICAgICAgaWYgKGluZm8ucnVuICYmIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhpbmZvLnJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIHRhcmdldCBydW4ncyBjYXBhYmlsaXRpZXMgdG8gZW5zdXJlIHdlIGVuY29kZSB0aGVcbiAgICAgICAgLy8gcGF5bG9hZCBpbiBhIGZvcm1hdCB0aGUgcnVuJ3MgZGVwbG95bWVudCBjYW4gZGVjb2RlLiBGb3IgZXhhbXBsZSxcbiAgICAgICAgLy8gcnVucyBjcmVhdGVkIGJlZm9yZSBlbmNyeXB0aW9uIHN1cHBvcnQgd2FzIGFkZGVkIGNhbm5vdCBkZWNvZGVcbiAgICAgICAgLy8gdGhlICdlbmNyJyBzZXJpYWxpemF0aW9uIGZvcm1hdCwgYW5kIHJ1bnMgY3JlYXRlZCBiZWZvcmVcbiAgICAgICAgLy8gYnl0ZS1zdHJlYW0gZnJhbWluZyBzdXBwb3J0IGNhbm5vdCBkZWNvZGUgZnJhbWVkIGJ5dGUgc3RyZWFtcy5cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgIHJlc3VtZUNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlc29sdmUgaG93IHRvIGVuY3J5cHQgdGhlIHBheWxvYWQgZm9yIHRoZSB0YXJnZXQgcnVuIChhIFdSSVRFKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUHJlZmVycmVkIHBhdGg6IHNlYWwgdG8gdGhlIHJ1bidzIHB1Ymxpc2hlZCBYMjU1MTkgcHVibGljIGtleSwgd2hpY2hcbiAgICAgICAgLy8gdGhlIHN0b3JlZCBgcmVzdW1lQ29udGV4dGAgY2FycmllcyBpbmxpbmUuIE9uIHRoZSBmYXN0IHBhdGggdGhpcyBpc1xuICAgICAgICAvLyB0aGUgd2hvbGUgd2luOiBubyBydW4gcmVhZCBBTkQgbm8gYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gLCB3aG9zZVxuICAgICAgICAvLyB+MzUwbXMgYHJ1bi1rZXlgIEFQSSByb3VuZCB0cmlwIGRvbWluYXRlcyBjcm9zcy1kZXBsb3ltZW50IGhvb2tcbiAgICAgICAgLy8gcmVzdW1wdGlvbiBsYXRlbmN5LiAoT24gdGhlIGZhbGxiYWNrIHBhdGggdGhlIGtleSBpcyBzeW50aGVzaXplZFxuICAgICAgICAvLyBmcm9tIHRoZSBmZXRjaGVkIHJ1biwgd2hpY2ggYWxzbyBjYXJyaWVzIGl0LilcbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VhbGluZyBhbHNvIGRyb3BzIHByaXZpbGVnZTogdGhlIHJlc3VtZXIgZW5kcyB1cCBhYmxlIHRvIHdyaXRlIGFcbiAgICAgICAgLy8gcGF5bG9hZCBmb3IgdGhlIHJ1biB3aXRob3V0IGJlaW5nIGFibGUgdG8gcmVhZCBhbnl0aGluZyBvZiB0aGVcbiAgICAgICAgLy8gcnVuJ3MsIHdoZXJlIGZldGNoaW5nIHRoZSBzeW1tZXRyaWMga2V5IGdyYW50cyBib3RoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGdhdGVkIG9uIGBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0c2AgdGhlIHdheVxuICAgICAgICAvLyB0aGUgc3ltbWV0cmljIGZhbGxiYWNrIGJlbG93IGdhdGVzIGBlbmNyYDogcHJlc2VuY2Ugb2YgdGhlIHB1YmxpYyBrZXlcbiAgICAgICAgLy8gaXMgaXRzZWxmIHRoZSBnYXRlLiBBIHJ1biBvbmx5IGNhcnJpZXMgb25lIGlmIHRoZSBydW50aW1lIHRoYXRcbiAgICAgICAgLy8gY3JlYXRlZCBpdCBjb3VsZCBhbHNvIG9wZW4gYSBzZWFsZWQgcGF5bG9hZCwgYW5kIHJ1bnMgYXJlIHBpbm5lZCB0b1xuICAgICAgICAvLyB0aGVpciBjcmVhdGluZyBkZXBsb3ltZW50LCBzbyBwcmVzZW5jZSBpcyBhIG1vcmUgcmVsaWFibGUgYXR0ZXN0YXRpb25cbiAgICAgICAgLy8gdGhhbiBhIHZlcnNpb24gY29tcGFyZSwgYW5kIGl0IHN0YXlzIGNvcnJlY3QgZXZlbiB3aGVuIHBhY2thZ2VcbiAgICAgICAgLy8gdmVyc2lvbnMgZHJpZnQuXG4gICAgICAgIGxldCBwYXlsb2FkS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBydW5QdWJsaWNLZXkgPSBlbmNyeXB0aW9uS2V5T3ZlcnJpZGVcbiAgICAgICAgICA/IC8vIFRoZSBjYWxsZXIgYWxyZWFkeSBob2xkcyBhIGtleSAocmVzdW1lV2ViaG9vayByZXNvbHZlZCBvbmUgdG9cbiAgICAgICAgICAgIC8vIGh5ZHJhdGUgaG9vayBtZXRhZGF0YSksIHNvIHNlYWxpbmcgd291bGQgYWRkIGFuIEVDREggZm9yIG5vXG4gICAgICAgICAgICAvLyBzYXZlZCByb3VuZCB0cmlwLiBSZXVzZSB3aGF0IGl0IHJlc29sdmVkLlxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgOiBkZWNvZGVSdW5QdWJsaWNLZXkocmVzdW1lQ29udGV4dC5lbmNyeXB0aW9uUHVibGljS2V5KTtcblxuICAgICAgICBpZiAocnVuUHVibGljS2V5KSB7XG4gICAgICAgICAgcGF5bG9hZEtleSA9IHNlYWxUbyhydW5QdWJsaWNLZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN5bW1ldHJpYyBgZW5jcmAgd3JpdGUgZmFsbGJhY2s6IG5lZWRzIG9ubHkgdGhlIEFFUyBrZXlcbiAgICAgICAgICAvLyAoYSBiYXJlIENyeXB0b0tleSB2aWEgYHJlc29sdmVIb29rRW5jcnlwdGlvbktleWApLCBub3QgdGhlXG4gICAgICAgICAgLy8gcmVhZC1zaWRlIFJ1blBheWxvYWRLZXlzLlxuICAgICAgICAgIGxldCBlbmNyeXB0aW9uS2V5ID1cbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlPdmVycmlkZSA/P1xuICAgICAgICAgICAgKGF3YWl0IHJlc29sdmVIb29rRW5jcnlwdGlvbktleShob29rLCBpbmZvKSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBheWxvYWRLZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHJlc3Mgb25seSB3aGVuIHRoZSB0YXJnZXQgcnVuIGFuZCBpdHMgZGVwbG95bWVudCBzdXBwb3J0IHRoZVxuICAgICAgICAvLyBjb21wcmVzc2lvbiBmb3JtYXRzIGludHJvZHVjZWQgd2l0aCBzcGVjIHZlcnNpb24gNS5cbiAgICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICAgIChyZXN1bWVDb250ZXh0LnJ1blNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gJiZcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQKTtcblxuICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb25zdCByZWFkYmFja09wczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKGhvb2suc3BlY1ZlcnNpb24pO1xuICAgICAgICBjb25zdCBkZWh5ZHJhdGVkUGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgcGF5bG9hZEtleSxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICk7XG4gICAgICAgIC8vIEEgaG9va19yZWNlaXZlZCBldmVudCBpcyBub3QgZHVyYWJsZSB3aGlsZSBpdHMgcGF5bG9hZCBzdGlsbCBwb2ludHNcbiAgICAgICAgLy8gYXQgc3RyZWFtIHVwbG9hZHMgaW4gZmxpZ2h0LiBGaW5pc2ggdGhvc2UgYmVmb3JlIGNvbW1pdHRpbmcgdGhlXG4gICAgICAgIC8vIGV2ZW50IOKAlCBidXQgT05MWSB0aGUgcHJvZHVjZXItcHVzaCBvcHMgaW4gYG9wc2AuIEEgZGVoeWRyYXRlZFxuICAgICAgICAvLyBXcml0YWJsZVN0cmVhbSBsYW5kcyBpbiBgcmVhZGJhY2tPcHNgIGluc3RlYWQ6IGl0IGlzIGEgc2VydmVyLXN0cmVhbVxuICAgICAgICAvLyBSRUFERVIgdGhhdCByZXNvbHZlcyBvbmx5IG9uY2UgdGhlIHdva2VuIHdvcmtmbG93IHdyaXRlcyBpbnRvIGl0IChhXG4gICAgICAgIC8vIG1hbnVhbCB3ZWJob29rJ3MgYHJlc3BvbnNlV3JpdGFibGVgIGlzIHRoZSBjYW5vbmljYWwgY2FzZSksIHNvXG4gICAgICAgIC8vIGF3YWl0aW5nIGl0IGhlcmUgd291bGQgZGVhZGxvY2sgdGhlIHJlc3VtZSBhZ2FpbnN0IGl0cyBvd24gd2FrZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQSByZWplY3Rpb24gd2l0aCBgdW5kZWZpbmVkYCBpcyBhbiBleHBlY3RlZCBhcnRpZmFjdCBvZiB0aGUgd2ViaG9va1xuICAgICAgICAvLyBidW5kbGUgYW5kIHdhcyBoaXN0b3JpY2FsbHkgaWdub3JlZCBieSB0aGUgYmFja2dyb3VuZCBmbHVzaC4gS2VlcFxuICAgICAgICAvLyB0aGF0IHRvbGVyYW5jZSBub3cgdGhhdCB0aGUgZmx1c2ggaXMgYXdhaXRlZCBpbmxpbmUuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG9wcy5tYXAoKG9wKSA9PlxuICAgICAgICAgICAgb3AuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICAvLyBSZWFkYmFjayBwaXBlcyAobm90YWJseSBhIG1hbnVhbCB3ZWJob29rIHJlc3BvbnNlIHdyaXRhYmxlKSBjYW4gb25seVxuICAgICAgICAvLyBmaW5pc2ggYWZ0ZXIgdGhlIHdvcmtmbG93IHdha2VzIGFuZCB3cml0ZXMgdG8gdGhlbS4gS2VlcCB0aGVtIGFsaXZlLFxuICAgICAgICAvLyBidXQgbmV2ZXIgcGxhY2UgdGhlbSBpbiB0aGUgZHVyYWJpbGl0eSBiYXJyaWVyIGFib3ZlLlxuICAgICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKHJlYWRiYWNrT3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCByZWFkYmFjayBvZiBob29rIHBheWxvYWQgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGluayB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHN0b3JlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgIC8vIChza2lwcGVkIHdoZW4gYWJzZW50IG9yIGludmFsaWQpLiBSZXNvbHZlZCBiZWZvcmUgZGlzcGF0Y2ggc28gdGhlXG4gICAgICAgIC8vIHdyaXRlIGFuZCB0aGUgd2FrZSBib3RoIHNpdCB1bmRlciBhIHNwYW4gdGhhdCBjYXJyaWVzIGl0LlxuICAgICAgICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyKTtcbiAgICAgICAgaWYgKG9yaWdpbkxpbmspIHtcbiAgICAgICAgICBzcGFuPy5hZGRMaW5rPy4ob3JpZ2luTGluayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZU5hbWUgPSBnZXRXb3JrZmxvd1F1ZXVlTmFtZShyZXN1bWVDb250ZXh0LndvcmtmbG93TmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXVlT3B0aW9ucyA9IHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiByZXN1bWVDb250ZXh0LnJ1blNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGhlIGRpc3BhdGNoIGlzIHN0cmljdGx5IHNlcmlhbDogdGhlIGhvb2tfcmVjZWl2ZWQgZXZlbnQgaXMgbWFkZVxuICAgICAgICAvLyBkdXJhYmxlIEZJUlNULCBhbmQgdGhlIHdvcmtmbG93IHdha2UgaXMgcHVibGlzaGVkIG9ubHkgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIHdyaXRlIGlzIGFja25vd2xlZGdlZC4gVGhpcyBpcyB3aGF0IGxldHMgYHJlc3VtZUhvb2soKWAgcmVzb2x2aW5nXG4gICAgICAgIC8vIG1lYW4gXCJ0aGUgcmVzdW1lIHN1cnZpdmVzIGFueXRoaW5nIHRoYXQgaGFwcGVucyBuZXh0XCIg4oCUIGEgZGlzcG9zYWxcbiAgICAgICAgLy8gb3IgcnVuIGNvbXBsZXRpb24gcmFjaW5nIHRoZSBxdWV1ZSBkZWxpdmVyeSBjYW5ub3QgZXJhc2UgYSBjb21taXR0ZWRcbiAgICAgICAgLy8gZXZlbnQsIGFuZCB0aGUgd2FrZSBpdHNlbGYgY2FycmllcyBubyBwYXlsb2FkLCBzbyBub3RoaW5nIHJpZGVzIG9uXG4gICAgICAgIC8vIHRoZSBtZXNzYWdlIGJ1dCB0aGUgdHJpZ2dlci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQmFja2VuZCBkZWR1cCBpcyBhdHRlc3RlZCB3aGVuIEVJVEhFUiB0aGUgbGl2ZSBzZXJ2ZXIgYXR0ZXN0cyBpdFxuICAgICAgICAvLyBmcmVzaCBvbiB0aGlzIGJ5LXRva2VuIGhvb2sgKHdvcmxkLXZlcmNlbDogcmVzcG9uc2Utb25seSwgcmVjb21wdXRlZFxuICAgICAgICAvLyBldmVyeSByZWFkLCBzbyByb2xsYmFjay9raWxsLXN3aXRjaCB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseSkgT1IgdGhlXG4gICAgICAgIC8vIHN0YXRpYyB3b3JsZCBjYXBhYmlsaXR5IGlzIHNldCAod29ybGQtbG9jYWw6IGFkYXB0ZXIgKyBiYWNrZW5kIHNoaXBcbiAgICAgICAgLy8gdG9nZXRoZXIpLiBXaGVuIGF0dGVzdGVkLCB0aGUgd3JpdGUgY2FycmllcyBhIHBlci1jYWxsIHJlc3VtZUlkICtcbiAgICAgICAgLy8gcGF5bG9hZCBkaWdlc3Qgc28gdHJhbnNwb3J0LWxldmVsIHJldHJpZXMgb2YgdGhlIFNBTUUgd3JpdGUgY29udmVyZ2VcbiAgICAgICAgLy8gb24gZXhhY3RseSBvbmUgY29tbWl0dGVkIGV2ZW50IHZpYSB0aGUgYmFja2VuZCdzIChydW5JZCwgcmVzdW1lSWQpXG4gICAgICAgIC8vIGNvbnN0cmFpbnQuIFdpdGhvdXQgaXQgdGhlIHdyaXRlIGlzIGEgcGxhaW4gc2luZ2xlLXNob3QgY3JlYXRlLFxuICAgICAgICAvLyBleGFjdGx5IGFzIGJlZm9yZSBkZWR1cCBleGlzdGVkLlxuICAgICAgICBjb25zdCBiYWNrZW5kRGVkdXBTdXBwb3J0ZWQgPVxuICAgICAgICAgIChob29rUmVzdW1lQ2FwYWJpbGl0aWVzQXJlRnJlc2hcbiAgICAgICAgICAgID8gKGhvb2sucmVzdW1lQ2FwYWJpbGl0aWVzPy5ob29rUmVzdW1lRGVkdXBWZXJzaW9uID8/IDApXG4gICAgICAgICAgICA6IDApID49IEhPT0tfUkVTVU1FX0RFRFVQX1ZFUlNJT04gfHxcbiAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXM/Lmhvb2tSZXN1bWVEZWR1cCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY2FuQ2xhaW1SZXN1bWUgPVxuICAgICAgICAgIGJhY2tlbmREZWR1cFN1cHBvcnRlZCAmJlxuICAgICAgICAgICF2MUNvbXBhdCAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfc3RyYXRlZ3knOiAnc2VxdWVudGlhbCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VtZUlkID0gY2FuQ2xhaW1SZXN1bWUgPyBnZW5lcmF0ZVJlc3VtZUlkKCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBheWxvYWREaWdlc3QgPSBjYW5DbGFpbVJlc3VtZVxuICAgICAgICAgID8gYXdhaXQgY29tcHV0ZVJlc3VtZVBheWxvYWREaWdlc3QoZGVoeWRyYXRlZFBheWxvYWQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZXN1bWVJZCkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoeyAnd29ya2Zsb3cuaG9vay5yZXN1bWVfaWQnOiByZXN1bWVJZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWtleSBhbnkgXCJob29rIGNhbiBubyBsb25nZXIgYmUgcmVjZWl2ZWRcIiByZWplY3Rpb24gdG9cbiAgICAgICAgLy8gSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbikgc28gYC50b2tlbmAgbWF0Y2hlcyB0aGUgaGlzdG9yaWNhbFxuICAgICAgICAvLyBjb250cmFjdC4gVGhlIHNwZWNpZmljIGVycm9yIGRlcGVuZHMgb24gdGhlIFdvcmxkOlxuICAgICAgICAvLyAgIC0gYSBnZW51aW5lbHkgbWlzc2luZyBob29rIG1hcHMgdG8gSG9va05vdEZvdW5kRXJyb3IgKGtleWVkIG9uXG4gICAgICAgIC8vICAgICB0aGUgZXZlbnQgY29ycmVsYXRpb25JZCAvIGhvb2sgSUQpO1xuICAgICAgICAvLyAgIC0gYSB0ZXJtaW5hbCBydW4gb24gVmVyY2VsIHJlamVjdHMgaG9va19yZWNlaXZlZCB3aXRoIDQwNCwgd2hpY2hcbiAgICAgICAgLy8gICAgIHdvcmxkLXZlcmNlbCBtYXBzIHRvIEhvb2tOb3RGb3VuZEVycm9yO1xuICAgICAgICAvLyAgIC0gYSB0ZXJtaW5hbCBydW4gb24gd29ybGQtbG9jYWwgLyB3b3JsZC1wb3N0Z3JlcyByZWplY3RzIHdpdGhcbiAgICAgICAgLy8gICAgIFJ1bkV4cGlyZWRFcnJvci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQW4gRW50aXR5Q29uZmxpY3RFcnJvciAoSFRUUCA0MDkpIGlzIGRlbGliZXJhdGVseSBOT1QgcmUta2V5ZWQsXG4gICAgICAgIC8vIGJyZWFraW5nIHdpdGggdGhlIGhpc3RvcmljYWwgbWFwcGluZzogZXZlcnkgNDA5IHRoZSBiYWNrZW5kIGVtaXRzXG4gICAgICAgIC8vIG9uIHRoaXMgd3JpdGUgdG9kYXkgaXMgVFJBTlNJRU5UIOKAlCBhIHNsb3QgY29uZmxpY3QgdGhhdCBlc2NhcGVkIHRoZVxuICAgICAgICAvLyBzZXJ2ZXIncyBvd24gcmV0cnkgYnVkZ2V0IHVuZGVyIGNvbnRlbnRpb24sIG9yIGEgcmVzdW1lLWNsYWltIHJhY2VcbiAgICAgICAgLy8gbWlkLXJlc29sdXRpb24g4oCUIGFuZCBpdHMgdHJhbnNhY3Rpb24gY29tbWl0dGVkIG5vdGhpbmcuIFJlLWtleWluZ1xuICAgICAgICAvLyBpdCB0byBIb29rTm90Rm91bmRFcnJvciB0b2xkIHRoZSBjYWxsZXIgKGFuZCBhIHdlYmhvb2sgc2VuZGVyLCB2aWFcbiAgICAgICAgLy8gNDA0KSB0aGF0IGEgcmV0cnlhYmxlIGZhaWx1cmUgd2FzIHBlcm1hbmVudCwgc2lsZW50bHkgZHJvcHBpbmcgdGhlXG4gICAgICAgIC8vIHJlc3VtZS4gSXQgbm93IHN1cmZhY2VzIGFzLWlzOiByZXRyeWFibGUsIHdpdGggbm90aGluZyBjb21taXR0ZWQuXG4gICAgICAgIC8vIChBIDQyMiByZXN1bWVJZC1yZXVzZSBlcnJvciBsaWtld2lzZSBwYXNzZXMgdGhyb3VnaCB1bm1hcHBlZCDigJQgaXRcbiAgICAgICAgLy8gbWVhbnMgdGhlIGNhbGxlciByZXBsYXllZCBhIHJlc3VtZUlkIHdpdGggYSBkaWZmZXJlbnQgcGF5bG9hZCwgYW5kXG4gICAgICAgIC8vIGhpZGluZyB0aGF0IGJlaGluZCBcIm5vdCBmb3VuZFwiIHdvdWxkIG1hc2sgdGhlIGJ1Zy4pXG4gICAgICAgIGNvbnN0IGlzSG9va0dvbmVFcnJvciA9IChlcnI6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgICAgICAgSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIC4uLih2MUNvbXBhdCA/IHt9IDogeyB0b2tlbjogaG9vay50b2tlbiB9KSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBkZWh5ZHJhdGVkUGF5bG9hZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHYxQ29tcGF0LFxuICAgICAgICAgICAgICAuLi4ocmVzdW1lSWQgJiYgcGF5bG9hZERpZ2VzdFxuICAgICAgICAgICAgICAgID8geyByZXN1bWVJZCwgcmVzdW1lUGF5bG9hZERpZ2VzdDogcGF5bG9hZERpZ2VzdCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGlzSG9va0dvbmVFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB3cml0ZSByZXNvbHZlcyAoZW50cnktdGltZSBhdHRyaWJ1dGVzIGNhbm5vdCB0ZWxsXG4gICAgICAgIC8vIGFuIGF0dGVtcHRlZCByZXN1bWUgZnJvbSBhIGNvbW1pdHRlZCBvbmUpOiB0b2dldGhlciB3aXRoXG4gICAgICAgIC8vIEhvb2tXYWtlUHVibGlzaGVkIGJlbG93LCB0aGlzIGlzIHdoYXQgbWFrZXMgYSBzdHJhbmRlZCByZXN1bWUg4oCUIGFcbiAgICAgICAgLy8gY29tbWl0dGVkIGV2ZW50IHdob3NlIHdha2UgbmV2ZXIgd2VudCBvdXQgb3Igd2FzIG5ldmVyIGRlbGl2ZXJlZCDigJRcbiAgICAgICAgLy8gcXVlcnlhYmxlIGZyb20gdHJhY2VzLiBTZWUgdGhlIGFsZXJ0aW5nIG5vdGUgb24gSG9va1dha2VQdWJsaXNoZWQuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLkhvb2tSZXN1bWVDb21taXR0ZWQodHJ1ZSkpO1xuXG4gICAgICAgIC8vIFQxIG9mIHRoZSBUVFIgd2luZG93LiBTdGFtcGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcHVibGlzaCBzb1xuICAgICAgICAvLyBgcHJvZHVjZXJfcHJlcGAgY292ZXJzIGV4YWN0bHkgdGhlIHdvcmsgYWJvdmUgaXQgKGhvb2sgbG9va3VwLCBrZXlcbiAgICAgICAgLy8gcmVzb2x1dGlvbiwgc2VyaWFsaXphdGlvbiwgYW5kIHRoZSBhd2FpdGVkIGhvb2tfcmVjZWl2ZWQgd3JpdGUsXG4gICAgICAgIC8vIHdoaWNoIGlzIGdlbnVpbmVseSBzZXJpYWwgaGVyZSkuXG4gICAgICAgIGNvbnN0IHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBwdWJsaXNoSG9va1dha2VXaXRoUmV0cnkoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBob29rUmVzdW1lVGltaW5nOiB7XG4gICAgICAgICAgICAgICAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgICAgICAgICAgICAgICAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiAnc2VxdWVudGlhbCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucXVldWVPcHRpb25zLFxuICAgICAgICAgICAgICAgIC8vIERlZHVwIHJldHJpZWQgcHVibGlzaGVzIHdob3NlIHJlc3BvbnNlIHdhcyBsb3N0OiBhXG4gICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdha2UgaXMgaGFybWxlc3MgZm9yIGNvcnJlY3RuZXNzIChkZXRlcm1pbmlzdGljXG4gICAgICAgICAgICAgICAgLy8gcmVwbGF5KSBidXQgY29zdHMgYSBmdWxsIHJlcGxheSBvZiB0aGUgcnVuLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgLy8gYWNjZXB0cyBhIHJlcGVhdGVkIGlkZW1wb3RlbmN5IGtleSBieSBkZWxpdmVyaW5nIG9ubHkgb25lXG4gICAgICAgICAgICAgICAgLy8gb2YgdGhlIG1lc3NhZ2VzLiBDbGFpbS1sZXNzIHdyaXRlcyBoYXZlIG5vIHJlc3VtZUlkIGFuZFxuICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgIC4uLihyZXN1bWVJZCA/IHsgaWRlbXBvdGVuY3lLZXk6IGBob29rLSR7cmVzdW1lSWR9YCB9IDoge30pLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I/LmJpbmQod29ybGQpXG4gICAgICAgICk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLkhvb2tXYWtlUHVibGlzaGVkKHRydWUpKTtcblxuICAgICAgICByZXR1cm4gaG9vayBzYXRpc2ZpZXMgUmVzdW1lZEhvb2s7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihcbiAgICAgICAgICAgIHR5cGVvZiB0b2tlbk9ySG9vayA9PT0gJ3N0cmluZycgPyB0b2tlbk9ySG9vayA6IHRva2VuT3JIb29rLnRva2VuXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0ZvdW5kKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzdW1lcyBhIHdlYmhvb2sgYnkgc2VuZGluZyBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdCB8IFJlcXVlc3R9XG4gKiBvYmplY3QgdG8gYSBob29rIGlkZW50aWZpZWQgYnkgaXRzIHRva2VuLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV4dGVybmFsbHkgKGUuZy4sIGZyb20gYW4gQVBJIHJvdXRlIG9yIHNlcnZlciBhY3Rpb24pXG4gKiB0byBzZW5kIGEgcmVxdWVzdCB0byBhIHdlYmhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9va1xuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBob29rXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzcG9uc2VcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAqICAgY29uc3QgdG9rZW4gPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndG9rZW4nKTtcbiAqXG4gKiAgIGlmICghdG9rZW4pIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAqICAgfVxuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3VtZVdlYmhvb2sodG9rZW4sIHJlcXVlc3QpO1xuICogICAgIHJldHVybiByZXNwb25zZTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdXZWJob29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lV2ViaG9vayhcbiAgdG9rZW46IHN0cmluZyxcbiAgcmVxdWVzdDogUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAvLyBUMCBvZiB0aGUgaG9vay1yZXN1bWUgVFRSIHdpbmRvdy4gRXZlcnl0aGluZyBiZWxvdyAodGhlIGJ5LXRva2VuIGxvb2t1cCxcbiAgLy8gdGhlIHJ1bi1rZXkgcmVzb2x1dGlvbiBpdCBtYXkgdHJpZ2dlciwgYW5kIHRoZSBgcmVzcG9uZFdpdGhgIHNldHVwKSBpc1xuICAvLyByZWFsIHByb2R1Y2VyLXNpZGUgbGF0ZW5jeSBvbiB0aGlzIHBhdGgsIHNvIHRoZSB3aW5kb3cgaGFzIHRvIG9wZW4gaGVyZVxuICAvLyBhbmQgbm90IGluc2lkZSBgcmVzdW1lSG9va0ltcGxgOyBvdGhlcndpc2Ugd2ViaG9vayByZXN1bWVzIHdvdWxkIHJlcG9ydCBhXG4gIC8vIHN5c3RlbWF0aWNhbGx5IHNob3J0ZXIgdG90YWwgdGhhbiBgcmVzdW1lSG9va2Agb25lcyBpbnRvIHRoZSBzYW1lIG1ldHJpYy5cbiAgY29uc3QgcmVzdW1lUmVxdWVzdGVkQXRNcyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHsgaG9vaywgZW5jcnlwdGlvbktleSB9ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuKTtcblxuICAvLyBPbmx5IHdlYmhvb2tzIGNhbiBiZSByZXN1bWVkIHZpYSB0aGUgcHVibGljIGVuZHBvaW50LlxuICAvLyBJZiB0aGUgaG9vayB3YXMgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpIChpc1dlYmhvb2sgIT09IHRydWUpLFxuICAvLyB0aHJvdyB0aGUgc2FtZSBcIm5vdCBmb3VuZFwiIGVycm9yIHRoZSB3b3JsZCB3b3VsZCB0aHJvdyBmb3IgYSBtaXNzaW5nXG4gIC8vIHRva2VuLiBUaGlzIHByZXZlbnRzIGxlYWtpbmcgdGhhdCB0aGUgdG9rZW4gaXMgdmFsaWQuXG4gIGlmIChob29rLmlzV2ViaG9vayA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IodG9rZW4pO1xuICB9XG5cbiAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtPFJlc3BvbnNlPiB8IHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgIGhvb2subWV0YWRhdGEgJiZcbiAgICB0eXBlb2YgaG9vay5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAncmVzcG9uZFdpdGgnIGluIGhvb2subWV0YWRhdGFcbiAgKSB7XG4gICAgaWYgKGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGggPT09ICdtYW51YWwnKSB7XG4gICAgICBjb25zdCB7IHJlYWRhYmxlLCB3cml0YWJsZSB9ID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxSZXNwb25zZSwgUmVzcG9uc2U+KCk7XG4gICAgICByZXNwb25zZVJlYWRhYmxlID0gcmVhZGFibGU7XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGluc3RhbmNlIGluY2x1ZGVzIHRoZSB3cml0YWJsZSBzdHJlYW0gd2hpY2ggd2lsbCBiZSB1c2VkXG4gICAgICAvLyB0byB3cml0ZSB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgcnVuXG4gICAgICAocmVxdWVzdCBhcyBhbnkpW1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEVdID0gd3JpdGFibGU7XG4gICAgfSBlbHNlIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIHJlc3BvbnNlID0gaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgSW52YWxpZCBcXGByZXNwb25kV2l0aFxcYCB2YWx1ZTogJHtob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRofWAsXG4gICAgICAgIHsgc2x1ZzogRVJST1JfU0xVR1MuV0VCSE9PS19JTlZBTElEX1JFU1BPTkRfV0lUSF9WQUxVRSB9XG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBObyBgcmVzcG9uZFdpdGhgIHZhbHVlIGltcGxpZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgcmV0dXJuaW5nIGEgMjAyXG4gICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDIwMiB9KTtcbiAgfVxuXG4gIC8vIGBob29rYCB3YXMganVzdCBmZXRjaGVkIHZpYSBgZ2V0SG9va0J5VG9rZW5XaXRoS2V5YCAoYSBmcmVzaCBieS10b2tlblxuICAvLyBsb29rdXApIGFib3ZlLCBzbyBpdHMgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYCByZWZsZWN0cyB0aGUgbGl2ZVxuICAvLyBiYWNrZW5kLiBDYWxsIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBmcmVzaCBhdHRlc3RhdGlvbiBzb1xuICAvLyB0aGUgd3JpdGUncyBpZGVtcG90ZW5jeSBjbGFpbSBzdGF5cyBhdmFpbGFibGUgd2l0aG91dCBhIHNlY29uZCBHRVQuIChUaGVcbiAgLy8gcHVibGljIGByZXN1bWVIb29rYCBuZXZlciBzZXRzIHRoaXMsIHNvIGEgY2FsbGVyIGNhbm5vdCBmb3JnZSBpdC4pXG4gIGF3YWl0IHJlc3VtZUhvb2tJbXBsKGhvb2ssIHJlcXVlc3QsIGVuY3J5cHRpb25LZXksIHRydWUsIHJlc3VtZVJlcXVlc3RlZEF0TXMpO1xuXG4gIGlmIChyZXNwb25zZVJlYWRhYmxlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlYWRhYmxlIHN0cmVhbSB0byBlbWl0IG9uZSBjaHVuayxcbiAgICAvLyB3aGljaCBpcyB0aGUgYFJlc3BvbnNlYCBvYmplY3RcbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZVJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsudmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gY2h1bmsudmFsdWU7XG4gICAgfVxuICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dvcmtmbG93IHJ1biBkaWQgbm90IHNlbmQgYSByZXNwb25zZScsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG4iXX0=
|
|
665
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2Ysb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHlCQUF5QixFQUV6QixtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsaUNBQWlDLEdBSWxDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxF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LElBQUksRUFDSixPQUFPLEVBQ1AscUJBQXFCLEVBQUUsRUFDdkIsSUFBSSxFQUNKLG1CQUFtQixDQUNwQixDQUFDO0lBRUYsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGtEQUFrRDtRQUNsRCxpQ0FBaUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFO1lBQ3JFLElBQUksRUFBRSxXQUFXLENBQUMseUJBQXlCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRVJST1JfU0xVR1MsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0RFRFVQX1ZFUlNJT04sXG4gIHR5cGUgSG9va1Jlc3VtZUNvbnRleHQsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgSG9vayBhcyBXb3JsZEhvb2ssXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGRlY29kZVJ1blB1YmxpY0tleSB9IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHsgZGVyaXZlUnVuUGF5bG9hZEtleXMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBsaW5rVG9UcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG4vKiogTW9ub3RvbmljIFVMSUQgZmFjdG9yeSBmb3IgcGVyLWNhbGwgcmVzdW1lIGlkZW1wb3RlbmN5IGtleXMuICovXG5jb25zdCBnZW5lcmF0ZVJlc3VtZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIEhleCBTSEEtMjU2IG9mIHRoZSBzZXJpYWxpemVkIHJlc3VtZSBwYXlsb2FkIGJ5dGVzLiBDb21wdXRlZCBvbmNlIGJ5IHRoZVxuICogcHJvZHVjZXIgYW5kIHNlbnQgd2l0aCBpdHMgZHVyYWJsZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgc28gdHJhbnNwb3J0IGFuZFxuICogc2xvdCByZXRyaWVzIGNvbnZlcmdlIHRocm91Z2ggdGhlIHNlcnZlcidzIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uc3RyYWludC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVJlc3VtZVBheWxvYWREaWdlc3QoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWdlc3QgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ5dGVzKTtcbiAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGRpZ2VzdCk7XG4gIGxldCBoZXggPSAnJztcbiAgZm9yIChjb25zdCBiIG9mIHZpZXcpIHtcbiAgICBoZXggKz0gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuICByZXR1cm4gaGV4O1xufVxuXG5jb25zdCBIT09LX1dBS0VfUkVUUllfREVMQVlTX01TID0gWzI1LCAxMDBdIGFzIGNvbnN0O1xuXG4vKipcbiAqIEEgd2FrZSBmYWlsdXJlIHdvcnRoIHJldHJ5aW5nIGlzIHRyYW5zcG9ydC1zaGFwZWQgKG5ldHdvcmsgZXJyb3IsIDV4eCxcbiAqIHRocm90dGxlKS4gQSBkZWZpbml0aXZlIHJlamVjdGlvbiB3aWxsIG5vdCBjaGFuZ2Ugb24gYSAyNW1zIHJldHJ5LCBzb1xuICogc3BlbmRpbmcgdGhlIGJ1ZGdldCBvbiBpdCBvbmx5IGRlbGF5cyB0aGUgY2FsbGVyJ3MgZXJyb3IuXG4gKlxuICogYEB2ZXJjZWwvcXVldWVgIGVycm9ycyBjYXJyeSBubyBgc3RhdHVzYCBmaWVsZCDigJQgdGhleSBhcmUgYmFyZSBgRXJyb3JgXG4gKiBzdWJjbGFzc2VzIGRpc3Rpbmd1aXNoZWQgYnkgYG5hbWVgIOKAlCBzbyBjbGFzc2lmaWNhdGlvbiBjaGVja3MgdGhlIFdvcmxkJ3NcbiAqIGRlcGxveW1lbnQtdW5hdmFpbGFibGUgaG9vayBmaXJzdCAoYSBkZXBsb3ltZW50IHRoZSBxdWV1ZSBjYW5ub3QgZGlzY292ZXJcbiAqIHdpbGwgbm90IGNvbWUgYmFjayB3aXRoaW4gdGhpcyBmdW5jdGlvbidzIH4xMjVtcyBidWRnZXQpLCB0aGVuIGEgbnVtZXJpY1xuICogc3RhdHVzIHdoZW4gb25lIGV4aXN0cyAobm9uLVZlcmNlbCBxdWV1ZSBpbXBsZW1lbnRhdGlvbnMpLCB0aGVuIHRoZSBxdWV1ZVxuICogY2xpZW50J3MgZGVmaW5pdGl2ZS00eHggZXJyb3IgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGlzUmV0cnlhYmxlV2FrZUVycm9yKFxuICBlcnJvcjogdW5rbm93bixcbiAgaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGlmIChpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yPy4oZXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1cz86IHVua25vd247IHN0YXR1c0NvZGU/OiB1bmtub3duIH0pID8/IHt9O1xuICBjb25zdCBjb2RlID0gc3RhdHVzLnN0YXR1cyA/PyBzdGF0dXMuc3RhdHVzQ29kZTtcbiAgaWYgKHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBjb2RlID49IDUwMCB8fCBjb2RlID09PSA0MDggfHwgY29kZSA9PT0gNDI5O1xuICB9XG4gIGNvbnN0IG5hbWUgPSAoZXJyb3IgYXMgRXJyb3IgfCBudWxsKT8ubmFtZTtcbiAgcmV0dXJuIChcbiAgICBuYW1lICE9PSAnQmFkUmVxdWVzdEVycm9yJyAmJlxuICAgIG5hbWUgIT09ICdVbmF1dGhvcml6ZWRFcnJvcicgJiZcbiAgICBuYW1lICE9PSAnRm9yYmlkZGVuRXJyb3InXG4gICk7XG59XG5cbi8vIEEgcHVibGlzaCBtYXkgc3VjY2VlZCBldmVuIHdoZW4gaXRzIHJlc3BvbnNlIGlzIGxvc3QsIHNvIGEgcmV0cnkgY2FuXG4vLyBlbnF1ZXVlIGEgZHVwbGljYXRlIHdha2UuIFRoYXQgaXMgaGFybWxlc3M6IHRoZSBldmVudCBpcyBhbHJlYWR5IGR1cmFibGUsXG4vLyBhbmQgZGV0ZXJtaW5pc3RpYyByZXBsYXkgbWFrZXMgYSBzZWNvbmQgZGVsaXZlcnkgb2YgdGhlIHNhbWUgcnVuIGEgbm8tb3AuXG5hc3luYyBmdW5jdGlvbiBwdWJsaXNoSG9va1dha2VXaXRoUmV0cnkoXG4gIHB1Ymxpc2g6ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuICBmb3IgKFxuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICBhdHRlbXB0IDw9IEhPT0tfV0FLRV9SRVRSWV9ERUxBWVNfTVMubGVuZ3RoO1xuICAgIGF0dGVtcHQrK1xuICApIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcHVibGlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgIGlmICghaXNSZXRyeWFibGVXYWtlRXJyb3IoZXJyb3IsIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3IpKSBicmVhaztcbiAgICAgIGNvbnN0IGRlbGF5TXMgPSBIT09LX1dBS0VfUkVUUllfREVMQVlTX01TW2F0dGVtcHRdO1xuICAgICAgaWYgKGRlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHdha2Ugb25seSBydW5zIGFmdGVyIHRoZSBob29rX3JlY2VpdmVkIHdyaXRlIGNvbW1pdHRlZCwgc28gYSB3YWtlXG4gIC8vIGZhaWx1cmUgaGVyZSBpcyBuZWNlc3NhcmlseSBcImR1cmFibGUgYnV0IG5vdCB5ZXQgZGlzcGF0Y2hlZFwiOiB0aGUgZXZlbnRcbiAgLy8gc3Vydml2ZXMsIGFuZCBhbnkgbGF0ZXIgd2FrZSBvZiB0aGUgcnVuIGRlbGl2ZXJzIGl0LiBEbyBub3QgbGV0IGEgcXVldWVcbiAgLy8gaW1wbGVtZW50YXRpb24gcmV1c2UgSG9va05vdEZvdW5kRXJyb3IgYW5kIGFjY2lkZW50YWxseSBpbXBseSB0aGF0IG5vXG4gIC8vIGhvb2tfcmVjZWl2ZWQgZXhpc3RzLlxuICBpZiAoSG9va05vdEZvdW5kRXJyb3IuaXMobGFzdEVycm9yKSkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICdUaGUgaG9vayByZXN1bWUgd2FzIGNvbW1pdHRlZCwgYnV0IGl0cyB3b3JrZmxvdyB3YWtlIGNvdWxkIG5vdCBiZSBwdWJsaXNoZWQnLFxuICAgICAgeyBjYXVzZTogbGFzdEVycm9yIH1cbiAgICApO1xuICB9XG4gIHRocm93IGxhc3RFcnJvcjtcbn1cblxuLyoqXG4gKiBBIGhvb2sgcmVjb3JkIHdpdGggaXRzIHNlcmlhbGl6ZWQgYG1ldGFkYXRhYCBvbWl0dGVkOiBldmVyeXRoaW5nIGEgcmVzdW1lXG4gKiBhY3R1YWxseSByZWFkcy4gUmVzdW1pbmcgbmV2ZXIgbG9va3MgYXQgbWV0YWRhdGEsIHNvIHRoZSByZXN1bWUgcGF0aCBhY2NlcHRzXG4gKiBib3RoIGEgcmF3IHtAbGluayBXb3JsZEhvb2t9IHN0cmFpZ2h0IG91dCBvZiBhIFdvcmxkIGFuZCBhIHtAbGluayBIb29rfVxuICogd2hvc2UgYG1ldGFkYXRhYCBpcyBhIFByb21pc2UuXG4gKi9cbnR5cGUgUmVzdW1hYmxlSG9vayA9IE9taXQ8V29ybGRIb29rLCAnbWV0YWRhdGEnPjtcblxuLyoqXG4gKiBBIGhvb2sgYXMgcmV0dXJuZWQgYnkge0BsaW5rIGdldEhvb2tCeVRva2VufSBhbmQge0BsaW5rIHJlc3VtZUhvb2t9OiB0aGVcbiAqIFdvcmxkJ3Mge0BsaW5rIFdvcmxkSG9va30gcmVjb3JkIHdpdGggaXRzIHVzZXItZGVmaW5lZCBgbWV0YWRhdGFgIGh5ZHJhdGVkXG4gKiBsYXppbHkuXG4gKlxuICogYG1ldGFkYXRhYCBpcyBhIGdldHRlciB0aGF0IHJldHVybnMgYSBQcm9taXNlIOKAlCB0aGUgc2FtZSBzaGFwZSBhc1xuICogYFJ1bi5yZXR1cm5WYWx1ZWAg4oCUIHNvIGxvb2tpbmcgYSBob29rIHVwIGJ5IHRva2VuIGNvc3RzIGV4YWN0bHkgb25lIHJlYWQuXG4gKiBIeWRyYXRpbmcgbWV0YWRhdGEgaXMgYSBkZWNyeXB0aW5nIFJFQUQgdGhhdCBuZWVkcyB0aGUgb3duaW5nIHJ1bidzIHBheWxvYWRcbiAqIGtleXMsIGFuZCByZXNvbHZpbmcgdGhvc2UgY2FuIGNvc3QgYSBydW4gZmV0Y2ggcGx1cyBhIGBydW4ta2V5YCBBUEkgcm91bmRcbiAqIHRyaXAgKH4zNTBtcykuIERlZmVycmluZyB0aGF0IHRvIGZpcnN0IGFjY2VzcyBrZWVwcyB0aGUgbG9va3VwIGZhc3QgZm9yIHRoZVxuICogbWFueSBjYWxsZXJzIHRoYXQgb25seSBuZWVkIGBydW5JZGAvYHRva2VuYCDigJQgbW9zdCBpbXBvcnRhbnRseSBob29rXG4gKiByZXN1bXB0aW9uLCB3aGljaCBuZXZlciByZWFkcyBtZXRhZGF0YSBhdCBhbGwuXG4gKlxuICogVGhlIHByb21pc2UgaXMgbWVtb2l6ZWQ6IGh5ZHJhdGlvbiAoYW5kIHRoZSBrZXkgcmVzb2x1dGlvbiBiZWhpbmQgaXQpIHJ1bnMgYXRcbiAqIG1vc3Qgb25jZSBwZXIgaG9vayBvYmplY3QuIEF3YWl0aW5nIGl0IG9uIGEgaG9vayB0aGF0IHN0b3JlZCBubyBtZXRhZGF0YVxuICogcmVzb2x2ZXMgYHVuZGVmaW5lZGAgYW5kIHBlcmZvcm1zIG5vIEkvTy5cbiAqXG4gKiBMaWtlIGBSdW4ucmV0dXJuVmFsdWVgLCB0aGUgYWNjZXNzb3IgaXMgbm9uLWVudW1lcmFibGUsIHNvIGl0IGlzIGFic2VudCBmcm9tXG4gKiBgeyAuLi5ob29rIH1gIGFuZCBgSlNPTi5zdHJpbmdpZnkoaG9vaylgIOKAlCByZWFkIGl0IGV4cGxpY2l0bHkgYW5kIGluY2x1ZGUgdGhlXG4gKiBhd2FpdGVkIHZhbHVlIGlmIHlvdSBuZWVkIHRvIGZvcndhcmQgaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaG9vayA9IGF3YWl0IGdldEhvb2tCeVRva2VuKHRva2VuKTtcbiAqIGNvbnNvbGUubG9nKGhvb2sucnVuSWQpOyAvLyBubyBtZXRhZGF0YSB3b3JrXG4gKiBjb25zdCBtZXRhZGF0YSA9IChhd2FpdCBob29rLm1ldGFkYXRhKSBhcyB7IGFsbG93ZWRVc2VySWQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvb2sgZXh0ZW5kcyBSZXN1bWFibGVIb29rIHtcbiAgLyoqXG4gICAqIFRoZSBob29rJ3MgdXNlci1kZWZpbmVkIG1ldGFkYXRhLCBoeWRyYXRlZCBvbiBmaXJzdCBhY2Nlc3MgYW5kIG1lbW9pemVkLlxuICAgKiBSZXNvbHZlcyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBob29rIGNhcnJpZXMgbm8gbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBBIGJ5LXRva2VuIGhvb2sgbG9va3VwOiB0aGUgaG9vayBpdHNlbGYgcGx1cyBhY2Nlc3MgdG8gdGhlIHBheWxvYWQga2V5cyB0aGF0XG4gKiBoeWRyYXRpbmcgaXRzIGBtZXRhZGF0YWAgcmVzb2x2ZWQsIGlmIGFueXRoaW5nIGV2ZXIgYXdhaXRlZCBpdC5cbiAqL1xuaW50ZXJmYWNlIEhvb2tMb29rdXAge1xuICBob29rOiBIb29rO1xuICAvKipcbiAgICogVGhlIHJlYWQtc2lkZSBwYXlsb2FkIGtleXMgcmVzb2x2ZWQgd2hpbGUgaHlkcmF0aW5nIGBtZXRhZGF0YWAsIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gYG1ldGFkYXRhYCB3YXMgbmV2ZXIgYXdhaXRlZCwgdGhlIGhvb2sgc3RvcmVkIG5vbmUsIG9yIHRoZVxuICAgKiBydW4gaGFzIG5vIGtleSAoZW5jcnlwdGlvbiBkaXNhYmxlZCkuIExldHMgYHJlc3VtZVdlYmhvb2tgIOKAlCB0aGUgb25lIGNhbGxlclxuICAgKiB0aGF0IG11c3QgcmVhZCBtZXRhZGF0YSDigJQgcmV1c2UgdGhhdCBrZXkgZm9yIHRoZSBwYXlsb2FkIFdSSVRFIGluc3RlYWQgb2ZcbiAgICogcGF5aW5nIGEgc2Vjb25kIGBydW4ta2V5YCByb3VuZCB0cmlwLiBPbmx5IG1lYW5pbmdmdWwgYWZ0ZXIgYXdhaXRpbmdcbiAgICogYGhvb2subWV0YWRhdGFgLlxuICAgKi9cbiAgbWV0YWRhdGFFbmNyeXB0aW9uS2V5KCk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBjb250ZXh0IGZvciBhIGhvb2sgcGx1cyB3aGVyZSBpdCBjYW1lIGZyb20uIGBydW5gIGlzIHByZXNlbnQgb25seVxuICogb24gdGhlIGZhbGxiYWNrIHBhdGggKHByZS1gcmVzdW1lQ29udGV4dGAgaG9va3MpLCB3aGVyZSBpdCBhbHNvIGNhcnJpZXMgdGhlXG4gKiBydW4ncyBtdXRhYmxlIHN0YXR1cyBmb3IgdGhlIHRlcm1pbmFsLXJ1biBjaGVjay4gS2V5IHJlc29sdXRpb24gaXMga2VwdFxuICogc2VwYXJhdGUgc28gY2FsbGVycyBjYW4gZ2F0ZSBpdCBiZWhpbmQgdGhhdCBjaGVjay5cbiAqL1xuaW50ZXJmYWNlIEhvb2tSZXN1bWVJbmZvIHtcbiAgcmVzdW1lQ29udGV4dDogSG9va1Jlc3VtZUNvbnRleHQ7XG4gIHNvdXJjZTogJ2hvb2snIHwgJ3J1bl9mYWxsYmFjayc7XG4gIHJ1bj86IFdvcmtmbG93UnVuO1xufVxuXG4vKiogRGVyaXZlIGEgcmVzdW1lIGNvbnRleHQgZnJvbSBhIGZ1bGwgcnVuIChmYWxsYmFjayBmb3IgcHJlLWByZXN1bWVDb250ZXh0YCBob29rcykuICovXG5mdW5jdGlvbiByZXN1bWVDb250ZXh0RnJvbVJ1bihydW46IFdvcmtmbG93UnVuKTogSG9va1Jlc3VtZUNvbnRleHQge1xuICBjb25zdCBjb3JlVmVyc2lvbiA9IHJ1bi5leGVjdXRpb25Db250ZXh0Py53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICBjb25zdCB0cmFjZUNhcnJpZXIgPSBydW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyO1xuICBjb25zdCBob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcnVuLmV4ZWN1dGlvbkNvbnRleHQ/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gIHJldHVybiB7XG4gICAgZGVwbG95bWVudElkOiBydW4uZGVwbG95bWVudElkLFxuICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICBydW5TcGVjVmVyc2lvbjogcnVuLnNwZWNWZXJzaW9uLFxuICAgIHdvcmtmbG93Q29yZVZlcnNpb246XG4gICAgICB0eXBlb2YgY29yZVZlcnNpb24gPT09ICdzdHJpbmcnID8gY29yZVZlcnNpb24gOiB1bmRlZmluZWQsXG4gICAgdHJhY2VDYXJyaWVyOlxuICAgICAgdHJhY2VDYXJyaWVyICYmIHR5cGVvZiB0cmFjZUNhcnJpZXIgPT09ICdvYmplY3QnXG4gICAgICAgID8gKHRyYWNlQ2FycmllciBhcyBIb29rUmVzdW1lQ29udGV4dFsndHJhY2VDYXJyaWVyJ10pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIGVuY3J5cHRpb25QdWJsaWNLZXk6IHJ1bi5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb246XG4gICAgICB0eXBlb2YgaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9PT0gJ251bWJlcidcbiAgICAgICAgPyBob29rUmVzdW1lSW5wdXRWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcmVzdW1lIGNvbnRleHQgZm9yIGEgaG9vay4gVXNlcyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCB3aGVuXG4gKiBwcmVzZW50IChmYXN0IHBhdGgsIG5vIHJ1biByZWFkKTsgb3RoZXJ3aXNlIGZldGNoZXMgdGhlIHJ1biBhbmQgc3ludGhlc2l6ZXNcbiAqIGl0LiBEb2VzIE5PVCByZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleTsgY2FsbGVycyBkbyB0aGF0IHNlcGFyYXRlbHkuIE9ubHlcbiAqIHRoZSBmYWxsYmFjayBwYXRoIGNhbiBnYXRlIGtleSB3b3JrIGJlaGluZCBhIGxvY2FsIHRlcm1pbmFsLXJ1biBjaGVjayAoaXRcbiAqIGhhcyB0aGUgZmV0Y2hlZCBydW4pOyB0aGUgZmFzdCBwYXRoJ3Mgc3RvcmVkIGNvbnRleHQgY2FycmllcyBubyBzdGF0dXMsIHNvXG4gKiBzZWFsL3NlcmlhbGl6YXRpb24gd29yayBtYXkgcnVuIGJlZm9yZSB0aGUgcmVjZWl2aW5nIHNpZGUgcmVqZWN0c1xuICogYGhvb2tfcmVjZWl2ZWRgIGZvciBhbiBlbmRlZCBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb29rUmVzdW1lSW5mbyhcbiAgaG9vazogUmVzdW1hYmxlSG9va1xuKTogUHJvbWlzZTxIb29rUmVzdW1lSW5mbz4ge1xuICBpZiAoaG9vay5yZXN1bWVDb250ZXh0KSB7XG4gICAgcmV0dXJuIHsgcmVzdW1lQ29udGV4dDogaG9vay5yZXN1bWVDb250ZXh0LCBzb3VyY2U6ICdob29rJyB9O1xuICB9XG4gIGNvbnN0IHJ1biA9IGF3YWl0IChhd2FpdCBnZXRXb3JsZExhenkoKSkucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gIHJldHVybiB7XG4gICAgcmVzdW1lQ29udGV4dDogcmVzdW1lQ29udGV4dEZyb21SdW4ocnVuKSxcbiAgICBzb3VyY2U6ICdydW5fZmFsbGJhY2snLFxuICAgIHJ1bixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBydW4ncyBzeW1tZXRyaWMga2V5IGZvciBhIHBheWxvYWQgV1JJVEUsIGFzIGEgYmFyZSBgQ3J5cHRvS2V5YFxuICogKGBpbXBvcnRLZXlgKTogdGhlIGBlbmNyYCB3cml0ZSBmYWxsYmFjayB1c2VkIHdoZW4gdGhlIHJ1biBwdWJsaXNoZWQgbm9cbiAqIHB1YmxpYyBrZXkgdG8gc2VhbCB0by4gV3JpdGluZyBuZWVkcyBvbmx5IHRoZSBBRVMga2V5LCBub3QgdGhlIHJlYWQtc2lkZVxuICoga2V5cGFpci4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIG5lZWRzIG9ubHkgYHJ1bklkYCArIGBkZXBsb3ltZW50SWRgIChubyBydW5cbiAqIGVudGl0eSk7IG9uIHRoZSBmYWxsYmFjayBwYXRoIHRoZSBhbHJlYWR5IGZldGNoZWQgcnVuIGlzIHJldXNlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KFxuICBob29rOiBSZXN1bWFibGVIb29rLFxuICBpbmZvOiBIb29rUmVzdW1lSW5mb1xuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGltcG9ydEtleT4+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaW5mby5ydW4pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaG9vay5ydW5JZCwge1xuICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICB9KTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG4vKiogV2hldGhlciBgbWV0YWRhdGFgIG9uIHRoaXMgcmVjb3JkIGlzIGFscmVhZHkgdGhlIGxhenkgUHJvbWlzZSBhY2Nlc3Nvci4gKi9cbmZ1bmN0aW9uIGhhc0xhenlNZXRhZGF0YShob29rOiBSZXN1bWFibGVIb29rKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGhvb2ssICdtZXRhZGF0YScpO1xuICByZXR1cm4gZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHJhdyBob29rIHJlY29yZCBmcm9tIGEgV29ybGQgaW4gYSB7QGxpbmsgSG9va30sXG4gKiByZXBsYWNpbmcgaXRzIHNlcmlhbGl6ZWQgYG1ldGFkYXRhYCB3aXRoIGEgbWVtb2l6ZWQgUHJvbWlzZSBnZXR0ZXIgdGhhdFxuICogaHlkcmF0ZXMgb24gZmlyc3QgYWNjZXNzLlxuICpcbiAqIE5vdGhpbmcgaGVyZSB0b3VjaGVzIHRoZSBuZXR3b3JrOiB0aGUgd3JhcCBpcyBhIHByb3BlcnR5IGRlZmluaXRpb24uIEFsbCBvZlxuICogdGhlIGNvc3Qg4oCUIHJlc29sdmluZyB0aGUgcnVuJ3MgcGF5bG9hZCBrZXlzIGFuZCBkZWNyeXB0aW5nIOKAlCBtb3ZlcyBpbnNpZGUgdGhlXG4gKiBnZXR0ZXIsIHNvIGEgbG9va3VwIHRoYXQgbmV2ZXIgcmVhZHMgbWV0YWRhdGEgcGF5cyBmb3IgZXhhY3RseSBvbmVcbiAqIGBob29rcy5nZXRCeVRva2VuYC5cbiAqXG4gKiBUaGUgZ2V0dGVyIGlzIGRlZmluZWQgaW4gcGxhY2Ugb24gdGhlIHJlY29yZCB0aGUgV29ybGQgcmV0dXJuZWQgKHRoZSBzYW1lXG4gKiBvYmplY3QgdGhlIGVhZ2VyIHBhdGggdXNlZCB0byBtdXRhdGUpLCBzbyBubyBjb3B5IGlzIG1hZGUuXG4gKi9cbmZ1bmN0aW9uIHdpdGhMYXp5TWV0YWRhdGEocmF3OiBXb3JsZEhvb2spOiBIb29rTG9va3VwIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IHJhdy5tZXRhZGF0YTtcbiAgbGV0IGh5ZHJhdGVkOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBsZXQgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcblxuICAvLyBIeWRyYXRpbmcgbWV0YWRhdGEgaXMgYSBkZWNyeXB0aW5nIFJFQUQsIHNvIGl0IGRlcml2ZXMgdGhlIGZ1bGxcbiAgLy8gUnVuUGF5bG9hZEtleXMgKHdoaWNoIG9wZW4gc2VhbGVkIGBlbmNwYCBtZXRhZGF0YSwgbm90IGp1c3Qgc3ltbWV0cmljXG4gIC8vIGBlbmNyYCkgcmF0aGVyIHRoYW4gdGhlIGJhcmUgd3JpdGUga2V5IHRoZSByZXN1bWUgcGF0aCB1c2VzLlxuICBjb25zdCBoeWRyYXRlID0gYXN5bmMgKCk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHJlc29sdmVIb29rUmVzdW1lSW5mbyhyYXcpO1xuICAgIC8vIE9uIHRoZSBmYXN0IHBhdGggdGhpcyByZXNvbHZlcyB0aGUga2V5IGJ5IHJ1bklkICsgZGVwbG95bWVudElkIChubyBydW5cbiAgICAvLyByZWFkKTsgb24gdGhlIGZhbGxiYWNrIHBhdGggaXQgcmV1c2VzIHRoZSBhbHJlYWR5LWZldGNoZWQgcnVuLlxuICAgIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihpbmZvLnJ1bilcbiAgICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJhdy5ydW5JZCwge1xuICAgICAgICAgIGRlcGxveW1lbnRJZDogaW5mby5yZXN1bWVDb250ZXh0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgfSk7XG4gICAgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgc2VyaWFsaXplZCBhcyBhbnksXG4gICAgICByYXcucnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBob29rID0gcmF3IGFzIHVua25vd24gYXMgSG9vaztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGhvb2ssICdtZXRhZGF0YScsIHtcbiAgICAvLyBBIGhvb2sgd2l0aCBubyBtZXRhZGF0YSByZXNvbHZlcyBgdW5kZWZpbmVkYCB3aXRob3V0IGFueSBJL08sIHNvIGNhbGxlcnNcbiAgICAvLyBjYW4gYXdhaXQgdW5jb25kaXRpb25hbGx5LiBNZW1vaXplZCBlaXRoZXIgd2F5OiBtZXRhZGF0YSBpcyBmaXhlZCBhdFxuICAgIC8vIGhvb2stY3JlYXRpb24gdGltZSwgc28gaHlkcmF0aW9uIHJ1bnMgYXQgbW9zdCBvbmNlIHBlciBob29rIG9iamVjdC5cbiAgICBnZXQ6ICgpID0+XG4gICAgICAoaHlkcmF0ZWQgPz89XG4gICAgICAgIHR5cGVvZiBzZXJpYWxpemVkID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICA6IGh5ZHJhdGUoKSksXG4gICAgLy8gTm9uLWVudW1lcmFibGUsIG1hdGNoaW5nIGBSdW4ucmV0dXJuVmFsdWVgIChhIHByb3RvdHlwZSBnZXR0ZXIsIHNvIGl0IGlzXG4gICAgLy8gYWJzZW50IGZyb20gYW4gaW5zdGFuY2UncyBvd24ga2V5cykuIFNwcmVhZGluZyBvciBgSlNPTi5zdHJpbmdpZnlgLWluZyBhXG4gICAgLy8gaG9vayB0aGVyZWZvcmUgY2Fubm90IHRyaWdnZXIgaHlkcmF0aW9uIG5vYm9keSBhc2tlZCBmb3Ig4oCUIHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIGxlYXZlIGEgZmxvYXRpbmcgcmVqZWN0aW9uIHdoZW4gdGhlIHJ1biBrZXkgaXMgdW5yZWFjaGFibGUsIGFuZFxuICAgIC8vIGFuIHVuY29uc3VtZWQgcmVqZWN0ZWQgUHJvbWlzZSBjcmFzaGVzIE5vZGUgYXMgYW4gdW5oYW5kbGVkUmVqZWN0aW9uLlxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgaG9vaywgbWV0YWRhdGFFbmNyeXB0aW9uS2V5OiAoKSA9PiBlbmNyeXB0aW9uS2V5IH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbnkgaG9vayByZWNvcmQgdGhlIHJlc3VtZSBwYXRoIGFjY2VwdGVkIGludG8gYVxuICoge0BsaW5rIEhvb2t9IHRvIHJldHVybiB0byB0aGUgY2FsbGVyLiBJZGVtcG90ZW50OiBhIGhvb2sgdGhhdFxuICogYWxyZWFkeSBjYXJyaWVzIHRoZSBsYXp5IGFjY2Vzc29yIChvbmUgdGhhdCBjYW1lIGZyb20gYGdldEhvb2tCeVRva2VuYCkgaXNcbiAqIHJldHVybmVkIGFzLWlzIHJhdGhlciB0aGFuIGRvdWJsZS13cmFwcGVkLCB3aGljaCB3b3VsZCBoYW5kXG4gKiBgaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGEgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gYXNMYXp5TWV0YWRhdGFIb29rKGhvb2s6IFJlc3VtYWJsZUhvb2spOiBIb29rIHtcbiAgcmV0dXJuIGhhc0xhenlNZXRhZGF0YShob29rKVxuICAgID8gKGhvb2sgYXMgSG9vaylcbiAgICA6IHdpdGhMYXp5TWV0YWRhdGEoaG9vayBhcyBXb3JsZEhvb2spLmhvb2s7XG59XG5cbi8qKlxuICogR2V0IHRoZSBob29rIGJ5IHRva2VuIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIFRoaXMgaXMgYSBzaW5nbGUgcmVhZC4gVGhlIHJldHVybmVkIGhvb2sncyBgbWV0YWRhdGFgIGlzIGEgZ2V0dGVyIHRoYXRcbiAqIHJlc29sdmVzIGEgUHJvbWlzZSAoc2VlIHtAbGluayBIb29rfSksIHNvIHRoZSBydW4gZmV0Y2ggYW5kXG4gKiBgcnVuLWtleWAgcm91bmQgdHJpcCB0aGF0IGh5ZHJhdGluZyBpdCBjYW4gcmVxdWlyZSBhcmUgb25seSBwYWlkIGJ5IGNhbGxlcnNcbiAqIHRoYXQgYWN0dWFsbHkgYXdhaXQgaXQ6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGhvb2sgPSBhd2FpdCBnZXRIb29rQnlUb2tlbih0b2tlbik7XG4gKiBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGhvb2subWV0YWRhdGE7XG4gKiBgYGBcbiAqXG4gKiBBIEhvb2sga2VwdCBieSBtaW5pbXVtIHJldGVudGlvbiByZW1haW5zIGF2YWlsYWJsZSBoZXJlIGFmdGVyIGl0cyBydW4gZW5kcyxcbiAqIGJ1dCBjYW5ub3QgYmUgcmVzdW1lZC5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxIb29rPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIHJldHVybiB3aXRoTGF6eU1ldGFkYXRhKGF3YWl0IHdvcmxkLmhvb2tzLmdldEJ5VG9rZW4odG9rZW4pKS5ob29rO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2Yge0BsaW5rIHJlc3VtZUhvb2t9OiBhIHtAbGluayBIb29rfSBhdWdtZW50ZWRcbiAqIHdpdGggYW4gb3B0aW9uYWwgcmVzaWxpZW5jZSBzaWduYWwuXG4gKlxuICogYHJlc2lsaWVudFJlc3VtZWAgaXMgcmV0YWluZWQgZm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IGFuZCBpcyBuZXZlciBzZXQuXG4gKiBgcmVzdW1lSG9vaygpYCBub3cgcmVxdWlyZXMgdGhlIGR1cmFibGUgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZCB3b3JrZmxvd1xuICogd2FrZSB0byBib3RoIHN1Y2NlZWQgYmVmb3JlIGl0IHJlc29sdmVzLiBUcmVhdCB0aGUgcmVzdWx0IGFzIGEgcGxhaW5cbiAqIHtAbGluayBIb29rfS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lZEhvb2sgPSBIb29rICYge1xuICByZXNpbGllbnRSZXN1bWU/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBSZXNvbHZpbmcgbWVhbnMgQk9USCB0aGF0IHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnQgaXMgZHVyYWJseSByZWNvcmRlZCBpblxuICogdGhlIHJ1bidzIGV2ZW50IGxvZyBhbmQgdGhhdCB0aGUgd29ya2Zsb3cgd2FrZSB3YXMgYWNjZXB0ZWQgYnkgdGhlIHF1ZXVlLCBpblxuICogdGhhdCBvcmRlci4gQSB7QGxpbmsgSG9va05vdEZvdW5kRXJyb3J9IG1lYW5zIHRoaXMgaW52b2NhdGlvbiBjb21taXR0ZWQgbm9cbiAqIGV2ZW50LiBBbnkgb3RoZXIgZXJyb3IgYWZ0ZXIgdGhlIHdyaXRlIGlzIGFtYmlndW91cyBvbmx5IGluIGRpc3BhdGNoLCBuZXZlclxuICogaW4gZHVyYWJpbGl0eTogdGhlIGV2ZW50IG1heSBhbHJlYWR5IGJlIGNvbW1pdHRlZCwgYW5kIGEgbGF0ZXIgd2FrZSBvZiB0aGVcbiAqIHJ1biAoZnJvbSBhbnkgc291cmNlKSB3aWxsIGRlbGl2ZXIgaXQuXG4gKlxuICogUHJlZmVyIHBhc3NpbmcgdGhlIHRva2VuIHN0cmluZyBvdmVyIGEgY2FjaGVkIHtAbGluayBIb29rfSBvYmplY3QuIEEgdG9rZW5cbiAqIGlzIGxvb2tlZCB1cCBmcmVzaCwgc28gdGhlIGxpdmUgYmFja2VuZCBjYW4gYXR0ZXN0IGl0cyBhdG9taWMgcmVzdW1lIGNsYWltXG4gKiBhbmQgdGhlIGR1cmFibGUgd3JpdGUgYmVjb21lcyBpZGVtcG90ZW50LW9uLXJldHJ5ICh0cmFuc3BvcnQgcmV0cmllcyBvZiB0aGVcbiAqIHNhbWUgd3JpdGUgY29udmVyZ2Ugb24gb25lIGV2ZW50KS4gQSBzdXBwbGllZCBIb29rIG9iamVjdCBtYXkgY2FycnkgYSBzdGFsZVxuICogYXR0ZXN0YXRpb24sIHNvIGl0IGlzIGRlbGliZXJhdGVseSBpZ25vcmVkIGFuZCB0aGUgd3JpdGUgaXMgY2xhaW0tbGVzcyDigJRcbiAqIG1lYW5pbmcgYSBsb3N0IHJlc3BvbnNlIGNhbm5vdCBiZSByZXRyaWVkIHNhZmVseTogcmV0cnlpbmcgYXQgdGhlXG4gKiBhcHBsaWNhdGlvbiBsZXZlbCBtaW50cyBhIGZyZXNoIGNsYWltIGFuZCBjYW4gY29tbWl0IGEgc2Vjb25kXG4gKiBgaG9va19yZWNlaXZlZGAuXG4gKlxuICogQHBhcmFtIHRva2VuT3JIb29rIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9vaywgb3IgdGhlIGhvb2sgb2JqZWN0IGl0c2VsZlxuICogQHBhcmFtIHBheWxvYWQgLSBUaGUgZGF0YSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB7QGxpbmsgUmVzdW1lZEhvb2t9XG4gKiBAdGhyb3dzIHtIb29rTm90Rm91bmRFcnJvcn0gSWYgdGhlIEhvb2sgZG9lcyBub3QgZXhpc3Qgb3IgaXRzIHJ1biBoYXMgZW5kZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGltcG9ydCB7IHJlc3VtZUhvb2sgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gKiAgIGNvbnN0IHsgdG9rZW4sIGRhdGEgfSA9IGF3YWl0IHJlcXVlc3QuanNvbigpO1xuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCBob29rID0gYXdhaXQgcmVzdW1lSG9vayh0b2tlbiwgZGF0YSk7XG4gKiAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oeyBydW5JZDogaG9vay5ydW5JZCB9KTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdIb29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lSG9vazxUID0gYW55PihcbiAgdG9rZW5Pckhvb2s6IHN0cmluZyB8IFJlc3VtYWJsZUhvb2ssXG4gIHBheWxvYWQ6IFQsXG4gIGVuY3J5cHRpb25LZXlPdmVycmlkZT86IFBheWxvYWRLZXlcbik6IFByb21pc2U8UmVzdW1lZEhvb2s+IHtcbiAgLy8gUHVibGljIGVudHJ5IHBvaW50LiBJdCBuZXZlciBhdHRlc3RzIGhvb2sgZnJlc2huZXNzLCBzbyBhIEhvb2sgb2JqZWN0XG4gIC8vIHN1cHBsaWVkIGhlcmUgKHdoaWNoIG1heSBjYXJyeSBhIGByZXN1bWVDYXBhYmlsaXRpZXNgIGNhY2hlZCBiZWZvcmUgYVxuICAvLyBzZXJ2ZXIgcm9sbGJhY2sgb3Iga2lsbCBzd2l0Y2gpIGlzIGlnbm9yZWQgYnkgdGhlIGR5bmFtaWMtZGVkdXAgZ2F0ZSBhbmRcbiAgLy8gZmFpbHMgY2xvc2VkIHRvIGEgcGxhaW4sIGNsYWltLWxlc3Mgd3JpdGUuIE9ubHkgYHJlc3VtZVdlYmhvb2tgLCB3aGljaFxuICAvLyBmZXRjaGVzIHRoZSBob29rIGJ5IHRva2VuIGluLWxpbmUgZHVyaW5nIHRoZSBzYW1lIHJlc3VtZSwgcmVhY2hlcyB0aGVcbiAgLy8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgZnJlc2ggYXR0ZXN0YXRpb24gc2V0LiBLZWVwaW5nIHRoZVxuICAvLyBmcmVzaG5lc3MgZmxhZyBvZmYgdGhlIGV4cG9ydGVkIHNpZ25hdHVyZSBwcmV2ZW50cyBhIGNhbGxlciBmcm9tIHBhc3NpbmcgYVxuICAvLyBzdGFsZSBIb29rIHBsdXMgYHRydWVgIGFuZCByZWFjdGl2YXRpbmcgZHluYW1pYyBkZWR1cCBhZ2FpbnN0IGFcbiAgLy8gcm9sbGVkLWJhY2sgYmFja2VuZC5cbiAgLy9cbiAgLy8gVDAgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cgaXMgdGFrZW4gSEVSRSwgYXQgdGhlIHB1YmxpYyBlbnRyeSBwb2ludCxcbiAgLy8gcmF0aGVyIHRoYW4gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvbjsgc2VlIHRoZSBwYXJhbWV0ZXIncyBkb2MgY29tbWVudC5cbiAgcmV0dXJuIHJlc3VtZUhvb2tJbXBsKFxuICAgIHRva2VuT3JIb29rLFxuICAgIHBheWxvYWQsXG4gICAgZW5jcnlwdGlvbktleU92ZXJyaWRlLFxuICAgIGZhbHNlLFxuICAgIERhdGUubm93KClcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgcmVzdW1lSG9va30uIE5PVCBleHBvcnRlZDogdGhlXG4gKiBgaG9va0ZyZXNobHlMb29rZWRVcGAgYXR0ZXN0YXRpb24gbXVzdCBuZXZlciBiZSByZWFjaGFibGUgYnkgcHVibGljIGNhbGxlcnNcbiAqIChzZWUgdGhlIHdyYXBwZXIgYWJvdmUpLlxuICpcbiAqIEBwYXJhbSBob29rRnJlc2hseUxvb2tlZFVwIC0gQXR0ZXN0cyB0aGF0IGEgc3VwcGxpZWQgSG9vayBvYmplY3Qgd2FzIGZldGNoZWRcbiAqICAgYnkgdG9rZW4gZHVyaW5nIFRISVMgcmVzdW1lLCBzbyBpdHMgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYFxuICogICByZWZsZWN0cyB0aGUgbGl2ZSBiYWNrZW5kIGFuZCBtYXkgYmUgdHJ1c3RlZCBmb3IgdGhlIGR5bmFtaWMtZGVkdXAgZ2F0ZS5cbiAqICAgQSB0b2tlbiBzdHJpbmcgaXMgYWx3YXlzIGZldGNoZWQgZnJlc2ggaGVyZSwgc28gaXQgaXMgaW1wbGljaXRseSBmcmVzaC5cbiAqIEBwYXJhbSByZXN1bWVSZXF1ZXN0ZWRBdE1zIC0gVDAgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cgKHNlZVxuICogICBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKSwgc3RhbXBlZCBieSB0aGUgUFVCTElDIGVudHJ5IHBvaW50IHRoZSBjYWxsZXJcbiAqICAgdXNlZC4gSXQgaXMgYSBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gYSBsb2NhbCBiZWNhdXNlIGByZXN1bWVXZWJob29rYCBkb2VzXG4gKiAgIHJlYWwgd29yayBiZWZvcmUgaXQgZ2V0cyBoZXJlICh0aGUgYnktdG9rZW4gbG9va3VwLCB0aGUgcnVuLWtleVxuICogICByZXNvbHV0aW9uIHRoYXQgaHlkcmF0ZXMgaG9vayBtZXRhZGF0YSwgYW5kIHRoZSBgcmVzcG9uZFdpdGhgIHNldHVwKSBhbmRcbiAqICAgc3RhbXBpbmcgbG9jYWxseSB3b3VsZCBzaWxlbnRseSBleGNsdWRlIGFsbCBvZiBpdCwgc28gdGhlIHR3byBlbnRyeSBwb2ludHNcbiAqICAgd291bGQgcmVwb3J0IHRoZSBzYW1lIG1ldHJpYyBvdmVyIGRpZmZlcmVudCB3aW5kb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXN1bWVIb29rSW1wbDxUID0gYW55PihcbiAgdG9rZW5Pckhvb2s6IHN0cmluZyB8IFJlc3VtYWJsZUhvb2ssXG4gIHBheWxvYWQ6IFQsXG4gIGVuY3J5cHRpb25LZXlPdmVycmlkZTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgaG9va0ZyZXNobHlMb29rZWRVcDogYm9vbGVhbixcbiAgcmVzdW1lUmVxdWVzdGVkQXRNczogbnVtYmVyXG4pOiBQcm9taXNlPFJlc3VtZWRIb29rPiB7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgcmV0dXJuIHRyYWNlKCdob29rLnJlc3VtZScsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdXBwbGllZFRva2VuID0gdHlwZW9mIHRva2VuT3JIb29rID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgaG9vazogUmVzdW1hYmxlSG9vayA9IHN1cHBsaWVkVG9rZW5cbiAgICAgICAgICA/IGF3YWl0IHdvcmxkLmhvb2tzLmdldEJ5VG9rZW4odG9rZW5Pckhvb2spXG4gICAgICAgICAgOiB0b2tlbk9ySG9vaztcbiAgICAgICAgLy8gVGhlIGR5bmFtaWMsIHJlc3BvbnNlLW9ubHkgYHJlc3VtZUNhcGFiaWxpdGllc2AgbWF5IG9ubHkgYmUgdHJ1c3RlZFxuICAgICAgICAvLyB3aGVuIGl0IGNhbWUgZnJvbSBhIGJ5LXRva2VuIGxvb2t1cCBwZXJmb3JtZWQgZHVyaW5nIHRoaXMgcmVzdW1lLlxuICAgICAgICBjb25zdCBob29rUmVzdW1lQ2FwYWJpbGl0aWVzQXJlRnJlc2ggPVxuICAgICAgICAgIHN1cHBsaWVkVG9rZW4gfHwgaG9va0ZyZXNobHlMb29rZWRVcDtcblxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUhvb2tSZXN1bWVJbmZvKGhvb2spO1xuICAgICAgICBjb25zdCB7IHJlc3VtZUNvbnRleHQgfSA9IGluZm87XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihob29rLnRva2VuKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0lkKGhvb2suaG9va0lkKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChob29rLnJ1bklkKSxcbiAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfY29udGV4dF9zb3VyY2UnOiBpbmZvLnNvdXJjZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhlIHN0b3JlZCBgcmVzdW1lQ29udGV4dGAgaW50ZW50aW9uYWxseSBvbWl0cyB0aGUgcnVuJ3MgbXV0YWJsZVxuICAgICAgICAvLyBzdGF0dXMsIHNvIHRoaXMgZWFybHkgY2xpZW50LXNpZGUgcmVqZWN0aW9uIG9ubHkgcnVucyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgcGF0aCAod2hpY2ggZmV0Y2hlZCB0aGUgcnVuKS4gT24gdGhlIGZhc3QgcGF0aCB0aGUgdGVybWluYWxcbiAgICAgICAgLy8gY2hlY2sgaGFwcGVucyBzZXJ2ZXItc2lkZTogYGhvb2tfcmVjZWl2ZWRgIGFnYWluc3QgYW4gZW5kZWQgcnVuIGlzXG4gICAgICAgIC8vIHJlamVjdGVkLCB3aGljaCB0aGUgY2F0Y2ggYXJvdW5kIGB3b3JsZC5ldmVudHMuY3JlYXRlYCBiZWxvdyByZS1rZXlzXG4gICAgICAgIC8vIHRvIEhvb2tOb3RGb3VuZEVycm9yOiBzYW1lIHB1YmxpYyBjb250cmFjdCwgbm8gcnVuIHByZS1mZXRjaC5cbiAgICAgICAgaWYgKGluZm8ucnVuICYmIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhpbmZvLnJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIHRhcmdldCBydW4ncyBjYXBhYmlsaXRpZXMgdG8gZW5zdXJlIHdlIGVuY29kZSB0aGVcbiAgICAgICAgLy8gcGF5bG9hZCBpbiBhIGZvcm1hdCB0aGUgcnVuJ3MgZGVwbG95bWVudCBjYW4gZGVjb2RlLiBGb3IgZXhhbXBsZSxcbiAgICAgICAgLy8gcnVucyBjcmVhdGVkIGJlZm9yZSBlbmNyeXB0aW9uIHN1cHBvcnQgd2FzIGFkZGVkIGNhbm5vdCBkZWNvZGVcbiAgICAgICAgLy8gdGhlICdlbmNyJyBzZXJpYWxpemF0aW9uIGZvcm1hdCwgYW5kIHJ1bnMgY3JlYXRlZCBiZWZvcmVcbiAgICAgICAgLy8gYnl0ZS1zdHJlYW0gZnJhbWluZyBzdXBwb3J0IGNhbm5vdCBkZWNvZGUgZnJhbWVkIGJ5dGUgc3RyZWFtcy5cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgIHJlc3VtZUNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlc29sdmUgaG93IHRvIGVuY3J5cHQgdGhlIHBheWxvYWQgZm9yIHRoZSB0YXJnZXQgcnVuIChhIFdSSVRFKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUHJlZmVycmVkIHBhdGg6IHNlYWwgdG8gdGhlIHJ1bidzIHB1Ymxpc2hlZCBYMjU1MTkgcHVibGljIGtleSwgd2hpY2hcbiAgICAgICAgLy8gdGhlIHN0b3JlZCBgcmVzdW1lQ29udGV4dGAgY2FycmllcyBpbmxpbmUuIE9uIHRoZSBmYXN0IHBhdGggdGhpcyBpc1xuICAgICAgICAvLyB0aGUgd2hvbGUgd2luOiBubyBydW4gcmVhZCBBTkQgbm8gYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gLCB3aG9zZVxuICAgICAgICAvLyB+MzUwbXMgYHJ1bi1rZXlgIEFQSSByb3VuZCB0cmlwIGRvbWluYXRlcyBjcm9zcy1kZXBsb3ltZW50IGhvb2tcbiAgICAgICAgLy8gcmVzdW1wdGlvbiBsYXRlbmN5LiAoT24gdGhlIGZhbGxiYWNrIHBhdGggdGhlIGtleSBpcyBzeW50aGVzaXplZFxuICAgICAgICAvLyBmcm9tIHRoZSBmZXRjaGVkIHJ1biwgd2hpY2ggYWxzbyBjYXJyaWVzIGl0LilcbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VhbGluZyBhbHNvIGRyb3BzIHByaXZpbGVnZTogdGhlIHJlc3VtZXIgZW5kcyB1cCBhYmxlIHRvIHdyaXRlIGFcbiAgICAgICAgLy8gcGF5bG9hZCBmb3IgdGhlIHJ1biB3aXRob3V0IGJlaW5nIGFibGUgdG8gcmVhZCBhbnl0aGluZyBvZiB0aGVcbiAgICAgICAgLy8gcnVuJ3MsIHdoZXJlIGZldGNoaW5nIHRoZSBzeW1tZXRyaWMga2V5IGdyYW50cyBib3RoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGdhdGVkIG9uIGBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0c2AgdGhlIHdheVxuICAgICAgICAvLyB0aGUgc3ltbWV0cmljIGZhbGxiYWNrIGJlbG93IGdhdGVzIGBlbmNyYDogcHJlc2VuY2Ugb2YgdGhlIHB1YmxpYyBrZXlcbiAgICAgICAgLy8gaXMgaXRzZWxmIHRoZSBnYXRlLiBBIHJ1biBvbmx5IGNhcnJpZXMgb25lIGlmIHRoZSBydW50aW1lIHRoYXRcbiAgICAgICAgLy8gY3JlYXRlZCBpdCBjb3VsZCBhbHNvIG9wZW4gYSBzZWFsZWQgcGF5bG9hZCwgYW5kIHJ1bnMgYXJlIHBpbm5lZCB0b1xuICAgICAgICAvLyB0aGVpciBjcmVhdGluZyBkZXBsb3ltZW50LCBzbyBwcmVzZW5jZSBpcyBhIG1vcmUgcmVsaWFibGUgYXR0ZXN0YXRpb25cbiAgICAgICAgLy8gdGhhbiBhIHZlcnNpb24gY29tcGFyZSwgYW5kIGl0IHN0YXlzIGNvcnJlY3QgZXZlbiB3aGVuIHBhY2thZ2VcbiAgICAgICAgLy8gdmVyc2lvbnMgZHJpZnQuXG4gICAgICAgIGxldCBwYXlsb2FkS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBydW5QdWJsaWNLZXkgPSBlbmNyeXB0aW9uS2V5T3ZlcnJpZGVcbiAgICAgICAgICA/IC8vIFRoZSBjYWxsZXIgYWxyZWFkeSBob2xkcyBhIGtleSAocmVzdW1lV2ViaG9vayByZXNvbHZlZCBvbmUgdG9cbiAgICAgICAgICAgIC8vIGh5ZHJhdGUgaG9vayBtZXRhZGF0YSksIHNvIHNlYWxpbmcgd291bGQgYWRkIGFuIEVDREggZm9yIG5vXG4gICAgICAgICAgICAvLyBzYXZlZCByb3VuZCB0cmlwLiBSZXVzZSB3aGF0IGl0IHJlc29sdmVkLlxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgOiBkZWNvZGVSdW5QdWJsaWNLZXkocmVzdW1lQ29udGV4dC5lbmNyeXB0aW9uUHVibGljS2V5KTtcblxuICAgICAgICBpZiAocnVuUHVibGljS2V5KSB7XG4gICAgICAgICAgcGF5bG9hZEtleSA9IHNlYWxUbyhydW5QdWJsaWNLZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN5bW1ldHJpYyBgZW5jcmAgd3JpdGUgZmFsbGJhY2s6IG5lZWRzIG9ubHkgdGhlIEFFUyBrZXlcbiAgICAgICAgICAvLyAoYSBiYXJlIENyeXB0b0tleSB2aWEgYHJlc29sdmVIb29rRW5jcnlwdGlvbktleWApLCBub3QgdGhlXG4gICAgICAgICAgLy8gcmVhZC1zaWRlIFJ1blBheWxvYWRLZXlzLlxuICAgICAgICAgIGxldCBlbmNyeXB0aW9uS2V5ID1cbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlPdmVycmlkZSA/P1xuICAgICAgICAgICAgKGF3YWl0IHJlc29sdmVIb29rRW5jcnlwdGlvbktleShob29rLCBpbmZvKSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBheWxvYWRLZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHJlc3Mgb25seSB3aGVuIHRoZSB0YXJnZXQgcnVuIGFuZCBpdHMgZGVwbG95bWVudCBzdXBwb3J0IHRoZVxuICAgICAgICAvLyBjb21wcmVzc2lvbiBmb3JtYXRzIGludHJvZHVjZWQgd2l0aCBzcGVjIHZlcnNpb24gNS5cbiAgICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICAgIChyZXN1bWVDb250ZXh0LnJ1blNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gJiZcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQKTtcblxuICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb25zdCByZWFkYmFja09wczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKGhvb2suc3BlY1ZlcnNpb24pO1xuICAgICAgICBjb25zdCBkZWh5ZHJhdGVkUGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgcGF5bG9hZEtleSxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICk7XG4gICAgICAgIC8vIEEgaG9va19yZWNlaXZlZCBldmVudCBpcyBub3QgZHVyYWJsZSB3aGlsZSBpdHMgcGF5bG9hZCBzdGlsbCBwb2ludHNcbiAgICAgICAgLy8gYXQgc3RyZWFtIHVwbG9hZHMgaW4gZmxpZ2h0LiBGaW5pc2ggdGhvc2UgYmVmb3JlIGNvbW1pdHRpbmcgdGhlXG4gICAgICAgIC8vIGV2ZW50IOKAlCBidXQgT05MWSB0aGUgcHJvZHVjZXItcHVzaCBvcHMgaW4gYG9wc2AuIEEgZGVoeWRyYXRlZFxuICAgICAgICAvLyBXcml0YWJsZVN0cmVhbSBsYW5kcyBpbiBgcmVhZGJhY2tPcHNgIGluc3RlYWQ6IGl0IGlzIGEgc2VydmVyLXN0cmVhbVxuICAgICAgICAvLyBSRUFERVIgdGhhdCByZXNvbHZlcyBvbmx5IG9uY2UgdGhlIHdva2VuIHdvcmtmbG93IHdyaXRlcyBpbnRvIGl0IChhXG4gICAgICAgIC8vIG1hbnVhbCB3ZWJob29rJ3MgYHJlc3BvbnNlV3JpdGFibGVgIGlzIHRoZSBjYW5vbmljYWwgY2FzZSksIHNvXG4gICAgICAgIC8vIGF3YWl0aW5nIGl0IGhlcmUgd291bGQgZGVhZGxvY2sgdGhlIHJlc3VtZSBhZ2FpbnN0IGl0cyBvd24gd2FrZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQSByZWplY3Rpb24gd2l0aCBgdW5kZWZpbmVkYCBpcyBhbiBleHBlY3RlZCBhcnRpZmFjdCBvZiB0aGUgd2ViaG9va1xuICAgICAgICAvLyBidW5kbGUgYW5kIHdhcyBoaXN0b3JpY2FsbHkgaWdub3JlZCBieSB0aGUgYmFja2dyb3VuZCBmbHVzaC4gS2VlcFxuICAgICAgICAvLyB0aGF0IHRvbGVyYW5jZSBub3cgdGhhdCB0aGUgZmx1c2ggaXMgYXdhaXRlZCBpbmxpbmUuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG9wcy5tYXAoKG9wKSA9PlxuICAgICAgICAgICAgb3AuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICAvLyBSZWFkYmFjayBwaXBlcyAobm90YWJseSBhIG1hbnVhbCB3ZWJob29rIHJlc3BvbnNlIHdyaXRhYmxlKSBjYW4gb25seVxuICAgICAgICAvLyBmaW5pc2ggYWZ0ZXIgdGhlIHdvcmtmbG93IHdha2VzIGFuZCB3cml0ZXMgdG8gdGhlbS4gS2VlcCB0aGVtIGFsaXZlLFxuICAgICAgICAvLyBidXQgbmV2ZXIgcGxhY2UgdGhlbSBpbiB0aGUgZHVyYWJpbGl0eSBiYXJyaWVyIGFib3ZlLlxuICAgICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKHJlYWRiYWNrT3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCByZWFkYmFjayBvZiBob29rIHBheWxvYWQgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGluayB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHN0b3JlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgIC8vIChza2lwcGVkIHdoZW4gYWJzZW50IG9yIGludmFsaWQpLiBSZXNvbHZlZCBiZWZvcmUgZGlzcGF0Y2ggc28gdGhlXG4gICAgICAgIC8vIHdyaXRlIGFuZCB0aGUgd2FrZSBib3RoIHNpdCB1bmRlciBhIHNwYW4gdGhhdCBjYXJyaWVzIGl0LlxuICAgICAgICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyKTtcbiAgICAgICAgaWYgKG9yaWdpbkxpbmspIHtcbiAgICAgICAgICBzcGFuPy5hZGRMaW5rPy4ob3JpZ2luTGluayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZU5hbWUgPSBnZXRXb3JrZmxvd1F1ZXVlTmFtZShyZXN1bWVDb250ZXh0LndvcmtmbG93TmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXVlT3B0aW9ucyA9IHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiByZXN1bWVDb250ZXh0LnJ1blNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGhlIGRpc3BhdGNoIGlzIHN0cmljdGx5IHNlcmlhbDogdGhlIGhvb2tfcmVjZWl2ZWQgZXZlbnQgaXMgbWFkZVxuICAgICAgICAvLyBkdXJhYmxlIEZJUlNULCBhbmQgdGhlIHdvcmtmbG93IHdha2UgaXMgcHVibGlzaGVkIG9ubHkgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIHdyaXRlIGlzIGFja25vd2xlZGdlZC4gVGhpcyBpcyB3aGF0IGxldHMgYHJlc3VtZUhvb2soKWAgcmVzb2x2aW5nXG4gICAgICAgIC8vIG1lYW4gXCJ0aGUgcmVzdW1lIHN1cnZpdmVzIGFueXRoaW5nIHRoYXQgaGFwcGVucyBuZXh0XCIg4oCUIGEgZGlzcG9zYWxcbiAgICAgICAgLy8gb3IgcnVuIGNvbXBsZXRpb24gcmFjaW5nIHRoZSBxdWV1ZSBkZWxpdmVyeSBjYW5ub3QgZXJhc2UgYSBjb21taXR0ZWRcbiAgICAgICAgLy8gZXZlbnQsIGFuZCB0aGUgd2FrZSBpdHNlbGYgY2FycmllcyBubyBwYXlsb2FkLCBzbyBub3RoaW5nIHJpZGVzIG9uXG4gICAgICAgIC8vIHRoZSBtZXNzYWdlIGJ1dCB0aGUgdHJpZ2dlci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQmFja2VuZCBkZWR1cCBpcyBhdHRlc3RlZCB3aGVuIEVJVEhFUiB0aGUgbGl2ZSBzZXJ2ZXIgYXR0ZXN0cyBpdFxuICAgICAgICAvLyBmcmVzaCBvbiB0aGlzIGJ5LXRva2VuIGhvb2sgKHdvcmxkLXZlcmNlbDogcmVzcG9uc2Utb25seSwgcmVjb21wdXRlZFxuICAgICAgICAvLyBldmVyeSByZWFkLCBzbyByb2xsYmFjay9raWxsLXN3aXRjaCB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseSkgT1IgdGhlXG4gICAgICAgIC8vIHN0YXRpYyB3b3JsZCBjYXBhYmlsaXR5IGlzIHNldCAod29ybGQtbG9jYWw6IGFkYXB0ZXIgKyBiYWNrZW5kIHNoaXBcbiAgICAgICAgLy8gdG9nZXRoZXIpLiBXaGVuIGF0dGVzdGVkLCB0aGUgd3JpdGUgY2FycmllcyBhIHBlci1jYWxsIHJlc3VtZUlkICtcbiAgICAgICAgLy8gcGF5bG9hZCBkaWdlc3Qgc28gdHJhbnNwb3J0LWxldmVsIHJldHJpZXMgb2YgdGhlIFNBTUUgd3JpdGUgY29udmVyZ2VcbiAgICAgICAgLy8gb24gZXhhY3RseSBvbmUgY29tbWl0dGVkIGV2ZW50IHZpYSB0aGUgYmFja2VuZCdzIChydW5JZCwgcmVzdW1lSWQpXG4gICAgICAgIC8vIGNvbnN0cmFpbnQuIFdpdGhvdXQgaXQgdGhlIHdyaXRlIGlzIGEgcGxhaW4gc2luZ2xlLXNob3QgY3JlYXRlLFxuICAgICAgICAvLyBleGFjdGx5IGFzIGJlZm9yZSBkZWR1cCBleGlzdGVkLlxuICAgICAgICBjb25zdCBiYWNrZW5kRGVkdXBTdXBwb3J0ZWQgPVxuICAgICAgICAgIChob29rUmVzdW1lQ2FwYWJpbGl0aWVzQXJlRnJlc2hcbiAgICAgICAgICAgID8gKGhvb2sucmVzdW1lQ2FwYWJpbGl0aWVzPy5ob29rUmVzdW1lRGVkdXBWZXJzaW9uID8/IDApXG4gICAgICAgICAgICA6IDApID49IEhPT0tfUkVTVU1FX0RFRFVQX1ZFUlNJT04gfHxcbiAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXM/Lmhvb2tSZXN1bWVEZWR1cCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY2FuQ2xhaW1SZXN1bWUgPVxuICAgICAgICAgIGJhY2tlbmREZWR1cFN1cHBvcnRlZCAmJlxuICAgICAgICAgICF2MUNvbXBhdCAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfc3RyYXRlZ3knOiAnc2VxdWVudGlhbCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VtZUlkID0gY2FuQ2xhaW1SZXN1bWUgPyBnZW5lcmF0ZVJlc3VtZUlkKCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBheWxvYWREaWdlc3QgPSBjYW5DbGFpbVJlc3VtZVxuICAgICAgICAgID8gYXdhaXQgY29tcHV0ZVJlc3VtZVBheWxvYWREaWdlc3QoZGVoeWRyYXRlZFBheWxvYWQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZXN1bWVJZCkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoeyAnd29ya2Zsb3cuaG9vay5yZXN1bWVfaWQnOiByZXN1bWVJZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWtleSBhbnkgXCJob29rIGNhbiBubyBsb25nZXIgYmUgcmVjZWl2ZWRcIiByZWplY3Rpb24gdG9cbiAgICAgICAgLy8gSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbikgc28gYC50b2tlbmAgbWF0Y2hlcyB0aGUgaGlzdG9yaWNhbFxuICAgICAgICAvLyBjb250cmFjdC4gVGhlIHNwZWNpZmljIGVycm9yIGRlcGVuZHMgb24gdGhlIFdvcmxkOlxuICAgICAgICAvLyAgIC0gYSBnZW51aW5lbHkgbWlzc2luZyBob29rIG1hcHMgdG8gSG9va05vdEZvdW5kRXJyb3IgKGtleWVkIG9uXG4gICAgICAgIC8vICAgICB0aGUgZXZlbnQgY29ycmVsYXRpb25JZCAvIGhvb2sgSUQpO1xuICAgICAgICAvLyAgIC0gYSB0ZXJtaW5hbCBydW4gb24gVmVyY2VsIHJlamVjdHMgaG9va19yZWNlaXZlZCB3aXRoIDQwNCwgd2hpY2hcbiAgICAgICAgLy8gICAgIHdvcmxkLXZlcmNlbCBtYXBzIHRvIEhvb2tOb3RGb3VuZEVycm9yO1xuICAgICAgICAvLyAgIC0gYSB0ZXJtaW5hbCBydW4gb24gd29ybGQtbG9jYWwgLyB3b3JsZC1wb3N0Z3JlcyByZWplY3RzIHdpdGhcbiAgICAgICAgLy8gICAgIFJ1bkV4cGlyZWRFcnJvci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQW4gRW50aXR5Q29uZmxpY3RFcnJvciAoSFRUUCA0MDkpIGlzIGRlbGliZXJhdGVseSBOT1QgcmUta2V5ZWQsXG4gICAgICAgIC8vIGJyZWFraW5nIHdpdGggdGhlIGhpc3RvcmljYWwgbWFwcGluZzogZXZlcnkgNDA5IHRoZSBiYWNrZW5kIGVtaXRzXG4gICAgICAgIC8vIG9uIHRoaXMgd3JpdGUgdG9kYXkgaXMgVFJBTlNJRU5UIOKAlCBhIHNsb3QgY29uZmxpY3QgdGhhdCBlc2NhcGVkIHRoZVxuICAgICAgICAvLyBzZXJ2ZXIncyBvd24gcmV0cnkgYnVkZ2V0IHVuZGVyIGNvbnRlbnRpb24sIG9yIGEgcmVzdW1lLWNsYWltIHJhY2VcbiAgICAgICAgLy8gbWlkLXJlc29sdXRpb24g4oCUIGFuZCBpdHMgdHJhbnNhY3Rpb24gY29tbWl0dGVkIG5vdGhpbmcuIFJlLWtleWluZ1xuICAgICAgICAvLyBpdCB0byBIb29rTm90Rm91bmRFcnJvciB0b2xkIHRoZSBjYWxsZXIgKGFuZCBhIHdlYmhvb2sgc2VuZGVyLCB2aWFcbiAgICAgICAgLy8gNDA0KSB0aGF0IGEgcmV0cnlhYmxlIGZhaWx1cmUgd2FzIHBlcm1hbmVudCwgc2lsZW50bHkgZHJvcHBpbmcgdGhlXG4gICAgICAgIC8vIHJlc3VtZS4gSXQgbm93IHN1cmZhY2VzIGFzLWlzOiByZXRyeWFibGUsIHdpdGggbm90aGluZyBjb21taXR0ZWQuXG4gICAgICAgIC8vIChBIDQyMiByZXN1bWVJZC1yZXVzZSBlcnJvciBsaWtld2lzZSBwYXNzZXMgdGhyb3VnaCB1bm1hcHBlZCDigJQgaXRcbiAgICAgICAgLy8gbWVhbnMgdGhlIGNhbGxlciByZXBsYXllZCBhIHJlc3VtZUlkIHdpdGggYSBkaWZmZXJlbnQgcGF5bG9hZCwgYW5kXG4gICAgICAgIC8vIGhpZGluZyB0aGF0IGJlaGluZCBcIm5vdCBmb3VuZFwiIHdvdWxkIG1hc2sgdGhlIGJ1Zy4pXG4gICAgICAgIGNvbnN0IGlzSG9va0dvbmVFcnJvciA9IChlcnI6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgICAgICAgSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIC4uLih2MUNvbXBhdCA/IHt9IDogeyB0b2tlbjogaG9vay50b2tlbiB9KSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBkZWh5ZHJhdGVkUGF5bG9hZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHYxQ29tcGF0LFxuICAgICAgICAgICAgICAuLi4ocmVzdW1lSWQgJiYgcGF5bG9hZERpZ2VzdFxuICAgICAgICAgICAgICAgID8geyByZXN1bWVJZCwgcmVzdW1lUGF5bG9hZERpZ2VzdDogcGF5bG9hZERpZ2VzdCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGlzSG9va0dvbmVFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB3cml0ZSByZXNvbHZlcyAoZW50cnktdGltZSBhdHRyaWJ1dGVzIGNhbm5vdCB0ZWxsXG4gICAgICAgIC8vIGFuIGF0dGVtcHRlZCByZXN1bWUgZnJvbSBhIGNvbW1pdHRlZCBvbmUpOiB0b2dldGhlciB3aXRoXG4gICAgICAgIC8vIEhvb2tXYWtlUHVibGlzaGVkIGJlbG93LCB0aGlzIGlzIHdoYXQgbWFrZXMgYSBzdHJhbmRlZCByZXN1bWUg4oCUIGFcbiAgICAgICAgLy8gY29tbWl0dGVkIGV2ZW50IHdob3NlIHdha2UgbmV2ZXIgd2VudCBvdXQgb3Igd2FzIG5ldmVyIGRlbGl2ZXJlZCDigJRcbiAgICAgICAgLy8gcXVlcnlhYmxlIGZyb20gdHJhY2VzLiBTZWUgdGhlIGFsZXJ0aW5nIG5vdGUgb24gSG9va1dha2VQdWJsaXNoZWQuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLkhvb2tSZXN1bWVDb21taXR0ZWQodHJ1ZSkpO1xuXG4gICAgICAgIC8vIFQxIG9mIHRoZSBUVFIgd2luZG93LiBTdGFtcGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcHVibGlzaCBzb1xuICAgICAgICAvLyBgcHJvZHVjZXJfcHJlcGAgY292ZXJzIGV4YWN0bHkgdGhlIHdvcmsgYWJvdmUgaXQgKGhvb2sgbG9va3VwLCBrZXlcbiAgICAgICAgLy8gcmVzb2x1dGlvbiwgc2VyaWFsaXphdGlvbiwgYW5kIHRoZSBhd2FpdGVkIGhvb2tfcmVjZWl2ZWQgd3JpdGUsXG4gICAgICAgIC8vIHdoaWNoIGlzIGdlbnVpbmVseSBzZXJpYWwgaGVyZSkuXG4gICAgICAgIGNvbnN0IHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBwdWJsaXNoSG9va1dha2VXaXRoUmV0cnkoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBob29rUmVzdW1lVGltaW5nOiB7XG4gICAgICAgICAgICAgICAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgICAgICAgICAgICAgICAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiAnc2VxdWVudGlhbCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucXVldWVPcHRpb25zLFxuICAgICAgICAgICAgICAgIC8vIERlZHVwIHJldHJpZWQgcHVibGlzaGVzIHdob3NlIHJlc3BvbnNlIHdhcyBsb3N0OiBhXG4gICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdha2UgaXMgaGFybWxlc3MgZm9yIGNvcnJlY3RuZXNzIChkZXRlcm1pbmlzdGljXG4gICAgICAgICAgICAgICAgLy8gcmVwbGF5KSBidXQgY29zdHMgYSBmdWxsIHJlcGxheSBvZiB0aGUgcnVuLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgLy8gYWNjZXB0cyBhIHJlcGVhdGVkIGlkZW1wb3RlbmN5IGtleSBieSBkZWxpdmVyaW5nIG9ubHkgb25lXG4gICAgICAgICAgICAgICAgLy8gb2YgdGhlIG1lc3NhZ2VzLiBDbGFpbS1sZXNzIHdyaXRlcyBoYXZlIG5vIHJlc3VtZUlkIGFuZFxuICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgIC4uLihyZXN1bWVJZCA/IHsgaWRlbXBvdGVuY3lLZXk6IGBob29rLSR7cmVzdW1lSWR9YCB9IDoge30pLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I/LmJpbmQod29ybGQpXG4gICAgICAgICk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLkhvb2tXYWtlUHVibGlzaGVkKHRydWUpKTtcblxuICAgICAgICByZXR1cm4gYXNMYXp5TWV0YWRhdGFIb29rKGhvb2spIHNhdGlzZmllcyBSZXN1bWVkSG9vaztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKFxuICAgICAgICAgICAgdHlwZW9mIHRva2VuT3JIb29rID09PSAnc3RyaW5nJyA/IHRva2VuT3JIb29rIDogdG9rZW5Pckhvb2sudG9rZW5cbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rRm91bmQoZmFsc2UpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXN1bWVzIGEgd2ViaG9vayBieSBzZW5kaW5nIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0IHwgUmVxdWVzdH1cbiAqIG9iamVjdCB0byBhIGhvb2sgaWRlbnRpZmllZCBieSBpdHMgdG9rZW4uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXh0ZXJuYWxseSAoZS5nLiwgZnJvbSBhbiBBUEkgcm91dGUgb3Igc2VydmVyIGFjdGlvbilcbiAqIHRvIHNlbmQgYSByZXF1ZXN0IHRvIGEgd2ViaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXNwb25zZVxuICogQHRocm93cyBFcnJvciBpZiB0aGUgaG9vayBpcyBub3QgZm91bmQgb3IgaWYgdGhlcmUncyBhbiBlcnJvciBkdXJpbmcgdGhlIHByb2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGltcG9ydCB7IHJlc3VtZVdlYmhvb2sgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gKiAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICogICBjb25zdCB0b2tlbiA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd0b2tlbicpO1xuICpcbiAqICAgaWYgKCF0b2tlbikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ01pc3NpbmcgdG9rZW4nLCB7IHN0YXR1czogNDAwIH0pO1xuICogICB9XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdW1lV2ViaG9vayh0b2tlbiwgcmVxdWVzdCk7XG4gKiAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ1dlYmhvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVXZWJob29rKFxuICB0b2tlbjogc3RyaW5nLFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIC8vIFQwIG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93LiBFdmVyeXRoaW5nIGJlbG93ICh0aGUgYnktdG9rZW4gbG9va3VwLFxuICAvLyB0aGUgcnVuLWtleSByZXNvbHV0aW9uIGl0IG1heSB0cmlnZ2VyLCBhbmQgdGhlIGByZXNwb25kV2l0aGAgc2V0dXApIGlzXG4gIC8vIHJlYWwgcHJvZHVjZXItc2lkZSBsYXRlbmN5IG9uIHRoaXMgcGF0aCwgc28gdGhlIHdpbmRvdyBoYXMgdG8gb3BlbiBoZXJlXG4gIC8vIGFuZCBub3QgaW5zaWRlIGByZXN1bWVIb29rSW1wbGA7IG90aGVyd2lzZSB3ZWJob29rIHJlc3VtZXMgd291bGQgcmVwb3J0IGFcbiAgLy8gc3lzdGVtYXRpY2FsbHkgc2hvcnRlciB0b3RhbCB0aGFuIGByZXN1bWVIb29rYCBvbmVzIGludG8gdGhlIHNhbWUgbWV0cmljLlxuICBjb25zdCByZXN1bWVSZXF1ZXN0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgY29uc3QgeyBob29rLCBtZXRhZGF0YUVuY3J5cHRpb25LZXkgfSA9IHdpdGhMYXp5TWV0YWRhdGEoXG4gICAgYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbilcbiAgKTtcblxuICAvLyBPbmx5IHdlYmhvb2tzIGNhbiBiZSByZXN1bWVkIHZpYSB0aGUgcHVibGljIGVuZHBvaW50LlxuICAvLyBJZiB0aGUgaG9vayB3YXMgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpIChpc1dlYmhvb2sgIT09IHRydWUpLFxuICAvLyB0aHJvdyB0aGUgc2FtZSBcIm5vdCBmb3VuZFwiIGVycm9yIHRoZSB3b3JsZCB3b3VsZCB0aHJvdyBmb3IgYSBtaXNzaW5nXG4gIC8vIHRva2VuLiBUaGlzIHByZXZlbnRzIGxlYWtpbmcgdGhhdCB0aGUgdG9rZW4gaXMgdmFsaWQuXG4gIGlmIChob29rLmlzV2ViaG9vayA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IodG9rZW4pO1xuICB9XG5cbiAgLy8gYHJlc3BvbmRXaXRoYCBsaXZlcyBpbiB0aGUgaG9vaydzIG1ldGFkYXRhLCBzbyB0aGlzIGlzIHRoZSBvbmUgcmVzdW1lIHBhdGhcbiAgLy8gdGhhdCBoYXMgdG8gcmVhZCBpdC4gT25seSBhIHdlYmhvb2sgdGhhdCBhY3R1YWxseSBzdG9yZWQgbWV0YWRhdGEgcGF5cyBmb3JcbiAgLy8gdGhlIGh5ZHJhdGlvbjogdGhlIGNvbW1vbiBkZWZhdWx0IHdlYmhvb2sg4oCUIGNyZWF0ZVdlYmhvb2soKSB3aXRoIG5vXG4gIC8vIGByZXNwb25kV2l0aGAg4oCUIHN0b3JlcyBub25lLCBzbyB0aGlzIHJlc29sdmVzIGB1bmRlZmluZWRgIHdpdGggbm8gfjM1MG1zXG4gIC8vIGBydW4ta2V5YCBBUEkgcm91bmQgdHJpcCwgYW5kIGhhbmRzIGByZXN1bWVIb29rYCBubyBrZXksIGxlYXZpbmcgaXQgZnJlZSB0b1xuICAvLyBzZWFsIHRoZSBwYXlsb2FkIHRvIHRoZSBydW4ncyBwdWJsaXNoZWQgcHVibGljIGtleSBpbnN0ZWFkLlxuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGhvb2subWV0YWRhdGE7XG5cbiAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtPFJlc3BvbnNlPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG1ldGFkYXRhICYmIHR5cGVvZiBtZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgJ3Jlc3BvbmRXaXRoJyBpbiBtZXRhZGF0YSkge1xuICAgIGlmIChtZXRhZGF0YS5yZXNwb25kV2l0aCA9PT0gJ21hbnVhbCcpIHtcbiAgICAgIGNvbnN0IHsgcmVhZGFibGUsIHdyaXRhYmxlIH0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFJlc3BvbnNlLCBSZXNwb25zZT4oKTtcbiAgICAgIHJlc3BvbnNlUmVhZGFibGUgPSByZWFkYWJsZTtcblxuICAgICAgLy8gVGhlIHJlcXVlc3QgaW5zdGFuY2UgaW5jbHVkZXMgdGhlIHdyaXRhYmxlIHN0cmVhbSB3aGljaCB3aWxsIGJlIHVzZWRcbiAgICAgIC8vIHRvIHdyaXRlIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBydW5cbiAgICAgIChyZXF1ZXN0IGFzIGFueSlbV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRV0gPSB3cml0YWJsZTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLnJlc3BvbmRXaXRoIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIHJlc3BvbnNlID0gbWV0YWRhdGEucmVzcG9uZFdpdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgXFxgcmVzcG9uZFdpdGhcXGAgdmFsdWU6ICR7bWV0YWRhdGEucmVzcG9uZFdpdGh9YCxcbiAgICAgICAgeyBzbHVnOiBFUlJPUl9TTFVHUy5XRUJIT09LX0lOVkFMSURfUkVTUE9ORF9XSVRIX1ZBTFVFIH1cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vIGByZXNwb25kV2l0aGAgdmFsdWUgaW1wbGllcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiByZXR1cm5pbmcgYSAyMDJcbiAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMjAyIH0pO1xuICB9XG5cbiAgLy8gYGhvb2tgIHdhcyBqdXN0IGZldGNoZWQgYnkgdG9rZW4gYWJvdmUsIHNvIGl0cyByZXNwb25zZS1vbmx5XG4gIC8vIGByZXN1bWVDYXBhYmlsaXRpZXNgIHJlZmxlY3RzIHRoZSBsaXZlIGJhY2tlbmQuIENhbGwgdGhlIGludGVybmFsXG4gIC8vIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGZyZXNoIGF0dGVzdGF0aW9uIHNvIHRoZSB3cml0ZSdzIGlkZW1wb3RlbmN5IGNsYWltXG4gIC8vIHN0YXlzIGF2YWlsYWJsZSB3aXRob3V0IGEgc2Vjb25kIEdFVC4gKFRoZSBwdWJsaWMgYHJlc3VtZUhvb2tgIG5ldmVyIHNldHNcbiAgLy8gdGhpcywgc28gYSBjYWxsZXIgY2Fubm90IGZvcmdlIGl0LilcbiAgLy9cbiAgLy8gUmV1c2Ugd2hhdGV2ZXIga2V5IHRoZSBtZXRhZGF0YSBoeWRyYXRpb24gYWJvdmUgcmVzb2x2ZWQgKGB1bmRlZmluZWRgIHdoZW5cbiAgLy8gaXQgcmVzb2x2ZWQgbm9uZSkgc28gYSBtZXRhZGF0YS1iZWFyaW5nIHdlYmhvb2sgcmVzb2x2ZXMgdGhlIHJ1biBrZXlcbiAgLy8gZXhhY3RseSBvbmNlIGVuZCB0byBlbmQuXG4gIGF3YWl0IHJlc3VtZUhvb2tJbXBsKFxuICAgIGhvb2ssXG4gICAgcmVxdWVzdCxcbiAgICBtZXRhZGF0YUVuY3J5cHRpb25LZXkoKSxcbiAgICB0cnVlLFxuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXNcbiAgKTtcblxuICBpZiAocmVzcG9uc2VSZWFkYWJsZSkge1xuICAgIC8vIFdhaXQgZm9yIHRoZSByZWFkYWJsZSBzdHJlYW0gdG8gZW1pdCBvbmUgY2h1bmssXG4gICAgLy8gd2hpY2ggaXMgdGhlIGBSZXNwb25zZWAgb2JqZWN0XG4gICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2VSZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGNodW5rLnZhbHVlKSB7XG4gICAgICByZXNwb25zZSA9IGNodW5rLnZhbHVlO1xuICAgIH1cbiAgICByZWFkZXIuY2FuY2VsKCk7XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXb3JrZmxvdyBydW4gZGlkIG5vdCBzZW5kIGEgcmVzcG9uc2UnLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5XRUJIT09LX1JFU1BPTlNFX05PVF9TRU5ULFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuIl19
|
package/dist/runtime.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { type Event, type WorkflowRun } from '@workflow/world';
|
|
|
2
2
|
export type { Event, WorkflowRun };
|
|
3
3
|
export { WorkflowSuspension } from './global.js';
|
|
4
4
|
export { type HealthCheckOptions, type HealthCheckResult, healthCheck, } from './runtime/helpers.js';
|
|
5
|
-
export { getHookByToken, type ResumedHook, resumeHook, resumeWebhook, } from './runtime/resume-hook.js';
|
|
5
|
+
export { getHookByToken, type Hook, type ResumedHook, resumeHook, resumeWebhook, } from './runtime/resume-hook.js';
|
|
6
6
|
export { getRun, Run, type WorkflowReadableStream, type WorkflowReadableStreamOptions, type WorkflowRunWritableStreamOptions, } from './runtime/run.js';
|
|
7
7
|
export { type CancelRunOptions, cancelRun, cancelRuns, listStreams, type ReadStreamOptions, type RecreateRunOptions, type ReenqueueRunOptions, readStream, recreateRunFromExisting, reenqueueRun, type StopSleepOptions, type StopSleepResult, wakeUpRun, } from './runtime/runs.js';
|
|
8
8
|
export { type StartOptions, type StartOptionsBase, type StartOptionsWithDeploymentId, type StartOptionsWithoutDeploymentId, start, } from './runtime/start.js';
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAqBA,OAAO,EAGL,KAAK,KAAK,EAaV,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AA0GzB,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,KAAK,WAAW,EAChB,UAAU,EACV,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,MAAM,EACN,GAAG,EACH,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,GACtC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,gBAAgB,EACrB,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,UAAU,EACV,uBAAuB,EACvB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAsf5B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAkxIrC"}
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAqBA,OAAO,EAGL,KAAK,KAAK,EAaV,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AA0GzB,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,UAAU,EACV,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,MAAM,EACN,GAAG,EACH,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,GACtC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,gBAAgB,EACrB,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,UAAU,EACV,uBAAuB,EACvB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAsf5B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAkxIrC"}
|