@workflow/core 5.0.0-beta.44 → 5.0.0-beta.46
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/attribute-changes.d.ts +3 -5
- package/dist/attribute-changes.d.ts.map +1 -1
- package/dist/attribute-changes.js +2 -2
- package/dist/capabilities.d.ts +2 -2
- package/dist/capabilities.js +4 -4
- package/dist/events-consumer.d.ts +1 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +3 -2
- package/dist/flushable-stream.js +2 -2
- package/dist/global.d.ts +3 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -5
- package/dist/private.d.ts +9 -7
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +11 -1
- package/dist/runtime/helpers.d.ts +3 -3
- package/dist/runtime/helpers.js +1 -1
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +8 -1
- package/dist/runtime/quickjs-runtime.js +7 -1
- package/dist/runtime/resume-hook.d.ts +27 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +182 -182
- package/dist/runtime/resume-latency.d.ts +16 -6
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -2
- package/dist/runtime/run.d.ts +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -2
- package/dist/runtime/start.js +3 -3
- package/dist/runtime/step-latency.d.ts +31 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +19 -13
- package/dist/runtime/suspension-handler.d.ts +9 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +41 -41
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +133 -66
- package/dist/serialization/hardened.d.ts +5 -4
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +7 -1
- package/dist/serialization-format.js +2 -2
- package/dist/serialization.d.ts +5 -6
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +19 -12
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +3 -11
- package/dist/telemetry/semantic-conventions.d.ts +14 -5
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +13 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
- package/dist/workflow/attribute-dispatcher.js +3 -6
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +6 -15
- package/dist/workflow.js +7 -8
- package/package.json +4 -4
|
@@ -3,6 +3,7 @@ import { AttributeValidationError, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_C
|
|
|
3
3
|
import { isRetryableWorldError } from '../classify-error.js';
|
|
4
4
|
import { importKey } from '../encryption.js';
|
|
5
5
|
import { runtimeLogger } from '../logger.js';
|
|
6
|
+
import { GUEST_CODE_EXECUTION_SAMPLE_LIMIT, } from '../serialization/hardened.js';
|
|
6
7
|
import { dehydrateStepArguments, dehydrateStepError, } from '../serialization.js';
|
|
7
8
|
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
8
9
|
import { getAbortStreamIdFromToken } from '../util.js';
|
|
@@ -164,10 +165,10 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
164
165
|
return result;
|
|
165
166
|
};
|
|
166
167
|
// Separate queue items by type
|
|
167
|
-
const stepItems = suspension.
|
|
168
|
-
const allHookItems = suspension.
|
|
169
|
-
const waitItems = suspension.
|
|
170
|
-
const attributeItems = suspension.
|
|
168
|
+
const stepItems = suspension.items.filter((item) => item.type === 'step');
|
|
169
|
+
const allHookItems = suspension.items.filter((item) => item.type === 'hook');
|
|
170
|
+
const waitItems = suspension.items.filter((item) => item.type === 'wait');
|
|
171
|
+
const attributeItems = suspension.items.filter((item) => item.type === 'attribute');
|
|
171
172
|
const hooksNeedingCreation = allHookItems.filter((item) => !item.hasCreatedEvent);
|
|
172
173
|
// Group hook items that need work by token, preserving queue-insertion
|
|
173
174
|
// (workflow code) order within each token. Operations on one token must
|
|
@@ -195,6 +196,21 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
195
196
|
const encryptionKey = rawKey ? await importKey(rawKey) : undefined;
|
|
196
197
|
// Gate payload compression on the run's specVersion.
|
|
197
198
|
const compression = (run.specVersion ?? 0) >= SPEC_VERSION_SUPPORTS_COMPRESSION;
|
|
199
|
+
let serializationBlockerCount = 0;
|
|
200
|
+
const serializationBlockers = [];
|
|
201
|
+
async function dehydrateInput(value, context) {
|
|
202
|
+
const stats = { executions: [] };
|
|
203
|
+
try {
|
|
204
|
+
return (await dehydrateStepArguments(value, runId, encryptionKey, suspension.globalThis, false, compression, stats));
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
serializationBlockerCount +=
|
|
208
|
+
stats.totalExecutions ?? stats.executions.length;
|
|
209
|
+
serializationBlockers.push(...stats.executions
|
|
210
|
+
.slice(0, GUEST_CODE_EXECUTION_SAMPLE_LIMIT - serializationBlockers.length)
|
|
211
|
+
.map((execution) => ({ ...context, ...execution })));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
198
214
|
async function disposeHook(queueItem) {
|
|
199
215
|
const hookDisposedEvent = {
|
|
200
216
|
eventType: 'hook_disposed',
|
|
@@ -251,7 +267,10 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
251
267
|
if (!queueItem.hasCreatedEvent) {
|
|
252
268
|
const hookMetadata = typeof queueItem.metadata === 'undefined'
|
|
253
269
|
? undefined
|
|
254
|
-
:
|
|
270
|
+
: await dehydrateInput(queueItem.metadata, {
|
|
271
|
+
source: 'hook_metadata',
|
|
272
|
+
correlationId: queueItem.correlationId,
|
|
273
|
+
});
|
|
255
274
|
const hookEvent = {
|
|
256
275
|
eventType: 'hook_created',
|
|
257
276
|
specVersion: SPEC_VERSION_CURRENT,
|
|
@@ -292,7 +311,13 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
292
311
|
await settlePhase(hooksNeedingAbort.map(async (queueItem) => {
|
|
293
312
|
try {
|
|
294
313
|
// Dehydrate the abort payload for storage
|
|
295
|
-
const abortPayload = await
|
|
314
|
+
const abortPayload = await dehydrateInput({
|
|
315
|
+
aborted: true,
|
|
316
|
+
reason: queueItem.abortReason,
|
|
317
|
+
}, {
|
|
318
|
+
source: 'hook_abort',
|
|
319
|
+
correlationId: queueItem.correlationId,
|
|
320
|
+
});
|
|
296
321
|
// Create hook_received event with abort payload
|
|
297
322
|
await createGuarded({
|
|
298
323
|
eventType: 'hook_received',
|
|
@@ -452,17 +477,6 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
452
477
|
// ends in a forced replay anyway.)
|
|
453
478
|
lazyInlineCorrelationIds.delete(queueItem.correlationId);
|
|
454
479
|
};
|
|
455
|
-
// Serialization always runs through the one ordinary path below, so the
|
|
456
|
-
// durable bytes cannot depend on retention. What retention needs to know is
|
|
457
|
-
// whether that serialization *executed* workflow code (getters, proxy
|
|
458
|
-
// traps, custom serializers): side effects a cold replay would not
|
|
459
|
-
// repeat, since a replay skips dehydration for already-recorded steps.
|
|
460
|
-
// The hardened serializer records exactly that into this sink (see
|
|
461
|
-
// ../serialization/hardened.ts); when any input in the batch records an
|
|
462
|
-
// execution, the caller demotes the session so the side effects land in a
|
|
463
|
-
// VM that is about to be discarded, exactly like the pre-retention
|
|
464
|
-
// runtime.
|
|
465
|
-
const guestCodeStats = { executions: [] };
|
|
466
480
|
// Lazy inline start: defer the step_created write for up to
|
|
467
481
|
// `getMaxInlineSteps()` steps the caller will run inline (in parallel). Each
|
|
468
482
|
// step is created on the fly by the lazy `step_started` executeStep sends
|
|
@@ -582,22 +596,18 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
582
596
|
const stepOrder = batchOrderCounter;
|
|
583
597
|
batchOrderCounter += pairFolded ? 2 : 1;
|
|
584
598
|
const stepOp = (async () => {
|
|
585
|
-
// Per-step sink, merged below: the dehydrate wrapper emits span
|
|
586
|
-
// attributes from the sink it is handed, so sharing one across
|
|
587
|
-
// steps would re-emit (and misattribute) earlier steps' entries.
|
|
588
|
-
const stepGuestCode = { executions: [] };
|
|
589
599
|
let dehydratedInput;
|
|
590
600
|
try {
|
|
591
|
-
dehydratedInput = await
|
|
601
|
+
dehydratedInput = await dehydrateInput({
|
|
592
602
|
args: queueItem.args,
|
|
593
603
|
closureVars: queueItem.closureVars,
|
|
594
604
|
thisVal: queueItem.thisVal,
|
|
595
|
-
},
|
|
605
|
+
}, {
|
|
606
|
+
source: 'step_input',
|
|
607
|
+
correlationId: queueItem.correlationId,
|
|
608
|
+
});
|
|
596
609
|
}
|
|
597
610
|
catch (err) {
|
|
598
|
-
// The sink records executions as they happen, so guest code that
|
|
599
|
-
// ran before the failure still counts against retention.
|
|
600
|
-
guestCodeStats.executions.push(...stepGuestCode.executions);
|
|
601
611
|
if (!SerializationError.is(err)) {
|
|
602
612
|
// e.g. RuntimeDecryptionError: an SDK fault, not a user value
|
|
603
613
|
// problem. Keep its identity (RUNTIME_ERROR) and current
|
|
@@ -618,8 +628,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
618
628
|
await finalizeUnserializableStep(queueItem, err);
|
|
619
629
|
return;
|
|
620
630
|
}
|
|
621
|
-
|
|
622
|
-
// Deferred (lazy) inline step: skip the step_created write; the
|
|
631
|
+
// Deferred (lazy) inline step: skip the step_created write — the
|
|
623
632
|
// caller's inline executeStep will send a lazy step_started carrying
|
|
624
633
|
// this input, and the world creates the step (entity + synthetic
|
|
625
634
|
// step_created event) atomically. We do NOT add it to
|
|
@@ -629,7 +638,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
629
638
|
lazyInlineByCorrelationId.set(queueItem.correlationId, {
|
|
630
639
|
correlationId: queueItem.correlationId,
|
|
631
640
|
stepName: queueItem.stepName,
|
|
632
|
-
dehydratedInput
|
|
641
|
+
dehydratedInput,
|
|
633
642
|
});
|
|
634
643
|
if (pairFolded) {
|
|
635
644
|
// Enqueue the pair the deferral would otherwise leave to the
|
|
@@ -1258,16 +1267,6 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1258
1267
|
// message is not acked and VQS redelivers, re-creates the (idempotent)
|
|
1259
1268
|
// step_created and re-dispatches, and recovers the run instead of orphaning it.
|
|
1260
1269
|
await settlePhase(ops);
|
|
1261
|
-
// The step-input dehydrations above have settled, so the sink is final.
|
|
1262
|
-
const retainedStepInputsSafe = guestCodeStats.executions.length === 0;
|
|
1263
|
-
if (!retainedStepInputsSafe) {
|
|
1264
|
-
runtimeLogger.debug('Serializing step inputs executed workflow code; falling back to replay instead of retaining the VM', {
|
|
1265
|
-
workflowRunId: runId,
|
|
1266
|
-
executions: guestCodeStats.executions
|
|
1267
|
-
.slice(0, 5)
|
|
1268
|
-
.map((e) => (e.detail ? `${e.kind}(${e.detail})` : e.kind)),
|
|
1269
|
-
});
|
|
1270
|
-
}
|
|
1271
1270
|
// Rebuild the inline batch in deterministic order. `lazyInlineCorrelationIds`
|
|
1272
1271
|
// is a Set seeded from the ordered first-N slice, so iterating it preserves
|
|
1273
1272
|
// stepItems order; every id in it was set by the lazy branch above.
|
|
@@ -1320,7 +1319,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1320
1319
|
hasAttributeEvents: attributeItems.length > 0,
|
|
1321
1320
|
hasHookEvents: hooksNeedingCreation.length > 0,
|
|
1322
1321
|
hookCreationMs,
|
|
1323
|
-
|
|
1322
|
+
serializationBlockerCount,
|
|
1323
|
+
serializationBlockers,
|
|
1324
1324
|
reportedEventCount: reportedEvents,
|
|
1325
1325
|
};
|
|
1326
1326
|
}
|
|
@@ -1341,4 +1341,4 @@ function isWorldValidationFailure(err) {
|
|
|
1341
1341
|
}
|
|
1342
1342
|
return WorkflowWorldError.is(err) && err.status === 400;
|
|
1343
1343
|
}
|
|
1344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VzcGVuc2lvbi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBS3hCLG9CQUFvQixFQUNwQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1DQUFtQyxHQU1wQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVE3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsOEJBQThCLEVBQzlCLHVCQUF1QixFQUN2Qiw4QkFBOEIsR0FDL0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBR3ZCLFlBQVksRUFDWixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLDBCQUEwQixHQUMzQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztB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Q3RCLGtCQUFrQixFQUFFLGNBQWM7S0FDbkMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsd0JBQXdCLENBQUMsR0FBWTtJQUM1QyxJQUFJLEdBQUcsWUFBWSx3QkFBd0I7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6RCxJQUFJLEdBQUcsWUFBWSxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksS0FBSywwQkFBMEIsRUFBRSxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sa0JBQWtCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcixcbiAgdHlwZSBDcmVhdGVFdmVudFBhcmFtcyxcbiAgdHlwZSBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHR5cGUgRXZlbnRSZXN1bHQsXG4gIHR5cGUgU2VyaWFsaXplZERhdGEsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFksXG4gIHR5cGUgU3RhcnRlZFN0ZXAsXG4gIHR5cGUgVHJhY2VDYXJyaWVyLFxuICB0eXBlIFZhbGlkUXVldWVOYW1lLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtLFxuICBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV2FpdEludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIFdvcmtmbG93U3VzcGVuc2lvbixcbn0gZnJvbSAnLi4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBHdWVzdENvZGVTdGF0cyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgZGVoeWRyYXRlU3RlcEVycm9yLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZEZyb21Ub2tlbiB9IGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vY29tcHV0ZS1pbnN0YW5jZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNYXhJbmxpbmVTdGVwcyxcbiAgaXNCYXRjaFRyYW5zaXRpb25zRW5hYmxlZCxcbiAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkLFxuICBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UUyxcbiAgTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydCxcbiAgdHlwZSBFdmVudENyZWF0b3IsXG4gIHR5cGUgTG9hZGVkRXZlbnRMb2csXG4gIG1heEV2ZW50U2xvdCxcbiAgcXVldWVNZXNzYWdlLFxuICBzbG90U25hcHNob3RQYXJhbXMsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlciB9IGZyb20gJy4vcmVwbGF5LXJlY292ZXJ5LXJlcG9ydGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUHJlY2xhaW1lZElubGluZVN0YXJ0IH0gZnJvbSAnLi9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IHVuc2VyaWFsaXphYmxlU3RlcElucHV0UGxhY2Vob2xkZXIgfSBmcm9tICcuL3Vuc2VyaWFsaXphYmxlLXN0ZXAuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zIHtcbiAgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bjogV29ya2Zsb3dSdW47XG4gIHNwYW4/OiBTcGFuO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVudGltZSdzIGxvYWRlZCBldmVudCBsb2cuIEV2ZXJ5IGV2ZW50IGNyZWF0aW9uIHRoaXMgc3VzcGVuc2lvbiBtYWtlc1xuICAgKiBuYW1lcyB0aGUgcG9zaXRpb24gaXQgd2FzIGRlcml2ZWQgZnJvbSwgc28gYSBiYWNrZW5kIHRoYXQgaGFzIHJlY29yZGVkXG4gICAqIGV2ZW50cyB0aGUgcmVwbGF5IGRpZCBub3Qgc2VlIGNhbiByZXBvcnQgdGhlbSBiYWNrIG9uIHRoZSB3cml0ZSwgb3IsIGlmXG4gICAqIGl0IHdvdWxkIHJhdGhlciByZWZ1c2UgdGhhbiByZXBvcnQsIHJlamVjdCBpdCB3aXRoIGEgNDEyLiBBIHJlamVjdGlvbiBpc1xuICAgKiBub3QgcmV0cmllZCBoZXJlOiB0aGUgZXZlbnQncyBjb3JyZWxhdGlvbiBpZCB3YXMgbWludGVkIGJ5ICp0aGlzKiByZXBsYXknc1xuICAgKiBzZWVkZWQgc2VxdWVuY2UsIHNvIHJlLWNvbW1pdHRpbmcgaXQgYWdhaW5zdCBhIGNvcnJlY3RlZCBsb2cgd291bGQgcGVyc2lzdFxuICAgKiBhbiBldmVudCBubyBjb3JyZWN0IHJlcGxheSBwcm9kdWNlcy4gVGhlIGNhbGxlciByZXN0YXJ0cyB0aGUgcmVwbGF5XG4gICAqIGluc3RlYWQuXG4gICAqL1xuICBldmVudExvZz86IExvYWRlZEV2ZW50TG9nO1xuICAvKipcbiAgICogVHVyYm8gbW9kZSBvbmx5OiBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICogYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkICh0aGUgcnVuIGV4aXN0cykuIFdoZW4gcHJlc2VudCwgZXZlcnkgd29ybGQgd3JpdGVcbiAgICogdGhpcyBzdXNwZW5zaW9uIHBlcmZvcm1zIChgaG9va19jcmVhdGVkYCwgYHdhaXRfY3JlYXRlZGAsIGVhZ2VyIG92ZXJmbG93XG4gICAqIGBzdGVwX2NyZWF0ZWRgLCDigKYpIGlzIGdhdGVkIG9uIGl0IHNvIHRoZSB3cml0ZSBuZXZlciByYWNlcyBhaGVhZCBvZiB0aGVcbiAgICogcnVuJ3MgY3JlYXRpb24uIFRoZSBwdXJlIGlubGluZSBob3QgcGF0aCBkZWZlcnMgYWxsIG9mIGl0cyBzdGVwcyBhbmQgd3JpdGVzXG4gICAqIG5vdGhpbmcgaGVyZSwgc28gaXQgbmV2ZXIgYXdhaXRzIHRoaXMgYmFycmllci4gYHVuZGVmaW5lZGAgb3V0c2lkZSB0dXJibyxcbiAgICogd2hlcmUgYHJ1bl9zdGFydGVkYCB3YXMgYWxyZWFkeSBhd2FpdGVkIHVwIGZyb250LlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIE9uZS1zaG90IHRlbGVtZXRyeSByZXBvcnRlciwgYWN0aXZhdGVkIG9ubHkgYWZ0ZXIgcmVwbGF5IGhhcyByZWNvdmVyZWQuICovXG4gIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXI/OiBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyO1xuICAvKipcbiAgICogUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IHdoZW4gcHJvdmlkZWQgKGFuZCB0aGUgcGVyLXN0ZXAgZWxpZ2liaWxpdHkgZ2F0ZXNcbiAgICogcGFzcywgc2VlIHRoZSBzdGVwIG9wcyBiZWxvdyksIGVhY2ggbmV3bHkgY3JlYXRlZCBub24taW5saW5lIHN0ZXAnc1xuICAgKiBgc3RlcF9jcmVhdGVkYCB3cml0ZSBpcyBwYXJhbGxlbGl6ZWQgd2l0aCBpdHMgc3RlcC1leGVjdXRpb24gcXVldWVcbiAgICogcHVibGlzaCwgYW5kIHRoZSBxdWV1ZSBtZXNzYWdlIGNhcnJpZXMgdGhlIHNlcmlhbGl6ZWQgc3RlcCBpbnB1dFxuICAgKiAoYHN0ZXBJbnB1dGApIHNvIHRoZSBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlXG4gICAqIGRpcmVjdCB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkuIFN0ZXBzIHF1ZXVlZCB0aGlzIHdheSBhcmUgcmVwb3J0ZWQgaW5cbiAgICoge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LnF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc30gc28gdGhlIGNhbGxlclxuICAgKiBza2lwcyB0aGVtIGluIGl0cyBvd24gZGlzcGF0Y2ggcGFzcy4gT21pdHRlZCBieSBjYWxsZXJzIHRoYXQgbXVzdCBub3RcbiAgICogcXVldWUgKHRlcm1pbmFsIGRyYWluLCB0ZXN0cyk7IGNyZWF0ZXMgdGhlbiBiZWhhdmUgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAqL1xuICBzdGVwRGlzcGF0Y2g/OiB7XG4gICAgLyoqIFRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlIHRoaXMgcnVuJ3Mgc3RlcCBtZXNzYWdlcyBhcmUgcHVibGlzaGVkIHRvLiAqL1xuICAgIHF1ZXVlTmFtZTogVmFsaWRRdWV1ZU5hbWU7XG4gICAgLyoqXG4gICAgICogTGF6aWx5IHJlc29sdmVzIHRoZSB0cmFjZSBjYXJyaWVyIHRvIHN0YW1wIG9uIHRoZSBzdGVwIG1lc3NhZ2VzLlxuICAgICAqIENhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHN1c3BlbnNpb24gKG1lbW9pemVkIGhlcmUpLlxuICAgICAqL1xuICAgIGdldFRyYWNlQ2FycmllcjogKCkgPT4gUHJvbWlzZTxUcmFjZUNhcnJpZXI+O1xuICB9O1xuICAvKipcbiAgICogSW5saW5lIHN0ZXAgb3duZXJzaGlwOiB0aGUgcXVldWUgbWVzc2FnZSBJRCBvZiB0aGUgaW52b2NhdGlvbiB0aGlzXG4gICAqIHN1c3BlbnNpb24gcnVucyBpbiAodGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhKS4gV2hlbiBwcmVzZW50IEFORCB0aGVcbiAgICogYmF0Y2hlZCBmYW4tb3V0IGVuZ2FnZXMsIHRoZSBsYXp5LWlubGluZSBzdGVwcycgZGVmZXJyZWQgd3JpdGVzIGFyZVxuICAgKiBmb2xkZWQgaW50byB0aGUgYmF0Y2ggYXMgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlycyAodGhlXG4gICAqIHN0YXJ0ZWQgcm93IHN0YW1wZWQgd2l0aCB0aGlzIElELCBleGFjdGx5IGxpa2UgdGhlIGxhenkgY2xhaW0gaXRcbiAgICogcmVwbGFjZXMpLCBwcmUtY2xhaW1pbmcgdGhlIHN0ZXBzIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gcnVuIGlubGluZS4gU2VlXG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5pbmxpbmVDbGFpbXN9LiBDYWxsZXJzIHRoYXQgbmV2ZXJcbiAgICogaW5saW5lLWV4ZWN1dGUgKHRlcm1pbmFsIGRyYWluKSBvbWl0IGl0LCBrZWVwaW5nIHRoZWlyIGxhenkgc3RlcHMgb24gdGhlXG4gICAqIHBsYWluIGRlZmVycmVkIHBhdGguXG4gICAqL1xuICBvd25lck1lc3NhZ2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIExldHMgdGhlIGJhdGNoZWQgZmFuLW91dCByZXR1cm4gYmVmb3JlIGV2ZXJ5IGNodW5rIGhhcyBjb21taXR0ZWQ6IG9ubHlcbiAgICogdGhlIGNodW5rIGNhcnJ5aW5nIHRoZSBwcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnMgZ2F0ZXMgdGhlIGhhbmRsZXInc1xuICAgKiByZXR1cm4gKGl0cyBjbGFpbXMgYXJlIHdoYXQgdGhlIGNhbGxlciBzdGFydHMgYm9kaWVzIGZyb20pLCB3aGlsZSB0aGVcbiAgICogdHJhaWxpbmcgY2h1bmtzJyBjb21taXRzIChhbmQgZXZlcnkgY2h1bmsncyBpbi1mbHVzaCBzdGVwLW1lc3NhZ2VcbiAgICogcHVibGlzaGVzKSByaWRlIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5kZWZlcnJlZEJhdGNoV29ya30uIEFcbiAgICogY2FsbGVyIHRoYXQgb3B0cyBpbiBNVVNUIGF3YWl0IHRoYXQgcHJvbWlzZSBiZWZvcmUgYWNraW5nIGl0cyBkZWxpdmVyeTpcbiAgICogdGhlIGR1cmFiaWxpdHkgY29udHJhY3QgKFwiZXZlcnkgY3JlYXRlIGR1cmFibGUgYmVmb3JlIGFja1wiKSBtb3ZlcyBmcm9tXG4gICAqIHRoZSBoYW5kbGVyJ3MgcmV0dXJuIHRvIHRoYXQgam9pbiwgYW5kIG5vdGhpbmcgZWxzZSByZS1kcml2ZXMgYSBsb3N0XG4gICAqIHRyYWlsaW5nIGNodW5rLiBDYWxsZXJzIHRoYXQgZG9uJ3Qgb3B0IGluICh0ZXJtaW5hbCBkcmFpbiwgZGVmYXVsdClcbiAgICoga2VlcCB0aGUgZXZlcnl0aGluZy1kdXJhYmxlLWF0LXJldHVybiBiZWhhdmlvci5cbiAgICovXG4gIGFsbG93RGVmZXJyZWRCYXRjaFdvcms/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBoYW5kbGluZyBhIHN1c3BlbnNpb24uIFJldHVybnMgcGVuZGluZyBzdGVwIGl0ZW1zIHNvIHRoZSBjYWxsZXJcbiAqIGNhbiBkZWNpZGUgd2hpY2ggdG8gZXhlY3V0ZSBpbmxpbmUgdnMgcXVldWUgdG8gYmFja2dyb3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdCB7XG4gIC8qKiBQZW5kaW5nIHN0ZXAgaXRlbXMgd2l0aCBldmVudHMgY3JlYXRlZCBidXQgTk9UIHF1ZXVlZCAqL1xuICBwZW5kaW5nU3RlcHM6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtW107XG4gIC8qKlxuICAgKiBDb3JyZWxhdGlvbiBJRHMgZm9yIHdoaWNoIHRoaXMgc3VzcGVuc2lvbiBjYWxsIGFjdHVhbGx5IHdyb3RlIHRoZVxuICAgKiBzdGVwX2NyZWF0ZWQgZXZlbnQgKGFzIG9wcG9zZWQgdG8gY2F0Y2hpbmcgRW50aXR5Q29uZmxpY3RFcnJvciBiZWNhdXNlXG4gICAqIGEgY29uY3VycmVudCBoYW5kbGVyIHdyb3RlIGl0IGZpcnN0KS4gT25seSB0aGUgaGFuZGxlciB0aGF0IHdyb3RlIHRoZVxuICAgKiBzdGVwX2NyZWF0ZWQgZXZlbnQgc2hvdWxkIHF1ZXVlIC8gaW5saW5lLWV4ZWN1dGUgdGhlIHN0ZXA7IHRoaXNcbiAgICogZ3VhcmFudGVlcyBhIHNpbmdsZSBvd25lciBwZXIgc3RlcCwgZXZlbiB3aGVuIG11bHRpcGxlIGhhbmRsZXJzIHJhY2VcbiAgICogaW50byB0aGUgc2FtZSBiYXRjaCBib3VuZGFyeS5cbiAgICovXG4gIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHdob3NlIGFyZ3VtZW50cyBmYWlsZWQgdG8gc2VyaWFsaXplLiBFYWNoIHdhc1xuICAgKiBmaW5hbGl6ZWQgaGVyZSBhcyBgc3RlcF9jcmVhdGVkYCAod2l0aCBhIHBsYWNlaG9sZGVyIGlucHV0OyB0aGUgcmVhbFxuICAgKiBpbnB1dCBpcyBwcmVjaXNlbHkgd2hhdCByZWZ1c2VkIHRvIHNlcmlhbGl6ZSkgZm9sbG93ZWQgYnkgYHN0ZXBfZmFpbGVkYFxuICAgKiBjYXJyeWluZyB0aGUgU2VyaWFsaXphdGlvbkVycm9yLCBzbyB0aGUgbmV4dCByZXBsYXkgcmVqZWN0cyB0aGUgc3RlcCdzXG4gICAqIHByb21pc2UgYW5kIGEgdHJ5L2NhdGNoIGFyb3VuZCB0aGUgc3RlcCBjYWxsIG9ic2VydmVzIHRoZSBlcnJvcixcbiAgICogZXhhY3RseSBsaWtlIGEgc3RlcC1ib2R5IGZhaWx1cmUuIE5vIHN0ZXAtZXhlY3V0aW9uIG1lc3NhZ2UgaXNcbiAgICogZGlzcGF0Y2hlZCBmb3IgdGhlc2UsIHNvIHRoZSBjYWxsZXIgTVVTVCBmb3JjZSBhbiBpbi1wcm9jZXNzIHJlcGxheTpcbiAgICogd2hlbiB0aGUgZmFpbGVkIHN0ZXAgd2FzIHRoZSBvbmx5IHBlbmRpbmcgd29yaywgbm90aGluZyBlbHNlIHdpbGwgZXZlclxuICAgKiByZS1pbnZva2UgdGhlIHJ1biB0byBvYnNlcnZlIHRoZSB0ZXJtaW5hbCBldmVudC5cbiAgICovXG4gIGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkczogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBDb3JyZWxhdGlvbiBJRHMgb2Ygc3RlcHMgdGhpcyBzdXNwZW5zaW9uIGNhbGwgYWxyZWFkeSBwdWJsaXNoZWRcbiAgICogc3RlcC1leGVjdXRpb24gcXVldWUgbWVzc2FnZXMgZm9yLCB2aWEgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggKHRoZVxuICAgKiBgc3RlcF9jcmVhdGVkYCB3cml0ZSBwYXJhbGxlbGl6ZWQgd2l0aCBhIGBzdGVwSW5wdXRgLWNhcnJ5aW5nIHF1ZXVlXG4gICAqIHB1Ymxpc2gpLiBUaGUgY2FsbGVyIE1VU1QgTk9UIGRpc3BhdGNoIHRoZXNlIGFnYWluOiB0aGUgbWVzc2FnZSBpc1xuICAgKiBhbHJlYWR5IG91dCAoYSBkdXBsaWNhdGUgd291bGQgYmUgZGVkdXBlZCBieSBpdHMgaWRlbXBvdGVuY3kga2V5LCBidXRcbiAgICogY29zdHMgYSB3YXN0ZWQgcm91bmQtdHJpcCkuIEVtcHR5IHdoZW4ge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zLnN0ZXBEaXNwYXRjaH1cbiAgICogd2FzIG5vdCBwcm92aWRlZCBvciBubyBzdGVwIHdhcyBlbGlnaWJsZS5cbiAgICovXG4gIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkczogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBIb3cgbWFueSBldmVudHMgdGhpcyBwaGFzZSdzIHdyaXRlcyByZXBvcnRlZCBiYWNrIGFzIG9jY3VweWluZyBzbG90cyB0aGV5XG4gICAqIHNraXBwZWQgb3ZlciwgYWxyZWFkeSBtZXJnZWQgaW50byB0aGUgY2FsbGVyJ3MgYGV2ZW50TG9nLmV2ZW50c2AuIE5vbnplcm9cbiAgICogbWVhbnMgdGhlIGFycmF5IHdhcyByZW9yZGVyZWQgdG8gcmVzdG9yZSBzbG90IG9yZGVyLCBzbyBhbnkgaW5kZXggdGhlXG4gICAqIGNhbGxlciBjYWNoZWQgaW50byBpdCAocGF5bG9hZCBwcmV3YXJtIHNjYW4gcG9zaXRpb24pIGlzIHN0YWxlLlxuICAgKi9cbiAgcmVwb3J0ZWRFdmVudENvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc3RlcHMgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgd3JpdGVzIHdlcmUgaW50ZW50aW9uYWxseSBkZWZlcnJlZCBzbyB0aGVcbiAgICogY2FsbGVyIGNhbiBydW4gdGhlbSBpbmxpbmUgdmlhIGxhenkgYHN0ZXBfc3RhcnRlZGAgZXZlbnRzICh3aGljaCBjcmVhdGVcbiAgICogdGhlIHN0ZXAgb24gdGhlIGZseSksIHNhdmluZyBvbmUgd29ybGQgcm91bmQtdHJpcCBwZXIgaW5saW5lIHN0ZXAuIFVwIHRvXG4gICAqIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyBhcmUgZGVmZXJyZWQ7IHRoZSBjYWxsZXIgcnVucyB0aGVtIGlubGluZSBpblxuICAgKiBwYXJhbGxlbCBhbmQgcXVldWVzIHRoZSByZXN0LiBFbXB0eSB3aGVuIG5vIHN0ZXAgd2FzIGRlZmVycmVkIChub3RoaW5nXG4gICAqIHBlbmRpbmcsIG9yIGEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlciBpcyBwcmVzZW50IHNvIG5vdGhpbmcgaXNcbiAgICogZXhlY3V0ZWQgaW5saW5lKS4gVGhlIGNhbGxlciBwYXNzZXMgZWFjaCBgZGVoeWRyYXRlZElucHV0YCBzdHJhaWdodCB0b1xuICAgKiBgZXhlY3V0ZVN0ZXBgLCB3aGljaCBzZW5kcyBpdCBhcyB0aGUgYHN0ZXBfc3RhcnRlZGAgcGF5bG9hZC4gVGhlIGF0b21pY1xuICAgKiBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggYHN0ZXBfc3RhcnRlZGAgaXMgdGhlIGV4YWN0bHktb25lLW93bmVyIGdhdGUgdGhhdFxuICAgKiB0aGUgc3RhbmRhbG9uZSBgc3RlcF9jcmVhdGVkYCBwcm92aWRlZCBiZWZvcmU6IHRoZSBsb3NlciBvZiB0aGUgcmFjZSBnZXRzXG4gICAqIGBFbnRpdHlDb25mbGljdEVycm9yYCDihpIgYHNraXBwZWRgIGFuZCBkb2VzIG5vdCBydW4gdGhlIGJvZHkuXG4gICAqL1xuICBsYXp5SW5saW5lU3RlcHM6IEFycmF5PHtcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICBkZWh5ZHJhdGVkSW5wdXQ6IFNlcmlhbGl6ZWREYXRhO1xuICB9PjtcbiAgLyoqXG4gICAqIFByZS1jbGFpbWVkIGlubGluZSBzdGFydHMsIGJ5IGNvcnJlbGF0aW9uIGlkOiB0aGUgcGVyLXN0ZXAgdmVyZGljdHMgb2ZcbiAgICogdGhlIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpcnMgdGhlIGJhdGNoZWQgZmFuLW91dCBjb21taXR0ZWRcbiAgICogZm9yIHRoZSBsYXp5LWlubGluZSBzdGVwcy4gQSBzdGVwIHdpdGggYW4gZW50cnkgaGVyZSBpcyBwYXNzZWQgdG9cbiAgICogYGV4ZWN1dGVTdGVwYCBhcyBgcHJlY2xhaW1lZFN0YXJ0YCBJTlNURUFEIG9mIGBsYXp5U3RlcElucHV0YDogaXRzXG4gICAqIGlucHV0IGFscmVhZHkgcm9kZSB0aGUgcGFpciwgYW5kIHRoZSBjbGFpbSBpcyBzZXR0bGVkOiBgb3duZWQ6IHRydWVgXG4gICAqIGNhcnJpZXMgdGhlIHN0YXJ0ZWQgYXR0ZW1wdC0xIGVudGl0eSAoaW5wdXQgcmUtYXR0YWNoZWQpIHNvIHRoZSBib2R5XG4gICAqIHJ1bnMgc3RyYWlnaHQgb2ZmIHRoZSBiYXRjaCBjb21taXQgd2l0aCBubyBzdGFydCB3cml0ZSBvZiBpdHMgb3duO1xuICAgKiBgb3duZWQ6IGZhbHNlYCBsb3N0IHRoZSBwYWlyJ3MgYXRvbWljIGNyZWF0ZS1jbGFpbSB0byBhIGNvbmN1cnJlbnRcbiAgICogd3JpdGVyLCBhbmQgZXhlY3V0ZVN0ZXAgcmV0dXJucyBgc2tpcHBlZGAgd2l0aG91dCBydW5uaW5nIHRoZSBib2R5LFxuICAgKiB0aGUgc2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eSBjbGFpbS4gRW1wdHkgd2hlbmV2ZXIgdGhlIGZvbGQgZGlkXG4gICAqIG5vdCBlbmdhZ2UgKGJhdGNoaW5nIG9mZiwgbm8gYG93bmVyTWVzc2FnZUlkYCwgb3IgdGhlIGxvbmUtaW5saW5lIGNhc2UsXG4gICAqIHdoaWNoIGtlZXBzIHRoZSBvcHRpbWlzdGljIGxhenkgcGF0aCBhbmQgaXRzIGNsYWltL2JvZHkgb3ZlcmxhcCkuXG4gICAqXG4gICAqIENyYXNoIHdpbmRvdzogdGhlIHBhaXIgY29tbWl0cyBiZWZvcmUgdGhlIGNhbGxlciBydW5zIHRoZSBib2R5LCBzbyBhXG4gICAqIGNyYXNoIGJldHdlZW4gdGhlbSBsZWF2ZXMgYSBzdGFydGVkIHN0ZXAgc3RhbXBlZCB3aXRoIHRoaXMgbWVzc2FnZSdzXG4gICAqIElELiBSZWRlbGl2ZXJ5IG9mIHRoZSBzYW1lIG1lc3NhZ2UgcmUtZXhlY3V0ZXMgaXQgdmlhIHRoZSBvd25lZC1yZWNvdmVyeVxuICAgKiBwYXRoLCB0aGUgZXhhY3QgbWFjaGluZXJ5IHRoZSBsYXp5IGNsYWltJ3MgY3Jhc2ggd2luZG93IGFscmVhZHkgdXNlcy5cbiAgICovXG4gIGlubGluZUNsYWltczogTWFwPHN0cmluZywgUHJlY2xhaW1lZElubGluZVN0YXJ0PjtcbiAgLyoqXG4gICAqIFRoZSBoaWdoZXN0IHNsb3QgdGhlIGJhdGNoZWQgZmFuLW91dCBjb21taXR0ZWQsIHdoZW4gaXQgcmFuLiBUaGUgYmF0Y2gnc1xuICAgKiBvd24gZXZlbnRzIGFyZSBub3QgaW4gdGhlIGNhbGxlcidzIGxvYWRlZCBsb2cgKHRoZSBuZXh0IHJlbG9hZCBwaWNrc1xuICAgKiB0aGVtIHVwKSwgc28gdGhlIGNhbGxlciBmb2xkcyB0aGlzIGNlaWxpbmcgaW50byB0aGUgc2xvdCBzbmFwc2hvdCBpdFxuICAgKiBoYW5kcyB0aGUgaW5saW5lIGV4ZWN1dGlvbnM7IG90aGVyd2lzZSBldmVyeSBpbmxpbmUgdGVybWluYWwgd3JpdGVcbiAgICogd291bGQgbmFtZSBhIHByZS1iYXRjaCBwb3NpdGlvbiBhbmQgYmUgYW5zd2VyZWQgd2l0aCBhIHNraXBwZWQtc2xvdFxuICAgKiByZXBvcnQgZWNob2luZyB0aGUgZXZlbnRzIHRoaXMgc3VzcGVuc2lvbiBqdXN0IHdyb3RlLiBVbmRlclxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMuYWxsb3dEZWZlcnJlZEJhdGNoV29ya30gdGhpcyBjb3ZlcnMgdGhlXG4gICAqIGNodW5rcyB0aGF0IGhhZCBjb21taXR0ZWQgYnkgdGhlIGhhbmRsZXIncyByZXR1cm4gKGFsd2F5cyB0aGUgcGFpclxuICAgKiBjaHVuayk7IGEgdHJhaWxpbmcgY2h1bmsgdGhhdCBjb21taXRzIGxhdGVyIGlzIGVjaG9lZCBiYWNrIG9uIHRoZVxuICAgKiB0ZXJtaW5hbCB3cml0ZXMgbGlrZSBhbnkgZm9yZWlnbiBldmVudDogcmVwb3J0cyB0aGUgZXhlY3V0b3IgcmVhZHMgZm9yXG4gICAqIHBvc2l0aW9uIGFuZCBkaXNjYXJkcy5cbiAgICpcbiAgICogU28gdGhlIGVjaG8gaXMgb25seSBmdWxseSBzdXBwcmVzc2VkIGZvciBhIFNJTkdMRS1jaHVuayBmb2xkLiBPbiBhXG4gICAqIG11bHRpLWNodW5rIGZhbi1vdXQgdGhlIGJvZGllcyBzdGFydCBvZmYgdGhlIHBhaXIgY2h1bmsgd2hpbGUgdHJhaWxpbmdcbiAgICogY2h1bmtzIGFyZSBzdGlsbCBpbiBmbGlnaHQsIGFuZCBhbiBpbmxpbmUgdGVybWluYWwgd3JpdGUgaXNzdWVkIGluIHRoYXRcbiAgICogd2luZG93IHN0aWxsIG5hbWVzIGEgcG9zaXRpb24gYmVsb3cgdGhlbSBhbmQgc3RpbGwgZHJhd3MgYSByZXBvcnQgZm9yXG4gICAqIHRoZWlyIGV2ZW50cy4gQm91bmRlZCAodHJhaWxpbmcgY2h1bmtzIG9ubHksIGxhcmdlIGZhbi1vdXRzIG9ubHkpIGFuZFxuICAgKiBzZWxmLWNvcnJlY3Rpbmcgb24gdGhlIG5leHQgcmVsb2FkLCBhbmQgcmVjb3JkZWQgc28gYSByZXBvcnQgc2VlbiB0aGVyZVxuICAgKiByZWFkcyBhcyBleHBlY3RlZCByYXRoZXIgdGhhbiBhcyBhIGJ1Zy5cbiAgICovXG4gIGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmc/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYmF0Y2hlZCBmYW4tb3V0J3MgZGVmZXJyZWQgd29yaywgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGNhbGxlciBvcHRlZFxuICAgKiBpbiB2aWEge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zLmFsbG93RGVmZXJyZWRCYXRjaFdvcmt9IGFuZFxuICAgKiB0cmFpbGluZyB3b3JrIGV4aXN0czogdGhlIGNvbW1pdHMgb2YgZXZlcnkgY2h1bmsgZXhjZXB0IHRoZSBwYWlyIGNodW5rLFxuICAgKiBwbHVzIGV2ZXJ5IGNodW5rJ3Mgc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcyAoZWFjaCBjaGFpbmVkIG9uIElUUyBPV05cbiAgICogY2h1bmsncyBjb21taXQsIHNvIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlIGhvbGRzIHBlciBzdGVwKS4gVGhlIGNhbGxlclxuICAgKiBNVVNUIGF3YWl0IGl0IGJlZm9yZSBhY2tpbmc6IGEgcmVqZWN0aW9uIGhlcmUgaXMgYSBmYWlsZWQgc3VzcGVuc2lvblxuICAgKiB3cml0ZSBhbmQgZmFpbHMgdGhlIGRlbGl2ZXJ5IGV4YWN0bHkgYXMgaXQgd291bGQgaGF2ZSBhdCB0aGUgaGFuZGxlcidzXG4gICAqIHJldHVybi4gU3RlcHMgd2hvc2UgbWVzc2FnZXMgdGhpcyB3b3JrIHB1Ymxpc2hlcyBhcmUgYWxyZWFkeSBpblxuICAgKiB7QGxpbmsgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzfSBhdCByZXR1cm4gdGltZS5cbiAgICovXG4gIGRlZmVycmVkQmF0Y2hXb3JrPzogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCwgaWYgYW55OiBzZWNvbmRzIHVudGlsIGl0IGVsYXBzZXMgYW5kIHRoZVxuICAgKiBjb3JyZWxhdGlvbklkIG9mIHRoZSB3YWl0IHRoYXQgcHJvZHVjZWQgdGhhdCB0aW1lb3V0LiBUaGVcbiAgICogY29ycmVsYXRpb25JZCBzZWVkcyB0aGUgaWRlbXBvdGVuY3kga2V5IGZvciB0aGUgd2FpdC1jb250aW51YXRpb25cbiAgICogcXVldWUgbWVzc2FnZSBzbyB0aGF0IHJlcGVhdGVkIHN1c3BlbnNpb24gcGFzc2VzIG92ZXIgdGhlIHNhbWVcbiAgICogcGVuZGluZyB3YWl0IGNvbGxhcHNlIGludG8gYSBzaW5nbGUgZGVsYXllZCBjb250aW51YXRpb24uXG4gICAqL1xuICB3YWl0VGltZW91dD86IHsgc2Vjb25kczogbnVtYmVyOyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfTtcbiAgLyoqIFdoZXRoZXIgYSBob29rIGNvbmZsaWN0IHdhcyBkZXRlY3RlZCAoc2hvdWxkIHJlLWludm9rZSBpbW1lZGlhdGVseSkgKi9cbiAgaGFzSG9va0NvbmZsaWN0OiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgdGhlIHdvcmtmbG93IHRvIGNvbnRpbnVlIGltbWVkaWF0ZWx5ICovXG4gIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIG5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIHdlcmUgd3JpdHRlbiBmb3IgcmVwbGF5LiAqL1xuICBoYXNBdHRyaWJ1dGVFdmVudHM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3VzcGVuc2lvbiBjcmVhdGVkIGFueSBob29rIChgaG9va19jcmVhdGVkYCkgZXZlbnRzLiBVbmxpa2VcbiAgICogYGhhc0hvb2tDb25mbGljdGAgLyBgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbmAsIHRoaXMgaXMgdHJ1ZSBldmVuIGZvciBhIHBsYWluXG4gICAqIGZpcmUtYW5kLWZvcmdldCBob29rIHdpdGggbm8gY29uZmxpY3QgYW5kIG5vIGF3YWl0ZXIuIFR1cmJvIG1vZGUgdXNlcyBpdCB0b1xuICAgKiBkZXRlY3QgXCJhIGhvb2sgd2FzIGNyZWF0ZWQgdGhpcyBzdXNwZW5zaW9uXCIgYW5kIHN0b3AgZm9yY2luZyBvcHRpbWlzdGljXG4gICAqIGlubGluZSBzdGFydCAoYSBob29rIGludHJvZHVjZXMgbGF0ZXIgcmVzdW1lIGludm9jYXRpb25zIHRoYXQgY291bGQgcmFjZSkuXG4gICAqL1xuICBoYXNIb29rRXZlbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyBzcGVudCBjb21taXR0aW5nIHRoaXMgc3VzcGVuc2lvbidzIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiAoMCB3aGVuIGl0IGNyZWF0ZWQgbm9uZSkuIFRoZSBjYWxsZXIgYWNjdW11bGF0ZXMgdGhpcyBhY3Jvc3MgaXRlcmF0aW9uc1xuICAgKiBhbmQgc3VidHJhY3RzIGl0IGZyb20gdGhlIFRURlMgbGF0ZW5jeSBtZWFzdXJlbWVudCwgc28gdGltZSBzcGVudFxuICAgKiBkdXJhYmx5IGNyZWF0aW5nIHRoZSB1c2VyJ3MgaG9va3MgZG9lc24ndCBjb3VudCBhcyBydW50aW1lIG92ZXJoZWFkLlxuICAgKi9cbiAgaG9va0NyZWF0aW9uTXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgc2VyaWFsaXppbmcgdGhpcyBzdXNwZW5zaW9uJ3MgbmV3IHN0ZXAgaW5wdXRzIHdhcyBwYXNzaXZlIChkaWRcbiAgICogbm90IGV4ZWN1dGUgd29ya2Zsb3ctb3duZWQgY29kZSBzdWNoIGFzIGdldHRlcnMsIHByb3h5IHRyYXBzLCBvciBjdXN0b21cbiAgICogc2VyaWFsaXplcnMpLiBgZmFsc2VgIG1lYW5zIHRoZSByZXRhaW5lZCBWTSBtYXkgaGF2ZSBkaXZlcmdlZCBmcm9tIHdoYXRcbiAgICogYSBjb2xkIHJlcGxheSB3b3VsZCBjb21wdXRlLCBzbyB0aGUgY2FsbGVyIG11c3QgZGVtb3RlIHRvIHJlcGxheS5cbiAgICovXG4gIHJldGFpbmVkU3RlcElucHV0c1NhZmU6IGJvb2xlYW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUhvb2tFdmVudCh7XG4gIHJ1bklkLFxuICBob29rRXZlbnQsXG4gIHF1ZXVlSXRlbSxcbiAgcmVxdWVzdElkLFxuICBjcmVhdGVFdmVudCxcbn06IHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgaG9va0V2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3Q7XG4gIHF1ZXVlSXRlbTogSG9va0ludm9jYXRpb25RdWV1ZUl0ZW07XG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgY3JlYXRlRXZlbnQ6IChcbiAgICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gICAgcGFyYW1zPzogQ3JlYXRlRXZlbnRQYXJhbXNcbiAgKSA9PiBQcm9taXNlPEV2ZW50UmVzdWx0Pjtcbn0pOiBQcm9taXNlPHtcbiAgaGFzSG9va0NvbmZsaWN0OiBib29sZWFuO1xuICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBib29sZWFuO1xufT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KGhvb2tFdmVudCwge1xuICAgICAgcmVxdWVzdElkLFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdvcmxkIHJldHVybmVkIGEgaG9va19jb25mbGljdCBldmVudCBpbnN0ZWFkIG9mIGhvb2tfY3JlYXRlZC5cbiAgICAvLyBUaGUgaG9va19jb25mbGljdCBldmVudCBpcyBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBhbmQgd2lsbCBiZSByZXBsYXllZFxuICAgIC8vIG9uIHRoZSBuZXh0IHdvcmtmbG93IGludm9jYXRpb24sIGNhdXNpbmcgdGhlIGhvb2sncyBwcm9taXNlIHRvIHJlamVjdC5cbiAgICBpZiAocmVzdWx0LmV2ZW50Py5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzSG9va0NvbmZsaWN0OiB0cnVlLFxuICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc0hvb2tDb25mbGljdDogZmFsc2UsXG4gICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBxdWV1ZUl0ZW0uaGFzQ29uZmxpY3RBd2FpdGVyID09PSB0cnVlLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnSG9vayBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBxdWV1ZUl0ZW0uaGFzQ29uZmxpY3RBd2FpdGVyID09PSB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBob29rJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhc0hvb2tDb25mbGljdDogZmFsc2UsXG4gICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNXb3JsZFZhbGlkYXRpb25GYWlsdXJlKGVycikpIHtcbiAgICAgIGNvbnN0IGZhdGFsID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgIGBjcmVhdGVIb29rIGZhaWxlZCBXb3JsZCB2YWxpZGF0aW9uOiAke1xuICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKVxuICAgICAgICB9YFxuICAgICAgKTtcbiAgICAgIGZhdGFsLmNhdXNlID0gZXJyO1xuICAgICAgdGhyb3cgZmF0YWw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIHdvcmtmbG93IHN1c3BlbnNpb24gYnkgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBvcGVyYXRpb25zIChob29rcywgc3RlcHMsIHdhaXRzKS5cbiAqIENyZWF0ZXMgZXZlbnRzIGZvciBhbGwgb3BlcmF0aW9ucyBidXQgZG9lcyBOT1QgcXVldWUgc3RlcCBtZXNzYWdlczsgcmV0dXJucyB0aGUgcGVuZGluZ1xuICogc3RlcHMgc28gdGhlIGNhbGxlciBjYW4gZGVjaWRlIHdoaWNoIHRvIGV4ZWN1dGUgaW5saW5lIHZzIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gKlxuICogUHJvY2Vzc2luZyBvcmRlcjpcbiAqIDEuIEhvb2tzIGFyZSBwcm9jZXNzZWQgZmlyc3QgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCB3ZWJob29rIHJlY2VpdmVyc1xuICogMi4gU3RlcCBldmVudHMgYW5kIHdhaXQgZXZlbnRzIGFyZSBjcmVhdGVkIGluIHBhcmFsbGVsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgc3VzcGVuc2lvbixcbiAgd29ybGQsXG4gIHJ1bixcbiAgc3BhbixcbiAgcmVxdWVzdElkLFxuICBldmVudExvZyxcbiAgcnVuUmVhZHlCYXJyaWVyLFxuICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICBzdGVwRGlzcGF0Y2gsXG4gIG93bmVyTWVzc2FnZUlkLFxuICBhbGxvd0RlZmVycmVkQmF0Y2hXb3JrLFxufTogU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMpOiBQcm9taXNlPFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0PiB7XG4gIGNvbnN0IHJ1bklkID0gcnVuLnJ1bklkO1xuXG4gIC8vIFR1cmJvIG1vZGU6IGhvbGQgZXZlcnkgd29ybGQgd3JpdGUgYmVsb3cgdW50aWwgdGhlIGJhY2tncm91bmRlZFxuICAvLyBgcnVuX3N0YXJ0ZWRgIGhhcyAqc2V0dGxlZCosIHNvIHdlIG5ldmVyIHdyaXRlIGEgc3RlcC9ob29rL3dhaXQgZXZlbnQgZm9yIGFcbiAgLy8gcnVuIHRoYXQgZG9lcyBub3QgZXhpc3QgeWV0LiBBIG5vLW9wIG91dHNpZGUgdHVyYm8gKGJhcnJpZXIgdW5kZWZpbmVkKSBhbmRcbiAgLy8gb24gdGhlIHB1cmUgaW5saW5lIGhvdCBwYXRoLCB3aGljaCBkZWZlcnMgYWxsIHN0ZXBzIGFuZCB3cml0ZXMgbm90aGluZy5cbiAgLy8gQXdhaXRpbmcgdGhlIHNhbWUgKHVzdWFsbHkgYWxyZWFkeS1zZXR0bGVkKSBwcm9taXNlIG1vcmUgdGhhbiBvbmNlIGlzIGNoZWFwLlxuICAvLyBBIGJhcnJpZXIgcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3Igb3JkZXJpbmcgb25seTogaWYgYHJ1bl9zdGFydGVkYCB0cnVseVxuICAvLyBmYWlsZWQgdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHN1YnNlcXVlbnQgd3JpdGUgc3VyZmFjZXMgdGhlIHJlYWxcbiAgLy8gZXJyb3IgKHJ1biBub3QgZm91bmQgLyBnb25lKSBhbmQgdGhlIG1lc3NhZ2UgcmVkZWxpdmVycy5cbiAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHJ1blJlYWR5QmFycmllcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHksIHNlZSBhYm92ZS5cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEF3YWl0IGV2ZXJ5IG9wZXJhdGlvbiBpbiBhIHN1c3BlbnNpb24gcGhhc2UgYmVmb3JlIGxldHRpbmcgYSBmYWlsdXJlXG4gICAqIGVzY2FwZSwgcHJlZmVycmluZyBhIHN0YWxlLXNuYXBzaG90ICg0MTIpIHJlamVjdGlvbiB3aGVuIG9uZSBvY2N1cnJlZC5cbiAgICpcbiAgICogYFByb21pc2UuYWxsYCByZWplY3RzIGFzIHNvb24gYXMgb25lIG9wZXJhdGlvbiBkb2VzIGFuZCBsZWF2ZXMgaXRzIHNpYmxpbmdzXG4gICAqIGluIGZsaWdodC4gVGhhdCBtYXR0ZXJzIGZvciBhIDQxMjogdGhlIGNhbGxlciByZWFjdHMgYnkgcmVsb2FkaW5nIHRoZSBldmVudFxuICAgKiBsb2cgYW5kIHJlc3RhcnRpbmcgdGhlIHJlcGxheSwgc28gYSBzaWJsaW5nIGNyZWF0ZSB0aGF0IGxhbmRzIGFmdGVyIHRoZVxuICAgKiByZWplY3Rpb24gZXNjYXBlZCBjb21taXRzIGFuIGV2ZW50IHdob3NlIGNvcnJlbGF0aW9uIGlkIGNhbWUgZnJvbSB0aGVcbiAgICogYWJhbmRvbmVkIHJlcGxheSdzIHNlZWRlZCBzZXF1ZW5jZSAoYW4gZXZlbnQgdGhlIGZyZXNoIHJlcGxheSBuZXZlclxuICAgKiBwcm9kdWNlcyksIGFuZCBpdCByYWNlcyB0aGUgcmVzdGFydCdzIHJlbG9hZCB3aGlsZSBkb2luZyBzby4gU2V0dGxpbmcgZmlyc3RcbiAgICogbWFrZXMgdGhpcyBwaGFzZSdzIHdyaXRlIHNldCBmaW5hbCBiZWZvcmUgdGhlIGNhbGxlciBhY3RzIG9uIHRoZSBmYWlsdXJlLlxuICAgKiBJdCBtaXJyb3JzIHRoZSBydW50aW1lJ3MgaW5saW5lIHN0ZXAgY2xhaW0sIHdoaWNoIHNldHRsZXMgdGhlIGluLWZsaWdodFxuICAgKiBzdGVwIGV4ZWN1dGlvbnMgYmVmb3JlIGVzY2FsYXRpbmcgYSA0MTIuXG4gICAqXG4gICAqIEEgNDEyIGlzIHByZWZlcnJlZCBvdmVyIGFueSBvdGhlciByZWplY3Rpb24gaW4gdGhlIHNhbWUgcGhhc2UgYmVjYXVzZSBpdFxuICAgKiBoYXMgYSBkZWZpbmVkLCBjaGVhcCByZWNvdmVyeSAocmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nKSB3aGlsZSB0aGVcbiAgICogb3RoZXJzIGRvIG5vdC4gQSBkZXRlcm1pbmlzdGljIGZhaWx1cmUgc3VjaCBhcyBhbiBhdHRyaWJ1dGUtdmFsaWRhdGlvblxuICAgKiBgRmF0YWxFcnJvcmAgcmVjdXJzIG9uIHRoZSByZXN0YXJ0IGFuZCBmYWlscyB0aGUgcnVuIHRoZW4sIGF0IHRoZSBjb3N0IG9mXG4gICAqIG9uZSBleHRyYSByZXBsYXkuXG4gICAqL1xuICBjb25zdCBzZXR0bGVQaGFzZSA9IGFzeW5jIChvcHM6IFByb21pc2U8dW5rbm93bj5bXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlYXNvbnMgPSAoYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKG9wcykpXG4gICAgICAuZmlsdGVyKChyKTogciBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT4gci5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAubWFwKChyKSA9PiByLnJlYXNvbik7XG4gICAgaWYgKHJlYXNvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhyb3cgcmVhc29ucy5maW5kKChyKSA9PiBQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhyKSkgPz8gcmVhc29uc1swXTtcbiAgfTtcblxuICAvLyBFdmVyeSBzdXNwZW5zaW9uIHdyaXRlIGNhcnJpZXMgcmVwbGF5LXJlY292ZXJ5IHRlbGVtZXRyeSBvbiB0aGUgZmlyc3Qgb25lXG4gIC8vIHRoYXQgY29tbWl0cyBhZnRlciByZXBsYXkgcmVjb3ZlcmVkLiBBbGwgc3VzcGVuc2lvbiBldmVudHMgYXJlXG4gIC8vIG5vbi1ydW5fY3JlYXRlZCBldmVudHMgb24gdGhpcyBydW4ncyBgcnVuSWRgLlxuICBjb25zdCByZXBvcnRlciA9IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPz8gUmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5pbmVydCgpO1xuICBjb25zdCBjcmVhdGVFdmVudCA9IChkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zKSA9PlxuICAgIHJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShwYXJhbXMsIChwKSA9PlxuICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgZGF0YSwgcClcbiAgICApO1xuICAvLyBBZGRzIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IGd1YXJkIHdoZW4gdGhlIGNhbGxlciBzdXBwbGllZCBhIGxvYWRlZFxuICAvLyBldmVudCBsb2c7IHdpdGhvdXQgb25lIGl0IGNyZWF0ZXMgZGlyZWN0bHkgKGNhbGxlcnMgd2l0aCBubyByZXBsYXlcbiAgLy8gc25hcHNob3QsIGUuZy4gdGVzdHMpLiBBIHN0YWxlICg0MTIpIHJlamVjdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIsXG4gIC8vIHdoaWNoIHJlc3RhcnRzIHRoZSByZXBsYXkgZnJvbSBhIGNvcnJlY3RlZCBsb2cuIEl0IGlzIG5vdCByZXRyaWVkIGhlcmUsXG4gIC8vIGJlY2F1c2UgdGhlIGV2ZW50J3MgY29ycmVsYXRpb24gaWQgd2FzIG1pbnRlZCBieSAqdGhpcyogcmVwbGF5J3Mgc2VlZGVkXG4gIC8vIHNlcXVlbmNlLCBzbyByZS1jb21taXR0aW5nIGl0IGFnYWluc3QgYSBjb3JyZWN0ZWQgbG9nIHdvdWxkIHBlcnNpc3QgYW5cbiAgLy8gZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgcHJvZHVjZXMuXG4gIGxldCByZXBvcnRlZEV2ZW50cyA9IDA7XG4gIGNvbnN0IGNyZWF0ZUd1YXJkZWQ6IEV2ZW50Q3JlYXRvciA9IGFzeW5jIChkYXRhLCBwYXJhbXMpID0+IHtcbiAgICBpZiAoIWV2ZW50TG9nKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRXZlbnQoZGF0YSwgcGFyYW1zKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gZXZlbnRMb2c7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoZGF0YSwge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgLi4uc2xvdFNuYXBzaG90UGFyYW1zKGxvZy5ldmVudHMpLFxuICAgIH0pO1xuICAgIC8vIEJ1bXAtYW5kLXJlcG9ydDogdGhlIHdyaXRlIGxhbmRlZCBhYm92ZSB0aGUgc2xvdCBpdCBhc2tlZCBmb3IsIHNvIHRoZVxuICAgIC8vIHJlcG9ydCBob2xkcyB0aGUgZXZlbnRzIGl0IHdhcyBkZWNpZGVkIHdpdGhvdXQuIEFic29yYmluZyBoZXJlIHJhdGhlclxuICAgIC8vIHRoYW4gYXQgZWFjaCBjYWxsIHNpdGUgbWVhbnMgdGhlIHJlc3Qgb2YgdGhpcyBwaGFzZSdzIHdyaXRlcyAod2hpY2ggcmVhZFxuICAgIC8vIHRoZSBzYW1lIGFycmF5IHRvIGJ1aWxkIHRoZWlyIG93biBzbmFwc2hvdCkgYXNrIGZvciBhIHNsb3QgYWJvdmUgdGhlbSxcbiAgICAvLyBhbmQgdGhlIHJlcGxheSB0aGF0IHJlc3VtZXMgZnJvbSB0aGlzIGxvZyBzZWVzIHRoZW0gd2l0aG91dCBhIHJlbG9hZC5cbiAgICBjb25zdCByZXBvcnQgPSBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChsb2cuZXZlbnRzLCByZXN1bHQpO1xuICAgIHJlcG9ydGVkRXZlbnRzICs9IHJlcG9ydC5hZGRlZDtcbiAgICBpZiAocmVwb3J0LnRydW5jYXRlZCkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRHJvcHBlZCBhIHRydW5jYXRlZCBza2lwcGVkLXNsb3QgcmVwb3J0Jywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRJZDogcmVzdWx0LmV2ZW50Py5ldmVudElkLFxuICAgICAgICBvZmZlcmVkOiByZXBvcnQub2ZmZXJlZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocmVwb3J0LmFkZGVkID4gMCkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiB3cml0ZSBza2lwcGVkIG9jY3VwaWVkIHNsb3RzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRJZDogcmVzdWx0LmV2ZW50Py5ldmVudElkLFxuICAgICAgICByZXBvcnRlZDogcmVwb3J0LmFkZGVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIC8vIFNlcGFyYXRlIHF1ZXVlIGl0ZW1zIGJ5IHR5cGVcbiAgY29uc3Qgc3RlcEl0ZW1zID0gc3VzcGVuc2lvbi5zdGVwcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3N0ZXAnXG4gICk7XG4gIGNvbnN0IGFsbEhvb2tJdGVtcyA9IHN1c3BlbnNpb24uc3RlcHMuZmlsdGVyKFxuICAgIChpdGVtKTogaXRlbSBpcyBIb29rSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdob29rJ1xuICApO1xuICBjb25zdCB3YWl0SXRlbXMgPSBzdXNwZW5zaW9uLnN0ZXBzLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgV2FpdEludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnd2FpdCdcbiAgKTtcbiAgY29uc3QgYXR0cmlidXRlSXRlbXMgPSBzdXNwZW5zaW9uLnN0ZXBzLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdhdHRyaWJ1dGUnXG4gICk7XG5cbiAgY29uc3QgaG9va3NOZWVkaW5nQ3JlYXRpb24gPSBhbGxIb29rSXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiAhaXRlbS5oYXNDcmVhdGVkRXZlbnRcbiAgKTtcblxuICAvLyBHcm91cCBob29rIGl0ZW1zIHRoYXQgbmVlZCB3b3JrIGJ5IHRva2VuLCBwcmVzZXJ2aW5nIHF1ZXVlLWluc2VydGlvblxuICAvLyAod29ya2Zsb3cgY29kZSkgb3JkZXIgd2l0aGluIGVhY2ggdG9rZW4uIE9wZXJhdGlvbnMgb24gb25lIHRva2VuIG11c3RcbiAgLy8gYXBwbHkgaW4gY29kZSBvcmRlcjogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIHJlbGVhc2VzIHRoZSB0b2tlblxuICAvLyBiZWZvcmUgYSBsYXRlciBzYW1lLXRva2VuIGhvb2sncyBjcmVhdGlvbiBpcyB2YWxpZGF0ZWQgKG90aGVyd2lzZSB0aGVcbiAgLy8gbmV3IGhvb2sgcmVjb3JkcyBhIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duXG4gIC8vIGRpc3Bvc2VkIGhvb2spLCB3aGlsZSBhIGhvb2sgY3JlYXRlZCBhbmQgZGlzcG9zZWQgd2l0aGluIHRoZSBzYW1lXG4gIC8vIHN1c3BlbnNpb24gaXMgc3RpbGwgY3JlYXRlZCBiZWZvcmUgaXQgaXMgZGlzcG9zZWQuIERpZmZlcmVudCB0b2tlbnNcbiAgLy8gaGF2ZSBubyBjbGFpbSBpbnRlcmFjdGlvbiwgc28gdG9rZW4gZ3JvdXBzIGFyZSBwcm9jZXNzZWQgaW4gcGFyYWxsZWwuXG4gIGNvbnN0IGhvb2tJdGVtc0J5VG9rZW4gPSBuZXcgTWFwPHN0cmluZywgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW1bXT4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFsbEhvb2tJdGVtcykge1xuICAgIGlmIChpdGVtLmhhc0NyZWF0ZWRFdmVudCAmJiAhaXRlbS5kaXNwb3NlZCkge1xuICAgICAgY29udGludWU7IC8vIGFscmVhZHkgY29tbWl0dGVkIGFuZCBzdGlsbCBsaXZlOiBub3RoaW5nIHRvIGRvXG4gICAgfVxuICAgIGNvbnN0IGdyb3VwID0gaG9va0l0ZW1zQnlUb2tlbi5nZXQoaXRlbS50b2tlbik7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBncm91cC5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rSXRlbXNCeVRva2VuLnNldChpdGVtLnRva2VuLCBbaXRlbV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuXG4gIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gR2F0ZSBwYXlsb2FkIGNvbXByZXNzaW9uIG9uIHRoZSBydW4ncyBzcGVjVmVyc2lvbi5cbiAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKFxuICAgIHF1ZXVlSXRlbTogSG9va0ludm9jYXRpb25RdWV1ZUl0ZW1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaG9va0Rpc3Bvc2VkRXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgIGV2ZW50VHlwZTogJ2hvb2tfZGlzcG9zZWQnIGFzIGNvbnN0LFxuICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICBldmVudERhdGE6IHtcbiAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZChob29rRGlzcG9zZWRFdmVudCwgeyByZXF1ZXN0SWQgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIC8vIEhvb2sgd2FzIGFscmVhZHkgZGlzcG9zZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24sIHNhZmUgdG8gc2tpcFxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ0hvb2sgYWxyZWFkeSBkaXNwb3NlZCwgc2tpcHBpbmcgZHVwbGljYXRlIGRpc3Bvc2FsJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgaG9vayBkaXNwb3NhbCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAvLyBIb29rIG1heSBoYXZlIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvciBuZXZlciBjcmVhdGVkXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnSG9vayBub3QgZm91bmQgZm9yIGRpc3Bvc2FsLCBjb250aW51aW5nJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGhvb2tzIGZpcnN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggd2ViaG9vayByZWNlaXZlcnMuXG4gIC8vIFRyYWNrIGFueSBob29rIGNvbmZsaWN0cyB0aGF0IG9jY3VyOiB0aGVzZSBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlclxuICAvLyBzbyB0aGUgVjIgaGFuZGxlciBjYW4gcmUtaW52b2tlIGltbWVkaWF0ZWx5LlxuICBsZXQgaGFzSG9va0NvbmZsaWN0ID0gZmFsc2U7XG4gIGxldCBoYXNBd2FpdGVkSG9va0NyZWF0aW9uID0gZmFsc2U7XG4gIGxldCBob29rQ3JlYXRpb25NcyA9IDA7XG5cbiAgaWYgKGhvb2tJdGVtc0J5VG9rZW4uc2l6ZSA+IDApIHtcbiAgICBjb25zdCBob29rUGhhc2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICBhd2FpdCBzZXR0bGVQaGFzZShcbiAgICAgIFsuLi5ob29rSXRlbXNCeVRva2VuLnZhbHVlcygpXS5tYXAoYXN5bmMgKGl0ZW1zKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgbGV0IGNyZWF0aW9uQ29uZmxpY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBob29rTWV0YWRhdGE6IFNlcmlhbGl6ZWREYXRhIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgICAgdHlwZW9mIHF1ZXVlSXRlbS5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogKChhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICAgICAgICBxdWV1ZUl0ZW0ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uLmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICAgICAgKSkgYXMgU2VyaWFsaXplZERhdGEpO1xuICAgICAgICAgICAgY29uc3QgaG9va0V2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDogcXVldWVJdGVtLnRva2VuUmV0ZW50aW9uVW50aWwsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBpc1dlYmhvb2s6IHF1ZXVlSXRlbS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5pc1N5c3RlbSAmJiB7IGlzU3lzdGVtOiB0cnVlIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUhvb2tFdmVudCh7XG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBob29rRXZlbnQsXG4gICAgICAgICAgICAgIHF1ZXVlSXRlbSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBjcmVhdGVFdmVudDogY3JlYXRlR3VhcmRlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0IHx8PSByZXN1bHQuaGFzSG9va0NvbmZsaWN0O1xuICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiB8fD0gcmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb247XG4gICAgICAgICAgICBjcmVhdGlvbkNvbmZsaWN0ZWQgPSByZXN1bHQuaGFzSG9va0NvbmZsaWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERpc3Bvc2UgYWZ0ZXIgY3JlYXRpb24gZm9yIGhvb2tzIGJvcm4gYW5kIGRpc3Bvc2VkIHdpdGhpbiB0aGlzXG4gICAgICAgICAgLy8gYmF0Y2guIEEgaG9vayB3aG9zZSBjcmVhdGlvbiBjb25mbGljdGVkIHdhcyBuZXZlciBjcmVhdGVkLCBzb1xuICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcG9zZS5cbiAgICAgICAgICBpZiAocXVldWVJdGVtLmRpc3Bvc2VkICYmICFjcmVhdGlvbkNvbmZsaWN0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGRpc3Bvc2VIb29rKHF1ZXVlSXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgaG9va0NyZWF0aW9uTXMgPSBEYXRlLm5vdygpIC0gaG9va1BoYXNlU3RhcnQ7XG4gIH1cblxuICAvLyBQcm9jZXNzIGFib3J0IHJlcXVlc3RzOiByZXN1bWUgdGhlIGhvb2sgd2l0aCBhYm9ydCBwYXlsb2FkIGFuZCB3cml0ZSBzdHJlYW0gcGFja2V0XG4gIGNvbnN0IGhvb2tzTmVlZGluZ0Fib3J0ID0gYWxsSG9va0l0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gaXRlbS5hYm9ydFJlcXVlc3RlZCAmJiAhaXRlbS5kaXNwb3NlZFxuICApO1xuXG4gIGlmIChob29rc05lZWRpbmdBYm9ydC5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICBhd2FpdCBzZXR0bGVQaGFzZShcbiAgICAgIGhvb2tzTmVlZGluZ0Fib3J0Lm1hcChhc3luYyAocXVldWVJdGVtKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGVoeWRyYXRlIHRoZSBhYm9ydCBwYXlsb2FkIGZvciBzdG9yYWdlXG4gICAgICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgIHsgYWJvcnRlZDogdHJ1ZSwgcmVhc29uOiBxdWV1ZUl0ZW0uYWJvcnRSZWFzb24gfSxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGhvb2tfcmVjZWl2ZWQgZXZlbnQgd2l0aCBhYm9ydCBwYXlsb2FkXG4gICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICAgICAgICAgIHBheWxvYWQ6IGFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBXcml0ZSBzdHJlYW0gY2FuY2VsbGF0aW9uIHBhY2tldCBmb3IgcmVhbC10aW1lIHN0ZXAgcHJvcGFnYXRpb24uXG4gICAgICAgICAgLy8gUmV1c2UgdGhlIHNhbWUgZGVoeWRyYXRlZCBwYXlsb2FkIGFzIHRoZSBob29rIGV2ZW50IHNvIHRoZSByZWFzb25cbiAgICAgICAgICAvLyByb3VuZC10cmlwcyB0aHJvdWdoIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCAvIGBoeWRyYXRlU3RlcEFyZ3VtZW50c2BcbiAgICAgICAgICAvLyAoaGFuZGxlcyBET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGVuY3J5cHRpb24sIGV0Yy4pIGluc3RlYWQgb2ZcbiAgICAgICAgICAvLyBiYXJlIEpTT04uc3RyaW5naWZ5IHdoaWNoIGxvc2VzIHR5cGUgaW5mb3JtYXRpb24gYW5kIGRyb3BzIHVuZGVmaW5lZC5cbiAgICAgICAgICAvLyBzdHJlYW1OYW1lIGlzIHNldCBvbiB0aGUgcXVldWUgaXRlbSBhdCBjb250cm9sbGVyIGNvbnN0cnVjdGlvbiB0aW1lXG4gICAgICAgICAgLy8gKHNlZSB3b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzKS5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4ocXVldWVJdGVtLnRva2VuKTtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUoXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBzdHJlYW1OYW1lLFxuICAgICAgICAgICAgICBhYm9ydFBheWxvYWQgYXMgVWludDhBcnJheVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMuY2xvc2UocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlOiBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlIGZhbGxiYWNrXG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAnRmFpbGVkIHRvIHdyaXRlIGFib3J0IHN0cmVhbSBwYWNrZXQsIGhvb2sgZXZlbnQgd2lsbCBwcm92aWRlIGZhbGxiYWNrJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBhYm9ydCcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHN0ZXAgZXZlbnRzIGZvciBzdGVwcyB0aGF0IGRvbid0IGhhdmUgdGhlbSB5ZXQuXG4gIC8vIFVubGlrZSBWMSwgd2UgZG8gTk9UIHF1ZXVlIHN0ZXAgbWVzc2FnZXMgZnJvbSBoZXJlOiB0aGUgY2FsbGVyXG4gIC8vIGRlY2lkZXMgd2hpY2ggc3RlcHMgdG8gZXhlY3V0ZSBpbmxpbmUgdnMuIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gIC8vIFdhaXQgZXZlbnRzIGFyZSBhbHNvIGNyZWF0ZWQgaW4gcGFyYWxsZWwgYmVsb3cuXG4gIGNvbnN0IHN0ZXBzTmVlZGluZ0NyZWF0aW9uID0gbmV3IFNldChcbiAgICBzdGVwSXRlbXNcbiAgICAgIC5maWx0ZXIoKHF1ZXVlSXRlbSkgPT4gIXF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQpXG4gICAgICAubWFwKChxdWV1ZUl0ZW0pID0+IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKVxuICApO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBmb3Igd2hpY2ggVEhJUyBzdXNwZW5zaW9uIGNhbGwgYWN0dWFsbHkgd3JvdGUgdGhlXG4gIC8vIHN0ZXBfY3JlYXRlZCBldmVudC4gUG9wdWxhdGVkIGJ5IHRoZSBvcHMgYmVsb3cgYWZ0ZXIgYSBzdWNjZXNzZnVsXG4gIC8vIGV2ZW50cy5jcmVhdGUsIHVzZWQgYnkgdGhlIGNhbGxlciB0byBjbGFpbSBvd25lcnNoaXAgYW5kIGF2b2lkXG4gIC8vIHJhY2luZyB3aXRoIGNvbmN1cnJlbnQgaGFuZGxlcnMgb24gc3RlcCBleGVjdXRpb24uXG4gIGNvbnN0IGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBDb3JyZWxhdGlvbiBJRHMgb2Ygc3RlcHMgZmluYWxpemVkIGFzIGZhaWxlZCBiZWNhdXNlIHRoZWlyIGFyZ3VtZW50c1xuICAvLyByZWZ1c2VkIHRvIHNlcmlhbGl6ZTogc2VlIGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwIGJlbG93LlxuICBjb25zdCBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQSBzdGVwIHdob3NlIGFyZ3VtZW50cyBmYWlsIHRvIHNlcmlhbGl6ZSBpcyBkZXRlcm1pbmlzdGljOiBldmVyeSByZXBsYXlcbiAgICogcmUtZGVyaXZlcyB0aGUgc2FtZSB1bnNlcmlhbGl6YWJsZSB2YWx1ZSwgc28gcmVkZWxpdmVyaW5nIHRoZVxuICAgKiBvcmNoZXN0cmF0b3IgbWVzc2FnZSBjYW4gbmV2ZXIgc3VjY2VlZC4gSW5zdGVhZCBvZiByZWplY3RpbmcgdGhlIHdob2xlXG4gICAqIHN1c3BlbnNpb24gKHdoaWNoIGZhaWxzIHRoZSBydW4gZnJvbSB0aGUgb3V0c2lkZSwgd2hlcmUgbm8gdXNlciBjb2RlIGNhblxuICAgKiBvYnNlcnZlIGl0KSwgdHJlYXQgaXQgZXhhY3RseSBsaWtlIGEgc3RlcC1ib2R5IGZhaWx1cmU6IHdyaXRlXG4gICAqIGBzdGVwX2NyZWF0ZWRgIHdpdGggYSBwbGFjZWhvbGRlciBpbnB1dCAoZXZlcnkgV29ybGQgcmVxdWlyZXMgdGhlIHN0ZXBcbiAgICogZW50aXR5IHRvIGV4aXN0IGJlZm9yZSBhIHRlcm1pbmFsIHN0ZXAgZXZlbnQsIGFuZCB0aGUgcmVhbCBpbnB1dCBpc1xuICAgKiBwcmVjaXNlbHkgd2hhdCByZWZ1c2VkIHRvIHNlcmlhbGl6ZSkgZm9sbG93ZWQgYnkgYHN0ZXBfZmFpbGVkYCBjYXJyeWluZ1xuICAgKiB0aGUgU2VyaWFsaXphdGlvbkVycm9yLiBUaGUgbmV4dCByZXBsYXkgcmVqZWN0cyB0aGUgc3RlcCdzIHByb21pc2Ugd2l0aFxuICAgKiBpdCwgc28gYSB0cnkvY2F0Y2ggYXJvdW5kIHRoZSBzdGVwIGNhbGwgb2JzZXJ2ZXMgdGhlIGVycm9yOyB1bmNhdWdodCwgaXRcbiAgICogcHJvcGFnYXRlcyBvdXQgb2YgdGhlIHdvcmtmbG93IGJvZHkgYW5kIGZhaWxzIHRoZSBydW4gYXMgYSBVU0VSX0VSUk9SLFxuICAgKiB3aXRob3V0IGJ1cm5pbmcgcXVldWUgcmVkZWxpdmVyaWVzIGVpdGhlciB3YXkuXG4gICAqL1xuICBjb25zdCBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcCA9IGFzeW5jIChcbiAgICBxdWV1ZUl0ZW06IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICAgIGVycm9yOiBTZXJpYWxpemF0aW9uRXJyb3JcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgJ1N0ZXAgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemU7IGZhaWxpbmcgdGhlIHN0ZXAgc28gdGhlICcgK1xuICAgICAgICAnd29ya2Zsb3cgY2FuIG9ic2VydmUgdGhlIGVycm9yJyxcbiAgICAgIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH1cbiAgICApO1xuICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgLy8gTWFya2VyIHBsYWNlaG9sZGVyIChub3QgZW1wdHkgYXJncyk6IGJ5dGUtaWRlbnRpY2FsLXRvLXplcm8tYXJncyB3b3VsZFxuICAgIC8vIG1ha2UgYHdvcmtmbG93IGluc3BlY3Qgc3RlcHNgIHNob3cgXCJubyBhcmd1bWVudHNcIiBmb3IgdGhlIG9uZSBzdGVwXG4gICAgLy8gd2hvc2UgZW50aXJlIHByb2JsZW0gd2FzIGl0cyBhcmd1bWVudHMuXG4gICAgY29uc3QgcGxhY2Vob2xkZXJJbnB1dCA9IChhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgdW5zZXJpYWxpemFibGVTdGVwSW5wdXRQbGFjZWhvbGRlcigpLFxuICAgICAgcnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgZmFsc2UsXG4gICAgICBjb21wcmVzc2lvblxuICAgICkpIGFzIFNlcmlhbGl6ZWREYXRhO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBsYWNlaG9sZGVySW5wdXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChjcmVhdGVFcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGNyZWF0ZUVycikpIHtcbiAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgYWxyZWFkeSBjcmVhdGVkIHRoZSBzdGVwOiB0aGUgZmFpbHVyZSBpc1xuICAgICAgICAvLyBkZXRlcm1pbmlzdGljLCBzbyBpdCBpcyByYWNpbmcgdG93YXJkIHRoZSBzYW1lIHN0ZXBfZmFpbGVkIGJlbG93LlxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgbWVzc2FnZTogY3JlYXRlRXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoY3JlYXRlRXJyKSkge1xuICAgICAgICAvLyBSdW4gYWxyZWFkeSBmaW5pc2hlZDogbm90aGluZyB0byBvYnNlcnZlIHRoZSBmYWlsdXJlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjcmVhdGVFcnI7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnIGFzIGNvbnN0LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgaXRzZWxmIGlzIGEgcGxhaW4gV29ya2Zsb3dFcnJvciAobmFtZSwgbWVzc2FnZSB3aXRoXG4gICAgICAgICAgICAvLyBmcmFtZWQgaGludCwgY2F1c2UgY2hhaW4pLCBzZXJpYWxpemFibGUgZXZlbiB0aG91Z2ggdGhlIHN0ZXBcbiAgICAgICAgICAgIC8vIGlucHV0IHdhcyBub3QuIEVycm9yIGRldGVjdGlvbiBpcyByZWFsbS1pbmRlcGVuZGVudFxuICAgICAgICAgICAgLy8gKHR5cGVzLmlzTmF0aXZlRXJyb3IpLCBzbyB0aGUgaG9zdC1jcmVhdGVkIGVycm9yIHNlcmlhbGl6ZXNcbiAgICAgICAgICAgIC8vIHRoZSBzYW1lIHVuZGVyIGVpdGhlciBnbG9iYWw7IHRoZSBWTSBnbG9iYWwgaXMgcGFzc2VkIGZvclxuICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgd2l0aCBldmVyeSBvdGhlciBkZWh5ZHJhdGlvbiBpbiB0aGlzIGZpbGUgYW5kIHNvXG4gICAgICAgICAgICAvLyBhbnkgVk0tcmVhbG0gdmFsdWVzIGd1ZXN0IGNvZGUgdGhyZXcgaW50byB0aGUgY2F1c2UgY2hhaW5cbiAgICAgICAgICAgIC8vIChnZXR0ZXJzL3Byb3hpZXMgZXhlY3V0ZWQgZHVyaW5nIHRoZSBmYWlsZWQgZGVoeWRyYXRpb24pIGFyZVxuICAgICAgICAgICAgLy8gZGV0ZWN0ZWQgYnkgdGhlIHJlYWxtLXNlbnNpdGl2ZSByZWR1Y2Vycy5cbiAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycikpIHtcbiAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRlcm1pbmFsIChhIGNvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSB0aGUgc2FtZVxuICAgICAgICAvLyBkZXRlcm1pbmlzdGljIGZhaWx1cmUpIG9yIHRoZSBydW4gYWxyZWFkeSBmaW5pc2hlZC5cbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIG9yIHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgIH1cbiAgICB9XG4gICAgZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgLy8gUmVsZWFzZSB0aGUgaW5saW5lIHNsb3QgYm9va2tlZXBpbmc6IHRoZSBzdGVwIG5ldmVyIHJ1bnMsIHNvIGl0IG11c3RcbiAgICAvLyBub3QgYXBwZWFyIGluIHRoZSByZWJ1aWx0IGBsYXp5SW5saW5lU3RlcHNgLiAoSXRzIHNsb3QgaW4gdGhlIGZpcnN0LU5cbiAgICAvLyBzZWxlY3Rpb24gYW5kIGluIGBpbmxpbmVQYWlyRm9sZEVsaWdpYmxlYCdzIGFyaXRobWV0aWMgd2FzIGNvbnN1bWVkXG4gICAgLy8gYmVmb3JlIGRlaHlkcmF0aW9uIGNvdWxkIHJldmVhbCB0aGUgZmFpbHVyZSwgaW5oZXJlbnQgdG8gc2VsZWN0aW5nXG4gICAgLy8gYmVmb3JlIHNlcmlhbGl6aW5nLCBhbmQgYm91bmRlZCB0byBvbmUgd2FzdGVkIHNsb3Qgb24gYSBwYXNzIHRoYXRcbiAgICAvLyBlbmRzIGluIGEgZm9yY2VkIHJlcGxheSBhbnl3YXkuKVxuICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5kZWxldGUocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICB9O1xuXG4gIC8vIFNlcmlhbGl6YXRpb24gYWx3YXlzIHJ1bnMgdGhyb3VnaCB0aGUgb25lIG9yZGluYXJ5IHBhdGggYmVsb3csIHNvIHRoZVxuICAvLyBkdXJhYmxlIGJ5dGVzIGNhbm5vdCBkZXBlbmQgb24gcmV0ZW50aW9uLiBXaGF0IHJldGVudGlvbiBuZWVkcyB0byBrbm93IGlzXG4gIC8vIHdoZXRoZXIgdGhhdCBzZXJpYWxpemF0aW9uICpleGVjdXRlZCogd29ya2Zsb3cgY29kZSAoZ2V0dGVycywgcHJveHlcbiAgLy8gdHJhcHMsIGN1c3RvbSBzZXJpYWxpemVycyk6IHNpZGUgZWZmZWN0cyBhIGNvbGQgcmVwbGF5IHdvdWxkIG5vdFxuICAvLyByZXBlYXQsIHNpbmNlIGEgcmVwbGF5IHNraXBzIGRlaHlkcmF0aW9uIGZvciBhbHJlYWR5LXJlY29yZGVkIHN0ZXBzLlxuICAvLyBUaGUgaGFyZGVuZWQgc2VyaWFsaXplciByZWNvcmRzIGV4YWN0bHkgdGhhdCBpbnRvIHRoaXMgc2luayAoc2VlXG4gIC8vIC4uL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQudHMpOyB3aGVuIGFueSBpbnB1dCBpbiB0aGUgYmF0Y2ggcmVjb3JkcyBhblxuICAvLyBleGVjdXRpb24sIHRoZSBjYWxsZXIgZGVtb3RlcyB0aGUgc2Vzc2lvbiBzbyB0aGUgc2lkZSBlZmZlY3RzIGxhbmQgaW4gYVxuICAvLyBWTSB0aGF0IGlzIGFib3V0IHRvIGJlIGRpc2NhcmRlZCwgZXhhY3RseSBsaWtlIHRoZSBwcmUtcmV0ZW50aW9uXG4gIC8vIHJ1bnRpbWUuXG4gIGNvbnN0IGd1ZXN0Q29kZVN0YXRzOiBHdWVzdENvZGVTdGF0cyA9IHsgZXhlY3V0aW9uczogW10gfTtcblxuICAvLyBMYXp5IGlubGluZSBzdGFydDogZGVmZXIgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3IgdXAgdG9cbiAgLy8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIHRoZSBjYWxsZXIgd2lsbCBydW4gaW5saW5lIChpbiBwYXJhbGxlbCkuIEVhY2hcbiAgLy8gc3RlcCBpcyBjcmVhdGVkIG9uIHRoZSBmbHkgYnkgdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgZXhlY3V0ZVN0ZXAgc2VuZHNcbiAgLy8gKHNhdmluZyBhIHJvdW5kLXRyaXAgcGVyIHN0ZXApLiBXZSBuZXZlciBkZWZlciB3aGVuIGEgYGhvb2suZ2V0Q29uZmxpY3QoKWBcbiAgLy8gYXdhaXRlciBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgY2FsbGVyIGV4ZWN1dGVzIG5vdGhpbmcgaW5saW5lXG4gIC8vIChpdCByZS1pbnZva2VzIGltbWVkaWF0ZWx5IHRvIHJlc29sdmUgdGhlIGF3YWl0ZXIpLCBzbyBkZWZlcnJpbmcgd291bGRcbiAgLy8gbGVhdmUgdGhlIHN0ZXBzIHVuY3JlYXRlZCBhbmQgdW5xdWV1ZWQuIFdlIHBpY2sgdGhlIGZpcnN0IE4gdW5jcmVhdGVkXG4gIC8vIHN0ZXBzIChtYXRjaGluZyB0aGUgY2FsbGVyJ3MgaW5saW5lLWNhbmRpZGF0ZSBzZWxlY3Rpb24pIGFuZCBkZWh5ZHJhdGVcbiAgLy8gdGhlaXIgaW5wdXQgaGVyZSBzbyBleGVjdXRlU3RlcCBjYW4gc2hpcCBpdCBhcyB0aGUgc3RlcF9zdGFydGVkIHBheWxvYWQuXG4gIGNvbnN0IGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPihcbiAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uID09PSBmYWxzZVxuICAgICAgPyBzdGVwSXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBzdGVwc05lZWRpbmdDcmVhdGlvbi5oYXMoaXRlbS5jb3JyZWxhdGlvbklkKSlcbiAgICAgICAgICAuc2xpY2UoMCwgZ2V0TWF4SW5saW5lU3RlcHMoKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmNvcnJlbGF0aW9uSWQpXG4gICAgICA6IFtdXG4gICk7XG4gIC8vIENvbGxlY3RlZCBieSBjb3JyZWxhdGlvbklkIGJlY2F1c2UgdGhlIHBlci1zdGVwIG9wcyBiZWxvdyBydW4gY29uY3VycmVudGx5XG4gIC8vIGFuZCBzZXR0bGUgb3V0IG9mIG9yZGVyLiBXZSByZWJ1aWxkIHRoZSBhcnJheSBpbiBkZXRlcm1pbmlzdGljXG4gIC8vIGBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHNgIG9yZGVyICh0aGUgb3JkZXJlZCBzbGljZSBhYm92ZSkgYWZ0ZXIgdGhlIG9wc1xuICAvLyBzZXR0bGUsIHNvIHRoZSBpbmxpbmUgYmF0Y2ggb3JkZXIgaXMgc3RhYmxlIHJlZ2FyZGxlc3Mgb2YgZGVoeWRyYXRpb24gdGltaW5nLlxuICBjb25zdCBsYXp5SW5saW5lQnlDb3JyZWxhdGlvbklkID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2xhenlJbmxpbmVTdGVwcyddW251bWJlcl1cbiAgPigpO1xuXG4gIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHdob3NlIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIG1lc3NhZ2Ugd2FzIGFscmVhZHlcbiAgLy8gcHVibGlzaGVkIGJ5IHRoZSByZXNpbGllbnQtZGlzcGF0Y2ggb3BzIGJlbG93IChhbG9uZ3NpZGUgdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyB3cml0ZSkuIFJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgc28gaXRzIGRpc3BhdGNoIHBhc3Mgc2tpcHMgdGhlbS5cbiAgY29uc3QgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApLiBBbGwgbXVzdCBob2xkOlxuICAvL1xuICAvLyAgLSBUaGUgY2FsbGVyIHByb3ZpZGVkIGEgZGlzcGF0Y2ggdGFyZ2V0IChgc3RlcERpc3BhdGNoYCk6IHRlcm1pbmFsXG4gIC8vICAgIGRyYWlucyBhbmQgb3RoZXIgY3JlYXRlLW9ubHkgY2FsbGVycyBuZXZlciBxdWV1ZS5cbiAgLy8gIC0gVGhlIGZlYXR1cmUgaXMgZW5hYmxlZCAoYFdPUktGTE9XX1JFU0lMSUVOVF9TVEVQX0RJU1BBVENIYCBvcHQtaW4pLlxuICAvLyAgICBJdCBpcyBvZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBwdWJsaXNoIHJhY2VzIHRoZSBjcmVhdGUncyB2ZXJkaWN0LFxuICAvLyAgICBhbmQgYSBjcmVhdGUgY2FuIGNvbWUgYmFjayByZWZ1c2VkOiBhcyBhIGR1cGxpY2F0ZSB0aGUgcmVwbGF5IHNob3VsZFxuICAvLyAgICBzdG9wIHB1cnN1aW5nLCBvciAob24gYSBXb3JsZCB0aGF0IHdvdWxkIHJhdGhlciByZWZ1c2UgYSBzdGFsZSB3cml0ZVxuICAvLyAgICB0aGFuIHJlcG9ydCB3aGF0IGl0IG1pc3NlZCkgYXMgYSA0MTIuIEVpdGhlciB3YXkgdGhlIHF1ZXVlIG1lc3NhZ2VcbiAgLy8gICAgY2FycnlpbmcgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBvdXQsIGFuZCB0aGUgY29uc3VtZXIgY2FuIG1hdGVyaWFsaXplIGFcbiAgLy8gICAgc3RlcCB3aG9zZSBjcmVhdGUgd2FzIHJlZnVzZWQuIE5vdGhpbmcgb3JkZXJzIHRoYXQgdmVyZGljdCBiZWZvcmUgdGhlXG4gIC8vICAgIGNvbnN1bWVyJ3MgcmVkZWxpdmVyeSByZS1lbnN1cmUsIHNvIG5vIGJhY2tlbmQtc2lkZSByZXZvY2F0aW9uXG4gIC8vICAgIGJvb2trZWVwaW5nIGNhbiBjbG9zZSB0aGUgd2luZG93OiBhIGJlc3QtZWZmb3J0IG1hcmtlciB0aGF0IGZhaWxzIG9wZW5cbiAgLy8gICAgY2Fubm90IGNhcnJ5IGEgY29ycmVjdG5lc3MgcHJvcGVydHkuIFRoZSBzZXF1ZW50aWFsIHBhdGggaXMgdGhlIG9ubHlcbiAgLy8gICAgdGhpbmcgdGhhdCBnaXZlcyB0aGUgbWVzc2FnZSBhIGhhcHBlbnMtYWZ0ZXIgZWRnZSBvdmVyIHRoZSB2ZXJkaWN0LlxuICAvLyAgLSBUaGUgcnVuJ3MgcXVldWUgdHJhbnNwb3J0IHByZXNlcnZlcyBiaW5hcnkgcGF5bG9hZHMgKENCT1IsXG4gIC8vICAgIHNwZWNWZXJzaW9uID49IDMpOiBgc3RlcElucHV0LmlucHV0YCBpcyB0aGUgc2VyaWFsaXplZCAocG9zc2libHlcbiAgLy8gICAgZW5jcnlwdGVkKSBpbnB1dCBieXRlcywgd2hpY2ggdGhlIEpTT04gdHJhbnNwb3J0IHdvdWxkIG1hbmdsZS5cbiAgY29uc3QgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSA9XG4gICAgc3RlcERpc3BhdGNoICE9PSB1bmRlZmluZWQgJiZcbiAgICBpc1Jlc2lsaWVudFN0ZXBEaXNwYXRjaEVuYWJsZWQoKSAmJlxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUO1xuXG4gIC8vIEJhdGNoZWQgZmFuLW91dDogZm9sZCB0aGlzIHN1c3BlbnNpb24ncyBzdGVwX2NyZWF0ZWQgKyB3YWl0X2NyZWF0ZWRcbiAgLy8gd3JpdGVzIGludG8gb25lIGBldmVudHMuY3JlYXRlQmF0Y2hgIGNhbGwgKG9uZSBkdXJhYmxlIHdyaXRlLCBwZXItZXZlbnRcbiAgLy8gb3V0Y29tZXMpIGluc3RlYWQgb2Ygb25lIHdyaXRlIHBlciBldmVudC4gRW5nYWdlcyBvbmx5IGZvciBhIENMRUFOXG4gIC8vIGZhbi1vdXQgKG5vIGF0dHJpYnV0ZSB3cml0ZXMsIG5vIGhvb2sgd3JpdGVzLCBubyByZXNpbGllbnQgZGlzcGF0Y2hcbiAgLy8gd2hvc2UgY3JlYXRlcyBhcmUgZWFjaCBwYWlyZWQgd2l0aCBhIHF1ZXVlIHB1Ymxpc2gpIG9uIGEgV29ybGQgdGhhdFxuICAvLyBpbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBtZXRob2QgYW5kIGEgcnVuIHdob3NlIGV2ZW50cyBhcmUgc2xvdC1udW1iZXJlZC5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBnYXRlIGtlZXBzIHRoZSBzaW5nbGUtZXZlbnQgcGF0aCBieXRlLWZvci1ieXRlLlxuICBjb25zdCBiYXRjaEZhbm91dEVsaWdpYmxlID1cbiAgICBpc0JhdGNoVHJhbnNpdGlvbnNFbmFibGVkKCkgJiZcbiAgICB0eXBlb2Ygd29ybGQuZXZlbnRzLmNyZWF0ZUJhdGNoID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHJ1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSAmJlxuICAgICFyZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlICYmXG4gICAgYWxsSG9va0l0ZW1zLmxlbmd0aCA9PT0gMCAmJlxuICAgIGF0dHJpYnV0ZUl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgLyoqXG4gICAqIFRoZSBmb2xkJ3MgY29sbGVjdGlvbiwgaW4gc2NoZWR1bGluZyBvcmRlciAoc3RlcHMgaW4gc3RlcEl0ZW1zIG9yZGVyLFxuICAgKiB0aGVuIHdhaXRzKS4gU3RlcCBlbnRyaWVzIGFyZSBlbnF1ZXVlZCBieSB0aGVpciBwcmVwIHByb21pc2VzIChpbnB1dFxuICAgKiBkZWh5ZHJhdGlvbiBydW5zIGNvbmN1cnJlbnRseSwgc28gZW50cmllcyBhcmUgb3JkZXJlZCBieSBgb3JkZXJgLCBub3QgYnlcbiAgICogY29tcGxldGlvbik7IHRoZSBzaW5nbGUgZmx1c2ggb3AgYmVsb3cgYXdhaXRzIGV2ZXJ5IHByZXAsIHNvcnRzLCBhbmRcbiAgICogY29tbWl0cyB0aGUgd2hvbGUgc2V0IHRocm91Z2ggYGNyZWF0ZUJhdGNoYC5cbiAgICovXG4gIGNvbnN0IGJhdGNoUXVldWU6IHtcbiAgICBvcmRlcjogbnVtYmVyO1xuICAgIGtpbmQ6ICdzdGVwJyB8ICd3YWl0JyB8ICdpbmxpbmUtY3JlYXRlZCcgfCAnaW5saW5lLXN0YXJ0ZWQnO1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIHN0ZXAncyBuYW1lLCBzZXQgb24gc3RlcC1jYXJyeWluZyBraW5kcyAodGhlIGluLWZsdXNoIHB1Ymxpc2hlc1xuICAgICAqICBhbmQgdGhlIGRpc3BhdGNoIGlkZW1wb3RlbmN5IGtleSBuZWVkIGl0KS4gKi9cbiAgICBzdGVwTmFtZT86IHN0cmluZztcbiAgICBldmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0O1xuICB9W10gPSBbXTtcbiAgY29uc3QgYmF0Y2hQcmVwczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgLy8gUHJlLWNsYWltZWQgaW5saW5lIHBhaXJzOiBmb2xkIGVhY2ggbGF6eS1pbmxpbmUgc3RlcCdzIGRlZmVycmVkXG4gIC8vIGBzdGVwX2NyZWF0ZWRgIChjYXJyeWluZyBpdHMgaW5wdXQpIEFORCBpdHMgYHN0ZXBfc3RhcnRlZGAgY2xhaW0gKGJhcmUsXG4gIC8vIG93bmVyc2hpcC1zdGFtcGVkKSBpbnRvIHRoZSBiYXRjaCwgc28gdGhlIHdob2xlIGZhbi1vdXQgKHRoZSBpbmxpbmVcbiAgLy8gc3RlcHMnIGNsYWltcyBpbmNsdWRlZCkgY29tbWl0cyBpbiB0aGUgb25lIGR1cmFibGUgd3JpdGUgYW5kIHRoZSBjYWxsZXJcbiAgLy8gc3RhcnRzIHRoZSBib2RpZXMgc3RyYWlnaHQgb2ZmIHRoYXQgY29tbWl0IGluc3RlYWQgb2YgcG9zdGluZyBvbmUgY2xhaW1cbiAgLy8gcGVyIGlubGluZSBzdGVwLiBUaGUgbG9uZS1pbmxpbmUgY2FzZSAobm90aGluZyBlbHNlIHRvIGJhdGNoIHdpdGgpIGlzXG4gIC8vIGV4Y2x1ZGVkOiBhIHBhaXItb25seSBiYXRjaCBjb3N0cyB0aGUgc2FtZSByb3VuZCB0cmlwIGFzIHRoZSBzaW5nbGUgbGF6eVxuICAvLyBjbGFpbSB3aGlsZSBnaXZpbmcgdXAgdGhlIG9wdGltaXN0aWMgY2xhaW0vYm9keSBvdmVybGFwIGFuZCB0aGVcbiAgLy8gYnVtcC1hbmQtcmVwb3J0IHRoYXQgYGNyZWF0ZUd1YXJkZWRgIHByb3ZpZGVzLCBzbyBpdCBzdGF5cyBvbiB0aGUgbGF6eVxuICAvLyBwYXRoLiBSZXF1aXJlcyB0aGUgY2FsbGVyJ3MgYG93bmVyTWVzc2FnZUlkYDogdGhlIHN0YXJ0ZWQgcm93IG11c3RcbiAgLy8gc3RhbXAgb3duZXJzaGlwIGV4YWN0bHkgbGlrZSB0aGUgbGF6eSBjbGFpbSBpdCByZXBsYWNlcyAoYW5kIGEgY2FsbGVyXG4gIC8vIHRoYXQgZG9lcyBub3QgaW5saW5lLWV4ZWN1dGUgbmV2ZXIgcHJvdmlkZXMgb25lKS5cbiAgY29uc3QgdW5jcmVhdGVkV2FpdENvdW50ID0gd2FpdEl0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gIWl0ZW0uaGFzQ3JlYXRlZEV2ZW50XG4gICkubGVuZ3RoO1xuICBjb25zdCBpbmxpbmVQYWlyRm9sZEVsaWdpYmxlID1cbiAgICBiYXRjaEZhbm91dEVsaWdpYmxlICYmXG4gICAgb3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5zaXplID4gMCAmJlxuICAgIChsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuc2l6ZSA+PSAyIHx8XG4gICAgICBzdGVwc05lZWRpbmdDcmVhdGlvbi5zaXplIC1cbiAgICAgICAgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLnNpemUgK1xuICAgICAgICB1bmNyZWF0ZWRXYWl0Q291bnQgPj1cbiAgICAgICAgMSk7XG4gIGNvbnN0IGlubGluZUNsYWltczogU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2lubGluZUNsYWltcyddID0gbmV3IE1hcCgpO1xuICBsZXQgYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSB0cmFjZSBjYXJyaWVyIGZvciByZXNpbGllbnQgc3RlcCBkaXNwYXRjaGVzLCByZXNvbHZlZCBhdCBtb3N0IG9uY2UgcGVyXG4gIC8vIHN1c3BlbnNpb24gKHRoZSBwZXItc3RlcCBvcHMgcnVuIGNvbmN1cnJlbnRseSBhbmQgc2hhcmUgaXQpLlxuICBsZXQgc3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyOiBQcm9taXNlPFRyYWNlQ2Fycmllcj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGdldFN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFRyYWNlQ2Fycmllcj4gPT4ge1xuICAgIHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllciA/Pz1cbiAgICAgIHN0ZXBEaXNwYXRjaD8uZ2V0VHJhY2VDYXJyaWVyKCkgPz8gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICByZXR1cm4gc3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyO1xuICB9O1xuXG4gIC8vIFByb2R1Y2VyLXNpZGUgcmVzaWxpZW50IHJlY292ZXJ5IGNvdW50IGZvciB0aGUgc3VzcGVuc2lvbiBzcGFuIGF0dHJpYnV0ZS5cbiAgbGV0IHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkID0gMDtcblxuICAvLyBTdGVwczogY3JlYXRlIHN0ZXBfY3JlYXRlZCBldmVudHMgKG5vIHF1ZXVpbmcsIFYyIHJldHVybnMgcGVuZGluZyBzdGVwc1xuICAvLyB0byBjYWxsZXIsIEVYQ0VQVCBvbiB0aGUgcmVzaWxpZW50IGRpc3BhdGNoIHBhdGgsIHdoaWNoIHBhcmFsbGVsaXplcyB0aGVcbiAgLy8gY3JlYXRlIHdpdGggdGhlIHN0ZXAncyBxdWV1ZSBwdWJsaXNoIGFuZCByZXBvcnRzIGl0IGluXG4gIC8vIGBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHNgKS5cbiAgbGV0IGJhdGNoT3JkZXJDb3VudGVyID0gMDtcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygc3RlcEl0ZW1zKSB7XG4gICAgaWYgKHN0ZXBzTmVlZGluZ0NyZWF0aW9uLmhhcyhxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCkpIHtcbiAgICAgIC8vIERldGVybWluaXN0aWMgcG9zaXRpb24gaW4gdGhlIGJhdGNoZWQgZm9sZCAoYXNzaWduZWQgaW4gc3RlcEl0ZW1zXG4gICAgICAvLyBvcmRlciwgYmVmb3JlIHRoZSBjb25jdXJyZW50IGRlaHlkcmF0aW9uIHJ1bnMpLiBBIHBhaXItZm9sZGVkIGlubGluZVxuICAgICAgLy8gc3RlcCBvY2N1cGllcyB0d28gY29uc2VjdXRpdmUgcG9zaXRpb25zIChjcmVhdGVkIHJvdyB0aGVuIHN0YXJ0ZWRcbiAgICAgIC8vIHJvdyksIHdoaWNoIHRoZSBmbHVzaCBrZWVwcyBhZGphY2VudCBhbmQgbmV2ZXIgc3BsaXRzIGFjcm9zcyBjaHVua3MsXG4gICAgICAvLyBzbyBhIFdvcmxkIGNhbiBmb2xkIHRoZW0gaW50byBvbmUgYm9ybi1ydW5uaW5nIGNyZWF0ZS5cbiAgICAgIGNvbnN0IHBhaXJGb2xkZWQgPVxuICAgICAgICBpbmxpbmVQYWlyRm9sZEVsaWdpYmxlICYmXG4gICAgICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgY29uc3Qgc3RlcE9yZGVyID0gYmF0Y2hPcmRlckNvdW50ZXI7XG4gICAgICBiYXRjaE9yZGVyQ291bnRlciArPSBwYWlyRm9sZGVkID8gMiA6IDE7XG4gICAgICBjb25zdCBzdGVwT3AgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBQZXItc3RlcCBzaW5rLCBtZXJnZWQgYmVsb3c6IHRoZSBkZWh5ZHJhdGUgd3JhcHBlciBlbWl0cyBzcGFuXG4gICAgICAgIC8vIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2luayBpdCBpcyBoYW5kZWQsIHNvIHNoYXJpbmcgb25lIGFjcm9zc1xuICAgICAgICAvLyBzdGVwcyB3b3VsZCByZS1lbWl0IChhbmQgbWlzYXR0cmlidXRlKSBlYXJsaWVyIHN0ZXBzJyBlbnRyaWVzLlxuICAgICAgICBjb25zdCBzdGVwR3Vlc3RDb2RlOiBHdWVzdENvZGVTdGF0cyA9IHsgZXhlY3V0aW9uczogW10gfTtcbiAgICAgICAgbGV0IGRlaHlkcmF0ZWRJbnB1dDogVWludDhBcnJheSB8IHVua25vd247XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVoeWRyYXRlZElucHV0ID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXJnczogcXVldWVJdGVtLmFyZ3MsXG4gICAgICAgICAgICAgIGNsb3N1cmVWYXJzOiBxdWV1ZUl0ZW0uY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgIHRoaXNWYWw6IHF1ZXVlSXRlbS50aGlzVmFsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgICAgICBzdGVwR3Vlc3RDb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gVGhlIHNpbmsgcmVjb3JkcyBleGVjdXRpb25zIGFzIHRoZXkgaGFwcGVuLCBzbyBndWVzdCBjb2RlIHRoYXRcbiAgICAgICAgICAvLyByYW4gYmVmb3JlIHRoZSBmYWlsdXJlIHN0aWxsIGNvdW50cyBhZ2FpbnN0IHJldGVudGlvbi5cbiAgICAgICAgICBndWVzdENvZGVTdGF0cy5leGVjdXRpb25zLnB1c2goLi4uc3RlcEd1ZXN0Q29kZS5leGVjdXRpb25zKTtcbiAgICAgICAgICBpZiAoIVNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBlLmcuIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6IGFuIFNESyBmYXVsdCwgbm90IGEgdXNlciB2YWx1ZVxuICAgICAgICAgICAgLy8gcHJvYmxlbS4gS2VlcCBpdHMgaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIGFuZCBjdXJyZW50XG4gICAgICAgICAgICAvLyBmYWlsLXRoZS1zdXNwZW5zaW9uIGJlaGF2aW9yLlxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN0ZXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgLy8gTm8gZGlzcGF0Y2ggdGFyZ2V0IG1lYW5zIG5vIHJlcGxheSB3aWxsIG9ic2VydmUgYVxuICAgICAgICAgICAgLy8gZmluYWxpemF0aW9uOiB0aGlzIGlzIHRoZSB0ZXJtaW5hbCBkcmFpbiAob3IgYSBjcmVhdGUtb25seVxuICAgICAgICAgICAgLy8gdGVzdCBjYWxsZXIpLiBUaGUgcnVuIGlzIGFscmVhZHkgY29tcGxldGluZy9mYWlsaW5nLCBzb1xuICAgICAgICAgICAgLy8gd3JpdGluZyBzdGVwX2NyZWF0ZWQgKyBzdGVwX2ZhaWxlZCBoZXJlIHdvdWxkIGxlYXZlIGUuZy4gYVxuICAgICAgICAgICAgLy8gQ09NUExFVEVEIHJ1biBjYXJyeWluZyBhIGZhaWxlZCBzdGVwIG5vdGhpbmcgY2FuIGV2ZXJcbiAgICAgICAgICAgIC8vIG9ic2VydmUsIHJlYWRpbmcgYXMgYSBidWcgZnJvbSB0aGUgZGFzaGJvYXJkLiBSZXRocm93XG4gICAgICAgICAgICAvLyBpbnN0ZWFkOyB0aGUgZHJhaW4ncyBvd24gY2F0Y2ggc3dhbGxvd3MgaXQsIHByZXNlcnZpbmcgaXRzXG4gICAgICAgICAgICAvLyBwcmUtZXhpc3RpbmcgYmVoYXZpb3IgKG5vIHJvd3MgZm9yIHRoZSB1bmF3YWl0ZWQgc3RlcCkuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwKHF1ZXVlSXRlbSwgZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ3Vlc3RDb2RlU3RhdHMuZXhlY3V0aW9ucy5wdXNoKC4uLnN0ZXBHdWVzdENvZGUuZXhlY3V0aW9ucyk7XG4gICAgICAgIC8vIERlZmVycmVkIChsYXp5KSBpbmxpbmUgc3RlcDogc2tpcCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlOyB0aGVcbiAgICAgICAgLy8gY2FsbGVyJ3MgaW5saW5lIGV4ZWN1dGVTdGVwIHdpbGwgc2VuZCBhIGxhenkgc3RlcF9zdGFydGVkIGNhcnJ5aW5nXG4gICAgICAgIC8vIHRoaXMgaW5wdXQsIGFuZCB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCAoZW50aXR5ICsgc3ludGhldGljXG4gICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudCkgYXRvbWljYWxseS4gV2UgZG8gTk9UIGFkZCBpdCB0b1xuICAgICAgICAvLyBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzOyBvd25lcnNoaXAgaXMgZGVjaWRlZCBieSB0aGF0IGxhenlcbiAgICAgICAgLy8gc3RlcF9zdGFydGVkJ3MgYXRvbWljIGNyZWF0ZS1jbGFpbSBpbnN0ZWFkLlxuICAgICAgICBpZiAobGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICBsYXp5SW5saW5lQnlDb3JyZWxhdGlvbklkLnNldChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICAgICAgZGVoeWRyYXRlZElucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHBhaXJGb2xkZWQpIHtcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIHBhaXIgdGhlIGRlZmVycmFsIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNhbGxlcidzIGxhenkgYHN0ZXBfc3RhcnRlZGA6IHRoZSBjcmVhdGVkIHJvdyBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgLy8gaW5wdXQgKHBheWxvYWRzIHJpZGUgY3JlYXRlcyBpbiBhIGJhdGNoKSwgdGhlIHN0YXJ0ZWQgcm93IGlzXG4gICAgICAgICAgICAvLyBiYXJlIGFuZCBzdGFtcHMgdGhpcyBpbnZvY2F0aW9uJ3Mgb3duZXJzaGlwLCB0aGUgc2FtZSBjbGFpbVxuICAgICAgICAgICAgLy8gc2hhcGUgdGhlIGxhenkgc3RhcnQgd291bGQgaGF2ZSBzZW50LCBzZXR0bGVkIGJ5IHRoZSBiYXRjaC5cbiAgICAgICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtY3JlYXRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlciArIDEsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtc3RhcnRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrZWQgYnkgaW5saW5lUGFpckZvbGRFbGlnaWJsZTsgc3ByZWFkIGtlZXBzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmFycm93LXRocm91Z2gtY2xvc3VyZSBwcm9ibGVtIGF3YXkgZnJvbSB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgICAgIC4uLihvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkID8geyBvd25lck1lc3NhZ2VJZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZmlyZSB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGFuZCB0aGVcbiAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCBpbiBwYXJhbGxlbDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGVcbiAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZFxuICAgICAgICAvLyB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0IChgcnVuSW5wdXRgKSBhbmRcbiAgICAgICAgLy8gcmVzaWxpZW50IGhvb2sgcmVzdW1lIChgaG9va0lucHV0YCkgcGF0dGVybnMuIE9ubHkgZm9yIGlucHV0cyB0aGVcbiAgICAgICAgLy8gcXVldWUgbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQuYnl0ZUxlbmd0aCA8PSBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgY3JlYXRlR3VhcmRlZChzdGVwRXZlbnQsIHsgcmVxdWVzdElkIH0pLFxuICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBpbXBsaWVkIGJ5IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGVcbiAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHN0ZXBJbnB1dDogeyBpbnB1dDogZGVoeWRyYXRlZElucHV0IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIFNhbWUga2V5IGFzIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzIGFuZCBhbnkgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3MsIHNvIHJlZHVuZGFudCBwdWJsaXNoZXMgZm9yIHRoaXMgc3RlcCBkZWR1cGUuIFRoZVxuICAgICAgICAgICAgICAvLyBrZXkgaXMgc3RlcC1pZGVudGl0eS1zY29wZWQgc28gYSByZXZva2VkIG1lc3NhZ2UgZm9yIGFcbiAgICAgICAgICAgICAgLy8gcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCBjYW5ub3QgYWJzb3JiIHRoZSBjb3JyZWN0ZWRcbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUncyBkaXNwYXRjaDogc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBxdWV1ZUl0ZW0uc3RlcE5hbWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIGZvciB0aGlzIHN1c3BlbnNpb24gcGFzczogd2l0aG91dFxuICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHRoZSBzdGVwIHdvdWxkIHJlbHkgb24gdGhlIGNyZWF0ZSBhbG9uZSwgYW5kIGlmIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBubyBkdXJhYmxlIHJlY29yZCBhdCBhbGwuXG4gICAgICAgICAgLy8gUHJvcGFnYXRpbmcgcmVkZWxpdmVycyB0aGUgb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoXG4gICAgICAgICAgLy8gcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpIHN0ZXBfY3JlYXRlZCBhbmQgcmUtZGlzcGF0Y2hlcyxcbiAgICAgICAgICAvLyB0aGUgc2FtZSByZWNvdmVyeSBhcyB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKGNyZWF0ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCwgc2FtZSBhcyB0aGUgc2VxdWVudGlhbFxuICAgICAgICAgICAgICAvLyBwYXRoLiBUaGUgc3RlcCBtZXNzYWdlIGlzIGFscmVhZHkgb3V0OyBhIGR1cGxpY2F0ZSBwdWJsaXNoXG4gICAgICAgICAgICAgIC8vIGJ5IHRoYXQgaGFuZGxlciBkZWR1cGVzIG9uIHRoZSBzaGFyZWQgaWRlbXBvdGVuY3kga2V5LlxuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSZXNpbGllbnQ6IHRoZSB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkgKDQyOSAvIDV4eCAvXG4gICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCkgYnV0IHRoZSBzdGVwIG1lc3NhZ2UgKGNhcnJ5aW5nIHRoZSBzYW1lXG4gICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlcyB0aGUgc3RlcF9jcmVhdGVkIGJlZm9yZSBleGVjdXRpbmcuXG4gICAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKys7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnU3RlcCBjcmVhdGlvbiBldmVudCB3cml0ZSBmYWlsZWQsIGJ1dCB0aGUgc3RlcCB3YXMgJyArXG4gICAgICAgICAgICAgICAgICAnZGlzcGF0Y2hlZCB2aWEgdGhlIHF1ZXVlLiBUaGUgc3RlcF9jcmVhdGVkIGV2ZW50IHdpbGwgJyArXG4gICAgICAgICAgICAgICAgICAnYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgICAgLy8gRm9sZCBpbnRvIHRoZSBiYXRjaCBpbnN0ZWFkIG9mIHdyaXRpbmcgaGVyZS4gVGhlIGVuY2xvc2luZ1xuICAgICAgICAgIC8vIHByb21pc2Ugam9pbnMgYGJhdGNoUHJlcHNgIChzZWUgdGhlIGxvb3AgYmVsb3cpLCBzbyB0aGUgZmx1c2hcbiAgICAgICAgICAvLyBvcCBjYW5ub3QgcnVuIGJlZm9yZSB0aGlzIHN0ZXAncyBpbnB1dCBmaW5pc2hlZCBkZWh5ZHJhdGluZy5cbiAgICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlcixcbiAgICAgICAgICAgIGtpbmQ6ICdzdGVwJyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIGV2ZW50OiBzdGVwRXZlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoc3RlcEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgICAgb3BzLnB1c2goc3RlcE9wKTtcbiAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBvcCB3YWl0cyBmb3IgZXZlcnkgcHJlcCBiZWZvcmUgY29tbWl0dGluZzsgYSBwcmVwIHRoYXRcbiAgICAgICAgLy8gcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlcyB0aHJvdWdoIGBvcHNgLCBzbyB0aGUgZmx1c2gncyBvd24gd2FpdFxuICAgICAgICAvLyBzd2FsbG93cyBpdCBhbmQgY29tbWl0cyB3aGF0ZXZlciB3YXMgc3VjY2Vzc2Z1bGx5IGVucXVldWVkLFxuICAgICAgICAvLyBwcmVzZXJ2aW5nIHRvZGF5J3MgcGVyLW9wIGluZGVwZW5kZW5jZS5cbiAgICAgICAgYmF0Y2hQcmVwcy5wdXNoKHN0ZXBPcC5jYXRjaCgoKSA9PiB7fSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB3YWl0IGV2ZW50cyAoc2FtZSBhcyBWMSlcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0RXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgcmVzdW1lQXQ6IHF1ZXVlSXRlbS5yZXN1bWVBdCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAvLyBXYWl0cyBuZWVkIG5vIGRlaHlkcmF0aW9uLCBzbyB0aGV5IGVucXVldWUgc3luY2hyb25vdXNseSwgYWZ0ZXJcbiAgICAgICAgLy8gZXZlcnkgc3RlcCdzIG9yZGVyIHNsb3QsIHByZXNlcnZpbmcgc3RlcHMtdGhlbi13YWl0cyBzY2hlZHVsaW5nXG4gICAgICAgIC8vIG9yZGVyIGluIHRoZSBsb2cuXG4gICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgb3JkZXI6IGJhdGNoT3JkZXJDb3VudGVyKyssXG4gICAgICAgICAga2luZDogJ3dhaXQnLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50OiB3YWl0RXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh3YWl0RXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmF0Y2hlZCBmb2xkJ3MgZmx1c2g6IHRoZSBjbGVhbiBmYW4tb3V0IGNvbW1pdHMgdGhyb3VnaFxuICAvLyBgY3JlYXRlQmF0Y2hgIGluIGNodW5rcyBvZiBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UUywgYWxsIGNodW5rcyBJTlxuICAvLyBGTElHSFQgQ09OQ1VSUkVOVExZLiBTbG90IGFzc2lnbm1lbnQgaXMgdGhlIHNlcnZlcidzLCBzbyBwYXJhbGxlbFxuICAvLyBjaHVua3MgcmFjZSBmb3Igc2xvdCByYW5nZXMgZXhhY3RseSBsaWtlIHRoZSBwcmUtZm9sZCBwYXRoJ3MgcGFyYWxsZWxcbiAgLy8gc2luZ2xlIHdyaXRlcyBkaWQ7IGVudGl0eSBjb25kaXRpb25zLCBub3QgY29tbWl0IG9yZGVyLCBjYXJyeVxuICAvLyBjb3JyZWN0bmVzcyAoc2libGluZyBmYW4tb3V0IGV2ZW50cyBoYXZlIG5vIGNyb3NzLW9yZGVyIHRoZSByZXBsYXlcbiAgLy8gZGVwZW5kcyBvbjsgaXQgbWF0Y2hlcyBieSBjb3JyZWxhdGlvbiBpZCkuIEVhY2ggZXZlbnQgcmVwb3J0cyB0aGVcbiAgLy8gb3V0Y29tZSBpdHMgb3duIHNpbmdsZSBjcmVhdGUgd291bGQgaGF2ZSBoYWQ6IGEgNDA5IGlzIHRoZSBzYW1lXG4gIC8vIGFscmVhZHktZXhpc3RzIHRvbGVyYW5jZSBhcyB0aGUgc2luZ2xlIHBhdGgsIGFueXRoaW5nIGVsc2UgZmFpbHMgdGhlXG4gIC8vIGRlbGl2ZXJ5IHRoZSB3YXkgYSBzaW5nbGUtcGF0aCByZWplY3Rpb24gd291bGQuXG4gIC8vXG4gIC8vIExhdGVuY3kgc2hhcGU6IG9ubHkgdGhlIGNodW5rIGNhcnJ5aW5nIHRoZSBwcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnNcbiAgLy8gZ2F0ZXMgdGhlIGhhbmRsZXIncyByZXR1cm4gKHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBvZmYgaXRzIGNsYWltcykuXG4gIC8vIEV2ZXJ5IG90aGVyIGNodW5rJ3MgY29tbWl0IChhbmQgZXZlcnkgY2h1bmsncyBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzLFxuICAvLyB3aGljaCBmaXJlIHRoZSBtb21lbnQgSVRTIGNyZWF0ZXMgYXJlIGR1cmFibGUpIHJpZGVzXG4gIC8vIGBkZWZlcnJlZEJhdGNoV29ya2Agd2hlbiB0aGUgY2FsbGVyIG9wdGVkIGluLCBqb2luZWQgYmVmb3JlIGFjay4gQSBzbG93XG4gIC8vIHNpYmxpbmcgY2h1bmsgdGhlcmVmb3JlIGRlbGF5cyBuZWl0aGVyIHRoZSBpbmxpbmUgYm9kaWVzIG5vciBhbm90aGVyXG4gIC8vIGNodW5rJ3MgcXVldWUgbWVzc2FnZXMsIHdoaWxlIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlIHN0aWxsIGhvbGRzIHBlclxuICAvLyBzdGVwOiBhIHN0ZXAncyBtZXNzYWdlIGlzIG9ubHkgZXZlciBzZW50IGFmdGVyIHRoZSBjaHVuayBjYXJyeWluZyBpdHNcbiAgLy8gY3JlYXRlIGhhcyBjb21taXR0ZWQuXG4gIGxldCBkZWZlcnJlZEJhdGNoV29yazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgaWYgKGJhdGNoRmFub3V0RWxpZ2libGUpIHtcbiAgICBvcHMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFByZXBzIHRoYXQgcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlIHRocm91Z2ggdGhlaXIgb3duIGBvcHNgXG4gICAgICAgIC8vIGVudHJpZXM7IHRoZSBmb2xkIGNvbW1pdHMgd2hhdGV2ZXIgd2FzIHN1Y2Nlc3NmdWxseSBlbnF1ZXVlZCxcbiAgICAgICAgLy8gcHJlc2VydmluZyB0b2RheSdzIHBlci1vcCBpbmRlcGVuZGVuY2UuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoUHJlcHMpO1xuICAgICAgICBpZiAoYmF0Y2hRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IFsuLi5iYXRjaFF1ZXVlXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICAgIC8vIEEgYmF0Y2ggb2YgT05FIGdhaW5zIG5vdGhpbmcgb3ZlciB0aGUgc2luZ2xlIHdyaXRlIChzYW1lIHJvdW5kXG4gICAgICAgIC8vIHRyaXApIGFuZCBsb3NlcyB0aGUgc2xvdC1zbmFwc2hvdCBwYXJhbXMgKyBidW1wLWFuZC1yZXBvcnQgdGhhdFxuICAgICAgICAvLyBjcmVhdGVHdWFyZGVkIHByb3ZpZGVzLCBzbyBhIGxvbmUgZWFnZXIgZXZlbnQgdGFrZXMgdGhlIG9yZGluYXJ5XG4gICAgICAgIC8vIHNpbmdsZSBwYXRoLCB3aXRoIHRoZSBzYW1lIGNvbmZsaWN0IHRvbGVyYW5jZSBhbmQgb3duZXJzaGlwXG4gICAgICAgIC8vIGJvb2trZWVwaW5nIGl0IHdvdWxkIGhhdmUgaGFkIHdpdGhvdXQgdGhlIGZvbGQuXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IFtlbnRyeV0gPSBlbnRyaWVzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKGVudHJ5LmV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnc3RlcCdcbiAgICAgICAgICAgICAgICAgID8gJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnXG4gICAgICAgICAgICAgICAgICA6ICdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWVkIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYyBiZWxvdy4gV2l0aCBjaHVua3NcbiAgICAgICAgLy8gY29tbWl0dGluZyBpbiBwYXJhbGxlbCB0aGVyZSBpcyBubyBwZXItY2h1bmsgXCJleHBlY3RlZCBuZXh0IHNsb3RcIjtcbiAgICAgICAgLy8gdGhlIHdob2xlIGZvbGQncyBjb21taXR0ZWQgc3BhbiBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzZWVkXG4gICAgICAgIC8vIG9uY2UgZXZlcnkgY2h1bmsgaGFzIHNldHRsZWQ6IGNvbW1pdHRlZCBzbG90cyBhcmUgZGVuc2UgcGVyIHRoZVxuICAgICAgICAvLyBXb3JsZCdzIGludmFyaWFudCwgc28gYW55IGV4Y2VzcyBvZiAobWF4IGNvbW1pdHRlZCBzbG90IOKIkiBzZWVkICtcbiAgICAgICAgLy8gMSkgb3ZlciB0aGUgZm9sZCdzIG93biBjb21taXR0ZWQgY291bnQgaXMgZXZlbnRzIE9USEVSIHdyaXRlcnNcbiAgICAgICAgLy8gbGFuZGVkIGluIGJldHdlZW4uXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkRmlyc3RTbG90ID0gZXZlbnRMb2dcbiAgICAgICAgICA/IChtYXhFdmVudFNsb3QoZXZlbnRMb2cuZXZlbnRzKSA/PyAwKSArIDFcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUGFpci1hd2FyZSBjaHVua2luZzogYSBwcmUtY2xhaW1lZCBwYWlyJ3MgdHdvIHJvd3MgbXVzdCBsYW5kIGluXG4gICAgICAgIC8vIHRoZSBzYW1lIGNyZWF0ZUJhdGNoIGNhbGwgKGFkamFjZW50LCBzbyBhIFdvcmxkIGNhbiBmb2xkIHRoZW1cbiAgICAgICAgLy8gaW50byBvbmUgYm9ybi1ydW5uaW5nIGNyZWF0ZSkgYW5kIG5ldmVyIHN0cmFkZGxlIGEgY2h1bmtcbiAgICAgICAgLy8gYm91bmRhcnksIHdoaWNoIHdvdWxkIHR1cm4gdGhlIHN0YXJ0ZWQgcm93IGludG8gYSBzdGFuZGFsb25lXG4gICAgICAgIC8vIGNsYWltIHJhY2luZyBpdHMgb3duIGNyZWF0ZSdzIGNvbW1pdC5cbiAgICAgICAgY29uc3QgY2h1bmtzOiAodHlwZW9mIGVudHJpZXMpW10gPSBbXTtcbiAgICAgICAge1xuICAgICAgICAgIGxldCBjdXJyZW50OiB0eXBlb2YgZW50cmllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBlbnRyaWVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBwYWlyTGVhZCA9XG4gICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgbmV4dD8ua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJyAmJlxuICAgICAgICAgICAgICBuZXh0LmNvcnJlbGF0aW9uSWQgPT09IGVudHJ5LmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gcGFpckxlYWQgPyAyIDogMTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VycmVudC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoICsgdGFrZSA+IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBpZiAocGFpckxlYWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPiAwKSBjaHVua3MucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwcyB3aG9zZSBxdWV1ZSBtZXNzYWdlcyBUSElTIEZMVVNIIHdpbGwgcHVibGlzaCAodGhlIGVhZ2VyXG4gICAgICAgIC8vIGNyZWF0ZXMpLCByZWNvcmRlZCBiZWZvcmUgYW55IGNodW5rIHNldHRsZXMgc28gdGhlIGNhbGxlcidzXG4gICAgICAgIC8vIGRpc3BhdGNoIHBhc3MgKHdoaWNoIHJ1bnMgb2ZmIHRoZSBoYW5kbGVyJ3MgcmV0dXJuKSBza2lwcyB0aGVtLlxuICAgICAgICAvLyBUaGUgc2VuZHMgYXJlIGd1YXJhbnRlZWQtb3ItZmFpbGVkIGJ5IHRoZSB0cmFpbGluZyB3b3JrIHRoZVxuICAgICAgICAvLyBjYWxsZXIgam9pbnMgYmVmb3JlIGFja2luZywgc28gXCJ3aWxsIGJlIHB1Ymxpc2hlZCBieSB0aGlzIGZsdXNoXCJcbiAgICAgICAgLy8gYW5kIFwiYWxyZWFkeSBwdWJsaXNoZWRcIiBhcmUgZXF1aXZhbGVudCBmcm9tIHRoZSBjYWxsZXIncyBzaWRlLlxuICAgICAgICBjb25zdCBwdWJsaXNoRWFnZXJTdGVwcyA9IHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHVibGlzaEVhZ2VyU3RlcHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChlbnRyeS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUYWxsaWVzIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYywgZm9sZGVkIGFjcm9zc1xuICAgICAgICAvLyB0aGUgY29uY3VycmVudCBjaHVua3MgYW5kIHJlYWQgb25jZSBhbGwgb2YgdGhlbSBzZXR0bGVkLlxuICAgICAgICBsZXQgY29tbWl0dGVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgbWF4Q29tbWl0dGVkU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGNvbW1pdENodW5rID0gYXN5bmMgKGNodW5rOiB0eXBlb2YgZW50cmllcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIC8vIEFuY2hvcnMgZm9yIHRoZSBwcmUtY2xhaW1lZCBzdGVwcycgdGVsZW1ldHJ5OiB0aGUgUE9TVCBpbnN0YW50XG4gICAgICAgICAgLy8gaXMgdGhlIGNsYWltJ3MgXCJzdGFydCBQT1NUIHNlbnRcIiAoUlNGUydzIGVuZCksIHRoZSByZXR1cm4gaXMgdGhlXG4gICAgICAgICAgLy8gY2xhaW0ncyBjb21wbGV0aW9uIChUVFIncyBUNiksIHRoZSBzYW1lIHR3byBpbnN0YW50cyB0aGUgbGF6eVxuICAgICAgICAgIC8vIGNsYWltJ3Mgb3duIFBPU1Qgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICAgICAgICBjb25zdCBiYXRjaFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBiYXRjaEZhbm91dEVsaWdpYmxlIGltcGxpZXMgcHJlc2VuY2VcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCEoXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGNodW5rLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXJ0ZWQgcm93IGlzIHRoZSBzdGVwJ3MgZXhlY3V0aW5nIGNsYWltLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgIC8vIHRoZSBjb21wdXRlLWluc3RhbmNlIGF0dHJpYnV0aW9uIHRoZSBzaW5nbGUgY2xhaW0gc2VuZHMgdmlhXG4gICAgICAgICAgICAgIC8vIENyZWF0ZUV2ZW50UGFyYW1zLlxuICAgICAgICAgICAgICAuLi4oZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICAgID8geyBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAvLyBQZXItd3JpdGUgcmVxdWVzdCBhdHRyaWJ1dGlvbiwgc2FtZSBhcyB0aGUgc2luZ2xlIHBhdGgnc1xuICAgICAgICAgICAgLy8gY3JlYXRlR3VhcmRlZCjigKYsIHsgcmVxdWVzdElkIH0pLlxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1Db21wbGV0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2YgcmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2h1bmtbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwYWlyIGNvbW1pdHRlZDogdGhpcyBpbnZvY2F0aW9uIG93bnMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBydW5zIHRoZSBib2R5IHdpdGggbm8gY2xhaW0gb2YgaXRzIG93bi4gVGhlXG4gICAgICAgICAgICAgICAgLy8gcmVhZGJhY2sgZW50aXR5IGlzIGF1dGhvcml0YXRpdmUgd2hlcmUgcHJlc2VudDsgYSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgb21pdHRlZCBpdCBnZXRzIHRoZSBzYW1lIGxvY2FsbHkgc3ludGhlc2l6ZWQgcnVubmluZ1xuICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQtMSB0aGUgb3B0aW1pc3RpYyBwYXRoIGV4ZWN1dGVzIGFnYWluc3QuIEVpdGhlclxuICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgaW5wdXQgaXMgcmUtYXR0YWNoZWQgbG9jYWxseTogYmF0Y2ggcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHJlZnMgbGF6aWx5LCBhbmQgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3QgYnl0ZXMgdGhlIHBhaXIncyBjcmVhdGVkIHJvdyBjYXJyaWVkLiAoVGhlIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAvLyByb3cncyBzdWNjZXNzIGlzIGRlbGliZXJhdGVseSBOT1QgbWVtYmVyc2hpcCBpblxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM6IGZvciBpbmxpbmUgc3RlcHMgb3duZXJzaGlwIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0ZWQgcm93J3MgdmVyZGljdCwgYW5kIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzXG4gICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5saW5lIGNvcnJlbGF0aW9uIGlkcyByZWdhcmRsZXNzLilcbiAgICAgICAgICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoXG4gICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogdGhlIHNhbWUgcHJlcCBvcCB0aGF0IGVucXVldWVkIHRoZSBwYWlyIHNldFxuICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnRyeSwgYW5kIHRoZSBmbHVzaCBhd2FpdGVkIGV2ZXJ5IHByZXAgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGZyZWUgaWYgaXQgZXZlciBmaXJlcywgdGhvdWdoOiB0aGUgcGFpciBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIGhlcmUsIHNvIHRoaXMgdGhyb3dzIHdpdGggdGhlIHN0ZXAgY2xhaW1lZCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBib2R5IG5ldmVyIHJ1bi4gVGhlIGRlbGl2ZXJ5IGZhaWxzLCBhbmQgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnMgaXQgdGhyb3VnaCBvd25lZC1yZWNvdmVyeSAodGhlIHN0ZXAgY2FycmllcyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duZXJzaGlwIHN0YW1wKSByYXRoZXIgdGhhbiB0aGUgcmVxdWVzdCBqdXN0XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGNsZWFubHkuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbm8gZGVoeWRyYXRlZCBpbnB1dCBmb3IgcHJlLWNsYWltZWQgc3RlcCAke2VudHJ5LmNvcnJlbGF0aW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRTdGVwOiBTdGFydGVkU3RlcCA9IGl0ZW0uc3RlcD8uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbS5zdGVwLCBzdGFydGVkQXQ6IGl0ZW0uc3RlcC5zdGFydGVkQXQgfVxuICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBkZWh5ZHJhdGVkLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICAgICAgICBvd25lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhcnRlZFN0ZXAsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiYXRjaFBvc3RTZW50QXRNcyxcbiAgICAgICAgICAgICAgICAgIGNsYWltQ29tcGxldGVkQXRNcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnaW5saW5lLWNyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFpciBsb3N0IGl0cyBhdG9taWMgY3JlYXRlLWNsYWltOiBhIGNvbmN1cnJlbnQgd3JpdGVyXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvd25zIHRoaXMgc3RlcCAoYW4gZWFybGllciBkZWxpdmVyeSdzIGNyZWF0ZSwgb3IgYVxuICAgICAgICAgICAgICAgIC8vIHJhY2luZyBoYW5kbGVyJ3MgY2xhaW0pLiBSZWNvcmRlZCBhcyBhIGxvc3QgY2xhaW06IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlcidzIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGVcbiAgICAgICAgICAgICAgICAvLyBib2R5LCB0aGUgc2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eSBjbGFpbS4gQSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgZm9sZHMgdGhlIHBhaXIgcmVwb3J0cyB0aGUgNDA5IG9uIGJvdGggcm93cyAoc2V0XG4gICAgICAgICAgICAgICAgLy8gdHdpY2UsIGhhcm1sZXNzKTsgb25lIHRoYXQgZXZhbHVhdGVzIHJvd3MgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgc3RhcnRlZCByb3cgKHByb2Nlc3NlZCBzZWNvbmQpIGRlY2lkZSwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBzaW5nbGUgcGF0aCdzIHNlbWFudGljcyAoY3JlYXRlIGxvc3QgKyBjbGFpbVxuICAgICAgICAgICAgICAgIC8vIHdvbiBzdGlsbCBydW5zIHRoZSBib2R5OyBjcmVhdGUgd29uICsgY2xhaW0gbG9zdCBza2lwcykuXG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7IG93bmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0lubGluZSBzdGVwIHByZS1jbGFpbSBsb3N0LCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaXRlbS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNhbWUgdG9sZXJhbmNlIGFzIHRoZSBzaW5nbGUgcGF0aCdzIEVudGl0eUNvbmZsaWN0RXJyb3I6IGFcbiAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBvciBlYXJsaWVyIGRlbGl2ZXJ5IGFscmVhZHkgY3JlYXRlZCBpdC5cbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdzdGVwJ1xuICAgICAgICAgICAgICAgICAgPyAnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZydcbiAgICAgICAgICAgICAgICAgIDogJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYGJhdGNoZWQgJHtlbnRyeS5ldmVudC5ldmVudFR5cGV9IGZvciAke2VudHJ5LmNvcnJlbGF0aW9uSWR9IGAgK1xuICAgICAgICAgICAgICAgIGBmYWlsZWQ6ICR7aXRlbS5lcnJvcn06ICR7aXRlbS5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIHsgc3RhdHVzOiBpdGVtLnN0YXR1cyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIaWdoZXN0IHNsb3QgdGhpcyBjaHVuayBjb21taXR0ZWQ6IHRoZSBjZWlsaW5nIHRoZSBjYWxsZXIgZm9sZHNcbiAgICAgICAgICAvLyBpbnRvIHRoZSBpbmxpbmUgZXhlY3V0aW9ucycgc2xvdCBzbmFwc2hvdCAoc2VlXG4gICAgICAgICAgLy8gU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZykgYW5kIG9uZSBpbnB1dFxuICAgICAgICAgIC8vIG9mIHRoZSBpbnRlcmxlYXZpbmcgZGlhZ25vc3RpYy5cbiAgICAgICAgICBjb25zdCBjaHVua01heFNsb3QgPSBtYXhFdmVudFNsb3QoXG4gICAgICAgICAgICByZXN1bHRzLmZsYXRNYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmV2ZW50ID8gW2l0ZW0uZXZlbnRdIDogW11cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNodW5rTWF4U2xvdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAoYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIGNodW5rTWF4U2xvdCA+IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nID0gY2h1bmtNYXhTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21taXR0ZWRDb3VudCArPSByZXN1bHRzLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaHVua01heFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKG1heENvbW1pdHRlZFNsb3QgPT09IHVuZGVmaW5lZCB8fCBjaHVua01heFNsb3QgPiBtYXhDb21taXR0ZWRTbG90KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCA9IGNodW5rTWF4U2xvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgY2h1bmsncyBlYWdlciBzdGVwcycgcXVldWUgbWVzc2FnZXMgdGhlIG1vbWVudCBJVFNcbiAgICAgICAgLy8gY3JlYXRlcyBhcmUgZHVyYWJsZSwgdGhlIHBlci1jaHVuayBoYWxmIG9mIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlLlxuICAgICAgICAvLyBTYW1lIG1lc3NhZ2Ugc2hhcGUgYW5kIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleSBhcyB0aGVcbiAgICAgICAgLy8gY2FsbGVyJ3MgZGlzcGF0Y2ggcGFzcywgc28gYW55dGhpbmcgZG91YmxlLXB1Ymxpc2hlZCBkZWR1cGVzLlxuICAgICAgICBjb25zdCBwdWJsaXNoQ2h1bmtTdGVwcyA9IGFzeW5jIChcbiAgICAgICAgICBjaHVuazogdHlwZW9mIGVudHJpZXNcbiAgICAgICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgaWYgKCFwdWJsaXNoRWFnZXJTdGVwcykgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHN0ZXBFbnRyaWVzID0gY2h1bmsuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkua2luZCA9PT0gJ3N0ZXAnKTtcbiAgICAgICAgICBpZiAoc3RlcEVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBzdGVwRW50cmllcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBwdWJsaXNoRWFnZXJTdGVwcyBpbXBsaWVzIHByZXNlbmNlXG4gICAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGVudHJ5LnN0ZXBOYW1lISxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGVwTmFtZSFcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBMYXVuY2ggZXZlcnkgY2h1bmsncyBQT1NUIG5vdzsgY2hhaW4gZWFjaCBjaHVuaydzIHB1Ymxpc2hlcyBvbiBpdHNcbiAgICAgICAgLy8gT1dOIGNvbW1pdC4gQSBjaHVuayB3aG9zZSBjb21taXQgcmVqZWN0ZWQga2VlcHMgaXRzIG1lc3NhZ2VzXG4gICAgICAgIC8vIHVuc2VudCAodGhlIHJlamVjdGlvbiBmYWlscyB0aGUgZGVsaXZlcnk7IHJlZGVsaXZlcnkgcmUtY3JlYXRlc1xuICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcywgZGVkdXBlZCBieSB0aGUgaWRlbXBvdGVuY3kga2V5cykuXG4gICAgICAgIGNvbnN0IGNvbW1pdHMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gY29tbWl0Q2h1bmsoY2h1bmspKTtcbiAgICAgICAgY29uc3QgcHVibGlzaGVzID0gY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGluZGV4KSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29tbWl0c1tpbmRleF07XG4gICAgICAgICAgYXdhaXQgcHVibGlzaENodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0cmFpbGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gTGV0IGV2ZXJ5IHNpYmxpbmcgc2V0dGxlIGJlZm9yZSBzdXJmYWNpbmcgdGhlIGZpcnN0IGZhaWx1cmU6IGFcbiAgICAgICAgICAvLyBjaHVuayB0aGF0IGNvbW1pdHRlZCBtdXN0IHN0aWxsIGdldCBpdHMgcHVibGlzaGVzIG91dCBldmVuIHdoZW5cbiAgICAgICAgICAvLyBhbm90aGVyIGNodW5rIGZhaWxlZCwgYW5kIHRoZSBjYWxsZXIgYWNrcyBvbmx5IGFmdGVyIHRoaXNcbiAgICAgICAgICAvLyByZXNvbHZlcy5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5jb21taXRzLCAuLi5wdWJsaXNoZXNdKTtcbiAgICAgICAgICAvLyBGb3JlaWduLWludGVybGVhdmluZyB2aXNpYmlsaXR5OiB0aGUgYmF0Y2ggZW5kcG9pbnQgaGFzIG5vXG4gICAgICAgICAgLy8gYnVtcC1hbmQtcmVwb3J0LCBzbyBldmVudHMgb3RoZXIgd3JpdGVycyBsYW5kZWQgYmV0d2VlbiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBhbmQgdGhlc2UgY29tbWl0cyBwdXNoZWQgdGhlIGZvbGQgdG8gaGlnaGVyIHNsb3RzXG4gICAgICAgICAgLy8gV0lUSE9VVCBoYW5kaW5nIHVzIHRoZSBza2lwcGVkIGV2ZW50cy4gU2FtZSBhY2NlcHRlZCBleHBvc3VyZVxuICAgICAgICAgIC8vIGFzIGEgZHJvcHBlZCB0cnVuY2F0ZWQgcmVwb3J0IG9uIHRoZSBzaW5nbGUgcGF0aDogdGhlIGxvY2FsXG4gICAgICAgICAgLy8gbG9nIHN0YXlzIGEgc3RyaWN0IHByZWZpeCBhbmQgdGhlIG5leHQgcmVsb2FkIG9ic2VydmVzIHRoZW0uXG4gICAgICAgICAgLy8gTG9nZ2VkIHNvIGEgYnVtcCBpcyBkaWFnbm9zYWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhwZWN0ZWRGaXJzdFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmxlYXZlZCA9XG4gICAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgLSBleHBlY3RlZEZpcnN0U2xvdCArIDEgLSBjb21taXR0ZWRDb3VudDtcbiAgICAgICAgICAgIGlmIChpbnRlcmxlYXZlZCA+IDApIHtcbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnQmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCBhYm92ZSBzbmFwc2hvdCcsIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEZpcnN0U2xvdCxcbiAgICAgICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90LFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZENvdW50LFxuICAgICAgICAgICAgICAgIGludGVybGVhdmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmFpbHVyZSA9IHNldHRsZWQuZmluZChcbiAgICAgICAgICAgIChvdXRjb21lKTogb3V0Y29tZSBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT5cbiAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdyZWplY3RlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLnJlYXNvbjtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyBFVkVSWSBjaHVuayBjYXJyeWluZyBwYWlycyBnYXRlcyB0aGUgcmV0dXJuLCBub3QganVzdCB0aGUgZmlyc3Q6XG4gICAgICAgIC8vIGEgcGFpciB3aG9zZSBjb21taXQgdGhlIGNhbGxlciBoYXMgbm90IHNlZW4geWllbGRzIG5vXG4gICAgICAgIC8vIGBpbmxpbmVDbGFpbXNgIGVudHJ5LCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBsYXp5XG4gICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgd291bGQgcmFjZSB0aGlzIHNhbWUgZm9sZCdzIHN0aWxsLWluLWZsaWdodFxuICAgICAgICAvLyBwYWlyIGZvciB0aGUgc2FtZSBzdGVwLiBUb2RheSBwYWlycyBhbHdheXMgbGFuZCBpbiBvbmUgY2h1bmtcbiAgICAgICAgLy8gKHRoZXkgc29ydCBmaXJzdCwgYW5kIHR3byByb3dzIHBlciBpbmxpbmUgc3RlcCBmaXQgaW5zaWRlIG9uZVxuICAgICAgICAvLyBjaHVuaywgcGlubmVkIGJ5IGNvbnN0YW50cy50ZXN0LnRzKSwgc28gdGhpcyBpcyBhdCBtb3N0IG9uZVxuICAgICAgICAvLyBjb21taXQ7IHRoZSBmaWx0ZXIgaXMgd2hhdCBrZWVwcyB0aGUgcHJvcGVydHkgdHJ1ZSBpZiBlaXRoZXIgY2FwXG4gICAgICAgIC8vIG1vdmVzLlxuICAgICAgICBjb25zdCBwYWlyQ29tbWl0cyA9IGNodW5rcy5mbGF0TWFwKChjaHVuaywgaW5kZXgpID0+XG4gICAgICAgICAgY2h1bmsuc29tZSgoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCcpXG4gICAgICAgICAgICA/IFtjb21taXRzW2luZGV4XV1cbiAgICAgICAgICAgIDogW11cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFsbG93RGVmZXJyZWRCYXRjaFdvcmspIHtcbiAgICAgICAgICAvLyBUaGUgdHJhaWxpbmcgd29yayBpcyB0aGUgY2FsbGVyJ3MgdG8gam9pbiBiZWZvcmUgYWNrLiBBdHRhY2ggYVxuICAgICAgICAgIC8vIGhhbmRsZXIgbm93IHNvIGEgcmVqZWN0aW9uIHRoYXQgcmFjZXMgdGhhdCBqb2luIChvciBhIGZvcmVncm91bmRcbiAgICAgICAgICAvLyBmYWlsdXJlIHRoYXQgcHJldmVudHMgdGhlIGNhbGxlciBmcm9tIGV2ZXIgcmVhY2hpbmcgaXQpIGlzIG5ldmVyXG4gICAgICAgICAgLy8gYW4gdW5oYW5kbGVkUmVqZWN0aW9uOyBhd2FpdGluZyB0aGUgcHJvbWlzZSBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICB0cmFpbGluZy5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgZGVmZXJyZWRCYXRjaFdvcmsgPSB0cmFpbGluZztcbiAgICAgICAgICAvLyBPbmx5IHRoZSBwYWlyIGNodW5rcyBnYXRlIHRoZSByZXR1cm46IHRoZWlyIGNsYWltcyBhcmUgd2hhdCB0aGVcbiAgICAgICAgICAvLyBjYWxsZXIgc3RhcnRzIHRoZSBpbmxpbmUgYm9kaWVzIGZyb20uIFdpdGggbm8gcGFpcnMgdGhlcmUgaXNcbiAgICAgICAgICAvLyBub3RoaW5nIHRoZSBjYWxsZXIncyBwb3N0LXJldHVybiB3b3JrIHJlYWRzIGZyb20gdGhlIGNvbW1pdHMsXG4gICAgICAgICAgLy8gc28gbm90aGluZyBnYXRlcy5cbiAgICAgICAgICBpZiAocGFpckNvbW1pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGFpckNvbW1pdHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIEEgcGFpciBjaHVuayBmYWlsZWQsIHNvIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgaXMgTk9UIHRoZVxuICAgICAgICAgICAgICAvLyBjYWxsZXIncyB0byBqb2luIGFueSBtb3JlOiBgZGVmZXJyZWRCYXRjaFdvcmtgIG5ldmVyXG4gICAgICAgICAgICAgIC8vIHJlYWNoZXMgaXQgb25jZSBoYW5kbGVTdXNwZW5zaW9uIHRocm93cy4gU2V0dGxlIHRoZSByZXN0XG4gICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcmVqZWN0aW9uIGVzY2FwZXMsIGZvciB0aGUgcmVhc29uIGBzZXR0bGVQaGFzZWBcbiAgICAgICAgICAgICAgLy8gZ2l2ZXM6IGEgc2libGluZyBjcmVhdGUgbGFuZGluZyBhZnRlciB0aGUgdGhyb3cgY29tbWl0cyBhblxuICAgICAgICAgICAgICAvLyBldmVudCBmcm9tIHRoZSBhYmFuZG9uZWQgcmVwbGF5J3Mgc2VlZGVkIHNlcXVlbmNlIGFuZCByYWNlc1xuICAgICAgICAgICAgICAvLyB0aGUgY2FsbGVyJ3MgcmVzdGFydCByZWxvYWQgd2hpbGUgZG9pbmcgc28uXG4gICAgICAgICAgICAgIGF3YWl0IHRyYWlsaW5nLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0cmFpbGluZztcbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBhdHRyaWJ1dGVJdGVtcykge1xuICAgIG9wcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIC8vIEd1YXJkZWQgbGlrZSBldmVyeSBvdGhlciBzdXNwZW5zaW9uIHdyaXRlOiBhbiBhdHRyX3NldCBpcyBhXG4gICAgICAgICAgLy8gcmVwbGF5LWRlcml2ZWQgZXZlbnQgd2l0aCBhIGNvcnJlbGF0aW9uIGlkIGZyb20gdGhpcyByZXBsYXknc1xuICAgICAgICAgIC8vIHNlZWRlZCBzZXF1ZW5jZSwgc28gaXQgbXVzdCBub3QgbGFuZCBvbiBhIGxvZyB0aGUgcmVwbGF5IG5ldmVyXG4gICAgICAgICAgLy8gc2F3LiBSZWplY3RpbmcgaXQgaXMgY2hlYXA6IGEgcnVuIHdpdGggYXR0cmlidXRlIGV2ZW50cyBhbHJlYWR5XG4gICAgICAgICAgLy8gZm9yY2VzIGFuIGluLXByb2Nlc3MgcmVwbGF5LCBzbyB0aGUgcmVzdGFydCBjb3N0cyB0aGUgcmVwbGF5IGl0XG4gICAgICAgICAgLy8gd2FzIGdvaW5nIHRvIGRvIGFueXdheS5cbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdhdHRyX3NldCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IHF1ZXVlSXRlbS5jaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHdyaXRlcjogeyB0eXBlOiAnd29ya2Zsb3cnIH0sXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgPyB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1dvcmxkVmFsaWRhdGlvbkZhaWx1cmUoZXJyKSkge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5pc3RpYyB2YWxpZGF0aW9uIHJlamVjdGlvbiBmcm9tIHRoZSBXb3JsZCwgZS5nLiB0aGVcbiAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgcGVyLXJ1biBhdHRyaWJ1dGUgY2FwLCB3aGljaCBvbmx5IHRoZSBXb3JsZCBjYW5cbiAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgdGhlIHJ1bidzIGV4aXN0aW5nIGF0dHJpYnV0ZXMuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJlcGxheXMgdGhlIHdvcmtmbG93IGludG8gdGhlIGV4YWN0IHNhbWVcbiAgICAgICAgICAgIC8vIHdyaXRlIGFuZCB0aGUgZXhhY3Qgc2FtZSByZWplY3Rpb24sIHNvIHJldHJ5aW5nIGNhbiBuZXZlclxuICAgICAgICAgICAgLy8gc3VjY2VlZC4gU3VyZmFjZSBpdCBhcyBhIEZhdGFsRXJyb3Igc28gdGhlIGNhbGxlciBmYWlscyB0aGVcbiAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiB3ZWRnaW5nIGl0IGluIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgc2V0QXR0cmlidXRlcyBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgIHRocm93IGZhdGFsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEF3YWl0IHRoZSBzdGVwX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgZXZlbnQgY3JlYXRlcyBiZWZvcmUgcmV0dXJuaW5nLlxuICAvLyBUaGUgY2FsbGVyICh3b3JrZmxvd0VudHJ5cG9pbnQpIG9ubHkgZW5xdWV1ZXMgdGhlIHN0ZXAtZGlzcGF0Y2ggcXVldWVcbiAgLy8gbWVzc2FnZXMgQUZURVIgaGFuZGxlU3VzcGVuc2lvbiByZXNvbHZlcywgYW5kIHRoZSBxdWV1ZSBoYW5kbGVyIGFja3NcbiAgLy8gdGhlIG9yY2hlc3RyYXRvciBtZXNzYWdlIG9ubHkgYWZ0ZXIgdGhlIGNhbGxlciByZXNvbHZlcy4gU28gdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyBldmVudHMgbXVzdCBiZSBkdXJhYmxlIGhlcmUsIGFuZCB0aGUgZGlzcGF0Y2ggc2VuZHMgbXVzdCBjb21wbGV0ZSBpbiB0aGUgY2FsbGVyLFxuICAvLyBhbGwgYmVmb3JlIGFjay4gSWYgdGhlIHByb2Nlc3MgY3Jhc2hlcyBiZWZvcmUgdGhpcyByZXNvbHZlcywgdGhlIG9yY2hlc3RyYXRvclxuICAvLyBtZXNzYWdlIGlzIG5vdCBhY2tlZCBhbmQgVlFTIHJlZGVsaXZlcnMsIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAvLyBzdGVwX2NyZWF0ZWQgYW5kIHJlLWRpc3BhdGNoZXMsIGFuZCByZWNvdmVycyB0aGUgcnVuIGluc3RlYWQgb2Ygb3JwaGFuaW5nIGl0LlxuICBhd2FpdCBzZXR0bGVQaGFzZShvcHMpO1xuXG4gIC8vIFRoZSBzdGVwLWlucHV0IGRlaHlkcmF0aW9ucyBhYm92ZSBoYXZlIHNldHRsZWQsIHNvIHRoZSBzaW5rIGlzIGZpbmFsLlxuICBjb25zdCByZXRhaW5lZFN0ZXBJbnB1dHNTYWZlID0gZ3Vlc3RDb2RlU3RhdHMuZXhlY3V0aW9ucy5sZW5ndGggPT09IDA7XG4gIGlmICghcmV0YWluZWRTdGVwSW5wdXRzU2FmZSkge1xuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAnU2VyaWFsaXppbmcgc3RlcCBpbnB1dHMgZXhlY3V0ZWQgd29ya2Zsb3cgY29kZTsgZmFsbGluZyBiYWNrIHRvIHJlcGxheSBpbnN0ZWFkIG9mIHJldGFpbmluZyB0aGUgVk0nLFxuICAgICAge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXhlY3V0aW9uczogZ3Vlc3RDb2RlU3RhdHMuZXhlY3V0aW9uc1xuICAgICAgICAgIC5zbGljZSgwLCA1KVxuICAgICAgICAgIC5tYXAoKGUpID0+IChlLmRldGFpbCA/IGAke2Uua2luZH0oJHtlLmRldGFpbH0pYCA6IGUua2luZCkpLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvLyBSZWJ1aWxkIHRoZSBpbmxpbmUgYmF0Y2ggaW4gZGV0ZXJtaW5pc3RpYyBvcmRlci4gYGxhenlJbmxpbmVDb3JyZWxhdGlvbklkc2BcbiAgLy8gaXMgYSBTZXQgc2VlZGVkIGZyb20gdGhlIG9yZGVyZWQgZmlyc3QtTiBzbGljZSwgc28gaXRlcmF0aW5nIGl0IHByZXNlcnZlc1xuICAvLyBzdGVwSXRlbXMgb3JkZXI7IGV2ZXJ5IGlkIGluIGl0IHdhcyBzZXQgYnkgdGhlIGxhenkgYnJhbmNoIGFib3ZlLlxuICBjb25zdCBsYXp5SW5saW5lU3RlcHM6IFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydsYXp5SW5saW5lU3RlcHMnXSA9IFtdO1xuICBmb3IgKGNvbnN0IGNvcnJlbGF0aW9uSWQgb2YgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzKSB7XG4gICAgY29uc3QgbGF6eVN0ZXAgPSBsYXp5SW5saW5lQnlDb3JyZWxhdGlvbklkLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICBpZiAobGF6eVN0ZXApIGxhenlJbmxpbmVTdGVwcy5wdXNoKGxhenlTdGVwKTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IChtaW5pbXVtIHRpbWVvdXQpXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGxldCBzb29uZXN0V2FpdDogeyBzZWNvbmRzOiBudW1iZXI7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiB3YWl0SXRlbXMpIHtcbiAgICBjb25zdCByZXN1bWVBdE1zID0gcXVldWVJdGVtLnJlc3VtZUF0LmdldFRpbWUoKTtcbiAgICBjb25zdCBkZWxheU1zID0gTWF0aC5tYXgoMTAwMCwgcmVzdW1lQXRNcyAtIG5vdyk7XG4gICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLmNlaWwoZGVsYXlNcyAvIDEwMDApO1xuICAgIGlmICghc29vbmVzdFdhaXQgfHwgdGltZW91dFNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICBzb29uZXN0V2FpdCA9IHtcbiAgICAgICAgc2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ3dvcmtmbG93X3N1c3BlbmRlZCcpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0ZXBzQ3JlYXRlZChzdGVwSXRlbXMubGVuZ3RoKSxcbiAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dIb29rc0NyZWF0ZWQoaG9va3NOZWVkaW5nQ3JlYXRpb24ubGVuZ3RoKSxcbiAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dXYWl0c0NyZWF0ZWQod2FpdEl0ZW1zLmxlbmd0aCksXG4gICAgLi4uKGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcy5zaXplID4gMFxuICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dTdGVwc0ZhaWxlZFNlcmlhbGl6YXRpb24oXG4gICAgICAgICAgZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLnNpemVcbiAgICAgICAgKVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkID4gMFxuICAgICAgPyBBdHRyaWJ1dGUuU3RlcFJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKVxuICAgICAgOiB7fSksXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcGVuZGluZ1N0ZXBzOiBzdGVwSXRlbXMsXG4gICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcyxcbiAgICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMsXG4gICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLFxuICAgIGxhenlJbmxpbmVTdGVwcyxcbiAgICBpbmxpbmVDbGFpbXMsXG4gICAgYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyxcbiAgICBkZWZlcnJlZEJhdGNoV29yayxcbiAgICAvLyBPbiBob29rIGNvbmZsaWN0IHRoZSBjYWxsZXIgcmUtaW52b2tlcyBpbW1lZGlhdGVseSBhbmQgbmV2ZXIgcmVhZHNcbiAgICAvLyB0aGUgd2FpdCB0aW1lb3V0LCBzbyBkb24ndCByZXBvcnQgb25lLlxuICAgIHdhaXRUaW1lb3V0OiBoYXNIb29rQ29uZmxpY3QgPyB1bmRlZmluZWQgOiBzb29uZXN0V2FpdCxcbiAgICBoYXNIb29rQ29uZmxpY3QsXG4gICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICBoYXNBdHRyaWJ1dGVFdmVudHM6IGF0dHJpYnV0ZUl0ZW1zLmxlbmd0aCA+IDAsXG4gICAgaGFzSG9va0V2ZW50czogaG9va3NOZWVkaW5nQ3JlYXRpb24ubGVuZ3RoID4gMCxcbiAgICBob29rQ3JlYXRpb25NcyxcbiAgICByZXRhaW5lZFN0ZXBJbnB1dHNTYWZlLFxuICAgIHJlcG9ydGVkRXZlbnRDb3VudDogcmVwb3J0ZWRFdmVudHMsXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBgZXZlbnRzLmNyZWF0ZWAgcmVqZWN0aW9uIGlzIGRldGVybWluaXN0aWMgV29ybGQgdmFsaWRhdGlvblxuICogcmF0aGVyIHRoYW4gYSB0cmFuc2llbnQvc3RvcmFnZSBlcnJvci4gTG9jYWwgV29ybGRzXG4gKiAod29ybGQtbG9jYWwsIHdvcmxkLXBvc3RncmVzKSB0aHJvdyBgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yYCBkaXJlY3RseTtcbiAqIHJlbW90ZSBXb3JsZHMgc3VyZmFjZSB0aGUgZXF1aXZhbGVudCBzZXJ2ZXItc2lkZSByZWplY3Rpb24gYXMgYVxuICogYFdvcmtmbG93V29ybGRFcnJvcmAgd2l0aCBIVFRQIHN0YXR1cyA0MDAuIFRoZSBuYW1lIGNoZWNrIGNvdmVyc1xuICogYEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcmAgaW5zdGFuY2VzIGZyb20gYSBkaWZmZXJlbnQgY29weSBvZlxuICogYEB3b3JrZmxvdy93b3JsZGAgdGhhbiB0aGUgb25lIHRoaXMgcGFja2FnZSByZXNvbHZlZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3JsZFZhbGlkYXRpb25GYWlsdXJlKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5uYW1lID09PSAnQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSAmJiBlcnIuc3RhdHVzID09PSA0MDA7XG59XG4iXX0=
|
|
1344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VzcGVuc2lvbi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBS3hCLG9CQUFvQixFQUNwQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1DQUFtQyxHQU1wQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVE3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxpQ0FBaUMsR0FHbEMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIseUJBQXlCLEVBQ3pCLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFDdkIsOEJBQThCLEdBQy9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHVCQUF1QixFQUd2QixZQUFZLEVBQ1osWUFBWSxFQUNaLGtCQUFrQixFQUNsQiwwQkFBMEIsR0FDM0IsTUFBTSxjQUFjLENBQUM7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QUM7UUFDcEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgdHlwZSBTZXJpYWxpemVkRGF0YSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbiAgdHlwZSBTdGFydGVkU3RlcCxcbiAgdHlwZSBUcmFjZUNhcnJpZXIsXG4gIHR5cGUgVmFsaWRRdWV1ZU5hbWUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV29ya2Zsb3dTdXNwZW5zaW9uLFxufSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQsXG4gIHR5cGUgR3Vlc3RDb2RlRXhlY3V0aW9uLFxuICB0eXBlIEd1ZXN0Q29kZVN0YXRzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4gfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG4gIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQsXG4gIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCxcbiAgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMsXG4gIE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIHR5cGUgRXZlbnRDcmVhdG9yLFxuICB0eXBlIExvYWRlZEV2ZW50TG9nLFxuICBtYXhFdmVudFNsb3QsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFByZWNsYWltZWRJbmxpbmVTdGFydCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyIH0gZnJvbSAnLi91bnNlcmlhbGl6YWJsZS1zdGVwLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcyB7XG4gIHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW46IFdvcmtmbG93UnVuO1xuICBzcGFuPzogU3BhbjtcbiAgcmVxdWVzdElkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bnRpbWUncyBsb2FkZWQgZXZlbnQgbG9nLiBFdmVyeSBldmVudCBjcmVhdGlvbiB0aGlzIHN1c3BlbnNpb24gbWFrZXNcbiAgICogbmFtZXMgdGhlIHBvc2l0aW9uIGl0IHdhcyBkZXJpdmVkIGZyb20sIHNvIGEgYmFja2VuZCB0aGF0IGhhcyByZWNvcmRlZFxuICAgKiBldmVudHMgdGhlIHJlcGxheSBkaWQgbm90IHNlZSBjYW4gcmVwb3J0IHRoZW0gYmFjayBvbiB0aGUgd3JpdGUsIG9yLCBpZlxuICAgKiBpdCB3b3VsZCByYXRoZXIgcmVmdXNlIHRoYW4gcmVwb3J0LCByZWplY3QgaXQgd2l0aCBhIDQxMi4gQSByZWplY3Rpb24gaXNcbiAgICogbm90IHJldHJpZWQgaGVyZTogdGhlIGV2ZW50J3MgY29ycmVsYXRpb24gaWQgd2FzIG1pbnRlZCBieSAqdGhpcyogcmVwbGF5J3NcbiAgICogc2VlZGVkIHNlcXVlbmNlLCBzbyByZS1jb21taXR0aW5nIGl0IGFnYWluc3QgYSBjb3JyZWN0ZWQgbG9nIHdvdWxkIHBlcnNpc3RcbiAgICogYW4gZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgcHJvZHVjZXMuIFRoZSBjYWxsZXIgcmVzdGFydHMgdGhlIHJlcGxheVxuICAgKiBpbnN0ZWFkLlxuICAgKi9cbiAgZXZlbnRMb2c/OiBMb2FkZWRFdmVudExvZztcbiAgLyoqXG4gICAqIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAqIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAodGhlIHJ1biBleGlzdHMpLiBXaGVuIHByZXNlbnQsIGV2ZXJ5IHdvcmxkIHdyaXRlXG4gICAqIHRoaXMgc3VzcGVuc2lvbiBwZXJmb3JtcyAoYGhvb2tfY3JlYXRlZGAsIGB3YWl0X2NyZWF0ZWRgLCBlYWdlciBvdmVyZmxvd1xuICAgKiBgc3RlcF9jcmVhdGVkYCwg4oCmKSBpcyBnYXRlZCBvbiBpdCBzbyB0aGUgd3JpdGUgbmV2ZXIgcmFjZXMgYWhlYWQgb2YgdGhlXG4gICAqIHJ1bidzIGNyZWF0aW9uLiBUaGUgcHVyZSBpbmxpbmUgaG90IHBhdGggZGVmZXJzIGFsbCBvZiBpdHMgc3RlcHMgYW5kIHdyaXRlc1xuICAgKiBub3RoaW5nIGhlcmUsIHNvIGl0IG5ldmVyIGF3YWl0cyB0aGlzIGJhcnJpZXIuIGB1bmRlZmluZWRgIG91dHNpZGUgdHVyYm8sXG4gICAqIHdoZXJlIGBydW5fc3RhcnRlZGAgd2FzIGFscmVhZHkgYXdhaXRlZCB1cCBmcm9udC5cbiAgICovXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBPbmUtc2hvdCB0ZWxlbWV0cnkgcmVwb3J0ZXIsIGFjdGl2YXRlZCBvbmx5IGFmdGVyIHJlcGxheSBoYXMgcmVjb3ZlcmVkLiAqL1xuICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyPzogUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcjtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB3aGVuIHByb3ZpZGVkIChhbmQgdGhlIHBlci1zdGVwIGVsaWdpYmlsaXR5IGdhdGVzXG4gICAqIHBhc3MsIHNlZSB0aGUgc3RlcCBvcHMgYmVsb3cpLCBlYWNoIG5ld2x5IGNyZWF0ZWQgbm9uLWlubGluZSBzdGVwJ3NcbiAgICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgaXMgcGFyYWxsZWxpemVkIHdpdGggaXRzIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlXG4gICAqIHB1Ymxpc2gsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIHN0ZXAgaW5wdXRcbiAgICogKGBzdGVwSW5wdXRgKSBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZVxuICAgKiBkaXJlY3Qgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluXG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5xdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHN9IHNvIHRoZSBjYWxsZXJcbiAgICogc2tpcHMgdGhlbSBpbiBpdHMgb3duIGRpc3BhdGNoIHBhc3MuIE9taXR0ZWQgYnkgY2FsbGVycyB0aGF0IG11c3Qgbm90XG4gICAqIHF1ZXVlICh0ZXJtaW5hbCBkcmFpbiwgdGVzdHMpOyBjcmVhdGVzIHRoZW4gYmVoYXZlIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgc3RlcERpc3BhdGNoPzoge1xuICAgIC8qKiBUaGUgdW5pZmllZCB3b3JrZmxvdyBxdWV1ZSB0aGlzIHJ1bidzIHN0ZXAgbWVzc2FnZXMgYXJlIHB1Ymxpc2hlZCB0by4gKi9cbiAgICBxdWV1ZU5hbWU6IFZhbGlkUXVldWVOYW1lO1xuICAgIC8qKlxuICAgICAqIExhemlseSByZXNvbHZlcyB0aGUgdHJhY2UgY2FycmllciB0byBzdGFtcCBvbiB0aGUgc3RlcCBtZXNzYWdlcy5cbiAgICAgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIHBlciBzdXNwZW5zaW9uIChtZW1vaXplZCBoZXJlKS5cbiAgICAgKi9cbiAgICBnZXRUcmFjZUNhcnJpZXI6ICgpID0+IFByb21pc2U8VHJhY2VDYXJyaWVyPjtcbiAgfTtcbiAgLyoqXG4gICAqIElubGluZSBzdGVwIG93bmVyc2hpcDogdGhlIHF1ZXVlIG1lc3NhZ2UgSUQgb2YgdGhlIGludm9jYXRpb24gdGhpc1xuICAgKiBzdXNwZW5zaW9uIHJ1bnMgaW4gKHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gcHJlc2VudCBBTkQgdGhlXG4gICAqIGJhdGNoZWQgZmFuLW91dCBlbmdhZ2VzLCB0aGUgbGF6eS1pbmxpbmUgc3RlcHMnIGRlZmVycmVkIHdyaXRlcyBhcmVcbiAgICogZm9sZGVkIGludG8gdGhlIGJhdGNoIGFzIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpcnMgKHRoZVxuICAgKiBzdGFydGVkIHJvdyBzdGFtcGVkIHdpdGggdGhpcyBJRCwgZXhhY3RseSBsaWtlIHRoZSBsYXp5IGNsYWltIGl0XG4gICAqIHJlcGxhY2VzKSwgcHJlLWNsYWltaW5nIHRoZSBzdGVwcyB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIHJ1biBpbmxpbmUuIFNlZVxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuaW5saW5lQ2xhaW1zfS4gQ2FsbGVycyB0aGF0IG5ldmVyXG4gICAqIGlubGluZS1leGVjdXRlICh0ZXJtaW5hbCBkcmFpbikgb21pdCBpdCwga2VlcGluZyB0aGVpciBsYXp5IHN0ZXBzIG9uIHRoZVxuICAgKiBwbGFpbiBkZWZlcnJlZCBwYXRoLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZXRzIHRoZSBiYXRjaGVkIGZhbi1vdXQgcmV0dXJuIGJlZm9yZSBldmVyeSBjaHVuayBoYXMgY29tbWl0dGVkOiBvbmx5XG4gICAqIHRoZSBjaHVuayBjYXJyeWluZyB0aGUgcHJlLWNsYWltZWQgaW5saW5lIHBhaXJzIGdhdGVzIHRoZSBoYW5kbGVyJ3NcbiAgICogcmV0dXJuIChpdHMgY2xhaW1zIGFyZSB3aGF0IHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBmcm9tKSwgd2hpbGUgdGhlXG4gICAqIHRyYWlsaW5nIGNodW5rcycgY29tbWl0cyAoYW5kIGV2ZXJ5IGNodW5rJ3MgaW4tZmx1c2ggc3RlcC1tZXNzYWdlXG4gICAqIHB1Ymxpc2hlcykgcmlkZSB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuZGVmZXJyZWRCYXRjaFdvcmt9LiBBXG4gICAqIGNhbGxlciB0aGF0IG9wdHMgaW4gTVVTVCBhd2FpdCB0aGF0IHByb21pc2UgYmVmb3JlIGFja2luZyBpdHMgZGVsaXZlcnk6XG4gICAqIHRoZSBkdXJhYmlsaXR5IGNvbnRyYWN0IChcImV2ZXJ5IGNyZWF0ZSBkdXJhYmxlIGJlZm9yZSBhY2tcIikgbW92ZXMgZnJvbVxuICAgKiB0aGUgaGFuZGxlcidzIHJldHVybiB0byB0aGF0IGpvaW4sIGFuZCBub3RoaW5nIGVsc2UgcmUtZHJpdmVzIGEgbG9zdFxuICAgKiB0cmFpbGluZyBjaHVuay4gQ2FsbGVycyB0aGF0IGRvbid0IG9wdCBpbiAodGVybWluYWwgZHJhaW4sIGRlZmF1bHQpXG4gICAqIGtlZXAgdGhlIGV2ZXJ5dGhpbmctZHVyYWJsZS1hdC1yZXR1cm4gYmVoYXZpb3IuXG4gICAqL1xuICBhbGxvd0RlZmVycmVkQmF0Y2hXb3JrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgaGFuZGxpbmcgYSBzdXNwZW5zaW9uLiBSZXR1cm5zIHBlbmRpbmcgc3RlcCBpdGVtcyBzbyB0aGUgY2FsbGVyXG4gKiBjYW4gZGVjaWRlIHdoaWNoIHRvIGV4ZWN1dGUgaW5saW5lIHZzIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQge1xuICAvKiogUGVuZGluZyBzdGVwIGl0ZW1zIHdpdGggZXZlbnRzIGNyZWF0ZWQgYnV0IE5PVCBxdWV1ZWQgKi9cbiAgcGVuZGluZ1N0ZXBzOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbVtdO1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCB0aGlzIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IChhcyBvcHBvc2VkIHRvIGNhdGNoaW5nIEVudGl0eUNvbmZsaWN0RXJyb3IgYmVjYXVzZVxuICAgKiBhIGNvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCkuIE9ubHkgdGhlIGhhbmRsZXIgdGhhdCB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IHNob3VsZCBxdWV1ZSAvIGlubGluZS1leGVjdXRlIHRoZSBzdGVwOyB0aGlzXG4gICAqIGd1YXJhbnRlZXMgYSBzaW5nbGUgb3duZXIgcGVyIHN0ZXAsIGV2ZW4gd2hlbiBtdWx0aXBsZSBoYW5kbGVycyByYWNlXG4gICAqIGludG8gdGhlIHNhbWUgYmF0Y2ggYm91bmRhcnkuXG4gICAqL1xuICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB3aG9zZSBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZS4gRWFjaCB3YXNcbiAgICogZmluYWxpemVkIGhlcmUgYXMgYHN0ZXBfY3JlYXRlZGAgKHdpdGggYSBwbGFjZWhvbGRlciBpbnB1dDsgdGhlIHJlYWxcbiAgICogaW5wdXQgaXMgcHJlY2lzZWx5IHdoYXQgcmVmdXNlZCB0byBzZXJpYWxpemUpIGZvbGxvd2VkIGJ5IGBzdGVwX2ZhaWxlZGBcbiAgICogY2FycnlpbmcgdGhlIFNlcmlhbGl6YXRpb25FcnJvciwgc28gdGhlIG5leHQgcmVwbGF5IHJlamVjdHMgdGhlIHN0ZXAnc1xuICAgKiBwcm9taXNlIGFuZCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcyB0aGUgZXJyb3IsXG4gICAqIGV4YWN0bHkgbGlrZSBhIHN0ZXAtYm9keSBmYWlsdXJlLiBObyBzdGVwLWV4ZWN1dGlvbiBtZXNzYWdlIGlzXG4gICAqIGRpc3BhdGNoZWQgZm9yIHRoZXNlLCBzbyB0aGUgY2FsbGVyIE1VU1QgZm9yY2UgYW4gaW4tcHJvY2VzcyByZXBsYXk6XG4gICAqIHdoZW4gdGhlIGZhaWxlZCBzdGVwIHdhcyB0aGUgb25seSBwZW5kaW5nIHdvcmssIG5vdGhpbmcgZWxzZSB3aWxsIGV2ZXJcbiAgICogcmUtaW52b2tlIHRoZSBydW4gdG8gb2JzZXJ2ZSB0aGUgdGVybWluYWwgZXZlbnQuXG4gICAqL1xuICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHRoaXMgc3VzcGVuc2lvbiBjYWxsIGFscmVhZHkgcHVibGlzaGVkXG4gICAqIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIG1lc3NhZ2VzIGZvciwgdmlhIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoICh0aGVcbiAgICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgcGFyYWxsZWxpemVkIHdpdGggYSBgc3RlcElucHV0YC1jYXJyeWluZyBxdWV1ZVxuICAgKiBwdWJsaXNoKS4gVGhlIGNhbGxlciBNVVNUIE5PVCBkaXNwYXRjaCB0aGVzZSBhZ2FpbjogdGhlIG1lc3NhZ2UgaXNcbiAgICogYWxyZWFkeSBvdXQgKGEgZHVwbGljYXRlIHdvdWxkIGJlIGRlZHVwZWQgYnkgaXRzIGlkZW1wb3RlbmN5IGtleSwgYnV0XG4gICAqIGNvc3RzIGEgd2FzdGVkIHJvdW5kLXRyaXApLiBFbXB0eSB3aGVuIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2h9XG4gICAqIHdhcyBub3QgcHJvdmlkZWQgb3Igbm8gc3RlcCB3YXMgZWxpZ2libGUuXG4gICAqL1xuICBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogSG93IG1hbnkgZXZlbnRzIHRoaXMgcGhhc2UncyB3cml0ZXMgcmVwb3J0ZWQgYmFjayBhcyBvY2N1cHlpbmcgc2xvdHMgdGhleVxuICAgKiBza2lwcGVkIG92ZXIsIGFscmVhZHkgbWVyZ2VkIGludG8gdGhlIGNhbGxlcidzIGBldmVudExvZy5ldmVudHNgLiBOb256ZXJvXG4gICAqIG1lYW5zIHRoZSBhcnJheSB3YXMgcmVvcmRlcmVkIHRvIHJlc3RvcmUgc2xvdCBvcmRlciwgc28gYW55IGluZGV4IHRoZVxuICAgKiBjYWxsZXIgY2FjaGVkIGludG8gaXQgKHBheWxvYWQgcHJld2FybSBzY2FuIHBvc2l0aW9uKSBpcyBzdGFsZS5cbiAgICovXG4gIHJlcG9ydGVkRXZlbnRDb3VudDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0ZXBzIHdob3NlIGBzdGVwX2NyZWF0ZWRgIHdyaXRlcyB3ZXJlIGludGVudGlvbmFsbHkgZGVmZXJyZWQgc28gdGhlXG4gICAqIGNhbGxlciBjYW4gcnVuIHRoZW0gaW5saW5lIHZpYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyAod2hpY2ggY3JlYXRlXG4gICAqIHRoZSBzdGVwIG9uIHRoZSBmbHkpLCBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBVcCB0b1xuICAgKiBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgYXJlIGRlZmVycmVkOyB0aGUgY2FsbGVyIHJ1bnMgdGhlbSBpbmxpbmUgaW5cbiAgICogcGFyYWxsZWwgYW5kIHF1ZXVlcyB0aGUgcmVzdC4gRW1wdHkgd2hlbiBubyBzdGVwIHdhcyBkZWZlcnJlZCAobm90aGluZ1xuICAgKiBwZW5kaW5nLCBvciBhIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgaXMgcHJlc2VudCBzbyBub3RoaW5nIGlzXG4gICAqIGV4ZWN1dGVkIGlubGluZSkuIFRoZSBjYWxsZXIgcGFzc2VzIGVhY2ggYGRlaHlkcmF0ZWRJbnB1dGAgc3RyYWlnaHQgdG9cbiAgICogYGV4ZWN1dGVTdGVwYCwgd2hpY2ggc2VuZHMgaXQgYXMgdGhlIGBzdGVwX3N0YXJ0ZWRgIHBheWxvYWQuIFRoZSBhdG9taWNcbiAgICogY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIGBzdGVwX3N0YXJ0ZWRgIGlzIHRoZSBleGFjdGx5LW9uZS1vd25lciBnYXRlIHRoYXRcbiAgICogdGhlIHN0YW5kYWxvbmUgYHN0ZXBfY3JlYXRlZGAgcHJvdmlkZWQgYmVmb3JlOiB0aGUgbG9zZXIgb2YgdGhlIHJhY2UgZ2V0c1xuICAgKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGBza2lwcGVkYCBhbmQgZG9lcyBub3QgcnVuIHRoZSBib2R5LlxuICAgKi9cbiAgbGF6eUlubGluZVN0ZXBzOiBBcnJheTx7XG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgZGVoeWRyYXRlZElucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgfT47XG4gIC8qKlxuICAgKiBQcmUtY2xhaW1lZCBpbmxpbmUgc3RhcnRzLCBieSBjb3JyZWxhdGlvbiBpZDogdGhlIHBlci1zdGVwIHZlcmRpY3RzIG9mXG4gICAqIHRoZSBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX3N0YXJ0ZWRgIHBhaXJzIHRoZSBiYXRjaGVkIGZhbi1vdXQgY29tbWl0dGVkXG4gICAqIGZvciB0aGUgbGF6eS1pbmxpbmUgc3RlcHMuIEEgc3RlcCB3aXRoIGFuIGVudHJ5IGhlcmUgaXMgcGFzc2VkIHRvXG4gICAqIGBleGVjdXRlU3RlcGAgYXMgYHByZWNsYWltZWRTdGFydGAgSU5TVEVBRCBvZiBgbGF6eVN0ZXBJbnB1dGA6IGl0c1xuICAgKiBpbnB1dCBhbHJlYWR5IHJvZGUgdGhlIHBhaXIsIGFuZCB0aGUgY2xhaW0gaXMgc2V0dGxlZDogYG93bmVkOiB0cnVlYFxuICAgKiBjYXJyaWVzIHRoZSBzdGFydGVkIGF0dGVtcHQtMSBlbnRpdHkgKGlucHV0IHJlLWF0dGFjaGVkKSBzbyB0aGUgYm9keVxuICAgKiBydW5zIHN0cmFpZ2h0IG9mZiB0aGUgYmF0Y2ggY29tbWl0IHdpdGggbm8gc3RhcnQgd3JpdGUgb2YgaXRzIG93bjtcbiAgICogYG93bmVkOiBmYWxzZWAgbG9zdCB0aGUgcGFpcidzIGF0b21pYyBjcmVhdGUtY2xhaW0gdG8gYSBjb25jdXJyZW50XG4gICAqIHdyaXRlciwgYW5kIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGUgYm9keSxcbiAgICogdGhlIHNhbWUgb3V0Y29tZSBhcyBsb3NpbmcgdGhlIGxhenkgY2xhaW0uIEVtcHR5IHdoZW5ldmVyIHRoZSBmb2xkIGRpZFxuICAgKiBub3QgZW5nYWdlIChiYXRjaGluZyBvZmYsIG5vIGBvd25lck1lc3NhZ2VJZGAsIG9yIHRoZSBsb25lLWlubGluZSBjYXNlLFxuICAgKiB3aGljaCBrZWVwcyB0aGUgb3B0aW1pc3RpYyBsYXp5IHBhdGggYW5kIGl0cyBjbGFpbS9ib2R5IG92ZXJsYXApLlxuICAgKlxuICAgKiBDcmFzaCB3aW5kb3c6IHRoZSBwYWlyIGNvbW1pdHMgYmVmb3JlIHRoZSBjYWxsZXIgcnVucyB0aGUgYm9keSwgc28gYVxuICAgKiBjcmFzaCBiZXR3ZWVuIHRoZW0gbGVhdmVzIGEgc3RhcnRlZCBzdGVwIHN0YW1wZWQgd2l0aCB0aGlzIG1lc3NhZ2Unc1xuICAgKiBJRC4gUmVkZWxpdmVyeSBvZiB0aGUgc2FtZSBtZXNzYWdlIHJlLWV4ZWN1dGVzIGl0IHZpYSB0aGUgb3duZWQtcmVjb3ZlcnlcbiAgICogcGF0aCwgdGhlIGV4YWN0IG1hY2hpbmVyeSB0aGUgbGF6eSBjbGFpbSdzIGNyYXNoIHdpbmRvdyBhbHJlYWR5IHVzZXMuXG4gICAqL1xuICBpbmxpbmVDbGFpbXM6IE1hcDxzdHJpbmcsIFByZWNsYWltZWRJbmxpbmVTdGFydD47XG4gIC8qKlxuICAgKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBiYXRjaGVkIGZhbi1vdXQgY29tbWl0dGVkLCB3aGVuIGl0IHJhbi4gVGhlIGJhdGNoJ3NcbiAgICogb3duIGV2ZW50cyBhcmUgbm90IGluIHRoZSBjYWxsZXIncyBsb2FkZWQgbG9nICh0aGUgbmV4dCByZWxvYWQgcGlja3NcbiAgICogdGhlbSB1cCksIHNvIHRoZSBjYWxsZXIgZm9sZHMgdGhpcyBjZWlsaW5nIGludG8gdGhlIHNsb3Qgc25hcHNob3QgaXRcbiAgICogaGFuZHMgdGhlIGlubGluZSBleGVjdXRpb25zOyBvdGhlcndpc2UgZXZlcnkgaW5saW5lIHRlcm1pbmFsIHdyaXRlXG4gICAqIHdvdWxkIG5hbWUgYSBwcmUtYmF0Y2ggcG9zaXRpb24gYW5kIGJlIGFuc3dlcmVkIHdpdGggYSBza2lwcGVkLXNsb3RcbiAgICogcmVwb3J0IGVjaG9pbmcgdGhlIGV2ZW50cyB0aGlzIHN1c3BlbnNpb24ganVzdCB3cm90ZS4gVW5kZXJcbiAgICoge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zLmFsbG93RGVmZXJyZWRCYXRjaFdvcmt9IHRoaXMgY292ZXJzIHRoZVxuICAgKiBjaHVua3MgdGhhdCBoYWQgY29tbWl0dGVkIGJ5IHRoZSBoYW5kbGVyJ3MgcmV0dXJuIChhbHdheXMgdGhlIHBhaXJcbiAgICogY2h1bmspOyBhIHRyYWlsaW5nIGNodW5rIHRoYXQgY29tbWl0cyBsYXRlciBpcyBlY2hvZWQgYmFjayBvbiB0aGVcbiAgICogdGVybWluYWwgd3JpdGVzIGxpa2UgYW55IGZvcmVpZ24gZXZlbnQ6IHJlcG9ydHMgdGhlIGV4ZWN1dG9yIHJlYWRzIGZvclxuICAgKiBwb3NpdGlvbiBhbmQgZGlzY2FyZHMuXG4gICAqXG4gICAqIFNvIHRoZSBlY2hvIGlzIG9ubHkgZnVsbHkgc3VwcHJlc3NlZCBmb3IgYSBTSU5HTEUtY2h1bmsgZm9sZC4gT24gYVxuICAgKiBtdWx0aS1jaHVuayBmYW4tb3V0IHRoZSBib2RpZXMgc3RhcnQgb2ZmIHRoZSBwYWlyIGNodW5rIHdoaWxlIHRyYWlsaW5nXG4gICAqIGNodW5rcyBhcmUgc3RpbGwgaW4gZmxpZ2h0LCBhbmQgYW4gaW5saW5lIHRlcm1pbmFsIHdyaXRlIGlzc3VlZCBpbiB0aGF0XG4gICAqIHdpbmRvdyBzdGlsbCBuYW1lcyBhIHBvc2l0aW9uIGJlbG93IHRoZW0gYW5kIHN0aWxsIGRyYXdzIGEgcmVwb3J0IGZvclxuICAgKiB0aGVpciBldmVudHMuIEJvdW5kZWQgKHRyYWlsaW5nIGNodW5rcyBvbmx5LCBsYXJnZSBmYW4tb3V0cyBvbmx5KSBhbmRcbiAgICogc2VsZi1jb3JyZWN0aW5nIG9uIHRoZSBuZXh0IHJlbG9hZCwgYW5kIHJlY29yZGVkIHNvIGEgcmVwb3J0IHNlZW4gdGhlcmVcbiAgICogcmVhZHMgYXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gYXMgYSBidWcuXG4gICAqL1xuICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGJhdGNoZWQgZmFuLW91dCdzIGRlZmVycmVkIHdvcmssIHByZXNlbnQgb25seSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWRcbiAgICogaW4gdmlhIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5hbGxvd0RlZmVycmVkQmF0Y2hXb3JrfSBhbmRcbiAgICogdHJhaWxpbmcgd29yayBleGlzdHM6IHRoZSBjb21taXRzIG9mIGV2ZXJ5IGNodW5rIGV4Y2VwdCB0aGUgcGFpciBjaHVuayxcbiAgICogcGx1cyBldmVyeSBjaHVuaydzIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMgKGVhY2ggY2hhaW5lZCBvbiBJVFMgT1dOXG4gICAqIGNodW5rJ3MgY29tbWl0LCBzbyBwdWJsaXNoLWFmdGVyLWNyZWF0ZSBob2xkcyBwZXIgc3RlcCkuIFRoZSBjYWxsZXJcbiAgICogTVVTVCBhd2FpdCBpdCBiZWZvcmUgYWNraW5nOiBhIHJlamVjdGlvbiBoZXJlIGlzIGEgZmFpbGVkIHN1c3BlbnNpb25cbiAgICogd3JpdGUgYW5kIGZhaWxzIHRoZSBkZWxpdmVyeSBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUgYXQgdGhlIGhhbmRsZXInc1xuICAgKiByZXR1cm4uIFN0ZXBzIHdob3NlIG1lc3NhZ2VzIHRoaXMgd29yayBwdWJsaXNoZXMgYXJlIGFscmVhZHkgaW5cbiAgICoge0BsaW5rIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc30gYXQgcmV0dXJuIHRpbWUuXG4gICAqL1xuICBkZWZlcnJlZEJhdGNoV29yaz86IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgc29vbmVzdCBwZW5kaW5nIHdhaXQsIGlmIGFueTogc2Vjb25kcyB1bnRpbCBpdCBlbGFwc2VzIGFuZCB0aGVcbiAgICogY29ycmVsYXRpb25JZCBvZiB0aGUgd2FpdCB0aGF0IHByb2R1Y2VkIHRoYXQgdGltZW91dC4gVGhlXG4gICAqIGNvcnJlbGF0aW9uSWQgc2VlZHMgdGhlIGlkZW1wb3RlbmN5IGtleSBmb3IgdGhlIHdhaXQtY29udGludWF0aW9uXG4gICAqIHF1ZXVlIG1lc3NhZ2Ugc28gdGhhdCByZXBlYXRlZCBzdXNwZW5zaW9uIHBhc3NlcyBvdmVyIHRoZSBzYW1lXG4gICAqIHBlbmRpbmcgd2FpdCBjb2xsYXBzZSBpbnRvIGEgc2luZ2xlIGRlbGF5ZWQgY29udGludWF0aW9uLlxuICAgKi9cbiAgd2FpdFRpbWVvdXQ/OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH07XG4gIC8qKiBXaGV0aGVyIGEgaG9vayBjb25mbGljdCB3YXMgZGV0ZWN0ZWQgKHNob3VsZCByZS1pbnZva2UgaW1tZWRpYXRlbHkpICovXG4gIGhhc0hvb2tDb25mbGljdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIHRoZSB3b3JrZmxvdyB0byBjb250aW51ZSBpbW1lZGlhdGVseSAqL1xuICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBib29sZWFuO1xuICAvKiogV2hldGhlciBuYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyB3ZXJlIHdyaXR0ZW4gZm9yIHJlcGxheS4gKi9cbiAgaGFzQXR0cmlidXRlRXZlbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1c3BlbnNpb24gY3JlYXRlZCBhbnkgaG9vayAoYGhvb2tfY3JlYXRlZGApIGV2ZW50cy4gVW5saWtlXG4gICAqIGBoYXNIb29rQ29uZmxpY3RgIC8gYGhhc0F3YWl0ZWRIb29rQ3JlYXRpb25gLCB0aGlzIGlzIHRydWUgZXZlbiBmb3IgYSBwbGFpblxuICAgKiBmaXJlLWFuZC1mb3JnZXQgaG9vayB3aXRoIG5vIGNvbmZsaWN0IGFuZCBubyBhd2FpdGVyLiBUdXJibyBtb2RlIHVzZXMgaXQgdG9cbiAgICogZGV0ZWN0IFwiYSBob29rIHdhcyBjcmVhdGVkIHRoaXMgc3VzcGVuc2lvblwiIGFuZCBzdG9wIGZvcmNpbmcgb3B0aW1pc3RpY1xuICAgKiBpbmxpbmUgc3RhcnQgKGEgaG9vayBpbnRyb2R1Y2VzIGxhdGVyIHJlc3VtZSBpbnZvY2F0aW9ucyB0aGF0IGNvdWxkIHJhY2UpLlxuICAgKi9cbiAgaGFzSG9va0V2ZW50czogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyB0aGlzIHN1c3BlbnNpb24ncyBgaG9va19jcmVhdGVkYCBldmVudHNcbiAgICogKDAgd2hlbiBpdCBjcmVhdGVkIG5vbmUpLiBUaGUgY2FsbGVyIGFjY3VtdWxhdGVzIHRoaXMgYWNyb3NzIGl0ZXJhdGlvbnNcbiAgICogYW5kIHN1YnRyYWN0cyBpdCBmcm9tIHRoZSBUVEZTIGxhdGVuY3kgbWVhc3VyZW1lbnQsIHNvIHRpbWUgc3BlbnRcbiAgICogZHVyYWJseSBjcmVhdGluZyB0aGUgdXNlcidzIGhvb2tzIGRvZXNuJ3QgY291bnQgYXMgcnVudGltZSBvdmVyaGVhZC5cbiAgICovXG4gIGhvb2tDcmVhdGlvbk1zOiBudW1iZXI7XG4gIC8qKiBFeGFjdCBudW1iZXIgb2Ygd29ya2Zsb3ctY29kZSBleGVjdXRpb25zIG9ic2VydmVkIGR1cmluZyBzZXJpYWxpemF0aW9uLiAqL1xuICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OiBudW1iZXI7XG4gIC8qKiBCb3VuZGVkIHNhbXBsZSB1c2VkIG9ubHkgZm9yIHJldGVudGlvbiBkaWFnbm9zdGljcy4gKi9cbiAgc2VyaWFsaXphdGlvbkJsb2NrZXJzOiBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXJbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIgZXh0ZW5kcyBHdWVzdENvZGVFeGVjdXRpb24ge1xuICBzb3VyY2U6ICdzdGVwX2lucHV0JyB8ICdob29rX21ldGFkYXRhJyB8ICdob29rX2Fib3J0JztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVIb29rRXZlbnQoe1xuICBydW5JZCxcbiAgaG9va0V2ZW50LFxuICBxdWV1ZUl0ZW0sXG4gIHJlcXVlc3RJZCxcbiAgY3JlYXRlRXZlbnQsXG59OiB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGhvb2tFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0O1xuICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIGNyZWF0ZUV2ZW50OiAoXG4gICAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICkgPT4gUHJvbWlzZTxFdmVudFJlc3VsdD47XG59KTogUHJvbWlzZTx7XG4gIGhhc0hvb2tDb25mbGljdDogYm9vbGVhbjtcbiAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogYm9vbGVhbjtcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChob29rRXZlbnQsIHtcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCByZXR1cm5lZCBhIGhvb2tfY29uZmxpY3QgZXZlbnQgaW5zdGVhZCBvZiBob29rX2NyZWF0ZWQuXG4gICAgLy8gVGhlIGhvb2tfY29uZmxpY3QgZXZlbnQgaXMgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYW5kIHdpbGwgYmUgcmVwbGF5ZWRcbiAgICAvLyBvbiB0aGUgbmV4dCB3b3JrZmxvdyBpbnZvY2F0aW9uLCBjYXVzaW5nIHRoZSBob29rJ3MgcHJvbWlzZSB0byByZWplY3QuXG4gICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhc0hvb2tDb25mbGljdDogdHJ1ZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBmYWxzZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgaG9vaycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnIpKSB7XG4gICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICBgY3JlYXRlSG9vayBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgIHRocm93IGZhdGFsO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgYSB3b3JrZmxvdyBzdXNwZW5zaW9uIGJ5IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyAoaG9va3MsIHN0ZXBzLCB3YWl0cykuXG4gKiBDcmVhdGVzIGV2ZW50cyBmb3IgYWxsIG9wZXJhdGlvbnMgYnV0IGRvZXMgTk9UIHF1ZXVlIHN0ZXAgbWVzc2FnZXM7IHJldHVybnMgdGhlIHBlbmRpbmdcbiAqIHN0ZXBzIHNvIHRoZSBjYWxsZXIgY2FuIGRlY2lkZSB3aGljaCB0byBleGVjdXRlIGlubGluZSB2cyBxdWV1ZSB0byBiYWNrZ3JvdW5kLlxuICpcbiAqIFByb2Nlc3Npbmcgb3JkZXI6XG4gKiAxLiBIb29rcyBhcmUgcHJvY2Vzc2VkIGZpcnN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggd2ViaG9vayByZWNlaXZlcnNcbiAqIDIuIFN0ZXAgZXZlbnRzIGFuZCB3YWl0IGV2ZW50cyBhcmUgY3JlYXRlZCBpbiBwYXJhbGxlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3VzcGVuc2lvbih7XG4gIHN1c3BlbnNpb24sXG4gIHdvcmxkLFxuICBydW4sXG4gIHNwYW4sXG4gIHJlcXVlc3RJZCxcbiAgZXZlbnRMb2csXG4gIHJ1blJlYWR5QmFycmllcixcbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgc3RlcERpc3BhdGNoLFxuICBvd25lck1lc3NhZ2VJZCxcbiAgYWxsb3dEZWZlcnJlZEJhdGNoV29yayxcbn06IFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zKTogUHJvbWlzZTxTdXNwZW5zaW9uSGFuZGxlclJlc3VsdD4ge1xuICBjb25zdCBydW5JZCA9IHJ1bi5ydW5JZDtcblxuICAvLyBUdXJibyBtb2RlOiBob2xkIGV2ZXJ5IHdvcmxkIHdyaXRlIGJlbG93IHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgKnNldHRsZWQqLCBzbyB3ZSBuZXZlciB3cml0ZSBhIHN0ZXAvaG9vay93YWl0IGV2ZW50IGZvciBhXG4gIC8vIHJ1biB0aGF0IGRvZXMgbm90IGV4aXN0IHlldC4gQSBuby1vcCBvdXRzaWRlIHR1cmJvIChiYXJyaWVyIHVuZGVmaW5lZCkgYW5kXG4gIC8vIG9uIHRoZSBwdXJlIGlubGluZSBob3QgcGF0aCwgd2hpY2ggZGVmZXJzIGFsbCBzdGVwcyBhbmQgd3JpdGVzIG5vdGhpbmcuXG4gIC8vIEF3YWl0aW5nIHRoZSBzYW1lICh1c3VhbGx5IGFscmVhZHktc2V0dGxlZCkgcHJvbWlzZSBtb3JlIHRoYW4gb25jZSBpcyBjaGVhcC5cbiAgLy8gQSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHlcbiAgLy8gZmFpbGVkIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSBzdWJzZXF1ZW50IHdyaXRlIHN1cmZhY2VzIHRoZSByZWFsXG4gIC8vIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlIHJlZGVsaXZlcnMuXG4gIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBd2FpdCBldmVyeSBvcGVyYXRpb24gaW4gYSBzdXNwZW5zaW9uIHBoYXNlIGJlZm9yZSBsZXR0aW5nIGEgZmFpbHVyZVxuICAgKiBlc2NhcGUsIHByZWZlcnJpbmcgYSBzdGFsZS1zbmFwc2hvdCAoNDEyKSByZWplY3Rpb24gd2hlbiBvbmUgb2NjdXJyZWQuXG4gICAqXG4gICAqIGBQcm9taXNlLmFsbGAgcmVqZWN0cyBhcyBzb29uIGFzIG9uZSBvcGVyYXRpb24gZG9lcyBhbmQgbGVhdmVzIGl0cyBzaWJsaW5nc1xuICAgKiBpbiBmbGlnaHQuIFRoYXQgbWF0dGVycyBmb3IgYSA0MTI6IHRoZSBjYWxsZXIgcmVhY3RzIGJ5IHJlbG9hZGluZyB0aGUgZXZlbnRcbiAgICogbG9nIGFuZCByZXN0YXJ0aW5nIHRoZSByZXBsYXksIHNvIGEgc2libGluZyBjcmVhdGUgdGhhdCBsYW5kcyBhZnRlciB0aGVcbiAgICogcmVqZWN0aW9uIGVzY2FwZWQgY29tbWl0cyBhbiBldmVudCB3aG9zZSBjb3JyZWxhdGlvbiBpZCBjYW1lIGZyb20gdGhlXG4gICAqIGFiYW5kb25lZCByZXBsYXkncyBzZWVkZWQgc2VxdWVuY2UgKGFuIGV2ZW50IHRoZSBmcmVzaCByZXBsYXkgbmV2ZXJcbiAgICogcHJvZHVjZXMpLCBhbmQgaXQgcmFjZXMgdGhlIHJlc3RhcnQncyByZWxvYWQgd2hpbGUgZG9pbmcgc28uIFNldHRsaW5nIGZpcnN0XG4gICAqIG1ha2VzIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgZmluYWwgYmVmb3JlIHRoZSBjYWxsZXIgYWN0cyBvbiB0aGUgZmFpbHVyZS5cbiAgICogSXQgbWlycm9ycyB0aGUgcnVudGltZSdzIGlubGluZSBzdGVwIGNsYWltLCB3aGljaCBzZXR0bGVzIHRoZSBpbi1mbGlnaHRcbiAgICogc3RlcCBleGVjdXRpb25zIGJlZm9yZSBlc2NhbGF0aW5nIGEgNDEyLlxuICAgKlxuICAgKiBBIDQxMiBpcyBwcmVmZXJyZWQgb3ZlciBhbnkgb3RoZXIgcmVqZWN0aW9uIGluIHRoZSBzYW1lIHBoYXNlIGJlY2F1c2UgaXRcbiAgICogaGFzIGEgZGVmaW5lZCwgY2hlYXAgcmVjb3ZlcnkgKHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZykgd2hpbGUgdGhlXG4gICAqIG90aGVycyBkbyBub3QuIEEgZGV0ZXJtaW5pc3RpYyBmYWlsdXJlIHN1Y2ggYXMgYW4gYXR0cmlidXRlLXZhbGlkYXRpb25cbiAgICogYEZhdGFsRXJyb3JgIHJlY3VycyBvbiB0aGUgcmVzdGFydCBhbmQgZmFpbHMgdGhlIHJ1biB0aGVuLCBhdCB0aGUgY29zdCBvZlxuICAgKiBvbmUgZXh0cmEgcmVwbGF5LlxuICAgKi9cbiAgY29uc3Qgc2V0dGxlUGhhc2UgPSBhc3luYyAob3BzOiBQcm9taXNlPHVua25vd24+W10pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZWFzb25zID0gKGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChvcHMpKVxuICAgICAgLmZpbHRlcigocik6IHIgaXMgUHJvbWlzZVJlamVjdGVkUmVzdWx0ID0+IHIuc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICAgLm1hcCgocikgPT4gci5yZWFzb24pO1xuICAgIGlmIChyZWFzb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRocm93IHJlYXNvbnMuZmluZCgocikgPT4gUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMocikpID8/IHJlYXNvbnNbMF07XG4gIH07XG5cbiAgLy8gRXZlcnkgc3VzcGVuc2lvbiB3cml0ZSBjYXJyaWVzIHJlcGxheS1yZWNvdmVyeSB0ZWxlbWV0cnkgb24gdGhlIGZpcnN0IG9uZVxuICAvLyB0aGF0IGNvbW1pdHMgYWZ0ZXIgcmVwbGF5IHJlY292ZXJlZC4gQWxsIHN1c3BlbnNpb24gZXZlbnRzIGFyZVxuICAvLyBub24tcnVuX2NyZWF0ZWQgZXZlbnRzIG9uIHRoaXMgcnVuJ3MgYHJ1bklkYC5cbiAgY29uc3QgcmVwb3J0ZXIgPSByZXBsYXlSZWNvdmVyeVJlcG9ydGVyID8/IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgY29uc3QgY3JlYXRlRXZlbnQgPSAoZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LCBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtcykgPT5cbiAgICByZXBvcnRlci53aXRoRXZlbnRDcmVhdGUocGFyYW1zLCAocCkgPT5cbiAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIHApXG4gICAgKTtcbiAgLy8gQWRkcyB0aGUgb3B0aW1pc3RpYy1jb25jdXJyZW5jeSBndWFyZCB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZWQgYSBsb2FkZWRcbiAgLy8gZXZlbnQgbG9nOyB3aXRob3V0IG9uZSBpdCBjcmVhdGVzIGRpcmVjdGx5IChjYWxsZXJzIHdpdGggbm8gcmVwbGF5XG4gIC8vIHNuYXBzaG90LCBlLmcuIHRlc3RzKS4gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLFxuICAvLyB3aGljaCByZXN0YXJ0cyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nLiBJdCBpcyBub3QgcmV0cmllZCBoZXJlLFxuICAvLyBiZWNhdXNlIHRoZSBldmVudCdzIGNvcnJlbGF0aW9uIGlkIHdhcyBtaW50ZWQgYnkgKnRoaXMqIHJlcGxheSdzIHNlZWRlZFxuICAvLyBzZXF1ZW5jZSwgc28gcmUtY29tbWl0dGluZyBpdCBhZ2FpbnN0IGEgY29ycmVjdGVkIGxvZyB3b3VsZCBwZXJzaXN0IGFuXG4gIC8vIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IHByb2R1Y2VzLlxuICBsZXQgcmVwb3J0ZWRFdmVudHMgPSAwO1xuICBjb25zdCBjcmVhdGVHdWFyZGVkOiBFdmVudENyZWF0b3IgPSBhc3luYyAoZGF0YSwgcGFyYW1zKSA9PiB7XG4gICAgaWYgKCFldmVudExvZykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUV2ZW50KGRhdGEsIHBhcmFtcyk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IGV2ZW50TG9nO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KGRhdGEsIHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIC4uLnNsb3RTbmFwc2hvdFBhcmFtcyhsb2cuZXZlbnRzKSxcbiAgICB9KTtcbiAgICAvLyBCdW1wLWFuZC1yZXBvcnQ6IHRoZSB3cml0ZSBsYW5kZWQgYWJvdmUgdGhlIHNsb3QgaXQgYXNrZWQgZm9yLCBzbyB0aGVcbiAgICAvLyByZXBvcnQgaG9sZHMgdGhlIGV2ZW50cyBpdCB3YXMgZGVjaWRlZCB3aXRob3V0LiBBYnNvcmJpbmcgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGF0IGVhY2ggY2FsbCBzaXRlIG1lYW5zIHRoZSByZXN0IG9mIHRoaXMgcGhhc2UncyB3cml0ZXMgKHdoaWNoIHJlYWRcbiAgICAvLyB0aGUgc2FtZSBhcnJheSB0byBidWlsZCB0aGVpciBvd24gc25hcHNob3QpIGFzayBmb3IgYSBzbG90IGFib3ZlIHRoZW0sXG4gICAgLy8gYW5kIHRoZSByZXBsYXkgdGhhdCByZXN1bWVzIGZyb20gdGhpcyBsb2cgc2VlcyB0aGVtIHdpdGhvdXQgYSByZWxvYWQuXG4gICAgY29uc3QgcmVwb3J0ID0gYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQobG9nLmV2ZW50cywgcmVzdWx0KTtcbiAgICByZXBvcnRlZEV2ZW50cyArPSByZXBvcnQuYWRkZWQ7XG4gICAgaWYgKHJlcG9ydC50cnVuY2F0ZWQpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0Ryb3BwZWQgYSB0cnVuY2F0ZWQgc2tpcHBlZC1zbG90IHJlcG9ydCcsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV2ZW50VHlwZTogZGF0YS5ldmVudFR5cGUsXG4gICAgICAgIGV2ZW50SWQ6IHJlc3VsdC5ldmVudD8uZXZlbnRJZCxcbiAgICAgICAgb2ZmZXJlZDogcmVwb3J0Lm9mZmVyZWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcG9ydC5hZGRlZCA+IDApIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gd3JpdGUgc2tpcHBlZCBvY2N1cGllZCBzbG90cycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV2ZW50VHlwZTogZGF0YS5ldmVudFR5cGUsXG4gICAgICAgIGV2ZW50SWQ6IHJlc3VsdC5ldmVudD8uZXZlbnRJZCxcbiAgICAgICAgcmVwb3J0ZWQ6IHJlcG9ydC5hZGRlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBTZXBhcmF0ZSBxdWV1ZSBpdGVtcyBieSB0eXBlXG4gIGNvbnN0IHN0ZXBJdGVtcyA9IHN1c3BlbnNpb24uaXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKTogaXRlbSBpcyBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdzdGVwJ1xuICApO1xuICBjb25zdCBhbGxIb29rSXRlbXMgPSBzdXNwZW5zaW9uLml0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnaG9vaydcbiAgKTtcbiAgY29uc3Qgd2FpdEl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3dhaXQnXG4gICk7XG4gIGNvbnN0IGF0dHJpYnV0ZUl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnYXR0cmlidXRlJ1xuICApO1xuXG4gIGNvbnN0IGhvb2tzTmVlZGluZ0NyZWF0aW9uID0gYWxsSG9va0l0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gIWl0ZW0uaGFzQ3JlYXRlZEV2ZW50XG4gICk7XG5cbiAgLy8gR3JvdXAgaG9vayBpdGVtcyB0aGF0IG5lZWQgd29yayBieSB0b2tlbiwgcHJlc2VydmluZyBxdWV1ZS1pbnNlcnRpb25cbiAgLy8gKHdvcmtmbG93IGNvZGUpIG9yZGVyIHdpdGhpbiBlYWNoIHRva2VuLiBPcGVyYXRpb25zIG9uIG9uZSB0b2tlbiBtdXN0XG4gIC8vIGFwcGx5IGluIGNvZGUgb3JkZXI6IGEgZGlzcG9zZSgpIG9mIGFuIGVhcmxpZXIgaG9vayByZWxlYXNlcyB0aGUgdG9rZW5cbiAgLy8gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkIChvdGhlcndpc2UgdGhlXG4gIC8vIG5ldyBob29rIHJlY29yZHMgYSBzcHVyaW91cyBob29rX2NvbmZsaWN0IGFnYWluc3QgdGhlIHJ1bidzIG93blxuICAvLyBkaXNwb3NlZCBob29rKSwgd2hpbGUgYSBob29rIGNyZWF0ZWQgYW5kIGRpc3Bvc2VkIHdpdGhpbiB0aGUgc2FtZVxuICAvLyBzdXNwZW5zaW9uIGlzIHN0aWxsIGNyZWF0ZWQgYmVmb3JlIGl0IGlzIGRpc3Bvc2VkLiBEaWZmZXJlbnQgdG9rZW5zXG4gIC8vIGhhdmUgbm8gY2xhaW0gaW50ZXJhY3Rpb24sIHNvIHRva2VuIGdyb3VwcyBhcmUgcHJvY2Vzc2VkIGluIHBhcmFsbGVsLlxuICBjb25zdCBob29rSXRlbXNCeVRva2VuID0gbmV3IE1hcDxzdHJpbmcsIEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtW10+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhbGxIb29rSXRlbXMpIHtcbiAgICBpZiAoaXRlbS5oYXNDcmVhdGVkRXZlbnQgJiYgIWl0ZW0uZGlzcG9zZWQpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBhbHJlYWR5IGNvbW1pdHRlZCBhbmQgc3RpbGwgbGl2ZTogbm90aGluZyB0byBkb1xuICAgIH1cbiAgICBjb25zdCBncm91cCA9IGhvb2tJdGVtc0J5VG9rZW4uZ2V0KGl0ZW0udG9rZW4pO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va0l0ZW1zQnlUb2tlbi5zZXQoaXRlbS50b2tlbiwgW2l0ZW1dKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1blxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gIC8vIEdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbiBvbiB0aGUgcnVuJ3Mgc3BlY1ZlcnNpb24uXG4gIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcblxuICBsZXQgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCA9IDA7XG4gIGNvbnN0IHNlcmlhbGl6YXRpb25CbG9ja2VyczogU3VzcGVuc2lvblNlcmlhbGl6YXRpb25CbG9ja2VyW10gPSBbXTtcbiAgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlSW5wdXQoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgY29udGV4dDogUGljazxTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIsICdzb3VyY2UnIHwgJ2NvcnJlbGF0aW9uSWQnPlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWREYXRhPiB7XG4gICAgY29uc3Qgc3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0geyBleGVjdXRpb25zOiBbXSB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgIHN0YXRzXG4gICAgICApKSBhcyBTZXJpYWxpemVkRGF0YTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCArPVxuICAgICAgICBzdGF0cy50b3RhbEV4ZWN1dGlvbnMgPz8gc3RhdHMuZXhlY3V0aW9ucy5sZW5ndGg7XG4gICAgICBzZXJpYWxpemF0aW9uQmxvY2tlcnMucHVzaChcbiAgICAgICAgLi4uc3RhdHMuZXhlY3V0aW9uc1xuICAgICAgICAgIC5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQgLSBzZXJpYWxpemF0aW9uQmxvY2tlcnMubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGV4ZWN1dGlvbikgPT4gKHsgLi4uY29udGV4dCwgLi4uZXhlY3V0aW9uIH0pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkaXNwb3NlSG9vayhcbiAgICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhvb2tEaXNwb3NlZEV2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICBldmVudFR5cGU6ICdob29rX2Rpc3Bvc2VkJyBhcyBjb25zdCxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICB9LFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoaG9va0Rpc3Bvc2VkRXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAvLyBIb29rIHdhcyBhbHJlYWR5IGRpc3Bvc2VkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uLCBzYWZlIHRvIHNraXBcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdIb29rIGFscmVhZHkgZGlzcG9zZWQsIHNraXBwaW5nIGR1cGxpY2F0ZSBkaXNwb3NhbCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGhvb2sgZGlzcG9zYWwnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgLy8gSG9vayBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb3IgbmV2ZXIgY3JlYXRlZFxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgbm90IGZvdW5kIGZvciBkaXNwb3NhbCwgY29udGludWluZycsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBob29rcyBmaXJzdCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIHdlYmhvb2sgcmVjZWl2ZXJzLlxuICAvLyBUcmFjayBhbnkgaG9vayBjb25mbGljdHMgdGhhdCBvY2N1cjogdGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXJcbiAgLy8gc28gdGhlIFYyIGhhbmRsZXIgY2FuIHJlLWludm9rZSBpbW1lZGlhdGVseS5cbiAgbGV0IGhhc0hvb2tDb25mbGljdCA9IGZhbHNlO1xuICBsZXQgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiA9IGZhbHNlO1xuICBsZXQgaG9va0NyZWF0aW9uTXMgPSAwO1xuXG4gIGlmIChob29rSXRlbXNCeVRva2VuLnNpemUgPiAwKSB7XG4gICAgY29uc3QgaG9va1BoYXNlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgYXdhaXQgc2V0dGxlUGhhc2UoXG4gICAgICBbLi4uaG9va0l0ZW1zQnlUb2tlbi52YWx1ZXMoKV0ubWFwKGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgIGxldCBjcmVhdGlvbkNvbmZsaWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgaG9va01ldGFkYXRhID1cbiAgICAgICAgICAgICAgdHlwZW9mIHF1ZXVlSXRlbS5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogYXdhaXQgZGVoeWRyYXRlSW5wdXQocXVldWVJdGVtLm1ldGFkYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hvb2tfbWV0YWRhdGEnLFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaG9va0V2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDogcXVldWVJdGVtLnRva2VuUmV0ZW50aW9uVW50aWwsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBpc1dlYmhvb2s6IHF1ZXVlSXRlbS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5pc1N5c3RlbSAmJiB7IGlzU3lzdGVtOiB0cnVlIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUhvb2tFdmVudCh7XG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBob29rRXZlbnQsXG4gICAgICAgICAgICAgIHF1ZXVlSXRlbSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBjcmVhdGVFdmVudDogY3JlYXRlR3VhcmRlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0IHx8PSByZXN1bHQuaGFzSG9va0NvbmZsaWN0O1xuICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiB8fD0gcmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb247XG4gICAgICAgICAgICBjcmVhdGlvbkNvbmZsaWN0ZWQgPSByZXN1bHQuaGFzSG9va0NvbmZsaWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERpc3Bvc2UgYWZ0ZXIgY3JlYXRpb24gZm9yIGhvb2tzIGJvcm4gYW5kIGRpc3Bvc2VkIHdpdGhpbiB0aGlzXG4gICAgICAgICAgLy8gYmF0Y2guIEEgaG9vayB3aG9zZSBjcmVhdGlvbiBjb25mbGljdGVkIHdhcyBuZXZlciBjcmVhdGVkLCBzb1xuICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcG9zZS5cbiAgICAgICAgICBpZiAocXVldWVJdGVtLmRpc3Bvc2VkICYmICFjcmVhdGlvbkNvbmZsaWN0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGRpc3Bvc2VIb29rKHF1ZXVlSXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgaG9va0NyZWF0aW9uTXMgPSBEYXRlLm5vdygpIC0gaG9va1BoYXNlU3RhcnQ7XG4gIH1cblxuICAvLyBQcm9jZXNzIGFib3J0IHJlcXVlc3RzOiByZXN1bWUgdGhlIGhvb2sgd2l0aCBhYm9ydCBwYXlsb2FkIGFuZCB3cml0ZSBzdHJlYW0gcGFja2V0XG4gIGNvbnN0IGhvb2tzTmVlZGluZ0Fib3J0ID0gYWxsSG9va0l0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gaXRlbS5hYm9ydFJlcXVlc3RlZCAmJiAhaXRlbS5kaXNwb3NlZFxuICApO1xuXG4gIGlmIChob29rc05lZWRpbmdBYm9ydC5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICBhd2FpdCBzZXR0bGVQaGFzZShcbiAgICAgIGhvb2tzTmVlZGluZ0Fib3J0Lm1hcChhc3luYyAocXVldWVJdGVtKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGVoeWRyYXRlIHRoZSBhYm9ydCBwYXlsb2FkIGZvciBzdG9yYWdlXG4gICAgICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlSW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYXNvbjogcXVldWVJdGVtLmFib3J0UmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc291cmNlOiAnaG9va19hYm9ydCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIGFib3J0IHBheWxvYWRcbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFdyaXRlIHN0cmVhbSBjYW5jZWxsYXRpb24gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcCBwcm9wYWdhdGlvbi5cbiAgICAgICAgICAvLyBSZXVzZSB0aGUgc2FtZSBkZWh5ZHJhdGVkIHBheWxvYWQgYXMgdGhlIGhvb2sgZXZlbnQgc28gdGhlIHJlYXNvblxuICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHRocm91Z2ggYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIC8gYGh5ZHJhdGVTdGVwQXJndW1lbnRzYFxuICAgICAgICAgIC8vIChoYW5kbGVzIERPTUV4Y2VwdGlvbiwgY3VzdG9tIGVycm9ycywgZW5jcnlwdGlvbiwgZXRjLikgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIGJhcmUgSlNPTi5zdHJpbmdpZnkgd2hpY2ggbG9zZXMgdHlwZSBpbmZvcm1hdGlvbiBhbmQgZHJvcHMgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIHN0cmVhbU5hbWUgaXMgc2V0IG9uIHRoZSBxdWV1ZSBpdGVtIGF0IGNvbnRyb2xsZXIgY29uc3RydWN0aW9uIHRpbWVcbiAgICAgICAgICAvLyAoc2VlIHdvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIudHMpLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZEZyb21Ub2tlbihxdWV1ZUl0ZW0udG9rZW4pO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHN0cmVhbU5hbWUsXG4gICAgICAgICAgICAgIGFib3J0UGF5bG9hZCBhcyBVaW50OEFycmF5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGU6IGhvb2sgZXZlbnQgcHJvdmlkZXMgdGhlIGR1cmFibGUgZmFsbGJhY2tcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICdGYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCwgaG9vayBldmVudCB3aWxsIHByb3ZpZGUgZmFsbGJhY2snLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGFib3J0JyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgc3RlcCBldmVudHMgZm9yIHN0ZXBzIHRoYXQgZG9uJ3QgaGF2ZSB0aGVtIHlldC5cbiAgLy8gVW5saWtlIFYxLCB3ZSBkbyBOT1QgcXVldWUgc3RlcCBtZXNzYWdlcyBmcm9tIGhlcmU6IHRoZSBjYWxsZXJcbiAgLy8gZGVjaWRlcyB3aGljaCBzdGVwcyB0byBleGVjdXRlIGlubGluZSB2cy4gcXVldWUgdG8gYmFja2dyb3VuZC5cbiAgLy8gV2FpdCBldmVudHMgYXJlIGFsc28gY3JlYXRlZCBpbiBwYXJhbGxlbCBiZWxvdy5cbiAgY29uc3Qgc3RlcHNOZWVkaW5nQ3JlYXRpb24gPSBuZXcgU2V0KFxuICAgIHN0ZXBJdGVtc1xuICAgICAgLmZpbHRlcigocXVldWVJdGVtKSA9PiAhcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudClcbiAgICAgIC5tYXAoKHF1ZXVlSXRlbSkgPT4gcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpXG4gICk7XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCBUSElTIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50LiBQb3B1bGF0ZWQgYnkgdGhlIG9wcyBiZWxvdyBhZnRlciBhIHN1Y2Nlc3NmdWxcbiAgLy8gZXZlbnRzLmNyZWF0ZSwgdXNlZCBieSB0aGUgY2FsbGVyIHRvIGNsYWltIG93bmVyc2hpcCBhbmQgYXZvaWRcbiAgLy8gcmFjaW5nIHdpdGggY29uY3VycmVudCBoYW5kbGVycyBvbiBzdGVwIGV4ZWN1dGlvbi5cbiAgY29uc3QgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyBmaW5hbGl6ZWQgYXMgZmFpbGVkIGJlY2F1c2UgdGhlaXIgYXJndW1lbnRzXG4gIC8vIHJlZnVzZWQgdG8gc2VyaWFsaXplOiBzZWUgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXAgYmVsb3cuXG4gIGNvbnN0IGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBBIHN0ZXAgd2hvc2UgYXJndW1lbnRzIGZhaWwgdG8gc2VyaWFsaXplIGlzIGRldGVybWluaXN0aWM6IGV2ZXJ5IHJlcGxheVxuICAgKiByZS1kZXJpdmVzIHRoZSBzYW1lIHVuc2VyaWFsaXphYmxlIHZhbHVlLCBzbyByZWRlbGl2ZXJpbmcgdGhlXG4gICAqIG9yY2hlc3RyYXRvciBtZXNzYWdlIGNhbiBuZXZlciBzdWNjZWVkLiBJbnN0ZWFkIG9mIHJlamVjdGluZyB0aGUgd2hvbGVcbiAgICogc3VzcGVuc2lvbiAod2hpY2ggZmFpbHMgdGhlIHJ1biBmcm9tIHRoZSBvdXRzaWRlLCB3aGVyZSBubyB1c2VyIGNvZGUgY2FuXG4gICAqIG9ic2VydmUgaXQpLCB0cmVhdCBpdCBleGFjdGx5IGxpa2UgYSBzdGVwLWJvZHkgZmFpbHVyZTogd3JpdGVcbiAgICogYHN0ZXBfY3JlYXRlZGAgd2l0aCBhIHBsYWNlaG9sZGVyIGlucHV0IChldmVyeSBXb3JsZCByZXF1aXJlcyB0aGUgc3RlcFxuICAgKiBlbnRpdHkgdG8gZXhpc3QgYmVmb3JlIGEgdGVybWluYWwgc3RlcCBldmVudCwgYW5kIHRoZSByZWFsIGlucHV0IGlzXG4gICAqIHByZWNpc2VseSB3aGF0IHJlZnVzZWQgdG8gc2VyaWFsaXplKSBmb2xsb3dlZCBieSBgc3RlcF9mYWlsZWRgIGNhcnJ5aW5nXG4gICAqIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IuIFRoZSBuZXh0IHJlcGxheSByZWplY3RzIHRoZSBzdGVwJ3MgcHJvbWlzZSB3aXRoXG4gICAqIGl0LCBzbyBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcyB0aGUgZXJyb3I7IHVuY2F1Z2h0LCBpdFxuICAgKiBwcm9wYWdhdGVzIG91dCBvZiB0aGUgd29ya2Zsb3cgYm9keSBhbmQgZmFpbHMgdGhlIHJ1biBhcyBhIFVTRVJfRVJST1IsXG4gICAqIHdpdGhvdXQgYnVybmluZyBxdWV1ZSByZWRlbGl2ZXJpZXMgZWl0aGVyIHdheS5cbiAgICovXG4gIGNvbnN0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwID0gYXN5bmMgKFxuICAgIHF1ZXVlSXRlbTogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sXG4gICAgZXJyb3I6IFNlcmlhbGl6YXRpb25FcnJvclxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAnU3RlcCBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZTsgZmFpbGluZyB0aGUgc3RlcCBzbyB0aGUgJyArXG4gICAgICAgICd3b3JrZmxvdyBjYW4gb2JzZXJ2ZSB0aGUgZXJyb3InLFxuICAgICAge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfVxuICAgICk7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAvLyBNYXJrZXIgcGxhY2Vob2xkZXIgKG5vdCBlbXB0eSBhcmdzKTogYnl0ZS1pZGVudGljYWwtdG8temVyby1hcmdzIHdvdWxkXG4gICAgLy8gbWFrZSBgd29ya2Zsb3cgaW5zcGVjdCBzdGVwc2Agc2hvdyBcIm5vIGFyZ3VtZW50c1wiIGZvciB0aGUgb25lIHN0ZXBcbiAgICAvLyB3aG9zZSBlbnRpcmUgcHJvYmxlbSB3YXMgaXRzIGFyZ3VtZW50cy5cbiAgICBjb25zdCBwbGFjZWhvbGRlcklucHV0ID0gKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyKCksXG4gICAgICBydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBzdXNwZW5zaW9uLmdsb2JhbFRoaXMsXG4gICAgICBmYWxzZSxcbiAgICAgIGNvbXByZXNzaW9uXG4gICAgKSkgYXMgU2VyaWFsaXplZERhdGE7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICBpbnB1dDogcGxhY2Vob2xkZXJJbnB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGNyZWF0ZUVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoY3JlYXRlRXJyKSkge1xuICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBhbHJlYWR5IGNyZWF0ZWQgdGhlIHN0ZXA6IHRoZSBmYWlsdXJlIGlzXG4gICAgICAgIC8vIGRldGVybWluaXN0aWMsIHNvIGl0IGlzIHJhY2luZyB0b3dhcmQgdGhlIHNhbWUgc3RlcF9mYWlsZWQgYmVsb3cuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBtZXNzYWdlOiBjcmVhdGVFcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhjcmVhdGVFcnIpKSB7XG4gICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkOiBub3RoaW5nIHRvIG9ic2VydmUgdGhlIGZhaWx1cmUuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGNyZWF0ZUVycjtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBpdHNlbGYgaXMgYSBwbGFpbiBXb3JrZmxvd0Vycm9yIChuYW1lLCBtZXNzYWdlIHdpdGhcbiAgICAgICAgICAgIC8vIGZyYW1lZCBoaW50LCBjYXVzZSBjaGFpbiksIHNlcmlhbGl6YWJsZSBldmVuIHRob3VnaCB0aGUgc3RlcFxuICAgICAgICAgICAgLy8gaW5wdXQgd2FzIG5vdC4gRXJyb3IgZGV0ZWN0aW9uIGlzIHJlYWxtLWluZGVwZW5kZW50XG4gICAgICAgICAgICAvLyAodHlwZXMuaXNOYXRpdmVFcnJvciksIHNvIHRoZSBob3N0LWNyZWF0ZWQgZXJyb3Igc2VyaWFsaXplc1xuICAgICAgICAgICAgLy8gdGhlIHNhbWUgdW5kZXIgZWl0aGVyIGdsb2JhbDsgdGhlIFZNIGdsb2JhbCBpcyBwYXNzZWQgZm9yXG4gICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSB3aXRoIGV2ZXJ5IG90aGVyIGRlaHlkcmF0aW9uIGluIHRoaXMgZmlsZSBhbmQgc29cbiAgICAgICAgICAgIC8vIGFueSBWTS1yZWFsbSB2YWx1ZXMgZ3Vlc3QgY29kZSB0aHJldyBpbnRvIHRoZSBjYXVzZSBjaGFpblxuICAgICAgICAgICAgLy8gKGdldHRlcnMvcHJveGllcyBleGVjdXRlZCBkdXJpbmcgdGhlIGZhaWxlZCBkZWh5ZHJhdGlvbikgYXJlXG4gICAgICAgICAgICAvLyBkZXRlY3RlZCBieSB0aGUgcmVhbG0tc2Vuc2l0aXZlIHJlZHVjZXJzLlxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgICAvLyBTdGVwIGFscmVhZHkgdGVybWluYWwgKGEgY29uY3VycmVudCBoYW5kbGVyIHdyb3RlIHRoZSBzYW1lXG4gICAgICAgIC8vIGRldGVybWluaXN0aWMgZmFpbHVyZSkgb3IgdGhlIHJ1biBhbHJlYWR5IGZpbmlzaGVkLlxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgb3IgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgfVxuICAgIH1cbiAgICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuYWRkKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAvLyBSZWxlYXNlIHRoZSBpbmxpbmUgc2xvdCBib29ra2VlcGluZzogdGhlIHN0ZXAgbmV2ZXIgcnVucywgc28gaXQgbXVzdFxuICAgIC8vIG5vdCBhcHBlYXIgaW4gdGhlIHJlYnVpbHQgYGxhenlJbmxpbmVTdGVwc2AuIChJdHMgc2xvdCBpbiB0aGUgZmlyc3QtTlxuICAgIC8vIHNlbGVjdGlvbiBhbmQgaW4gYGlubGluZVBhaXJGb2xkRWxpZ2libGVgJ3MgYXJpdGhtZXRpYyB3YXMgY29uc3VtZWRcbiAgICAvLyBiZWZvcmUgZGVoeWRyYXRpb24gY291bGQgcmV2ZWFsIHRoZSBmYWlsdXJlLCBpbmhlcmVudCB0byBzZWxlY3RpbmdcbiAgICAvLyBiZWZvcmUgc2VyaWFsaXppbmcsIGFuZCBib3VuZGVkIHRvIG9uZSB3YXN0ZWQgc2xvdCBvbiBhIHBhc3MgdGhhdFxuICAgIC8vIGVuZHMgaW4gYSBmb3JjZWQgcmVwbGF5IGFueXdheS4pXG4gICAgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLmRlbGV0ZShxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gIH07XG5cbiAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IGRlZmVyIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yIHVwIHRvXG4gIC8vIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyB0aGUgY2FsbGVyIHdpbGwgcnVuIGlubGluZSAoaW4gcGFyYWxsZWwpLiBFYWNoXG4gIC8vIHN0ZXAgaXMgY3JlYXRlZCBvbiB0aGUgZmx5IGJ5IHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGV4ZWN1dGVTdGVwIHNlbmRzXG4gIC8vIChzYXZpbmcgYSByb3VuZC10cmlwIHBlciBzdGVwKS4gV2UgbmV2ZXIgZGVmZXIgd2hlbiBhIGBob29rLmdldENvbmZsaWN0KClgXG4gIC8vIGF3YWl0ZXIgaXMgcHJlc2VudCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIGNhbGxlciBleGVjdXRlcyBub3RoaW5nIGlubGluZVxuICAvLyAoaXQgcmUtaW52b2tlcyBpbW1lZGlhdGVseSB0byByZXNvbHZlIHRoZSBhd2FpdGVyKSwgc28gZGVmZXJyaW5nIHdvdWxkXG4gIC8vIGxlYXZlIHRoZSBzdGVwcyB1bmNyZWF0ZWQgYW5kIHVucXVldWVkLiBXZSBwaWNrIHRoZSBmaXJzdCBOIHVuY3JlYXRlZFxuICAvLyBzdGVwcyAobWF0Y2hpbmcgdGhlIGNhbGxlcidzIGlubGluZS1jYW5kaWRhdGUgc2VsZWN0aW9uKSBhbmQgZGVoeWRyYXRlXG4gIC8vIHRoZWlyIGlucHV0IGhlcmUgc28gZXhlY3V0ZVN0ZXAgY2FuIHNoaXAgaXQgYXMgdGhlIHN0ZXBfc3RhcnRlZCBwYXlsb2FkLlxuICBjb25zdCBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiA9PT0gZmFsc2VcbiAgICAgID8gc3RlcEl0ZW1zXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gc3RlcHNOZWVkaW5nQ3JlYXRpb24uaGFzKGl0ZW0uY29ycmVsYXRpb25JZCkpXG4gICAgICAgICAgLnNsaWNlKDAsIGdldE1heElubGluZVN0ZXBzKCkpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jb3JyZWxhdGlvbklkKVxuICAgICAgOiBbXVxuICApO1xuICAvLyBDb2xsZWN0ZWQgYnkgY29ycmVsYXRpb25JZCBiZWNhdXNlIHRoZSBwZXItc3RlcCBvcHMgYmVsb3cgcnVuIGNvbmN1cnJlbnRseVxuICAvLyBhbmQgc2V0dGxlIG91dCBvZiBvcmRlci4gV2UgcmVidWlsZCB0aGUgYXJyYXkgaW4gZGV0ZXJtaW5pc3RpY1xuICAvLyBgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzYCBvcmRlciAodGhlIG9yZGVyZWQgc2xpY2UgYWJvdmUpIGFmdGVyIHRoZSBvcHNcbiAgLy8gc2V0dGxlLCBzbyB0aGUgaW5saW5lIGJhdGNoIG9yZGVyIGlzIHN0YWJsZSByZWdhcmRsZXNzIG9mIGRlaHlkcmF0aW9uIHRpbWluZy5cbiAgY29uc3QgbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZCA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydsYXp5SW5saW5lU3RlcHMnXVtudW1iZXJdXG4gID4oKTtcblxuICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB3aG9zZSBzdGVwLWV4ZWN1dGlvbiBxdWV1ZSBtZXNzYWdlIHdhcyBhbHJlYWR5XG4gIC8vIHB1Ymxpc2hlZCBieSB0aGUgcmVzaWxpZW50LWRpc3BhdGNoIG9wcyBiZWxvdyAoYWxvbmdzaWRlIHRoZSBzdGVwX2NyZWF0ZWRcbiAgLy8gd3JpdGUpLiBSZXBvcnRlZCB0byB0aGUgY2FsbGVyIHNvIGl0cyBkaXNwYXRjaCBwYXNzIHNraXBzIHRoZW0uXG4gIGNvbnN0IHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIGVsaWdpYmlsaXR5LCBzaGFyZWQgYnkgZXZlcnkgc3RlcCBvcCBiZWxvdyAodGhlXG4gIC8vIHBlci1zdGVwIGlucHV0LXNpemUgY2hlY2sgaXMgYXBwbGllZCBpbnNpZGUgdGhlIG9wKS4gQWxsIG11c3QgaG9sZDpcbiAgLy9cbiAgLy8gIC0gVGhlIGNhbGxlciBwcm92aWRlZCBhIGRpc3BhdGNoIHRhcmdldCAoYHN0ZXBEaXNwYXRjaGApOiB0ZXJtaW5hbFxuICAvLyAgICBkcmFpbnMgYW5kIG90aGVyIGNyZWF0ZS1vbmx5IGNhbGxlcnMgbmV2ZXIgcXVldWUuXG4gIC8vICAtIFRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgKGBXT1JLRkxPV19SRVNJTElFTlRfU1RFUF9ESVNQQVRDSGAgb3B0LWluKS5cbiAgLy8gICAgSXQgaXMgb2ZmIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGUgcHVibGlzaCByYWNlcyB0aGUgY3JlYXRlJ3MgdmVyZGljdCxcbiAgLy8gICAgYW5kIGEgY3JlYXRlIGNhbiBjb21lIGJhY2sgcmVmdXNlZDogYXMgYSBkdXBsaWNhdGUgdGhlIHJlcGxheSBzaG91bGRcbiAgLy8gICAgc3RvcCBwdXJzdWluZywgb3IgKG9uIGEgV29ybGQgdGhhdCB3b3VsZCByYXRoZXIgcmVmdXNlIGEgc3RhbGUgd3JpdGVcbiAgLy8gICAgdGhhbiByZXBvcnQgd2hhdCBpdCBtaXNzZWQpIGFzIGEgNDEyLiBFaXRoZXIgd2F5IHRoZSBxdWV1ZSBtZXNzYWdlXG4gIC8vICAgIGNhcnJ5aW5nIHRoZSBwYXlsb2FkIGlzIGFscmVhZHkgb3V0LCBhbmQgdGhlIGNvbnN1bWVyIGNhbiBtYXRlcmlhbGl6ZSBhXG4gIC8vICAgIHN0ZXAgd2hvc2UgY3JlYXRlIHdhcyByZWZ1c2VkLiBOb3RoaW5nIG9yZGVycyB0aGF0IHZlcmRpY3QgYmVmb3JlIHRoZVxuICAvLyAgICBjb25zdW1lcidzIHJlZGVsaXZlcnkgcmUtZW5zdXJlLCBzbyBubyBiYWNrZW5kLXNpZGUgcmV2b2NhdGlvblxuICAvLyAgICBib29ra2VlcGluZyBjYW4gY2xvc2UgdGhlIHdpbmRvdzogYSBiZXN0LWVmZm9ydCBtYXJrZXIgdGhhdCBmYWlscyBvcGVuXG4gIC8vICAgIGNhbm5vdCBjYXJyeSBhIGNvcnJlY3RuZXNzIHByb3BlcnR5LiBUaGUgc2VxdWVudGlhbCBwYXRoIGlzIHRoZSBvbmx5XG4gIC8vICAgIHRoaW5nIHRoYXQgZ2l2ZXMgdGhlIG1lc3NhZ2UgYSBoYXBwZW5zLWFmdGVyIGVkZ2Ugb3ZlciB0aGUgdmVyZGljdC5cbiAgLy8gIC0gVGhlIHJ1bidzIHF1ZXVlIHRyYW5zcG9ydCBwcmVzZXJ2ZXMgYmluYXJ5IHBheWxvYWRzIChDQk9SLFxuICAvLyAgICBzcGVjVmVyc2lvbiA+PSAzKTogYHN0ZXBJbnB1dC5pbnB1dGAgaXMgdGhlIHNlcmlhbGl6ZWQgKHBvc3NpYmx5XG4gIC8vICAgIGVuY3J5cHRlZCkgaW5wdXQgYnl0ZXMsIHdoaWNoIHRoZSBKU09OIHRyYW5zcG9ydCB3b3VsZCBtYW5nbGUuXG4gIGNvbnN0IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgPVxuICAgIHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcblxuICAvLyBCYXRjaGVkIGZhbi1vdXQ6IGZvbGQgdGhpcyBzdXNwZW5zaW9uJ3Mgc3RlcF9jcmVhdGVkICsgd2FpdF9jcmVhdGVkXG4gIC8vIHdyaXRlcyBpbnRvIG9uZSBgZXZlbnRzLmNyZWF0ZUJhdGNoYCBjYWxsIChvbmUgZHVyYWJsZSB3cml0ZSwgcGVyLWV2ZW50XG4gIC8vIG91dGNvbWVzKSBpbnN0ZWFkIG9mIG9uZSB3cml0ZSBwZXIgZXZlbnQuIEVuZ2FnZXMgb25seSBmb3IgYSBDTEVBTlxuICAvLyBmYW4tb3V0IChubyBhdHRyaWJ1dGUgd3JpdGVzLCBubyBob29rIHdyaXRlcywgbm8gcmVzaWxpZW50IGRpc3BhdGNoXG4gIC8vIHdob3NlIGNyZWF0ZXMgYXJlIGVhY2ggcGFpcmVkIHdpdGggYSBxdWV1ZSBwdWJsaXNoKSBvbiBhIFdvcmxkIHRoYXRcbiAgLy8gaW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgbWV0aG9kIGFuZCBhIHJ1biB3aG9zZSBldmVudHMgYXJlIHNsb3QtbnVtYmVyZWQuXG4gIC8vIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgZ2F0ZSBrZWVwcyB0aGUgc2luZ2xlLWV2ZW50IHBhdGggYnl0ZS1mb3ItYnl0ZS5cbiAgY29uc3QgYmF0Y2hGYW5vdXRFbGlnaWJsZSA9XG4gICAgaXNCYXRjaFRyYW5zaXRpb25zRW5hYmxlZCgpICYmXG4gICAgdHlwZW9mIHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFkgJiZcbiAgICAhcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgIGFsbEhvb2tJdGVtcy5sZW5ndGggPT09IDAgJiZcbiAgICBhdHRyaWJ1dGVJdGVtcy5sZW5ndGggPT09IDA7XG4gIC8qKlxuICAgKiBUaGUgZm9sZCdzIGNvbGxlY3Rpb24sIGluIHNjaGVkdWxpbmcgb3JkZXIgKHN0ZXBzIGluIHN0ZXBJdGVtcyBvcmRlcixcbiAgICogdGhlbiB3YWl0cykuIFN0ZXAgZW50cmllcyBhcmUgZW5xdWV1ZWQgYnkgdGhlaXIgcHJlcCBwcm9taXNlcyAoaW5wdXRcbiAgICogZGVoeWRyYXRpb24gcnVucyBjb25jdXJyZW50bHksIHNvIGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgYG9yZGVyYCwgbm90IGJ5XG4gICAqIGNvbXBsZXRpb24pOyB0aGUgc2luZ2xlIGZsdXNoIG9wIGJlbG93IGF3YWl0cyBldmVyeSBwcmVwLCBzb3J0cywgYW5kXG4gICAqIGNvbW1pdHMgdGhlIHdob2xlIHNldCB0aHJvdWdoIGBjcmVhdGVCYXRjaGAuXG4gICAqL1xuICBjb25zdCBiYXRjaFF1ZXVlOiB7XG4gICAgb3JkZXI6IG51bWJlcjtcbiAgICBraW5kOiAnc3RlcCcgfCAnd2FpdCcgfCAnaW5saW5lLWNyZWF0ZWQnIHwgJ2lubGluZS1zdGFydGVkJztcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBzdGVwJ3MgbmFtZSwgc2V0IG9uIHN0ZXAtY2Fycnlpbmcga2luZHMgKHRoZSBpbi1mbHVzaCBwdWJsaXNoZXNcbiAgICAgKiAgYW5kIHRoZSBkaXNwYXRjaCBpZGVtcG90ZW5jeSBrZXkgbmVlZCBpdCkuICovXG4gICAgc3RlcE5hbWU/OiBzdHJpbmc7XG4gICAgZXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdDtcbiAgfVtdID0gW107XG4gIGNvbnN0IGJhdGNoUHJlcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIC8vIFByZS1jbGFpbWVkIGlubGluZSBwYWlyczogZm9sZCBlYWNoIGxhenktaW5saW5lIHN0ZXAncyBkZWZlcnJlZFxuICAvLyBgc3RlcF9jcmVhdGVkYCAoY2FycnlpbmcgaXRzIGlucHV0KSBBTkQgaXRzIGBzdGVwX3N0YXJ0ZWRgIGNsYWltIChiYXJlLFxuICAvLyBvd25lcnNoaXAtc3RhbXBlZCkgaW50byB0aGUgYmF0Y2gsIHNvIHRoZSB3aG9sZSBmYW4tb3V0ICh0aGUgaW5saW5lXG4gIC8vIHN0ZXBzJyBjbGFpbXMgaW5jbHVkZWQpIGNvbW1pdHMgaW4gdGhlIG9uZSBkdXJhYmxlIHdyaXRlIGFuZCB0aGUgY2FsbGVyXG4gIC8vIHN0YXJ0cyB0aGUgYm9kaWVzIHN0cmFpZ2h0IG9mZiB0aGF0IGNvbW1pdCBpbnN0ZWFkIG9mIHBvc3Rpbmcgb25lIGNsYWltXG4gIC8vIHBlciBpbmxpbmUgc3RlcC4gVGhlIGxvbmUtaW5saW5lIGNhc2UgKG5vdGhpbmcgZWxzZSB0byBiYXRjaCB3aXRoKSBpc1xuICAvLyBleGNsdWRlZDogYSBwYWlyLW9ubHkgYmF0Y2ggY29zdHMgdGhlIHNhbWUgcm91bmQgdHJpcCBhcyB0aGUgc2luZ2xlIGxhenlcbiAgLy8gY2xhaW0gd2hpbGUgZ2l2aW5nIHVwIHRoZSBvcHRpbWlzdGljIGNsYWltL2JvZHkgb3ZlcmxhcCBhbmQgdGhlXG4gIC8vIGJ1bXAtYW5kLXJlcG9ydCB0aGF0IGBjcmVhdGVHdWFyZGVkYCBwcm92aWRlcywgc28gaXQgc3RheXMgb24gdGhlIGxhenlcbiAgLy8gcGF0aC4gUmVxdWlyZXMgdGhlIGNhbGxlcidzIGBvd25lck1lc3NhZ2VJZGA6IHRoZSBzdGFydGVkIHJvdyBtdXN0XG4gIC8vIHN0YW1wIG93bmVyc2hpcCBleGFjdGx5IGxpa2UgdGhlIGxhenkgY2xhaW0gaXQgcmVwbGFjZXMgKGFuZCBhIGNhbGxlclxuICAvLyB0aGF0IGRvZXMgbm90IGlubGluZS1leGVjdXRlIG5ldmVyIHByb3ZpZGVzIG9uZSkuXG4gIGNvbnN0IHVuY3JlYXRlZFdhaXRDb3VudCA9IHdhaXRJdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pID0+ICFpdGVtLmhhc0NyZWF0ZWRFdmVudFxuICApLmxlbmd0aDtcbiAgY29uc3QgaW5saW5lUGFpckZvbGRFbGlnaWJsZSA9XG4gICAgYmF0Y2hGYW5vdXRFbGlnaWJsZSAmJlxuICAgIG93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDAgJiZcbiAgICAobGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLnNpemUgPj0gMiB8fFxuICAgICAgc3RlcHNOZWVkaW5nQ3JlYXRpb24uc2l6ZSAtXG4gICAgICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5zaXplICtcbiAgICAgICAgdW5jcmVhdGVkV2FpdENvdW50ID49XG4gICAgICAgIDEpO1xuICBjb25zdCBpbmxpbmVDbGFpbXM6IFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydpbmxpbmVDbGFpbXMnXSA9IG5ldyBNYXAoKTtcbiAgbGV0IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmc6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgdHJhY2UgY2FycmllciBmb3IgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2hlcywgcmVzb2x2ZWQgYXQgbW9zdCBvbmNlIHBlclxuICAvLyBzdXNwZW5zaW9uICh0aGUgcGVyLXN0ZXAgb3BzIHJ1biBjb25jdXJyZW50bHkgYW5kIHNoYXJlIGl0KS5cbiAgbGV0IHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcjogUHJvbWlzZTxUcmFjZUNhcnJpZXI+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxUcmFjZUNhcnJpZXI+ID0+IHtcbiAgICBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIgPz89XG4gICAgICBzdGVwRGlzcGF0Y2g/LmdldFRyYWNlQ2FycmllcigpID8/IFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgcmV0dXJuIHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcjtcbiAgfTtcblxuICAvLyBQcm9kdWNlci1zaWRlIHJlc2lsaWVudCByZWNvdmVyeSBjb3VudCBmb3IgdGhlIHN1c3BlbnNpb24gc3BhbiBhdHRyaWJ1dGUuXG4gIGxldCByZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZCA9IDA7XG5cbiAgLy8gU3RlcHM6IGNyZWF0ZSBzdGVwX2NyZWF0ZWQgZXZlbnRzIChubyBxdWV1aW5nLCBWMiByZXR1cm5zIHBlbmRpbmcgc3RlcHNcbiAgLy8gdG8gY2FsbGVyLCBFWENFUFQgb24gdGhlIHJlc2lsaWVudCBkaXNwYXRjaCBwYXRoLCB3aGljaCBwYXJhbGxlbGl6ZXMgdGhlXG4gIC8vIGNyZWF0ZSB3aXRoIHRoZSBzdGVwJ3MgcXVldWUgcHVibGlzaCBhbmQgcmVwb3J0cyBpdCBpblxuICAvLyBgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCkuXG4gIGxldCBiYXRjaE9yZGVyQ291bnRlciA9IDA7XG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHN0ZXBJdGVtcykge1xuICAgIGlmIChzdGVwc05lZWRpbmdDcmVhdGlvbi5oYXMocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAvLyBEZXRlcm1pbmlzdGljIHBvc2l0aW9uIGluIHRoZSBiYXRjaGVkIGZvbGQgKGFzc2lnbmVkIGluIHN0ZXBJdGVtc1xuICAgICAgLy8gb3JkZXIsIGJlZm9yZSB0aGUgY29uY3VycmVudCBkZWh5ZHJhdGlvbiBydW5zKS4gQSBwYWlyLWZvbGRlZCBpbmxpbmVcbiAgICAgIC8vIHN0ZXAgb2NjdXBpZXMgdHdvIGNvbnNlY3V0aXZlIHBvc2l0aW9ucyAoY3JlYXRlZCByb3cgdGhlbiBzdGFydGVkXG4gICAgICAvLyByb3cpLCB3aGljaCB0aGUgZmx1c2gga2VlcHMgYWRqYWNlbnQgYW5kIG5ldmVyIHNwbGl0cyBhY3Jvc3MgY2h1bmtzLFxuICAgICAgLy8gc28gYSBXb3JsZCBjYW4gZm9sZCB0aGVtIGludG8gb25lIGJvcm4tcnVubmluZyBjcmVhdGUuXG4gICAgICBjb25zdCBwYWlyRm9sZGVkID1cbiAgICAgICAgaW5saW5lUGFpckZvbGRFbGlnaWJsZSAmJlxuICAgICAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHN0ZXBPcmRlciA9IGJhdGNoT3JkZXJDb3VudGVyO1xuICAgICAgYmF0Y2hPcmRlckNvdW50ZXIgKz0gcGFpckZvbGRlZCA/IDIgOiAxO1xuICAgICAgY29uc3Qgc3RlcE9wID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGRlaHlkcmF0ZWRJbnB1dDogU2VyaWFsaXplZERhdGE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVoeWRyYXRlZElucHV0ID0gYXdhaXQgZGVoeWRyYXRlSW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFyZ3M6IHF1ZXVlSXRlbS5hcmdzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogcXVldWVJdGVtLmNsb3N1cmVWYXJzLFxuICAgICAgICAgICAgICB0aGlzVmFsOiBxdWV1ZUl0ZW0udGhpc1ZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ3N0ZXBfaW5wdXQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIVNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBlLmcuIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6IGFuIFNESyBmYXVsdCwgbm90IGEgdXNlciB2YWx1ZVxuICAgICAgICAgICAgLy8gcHJvYmxlbS4gS2VlcCBpdHMgaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIGFuZCBjdXJyZW50XG4gICAgICAgICAgICAvLyBmYWlsLXRoZS1zdXNwZW5zaW9uIGJlaGF2aW9yLlxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN0ZXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgLy8gTm8gZGlzcGF0Y2ggdGFyZ2V0IG1lYW5zIG5vIHJlcGxheSB3aWxsIG9ic2VydmUgYVxuICAgICAgICAgICAgLy8gZmluYWxpemF0aW9uOiB0aGlzIGlzIHRoZSB0ZXJtaW5hbCBkcmFpbiAob3IgYSBjcmVhdGUtb25seVxuICAgICAgICAgICAgLy8gdGVzdCBjYWxsZXIpLiBUaGUgcnVuIGlzIGFscmVhZHkgY29tcGxldGluZy9mYWlsaW5nLCBzb1xuICAgICAgICAgICAgLy8gd3JpdGluZyBzdGVwX2NyZWF0ZWQgKyBzdGVwX2ZhaWxlZCBoZXJlIHdvdWxkIGxlYXZlIGUuZy4gYVxuICAgICAgICAgICAgLy8gQ09NUExFVEVEIHJ1biBjYXJyeWluZyBhIGZhaWxlZCBzdGVwIG5vdGhpbmcgY2FuIGV2ZXJcbiAgICAgICAgICAgIC8vIG9ic2VydmUsIHJlYWRpbmcgYXMgYSBidWcgZnJvbSB0aGUgZGFzaGJvYXJkLiBSZXRocm93XG4gICAgICAgICAgICAvLyBpbnN0ZWFkOyB0aGUgZHJhaW4ncyBvd24gY2F0Y2ggc3dhbGxvd3MgaXQsIHByZXNlcnZpbmcgaXRzXG4gICAgICAgICAgICAvLyBwcmUtZXhpc3RpbmcgYmVoYXZpb3IgKG5vIHJvd3MgZm9yIHRoZSB1bmF3YWl0ZWQgc3RlcCkuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwKHF1ZXVlSXRlbSwgZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmZXJyZWQgKGxhenkpIGlubGluZSBzdGVwOiBza2lwIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUg4oCUIHRoZVxuICAgICAgICAvLyBjYWxsZXIncyBpbmxpbmUgZXhlY3V0ZVN0ZXAgd2lsbCBzZW5kIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmdcbiAgICAgICAgLy8gdGhpcyBpbnB1dCwgYW5kIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIChlbnRpdHkgKyBzeW50aGV0aWNcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50KSBhdG9taWNhbGx5LiBXZSBkbyBOT1QgYWRkIGl0IHRvXG4gICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM7IG93bmVyc2hpcCBpcyBkZWNpZGVkIGJ5IHRoYXQgbGF6eVxuICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQncyBhdG9taWMgY3JlYXRlLWNsYWltIGluc3RlYWQuXG4gICAgICAgIGlmIChsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgIGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuc2V0KHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHBhaXJGb2xkZWQpIHtcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIHBhaXIgdGhlIGRlZmVycmFsIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNhbGxlcidzIGxhenkgYHN0ZXBfc3RhcnRlZGA6IHRoZSBjcmVhdGVkIHJvdyBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgLy8gaW5wdXQgKHBheWxvYWRzIHJpZGUgY3JlYXRlcyBpbiBhIGJhdGNoKSwgdGhlIHN0YXJ0ZWQgcm93IGlzXG4gICAgICAgICAgICAvLyBiYXJlIGFuZCBzdGFtcHMgdGhpcyBpbnZvY2F0aW9uJ3Mgb3duZXJzaGlwLCB0aGUgc2FtZSBjbGFpbVxuICAgICAgICAgICAgLy8gc2hhcGUgdGhlIGxhenkgc3RhcnQgd291bGQgaGF2ZSBzZW50LCBzZXR0bGVkIGJ5IHRoZSBiYXRjaC5cbiAgICAgICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtY3JlYXRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlciArIDEsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtc3RhcnRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrZWQgYnkgaW5saW5lUGFpckZvbGRFbGlnaWJsZTsgc3ByZWFkIGtlZXBzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmFycm93LXRocm91Z2gtY2xvc3VyZSBwcm9ibGVtIGF3YXkgZnJvbSB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgICAgIC4uLihvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkID8geyBvd25lck1lc3NhZ2VJZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZmlyZSB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGFuZCB0aGVcbiAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCBpbiBwYXJhbGxlbDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGVcbiAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZFxuICAgICAgICAvLyB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0IChgcnVuSW5wdXRgKSBhbmRcbiAgICAgICAgLy8gcmVzaWxpZW50IGhvb2sgcmVzdW1lIChgaG9va0lucHV0YCkgcGF0dGVybnMuIE9ubHkgZm9yIGlucHV0cyB0aGVcbiAgICAgICAgLy8gcXVldWUgbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQuYnl0ZUxlbmd0aCA8PSBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgY3JlYXRlR3VhcmRlZChzdGVwRXZlbnQsIHsgcmVxdWVzdElkIH0pLFxuICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBpbXBsaWVkIGJ5IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGVcbiAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHN0ZXBJbnB1dDogeyBpbnB1dDogZGVoeWRyYXRlZElucHV0IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIFNhbWUga2V5IGFzIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzIGFuZCBhbnkgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3MsIHNvIHJlZHVuZGFudCBwdWJsaXNoZXMgZm9yIHRoaXMgc3RlcCBkZWR1cGUuIFRoZVxuICAgICAgICAgICAgICAvLyBrZXkgaXMgc3RlcC1pZGVudGl0eS1zY29wZWQgc28gYSByZXZva2VkIG1lc3NhZ2UgZm9yIGFcbiAgICAgICAgICAgICAgLy8gcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCBjYW5ub3QgYWJzb3JiIHRoZSBjb3JyZWN0ZWRcbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUncyBkaXNwYXRjaDogc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBxdWV1ZUl0ZW0uc3RlcE5hbWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIGZvciB0aGlzIHN1c3BlbnNpb24gcGFzczogd2l0aG91dFxuICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHRoZSBzdGVwIHdvdWxkIHJlbHkgb24gdGhlIGNyZWF0ZSBhbG9uZSwgYW5kIGlmIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBubyBkdXJhYmxlIHJlY29yZCBhdCBhbGwuXG4gICAgICAgICAgLy8gUHJvcGFnYXRpbmcgcmVkZWxpdmVycyB0aGUgb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoXG4gICAgICAgICAgLy8gcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpIHN0ZXBfY3JlYXRlZCBhbmQgcmUtZGlzcGF0Y2hlcyxcbiAgICAgICAgICAvLyB0aGUgc2FtZSByZWNvdmVyeSBhcyB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKGNyZWF0ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCwgc2FtZSBhcyB0aGUgc2VxdWVudGlhbFxuICAgICAgICAgICAgICAvLyBwYXRoLiBUaGUgc3RlcCBtZXNzYWdlIGlzIGFscmVhZHkgb3V0OyBhIGR1cGxpY2F0ZSBwdWJsaXNoXG4gICAgICAgICAgICAgIC8vIGJ5IHRoYXQgaGFuZGxlciBkZWR1cGVzIG9uIHRoZSBzaGFyZWQgaWRlbXBvdGVuY3kga2V5LlxuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSZXNpbGllbnQ6IHRoZSB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkgKDQyOSAvIDV4eCAvXG4gICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCkgYnV0IHRoZSBzdGVwIG1lc3NhZ2UgKGNhcnJ5aW5nIHRoZSBzYW1lXG4gICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlcyB0aGUgc3RlcF9jcmVhdGVkIGJlZm9yZSBleGVjdXRpbmcuXG4gICAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKys7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnU3RlcCBjcmVhdGlvbiBldmVudCB3cml0ZSBmYWlsZWQsIGJ1dCB0aGUgc3RlcCB3YXMgJyArXG4gICAgICAgICAgICAgICAgICAnZGlzcGF0Y2hlZCB2aWEgdGhlIHF1ZXVlLiBUaGUgc3RlcF9jcmVhdGVkIGV2ZW50IHdpbGwgJyArXG4gICAgICAgICAgICAgICAgICAnYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgICAgLy8gRm9sZCBpbnRvIHRoZSBiYXRjaCBpbnN0ZWFkIG9mIHdyaXRpbmcgaGVyZS4gVGhlIGVuY2xvc2luZ1xuICAgICAgICAgIC8vIHByb21pc2Ugam9pbnMgYGJhdGNoUHJlcHNgIChzZWUgdGhlIGxvb3AgYmVsb3cpLCBzbyB0aGUgZmx1c2hcbiAgICAgICAgICAvLyBvcCBjYW5ub3QgcnVuIGJlZm9yZSB0aGlzIHN0ZXAncyBpbnB1dCBmaW5pc2hlZCBkZWh5ZHJhdGluZy5cbiAgICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlcixcbiAgICAgICAgICAgIGtpbmQ6ICdzdGVwJyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIGV2ZW50OiBzdGVwRXZlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoc3RlcEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgICAgb3BzLnB1c2goc3RlcE9wKTtcbiAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBvcCB3YWl0cyBmb3IgZXZlcnkgcHJlcCBiZWZvcmUgY29tbWl0dGluZzsgYSBwcmVwIHRoYXRcbiAgICAgICAgLy8gcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlcyB0aHJvdWdoIGBvcHNgLCBzbyB0aGUgZmx1c2gncyBvd24gd2FpdFxuICAgICAgICAvLyBzd2FsbG93cyBpdCBhbmQgY29tbWl0cyB3aGF0ZXZlciB3YXMgc3VjY2Vzc2Z1bGx5IGVucXVldWVkLFxuICAgICAgICAvLyBwcmVzZXJ2aW5nIHRvZGF5J3MgcGVyLW9wIGluZGVwZW5kZW5jZS5cbiAgICAgICAgYmF0Y2hQcmVwcy5wdXNoKHN0ZXBPcC5jYXRjaCgoKSA9PiB7fSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB3YWl0IGV2ZW50cyAoc2FtZSBhcyBWMSlcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0RXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgcmVzdW1lQXQ6IHF1ZXVlSXRlbS5yZXN1bWVBdCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAvLyBXYWl0cyBuZWVkIG5vIGRlaHlkcmF0aW9uLCBzbyB0aGV5IGVucXVldWUgc3luY2hyb25vdXNseSwgYWZ0ZXJcbiAgICAgICAgLy8gZXZlcnkgc3RlcCdzIG9yZGVyIHNsb3QsIHByZXNlcnZpbmcgc3RlcHMtdGhlbi13YWl0cyBzY2hlZHVsaW5nXG4gICAgICAgIC8vIG9yZGVyIGluIHRoZSBsb2cuXG4gICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgb3JkZXI6IGJhdGNoT3JkZXJDb3VudGVyKyssXG4gICAgICAgICAga2luZDogJ3dhaXQnLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50OiB3YWl0RXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh3YWl0RXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmF0Y2hlZCBmb2xkJ3MgZmx1c2g6IHRoZSBjbGVhbiBmYW4tb3V0IGNvbW1pdHMgdGhyb3VnaFxuICAvLyBgY3JlYXRlQmF0Y2hgIGluIGNodW5rcyBvZiBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UUywgYWxsIGNodW5rcyBJTlxuICAvLyBGTElHSFQgQ09OQ1VSUkVOVExZLiBTbG90IGFzc2lnbm1lbnQgaXMgdGhlIHNlcnZlcidzLCBzbyBwYXJhbGxlbFxuICAvLyBjaHVua3MgcmFjZSBmb3Igc2xvdCByYW5nZXMgZXhhY3RseSBsaWtlIHRoZSBwcmUtZm9sZCBwYXRoJ3MgcGFyYWxsZWxcbiAgLy8gc2luZ2xlIHdyaXRlcyBkaWQ7IGVudGl0eSBjb25kaXRpb25zLCBub3QgY29tbWl0IG9yZGVyLCBjYXJyeVxuICAvLyBjb3JyZWN0bmVzcyAoc2libGluZyBmYW4tb3V0IGV2ZW50cyBoYXZlIG5vIGNyb3NzLW9yZGVyIHRoZSByZXBsYXlcbiAgLy8gZGVwZW5kcyBvbjsgaXQgbWF0Y2hlcyBieSBjb3JyZWxhdGlvbiBpZCkuIEVhY2ggZXZlbnQgcmVwb3J0cyB0aGVcbiAgLy8gb3V0Y29tZSBpdHMgb3duIHNpbmdsZSBjcmVhdGUgd291bGQgaGF2ZSBoYWQ6IGEgNDA5IGlzIHRoZSBzYW1lXG4gIC8vIGFscmVhZHktZXhpc3RzIHRvbGVyYW5jZSBhcyB0aGUgc2luZ2xlIHBhdGgsIGFueXRoaW5nIGVsc2UgZmFpbHMgdGhlXG4gIC8vIGRlbGl2ZXJ5IHRoZSB3YXkgYSBzaW5nbGUtcGF0aCByZWplY3Rpb24gd291bGQuXG4gIC8vXG4gIC8vIExhdGVuY3kgc2hhcGU6IG9ubHkgdGhlIGNodW5rIGNhcnJ5aW5nIHRoZSBwcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnNcbiAgLy8gZ2F0ZXMgdGhlIGhhbmRsZXIncyByZXR1cm4gKHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBvZmYgaXRzIGNsYWltcykuXG4gIC8vIEV2ZXJ5IG90aGVyIGNodW5rJ3MgY29tbWl0IChhbmQgZXZlcnkgY2h1bmsncyBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzLFxuICAvLyB3aGljaCBmaXJlIHRoZSBtb21lbnQgSVRTIGNyZWF0ZXMgYXJlIGR1cmFibGUpIHJpZGVzXG4gIC8vIGBkZWZlcnJlZEJhdGNoV29ya2Agd2hlbiB0aGUgY2FsbGVyIG9wdGVkIGluLCBqb2luZWQgYmVmb3JlIGFjay4gQSBzbG93XG4gIC8vIHNpYmxpbmcgY2h1bmsgdGhlcmVmb3JlIGRlbGF5cyBuZWl0aGVyIHRoZSBpbmxpbmUgYm9kaWVzIG5vciBhbm90aGVyXG4gIC8vIGNodW5rJ3MgcXVldWUgbWVzc2FnZXMsIHdoaWxlIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlIHN0aWxsIGhvbGRzIHBlclxuICAvLyBzdGVwOiBhIHN0ZXAncyBtZXNzYWdlIGlzIG9ubHkgZXZlciBzZW50IGFmdGVyIHRoZSBjaHVuayBjYXJyeWluZyBpdHNcbiAgLy8gY3JlYXRlIGhhcyBjb21taXR0ZWQuXG4gIGxldCBkZWZlcnJlZEJhdGNoV29yazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgaWYgKGJhdGNoRmFub3V0RWxpZ2libGUpIHtcbiAgICBvcHMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFByZXBzIHRoYXQgcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlIHRocm91Z2ggdGhlaXIgb3duIGBvcHNgXG4gICAgICAgIC8vIGVudHJpZXM7IHRoZSBmb2xkIGNvbW1pdHMgd2hhdGV2ZXIgd2FzIHN1Y2Nlc3NmdWxseSBlbnF1ZXVlZCxcbiAgICAgICAgLy8gcHJlc2VydmluZyB0b2RheSdzIHBlci1vcCBpbmRlcGVuZGVuY2UuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoUHJlcHMpO1xuICAgICAgICBpZiAoYmF0Y2hRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IFsuLi5iYXRjaFF1ZXVlXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICAgIC8vIEEgYmF0Y2ggb2YgT05FIGdhaW5zIG5vdGhpbmcgb3ZlciB0aGUgc2luZ2xlIHdyaXRlIChzYW1lIHJvdW5kXG4gICAgICAgIC8vIHRyaXApIGFuZCBsb3NlcyB0aGUgc2xvdC1zbmFwc2hvdCBwYXJhbXMgKyBidW1wLWFuZC1yZXBvcnQgdGhhdFxuICAgICAgICAvLyBjcmVhdGVHdWFyZGVkIHByb3ZpZGVzLCBzbyBhIGxvbmUgZWFnZXIgZXZlbnQgdGFrZXMgdGhlIG9yZGluYXJ5XG4gICAgICAgIC8vIHNpbmdsZSBwYXRoLCB3aXRoIHRoZSBzYW1lIGNvbmZsaWN0IHRvbGVyYW5jZSBhbmQgb3duZXJzaGlwXG4gICAgICAgIC8vIGJvb2trZWVwaW5nIGl0IHdvdWxkIGhhdmUgaGFkIHdpdGhvdXQgdGhlIGZvbGQuXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IFtlbnRyeV0gPSBlbnRyaWVzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKGVudHJ5LmV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnc3RlcCdcbiAgICAgICAgICAgICAgICAgID8gJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnXG4gICAgICAgICAgICAgICAgICA6ICdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWVkIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYyBiZWxvdy4gV2l0aCBjaHVua3NcbiAgICAgICAgLy8gY29tbWl0dGluZyBpbiBwYXJhbGxlbCB0aGVyZSBpcyBubyBwZXItY2h1bmsgXCJleHBlY3RlZCBuZXh0IHNsb3RcIjtcbiAgICAgICAgLy8gdGhlIHdob2xlIGZvbGQncyBjb21taXR0ZWQgc3BhbiBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzZWVkXG4gICAgICAgIC8vIG9uY2UgZXZlcnkgY2h1bmsgaGFzIHNldHRsZWQ6IGNvbW1pdHRlZCBzbG90cyBhcmUgZGVuc2UgcGVyIHRoZVxuICAgICAgICAvLyBXb3JsZCdzIGludmFyaWFudCwgc28gYW55IGV4Y2VzcyBvZiAobWF4IGNvbW1pdHRlZCBzbG90IOKIkiBzZWVkICtcbiAgICAgICAgLy8gMSkgb3ZlciB0aGUgZm9sZCdzIG93biBjb21taXR0ZWQgY291bnQgaXMgZXZlbnRzIE9USEVSIHdyaXRlcnNcbiAgICAgICAgLy8gbGFuZGVkIGluIGJldHdlZW4uXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkRmlyc3RTbG90ID0gZXZlbnRMb2dcbiAgICAgICAgICA/IChtYXhFdmVudFNsb3QoZXZlbnRMb2cuZXZlbnRzKSA/PyAwKSArIDFcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUGFpci1hd2FyZSBjaHVua2luZzogYSBwcmUtY2xhaW1lZCBwYWlyJ3MgdHdvIHJvd3MgbXVzdCBsYW5kIGluXG4gICAgICAgIC8vIHRoZSBzYW1lIGNyZWF0ZUJhdGNoIGNhbGwgKGFkamFjZW50LCBzbyBhIFdvcmxkIGNhbiBmb2xkIHRoZW1cbiAgICAgICAgLy8gaW50byBvbmUgYm9ybi1ydW5uaW5nIGNyZWF0ZSkgYW5kIG5ldmVyIHN0cmFkZGxlIGEgY2h1bmtcbiAgICAgICAgLy8gYm91bmRhcnksIHdoaWNoIHdvdWxkIHR1cm4gdGhlIHN0YXJ0ZWQgcm93IGludG8gYSBzdGFuZGFsb25lXG4gICAgICAgIC8vIGNsYWltIHJhY2luZyBpdHMgb3duIGNyZWF0ZSdzIGNvbW1pdC5cbiAgICAgICAgY29uc3QgY2h1bmtzOiAodHlwZW9mIGVudHJpZXMpW10gPSBbXTtcbiAgICAgICAge1xuICAgICAgICAgIGxldCBjdXJyZW50OiB0eXBlb2YgZW50cmllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBlbnRyaWVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBwYWlyTGVhZCA9XG4gICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgbmV4dD8ua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJyAmJlxuICAgICAgICAgICAgICBuZXh0LmNvcnJlbGF0aW9uSWQgPT09IGVudHJ5LmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gcGFpckxlYWQgPyAyIDogMTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VycmVudC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoICsgdGFrZSA+IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBpZiAocGFpckxlYWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPiAwKSBjaHVua3MucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwcyB3aG9zZSBxdWV1ZSBtZXNzYWdlcyBUSElTIEZMVVNIIHdpbGwgcHVibGlzaCAodGhlIGVhZ2VyXG4gICAgICAgIC8vIGNyZWF0ZXMpLCByZWNvcmRlZCBiZWZvcmUgYW55IGNodW5rIHNldHRsZXMgc28gdGhlIGNhbGxlcidzXG4gICAgICAgIC8vIGRpc3BhdGNoIHBhc3MgKHdoaWNoIHJ1bnMgb2ZmIHRoZSBoYW5kbGVyJ3MgcmV0dXJuKSBza2lwcyB0aGVtLlxuICAgICAgICAvLyBUaGUgc2VuZHMgYXJlIGd1YXJhbnRlZWQtb3ItZmFpbGVkIGJ5IHRoZSB0cmFpbGluZyB3b3JrIHRoZVxuICAgICAgICAvLyBjYWxsZXIgam9pbnMgYmVmb3JlIGFja2luZywgc28gXCJ3aWxsIGJlIHB1Ymxpc2hlZCBieSB0aGlzIGZsdXNoXCJcbiAgICAgICAgLy8gYW5kIFwiYWxyZWFkeSBwdWJsaXNoZWRcIiBhcmUgZXF1aXZhbGVudCBmcm9tIHRoZSBjYWxsZXIncyBzaWRlLlxuICAgICAgICBjb25zdCBwdWJsaXNoRWFnZXJTdGVwcyA9IHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHVibGlzaEVhZ2VyU3RlcHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChlbnRyeS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUYWxsaWVzIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYywgZm9sZGVkIGFjcm9zc1xuICAgICAgICAvLyB0aGUgY29uY3VycmVudCBjaHVua3MgYW5kIHJlYWQgb25jZSBhbGwgb2YgdGhlbSBzZXR0bGVkLlxuICAgICAgICBsZXQgY29tbWl0dGVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgbWF4Q29tbWl0dGVkU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGNvbW1pdENodW5rID0gYXN5bmMgKGNodW5rOiB0eXBlb2YgZW50cmllcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIC8vIEFuY2hvcnMgZm9yIHRoZSBwcmUtY2xhaW1lZCBzdGVwcycgdGVsZW1ldHJ5OiB0aGUgUE9TVCBpbnN0YW50XG4gICAgICAgICAgLy8gaXMgdGhlIGNsYWltJ3MgXCJzdGFydCBQT1NUIHNlbnRcIiAoUlNGUydzIGVuZCksIHRoZSByZXR1cm4gaXMgdGhlXG4gICAgICAgICAgLy8gY2xhaW0ncyBjb21wbGV0aW9uIChUVFIncyBUNiksIHRoZSBzYW1lIHR3byBpbnN0YW50cyB0aGUgbGF6eVxuICAgICAgICAgIC8vIGNsYWltJ3Mgb3duIFBPU1Qgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICAgICAgICBjb25zdCBiYXRjaFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBiYXRjaEZhbm91dEVsaWdpYmxlIGltcGxpZXMgcHJlc2VuY2VcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCEoXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGNodW5rLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXJ0ZWQgcm93IGlzIHRoZSBzdGVwJ3MgZXhlY3V0aW5nIGNsYWltLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgIC8vIHRoZSBjb21wdXRlLWluc3RhbmNlIGF0dHJpYnV0aW9uIHRoZSBzaW5nbGUgY2xhaW0gc2VuZHMgdmlhXG4gICAgICAgICAgICAgIC8vIENyZWF0ZUV2ZW50UGFyYW1zLlxuICAgICAgICAgICAgICAuLi4oZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICAgID8geyBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAvLyBQZXItd3JpdGUgcmVxdWVzdCBhdHRyaWJ1dGlvbiwgc2FtZSBhcyB0aGUgc2luZ2xlIHBhdGgnc1xuICAgICAgICAgICAgLy8gY3JlYXRlR3VhcmRlZCjigKYsIHsgcmVxdWVzdElkIH0pLlxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1Db21wbGV0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2YgcmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2h1bmtbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwYWlyIGNvbW1pdHRlZDogdGhpcyBpbnZvY2F0aW9uIG93bnMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBydW5zIHRoZSBib2R5IHdpdGggbm8gY2xhaW0gb2YgaXRzIG93bi4gVGhlXG4gICAgICAgICAgICAgICAgLy8gcmVhZGJhY2sgZW50aXR5IGlzIGF1dGhvcml0YXRpdmUgd2hlcmUgcHJlc2VudDsgYSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgb21pdHRlZCBpdCBnZXRzIHRoZSBzYW1lIGxvY2FsbHkgc3ludGhlc2l6ZWQgcnVubmluZ1xuICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQtMSB0aGUgb3B0aW1pc3RpYyBwYXRoIGV4ZWN1dGVzIGFnYWluc3QuIEVpdGhlclxuICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgaW5wdXQgaXMgcmUtYXR0YWNoZWQgbG9jYWxseTogYmF0Y2ggcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHJlZnMgbGF6aWx5LCBhbmQgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3QgYnl0ZXMgdGhlIHBhaXIncyBjcmVhdGVkIHJvdyBjYXJyaWVkLiAoVGhlIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAvLyByb3cncyBzdWNjZXNzIGlzIGRlbGliZXJhdGVseSBOT1QgbWVtYmVyc2hpcCBpblxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM6IGZvciBpbmxpbmUgc3RlcHMgb3duZXJzaGlwIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0ZWQgcm93J3MgdmVyZGljdCwgYW5kIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzXG4gICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5saW5lIGNvcnJlbGF0aW9uIGlkcyByZWdhcmRsZXNzLilcbiAgICAgICAgICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoXG4gICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogdGhlIHNhbWUgcHJlcCBvcCB0aGF0IGVucXVldWVkIHRoZSBwYWlyIHNldFxuICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnRyeSwgYW5kIHRoZSBmbHVzaCBhd2FpdGVkIGV2ZXJ5IHByZXAgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGZyZWUgaWYgaXQgZXZlciBmaXJlcywgdGhvdWdoOiB0aGUgcGFpciBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIGhlcmUsIHNvIHRoaXMgdGhyb3dzIHdpdGggdGhlIHN0ZXAgY2xhaW1lZCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBib2R5IG5ldmVyIHJ1bi4gVGhlIGRlbGl2ZXJ5IGZhaWxzLCBhbmQgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnMgaXQgdGhyb3VnaCBvd25lZC1yZWNvdmVyeSAodGhlIHN0ZXAgY2FycmllcyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duZXJzaGlwIHN0YW1wKSByYXRoZXIgdGhhbiB0aGUgcmVxdWVzdCBqdXN0XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGNsZWFubHkuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbm8gZGVoeWRyYXRlZCBpbnB1dCBmb3IgcHJlLWNsYWltZWQgc3RlcCAke2VudHJ5LmNvcnJlbGF0aW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRTdGVwOiBTdGFydGVkU3RlcCA9IGl0ZW0uc3RlcD8uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbS5zdGVwLCBzdGFydGVkQXQ6IGl0ZW0uc3RlcC5zdGFydGVkQXQgfVxuICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBkZWh5ZHJhdGVkLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICAgICAgICBvd25lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhcnRlZFN0ZXAsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiYXRjaFBvc3RTZW50QXRNcyxcbiAgICAgICAgICAgICAgICAgIGNsYWltQ29tcGxldGVkQXRNcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnaW5saW5lLWNyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFpciBsb3N0IGl0cyBhdG9taWMgY3JlYXRlLWNsYWltOiBhIGNvbmN1cnJlbnQgd3JpdGVyXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvd25zIHRoaXMgc3RlcCAoYW4gZWFybGllciBkZWxpdmVyeSdzIGNyZWF0ZSwgb3IgYVxuICAgICAgICAgICAgICAgIC8vIHJhY2luZyBoYW5kbGVyJ3MgY2xhaW0pLiBSZWNvcmRlZCBhcyBhIGxvc3QgY2xhaW06IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlcidzIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGVcbiAgICAgICAgICAgICAgICAvLyBib2R5LCB0aGUgc2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eSBjbGFpbS4gQSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgZm9sZHMgdGhlIHBhaXIgcmVwb3J0cyB0aGUgNDA5IG9uIGJvdGggcm93cyAoc2V0XG4gICAgICAgICAgICAgICAgLy8gdHdpY2UsIGhhcm1sZXNzKTsgb25lIHRoYXQgZXZhbHVhdGVzIHJvd3MgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgc3RhcnRlZCByb3cgKHByb2Nlc3NlZCBzZWNvbmQpIGRlY2lkZSwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBzaW5nbGUgcGF0aCdzIHNlbWFudGljcyAoY3JlYXRlIGxvc3QgKyBjbGFpbVxuICAgICAgICAgICAgICAgIC8vIHdvbiBzdGlsbCBydW5zIHRoZSBib2R5OyBjcmVhdGUgd29uICsgY2xhaW0gbG9zdCBza2lwcykuXG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7IG93bmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0lubGluZSBzdGVwIHByZS1jbGFpbSBsb3N0LCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaXRlbS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNhbWUgdG9sZXJhbmNlIGFzIHRoZSBzaW5nbGUgcGF0aCdzIEVudGl0eUNvbmZsaWN0RXJyb3I6IGFcbiAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBvciBlYXJsaWVyIGRlbGl2ZXJ5IGFscmVhZHkgY3JlYXRlZCBpdC5cbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdzdGVwJ1xuICAgICAgICAgICAgICAgICAgPyAnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZydcbiAgICAgICAgICAgICAgICAgIDogJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYGJhdGNoZWQgJHtlbnRyeS5ldmVudC5ldmVudFR5cGV9IGZvciAke2VudHJ5LmNvcnJlbGF0aW9uSWR9IGAgK1xuICAgICAgICAgICAgICAgIGBmYWlsZWQ6ICR7aXRlbS5lcnJvcn06ICR7aXRlbS5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIHsgc3RhdHVzOiBpdGVtLnN0YXR1cyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIaWdoZXN0IHNsb3QgdGhpcyBjaHVuayBjb21taXR0ZWQ6IHRoZSBjZWlsaW5nIHRoZSBjYWxsZXIgZm9sZHNcbiAgICAgICAgICAvLyBpbnRvIHRoZSBpbmxpbmUgZXhlY3V0aW9ucycgc2xvdCBzbmFwc2hvdCAoc2VlXG4gICAgICAgICAgLy8gU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZykgYW5kIG9uZSBpbnB1dFxuICAgICAgICAgIC8vIG9mIHRoZSBpbnRlcmxlYXZpbmcgZGlhZ25vc3RpYy5cbiAgICAgICAgICBjb25zdCBjaHVua01heFNsb3QgPSBtYXhFdmVudFNsb3QoXG4gICAgICAgICAgICByZXN1bHRzLmZsYXRNYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmV2ZW50ID8gW2l0ZW0uZXZlbnRdIDogW11cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNodW5rTWF4U2xvdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAoYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIGNodW5rTWF4U2xvdCA+IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nID0gY2h1bmtNYXhTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21taXR0ZWRDb3VudCArPSByZXN1bHRzLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaHVua01heFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKG1heENvbW1pdHRlZFNsb3QgPT09IHVuZGVmaW5lZCB8fCBjaHVua01heFNsb3QgPiBtYXhDb21taXR0ZWRTbG90KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCA9IGNodW5rTWF4U2xvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgY2h1bmsncyBlYWdlciBzdGVwcycgcXVldWUgbWVzc2FnZXMgdGhlIG1vbWVudCBJVFNcbiAgICAgICAgLy8gY3JlYXRlcyBhcmUgZHVyYWJsZSwgdGhlIHBlci1jaHVuayBoYWxmIG9mIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlLlxuICAgICAgICAvLyBTYW1lIG1lc3NhZ2Ugc2hhcGUgYW5kIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleSBhcyB0aGVcbiAgICAgICAgLy8gY2FsbGVyJ3MgZGlzcGF0Y2ggcGFzcywgc28gYW55dGhpbmcgZG91YmxlLXB1Ymxpc2hlZCBkZWR1cGVzLlxuICAgICAgICBjb25zdCBwdWJsaXNoQ2h1bmtTdGVwcyA9IGFzeW5jIChcbiAgICAgICAgICBjaHVuazogdHlwZW9mIGVudHJpZXNcbiAgICAgICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgaWYgKCFwdWJsaXNoRWFnZXJTdGVwcykgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHN0ZXBFbnRyaWVzID0gY2h1bmsuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkua2luZCA9PT0gJ3N0ZXAnKTtcbiAgICAgICAgICBpZiAoc3RlcEVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBzdGVwRW50cmllcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBwdWJsaXNoRWFnZXJTdGVwcyBpbXBsaWVzIHByZXNlbmNlXG4gICAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGVudHJ5LnN0ZXBOYW1lISxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGVwTmFtZSFcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBMYXVuY2ggZXZlcnkgY2h1bmsncyBQT1NUIG5vdzsgY2hhaW4gZWFjaCBjaHVuaydzIHB1Ymxpc2hlcyBvbiBpdHNcbiAgICAgICAgLy8gT1dOIGNvbW1pdC4gQSBjaHVuayB3aG9zZSBjb21taXQgcmVqZWN0ZWQga2VlcHMgaXRzIG1lc3NhZ2VzXG4gICAgICAgIC8vIHVuc2VudCAodGhlIHJlamVjdGlvbiBmYWlscyB0aGUgZGVsaXZlcnk7IHJlZGVsaXZlcnkgcmUtY3JlYXRlc1xuICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcywgZGVkdXBlZCBieSB0aGUgaWRlbXBvdGVuY3kga2V5cykuXG4gICAgICAgIGNvbnN0IGNvbW1pdHMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gY29tbWl0Q2h1bmsoY2h1bmspKTtcbiAgICAgICAgY29uc3QgcHVibGlzaGVzID0gY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGluZGV4KSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29tbWl0c1tpbmRleF07XG4gICAgICAgICAgYXdhaXQgcHVibGlzaENodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0cmFpbGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gTGV0IGV2ZXJ5IHNpYmxpbmcgc2V0dGxlIGJlZm9yZSBzdXJmYWNpbmcgdGhlIGZpcnN0IGZhaWx1cmU6IGFcbiAgICAgICAgICAvLyBjaHVuayB0aGF0IGNvbW1pdHRlZCBtdXN0IHN0aWxsIGdldCBpdHMgcHVibGlzaGVzIG91dCBldmVuIHdoZW5cbiAgICAgICAgICAvLyBhbm90aGVyIGNodW5rIGZhaWxlZCwgYW5kIHRoZSBjYWxsZXIgYWNrcyBvbmx5IGFmdGVyIHRoaXNcbiAgICAgICAgICAvLyByZXNvbHZlcy5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5jb21taXRzLCAuLi5wdWJsaXNoZXNdKTtcbiAgICAgICAgICAvLyBGb3JlaWduLWludGVybGVhdmluZyB2aXNpYmlsaXR5OiB0aGUgYmF0Y2ggZW5kcG9pbnQgaGFzIG5vXG4gICAgICAgICAgLy8gYnVtcC1hbmQtcmVwb3J0LCBzbyBldmVudHMgb3RoZXIgd3JpdGVycyBsYW5kZWQgYmV0d2VlbiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBhbmQgdGhlc2UgY29tbWl0cyBwdXNoZWQgdGhlIGZvbGQgdG8gaGlnaGVyIHNsb3RzXG4gICAgICAgICAgLy8gV0lUSE9VVCBoYW5kaW5nIHVzIHRoZSBza2lwcGVkIGV2ZW50cy4gU2FtZSBhY2NlcHRlZCBleHBvc3VyZVxuICAgICAgICAgIC8vIGFzIGEgZHJvcHBlZCB0cnVuY2F0ZWQgcmVwb3J0IG9uIHRoZSBzaW5nbGUgcGF0aDogdGhlIGxvY2FsXG4gICAgICAgICAgLy8gbG9nIHN0YXlzIGEgc3RyaWN0IHByZWZpeCBhbmQgdGhlIG5leHQgcmVsb2FkIG9ic2VydmVzIHRoZW0uXG4gICAgICAgICAgLy8gTG9nZ2VkIHNvIGEgYnVtcCBpcyBkaWFnbm9zYWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhwZWN0ZWRGaXJzdFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmxlYXZlZCA9XG4gICAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgLSBleHBlY3RlZEZpcnN0U2xvdCArIDEgLSBjb21taXR0ZWRDb3VudDtcbiAgICAgICAgICAgIGlmIChpbnRlcmxlYXZlZCA+IDApIHtcbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnQmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCBhYm92ZSBzbmFwc2hvdCcsIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEZpcnN0U2xvdCxcbiAgICAgICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90LFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZENvdW50LFxuICAgICAgICAgICAgICAgIGludGVybGVhdmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmFpbHVyZSA9IHNldHRsZWQuZmluZChcbiAgICAgICAgICAgIChvdXRjb21lKTogb3V0Y29tZSBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT5cbiAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdyZWplY3RlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLnJlYXNvbjtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyBFVkVSWSBjaHVuayBjYXJyeWluZyBwYWlycyBnYXRlcyB0aGUgcmV0dXJuLCBub3QganVzdCB0aGUgZmlyc3Q6XG4gICAgICAgIC8vIGEgcGFpciB3aG9zZSBjb21taXQgdGhlIGNhbGxlciBoYXMgbm90IHNlZW4geWllbGRzIG5vXG4gICAgICAgIC8vIGBpbmxpbmVDbGFpbXNgIGVudHJ5LCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBsYXp5XG4gICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgd291bGQgcmFjZSB0aGlzIHNhbWUgZm9sZCdzIHN0aWxsLWluLWZsaWdodFxuICAgICAgICAvLyBwYWlyIGZvciB0aGUgc2FtZSBzdGVwLiBUb2RheSBwYWlycyBhbHdheXMgbGFuZCBpbiBvbmUgY2h1bmtcbiAgICAgICAgLy8gKHRoZXkgc29ydCBmaXJzdCwgYW5kIHR3byByb3dzIHBlciBpbmxpbmUgc3RlcCBmaXQgaW5zaWRlIG9uZVxuICAgICAgICAvLyBjaHVuaywgcGlubmVkIGJ5IGNvbnN0YW50cy50ZXN0LnRzKSwgc28gdGhpcyBpcyBhdCBtb3N0IG9uZVxuICAgICAgICAvLyBjb21taXQ7IHRoZSBmaWx0ZXIgaXMgd2hhdCBrZWVwcyB0aGUgcHJvcGVydHkgdHJ1ZSBpZiBlaXRoZXIgY2FwXG4gICAgICAgIC8vIG1vdmVzLlxuICAgICAgICBjb25zdCBwYWlyQ29tbWl0cyA9IGNodW5rcy5mbGF0TWFwKChjaHVuaywgaW5kZXgpID0+XG4gICAgICAgICAgY2h1bmsuc29tZSgoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCcpXG4gICAgICAgICAgICA/IFtjb21taXRzW2luZGV4XV1cbiAgICAgICAgICAgIDogW11cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFsbG93RGVmZXJyZWRCYXRjaFdvcmspIHtcbiAgICAgICAgICAvLyBUaGUgdHJhaWxpbmcgd29yayBpcyB0aGUgY2FsbGVyJ3MgdG8gam9pbiBiZWZvcmUgYWNrLiBBdHRhY2ggYVxuICAgICAgICAgIC8vIGhhbmRsZXIgbm93IHNvIGEgcmVqZWN0aW9uIHRoYXQgcmFjZXMgdGhhdCBqb2luIChvciBhIGZvcmVncm91bmRcbiAgICAgICAgICAvLyBmYWlsdXJlIHRoYXQgcHJldmVudHMgdGhlIGNhbGxlciBmcm9tIGV2ZXIgcmVhY2hpbmcgaXQpIGlzIG5ldmVyXG4gICAgICAgICAgLy8gYW4gdW5oYW5kbGVkUmVqZWN0aW9uOyBhd2FpdGluZyB0aGUgcHJvbWlzZSBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICB0cmFpbGluZy5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgZGVmZXJyZWRCYXRjaFdvcmsgPSB0cmFpbGluZztcbiAgICAgICAgICAvLyBPbmx5IHRoZSBwYWlyIGNodW5rcyBnYXRlIHRoZSByZXR1cm46IHRoZWlyIGNsYWltcyBhcmUgd2hhdCB0aGVcbiAgICAgICAgICAvLyBjYWxsZXIgc3RhcnRzIHRoZSBpbmxpbmUgYm9kaWVzIGZyb20uIFdpdGggbm8gcGFpcnMgdGhlcmUgaXNcbiAgICAgICAgICAvLyBub3RoaW5nIHRoZSBjYWxsZXIncyBwb3N0LXJldHVybiB3b3JrIHJlYWRzIGZyb20gdGhlIGNvbW1pdHMsXG4gICAgICAgICAgLy8gc28gbm90aGluZyBnYXRlcy5cbiAgICAgICAgICBpZiAocGFpckNvbW1pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGFpckNvbW1pdHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIEEgcGFpciBjaHVuayBmYWlsZWQsIHNvIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgaXMgTk9UIHRoZVxuICAgICAgICAgICAgICAvLyBjYWxsZXIncyB0byBqb2luIGFueSBtb3JlOiBgZGVmZXJyZWRCYXRjaFdvcmtgIG5ldmVyXG4gICAgICAgICAgICAgIC8vIHJlYWNoZXMgaXQgb25jZSBoYW5kbGVTdXNwZW5zaW9uIHRocm93cy4gU2V0dGxlIHRoZSByZXN0XG4gICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcmVqZWN0aW9uIGVzY2FwZXMsIGZvciB0aGUgcmVhc29uIGBzZXR0bGVQaGFzZWBcbiAgICAgICAgICAgICAgLy8gZ2l2ZXM6IGEgc2libGluZyBjcmVhdGUgbGFuZGluZyBhZnRlciB0aGUgdGhyb3cgY29tbWl0cyBhblxuICAgICAgICAgICAgICAvLyBldmVudCBmcm9tIHRoZSBhYmFuZG9uZWQgcmVwbGF5J3Mgc2VlZGVkIHNlcXVlbmNlIGFuZCByYWNlc1xuICAgICAgICAgICAgICAvLyB0aGUgY2FsbGVyJ3MgcmVzdGFydCByZWxvYWQgd2hpbGUgZG9pbmcgc28uXG4gICAgICAgICAgICAgIGF3YWl0IHRyYWlsaW5nLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0cmFpbGluZztcbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBhdHRyaWJ1dGVJdGVtcykge1xuICAgIG9wcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIC8vIEd1YXJkZWQgbGlrZSBldmVyeSBvdGhlciBzdXNwZW5zaW9uIHdyaXRlOiBhbiBhdHRyX3NldCBpcyBhXG4gICAgICAgICAgLy8gcmVwbGF5LWRlcml2ZWQgZXZlbnQgd2l0aCBhIGNvcnJlbGF0aW9uIGlkIGZyb20gdGhpcyByZXBsYXknc1xuICAgICAgICAgIC8vIHNlZWRlZCBzZXF1ZW5jZSwgc28gaXQgbXVzdCBub3QgbGFuZCBvbiBhIGxvZyB0aGUgcmVwbGF5IG5ldmVyXG4gICAgICAgICAgLy8gc2F3LiBSZWplY3RpbmcgaXQgaXMgY2hlYXA6IGEgcnVuIHdpdGggYXR0cmlidXRlIGV2ZW50cyBhbHJlYWR5XG4gICAgICAgICAgLy8gZm9yY2VzIGFuIGluLXByb2Nlc3MgcmVwbGF5LCBzbyB0aGUgcmVzdGFydCBjb3N0cyB0aGUgcmVwbGF5IGl0XG4gICAgICAgICAgLy8gd2FzIGdvaW5nIHRvIGRvIGFueXdheS5cbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdhdHRyX3NldCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IHF1ZXVlSXRlbS5jaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHdyaXRlcjogeyB0eXBlOiAnd29ya2Zsb3cnIH0sXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgPyB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1dvcmxkVmFsaWRhdGlvbkZhaWx1cmUoZXJyKSkge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5pc3RpYyB2YWxpZGF0aW9uIHJlamVjdGlvbiBmcm9tIHRoZSBXb3JsZCwgZS5nLiB0aGVcbiAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgcGVyLXJ1biBhdHRyaWJ1dGUgY2FwLCB3aGljaCBvbmx5IHRoZSBXb3JsZCBjYW5cbiAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgdGhlIHJ1bidzIGV4aXN0aW5nIGF0dHJpYnV0ZXMuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJlcGxheXMgdGhlIHdvcmtmbG93IGludG8gdGhlIGV4YWN0IHNhbWVcbiAgICAgICAgICAgIC8vIHdyaXRlIGFuZCB0aGUgZXhhY3Qgc2FtZSByZWplY3Rpb24sIHNvIHJldHJ5aW5nIGNhbiBuZXZlclxuICAgICAgICAgICAgLy8gc3VjY2VlZC4gU3VyZmFjZSBpdCBhcyBhIEZhdGFsRXJyb3Igc28gdGhlIGNhbGxlciBmYWlscyB0aGVcbiAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiB3ZWRnaW5nIGl0IGluIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgc2V0QXR0cmlidXRlcyBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgIHRocm93IGZhdGFsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEF3YWl0IHRoZSBzdGVwX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgZXZlbnQgY3JlYXRlcyBiZWZvcmUgcmV0dXJuaW5nLlxuICAvLyBUaGUgY2FsbGVyICh3b3JrZmxvd0VudHJ5cG9pbnQpIG9ubHkgZW5xdWV1ZXMgdGhlIHN0ZXAtZGlzcGF0Y2ggcXVldWVcbiAgLy8gbWVzc2FnZXMgQUZURVIgaGFuZGxlU3VzcGVuc2lvbiByZXNvbHZlcywgYW5kIHRoZSBxdWV1ZSBoYW5kbGVyIGFja3NcbiAgLy8gdGhlIG9yY2hlc3RyYXRvciBtZXNzYWdlIG9ubHkgYWZ0ZXIgdGhlIGNhbGxlciByZXNvbHZlcy4gU28gdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyBldmVudHMgbXVzdCBiZSBkdXJhYmxlIGhlcmUsIGFuZCB0aGUgZGlzcGF0Y2ggc2VuZHMgbXVzdCBjb21wbGV0ZSBpbiB0aGUgY2FsbGVyLFxuICAvLyBhbGwgYmVmb3JlIGFjay4gSWYgdGhlIHByb2Nlc3MgY3Jhc2hlcyBiZWZvcmUgdGhpcyByZXNvbHZlcywgdGhlIG9yY2hlc3RyYXRvclxuICAvLyBtZXNzYWdlIGlzIG5vdCBhY2tlZCBhbmQgVlFTIHJlZGVsaXZlcnMsIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAvLyBzdGVwX2NyZWF0ZWQgYW5kIHJlLWRpc3BhdGNoZXMsIGFuZCByZWNvdmVycyB0aGUgcnVuIGluc3RlYWQgb2Ygb3JwaGFuaW5nIGl0LlxuICBhd2FpdCBzZXR0bGVQaGFzZShvcHMpO1xuXG4gIC8vIFJlYnVpbGQgdGhlIGlubGluZSBiYXRjaCBpbiBkZXRlcm1pbmlzdGljIG9yZGVyLiBgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzYFxuICAvLyBpcyBhIFNldCBzZWVkZWQgZnJvbSB0aGUgb3JkZXJlZCBmaXJzdC1OIHNsaWNlLCBzbyBpdGVyYXRpbmcgaXQgcHJlc2VydmVzXG4gIC8vIHN0ZXBJdGVtcyBvcmRlcjsgZXZlcnkgaWQgaW4gaXQgd2FzIHNldCBieSB0aGUgbGF6eSBicmFuY2ggYWJvdmUuXG4gIGNvbnN0IGxhenlJbmxpbmVTdGVwczogU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2xhenlJbmxpbmVTdGVwcyddID0gW107XG4gIGZvciAoY29uc3QgY29ycmVsYXRpb25JZCBvZiBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMpIHtcbiAgICBjb25zdCBsYXp5U3RlcCA9IGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgIGlmIChsYXp5U3RlcCkgbGF6eUlubGluZVN0ZXBzLnB1c2gobGF6eVN0ZXApO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgKG1pbmltdW0gdGltZW91dClcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHdhaXRJdGVtcykge1xuICAgIGNvbnN0IHJlc3VtZUF0TXMgPSBxdWV1ZUl0ZW0ucmVzdW1lQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KTtcbiAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGguY2VpbChkZWxheU1zIC8gMTAwMCk7XG4gICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgIHNvb25lc3RXYWl0ID0ge1xuICAgICAgICBzZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnd29ya2Zsb3dfc3VzcGVuZGVkJyksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RlcHNDcmVhdGVkKHN0ZXBJdGVtcy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0hvb2tzQ3JlYXRlZChob29rc05lZWRpbmdDcmVhdGlvbi5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1dhaXRzQ3JlYXRlZCh3YWl0SXRlbXMubGVuZ3RoKSxcbiAgICAuLi4oZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLnNpemUgPiAwXG4gICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1N0ZXBzRmFpbGVkU2VyaWFsaXphdGlvbihcbiAgICAgICAgICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZVxuICAgICAgICApXG4gICAgICA6IHt9KSxcbiAgICAuLi4ocmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQgPiAwXG4gICAgICA/IEF0dHJpYnV0ZS5TdGVwUmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQocmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQpXG4gICAgICA6IHt9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwZW5kaW5nU3RlcHM6IHN0ZXBJdGVtcyxcbiAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLFxuICAgIGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcyxcbiAgICBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHMsXG4gICAgbGF6eUlubGluZVN0ZXBzLFxuICAgIGlubGluZUNsYWltcyxcbiAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nLFxuICAgIGRlZmVycmVkQmF0Y2hXb3JrLFxuICAgIC8vIE9uIGhvb2sgY29uZmxpY3QgdGhlIGNhbGxlciByZS1pbnZva2VzIGltbWVkaWF0ZWx5IGFuZCBuZXZlciByZWFkc1xuICAgIC8vIHRoZSB3YWl0IHRpbWVvdXQsIHNvIGRvbid0IHJlcG9ydCBvbmUuXG4gICAgd2FpdFRpbWVvdXQ6IGhhc0hvb2tDb25mbGljdCA/IHVuZGVmaW5lZCA6IHNvb25lc3RXYWl0LFxuICAgIGhhc0hvb2tDb25mbGljdCxcbiAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgIGhhc0F0dHJpYnV0ZUV2ZW50czogYXR0cmlidXRlSXRlbXMubGVuZ3RoID4gMCxcbiAgICBoYXNIb29rRXZlbnRzOiBob29rc05lZWRpbmdDcmVhdGlvbi5sZW5ndGggPiAwLFxuICAgIGhvb2tDcmVhdGlvbk1zLFxuICAgIHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQsXG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJzLFxuICAgIHJlcG9ydGVkRXZlbnRDb3VudDogcmVwb3J0ZWRFdmVudHMsXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBgZXZlbnRzLmNyZWF0ZWAgcmVqZWN0aW9uIGlzIGRldGVybWluaXN0aWMgV29ybGQgdmFsaWRhdGlvblxuICogcmF0aGVyIHRoYW4gYSB0cmFuc2llbnQvc3RvcmFnZSBlcnJvci4gTG9jYWwgV29ybGRzXG4gKiAod29ybGQtbG9jYWwsIHdvcmxkLXBvc3RncmVzKSB0aHJvdyBgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yYCBkaXJlY3RseTtcbiAqIHJlbW90ZSBXb3JsZHMgc3VyZmFjZSB0aGUgZXF1aXZhbGVudCBzZXJ2ZXItc2lkZSByZWplY3Rpb24gYXMgYVxuICogYFdvcmtmbG93V29ybGRFcnJvcmAgd2l0aCBIVFRQIHN0YXR1cyA0MDAuIFRoZSBuYW1lIGNoZWNrIGNvdmVyc1xuICogYEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcmAgaW5zdGFuY2VzIGZyb20gYSBkaWZmZXJlbnQgY29weSBvZlxuICogYEB3b3JrZmxvdy93b3JsZGAgdGhhbiB0aGUgb25lIHRoaXMgcGFja2FnZSByZXNvbHZlZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3JsZFZhbGlkYXRpb25GYWlsdXJlKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5uYW1lID09PSAnQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSAmJiBlcnIuc3RhdHVzID09PSA0MDA7XG59XG4iXX0=
|