@workflow/core 5.0.0-beta.44 → 5.0.0-beta.47
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 +6 -5
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +14 -12
- package/dist/events-consumer.d.ts +30 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +67 -11
- 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 +20 -14
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +67 -29
- package/dist/replay-payload-cache.d.ts +13 -17
- package/dist/replay-payload-cache.d.ts.map +1 -1
- package/dist/replay-payload-cache.js +55 -57
- package/dist/runtime/constants.d.ts +3 -3
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +4 -4
- package/dist/runtime/helpers.d.ts +15 -34
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +18 -43
- 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 +20 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +195 -249
- package/dist/runtime/resume-latency.d.ts +13 -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 +12 -10
- 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/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.d.ts.map +1 -1
- package/dist/runtime/vm-mode.js +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +278 -125
- 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 +8 -9
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +32 -25
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +3 -11
- package/dist/telemetry/semantic-conventions.d.ts +51 -8
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +38 -5
- package/dist/telemetry.d.ts +12 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +62 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/script-cache.d.ts +9 -11
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +25 -40
- 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.d.ts +16 -0
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +73 -29
- package/docs/foundations/errors-and-retries.mdx +1 -1
- package/package.json +6 -6
package/dist/serialization.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RuntimeDecryptionError, SerializationError, StreamExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
2
2
|
import { once } from '@workflow/utils';
|
|
3
|
-
import { envNumber } from '@workflow/world';
|
|
3
|
+
import { envNumber } from '@workflow/world/env-config';
|
|
4
4
|
import { parse, stringify, unflatten } from 'devalue';
|
|
5
5
|
import { monotonicFactory } from 'ulid';
|
|
6
6
|
import { importKey } from './encryption.js';
|
|
@@ -134,7 +134,8 @@ async function recordCompression(stats, operation) {
|
|
|
134
134
|
* `recordCompression` above.
|
|
135
135
|
*/
|
|
136
136
|
async function recordGuestCodeExecutions(stats) {
|
|
137
|
-
|
|
137
|
+
const totalExecutions = stats.totalExecutions ?? stats.executions.length;
|
|
138
|
+
if (totalExecutions === 0)
|
|
138
139
|
return;
|
|
139
140
|
try {
|
|
140
141
|
const span = await getActiveSpan();
|
|
@@ -144,7 +145,7 @@ async function recordGuestCodeExecutions(stats) {
|
|
|
144
145
|
...new Set(stats.executions.map((e) => e.detail ? `${e.kind} (${e.detail})` : e.kind)),
|
|
145
146
|
];
|
|
146
147
|
span.setAttributes({
|
|
147
|
-
...Attr.SerializationGuestCodeExecutions(
|
|
148
|
+
...Attr.SerializationGuestCodeExecutions(totalExecutions),
|
|
148
149
|
...Attr.SerializationGuestCodeDetails(details),
|
|
149
150
|
});
|
|
150
151
|
}
|
|
@@ -1470,7 +1471,13 @@ export function getExternalReducers(global = globalThis, ops, runId, cryptoKey,
|
|
|
1470
1471
|
// first chunk can race `run_started`. Thread the run-ready barrier into that
|
|
1471
1472
|
// sink so the write orders after the run exists. Undefined outside turbo /
|
|
1472
1473
|
// on the await path.
|
|
1473
|
-
runReadyBarrier
|
|
1474
|
+
runReadyBarrier,
|
|
1475
|
+
// Operations that read data back from the workflow into caller-owned
|
|
1476
|
+
// writables. These must stay separate from producer uploads: a readback can
|
|
1477
|
+
// only finish after the workflow runs, so awaiting it before dispatch would
|
|
1478
|
+
// deadlock. Defaults to `ops` for existing callers that flush everything in
|
|
1479
|
+
// the background.
|
|
1480
|
+
readbackOps = ops) {
|
|
1474
1481
|
return {
|
|
1475
1482
|
...getAllBaseReducers(global),
|
|
1476
1483
|
ReadableStream: (value) => {
|
|
@@ -1496,7 +1503,7 @@ runReadyBarrier) {
|
|
|
1496
1503
|
}
|
|
1497
1504
|
else {
|
|
1498
1505
|
ops.push(value
|
|
1499
|
-
.pipeThrough(getSerializeStream(getExternalReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier), cryptoKey))
|
|
1506
|
+
.pipeThrough(getSerializeStream(getExternalReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier, readbackOps), cryptoKey))
|
|
1500
1507
|
.pipeTo(writable));
|
|
1501
1508
|
}
|
|
1502
1509
|
const s = { name };
|
|
@@ -1539,7 +1546,7 @@ runReadyBarrier) {
|
|
|
1539
1546
|
const streamId = (global[STABLE_ULID] || defaultUlid)();
|
|
1540
1547
|
const name = `strm_${streamId}`;
|
|
1541
1548
|
const readable = new WorkflowServerReadableStream(runId, name);
|
|
1542
|
-
|
|
1549
|
+
readbackOps.push(readable.pipeTo(value));
|
|
1543
1550
|
return { name };
|
|
1544
1551
|
},
|
|
1545
1552
|
AbortController: (value) => {
|
|
@@ -1710,7 +1717,7 @@ function getStepReducers(global = globalThis, ops, runId, cryptoKey, framedByteS
|
|
|
1710
1717
|
// after the body but within the same op flush, so its first chunk can race
|
|
1711
1718
|
// `run_started`. Thread the run-ready barrier into the sink so that write
|
|
1712
1719
|
// orders after the run exists. Undefined outside turbo / on the await path.
|
|
1713
|
-
runReadyBarrier) {
|
|
1720
|
+
runReadyBarrier, readbackOps = ops) {
|
|
1714
1721
|
return {
|
|
1715
1722
|
...getAllBaseReducers(global),
|
|
1716
1723
|
ReadableStream: (value) => {
|
|
@@ -1749,7 +1756,7 @@ runReadyBarrier) {
|
|
|
1749
1756
|
}
|
|
1750
1757
|
else {
|
|
1751
1758
|
ops.push(value
|
|
1752
|
-
.pipeThrough(getSerializeStream(getStepReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier), cryptoKey))
|
|
1759
|
+
.pipeThrough(getSerializeStream(getStepReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier, readbackOps), cryptoKey))
|
|
1753
1760
|
.pipeTo(writable));
|
|
1754
1761
|
}
|
|
1755
1762
|
}
|
|
@@ -1768,8 +1775,8 @@ runReadyBarrier) {
|
|
|
1768
1775
|
if (!name) {
|
|
1769
1776
|
const streamId = (global[STABLE_ULID] || defaultUlid)();
|
|
1770
1777
|
name = `strm_${streamId}`;
|
|
1771
|
-
|
|
1772
|
-
.pipeThrough(getDeserializeStream(getStepRevivers(global,
|
|
1778
|
+
readbackOps.push(new WorkflowServerReadableStream(runId, name)
|
|
1779
|
+
.pipeThrough(getDeserializeStream(getStepRevivers(global, readbackOps, runId, cryptoKey), cryptoKey))
|
|
1773
1780
|
.pipeTo(value));
|
|
1774
1781
|
}
|
|
1775
1782
|
const s = { name };
|
|
@@ -2015,13 +2022,14 @@ function reviveAbortController(value, ops, runId) {
|
|
|
2015
2022
|
// completion) rather than `ops` (best-effort, background). The stream
|
|
2016
2023
|
// write above stays in `ops`: it must fire ASAP to reach an in-flight
|
|
2017
2024
|
// sibling step and is not the durable record.
|
|
2025
|
+
//
|
|
2018
2026
|
// Swallow errors here so the promise can only ever enforce ordering
|
|
2019
2027
|
// when awaited (see the no-reject contract on
|
|
2020
2028
|
// StepContext.preCompletionOps); a failed resume retries on next replay.
|
|
2021
2029
|
const hookResume = (async () => {
|
|
2022
2030
|
try {
|
|
2023
|
-
const { resumeHook
|
|
2024
|
-
await
|
|
2031
|
+
const { resumeHook } = await import('./runtime/resume-hook.js');
|
|
2032
|
+
await resumeHook(value.hookToken, {
|
|
2025
2033
|
aborted: true,
|
|
2026
2034
|
reason,
|
|
2027
2035
|
});
|
|
@@ -2715,16 +2723,16 @@ export function deserializePreparedStepError(prepared, global = globalThis, extr
|
|
|
2715
2723
|
* backwards compatibility with older runs.
|
|
2716
2724
|
* @returns The dehydrated value as binary data (Uint8Array) with format prefix
|
|
2717
2725
|
*/
|
|
2718
|
-
export async function dehydrateWorkflowArguments(value, runId, key, ops = [], global = globalThis, v1Compat = false, framedByteStreams = false, compression = false) {
|
|
2726
|
+
export async function dehydrateWorkflowArguments(value, runId, key, ops = [], global = globalThis, v1Compat = false, framedByteStreams = false, compression = false, readbackOps = ops) {
|
|
2719
2727
|
if (v1Compat) {
|
|
2720
|
-
const str = stringify(value, getExternalReducers(global, ops, runId, key, framedByteStreams));
|
|
2728
|
+
const str = stringify(value, getExternalReducers(global, ops, runId, key, framedByteStreams, undefined, readbackOps));
|
|
2721
2729
|
return revive(str);
|
|
2722
2730
|
}
|
|
2723
2731
|
try {
|
|
2724
2732
|
const compressionStats = {};
|
|
2725
2733
|
const result = await clientModule.serialize(value, key, {
|
|
2726
2734
|
global,
|
|
2727
|
-
extraReducers: getStreamAndRequestReducers(getExternalReducers(global, ops, runId, key, framedByteStreams)),
|
|
2735
|
+
extraReducers: getStreamAndRequestReducers(getExternalReducers(global, ops, runId, key, framedByteStreams, undefined, readbackOps)),
|
|
2728
2736
|
compression,
|
|
2729
2737
|
compressionStats,
|
|
2730
2738
|
});
|
|
@@ -2750,12 +2758,11 @@ export async function hydrateWorkflowArguments(value, _runId, key, global = glob
|
|
|
2750
2758
|
*/
|
|
2751
2759
|
export async function dehydrateWorkflowReturnValue(value, _runId, key, global = globalThis, v1Compat = false, compression = false,
|
|
2752
2760
|
/**
|
|
2753
|
-
* Optional sink receiving
|
|
2754
|
-
*
|
|
2755
|
-
*
|
|
2756
|
-
*
|
|
2757
|
-
*
|
|
2758
|
-
* runtime/suspension-handler.ts passes one for step-input dehydration.
|
|
2761
|
+
* Optional sink receiving the first five samples and exact total count of
|
|
2762
|
+
* workflow-code executions serialization could not avoid. The diagnostics
|
|
2763
|
+
* are emitted as span attributes either way, so omitting this loses nothing
|
|
2764
|
+
* observability-wise. The retained-VM gate in runtime/suspension-handler.ts
|
|
2765
|
+
* passes one for step-input dehydration.
|
|
2759
2766
|
*/
|
|
2760
2767
|
guestCodeStatsOut) {
|
|
2761
2768
|
if (v1Compat) {
|
|
@@ -2872,16 +2879,16 @@ export async function dehydrateStepReturnValue(value, runId, key, ops = [], glob
|
|
|
2872
2879
|
// Turbo optimistic start: order the first chunk of a returned stream after
|
|
2873
2880
|
// the backgrounded `run_started`. Threaded into the step reducers' stream
|
|
2874
2881
|
// sink. Undefined outside turbo / on the await path.
|
|
2875
|
-
runReadyBarrier) {
|
|
2882
|
+
runReadyBarrier, readbackOps = ops) {
|
|
2876
2883
|
if (v1Compat) {
|
|
2877
|
-
const str = stringify(value, getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier));
|
|
2884
|
+
const str = stringify(value, getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier, readbackOps));
|
|
2878
2885
|
return revive(str);
|
|
2879
2886
|
}
|
|
2880
2887
|
try {
|
|
2881
2888
|
const compressionStats = {};
|
|
2882
2889
|
const result = await stepModule.serialize(value, key, {
|
|
2883
2890
|
global,
|
|
2884
|
-
extraReducers: getStreamAndRequestReducers(getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier)),
|
|
2891
|
+
extraReducers: getStreamAndRequestReducers(getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier, readbackOps)),
|
|
2885
2892
|
compression,
|
|
2886
2893
|
compressionStats,
|
|
2887
2894
|
});
|
|
@@ -3063,4 +3070,4 @@ function getStreamAndRequestRevivers(allRevivers) {
|
|
|
3063
3070
|
}
|
|
3064
3071
|
return extra;
|
|
3065
3072
|
}
|
|
3066
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSxnQ0FBZ0MsQ0FB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QUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFN0cmVhbUV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgb25jZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIGdldE1heEJ1ZmZlcmVkQnl0ZXMsXG4gIGdldE1heEJ5dGVzUGVyQmF0Y2gsXG4gIGdldE1heENodW5rc1BlckJhdGNoLFxuICBnZXRNYXhJbmZsaWdodENodW5rcyxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyB3b3JsZC50cyBtb2R1bGUgKGFuZCBpdHMgZHluYW1pYy1pbXBvcnQgYmVoYXZpb3VyKSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGNyZWF0ZU9wZW5TZXNzaW9uLFxuICBjcmVhdGVTZWFsU2Vzc2lvbixcbiAgZGVjb2RlUnVuUHVibGljS2V5LFxufSBmcm9tICcuL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGFlc0tleU9mLFxuICBkZWNyeXB0LFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbiAgcnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgR3Vlc3RDb2RlU3RhdHMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgcmVhZFByb3BlcnR5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0RSQUlOX1NZTUJPTCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgLy8gU2VhbGVkLWJveCAoJ2VuY3AnKSBrZXkgdmFyaWFudHM6IHNlZSBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG4gIHJ1blBheWxvYWRLZXlzLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgaXNTZWFsVGFyZ2V0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBhZXNLZXlPZixcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlLCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aDogYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgT1RlbCBzcGFuIGF0dHJpYnV0ZXMgZm9yIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpb25zIHRoYXQgdGhlXG4gKiBoYXJkZW5lZCBzZXJpYWxpemVyIGNvdWxkIG5vdCBhdm9pZCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tXG4gKiBzZXJpYWxpemVycykuIE5vLW9wcyB3aGVuIHNlcmlhbGl6YXRpb24gd2FzIGZ1bGx5IHNpZGUtZWZmZWN0IGZyZWUsXG4gKiB0aGUgY29tbW9uIGNhc2UuIFNhbWUgbmV2ZXItYnJlYWstdGhlLWRhdGEtcGF0aCBjb250cmFjdCBhc1xuICogYHJlY29yZENvbXByZXNzaW9uYCBhYm92ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0czogR3Vlc3RDb2RlU3RhdHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgc3RhdHMuZXhlY3V0aW9ucy5tYXAoKGUpID0+XG4gICAgICAgICAgZS5kZXRhaWwgPyBgJHtlLmtpbmR9ICgke2UuZGV0YWlsfSlgIDogZS5raW5kXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0cy5leGVjdXRpb25zLmxlbmd0aCksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25HdWVzdENvZGVEZXRhaWxzKGRldGFpbHMpLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgdGVsZW1ldHJ5IGZhaWx1cmVzXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgcmVkdWNlcnM6IFBhcnRpYWw8UmVkdWNlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4ge1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgLy8gTm90ZTogaWYgcmVzb2x2aW5nIGNyeXB0b0tleSByZWplY3RzIChlLmcuLCBuZXR3b3JrIGVycm9yIGZldGNoaW5nXG4gIC8vIHRoZSBkZXJpdmVkIGtleSksIHRoZSByZWplY3Rpb24gd29uJ3Qgc3VyZmFjZSB1bnRpbCB0aGUgZmlyc3QgY2h1bmtcbiAgLy8gaXMgcHJvY2Vzc2VkLCBub3QgYXQgc3RyZWFtIGNvbnN0cnVjdGlvbiB0aW1lLlxuICBjb25zdCBrZXlTdGF0ZSA9IHtcbiAgICByZXNvbHZlZDogZmFsc2UsXG4gICAga2V5OiB1bmRlZmluZWQgYXMgUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgLy8gU2V0IHdoZW4gdGhlIHJlc29sdmVkIGtleSBpcyBhIHNlYWwgdGFyZ2V0OyBhbW9ydGl6ZXMgdGhlIEtFTSBhY3Jvc3MgYWxsXG4gIC8vIGZyYW1lcyB0aGlzIHN0cmVhbSBpbnN0YW5jZSB3cml0ZXMuXG4gIGxldCBzZWFsU2Vzc2lvbjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU2VhbFNlc3Npb24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc1NlYWxUYXJnZXQoa2V5U3RhdGUua2V5KSkge1xuICAgICAgICAgICAgc2VhbFNlc3Npb24gPSBjcmVhdGVTZWFsU2Vzc2lvbihcbiAgICAgICAgICAgICAga2V5U3RhdGUua2V5LnJlY2lwaWVudFB1YmxpY0tleSxcbiAgICAgICAgICAgICAga2V5U3RhdGUua2V5LmFhZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHN0cmluZ2lmeShjaHVuaywgcmVkdWNlcnMpO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gZW5jb2Rlci5lbmNvZGUoc2VyaWFsaXplZCk7XG4gICAgICAgIGxldCBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIGZyYW1lIHBheWxvYWQgaWYgYSBrZXkgaXMgcHJvdmlkZWQuXG4gICAgICAgIC8vIFRoZSBsZW5ndGggaGVhZGVyIHJlbWFpbnMgaW4gdGhlIGNsZWFyIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuXG4gICAgICAgIC8vIGZpbmQgZnJhbWUgYm91bmRhcmllcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRXZlcnkgZnJhbWUgZ2V0cyBhIGZyZXNoIHJhbmRvbSBub25jZS4gTmV2ZXIgc3dpdGNoIHRoaXMgdG8gYVxuICAgICAgICAvLyBjb3VudGVyOiBhIHN0cmVhbSByZWNvbm5lY3Qgb3IgYSBkdXJhYmxlIHJlcGxheSByZXN0YXJ0cyB0aGUgd3JpdGVyLFxuICAgICAgICAvLyB3aGljaCB3b3VsZCByZXBlYXQgYChrZXksIG5vbmNlKWAgYW5kIGNhdGFzdHJvcGhpY2FsbHkgYnJlYWtcbiAgICAgICAgLy8gQUVTLUdDTS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT24gdGhlIHNlYWxlZCBwYXRoIHRoZSBLRU0gaXMgYW1vcnRpemVkIGFjcm9zcyB0aGUgc3RyZWFtIHZpYSBhXG4gICAgICAgIC8vIHNlc3Npb24gKG9uZSBFQ0RIIHBlciB3cml0ZXIgaW5zdGVhZCBvZiBvbmUgcGVyIGZyYW1lKS4gVGhhdCBpcyBzYWZlXG4gICAgICAgIC8vIHByZWNpc2VseSBiZWNhdXNlIHRoZSBub25jZXMgc3RheSByYW5kb20sIGFuZCBiZWNhdXNlIHRoZSBzZXNzaW9uIGlzXG4gICAgICAgIC8vIHNjb3BlZCB0byB0aGlzIHN0cmVhbSBpbnN0YW5jZTogYSByZXBsYXllZCBvciByZWNvbm5lY3RlZCB3cml0ZXJcbiAgICAgICAgLy8gYnVpbGRzIGEgbmV3IG9uZSBhbmQgbmV2ZXIgaW5oZXJpdHMgYSBwcmV2aW91cyBjb250ZW50IGtleS5cbiAgICAgICAgaWYgKHNlYWxTZXNzaW9uKSB7XG4gICAgICAgICAgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQsXG4gICAgICAgICAgICBhd2FpdCBzZWFsU2Vzc2lvbi5zZWFsKHByZWZpeGVkKVxuICAgICAgICAgICkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBwcmVmaXhlZCA9IChhd2FpdCBlbmNyeXB0KHByZWZpeGVkLCBrZXlTdGF0ZS5rZXkpKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lOiBbNC1ieXRlIGxlbmd0aF1bcHJlZml4ZWQgZGF0YV1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIHByZWZpeGVkLmxlbmd0aCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBwcmVmaXhlZC5sZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgZnJhbWUuc2V0KHByZWZpeGVkLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbmNyeXB0aW9uIGZhaWx1cmVzIG11c3Qga2VlcCB0aGVpciBSdW50aW1lRGVjcnlwdGlvbkVycm9yXG4gICAgICAgIC8vIGlkZW50aXR5IChSVU5USU1FX0VSUk9SKSByYXRoZXIgdGhhbiBiZSByZWZyYW1lZCBhcyBhXG4gICAgICAgIC8vIFNlcmlhbGl6YXRpb25FcnJvciAoVVNFUl9FUlJPUikuXG4gICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnc3RyZWFtIGNodW5rJyxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZTogZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICByZXZpdmVyczogUGFydGlhbDxSZXZpdmVycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55PiB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIGNvbnN0IGtleVN0YXRlID0ge1xuICAgIHJlc29sdmVkOiBmYWxzZSxcbiAgICBrZXk6IHVuZGVmaW5lZCBhcyBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICB9O1xuICAvLyBNaXJyb3Igb2YgdGhlIHdyaXRlcidzIHNlYWwgc2Vzc2lvbjogZXZlcnkgZnJhbWUgZnJvbSBvbmUgd3JpdGVyIGNhcnJpZXNcbiAgLy8gdGhlIHNhbWUgZXBoZW1lcmFsIHB1YmxpYyBrZXksIHNvIHRoaXMgdHVybnMgYW4gRUNESCBwZXIgZnJhbWUgaW50byBhblxuICAvLyBFQ0RIIHBlciB3cml0ZXIuXG4gIGxldCBvcGVuU2Vzc2lvbjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlT3BlblNlc3Npb24+IHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5ld0J1ZmZlci5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXdCdWZmZXIuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFtZXMoXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI8YW55PlxuICApIHtcbiAgICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHRcbiAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgaWYgKGlzUnVuUGF5bG9hZEtleXMoa2V5U3RhdGUua2V5KSkge1xuICAgICAgICBvcGVuU2Vzc2lvbiA9IGNyZWF0ZU9wZW5TZXNzaW9uKGtleVN0YXRlLmtleS5rZXlQYWlyLCBrZXlTdGF0ZS5rZXkuYWFkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBjb21wbGV0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzXG4gICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrOyAvLyBJbmNvbXBsZXRlIGZyYW1lLCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJhbWVEYXRhID0gYnVmZmVyLnNsaWNlKFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSxcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aFxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKTtcblxuICAgICAgbGV0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKTtcblxuICAgICAgLy8gSWYgdGhlIGZyYW1lIHBheWxvYWQgaXMgZW5jcnlwdGVkIG9yIHNlYWxlZCwgcmVjb3ZlciBpdCBmaXJzdCB0b1xuICAgICAgLy8gcmV2ZWFsIHRoZSBpbm5lciBmb3JtYXQtcHJlZml4ZWQgZGF0YSAoZS5nLiwgJ2RldmwnICsgc2VyaWFsaXplZFxuICAgICAgLy8gdGV4dCksIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgZGVzZXJpYWxpemF0aW9uIHBhdGguXG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQgfHxcbiAgICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlYWxlZCA9IGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQ7XG4gICAgICAgIC8vIEEgc2VhbGVkIGZyYW1lIG5lZWRzIHRoZSBydW4ncyBrZXlwYWlyOyBhIHN5bW1ldHJpYyBmcmFtZSBuZWVkcyBhblxuICAgICAgICAvLyBBRVMga2V5LiBSZXBvcnQgdGhlIHNob3J0ZmFsbCBwcmVjaXNlbHk6IFwibm8ga2V5IGF0IGFsbFwiIGFuZCBcInRoZVxuICAgICAgICAvLyB3cm9uZyBraW5kIG9mIGtleVwiIGhhdmUgZGlzdGluY3QgY2F1c2VzLlxuICAgICAgICBjb25zdCB1c2FibGUgPSBzZWFsZWRcbiAgICAgICAgICA/IGlzUnVuUGF5bG9hZEtleXMoa2V5U3RhdGUua2V5KVxuICAgICAgICAgIDogYWVzS2V5T2Yoa2V5U3RhdGUua2V5KSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXVzYWJsZSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgICAgICAgICAgc2VhbGVkXG4gICAgICAgICAgICAgICAgPyAnU2VhbGVkIHN0cmVhbSBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBydW4ga2V5cGFpciBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAgICAgICAgICAgICBcIk9wZW5pbmcgYSBzZWFsZWQgZnJhbWUgcmVxdWlyZXMgdGhlIHJ1bidzIG93biBlbmNyeXB0aW9uIGtleSBtYXRlcmlhbC5cIlxuICAgICAgICAgICAgICAgIDogJ0VuY3J5cHRlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gZW5jcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogcGF5bG9hZC5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0UHJlZml4OiBzZWFsZWQgPyAnZW5jcCcgOiAnZW5jcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZWNyeXB0ZWQ6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU2VhbGVkIGZyYW1lcyBnbyB0aHJvdWdoIHRoZSBzZXNzaW9uIHNvIHJlcGVhdGVkIGZyYW1lcyBmcm9tIG9uZVxuICAgICAgICAgIC8vIHdyaXRlciByZXVzZSBhIHNpbmdsZSBkZWNhcHN1bGF0aW9uLiBFdmVyeXRoaW5nIGVsc2UgZGVsZWdhdGVzIHRvXG4gICAgICAgICAgLy8gdGhlIHNoYXJlZCBlbnZlbG9wZSBsYXllciwga2VlcGluZyB0aGUgdHdvIHNjaGVtZXMgaW4gbG9ja3N0ZXBcbiAgICAgICAgICAvLyB3aXRoIHRoZSBvbmUtc2hvdCBwYXRoLlxuICAgICAgICAgIGRlY3J5cHRlZCA9IHNlYWxlZFxuICAgICAgICAgICAgPyBhd2FpdCBvcGVuU2Vzc2lvbiEub3BlbihkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKS5wYXlsb2FkKVxuICAgICAgICAgICAgOiAoKGF3YWl0IGRlY3J5cHQoZnJhbWVEYXRhLCBrZXlTdGF0ZS5rZXkpKSBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgbG93LWxldmVsIGNyeXB0byBsYXllciBvbmx5IHNlZXMgdGhlIHN0cmlwcGVkIHBheWxvYWQsIHNvIGl0XG4gICAgICAgICAgLy8gY2Fubm90IHJlY29yZCB0aGUgb3V0ZXIgZW52ZWxvcGUgcHJlZml4LiBXZSBwZWVrZWQgaXQgaGVyZSwgc29cbiAgICAgICAgICAvLyBlbnJpY2ggdGhlIGRpYWdub3N0aWMgY29udGV4dCB3aXRoIHRoZSByZWFsIGZvcm1hdCBwcmVmaXggYmVmb3JlXG4gICAgICAgICAgLy8gcHJvcGFnYXRpbmcsIG1pcnJvcmluZyBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gICAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpICYmIGVycm9yLmNvbnRleHQpIHtcbiAgICAgICAgICAgIGVycm9yLmNvbnRleHQuZm9ybWF0UHJlZml4ID0gZm9ybWF0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAoeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKHRleHQsIHJldml2ZXJzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIEZpcnN0LCB0cnkgdG8gZGV0ZWN0IGlmIHRoaXMgaXMgbGVuZ3RoLXByZWZpeGVkIGZyYW1lZCBkYXRhXG4gICAgICAvLyBieSBjaGVja2luZyBpZiB0aGUgZmlyc3QgNCBieXRlcyBmb3JtIGEgcGxhdXNpYmxlIGxlbmd0aC5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmIGNodW5rLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBwb3NzaWJsZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBjaHVuay5idWZmZXIsXG4gICAgICAgICAgY2h1bmsuYnl0ZU9mZnNldCxcbiAgICAgICAgICBjaHVuay5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoIDwgMTAwXzAwMF8wMDAgLy8gc2FuaXR5IGNoZWNrOiA8IDEwME1CXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIExvb2tzIGxpa2UgZnJhbWVkIGRhdGFcbiAgICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQWxyZWFkeSBpbiBmcmFtZWQgbW9kZSAoaGF2ZSBidWZmZXJlZCBkYXRhKVxuICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGZvcm1hdDogbmV3bGluZS1kZWxpbWl0ZWQgZGV2YWx1ZSB0ZXh0IChubyBmcmFtaW5nKVxuICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKGNodW5rKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZShsaW5lLCByZXZpdmVycykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAvLyBQcm9jZXNzIGFueSByZW1haW5pbmcgZnJhbWVkIGRhdGFcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCeXRlLXN0cmVhbSB3aXJlIGZyYW1pbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBCeXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYCBSZWFkYWJsZVN0cmVhbXMgcGFzc2VkIGFjcm9zcyBib3VuZGFyaWVzKVxuLy8gYXJlIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgd29ybGQncyBzdHJlYW0gdHJhbnNwb3J0IG9uZSB1c2VyIGNodW5rIGF0XG4vLyBhIHRpbWUuIFdpdGhvdXQgYW4gaW4tYmFuZCBlbnZlbG9wZSwgdGhlIHJlYWRlciBzZWVzIGEgZmxhdCBzdHJlYW0gb2Zcbi8vIGJ5dGVzOiB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB3aGVyZSBvbmUgdXNlciBjaHVuayBlbmRzIGFuZCB0aGUgbmV4dFxuLy8gYmVnaW5zLCB3aGljaCBtYWtlcyBtaWQtc3RyZWFtIHJlY29ubmVjdCBpbXBvc3NpYmxlICh3ZSBkb24ndCBrbm93IGhvd1xuLy8gbWFueSBzZXJ2ZXItc2lkZSBjaHVua3MgaGF2ZSBiZWVuIGNvbnN1bWVkKS5cbi8vXG4vLyBUbyBlbmFibGUgdHJhbnNwYXJlbnQgcmVjb25uZWN0LCB0aGlzIFBSIGludHJvZHVjZXMgYW4gb3B0LWluIHdpcmVcbi8vIGVudmVsb3BlIHRoYXQgd3JhcHMgZWFjaCB1c2VyIGNodW5rIGluIGEgbGVuZ3RoLXByZWZpeDpcbi8vXG4vLyAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW3VzZXIgcGF5bG9hZCBieXRlc11cbi8vXG4vLyBUaGUgZW52ZWxvcGUgaXMgaWRlbnRpY2FsIGluIHNoYXBlIHRvIGBnZXRTZXJpYWxpemVTdHJlYW1gJ3MgZnJhbWluZyxcbi8vIGJ1dCB0aGUgcGF5bG9hZCBoZXJlIGlzICpyYXcgdXNlciBieXRlcyo6IHRoZXJlIGlzIG5vIGlubmVyXG4vLyBmb3JtYXQtcHJlZml4LCBubyBkZXZhbHVlLCBubyBlbmNyeXB0aW9uLiBBIGZyYW1lZCBieXRlIHN0cmVhbSBzdGF5c1xuLy8gc2VtYW50aWNhbGx5IGEgYnl0ZSBzdHJlYW0gZW5kLXRvLWVuZDsgdGhlIGZyYW1pbmcgaXMgcHVyZWx5IHRyYW5zcG9ydC5cbi8vXG4vLyBUaGUgZGVjaXNpb24gdG8gdXNlIGZyYW1pbmcgZm9yIGEgZ2l2ZW4gc3RyZWFtIGlzIHJlY29yZGVkIGluIHRoZVxuLy8gc2VyaWFsaXplZCBzdHJlYW0gcmVmIChgZnJhbWluZzogJ2ZyYW1lZC12MSdgKSwgc28gYm90aCBzaWRlcyBhZ3JlZSBvblxuLy8gdGhlIHdpcmUgZm9ybWF0IHdpdGhvdXQgcnVudGltZSBuZWdvdGlhdGlvbi4gUHJvZHVjZXJzIHRoYXQgdGFyZ2V0IGFcbi8vIHJ1biB3aG9zZSBkZXBsb3ltZW50IGRvZXNuJ3Qgc3VwcG9ydCBmcmFtaW5nIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2Bcbi8vIGluIGNhcGFiaWxpdGllcy50cykgZW1pdCByYXcgYnl0ZXMgYW5kIGEgcmVmIHdpdGhvdXQgdGhlIGZpZWxkLCB3aGljaFxuLy8gdGhlIHJlYWRlciB0cmVhdHMgYXMgbGVnYWN5IHJhdyBieXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cbi8qKlxuICogTWF4aW11bSBhbGxvd2VkIGJ5dGUtc3RyZWFtIGZyYW1lIHBheWxvYWQgc2l6ZSAoMTAwTUIpLiBTaGFyZWQgYnkgdGhlXG4gKiBmcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIHVzZXIgY2h1bmtzIGF0IHdyaXRlIHRpbWUsIHdoZXJlIHRoZSBlcnJvciBpc1xuICogYWN0aW9uYWJsZSkgYW5kIHRoZSB1bmZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgbGVuZ3RoIGhlYWRlcnMgYXQgcmVhZFxuICogdGltZSwgd2hpY2ggdXN1YWxseSBpbmRpY2F0ZSBhIG5vbi1mcmFtZWQgd2lyZSBiZWluZyByZWFkIGFzIGZyYW1lZCkuXG4gKiBLZWVwaW5nIGJvdGggc2lkZXMgb24gb25lIGNvbnN0YW50IGd1YXJhbnRlZXMgYW55IGNodW5rIHRoZSBmcmFtZXJcbiAqIGFjY2VwdHMgY2FuIGFsd2F5cyBiZSBkZWNvZGVkIGJ5IHRoZSB1bmZyYW1lci5cbiAqL1xuY29uc3QgTUFYX0ZSQU1FX1NJWkUgPSAxMDBfMDAwXzAwMDtcblxuLyoqXG4gKiBXcmFwcyBlYWNoIGNodW5rIG9mIGEgYnl0ZSBzdHJlYW0gaW4gYSA0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhcbiAqIHByZWZpeC4gVXNlZCBieSB0aGUgcHJvZHVjZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEVtcHR5IGNodW5rcyAobGVuZ3RoIDApIGFyZSBkcm9wcGVkOiB0aGUgcmVzdWx0aW5nIGBbMHgwMCAweDAwIDB4MDAgMHgwMF1gXG4gKiBmcmFtZSB3b3VsZCBiZSBhbWJpZ3VvdXMgd2l0aCB0aGUgbGVnYWN5IFwibG9va3MgZnJhbWVkXCIgZGV0ZWN0aW9uIGluXG4gKiBgZ2V0RGVzZXJpYWxpemVTdHJlYW1gLCBhbmQgaXQgY2FycmllcyBubyBpbmZvcm1hdGlvbi5cbiAqXG4gKiBMb2FkLWJlYXJpbmcgaW52YXJpYW50OiBlYWNoIHVzZXIgY2h1bmsgYmVjb21lcyBleGFjdGx5IG9uZSBmcmFtZSwgYW5kXG4gKiBlYWNoIGZyYW1lIGlzIGVucXVldWVkIGFzIGV4YWN0bHkgb25lIHRyYW5zcG9ydCBjaHVuayAodGhlIGRvd25zdHJlYW1cbiAqIHdyaXRhYmxlIHBlcmZvcm1zIG9uZSB3aXJlIHdyaXRlIHBlciBjaHVuaywgcHJlc2VydmluZyBib3VuZGFyaWVzKS4gVGhlXG4gKiBzZXJ2ZXIgdGhlcmVmb3JlIHN0b3JlcyBvbmUgZnJhbWUgcGVyIGNodW5rIGluZGV4LCB3aGljaCBpcyB3aGF0IGFsbG93c1xuICogYSBmdXR1cmUgcmVjb25uZWN0aW5nIHJlYWRlciB0byByZXN1bWUgYSBmcmFtZWQgYnl0ZSBzdHJlYW0gYXRcbiAqIGBzdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgLCB0aGUgc2FtZSBhcml0aG1ldGljXG4gKiBgY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtYCByZWxpZXMgb24gZm9yIG9iamVjdCBzdHJlYW1zLiBEbyBub3RcbiAqIGNvYWxlc2NlIG9yIHNwbGl0IGZyYW1lcyBoZXJlIHdpdGhvdXQgcmV2aXNpdGluZyB0aGF0IHJlc3VtZSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVGcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBjaHVuayBvZiAke2NodW5rLmxlbmd0aH0gYnl0ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSBgICtcbiAgICAgICAgICAgICAgYGZyYW1lZCBjaHVuayBzaXplICgke01BWF9GUkFNRV9TSVpFfSkuIFNwbGl0IHRoZSBkYXRhIGludG8gYCArXG4gICAgICAgICAgICAgIGBzbWFsbGVyIGNodW5rcyBiZWZvcmUgd3JpdGluZy5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBjaHVuay5sZW5ndGgpO1xuICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgZnJhbWUuc2V0KGNodW5rLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFVud3JhcHMgbGVuZ3RoLXByZWZpeGVkIGJ5dGUtc3RyZWFtIGZyYW1lcyBiYWNrIGludG8gdGhlIG9yaWdpbmFsIHVzZXJcbiAqIGNodW5rcy4gVXNlZCBieSB0aGUgY29uc3VtZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEJ1ZmZlcnMgYWNyb3NzIHJlYWQgYm91bmRhcmllcywgc2luY2UgdGhlIHRyYW5zcG9ydCBtYXkgc3BsaXQgYSBzaW5nbGVcbiAqIGZyYW1lIGFjcm9zcyBtdWx0aXBsZSByZWFkcyAoaGVhZGVyIGluIG9uZSBjaHVuaywgcGF5bG9hZCBpbiBhbm90aGVyKVxuICogb3IgY29hbGVzY2UgbXVsdGlwbGUgZnJhbWVzIGludG8gYSBzaW5nbGUgcmVhZC4gVGhlIHRyYW5zZm9ybSBlbWl0c1xuICogd2hvbGUgdXNlciBjaHVua3MgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gKlxuICogRXJyb3JzIHRoZSBzdHJlYW0gaWYgdGhlIGxlbmd0aCBoZWFkZXIgYWR2ZXJ0aXNlcyBhIGZyYW1lIGxhcmdlciB0aGFuXG4gKiBgTUFYX0ZSQU1FX1NJWkVgIGJ5dGVzLCBzaW5jZSB0aGF0IGFsbW9zdCBjZXJ0YWlubHkgaW5kaWNhdGVzIGFcbiAqIG1pc2ZyYW1lZCB3aXJlIChlLmcuIGEgcmF3IGJ5dGUgc3RyZWFtIGJlaW5nIGZlZCB0aHJvdWdoIHRoaXMgdHJhbnNmb3JtXG4gKiBieSBtaXN0YWtlKSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbiBlbm9ybW91cyBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV4dC5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXh0LnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IDApIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcblxuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGZyYW1lTGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZnJhbWUgbGVuZ3RoICR7ZnJhbWVMZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSAoJHtNQVhfRlJBTUVfU0laRX0pLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyB1c3VhbGx5IG1lYW5zIGEgbm9uLWZyYW1lZCBieXRlIHN0cmVhbSBpcyBiZWluZyByZWFkIGFzIGZyYW1lZC5gLFxuICAgICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcblxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFLCB0b3RhbCkpO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGVuZGVkIHdpdGggJHtidWZmZXIubGVuZ3RofSBieXRlcyBvZiBpbmNvbXBsZXRlIGZyYW1lIGRhdGEuIGAgK1xuICAgICAgICAgICAgICBgVGhlIHN0cmVhbSB3YXMgdHJ1bmNhdGVkIG1pZC1mcmFtZS5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIGVuZC10by1lbmQgdGltZS10by1maXJzdC1jaHVuayBzcGFuIGZvciBhIGxpdmUgcmVhZDpcbiAqIHJlYWQgZGlzcGF0Y2ggKGBzdGFydEVwb2NoTXNgKSDihpIgdGhlIGZpcnN0IG5vbi1lbXB0eSBjaHVuayByZWFjaGluZyB0aGVcbiAqIHJlYWRlciwgaW5jbHVkaW5nIHRoZSBuZXR3b3JrIGhvcC4gRmlyZS1hbmQtZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyLFxuICBjb25uZWN0TXM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50dGZjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgLi4uKHR5cGVvZiBjb25uZWN0TXMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb25uZWN0X21zJzogY29ubmVjdE1zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnN0YXJ0X2luZGV4Jzogc3RhcnRJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCByZWFkLWNvbXBsZXRpb24gc3BhbiB3aGVuIGEgc3RyZWFtIHJlYWQgZHJhaW5zOlxuICogYmFjay1kYXRlZCB0byB0aGUgcmVhZCBkaXNwYXRjaCwgc28gaXRzIGR1cmF0aW9uIGlzIHRoZSB0b3RhbCByZWFkLCB3aXRoXG4gKiBjaHVuay9ieXRlIGNvdW50cyBmb3IgdGhyb3VnaHB1dC4gQ2FuY2VsbGVkIHJlYWRzIGVtaXQgbm90aGluZy4gRmlyZS1hbmQtXG4gKiBmb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICByZWNvbm5lY3RzPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWRfY29tcGxldGUnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudG90YWxfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAuLi4odHlwZW9mIHJlY29ubmVjdHMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5yZWNvbm5lY3RzJzogcmVjb25uZWN0cyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgI3JlYWRlcj86IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PjtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3RhdGUuIGByZWFkU3RhcnRgIGlzIHN0YW1wZWQgd2hlbiB0aGVcbiAgICAvLyByZWFkZXIgc3RhcnRzIGNvbnN1bWluZyAoZmlyc3QgcHVsbCDihpIgdGhlIHJlYWQgZGlzcGF0Y2gpOyB0aGUgc3BhbiBpc1xuICAgIC8vIGVtaXR0ZWQgb25jZSwgd2hlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoZXMgdGhlIHJlYWRlci4gU28gaXRzXG4gICAgLy8gZHVyYXRpb24gaXMgdGhlIGVuZC10by1lbmQgVFRGQyBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBOby1vcCB3aXRob3V0XG4gICAgLy8gYW4gT3BlblRlbGVtZXRyeSBTREsgcmVnaXN0ZXJlZC5cbiAgICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCBjb25uZWN0IGR1cmF0aW9uOiB0aGUgd29ybGQuc3RyZWFtcy5nZXQgYXdhaXQgKHJlYWRcbiAgICAvLyBkaXNwYXRjaCAtPiBzdHJlYW0gaGFuZGxlIC8gcmVzcG9uc2UgaGVhZGVycykuIFN0YW1wZWQgb24gdGhlXG4gICAgLy8gd29ya2Zsb3cuc3RyZWFtLnJlYWQgc3BhbiBvbmNlIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzLlxuICAgIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBSZWFkLWNvbXBsZXRpb24gY291bnRlcnMgZm9yIHRoZSB3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZSBzcGFuXG4gICAgLy8gZW1pdHRlZCB3aGVuIHRoZSBzdHJlYW0gZHJhaW5zLlxuICAgIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICAgIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG4gICAgc3VwZXIoe1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBpcyBjb21wbGFpbmluZyBhYm91dCB0aGlzXG4gICAgICB0eXBlOiAnYnl0ZXMnLFxuXG4gICAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBsZXQgcmVhZGVyID0gdGhpcy4jcmVhZGVyO1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgICAgICAgcmVhZGVyID0gdGhpcy4jcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVhZGVyJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgZmx1c2hlcyBhIGxlYWRpbmcgemVyby1sZW5ndGggY2h1bmsgKHYzKykgdG8gY29tbWl0XG4gICAgICAgICAgLy8gcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUgYW55IGRhdGE7IHNraXAgZW1wdGllcyBzbyBUVEZDIG1lYXN1cmVzIHRvXG4gICAgICAgICAgLy8gdGhlIGZpcnN0IHJlYWwgY2h1bmsuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJlxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgICByZWFkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCArPSAxO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIC8vIEZvcndhcmQgcmF3IGJ5dGVzOyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGVcbiAgICAgICAgICAvLyBmcmFtaW5nIGxldmVsIGJ5IGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbS5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXhpbXVtIGNvbnNlY3V0aXZlIHJlY29ubmVjdCBhdHRlbXB0cyBmb3IgYSBzaW5nbGUgZnJhbWVkIHN0cmVhbSBzZXNzaW9uLlxuICogVGhlIGNvdW50ZXIgcmVzZXRzIHRvIHplcm8gd2hlbmV2ZXIgYSByZWNvbm5lY3QgbWFrZXMgZm9yd2FyZCBwcm9ncmVzcyAoYVxuICogZnJhbWUgaXMgZGVsaXZlcmVkKSwgc28gdGhpcyBib3VuZHMgKmNvbnNlY3V0aXZlKiBmYWlsdXJlcywgbm90IHRoZSBsaWZldGltZVxuICogdG90YWw6IGEgbG9uZy1saXZlZCBzZXJ2ZXJsZXNzIHN0cmVhbSBtYXkgbGVnaXRpbWF0ZWx5IHJlY29ubmVjdCBmYXIgbW9yZVxuICogdGhhbiB0aGlzIG1hbnkgdGltZXMgYXMgbG9uZyBhcyBlYWNoIHJlY29ubmVjdCBrZWVwcyBkZWxpdmVyaW5nIGRhdGEuIFdlIG9ubHlcbiAqIGdpdmUgdXAgYWZ0ZXIgdGhpcyBtYW55IHJlY29ubmVjdHMgaW4gYSByb3cgcHJvZHVjZSBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyA9IDUwO1xuXG4vKiogRWZmZWN0aXZlIGNvbnNlY3V0aXZlLXJlY29ubmVjdCBjYXAuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMsXG4gICAge1xuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQWJzb2x1dGUgYmFja3N0b3Agb24gdG90YWwgcmVjb25uZWN0cyBmb3IgYSBzaW5nbGUgc2Vzc2lvbiwgaW5kZXBlbmRlbnQgb2ZcbiAqIHByb2dyZXNzLiBUaGUgY29uc2VjdXRpdmUgY2FwIGFib3ZlIHJlc2V0cyBvbiBmb3J3YXJkIHByb2dyZXNzLCB3aGljaCBpc1xuICogY29ycmVjdCBmb3IgYSB3ZWxsLWJlaGF2ZWQgYmFja2VuZCB0aGF0IGhvbm9ycyBgc3RhcnRJbmRleGAuIEJ1dCBpZiBhIFdvcmxkJ3NcbiAqIGBzdHJlYW1zLmdldGAgZXZlciBpZ25vcmVkIGBzdGFydEluZGV4YCBhbmQgcmUtZGVsaXZlcmVkIGVhcmxpZXIgY2h1bmtzLFxuICogXCJwcm9ncmVzc1wiIHdvdWxkIGJlIHJlcG9ydGVkIGV2ZXJ5IHJlY29ubmVjdCBhbmQgdGhlIGNvbnNlY3V0aXZlIGNhcCB3b3VsZFxuICogbmV2ZXIgdHJpcCwgdHVybmluZyBhIGJvdW5kZWQgZmFpbHVyZSBpbnRvIGFuIHVuYm91bmRlZCByZWNvbm5lY3QgbG9vcC4gVGhpc1xuICogaGFyZCBjZWlsaW5nIGd1YXJhbnRlZXMgdGhlIGxvb3AgYWx3YXlzIHRlcm1pbmF0ZXMuIEl0IGlzIHNldCBoaWdoIGVub3VnaFxuICogKGhvdXJzIG9mIHN0cmVhbWluZyBhdCByZWFsaXN0aWMgcGVyLXNlc3Npb24gdGltZW91dHMpIHRvIG5ldmVyIGludGVyZmVyZVxuICogd2l0aCBsZWdpdGltYXRlIGxvbmctbGl2ZWQgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMgPSAxMDAwO1xuXG4vKiogRWZmZWN0aXZlIHRvdGFsLXJlY29ubmVjdCBiYWNrc3RvcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgbGVuZ3RoLXByZWZpeC1mcmFtZWQgYnl0ZSBzdHJlYW0gZnJvbSBgd29ybGQuc3RyZWFtcy5nZXRgIHdpdGhcbiAqIHRyYW5zcGFyZW50IGF1dG8tcmVjb25uZWN0LlxuICpcbiAqIEV2ZXJ5IGZ1bGx5LWRlY29kZWQgb3V0ZXIgZnJhbWUgY29ycmVzcG9uZHMgdG8gZXhhY3RseSBvbmUgc2VydmVyLXNpZGVcbiAqIGNodW5rICh0aGUgc2VyaWFsaXplIHRyYW5zZm9ybSBlbnF1ZXVlcyBvbmUgZnJhbWUgcGVyIHdvcmtmbG93IHdyaXRlLCBhbmRcbiAqIHRoZSB3cml0YWJsZSBidWZmZXJzIG9uZSBmcmFtZSBwZXIgY2h1bmsgd2hlbiBtdWx0aS13cml0aW5nKS4gVGhlIHdyYXBwZXJcbiAqIGNvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGFuZCwgb24gdXBzdHJlYW0gZXJyb3IsIHJlb3BlbnMgdGhlIGNvbm5lY3Rpb25cbiAqIHdpdGggYHN0YXJ0SW5kZXggPSByZXNvbHZlZFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AuIFBhcnRpYWwtZnJhbWVcbiAqIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB0aGUgY3V0IGFyZSBkaXNjYXJkZWQ7IHRoZSBzZXJ2ZXIgd2lsbCByZXNlbmQgdGhlXG4gKiBpbi1mbGlnaHQgY2h1bmsgaW4gZnVsbCBmcm9tIHRoZSBuZXcgc3RhcnRJbmRleC5cbiAqXG4gKiBBIGNsZWFuIHVwc3RyZWFtIGNsb3NlIChFT0Ygd2l0aCBubyBlcnJvcikgaXMgTk9UIHRydXN0ZWQgYXMgY29tcGxldGlvblxuICogb24gaXRzIG93bjogc29tZSB0cmFuc3BvcnQgcGF0aHMgbm9ybWFsaXplIGEgbWlkLXN0cmVhbSBhYm9ydCBpbnRvIGFcbiAqIGdyYWNlZnVsIGVuZCAob2JzZXJ2ZWQgaW4gcHJvZHVjdGlvbiBvbiBWZXJjZWwgcmVzcG9uc2Ugc3RyZWFtaW5nLCB3aGVyZVxuICogdGhlIHNlcnZlcidzIG1heC1kdXJhdGlvbiBhYm9ydCBhcnJpdmVzIGF0IHRoZSBjbGllbnQgYXMgYSBjbGVhbiBFT0YpLlxuICogT24gRU9GIHRoZSB3cmFwcGVyIHZlcmlmaWVzIGFnYWluc3QgdGhlIHN0cmVhbSdzIGF1dGhvcml0YXRpdmUgbWV0YWRhdGFcbiAqIChgc3RyZWFtcy5nZXRJbmZvYCkgdGhhdCB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlIEFORCB0aGF0IGV2ZXJ5IGNodW5rIHVwIHRvXG4gKiBgZG9uZWAgd2FzIGRlbGl2ZXJlZDsgb3RoZXJ3aXNlIGl0IHJlY29ubmVjdHMgZnJvbSB0aGUgbmV4dCBjaHVuayBleGFjdGx5XG4gKiBsaWtlIGFuIGVycm9yZWQgY29ubmVjdGlvbi4gSWYgdGhlIG1ldGFkYXRhIHJlYWQgaXRzZWxmIGZhaWxzLCB0aGUgRU9GIGlzXG4gKiB0cnVzdGVkIChsZWdhY3kgYmVoYXZpb3IpIHJhdGhlciB0aGFuIGZhaWxpbmcgYSByZWFkIHRoYXQgbWF5IHdlbGwgYmVcbiAqIGNvbXBsZXRlLlxuICpcbiAqIE5lZ2F0aXZlIGBzdGFydEluZGV4YCB2YWx1ZXMgKGxhc3QtTiBzZW1hbnRpY3MpIHNraXAgdGhlIHJlY29ubmVjdFxuICogbWFjaGluZXJ5IGJlY2F1c2Ugd2UgY2Fubm90IGNvbXB1dGUgYW4gYWJzb2x1dGUgcmVzdW1lIHBvc2l0aW9uIHdpdGhvdXRcbiAqIGEgdGFpbC1pbmRleCBsb29rdXA7IHRoZSByZXR1cm5lZCBzdHJlYW0gYmVoYXZlcyBhcyBhIHNpbmdsZS1zaG90IHJlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW0oXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlclxuKTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICBjb25zdCByZWNvbm5lY3RTdXBwb3J0ZWQgPSBzdGFydEluZGV4ID09PSB1bmRlZmluZWQgfHwgc3RhcnRJbmRleCA+PSAwO1xuICBsZXQgY3VycmVudFN0YXJ0SW5kZXggPSBzdGFydEluZGV4ID8/IDA7XG4gIGxldCBjb25zdW1lZEZyYW1lcyA9IDA7XG4gIGxldCByZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCB0b3RhbFJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkO1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gIC8vIFJlYWQgdGVsZW1ldHJ5IChzYW1lIHNlbWFudGljcyBhcyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKTpcbiAgLy8gZGlzcGF0Y2ggdGltZSwgZmlyc3QtY29ubmVjdCBkdXJhdGlvbiwgZmlyc3QtZnJhbWUgbGF0Y2gsIGFuZCB0b3RhbHMuXG4gIGxldCByZWFkU3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbm5lY3RNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RDaHVua1JlcG9ydGVkID0gZmFsc2U7XG4gIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICBsZXQgYnl0ZXNEZWxpdmVyZWQgPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVTdGFydEluZGV4ID0gcmVjb25uZWN0U3VwcG9ydGVkXG4gICAgICA/IGN1cnJlbnRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNcbiAgICAgIDogc3RhcnRJbmRleDtcbiAgICBjb25zdCBjb25uZWN0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KHJ1bklkLCBuYW1lLCBlZmZlY3RpdmVTdGFydEluZGV4KTtcbiAgICBpZiAoY29ubmVjdE1zID09PSB1bmRlZmluZWQpIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gdXBzdHJlYW0gRU9GIHJlcHJlc2VudHMgZ2VudWluZSBjb21wbGV0aW9uOiB0aGUgc3RyZWFtJ3NcbiAgICogYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YSBzYXlzIGl0IGlzIGRvbmUgQU5EIHRoZSBmcmFtZXMgZGVsaXZlcmVkIHNvIGZhclxuICAgKiBjb3ZlciBldmVyeSBjaHVuayB1cCB0byB0aGUgdGFpbCAob25lIG91dGVyIGZyYW1lID09IG9uZSBzZXJ2ZXIgY2h1bmspLlxuICAgKiBBIG1ldGFkYXRhIGZhaWx1cmUgdHJ1c3RzIHRoZSBFT0YsIHNpbmNlIHR1cm5pbmcgYSBoZWFsdGh5IGNvbXBsZXRpb25cbiAgICogaW50byBhbiBlcnJvciAob3IgYSByZWNvbm5lY3QgbG9vcCkgb24gYSB0cmFuc2llbnQgbWV0YWRhdGEgYmxpcCB3b3VsZFxuICAgKiBiZSB3b3JzZSB0aGFuIHRoZSBsZWdhY3kgYmVoYXZpb3IgdGhpcyBjaGVjayBndWFyZHMgYWdhaW5zdC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGlzVmVyaWZpZWRDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldEluZm8ocnVuSWQsIG5hbWUpO1xuICAgICAgcmV0dXJuIGluZm8uZG9uZSAmJiBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzID4gaW5mby50YWlsSW5kZXg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJlYWRlcikge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQWR2YW5jZSB0aGUgcmVzdW1lIHBvc2l0aW9uIHBhc3QgdGhlIGZyYW1lcyBhbHJlYWR5IGRlbGl2ZXJlZCwgdGhlblxuICAgIC8vIGRyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXM6IHRoZSByZW9wZW5lZCBjb25uZWN0aW9uIHJlLXNlbmRzIGZyb20gYVxuICAgIC8vIGZyYW1lIGJvdW5kYXJ5IGF0IHRoZSBuZXcgaW5kZXguXG4gICAgY3VycmVudFN0YXJ0SW5kZXggKz0gY29uc3VtZWRGcmFtZXM7XG4gICAgY29uc3VtZWRGcmFtZXMgPSAwO1xuICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gICAgLy8gUmV0cnkgdGhlIHJlb3BlbiBpdHNlbGYgYWdhaW5zdCB0aGUgcmVjb25uZWN0IGJ1ZGdldC4gQSB0cmFuc2llbnRcbiAgICAvLyBmYWlsdXJlIG9mIGNvbm5lY3QoKSAodGhlIHNlcnZlciBicmllZmx5IHVuYXZhaWxhYmxlIGR1cmluZyB0aGVcbiAgICAvLyByZWNvbm5lY3Qgd2luZG93KSBpcyB0aGUgZXhhY3QgYmxpcCB0aGlzIHdyYXBwZXIgZXhpc3RzIHRvIHN1cnZpdmUsIHNvXG4gICAgLy8gY291bnQgaXQgYWdhaW5zdCB0aGUgYnVkZ2V0IGFuZCB0cnkgYWdhaW4gcmF0aGVyIHRoYW4gdHJlYXRpbmcgaXQgYXNcbiAgICAvLyBmYXRhbC4gT25seSBidWRnZXQgZXhoYXVzdGlvbiAoYSBzZXJ2ZXIgdGhhdCBzdGF5cyBkb3duKSB0ZXJtaW5hdGVzIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBjb25zdCBtYXhSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cygpO1xuICAgIGNvbnN0IG1heFRvdGFsUmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cygpO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHJlY29ubmVjdENvdW50Kys7XG4gICAgICB0b3RhbFJlY29ubmVjdENvdW50Kys7XG4gICAgICBpZiAocmVjb25uZWN0Q291bnQgPiBtYXhSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbFJlY29ubmVjdENvdW50ID4gbWF4VG90YWxSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gdG90YWwgcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFRvdGFsUmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBSZXRlbnRpb24gZXhwaXJ5IGlzIHRlcm1pbmFsIGFuZCByZXRyeWluZyBjYW5ub3QgcmVzdG9yZSB0aGUgc3RyZWFtLlxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgdHlwZWQgZXJyb3IgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB0dXJuaW5nIG9uZSA0MTAgaW50b1xuICAgICAgICAvLyA1MCByZWNvbm5lY3QgYXR0ZW1wdHMgYW5kIGEgZ2VuZXJpYyBidWRnZXQtZXhoYXVzdGlvbiBlcnJvci5cbiAgICAgICAgaWYgKFN0cmVhbUV4cGlyZWRFcnJvci5pcyhlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAvLyBSZW9wZW4gZmFpbGVkIHRyYW5zaWVudGx5OyBsb29wIHRvIHJldHJ5LCBjb3VudGluZyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBidWRnZXQgc28gYSBzZXJ2ZXIgdGhhdCBuZXZlciByZWNvdmVycyBzdGlsbCB0ZXJtaW5hdGVzIHRoZSBzdHJlYW0uXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIExvb3AgdW50aWwgd2UgZW1pdCBzb21ldGhpbmcsIGhpdCBFT0YsIG9yIGZhdGFsbHkgZXJyb3IuIFJlYWRzIHRoYXRcbiAgICAgIC8vIG9ubHkgZXh0ZW5kIHRoZSBpbi1mbGlnaHQtZnJhbWUgYnVmZmVyIGRvbid0IGVucXVldWUgYW55dGhpbmc7IHdlXG4gICAgICAvLyBrZWVwIHJlYWRpbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGVtcHR5LWhhbmRlZC5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHsgZG9uZTogYm9vbGVhbjsgdmFsdWU/OiBVaW50OEFycmF5IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBjb25uZWN0KCkgZ3VhcmFudGVlcyByZWFkZXJcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkZXIhLnJlYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFyZWNvbm5lY3RTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlY29ubmVjdEVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSB8fCAhcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIC8vIEEgY2xlYW4gRU9GIGlzIG9ubHkgdHJ1c3R3b3J0aHkgaWYgdGhlIHN0cmVhbSBpcyBhY3R1YWxseVxuICAgICAgICAgIC8vIGNvbXBsZXRlIGFuZCB0aGlzIHNlc3Npb24gZGVsaXZlcmVkIGV2ZXJ5IGNodW5rIHVwIHRvIGBkb25lYC5cbiAgICAgICAgICAvLyBJbmZyYXN0cnVjdHVyZSBjYW4gbm9ybWFsaXplIGEgbWlkLXN0cmVhbSBhYm9ydCBpbnRvIGEgZ3JhY2VmdWxcbiAgICAgICAgICAvLyBlbmQgKHRoZSBzZXJ2ZXIncyBtYXgtZHVyYXRpb24gY3V0IGlzIGRlc2lnbmVkIHRvIGFycml2ZSBhcyBhblxuICAgICAgICAgIC8vIGVycm9yZWQgYm9keSwgYnV0IG9uIHNvbWUgcGF0aHMgaXQgcmVhY2hlcyB0aGUgY2xpZW50IGFzIGEgY2xlYW5cbiAgICAgICAgICAvLyBFT0YpLCBhbmQgYSBjb21wbGV0ZWQgc3RyZWFtIGNhbiBzdGlsbCBiZSBjdXQgbWlkLWJvZHk7IGJvdGhcbiAgICAgICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYmUgc2lsZW50bHkgcmVhZCBhcyBhIHNob3J0ZXIsIGNvbXBsZXRlIHN0cmVhbS5cbiAgICAgICAgICBpZiAocmVjb25uZWN0U3VwcG9ydGVkICYmICEoYXdhaXQgaXNWZXJpZmllZENvbXBsZXRlKCkpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCByZWNvbm5lY3QoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlY29ubmVjdEVycikge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKHJlY29ubmVjdEVycik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBHZW51aW5lIGVuZC1vZi1zdHJlYW0uIERyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXMgKHRoZXJlXG4gICAgICAgICAgLy8gc2hvdWxkbid0IGJlIGFueTsgYSB3ZWxsLWZvcm1lZCBzdHJlYW0gZW5kcyBvbiBhIGZyYW1lIGJvdW5kYXJ5KS5cbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgdG90YWxSZWNvbm5lY3RDb3VudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGVuZCB0byBidWZmZXIgYW5kIGVtaXQgYWxsIGNvbXBsZXRlIGZyYW1lcy5cbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmIChpbmNvbWluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgaW5jb21pbmcubGVuZ3RoKTtcbiAgICAgICAgICBjb21iaW5lZC5zZXQoYnVmZmVyLCAwKTtcbiAgICAgICAgICBjb21iaW5lZC5zZXQoaW5jb21pbmcsIGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICAgIGJ1ZmZlciA9IGNvbWJpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcbiAgICAgICAgICAvLyBGb3J3YXJkIHRoZSBlbnRpcmUgZnJhbWVkIGNodW5rIChoZWFkZXIgKyBwYXlsb2FkKSB0byB0aGVcbiAgICAgICAgICAvLyBkb3duc3RyZWFtIGRlc2VyaWFsaXplciwgd2hpY2ggYWxyZWFkeSBleHBlY3RzIHRoaXMgbGF5b3V0LlxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoMCwgdG90YWwpKTtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgICAgIGNvbnN1bWVkRnJhbWVzKys7XG4gICAgICAgICAgY2h1bmtzRGVsaXZlcmVkKys7XG4gICAgICAgICAgYnl0ZXNEZWxpdmVyZWQgKz0gdG90YWw7XG4gICAgICAgICAgaWYgKCFmaXJzdENodW5rUmVwb3J0ZWQgJiYgcmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpcnN0Q2h1bmtSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgY29ubmVjdE1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWl0dGVkKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBwcm9ncmVzcyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uOiBjbGVhciB0aGVcbiAgICAgICAgICAvLyBjb25zZWN1dGl2ZS1mYWlsdXJlIGJ1ZGdldCBzbyBhIGxvbmcgc3RyZWFtIHRoYXQgcmVjb25uZWN0c1xuICAgICAgICAgIC8vIG1hbnkgdGltZXMgKGJ1dCBrZWVwcyBkZWxpdmVyaW5nKSBpcyBuZXZlciBmYWxzZWx5IGNhcHBlZC5cbiAgICAgICAgICByZWNvbm5lY3RDb3VudCA9IDA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgcGFydGlhbCBieXRlczogcmVhZCBtb3JlLlxuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBjbG9zaW5nIFJlYWRhYmxlU3RyZWFtIHJlYWRlcjonLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZ3JvdXAtY29tbWl0IHdpbmRvdyBmb3IgdGhlIExFQURJTkcgY2h1bmsgb2YgYW4gaWRsZSBzdHJlYW0uXG4gKlxuICogMCA9IGRpc3BhdGNoIHRoZSBmaXJzdCBjaHVuayBpbW1lZGlhdGVseS4gTWVhc3VyZWQgcHJvZHVjdGlvbiBwcm9kdWNlclxuICogcmF0ZXMgKG1vc3QgYWdlbnRzOiB+MS4yIGNodW5rcyBwZXIgZmx1c2gsID43MCUgb2YgY2h1bmtzIGFycml2aW5nIG1vcmVcbiAqIHRoYW4gMTBtcyBhZnRlciB0aGUgcHJldmlvdXMgcmVxdWVzdCBhbHJlYWR5IGZpbmlzaGVkKSBzaG93IGEgZml4ZWRcbiAqIGxlYWRpbmctZWRnZSB3aW5kb3cgdGF4ZXMgaXNvbGF0ZWQtY2h1bmsgZGVsaXZlcnkgKH4rMjAlIG9uIGEgfjUwbXMgUlRUKVxuICogd2hpbGUgYmF0Y2hpbmcgYWxtb3N0IG5vdGhpbmcgZm9yIHNsb3cgcHJvZHVjZXJzOyBmYXN0IHByb2R1Y2VycyBnZXRcbiAqIHRoZWlyIGJhdGNoaW5nIGZyb20gaW4tZmxpZ2h0IGFjY3VtdWxhdGlvbiByZWdhcmRsZXNzLiBTZXR0aW5nIGEgcG9zaXRpdmVcbiAqIGludGVydmFsIChlbnYgb3IgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2ApIG9wdHMgYSBkZXBsb3ltZW50IGludG9cbiAqIHdpbmRvd2VkIGxlYWRpbmctZWRnZSBiYXRjaGluZywgdHJhZGluZyBmaXJzdC1jaHVuayBsYXRlbmN5IGZvciBsYXJnZXJcbiAqIGdyb3Vwcy5cbiAqL1xuY29uc3QgU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TID0gMDtcblxuLyoqXG4gKiBgV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TYCwgd2hlbiBzZXQsIG92ZXJyaWRlc1xuICogYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2A7IHdoZW4gdW5zZXQgdGhlIFdvcmxkIG9wdGlvbiAob3IgdGhlXG4gKiBkZWZhdWx0KSBnb3Zlcm5zLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciB1bnNldC9pbnZhbGlkIHZhbHVlcyBzbyB0aGVcbiAqIGNhbGxlciBjYW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBXb3JsZCBvcHRpb24uXG4gKi9cbmNvbnN0IGdldEVudlN0cmVhbUZsdXNoSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TJywgTnVtYmVyLk5hTiwge1xuICAgIGludGVnZXI6IHRydWUsXG4gIH0pO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xufTtcblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3Igb25lIGZsdXNoZWQgYmF0Y2ggb2Ygc3RyZWFtIHdyaXRlczogZmlyc3RcbiAqIGB3cml0ZSgpYCBvZiB0aGUgYmF0Y2ggKGBzdGFydEVwb2NoTXNgKSDihpIgdGhlIHNlcnZlciB3cml0ZSBzZXR0bGluZy4gVGhlXG4gKiBzcGFuJ3MgZHVyYXRpb24gaXMgdGhlcmVmb3JlIHRoZSBhcHAtcGVyY2VpdmVkIGxhdGVuY3kgb2YgdGhlIGJhdGNoXG4gKiAoYnVmZmVyIGR3ZWxsICsgYmFja3ByZXNzdXJlICsgUlBDKTsgYGJ1ZmZlcl9kd2VsbF9tc2AgaXNvbGF0ZXMgdGhlXG4gKiBwcmUtZGlzcGF0Y2ggc2hhcmUgc28gY2xpZW50LXNpZGUgYmF0Y2hpbmcgY29zdCBjYW4gYmUgdG9sZCBhcGFydCBmcm9tXG4gKiBuZXR3b3JrL3NlcnZlciB0aW1lLiBOYW1lZCBgd29ya2Zsb3cuc3RyZWFtLmZsdXNoYDsgdGhlIHBlci1yZXF1ZXN0IFJQQ1xuICogYmVuZWF0aCBpdCBpcyB3b3JsZC12ZXJjZWwncyBgd29ya2Zsb3cuc3RyZWFtLndyaXRlYCBzcGFuIChjaHVua19ydHQpLCBhbmRcbiAqIHRoZSB0d28gbXVzdCBzdGF5IGRpc3Rpbmd1aXNoYWJsZS4gRmlyZS1hbmQtZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbVdyaXRlRmx1c2goXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBkaXNwYXRjaEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICBycGNNczogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0uZmx1c2gnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdmbHVzaCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guYnVmZmVyX2R3ZWxsX21zJzogZGlzcGF0Y2hFcG9jaE1zIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmZsdXNoLmNodW5rcyc6IGNodW5rQ291bnQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guYnl0ZXMnOiBieXRlQ291bnQsXG4gICAgICAgIC8vIENsaWVudC1vYnNlcnZlZCBXb3JsZCB3cml0ZSBSUEMgZHVyYXRpb24gKG5ldHdvcmsgaG9wIGluY2x1ZGVkKS5cbiAgICAgICAgLy8gU2FtZSBrZXkgYXMgd29ybGQtdmVyY2VsJ3MgcGVyLXJlcXVlc3Qgc3BhbiBhdHRyaWJ1dGUgc28gcXVlcmllc1xuICAgICAgICAvLyB3b3JrIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGF5ZXIgZW1pdHRlZCBpdC5cbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS53cml0ZS5jaHVua19ydHQnOiBycGNNcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHNwYW4gZm9yIHRoZSBzdHJlYW0tY2xvc2UgUlBDOiBpdHMgZHVyYXRpb24gaXMgdGhlXG4gKiBgd29ybGQuc3RyZWFtcy5jbG9zZWAgcm91bmQgdHJpcCAobmV0d29yayBob3AgaW5jbHVkZWQpLiBGaXJlLWFuZC1mb3JnZXQ7XG4gKiBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbUNsb3NlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0uY2xvc2UnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdjbG9zZScsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uY2xvc2UucnBjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtIGV4dGVuZHMgV3JpdGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICAvKipcbiAgICogQHBhcmFtIHJ1blJlYWR5QmFycmllciBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlXG4gICAqIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gdGhlIHN0ZXAgYm9keSBydW5zXG4gICAqIG9wdGltaXN0aWNhbGx5IChiZWZvcmUgYHJ1bl9zdGFydGVkYCBpcyBkdXJhYmxlKSwgdGhlIGZpcnN0IGNodW5rIHdyaXRlIHRvXG4gICAqIGEgYnJhbmQtbmV3IHN0cmVhbSB3b3VsZCBvdGhlcndpc2UgcmVhY2ggdGhlIFdvcmxkIGJlZm9yZSB0aGUgcnVuIGV4aXN0c1xuICAgKiBhbmQgYmUgcmVqZWN0ZWQgYXMgcnVuLW5vdC1mb3VuZC4gQXdhaXRpbmcgdGhpcyBvbmNlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogZmx1c2gvY2xvc2Ugb3JkZXJzIHRoZSB3cml0ZSBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIGB1bmRlZmluZWRgIG91dHNpZGVcbiAgICogdHVyYm8gYW5kIG9uIHRoZSBhd2FpdCBwYXRoLCB3aGVyZSB0aGUgcnVuIHdhcyBhbHJlYWR5IGR1cmFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICBpZiAodHlwZW9mIHJ1bklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgXCJydW5JZFwiIG11c3QgYmUgYSBzdHJpbmcsIGdvdCBcIiR7dHlwZW9mIHJ1bklkfVwiYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKGBcIm5hbWVcIiBpcyByZXF1aXJlZCwgZ290IFwiJHtuYW1lfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IHdvcmxkUHJvbWlzZSA9IGdldFdvcmxkTGF6eSgpO1xuXG4gICAgLy8gSG9sZCB0aGUgZmlyc3Qgc2VydmVyIHdyaXRlIHVudGlsIHRoZSBydW4gZXhpc3RzICh0dXJibyBvcHRpbWlzdGljXG4gICAgLy8gc3RhcnQpLiBBd2FpdGVkIG9uY2UsIHRoZW4gY2xlYXJlZCBzbyBsYXRlciBmbHVzaGVzIHBheSBub3RoaW5nLiBUaGVcbiAgICAvLyByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvciBvcmRlcmluZyBvbmx5OiBpZiBgcnVuX3N0YXJ0ZWRgIHRydWx5IGZhaWxlZFxuICAgIC8vIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSB3cml0ZSBiZWxvdyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvci5cbiAgICBsZXQgcGVuZGluZ1J1blJlYWR5OiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkID0gcnVuUmVhZHlCYXJyaWVyO1xuICAgIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKHBlbmRpbmdSdW5SZWFkeSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHBlbmRpbmdSdW5SZWFkeTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSwgc2VlIGFib3ZlLlxuICAgICAgICB9XG4gICAgICAgIHBlbmRpbmdSdW5SZWFkeSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gR3JvdXAtY29tbWl0IGJ1ZmZlcmluZy5cbiAgICAvL1xuICAgIC8vIGB3cml0ZSgpYCByZXNvbHZlcyBhcyBzb29uIGFzIHRoZSBjaHVuayBlbnRlcnMgdGhpcyBib3VuZGVkIGJ1ZmZlcixcbiAgICAvLyBOT1Qgd2hlbiBpdCBpcyBkdXJhYmxlLiBUaGF0IGlzIHRoZSBwcm9wZXJ0eSB0aGF0IG1ha2VzIGJhdGNoaW5nXG4gICAgLy8gcGF0aC1pbmRlcGVuZGVudDogYSBuYXRpdmUgYHJlYWRhYmxlLnBpcGVUbyhzZXJ2ZXJXcml0YWJsZSlgIHB1bGxzIHRoZVxuICAgIC8vIG5leHQgY2h1bmsgdGhlIG1vbWVudCBgd3JpdGUoKWAgcmVzb2x2ZXMsIHNvIGNodW5rcyBhY2N1bXVsYXRlIGhlcmVcbiAgICAvLyBkdXJpbmcgdGhlIGZsdXNoLXRpbWVyIHdpbmRvdyBhbmQgd2hpbGUgYSBzZXJ2ZXIgcmVxdWVzdCBpcyBpblxuICAgIC8vIGZsaWdodCwgYW5kIGVhY2ggYWNjdW11bGF0ZWQgZ3JvdXAgZ29lcyBvdXQgYXMgb25lIGB3cml0ZU11bHRpYC5cbiAgICAvLyAoUHJldmlvdXNseSBgd3JpdGUoKWAgcmVzb2x2ZWQgb25seSBhZnRlciB0aGUgdGltZXIgQU5EIHRoZSBzZXJ2ZXJcbiAgICAvLyByb3VuZCB0cmlwLCBzbyBuYXRpdmUgcGlwaW5nIHNlcmlhbGl6ZWQgdG8gb25lIHJlcXVlc3QgcGVyIGNodW5rIGFuZFxuICAgIC8vIGJhdGNoaW5nIG9ubHkgd29ya2VkIHRocm91Z2ggYGZsdXNoYWJsZVBpcGVgJ3MgYmVzcG9rZSBjb2FsZXNjaW5nLilcbiAgICAvL1xuICAgIC8vIER1cmFiaWxpdHkgaGFzIGEgZGVkaWNhdGVkIGJhcnJpZXIgaW5zdGVhZDogYGRyYWluKClgIChleHBvc2VkIHZpYVxuICAgIC8vIHtAbGluayBTVFJFQU1fRFJBSU5fU1lNQk9MfSkgcmVzb2x2ZXMgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZW1wdHlcbiAgICAvLyBhbmQgbm8gcmVxdWVzdCBpcyBpbiBmbGlnaHQuIGBjbG9zZSgpYCBhd2FpdHMgaXQgYmVmb3JlIGNsb3NpbmcgdGhlXG4gICAgLy8gc2VydmVyIHN0cmVhbSwgYW5kIHRoZSBmbHVzaGFibGUtc3RyZWFtIGxvY2stcmVsZWFzZSBjb21wbGV0aW9uXG4gICAgLy8gYXdhaXRzIGl0IGJlZm9yZSBsZXR0aW5nIGEgc3RlcCBmaW5pc2gsIHNvIFwic3RlcCBjb21wbGV0ZWRcIiBzdGlsbFxuICAgIC8vIGltcGxpZXMgXCJzdHJlYW0gZGF0YSBkdXJhYmxlXCIsIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIC8vXG4gICAgLy8gRW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlIGZyYW1pbmcgbGV2ZWwgYnlcbiAgICAvLyBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0sIG5vdCBoZXJlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGxldCBidWZmZXJCeXRlcyA9IDA7XG4gICAgLy8gVGhlIGdyb3VwIGN1cnJlbnRseSBpbnNpZGUgYSBzZXJ2ZXIgcmVxdWVzdC4gQ291bnRlZCBhZ2FpbnN0IHRoZVxuICAgIC8vIGJ1ZmZlciBib3VuZCBzbyBgV09SS0ZMT1dfU1RSRUFNX01BWF9JTkZMSUdIVF9DSFVOS1NgIGtlZXBzIGl0c1xuICAgIC8vIGRvY3VtZW50ZWQgbWVhbmluZyAoYW4gdXBwZXIgYm91bmQgYWNyb3NzIEFMTCByZWFkLWJ1dC1ub3QtZHVyYWJsZVxuICAgIC8vIGNodW5rcyksIG5vdCBqdXN0IHRoZSBxdWV1ZWQgZm9sbG93LXVwIGdyb3VwLlxuICAgIGxldCBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgbGV0IGluRmxpZ2h0Qnl0ZXMgPSAwO1xuICAgIGxldCBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIC8qKiBUaGUgaW4tZmxpZ2h0IGRpc3BhdGNoIGNoYWluLiBBdCBtb3N0IG9uZSwgcHJlc2VydmluZyBjaHVuayBvcmRlci4gKi9cbiAgICBsZXQgaW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGlja3kgZmFpbHVyZTogb25jZSBhIGRpc3BhdGNoIGZhaWxzLCB0aGUgZmFpbGVkIGdyb3VwIGlzIHJlLXF1ZXVlZFxuICAgICAqIChyZXRhaW5lZCwgZXhhY3RseSBhcyB0aGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gcmV0YWluZWQgaXRzIGJ1ZmZlcilcbiAgICAgKiBhbmQgZXZlcnkgc3Vic2VxdWVudCBgd3JpdGUoKWAsIGBjbG9zZSgpYCBhbmQgYGRyYWluKClgIHJlamVjdHMgd2l0aFxuICAgICAqIHRoZSBvcmlnaW5hbCBlcnJvci4gQ2h1bmtzIHdob3NlIGB3cml0ZSgpYCBhbHJlYWR5IHJlc29sdmVkIHN1cmZhY2VcbiAgICAgKiB0aGVpciBmYWlsdXJlIGF0IHRoZSBkdXJhYmlsaXR5IGJhcnJpZXI6IHRoYXQgaXMgdGhlIGNvbnRyYWN0IG9mIGFuXG4gICAgICogZWFybHktYWNrIHNpbmsuXG4gICAgICovXG4gICAgbGV0IHNpbmtFcnJvcjogdW5rbm93bjtcbiAgICAvLyBHcm91cC1jb21taXQgd2luZG93LiBUaGUgZW52IHZhciwgd2hlbiBzZXQsIG92ZXJyaWRlcyB0aGUgV29ybGRcbiAgICAvLyBvcHRpb247IG90aGVyd2lzZSBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYCBnb3Zlcm5zIChkZWZhdWx0IDApLFxuICAgIC8vIGluY2x1ZGluZyB0aGUgZmlyc3QgY2h1bmsuIFdoZW4gaXQgbXVzdCBjb21lIGZyb20gdGhlIHdvcmxkLFxuICAgIC8vIGBzY2hlZHVsZUdyb3VwQ29tbWl0YCB3YWl0cyBmb3IgYHdvcmxkUHJvbWlzZWAgYmVmb3JlIGRlY2lkaW5nLCB3aGljaFxuICAgIC8vIGNvc3RzIG5vdGhpbmc6IG5vIHJlcXVlc3QgY2FuIGxlYXZlIGJlZm9yZSBgc2VuZEdyb3VwYCdzIG93biB3b3JsZFxuICAgIC8vIGF3YWl0IGVpdGhlci5cbiAgICBsZXQgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPSBnZXRFbnZTdHJlYW1GbHVzaEludGVydmFsTXMoKTtcbiAgICBsZXQgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLy8gUGVyLXJlcXVlc3Qgd2lyZSBsaW1pdHMgKHNlcnZlciBjYXBzKSBhbmQgdGhlIGJ1ZmZlciBib3VuZC4gVGhlIGJvdW5kXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBrbm9icyB0aGUgY29hbGVzY2luZyBwaXBlIHVzZWQsIHNvIHByb2R1Y2VyIGJhY2twcmVzc3VyZVxuICAgIC8vIGJlaGF2aW9yIGlzIHVuY2hhbmdlZDogb25jZSBhIHJlcXVlc3Qtd29ydGggb2YgY2h1bmtzIChvciB0aGUgYnl0ZVxuICAgIC8vIGJvdW5kKSBpcyBidWZmZXJlZCwgYHdyaXRlKClgIGJsb2NrcyB1bnRpbCBhIGdyb3VwIGxhbmRzIGR1cmFibHkuXG4gICAgY29uc3QgbWF4Q2h1bmtzUGVyUmVxdWVzdCA9IGdldE1heENodW5rc1BlckJhdGNoKCk7XG4gICAgY29uc3QgbWF4Qnl0ZXNQZXJSZXF1ZXN0ID0gZ2V0TWF4Qnl0ZXNQZXJCYXRjaCgpO1xuICAgIGNvbnN0IG1heEJ1ZmZlcmVkQ2h1bmtzID0gZ2V0TWF4SW5mbGlnaHRDaHVua3MoKTtcbiAgICBjb25zdCBtYXhCdWZmZXJlZEJ5dGVzID0gZ2V0TWF4QnVmZmVyZWRCeXRlcygpO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCB3cml0ZS1iYXRjaCB0aW1pbmc6IHN0YW1wZWQgd2hlbiB0aGUgYnVmZmVyIGdvZXNcbiAgICAvLyBlbXB0eeKGkm5vbi1lbXB0eSwgY29uc3VtZWQgYnkgdGhlIGdyb3VwIHRoYXQgY2FycmllcyB0aGF0IGNodW5rIG91dC5cbiAgICBsZXQgYnVmZmVyVDA6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIHR5cGUgV2FpdGVyID0geyByZXNvbHZlOiAoKSA9PiB2b2lkOyByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQgfTtcbiAgICAvKiogd3JpdGUoKSBjYWxscyBibG9ja2VkIG9uIHRoZSBidWZmZXIgYm91bmQuICovXG4gICAgbGV0IGNhcGFjaXR5V2FpdGVyczogV2FpdGVyW10gPSBbXTtcbiAgICAvKiogZHJhaW4oKSBjYWxscyB3YWl0aW5nIGZvciBmdWxsIGR1cmFiaWxpdHkuICovXG4gICAgbGV0IGRyYWluV2FpdGVyczogV2FpdGVyW10gPSBbXTtcblxuICAgIGNvbnN0IHJlamVjdFdhaXRlcnMgPSAoZXJyOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBhbGwgPSBbLi4uY2FwYWNpdHlXYWl0ZXJzLCAuLi5kcmFpbldhaXRlcnNdO1xuICAgICAgY2FwYWNpdHlXYWl0ZXJzID0gW107XG4gICAgICBkcmFpbldhaXRlcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdyBvZiBhbGwpIHcucmVqZWN0KGVycik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRha2UgdGhlIGxhcmdlc3QgbGVhZGluZyBncm91cCB0aGF0IGZpdHMgb25lIHJlcXVlc3Q6IGF0IG1vc3RcbiAgICAgKiBgbWF4Q2h1bmtzUGVyUmVxdWVzdGAgY2h1bmtzIGFuZCBgbWF4Qnl0ZXNQZXJSZXF1ZXN0YCBjdW11bGF0aXZlIGJ5dGVzXG4gICAgICogKGEgc2luZ2xlIG92ZXJzaXplZCBjaHVuayBzdGlsbCBnb2VzIG91dCBhbG9uZSkuXG4gICAgICovXG4gICAgY29uc3QgdGFrZUdyb3VwID0gKCk6IHsgZ3JvdXA6IFVpbnQ4QXJyYXlbXTsgYnl0ZXM6IG51bWJlciB9ID0+IHtcbiAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICBsZXQgYnl0ZXMgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIpIHtcbiAgICAgICAgaWYgKGNvdW50ID49IG1heENodW5rc1BlclJlcXVlc3QpIGJyZWFrO1xuICAgICAgICBpZiAoY291bnQgPiAwICYmIGJ5dGVzICsgY2h1bmsuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzUGVyUmVxdWVzdCkgYnJlYWs7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJ5dGVzICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGJ1ZmZlci5zbGljZSgwLCBjb3VudCk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoY291bnQpO1xuICAgICAgYnVmZmVyQnl0ZXMgLT0gYnl0ZXM7XG4gICAgICByZXR1cm4geyBncm91cCwgYnl0ZXMgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggbG9vcDogd2hpbGUgY2h1bmtzIGFyZSBidWZmZXJlZCwgc2VuZCB0aGVtIGdyb3VwIGJ5IGdyb3VwLlxuICAgICAqIEV4YWN0bHkgb25lIGxvb3AgcnVucyBhdCBhIHRpbWUgKGBpbkZsaWdodGApLCBzbyBncm91cHMgcmVhY2ggdGhlXG4gICAgICogc2VydmVyIGluIHdyaXRlIG9yZGVyLiBDaHVua3MgdGhhdCBhcnJpdmUgd2hpbGUgYSBncm91cCdzIHJlcXVlc3QgaXNcbiAgICAgKiBpbiBmbGlnaHQgYWNjdW11bGF0ZSBhbmQgZm9ybSB0aGUgbmV4dCBncm91cDogdGhlIGdyb3VwLWNvbW1pdFxuICAgICAqIGJlaGF2aW9yLCBub3cgaW5kZXBlbmRlbnQgb2YgaG93IHRoZSBwcm9kdWNlciBwaXBlcy5cbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBTZW5kIG9uZSBncm91cCB0byB0aGUgc2VydmVyOiBnYXRlIG9uIHJ1biByZWFkaW5lc3MsIHRoZW4gb25lXG4gICAgICogYHdyaXRlTXVsdGlgIChvciBzZXF1ZW50aWFsIGB3cml0ZWBzIHdoZW4gdGhlIHdvcmxkIGxhY2tzIGl0KS4gRW1pdHNcbiAgICAgKiB0aGUgd3JpdGUtZmx1c2ggc3BhbjsgZHdlbGwgaXMgbWVhc3VyZWQgdXAgdG8ganVzdCBiZWZvcmUgdGhlIFJQQyBzbyBhXG4gICAgICogdHVyYm8gcnVuLXJlYWR5IGJhcnJpZXIgd2FpdCBjb3VudHMgYXMgYnVmZmVyIGR3ZWxsLCBtYXRjaGluZyB0aGVcbiAgICAgKiBwcmUtZ3JvdXAtY29tbWl0IHRlbGVtZXRyeS5cbiAgICAgKi9cbiAgICBjb25zdCBzZW5kR3JvdXAgPSBhc3luYyAoXG4gICAgICBncm91cDogVWludDhBcnJheVtdLFxuICAgICAgYnl0ZXM6IG51bWJlcixcbiAgICAgIGdyb3VwVDA6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgY29uc3QgZGlzcGF0Y2hBdCA9IERhdGUubm93KCk7XG4gICAgICBpZiAodHlwZW9mIHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aSA9PT0gJ2Z1bmN0aW9uJyAmJiBncm91cC5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aShydW5JZCwgbmFtZSwgZ3JvdXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZ3JvdXApIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChncm91cFQwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgICAgICAgICBncm91cFQwLFxuICAgICAgICAgIGRpc3BhdGNoQXQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBncm91cC5sZW5ndGgsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIGRpc3BhdGNoQXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZGlzcGF0Y2hMb29wID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwVDAgPSBidWZmZXJUMDtcbiAgICAgICAgY29uc3QgZ3JvdXBUYWtlbkF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBncm91cCwgYnl0ZXMgfSA9IHRha2VHcm91cCgpO1xuICAgICAgICBpbkZsaWdodENodW5rcyA9IGdyb3VwLmxlbmd0aDtcbiAgICAgICAgaW5GbGlnaHRCeXRlcyA9IGJ5dGVzO1xuICAgICAgICBidWZmZXJUMCA9IGJ1ZmZlci5sZW5ndGggPiAwID8gZ3JvdXBUYWtlbkF0IDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2VuZEdyb3VwKGdyb3VwLCBieXRlcywgZ3JvdXBUMCk7XG4gICAgICAgICAgaW5GbGlnaHRDaHVua3MgPSAwO1xuICAgICAgICAgIGluRmxpZ2h0Qnl0ZXMgPSAwO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFJldGFpbiB0aGUgZmFpbGVkIGdyb3VwIChhbmQgaXRzIG9yaWdpbmFsIHQwKSBhdCB0aGUgZnJvbnQgb2ZcbiAgICAgICAgICAvLyB0aGUgYnVmZmVyLCBwb2lzb24gdGhlIHNpbmssIGFuZCBzdXJmYWNlIHRoZSBmYWlsdXJlIHRvIGV2ZXJ5XG4gICAgICAgICAgLy8gYmxvY2tlZCB3cml0ZXIgYW5kIGRyYWluIHdhaXRlci5cbiAgICAgICAgICBidWZmZXIgPSBncm91cC5jb25jYXQoYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXJCeXRlcyArPSBieXRlcztcbiAgICAgICAgICBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgICAgICAgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgICAgICAgYnVmZmVyVDAgPVxuICAgICAgICAgICAgZ3JvdXBUMCAhPT0gdW5kZWZpbmVkICYmIGJ1ZmZlclQwICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBNYXRoLm1pbihncm91cFQwLCBidWZmZXJUMClcbiAgICAgICAgICAgICAgOiAoZ3JvdXBUMCA/PyBidWZmZXJUMCk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGdyb3VwIGlzIGR1cmFibGU6IHJlbGlldmUgd3JpdGVycyBibG9ja2VkIG9uIHRoZSBib3VuZCAodGhleVxuICAgICAgICAvLyByZS1jaGVjayBpdCBhbmQgbWF5IGJsb2NrIGFnYWluKS5cbiAgICAgICAgY29uc3QgcmVsaWV2ZWQgPSBjYXBhY2l0eVdhaXRlcnM7XG4gICAgICAgIGNhcGFjaXR5V2FpdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgcmVsaWV2ZWQpIHcucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogU3RhcnQgKG9yIGpvaW4pIHRoZSBkaXNwYXRjaCBjaGFpbi4gTmV2ZXIgbGVhdmVzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uICovXG4gICAgY29uc3Qgc3RhcnREaXNwYXRjaCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChpbkZsaWdodCB8fCBzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCB8fCBidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpbkZsaWdodCA9IGRpc3BhdGNoTG9vcCgpLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpbkZsaWdodCA9IG51bGw7XG4gICAgICAgICAgLy8gQSB3cml0ZSBjYW4gbGFuZCBpbiB0aGUgbWljcm90YXNrIGdhcCBiZXR3ZWVuIHRoZSBsb29wJ3NcbiAgICAgICAgICAvLyBlbXB0eS1idWZmZXIgZXhpdCBhbmQgdGhpcyByZWFjdGlvbi4gc2NoZWR1bGVHcm91cENvbW1pdCBzYXdcbiAgICAgICAgICAvLyBpbkZsaWdodCBzdGlsbCBzZXQgYW5kIGFybWVkIG5vIHRpbWVyLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAgICAgICAvLyB0aGUgY2h1bmsgd291bGQgc2l0IHN0cmFuZGVkIHVudGlsIGEgbGF0ZXIgd3JpdGUvY2xvc2UvZHJhaW4uXG4gICAgICAgICAgLy8gVHJlYXQgaXQgbGlrZSBhbiBpbi1yZXF1ZXN0IGFycml2YWw6IGRpc3BhdGNoIGltbWVkaWF0ZWx5ICh0aGVcbiAgICAgICAgICAvLyBuZXcgY2hhaW4gc2V0dGxlcyB0aGUgZHJhaW4gd2FpdGVycyB3aGVuIGl0IGZpbmlzaGVzKS5cbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRnVsbHkgaWRsZSAodGhlIGxvb3Agb25seSBleGl0cyB3aXRoIGFuIGVtcHR5IGJ1ZmZlcik6IHNldHRsZVxuICAgICAgICAgIC8vIHRoZSBkdXJhYmlsaXR5IGJhcnJpZXIuXG4gICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGRyYWluV2FpdGVycztcbiAgICAgICAgICBkcmFpbldhaXRlcnMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygc2V0dGxlZCkgdy5yZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgICBzaW5rRXJyb3IgPz89IGVycm9yO1xuICAgICAgICAgIHJlamVjdFdhaXRlcnMoc2lua0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTGVhZGluZy1lZGdlIGRpc3BhdGNoIHBvbGljeSBmb3IgYW4gaWRsZSBzaW5rOlxuICAgICAqIC0gd2luZG93IDw9IDAgKHRoZSBkZWZhdWx0KTogZGlzcGF0Y2ggdGhlIGxlYWRpbmcgY2h1bmsgaW1tZWRpYXRlbHkuXG4gICAgICogICBGYXN0IHByb2R1Y2VycyBzdGlsbCBiYXRjaCB2aWEgaW4tZmxpZ2h0IGFjY3VtdWxhdGlvbjogY2h1bmtzXG4gICAgICogICBhcnJpdmluZyBkdXJpbmcgdGhlIHJlcXVlc3QgZm9ybSB0aGUgbmV4dCBncm91cC4gVGhlIHRyYWRlIGZvciBhblxuICAgICAqICAgaWRsZSBidXJzdCBpcyBvbmUgZXh0cmEgcmVxdWVzdCAoYSAzMC1jaHVuayBidXJzdCBzaGlwcyBhcyAxICsgMjlcbiAgICAgKiAgIGluc3RlYWQgb2Ygb25lIDMwLWNodW5rIGdyb3VwIHVuZGVyIGEgcG9zaXRpdmUgd2luZG93KSBpbiBleGNoYW5nZVxuICAgICAqICAgZm9yIHplcm8gZml4ZWQgZmlyc3QtY2h1bmsgZGVsYXksIHdoaWNoIG1hdGNoZXMgbWVhc3VyZWQgcHJvZHVjZXJcbiAgICAgKiAgIGJlaGF2aW9yLCB3aGVyZSBpc29sYXRlZCBjaHVua3MgZG9taW5hdGUuXG4gICAgICogLSB3aW5kb3cgPiAwIChleHBsaWNpdGx5IGNvbmZpZ3VyZWQpOiBhcm0gdGhlIGdyb3VwLWNvbW1pdCB0aW1lciBzb1xuICAgICAqICAgdGhlIGxlYWRpbmcgY2h1bmsgd2FpdHMgdXAgdG8gdGhlIHdpbmRvdyBjb2xsZWN0aW5nIGEgZ3JvdXAsXG4gICAgICogICB0aGUgb3B0LWluIHRyYWRlIGZvciBzbG93LWJ1dC1zdGVhZHkgcHJvZHVjZXJzLlxuICAgICAqIFdpbmRvdyByZXNvbHV0aW9uOiBgV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TYCwgd2hlbiBzZXQsXG4gICAgICogb3ZlcnJpZGVzIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgOyBvdGhlcndpc2UgdGhlIFdvcmxkIG9wdGlvblxuICAgICAqIChkZWZhdWx0IDApIGdvdmVybnMsIGluY2x1ZGluZyB0aGUgZmlyc3QgY2h1bmsuIERlY2lkaW5nIG1heVxuICAgICAqIGhhdmUgdG8gd2FpdCBmb3IgdGhlIHdvcmxkIHRvIHJlc29sdmU7IHRoYXQgYWRkcyBubyBsYXRlbmN5IGJlY2F1c2VcbiAgICAgKiBgc2VuZEdyb3VwYCBhd2FpdHMgdGhlIHNhbWUgcHJvbWlzZSBiZWZvcmUgYW55IHJlcXVlc3QgbGVhdmVzLlxuICAgICAqL1xuICAgIGNvbnN0IHNjaGVkdWxlR3JvdXBDb21taXQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZmx1c2hUaW1lciB8fCBpbkZsaWdodCkgcmV0dXJuO1xuICAgICAgaWYgKHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUHJvbWlzZS5yZXNvbHZlOiBldmVyeXdoZXJlIGVsc2UgdGhlIHdvcmxkIGlzIG9ubHkgZXZlciBhd2FpdGVkLFxuICAgICAgICAvLyB3aGljaCB0b2xlcmF0ZXMgYSBzeW5jaHJvbm91cyB2YWx1ZSAodGVzdHMgc3R1YiBnZXRXb3JsZExhenkgdGhhdFxuICAgICAgICAvLyB3YXkpOyAudGhlbigpIG11c3QgYmUgZ2l2ZW4gYSByZWFsIHByb21pc2UuXG4gICAgICAgIF9mbHVzaEludGVydmFsUmVzb2x1dGlvbiA/Pz0gUHJvbWlzZS5yZXNvbHZlKHdvcmxkUHJvbWlzZSlcbiAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICh3b3JsZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9XG4gICAgICAgICAgICAgICAgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zID8/IFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFdvcmxkIHJlc29sdXRpb24gZmFpbHVyZSBzdXJmYWNlcyBvbiBkaXNwYXRjaDsgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNvIGJ1ZmZlcmVkIGNodW5rcyBzdGlsbCByZWFjaCB0aGUgZGlzcGF0Y2ggcGF0aFxuICAgICAgICAgICAgICAvLyAod2hlcmUgdGhlIGVycm9yIHBvaXNvbnMgdGhlIHNpbmspLlxuICAgICAgICAgICAgICByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9IFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmUtZXZhbHVhdGU6IHRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiBkaXNwYXRjaGVkIGJ5IGRyYWluKClcbiAgICAgICAgICAgIC8vIG9yIGEgZnVsbC1yZXF1ZXN0IGZhc3QgcGF0aCB3aGlsZSB0aGUgd29ybGQgcmVzb2x2ZWQuXG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHNjaGVkdWxlR3JvdXBDb21taXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zIDw9IDApIHtcbiAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICB9LCByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIER1cmFiaWxpdHkgYmFycmllcjogcmVzb2x2ZXMgd2hlbiBldmVyeSBhY2NlcHRlZCBjaHVuayBoYXMgcmVhY2hlZCB0aGVcbiAgICAgKiBzZXJ2ZXIgYW5kIG5vdGhpbmcgaXMgYnVmZmVyZWQgb3IgaW4gZmxpZ2h0OyByZWplY3RzIHdpdGggdGhlIHNpbmsnc1xuICAgICAqIHN0aWNreSBlcnJvciBpZiBhbnkgZGlzcGF0Y2ggZmFpbGVkLiBGbHVzaGVzIGEgcGVuZGluZyBncm91cC1jb21taXRcbiAgICAgKiB3aW5kb3cgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBvdXQgdGhlIHRpbWVyLlxuICAgICAqL1xuICAgIGNvbnN0IGRyYWluID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmICFpbkZsaWdodCkgcmV0dXJuO1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBkcmFpbldhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHN1cGVyKHtcbiAgICAgIGFzeW5jIHdyaXRlKGNodW5rKSB7XG4gICAgICAgIGlmIChzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgc2lua0Vycm9yO1xuICAgICAgICBpZiAoYnVmZmVyVDAgPT09IHVuZGVmaW5lZCkgYnVmZmVyVDAgPSBEYXRlLm5vdygpO1xuICAgICAgICBidWZmZXIucHVzaChjaHVuayk7XG4gICAgICAgIGJ1ZmZlckJ5dGVzICs9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPj0gbWF4Q2h1bmtzUGVyUmVxdWVzdCB8fFxuICAgICAgICAgIGJ1ZmZlckJ5dGVzID49IG1heEJ5dGVzUGVyUmVxdWVzdFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUaGUgYnVmZmVyZWQgZ3JvdXAgYWxyZWFkeSBmaWxscyBhIHJlcXVlc3Q6IG5vIHBvaW50IGR3ZWxsaW5nIGluXG4gICAgICAgICAgLy8gdGhlIGNvbW1pdCB3aW5kb3cuXG4gICAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjaGVkdWxlR3JvdXBDb21taXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJvdW5kZWQgYnVmZmVyOiBhY2NlcHQgdGhlIGNodW5rIChuZXZlciBkcm9wKSwgdGhlbiBibG9jayB1bnRpbFxuICAgICAgICAvLyB0aGUgcmVhZC1idXQtbm90LWR1cmFibGUgcG9wdWxhdGlvbiAoYnVmZmVyZWQgQU5EIGluIHRoZSBhY3RpdmVcbiAgICAgICAgLy8gcmVxdWVzdCkgaXMgYmFjayB1bmRlciB0aGUgYm91bmQuIEVhY2ggZHVyYWJseS1zZW50IGdyb3VwXG4gICAgICAgIC8vIHJlbGlldmVzIHRoaXMuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICBzaW5rRXJyb3IgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIChidWZmZXIubGVuZ3RoICsgaW5GbGlnaHRDaHVua3MgPj0gbWF4QnVmZmVyZWRDaHVua3MgfHxcbiAgICAgICAgICAgIGJ1ZmZlckJ5dGVzICsgaW5GbGlnaHRCeXRlcyA+PSBtYXhCdWZmZXJlZEJ5dGVzKVxuICAgICAgICApIHtcbiAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY2FwYWNpdHlXYWl0ZXJzLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICB9LFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIC8vIEV2ZXJ5dGhpbmcgYWNjZXB0ZWQgbXVzdCBiZSBkdXJhYmxlIGJlZm9yZSB0aGUgc2VydmVyIHN0cmVhbSBpc1xuICAgICAgICAvLyBjbG9zZWQ6IHRoZSBzZXJ2ZXIgZmVuY2VzIHBvc3QtY2xvc2Ugd3JpdGVzLlxuICAgICAgICBhd2FpdCBkcmFpbigpO1xuXG4gICAgICAgIC8vIEEgY2xvc2Ugd2l0aCBhbiBlbXB0eSBidWZmZXIgc2tpcHMgdGhlIGRpc3BhdGNoIHBhdGggKGFuZCBpdHNcbiAgICAgICAgLy8gYmFycmllciksIGJ1dCBjYW4gaXRzZWxmIGJlIHRoZSBmaXJzdCB3cml0ZSB0byBhIGJyYW5kLW5ld1xuICAgICAgICAvLyBzdHJlYW0sIHNvIGdhdGUgaXQgdG9vLlxuICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuXG4gICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgICBjb25zdCBjbG9zZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgbmFtZSk7XG4gICAgICAgIHJlY29yZFN0cmVhbUNsb3NlKGNsb3NlU3RhcnQsIHJ1bklkLCBuYW1lKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgLy8gQnVmZmVyZWQgY2h1bmtzIHdlcmUgYWxyZWFkeSBBQ0tFRCB0byB0aGVpciB3cml0ZXJzIChlYXJseS1hY2tcbiAgICAgICAgLy8gY29udHJhY3QpLCBhbmQgbmF0aXZlIHBpcGVUbyBhYm9ydHMgdGhpcyBzaW5rIHdoZW5ldmVyIGl0cyBTT1VSQ0VcbiAgICAgICAgLy8gZXJyb3JzLCBlLmcuIGFuIEFJIHN0cmVhbSB0aGF0IGVtaXRzIHRlbiBkZWx0YXMgYW5kIHRoZW4gdGhyb3dzLlxuICAgICAgICAvLyBEaXNjYXJkaW5nIGhlcmUgd291bGQgc2lsZW50bHkgbG9zZSB0aGUgYWNjZXB0ZWQgdGFpbCBvZiB0aGVcbiAgICAgICAgLy8gcHJlZml4LCBzbyBkZWxpdmVyIGl0IGZpcnN0OyBvbmx5IHRoZSBzZXJ2ZXIgc3RyZWFtIGNsb3NlIGlzXG4gICAgICAgIC8vIHNraXBwZWQuIEEgZGlzcGF0Y2ggZmFpbHVyZSBkdXJpbmcgdGhpcyBkcmFpbiBpcyBhbHJlYWR5IHN0aWNreVxuICAgICAgICAvLyBhbmQgc3VyZmFjZXMgdGhyb3VnaCB0aGUgc2luaydzIGVycm9yIHBhdGhzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgdW4tdGltZWJveGVkICh1bmxpa2UgdGhlIHN0ZXAtZXhlY3V0b3IncyA1MDBtc1xuICAgICAgICAvLyBpbmxpbmUgZmx1c2gpOiBnaXZpbmcgdXAgZWFybHkgd291bGQgZHJvcCBhY2tlZCBjaHVua3MsIHRoZVxuICAgICAgICAvLyBleGFjdCBsb3NzIHRoaXMgcGF0aCBleGlzdHMgdG8gcHJldmVudC4gSXQgaXMgc3RpbGwgYm91bmRlZCBpblxuICAgICAgICAvLyBwcmFjdGljZSBieSB0aGUgV29ybGQgdHJhbnNwb3J0J3Mgb3duIHRpbWVvdXQvcmV0cnkgYnVkZ2V0OiBhXG4gICAgICAgIC8vIHN0YWxsZWQgd3JpdGUgZW5kcyBpbiBhIHRlcm1pbmFsIHJlamVjdGlvbiBhZnRlciBmaW5pdGUgcmV0cmllcyxcbiAgICAgICAgLy8gd2hpY2ggcmVqZWN0cyB0aGUgZGlzcGF0Y2ggYW5kIGxhbmRzIGluIHRoZSBjYXRjaCBiZWxvdy4gVGhlXG4gICAgICAgIC8vIHNhbWUgY2F0Y2ggYWJzb3JicyB0aGUgZXhwZWN0ZWQgY29uZmxpY3Qgd2hlbiBhIHRlYXJkb3duLWRyaXZlblxuICAgICAgICAvLyBhYm9ydCBkcmFpbnMgaW50byBhbiBhbHJlYWR5LXRlcm1pbmFsIHJ1bi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBkcmFpbigpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBzaW5rRXJyb3IgaXMgc2V0OyBhY2NlcHRlZC1idXQtdW5kZWxpdmVyYWJsZSBjaHVua3Mgc3VyZmFjZSBpdC5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgYnVmZmVyQnl0ZXMgPSAwO1xuICAgICAgICBzaW5rRXJyb3IgPz89IHJlYXNvbiA/PyBuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkJyk7XG4gICAgICAgIC8vIFJlamVjdCBibG9ja2VkIHdyaXRlcnMgYW5kIGRyYWluIHdhaXRlcnMgc28gbm90aGluZyBsZWFrcyBvclxuICAgICAgICAvLyBoYW5ncyBvbiBhIHByb21pc2Ugd2hvc2UgdGltZXIgd2FzIGp1c3QgY2xlYXJlZC5cbiAgICAgICAgcmVqZWN0V2FpdGVycyhzaW5rRXJyb3IpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIER1cmFiaWxpdHkgYmFycmllciBmb3Igb3duZXJzIHRoYXQgY29tcGxldGUgd2l0aG91dCBjbG9zaW5nIHRoZVxuICAgIC8vIHN0cmVhbTogYGZsdXNoYWJsZVBpcGVgJ3MgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYXdhaXRzIHRoaXMgc28gYVxuICAgIC8vIHN0ZXAgY2Fubm90IGZpbmlzaCAoYW5kIHRoZSBmdW5jdGlvbiBzdXNwZW5kKSB3aGlsZSBhY2NlcHRlZCBjaHVua3NcbiAgICAvLyBhcmUgc3RpbGwgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGZsaWdodC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU1RSRUFNX0RSQUlOX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGRyYWluLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzLlxuZXhwb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyBJbXBvcnQgdHlwZXMgbG9jYWxseSBmb3IgdXNlIHdpdGhpbiB0aGlzIGZpbGUuXG5pbXBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQ29tcG9zZWQgcmVkdWNlcnMgLS0tLVxuLy8gQ29tcG9zZXMgbW9kdWxhciByZWR1Y2VycyAoY29tbW9uLCBjbGFzcywgc3RlcC1mdW5jdGlvbikgd2l0aFxuLy8gbW9kZS1zcGVjaWZpYyBSZXF1ZXN0L1Jlc3BvbnNlL1N0cmVhbSByZWR1Y2VycyBiZWxvdy5cblxuLyoqXG4gKiBCYXNlIHJlZHVjZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIHN0ZXAtZnVuY3Rpb24gKyBjb21tb24gcmVkdWNlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxCYXNlUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgY29uc3QgcmVxdWVzdFByb3RvdHlwZSA9IG9uY2UoKCkgPT4gZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1JlcXVlc3QnKSk7XG4gIGNvbnN0IHJlc3BvbnNlUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZXNwb25zZScpXG4gICk7XG4gIC8vIENsYXNzL0luc3RhbmNlIE1VU1QgY29tZSBiZWZvcmUgRXJyb3Igc28gdGhhdCBjdXN0b20gRXJyb3Igc3ViY2xhc3Nlc1xuICAvLyB3aXRoIFdPUktGTE9XX1NFUklBTElaRSB0YWtlIHByZWNlZGVuY2UgKGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zKS5cbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgcmVkdWNlcnMgYXJlIG1vZGUtc3BlY2lmaWMgYW5kIGFkZGVkIGJ5XG4gICAgLy8gZ2V0RXh0ZXJuYWxSZWR1Y2VycyAvIGdldFdvcmtmbG93UmVkdWNlcnMgLyBnZXRTdGVwUmVkdWNlcnMgYmVsb3cuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBDaGFpbiB3YWxrIHJhdGhlciB0aGFuIGBpbnN0YW5jZW9mIGdsb2JhbC5SZXF1ZXN0YDogc2VlIHRoZVxuICAgICAgLy8gUmVhZGFibGVTdHJlYW0gcmVkdWNlciBpbiBnZXRXb3JrZmxvd1JlZHVjZXJzIGZvciB3aHkuIFJlYWRzIGdvXG4gICAgICAvLyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGEgZ2V0dGVyIGNhbm5vdCBydW4gdW5yZXBvcnRlZC5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXF1ZXN0UHJvdG90eXBlLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVxdWVzdCddID0ge1xuICAgICAgICBtZXRob2Q6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21ldGhvZCcpIGFzIHN0cmluZyxcbiAgICAgICAgdXJsOiByZWFkUHJvcGVydHkodmFsdWUsICd1cmwnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICBkdXBsZXg6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2R1cGxleCcpIGFzICdoYWxmJyxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gcmVhZFByb3BlcnR5KHZhbHVlLCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFKSBhc1xuICAgICAgICB8IFdyaXRhYmxlU3RyZWFtPFJlc3BvbnNlPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzaWduYWwgaW4gdHdvIGNhc2VzOlxuICAgICAgLy8gICAxLiBBbHJlYWR5IGFib3J0ZWQ6IHByZXNlcnZlIGFib3J0ZWQ9dHJ1ZS9yZWFzb24gc28gdGhlIGh5ZHJhdGVkXG4gICAgICAvLyAgICAgIHN0ZXAgc2VlcyB0aGUgY2FuY2VsbGF0aW9uIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHNlcmlhbGl6ZS5cbiAgICAgIC8vICAgMi4gQWxyZWFkeSB0YWdnZWQgd2l0aCB3b3JrZmxvdyBpbmZyYXN0cnVjdHVyZSwgaS5lLiBhIHNpZ25hbFxuICAgICAgLy8gICAgICBmcm9tIGEgd29ya2Zsb3ctbWFuYWdlZCBBYm9ydENvbnRyb2xsZXIsIHdoaWNoIGhhcyBzdHJlYW0vaG9va1xuICAgICAgLy8gICAgICBiYWNraW5nIGZvciBjcm9zcy1ib3VuZGFyeSBwcm9wYWdhdGlvbi5cbiAgICAgIC8vIFBsYWluIG5vbi1hYm9ydGVkIG5hdGl2ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5IGRyb3BwZWQgKHdvdWxkXG4gICAgICAvLyBtaW50IHN0cmVhbSBpbmZyYSBmb3IgZXZlcnkgUmVxdWVzdCwgaW5jbHVkaW5nIHRoZSBhdXRvLWdlbmVyYXRlZFxuICAgICAgLy8gc2lnbmFsIG9uIGBuZXcgUmVxdWVzdCh1cmwpYCkuXG4gICAgICBjb25zdCBzaWduYWwgPSByZWFkUHJvcGVydHkodmFsdWUsICdzaWduYWwnKTtcbiAgICAgIGlmIChcbiAgICAgICAgc2lnbmFsICYmXG4gICAgICAgIChyZWFkUHJvcGVydHkoc2lnbmFsLCAnYWJvcnRlZCcpIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KHNpZ25hbCwgQUJPUlRfU1RSRUFNX05BTUUpKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEuc2lnbmFsID0gc2lnbmFsIGFzIEFib3J0U2lnbmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTZWUgdGhlIFJlcXVlc3QgcmVkdWNlciBhYm92ZS5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXNwb25zZVByb3RvdHlwZS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3R5cGUnKSBhcyBSZXNwb25zZVsndHlwZSddLFxuICAgICAgICB1cmw6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3VybCcpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhdHVzOiByZWFkUHJvcGVydHkodmFsdWUsICdzdGF0dXMnKSBhcyBudW1iZXIsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1c1RleHQnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICByZWRpcmVjdGVkOiByZWFkUHJvcGVydHkodmFsdWUsICdyZWRpcmVjdGVkJykgYXMgYm9vbGVhbixcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgYWJvcnQgcmVkdWNlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBBYm9ydFNlcmlhbGl6ZWREYXRhID0ge1xuICBzdHJlYW1OYW1lOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb246IHVua25vd247XG59O1xuXG4vKipcbiAqIFN5bWJvbC1rZXllZCBpbnRlcm5hbCBmaWVsZHMgdGFnZ2VkIG9udG8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsXG4gKiBpbnN0YW5jZXMgKGFuZCBgaG9sZGVyYHMgaW4gcmVkdWNlciBoZWxwZXJzKS4gQWxsIG9wdGlvbmFsOiBhIHBsYWluXG4gKiBuYXRpdmUgaW5zdGFuY2UgaGFzIG5vbmUgb2YgdGhlbSBzZXQuXG4gKi9cbnR5cGUgQWJvcnRJbnRlcm5hbHMgPSB7XG4gIFtBQk9SVF9TVFJFQU1fTkFNRV0/OiBzdHJpbmc7XG4gIFtBQk9SVF9IT09LX1RPS0VOXT86IHN0cmluZztcbiAgW0FCT1JUX1JFQURFUl9DQU5DRUxdPzogQWJvcnRDb250cm9sbGVyO1xufTtcblxudHlwZSBBYm9ydFNpZ25hbExpa2UgPSBBYm9ydEludGVybmFscyAmIHtcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbiAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBBYm9ydEhvbGRlciA9IEFib3J0SW50ZXJuYWxzICYgeyBzaWduYWw/OiBBYm9ydEludGVybmFscyB9O1xuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIGV4dGVybmFsIGFuZCBzdGVwXG4gKiBjb250ZXh0cy4gQXNzaWducyBzdHJlYW0vaG9vayBuYW1lcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBvcHRpb25hbGx5XG4gKiBhdHRhY2hlcyBhbiBhYm9ydCBsaXN0ZW5lciBmb3IgcmVhbC10aW1lIHByb3BhZ2F0aW9uLCBhbmQgcmV0dXJucyB0aGVcbiAqIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICBzaWduYWw6IEFib3J0U2lnbmFsTGlrZSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlcixcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IEFib3J0U2VyaWFsaXplZERhdGEge1xuICBsZXQgc3RyZWFtTmFtZSA9IGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGxldCBob29rVG9rZW4gPSBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IGlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgc3RyZWFtTmFtZSA9IGdldEFib3J0U3RyZWFtSWQoaWQpO1xuICAgIGhvb2tUb2tlbiA9IGBhYnJ0XyR7aWR9YDtcbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgaWYgKGhvbGRlci5zaWduYWwpIHtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgfVxuICB9XG5cbiAgLy8gRGVkdXBlZCB2aWEgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQgbWFya2VyOiBzZWUgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UuXG4gIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICAgIHNpZ25hbCBhcyBBYm9ydFNpZ25hbCxcbiAgICBzdHJlYW1OYW1lLFxuICAgIHJ1bklkLFxuICAgIGNyeXB0b0tleSxcbiAgICBvcHNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIHdvcmtmbG93IGNvbnRleHQuXG4gKiBSZWFkcyBleGlzdGluZyBzdHJlYW0vaG9vayBuYW1lcyBmcm9tIHN5bWJvbHMgKG11c3QgYWxyZWFkeSBiZSBzZXQpLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydEJ5U3ltYm9sKFxuICBzaWduYWw6IHsgYWJvcnRlZDogYm9vbGVhbjsgcmVhc29uPzogdW5rbm93biB9LFxuICBob2xkZXI6IEFib3J0SG9sZGVyXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHwgZmFsc2Uge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGEgc2luZ2xlIGFib3J0IGxpc3RlbmVyIHRvIGEgc2lnbmFsLCBkZWR1cGVkIGFjcm9zcyBjYWxscy5cbiAqXG4gKiBFYWNoIHNlcmlhbGl6YXRpb24gcGFzcyBnb2VzIHRocm91Z2ggdGhlIHJlZHVjZXIsIGJ1dCBhIGNvbnRyb2xsZXIgcGFzc2VkXG4gKiB0byBOIHN0ZXBzIHdvdWxkIG90aGVyd2lzZSBhY2N1bXVsYXRlIE4gbGlzdGVuZXJzLCBlYWNoIHdyaXRpbmcgdGhlIHNhbWVcbiAqIHN0cmVhbSBwYWNrZXQgYW5kIGRvdWJsZS1jbG9zaW5nIHRoZSBzdHJlYW0gb24gYWJvcnQuIFRoZSBtYXJrZXIgc3ltYm9sXG4gKiBlbnN1cmVzIHRoZSBzdHJlYW0td3JpdGUgc2lkZS1lZmZlY3QgcnVucyBhdCBtb3N0IG9uY2UgcGVyIChzaWduYWwsIHJ1bklkKS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiB2b2lkIHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gIGlmICgoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdKSByZXR1cm47XG4gIChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0gPSB0cnVlO1xuXG4gIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdhYm9ydCcsXG4gICAgKCkgPT4ge1xuICAgICAgb3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSByZWFkZXIgdXNlcyAoaHlkcmF0ZVN0ZXBBcmd1bWVudHMpXG4gICAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5IChET01FeGNlcHRpb24sXG4gICAgICAgICAgICAvLyBFcnJvcnMsIGN1c3RvbSBjbGFzc2VzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzIGVuY3J5cHRpb24ga2V5LlxuICAgICAgICAgICAgLy8gQSBiYXJlIEpTT04uc3RyaW5naWZ5IGhlcmUgd291bGQgd3JpdGUgYSBwYWNrZXQgdGhlIHJlYWRlciBjYW4ndFxuICAgICAgICAgICAgLy8gZGVjb2RlIGFuZCB0aGUgbGlzdGVuZXItc2lkZSBhYm9ydCB3b3VsZCBwcm9wYWdhdGUgd2l0aCBubyByZWFzb24uXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgIHsgYWJvcnRlZDogdHJ1ZSwgcmVhc29uOiBzaWduYWwucmVhc29uIH0sXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHBheWxvYWQgYXMgVWludDhBcnJheSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IHN0cmVhbSB3cml0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9LFxuICAgIHsgb25jZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsIHBhc3NpbmcgYXJndW1lbnRzXG4gKiB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEBwYXJhbSBjcnlwdG9LZXlcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZW4gYHRydWVgLCBieXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYClcbiAqICAgYXJlIHdyYXBwZWQgaW4gbGVuZ3RoLXByZWZpeGVkIGZyYW1lcyBvbiB0aGUgd2lyZSBzbyB0aGUgY29uc3VtZXJcbiAqICAgY2FuIHJlY29ubmVjdCBvbiB0cmFuc2llbnQgZXJyb3JzLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBydW4nc1xuICogICBjYXBhYmlsaXR5OiBzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzXG4gKiAgIHRvIGBmYWxzZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgbmVzdGVkIGBSZWFkYWJsZVN0cmVhbWAgZm91bmQgd2hpbGUgc2VyaWFsaXppbmdcbiAgLy8gaXMgcGlwZWQgdG8gaXRzIG93biBzZXJ2ZXIgc3RyZWFtIGluZGVwZW5kZW50bHkgb2YgdGhlIG91dGVyIHNpbmssIHNvIGl0c1xuICAvLyBmaXJzdCBjaHVuayBjYW4gcmFjZSBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhhdFxuICAvLyBzaW5rIHNvIHRoZSB3cml0ZSBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC9cbiAgLy8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTdHJlYW0gbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gcGFzc2luZyBhY3Jvc3MgZXhlY3V0aW9uIGJvdW5kYXJ5XG4gICAgICBpZiAodmFsdWUubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ1JlYWRhYmxlU3RyZWFtIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdyBib3VuZGFyeS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQYXNzIHRoZSBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgLmdldFJlYWRlcigpIC8gLnBpcGVUaHJvdWdoKCkgLyAucGlwZVRvKCksIG9yIHRlZSBpdCB3aXRoIC50ZWUoKSBhbmQgcGFzcyBvbmUgb2YgdGhlIGJyYW5jaGVzLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgY29uc3QgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRTdHJlYW1UeXBlKHZhbHVlKTtcblxuICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIGlmIChmcmFtZWRCeXRlU3RyZWFtcykge1xuICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUaHJvdWdoKGdldEJ5dGVGcmFtaW5nU3RyZWFtKCkpLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5LFxuICAgICAgICAgICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnICYmIGZyYW1lZEJ5dGVTdHJlYW1zKSBzLmZyYW1pbmcgPSAnZnJhbWVkLXYxJztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5Xcml0YWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gRmFzdCBwYXRoOiB3aGVuIHRoZSB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtIChlLmcuIGl0IGNhbWUgZnJvbSBhIHN0ZXAtY29udGV4dCBgZ2V0V3JpdGFibGUoKWBcbiAgICAgIC8vIG9yIHdhcyBoeWRyYXRlZCBmcm9tIGEgd29ya2Zsb3cgaW5wdXQgYnkgYGdldFN0ZXBSZXZpdmVyc2ApLFxuICAgICAgLy8gZm9yd2FyZCBpdHMgdW5kZXJseWluZyBgKHJ1bklkLCBuYW1lKWAgdG8gdGhlIHJlY2VpdmluZyBydW4uXG4gICAgICAvLyBUaGUgcmVjZWl2aW5nIHJ1bidzIHN0ZXAtc2lkZSByZXZpdmVyIG9wZW5zIGEgc2VydmVyIHdyaXRhYmxlXG4gICAgICAvLyBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmVzIHRoYXQgcnVuJ3NcbiAgICAgIC8vIGVuY3J5cHRpb24ga2V5IGRpcmVjdGx5LCBzbyB3cml0ZXMgbGFuZCBvbiB0aGUgb3JpZ2luYWwgc3RyZWFtXG4gICAgICAvLyBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIHJlY2VpdmluZyBydW4sIHdpdGggbm8gaW4tcHJvY2Vzc1xuICAgICAgLy8gYnJpZGdlIHRpZWQgdG8gdGhlIGRlaHlkcmF0aW5nIHN0ZXAncyBsaWZldGltZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBleGlzdGluZ1J1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nUnVuSWQgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHtcbiAgICAgICAgICBuYW1lOiBleGlzdGluZ05hbWUsXG4gICAgICAgICAgcnVuSWQ6IGV4aXN0aW5nUnVuSWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUHVibGljS2V5ID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZW5jcnlwdGlvblB1YmxpY0tleSA9IGV4aXN0aW5nUHVibGljS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZGVwbG95bWVudElkID0gZXhpc3RpbmdEZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSk7XG4gICAgICBvcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG4vKipcbiAqIFByb3RvdHlwZXMgdXNlZCBmb3IgYnJhbmQtc3R5bGUgaWRlbnRpZmljYXRpb24gaW4gdGhlIHJlZHVjZXJzIGJlbG93LlxuICpcbiAqIFRoZSBzdHJlYW0gYW5kIGFib3J0IGNsYXNzZXMgYXJlIGhvc3QgY2xhc3NlcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzb1xuICogaW5zdGFuY2VzIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbiBhbmQgYSBjaGFpbiB3YWxrXG4gKiBpZGVudGlmaWVzIHRoZW0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgIG9uIHRoZSBzYW5kYm94XG4gKiBjbGFzcy4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVudGltZSBsYWNrcyB0aGUgY2xhc3MsIGluIHdoaWNoIGNhc2VcbiAqIGlkZW50aWZpY2F0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbHMgYWxvbmUuXG4gKi9cbi8qKlxuICogVGhlIHByb3RvdHlwZSBvZiBhIGhvc3QgY2xhc3MgdGhhdCBtYXkgYWxzbyBiZSBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LlxuICogUHJlZmVycyB0aGUgc2FuZGJveCBiaW5kaW5nICh0aGUgc2FtZSBob3N0IGNsYXNzIG9iamVjdCBpbiBwcmFjdGljZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBob3N0J3Mgb3duLCBzbyBhIGNoYWluIHdhbGsgaWRlbnRpZmllcyBpbnN0YW5jZXMgZnJvbVxuICogZWl0aGVyIHJlYWxtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdENsYXNzUHJvdG90eXBlKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5hbWU6IHN0cmluZ1xuKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgLy8gRGVzY3JpcHRvciByZWFkcyAoYHJlYWRQcm9wZXJ0eWApLCBub3QgYmFyZSBnZXRzOiBhbiBhY2Nlc3NvciBvciBQcm94eVxuICAvLyBwbGFudGVkIG9uIHRoZSBzYW5kYm94IGdsb2JhbCAob3IgdGhlIGNvbnN0cnVjdG9yKSBtdXN0IGJlIHJlY29yZGVkIGluXG4gIC8vIHRoZSBndWVzdC1jb2RlIHNpbmsgKGl0IGdhdGVzIFZNIHJldGVudGlvbiksIG5vdCBzaWxlbnRseSBleGVjdXRlZC5cbiAgLy8gQ2FsbGVycyB3cmFwIHRoaXMgaW4gYG9uY2UoLi4uKWAgcGVyIHJlZHVjZXIgc2V0LCBzbyB0aGUgcmVhZCBoYXBwZW5zXG4gIC8vIGV4YWN0bHkgb25jZSBwZXIgc2VyaWFsaXplIHBhc3MsIG9uIHRoZSBmaXJzdCBndWFyZCBpbnZvY2F0aW9uLCBpbnNpZGVcbiAgLy8gdGhlIHBhc3MncyBzaW5rIHNjb3BlLCBuZXZlciBwZXIgdmFsdWUuXG4gIGNvbnN0IGN0b3IgPSByZWFkUHJvcGVydHkoZ2xvYmFsLCBuYW1lKSA/PyByZWFkUHJvcGVydHkoZ2xvYmFsVGhpcywgbmFtZSk7XG4gIGlmICh0eXBlb2YgY3RvciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRQcm9wZXJ0eShjdG9yLCAncHJvdG90eXBlJykgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZWFkYWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVhZGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCB3cml0YWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnV3JpdGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXJQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0Q29udHJvbGxlcicpXG4gICk7XG4gIGNvbnN0IGFib3J0U2lnbmFsUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdBYm9ydFNpZ25hbCcpXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgXCJoYW5kbGVzXCIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBzdGVwcy5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gaW5zdGVhZCBvZiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW1gOlxuICAgICAgLy8gdGhlIGNsYXNzIGlzIGhvc3QtcHJvdmlkZWQgKGluamVjdGVkIGludG8gdGhlIHNhbmRib3gpLCBzbyBpdHNcbiAgICAgIC8vIHByb3RvdHlwZSBpcyBpbiB0aGUgY2hhaW4gb2YgYm90aCByZWFsIHN0cmVhbXMgYW5kIHRoZVxuICAgICAgLy8gYE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKWAgaGFuZGxlcyB1c2VkIGZvciByZXF1ZXN0XG4gICAgICAvLyBib2RpZXMsIGJ1dCBhIGNoYWluIHdhbGsgbmV2ZXIgY29uc3VsdHMgYFN5bWJvbC5oYXNJbnN0YW5jZWAsIHdoaWNoXG4gICAgICAvLyB0aGUgc2FuZGJveCBjYW4gZGVmaW5lIGFuZCB3aGljaCByYW4gZm9yIGV2ZXJ5IHZhbHVlIHRoZSBlYXJsaWVyXG4gICAgICAvLyByZWR1Y2VycyBkaWQgbm90IGNsYWltLiBSZWFkcyBiZWxvdyBnbyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGFcbiAgICAgIC8vIGdldHRlciBvbiBhIHN0ZXAgYXJndW1lbnQgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCBCT0RZX0lOSVRfU1lNQk9MKTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IEV4dHJhY3Q8XG4gICAgICAgIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10sXG4gICAgICAgIHsgbmFtZTogc3RyaW5nIH1cbiAgICAgID4gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9UWVBFX1NZTUJPTCkgYXNcbiAgICAgICAgfCAnYnl0ZXMnXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fRlJBTUlOR19TWU1CT0wpIGFzXG4gICAgICAgIHwgQnl0ZVN0cmVhbUZyYW1pbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGFib3ZlIGZvciB3aHkgdGhpcyB3YWxrcyB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wpO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0OiByZWFkIG9ubHkgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBgdmFsdWUuc2lnbmFsYCB3YXMgYSBiYXJlIHJlYWQsIHNvIGEgYHNpZ25hbGAgZ2V0dGVyIG9uIGFueSBvYmplY3RcbiAgICAgIC8vIHJlYWNoaW5nIHRoaXMgcmVkdWNlciBleGVjdXRlZCB1bnJlcG9ydGVkLiBSZWFkIHRocm91Z2ggZGVzY3JpcHRvcnNcbiAgICAgIC8vIGFuZCBnYXRlIG9uIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2wgLyBwcm90b3R5cGUgZmlyc3QuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaG9sZGVyID0gdmFsdWUgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRIb2xkZXI7XG4gICAgICBjb25zdCBvd25TeW1ib2wgPSByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRDb250cm9sbGVyID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG93blN5bWJvbCA9PT0gdW5kZWZpbmVkICYmICFpc05hdGl2ZUFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3Qgb3VycyBhbmQgbm90IGEgbmF0aXZlIGNvbnRyb2xsZXIsIGJ1dCBhIGZvcmVpZ24gY29udHJvbGxlclxuICAgICAgICAvLyBtYXkgc3RpbGwgY2FycnkgdGhlIHN5bWJvbCBvbiBpdHMgc2lnbmFsLlxuICAgICAgICBjb25zdCBtYXliZVNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmVTaWduYWwgPT09IG51bGwgfHxcbiAgICAgICAgICB0eXBlb2YgbWF5YmVTaWduYWwgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KG1heWJlU2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKCFzaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHNpZ25hbCBhcyBBYm9ydFNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9XG4gICAgICAgIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0U2lnbmFsID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRTaWduYWxQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc0Fib3J0U3ltYm9sICYmICFpc05hdGl2ZUFib3J0U2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZSBhcyBBYm9ydFNpZ25hbCwgdmFsdWUgYXMgQWJvcnRIb2xkZXIpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBgUmVhZGFibGVTdHJlYW1gIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGUgc2FtZSBvcCBmbHVzaCwgc28gaXRzIGZpcnN0IGNodW5rIGNhbiByYWNlXG4gIC8vIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGUgc2luayBzbyB0aGF0IHdyaXRlXG4gIC8vIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gYWxyZWFkeSBoYXMgdGhlIG5hbWUgc3ltYm9sIHNldCwgaW4gd2hpY2ggY2FzZVxuICAgICAgLy8gaXQncyBhbHJlYWR5IGJlaW5nIHN1bmsgdG8gdGhlIHNlcnZlciBhbmQgd2UgY2FuIHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQ7IHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGxldCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8odmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5lbmNyeXB0aW9uUHVibGljS2V5ID0gZm9yZWlnblB1YmxpY0tleTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgZGFuZ2xpbmcgYWJvcnQtc3RyZWFtIHJlYWRlcnMgb24gYW55IEFib3J0Q29udHJvbGxlciBpbnN0YW5jZXMgZm91bmRcbiAqIGluIHRoZSBoeWRyYXRlZCBzdGVwIGFyZ3VtZW50cy4gQ2FsbGVkIGFmdGVyIHRoZSBzdGVwIGZ1bmN0aW9uIHJldHVybnNcbiAqIChzdWNjZXNzIG9yIGZhaWx1cmUpIHRvIHByZXZlbnQgcmVhZGVyIHByb21pc2VzIGZyb20ga2VlcGluZyB0aGUgc2VydmVybGVzc1xuICogZnVuY3Rpb24gYWxpdmUgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsQWJvcnRSZWFkZXJzKC4uLnZhbHVlczogdW5rbm93bltdKTogdm9pZCB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpO1xuICBmdW5jdGlvbiBjYW5jZWxJZlByZXNlbnQodmFsOiBBYm9ydEludGVybmFscyk6IHZvaWQge1xuICAgIGNvbnN0IGNhbmNlbCA9IHZhbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgICBpZiAoY2FuY2VsICYmICFjYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNhbmNlbC5hYm9ydCgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB3YWxrKHZhbDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWwgYXMgb2JqZWN0KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWQuYWRkKHZhbCBhcyBvYmplY3QpO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbC5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2FsayhpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbC52YWx1ZXMoKSkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZSBleHBvc2UgYHNpZ25hbGAvYGJvZHlgIGFzIHByb3RvdHlwZSBnZXR0ZXJzLCBzb1xuICAgIC8vIE9iamVjdC52YWx1ZXMoKSB3b24ndCBmaW5kIHRoZW0uIERlc2NlbmQgZXhwbGljaXRseS5cbiAgICBpZiAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHdhbGsodmFsLnNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKHZhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHdhbGsodik7XG4gIH1cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykgd2Fsayh2KTtcbn1cblxuLyoqXG4gKiBTZXRzIHVwIGEgc3RyZWFtIHJlYWRlciBvbiB0aGUgY29udHJvbGxlciB0aGF0IGxpc3RlbnMgZm9yIGFuIGFib3J0IHBhY2tldC5cbiAqIFJldHVybnMgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyIHNvIGl0IGNhbiBiZSBzdG9yZWQgb24gYm90aCB0aGVcbiAqIGNvbnRyb2xsZXIgYW5kIHNpZ25hbCBmb3IgY2xlYW51cCBieSBjYW5jZWxBYm9ydFJlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogQWJvcnRDb250cm9sbGVyIHtcbiAgY29uc3QgcmVhZGVyQ2FuY2VsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIG9wcy5wdXNoKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTx7IHZhbHVlOiB1bmRlZmluZWQ7IGRvbmU6IHRydWUgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFkZXJDYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlckNhbmNlbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAvLyBBbiBhYm9ydCBwYWNrZXQgYXJyaXZlZDogcHJvcGFnYXRlIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuIFJlbGVhc2VcbiAgICAgICAgICAvLyB0aGUgbG9jayAoc3luY2hyb25vdXMpIHJhdGhlciB0aGFuIGNhbmNlbGxpbmcgaGVyZTogb24gYVxuICAgICAgICAgIC8vIHNlcnZpY2UtYmFja2VkIFdvcmxkIGByZWFkZXIuY2FuY2VsKClgIGNhbiBkbyBhIG5ldHdvcmsgcm91bmQtdHJpcCxcbiAgICAgICAgICAvLyBhbmQgYXdhaXRpbmcgaXQgYmVmb3JlIGBjb250cm9sbGVyLmFib3J0KClgIHdvdWxkIGRlbGF5IChvciwgaWYgaXRcbiAgICAgICAgICAvLyBoYW5ncywgZHJvcCkgcmVhbC10aW1lIGFib3J0IGRlbGl2ZXJ5IHRvIHRoZSBpbi1mbGlnaHQgc3RlcC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBSZWFkZXIgbWF5IGFscmVhZHkgYmUgcmVsZWFzZWQ7IGlnbm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgd3JpdGVyIHVzZWQgc28gdGhlIHJlYXNvblxuICAgICAgICAgICAgLy8gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkuIEVuY3J5cHRpb24ga2V5IChpZiBhbnkpXG4gICAgICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBzdGVwIGNvbnRleHQsIHNldCB1cCBieSB0aGUgc3RlcCBleGVjdXRvciBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoaXMgcmVhZGVyIHJ1bnMuIEZhbGxiYWNrIHRvIHVuZGVmaW5lZCBmb3IgZXh0ZXJuYWwtY29udGV4dFxuICAgICAgICAgICAgLy8gcmV2aXZlcyAodGhlIGh5ZHJhdGUgcGF0aCBpcyBlbmNyeXB0aW9uLWtleS10b2xlcmFudCkuXG4gICAgICAgICAgICBjb25zdCBjdHhGb3JLZXkgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgY3R4Rm9yS2V5Py5lbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApKSBhcyB7IHJlYXNvbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZGF0YT8ucmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHN0ZXAgZmluaXNoZWQgKG9yIHRoZSByZWFkZXIgd2FzIGNhbmNlbGxlZCkgd2l0aG91dCBhbiBhYm9ydC5cbiAgICAgICAgICAvLyBDYW5jZWwgKG5vdCBqdXN0IHJlbGVhc2UpIHNvIHRoZSB1bmRlcmx5aW5nIFdvcmxkIHN0cmVhbSBpcyB0b3JuXG4gICAgICAgICAgLy8gZG93bjogYSBwb2xsaW5nIFdvcmxkIChlLmcuIHdvcmxkLWxvY2FsKSBvdGhlcndpc2UgbGVha3MgYSB0YWlsXG4gICAgICAgICAgLy8gcmVhZGVyIChhIDEwMG1zIGZpbGVzeXN0ZW0gcG9sbCBwbHVzIGVtaXR0ZXIgbGlzdGVuZXJzKSBwZXIgc3RlcFxuICAgICAgICAgIC8vIGludm9jYXRpb24gZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzLCBzaW5jZSBhIHNpZ25hbC1iZWFyaW5nIHN0ZXBcbiAgICAgICAgICAvLyBvcGVucyBvbmUgb2YgdGhlc2Ugb24gZXZlcnkgcmV2aXZhbCBhbmQgdXN1YWxseSBuZXZlciBhYm9ydHMuIEZpcmVcbiAgICAgICAgICAvLyBhbmQgZm9yZ2V0OiBhIHNlcnZpY2UtYmFja2VkIFdvcmxkJ3MgY2FuY2VsIG1heSBoaXQgdGhlIG5ldHdvcmssXG4gICAgICAgICAgLy8gYW5kIHRoaXMgcGF0aCBtdXN0IG5vdCBibG9jayB0aGUgc3RlcCdzIG9wcy1zZXR0bGUgd2luZG93LlxuICAgICAgICAgIHZvaWQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0cmVhbSByZWFkIGZhaWxlZDogc2lnbmFsIHdvbid0IHByb3BhZ2F0ZSBpbiByZWFsLXRpbWUsXG4gICAgICAgIC8vIGJ1dCBob29rLWJhc2VkIHByb3BhZ2F0aW9uIG9uIG5leHQgcmVwbGF5IHByb3ZpZGVzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSkoKVxuICApO1xuXG4gIHJldHVybiByZWFkZXJDYW5jZWw7XG59XG5cbi8qKlxuICogU3RvcmVzIGFib3J0IHNlcmlhbGl6YXRpb24gc3ltYm9scyBhbmQgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyXG4gKiBvbiBib3RoIHRoZSBjb250cm9sbGVyIGFuZCBpdHMgc2lnbmFsLlxuICovXG5mdW5jdGlvbiB0YWdBYm9ydFBhaXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgdmFsdWU6IHsgc3RyZWFtTmFtZTogc3RyaW5nOyBob29rVG9rZW46IHN0cmluZyB9LFxuICByZWFkZXJDYW5jZWw/OiBBYm9ydENvbnRyb2xsZXJcbik6IHZvaWQge1xuICBjb25zdCB0YWdnZWRDb250cm9sbGVyID0gY29udHJvbGxlciBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscztcbiAgY29uc3QgdGFnZ2VkU2lnbmFsID0gY29udHJvbGxlci5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscztcbiAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gdmFsdWUuc3RyZWFtTmFtZTtcbiAgdGFnZ2VkU2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICBpZiAocmVhZGVyQ2FuY2VsKSB7XG4gICAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgICB0YWdnZWRTaWduYWxbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSByZWFkZXJDYW5jZWw7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wYWdhdGUgYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBmcm9tIG9uZSBzaWduYWwgdG8gYW5vdGhlci4gVXNlZCBieSB0aGVcbiAqIFJlcXVlc3QgcmV2aXZlciBiZWNhdXNlIGBuZXcgUmVxdWVzdCh1cmwsIHsgc2lnbmFsIH0pYCBjb3BpZXMgdGhlIHNpZ25hbFxuICogaW50ZXJuYWxseTogdGhlIGNvbnN0cnVjdGVkIGByZXF1ZXN0LnNpZ25hbGAgaXMgYSBmcmVzaCBBYm9ydFNpZ25hbCB0aGF0XG4gKiBkb2Vzbid0IGNhcnJ5IHN5bWJvbHMgZnJvbSB0aGUgc291cmNlLlxuICovXG5mdW5jdGlvbiBjb3B5QWJvcnRJbnRlcm5hbHMoc3JjOiBBYm9ydFNpZ25hbCwgZGVzdDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgY29uc3QgcyA9IHNyYyBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCBkID0gZGVzdCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBpZiAoc1tBQk9SVF9TVFJFQU1fTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfU1RSRUFNX05BTUVdID0gc1tBQk9SVF9TVFJFQU1fTkFNRV07XG4gIH1cbiAgaWYgKHNbQUJPUlRfSE9PS19UT0tFTl0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfSE9PS19UT0tFTl0gPSBzW0FCT1JUX0hPT0tfVE9LRU5dO1xuICB9XG4gIGlmIChzW0FCT1JUX1JFQURFUl9DQU5DRUxdICE9PSB1bmRlZmluZWQpIHtcbiAgICBkW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gc1tBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWJvcnRDb250cm9sbGVyIHdpdGggc3RyZWFtLWJhY2tlZCBhYm9ydCBwcm9wYWdhdGlvbi5cbiAqIFVzZWQgYnkgc3RlcCBhbmQgZXh0ZXJuYWwgcmV2aXZlcnMgd2hlcmUgcmVhbCBhYm9ydCBzaWduYWwgYmVoYXZpb3IgaXMgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXJpYWxpemVkIGFib3J0IGNvbnRyb2xsZXIvc2lnbmFsIGRhdGFcbiAqIEBwYXJhbSBvcHMgLSBUaGUgb3BzIGFycmF5IGZvciB0cmFja2luZyBhc3luYyB3b3JrXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChmb3Igc3RyZWFtIHJlYWRzKVxuICogQHJldHVybnMgQSByZWFsIEFib3J0Q29udHJvbGxlciB3aXRoIHBhdGNoZWQgYWJvcnQoKSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRDb250cm9sbGVyKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRDb250cm9sbGVyJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGFib3J0KCkgdG8gYWxzbyB3cml0ZSBzdHJlYW0gKyByZXN1bWUgaG9vayAoZm9yIHN0ZXAtaW5pdGlhdGVkIGFib3J0KVxuICBjb25zdCBvcmlnaW5hbEFib3J0ID0gY29udHJvbGxlci5hYm9ydC5iaW5kKGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLmFib3J0ID0gKHJlYXNvbj86IHVua25vd24pID0+IHtcbiAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIG9yaWdpbmFsQWJvcnQocmVhc29uKTtcblxuICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4Lm9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgdGhyb3VnaCB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIGhvb2tcbiAgICAgICAgICAgIC8vIGV2ZW50IHVzZXMgc28gdGhlIGByZWFzb25gIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5XG4gICAgICAgICAgICAvLyAoRE9NRXhjZXB0aW9uLCBjdXN0b20gZXJyb3JzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzXG4gICAgICAgICAgICAvLyBlbmNyeXB0aW9uIGtleSwgc3ltbWV0cmljIHdpdGggd2hhdCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAvLyB3cml0ZXMgZm9yIHdvcmtmbG93LWluaXRpYXRlZCBhYm9ydHMuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfSxcbiAgICAgICAgICAgICAgY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5zdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUuaG9va1Rva2VuKSB7XG4gICAgICAgIC8vIFRoZSBkdXJhYmxlIGhvb2sgcmVzdW1lICh3aGljaCB3cml0ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCB0aGF0XG4gICAgICAgIC8vIHJlY29yZHMgdGhpcyBhYm9ydCBpbiB0aGUgd29ya2Zsb3cncyBldmVudCBsb2cpIG11c3QgYmUgY29tbWl0dGVkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgc3RlcCBjb21wbGV0ZXMuIE90aGVyd2lzZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uXG4gICAgICAgIC8vIGVucXVldWVkIGJ5IGBzdGVwX2NvbXBsZXRlZGAgY2FuIGFkdmFuY2UgcGFzdCB0aGUgYWJvcnQgKGRpc3BhdGNoaW5nXG4gICAgICAgIC8vIGEgbGF0ZXIgc3RlcCB3aXRoIGEgc3RhbGUsIG5vbi1hYm9ydGVkIGBzaWduYWxgKSBiZWZvcmUgdGhlIGV2ZW50XG4gICAgICAgIC8vIGV4aXN0cy4gUm91dGUgaXQgdG8gYHByZUNvbXBsZXRpb25PcHNgIChhd2FpdGVkIGlubGluZSBiZWZvcmVcbiAgICAgICAgLy8gY29tcGxldGlvbikgcmF0aGVyIHRoYW4gYG9wc2AgKGJlc3QtZWZmb3J0LCBiYWNrZ3JvdW5kKS4gVGhlIHN0cmVhbVxuICAgICAgICAvLyB3cml0ZSBhYm92ZSBzdGF5cyBpbiBgb3BzYDogaXQgbXVzdCBmaXJlIEFTQVAgdG8gcmVhY2ggYW4gaW4tZmxpZ2h0XG4gICAgICAgIC8vIHNpYmxpbmcgc3RlcCBhbmQgaXMgbm90IHRoZSBkdXJhYmxlIHJlY29yZC5cbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgaGVyZSBzbyB0aGUgcHJvbWlzZSBjYW4gb25seSBldmVyIGVuZm9yY2Ugb3JkZXJpbmdcbiAgICAgICAgLy8gd2hlbiBhd2FpdGVkIChzZWUgdGhlIG5vLXJlamVjdCBjb250cmFjdCBvblxuICAgICAgICAvLyBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzKTsgYSBmYWlsZWQgcmVzdW1lIHJldHJpZXMgb24gbmV4dCByZXBsYXkuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWUgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VtZUhvb2s6IHJlc3VtZUhvb2tGbiB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2tGbih2YWx1ZS5ob29rVG9rZW4sIHtcbiAgICAgICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBob29rIHJlc3VtZTogcmV0cnkgb24gbmV4dCByZXBsYXlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGN0eC5wcmVDb21wbGV0aW9uT3BzLnB1c2goaG9va1Jlc3VtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIFJldml2ZXMgb25seSBhbiBBYm9ydFNpZ25hbCB3aXRob3V0IHRoZSBwYXRjaGVkIGFib3J0KCkgb3ZlcmhlYWQuXG4gKiBVc2VkIHdoZW4gb25seSBhIHNpZ25hbCAobm90IGEgY29udHJvbGxlcikgd2FzIHNlcmlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRTaWduYWwnXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBpZiAodmFsdWUuYWJvcnRlZCkge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gICAgY29udHJvbGxlci5hYm9ydCh2YWx1ZS5yZWFzb24pO1xuICB9IGVsc2UgaWYgKHZhbHVlLnN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCByZWFkZXJDYW5jZWwgPSBzZXR1cEFib3J0U3RyZWFtUmVhZGVyKFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHJ1bklkLFxuICAgICAgdmFsdWUuc3RyZWFtTmFtZSxcbiAgICAgIG9wc1xuICAgICk7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlLCByZWFkZXJDYW5jZWwpO1xuICB9IGVsc2Uge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG59XG5cbi8qKlxuICogQmFzZSByZXZpdmVycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBjb21tb24gcmV2aXZlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICpcbiAqIFRoaXMgaXMgZXhwb3J0ZWQgYmVjYXVzZSBzZXJpYWxpemF0aW9uLWZvcm1hdC50cyBhbmQgb3RoZXIgZmlsZXMgcmVmZXJlbmNlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcykge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAuLi5nZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUoZ2xvYmFsKSxcbiAgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUGFydGlhbDxSZXZpdmVycz47XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JpdGUtb25seSBrZXkgYSBydW4gbmVlZHMgd2hlbiB3cml0aW5nIGludG8gYW5vdGhlciBydW4nc1xuICogZm9yd2FyZGVkIHN0cmVhbS5cbiAqXG4gKiBUaHJlZSB0aWVycywgY2hlYXBlc3QgZmlyc3Q6XG4gKlxuICogMS4gVGhlIGRlc2NyaXB0b3IgY2FycmllcyB0aGUgb3duZXIncyBYMjU1MTkgcHVibGljIGtleTogc2VhbCB0byBpdCB3aXRoXG4gKiAgICBubyBJL08gd2hhdHNvZXZlci4gVGhlIG93bmVyIHB1Ymxpc2hlZCB0aGUga2V5IHdoZW4gaXQgY3JlYXRlZCB0aGVcbiAqICAgIHN0cmVhbSwgc28gdGhpcyBpcyB0aGUgemVyby1yb3VuZC10cmlwIHBhdGguXG4gKiAyLiBUaGUgZGVzY3JpcHRvciBjYXJyaWVzIHRoZSBvd25lcidzIGRlcGxveW1lbnQgSUQ6IHJlc29sdmUgdGhlIG93bmVyJ3NcbiAqICAgIHN5bW1ldHJpYyBrZXksIHdoaWNoIGNyb3NzLWRlcGxveW1lbnQgbWVhbnMgYSBrZXktQVBJIHJvdW5kIHRyaXAuXG4gKiAzLiBOZWl0aGVyIChkZXNjcmlwdG9ycyB3cml0dGVuIGJ5IG9sZGVyIFNES3MpOiBsb2FkIHRoZSBvd25pbmcgcnVuIGZpcnN0LFxuICogICAgdGhlbiByZXNvbHZlIGl0cyBzeW1tZXRyaWMga2V5LlxuICpcbiAqIFRpZXJzIDIgYW5kIDMgaW1wb3J0IHRoZSBrZXkgZW5jcnlwdC1vbmx5LCB3aGljaCBpcyBhbiBob25vci1zeXN0ZW1cbiAqIHJlc3RyaWN0aW9uOiB0aGUgc2FtZSBieXRlcyBjb3VsZCBkZWNyeXB0LiBUaWVyIDEgbWFrZXMgaXQgYSBjcnlwdG9ncmFwaGljXG4gKiBndWFyYW50ZWU6IGEgcHVibGljIGtleSBjYW5ub3QgcmVhZCBhbnl0aGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZGVkV3JpdGFibGVFbmNyeXB0aW9uS2V5KFxuICBydW5JZDogc3RyaW5nLFxuICBkZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgb3duZXJQdWJsaWNLZXkgPSBkZWNvZGVSdW5QdWJsaWNLZXkoZW5jcnlwdGlvblB1YmxpY0tleSk7XG4gIGlmIChvd25lclB1YmxpY0tleSkgcmV0dXJuIHNlYWxUbyhvd25lclB1YmxpY0tleSk7XG5cbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgaWYgKCF3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJhd0tleSA9IGRlcGxveW1lbnRJZFxuICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihydW5JZCwgeyBkZXBsb3ltZW50SWQgfSlcbiAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4oYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQpKTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXksIFsnZW5jcnlwdCddKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gdGhlIGNsaWVudCBzaWRlLFxuICogcmVjZWl2aW5nIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG5cbiAgICAvLyBTdGVwRnVuY3Rpb24gc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cyB0byBjbGllbnRzXG4gICAgU3RlcEZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAnU3RlcCBmdW5jdGlvbnMgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBpbiBjbGllbnQgY29udGV4dC4gU3RlcCBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cy4nLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ0Egc3RlcCBmdW5jdGlvbiByZWZlcmVuY2UgcmVhY2hlZCB0aGUgY2xpZW50LiBSZXR1cm4gYSBzZXJpYWxpemFibGUgdmFsdWUgKGUuZy4gdGhlIHN0ZXAgcmVzdWx0KSBpbnN0ZWFkIG9mIHRoZSBzdGVwIGl0c2VsZi4nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiBzdHJpbmcgfSA9IHtcbiAgICAgICAgbWV0aG9kOiB2YWx1ZS5tZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgaW5pdC5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdsb2JhbC5SZXF1ZXN0KHZhbHVlLnVybCwgaW5pdCk7XG4gICAgICAvLyBUaGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGludGVybmFsIHNpZ25hbCBjb3B5LCBzbyB0aGVcbiAgICAgIC8vIGFib3J0LWludGVybmFsIHN5bWJvbHMgc2V0IGJ5IHJldml2ZUFib3J0U2lnbmFsIGRvbid0IHByb3BhZ2F0ZS5cbiAgICAgIC8vIFJlLXRhZyB0aGUgcmVxdWVzdCdzIG93biBzaWduYWwgc28gY2FuY2VsQWJvcnRSZWFkZXJzIGNhbiBmaW5kIGl0LlxuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgY29weUFib3J0SW50ZXJuYWxzKHZhbHVlLnNpZ25hbCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIG91dHNpZGUgdGhlIHdvcmtmbG93XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAvLyBGb3IgYnl0ZSBzdHJlYW1zLCB1c2UgZmx1c2hhYmxlIHBpcGUgd2l0aCBsb2NrIHBvbGxpbmcuXG4gICAgICAgIC8vIElmIHRoZSBwcm9kdWNlciB3cm90ZSBmcmFtZWQgYnl0ZXMgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBsZW5ndGgtcHJlZml4IGVudmVsb3BlIGJlZm9yZSBoYW5kaW5nIGNodW5rcyB0b1xuICAgICAgICAvLyB0aGUgdXNlci4gQWJzZW50IC8gJ3JhdycgZnJhbWluZyBtZWFucyBsZWdhY3kgcmF3IGJ5dGVzOlxuICAgICAgICAvLyBwaXBlIHRocm91Z2ggdW5jaGFuZ2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm8gYXV0by1yZWNvbm5lY3QgaGVyZSB5ZXQ6IHJhdyBieXRlIHN0cmVhbXMgaGF2ZSBubyB3aXJlXG4gICAgICAgIC8vIGZyYW1pbmcgdG8gY291bnQgY29uc3VtZWQgY2h1bmtzIHdpdGguIEZyYW1lZC12MSBieXRlIHN0cmVhbXNcbiAgICAgICAgLy8gbWFrZSBmcmFtZSBjb3VudGluZyBwb3NzaWJsZSwgc28gZXh0ZW5kaW5nIHRoZSByZWNvbm5lY3RpbmdcbiAgICAgICAgLy8gcmVhZGVyIHRvIHRoZW0gaXMgYSBzZXBhcmF0ZSBmb2xsb3ctdXAuXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdmFsdWUubmFtZSxcbiAgICAgICAgICB2YWx1ZS5zdGFydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9uLWJ5dGUgc3RyZWFtcyBjYXJyeSBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzLCBzbyB3ZSBjYW4gY291bnRcbiAgICAgICAgLy8gY29tcGxldGVkIGZyYW1lcyBhbmQgdHJhbnNwYXJlbnRseSByZWNvbm5lY3Qgd2hlbiB0aGUgc2VydmVyXG4gICAgICAgIC8vIHN0cmVhbSBjb25uZWN0aW9uIHRpbWVzIG91dCBtaWQtcnVuLlxuICAgICAgICBjb25zdCByZWFkYWJsZSA9IGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHRyYW5zZm9ybS53cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHRyYW5zZm9ybS5yZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ucmVhZGFibGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTYW1lIGhhbmRsaW5nIGFzIGBnZXRTdGVwUmV2aXZlcnMuV3JpdGFibGVTdHJlYW1gOiBzZWUgY29tbWVudHNcbiAgICAgIC8vIHRoZXJlIGZvciB0aGUgY3Jvc3MtcnVuIGNhc2UgKHdyaXRhYmxlIGNhcnJpZXMgYHJ1bklkYCBmcm9tXG4gICAgICAvLyBwYXJlbnQg4oaSIGNoaWxkIGZvcndhcmRpbmcgdmlhIGBzdGFydCgpYCkuXG4gICAgICBjb25zdCB0YXJnZXRSdW5JZCA9IHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZycgPyB2YWx1ZS5ydW5JZCA6IHJ1bklkO1xuICAgICAgY29uc3QgdGFyZ2V0S2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0gPVxuICAgICAgICB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICA/IGNyeXB0b0tleVxuICAgICAgICAgIDogZ2V0Rm9yd2FyZGVkV3JpdGFibGVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgICAgICAgdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5XG4gICAgICAgICAgICApO1xuXG4gICAgICBjb25zdCBzZXJpYWxpemUgPSBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX05BTUVfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdGFyZ2V0UnVuSWQsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgdGhlIG93bmVyJ3MgcHVibGljIGtleSBvbiB0aGUgaGFuZGxlIHNvIGEgZnVydGhlciBmb3J3YXJkIHN0YXlzIG9uXG4gICAgICAvLyB0aGUgemVyby1sb29rdXAgc2VhbGVkIHBhdGguXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIGNsaWVudCBzaWRlLCBhbmQgcmV0dXJuIHZhbHVlc1xuICogZnJvbSB0aGUgc3RlcHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IC0gdXNlcyB0aGUgbW9kdWxhciByZXZpdmVyXG4gICAgLy8gd2hpY2ggY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgZnJvbSBnbG9iYWwgdG8gcmVjb25zdHJ1Y3Qgc3RlcCBwcm94aWVzXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVxdWVzdC5wcm90b3R5cGUpO1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICAodmFsdWUgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICAodmFsdWUgYXMgYW55KS5yZXNwb25kV2l0aCA9ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2ByZXNwb25kV2l0aCgpYCBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHN0ZXAgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ01vdmUgdGhlIGByZXNwb25kV2l0aCguLi4pYCBjYWxsIGluc2lkZSBhIGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uIOKAlCBpdCBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICAvLyBXb3JrZmxvdyBmdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0OiByZXR1cm5zIGEgZnVuY3Rpb24tbGlrZVxuICAgIC8vIG9iamVjdCB3aXRoIC53b3JrZmxvd0lkIHRoYXQgbWltaWNzIHdoYXQgdGhlIFNXQyBjb21waWxlciBwcm9kdWNlcyxcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBCb2R5SW5pdCB0aGF0IHNob3VsZCBiZSB3cmFwcGVkIGluIGEgZmFrZSBzdHJlYW1cbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIHRoZSBmYWtlIHN0cmVhbSB3aXRoIHRoZSBCb2R5SW5pdFxuICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuYm9keUluaXQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ3VsYXIgc3RyZWFtIGhhbmRsaW5nXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBbU1RSRUFNX1RZUEVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FycnkgdGhlIHdpcmUtZnJhbWluZyBkZWNpc2lvbiB0aHJvdWdoIHRoZSB3b3JrZmxvdyBWTSBzb1xuICAgICAgICAvLyB0aGF0IHdoZW4gdGhlIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwICh3aGljaCByZWFkc1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGJ5dGVzIGZyb20gdGhlIHNlcnZlcikgd2Uga25vdyB3aGV0aGVyIHRvIHVuZnJhbWUuXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuZGVmaW5lZCBmb3Igc3RyZWFtcyB3aG9zZSBzZXJpYWxpemVkIHJlZiBkaWRuJ3RcbiAgICAgICAgLy8gY2FycnkgdGhlIGZpZWxkOyB0aG9zZSBhcmUgdHJlYXRlZCBhcyBsZWdhY3kgcmF3IGJ5dGVzLlxuICAgICAgICBbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5mcmFtaW5nLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuIHRoZVxuICAgICAgLy8gaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlci5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUucnVuSWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3duZXIncyBwdWJsaWMga2V5IGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHJ1bklkXG4gICAgICAvLyBhYm92ZS4gV2l0aG91dCBpdCwgZm9yd2FyZGluZyBhIHdyaXRhYmxlIHRocm91Z2ggYSB3b3JrZmxvdyB0byBhIHN0ZXBcbiAgICAgIC8vIHNpbGVudGx5IGRyb3BzIHRoZSBrZXksIGFuZCB0aGUgc3RlcCBmYWxscyBiYWNrIHRvIGZldGNoaW5nIHRoZVxuICAgICAgLy8gb3duZXIncyBzeW1tZXRyaWMga2V5LCB0aGUgcm91bmQgdHJpcCBzZWFsaW5nIGV4aXN0cyB0byByZW1vdmUuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXksXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgZGVzY3JpcHRvcik7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZXZpdmVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0uIFVzZSB0aGVcbiAgICAvLyByZWFsIFdvcmtmbG93QWJvcnRTaWduYWwgY2xhc3Mgc28gYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbikgYWN0dWFsbHlcbiAgICAvLyBmaXJlcyB3aGVuIHRoZSBzaWduYWwgYWJvcnRzICh0aGUgcHJldmlvdXMgbm8tb3Agc3R1YiBzaWxlbnRseSBkcm9wcGVkXG4gICAgLy8gbGlzdGVuZXIgcmVnaXN0cmF0aW9ucywgYSBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmU7IGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlLCBub3QgdHJ1dGhpbmVzcywgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlczpcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuOiBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW07IGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHRhcmdldERlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgLy8gUmVjb3JkIHRoZSB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCBzbyBkb3duc3RyZWFtIHJlZHVjZXJzIGNhblxuICAgICAgLy8gcmVjb2duaXplIHRoYXQgdGhpcyB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtLiBXaGVuIGZvcndhcmRlZCBhY3Jvc3MgYHN0YXJ0KClgIGFnYWluIChlLmcuXG4gICAgICAvLyB0aGUgY2hpbGQgcGFzc2VzIHRoaXMgd3JpdGFibGUgb24gdG8gYSBncmFuZGNoaWxkKSwgdGhlXG4gICAgICAvLyBleHRlcm5hbCByZWR1Y2VyIG5lZWRzIGJvdGggdG8gZW1pdCB0aGUgb3JpZ2luYWwgYHJ1bklkYCBpblxuICAgICAgLy8gdGhlIGRlc2NyaXB0b3IuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodGFyZ2V0RGVwbG95bWVudElkKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGFyZ2V0RGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgdGhlIG93bmVyJ3MgcHVibGljIGtleSBvbiB0aGUgaGFuZGxlIHNvIGEgZnVydGhlciBmb3J3YXJkIHN0YXlzIG9uXG4gICAgICAvLyB0aGUgemVyby1sb29rdXAgc2VhbGVkIHBhdGguXG4gICAgICAvL1xuICAgICAgLy8gV2hlbiB0aGUgZGVzY3JpcHRvciBjYXJyaWVzIG5vIGtleSBhbmQgdGhlIHN0cmVhbSBiZWxvbmdzIHRvIFRISVMgcnVuLFxuICAgICAgLy8gZGVyaXZlIGl0LiBBIHdyaXRhYmxlIHRha2VuIHdpdGggYGdldFdyaXRhYmxlKClgIGluIGEgd29ya2Zsb3cgYm9keSBoYXNcbiAgICAgIC8vIG9ubHkgYSBuYW1lIG9uIGl0ICh0aGUgd29ya2Zsb3cgVk0gaG9sZHMgbm8ga2V5IG1hdGVyaWFsIGJ5IGRlc2lnbiksXG4gICAgICAvLyBzbyBub3RoaW5nIGNvdWxkIHB1Ymxpc2ggdGhlIGtleSB3aGVuIHRoZSBoYW5kbGUgd2FzIGNyZWF0ZWQuIFJldml2aW5nXG4gICAgICAvLyBoYXBwZW5zIGluIGEgc3RlcCwgd2hpY2ggZG9lcyBob2xkIHRoaXMgcnVuJ3Mga2V5LCBhbmQgYW55IGxhdGVyXG4gICAgICAvLyBmb3J3YXJkIHRoZW4gY29waWVzIHRoZSBzeW1ib2wuXG4gICAgICAvL1xuICAgICAgLy8gSXQgaGFzIHRvIGhhcHBlbiBoZXJlIHJhdGhlciB0aGFuIGF0IHNlcmlhbGl6YXRpb24gdGltZTogYHN0YXJ0KClgXG4gICAgICAvLyBkZWh5ZHJhdGVzIGl0cyBhcmd1bWVudHMgd2l0aCB0aGUgQ0hJTEQncyBydW5JZCBhbmQgdGhlIENISUxEJ3Mga2V5LCBzb1xuICAgICAgLy8gdGhlIG93bmluZyBydW4ncyBrZXkgaXMgbm8gbG9uZ2VyIGluIHNjb3BlIGJ5IHRoZW4uXG4gICAgICAvL1xuICAgICAgLy8gYHRhcmdldFJ1bklkID09PSBydW5JZGAgaXMgdGhlIGd1YXJkIHRoYXQgbWF0dGVycy4gRm9yIGEgc3RyZWFtIGFub3RoZXJcbiAgICAgIC8vIHJ1biBvd25zIHdlIG11c3Qgbm90IGFkdmVydGlzZSBvdXIga2V5OiB0aGUgcmVjZWl2ZXIgd291bGQgc2VhbCB0byB1c1xuICAgICAgLy8gYW5kIHRoZSByZWFsIG93bmVyIGNvdWxkIG5ldmVyIG9wZW4gd2hhdCBpdCB3cm90ZS5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICBpc1J1blBheWxvYWRLZXlzKGNyeXB0b0tleSlcbiAgICAgICkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgc2VyaWFsaXplLndyaXRhYmxlLFxuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IGJ5dGVzVG9CYXNlNjQoY3J5cHRvS2V5LmtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5jcnlwdGlvbiBIZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBgZW5jcnlwdGAvYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYFxuLy8gYnV0IGFyZSBrZXB0IGFzIG5hbWVkIGV4cG9ydHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29uc3VtZXJzLlxuXG4vKipcbiAqIEVuY3J5cHQgZGF0YSBpZiB0aGUgd29ybGQgc3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqIFJldHVybnMgb3JpZ2luYWwgZGF0YSBpZiBlbmNyeXB0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBlbmNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRW5jcnlwdChcbiAgZGF0YTogVWludDhBcnJheSxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBlbmNyeXB0KGRhdGEsIGtleSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIGlmIGl0IGhhcyB0aGUgJ2VuY3InIHByZWZpeC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVEZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiBkZWNyeXB0KGRhdGEsIGtleSk7XG59XG5cbi8qKlxuICogUmVwbGF5IGh5ZHJhdGlvbiBoYXMgdHdvIHN0YWdlczpcbiAqXG4gKiAxLiBIb3N0LXNpZGUgcHJlcGFyYXRpb24gZGVjcnlwdHMgYW5kIGRlY29tcHJlc3NlcyBwZXJzaXN0ZWQgZGF0YS4gVGhhdCB3b3JrXG4gKiAgICBpcyBpbmRlcGVuZGVudCBvZiBhIHdvcmtmbG93IFZNIGFuZCBjYW4gYmUgY2FjaGVkIGFjcm9zcyByZXBsYXkgVk1zLlxuICogMi4gRGVzZXJpYWxpemF0aW9uIHJldml2ZXMgdGhlIHByZXBhcmVkIHJlcHJlc2VudGF0aW9uIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAqICAgIFZNJ3MgZ2xvYmFscy4gSXQgbXVzdCBydW4gYWdhaW4gZm9yIGV2ZXJ5IFZNIHRvIHByb2R1Y2UgZnJlc2ggb2JqZWN0IGdyYXBoc1xuICogICAgYW5kIGNvcnJlY3RseSBzY29wZWQgV29ya2Zsb3cgb2JqZWN0cy5cbiAqXG4gKiBgZGF0YWAgaXMgdGhlIGJvdW5kYXJ5IGJldHdlZW4gdGhvc2Ugc3RhZ2VzLiBGb3IgY3VycmVudC1mb3JtYXQgcGF5bG9hZHMgaXRcbiAqIGlzIHN0aWxsIGZvcm1hdC1wcmVmaXhlZCBzZXJpYWxpemVkIGJ5dGVzLCBub3QgYSBsaXZlIEphdmFTY3JpcHQgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWRSZXBsYXlQYXlsb2FkIHtcbiAgcmVhZG9ubHkgZGF0YTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBTd2FwcGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbiBzdGFnZS4gU3VwcG9ydGluZ1xuICogYm90aCBkaXJlY3QgYW5kIHByb21pc2VkIHJlc3VsdHMgbGV0cyBhIGZ1dHVyZSBzeW5jaHJvbm91cyBOb2RlIGRlY3J5cHRvciB1c2VcbiAqIHRoZSBzYW1lIGNhY2hlIGNvbnRyYWN0IGFzIHRvZGF5J3MgYXN5bmNocm9ub3VzIFdlYiBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxheVBheWxvYWRQcmVwYXJlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKSA9PiBQcmVwYXJlZFJlcGxheVBheWxvYWQgfCBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD47XG5cbi8qKlxuICogRGVjcnlwdCBhbmQgZGVjb21wcmVzcyBwZXJzaXN0ZWQgZGF0YSB3aXRob3V0IHBhcnNpbmcgaXQgaW50byBKYXZhU2NyaXB0LlxuICogTGVnYWN5IG5vbi1iaW5hcnkgdmFsdWVzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIHRoZWlyIGNvbnN1bWVyIHRvIHJldml2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVSZXBsYXlQYXlsb2FkOiBSZXBsYXlQYXlsb2FkUHJlcGFyZXIgPSBhc3luYyAoXG4gIHZhbHVlLFxuICBrZXlcbikgPT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiB7IGRhdGE6IHByZXBhcmVkIH07XG59O1xuXG4vKipcbiAqIFBhcnNlIGEgcHJlcGFyZWQgd29ya2Zsb3cgYXJndW1lbnQgb3Igc3VjY2Vzc2Z1bCBzdGVwL2hvb2sgcGF5bG9hZCB1c2luZyB0aGVcbiAqIGN1cnJlbnQgd29ya2Zsb3cgVk0ncyBnbG9iYWxzIGFuZCByZXZpdmVycy4gRWFjaCBjYWxsIGludGVudGlvbmFsbHkgY3JlYXRlc1xuICogYSBmcmVzaCBvYmplY3QgZ3JhcGggc28gbXV0YXRpb25zIGNhbm5vdCBsZWFrIGFjcm9zcyByZXBsYXkgaXRlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBhbnkge1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUocHJlcGFyZWQuZGF0YSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2UgYSBwcmVwYXJlZCBzdGVwIGVycm9yIHVzaW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IFZNJ3MgY2xhc3MgcmV2aXZlcnMuXG4gKiBUaGlzIHByZXNlcnZlcyB0aHJvd24tdmFsdWUgaWRlbnRpdHkgd2l0aG91dCBzaGFyaW5nIG9iamVjdHMgYmV0d2VlbiBWTXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiB1bmtub3duIHtcbiAgY29uc3QgeyBkYXRhIH0gPSBwcmVwYXJlZDtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihkYXRhIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkYXRhKTtcbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgIHJldHVybiBwYXJzZShzdHIsIHtcbiAgICAgIC4uLmdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVoeWRyYXRlIC8gSHlkcmF0ZSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIG1vZGUgbW9kdWxlcyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgcGFzc2luZ1xuLy8gbW9kZS1zcGVjaWZpYyBzdHJlYW0gYW5kIFJlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMvcmV2aXZlcnMgYXMgZXh0cmEgb3B0aW9ucy5cbi8vIFRoZSB2MUNvbXBhdCBwYXRoIGlzIGhhbmRsZWQgaW5saW5lIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBtb2R1bGVzLlxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBgc3RhcnQoKWAgZnVuY3Rpb24gdG8gc2VyaWFsaXplIHRoZSB3b3JrZmxvdyBhcmd1bWVudHNcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGFuZCB0aGVuIGh5ZHJhdGVkIGZyb21cbiAqIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKHJlcXVpcmVkIGZvciBlbmNyeXB0aW9uIGNvbnRleHQpXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eTogc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBmcmFtZWRCeXRlU3RyZWFtcylcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi4gQSBwcmVwYXJlZFxuICogcGF5bG9hZCBza2lwcyBob3N0LXNpZGUgZGVjcnlwdC9kZWNvbXByZXNzIGJ1dCBhbHdheXMgcGVyZm9ybXMgVk0gcmV2aXZhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBEZWh5ZHJhdGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlIGZvciBzdG9yYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzaW5rIHJlY2VpdmluZyBldmVyeSB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbiBzZXJpYWxpemF0aW9uIGNvdWxkXG4gICAqIG5vdCBhdm9pZCwgZm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRoZW0gcHJvZ3JhbW1hdGljYWxseSAoZS5nLiBhXG4gICAqIHJldGFpbmVkLVZNIGdhdGUgZGVjaWRpbmcgd2hldGhlciB0aGUgVk0gaXMgc3RpbGwgcmV1c2FibGUpLiBUaGVcbiAgICogZXhlY3V0aW9ucyBhcmUgZW1pdHRlZCBhcyBzcGFuIGF0dHJpYnV0ZXMgZWl0aGVyIHdheSwgc28gb21pdHRpbmcgdGhpc1xuICAgKiBsb3NlcyBub3RoaW5nIG9ic2VydmFiaWxpdHktd2lzZS4gVGhlIHJldGFpbmVkLVZNIGdhdGUgaW5cbiAgICogcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIudHMgcGFzc2VzIG9uZSBmb3Igc3RlcC1pbnB1dCBkZWh5ZHJhdGlvbi5cbiAgICovXG4gIGd1ZXN0Q29kZVN0YXRzT3V0PzogR3Vlc3RDb2RlU3RhdHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBndWVzdENvZGVTdGF0czogR3Vlc3RDb2RlU3RhdHMgPSBndWVzdENvZGVTdGF0c091dCA/PyB7XG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgICAgZ3Vlc3RDb2RlU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIGF3YWl0IHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoZ3Vlc3RDb2RlU3RhdHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSlcbiAgICAgICksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gICAgY29tcHJlc3Npb25TdGF0cyxcbiAgfSk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gYSBzdGVwIGlzIGJlaW5nIGNyZWF0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKiBTZWUgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgLiAqL1xuICBndWVzdENvZGVTdGF0c091dD86IEd1ZXN0Q29kZVN0YXRzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgZ3Vlc3RDb2RlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0gZ3Vlc3RDb2RlU3RhdHNPdXQgPz8ge1xuICAgICAgZXhlY3V0aW9uczogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICAgIGd1ZXN0Q29kZVN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICBhd2FpdCByZWNvcmRHdWVzdENvZGVFeGVjdXRpb25zKGd1ZXN0Q29kZVN0YXRzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBhcmd1bWVudHMnLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3IgdG8gaHlkcmF0ZSB0aGUgYXJndW1lbnRzIG9mIGEgc3RlcFxuICogZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdGVwIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCBoYXMgY29tcGxldGVkLlxuICogRGVoeWRyYXRlcyB2YWx1ZXMgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHk6IHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IG9yZGVyIHRoZSBmaXJzdCBjaHVuayBvZiBhIHJldHVybmVkIHN0cmVhbSBhZnRlclxuICAvLyB0aGUgYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAuIFRocmVhZGVkIGludG8gdGhlIHN0ZXAgcmVkdWNlcnMnIHN0cmVhbVxuICAvLyBzaW5rLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApXG4gICAgICApLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICdzdGVwIHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3Igd2hlbiBhIHN0ZXAgdGhyb3dzLiBEZWh5ZHJhdGVzIHRoZSB0aHJvd25cbiAqIHZhbHVlIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuXG4gKiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC5cbiAqXG4gKiBBbnkgSmF2YVNjcmlwdCB2YWx1ZSBjYW4gYmUgdGhyb3duIChzdHJpbmdzLCBudW1iZXJzLCBvYmplY3RzLCBFcnJvcnMsXG4gKiBFcnJvciBzdWJjbGFzc2VzKSwgc28gdGhlIHNhbWUgc2VyaWFsaXphdGlvbiBwaXBlbGluZSB1c2VkIGZvciBzdGVwXG4gKiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgaXMgYXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTxhbnk+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpKTtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIC8vIENvbXByZXNzIGJlZm9yZSBlbmNyeXB0aW5nOiBlbmNyeXB0ZWQgYnl0ZXMgZG9uJ3QgY29tcHJlc3MuXG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBjb21wcmVzcyhcbiAgICAgIHNlcmlhbGl6ZWQsXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICBjb21wcmVzc2VkIGFzIFVpbnQ4QXJyYXksXG4gICAgICBrZXlcbiAgICApKSBhcyBVaW50OEFycmF5O1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGFcbiAqIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LiBIeWRyYXRlcyB0aGUgdGhyb3duIHZhbHVlIGZyb21cbiAqIHRoZSBkYXRhYmFzZSBzbyB0aGUgd29ya2Zsb3cgY2FuIHNlZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byByZWplY3QgdGhlIHN0ZXAgcHJvbWlzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHRoZSB3b3JrZmxvdyBpdHNlbGYgdGhyb3dzLlxuICogRGVoeWRyYXRlcyB0aGUgdGhyb3duIHZhbHVlIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGluIGEgYHJ1bl9mYWlsZWRgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlUnVuRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZzogZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3J1biBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgKG9yIG9ic2VydmFiaWxpdHkgdG9vbHMpIHRvIGh5ZHJhdGUgdGhlIHJ1blxuICogZXJyb3IgdmFsdWUgb2YgYSBmYWlsZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gYmUgY29uc3VtZWQgYnkgdGhlIGNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG5cbiAgaWYgKCEoZGVjcnlwdGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAvLyBTZWUgdGhlIG1hdGNoaW5nIG5vdGUgaW4gYGh5ZHJhdGVTdGVwRXJyb3JgOiB0aGlzIGJyYW5jaCBpcyBmb3JcbiAgICAvLyBkZXZhbHVlIGZsYXR0ZW5lZCBhcnJheXMgZnJvbSBsZWdhY3kgY2FsbGVyczsgY3VycmVudCBTREsgdmVyc2lvbnNcbiAgICAvLyBhbHdheXMgZW1pdCBhIFVpbnQ4QXJyYXksIGFuZCBhIG1pc3NoYXBlbiB2YWx1ZSBoZXJlIGludGVudGlvbmFsbHlcbiAgICAvLyB0aHJvd3MgdmlhIGB1bmZsYXR0ZW5gIHNvIHRoZSBzdXJyb3VuZGluZyB0cnkvY2F0Y2ggaW4gbzExeSBoZWxwZXJzXG4gICAgLy8gc3VyZmFjZXMgdGhlIGlzc3VlIHJhdGhlciB0aGFuIG1hc2tpbmcgaXQuXG4gICAgcmV0dXJuIHVuZmxhdHRlbihkZWNyeXB0ZWQgYXMgYW55W10sIHtcbiAgICAgIC4uLmdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKTtcblxuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKiBIeWRyYXRlcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc3RlcCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcGFyYW0gcHJlcGFyZWQgLSBPcHRpb25hbCBjYWNoZWQgZGVjcnlwdC9kZWNvbXByZXNzIHJlc3VsdFxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZ1xuICogb2YgYSBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIHRvIGV4dHJhY3Qgc3RyZWFtL1JlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMgYW5kIHJldml2ZXJzIC0tLS1cbi8vIFRoZSBtb2RlLXNwZWNpZmljIGdldCpSZWR1Y2Vycy9nZXQqUmV2aXZlcnMgZnVuY3Rpb25zIHJldHVybiBvYmplY3RzIHRoYXRcbi8vIGluY2x1ZGUgYm90aCBcImNvbW1vblwiIGVudHJpZXMgKERhdGUsIEVycm9yLCBNYXAsIGV0Yy4pIGFuZCBtb2RlLXNwZWNpZmljXG4vLyBlbnRyaWVzIChSZWFkYWJsZVN0cmVhbSwgV3JpdGFibGVTdHJlYW0sIFJlcXVlc3QsIFJlc3BvbnNlLCBTdGVwRnVuY3Rpb24pLlxuLy8gVGhlIGNvbW1vbiBlbnRyaWVzIGFyZSBhbHJlYWR5IGNvbXBvc2VkIGJ5IHRoZSBjb2RlYy4gV2Ugb25seSBuZWVkIHRvXG4vLyBwYXNzIHRocm91Z2ggdGhlIG1vZGUtc3BlY2lmaWMgZW50cmllcyBhcyBleHRyYVJlZHVjZXJzL2V4dHJhUmV2aXZlcnMuXG5cbmNvbnN0IFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTID0gW1xuICAnUmVhZGFibGVTdHJlYW0nLFxuICAnV3JpdGFibGVTdHJlYW0nLFxuICAnUmVxdWVzdCcsXG4gICdSZXNwb25zZScsXG4gICdTdGVwRnVuY3Rpb24nLFxuICAvLyBXaXJlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCB0aHJvdWdoIHRoZSBjbGllbnQgc2VyaWFsaXphdGlvbiBwYXRoIHNvXG4gIC8vIHNpZ25hbHMgcmVhY2hhYmxlIHZpYSBSZXF1ZXN0LnNpZ25hbCAob3IgYXMgZGlyZWN0IGFyZ3VtZW50cykgZ2V0IHRoZWlyXG4gIC8vIGRlZGljYXRlZCByZWR1Y2VyLiBXaXRob3V0IHRoaXMsIGRldmFsdWUgZmFsbHMgYmFjayB0byBpdHMgYXJiaXRyYXJ5LVBPSk9cbiAgLy8gcGF0aCBhbmQgZmFpbHMgZm9yIGFueSBzaWduYWwgdGhlIFJlcXVlc3QgcmVkdWNlciBmb3J3YXJkcy5cbiAgJ0Fib3J0Q29udHJvbGxlcicsXG4gICdBYm9ydFNpZ25hbCcsXG5dIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gIGFsbFJlZHVjZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmVkdWNlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgYWxsUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZXZpdmVycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJldml2ZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cbiJdfQ==
|
|
3073
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSxnQ0FBZ0MsQ0FB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QyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUNsQyxXQUFnQztJQUVoQyxNQUFNLEtBQUssR0FBd0MsRUFBRSxDQUFDO0lBQ3RELEtBQUssTUFBTSxHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUnVudGltZURlY3J5cHRpb25FcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBTdHJlYW1FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIGdldE1heEJ1ZmZlcmVkQnl0ZXMsXG4gIGdldE1heEJ5dGVzUGVyQmF0Y2gsXG4gIGdldE1heENodW5rc1BlckJhdGNoLFxuICBnZXRNYXhJbmZsaWdodENodW5rcyxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyB3b3JsZC50cyBtb2R1bGUgKGFuZCBpdHMgZHluYW1pYy1pbXBvcnQgYmVoYXZpb3VyKSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGNyZWF0ZU9wZW5TZXNzaW9uLFxuICBjcmVhdGVTZWFsU2Vzc2lvbixcbiAgZGVjb2RlUnVuUHVibGljS2V5LFxufSBmcm9tICcuL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGFlc0tleU9mLFxuICBkZWNyeXB0LFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbiAgcnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgR3Vlc3RDb2RlU3RhdHMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgcmVhZFByb3BlcnR5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0RSQUlOX1NZTUJPTCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgLy8gU2VhbGVkLWJveCAoJ2VuY3AnKSBrZXkgdmFyaWFudHM6IHNlZSBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG4gIHJ1blBheWxvYWRLZXlzLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgaXNTZWFsVGFyZ2V0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBhZXNLZXlPZixcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlLCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aDogYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgT1RlbCBzcGFuIGF0dHJpYnV0ZXMgZm9yIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpb25zIHRoYXQgdGhlXG4gKiBoYXJkZW5lZCBzZXJpYWxpemVyIGNvdWxkIG5vdCBhdm9pZCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tXG4gKiBzZXJpYWxpemVycykuIE5vLW9wcyB3aGVuIHNlcmlhbGl6YXRpb24gd2FzIGZ1bGx5IHNpZGUtZWZmZWN0IGZyZWUsXG4gKiB0aGUgY29tbW9uIGNhc2UuIFNhbWUgbmV2ZXItYnJlYWstdGhlLWRhdGEtcGF0aCBjb250cmFjdCBhc1xuICogYHJlY29yZENvbXByZXNzaW9uYCBhYm92ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0czogR3Vlc3RDb2RlU3RhdHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdG90YWxFeGVjdXRpb25zID0gc3RhdHMudG90YWxFeGVjdXRpb25zID8/IHN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoO1xuICBpZiAodG90YWxFeGVjdXRpb25zID09PSAwKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgc3RhdHMuZXhlY3V0aW9ucy5tYXAoKGUpID0+XG4gICAgICAgICAgZS5kZXRhaWwgPyBgJHtlLmtpbmR9ICgke2UuZGV0YWlsfSlgIDogZS5raW5kXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyh0b3RhbEV4ZWN1dGlvbnMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRGV0YWlscyhkZXRhaWxzKSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJpYWxpemVTdHJlYW0oXG4gIHJlZHVjZXJzOiBQYXJ0aWFsPFJlZHVjZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIC8vIE5vdGU6IGlmIHJlc29sdmluZyBjcnlwdG9LZXkgcmVqZWN0cyAoZS5nLiwgbmV0d29yayBlcnJvciBmZXRjaGluZ1xuICAvLyB0aGUgZGVyaXZlZCBrZXkpLCB0aGUgcmVqZWN0aW9uIHdvbid0IHN1cmZhY2UgdW50aWwgdGhlIGZpcnN0IGNodW5rXG4gIC8vIGlzIHByb2Nlc3NlZCwgbm90IGF0IHN0cmVhbSBjb25zdHJ1Y3Rpb24gdGltZS5cbiAgY29uc3Qga2V5U3RhdGUgPSB7XG4gICAgcmVzb2x2ZWQ6IGZhbHNlLFxuICAgIGtleTogdW5kZWZpbmVkIGFzIFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIH07XG4gIC8vIFNldCB3aGVuIHRoZSByZXNvbHZlZCBrZXkgaXMgYSBzZWFsIHRhcmdldDsgYW1vcnRpemVzIHRoZSBLRU0gYWNyb3NzIGFsbFxuICAvLyBmcmFtZXMgdGhpcyBzdHJlYW0gaW5zdGFuY2Ugd3JpdGVzLlxuICBsZXQgc2VhbFNlc3Npb246IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVNlYWxTZXNzaW9uPiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXNTZWFsVGFyZ2V0KGtleVN0YXRlLmtleSkpIHtcbiAgICAgICAgICAgIHNlYWxTZXNzaW9uID0gY3JlYXRlU2VhbFNlc3Npb24oXG4gICAgICAgICAgICAgIGtleVN0YXRlLmtleS5yZWNpcGllbnRQdWJsaWNLZXksXG4gICAgICAgICAgICAgIGtleVN0YXRlLmtleS5hYWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnkoY2h1bmssIHJlZHVjZXJzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHNlcmlhbGl6ZWQpO1xuICAgICAgICBsZXQgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICkgYXMgVWludDhBcnJheTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBmcmFtZSBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICAgICAgICAvLyBUaGUgbGVuZ3RoIGhlYWRlciByZW1haW5zIGluIHRoZSBjbGVhciBzbyB0aGUgZGVzZXJpYWxpemVyIGNhblxuICAgICAgICAvLyBmaW5kIGZyYW1lIGJvdW5kYXJpZXMgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEV2ZXJ5IGZyYW1lIGdldHMgYSBmcmVzaCByYW5kb20gbm9uY2UuIE5ldmVyIHN3aXRjaCB0aGlzIHRvIGFcbiAgICAgICAgLy8gY291bnRlcjogYSBzdHJlYW0gcmVjb25uZWN0IG9yIGEgZHVyYWJsZSByZXBsYXkgcmVzdGFydHMgdGhlIHdyaXRlcixcbiAgICAgICAgLy8gd2hpY2ggd291bGQgcmVwZWF0IGAoa2V5LCBub25jZSlgIGFuZCBjYXRhc3Ryb3BoaWNhbGx5IGJyZWFrXG4gICAgICAgIC8vIEFFUy1HQ00uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIHRoZSBzZWFsZWQgcGF0aCB0aGUgS0VNIGlzIGFtb3J0aXplZCBhY3Jvc3MgdGhlIHN0cmVhbSB2aWEgYVxuICAgICAgICAvLyBzZXNzaW9uIChvbmUgRUNESCBwZXIgd3JpdGVyIGluc3RlYWQgb2Ygb25lIHBlciBmcmFtZSkuIFRoYXQgaXMgc2FmZVxuICAgICAgICAvLyBwcmVjaXNlbHkgYmVjYXVzZSB0aGUgbm9uY2VzIHN0YXkgcmFuZG9tLCBhbmQgYmVjYXVzZSB0aGUgc2Vzc2lvbiBpc1xuICAgICAgICAvLyBzY29wZWQgdG8gdGhpcyBzdHJlYW0gaW5zdGFuY2U6IGEgcmVwbGF5ZWQgb3IgcmVjb25uZWN0ZWQgd3JpdGVyXG4gICAgICAgIC8vIGJ1aWxkcyBhIG5ldyBvbmUgYW5kIG5ldmVyIGluaGVyaXRzIGEgcHJldmlvdXMgY29udGVudCBrZXkuXG4gICAgICAgIGlmIChzZWFsU2Vzc2lvbikge1xuICAgICAgICAgIHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVELFxuICAgICAgICAgICAgYXdhaXQgc2VhbFNlc3Npb24uc2VhbChwcmVmaXhlZClcbiAgICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5U3RhdGUua2V5KSB7XG4gICAgICAgICAgcHJlZml4ZWQgPSAoYXdhaXQgZW5jcnlwdChwcmVmaXhlZCwga2V5U3RhdGUua2V5KSkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZTogWzQtYnl0ZSBsZW5ndGhdW3ByZWZpeGVkIGRhdGFdXG4gICAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBwcmVmaXhlZC5sZW5ndGgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgcHJlZml4ZWQubGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgIGZyYW1lLnNldChwcmVmaXhlZCwgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRW5jcnlwdGlvbiBmYWlsdXJlcyBtdXN0IGtlZXAgdGhlaXIgUnVudGltZURlY3J5cHRpb25FcnJvclxuICAgICAgICAvLyBpZGVudGl0eSAoUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYmUgcmVmcmFtZWQgYXMgYVxuICAgICAgICAvLyBTZXJpYWxpemF0aW9uRXJyb3IgKFVTRVJfRVJST1IpLlxuICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ3N0cmVhbSBjaHVuaycsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgcmV2aXZlcnM6IFBhcnRpYWw8UmV2aXZlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4ge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICBjb25zdCBrZXlTdGF0ZSA9IHtcbiAgICByZXNvbHZlZDogZmFsc2UsXG4gICAga2V5OiB1bmRlZmluZWQgYXMgUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgLy8gTWlycm9yIG9mIHRoZSB3cml0ZXIncyBzZWFsIHNlc3Npb246IGV2ZXJ5IGZyYW1lIGZyb20gb25lIHdyaXRlciBjYXJyaWVzXG4gIC8vIHRoZSBzYW1lIGVwaGVtZXJhbCBwdWJsaWMga2V5LCBzbyB0aGlzIHR1cm5zIGFuIEVDREggcGVyIGZyYW1lIGludG8gYW5cbiAgLy8gRUNESCBwZXIgd3JpdGVyLlxuICBsZXQgb3BlblNlc3Npb246IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZU9wZW5TZXNzaW9uPiB8IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXdCdWZmZXIuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV3QnVmZmVyLnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXdCdWZmZXI7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzKFxuICAgIGNvbnRyb2xsZXI6IFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyPGFueT5cbiAgKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0XG4gICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIGlmIChpc1J1blBheWxvYWRLZXlzKGtleVN0YXRlLmtleSkpIHtcbiAgICAgICAgb3BlblNlc3Npb24gPSBjcmVhdGVPcGVuU2Vzc2lvbihrZXlTdGF0ZS5rZXkua2V5UGFpciwga2V5U3RhdGUua2V5LmFhZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgY29tcGxldGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lc1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCkge1xuICAgICAgICBicmVhazsgLy8gSW5jb21wbGV0ZSBmcmFtZSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYW1lRGF0YSA9IGJ1ZmZlci5zbGljZShcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUsXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGhcbiAgICAgICk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCk7XG5cbiAgICAgIGxldCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSk7XG5cbiAgICAgIC8vIElmIHRoZSBmcmFtZSBwYXlsb2FkIGlzIGVuY3J5cHRlZCBvciBzZWFsZWQsIHJlY292ZXIgaXQgZmlyc3QgdG9cbiAgICAgIC8vIHJldmVhbCB0aGUgaW5uZXIgZm9ybWF0LXByZWZpeGVkIGRhdGEgKGUuZy4sICdkZXZsJyArIHNlcmlhbGl6ZWRcbiAgICAgIC8vIHRleHQpLCB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGRlc2VyaWFsaXphdGlvbiBwYXRoLlxuICAgICAgaWYgKFxuICAgICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEIHx8XG4gICAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRURcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWFsZWQgPSBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVEO1xuICAgICAgICAvLyBBIHNlYWxlZCBmcmFtZSBuZWVkcyB0aGUgcnVuJ3Mga2V5cGFpcjsgYSBzeW1tZXRyaWMgZnJhbWUgbmVlZHMgYW5cbiAgICAgICAgLy8gQUVTIGtleS4gUmVwb3J0IHRoZSBzaG9ydGZhbGwgcHJlY2lzZWx5OiBcIm5vIGtleSBhdCBhbGxcIiBhbmQgXCJ0aGVcbiAgICAgICAgLy8gd3Jvbmcga2luZCBvZiBrZXlcIiBoYXZlIGRpc3RpbmN0IGNhdXNlcy5cbiAgICAgICAgY29uc3QgdXNhYmxlID0gc2VhbGVkXG4gICAgICAgICAgPyBpc1J1blBheWxvYWRLZXlzKGtleVN0YXRlLmtleSlcbiAgICAgICAgICA6IGFlc0tleU9mKGtleVN0YXRlLmtleSkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF1c2FibGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICAgICAgICAgIHNlYWxlZFxuICAgICAgICAgICAgICAgID8gJ1NlYWxlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gcnVuIGtleXBhaXIgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgXCJPcGVuaW5nIGEgc2VhbGVkIGZyYW1lIHJlcXVpcmVzIHRoZSBydW4ncyBvd24gZW5jcnlwdGlvbiBrZXkgbWF0ZXJpYWwuXCJcbiAgICAgICAgICAgICAgICA6ICdFbmNyeXB0ZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIGVuY3J5cHRpb24ga2V5IGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdFbmNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIG9yIG5vIGtleSB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgcnVuLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGg6IHBheWxvYWQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdFByZWZpeDogc2VhbGVkID8gJ2VuY3AnIDogJ2VuY3InLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVjcnlwdGVkOiBVaW50OEFycmF5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNlYWxlZCBmcmFtZXMgZ28gdGhyb3VnaCB0aGUgc2Vzc2lvbiBzbyByZXBlYXRlZCBmcmFtZXMgZnJvbSBvbmVcbiAgICAgICAgICAvLyB3cml0ZXIgcmV1c2UgYSBzaW5nbGUgZGVjYXBzdWxhdGlvbi4gRXZlcnl0aGluZyBlbHNlIGRlbGVnYXRlcyB0b1xuICAgICAgICAgIC8vIHRoZSBzaGFyZWQgZW52ZWxvcGUgbGF5ZXIsIGtlZXBpbmcgdGhlIHR3byBzY2hlbWVzIGluIGxvY2tzdGVwXG4gICAgICAgICAgLy8gd2l0aCB0aGUgb25lLXNob3QgcGF0aC5cbiAgICAgICAgICBkZWNyeXB0ZWQgPSBzZWFsZWRcbiAgICAgICAgICAgID8gYXdhaXQgb3BlblNlc3Npb24hLm9wZW4oZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSkucGF5bG9hZClcbiAgICAgICAgICAgIDogKChhd2FpdCBkZWNyeXB0KGZyYW1lRGF0YSwga2V5U3RhdGUua2V5KSkgYXMgVWludDhBcnJheSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGxvdy1sZXZlbCBjcnlwdG8gbGF5ZXIgb25seSBzZWVzIHRoZSBzdHJpcHBlZCBwYXlsb2FkLCBzbyBpdFxuICAgICAgICAgIC8vIGNhbm5vdCByZWNvcmQgdGhlIG91dGVyIGVudmVsb3BlIHByZWZpeC4gV2UgcGVla2VkIGl0IGhlcmUsIHNvXG4gICAgICAgICAgLy8gZW5yaWNoIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgd2l0aCB0aGUgcmVhbCBmb3JtYXQgcHJlZml4IGJlZm9yZVxuICAgICAgICAgIC8vIHByb3BhZ2F0aW5nLCBtaXJyb3Jpbmcgc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLnRzLlxuICAgICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSAmJiBlcnJvci5jb250ZXh0KSB7XG4gICAgICAgICAgICBlcnJvci5jb250ZXh0LmZvcm1hdFByZWZpeCA9IGZvcm1hdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgKHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUocGF5bG9hZCk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZSh0ZXh0LCByZXZpdmVycykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAvLyBGaXJzdCwgdHJ5IHRvIGRldGVjdCBpZiB0aGlzIGlzIGxlbmd0aC1wcmVmaXhlZCBmcmFtZWQgZGF0YVxuICAgICAgLy8gYnkgY2hlY2tpbmcgaWYgdGhlIGZpcnN0IDQgYnl0ZXMgZm9ybSBhIHBsYXVzaWJsZSBsZW5ndGguXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiBjaHVuay5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgY2h1bmsuYnVmZmVyLFxuICAgICAgICAgIGNodW5rLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA8IDEwMF8wMDBfMDAwIC8vIHNhbml0eSBjaGVjazogPCAxMDBNQlxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBMb29rcyBsaWtlIGZyYW1lZCBkYXRhXG4gICAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEFscmVhZHkgaW4gZnJhbWVkIG1vZGUgKGhhdmUgYnVmZmVyZWQgZGF0YSlcbiAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBmb3JtYXQ6IG5ld2xpbmUtZGVsaW1pdGVkIGRldmFsdWUgdGV4dCAobm8gZnJhbWluZylcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShjaHVuayk7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UobGluZSwgcmV2aXZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgLy8gUHJvY2VzcyBhbnkgcmVtYWluaW5nIGZyYW1lZCBkYXRhXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gQnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2AgUmVhZGFibGVTdHJlYW1zIHBhc3NlZCBhY3Jvc3MgYm91bmRhcmllcylcbi8vIGFyZSB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHdvcmxkJ3Mgc3RyZWFtIHRyYW5zcG9ydCBvbmUgdXNlciBjaHVuayBhdFxuLy8gYSB0aW1lLiBXaXRob3V0IGFuIGluLWJhbmQgZW52ZWxvcGUsIHRoZSByZWFkZXIgc2VlcyBhIGZsYXQgc3RyZWFtIG9mXG4vLyBieXRlczogdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgd2hlcmUgb25lIHVzZXIgY2h1bmsgZW5kcyBhbmQgdGhlIG5leHRcbi8vIGJlZ2lucywgd2hpY2ggbWFrZXMgbWlkLXN0cmVhbSByZWNvbm5lY3QgaW1wb3NzaWJsZSAod2UgZG9uJ3Qga25vdyBob3dcbi8vIG1hbnkgc2VydmVyLXNpZGUgY2h1bmtzIGhhdmUgYmVlbiBjb25zdW1lZCkuXG4vL1xuLy8gVG8gZW5hYmxlIHRyYW5zcGFyZW50IHJlY29ubmVjdCwgdGhpcyBQUiBpbnRyb2R1Y2VzIGFuIG9wdC1pbiB3aXJlXG4vLyBlbnZlbG9wZSB0aGF0IHdyYXBzIGVhY2ggdXNlciBjaHVuayBpbiBhIGxlbmd0aC1wcmVmaXg6XG4vL1xuLy8gICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVt1c2VyIHBheWxvYWQgYnl0ZXNdXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIGlkZW50aWNhbCBpbiBzaGFwZSB0byBgZ2V0U2VyaWFsaXplU3RyZWFtYCdzIGZyYW1pbmcsXG4vLyBidXQgdGhlIHBheWxvYWQgaGVyZSBpcyAqcmF3IHVzZXIgYnl0ZXMqOiB0aGVyZSBpcyBubyBpbm5lclxuLy8gZm9ybWF0LXByZWZpeCwgbm8gZGV2YWx1ZSwgbm8gZW5jcnlwdGlvbi4gQSBmcmFtZWQgYnl0ZSBzdHJlYW0gc3RheXNcbi8vIHNlbWFudGljYWxseSBhIGJ5dGUgc3RyZWFtIGVuZC10by1lbmQ7IHRoZSBmcmFtaW5nIGlzIHB1cmVseSB0cmFuc3BvcnQuXG4vL1xuLy8gVGhlIGRlY2lzaW9uIHRvIHVzZSBmcmFtaW5nIGZvciBhIGdpdmVuIHN0cmVhbSBpcyByZWNvcmRlZCBpbiB0aGVcbi8vIHNlcmlhbGl6ZWQgc3RyZWFtIHJlZiAoYGZyYW1pbmc6ICdmcmFtZWQtdjEnYCksIHNvIGJvdGggc2lkZXMgYWdyZWUgb25cbi8vIHRoZSB3aXJlIGZvcm1hdCB3aXRob3V0IHJ1bnRpbWUgbmVnb3RpYXRpb24uIFByb2R1Y2VycyB0aGF0IHRhcmdldCBhXG4vLyBydW4gd2hvc2UgZGVwbG95bWVudCBkb2Vzbid0IHN1cHBvcnQgZnJhbWluZyAoc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgXG4vLyBpbiBjYXBhYmlsaXRpZXMudHMpIGVtaXQgcmF3IGJ5dGVzIGFuZCBhIHJlZiB3aXRob3V0IHRoZSBmaWVsZCwgd2hpY2hcbi8vIHRoZSByZWFkZXIgdHJlYXRzIGFzIGxlZ2FjeSByYXcgYnl0ZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG4vKipcbiAqIE1heGltdW0gYWxsb3dlZCBieXRlLXN0cmVhbSBmcmFtZSBwYXlsb2FkIHNpemUgKDEwME1CKS4gU2hhcmVkIGJ5IHRoZVxuICogZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCB1c2VyIGNodW5rcyBhdCB3cml0ZSB0aW1lLCB3aGVyZSB0aGUgZXJyb3IgaXNcbiAqIGFjdGlvbmFibGUpIGFuZCB0aGUgdW5mcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIGxlbmd0aCBoZWFkZXJzIGF0IHJlYWRcbiAqIHRpbWUsIHdoaWNoIHVzdWFsbHkgaW5kaWNhdGUgYSBub24tZnJhbWVkIHdpcmUgYmVpbmcgcmVhZCBhcyBmcmFtZWQpLlxuICogS2VlcGluZyBib3RoIHNpZGVzIG9uIG9uZSBjb25zdGFudCBndWFyYW50ZWVzIGFueSBjaHVuayB0aGUgZnJhbWVyXG4gKiBhY2NlcHRzIGNhbiBhbHdheXMgYmUgZGVjb2RlZCBieSB0aGUgdW5mcmFtZXIuXG4gKi9cbmNvbnN0IE1BWF9GUkFNRV9TSVpFID0gMTAwXzAwMF8wMDA7XG5cbi8qKlxuICogV3JhcHMgZWFjaCBjaHVuayBvZiBhIGJ5dGUgc3RyZWFtIGluIGEgNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXG4gKiBwcmVmaXguIFVzZWQgYnkgdGhlIHByb2R1Y2VyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBFbXB0eSBjaHVua3MgKGxlbmd0aCAwKSBhcmUgZHJvcHBlZDogdGhlIHJlc3VsdGluZyBgWzB4MDAgMHgwMCAweDAwIDB4MDBdYFxuICogZnJhbWUgd291bGQgYmUgYW1iaWd1b3VzIHdpdGggdGhlIGxlZ2FjeSBcImxvb2tzIGZyYW1lZFwiIGRldGVjdGlvbiBpblxuICogYGdldERlc2VyaWFsaXplU3RyZWFtYCwgYW5kIGl0IGNhcnJpZXMgbm8gaW5mb3JtYXRpb24uXG4gKlxuICogTG9hZC1iZWFyaW5nIGludmFyaWFudDogZWFjaCB1c2VyIGNodW5rIGJlY29tZXMgZXhhY3RseSBvbmUgZnJhbWUsIGFuZFxuICogZWFjaCBmcmFtZSBpcyBlbnF1ZXVlZCBhcyBleGFjdGx5IG9uZSB0cmFuc3BvcnQgY2h1bmsgKHRoZSBkb3duc3RyZWFtXG4gKiB3cml0YWJsZSBwZXJmb3JtcyBvbmUgd2lyZSB3cml0ZSBwZXIgY2h1bmssIHByZXNlcnZpbmcgYm91bmRhcmllcykuIFRoZVxuICogc2VydmVyIHRoZXJlZm9yZSBzdG9yZXMgb25lIGZyYW1lIHBlciBjaHVuayBpbmRleCwgd2hpY2ggaXMgd2hhdCBhbGxvd3NcbiAqIGEgZnV0dXJlIHJlY29ubmVjdGluZyByZWFkZXIgdG8gcmVzdW1lIGEgZnJhbWVkIGJ5dGUgc3RyZWFtIGF0XG4gKiBgc3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYCwgdGhlIHNhbWUgYXJpdGhtZXRpY1xuICogYGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbWAgcmVsaWVzIG9uIGZvciBvYmplY3Qgc3RyZWFtcy4gRG8gbm90XG4gKiBjb2FsZXNjZSBvciBzcGxpdCBmcmFtZXMgaGVyZSB3aXRob3V0IHJldmlzaXRpbmcgdGhhdCByZXN1bWUgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlRnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gY2h1bmsgb2YgJHtjaHVuay5sZW5ndGh9IGJ5dGVzIGV4Y2VlZHMgdGhlIG1heGltdW0gYCArXG4gICAgICAgICAgICAgIGBmcmFtZWQgY2h1bmsgc2l6ZSAoJHtNQVhfRlJBTUVfU0laRX0pLiBTcGxpdCB0aGUgZGF0YSBpbnRvIGAgK1xuICAgICAgICAgICAgICBgc21hbGxlciBjaHVua3MgYmVmb3JlIHdyaXRpbmcuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTtcbiAgICAgIGZyYW1lLnNldChjaHVuaywgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGxlbmd0aC1wcmVmaXhlZCBieXRlLXN0cmVhbSBmcmFtZXMgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCB1c2VyXG4gKiBjaHVua3MuIFVzZWQgYnkgdGhlIGNvbnN1bWVyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBCdWZmZXJzIGFjcm9zcyByZWFkIGJvdW5kYXJpZXMsIHNpbmNlIHRoZSB0cmFuc3BvcnQgbWF5IHNwbGl0IGEgc2luZ2xlXG4gKiBmcmFtZSBhY3Jvc3MgbXVsdGlwbGUgcmVhZHMgKGhlYWRlciBpbiBvbmUgY2h1bmssIHBheWxvYWQgaW4gYW5vdGhlcilcbiAqIG9yIGNvYWxlc2NlIG11bHRpcGxlIGZyYW1lcyBpbnRvIGEgc2luZ2xlIHJlYWQuIFRoZSB0cmFuc2Zvcm0gZW1pdHNcbiAqIHdob2xlIHVzZXIgY2h1bmtzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICpcbiAqIEVycm9ycyB0aGUgc3RyZWFtIGlmIHRoZSBsZW5ndGggaGVhZGVyIGFkdmVydGlzZXMgYSBmcmFtZSBsYXJnZXIgdGhhblxuICogYE1BWF9GUkFNRV9TSVpFYCBieXRlcywgc2luY2UgdGhhdCBhbG1vc3QgY2VydGFpbmx5IGluZGljYXRlcyBhXG4gKiBtaXNmcmFtZWQgd2lyZSAoZS5nLiBhIHJhdyBieXRlIHN0cmVhbSBiZWluZyBmZWQgdGhyb3VnaCB0aGlzIHRyYW5zZm9ybVxuICogYnkgbWlzdGFrZSkgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW4gZW5vcm1vdXMgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5leHQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV4dC5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV4dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiAwKSBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG5cbiAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChmcmFtZUxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGZyYW1lIGxlbmd0aCAke2ZyYW1lTGVuZ3RofSBleGNlZWRzIG1heGltdW0gKCR7TUFYX0ZSQU1FX1NJWkV9KS4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgdXN1YWxseSBtZWFucyBhIG5vbi1mcmFtZWQgYnl0ZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCBhcyBmcmFtZWQuYCxcbiAgICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSwgdG90YWwpKTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBlbmRlZCB3aXRoICR7YnVmZmVyLmxlbmd0aH0gYnl0ZXMgb2YgaW5jb21wbGV0ZSBmcmFtZSBkYXRhLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBzdHJlYW0gd2FzIHRydW5jYXRlZCBtaWQtZnJhbWUuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBlbmQtdG8tZW5kIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3BhbiBmb3IgYSBsaXZlIHJlYWQ6XG4gKiByZWFkIGRpc3BhdGNoIChgc3RhcnRFcG9jaE1zYCkg4oaSIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hpbmcgdGhlXG4gKiByZWFkZXIsIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIEZpcmUtYW5kLWZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlcixcbiAgY29ubmVjdE1zPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWQnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudHRmY19tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgIC4uLih0eXBlb2YgY29ubmVjdE1zID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29ubmVjdF9tcyc6IGNvbm5lY3RNcyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5zdGFydF9pbmRleCc6IHN0YXJ0SW5kZXggfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgcmVhZC1jb21wbGV0aW9uIHNwYW4gd2hlbiBhIHN0cmVhbSByZWFkIGRyYWluczpcbiAqIGJhY2stZGF0ZWQgdG8gdGhlIHJlYWQgZGlzcGF0Y2gsIHNvIGl0cyBkdXJhdGlvbiBpcyB0aGUgdG90YWwgcmVhZCwgd2l0aFxuICogY2h1bmsvYnl0ZSBjb3VudHMgZm9yIHRocm91Z2hwdXQuIENhbmNlbGxlZCByZWFkcyBlbWl0IG5vdGhpbmcuIEZpcmUtYW5kLVxuICogZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgY2h1bmtDb3VudDogbnVtYmVyLFxuICBieXRlQ291bnQ6IG51bWJlcixcbiAgcmVjb25uZWN0cz86IG51bWJlclxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29tcGxldGUnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdyZWFkX2NvbXBsZXRlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnRvdGFsX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNodW5rcyc6IGNodW5rQ291bnQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLi4uKHR5cGVvZiByZWNvbm5lY3RzID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnJlYWQucmVjb25uZWN0cyc6IHJlY29ubmVjdHMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0gZXh0ZW5kcyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gICNyZWFkZXI/OiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT47XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzdGFydEluZGV4PzogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKGBcIm5hbWVcIiBpcyByZXF1aXJlZCwgZ290IFwiJHtuYW1lfVwiYCk7XG4gICAgfVxuICAgIC8vIENsaWVudC1vYnNlcnZlZCB0aW1lLXRvLWZpcnN0LWNodW5rIHN0YXRlLiBgcmVhZFN0YXJ0YCBpcyBzdGFtcGVkIHdoZW4gdGhlXG4gICAgLy8gcmVhZGVyIHN0YXJ0cyBjb25zdW1pbmcgKGZpcnN0IHB1bGwg4oaSIHRoZSByZWFkIGRpc3BhdGNoKTsgdGhlIHNwYW4gaXNcbiAgICAvLyBlbWl0dGVkIG9uY2UsIHdoZW4gdGhlIGZpcnN0IG5vbi1lbXB0eSBjaHVuayByZWFjaGVzIHRoZSByZWFkZXIuIFNvIGl0c1xuICAgIC8vIGR1cmF0aW9uIGlzIHRoZSBlbmQtdG8tZW5kIFRURkMgaW5jbHVkaW5nIHRoZSBuZXR3b3JrIGhvcC4gTm8tb3Agd2l0aG91dFxuICAgIC8vIGFuIE9wZW5UZWxlbWV0cnkgU0RLIHJlZ2lzdGVyZWQuXG4gICAgbGV0IHJlYWRTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBmaXJzdENodW5rUmVwb3J0ZWQgPSBmYWxzZTtcbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgY29ubmVjdCBkdXJhdGlvbjogdGhlIHdvcmxkLnN0cmVhbXMuZ2V0IGF3YWl0IChyZWFkXG4gICAgLy8gZGlzcGF0Y2ggLT4gc3RyZWFtIGhhbmRsZSAvIHJlc3BvbnNlIGhlYWRlcnMpLiBTdGFtcGVkIG9uIHRoZVxuICAgIC8vIHdvcmtmbG93LnN0cmVhbS5yZWFkIHNwYW4gb25jZSB0aGUgZmlyc3QgY2h1bmsgYXJyaXZlcy5cbiAgICBsZXQgY29ubmVjdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgLy8gUmVhZC1jb21wbGV0aW9uIGNvdW50ZXJzIGZvciB0aGUgd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29tcGxldGUgc3BhblxuICAgIC8vIGVtaXR0ZWQgd2hlbiB0aGUgc3RyZWFtIGRyYWlucy5cbiAgICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgICBsZXQgYnl0ZXNEZWxpdmVyZWQgPSAwO1xuICAgIHN1cGVyKHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm90IHN1cmUgd2h5IFR5cGVTY3JpcHQgaXMgY29tcGxhaW5pbmcgYWJvdXQgdGhpc1xuICAgICAgdHlwZTogJ2J5dGVzJyxcblxuICAgICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgbGV0IHJlYWRlciA9IHRoaXMuI3JlYWRlcjtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ID09PSB1bmRlZmluZWQpIHJlYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgICAgICBjb25zdCBjb25uZWN0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KHJ1bklkLCBuYW1lLCBzdGFydEluZGV4KTtcbiAgICAgICAgICBjb25uZWN0TXMgPSBEYXRlLm5vdygpIC0gY29ubmVjdFN0YXJ0O1xuICAgICAgICAgIHJlYWRlciA9IHRoaXMuI3JlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IobmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHJlYWRlcicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgYnl0ZXNEZWxpdmVyZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc2VydmVyIGZsdXNoZXMgYSBsZWFkaW5nIHplcm8tbGVuZ3RoIGNodW5rICh2MyspIHRvIGNvbW1pdFxuICAgICAgICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgYmVmb3JlIGFueSBkYXRhOyBza2lwIGVtcHRpZXMgc28gVFRGQyBtZWFzdXJlcyB0b1xuICAgICAgICAgIC8vIHRoZSBmaXJzdCByZWFsIGNodW5rLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFmaXJzdENodW5rUmVwb3J0ZWQgJiZcbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgcmVhZFN0YXJ0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpcnN0Q2h1bmtSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgY29ubmVjdE1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaHVua3NEZWxpdmVyZWQgKz0gMTtcbiAgICAgICAgICBieXRlc0RlbGl2ZXJlZCArPSByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAvLyBGb3J3YXJkIHJhdyBieXRlczsgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlXG4gICAgICAgICAgLy8gZnJhbWluZyBsZXZlbCBieSBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0uXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IGFzeW5jIChyZWFzb24pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI3JlYWRlcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuI3JlYWRlci5jYW5jZWwocmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWF4aW11bSBjb25zZWN1dGl2ZSByZWNvbm5lY3QgYXR0ZW1wdHMgZm9yIGEgc2luZ2xlIGZyYW1lZCBzdHJlYW0gc2Vzc2lvbi5cbiAqIFRoZSBjb3VudGVyIHJlc2V0cyB0byB6ZXJvIHdoZW5ldmVyIGEgcmVjb25uZWN0IG1ha2VzIGZvcndhcmQgcHJvZ3Jlc3MgKGFcbiAqIGZyYW1lIGlzIGRlbGl2ZXJlZCksIHNvIHRoaXMgYm91bmRzICpjb25zZWN1dGl2ZSogZmFpbHVyZXMsIG5vdCB0aGUgbGlmZXRpbWVcbiAqIHRvdGFsOiBhIGxvbmctbGl2ZWQgc2VydmVybGVzcyBzdHJlYW0gbWF5IGxlZ2l0aW1hdGVseSByZWNvbm5lY3QgZmFyIG1vcmVcbiAqIHRoYW4gdGhpcyBtYW55IHRpbWVzIGFzIGxvbmcgYXMgZWFjaCByZWNvbm5lY3Qga2VlcHMgZGVsaXZlcmluZyBkYXRhLiBXZSBvbmx5XG4gKiBnaXZlIHVwIGFmdGVyIHRoaXMgbWFueSByZWNvbm5lY3RzIGluIGEgcm93IHByb2R1Y2Ugbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMgPSA1MDtcblxuLyoqIEVmZmVjdGl2ZSBjb25zZWN1dGl2ZS1yZWNvbm5lY3QgY2FwLiBPdmVycmlkZTogYFdPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFNgLiAqL1xuY29uc3QgZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTLFxuICAgIHtcbiAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICBtaW46IDEsXG4gICAgfVxuICApO1xuXG4vKipcbiAqIEFic29sdXRlIGJhY2tzdG9wIG9uIHRvdGFsIHJlY29ubmVjdHMgZm9yIGEgc2luZ2xlIHNlc3Npb24sIGluZGVwZW5kZW50IG9mXG4gKiBwcm9ncmVzcy4gVGhlIGNvbnNlY3V0aXZlIGNhcCBhYm92ZSByZXNldHMgb24gZm9yd2FyZCBwcm9ncmVzcywgd2hpY2ggaXNcbiAqIGNvcnJlY3QgZm9yIGEgd2VsbC1iZWhhdmVkIGJhY2tlbmQgdGhhdCBob25vcnMgYHN0YXJ0SW5kZXhgLiBCdXQgaWYgYSBXb3JsZCdzXG4gKiBgc3RyZWFtcy5nZXRgIGV2ZXIgaWdub3JlZCBgc3RhcnRJbmRleGAgYW5kIHJlLWRlbGl2ZXJlZCBlYXJsaWVyIGNodW5rcyxcbiAqIFwicHJvZ3Jlc3NcIiB3b3VsZCBiZSByZXBvcnRlZCBldmVyeSByZWNvbm5lY3QgYW5kIHRoZSBjb25zZWN1dGl2ZSBjYXAgd291bGRcbiAqIG5ldmVyIHRyaXAsIHR1cm5pbmcgYSBib3VuZGVkIGZhaWx1cmUgaW50byBhbiB1bmJvdW5kZWQgcmVjb25uZWN0IGxvb3AuIFRoaXNcbiAqIGhhcmQgY2VpbGluZyBndWFyYW50ZWVzIHRoZSBsb29wIGFsd2F5cyB0ZXJtaW5hdGVzLiBJdCBpcyBzZXQgaGlnaCBlbm91Z2hcbiAqIChob3VycyBvZiBzdHJlYW1pbmcgYXQgcmVhbGlzdGljIHBlci1zZXNzaW9uIHRpbWVvdXRzKSB0byBuZXZlciBpbnRlcmZlcmVcbiAqIHdpdGggbGVnaXRpbWF0ZSBsb25nLWxpdmVkIHN0cmVhbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTID0gMTAwMDtcblxuLyoqIEVmZmVjdGl2ZSB0b3RhbC1yZWNvbm5lY3QgYmFja3N0b3AuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhUb3RhbFJlY29ubmVjdHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUycsXG4gICAgRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSB9XG4gICk7XG5cbi8qKlxuICogV3JhcHMgdGhlIGxlbmd0aC1wcmVmaXgtZnJhbWVkIGJ5dGUgc3RyZWFtIGZyb20gYHdvcmxkLnN0cmVhbXMuZ2V0YCB3aXRoXG4gKiB0cmFuc3BhcmVudCBhdXRvLXJlY29ubmVjdC5cbiAqXG4gKiBFdmVyeSBmdWxseS1kZWNvZGVkIG91dGVyIGZyYW1lIGNvcnJlc3BvbmRzIHRvIGV4YWN0bHkgb25lIHNlcnZlci1zaWRlXG4gKiBjaHVuayAodGhlIHNlcmlhbGl6ZSB0cmFuc2Zvcm0gZW5xdWV1ZXMgb25lIGZyYW1lIHBlciB3b3JrZmxvdyB3cml0ZSwgYW5kXG4gKiB0aGUgd3JpdGFibGUgYnVmZmVycyBvbmUgZnJhbWUgcGVyIGNodW5rIHdoZW4gbXVsdGktd3JpdGluZykuIFRoZSB3cmFwcGVyXG4gKiBjb3VudHMgY29tcGxldGVkIGZyYW1lcyBhbmQsIG9uIHVwc3RyZWFtIGVycm9yLCByZW9wZW5zIHRoZSBjb25uZWN0aW9uXG4gKiB3aXRoIGBzdGFydEluZGV4ID0gcmVzb2x2ZWRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgLiBQYXJ0aWFsLWZyYW1lXG4gKiBieXRlcyBidWZmZXJlZCBiZWZvcmUgdGhlIGN1dCBhcmUgZGlzY2FyZGVkOyB0aGUgc2VydmVyIHdpbGwgcmVzZW5kIHRoZVxuICogaW4tZmxpZ2h0IGNodW5rIGluIGZ1bGwgZnJvbSB0aGUgbmV3IHN0YXJ0SW5kZXguXG4gKlxuICogQSBjbGVhbiB1cHN0cmVhbSBjbG9zZSAoRU9GIHdpdGggbm8gZXJyb3IpIGlzIE5PVCB0cnVzdGVkIGFzIGNvbXBsZXRpb25cbiAqIG9uIGl0cyBvd246IHNvbWUgdHJhbnNwb3J0IHBhdGhzIG5vcm1hbGl6ZSBhIG1pZC1zdHJlYW0gYWJvcnQgaW50byBhXG4gKiBncmFjZWZ1bCBlbmQgKG9ic2VydmVkIGluIHByb2R1Y3Rpb24gb24gVmVyY2VsIHJlc3BvbnNlIHN0cmVhbWluZywgd2hlcmVcbiAqIHRoZSBzZXJ2ZXIncyBtYXgtZHVyYXRpb24gYWJvcnQgYXJyaXZlcyBhdCB0aGUgY2xpZW50IGFzIGEgY2xlYW4gRU9GKS5cbiAqIE9uIEVPRiB0aGUgd3JhcHBlciB2ZXJpZmllcyBhZ2FpbnN0IHRoZSBzdHJlYW0ncyBhdXRob3JpdGF0aXZlIG1ldGFkYXRhXG4gKiAoYHN0cmVhbXMuZ2V0SW5mb2ApIHRoYXQgdGhlIHN0cmVhbSBpcyBjb21wbGV0ZSBBTkQgdGhhdCBldmVyeSBjaHVuayB1cCB0b1xuICogYGRvbmVgIHdhcyBkZWxpdmVyZWQ7IG90aGVyd2lzZSBpdCByZWNvbm5lY3RzIGZyb20gdGhlIG5leHQgY2h1bmsgZXhhY3RseVxuICogbGlrZSBhbiBlcnJvcmVkIGNvbm5lY3Rpb24uIElmIHRoZSBtZXRhZGF0YSByZWFkIGl0c2VsZiBmYWlscywgdGhlIEVPRiBpc1xuICogdHJ1c3RlZCAobGVnYWN5IGJlaGF2aW9yKSByYXRoZXIgdGhhbiBmYWlsaW5nIGEgcmVhZCB0aGF0IG1heSB3ZWxsIGJlXG4gKiBjb21wbGV0ZS5cbiAqXG4gKiBOZWdhdGl2ZSBgc3RhcnRJbmRleGAgdmFsdWVzIChsYXN0LU4gc2VtYW50aWNzKSBza2lwIHRoZSByZWNvbm5lY3RcbiAqIG1hY2hpbmVyeSBiZWNhdXNlIHdlIGNhbm5vdCBjb21wdXRlIGFuIGFic29sdXRlIHJlc3VtZSBwb3NpdGlvbiB3aXRob3V0XG4gKiBhIHRhaWwtaW5kZXggbG9va3VwOyB0aGUgcmV0dXJuZWQgc3RyZWFtIGJlaGF2ZXMgYXMgYSBzaW5nbGUtc2hvdCByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXJcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVjb25uZWN0U3VwcG9ydGVkID0gc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0SW5kZXggPj0gMDtcbiAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gc3RhcnRJbmRleCA/PyAwO1xuICBsZXQgY29uc3VtZWRGcmFtZXMgPSAwO1xuICBsZXQgcmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgdG90YWxSZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZWFkIHRlbGVtZXRyeSAoc2FtZSBzZW1hbnRpY3MgYXMgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSk6XG4gIC8vIGRpc3BhdGNoIHRpbWUsIGZpcnN0LWNvbm5lY3QgZHVyYXRpb24sIGZpcnN0LWZyYW1lIGxhdGNoLCBhbmQgdG90YWxzLlxuICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcblxuICBhc3luYyBmdW5jdGlvbiBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgZWZmZWN0aXZlU3RhcnRJbmRleCA9IHJlY29ubmVjdFN1cHBvcnRlZFxuICAgICAgPyBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgZWZmZWN0aXZlU3RhcnRJbmRleCk7XG4gICAgaWYgKGNvbm5lY3RNcyA9PT0gdW5kZWZpbmVkKSBjb25uZWN0TXMgPSBEYXRlLm5vdygpIC0gY29ubmVjdFN0YXJ0O1xuICAgIHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIHVwc3RyZWFtIEVPRiByZXByZXNlbnRzIGdlbnVpbmUgY29tcGxldGlvbjogdGhlIHN0cmVhbSdzXG4gICAqIGF1dGhvcml0YXRpdmUgbWV0YWRhdGEgc2F5cyBpdCBpcyBkb25lIEFORCB0aGUgZnJhbWVzIGRlbGl2ZXJlZCBzbyBmYXJcbiAgICogY292ZXIgZXZlcnkgY2h1bmsgdXAgdG8gdGhlIHRhaWwgKG9uZSBvdXRlciBmcmFtZSA9PSBvbmUgc2VydmVyIGNodW5rKS5cbiAgICogQSBtZXRhZGF0YSBmYWlsdXJlIHRydXN0cyB0aGUgRU9GLCBzaW5jZSB0dXJuaW5nIGEgaGVhbHRoeSBjb21wbGV0aW9uXG4gICAqIGludG8gYW4gZXJyb3IgKG9yIGEgcmVjb25uZWN0IGxvb3ApIG9uIGEgdHJhbnNpZW50IG1ldGFkYXRhIGJsaXAgd291bGRcbiAgICogYmUgd29yc2UgdGhhbiB0aGUgbGVnYWN5IGJlaGF2aW9yIHRoaXMgY2hlY2sgZ3VhcmRzIGFnYWluc3QuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBpc1ZlcmlmaWVkQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXRJbmZvKHJ1bklkLCBuYW1lKTtcbiAgICAgIHJldHVybiBpbmZvLmRvbmUgJiYgY3VycmVudFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lcyA+IGluZm8udGFpbEluZGV4O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZWFkZXIpIHtcbiAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEFkdmFuY2UgdGhlIHJlc3VtZSBwb3NpdGlvbiBwYXN0IHRoZSBmcmFtZXMgYWxyZWFkeSBkZWxpdmVyZWQsIHRoZW5cbiAgICAvLyBkcm9wIGFueSBwYXJ0aWFsLWZyYW1lIGJ5dGVzOiB0aGUgcmVvcGVuZWQgY29ubmVjdGlvbiByZS1zZW5kcyBmcm9tIGFcbiAgICAvLyBmcmFtZSBib3VuZGFyeSBhdCB0aGUgbmV3IGluZGV4LlxuICAgIGN1cnJlbnRTdGFydEluZGV4ICs9IGNvbnN1bWVkRnJhbWVzO1xuICAgIGNvbnN1bWVkRnJhbWVzID0gMDtcbiAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICAgIC8vIFJldHJ5IHRoZSByZW9wZW4gaXRzZWxmIGFnYWluc3QgdGhlIHJlY29ubmVjdCBidWRnZXQuIEEgdHJhbnNpZW50XG4gICAgLy8gZmFpbHVyZSBvZiBjb25uZWN0KCkgKHRoZSBzZXJ2ZXIgYnJpZWZseSB1bmF2YWlsYWJsZSBkdXJpbmcgdGhlXG4gICAgLy8gcmVjb25uZWN0IHdpbmRvdykgaXMgdGhlIGV4YWN0IGJsaXAgdGhpcyB3cmFwcGVyIGV4aXN0cyB0byBzdXJ2aXZlLCBzb1xuICAgIC8vIGNvdW50IGl0IGFnYWluc3QgdGhlIGJ1ZGdldCBhbmQgdHJ5IGFnYWluIHJhdGhlciB0aGFuIHRyZWF0aW5nIGl0IGFzXG4gICAgLy8gZmF0YWwuIE9ubHkgYnVkZ2V0IGV4aGF1c3Rpb24gKGEgc2VydmVyIHRoYXQgc3RheXMgZG93bikgdGVybWluYXRlcyB0aGVcbiAgICAvLyBzdHJlYW0uXG4gICAgY29uc3QgbWF4UmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFJlY29ubmVjdHMoKTtcbiAgICBjb25zdCBtYXhUb3RhbFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhUb3RhbFJlY29ubmVjdHMoKTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICByZWNvbm5lY3RDb3VudCsrO1xuICAgICAgdG90YWxSZWNvbm5lY3RDb3VudCsrO1xuICAgICAgaWYgKHJlY29ubmVjdENvdW50ID4gbWF4UmVjb25uZWN0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN0cmVhbSBcIiR7bmFtZX1cIiBleGNlZWRlZCBtYXhpbXVtIHJlY29ubmVjdGlvbiBhdHRlbXB0cyAoJHttYXhSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodG90YWxSZWNvbm5lY3RDb3VudCA+IG1heFRvdGFsUmVjb25uZWN0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN0cmVhbSBcIiR7bmFtZX1cIiBleGNlZWRlZCBtYXhpbXVtIHRvdGFsIHJlY29ubmVjdGlvbiBhdHRlbXB0cyAoJHttYXhUb3RhbFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0ZW50aW9uIGV4cGlyeSBpcyB0ZXJtaW5hbCBhbmQgcmV0cnlpbmcgY2Fubm90IHJlc3RvcmUgdGhlIHN0cmVhbS5cbiAgICAgICAgLy8gUHJlc2VydmUgdGhlIHR5cGVkIGVycm9yIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgdHVybmluZyBvbmUgNDEwIGludG9cbiAgICAgICAgLy8gNTAgcmVjb25uZWN0IGF0dGVtcHRzIGFuZCBhIGdlbmVyaWMgYnVkZ2V0LWV4aGF1c3Rpb24gZXJyb3IuXG4gICAgICAgIGlmIChTdHJlYW1FeHBpcmVkRXJyb3IuaXMoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgLy8gUmVvcGVuIGZhaWxlZCB0cmFuc2llbnRseTsgbG9vcCB0byByZXRyeSwgY291bnRpbmcgYWdhaW5zdCB0aGVcbiAgICAgICAgLy8gYnVkZ2V0IHNvIGEgc2VydmVyIHRoYXQgbmV2ZXIgcmVjb3ZlcnMgc3RpbGwgdGVybWluYXRlcyB0aGUgc3RyZWFtLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgIHB1bGw6IGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICBpZiAocmVhZFN0YXJ0ID09PSB1bmRlZmluZWQpIHJlYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAvLyBMb29wIHVudGlsIHdlIGVtaXQgc29tZXRoaW5nLCBoaXQgRU9GLCBvciBmYXRhbGx5IGVycm9yLiBSZWFkcyB0aGF0XG4gICAgICAvLyBvbmx5IGV4dGVuZCB0aGUgaW4tZmxpZ2h0LWZyYW1lIGJ1ZmZlciBkb24ndCBlbnF1ZXVlIGFueXRoaW5nOyB3ZVxuICAgICAgLy8ga2VlcCByZWFkaW5nIHJhdGhlciB0aGFuIHJldHVybmluZyBlbXB0eS1oYW5kZWQuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3QoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0OiB7IGRvbmU6IGJvb2xlYW47IHZhbHVlPzogVWludDhBcnJheSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogY29ubmVjdCgpIGd1YXJhbnRlZXMgcmVhZGVyXG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZGVyIS5yZWFkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghcmVjb25uZWN0U3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCByZWNvbm5lY3QoKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IocmVjb25uZWN0RXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmRvbmUgfHwgIXJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAvLyBBIGNsZWFuIEVPRiBpcyBvbmx5IHRydXN0d29ydGh5IGlmIHRoZSBzdHJlYW0gaXMgYWN0dWFsbHlcbiAgICAgICAgICAvLyBjb21wbGV0ZSBhbmQgdGhpcyBzZXNzaW9uIGRlbGl2ZXJlZCBldmVyeSBjaHVuayB1cCB0byBgZG9uZWAuXG4gICAgICAgICAgLy8gSW5mcmFzdHJ1Y3R1cmUgY2FuIG5vcm1hbGl6ZSBhIG1pZC1zdHJlYW0gYWJvcnQgaW50byBhIGdyYWNlZnVsXG4gICAgICAgICAgLy8gZW5kICh0aGUgc2VydmVyJ3MgbWF4LWR1cmF0aW9uIGN1dCBpcyBkZXNpZ25lZCB0byBhcnJpdmUgYXMgYW5cbiAgICAgICAgICAvLyBlcnJvcmVkIGJvZHksIGJ1dCBvbiBzb21lIHBhdGhzIGl0IHJlYWNoZXMgdGhlIGNsaWVudCBhcyBhIGNsZWFuXG4gICAgICAgICAgLy8gRU9GKSwgYW5kIGEgY29tcGxldGVkIHN0cmVhbSBjYW4gc3RpbGwgYmUgY3V0IG1pZC1ib2R5OyBib3RoXG4gICAgICAgICAgLy8gd291bGQgb3RoZXJ3aXNlIGJlIHNpbGVudGx5IHJlYWQgYXMgYSBzaG9ydGVyLCBjb21wbGV0ZSBzdHJlYW0uXG4gICAgICAgICAgaWYgKHJlY29ubmVjdFN1cHBvcnRlZCAmJiAhKGF3YWl0IGlzVmVyaWZpZWRDb21wbGV0ZSgpKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgcmVjb25uZWN0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gR2VudWluZSBlbmQtb2Ytc3RyZWFtLiBEcm9wIGFueSBwYXJ0aWFsLWZyYW1lIGJ5dGVzICh0aGVyZVxuICAgICAgICAgIC8vIHNob3VsZG4ndCBiZSBhbnk7IGEgd2VsbC1mb3JtZWQgc3RyZWFtIGVuZHMgb24gYSBmcmFtZSBib3VuZGFyeSkuXG4gICAgICAgICAgaWYgKHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgYnl0ZXNEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIHRvdGFsUmVjb25uZWN0Q291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgdG8gYnVmZmVyIGFuZCBlbWl0IGFsbCBjb21wbGV0ZSBmcmFtZXMuXG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAoaW5jb21pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGluY29taW5nLmxlbmd0aCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGluY29taW5nLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICBidWZmZXIgPSBjb21iaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG4gICAgICAgICAgLy8gRm9yd2FyZCB0aGUgZW50aXJlIGZyYW1lZCBjaHVuayAoaGVhZGVyICsgcGF5bG9hZCkgdG8gdGhlXG4gICAgICAgICAgLy8gZG93bnN0cmVhbSBkZXNlcmlhbGl6ZXIsIHdoaWNoIGFscmVhZHkgZXhwZWN0cyB0aGlzIGxheW91dC5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKDAsIHRvdGFsKSk7XG4gICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgICAgICBjb25zdW1lZEZyYW1lcysrO1xuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCsrO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHRvdGFsO1xuICAgICAgICAgIGlmICghZmlyc3RDaHVua1JlcG9ydGVkICYmIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdHRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1pdHRlZCkge1xuICAgICAgICAgIC8vIEZvcndhcmQgcHJvZ3Jlc3Mgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbjogY2xlYXIgdGhlXG4gICAgICAgICAgLy8gY29uc2VjdXRpdmUtZmFpbHVyZSBidWRnZXQgc28gYSBsb25nIHN0cmVhbSB0aGF0IHJlY29ubmVjdHNcbiAgICAgICAgICAvLyBtYW55IHRpbWVzIChidXQga2VlcHMgZGVsaXZlcmluZykgaXMgbmV2ZXIgZmFsc2VseSBjYXBwZWQuXG4gICAgICAgICAgcmVjb25uZWN0Q291bnQgPSAwO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHBhcnRpYWwgYnl0ZXM6IHJlYWQgbW9yZS5cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbDogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHJlYWRlcikge1xuICAgICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgY2xvc2luZyBSZWFkYWJsZVN0cmVhbSByZWFkZXI6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGdyb3VwLWNvbW1pdCB3aW5kb3cgZm9yIHRoZSBMRUFESU5HIGNodW5rIG9mIGFuIGlkbGUgc3RyZWFtLlxuICpcbiAqIDAgPSBkaXNwYXRjaCB0aGUgZmlyc3QgY2h1bmsgaW1tZWRpYXRlbHkuIE1lYXN1cmVkIHByb2R1Y3Rpb24gcHJvZHVjZXJcbiAqIHJhdGVzIChtb3N0IGFnZW50czogfjEuMiBjaHVua3MgcGVyIGZsdXNoLCA+NzAlIG9mIGNodW5rcyBhcnJpdmluZyBtb3JlXG4gKiB0aGFuIDEwbXMgYWZ0ZXIgdGhlIHByZXZpb3VzIHJlcXVlc3QgYWxyZWFkeSBmaW5pc2hlZCkgc2hvdyBhIGZpeGVkXG4gKiBsZWFkaW5nLWVkZ2Ugd2luZG93IHRheGVzIGlzb2xhdGVkLWNodW5rIGRlbGl2ZXJ5ICh+KzIwJSBvbiBhIH41MG1zIFJUVClcbiAqIHdoaWxlIGJhdGNoaW5nIGFsbW9zdCBub3RoaW5nIGZvciBzbG93IHByb2R1Y2VyczsgZmFzdCBwcm9kdWNlcnMgZ2V0XG4gKiB0aGVpciBiYXRjaGluZyBmcm9tIGluLWZsaWdodCBhY2N1bXVsYXRpb24gcmVnYXJkbGVzcy4gU2V0dGluZyBhIHBvc2l0aXZlXG4gKiBpbnRlcnZhbCAoZW52IG9yIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgKSBvcHRzIGEgZGVwbG95bWVudCBpbnRvXG4gKiB3aW5kb3dlZCBsZWFkaW5nLWVkZ2UgYmF0Y2hpbmcsIHRyYWRpbmcgZmlyc3QtY2h1bmsgbGF0ZW5jeSBmb3IgbGFyZ2VyXG4gKiBncm91cHMuXG4gKi9cbmNvbnN0IFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUyA9IDA7XG5cbi8qKlxuICogYFdPUktGTE9XX1NUUkVBTV9GTFVTSF9JTlRFUlZBTF9NU2AsIHdoZW4gc2V0LCBvdmVycmlkZXNcbiAqIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgOyB3aGVuIHVuc2V0IHRoZSBXb3JsZCBvcHRpb24gKG9yIHRoZVxuICogZGVmYXVsdCkgZ292ZXJucy4gUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgdW5zZXQvaW52YWxpZCB2YWx1ZXMgc28gdGhlXG4gKiBjYWxsZXIgY2FuIGZhbGwgdGhyb3VnaCB0byB0aGUgV29ybGQgb3B0aW9uLlxuICovXG5jb25zdCBnZXRFbnZTdHJlYW1GbHVzaEludGVydmFsTXMgPSAoKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUycsIE51bWJlci5OYU4sIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICB9KTtcbiAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbn07XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHNwYW4gZm9yIG9uZSBmbHVzaGVkIGJhdGNoIG9mIHN0cmVhbSB3cml0ZXM6IGZpcnN0XG4gKiBgd3JpdGUoKWAgb2YgdGhlIGJhdGNoIChgc3RhcnRFcG9jaE1zYCkg4oaSIHRoZSBzZXJ2ZXIgd3JpdGUgc2V0dGxpbmcuIFRoZVxuICogc3BhbidzIGR1cmF0aW9uIGlzIHRoZXJlZm9yZSB0aGUgYXBwLXBlcmNlaXZlZCBsYXRlbmN5IG9mIHRoZSBiYXRjaFxuICogKGJ1ZmZlciBkd2VsbCArIGJhY2twcmVzc3VyZSArIFJQQyk7IGBidWZmZXJfZHdlbGxfbXNgIGlzb2xhdGVzIHRoZVxuICogcHJlLWRpc3BhdGNoIHNoYXJlIHNvIGNsaWVudC1zaWRlIGJhdGNoaW5nIGNvc3QgY2FuIGJlIHRvbGQgYXBhcnQgZnJvbVxuICogbmV0d29yay9zZXJ2ZXIgdGltZS4gTmFtZWQgYHdvcmtmbG93LnN0cmVhbS5mbHVzaGA7IHRoZSBwZXItcmVxdWVzdCBSUENcbiAqIGJlbmVhdGggaXQgaXMgd29ybGQtdmVyY2VsJ3MgYHdvcmtmbG93LnN0cmVhbS53cml0ZWAgc3BhbiAoY2h1bmtfcnR0KSwgYW5kXG4gKiB0aGUgdHdvIG11c3Qgc3RheSBkaXN0aW5ndWlzaGFibGUuIEZpcmUtYW5kLWZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1Xcml0ZUZsdXNoKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgZGlzcGF0Y2hFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgY2h1bmtDb3VudDogbnVtYmVyLFxuICBieXRlQ291bnQ6IG51bWJlcixcbiAgcnBjTXM6IG51bWJlclxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLmZsdXNoJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAnZmx1c2gnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmZsdXNoLmJ1ZmZlcl9kd2VsbF9tcyc6IGRpc3BhdGNoRXBvY2hNcyAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5jaHVua3MnOiBjaHVua0NvdW50LFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmZsdXNoLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgV29ybGQgd3JpdGUgUlBDIGR1cmF0aW9uIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuXG4gICAgICAgIC8vIFNhbWUga2V5IGFzIHdvcmxkLXZlcmNlbCdzIHBlci1yZXF1ZXN0IHNwYW4gYXR0cmlidXRlIHNvIHF1ZXJpZXNcbiAgICAgICAgLy8gd29yayByZWdhcmRsZXNzIG9mIHdoaWNoIGxheWVyIGVtaXR0ZWQgaXQuXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ud3JpdGUuY2h1bmtfcnR0JzogcnBjTXMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciB0aGUgc3RyZWFtLWNsb3NlIFJQQzogaXRzIGR1cmF0aW9uIGlzIHRoZVxuICogYHdvcmxkLnN0cmVhbXMuY2xvc2VgIHJvdW5kIHRyaXAgKG5ldHdvcmsgaG9wIGluY2x1ZGVkKS4gRmlyZS1hbmQtZm9yZ2V0O1xuICogbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1DbG9zZShcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLmNsb3NlJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAnY2xvc2UnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmNsb3NlLnJwY19tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbSBleHRlbmRzIFdyaXRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgLyoqXG4gICAqIEBwYXJhbSBydW5SZWFkeUJhcnJpZXIgVHVyYm8gbW9kZSBvbmx5OiBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZVxuICAgKiBiYWNrZ3JvdW5kZWQgYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkLiBXaGVuIHRoZSBzdGVwIGJvZHkgcnVuc1xuICAgKiBvcHRpbWlzdGljYWxseSAoYmVmb3JlIGBydW5fc3RhcnRlZGAgaXMgZHVyYWJsZSksIHRoZSBmaXJzdCBjaHVuayB3cml0ZSB0b1xuICAgKiBhIGJyYW5kLW5ldyBzdHJlYW0gd291bGQgb3RoZXJ3aXNlIHJlYWNoIHRoZSBXb3JsZCBiZWZvcmUgdGhlIHJ1biBleGlzdHNcbiAgICogYW5kIGJlIHJlamVjdGVkIGFzIHJ1bi1ub3QtZm91bmQuIEF3YWl0aW5nIHRoaXMgb25jZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAqIGZsdXNoL2Nsb3NlIG9yZGVycyB0aGUgd3JpdGUgYWZ0ZXIgdGhlIHJ1bidzIGNyZWF0aW9uLiBgdW5kZWZpbmVkYCBvdXRzaWRlXG4gICAqIHR1cmJvIGFuZCBvbiB0aGUgYXdhaXQgcGF0aCwgd2hlcmUgdGhlIHJ1biB3YXMgYWxyZWFkeSBkdXJhYmxlLlxuICAgKi9cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+KSB7XG4gICAgaWYgKHR5cGVvZiBydW5JZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYFwicnVuSWRcIiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgXCIke3R5cGVvZiBydW5JZH1cImBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihgXCJuYW1lXCIgaXMgcmVxdWlyZWQsIGdvdCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICBjb25zdCB3b3JsZFByb21pc2UgPSBnZXRXb3JsZExhenkoKTtcblxuICAgIC8vIEhvbGQgdGhlIGZpcnN0IHNlcnZlciB3cml0ZSB1bnRpbCB0aGUgcnVuIGV4aXN0cyAodHVyYm8gb3B0aW1pc3RpY1xuICAgIC8vIHN0YXJ0KS4gQXdhaXRlZCBvbmNlLCB0aGVuIGNsZWFyZWQgc28gbGF0ZXIgZmx1c2hlcyBwYXkgbm90aGluZy4gVGhlXG4gICAgLy8gcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3Igb3JkZXJpbmcgb25seTogaWYgYHJ1bl9zdGFydGVkYCB0cnVseSBmYWlsZWRcbiAgICAvLyB0aGUgcnVuIGRvZXMgbm90IGV4aXN0LCBzbyB0aGUgd3JpdGUgYmVsb3cgc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IuXG4gICAgbGV0IHBlbmRpbmdSdW5SZWFkeTogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHJ1blJlYWR5QmFycmllcjtcbiAgICBjb25zdCBlbnN1cmVSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmIChwZW5kaW5nUnVuUmVhZHkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBwZW5kaW5nUnVuUmVhZHk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHksIHNlZSBhYm92ZS5cbiAgICAgICAgfVxuICAgICAgICBwZW5kaW5nUnVuUmVhZHkgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEdyb3VwLWNvbW1pdCBidWZmZXJpbmcuXG4gICAgLy9cbiAgICAvLyBgd3JpdGUoKWAgcmVzb2x2ZXMgYXMgc29vbiBhcyB0aGUgY2h1bmsgZW50ZXJzIHRoaXMgYm91bmRlZCBidWZmZXIsXG4gICAgLy8gTk9UIHdoZW4gaXQgaXMgZHVyYWJsZS4gVGhhdCBpcyB0aGUgcHJvcGVydHkgdGhhdCBtYWtlcyBiYXRjaGluZ1xuICAgIC8vIHBhdGgtaW5kZXBlbmRlbnQ6IGEgbmF0aXZlIGByZWFkYWJsZS5waXBlVG8oc2VydmVyV3JpdGFibGUpYCBwdWxscyB0aGVcbiAgICAvLyBuZXh0IGNodW5rIHRoZSBtb21lbnQgYHdyaXRlKClgIHJlc29sdmVzLCBzbyBjaHVua3MgYWNjdW11bGF0ZSBoZXJlXG4gICAgLy8gZHVyaW5nIHRoZSBmbHVzaC10aW1lciB3aW5kb3cgYW5kIHdoaWxlIGEgc2VydmVyIHJlcXVlc3QgaXMgaW5cbiAgICAvLyBmbGlnaHQsIGFuZCBlYWNoIGFjY3VtdWxhdGVkIGdyb3VwIGdvZXMgb3V0IGFzIG9uZSBgd3JpdGVNdWx0aWAuXG4gICAgLy8gKFByZXZpb3VzbHkgYHdyaXRlKClgIHJlc29sdmVkIG9ubHkgYWZ0ZXIgdGhlIHRpbWVyIEFORCB0aGUgc2VydmVyXG4gICAgLy8gcm91bmQgdHJpcCwgc28gbmF0aXZlIHBpcGluZyBzZXJpYWxpemVkIHRvIG9uZSByZXF1ZXN0IHBlciBjaHVuayBhbmRcbiAgICAvLyBiYXRjaGluZyBvbmx5IHdvcmtlZCB0aHJvdWdoIGBmbHVzaGFibGVQaXBlYCdzIGJlc3Bva2UgY29hbGVzY2luZy4pXG4gICAgLy9cbiAgICAvLyBEdXJhYmlsaXR5IGhhcyBhIGRlZGljYXRlZCBiYXJyaWVyIGluc3RlYWQ6IGBkcmFpbigpYCAoZXhwb3NlZCB2aWFcbiAgICAvLyB7QGxpbmsgU1RSRUFNX0RSQUlOX1NZTUJPTH0pIHJlc29sdmVzIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5XG4gICAgLy8gYW5kIG5vIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LiBgY2xvc2UoKWAgYXdhaXRzIGl0IGJlZm9yZSBjbG9zaW5nIHRoZVxuICAgIC8vIHNlcnZlciBzdHJlYW0sIGFuZCB0aGUgZmx1c2hhYmxlLXN0cmVhbSBsb2NrLXJlbGVhc2UgY29tcGxldGlvblxuICAgIC8vIGF3YWl0cyBpdCBiZWZvcmUgbGV0dGluZyBhIHN0ZXAgZmluaXNoLCBzbyBcInN0ZXAgY29tcGxldGVkXCIgc3RpbGxcbiAgICAvLyBpbXBsaWVzIFwic3RyZWFtIGRhdGEgZHVyYWJsZVwiLCBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICAvL1xuICAgIC8vIEVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBoYW5kbGVkIGF0IHRoZSBmcmFtaW5nIGxldmVsIGJ5XG4gICAgLy8gZ2V0U2VyaWFsaXplU3RyZWFtL2dldERlc2VyaWFsaXplU3RyZWFtLCBub3QgaGVyZS5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgYnVmZmVyOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICBsZXQgYnVmZmVyQnl0ZXMgPSAwO1xuICAgIC8vIFRoZSBncm91cCBjdXJyZW50bHkgaW5zaWRlIGEgc2VydmVyIHJlcXVlc3QuIENvdW50ZWQgYWdhaW5zdCB0aGVcbiAgICAvLyBidWZmZXIgYm91bmQgc28gYFdPUktGTE9XX1NUUkVBTV9NQVhfSU5GTElHSFRfQ0hVTktTYCBrZWVwcyBpdHNcbiAgICAvLyBkb2N1bWVudGVkIG1lYW5pbmcgKGFuIHVwcGVyIGJvdW5kIGFjcm9zcyBBTEwgcmVhZC1idXQtbm90LWR1cmFibGVcbiAgICAvLyBjaHVua3MpLCBub3QganVzdCB0aGUgcXVldWVkIGZvbGxvdy11cCBncm91cC5cbiAgICBsZXQgaW5GbGlnaHRDaHVua3MgPSAwO1xuICAgIGxldCBpbkZsaWdodEJ5dGVzID0gMDtcbiAgICBsZXQgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAvKiogVGhlIGluLWZsaWdodCBkaXNwYXRjaCBjaGFpbi4gQXQgbW9zdCBvbmUsIHByZXNlcnZpbmcgY2h1bmsgb3JkZXIuICovXG4gICAgbGV0IGluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RpY2t5IGZhaWx1cmU6IG9uY2UgYSBkaXNwYXRjaCBmYWlscywgdGhlIGZhaWxlZCBncm91cCBpcyByZS1xdWV1ZWRcbiAgICAgKiAocmV0YWluZWQsIGV4YWN0bHkgYXMgdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHJldGFpbmVkIGl0cyBidWZmZXIpXG4gICAgICogYW5kIGV2ZXJ5IHN1YnNlcXVlbnQgYHdyaXRlKClgLCBgY2xvc2UoKWAgYW5kIGBkcmFpbigpYCByZWplY3RzIHdpdGhcbiAgICAgKiB0aGUgb3JpZ2luYWwgZXJyb3IuIENodW5rcyB3aG9zZSBgd3JpdGUoKWAgYWxyZWFkeSByZXNvbHZlZCBzdXJmYWNlXG4gICAgICogdGhlaXIgZmFpbHVyZSBhdCB0aGUgZHVyYWJpbGl0eSBiYXJyaWVyOiB0aGF0IGlzIHRoZSBjb250cmFjdCBvZiBhblxuICAgICAqIGVhcmx5LWFjayBzaW5rLlxuICAgICAqL1xuICAgIGxldCBzaW5rRXJyb3I6IHVua25vd247XG4gICAgLy8gR3JvdXAtY29tbWl0IHdpbmRvdy4gVGhlIGVudiB2YXIsIHdoZW4gc2V0LCBvdmVycmlkZXMgdGhlIFdvcmxkXG4gICAgLy8gb3B0aW9uOyBvdGhlcndpc2UgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2AgZ292ZXJucyAoZGVmYXVsdCAwKSxcbiAgICAvLyBpbmNsdWRpbmcgdGhlIGZpcnN0IGNodW5rLiBXaGVuIGl0IG11c3QgY29tZSBmcm9tIHRoZSB3b3JsZCxcbiAgICAvLyBgc2NoZWR1bGVHcm91cENvbW1pdGAgd2FpdHMgZm9yIGB3b3JsZFByb21pc2VgIGJlZm9yZSBkZWNpZGluZywgd2hpY2hcbiAgICAvLyBjb3N0cyBub3RoaW5nOiBubyByZXF1ZXN0IGNhbiBsZWF2ZSBiZWZvcmUgYHNlbmRHcm91cGAncyBvd24gd29ybGRcbiAgICAvLyBhd2FpdCBlaXRoZXIuXG4gICAgbGV0IHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID0gZ2V0RW52U3RyZWFtRmx1c2hJbnRlcnZhbE1zKCk7XG4gICAgbGV0IF9mbHVzaEludGVydmFsUmVzb2x1dGlvbjogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIC8vIFBlci1yZXF1ZXN0IHdpcmUgbGltaXRzIChzZXJ2ZXIgY2FwcykgYW5kIHRoZSBidWZmZXIgYm91bmQuIFRoZSBib3VuZFxuICAgIC8vIHVzZXMgdGhlIHNhbWUga25vYnMgdGhlIGNvYWxlc2NpbmcgcGlwZSB1c2VkLCBzbyBwcm9kdWNlciBiYWNrcHJlc3N1cmVcbiAgICAvLyBiZWhhdmlvciBpcyB1bmNoYW5nZWQ6IG9uY2UgYSByZXF1ZXN0LXdvcnRoIG9mIGNodW5rcyAob3IgdGhlIGJ5dGVcbiAgICAvLyBib3VuZCkgaXMgYnVmZmVyZWQsIGB3cml0ZSgpYCBibG9ja3MgdW50aWwgYSBncm91cCBsYW5kcyBkdXJhYmx5LlxuICAgIGNvbnN0IG1heENodW5rc1BlclJlcXVlc3QgPSBnZXRNYXhDaHVua3NQZXJCYXRjaCgpO1xuICAgIGNvbnN0IG1heEJ5dGVzUGVyUmVxdWVzdCA9IGdldE1heEJ5dGVzUGVyQmF0Y2goKTtcbiAgICBjb25zdCBtYXhCdWZmZXJlZENodW5rcyA9IGdldE1heEluZmxpZ2h0Q2h1bmtzKCk7XG4gICAgY29uc3QgbWF4QnVmZmVyZWRCeXRlcyA9IGdldE1heEJ1ZmZlcmVkQnl0ZXMoKTtcbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgd3JpdGUtYmF0Y2ggdGltaW5nOiBzdGFtcGVkIHdoZW4gdGhlIGJ1ZmZlciBnb2VzXG4gICAgLy8gZW1wdHnihpJub24tZW1wdHksIGNvbnN1bWVkIGJ5IHRoZSBncm91cCB0aGF0IGNhcnJpZXMgdGhhdCBjaHVuayBvdXQuXG4gICAgbGV0IGJ1ZmZlclQwOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICB0eXBlIFdhaXRlciA9IHsgcmVzb2x2ZTogKCkgPT4gdm9pZDsgcmVqZWN0OiAoZXJyOiB1bmtub3duKSA9PiB2b2lkIH07XG4gICAgLyoqIHdyaXRlKCkgY2FsbHMgYmxvY2tlZCBvbiB0aGUgYnVmZmVyIGJvdW5kLiAqL1xuICAgIGxldCBjYXBhY2l0eVdhaXRlcnM6IFdhaXRlcltdID0gW107XG4gICAgLyoqIGRyYWluKCkgY2FsbHMgd2FpdGluZyBmb3IgZnVsbCBkdXJhYmlsaXR5LiAqL1xuICAgIGxldCBkcmFpbldhaXRlcnM6IFdhaXRlcltdID0gW107XG5cbiAgICBjb25zdCByZWplY3RXYWl0ZXJzID0gKGVycjogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgYWxsID0gWy4uLmNhcGFjaXR5V2FpdGVycywgLi4uZHJhaW5XYWl0ZXJzXTtcbiAgICAgIGNhcGFjaXR5V2FpdGVycyA9IFtdO1xuICAgICAgZHJhaW5XYWl0ZXJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHcgb2YgYWxsKSB3LnJlamVjdChlcnIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUYWtlIHRoZSBsYXJnZXN0IGxlYWRpbmcgZ3JvdXAgdGhhdCBmaXRzIG9uZSByZXF1ZXN0OiBhdCBtb3N0XG4gICAgICogYG1heENodW5rc1BlclJlcXVlc3RgIGNodW5rcyBhbmQgYG1heEJ5dGVzUGVyUmVxdWVzdGAgY3VtdWxhdGl2ZSBieXRlc1xuICAgICAqIChhIHNpbmdsZSBvdmVyc2l6ZWQgY2h1bmsgc3RpbGwgZ29lcyBvdXQgYWxvbmUpLlxuICAgICAqL1xuICAgIGNvbnN0IHRha2VHcm91cCA9ICgpOiB7IGdyb3VwOiBVaW50OEFycmF5W107IGJ5dGVzOiBudW1iZXIgfSA9PiB7XG4gICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgbGV0IGJ5dGVzID0gMDtcbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnVmZmVyKSB7XG4gICAgICAgIGlmIChjb3VudCA+PSBtYXhDaHVua3NQZXJSZXF1ZXN0KSBicmVhaztcbiAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBieXRlcyArIGNodW5rLmJ5dGVMZW5ndGggPiBtYXhCeXRlc1BlclJlcXVlc3QpIGJyZWFrO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBieXRlcyArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSBidWZmZXIuc2xpY2UoMCwgY291bnQpO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGNvdW50KTtcbiAgICAgIGJ1ZmZlckJ5dGVzIC09IGJ5dGVzO1xuICAgICAgcmV0dXJuIHsgZ3JvdXAsIGJ5dGVzIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGxvb3A6IHdoaWxlIGNodW5rcyBhcmUgYnVmZmVyZWQsIHNlbmQgdGhlbSBncm91cCBieSBncm91cC5cbiAgICAgKiBFeGFjdGx5IG9uZSBsb29wIHJ1bnMgYXQgYSB0aW1lIChgaW5GbGlnaHRgKSwgc28gZ3JvdXBzIHJlYWNoIHRoZVxuICAgICAqIHNlcnZlciBpbiB3cml0ZSBvcmRlci4gQ2h1bmtzIHRoYXQgYXJyaXZlIHdoaWxlIGEgZ3JvdXAncyByZXF1ZXN0IGlzXG4gICAgICogaW4gZmxpZ2h0IGFjY3VtdWxhdGUgYW5kIGZvcm0gdGhlIG5leHQgZ3JvdXA6IHRoZSBncm91cC1jb21taXRcbiAgICAgKiBiZWhhdmlvciwgbm93IGluZGVwZW5kZW50IG9mIGhvdyB0aGUgcHJvZHVjZXIgcGlwZXMuXG4gICAgICovXG4gICAgLyoqXG4gICAgICogU2VuZCBvbmUgZ3JvdXAgdG8gdGhlIHNlcnZlcjogZ2F0ZSBvbiBydW4gcmVhZGluZXNzLCB0aGVuIG9uZVxuICAgICAqIGB3cml0ZU11bHRpYCAob3Igc2VxdWVudGlhbCBgd3JpdGVgcyB3aGVuIHRoZSB3b3JsZCBsYWNrcyBpdCkuIEVtaXRzXG4gICAgICogdGhlIHdyaXRlLWZsdXNoIHNwYW47IGR3ZWxsIGlzIG1lYXN1cmVkIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBSUEMgc28gYVxuICAgICAqIHR1cmJvIHJ1bi1yZWFkeSBiYXJyaWVyIHdhaXQgY291bnRzIGFzIGJ1ZmZlciBkd2VsbCwgbWF0Y2hpbmcgdGhlXG4gICAgICogcHJlLWdyb3VwLWNvbW1pdCB0ZWxlbWV0cnkuXG4gICAgICovXG4gICAgY29uc3Qgc2VuZEdyb3VwID0gYXN5bmMgKFxuICAgICAgZ3JvdXA6IFVpbnQ4QXJyYXlbXSxcbiAgICAgIGJ5dGVzOiBudW1iZXIsXG4gICAgICBncm91cFQwOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoQXQgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHR5cGVvZiB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkgPT09ICdmdW5jdGlvbicgJiYgZ3JvdXAubGVuZ3RoID4gMSkge1xuICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkocnVuSWQsIG5hbWUsIGdyb3VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBzZXF1ZW50aWFsIHdyaXRlc1xuICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGdyb3VwKSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgbmFtZSwgY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ3JvdXBUMCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlY29yZFN0cmVhbVdyaXRlRmx1c2goXG4gICAgICAgICAgZ3JvdXBUMCxcbiAgICAgICAgICBkaXNwYXRjaEF0LFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZ3JvdXAubGVuZ3RoLFxuICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgIERhdGUubm93KCkgLSBkaXNwYXRjaEF0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGRpc3BhdGNoTG9vcCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncm91cFQwID0gYnVmZmVyVDA7XG4gICAgICAgIGNvbnN0IGdyb3VwVGFrZW5BdCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHsgZ3JvdXAsIGJ5dGVzIH0gPSB0YWtlR3JvdXAoKTtcbiAgICAgICAgaW5GbGlnaHRDaHVua3MgPSBncm91cC5sZW5ndGg7XG4gICAgICAgIGluRmxpZ2h0Qnl0ZXMgPSBieXRlcztcbiAgICAgICAgYnVmZmVyVDAgPSBidWZmZXIubGVuZ3RoID4gMCA/IGdyb3VwVGFrZW5BdCA6IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNlbmRHcm91cChncm91cCwgYnl0ZXMsIGdyb3VwVDApO1xuICAgICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICAgICAgICBpbkZsaWdodEJ5dGVzID0gMDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBSZXRhaW4gdGhlIGZhaWxlZCBncm91cCAoYW5kIGl0cyBvcmlnaW5hbCB0MCkgYXQgdGhlIGZyb250IG9mXG4gICAgICAgICAgLy8gdGhlIGJ1ZmZlciwgcG9pc29uIHRoZSBzaW5rLCBhbmQgc3VyZmFjZSB0aGUgZmFpbHVyZSB0byBldmVyeVxuICAgICAgICAgIC8vIGJsb2NrZWQgd3JpdGVyIGFuZCBkcmFpbiB3YWl0ZXIuXG4gICAgICAgICAgYnVmZmVyID0gZ3JvdXAuY29uY2F0KGJ1ZmZlcik7XG4gICAgICAgICAgYnVmZmVyQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgICAgaW5GbGlnaHRDaHVua3MgPSAwO1xuICAgICAgICAgIGluRmxpZ2h0Qnl0ZXMgPSAwO1xuICAgICAgICAgIGJ1ZmZlclQwID1cbiAgICAgICAgICAgIGdyb3VwVDAgIT09IHVuZGVmaW5lZCAmJiBidWZmZXJUMCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gTWF0aC5taW4oZ3JvdXBUMCwgYnVmZmVyVDApXG4gICAgICAgICAgICAgIDogKGdyb3VwVDAgPz8gYnVmZmVyVDApO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBncm91cCBpcyBkdXJhYmxlOiByZWxpZXZlIHdyaXRlcnMgYmxvY2tlZCBvbiB0aGUgYm91bmQgKHRoZXlcbiAgICAgICAgLy8gcmUtY2hlY2sgaXQgYW5kIG1heSBibG9jayBhZ2FpbikuXG4gICAgICAgIGNvbnN0IHJlbGlldmVkID0gY2FwYWNpdHlXYWl0ZXJzO1xuICAgICAgICBjYXBhY2l0eVdhaXRlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHJlbGlldmVkKSB3LnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFN0YXJ0IChvciBqb2luKSB0aGUgZGlzcGF0Y2ggY2hhaW4uIE5ldmVyIGxlYXZlcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLiAqL1xuICAgIGNvbnN0IHN0YXJ0RGlzcGF0Y2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoaW5GbGlnaHQgfHwgc2lua0Vycm9yICE9PSB1bmRlZmluZWQgfHwgYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaW5GbGlnaHQgPSBkaXNwYXRjaExvb3AoKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQgPSBudWxsO1xuICAgICAgICAgIC8vIEEgd3JpdGUgY2FuIGxhbmQgaW4gdGhlIG1pY3JvdGFzayBnYXAgYmV0d2VlbiB0aGUgbG9vcCdzXG4gICAgICAgICAgLy8gZW1wdHktYnVmZmVyIGV4aXQgYW5kIHRoaXMgcmVhY3Rpb24uIHNjaGVkdWxlR3JvdXBDb21taXQgc2F3XG4gICAgICAgICAgLy8gaW5GbGlnaHQgc3RpbGwgc2V0IGFuZCBhcm1lZCBubyB0aW1lciwgc28gd2l0aG91dCB0aGlzIGNoZWNrXG4gICAgICAgICAgLy8gdGhlIGNodW5rIHdvdWxkIHNpdCBzdHJhbmRlZCB1bnRpbCBhIGxhdGVyIHdyaXRlL2Nsb3NlL2RyYWluLlxuICAgICAgICAgIC8vIFRyZWF0IGl0IGxpa2UgYW4gaW4tcmVxdWVzdCBhcnJpdmFsOiBkaXNwYXRjaCBpbW1lZGlhdGVseSAodGhlXG4gICAgICAgICAgLy8gbmV3IGNoYWluIHNldHRsZXMgdGhlIGRyYWluIHdhaXRlcnMgd2hlbiBpdCBmaW5pc2hlcykuXG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZ1bGx5IGlkbGUgKHRoZSBsb29wIG9ubHkgZXhpdHMgd2l0aCBhbiBlbXB0eSBidWZmZXIpOiBzZXR0bGVcbiAgICAgICAgICAvLyB0aGUgZHVyYWJpbGl0eSBiYXJyaWVyLlxuICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBkcmFpbldhaXRlcnM7XG4gICAgICAgICAgZHJhaW5XYWl0ZXJzID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCB3IG9mIHNldHRsZWQpIHcucmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpbkZsaWdodCA9IG51bGw7XG4gICAgICAgICAgc2lua0Vycm9yID8/PSBlcnJvcjtcbiAgICAgICAgICByZWplY3RXYWl0ZXJzKHNpbmtFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExlYWRpbmctZWRnZSBkaXNwYXRjaCBwb2xpY3kgZm9yIGFuIGlkbGUgc2luazpcbiAgICAgKiAtIHdpbmRvdyA8PSAwICh0aGUgZGVmYXVsdCk6IGRpc3BhdGNoIHRoZSBsZWFkaW5nIGNodW5rIGltbWVkaWF0ZWx5LlxuICAgICAqICAgRmFzdCBwcm9kdWNlcnMgc3RpbGwgYmF0Y2ggdmlhIGluLWZsaWdodCBhY2N1bXVsYXRpb246IGNodW5rc1xuICAgICAqICAgYXJyaXZpbmcgZHVyaW5nIHRoZSByZXF1ZXN0IGZvcm0gdGhlIG5leHQgZ3JvdXAuIFRoZSB0cmFkZSBmb3IgYW5cbiAgICAgKiAgIGlkbGUgYnVyc3QgaXMgb25lIGV4dHJhIHJlcXVlc3QgKGEgMzAtY2h1bmsgYnVyc3Qgc2hpcHMgYXMgMSArIDI5XG4gICAgICogICBpbnN0ZWFkIG9mIG9uZSAzMC1jaHVuayBncm91cCB1bmRlciBhIHBvc2l0aXZlIHdpbmRvdykgaW4gZXhjaGFuZ2VcbiAgICAgKiAgIGZvciB6ZXJvIGZpeGVkIGZpcnN0LWNodW5rIGRlbGF5LCB3aGljaCBtYXRjaGVzIG1lYXN1cmVkIHByb2R1Y2VyXG4gICAgICogICBiZWhhdmlvciwgd2hlcmUgaXNvbGF0ZWQgY2h1bmtzIGRvbWluYXRlLlxuICAgICAqIC0gd2luZG93ID4gMCAoZXhwbGljaXRseSBjb25maWd1cmVkKTogYXJtIHRoZSBncm91cC1jb21taXQgdGltZXIgc29cbiAgICAgKiAgIHRoZSBsZWFkaW5nIGNodW5rIHdhaXRzIHVwIHRvIHRoZSB3aW5kb3cgY29sbGVjdGluZyBhIGdyb3VwLFxuICAgICAqICAgdGhlIG9wdC1pbiB0cmFkZSBmb3Igc2xvdy1idXQtc3RlYWR5IHByb2R1Y2Vycy5cbiAgICAgKiBXaW5kb3cgcmVzb2x1dGlvbjogYFdPUktGTE9XX1NUUkVBTV9GTFVTSF9JTlRFUlZBTF9NU2AsIHdoZW4gc2V0LFxuICAgICAqIG92ZXJyaWRlcyBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYDsgb3RoZXJ3aXNlIHRoZSBXb3JsZCBvcHRpb25cbiAgICAgKiAoZGVmYXVsdCAwKSBnb3Zlcm5zLCBpbmNsdWRpbmcgdGhlIGZpcnN0IGNodW5rLiBEZWNpZGluZyBtYXlcbiAgICAgKiBoYXZlIHRvIHdhaXQgZm9yIHRoZSB3b3JsZCB0byByZXNvbHZlOyB0aGF0IGFkZHMgbm8gbGF0ZW5jeSBiZWNhdXNlXG4gICAgICogYHNlbmRHcm91cGAgYXdhaXRzIHRoZSBzYW1lIHByb21pc2UgYmVmb3JlIGFueSByZXF1ZXN0IGxlYXZlcy5cbiAgICAgKi9cbiAgICBjb25zdCBzY2hlZHVsZUdyb3VwQ29tbWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGZsdXNoVGltZXIgfHwgaW5GbGlnaHQpIHJldHVybjtcbiAgICAgIGlmIChyZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFByb21pc2UucmVzb2x2ZTogZXZlcnl3aGVyZSBlbHNlIHRoZSB3b3JsZCBpcyBvbmx5IGV2ZXIgYXdhaXRlZCxcbiAgICAgICAgLy8gd2hpY2ggdG9sZXJhdGVzIGEgc3luY2hyb25vdXMgdmFsdWUgKHRlc3RzIHN0dWIgZ2V0V29ybGRMYXp5IHRoYXRcbiAgICAgICAgLy8gd2F5KTsgLnRoZW4oKSBtdXN0IGJlIGdpdmVuIGEgcmVhbCBwcm9taXNlLlxuICAgICAgICBfZmx1c2hJbnRlcnZhbFJlc29sdXRpb24gPz89IFByb21pc2UucmVzb2x2ZSh3b3JsZFByb21pc2UpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAod29ybGQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPVxuICAgICAgICAgICAgICAgIHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNcyA/PyBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBXb3JsZCByZXNvbHV0aW9uIGZhaWx1cmUgc3VyZmFjZXMgb24gZGlzcGF0Y2g7IGZhbGwgYmFjayB0b1xuICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBzbyBidWZmZXJlZCBjaHVua3Mgc3RpbGwgcmVhY2ggdGhlIGRpc3BhdGNoIHBhdGhcbiAgICAgICAgICAgICAgLy8gKHdoZXJlIHRoZSBlcnJvciBwb2lzb25zIHRoZSBzaW5rKS5cbiAgICAgICAgICAgICAgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPSBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFJlLWV2YWx1YXRlOiB0aGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gZGlzcGF0Y2hlZCBieSBkcmFpbigpXG4gICAgICAgICAgICAvLyBvciBhIGZ1bGwtcmVxdWVzdCBmYXN0IHBhdGggd2hpbGUgdGhlIHdvcmxkIHJlc29sdmVkLlxuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSBzY2hlZHVsZUdyb3VwQ29tbWl0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA8PSAwKSB7XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZmx1c2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgfSwgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEdXJhYmlsaXR5IGJhcnJpZXI6IHJlc29sdmVzIHdoZW4gZXZlcnkgYWNjZXB0ZWQgY2h1bmsgaGFzIHJlYWNoZWQgdGhlXG4gICAgICogc2VydmVyIGFuZCBub3RoaW5nIGlzIGJ1ZmZlcmVkIG9yIGluIGZsaWdodDsgcmVqZWN0cyB3aXRoIHRoZSBzaW5rJ3NcbiAgICAgKiBzdGlja3kgZXJyb3IgaWYgYW55IGRpc3BhdGNoIGZhaWxlZC4gRmx1c2hlcyBhIHBlbmRpbmcgZ3JvdXAtY29tbWl0XG4gICAgICogd2luZG93IGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSB0aW1lci5cbiAgICAgKi9cbiAgICBjb25zdCBkcmFpbiA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgc2lua0Vycm9yO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiAhaW5GbGlnaHQpIHJldHVybjtcbiAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgZHJhaW5XYWl0ZXJzLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzdXBlcih7XG4gICAgICBhc3luYyB3cml0ZShjaHVuaykge1xuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgICAgaWYgKGJ1ZmZlclQwID09PSB1bmRlZmluZWQpIGJ1ZmZlclQwID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgICBidWZmZXJCeXRlcyArPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBidWZmZXIubGVuZ3RoID49IG1heENodW5rc1BlclJlcXVlc3QgfHxcbiAgICAgICAgICBidWZmZXJCeXRlcyA+PSBtYXhCeXRlc1BlclJlcXVlc3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gVGhlIGJ1ZmZlcmVkIGdyb3VwIGFscmVhZHkgZmlsbHMgYSByZXF1ZXN0OiBubyBwb2ludCBkd2VsbGluZyBpblxuICAgICAgICAgIC8vIHRoZSBjb21taXQgd2luZG93LlxuICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2hlZHVsZUdyb3VwQ29tbWl0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb3VuZGVkIGJ1ZmZlcjogYWNjZXB0IHRoZSBjaHVuayAobmV2ZXIgZHJvcCksIHRoZW4gYmxvY2sgdW50aWxcbiAgICAgICAgLy8gdGhlIHJlYWQtYnV0LW5vdC1kdXJhYmxlIHBvcHVsYXRpb24gKGJ1ZmZlcmVkIEFORCBpbiB0aGUgYWN0aXZlXG4gICAgICAgIC8vIHJlcXVlc3QpIGlzIGJhY2sgdW5kZXIgdGhlIGJvdW5kLiBFYWNoIGR1cmFibHktc2VudCBncm91cFxuICAgICAgICAvLyByZWxpZXZlcyB0aGlzLlxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgc2lua0Vycm9yID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAoYnVmZmVyLmxlbmd0aCArIGluRmxpZ2h0Q2h1bmtzID49IG1heEJ1ZmZlcmVkQ2h1bmtzIHx8XG4gICAgICAgICAgICBidWZmZXJCeXRlcyArIGluRmxpZ2h0Qnl0ZXMgPj0gbWF4QnVmZmVyZWRCeXRlcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNhcGFjaXR5V2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgc2lua0Vycm9yO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICAvLyBFdmVyeXRoaW5nIGFjY2VwdGVkIG11c3QgYmUgZHVyYWJsZSBiZWZvcmUgdGhlIHNlcnZlciBzdHJlYW0gaXNcbiAgICAgICAgLy8gY2xvc2VkOiB0aGUgc2VydmVyIGZlbmNlcyBwb3N0LWNsb3NlIHdyaXRlcy5cbiAgICAgICAgYXdhaXQgZHJhaW4oKTtcblxuICAgICAgICAvLyBBIGNsb3NlIHdpdGggYW4gZW1wdHkgYnVmZmVyIHNraXBzIHRoZSBkaXNwYXRjaCBwYXRoIChhbmQgaXRzXG4gICAgICAgIC8vIGJhcnJpZXIpLCBidXQgY2FuIGl0c2VsZiBiZSB0aGUgZmlyc3Qgd3JpdGUgdG8gYSBicmFuZC1uZXdcbiAgICAgICAgLy8gc3RyZWFtLCBzbyBnYXRlIGl0IHRvby5cbiAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcblxuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgY2xvc2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMuY2xvc2UocnVuSWQsIG5hbWUpO1xuICAgICAgICByZWNvcmRTdHJlYW1DbG9zZShjbG9zZVN0YXJ0LCBydW5JZCwgbmFtZSk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgYWJvcnQocmVhc29uKSB7XG4gICAgICAgIC8vIEJ1ZmZlcmVkIGNodW5rcyB3ZXJlIGFscmVhZHkgQUNLRUQgdG8gdGhlaXIgd3JpdGVycyAoZWFybHktYWNrXG4gICAgICAgIC8vIGNvbnRyYWN0KSwgYW5kIG5hdGl2ZSBwaXBlVG8gYWJvcnRzIHRoaXMgc2luayB3aGVuZXZlciBpdHMgU09VUkNFXG4gICAgICAgIC8vIGVycm9ycywgZS5nLiBhbiBBSSBzdHJlYW0gdGhhdCBlbWl0cyB0ZW4gZGVsdGFzIGFuZCB0aGVuIHRocm93cy5cbiAgICAgICAgLy8gRGlzY2FyZGluZyBoZXJlIHdvdWxkIHNpbGVudGx5IGxvc2UgdGhlIGFjY2VwdGVkIHRhaWwgb2YgdGhlXG4gICAgICAgIC8vIHByZWZpeCwgc28gZGVsaXZlciBpdCBmaXJzdDsgb25seSB0aGUgc2VydmVyIHN0cmVhbSBjbG9zZSBpc1xuICAgICAgICAvLyBza2lwcGVkLiBBIGRpc3BhdGNoIGZhaWx1cmUgZHVyaW5nIHRoaXMgZHJhaW4gaXMgYWxyZWFkeSBzdGlja3lcbiAgICAgICAgLy8gYW5kIHN1cmZhY2VzIHRocm91Z2ggdGhlIHNpbmsncyBlcnJvciBwYXRocy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IHVuLXRpbWVib3hlZCAodW5saWtlIHRoZSBzdGVwLWV4ZWN1dG9yJ3MgNTAwbXNcbiAgICAgICAgLy8gaW5saW5lIGZsdXNoKTogZ2l2aW5nIHVwIGVhcmx5IHdvdWxkIGRyb3AgYWNrZWQgY2h1bmtzLCB0aGVcbiAgICAgICAgLy8gZXhhY3QgbG9zcyB0aGlzIHBhdGggZXhpc3RzIHRvIHByZXZlbnQuIEl0IGlzIHN0aWxsIGJvdW5kZWQgaW5cbiAgICAgICAgLy8gcHJhY3RpY2UgYnkgdGhlIFdvcmxkIHRyYW5zcG9ydCdzIG93biB0aW1lb3V0L3JldHJ5IGJ1ZGdldDogYVxuICAgICAgICAvLyBzdGFsbGVkIHdyaXRlIGVuZHMgaW4gYSB0ZXJtaW5hbCByZWplY3Rpb24gYWZ0ZXIgZmluaXRlIHJldHJpZXMsXG4gICAgICAgIC8vIHdoaWNoIHJlamVjdHMgdGhlIGRpc3BhdGNoIGFuZCBsYW5kcyBpbiB0aGUgY2F0Y2ggYmVsb3cuIFRoZVxuICAgICAgICAvLyBzYW1lIGNhdGNoIGFic29yYnMgdGhlIGV4cGVjdGVkIGNvbmZsaWN0IHdoZW4gYSB0ZWFyZG93bi1kcml2ZW5cbiAgICAgICAgLy8gYWJvcnQgZHJhaW5zIGludG8gYW4gYWxyZWFkeS10ZXJtaW5hbCBydW4uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZHJhaW4oKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gc2lua0Vycm9yIGlzIHNldDsgYWNjZXB0ZWQtYnV0LXVuZGVsaXZlcmFibGUgY2h1bmtzIHN1cmZhY2UgaXQuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgIGJ1ZmZlckJ5dGVzID0gMDtcbiAgICAgICAgc2lua0Vycm9yID8/PSByZWFzb24gPz8gbmV3IEVycm9yKCdTdHJlYW0gYWJvcnRlZCcpO1xuICAgICAgICAvLyBSZWplY3QgYmxvY2tlZCB3cml0ZXJzIGFuZCBkcmFpbiB3YWl0ZXJzIHNvIG5vdGhpbmcgbGVha3Mgb3JcbiAgICAgICAgLy8gaGFuZ3Mgb24gYSBwcm9taXNlIHdob3NlIHRpbWVyIHdhcyBqdXN0IGNsZWFyZWQuXG4gICAgICAgIHJlamVjdFdhaXRlcnMoc2lua0Vycm9yKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBEdXJhYmlsaXR5IGJhcnJpZXIgZm9yIG93bmVycyB0aGF0IGNvbXBsZXRlIHdpdGhvdXQgY2xvc2luZyB0aGVcbiAgICAvLyBzdHJlYW06IGBmbHVzaGFibGVQaXBlYCdzIGxvY2stcmVsZWFzZSBjb21wbGV0aW9uIGF3YWl0cyB0aGlzIHNvIGFcbiAgICAvLyBzdGVwIGNhbm5vdCBmaW5pc2ggKGFuZCB0aGUgZnVuY3Rpb24gc3VzcGVuZCkgd2hpbGUgYWNjZXB0ZWQgY2h1bmtzXG4gICAgLy8gYXJlIHN0aWxsIGNsaWVudC1idWZmZXJlZCBvciBpbiBmbGlnaHQuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNUUkVBTV9EUkFJTl9TWU1CT0wsIHtcbiAgICAgIHZhbHVlOiBkcmFpbixcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlcy5cbmV4cG9ydCB0eXBlIHtcbiAgQnl0ZVN0cmVhbUZyYW1pbmcsXG4gIFJlZHVjZXJzLFxuICBSZXZpdmVycyxcbiAgU2VyaWFsaXphYmxlU3BlY2lhbCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcblxuLy8gSW1wb3J0IHR5cGVzIGxvY2FsbHkgZm9yIHVzZSB3aXRoaW4gdGhpcyBmaWxlLlxuaW1wb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyAtLS0tIENvbXBvc2VkIHJlZHVjZXJzIC0tLS1cbi8vIENvbXBvc2VzIG1vZHVsYXIgcmVkdWNlcnMgKGNvbW1vbiwgY2xhc3MsIHN0ZXAtZnVuY3Rpb24pIHdpdGhcbi8vIG1vZGUtc3BlY2lmaWMgUmVxdWVzdC9SZXNwb25zZS9TdHJlYW0gcmVkdWNlcnMgYmVsb3cuXG5cbi8qKlxuICogQmFzZSByZWR1Y2VycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBzdGVwLWZ1bmN0aW9uICsgY29tbW9uIHJlZHVjZXJzIGZyb20gdGhlIG1vZHVsYXIgbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsQmFzZVJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIGNvbnN0IHJlcXVlc3RQcm90b3R5cGUgPSBvbmNlKCgpID0+IGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZXF1ZXN0JykpO1xuICBjb25zdCByZXNwb25zZVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVzcG9uc2UnKVxuICApO1xuICAvLyBDbGFzcy9JbnN0YW5jZSBNVVNUIGNvbWUgYmVmb3JlIEVycm9yIHNvIHRoYXQgY3VzdG9tIEVycm9yIHN1YmNsYXNzZXNcbiAgLy8gd2l0aCBXT1JLRkxPV19TRVJJQUxJWkUgdGFrZSBwcmVjZWRlbmNlIChkZXZhbHVlIHVzZXMgZmlyc3QtbWF0Y2gtd2lucykuXG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgIC4uLmdldFN0ZXBGdW5jdGlvblJlZHVjZXIoKSxcbiAgICAuLi5nZXRDb21tb25SZWR1Y2VycyhnbG9iYWwpLFxuICAgIC8vIFJlcXVlc3QgYW5kIFJlc3BvbnNlIHJlZHVjZXJzIGFyZSBtb2RlLXNwZWNpZmljIGFuZCBhZGRlZCBieVxuICAgIC8vIGdldEV4dGVybmFsUmVkdWNlcnMgLyBnZXRXb3JrZmxvd1JlZHVjZXJzIC8gZ2V0U3RlcFJlZHVjZXJzIGJlbG93LlxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gQ2hhaW4gd2FsayByYXRoZXIgdGhhbiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVxdWVzdGA6IHNlZSB0aGVcbiAgICAgIC8vIFJlYWRhYmxlU3RyZWFtIHJlZHVjZXIgaW4gZ2V0V29ya2Zsb3dSZWR1Y2VycyBmb3Igd2h5LiBSZWFkcyBnb1xuICAgICAgLy8gdGhyb3VnaCBkZXNjcmlwdG9ycyBzbyBhIGdldHRlciBjYW5ub3QgcnVuIHVucmVwb3J0ZWQuXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgcmVxdWVzdFByb3RvdHlwZS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGRhdGE6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlcXVlc3QnXSA9IHtcbiAgICAgICAgbWV0aG9kOiByZWFkUHJvcGVydHkodmFsdWUsICdtZXRob2QnKSBhcyBzdHJpbmcsXG4gICAgICAgIHVybDogcmVhZFByb3BlcnR5KHZhbHVlLCAndXJsJykgYXMgc3RyaW5nLFxuICAgICAgICBoZWFkZXJzOiByZWFkUHJvcGVydHkodmFsdWUsICdoZWFkZXJzJykgYXMgSGVhZGVycyxcbiAgICAgICAgYm9keTogcmVhZFByb3BlcnR5KHZhbHVlLCAnYm9keScpIGFzIFJlYWRhYmxlU3RyZWFtIHwgbnVsbCxcbiAgICAgICAgZHVwbGV4OiByZWFkUHJvcGVydHkodmFsdWUsICdkdXBsZXgnKSBhcyAnaGFsZicsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSkgYXNcbiAgICAgICAgfCBXcml0YWJsZVN0cmVhbTxSZXNwb25zZT5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICBkYXRhLnJlc3BvbnNlV3JpdGFibGUgPSByZXNwb25zZVdyaXRhYmxlO1xuICAgICAgfVxuICAgICAgLy8gRm9yd2FyZCB0aGUgc2lnbmFsIGluIHR3byBjYXNlczpcbiAgICAgIC8vICAgMS4gQWxyZWFkeSBhYm9ydGVkOiBwcmVzZXJ2ZSBhYm9ydGVkPXRydWUvcmVhc29uIHNvIHRoZSBoeWRyYXRlZFxuICAgICAgLy8gICAgICBzdGVwIHNlZXMgdGhlIGNhbmNlbGxhdGlvbiB0aGF0IGhhcHBlbmVkIGJlZm9yZSBzZXJpYWxpemUuXG4gICAgICAvLyAgIDIuIEFscmVhZHkgdGFnZ2VkIHdpdGggd29ya2Zsb3cgaW5mcmFzdHJ1Y3R1cmUsIGkuZS4gYSBzaWduYWxcbiAgICAgIC8vICAgICAgZnJvbSBhIHdvcmtmbG93LW1hbmFnZWQgQWJvcnRDb250cm9sbGVyLCB3aGljaCBoYXMgc3RyZWFtL2hvb2tcbiAgICAgIC8vICAgICAgYmFja2luZyBmb3IgY3Jvc3MtYm91bmRhcnkgcHJvcGFnYXRpb24uXG4gICAgICAvLyBQbGFpbiBub24tYWJvcnRlZCBuYXRpdmUgc2lnbmFscyBhcmUgaW50ZW50aW9uYWxseSBkcm9wcGVkICh3b3VsZFxuICAgICAgLy8gbWludCBzdHJlYW0gaW5mcmEgZm9yIGV2ZXJ5IFJlcXVlc3QsIGluY2x1ZGluZyB0aGUgYXV0by1nZW5lcmF0ZWRcbiAgICAgIC8vIHNpZ25hbCBvbiBgbmV3IFJlcXVlc3QodXJsKWApLlxuICAgICAgY29uc3Qgc2lnbmFsID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnc2lnbmFsJyk7XG4gICAgICBpZiAoXG4gICAgICAgIHNpZ25hbCAmJlxuICAgICAgICAocmVhZFByb3BlcnR5KHNpZ25hbCwgJ2Fib3J0ZWQnKSB8fFxuICAgICAgICAgIHJlYWRQcm9wZXJ0eShzaWduYWwsIEFCT1JUX1NUUkVBTV9OQU1FKSlcbiAgICAgICkge1xuICAgICAgICBkYXRhLnNpZ25hbCA9IHNpZ25hbCBhcyBBYm9ydFNpZ25hbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZXF1ZXN0IHJlZHVjZXIgYWJvdmUuXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgcmVzcG9uc2VQcm90b3R5cGUudmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiByZWFkUHJvcGVydHkodmFsdWUsICd0eXBlJykgYXMgUmVzcG9uc2VbJ3R5cGUnXSxcbiAgICAgICAgdXJsOiByZWFkUHJvcGVydHkodmFsdWUsICd1cmwnKSBhcyBzdHJpbmcsXG4gICAgICAgIHN0YXR1czogcmVhZFByb3BlcnR5KHZhbHVlLCAnc3RhdHVzJykgYXMgbnVtYmVyLFxuICAgICAgICBzdGF0dXNUZXh0OiByZWFkUHJvcGVydHkodmFsdWUsICdzdGF0dXNUZXh0JykgYXMgc3RyaW5nLFxuICAgICAgICBoZWFkZXJzOiByZWFkUHJvcGVydHkodmFsdWUsICdoZWFkZXJzJykgYXMgSGVhZGVycyxcbiAgICAgICAgYm9keTogcmVhZFByb3BlcnR5KHZhbHVlLCAnYm9keScpIGFzIFJlYWRhYmxlU3RyZWFtIHwgbnVsbCxcbiAgICAgICAgcmVkaXJlY3RlZDogcmVhZFByb3BlcnR5KHZhbHVlLCAncmVkaXJlY3RlZCcpIGFzIGJvb2xlYW4sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hhcmVkIGFib3J0IHJlZHVjZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgQWJvcnRTZXJpYWxpemVkRGF0YSA9IHtcbiAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uOiB1bmtub3duO1xufTtcblxuLyoqXG4gKiBTeW1ib2wta2V5ZWQgaW50ZXJuYWwgZmllbGRzIHRhZ2dlZCBvbnRvIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbFxuICogaW5zdGFuY2VzIChhbmQgYGhvbGRlcmBzIGluIHJlZHVjZXIgaGVscGVycykuIEFsbCBvcHRpb25hbDogYSBwbGFpblxuICogbmF0aXZlIGluc3RhbmNlIGhhcyBub25lIG9mIHRoZW0gc2V0LlxuICovXG50eXBlIEFib3J0SW50ZXJuYWxzID0ge1xuICBbQUJPUlRfU1RSRUFNX05BTUVdPzogc3RyaW5nO1xuICBbQUJPUlRfSE9PS19UT0tFTl0/OiBzdHJpbmc7XG4gIFtBQk9SVF9SRUFERVJfQ0FOQ0VMXT86IEFib3J0Q29udHJvbGxlcjtcbn07XG5cbnR5cGUgQWJvcnRTaWduYWxMaWtlID0gQWJvcnRJbnRlcm5hbHMgJiB7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHVua25vd247XG4gIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgQWJvcnRIb2xkZXIgPSBBYm9ydEludGVybmFscyAmIHsgc2lnbmFsPzogQWJvcnRJbnRlcm5hbHMgfTtcblxuLyoqXG4gKiBTaGFyZWQgbG9naWMgZm9yIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZWR1Y2VycyBpbiBleHRlcm5hbCBhbmQgc3RlcFxuICogY29udGV4dHMuIEFzc2lnbnMgc3RyZWFtL2hvb2sgbmFtZXMgaWYgbm90IGFscmVhZHkgcHJlc2VudCwgb3B0aW9uYWxseVxuICogYXR0YWNoZXMgYW4gYWJvcnQgbGlzdGVuZXIgZm9yIHJlYWwtdGltZSBwcm9wYWdhdGlvbiwgYW5kIHJldHVybnMgdGhlXG4gKiBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbExpa2UsXG4gIGhvbGRlcjogQWJvcnRIb2xkZXIsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHtcbiAgbGV0IHN0cmVhbU5hbWUgPSBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdO1xuICBsZXQgaG9va1Rva2VuID0gaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCBpZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgIHN0cmVhbU5hbWUgPSBnZXRBYm9ydFN0cmVhbUlkKGlkKTtcbiAgICBob29rVG9rZW4gPSBgYWJydF8ke2lkfWA7XG4gICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICAgIGlmIChob2xkZXIuc2lnbmFsKSB7XG4gICAgICBob2xkZXIuc2lnbmFsW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgICBob2xkZXIuc2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZHVwZWQgdmlhIEFCT1JUX0xJU1RFTkVSX0FUVEFDSEVEIG1hcmtlcjogc2VlIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlLlxuICBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgICBzaWduYWwgYXMgQWJvcnRTaWduYWwsXG4gICAgc3RyZWFtTmFtZSxcbiAgICBydW5JZCxcbiAgICBjcnlwdG9LZXksXG4gICAgb3BzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgbG9naWMgZm9yIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZWR1Y2VycyBpbiB3b3JrZmxvdyBjb250ZXh0LlxuICogUmVhZHMgZXhpc3Rpbmcgc3RyZWFtL2hvb2sgbmFtZXMgZnJvbSBzeW1ib2xzIChtdXN0IGFscmVhZHkgYmUgc2V0KS5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRCeVN5bWJvbChcbiAgc2lnbmFsOiB7IGFib3J0ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHVua25vd24gfSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlclxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB8IGZhbHNlIHtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9XG4gICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICBjb25zdCBob29rVG9rZW4gPVxuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHN0cmVhbSBuYW1lIGlzIG5vdCBzZXQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhIHNpbmdsZSBhYm9ydCBsaXN0ZW5lciB0byBhIHNpZ25hbCwgZGVkdXBlZCBhY3Jvc3MgY2FsbHMuXG4gKlxuICogRWFjaCBzZXJpYWxpemF0aW9uIHBhc3MgZ29lcyB0aHJvdWdoIHRoZSByZWR1Y2VyLCBidXQgYSBjb250cm9sbGVyIHBhc3NlZFxuICogdG8gTiBzdGVwcyB3b3VsZCBvdGhlcndpc2UgYWNjdW11bGF0ZSBOIGxpc3RlbmVycywgZWFjaCB3cml0aW5nIHRoZSBzYW1lXG4gKiBzdHJlYW0gcGFja2V0IGFuZCBkb3VibGUtY2xvc2luZyB0aGUgc3RyZWFtIG9uIGFib3J0LiBUaGUgbWFya2VyIHN5bWJvbFxuICogZW5zdXJlcyB0aGUgc3RyZWFtLXdyaXRlIHNpZGUtZWZmZWN0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlciAoc2lnbmFsLCBydW5JZCkuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogdm9pZCB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICBpZiAoKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSkgcmV0dXJuO1xuICAoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdID0gdHJ1ZTtcblxuICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAnYWJvcnQnLFxuICAgICgpID0+IHtcbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgcmVhZGVyIHVzZXMgKGh5ZHJhdGVTdGVwQXJndW1lbnRzKVxuICAgICAgICAgICAgLy8gc28gdGhlIHJlYXNvbiByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eSAoRE9NRXhjZXB0aW9uLFxuICAgICAgICAgICAgLy8gRXJyb3JzLCBjdXN0b20gY2xhc3NlcywgZXRjLikgYW5kIHJlc3BlY3RzIHRoZSBydW4ncyBlbmNyeXB0aW9uIGtleS5cbiAgICAgICAgICAgIC8vIEEgYmFyZSBKU09OLnN0cmluZ2lmeSBoZXJlIHdvdWxkIHdyaXRlIGEgcGFja2V0IHRoZSByZWFkZXIgY2FuJ3RcbiAgICAgICAgICAgIC8vIGRlY29kZSBhbmQgdGhlIGxpc3RlbmVyLXNpZGUgYWJvcnQgd291bGQgcHJvcGFnYXRlIHdpdGggbm8gcmVhc29uLlxuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbjogc2lnbmFsLnJlYXNvbiB9LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfSxcbiAgICB7IG9uY2U6IHRydWUgfVxuICApO1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gdGhlIGNsaWVudCBzaWRlLCBwYXNzaW5nIGFyZ3VtZW50c1xuICogdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcGFyYW0gY3J5cHRvS2V5XG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGVuIGB0cnVlYCwgYnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2ApXG4gKiAgIGFyZSB3cmFwcGVkIGluIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMgb24gdGhlIHdpcmUgc28gdGhlIGNvbnN1bWVyXG4gKiAgIGNhbiByZWNvbm5lY3Qgb24gdHJhbnNpZW50IGVycm9ycy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgcnVuJ3NcbiAqICAgY2FwYWJpbGl0eTogc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0c1xuICogICB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIG5lc3RlZCBgUmVhZGFibGVTdHJlYW1gIGZvdW5kIHdoaWxlIHNlcmlhbGl6aW5nXG4gIC8vIGlzIHBpcGVkIHRvIGl0cyBvd24gc2VydmVyIHN0cmVhbSBpbmRlcGVuZGVudGx5IG9mIHRoZSBvdXRlciBzaW5rLCBzbyBpdHNcbiAgLy8gZmlyc3QgY2h1bmsgY2FuIHJhY2UgYHJ1bl9zdGFydGVkYC4gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBpbnRvIHRoYXRcbiAgLy8gc2luayBzbyB0aGUgd3JpdGUgb3JkZXJzIGFmdGVyIHRoZSBydW4gZXhpc3RzLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvXG4gIC8vIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+LFxuICAvLyBPcGVyYXRpb25zIHRoYXQgcmVhZCBkYXRhIGJhY2sgZnJvbSB0aGUgd29ya2Zsb3cgaW50byBjYWxsZXItb3duZWRcbiAgLy8gd3JpdGFibGVzLiBUaGVzZSBtdXN0IHN0YXkgc2VwYXJhdGUgZnJvbSBwcm9kdWNlciB1cGxvYWRzOiBhIHJlYWRiYWNrIGNhblxuICAvLyBvbmx5IGZpbmlzaCBhZnRlciB0aGUgd29ya2Zsb3cgcnVucywgc28gYXdhaXRpbmcgaXQgYmVmb3JlIGRpc3BhdGNoIHdvdWxkXG4gIC8vIGRlYWRsb2NrLiBEZWZhdWx0cyB0byBgb3BzYCBmb3IgZXhpc3RpbmcgY2FsbGVycyB0aGF0IGZsdXNoIGV2ZXJ5dGhpbmcgaW5cbiAgLy8gdGhlIGJhY2tncm91bmQuXG4gIHJlYWRiYWNrT3BzOiBQcm9taXNlPHZvaWQ+W10gPSBvcHNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTdHJlYW0gbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gcGFzc2luZyBhY3Jvc3MgZXhlY3V0aW9uIGJvdW5kYXJ5XG4gICAgICBpZiAodmFsdWUubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ1JlYWRhYmxlU3RyZWFtIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdyBib3VuZGFyeS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQYXNzIHRoZSBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgLmdldFJlYWRlcigpIC8gLnBpcGVUaHJvdWdoKCkgLyAucGlwZVRvKCksIG9yIHRlZSBpdCB3aXRoIC50ZWUoKSBhbmQgcGFzcyBvbmUgb2YgdGhlIGJyYW5jaGVzLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgY29uc3QgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRTdHJlYW1UeXBlKHZhbHVlKTtcblxuICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIGlmIChmcmFtZWRCeXRlU3RyZWFtcykge1xuICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUaHJvdWdoKGdldEJ5dGVGcmFtaW5nU3RyZWFtKCkpLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5LFxuICAgICAgICAgICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICByZWFkYmFja09wc1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMpIHMuZnJhbWluZyA9ICdmcmFtZWQtdjEnO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHdoZW4gdGhlIHdyaXRhYmxlIGlzIGFscmVhZHkgYmFja2VkIGJ5IGEgd29ya2Zsb3dcbiAgICAgIC8vIHNlcnZlciBzdHJlYW0gKGUuZy4gaXQgY2FtZSBmcm9tIGEgc3RlcC1jb250ZXh0IGBnZXRXcml0YWJsZSgpYFxuICAgICAgLy8gb3Igd2FzIGh5ZHJhdGVkIGZyb20gYSB3b3JrZmxvdyBpbnB1dCBieSBgZ2V0U3RlcFJldml2ZXJzYCksXG4gICAgICAvLyBmb3J3YXJkIGl0cyB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCB0byB0aGUgcmVjZWl2aW5nIHJ1bi5cbiAgICAgIC8vIFRoZSByZWNlaXZpbmcgcnVuJ3Mgc3RlcC1zaWRlIHJldml2ZXIgb3BlbnMgYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZXMgdGhhdCBydW4nc1xuICAgICAgLy8gZW5jcnlwdGlvbiBrZXkgZGlyZWN0bHksIHNvIHdyaXRlcyBsYW5kIG9uIHRoZSBvcmlnaW5hbCBzdHJlYW1cbiAgICAgIC8vIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgcmVjZWl2aW5nIHJ1biwgd2l0aCBubyBpbi1wcm9jZXNzXG4gICAgICAvLyBicmlkZ2UgdGllZCB0byB0aGUgZGVoeWRyYXRpbmcgc3RlcCdzIGxpZmV0aW1lLlxuICAgICAgY29uc3QgZXhpc3RpbmdOYW1lID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdOYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdSdW5JZCA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0ge1xuICAgICAgICAgIG5hbWU6IGV4aXN0aW5nTmFtZSxcbiAgICAgICAgICBydW5JZDogZXhpc3RpbmdSdW5JZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQdWJsaWNLZXkgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdQdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5lbmNyeXB0aW9uUHVibGljS2V5ID0gZXhpc3RpbmdQdWJsaWNLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhpc3RpbmdEZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdEZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5kZXBsb3ltZW50SWQgPSBleGlzdGluZ0RlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKTtcbiAgICAgIHJlYWRiYWNrT3BzLnB1c2gocmVhZGFibGUucGlwZVRvKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUuc2lnbmFsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydFNpZ25hbCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRTaWduYWwpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCBwYXNzaW5nIHJldHVybiB2YWx1ZSB0byB0aGUgY2xpZW50IHNpZGUgYW5kIGludG8gc3RlcCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuLyoqXG4gKiBQcm90b3R5cGVzIHVzZWQgZm9yIGJyYW5kLXN0eWxlIGlkZW50aWZpY2F0aW9uIGluIHRoZSByZWR1Y2VycyBiZWxvdy5cbiAqXG4gKiBUaGUgc3RyZWFtIGFuZCBhYm9ydCBjbGFzc2VzIGFyZSBob3N0IGNsYXNzZXMgaW5qZWN0ZWQgaW50byB0aGUgc2FuZGJveCwgc29cbiAqIGluc3RhbmNlcyBjYXJyeSB0aGUgaG9zdCBwcm90b3R5cGUgaW4gdGhlaXIgY2hhaW4gYW5kIGEgY2hhaW4gd2Fsa1xuICogaWRlbnRpZmllcyB0aGVtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYCBvbiB0aGUgc2FuZGJveFxuICogY2xhc3MuIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJ1bnRpbWUgbGFja3MgdGhlIGNsYXNzLCBpbiB3aGljaCBjYXNlXG4gKiBpZGVudGlmaWNhdGlvbiBmYWxscyBiYWNrIHRvIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2xzIGFsb25lLlxuICovXG4vKipcbiAqIFRoZSBwcm90b3R5cGUgb2YgYSBob3N0IGNsYXNzIHRoYXQgbWF5IGFsc28gYmUgaW5qZWN0ZWQgaW50byB0aGUgc2FuZGJveC5cbiAqIFByZWZlcnMgdGhlIHNhbmRib3ggYmluZGluZyAodGhlIHNhbWUgaG9zdCBjbGFzcyBvYmplY3QgaW4gcHJhY3RpY2UpIGFuZFxuICogZmFsbHMgYmFjayB0byB0aGUgaG9zdCdzIG93biwgc28gYSBjaGFpbiB3YWxrIGlkZW50aWZpZXMgaW5zdGFuY2VzIGZyb21cbiAqIGVpdGhlciByZWFsbSB3aXRob3V0IGNvbnN1bHRpbmcgYFN5bWJvbC5oYXNJbnN0YW5jZWAuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RDbGFzc1Byb3RvdHlwZShcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBuYW1lOiBzdHJpbmdcbik6IG9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIC8vIERlc2NyaXB0b3IgcmVhZHMgKGByZWFkUHJvcGVydHlgKSwgbm90IGJhcmUgZ2V0czogYW4gYWNjZXNzb3Igb3IgUHJveHlcbiAgLy8gcGxhbnRlZCBvbiB0aGUgc2FuZGJveCBnbG9iYWwgKG9yIHRoZSBjb25zdHJ1Y3RvcikgbXVzdCBiZSByZWNvcmRlZCBpblxuICAvLyB0aGUgZ3Vlc3QtY29kZSBzaW5rIChpdCBnYXRlcyBWTSByZXRlbnRpb24pLCBub3Qgc2lsZW50bHkgZXhlY3V0ZWQuXG4gIC8vIENhbGxlcnMgd3JhcCB0aGlzIGluIGBvbmNlKC4uLilgIHBlciByZWR1Y2VyIHNldCwgc28gdGhlIHJlYWQgaGFwcGVuc1xuICAvLyBleGFjdGx5IG9uY2UgcGVyIHNlcmlhbGl6ZSBwYXNzLCBvbiB0aGUgZmlyc3QgZ3VhcmQgaW52b2NhdGlvbiwgaW5zaWRlXG4gIC8vIHRoZSBwYXNzJ3Mgc2luayBzY29wZSwgbmV2ZXIgcGVyIHZhbHVlLlxuICBjb25zdCBjdG9yID0gcmVhZFByb3BlcnR5KGdsb2JhbCwgbmFtZSkgPz8gcmVhZFByb3BlcnR5KGdsb2JhbFRoaXMsIG5hbWUpO1xuICBpZiAodHlwZW9mIGN0b3IgIT09ICdmdW5jdGlvbicpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiByZWFkUHJvcGVydHkoY3RvciwgJ3Byb3RvdHlwZScpIGFzIG9iamVjdCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgY29uc3QgcmVhZGFibGVTdHJlYW1Qcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1JlYWRhYmxlU3RyZWFtJylcbiAgKTtcbiAgY29uc3Qgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1dyaXRhYmxlU3RyZWFtJylcbiAgKTtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdBYm9ydENvbnRyb2xsZXInKVxuICApO1xuICBjb25zdCBhYm9ydFNpZ25hbFByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnQWJvcnRTaWduYWwnKVxuICApO1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgLy8gUmVhZGFibGUvV3JpdGFibGUgc3RyZWFtcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAgLy8gYXJlIFwiaGFuZGxlc1wiIHRoYXQgY2FuIGJlIHBhc3NlZCBhcm91bmQgdG8gb3RoZXIgc3RlcHMuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gV2FsayB0aGUgcHJvdG90eXBlIGNoYWluIGluc3RlYWQgb2YgYGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtYDpcbiAgICAgIC8vIHRoZSBjbGFzcyBpcyBob3N0LXByb3ZpZGVkIChpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94KSwgc28gaXRzXG4gICAgICAvLyBwcm90b3R5cGUgaXMgaW4gdGhlIGNoYWluIG9mIGJvdGggcmVhbCBzdHJlYW1zIGFuZCB0aGVcbiAgICAgIC8vIGBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSlgIGhhbmRsZXMgdXNlZCBmb3IgcmVxdWVzdFxuICAgICAgLy8gYm9kaWVzLCBidXQgYSBjaGFpbiB3YWxrIG5ldmVyIGNvbnN1bHRzIGBTeW1ib2wuaGFzSW5zdGFuY2VgLCB3aGljaFxuICAgICAgLy8gdGhlIHNhbmRib3ggY2FuIGRlZmluZSBhbmQgd2hpY2ggcmFuIGZvciBldmVyeSB2YWx1ZSB0aGUgZWFybGllclxuICAgICAgLy8gcmVkdWNlcnMgZGlkIG5vdCBjbGFpbS4gUmVhZHMgYmVsb3cgZ28gdGhyb3VnaCBkZXNjcmlwdG9ycyBzbyBhXG4gICAgICAvLyBnZXR0ZXIgb24gYSBzdGVwIGFyZ3VtZW50IGNhbm5vdCBydW4gdW5yZXBvcnRlZC5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZWFkYWJsZVN0cmVhbVByb3RvdHlwZS52YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGZha2Ugc3RyZWFtIHN0b3JpbmcgQm9keUluaXQgZnJvbSBSZXF1ZXN0L1Jlc3BvbnNlIGNvbnN0cnVjdG9yXG4gICAgICBjb25zdCBib2R5SW5pdCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQk9EWV9JTklUX1NZTUJPTCk7XG4gICAgICBpZiAoYm9keUluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgZmFrZSBzdHJlYW0gLSBzZXJpYWxpemUgdGhlIEJvZHlJbml0IGRpcmVjdGx5XG4gICAgICAgIC8vIGRldmFsdWUgd2lsbCBoYW5kbGUgc2VyaWFsaXppbmcgc3RyaW5ncywgVWludDhBcnJheSwgZXRjLlxuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1JlYWRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBFeHRyYWN0PFxuICAgICAgICBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddLFxuICAgICAgICB7IG5hbWU6IHN0cmluZyB9XG4gICAgICA+ID0geyBuYW1lIH07XG4gICAgICBjb25zdCB0eXBlID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fVFlQRV9TWU1CT0wpIGFzXG4gICAgICAgIHwgJ2J5dGVzJ1xuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgY29uc3QgZnJhbWluZyA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MKSBhc1xuICAgICAgICB8IEJ5dGVTdHJlYW1GcmFtaW5nXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNlZSB0aGUgUmVhZGFibGVTdHJlYW0gcmVkdWNlciBhYm92ZSBmb3Igd2h5IHRoaXMgd2Fsa3MgdGhlIGNoYWluLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHdyaXRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgbmFtZSA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgU1RSRUFNX05BTUVfU1lNQk9MKSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXcml0YWJsZVN0cmVhbSBgbmFtZWAgaXMgbm90IHNldCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgLy8gV2hlbiB0aGUgaGFuZGxlIHdhcyBmb3J3YXJkZWQgZnJvbSBhbm90aGVyIHJ1biAocGFyZW50IOKGkiBjaGlsZFxuICAgICAgLy8gdmlhIGBzdGFydCgpYCksIHByZXNlcnZlIHRoZSBmb3JlaWduIHJ1bklkIHNvIHRoZSBzdGVwLXNpZGVcbiAgICAgIC8vIHJldml2ZXIgb3BlbnMgdGhlIHdyaXRhYmxlIGFnYWluc3QgdGhlIG9yaWdpbmFsIHN0cmVhbS5cbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MKTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmRlcGxveW1lbnRJZCA9IGZvcmVpZ25EZXBsb3ltZW50SWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JlaWduUHVibGljS2V5ID0gcmVhZFByb3BlcnR5KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTFxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5lbmNyeXB0aW9uUHVibGljS2V5ID0gZm9yZWlnblB1YmxpY0tleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICAvLyBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgaW4gd29ya2Zsb3cgY29udGV4dDogcmVhZCBvbmx5IHN5bWJvbHMgKGhhbmRsZXMpLlxuICAgIC8vIEluIHRoZSB3b3JrZmxvdyBWTSwgZ2xvYmFsLkFib3J0Q29udHJvbGxlciBpcyBhIGNsYXNzIGJ1dCBnbG9iYWwuQWJvcnRTaWduYWxcbiAgICAvLyBpcyBhIHBsYWluIG9iamVjdCAobm90IGEgY2xhc3MpLCBzbyBpbnN0YW5jZW9mIGNoZWNrcyB3b24ndCB3b3JrIGZvciBzaWduYWxzLlxuICAgIC8vIERldGVjdCBpbnN0YW5jZXMgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBBQk9SVF9TVFJFQU1fTkFNRSBzeW1ib2wgaW5zdGVhZC5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYHZhbHVlLnNpZ25hbGAgd2FzIGEgYmFyZSByZWFkLCBzbyBhIGBzaWduYWxgIGdldHRlciBvbiBhbnkgb2JqZWN0XG4gICAgICAvLyByZWFjaGluZyB0aGlzIHJlZHVjZXIgZXhlY3V0ZWQgdW5yZXBvcnRlZC4gUmVhZCB0aHJvdWdoIGRlc2NyaXB0b3JzXG4gICAgICAvLyBhbmQgZ2F0ZSBvbiB0aGUgaW5mcmFzdHJ1Y3R1cmUgc3ltYm9sIC8gcHJvdG90eXBlIGZpcnN0LlxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHZhbHVlIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SG9sZGVyO1xuICAgICAgY29uc3Qgb3duU3ltYm9sID0gcmVhZFByb3BlcnR5KHZhbHVlLCBBQk9SVF9TVFJFQU1fTkFNRSk7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0Q29udHJvbGxlciA9IGlzSW5zdGFuY2VPZlByb3RvdHlwZShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGFib3J0Q29udHJvbGxlclByb3RvdHlwZS52YWx1ZVxuICAgICAgKTtcbiAgICAgIGlmIChvd25TeW1ib2wgPT09IHVuZGVmaW5lZCAmJiAhaXNOYXRpdmVBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgLy8gTm90IG91cnMgYW5kIG5vdCBhIG5hdGl2ZSBjb250cm9sbGVyLCBidXQgYSBmb3JlaWduIGNvbnRyb2xsZXJcbiAgICAgICAgLy8gbWF5IHN0aWxsIGNhcnJ5IHRoZSBzeW1ib2wgb24gaXRzIHNpZ25hbC5cbiAgICAgICAgY29uc3QgbWF5YmVTaWduYWwgPSByZWFkUHJvcGVydHkodmFsdWUsICdzaWduYWwnKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1heWJlU2lnbmFsID09PSBudWxsIHx8XG4gICAgICAgICAgdHlwZW9mIG1heWJlU2lnbmFsICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAgIHJlYWRQcm9wZXJ0eShtYXliZVNpZ25hbCwgQUJPUlRfU1RSRUFNX05BTUUpID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYWwgPSByZWFkUHJvcGVydHkodmFsdWUsICdzaWduYWwnKTtcbiAgICAgIGlmICghc2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbChzaWduYWwgYXMgQWJvcnRTaWduYWwsIGhvbGRlcik7XG4gICAgfSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaGFzQWJvcnRTeW1ib2wgPVxuICAgICAgICByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKSAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaXNOYXRpdmVBYm9ydFNpZ25hbCA9IGlzSW5zdGFuY2VPZlByb3RvdHlwZShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGFib3J0U2lnbmFsUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKCFoYXNBYm9ydFN5bWJvbCAmJiAhaXNOYXRpdmVBYm9ydFNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0QnlTeW1ib2wodmFsdWUgYXMgQWJvcnRTaWduYWwsIHZhbHVlIGFzIEFib3J0SG9sZGVyKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0U3RlcFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgcmV0dXJuZWQgYFJlYWRhYmxlU3RyZWFtYCBpcyBwaXBlZCB0byB0aGUgc2VydmVyXG4gIC8vIGFmdGVyIHRoZSBib2R5IGJ1dCB3aXRoaW4gdGhlIHNhbWUgb3AgZmx1c2gsIHNvIGl0cyBmaXJzdCBjaHVuayBjYW4gcmFjZVxuICAvLyBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhlIHNpbmsgc28gdGhhdCB3cml0ZVxuICAvLyBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4sXG4gIHJlYWRiYWNrT3BzOiBQcm9taXNlPHZvaWQ+W10gPSBvcHNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTdHJlYW0gbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gcGFzc2luZyBhY3Jvc3MgZXhlY3V0aW9uIGJvdW5kYXJ5XG4gICAgICBpZiAodmFsdWUubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ1JlYWRhYmxlU3RyZWFtIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdyBib3VuZGFyeS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQYXNzIHRoZSBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgLmdldFJlYWRlcigpIC8gLnBpcGVUaHJvdWdoKCkgLyAucGlwZVRvKCksIG9yIHRlZSBpdCB3aXRoIC50ZWUoKSBhbmQgcGFzcyBvbmUgb2YgdGhlIGJyYW5jaGVzLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyZWFtIGFscmVhZHkgaGFzIHRoZSBuYW1lIHN5bWJvbCBzZXQsIGluIHdoaWNoIGNhc2VcbiAgICAgIC8vIGl0J3MgYWxyZWFkeSBiZWluZyBzdW5rIHRvIHRoZSBzZXJ2ZXIgYW5kIHdlIGNhbiByZXR1cm4gdGhlXG4gICAgICAvLyBuYW1lIGFuZCB0eXBlLlxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgbGV0IHR5cGUgPSB2YWx1ZVtTVFJFQU1fVFlQRV9TWU1CT0xdO1xuICAgICAgLy8gVGhlIGZyYW1pbmcgc3ltYm9sIGlzIHNldCB3aGVuIGEgd29ya2Zsb3cgVk0gcmV2aXZlcyBhIHN0cmVhbVxuICAgICAgLy8gaGFuZGxlIGZyb20gYSBwcmV2aW91cyBzdGVwIChzZWUgYGdldFdvcmtmbG93UmV2aXZlcnNgKS4gV2hlblxuICAgICAgLy8gcHJlc2VudCB3ZSBtdXN0IHByb3BhZ2F0ZSB0aGUgc2FtZSBmcmFtaW5nIGNob2ljZSBvbiB0aGUgd2F5XG4gICAgICAvLyBiYWNrIG91dCwgc2luY2UgdGhlIGJ5dGVzIGFscmVhZHkgb24gdGhlIHNlcnZlcidzIHN0cmVhbSBhcmUgaW5cbiAgICAgIC8vIHRoYXQgZm9ybWF0OyBzd2l0Y2hpbmcgZm9ybWF0IG1pZC1zdHJlYW0gd291bGQgY29ycnVwdCB0aGVtLlxuICAgICAgbGV0IGZyYW1pbmc6IEJ5dGVTdHJlYW1GcmFtaW5nIHwgdW5kZWZpbmVkID0gdmFsdWVbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXTtcblxuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIHR5cGUgPSBnZXRTdHJlYW1UeXBlKHZhbHVlKTtcbiAgICAgICAgZnJhbWluZyA9IHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMgPyAnZnJhbWVkLXYxJyA6IGZyYW1pbmc7XG5cbiAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAgIGlmIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJykge1xuICAgICAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgICAgIHZhbHVlLnBpcGVUaHJvdWdoKGdldEJ5dGVGcmFtaW5nU3RyZWFtKCkpLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgICBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5LFxuICAgICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICByZWFkYmFja09wc1xuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5Xcml0YWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgICBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgICByZWFkYmFja09wcy5wdXNoKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCByZWFkYmFja09wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8odmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5lbmNyeXB0aW9uUHVibGljS2V5ID0gZm9yZWlnblB1YmxpY0tleTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgZGFuZ2xpbmcgYWJvcnQtc3RyZWFtIHJlYWRlcnMgb24gYW55IEFib3J0Q29udHJvbGxlciBpbnN0YW5jZXMgZm91bmRcbiAqIGluIHRoZSBoeWRyYXRlZCBzdGVwIGFyZ3VtZW50cy4gQ2FsbGVkIGFmdGVyIHRoZSBzdGVwIGZ1bmN0aW9uIHJldHVybnNcbiAqIChzdWNjZXNzIG9yIGZhaWx1cmUpIHRvIHByZXZlbnQgcmVhZGVyIHByb21pc2VzIGZyb20ga2VlcGluZyB0aGUgc2VydmVybGVzc1xuICogZnVuY3Rpb24gYWxpdmUgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsQWJvcnRSZWFkZXJzKC4uLnZhbHVlczogdW5rbm93bltdKTogdm9pZCB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpO1xuICBmdW5jdGlvbiBjYW5jZWxJZlByZXNlbnQodmFsOiBBYm9ydEludGVybmFscyk6IHZvaWQge1xuICAgIGNvbnN0IGNhbmNlbCA9IHZhbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgICBpZiAoY2FuY2VsICYmICFjYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNhbmNlbC5hYm9ydCgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB3YWxrKHZhbDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWwgYXMgb2JqZWN0KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWQuYWRkKHZhbCBhcyBvYmplY3QpO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbC5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2FsayhpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbC52YWx1ZXMoKSkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZSBleHBvc2UgYHNpZ25hbGAvYGJvZHlgIGFzIHByb3RvdHlwZSBnZXR0ZXJzLCBzb1xuICAgIC8vIE9iamVjdC52YWx1ZXMoKSB3b24ndCBmaW5kIHRoZW0uIERlc2NlbmQgZXhwbGljaXRseS5cbiAgICBpZiAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHdhbGsodmFsLnNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKHZhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHdhbGsodik7XG4gIH1cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykgd2Fsayh2KTtcbn1cblxuLyoqXG4gKiBTZXRzIHVwIGEgc3RyZWFtIHJlYWRlciBvbiB0aGUgY29udHJvbGxlciB0aGF0IGxpc3RlbnMgZm9yIGFuIGFib3J0IHBhY2tldC5cbiAqIFJldHVybnMgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyIHNvIGl0IGNhbiBiZSBzdG9yZWQgb24gYm90aCB0aGVcbiAqIGNvbnRyb2xsZXIgYW5kIHNpZ25hbCBmb3IgY2xlYW51cCBieSBjYW5jZWxBYm9ydFJlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogQWJvcnRDb250cm9sbGVyIHtcbiAgY29uc3QgcmVhZGVyQ2FuY2VsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIG9wcy5wdXNoKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTx7IHZhbHVlOiB1bmRlZmluZWQ7IGRvbmU6IHRydWUgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFkZXJDYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlckNhbmNlbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAvLyBBbiBhYm9ydCBwYWNrZXQgYXJyaXZlZDogcHJvcGFnYXRlIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuIFJlbGVhc2VcbiAgICAgICAgICAvLyB0aGUgbG9jayAoc3luY2hyb25vdXMpIHJhdGhlciB0aGFuIGNhbmNlbGxpbmcgaGVyZTogb24gYVxuICAgICAgICAgIC8vIHNlcnZpY2UtYmFja2VkIFdvcmxkIGByZWFkZXIuY2FuY2VsKClgIGNhbiBkbyBhIG5ldHdvcmsgcm91bmQtdHJpcCxcbiAgICAgICAgICAvLyBhbmQgYXdhaXRpbmcgaXQgYmVmb3JlIGBjb250cm9sbGVyLmFib3J0KClgIHdvdWxkIGRlbGF5IChvciwgaWYgaXRcbiAgICAgICAgICAvLyBoYW5ncywgZHJvcCkgcmVhbC10aW1lIGFib3J0IGRlbGl2ZXJ5IHRvIHRoZSBpbi1mbGlnaHQgc3RlcC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBSZWFkZXIgbWF5IGFscmVhZHkgYmUgcmVsZWFzZWQ7IGlnbm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgd3JpdGVyIHVzZWQgc28gdGhlIHJlYXNvblxuICAgICAgICAgICAgLy8gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkuIEVuY3J5cHRpb24ga2V5IChpZiBhbnkpXG4gICAgICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBzdGVwIGNvbnRleHQsIHNldCB1cCBieSB0aGUgc3RlcCBleGVjdXRvciBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoaXMgcmVhZGVyIHJ1bnMuIEZhbGxiYWNrIHRvIHVuZGVmaW5lZCBmb3IgZXh0ZXJuYWwtY29udGV4dFxuICAgICAgICAgICAgLy8gcmV2aXZlcyAodGhlIGh5ZHJhdGUgcGF0aCBpcyBlbmNyeXB0aW9uLWtleS10b2xlcmFudCkuXG4gICAgICAgICAgICBjb25zdCBjdHhGb3JLZXkgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgY3R4Rm9yS2V5Py5lbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApKSBhcyB7IHJlYXNvbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZGF0YT8ucmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHN0ZXAgZmluaXNoZWQgKG9yIHRoZSByZWFkZXIgd2FzIGNhbmNlbGxlZCkgd2l0aG91dCBhbiBhYm9ydC5cbiAgICAgICAgICAvLyBDYW5jZWwgKG5vdCBqdXN0IHJlbGVhc2UpIHNvIHRoZSB1bmRlcmx5aW5nIFdvcmxkIHN0cmVhbSBpcyB0b3JuXG4gICAgICAgICAgLy8gZG93bjogYSBwb2xsaW5nIFdvcmxkIChlLmcuIHdvcmxkLWxvY2FsKSBvdGhlcndpc2UgbGVha3MgYSB0YWlsXG4gICAgICAgICAgLy8gcmVhZGVyIChhIDEwMG1zIGZpbGVzeXN0ZW0gcG9sbCBwbHVzIGVtaXR0ZXIgbGlzdGVuZXJzKSBwZXIgc3RlcFxuICAgICAgICAgIC8vIGludm9jYXRpb24gZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzLCBzaW5jZSBhIHNpZ25hbC1iZWFyaW5nIHN0ZXBcbiAgICAgICAgICAvLyBvcGVucyBvbmUgb2YgdGhlc2Ugb24gZXZlcnkgcmV2aXZhbCBhbmQgdXN1YWxseSBuZXZlciBhYm9ydHMuIEZpcmVcbiAgICAgICAgICAvLyBhbmQgZm9yZ2V0OiBhIHNlcnZpY2UtYmFja2VkIFdvcmxkJ3MgY2FuY2VsIG1heSBoaXQgdGhlIG5ldHdvcmssXG4gICAgICAgICAgLy8gYW5kIHRoaXMgcGF0aCBtdXN0IG5vdCBibG9jayB0aGUgc3RlcCdzIG9wcy1zZXR0bGUgd2luZG93LlxuICAgICAgICAgIHZvaWQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0cmVhbSByZWFkIGZhaWxlZDogc2lnbmFsIHdvbid0IHByb3BhZ2F0ZSBpbiByZWFsLXRpbWUsXG4gICAgICAgIC8vIGJ1dCBob29rLWJhc2VkIHByb3BhZ2F0aW9uIG9uIG5leHQgcmVwbGF5IHByb3ZpZGVzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSkoKVxuICApO1xuXG4gIHJldHVybiByZWFkZXJDYW5jZWw7XG59XG5cbi8qKlxuICogU3RvcmVzIGFib3J0IHNlcmlhbGl6YXRpb24gc3ltYm9scyBhbmQgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyXG4gKiBvbiBib3RoIHRoZSBjb250cm9sbGVyIGFuZCBpdHMgc2lnbmFsLlxuICovXG5mdW5jdGlvbiB0YWdBYm9ydFBhaXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgdmFsdWU6IHsgc3RyZWFtTmFtZTogc3RyaW5nOyBob29rVG9rZW46IHN0cmluZyB9LFxuICByZWFkZXJDYW5jZWw/OiBBYm9ydENvbnRyb2xsZXJcbik6IHZvaWQge1xuICBjb25zdCB0YWdnZWRDb250cm9sbGVyID0gY29udHJvbGxlciBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscztcbiAgY29uc3QgdGFnZ2VkU2lnbmFsID0gY29udHJvbGxlci5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscztcbiAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gdmFsdWUuc3RyZWFtTmFtZTtcbiAgdGFnZ2VkU2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICBpZiAocmVhZGVyQ2FuY2VsKSB7XG4gICAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgICB0YWdnZWRTaWduYWxbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSByZWFkZXJDYW5jZWw7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wYWdhdGUgYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBmcm9tIG9uZSBzaWduYWwgdG8gYW5vdGhlci4gVXNlZCBieSB0aGVcbiAqIFJlcXVlc3QgcmV2aXZlciBiZWNhdXNlIGBuZXcgUmVxdWVzdCh1cmwsIHsgc2lnbmFsIH0pYCBjb3BpZXMgdGhlIHNpZ25hbFxuICogaW50ZXJuYWxseTogdGhlIGNvbnN0cnVjdGVkIGByZXF1ZXN0LnNpZ25hbGAgaXMgYSBmcmVzaCBBYm9ydFNpZ25hbCB0aGF0XG4gKiBkb2Vzbid0IGNhcnJ5IHN5bWJvbHMgZnJvbSB0aGUgc291cmNlLlxuICovXG5mdW5jdGlvbiBjb3B5QWJvcnRJbnRlcm5hbHMoc3JjOiBBYm9ydFNpZ25hbCwgZGVzdDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgY29uc3QgcyA9IHNyYyBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCBkID0gZGVzdCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBpZiAoc1tBQk9SVF9TVFJFQU1fTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfU1RSRUFNX05BTUVdID0gc1tBQk9SVF9TVFJFQU1fTkFNRV07XG4gIH1cbiAgaWYgKHNbQUJPUlRfSE9PS19UT0tFTl0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfSE9PS19UT0tFTl0gPSBzW0FCT1JUX0hPT0tfVE9LRU5dO1xuICB9XG4gIGlmIChzW0FCT1JUX1JFQURFUl9DQU5DRUxdICE9PSB1bmRlZmluZWQpIHtcbiAgICBkW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gc1tBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWJvcnRDb250cm9sbGVyIHdpdGggc3RyZWFtLWJhY2tlZCBhYm9ydCBwcm9wYWdhdGlvbi5cbiAqIFVzZWQgYnkgc3RlcCBhbmQgZXh0ZXJuYWwgcmV2aXZlcnMgd2hlcmUgcmVhbCBhYm9ydCBzaWduYWwgYmVoYXZpb3IgaXMgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXJpYWxpemVkIGFib3J0IGNvbnRyb2xsZXIvc2lnbmFsIGRhdGFcbiAqIEBwYXJhbSBvcHMgLSBUaGUgb3BzIGFycmF5IGZvciB0cmFja2luZyBhc3luYyB3b3JrXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChmb3Igc3RyZWFtIHJlYWRzKVxuICogQHJldHVybnMgQSByZWFsIEFib3J0Q29udHJvbGxlciB3aXRoIHBhdGNoZWQgYWJvcnQoKSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRDb250cm9sbGVyKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRDb250cm9sbGVyJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGFib3J0KCkgdG8gYWxzbyB3cml0ZSBzdHJlYW0gKyByZXN1bWUgaG9vayAoZm9yIHN0ZXAtaW5pdGlhdGVkIGFib3J0KVxuICBjb25zdCBvcmlnaW5hbEFib3J0ID0gY29udHJvbGxlci5hYm9ydC5iaW5kKGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLmFib3J0ID0gKHJlYXNvbj86IHVua25vd24pID0+IHtcbiAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIG9yaWdpbmFsQWJvcnQocmVhc29uKTtcblxuICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4Lm9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgdGhyb3VnaCB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIGhvb2tcbiAgICAgICAgICAgIC8vIGV2ZW50IHVzZXMgc28gdGhlIGByZWFzb25gIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5XG4gICAgICAgICAgICAvLyAoRE9NRXhjZXB0aW9uLCBjdXN0b20gZXJyb3JzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzXG4gICAgICAgICAgICAvLyBlbmNyeXB0aW9uIGtleSwgc3ltbWV0cmljIHdpdGggd2hhdCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAvLyB3cml0ZXMgZm9yIHdvcmtmbG93LWluaXRpYXRlZCBhYm9ydHMuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfSxcbiAgICAgICAgICAgICAgY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5zdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUuaG9va1Rva2VuKSB7XG4gICAgICAgIC8vIFRoZSBkdXJhYmxlIGhvb2sgcmVzdW1lICh3aGljaCB3cml0ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCB0aGF0XG4gICAgICAgIC8vIHJlY29yZHMgdGhpcyBhYm9ydCBpbiB0aGUgd29ya2Zsb3cncyBldmVudCBsb2cpIG11c3QgYmUgY29tbWl0dGVkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgc3RlcCBjb21wbGV0ZXMuIE90aGVyd2lzZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uXG4gICAgICAgIC8vIGVucXVldWVkIGJ5IGBzdGVwX2NvbXBsZXRlZGAgY2FuIGFkdmFuY2UgcGFzdCB0aGUgYWJvcnQgKGRpc3BhdGNoaW5nXG4gICAgICAgIC8vIGEgbGF0ZXIgc3RlcCB3aXRoIGEgc3RhbGUsIG5vbi1hYm9ydGVkIGBzaWduYWxgKSBiZWZvcmUgdGhlIGV2ZW50XG4gICAgICAgIC8vIGV4aXN0cy4gUm91dGUgaXQgdG8gYHByZUNvbXBsZXRpb25PcHNgIChhd2FpdGVkIGlubGluZSBiZWZvcmVcbiAgICAgICAgLy8gY29tcGxldGlvbikgcmF0aGVyIHRoYW4gYG9wc2AgKGJlc3QtZWZmb3J0LCBiYWNrZ3JvdW5kKS4gVGhlIHN0cmVhbVxuICAgICAgICAvLyB3cml0ZSBhYm92ZSBzdGF5cyBpbiBgb3BzYDogaXQgbXVzdCBmaXJlIEFTQVAgdG8gcmVhY2ggYW4gaW4tZmxpZ2h0XG4gICAgICAgIC8vIHNpYmxpbmcgc3RlcCBhbmQgaXMgbm90IHRoZSBkdXJhYmxlIHJlY29yZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgaGVyZSBzbyB0aGUgcHJvbWlzZSBjYW4gb25seSBldmVyIGVuZm9yY2Ugb3JkZXJpbmdcbiAgICAgICAgLy8gd2hlbiBhd2FpdGVkIChzZWUgdGhlIG5vLXJlamVjdCBjb250cmFjdCBvblxuICAgICAgICAvLyBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzKTsgYSBmYWlsZWQgcmVzdW1lIHJldHJpZXMgb24gbmV4dCByZXBsYXkuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWUgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VtZUhvb2sgfSA9IGF3YWl0IGltcG9ydCgnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJyk7XG4gICAgICAgICAgICBhd2FpdCByZXN1bWVIb29rKHZhbHVlLmhvb2tUb2tlbiwge1xuICAgICAgICAgICAgICBhYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGhvb2sgcmVzdW1lOiByZXRyeSBvbiBuZXh0IHJlcGxheVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY3R4LnByZUNvbXBsZXRpb25PcHMucHVzaChob29rUmVzdW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogUmV2aXZlcyBvbmx5IGFuIEFib3J0U2lnbmFsIHdpdGhvdXQgdGhlIHBhdGNoZWQgYWJvcnQoKSBvdmVyaGVhZC5cbiAqIFVzZWQgd2hlbiBvbmx5IGEgc2lnbmFsIChub3QgYSBjb250cm9sbGVyKSB3YXMgc2VyaWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRTaWduYWwoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydFNpZ25hbCddLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbn1cblxuLyoqXG4gKiBCYXNlIHJldml2ZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIGNvbW1vbiByZXZpdmVycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKlxuICogVGhpcyBpcyBleHBvcnRlZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24tZm9ybWF0LnRzIGFuZCBvdGhlciBmaWxlcyByZWZlcmVuY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzKSB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgIC4uLmdldENvbW1vblJldml2ZXJzRnJvbU1vZHVsZShnbG9iYWwpLFxuICB9IGFzIGNvbnN0IHNhdGlzZmllcyBQYXJ0aWFsPFJldml2ZXJzPjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3cml0ZS1vbmx5IGtleSBhIHJ1biBuZWVkcyB3aGVuIHdyaXRpbmcgaW50byBhbm90aGVyIHJ1bidzXG4gKiBmb3J3YXJkZWQgc3RyZWFtLlxuICpcbiAqIFRocmVlIHRpZXJzLCBjaGVhcGVzdCBmaXJzdDpcbiAqXG4gKiAxLiBUaGUgZGVzY3JpcHRvciBjYXJyaWVzIHRoZSBvd25lcidzIFgyNTUxOSBwdWJsaWMga2V5OiBzZWFsIHRvIGl0IHdpdGhcbiAqICAgIG5vIEkvTyB3aGF0c29ldmVyLiBUaGUgb3duZXIgcHVibGlzaGVkIHRoZSBrZXkgd2hlbiBpdCBjcmVhdGVkIHRoZVxuICogICAgc3RyZWFtLCBzbyB0aGlzIGlzIHRoZSB6ZXJvLXJvdW5kLXRyaXAgcGF0aC5cbiAqIDIuIFRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgdGhlIG93bmVyJ3MgZGVwbG95bWVudCBJRDogcmVzb2x2ZSB0aGUgb3duZXInc1xuICogICAgc3ltbWV0cmljIGtleSwgd2hpY2ggY3Jvc3MtZGVwbG95bWVudCBtZWFucyBhIGtleS1BUEkgcm91bmQgdHJpcC5cbiAqIDMuIE5laXRoZXIgKGRlc2NyaXB0b3JzIHdyaXR0ZW4gYnkgb2xkZXIgU0RLcyk6IGxvYWQgdGhlIG93bmluZyBydW4gZmlyc3QsXG4gKiAgICB0aGVuIHJlc29sdmUgaXRzIHN5bW1ldHJpYyBrZXkuXG4gKlxuICogVGllcnMgMiBhbmQgMyBpbXBvcnQgdGhlIGtleSBlbmNyeXB0LW9ubHksIHdoaWNoIGlzIGFuIGhvbm9yLXN5c3RlbVxuICogcmVzdHJpY3Rpb246IHRoZSBzYW1lIGJ5dGVzIGNvdWxkIGRlY3J5cHQuIFRpZXIgMSBtYWtlcyBpdCBhIGNyeXB0b2dyYXBoaWNcbiAqIGd1YXJhbnRlZTogYSBwdWJsaWMga2V5IGNhbm5vdCByZWFkIGFueXRoaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IGRlY29kZVJ1blB1YmxpY0tleShlbmNyeXB0aW9uUHVibGljS2V5KTtcbiAgaWYgKG93bmVyUHVibGljS2V5KSByZXR1cm4gc2VhbFRvKG93bmVyUHVibGljS2V5KTtcblxuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBpZiAoIXdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcmF3S2V5ID0gZGVwbG95bWVudElkXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKHJ1bklkLCB7IGRlcGxveW1lbnRJZCB9KVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCkpO1xuICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSwgWydlbmNyeXB0J10pIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFN0ZXBGdW5jdGlvbiBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzIHRvIGNsaWVudHNcbiAgICBTdGVwRnVuY3Rpb246ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LiBTdGVwIGZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzLicsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAnQSBzdGVwIGZ1bmN0aW9uIHJlZmVyZW5jZSByZWFjaGVkIHRoZSBjbGllbnQuIFJldHVybiBhIHNlcmlhbGl6YWJsZSB2YWx1ZSAoZS5nLiB0aGUgc3RlcCByZXN1bHQpIGluc3RlYWQgb2YgdGhlIHN0ZXAgaXRzZWxmLicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86IHN0cmluZyB9ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBpbml0LnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ2xvYmFsLlJlcXVlc3QodmFsdWUudXJsLCBpbml0KTtcbiAgICAgIC8vIFRoZSBSZXF1ZXN0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc2lnbmFsIGNvcHksIHNvIHRoZVxuICAgICAgLy8gYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBzZXQgYnkgcmV2aXZlQWJvcnRTaWduYWwgZG9uJ3QgcHJvcGFnYXRlLlxuICAgICAgLy8gUmUtdGFnIHRoZSByZXF1ZXN0J3Mgb3duIHNpZ25hbCBzbyBjYW5jZWxBYm9ydFJlYWRlcnMgY2FuIGZpbmQgaXQuXG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBjb3B5QWJvcnRJbnRlcm5hbHModmFsdWUuc2lnbmFsLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE5vdGU6IFJlc3BvbnNlIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBzdGF0dXMsIHN0YXR1c1RleHQsIGFuZCBoZWFkZXJzXG4gICAgICAvLyBUaGUgdHlwZSwgdXJsLCBhbmQgcmVkaXJlY3RlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYW5kIHNldCBieSB0aGUgY29uc3RydWN0b3JcbiAgICAgIHJldHVybiBuZXcgZ2xvYmFsLlJlc3BvbnNlKHZhbHVlLmJvZHksIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyBoYXMgYm9keUluaXQsIGl0IGNhbWUgZnJvbSBhIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gICAgICAvLyBDb252ZXJ0IGl0IHRvIGEgUkVBTCBzdHJlYW0gbm93IHRoYXQgd2UncmUgb3V0c2lkZSB0aGUgd29ya2Zsb3dcbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWUuYm9keUluaXQ7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFJlc3BvbnNlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGNvbnZlcnQgQm9keUluaXQgdG8gUmVhZGFibGVTdHJlYW1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgZ2xvYmFsLlJlc3BvbnNlKGJvZHlJbml0KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyLiBBYnNlbnQgLyAncmF3JyBmcmFtaW5nIG1lYW5zIGxlZ2FjeSByYXcgYnl0ZXM6XG4gICAgICAgIC8vIHBpcGUgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBObyBhdXRvLXJlY29ubmVjdCBoZXJlIHlldDogcmF3IGJ5dGUgc3RyZWFtcyBoYXZlIG5vIHdpcmVcbiAgICAgICAgLy8gZnJhbWluZyB0byBjb3VudCBjb25zdW1lZCBjaHVua3Mgd2l0aC4gRnJhbWVkLXYxIGJ5dGUgc3RyZWFtc1xuICAgICAgICAvLyBtYWtlIGZyYW1lIGNvdW50aW5nIHBvc3NpYmxlLCBzbyBleHRlbmRpbmcgdGhlIHJlY29ubmVjdGluZ1xuICAgICAgICAvLyByZWFkZXIgdG8gdGhlbSBpcyBhIHNlcGFyYXRlIGZvbGxvdy11cC5cbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBDcmVhdGUgYW4gaWRlbnRpdHkgKG9yIHVuZnJhbWluZykgdHJhbnNmb3JtIHRvIGdpdmUgdGhlIHVzZXIgYSByZWFkYWJsZVxuICAgICAgICBjb25zdCB7IHJlYWRhYmxlOiB1c2VyUmVhZGFibGUsIHdyaXRhYmxlIH0gPVxuICAgICAgICAgIHZhbHVlLmZyYW1pbmcgPT09ICdmcmFtZWQtdjEnXG4gICAgICAgICAgICA/IGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKVxuICAgICAgICAgICAgOiBuZXcgZ2xvYmFsLlRyYW5zZm9ybVN0cmVhbSgpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB3cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHVzZXJSZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB1c2VyUmVhZGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tYnl0ZSBzdHJlYW1zIGNhcnJ5IGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMsIHNvIHdlIGNhbiBjb3VudFxuICAgICAgICAvLyBjb21wbGV0ZWQgZnJhbWVzIGFuZCB0cmFuc3BhcmVudGx5IHJlY29ubmVjdCB3aGVuIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3Rpb24gdGltZXMgb3V0IG1pZC1ydW4uXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNhbWUgaGFuZGxpbmcgYXMgYGdldFN0ZXBSZXZpdmVycy5Xcml0YWJsZVN0cmVhbWA6IHNlZSBjb21tZW50c1xuICAgICAgLy8gdGhlcmUgZm9yIHRoZSBjcm9zcy1ydW4gY2FzZSAod3JpdGFibGUgY2FycmllcyBgcnVuSWRgIGZyb21cbiAgICAgIC8vIHBhcmVudCDihpIgY2hpbGQgZm9yd2FyZGluZyB2aWEgYHN0YXJ0KClgKS5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXRLZXk6IEVuY3J5cHRpb25LZXlQYXJhbSA9XG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgID8gY3J5cHRvS2V5XG4gICAgICAgICAgOiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gICAgICAgICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXlcbiAgICAgICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWwsIG9wcywgdGFyZ2V0UnVuSWQsIHRhcmdldEtleSksXG4gICAgICAgIHRhcmdldEtleVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICB2YWx1ZS5uYW1lXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgZmx1c2hhYmxlIHN0YXRlIGZvciB0aGlzIHN0cmVhbVxuICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgZmx1c2hhYmxlUGlwZShzZXJpYWxpemUucmVhZGFibGUsIHNlcnZlcldyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gS2VlcCB0aGUgb3duZXIncyBwdWJsaWMga2V5IG9uIHRoZSBoYW5kbGUgc28gYSBmdXJ0aGVyIGZvcndhcmQgc3RheXMgb25cbiAgICAgIC8vIHRoZSB6ZXJvLWxvb2t1cCBzZWFsZWQgcGF0aC5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZTtcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHJldml2ZUFib3J0Q29udHJvbGxlcih2YWx1ZSwgb3BzLCBydW5JZCksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRTaWduYWwodmFsdWUsIG9wcywgcnVuSWQpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgY2xpZW50IHNpZGUsIGFuZCByZXR1cm4gdmFsdWVzXG4gKiBmcm9tIHRoZSBzdGVwcy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHdvcmtmbG93IGNvbnRleHQgLSB1c2VzIHRoZSBtb2R1bGFyIHJldml2ZXJcbiAgICAvLyB3aGljaCBjYWxscyBXT1JLRkxPV19VU0VfU1RFUCBmcm9tIGdsb2JhbCB0byByZWNvbnN0cnVjdCBzdGVwIHByb3hpZXNcbiAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZXZpdmVyKGdsb2JhbCksXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodmFsdWUsIGdsb2JhbC5SZXF1ZXN0LnByb3RvdHlwZSk7XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gdmFsdWUucmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEVdID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgICAgZGVsZXRlIHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgICh2YWx1ZSBhcyBhbnkpLnJlc3BvbmRXaXRoID0gKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnYHJlc3BvbmRXaXRoKClgIG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgc3RlcCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnTW92ZSB0aGUgYHJlc3BvbmRXaXRoKC4uLilgIGNhbGwgaW5zaWRlIGEgYFwidXNlIHN0ZXBcImAgZnVuY3Rpb24g4oCUIGl0IGNhbm5vdCBiZSBpbnZva2VkIGZyb20gYSB3b3JrZmxvdyBjb250ZXh0LicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIC8vIFdvcmtmbG93IGZ1bmN0aW9uIHJldml2ZXIgZm9yIHdvcmtmbG93IGNvbnRleHQ6IHJldHVybnMgYSBmdW5jdGlvbi1saWtlXG4gICAgLy8gb2JqZWN0IHdpdGggLndvcmtmbG93SWQgdGhhdCBtaW1pY3Mgd2hhdCB0aGUgU1dDIGNvbXBpbGVyIHByb2R1Y2VzLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodmFsdWUsIGdsb2JhbC5SZXNwb25zZS5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIEJvZHlJbml0IHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gYSBmYWtlIHN0cmVhbVxuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gUmVjcmVhdGUgdGhlIGZha2Ugc3RyZWFtIHdpdGggdGhlIEJvZHlJbml0XG4gICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdsb2JhbC5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5ib2R5SW5pdCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVndWxhciBzdHJlYW0gaGFuZGxpbmdcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdsb2JhbC5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgW1NUUkVBTV9OQU1FX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIFtTVFJFQU1fVFlQRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICAvLyBDYXJyeSB0aGUgd2lyZS1mcmFtaW5nIGRlY2lzaW9uIHRocm91Z2ggdGhlIHdvcmtmbG93IFZNIHNvXG4gICAgICAgIC8vIHRoYXQgd2hlbiB0aGUgaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgKHdoaWNoIHJlYWRzXG4gICAgICAgIC8vIHRoZSBhY3R1YWwgYnl0ZXMgZnJvbSB0aGUgc2VydmVyKSB3ZSBrbm93IHdoZXRoZXIgdG8gdW5mcmFtZS5cbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gdW5kZWZpbmVkIGZvciBzdHJlYW1zIHdob3NlIHNlcmlhbGl6ZWQgcmVmIGRpZG4ndFxuICAgICAgICAvLyBjYXJyeSB0aGUgZmllbGQ7IHRob3NlIGFyZSB0cmVhdGVkIGFzIGxlZ2FjeSByYXcgYnl0ZXMuXG4gICAgICAgIFtTVFJFQU1fRlJBTUlOR19TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmZyYW1pbmcsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JNYXAgPSB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBmb3JlaWduIHJ1bklkLCBpZiBwcmVzZW50LCBzbyB0aGF0IHdoZW4gdGhlXG4gICAgICAvLyBoYW5kbGUgaXMgbGF0ZXIgcGFzc2VkIHRvIGEgc3RlcCB0aGUgd29ya2Zsb3cgcmVkdWNlciBjYW5cbiAgICAgIC8vIGZvcndhcmQgaXQgdGhyb3VnaCB0byB0aGUgc3RlcCByZXZpdmVyLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVzY3JpcHRvcltTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5ydW5JZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVzY3JpcHRvcltTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvd25lcidzIHB1YmxpYyBrZXkgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgcnVuSWRcbiAgICAgIC8vIGFib3ZlLiBXaXRob3V0IGl0LCBmb3J3YXJkaW5nIGEgd3JpdGFibGUgdGhyb3VnaCBhIHdvcmtmbG93IHRvIGEgc3RlcFxuICAgICAgLy8gc2lsZW50bHkgZHJvcHMgdGhlIGtleSwgYW5kIHRoZSBzdGVwIGZhbGxzIGJhY2sgdG8gZmV0Y2hpbmcgdGhlXG4gICAgICAvLyBvd25lcidzIHN5bW1ldHJpYyBrZXksIHRoZSByb3VuZCB0cmlwIHNlYWxpbmcgZXhpc3RzIHRvIHJlbW92ZS5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVzY3JpcHRvcltTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCBkZXNjcmlwdG9yKTtcbiAgICB9LFxuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJldml2ZWQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTS4gVXNlIHRoZVxuICAgIC8vIHJlYWwgV29ya2Zsb3dBYm9ydFNpZ25hbCBjbGFzcyBzbyBhZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKSBhY3R1YWxseVxuICAgIC8vIGZpcmVzIHdoZW4gdGhlIHNpZ25hbCBhYm9ydHMgKHRoZSBwcmV2aW91cyBuby1vcCBzdHViIHNpbGVudGx5IGRyb3BwZWRcbiAgICAvLyBsaXN0ZW5lciByZWdpc3RyYXRpb25zLCBhIHNpbGVudCBjb3JyZWN0bmVzcyBidWcgZm9yIG5hdHVyYWwgcGF0dGVybnNcbiAgICAvLyBsaWtlIGBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbilgIGFmdGVyIHJlY2VpdmluZyBhIGRlc2VyaWFsaXplZFxuICAgIC8vIHNpZ25hbCkuIFRoZSBzaWduYWwgZG9lcyBub3Qgb3duIGEgaG9vayBzdWJzY3JpcHRpb24gaGVyZTsgYWJvcnQgc3RhdGVcbiAgICAvLyBpcyBkZWxpdmVyZWQgdmlhIHRoZSBleGlzdGluZyByZXBsYXkgbWFjaGluZXJ5IG9uIHRoZSBzb3VyY2Ugc2lkZS5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtBQk9SVF9TVFJFQU1fTkFNRV06IHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICAgIFtBQk9SVF9IT09LX1RPS0VOXTogdmFsdWUuaG9va1Rva2VuLFxuICAgICAgICBzaWduYWwsXG4gICAgICAgIGFib3J0OiAoKSA9PiB7fSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzaWduYWwgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbCh2YWx1ZS5zdHJlYW1OYW1lLCB2YWx1ZS5ob29rVG9rZW4pO1xuICAgICAgaWYgKHZhbHVlLmFib3J0ZWQpIHNpZ25hbC5fc2V0QWJvcnRlZCh2YWx1ZS5yZWFzb24pO1xuICAgICAgcmV0dXJuIHNpZ25hbDtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcmVjZWl2aW5nIGFyZ3VtZW50cyBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0U3RlcFJldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZ1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG5cbiAgICAvLyBTdGVwRnVuY3Rpb24gcmV2aXZlciBmb3Igc3RlcCBjb250ZXh0IC0gcmV0dXJucyByYXcgc3RlcCBmdW5jdGlvblxuICAgIC8vIHdpdGggY2xvc3VyZSB2YXJpYWJsZSBzdXBwb3J0IHZpYSBBc3luY0xvY2FsU3RvcmFnZS5cbiAgICAvL1xuICAgIC8vIEhhbmRsZXMgZm91ciBpbmRlcGVuZGVudCBmbGFncyBmcm9tIHRoZSBzZXJpYWxpemVkIHBheWxvYWQ6XG4gICAgLy8gICAtIGBjbG9zdXJlVmFyc2A6IGludm9rZSB0aGUgYm9keSBpbnNpZGUgYW4gQXN5bmNMb2NhbFN0b3JhZ2UgZnJhbWVcbiAgICAvLyAgICAgc28gdGhlIFNXQy1lbWl0dGVkIGBXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRWAgSUlGRSBpbiB0aGVcbiAgICAvLyAgICAgaG9pc3RlZCBib2R5IGNhbiBwdWxsIHRoZSBjbG9zdXJlIHZhcmlhYmxlcyBiYWNrIG91dC5cbiAgICAvLyAgIC0gYGJvdW5kVGhpc2A6ICAgYSBgdGhpc2AgdmFsdWUgY2FwdHVyZWQgYnlcbiAgICAvLyAgICAgYHVzZVN0ZXAoLi4uKS5iaW5kKHRoaXMpYCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlIChsZXhpY2FsLWB0aGlzYFxuICAgIC8vICAgICBhcnJvdyBzdGVwcykuIFRoZSB3cmFwcGVyIGludm9rZXMgdGhlIGJvZHkgdmlhXG4gICAgLy8gICAgIGBzdGVwRm4uYXBwbHkoYm91bmRUaGlzLCBhcmdzKWAgc28gdGhlIGJvZHkgc2VlcyB0aGUgc2FtZVxuICAgIC8vICAgICBgdGhpc2AgaXQgd291bGQgaGF2ZSBoYWQgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZS4gUHJvcGVydHlcbiAgICAvLyAgICAgcHJlc2VuY2UsIG5vdCB0cnV0aGluZXNzLCBpcyBzaWduaWZpY2FudCBiZWNhdXNlXG4gICAgLy8gICAgIGBiaW5kKG51bGwpYCBhbmQgYGJpbmQodW5kZWZpbmVkKWAgYXJlIGJvdGggbGVnYWwgYW5kIHNob3VsZFxuICAgIC8vICAgICByb3VuZC10cmlwIGZhaXRoZnVsbHkuXG4gICAgLy8gICAtIGBib3VuZEFyZ3NgOiAgIHByZWZpbGxlZCBhcmdzIGZyb21cbiAgICAvLyAgICAgYHVzZVN0ZXAoLi4uKS5iaW5kKHRoaXNBcmcsIHgsIHkpYC4gUHJlcGVuZGVkIHRvIHRoZSBjYWxsIGFyZ3NcbiAgICAvLyAgICAgc28gcGFydGlhbCBhcHBsaWNhdGlvbiBzdXJ2aXZlcyBzZXJpYWxpemF0aW9uLlxuICAgIFN0ZXBGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzdGVwSWQgPSB2YWx1ZS5zdGVwSWQ7XG4gICAgICBjb25zdCBjbG9zdXJlVmFycyA9IHZhbHVlLmNsb3N1cmVWYXJzO1xuICAgICAgY29uc3QgaGFzQm91bmRUaGlzID0gJ2JvdW5kVGhpcycgaW4gdmFsdWU7XG4gICAgICBjb25zdCBib3VuZFRoaXMgPSBoYXNCb3VuZFRoaXMgPyB2YWx1ZS5ib3VuZFRoaXMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBib3VuZEFyZ3MgPSBBcnJheS5pc0FycmF5KHZhbHVlLmJvdW5kQXJncykgPyB2YWx1ZS5ib3VuZEFyZ3MgOiBbXTtcblxuICAgICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZCk7XG4gICAgICBpZiAoIXN0ZXBGbikge1xuICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgIGBTdGVwIGZ1bmN0aW9uIFwiJHtzdGVwSWR9XCIgbm90IGZvdW5kLiBNYWtlIHN1cmUgdGhlIHN0ZXAgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZC5gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdNYWtlIHN1cmUgdGhlIHN0ZXAgZmlsZSBpcyBpbmNsdWRlZCBpbiB5b3VyIGJ1aWxkIChpLmUuIGl0IGlzIGxpc3RlZCBpbiB0aGUgd29ya2Zsb3cgbWFuaWZlc3QpLCBhbmQgdGhhdCB0aGUgU1dDIHBsdWdpbiBpcyBjb25maWd1cmVkIGZvciB0aGUgZmlsZS4nLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmFzdCBwYXRoOiBub3RoaW5nIHRvIHdyYXAuXG4gICAgICBpZiAoIWNsb3N1cmVWYXJzICYmICFoYXNCb3VuZFRoaXMgJiYgYm91bmRBcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RlcEZuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3cmFwcGVkU3RlcEZuID0gZnVuY3Rpb24gKHRoaXM6IHVua25vd24sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGNhbGxUaGlzID0gaGFzQm91bmRUaGlzID8gYm91bmRUaGlzIDogdGhpcztcbiAgICAgICAgY29uc3QgY2FsbEFyZ3MgPSBib3VuZEFyZ3MubGVuZ3RoID4gMCA/IFsuLi5ib3VuZEFyZ3MsIC4uLmFyZ3NdIDogYXJncztcbiAgICAgICAgaWYgKGNsb3N1cmVWYXJzKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgICAgICAgIGlmICghY3VycmVudENvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgJ0Nhbm5vdCBjYWxsIHN0ZXAgZnVuY3Rpb24gd2l0aCBjbG9zdXJlIHZhcmlhYmxlcyBvdXRzaWRlIHN0ZXAgY29udGV4dCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHQgPSB7XG4gICAgICAgICAgICAuLi5jdXJyZW50Q29udGV4dCxcbiAgICAgICAgICAgIGNsb3N1cmVWYXJzLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHRTdG9yYWdlLnJ1bihuZXdDb250ZXh0LCAoKSA9PlxuICAgICAgICAgICAgc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGVwRm4uYXBwbHkoY2FsbFRoaXMsIGNhbGxBcmdzKTtcbiAgICAgIH0gYXMgYW55O1xuXG4gICAgICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSBvcmlnaW5hbCBzdGVwIGZ1bmN0aW9uXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZFN0ZXBGbiwgJ25hbWUnLCB7XG4gICAgICAgIHZhbHVlOiBzdGVwRm4ubmFtZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICdzdGVwSWQnLCB7XG4gICAgICAgIHZhbHVlOiBzdGVwSWQsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChzdGVwRm4ubWF4UmV0cmllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdyYXBwZWRTdGVwRm4ubWF4UmV0cmllcyA9IHN0ZXBGbi5tYXhSZXRyaWVzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd3JhcHBlZFN0ZXBGbjtcbiAgICB9LFxuXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdXcmFwIHRoZSB3b3JrZmxvdyB3aXRoIGBzdGFydCh3b3JrZmxvd0ZuLCB7IC4uLiB9KWAgZnJvbSBgd29ya2Zsb3dgIHRvIGJlZ2luIGEgcnVuIGluc3RlYWQgb2YgaW52b2tpbmcgaXQgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gdmFsdWUucmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiBzdHJpbmcgfSA9IHtcbiAgICAgICAgbWV0aG9kOiB2YWx1ZS5tZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgaW5pdC5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdsb2JhbC5SZXF1ZXN0KHZhbHVlLnVybCwgaW5pdCk7XG4gICAgICAvLyBUaGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGludGVybmFsIHNpZ25hbCBjb3B5LCBzbyB0aGVcbiAgICAgIC8vIGFib3J0LWludGVybmFsIHN5bWJvbHMgc2V0IGJ5IHJldml2ZUFib3J0U2lnbmFsIGRvbid0IHByb3BhZ2F0ZS5cbiAgICAgIC8vIFJlLXRhZyB0aGUgcmVxdWVzdCdzIG93biBzaWduYWwgc28gY2FuY2VsQWJvcnRSZWFkZXJzIGNhbiBmaW5kIGl0LlxuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgY29weUFib3J0SW50ZXJuYWxzKHZhbHVlLnNpZ25hbCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCB3cml0ZXIgPSByZXNwb25zZVdyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShyZXNwb25zZSk7XG4gICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE5vdGU6IFJlc3BvbnNlIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBzdGF0dXMsIHN0YXR1c1RleHQsIGFuZCBoZWFkZXJzXG4gICAgICAvLyBUaGUgdHlwZSwgdXJsLCBhbmQgcmVkaXJlY3RlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYW5kIHNldCBieSB0aGUgY29uc3RydWN0b3JcbiAgICAgIHJldHVybiBuZXcgZ2xvYmFsLlJlc3BvbnNlKHZhbHVlLmJvZHksIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyBoYXMgYm9keUluaXQsIGl0IGNhbWUgZnJvbSBhIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gICAgICAvLyBDb252ZXJ0IGl0IHRvIGEgUkVBTCBzdHJlYW0gbm93IHRoYXQgd2UncmUgaW4gdGhlIHN0ZXAgZW52aXJvbm1lbnRcbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWUuYm9keUluaXQ7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFJlc3BvbnNlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGNvbnZlcnQgQm9keUluaXQgdG8gUmVhZGFibGVTdHJlYW1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgZ2xvYmFsLlJlc3BvbnNlKGJvZHlJbml0KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgLy8gRm9yIGJ5dGUgc3RyZWFtcywgdXNlIGZsdXNoYWJsZSBwaXBlIHdpdGggbG9jayBwb2xsaW5nLlxuICAgICAgICAvLyBJZiB0aGUgcHJvZHVjZXIgd3JvdGUgZnJhbWVkIGJ5dGVzIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJyksXG4gICAgICAgIC8vIHVud3JhcCB0aGUgbGVuZ3RoLXByZWZpeCBlbnZlbG9wZSBiZWZvcmUgaGFuZGluZyBjaHVua3MgdG9cbiAgICAgICAgLy8gdGhlIHVzZXIgc3RlcC4gQWJzZW50IC8gJ3JhdycgZnJhbWluZyBtZWFucyBsZWdhY3kgcmF3IGJ5dGVzOlxuICAgICAgICAvLyBwaXBlIHRocm91Z2ggdW5jaGFuZ2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBDcmVhdGUgYW4gaWRlbnRpdHkgKG9yIHVuZnJhbWluZykgdHJhbnNmb3JtIHRvIGdpdmUgdGhlIHVzZXIgYSByZWFkYWJsZVxuICAgICAgICBjb25zdCB7IHJlYWRhYmxlOiB1c2VyUmVhZGFibGUsIHdyaXRhYmxlIH0gPVxuICAgICAgICAgIHZhbHVlLmZyYW1pbmcgPT09ICdmcmFtZWQtdjEnXG4gICAgICAgICAgICA/IGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKVxuICAgICAgICAgICAgOiBuZXcgZ2xvYmFsLlRyYW5zZm9ybVN0cmVhbSgpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB3cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHVzZXJSZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB1c2VyUmVhZGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXksIGRlcGxveW1lbnRJZCksXG4gICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHRyYW5zZm9ybS53cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHRyYW5zZm9ybS5yZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ucmVhZGFibGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTYW1lLXJ1biBjYXNlOiB0aGUgd3JpdGFibGUgYmVsb25ncyB0byB0aGUgY3VycmVudCBydW4uIFVzZSB0aGVcbiAgICAgIC8vIGxvY2FsIGNyeXB0b0tleSBhbmQgd3JpdGUgdG8gdGhlIGxvY2FsIHJ1bklkJ3Mgc2VydmVyIHN0cmVhbS5cbiAgICAgIC8vXG4gICAgICAvLyBDcm9zcy1ydW4gY2FzZSAocGFyZW50IOKGkiBjaGlsZCB2aWEgYHN0YXJ0KClgKTogdGhlIGRlc2NyaXB0b3JcbiAgICAgIC8vIGNhcnJpZXMgdGhlIG9yaWdpbmFsIGBydW5JZGAgYW5kIGBuYW1lYC4gT3BlbiBhIHNlcnZlciB3cml0YWJsZVxuICAgICAgLy8gYWdhaW5zdCB0aGUgb3JpZ2luYWwgYChydW5JZCwgbmFtZSlgIGFuZCByZXNvbHZlIFRIQVQgcnVuJ3Mga2V5XG4gICAgICAvLyBmb3IgZW5jcnlwdGlvbi4gVGhlIHJlc29sdXRpb24gaXMgYXN5bmMgYnV0IGRvZXNuJ3QgbmVlZCB0b1xuICAgICAgLy8gYmxvY2sgcmV2aXZlciByZXR1cm46IGBnZXRTZXJpYWxpemVTdHJlYW1gIGFjY2VwdHMgdGhlXG4gICAgICAvLyBgUHJvbWlzZTxDcnlwdG9LZXkgfCB1bmRlZmluZWQ+YCBkaXJlY3RseSBhbmQgYXdhaXRzIGl0IGxhemlseVxuICAgICAgLy8gb24gdGhlIGZpcnN0IGNodW5rIHdyaXR0ZW4uIFRoZSBrZXkgaXMgaW1wb3J0ZWQgZW5jcnlwdC1vbmx5XG4gICAgICAvLyBzbyB0aGUgcmVjZWl2aW5nIHJ1biBjYW4gbmV2ZXIgZGVjcnlwdCBhbnl0aGluZyBlbHNlIG9uIHRoZVxuICAgICAgLy8gb3duaW5nIHJ1bidzIHN0cmVhbTsgaXQgY2FuIG9ubHkgY29udHJpYnV0ZSBuZXcgd3JpdGVzLlxuICAgICAgY29uc3QgdGFyZ2V0UnVuSWQgPSB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnID8gdmFsdWUucnVuSWQgOiBydW5JZDtcbiAgICAgIGNvbnN0IHRhcmdldERlcGxveW1lbnRJZCA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS5kZXBsb3ltZW50SWRcbiAgICAgICAgICA6IHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgICAgPyBkZXBsb3ltZW50SWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdGFyZ2V0S2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0gPVxuICAgICAgICB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICA/IGNyeXB0b0tleVxuICAgICAgICAgIDogZ2V0Rm9yd2FyZGVkV3JpdGFibGVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgICAgICAgdGFyZ2V0RGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5XG4gICAgICAgICAgICApO1xuXG4gICAgICBjb25zdCBzZXJpYWxpemUgPSBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgdGFyZ2V0UnVuSWQsIHRhcmdldEtleSksXG4gICAgICAgIHRhcmdldEtleVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICB2YWx1ZS5uYW1lXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgZmx1c2hhYmxlIHN0YXRlIGZvciB0aGlzIHN0cmVhbVxuICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgZmx1c2hhYmxlUGlwZShzZXJpYWxpemUucmVhZGFibGUsIHNlcnZlcldyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gICAgICAvLyBSZWNvcmQgdGhlIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHNvIGRvd25zdHJlYW0gcmVkdWNlcnMgY2FuXG4gICAgICAvLyByZWNvZ25pemUgdGhhdCB0aGlzIHdyaXRhYmxlIGlzIGFscmVhZHkgYmFja2VkIGJ5IGEgd29ya2Zsb3dcbiAgICAgIC8vIHNlcnZlciBzdHJlYW0uIFdoZW4gZm9yd2FyZGVkIGFjcm9zcyBgc3RhcnQoKWAgYWdhaW4gKGUuZy5cbiAgICAgIC8vIHRoZSBjaGlsZCBwYXNzZXMgdGhpcyB3cml0YWJsZSBvbiB0byBhIGdyYW5kY2hpbGQpLCB0aGVcbiAgICAgIC8vIGV4dGVybmFsIHJlZHVjZXIgbmVlZHMgYm90aCB0byBlbWl0IHRoZSBvcmlnaW5hbCBgcnVuSWRgIGluXG4gICAgICAvLyB0aGUgZGVzY3JpcHRvci5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0YXJnZXREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB0YXJnZXREZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gS2VlcCB0aGUgb3duZXIncyBwdWJsaWMga2V5IG9uIHRoZSBoYW5kbGUgc28gYSBmdXJ0aGVyIGZvcndhcmQgc3RheXMgb25cbiAgICAgIC8vIHRoZSB6ZXJvLWxvb2t1cCBzZWFsZWQgcGF0aC5cbiAgICAgIC8vXG4gICAgICAvLyBXaGVuIHRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgbm8ga2V5IGFuZCB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8gVEhJUyBydW4sXG4gICAgICAvLyBkZXJpdmUgaXQuIEEgd3JpdGFibGUgdGFrZW4gd2l0aCBgZ2V0V3JpdGFibGUoKWAgaW4gYSB3b3JrZmxvdyBib2R5IGhhc1xuICAgICAgLy8gb25seSBhIG5hbWUgb24gaXQgKHRoZSB3b3JrZmxvdyBWTSBob2xkcyBubyBrZXkgbWF0ZXJpYWwgYnkgZGVzaWduKSxcbiAgICAgIC8vIHNvIG5vdGhpbmcgY291bGQgcHVibGlzaCB0aGUga2V5IHdoZW4gdGhlIGhhbmRsZSB3YXMgY3JlYXRlZC4gUmV2aXZpbmdcbiAgICAgIC8vIGhhcHBlbnMgaW4gYSBzdGVwLCB3aGljaCBkb2VzIGhvbGQgdGhpcyBydW4ncyBrZXksIGFuZCBhbnkgbGF0ZXJcbiAgICAgIC8vIGZvcndhcmQgdGhlbiBjb3BpZXMgdGhlIHN5bWJvbC5cbiAgICAgIC8vXG4gICAgICAvLyBJdCBoYXMgdG8gaGFwcGVuIGhlcmUgcmF0aGVyIHRoYW4gYXQgc2VyaWFsaXphdGlvbiB0aW1lOiBgc3RhcnQoKWBcbiAgICAgIC8vIGRlaHlkcmF0ZXMgaXRzIGFyZ3VtZW50cyB3aXRoIHRoZSBDSElMRCdzIHJ1bklkIGFuZCB0aGUgQ0hJTEQncyBrZXksIHNvXG4gICAgICAvLyB0aGUgb3duaW5nIHJ1bidzIGtleSBpcyBubyBsb25nZXIgaW4gc2NvcGUgYnkgdGhlbi5cbiAgICAgIC8vXG4gICAgICAvLyBgdGFyZ2V0UnVuSWQgPT09IHJ1bklkYCBpcyB0aGUgZ3VhcmQgdGhhdCBtYXR0ZXJzLiBGb3IgYSBzdHJlYW0gYW5vdGhlclxuICAgICAgLy8gcnVuIG93bnMgd2UgbXVzdCBub3QgYWR2ZXJ0aXNlIG91ciBrZXk6IHRoZSByZWNlaXZlciB3b3VsZCBzZWFsIHRvIHVzXG4gICAgICAvLyBhbmQgdGhlIHJlYWwgb3duZXIgY291bGQgbmV2ZXIgb3BlbiB3aGF0IGl0IHdyb3RlLlxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAgIGlzUnVuUGF5bG9hZEtleXMoY3J5cHRvS2V5KVxuICAgICAgKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogYnl0ZXNUb0Jhc2U2NChjcnlwdG9LZXkua2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZTtcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHJldml2ZUFib3J0Q29udHJvbGxlcih2YWx1ZSwgb3BzLCBydW5JZCksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRTaWduYWwodmFsdWUsIG9wcywgcnVuSWQpLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmNyeXB0aW9uIEhlbHBlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIGBlbmNyeXB0YC9gZGVjcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgXG4vLyBidXQgYXJlIGtlcHQgYXMgbmFtZWQgZXhwb3J0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb25zdW1lcnMuXG5cbi8qKlxuICogRW5jcnlwdCBkYXRhIGlmIHRoZSB3b3JsZCBzdXBwb3J0cyBlbmNyeXB0aW9uLlxuICogUmV0dXJucyBvcmlnaW5hbCBkYXRhIGlmIGVuY3J5cHRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGVuY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVFbmNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICByZXR1cm4gKGF3YWl0IGVuY3J5cHQoZGF0YSwga2V5KSkgYXMgVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGRhdGEgaWYgaXQgaGFzIHRoZSAnZW5jcicgcHJlZml4LlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZGVjcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXliZURlY3J5cHQoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgcmV0dXJuIGRlY3J5cHQoZGF0YSwga2V5KTtcbn1cblxuLyoqXG4gKiBSZXBsYXkgaHlkcmF0aW9uIGhhcyB0d28gc3RhZ2VzOlxuICpcbiAqIDEuIEhvc3Qtc2lkZSBwcmVwYXJhdGlvbiBkZWNyeXB0cyBhbmQgZGVjb21wcmVzc2VzIHBlcnNpc3RlZCBkYXRhLiBUaGF0IHdvcmtcbiAqICAgIGlzIGluZGVwZW5kZW50IG9mIGEgd29ya2Zsb3cgVk0gYW5kIGNhbiBiZSBjYWNoZWQgYWNyb3NzIHJlcGxheSBWTXMuXG4gKiAyLiBEZXNlcmlhbGl6YXRpb24gcmV2aXZlcyB0aGUgcHJlcGFyZWQgcmVwcmVzZW50YXRpb24gYWdhaW5zdCB0aGUgY3VycmVudFxuICogICAgVk0ncyBnbG9iYWxzLiBJdCBtdXN0IHJ1biBhZ2FpbiBmb3IgZXZlcnkgVk0gdG8gcHJvZHVjZSBmcmVzaCBvYmplY3QgZ3JhcGhzXG4gKiAgICBhbmQgY29ycmVjdGx5IHNjb3BlZCBXb3JrZmxvdyBvYmplY3RzLlxuICpcbiAqIGBkYXRhYCBpcyB0aGUgYm91bmRhcnkgYmV0d2VlbiB0aG9zZSBzdGFnZXMuIEZvciBjdXJyZW50LWZvcm1hdCBwYXlsb2FkcyBpdFxuICogaXMgc3RpbGwgZm9ybWF0LXByZWZpeGVkIHNlcmlhbGl6ZWQgYnl0ZXMsIG5vdCBhIGxpdmUgSmF2YVNjcmlwdCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFJlcGxheVBheWxvYWQge1xuICByZWFkb25seSBkYXRhOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFN3YXBwYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaG9zdC1zaWRlIHByZXBhcmF0aW9uIHN0YWdlLiBTdXBwb3J0aW5nXG4gKiBib3RoIGRpcmVjdCBhbmQgcHJvbWlzZWQgcmVzdWx0cyBsZXRzIGEgZnV0dXJlIHN5bmNocm9ub3VzIE5vZGUgZGVjcnlwdG9yIHVzZVxuICogdGhlIHNhbWUgY2FjaGUgY29udHJhY3QgYXMgdG9kYXkncyBhc3luY2hyb25vdXMgV2ViIENyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pID0+IFByZXBhcmVkUmVwbGF5UGF5bG9hZCB8IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPjtcblxuLyoqXG4gKiBEZWNyeXB0IGFuZCBkZWNvbXByZXNzIHBlcnNpc3RlZCBkYXRhIHdpdGhvdXQgcGFyc2luZyBpdCBpbnRvIEphdmFTY3JpcHQuXG4gKiBMZWdhY3kgbm9uLWJpbmFyeSB2YWx1ZXMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgdGhlaXIgY29uc3VtZXIgdG8gcmV2aXZlLlxuICovXG5leHBvcnQgY29uc3QgcHJlcGFyZVJlcGxheVBheWxvYWQ6IFJlcGxheVBheWxvYWRQcmVwYXJlciA9IGFzeW5jIChcbiAgdmFsdWUsXG4gIGtleVxuKSA9PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IGRlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHsgZGF0YTogcHJlcGFyZWQgfTtcbn07XG5cbi8qKlxuICogUGFyc2UgYSBwcmVwYXJlZCB3b3JrZmxvdyBhcmd1bWVudCBvciBzdWNjZXNzZnVsIHN0ZXAvaG9vayBwYXlsb2FkIHVzaW5nIHRoZVxuICogY3VycmVudCB3b3JrZmxvdyBWTSdzIGdsb2JhbHMgYW5kIHJldml2ZXJzLiBFYWNoIGNhbGwgaW50ZW50aW9uYWxseSBjcmVhdGVzXG4gKiBhIGZyZXNoIG9iamVjdCBncmFwaCBzbyBtdXRhdGlvbnMgY2Fubm90IGxlYWsgYWNyb3NzIHJlcGxheSBpdGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gIHByZXBhcmVkOiBQcmVwYXJlZFJlcGxheVBheWxvYWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IGFueSB7XG4gIHJldHVybiB3b3JrZmxvd01vZHVsZS5kZXNlcmlhbGl6ZShwcmVwYXJlZC5kYXRhLCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhnZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIHByZXBhcmVkIHN0ZXAgZXJyb3IgdXNpbmcgdGhlIGN1cnJlbnQgd29ya2Zsb3cgVk0ncyBjbGFzcyByZXZpdmVycy5cbiAqIFRoaXMgcHJlc2VydmVzIHRocm93bi12YWx1ZSBpZGVudGl0eSB3aXRob3V0IHNoYXJpbmcgb2JqZWN0cyBiZXR3ZWVuIFZNcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUHJlcGFyZWRTdGVwRXJyb3IoXG4gIHByZXBhcmVkOiBQcmVwYXJlZFJlcGxheVBheWxvYWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IHVua25vd24ge1xuICBjb25zdCB7IGRhdGEgfSA9IHByZXBhcmVkO1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4gdW5mbGF0dGVuKGRhdGEgYXMgYW55W10sIHtcbiAgICAgIC4uLmdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGEpO1xuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWh5ZHJhdGUgLyBIeWRyYXRlIEZ1bmN0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlc2UgZGVsZWdhdGUgdG8gdGhlIG1vZHVsYXIgbW9kZSBtb2R1bGVzICh3b3JrZmxvdywgc3RlcCwgY2xpZW50KSBwYXNzaW5nXG4vLyBtb2RlLXNwZWNpZmljIHN0cmVhbSBhbmQgUmVxdWVzdC9SZXNwb25zZSByZWR1Y2Vycy9yZXZpdmVycyBhcyBleHRyYSBvcHRpb25zLlxuLy8gVGhlIHYxQ29tcGF0IHBhdGggaXMgaGFuZGxlZCBpbmxpbmUgYmVmb3JlIGRlbGVnYXRpbmcgdG8gdGhlIG1vZHVsZXMuXG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGBzdGFydCgpYCBmdW5jdGlvbiB0byBzZXJpYWxpemUgdGhlIHdvcmtmbG93IGFyZ3VtZW50c1xuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgYW5kIHRoZW4gaHlkcmF0ZWQgZnJvbVxuICogd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHJ1bklkIC0gVGhlIHdvcmtmbG93IHJ1biBJRCAocmVxdWlyZWQgZm9yIGVuY3J5cHRpb24gY29udGV4dClcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIHYxQ29tcGF0IC0gRW5hYmxlIGxlZ2FjeSB2MSBjb21wYXRpYmlsaXR5IG1vZGVcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZXRoZXIgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZSB3aXJlLWZyYW1lZFxuICogICBieXRlIHN0cmVhbXMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBjYXBhYmlsaXR5OiBzZWVcbiAqICAgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzIHRvIGBmYWxzZWAgZm9yXG4gKiAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICByZWFkYmFja09wczogUHJvbWlzZTx2b2lkPltdID0gb3BzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBrZXksXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi4gQSBwcmVwYXJlZFxuICogcGF5bG9hZCBza2lwcyBob3N0LXNpZGUgZGVjcnlwdC9kZWNvbXByZXNzIGJ1dCBhbHdheXMgcGVyZm9ybXMgVk0gcmV2aXZhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBEZWh5ZHJhdGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlIGZvciBzdG9yYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzaW5rIHJlY2VpdmluZyB0aGUgZmlyc3QgZml2ZSBzYW1wbGVzIGFuZCBleGFjdCB0b3RhbCBjb3VudCBvZlxuICAgKiB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbnMgc2VyaWFsaXphdGlvbiBjb3VsZCBub3QgYXZvaWQuIFRoZSBkaWFnbm9zdGljc1xuICAgKiBhcmUgZW1pdHRlZCBhcyBzcGFuIGF0dHJpYnV0ZXMgZWl0aGVyIHdheSwgc28gb21pdHRpbmcgdGhpcyBsb3NlcyBub3RoaW5nXG4gICAqIG9ic2VydmFiaWxpdHktd2lzZS4gVGhlIHJldGFpbmVkLVZNIGdhdGUgaW4gcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIudHNcbiAgICogcGFzc2VzIG9uZSBmb3Igc3RlcC1pbnB1dCBkZWh5ZHJhdGlvbi5cbiAgICovXG4gIGd1ZXN0Q29kZVN0YXRzT3V0PzogR3Vlc3RDb2RlU3RhdHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBndWVzdENvZGVTdGF0czogR3Vlc3RDb2RlU3RhdHMgPSBndWVzdENvZGVTdGF0c091dCA/PyB7XG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgICAgZ3Vlc3RDb2RlU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIGF3YWl0IHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoZ3Vlc3RDb2RlU3RhdHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSlcbiAgICAgICksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gICAgY29tcHJlc3Npb25TdGF0cyxcbiAgfSk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gYSBzdGVwIGlzIGJlaW5nIGNyZWF0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKiBTZWUgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgLiAqL1xuICBndWVzdENvZGVTdGF0c091dD86IEd1ZXN0Q29kZVN0YXRzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgZ3Vlc3RDb2RlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0gZ3Vlc3RDb2RlU3RhdHNPdXQgPz8ge1xuICAgICAgZXhlY3V0aW9uczogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICAgIGd1ZXN0Q29kZVN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICBhd2FpdCByZWNvcmRHdWVzdENvZGVFeGVjdXRpb25zKGd1ZXN0Q29kZVN0YXRzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBhcmd1bWVudHMnLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3IgdG8gaHlkcmF0ZSB0aGUgYXJndW1lbnRzIG9mIGEgc3RlcFxuICogZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdGVwIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCBoYXMgY29tcGxldGVkLlxuICogRGVoeWRyYXRlcyB2YWx1ZXMgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHk6IHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IG9yZGVyIHRoZSBmaXJzdCBjaHVuayBvZiBhIHJldHVybmVkIHN0cmVhbSBhZnRlclxuICAvLyB0aGUgYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAuIFRocmVhZGVkIGludG8gdGhlIHN0ZXAgcmVkdWNlcnMnIHN0cmVhbVxuICAvLyBzaW5rLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+LFxuICByZWFkYmFja09wczogUHJvbWlzZTx2b2lkPltdID0gb3BzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgcmVhZGJhY2tPcHNcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgcmVhZGJhY2tPcHNcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnc3RlcCByZXR1cm4gdmFsdWUnLFxuICAgICAgY2F1c2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGV4ZWN1dG9yIHdoZW4gYSBzdGVwIHRocm93cy4gRGVoeWRyYXRlcyB0aGUgdGhyb3duXG4gKiB2YWx1ZSBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb24gZW52aXJvbm1lbnQgaW50byBhIGZvcm1hdCB0aGF0IGNhblxuICogYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGluIGEgYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuXG4gKlxuICogQW55IEphdmFTY3JpcHQgdmFsdWUgY2FuIGJlIHRocm93biAoc3RyaW5ncywgbnVtYmVycywgb2JqZWN0cywgRXJyb3JzLFxuICogRXJyb3Igc3ViY2xhc3NlcyksIHNvIHRoZSBzYW1lIHNlcmlhbGl6YXRpb24gcGlwZWxpbmUgdXNlZCBmb3Igc3RlcFxuICogYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIGlzIGFwcGxpZWQgaGVyZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGhyb3duIHZhbHVlIHRvIHNlcmlhbGl6ZSAoY2FuIGJlIGFueSB0eXBlKVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcEVycm9yKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0U3RlcFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZzogZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3N0ZXAgZXJyb3InLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyBvZiBhXG4gKiBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC4gSHlkcmF0ZXMgdGhlIHRocm93biB2YWx1ZSBmcm9tXG4gKiB0aGUgZGF0YWJhc2Ugc28gdGhlIHdvcmtmbG93IGNhbiBzZWUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcGFyYW0gcHJlcGFyZWQgLSBPcHRpb25hbCBjYWNoZWQgZGVjcnlwdC9kZWNvbXByZXNzIHJlc3VsdFxuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gcmVqZWN0IHRoZSBzdGVwIHByb21pc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fSxcbiAgcHJlcGFyZWQ/OiBQcmVwYXJlZFJlcGxheVBheWxvYWRcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFN0ZXBFcnJvcihcbiAgICBwcmVwYXJlZCA/PyAoYXdhaXQgcHJlcGFyZVJlcGxheVBheWxvYWQodmFsdWUsIGtleSkpLFxuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzXG4gICk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiB0aGUgd29ya2Zsb3cgaXRzZWxmIHRocm93cy5cbiAqIERlaHlkcmF0ZXMgdGhlIHRocm93biB2YWx1ZSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBydW5fZmFpbGVkYCBldmVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGhyb3duIHZhbHVlIHRvIHNlcmlhbGl6ZSAoY2FuIGJlIGFueSB0eXBlKVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmc6IGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdydW4gZXJyb3InLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIChvciBvYnNlcnZhYmlsaXR5IHRvb2xzKSB0byBoeWRyYXRlIHRoZSBydW5cbiAqIGVycm9yIHZhbHVlIG9mIGEgZmFpbGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBjbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgZGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgLy8gU2VlIHRoZSBtYXRjaGluZyBub3RlIGluIGBoeWRyYXRlU3RlcEVycm9yYDogdGhpcyBicmFuY2ggaXMgZm9yXG4gICAgLy8gZGV2YWx1ZSBmbGF0dGVuZWQgYXJyYXlzIGZyb20gbGVnYWN5IGNhbGxlcnM7IGN1cnJlbnQgU0RLIHZlcnNpb25zXG4gICAgLy8gYWx3YXlzIGVtaXQgYSBVaW50OEFycmF5LCBhbmQgYSBtaXNzaGFwZW4gdmFsdWUgaGVyZSBpbnRlbnRpb25hbGx5XG4gICAgLy8gdGhyb3dzIHZpYSBgdW5mbGF0dGVuYCBzbyB0aGUgc3Vycm91bmRpbmcgdHJ5L2NhdGNoIGluIG8xMXkgaGVscGVyc1xuICAgIC8vIHN1cmZhY2VzIHRoZSBpc3N1ZSByYXRoZXIgdGhhbiBtYXNraW5nIGl0LlxuICAgIHJldHVybiB1bmZsYXR0ZW4oZGVjcnlwdGVkIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRlY3J5cHRlZCk7XG5cbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgIHJldHVybiBwYXJzZShzdHIsIHtcbiAgICAgIC4uLmdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYSBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50LlxuICogSHlkcmF0ZXMgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHN0ZXAgZnJvbSB0aGUgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHBhcmFtIHByZXBhcmVkIC0gT3B0aW9uYWwgY2FjaGVkIGRlY3J5cHQvZGVjb21wcmVzcyByZXN1bHRcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2dcbiAqIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fSxcbiAgcHJlcGFyZWQ/OiBQcmVwYXJlZFJlcGxheVBheWxvYWRcbik6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZVByZXBhcmVkUmVwbGF5UGF5bG9hZChcbiAgICBwcmVwYXJlZCA/PyAoYXdhaXQgcHJlcGFyZVJlcGxheVBheWxvYWQodmFsdWUsIGtleSkpLFxuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzXG4gICk7XG59XG5cbi8vIC0tLS0gSGVscGVycyB0byBleHRyYWN0IHN0cmVhbS9SZXF1ZXN0L1Jlc3BvbnNlIHJlZHVjZXJzIGFuZCByZXZpdmVycyAtLS0tXG4vLyBUaGUgbW9kZS1zcGVjaWZpYyBnZXQqUmVkdWNlcnMvZ2V0KlJldml2ZXJzIGZ1bmN0aW9ucyByZXR1cm4gb2JqZWN0cyB0aGF0XG4vLyBpbmNsdWRlIGJvdGggXCJjb21tb25cIiBlbnRyaWVzIChEYXRlLCBFcnJvciwgTWFwLCBldGMuKSBhbmQgbW9kZS1zcGVjaWZpY1xuLy8gZW50cmllcyAoUmVhZGFibGVTdHJlYW0sIFdyaXRhYmxlU3RyZWFtLCBSZXF1ZXN0LCBSZXNwb25zZSwgU3RlcEZ1bmN0aW9uKS5cbi8vIFRoZSBjb21tb24gZW50cmllcyBhcmUgYWxyZWFkeSBjb21wb3NlZCBieSB0aGUgY29kZWMuIFdlIG9ubHkgbmVlZCB0b1xuLy8gcGFzcyB0aHJvdWdoIHRoZSBtb2RlLXNwZWNpZmljIGVudHJpZXMgYXMgZXh0cmFSZWR1Y2Vycy9leHRyYVJldml2ZXJzLlxuXG5jb25zdCBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUyA9IFtcbiAgJ1JlYWRhYmxlU3RyZWFtJyxcbiAgJ1dyaXRhYmxlU3RyZWFtJyxcbiAgJ1JlcXVlc3QnLFxuICAnUmVzcG9uc2UnLFxuICAnU3RlcEZ1bmN0aW9uJyxcbiAgLy8gV2lyZSBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgdGhyb3VnaCB0aGUgY2xpZW50IHNlcmlhbGl6YXRpb24gcGF0aCBzb1xuICAvLyBzaWduYWxzIHJlYWNoYWJsZSB2aWEgUmVxdWVzdC5zaWduYWwgKG9yIGFzIGRpcmVjdCBhcmd1bWVudHMpIGdldCB0aGVpclxuICAvLyBkZWRpY2F0ZWQgcmVkdWNlci4gV2l0aG91dCB0aGlzLCBkZXZhbHVlIGZhbGxzIGJhY2sgdG8gaXRzIGFyYml0cmFyeS1QT0pPXG4gIC8vIHBhdGggYW5kIGZhaWxzIGZvciBhbnkgc2lnbmFsIHRoZSBSZXF1ZXN0IHJlZHVjZXIgZm9yd2FyZHMuXG4gICdBYm9ydENvbnRyb2xsZXInLFxuICAnQWJvcnRTaWduYWwnLFxuXSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICBhbGxSZWR1Y2VyczogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMpIHtcbiAgICBpZiAoa2V5IGluIGFsbFJlZHVjZXJzKSB7XG4gICAgICBleHRyYVtrZXldID0gYWxsUmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoXG4gIGFsbFJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmV2aXZlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZXZpdmVyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG4iXX0=
|