@workflow/core 5.0.0-beta.46 → 5.0.0-beta.48
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/capabilities.d.ts +6 -5
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +14 -12
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +13 -3
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +16 -1
- package/dist/events-consumer.d.ts +29 -6
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +66 -11
- package/dist/private.d.ts +13 -11
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +57 -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 +12 -10
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +13 -11
- package/dist/runtime/helpers.d.ts +27 -33
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +31 -43
- package/dist/runtime/quickjs-serde.d.ts.map +1 -1
- package/dist/runtime/quickjs-serde.js +62 -1
- package/dist/runtime/resume-hook.d.ts +19 -26
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +201 -255
- package/dist/runtime/resume-latency.d.ts +8 -11
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +9 -13
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +8 -4
- package/dist/runtime/start.js +12 -10
- package/dist/runtime/suspension-handler.d.ts +54 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +83 -20
- 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 +318 -119
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -1
- package/dist/serialization/reducers/common-vm.js +38 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +26 -2
- package/dist/serialization/types.d.ts +7 -0
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +1 -1
- package/dist/serialization.d.ts +27 -5
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +185 -44
- package/dist/telemetry/semantic-conventions.d.ts +41 -7
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +30 -6
- 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/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +3 -6
- package/dist/workflow.d.ts +16 -0
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +72 -27
- package/docs/foundations/errors-and-retries.mdx +1 -1
- package/package.json +10 -10
package/dist/serialization.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RuntimeDecryptionError, SerializationError, StreamExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
1
|
+
import { RuntimeDecryptionError, SerializationError, StreamError, StreamExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
2
2
|
import { once } from '@workflow/utils';
|
|
3
3
|
import { envNumber } from '@workflow/world/env-config';
|
|
4
4
|
import { parse, stringify, unflatten } from 'devalue';
|
|
@@ -492,6 +492,23 @@ function recordReadTimeToFirstChunk(startEpochMs, runId, name, startIndex, conne
|
|
|
492
492
|
});
|
|
493
493
|
})();
|
|
494
494
|
}
|
|
495
|
+
/**
|
|
496
|
+
* Record speculative run-key resolution independently from raw stream TTFC.
|
|
497
|
+
* This phase never carries key material and is intentionally separate from
|
|
498
|
+
* `workflow.stream.read`, whose endpoint remains the first raw frame.
|
|
499
|
+
*/
|
|
500
|
+
function recordStreamReadKeyResolution(startEpochMs, runId, name, succeeded) {
|
|
501
|
+
void (async () => {
|
|
502
|
+
await recordElapsedSpan('workflow.stream.read.resolve_key', startEpochMs, {
|
|
503
|
+
kind: await getSpanKind('CLIENT'),
|
|
504
|
+
attributes: {
|
|
505
|
+
'workflow.run.id': runId,
|
|
506
|
+
'workflow.stream.name': name,
|
|
507
|
+
'workflow.stream.read.key_succeeded': succeeded,
|
|
508
|
+
},
|
|
509
|
+
});
|
|
510
|
+
})();
|
|
511
|
+
}
|
|
495
512
|
/**
|
|
496
513
|
* Emit the client-observed read-completion span when a stream read drains:
|
|
497
514
|
* back-dated to the read dispatch, so its duration is the total read, with
|
|
@@ -644,13 +661,15 @@ const getFramedStreamMaxTotalReconnects = () => envNumber('WORKFLOW_FRAMED_STREA
|
|
|
644
661
|
* machinery because we cannot compute an absolute resume position without
|
|
645
662
|
* a tail-index lookup; the returned stream behaves as a single-shot read.
|
|
646
663
|
*/
|
|
647
|
-
export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
664
|
+
export function createReconnectingFramedStream(runId, name, startIndex, prefetchEncryptionKey = async () => undefined) {
|
|
648
665
|
const reconnectSupported = startIndex === undefined || startIndex >= 0;
|
|
649
666
|
let currentStartIndex = startIndex ?? 0;
|
|
650
667
|
let consumedFrames = 0;
|
|
651
668
|
let reconnectCount = 0;
|
|
652
669
|
let totalReconnectCount = 0;
|
|
653
670
|
let reader;
|
|
671
|
+
let canceled = false;
|
|
672
|
+
let cancelReason;
|
|
654
673
|
let buffer = new Uint8Array(0);
|
|
655
674
|
// Read telemetry (same semantics as WorkflowServerReadableStream):
|
|
656
675
|
// dispatch time, first-connect duration, first-frame latch, and totals.
|
|
@@ -659,16 +678,43 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
659
678
|
let firstChunkReported = false;
|
|
660
679
|
let chunksDelivered = 0;
|
|
661
680
|
let bytesDelivered = 0;
|
|
681
|
+
let keyPrefetched = false;
|
|
682
|
+
function prefetchKey() {
|
|
683
|
+
if (keyPrefetched)
|
|
684
|
+
return;
|
|
685
|
+
keyPrefetched = true;
|
|
686
|
+
const keyStart = Date.now();
|
|
687
|
+
// The raw stream and key lookup deliberately race. Observe a speculative
|
|
688
|
+
// failure here: if the stream is cancelled or fails before an encrypted
|
|
689
|
+
// frame reaches the deserialize transform, this promise otherwise has no
|
|
690
|
+
// consumer and would become an unhandled rejection. The transform still
|
|
691
|
+
// awaits the same promise and surfaces the original error on consumption.
|
|
692
|
+
void prefetchEncryptionKey().then((key) => {
|
|
693
|
+
// Unencrypted runs do not need a key-resolution span. Their resolver
|
|
694
|
+
// still runs speculatively so an encrypted frame can join it.
|
|
695
|
+
if (key)
|
|
696
|
+
recordStreamReadKeyResolution(keyStart, runId, name, true);
|
|
697
|
+
}, () => recordStreamReadKeyResolution(keyStart, runId, name, false));
|
|
698
|
+
}
|
|
662
699
|
async function connect() {
|
|
700
|
+
if (canceled)
|
|
701
|
+
return false;
|
|
663
702
|
const world = await getWorldLazy();
|
|
703
|
+
if (canceled)
|
|
704
|
+
return false;
|
|
664
705
|
const effectiveStartIndex = reconnectSupported
|
|
665
706
|
? currentStartIndex + consumedFrames
|
|
666
707
|
: startIndex;
|
|
667
708
|
const connectStart = Date.now();
|
|
668
709
|
const stream = await world.streams.get(runId, name, effectiveStartIndex);
|
|
710
|
+
if (canceled) {
|
|
711
|
+
await stream.cancel(cancelReason).catch(() => { });
|
|
712
|
+
return false;
|
|
713
|
+
}
|
|
669
714
|
if (connectMs === undefined)
|
|
670
715
|
connectMs = Date.now() - connectStart;
|
|
671
716
|
reader = stream.getReader();
|
|
717
|
+
return true;
|
|
672
718
|
}
|
|
673
719
|
/**
|
|
674
720
|
* Whether an upstream EOF represents genuine completion: the stream's
|
|
@@ -689,10 +735,14 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
689
735
|
}
|
|
690
736
|
}
|
|
691
737
|
async function reconnect() {
|
|
738
|
+
if (canceled)
|
|
739
|
+
return false;
|
|
692
740
|
if (reader) {
|
|
693
741
|
await reader.cancel().catch(() => { });
|
|
694
742
|
reader = undefined;
|
|
695
743
|
}
|
|
744
|
+
if (canceled)
|
|
745
|
+
return false;
|
|
696
746
|
// Advance the resume position past the frames already delivered, then
|
|
697
747
|
// drop any partial-frame bytes: the reopened connection re-sends from a
|
|
698
748
|
// frame boundary at the new index.
|
|
@@ -711,16 +761,19 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
711
761
|
reconnectCount++;
|
|
712
762
|
totalReconnectCount++;
|
|
713
763
|
if (reconnectCount > maxReconnects) {
|
|
714
|
-
throw new
|
|
764
|
+
throw new StreamError(`Stream "${name}" exceeded maximum reconnection attempts (${maxReconnects})`);
|
|
715
765
|
}
|
|
716
766
|
if (totalReconnectCount > maxTotalReconnects) {
|
|
717
|
-
throw new
|
|
767
|
+
throw new StreamError(`Stream "${name}" exceeded maximum total reconnection attempts (${maxTotalReconnects})`);
|
|
718
768
|
}
|
|
719
769
|
try {
|
|
720
|
-
await connect()
|
|
721
|
-
|
|
770
|
+
if (!(await connect()))
|
|
771
|
+
return false;
|
|
772
|
+
return true;
|
|
722
773
|
}
|
|
723
774
|
catch (error) {
|
|
775
|
+
if (canceled)
|
|
776
|
+
return false;
|
|
724
777
|
// Retention expiry is terminal and retrying cannot restore the stream.
|
|
725
778
|
// Preserve the typed error immediately instead of turning one 410 into
|
|
726
779
|
// 50 reconnect attempts and a generic budget-exhaustion error.
|
|
@@ -733,17 +786,27 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
733
786
|
}
|
|
734
787
|
return new ReadableStream({
|
|
735
788
|
pull: async (controller) => {
|
|
789
|
+
if (canceled)
|
|
790
|
+
return;
|
|
736
791
|
if (readStart === undefined)
|
|
737
792
|
readStart = Date.now();
|
|
793
|
+
// Begin resolving the key before awaiting streams.get()/the first raw
|
|
794
|
+
// frame. This is intentionally not awaited: buffered raw frames remain
|
|
795
|
+
// bounded by the Web Streams backpressure chain while the deserialize
|
|
796
|
+
// transform joins this promise only if an encrypted frame needs it.
|
|
797
|
+
prefetchKey();
|
|
738
798
|
// Loop until we emit something, hit EOF, or fatally error. Reads that
|
|
739
799
|
// only extend the in-flight-frame buffer don't enqueue anything; we
|
|
740
800
|
// keep reading rather than returning empty-handed.
|
|
741
801
|
for (;;) {
|
|
742
802
|
if (!reader) {
|
|
743
803
|
try {
|
|
744
|
-
await connect()
|
|
804
|
+
if (!(await connect()))
|
|
805
|
+
return;
|
|
745
806
|
}
|
|
746
807
|
catch (err) {
|
|
808
|
+
if (canceled)
|
|
809
|
+
return;
|
|
747
810
|
controller.error(err);
|
|
748
811
|
return;
|
|
749
812
|
}
|
|
@@ -754,12 +817,15 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
754
817
|
result = await reader.read();
|
|
755
818
|
}
|
|
756
819
|
catch (err) {
|
|
820
|
+
if (canceled)
|
|
821
|
+
return;
|
|
757
822
|
if (!reconnectSupported) {
|
|
758
823
|
controller.error(err);
|
|
759
824
|
return;
|
|
760
825
|
}
|
|
761
826
|
try {
|
|
762
|
-
await reconnect()
|
|
827
|
+
if (!(await reconnect()))
|
|
828
|
+
return;
|
|
763
829
|
}
|
|
764
830
|
catch (reconnectErr) {
|
|
765
831
|
controller.error(reconnectErr);
|
|
@@ -767,6 +833,8 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
767
833
|
}
|
|
768
834
|
continue;
|
|
769
835
|
}
|
|
836
|
+
if (canceled)
|
|
837
|
+
return;
|
|
770
838
|
if (result.done || !result.value) {
|
|
771
839
|
reader = undefined;
|
|
772
840
|
// A clean EOF is only trustworthy if the stream is actually
|
|
@@ -776,9 +844,13 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
776
844
|
// errored body, but on some paths it reaches the client as a clean
|
|
777
845
|
// EOF), and a completed stream can still be cut mid-body; both
|
|
778
846
|
// would otherwise be silently read as a shorter, complete stream.
|
|
779
|
-
|
|
847
|
+
const verifiedComplete = !reconnectSupported || (await isVerifiedComplete());
|
|
848
|
+
if (canceled)
|
|
849
|
+
return;
|
|
850
|
+
if (!verifiedComplete) {
|
|
780
851
|
try {
|
|
781
|
-
await reconnect()
|
|
852
|
+
if (!(await reconnect()))
|
|
853
|
+
return;
|
|
782
854
|
}
|
|
783
855
|
catch (reconnectErr) {
|
|
784
856
|
controller.error(reconnectErr);
|
|
@@ -831,12 +903,15 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
831
903
|
// Only partial bytes: read more.
|
|
832
904
|
}
|
|
833
905
|
},
|
|
834
|
-
cancel: async () => {
|
|
835
|
-
|
|
836
|
-
|
|
906
|
+
cancel: async (reason) => {
|
|
907
|
+
canceled = true;
|
|
908
|
+
cancelReason = reason;
|
|
909
|
+
const currentReader = reader;
|
|
910
|
+
reader = undefined;
|
|
911
|
+
if (currentReader) {
|
|
912
|
+
await currentReader.cancel(reason).catch((err) => {
|
|
837
913
|
console.warn('Error closing ReadableStream reader:', err);
|
|
838
914
|
});
|
|
839
|
-
reader = undefined;
|
|
840
915
|
}
|
|
841
916
|
},
|
|
842
917
|
});
|
|
@@ -1471,7 +1546,13 @@ export function getExternalReducers(global = globalThis, ops, runId, cryptoKey,
|
|
|
1471
1546
|
// first chunk can race `run_started`. Thread the run-ready barrier into that
|
|
1472
1547
|
// sink so the write orders after the run exists. Undefined outside turbo /
|
|
1473
1548
|
// on the await path.
|
|
1474
|
-
runReadyBarrier
|
|
1549
|
+
runReadyBarrier,
|
|
1550
|
+
// Operations that read data back from the workflow into caller-owned
|
|
1551
|
+
// writables. These must stay separate from producer uploads: a readback can
|
|
1552
|
+
// only finish after the workflow runs, so awaiting it before dispatch would
|
|
1553
|
+
// deadlock. Defaults to `ops` for existing callers that flush everything in
|
|
1554
|
+
// the background.
|
|
1555
|
+
readbackOps = ops) {
|
|
1475
1556
|
return {
|
|
1476
1557
|
...getAllBaseReducers(global),
|
|
1477
1558
|
ReadableStream: (value) => {
|
|
@@ -1497,7 +1578,7 @@ runReadyBarrier) {
|
|
|
1497
1578
|
}
|
|
1498
1579
|
else {
|
|
1499
1580
|
ops.push(value
|
|
1500
|
-
.pipeThrough(getSerializeStream(getExternalReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier), cryptoKey))
|
|
1581
|
+
.pipeThrough(getSerializeStream(getExternalReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier, readbackOps), cryptoKey))
|
|
1501
1582
|
.pipeTo(writable));
|
|
1502
1583
|
}
|
|
1503
1584
|
const s = { name };
|
|
@@ -1540,7 +1621,7 @@ runReadyBarrier) {
|
|
|
1540
1621
|
const streamId = (global[STABLE_ULID] || defaultUlid)();
|
|
1541
1622
|
const name = `strm_${streamId}`;
|
|
1542
1623
|
const readable = new WorkflowServerReadableStream(runId, name);
|
|
1543
|
-
|
|
1624
|
+
readbackOps.push(readable.pipeTo(value));
|
|
1544
1625
|
return { name };
|
|
1545
1626
|
},
|
|
1546
1627
|
AbortController: (value) => {
|
|
@@ -1711,7 +1792,7 @@ function getStepReducers(global = globalThis, ops, runId, cryptoKey, framedByteS
|
|
|
1711
1792
|
// after the body but within the same op flush, so its first chunk can race
|
|
1712
1793
|
// `run_started`. Thread the run-ready barrier into the sink so that write
|
|
1713
1794
|
// orders after the run exists. Undefined outside turbo / on the await path.
|
|
1714
|
-
runReadyBarrier) {
|
|
1795
|
+
runReadyBarrier, readbackOps = ops) {
|
|
1715
1796
|
return {
|
|
1716
1797
|
...getAllBaseReducers(global),
|
|
1717
1798
|
ReadableStream: (value) => {
|
|
@@ -1750,7 +1831,7 @@ runReadyBarrier) {
|
|
|
1750
1831
|
}
|
|
1751
1832
|
else {
|
|
1752
1833
|
ops.push(value
|
|
1753
|
-
.pipeThrough(getSerializeStream(getStepReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier), cryptoKey))
|
|
1834
|
+
.pipeThrough(getSerializeStream(getStepReducers(global, ops, runId, cryptoKey, framedByteStreams, runReadyBarrier, readbackOps), cryptoKey))
|
|
1754
1835
|
.pipeTo(writable));
|
|
1755
1836
|
}
|
|
1756
1837
|
}
|
|
@@ -1769,8 +1850,8 @@ runReadyBarrier) {
|
|
|
1769
1850
|
if (!name) {
|
|
1770
1851
|
const streamId = (global[STABLE_ULID] || defaultUlid)();
|
|
1771
1852
|
name = `strm_${streamId}`;
|
|
1772
|
-
|
|
1773
|
-
.pipeThrough(getDeserializeStream(getStepRevivers(global,
|
|
1853
|
+
readbackOps.push(new WorkflowServerReadableStream(runId, name)
|
|
1854
|
+
.pipeThrough(getDeserializeStream(getStepRevivers(global, readbackOps, runId, cryptoKey), cryptoKey))
|
|
1774
1855
|
.pipeTo(value));
|
|
1775
1856
|
}
|
|
1776
1857
|
const s = { name };
|
|
@@ -2017,19 +2098,13 @@ function reviveAbortController(value, ops, runId) {
|
|
|
2017
2098
|
// write above stays in `ops`: it must fire ASAP to reach an in-flight
|
|
2018
2099
|
// sibling step and is not the durable record.
|
|
2019
2100
|
//
|
|
2020
|
-
// `resumeHookDurable`, not `resumeHook`: awaiting the latter only
|
|
2021
|
-
// guarantees the resume was published, since the lazy path leaves the
|
|
2022
|
-
// event write to the queue consumer. That would satisfy
|
|
2023
|
-
// `preCompletionOps` while leaving the very race this ordering exists
|
|
2024
|
-
// to prevent.
|
|
2025
|
-
//
|
|
2026
2101
|
// Swallow errors here so the promise can only ever enforce ordering
|
|
2027
2102
|
// when awaited (see the no-reject contract on
|
|
2028
2103
|
// StepContext.preCompletionOps); a failed resume retries on next replay.
|
|
2029
2104
|
const hookResume = (async () => {
|
|
2030
2105
|
try {
|
|
2031
|
-
const {
|
|
2032
|
-
await
|
|
2106
|
+
const { resumeHook } = await import('./runtime/resume-hook.js');
|
|
2107
|
+
await resumeHook(value.hookToken, {
|
|
2033
2108
|
aborted: true,
|
|
2034
2109
|
reason,
|
|
2035
2110
|
});
|
|
@@ -2105,6 +2180,55 @@ async function getForwardedWritableEncryptionKey(runId, deploymentId, encryption
|
|
|
2105
2180
|
: await world.getEncryptionKeyForRun(await world.runs.get(runId));
|
|
2106
2181
|
return rawKey ? await importKey(rawKey, ['encrypt']) : undefined;
|
|
2107
2182
|
}
|
|
2183
|
+
/**
|
|
2184
|
+
* Create a run's object readable without dispatching its stream GET or
|
|
2185
|
+
* encryption-key lookup until the caller reads it. The external reviver starts
|
|
2186
|
+
* its background pipe immediately, so this boundary belongs here—next to the
|
|
2187
|
+
* source/transform assembly—rather than in `Run`.
|
|
2188
|
+
*
|
|
2189
|
+
* @internal
|
|
2190
|
+
*/
|
|
2191
|
+
export function getRunReadableStream(global, ops, runId, name, startIndex, cryptoKey) {
|
|
2192
|
+
let reader;
|
|
2193
|
+
let lockState;
|
|
2194
|
+
let lockPollingStarted = false;
|
|
2195
|
+
let userReadable;
|
|
2196
|
+
userReadable = new ReadableStream({
|
|
2197
|
+
async pull(controller) {
|
|
2198
|
+
try {
|
|
2199
|
+
if (!reader) {
|
|
2200
|
+
const stream = getExternalRevivers(global, ops, runId, cryptoKey, {
|
|
2201
|
+
onReadableState: (state) => {
|
|
2202
|
+
lockState = state;
|
|
2203
|
+
},
|
|
2204
|
+
}).ReadableStream({ name, startIndex });
|
|
2205
|
+
reader = stream.getReader();
|
|
2206
|
+
if (lockState && !lockPollingStarted) {
|
|
2207
|
+
lockPollingStarted = true;
|
|
2208
|
+
// The caller owns this wrapper's reader, so polling it preserves
|
|
2209
|
+
// the documented releaseLock() completion signal.
|
|
2210
|
+
pollReadableLock(userReadable, lockState);
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
const result = await reader.read();
|
|
2214
|
+
if (result.done)
|
|
2215
|
+
controller.close();
|
|
2216
|
+
else
|
|
2217
|
+
controller.enqueue(result.value);
|
|
2218
|
+
}
|
|
2219
|
+
catch (error) {
|
|
2220
|
+
controller.error(error);
|
|
2221
|
+
}
|
|
2222
|
+
},
|
|
2223
|
+
async cancel(reason) {
|
|
2224
|
+
await reader?.cancel(reason).catch(() => { });
|
|
2225
|
+
},
|
|
2226
|
+
},
|
|
2227
|
+
// A positive default high-water mark would run pull at construction to
|
|
2228
|
+
// fill the queue, turning an unread Run.getReadable() into I/O.
|
|
2229
|
+
{ highWaterMark: 0 });
|
|
2230
|
+
return userReadable;
|
|
2231
|
+
}
|
|
2108
2232
|
/**
|
|
2109
2233
|
* Revivers for deserialization boundary from the client side,
|
|
2110
2234
|
* receiving the return value from the workflow handler.
|
|
@@ -2113,7 +2237,7 @@ async function getForwardedWritableEncryptionKey(runId, deploymentId, encryption
|
|
|
2113
2237
|
* @param ops
|
|
2114
2238
|
* @param runId
|
|
2115
2239
|
*/
|
|
2116
|
-
export function getExternalRevivers(global = globalThis, ops, runId, cryptoKey) {
|
|
2240
|
+
export function getExternalRevivers(global = globalThis, ops, runId, cryptoKey, options) {
|
|
2117
2241
|
return {
|
|
2118
2242
|
...getCommonRevivers(global),
|
|
2119
2243
|
// StepFunction should not be returned from workflows to clients
|
|
@@ -2184,24 +2308,41 @@ export function getExternalRevivers(global = globalThis, ops, runId, cryptoKey)
|
|
|
2184
2308
|
flushablePipe(readable, writable, state).catch(() => {
|
|
2185
2309
|
// Errors are handled via state.reject
|
|
2186
2310
|
});
|
|
2187
|
-
//
|
|
2188
|
-
|
|
2311
|
+
// Direct reviver callers hold this readable. A future public wrapper
|
|
2312
|
+
// can provide the state and poll the readable it hands to the caller.
|
|
2313
|
+
if (options?.onReadableState)
|
|
2314
|
+
options.onReadableState(state);
|
|
2315
|
+
else
|
|
2316
|
+
pollReadableLock(userReadable, state);
|
|
2189
2317
|
return userReadable;
|
|
2190
2318
|
}
|
|
2191
2319
|
else {
|
|
2192
2320
|
// Non-byte streams carry length-prefixed frames, so we can count
|
|
2193
2321
|
// completed frames and transparently reconnect when the server
|
|
2194
2322
|
// stream connection times out mid-run.
|
|
2195
|
-
|
|
2196
|
-
|
|
2323
|
+
// Memoize this resolver per readable session. The first raw pull
|
|
2324
|
+
// starts it concurrently with the stream GET; getDeserializeStream
|
|
2325
|
+
// joins the same promise when an encrypted frame arrives. This also
|
|
2326
|
+
// avoids invoking arbitrary EncryptionKeyParam callbacks twice.
|
|
2327
|
+
let keyPromise;
|
|
2328
|
+
const resolveKey = () => {
|
|
2329
|
+
keyPromise ??= resolveEncryptionKey(cryptoKey);
|
|
2330
|
+
return keyPromise;
|
|
2331
|
+
};
|
|
2332
|
+
const readable = createReconnectingFramedStream(runId, value.name, value.startIndex, resolveKey);
|
|
2333
|
+
const transform = getDeserializeStream(getExternalRevivers(global, ops, runId, resolveKey), resolveKey);
|
|
2197
2334
|
const state = createFlushableState();
|
|
2198
2335
|
ops.push(state.promise);
|
|
2199
|
-
// Start the flushable pipe in the background
|
|
2336
|
+
// Start the flushable pipe in the background.
|
|
2200
2337
|
flushablePipe(readable, transform.writable, state).catch(() => {
|
|
2201
2338
|
// Errors are handled via state.reject
|
|
2202
2339
|
});
|
|
2203
|
-
//
|
|
2204
|
-
|
|
2340
|
+
// Direct reviver callers hold this readable. The public Run factory
|
|
2341
|
+
// wraps it for first-pull laziness and polls that wrapper instead.
|
|
2342
|
+
if (options?.onReadableState)
|
|
2343
|
+
options.onReadableState(state);
|
|
2344
|
+
else
|
|
2345
|
+
pollReadableLock(transform.readable, state);
|
|
2205
2346
|
return transform.readable;
|
|
2206
2347
|
}
|
|
2207
2348
|
},
|
|
@@ -2723,16 +2864,16 @@ export function deserializePreparedStepError(prepared, global = globalThis, extr
|
|
|
2723
2864
|
* backwards compatibility with older runs.
|
|
2724
2865
|
* @returns The dehydrated value as binary data (Uint8Array) with format prefix
|
|
2725
2866
|
*/
|
|
2726
|
-
export async function dehydrateWorkflowArguments(value, runId, key, ops = [], global = globalThis, v1Compat = false, framedByteStreams = false, compression = false) {
|
|
2867
|
+
export async function dehydrateWorkflowArguments(value, runId, key, ops = [], global = globalThis, v1Compat = false, framedByteStreams = false, compression = false, readbackOps = ops) {
|
|
2727
2868
|
if (v1Compat) {
|
|
2728
|
-
const str = stringify(value, getExternalReducers(global, ops, runId, key, framedByteStreams));
|
|
2869
|
+
const str = stringify(value, getExternalReducers(global, ops, runId, key, framedByteStreams, undefined, readbackOps));
|
|
2729
2870
|
return revive(str);
|
|
2730
2871
|
}
|
|
2731
2872
|
try {
|
|
2732
2873
|
const compressionStats = {};
|
|
2733
2874
|
const result = await clientModule.serialize(value, key, {
|
|
2734
2875
|
global,
|
|
2735
|
-
extraReducers: getStreamAndRequestReducers(getExternalReducers(global, ops, runId, key, framedByteStreams)),
|
|
2876
|
+
extraReducers: getStreamAndRequestReducers(getExternalReducers(global, ops, runId, key, framedByteStreams, undefined, readbackOps)),
|
|
2736
2877
|
compression,
|
|
2737
2878
|
compressionStats,
|
|
2738
2879
|
});
|
|
@@ -2879,16 +3020,16 @@ export async function dehydrateStepReturnValue(value, runId, key, ops = [], glob
|
|
|
2879
3020
|
// Turbo optimistic start: order the first chunk of a returned stream after
|
|
2880
3021
|
// the backgrounded `run_started`. Threaded into the step reducers' stream
|
|
2881
3022
|
// sink. Undefined outside turbo / on the await path.
|
|
2882
|
-
runReadyBarrier) {
|
|
3023
|
+
runReadyBarrier, readbackOps = ops) {
|
|
2883
3024
|
if (v1Compat) {
|
|
2884
|
-
const str = stringify(value, getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier));
|
|
3025
|
+
const str = stringify(value, getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier, readbackOps));
|
|
2885
3026
|
return revive(str);
|
|
2886
3027
|
}
|
|
2887
3028
|
try {
|
|
2888
3029
|
const compressionStats = {};
|
|
2889
3030
|
const result = await stepModule.serialize(value, key, {
|
|
2890
3031
|
global,
|
|
2891
|
-
extraReducers: getStreamAndRequestReducers(getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier)),
|
|
3032
|
+
extraReducers: getStreamAndRequestReducers(getStepReducers(global, ops, runId, key, framedByteStreams, runReadyBarrier, readbackOps)),
|
|
2892
3033
|
compression,
|
|
2893
3034
|
compressionStats,
|
|
2894
3035
|
});
|
|
@@ -3070,4 +3211,4 @@ function getStreamAndRequestRevivers(allRevivers) {
|
|
|
3070
3211
|
}
|
|
3071
3212
|
return extra;
|
|
3072
3213
|
}
|
|
3073
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSxnQ0FBZ0MsQ0FB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TUFBTSxLQUFLLEdBQXdDLEVBQUUsQ0FBQztJQUN0RCxLQUFLLE1BQU0sR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFDMUMsSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgU3RyZWFtRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9lbnYtY29uZmlnJztcbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUZsdXNoYWJsZVN0YXRlLFxuICBmbHVzaGFibGVQaXBlLFxuICBnZXRNYXhCdWZmZXJlZEJ5dGVzLFxuICBnZXRNYXhCeXRlc1BlckJhdGNoLFxuICBnZXRNYXhDaHVua3NQZXJCYXRjaCxcbiAgZ2V0TWF4SW5mbGlnaHRDaHVua3MsXG4gIHBvbGxSZWFkYWJsZUxvY2ssXG4gIHBvbGxXcml0YWJsZUxvY2ssXG59IGZyb20gJy4vZmx1c2hhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuL3ByaXZhdGUuanMnO1xuLy8gVjI6IHVzZSBnZXRXb3JsZExhenkgaW4gc3RlcC1zaWRlIGNvZGUgcGF0aHMgc28gVHVyYm9wYWNrIGNhbiBzdGF0aWNhbGx5XG4vLyByZXNvbHZlIHRoZSB3b3JsZCBicmlkZ2UgZnJvbSB0aGUgc3RlcCBidW5kbGUgd2l0aG91dCBkcmFnZ2luZyB0aGUgZnVsbFxuLy8gd29ybGQudHMgbW9kdWxlIChhbmQgaXRzIGR5bmFtaWMtaW1wb3J0IGJlaGF2aW91cikgaW50byB0aGUgZmxvdyByb3V0ZS5cbi8vIFNlZSBgcGFja2FnZXMvY29yZS9zcmMvcnVudGltZS9nZXQtd29ybGQtbGF6eS50c2AgYW5kIHRoZVxuLy8gXCJUdXJib3BhY2sgTkZUIFRyYWNpbmcgRXJyb3JzIGluIFYyIENvbWJpbmVkIEZsb3cgUm91dGVcIiBzZWN0aW9uIG9mXG4vLyBgZG9jcy9jb250ZW50L2RvY3MvY2hhbmdlbG9nL2VhZ2VyLXByb2Nlc3NpbmcubWR4YC5cbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vcnVudGltZS9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICBieXRlc1RvQmFzZTY0LFxuICBjcmVhdGVPcGVuU2Vzc2lvbixcbiAgY3JlYXRlU2VhbFNlc3Npb24sXG4gIGRlY29kZVJ1blB1YmxpY0tleSxcbn0gZnJvbSAnLi9zZWFsZWQtYm94LmpzJztcbmltcG9ydCAqIGFzIGNsaWVudE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY2xpZW50LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ29tcHJlc3Npb25TdGF0cyxcbiAgY29tcHJlc3MsXG4gIGRlY29tcHJlc3MsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb21wcmVzc2lvbi5qcyc7XG5pbXBvcnQge1xuICBhZXNLZXlPZixcbiAgZGVjcnlwdCxcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgRW5jcnlwdGlvbktleVBhcmFtLFxuICBlbmNyeXB0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBpc1NlYWxUYXJnZXQsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgcmVzb2x2ZUVuY3J5cHRpb25LZXksXG4gIHJ1blBheWxvYWRLZXlzLFxuICB0eXBlIFNlYWxUYXJnZXQsXG4gIHNlYWxUbyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yLFxuICByZXRocm93SWZSdW50aW1lRXJyb3IsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lcnJvcnMuanMnO1xuaW1wb3J0IHtcbiAgZGVjb2RlRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBpc0VuY3J5cHRlZCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Zvcm1hdC5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEd1ZXN0Q29kZVN0YXRzLFxuICBpc0luc3RhbmNlT2ZQcm90b3R5cGUsXG4gIHJlYWRQcm9wZXJ0eSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7XG4gIGdldENsYXNzUmVkdWNlcnMsXG4gIGdldENsYXNzUmV2aXZlcnMsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9jbGFzcy5qcyc7XG5pbXBvcnQge1xuICBnZXRDb21tb25SZWR1Y2VycyxcbiAgZ2V0Q29tbW9uUmV2aXZlcnMgYXMgZ2V0Q29tbW9uUmV2aXZlcnNGcm9tTW9kdWxlLFxuICByZXZpdmUsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9jb21tb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcixcbiAgZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL3N0ZXAtZnVuY3Rpb24uanMnO1xuaW1wb3J0ICogYXMgc3RlcE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vc3RlcC5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgKiBhcyB3b3JrZmxvd01vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCB7XG4gIEFCT1JUX0hPT0tfVE9LRU4sXG4gIEFCT1JUX0xJU1RFTkVSX0FUVEFDSEVELFxuICBBQk9SVF9SRUFERVJfQ0FOQ0VMLFxuICBBQk9SVF9TVFJFQU1fTkFNRSxcbiAgQk9EWV9JTklUX1NZTUJPTCxcbiAgU1RBQkxFX1VMSUQsXG4gIFNUUkVBTV9EUkFJTl9TWU1CT0wsXG4gIFNUUkVBTV9GUkFNSU5HX1NZTUJPTCxcbiAgU1RSRUFNX05BTUVfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsXG4gIFNUUkVBTV9UWVBFX1NZTUJPTCxcbiAgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSxcbn0gZnJvbSAnLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlU3BhbiwgZ2V0U3BhbktpbmQsIHJlY29yZEVsYXBzZWRTcGFuIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZCB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Fib3J0U2lnbmFsIH0gZnJvbSAnLi93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLmpzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCB1dGlsaXRpZXMgZnJvbSB0aGUgbW9kdWxhciBzZXJpYWxpemF0aW9uIG1vZHVsZXNcbi8vIHNvIGV4aXN0aW5nIGNvbnN1bWVycyBvZiBgQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbmAga2VlcCB3b3JraW5nLlxuZXhwb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBlbmNyeXB0LFxuICBkZWNyeXB0LFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIC8vIFNlYWxlZC1ib3ggKCdlbmNwJykga2V5IHZhcmlhbnRzOiBzZWUgc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLnRzLlxuICB0eXBlIFBheWxvYWRLZXksXG4gIHR5cGUgUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxuICBydW5QYXlsb2FkS2V5cyxcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgaXNSdW5QYXlsb2FkS2V5cyxcbiAgYWVzS2V5T2YsXG59O1xuXG4vLyBSZS1leHBvcnQgdGhlIGxlZ2FjeSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4vLyBOZXcgY29kZSBzaG91bGQgdXNlIEZvcm1hdFByZWZpeCBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnLlxuZXhwb3J0IHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgPVxuICAodHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXQpW2tleW9mIHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0XTtcblxuLyoqXG4gKiBEZWZhdWx0IFVMSUQgZ2VuZXJhdG9yIGZvciBjb250ZXh0cyB3aGVyZSBWTSdzIHNlZWRlZCBgc3RhYmxlVWxpZGAgaXNuJ3QgYXZhaWxhYmxlLlxuICogVXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gc2VyaWFsaXppbmcgc3RyZWFtcyBvdXRzaWRlIHRoZSB3b3JrZmxvdyBWTSBjb250ZXh0XG4gKiAoZS5nLiwgd2hlbiBzdGFydGluZyBhIHdvcmtmbG93IG9yIGhhbmRsaW5nIHN0ZXAgcmV0dXJuIHZhbHVlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIERldGVjdCBpZiBhIHJlYWRhYmxlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBzdHJlYW1cbiAqIEByZXR1cm5zIGBcImJ5dGVzXCJgIGlmIHRoZSBzdHJlYW0gaXMgYSBieXRlIHN0cmVhbSwgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJlYW1UeXBlKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiAnYnl0ZXMnIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKHsgbW9kZTogJ2J5b2InIH0pO1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgIHJldHVybiAnYnl0ZXMnO1xuICB9IGNhdGNoIHt9XG59XG5cbi8qKlxuICogRnJhbWUgZm9ybWF0IGZvciBzdHJlYW0gY2h1bmtzOlxuICogICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVtmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZF1cbiAqXG4gKiBFYWNoIGNodW5rIGlzIGluZGVwZW5kZW50bHkgZnJhbWVkIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuIGZpbmRcbiAqIGNodW5rIGJvdW5kYXJpZXMgZXZlbiB3aGVuIG11bHRpcGxlIGNodW5rcyBhcmUgY29uY2F0ZW5hdGVkIG9yXG4gKiBzcGxpdCBhY3Jvc3MgdHJhbnNwb3J0IHJlYWRzLlxuICovXG5jb25zdCBGUkFNRV9IRUFERVJfU0laRSA9IDQ7XG5cbi8qKlxuICogVGhlIG1vZGUtc3BlY2lmaWMgc2VyaWFsaXplcnMgKGAuL3NlcmlhbGl6YXRpb24ve2NsaWVudCxzdGVwLHdvcmtmbG93fS50c2ApXG4gKiBhbHJlYWR5IHRocm93IGEgYFNlcmlhbGl6YXRpb25FcnJvcmAgd2hvc2UgYC5jYXVzZWAgaXMgdGhlIHVuZGVybHlpbmdcbiAqIGRldmFsdWUgLyBzZXJkZSBmYWlsdXJlLiBUaGUgb3V0ZXIgZGVoeWRyYXRlL2h5ZHJhdGUgd3JhcHBlcnMgd2FudCB0b1xuICogcmUtZnJhbWUgdGhhdCBlcnJvciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBjb250ZXh0IGxhYmVsIChlLmcuIFwid29ya2Zsb3dcbiAqIGFyZ3VtZW50c1wiIGluc3RlYWQgb2YgZ2VuZXJpYyBcIndvcmtmbG93IHZhbHVlXCIpLCBzbyB0aGV5IHVud3JhcCB0aGVcbiAqIGlubmVyIFNlcmlhbGl6YXRpb25FcnJvciBhbmQgcmVmb3JtYXQgd2l0aCB0aGUgb3JpZ2luYWwgY2F1c2UuIEVycm9yc1xuICogdGhhdCBhcmVuJ3QgYWxyZWFkeSBTZXJpYWxpemF0aW9uRXJyb3IgZmxvdyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgaXMgYW4gZXhjZXB0aW9uOiBpdCBtdXN0IGtlZXAgaXRzIGlkZW50aXR5IChhbmRcbiAqIGBjb250ZXh0YCkgc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXIgcm91dGVzIGl0IHRvIGBSVU5USU1FX0VSUk9SYCxcbiAqIHNvIHRoaXMgcmV0aHJvd3MgaXQgdW5jaGFuZ2VkIGJlZm9yZSBhbnkgdW53cmFwcGluZy4gTm90ZSB0aGlzIGd1YXJkXG4gKiBtdXN0IHJ1biBiZWZvcmUgdGhlIGdlbmVyaWMgYFdvcmtmbG93UnVudGltZUVycm9yYCB1bndyYXAgYmVsb3csIHNpbmNlXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgZXh0ZW5kcyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIGFuZCBjYXJyaWVzIGFcbiAqIGBjYXVzZWAgKHRoZSB1bmRlcmx5aW5nIERPTUV4Y2VwdGlvbikgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgdW53cmFwcGVkXG4gKiBhbmQgcmVmcmFtZWQgYXMgYSBgU2VyaWFsaXphdGlvbkVycm9yYC5cbiAqL1xuZnVuY3Rpb24gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlcmlhbGl6YXRpb25FcnJvciAmJiBlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlO1xuICB9XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG4vKipcbiAqIEVtaXQgY29tcHJlc3Npb24gdGVsZW1ldHJ5IG9udG8gdGhlIGFjdGl2ZSBzcGFuIGFmdGVyIGEgKGRlKXNlcmlhbGl6ZS5cbiAqXG4gKiBUaGUgY29tcHJlc3Npb24gbGF5ZXIgcG9wdWxhdGVzIGBzdGF0c2Agb25seSB3aGVuIGl0IGFjdHVhbGx5IHJhbiAoYmluYXJ5XG4gKiBkYXRhIG9uIGEgc3BlYyA+PSA1IHBhdGgpOyBsZWdhY3kgLyB2MUNvbXBhdCBwYXRocyBsZWF2ZSBpdCB1bnJlY29yZGVkLCBzb1xuICogdGhpcyBuby1vcHMgZm9yIHRoZW0gYW5kIGF2b2lkcyB0aGUgYGdldEFjdGl2ZVNwYW5gIGxvb2t1cC4gQXR0cmlidXRlcyBsYW5kXG4gKiBvbiB3aGF0ZXZlciBzcGFuIGlzIGFjdGl2ZSwgdHlwaWNhbGx5IHRoZSBkZWRpY2F0ZWQgYHN0ZXAuZGVoeWRyYXRlYCAvXG4gKiBgc3RlcC5oeWRyYXRlYCBzcGFuLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBydW4vc3RhcnQgc3Bhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkQ29tcHJlc3Npb24oXG4gIHN0YXRzOiBDb21wcmVzc2lvblN0YXRzLFxuICBvcGVyYXRpb246ICdzZXJpYWxpemUnIHwgJ2Rlc2VyaWFsaXplJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc3RhdHMucmVjb3JkZWQpIHJldHVybjtcbiAgLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgYnJlYWsgdGhlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBkYXRhIHBhdGg6IGFcbiAgLy8gbWlzc2luZy9mYWlsaW5nIHRyYWNlciBpcyBwdXJlbHkgYW4gb2JzZXJ2YWJpbGl0eSBsb3NzLlxuICB0cnkge1xuICAgIGNvbnN0IHNwYW4gPSBhd2FpdCBnZXRBY3RpdmVTcGFuKCk7XG4gICAgaWYgKCFzcGFuKSByZXR1cm47XG4gICAgY29uc3QgdW5jb21wcmVzc2VkQnl0ZXMgPSBzdGF0cy51bmNvbXByZXNzZWRCeXRlcyA/PyAwO1xuICAgIGNvbnN0IHN0b3JlZEJ5dGVzID0gc3RhdHMuc3RvcmVkQnl0ZXMgPz8gMDtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db21wcmVzc2VkKHN0YXRzLmNvbXByZXNzZWQgPz8gZmFsc2UpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uQ29kZWMoc3RhdHMuY29kZWMgPz8gJ25vbmUnKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblVuY29tcHJlc3NlZEJ5dGVzKHVuY29tcHJlc3NlZEJ5dGVzKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblN0b3JlZEJ5dGVzKHN0b3JlZEJ5dGVzKSxcbiAgICAgIC4uLihzdGF0cy5jb21wcmVzc2VkICYmIHVuY29tcHJlc3NlZEJ5dGVzID4gMFxuICAgICAgICA/IEF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzaW9uUmF0aW8oXG4gICAgICAgICAgICAxIC0gc3RvcmVkQnl0ZXMgLyB1bmNvbXByZXNzZWRCeXRlc1xuICAgICAgICAgIClcbiAgICAgICAgOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSB0ZWxlbWV0cnkgZmFpbHVyZXNcbiAgfVxufVxuXG4vKipcbiAqIEVtaXRzIE9UZWwgc3BhbiBhdHRyaWJ1dGVzIGZvciB3b3JrZmxvdyAoZ3Vlc3QpIGNvZGUgZXhlY3V0aW9ucyB0aGF0IHRoZVxuICogaGFyZGVuZWQgc2VyaWFsaXplciBjb3VsZCBub3QgYXZvaWQgKGdldHRlcnMsIHByb3hpZXMsIGN1c3RvbVxuICogc2VyaWFsaXplcnMpLiBOby1vcHMgd2hlbiBzZXJpYWxpemF0aW9uIHdhcyBmdWxseSBzaWRlLWVmZmVjdCBmcmVlLFxuICogdGhlIGNvbW1vbiBjYXNlLiBTYW1lIG5ldmVyLWJyZWFrLXRoZS1kYXRhLXBhdGggY29udHJhY3QgYXNcbiAqIGByZWNvcmRDb21wcmVzc2lvbmAgYWJvdmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoc3RhdHM6IEd1ZXN0Q29kZVN0YXRzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRvdGFsRXhlY3V0aW9ucyA9IHN0YXRzLnRvdGFsRXhlY3V0aW9ucyA/PyBzdGF0cy5leGVjdXRpb25zLmxlbmd0aDtcbiAgaWYgKHRvdGFsRXhlY3V0aW9ucyA9PT0gMCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHNwYW4gPSBhd2FpdCBnZXRBY3RpdmVTcGFuKCk7XG4gICAgaWYgKCFzcGFuKSByZXR1cm47XG4gICAgY29uc3QgZGV0YWlscyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgIHN0YXRzLmV4ZWN1dGlvbnMubWFwKChlKSA9PlxuICAgICAgICAgIGUuZGV0YWlsID8gYCR7ZS5raW5kfSAoJHtlLmRldGFpbH0pYCA6IGUua2luZFxuICAgICAgICApXG4gICAgICApLFxuICAgIF07XG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkd1ZXN0Q29kZUV4ZWN1dGlvbnModG90YWxFeGVjdXRpb25zKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkd1ZXN0Q29kZURldGFpbHMoZGV0YWlscyksXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSB0ZWxlbWV0cnkgZmFpbHVyZXNcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICByZWR1Y2VyczogUGFydGlhbDxSZWR1Y2Vycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICAvLyBOb3RlOiBpZiByZXNvbHZpbmcgY3J5cHRvS2V5IHJlamVjdHMgKGUuZy4sIG5ldHdvcmsgZXJyb3IgZmV0Y2hpbmdcbiAgLy8gdGhlIGRlcml2ZWQga2V5KSwgdGhlIHJlamVjdGlvbiB3b24ndCBzdXJmYWNlIHVudGlsIHRoZSBmaXJzdCBjaHVua1xuICAvLyBpcyBwcm9jZXNzZWQsIG5vdCBhdCBzdHJlYW0gY29uc3RydWN0aW9uIHRpbWUuXG4gIGNvbnN0IGtleVN0YXRlID0ge1xuICAgIHJlc29sdmVkOiBmYWxzZSxcbiAgICBrZXk6IHVuZGVmaW5lZCBhcyBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICB9O1xuICAvLyBTZXQgd2hlbiB0aGUgcmVzb2x2ZWQga2V5IGlzIGEgc2VhbCB0YXJnZXQ7IGFtb3J0aXplcyB0aGUgS0VNIGFjcm9zcyBhbGxcbiAgLy8gZnJhbWVzIHRoaXMgc3RyZWFtIGluc3RhbmNlIHdyaXRlcy5cbiAgbGV0IHNlYWxTZXNzaW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVTZWFsU2Vzc2lvbj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgICAgICBrZXlTdGF0ZS5yZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzU2VhbFRhcmdldChrZXlTdGF0ZS5rZXkpKSB7XG4gICAgICAgICAgICBzZWFsU2Vzc2lvbiA9IGNyZWF0ZVNlYWxTZXNzaW9uKFxuICAgICAgICAgICAgICBrZXlTdGF0ZS5rZXkucmVjaXBpZW50UHVibGljS2V5LFxuICAgICAgICAgICAgICBrZXlTdGF0ZS5rZXkuYWFkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc3RyaW5naWZ5KGNodW5rLCByZWR1Y2Vycyk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShzZXJpYWxpemVkKTtcbiAgICAgICAgbGV0IHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICAgICAgcGF5bG9hZFxuICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgZnJhbWUgcGF5bG9hZCBpZiBhIGtleSBpcyBwcm92aWRlZC5cbiAgICAgICAgLy8gVGhlIGxlbmd0aCBoZWFkZXIgcmVtYWlucyBpbiB0aGUgY2xlYXIgc28gdGhlIGRlc2VyaWFsaXplciBjYW5cbiAgICAgICAgLy8gZmluZCBmcmFtZSBib3VuZGFyaWVzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFdmVyeSBmcmFtZSBnZXRzIGEgZnJlc2ggcmFuZG9tIG5vbmNlLiBOZXZlciBzd2l0Y2ggdGhpcyB0byBhXG4gICAgICAgIC8vIGNvdW50ZXI6IGEgc3RyZWFtIHJlY29ubmVjdCBvciBhIGR1cmFibGUgcmVwbGF5IHJlc3RhcnRzIHRoZSB3cml0ZXIsXG4gICAgICAgIC8vIHdoaWNoIHdvdWxkIHJlcGVhdCBgKGtleSwgbm9uY2UpYCBhbmQgY2F0YXN0cm9waGljYWxseSBicmVha1xuICAgICAgICAvLyBBRVMtR0NNLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbiB0aGUgc2VhbGVkIHBhdGggdGhlIEtFTSBpcyBhbW9ydGl6ZWQgYWNyb3NzIHRoZSBzdHJlYW0gdmlhIGFcbiAgICAgICAgLy8gc2Vzc2lvbiAob25lIEVDREggcGVyIHdyaXRlciBpbnN0ZWFkIG9mIG9uZSBwZXIgZnJhbWUpLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgLy8gcHJlY2lzZWx5IGJlY2F1c2UgdGhlIG5vbmNlcyBzdGF5IHJhbmRvbSwgYW5kIGJlY2F1c2UgdGhlIHNlc3Npb24gaXNcbiAgICAgICAgLy8gc2NvcGVkIHRvIHRoaXMgc3RyZWFtIGluc3RhbmNlOiBhIHJlcGxheWVkIG9yIHJlY29ubmVjdGVkIHdyaXRlclxuICAgICAgICAvLyBidWlsZHMgYSBuZXcgb25lIGFuZCBuZXZlciBpbmhlcml0cyBhIHByZXZpb3VzIGNvbnRlbnQga2V5LlxuICAgICAgICBpZiAoc2VhbFNlc3Npb24pIHtcbiAgICAgICAgICBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRCxcbiAgICAgICAgICAgIGF3YWl0IHNlYWxTZXNzaW9uLnNlYWwocHJlZml4ZWQpXG4gICAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9IGVsc2UgaWYgKGtleVN0YXRlLmtleSkge1xuICAgICAgICAgIHByZWZpeGVkID0gKGF3YWl0IGVuY3J5cHQocHJlZml4ZWQsIGtleVN0YXRlLmtleSkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWU6IFs0LWJ5dGUgbGVuZ3RoXVtwcmVmaXhlZCBkYXRhXVxuICAgICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgcHJlZml4ZWQubGVuZ3RoKTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIHByZWZpeGVkLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgICBmcmFtZS5zZXQocHJlZml4ZWQsIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVuY3J5cHRpb24gZmFpbHVyZXMgbXVzdCBrZWVwIHRoZWlyIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JcbiAgICAgICAgLy8gaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIHJhdGhlciB0aGFuIGJlIHJlZnJhbWVkIGFzIGFcbiAgICAgICAgLy8gU2VyaWFsaXphdGlvbkVycm9yIChVU0VSX0VSUk9SKS5cbiAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdzdHJlYW0gY2h1bmsnLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlOiBlcnJvciB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gIHJldml2ZXJzOiBQYXJ0aWFsPFJldml2ZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+IHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgY29uc3Qga2V5U3RhdGUgPSB7XG4gICAgcmVzb2x2ZWQ6IGZhbHNlLFxuICAgIGtleTogdW5kZWZpbmVkIGFzIFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIH07XG4gIC8vIE1pcnJvciBvZiB0aGUgd3JpdGVyJ3Mgc2VhbCBzZXNzaW9uOiBldmVyeSBmcmFtZSBmcm9tIG9uZSB3cml0ZXIgY2Fycmllc1xuICAvLyB0aGUgc2FtZSBlcGhlbWVyYWwgcHVibGljIGtleSwgc28gdGhpcyB0dXJucyBhbiBFQ0RIIHBlciBmcmFtZSBpbnRvIGFuXG4gIC8vIEVDREggcGVyIHdyaXRlci5cbiAgbGV0IG9wZW5TZXNzaW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVPcGVuU2Vzc2lvbj4gfCB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV3QnVmZmVyLnNldChidWZmZXIsIDApO1xuICAgIG5ld0J1ZmZlci5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV3QnVmZmVyO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYW1lcyhcbiAgICBjb250cm9sbGVyOiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjxhbnk+XG4gICkge1xuICAgIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdFxuICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICBrZXlTdGF0ZS5yZXNvbHZlZCA9IHRydWU7XG4gICAgICBpZiAoaXNSdW5QYXlsb2FkS2V5cyhrZXlTdGF0ZS5rZXkpKSB7XG4gICAgICAgIG9wZW5TZXNzaW9uID0gY3JlYXRlT3BlblNlc3Npb24oa2V5U3RhdGUua2V5LmtleVBhaXIsIGtleVN0YXRlLmtleS5hYWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSB0byBleHRyYWN0IGNvbXBsZXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXNcbiAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7IC8vIEluY29tcGxldGUgZnJhbWUsIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcmFtZURhdGEgPSBidWZmZXIuc2xpY2UoXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFLFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoXG4gICAgICApO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpO1xuXG4gICAgICBsZXQgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChmcmFtZURhdGEpO1xuXG4gICAgICAvLyBJZiB0aGUgZnJhbWUgcGF5bG9hZCBpcyBlbmNyeXB0ZWQgb3Igc2VhbGVkLCByZWNvdmVyIGl0IGZpcnN0IHRvXG4gICAgICAvLyByZXZlYWwgdGhlIGlubmVyIGZvcm1hdC1wcmVmaXhlZCBkYXRhIChlLmcuLCAnZGV2bCcgKyBzZXJpYWxpemVkXG4gICAgICAvLyB0ZXh0KSwgdGhlbiBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24gcGF0aC5cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCB8fFxuICAgICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVEXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VhbGVkID0gZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRDtcbiAgICAgICAgLy8gQSBzZWFsZWQgZnJhbWUgbmVlZHMgdGhlIHJ1bidzIGtleXBhaXI7IGEgc3ltbWV0cmljIGZyYW1lIG5lZWRzIGFuXG4gICAgICAgIC8vIEFFUyBrZXkuIFJlcG9ydCB0aGUgc2hvcnRmYWxsIHByZWNpc2VseTogXCJubyBrZXkgYXQgYWxsXCIgYW5kIFwidGhlXG4gICAgICAgIC8vIHdyb25nIGtpbmQgb2Yga2V5XCIgaGF2ZSBkaXN0aW5jdCBjYXVzZXMuXG4gICAgICAgIGNvbnN0IHVzYWJsZSA9IHNlYWxlZFxuICAgICAgICAgID8gaXNSdW5QYXlsb2FkS2V5cyhrZXlTdGF0ZS5rZXkpXG4gICAgICAgICAgOiBhZXNLZXlPZihrZXlTdGF0ZS5rZXkpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghdXNhYmxlKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgICAgICAgICBzZWFsZWRcbiAgICAgICAgICAgICAgICA/ICdTZWFsZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIHJ1biBrZXlwYWlyIGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgIFwiT3BlbmluZyBhIHNlYWxlZCBmcmFtZSByZXF1aXJlcyB0aGUgcnVuJ3Mgb3duIGVuY3J5cHRpb24ga2V5IG1hdGVyaWFsLlwiXG4gICAgICAgICAgICAgICAgOiAnRW5jcnlwdGVkIHN0cmVhbSBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBlbmNyeXB0aW9uIGtleSBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAgICAgICAgICAgICAnRW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZCBvciBubyBrZXkgd2FzIHByb3ZpZGVkIGZvciB0aGlzIHJ1bi4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBwYXlsb2FkLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICBmb3JtYXRQcmVmaXg6IHNlYWxlZCA/ICdlbmNwJyA6ICdlbmNyJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlY3J5cHRlZDogVWludDhBcnJheTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTZWFsZWQgZnJhbWVzIGdvIHRocm91Z2ggdGhlIHNlc3Npb24gc28gcmVwZWF0ZWQgZnJhbWVzIGZyb20gb25lXG4gICAgICAgICAgLy8gd3JpdGVyIHJldXNlIGEgc2luZ2xlIGRlY2Fwc3VsYXRpb24uIEV2ZXJ5dGhpbmcgZWxzZSBkZWxlZ2F0ZXMgdG9cbiAgICAgICAgICAvLyB0aGUgc2hhcmVkIGVudmVsb3BlIGxheWVyLCBrZWVwaW5nIHRoZSB0d28gc2NoZW1lcyBpbiBsb2Nrc3RlcFxuICAgICAgICAgIC8vIHdpdGggdGhlIG9uZS1zaG90IHBhdGguXG4gICAgICAgICAgZGVjcnlwdGVkID0gc2VhbGVkXG4gICAgICAgICAgICA/IGF3YWl0IG9wZW5TZXNzaW9uIS5vcGVuKGRlY29kZUZvcm1hdFByZWZpeChmcmFtZURhdGEpLnBheWxvYWQpXG4gICAgICAgICAgICA6ICgoYXdhaXQgZGVjcnlwdChmcmFtZURhdGEsIGtleVN0YXRlLmtleSkpIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBsb3ctbGV2ZWwgY3J5cHRvIGxheWVyIG9ubHkgc2VlcyB0aGUgc3RyaXBwZWQgcGF5bG9hZCwgc28gaXRcbiAgICAgICAgICAvLyBjYW5ub3QgcmVjb3JkIHRoZSBvdXRlciBlbnZlbG9wZSBwcmVmaXguIFdlIHBlZWtlZCBpdCBoZXJlLCBzb1xuICAgICAgICAgIC8vIGVucmljaCB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHdpdGggdGhlIHJlYWwgZm9ybWF0IHByZWZpeCBiZWZvcmVcbiAgICAgICAgICAvLyBwcm9wYWdhdGluZywgbWlycm9yaW5nIHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50cy5cbiAgICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikgJiYgZXJyb3IuY29udGV4dCkge1xuICAgICAgICAgICAgZXJyb3IuY29udGV4dC5mb3JtYXRQcmVmaXggPSBmb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgICh7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRlY3J5cHRlZCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UodGV4dCwgcmV2aXZlcnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgLy8gRmlyc3QsIHRyeSB0byBkZXRlY3QgaWYgdGhpcyBpcyBsZW5ndGgtcHJlZml4ZWQgZnJhbWVkIGRhdGFcbiAgICAgIC8vIGJ5IGNoZWNraW5nIGlmIHRoZSBmaXJzdCA0IGJ5dGVzIGZvcm0gYSBwbGF1c2libGUgbGVuZ3RoLlxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgY2h1bmsubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGNodW5rLmJ1ZmZlcixcbiAgICAgICAgICBjaHVuay5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGNodW5rLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPCAxMDBfMDAwXzAwMCAvLyBzYW5pdHkgY2hlY2s6IDwgMTAwTUJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTG9va3MgbGlrZSBmcmFtZWQgZGF0YVxuICAgICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBbHJlYWR5IGluIGZyYW1lZCBtb2RlIChoYXZlIGJ1ZmZlcmVkIGRhdGEpXG4gICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgZm9ybWF0OiBuZXdsaW5lLWRlbGltaXRlZCBkZXZhbHVlIHRleHQgKG5vIGZyYW1pbmcpXG4gICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUoY2h1bmspO1xuICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKGxpbmUsIHJldml2ZXJzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFByb2Nlc3MgYW55IHJlbWFpbmluZyBmcmFtZWQgZGF0YVxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ5dGUtc3RyZWFtIHdpcmUgZnJhbWluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4vLyBhcmUgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB3b3JsZCdzIHN0cmVhbSB0cmFuc3BvcnQgb25lIHVzZXIgY2h1bmsgYXRcbi8vIGEgdGltZS4gV2l0aG91dCBhbiBpbi1iYW5kIGVudmVsb3BlLCB0aGUgcmVhZGVyIHNlZXMgYSBmbGF0IHN0cmVhbSBvZlxuLy8gYnl0ZXM6IHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHdoZXJlIG9uZSB1c2VyIGNodW5rIGVuZHMgYW5kIHRoZSBuZXh0XG4vLyBiZWdpbnMsIHdoaWNoIG1ha2VzIG1pZC1zdHJlYW0gcmVjb25uZWN0IGltcG9zc2libGUgKHdlIGRvbid0IGtub3cgaG93XG4vLyBtYW55IHNlcnZlci1zaWRlIGNodW5rcyBoYXZlIGJlZW4gY29uc3VtZWQpLlxuLy9cbi8vIFRvIGVuYWJsZSB0cmFuc3BhcmVudCByZWNvbm5lY3QsIHRoaXMgUFIgaW50cm9kdWNlcyBhbiBvcHQtaW4gd2lyZVxuLy8gZW52ZWxvcGUgdGhhdCB3cmFwcyBlYWNoIHVzZXIgY2h1bmsgaW4gYSBsZW5ndGgtcHJlZml4OlxuLy9cbi8vICAgWzQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aF1bdXNlciBwYXlsb2FkIGJ5dGVzXVxuLy9cbi8vIFRoZSBlbnZlbG9wZSBpcyBpZGVudGljYWwgaW4gc2hhcGUgdG8gYGdldFNlcmlhbGl6ZVN0cmVhbWAncyBmcmFtaW5nLFxuLy8gYnV0IHRoZSBwYXlsb2FkIGhlcmUgaXMgKnJhdyB1c2VyIGJ5dGVzKjogdGhlcmUgaXMgbm8gaW5uZXJcbi8vIGZvcm1hdC1wcmVmaXgsIG5vIGRldmFsdWUsIG5vIGVuY3J5cHRpb24uIEEgZnJhbWVkIGJ5dGUgc3RyZWFtIHN0YXlzXG4vLyBzZW1hbnRpY2FsbHkgYSBieXRlIHN0cmVhbSBlbmQtdG8tZW5kOyB0aGUgZnJhbWluZyBpcyBwdXJlbHkgdHJhbnNwb3J0LlxuLy9cbi8vIFRoZSBkZWNpc2lvbiB0byB1c2UgZnJhbWluZyBmb3IgYSBnaXZlbiBzdHJlYW0gaXMgcmVjb3JkZWQgaW4gdGhlXG4vLyBzZXJpYWxpemVkIHN0cmVhbSByZWYgKGBmcmFtaW5nOiAnZnJhbWVkLXYxJ2ApLCBzbyBib3RoIHNpZGVzIGFncmVlIG9uXG4vLyB0aGUgd2lyZSBmb3JtYXQgd2l0aG91dCBydW50aW1lIG5lZ290aWF0aW9uLiBQcm9kdWNlcnMgdGhhdCB0YXJnZXQgYVxuLy8gcnVuIHdob3NlIGRlcGxveW1lbnQgZG9lc24ndCBzdXBwb3J0IGZyYW1pbmcgKHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYFxuLy8gaW4gY2FwYWJpbGl0aWVzLnRzKSBlbWl0IHJhdyBieXRlcyBhbmQgYSByZWYgd2l0aG91dCB0aGUgZmllbGQsIHdoaWNoXG4vLyB0aGUgcmVhZGVyIHRyZWF0cyBhcyBsZWdhY3kgcmF3IGJ5dGVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuLyoqXG4gKiBNYXhpbXVtIGFsbG93ZWQgYnl0ZS1zdHJlYW0gZnJhbWUgcGF5bG9hZCBzaXplICgxMDBNQikuIFNoYXJlZCBieSB0aGVcbiAqIGZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgdXNlciBjaHVua3MgYXQgd3JpdGUgdGltZSwgd2hlcmUgdGhlIGVycm9yIGlzXG4gKiBhY3Rpb25hYmxlKSBhbmQgdGhlIHVuZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCBsZW5ndGggaGVhZGVycyBhdCByZWFkXG4gKiB0aW1lLCB3aGljaCB1c3VhbGx5IGluZGljYXRlIGEgbm9uLWZyYW1lZCB3aXJlIGJlaW5nIHJlYWQgYXMgZnJhbWVkKS5cbiAqIEtlZXBpbmcgYm90aCBzaWRlcyBvbiBvbmUgY29uc3RhbnQgZ3VhcmFudGVlcyBhbnkgY2h1bmsgdGhlIGZyYW1lclxuICogYWNjZXB0cyBjYW4gYWx3YXlzIGJlIGRlY29kZWQgYnkgdGhlIHVuZnJhbWVyLlxuICovXG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEwMF8wMDBfMDAwO1xuXG4vKipcbiAqIFdyYXBzIGVhY2ggY2h1bmsgb2YgYSBieXRlIHN0cmVhbSBpbiBhIDQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aFxuICogcHJlZml4LiBVc2VkIGJ5IHRoZSBwcm9kdWNlciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogRW1wdHkgY2h1bmtzIChsZW5ndGggMCkgYXJlIGRyb3BwZWQ6IHRoZSByZXN1bHRpbmcgYFsweDAwIDB4MDAgMHgwMCAweDAwXWBcbiAqIGZyYW1lIHdvdWxkIGJlIGFtYmlndW91cyB3aXRoIHRoZSBsZWdhY3kgXCJsb29rcyBmcmFtZWRcIiBkZXRlY3Rpb24gaW5cbiAqIGBnZXREZXNlcmlhbGl6ZVN0cmVhbWAsIGFuZCBpdCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLlxuICpcbiAqIExvYWQtYmVhcmluZyBpbnZhcmlhbnQ6IGVhY2ggdXNlciBjaHVuayBiZWNvbWVzIGV4YWN0bHkgb25lIGZyYW1lLCBhbmRcbiAqIGVhY2ggZnJhbWUgaXMgZW5xdWV1ZWQgYXMgZXhhY3RseSBvbmUgdHJhbnNwb3J0IGNodW5rICh0aGUgZG93bnN0cmVhbVxuICogd3JpdGFibGUgcGVyZm9ybXMgb25lIHdpcmUgd3JpdGUgcGVyIGNodW5rLCBwcmVzZXJ2aW5nIGJvdW5kYXJpZXMpLiBUaGVcbiAqIHNlcnZlciB0aGVyZWZvcmUgc3RvcmVzIG9uZSBmcmFtZSBwZXIgY2h1bmsgaW5kZXgsIHdoaWNoIGlzIHdoYXQgYWxsb3dzXG4gKiBhIGZ1dHVyZSByZWNvbm5lY3RpbmcgcmVhZGVyIHRvIHJlc3VtZSBhIGZyYW1lZCBieXRlIHN0cmVhbSBhdFxuICogYHN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AsIHRoZSBzYW1lIGFyaXRobWV0aWNcbiAqIGBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW1gIHJlbGllcyBvbiBmb3Igb2JqZWN0IHN0cmVhbXMuIERvIG5vdFxuICogY29hbGVzY2Ugb3Igc3BsaXQgZnJhbWVzIGhlcmUgd2l0aG91dCByZXZpc2l0aW5nIHRoYXQgcmVzdW1lIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGNodW5rIG9mICR7Y2h1bmsubGVuZ3RofSBieXRlcyBleGNlZWRzIHRoZSBtYXhpbXVtIGAgK1xuICAgICAgICAgICAgICBgZnJhbWVkIGNodW5rIHNpemUgKCR7TUFYX0ZSQU1FX1NJWkV9KS4gU3BsaXQgdGhlIGRhdGEgaW50byBgICtcbiAgICAgICAgICAgICAgYHNtYWxsZXIgY2h1bmtzIGJlZm9yZSB3cml0aW5nLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIGNodW5rLmxlbmd0aCk7XG4gICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgY2h1bmsubGVuZ3RoLCBmYWxzZSk7XG4gICAgICBmcmFtZS5zZXQoY2h1bmssIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVW53cmFwcyBsZW5ndGgtcHJlZml4ZWQgYnl0ZS1zdHJlYW0gZnJhbWVzIGJhY2sgaW50byB0aGUgb3JpZ2luYWwgdXNlclxuICogY2h1bmtzLiBVc2VkIGJ5IHRoZSBjb25zdW1lciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogQnVmZmVycyBhY3Jvc3MgcmVhZCBib3VuZGFyaWVzLCBzaW5jZSB0aGUgdHJhbnNwb3J0IG1heSBzcGxpdCBhIHNpbmdsZVxuICogZnJhbWUgYWNyb3NzIG11bHRpcGxlIHJlYWRzIChoZWFkZXIgaW4gb25lIGNodW5rLCBwYXlsb2FkIGluIGFub3RoZXIpXG4gKiBvciBjb2FsZXNjZSBtdWx0aXBsZSBmcmFtZXMgaW50byBhIHNpbmdsZSByZWFkLiBUaGUgdHJhbnNmb3JtIGVtaXRzXG4gKiB3aG9sZSB1c2VyIGNodW5rcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAqXG4gKiBFcnJvcnMgdGhlIHN0cmVhbSBpZiB0aGUgbGVuZ3RoIGhlYWRlciBhZHZlcnRpc2VzIGEgZnJhbWUgbGFyZ2VyIHRoYW5cbiAqIGBNQVhfRlJBTUVfU0laRWAgYnl0ZXMsIHNpbmNlIHRoYXQgYWxtb3N0IGNlcnRhaW5seSBpbmRpY2F0ZXMgYVxuICogbWlzZnJhbWVkIHdpcmUgKGUuZy4gYSByYXcgYnl0ZSBzdHJlYW0gYmVpbmcgZmVkIHRocm91Z2ggdGhpcyB0cmFuc2Zvcm1cbiAqIGJ5IG1pc3Rha2UpIGFuZCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFuIGVub3Jtb3VzIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXh0LnNldChidWZmZXIsIDApO1xuICAgIG5leHQuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5leHQ7XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gMCkgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuXG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgICBpZiAoZnJhbWVMZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBmcmFtZSBsZW5ndGggJHtmcmFtZUxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtICgke01BWF9GUkFNRV9TSVpFfSkuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIHVzdWFsbHkgbWVhbnMgYSBub24tZnJhbWVkIGJ5dGUgc3RyZWFtIGlzIGJlaW5nIHJlYWQgYXMgZnJhbWVkLmAsXG4gICAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuXG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUsIHRvdGFsKSk7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZW5kZWQgd2l0aCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIG9mIGluY29tcGxldGUgZnJhbWUgZGF0YS4gYCArXG4gICAgICAgICAgICAgIGBUaGUgc3RyZWFtIHdhcyB0cnVuY2F0ZWQgbWlkLWZyYW1lLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgZW5kLXRvLWVuZCB0aW1lLXRvLWZpcnN0LWNodW5rIHNwYW4gZm9yIGEgbGl2ZSByZWFkOlxuICogcmVhZCBkaXNwYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoaW5nIHRoZVxuICogcmVhZGVyLCBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXIsXG4gIGNvbm5lY3RNcz86IG51bWJlclxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLnJlYWQnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdyZWFkJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnR0ZmNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAuLi4odHlwZW9mIGNvbm5lY3RNcyA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNvbm5lY3RfbXMnOiBjb25uZWN0TXMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odHlwZW9mIHN0YXJ0SW5kZXggPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0uc3RhcnRfaW5kZXgnOiBzdGFydEluZGV4IH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHJlYWQtY29tcGxldGlvbiBzcGFuIHdoZW4gYSBzdHJlYW0gcmVhZCBkcmFpbnM6XG4gKiBiYWNrLWRhdGVkIHRvIHRoZSByZWFkIGRpc3BhdGNoLCBzbyBpdHMgZHVyYXRpb24gaXMgdGhlIHRvdGFsIHJlYWQsIHdpdGhcbiAqIGNodW5rL2J5dGUgY291bnRzIGZvciB0aHJvdWdocHV0LiBDYW5jZWxsZWQgcmVhZHMgZW1pdCBub3RoaW5nLiBGaXJlLWFuZC1cbiAqIGZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJlY29ubmVjdHM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNvbXBsZXRlJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZF9jb21wbGV0ZScsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50b3RhbF9tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jaHVua3MnOiBjaHVua0NvdW50LFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuYnl0ZXMnOiBieXRlQ291bnQsXG4gICAgICAgIC4uLih0eXBlb2YgcmVjb25uZWN0cyA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnJlY29ubmVjdHMnOiByZWNvbm5lY3RzIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtIGV4dGVuZHMgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICAjcmVhZGVyPzogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+O1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3RhcnRJbmRleD86IG51bWJlcikge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihgXCJuYW1lXCIgaXMgcmVxdWlyZWQsIGdvdCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgdGltZS10by1maXJzdC1jaHVuayBzdGF0ZS4gYHJlYWRTdGFydGAgaXMgc3RhbXBlZCB3aGVuIHRoZVxuICAgIC8vIHJlYWRlciBzdGFydHMgY29uc3VtaW5nIChmaXJzdCBwdWxsIOKGkiB0aGUgcmVhZCBkaXNwYXRjaCk7IHRoZSBzcGFuIGlzXG4gICAgLy8gZW1pdHRlZCBvbmNlLCB3aGVuIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hlcyB0aGUgcmVhZGVyLiBTbyBpdHNcbiAgICAvLyBkdXJhdGlvbiBpcyB0aGUgZW5kLXRvLWVuZCBUVEZDIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIE5vLW9wIHdpdGhvdXRcbiAgICAvLyBhbiBPcGVuVGVsZW1ldHJ5IFNESyByZWdpc3RlcmVkLlxuICAgIGxldCByZWFkU3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmlyc3RDaHVua1JlcG9ydGVkID0gZmFsc2U7XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIGNvbm5lY3QgZHVyYXRpb246IHRoZSB3b3JsZC5zdHJlYW1zLmdldCBhd2FpdCAocmVhZFxuICAgIC8vIGRpc3BhdGNoIC0+IHN0cmVhbSBoYW5kbGUgLyByZXNwb25zZSBoZWFkZXJzKS4gU3RhbXBlZCBvbiB0aGVcbiAgICAvLyB3b3JrZmxvdy5zdHJlYW0ucmVhZCBzcGFuIG9uY2UgdGhlIGZpcnN0IGNodW5rIGFycml2ZXMuXG4gICAgbGV0IGNvbm5lY3RNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFJlYWQtY29tcGxldGlvbiBjb3VudGVycyBmb3IgdGhlIHdvcmtmbG93LnN0cmVhbS5yZWFkLmNvbXBsZXRlIHNwYW5cbiAgICAvLyBlbWl0dGVkIHdoZW4gdGhlIHN0cmVhbSBkcmFpbnMuXG4gICAgbGV0IGNodW5rc0RlbGl2ZXJlZCA9IDA7XG4gICAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcbiAgICBzdXBlcih7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vdCBzdXJlIHdoeSBUeXBlU2NyaXB0IGlzIGNvbXBsYWluaW5nIGFib3V0IHRoaXNcbiAgICAgIHR5cGU6ICdieXRlcycsXG5cbiAgICAgIHB1bGw6IGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIGxldCByZWFkZXIgPSB0aGlzLiNyZWFkZXI7XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICAgICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgY29ubmVjdE1zID0gRGF0ZS5ub3coKSAtIGNvbm5lY3RTdGFydDtcbiAgICAgICAgICByZWFkZXIgPSB0aGlzLiNyZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCByZWFkZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjaHVua3NEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHNlcnZlciBmbHVzaGVzIGEgbGVhZGluZyB6ZXJvLWxlbmd0aCBjaHVuayAodjMrKSB0byBjb21taXRcbiAgICAgICAgICAvLyByZXNwb25zZSBoZWFkZXJzIGJlZm9yZSBhbnkgZGF0YTsgc2tpcCBlbXB0aWVzIHNvIFRURkMgbWVhc3VyZXMgdG9cbiAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVhbCBjaHVuay5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhZmlyc3RDaHVua1JlcG9ydGVkICYmXG4gICAgICAgICAgICByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2h1bmtzRGVsaXZlcmVkICs9IDE7XG4gICAgICAgICAgYnl0ZXNEZWxpdmVyZWQgKz0gcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgLy8gRm9yd2FyZCByYXcgYnl0ZXM7IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBoYW5kbGVkIGF0IHRoZVxuICAgICAgICAgIC8vIGZyYW1pbmcgbGV2ZWwgYnkgZ2V0U2VyaWFsaXplU3RyZWFtL2dldERlc2VyaWFsaXplU3RyZWFtLlxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZWFkZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLiNyZWFkZXIuY2FuY2VsKHJlYXNvbikuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1heGltdW0gY29uc2VjdXRpdmUgcmVjb25uZWN0IGF0dGVtcHRzIGZvciBhIHNpbmdsZSBmcmFtZWQgc3RyZWFtIHNlc3Npb24uXG4gKiBUaGUgY291bnRlciByZXNldHMgdG8gemVybyB3aGVuZXZlciBhIHJlY29ubmVjdCBtYWtlcyBmb3J3YXJkIHByb2dyZXNzIChhXG4gKiBmcmFtZSBpcyBkZWxpdmVyZWQpLCBzbyB0aGlzIGJvdW5kcyAqY29uc2VjdXRpdmUqIGZhaWx1cmVzLCBub3QgdGhlIGxpZmV0aW1lXG4gKiB0b3RhbDogYSBsb25nLWxpdmVkIHNlcnZlcmxlc3Mgc3RyZWFtIG1heSBsZWdpdGltYXRlbHkgcmVjb25uZWN0IGZhciBtb3JlXG4gKiB0aGFuIHRoaXMgbWFueSB0aW1lcyBhcyBsb25nIGFzIGVhY2ggcmVjb25uZWN0IGtlZXBzIGRlbGl2ZXJpbmcgZGF0YS4gV2Ugb25seVxuICogZ2l2ZSB1cCBhZnRlciB0aGlzIG1hbnkgcmVjb25uZWN0cyBpbiBhIHJvdyBwcm9kdWNlIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTID0gNTA7XG5cbi8qKiBFZmZlY3RpdmUgY29uc2VjdXRpdmUtcmVjb25uZWN0IGNhcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFJlY29ubmVjdHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUycsXG4gICAgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyxcbiAgICB7XG4gICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgbWluOiAxLFxuICAgIH1cbiAgKTtcblxuLyoqXG4gKiBBYnNvbHV0ZSBiYWNrc3RvcCBvbiB0b3RhbCByZWNvbm5lY3RzIGZvciBhIHNpbmdsZSBzZXNzaW9uLCBpbmRlcGVuZGVudCBvZlxuICogcHJvZ3Jlc3MuIFRoZSBjb25zZWN1dGl2ZSBjYXAgYWJvdmUgcmVzZXRzIG9uIGZvcndhcmQgcHJvZ3Jlc3MsIHdoaWNoIGlzXG4gKiBjb3JyZWN0IGZvciBhIHdlbGwtYmVoYXZlZCBiYWNrZW5kIHRoYXQgaG9ub3JzIGBzdGFydEluZGV4YC4gQnV0IGlmIGEgV29ybGQnc1xuICogYHN0cmVhbXMuZ2V0YCBldmVyIGlnbm9yZWQgYHN0YXJ0SW5kZXhgIGFuZCByZS1kZWxpdmVyZWQgZWFybGllciBjaHVua3MsXG4gKiBcInByb2dyZXNzXCIgd291bGQgYmUgcmVwb3J0ZWQgZXZlcnkgcmVjb25uZWN0IGFuZCB0aGUgY29uc2VjdXRpdmUgY2FwIHdvdWxkXG4gKiBuZXZlciB0cmlwLCB0dXJuaW5nIGEgYm91bmRlZCBmYWlsdXJlIGludG8gYW4gdW5ib3VuZGVkIHJlY29ubmVjdCBsb29wLiBUaGlzXG4gKiBoYXJkIGNlaWxpbmcgZ3VhcmFudGVlcyB0aGUgbG9vcCBhbHdheXMgdGVybWluYXRlcy4gSXQgaXMgc2V0IGhpZ2ggZW5vdWdoXG4gKiAoaG91cnMgb2Ygc3RyZWFtaW5nIGF0IHJlYWxpc3RpYyBwZXItc2Vzc2lvbiB0aW1lb3V0cykgdG8gbmV2ZXIgaW50ZXJmZXJlXG4gKiB3aXRoIGxlZ2l0aW1hdGUgbG9uZy1saXZlZCBzdHJlYW1zLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUyA9IDEwMDA7XG5cbi8qKiBFZmZlY3RpdmUgdG90YWwtcmVjb25uZWN0IGJhY2tzdG9wLiBPdmVycmlkZTogYFdPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFNgLiAqL1xuY29uc3QgZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xuXG4vKipcbiAqIFdyYXBzIHRoZSBsZW5ndGgtcHJlZml4LWZyYW1lZCBieXRlIHN0cmVhbSBmcm9tIGB3b3JsZC5zdHJlYW1zLmdldGAgd2l0aFxuICogdHJhbnNwYXJlbnQgYXV0by1yZWNvbm5lY3QuXG4gKlxuICogRXZlcnkgZnVsbHktZGVjb2RlZCBvdXRlciBmcmFtZSBjb3JyZXNwb25kcyB0byBleGFjdGx5IG9uZSBzZXJ2ZXItc2lkZVxuICogY2h1bmsgKHRoZSBzZXJpYWxpemUgdHJhbnNmb3JtIGVucXVldWVzIG9uZSBmcmFtZSBwZXIgd29ya2Zsb3cgd3JpdGUsIGFuZFxuICogdGhlIHdyaXRhYmxlIGJ1ZmZlcnMgb25lIGZyYW1lIHBlciBjaHVuayB3aGVuIG11bHRpLXdyaXRpbmcpLiBUaGUgd3JhcHBlclxuICogY291bnRzIGNvbXBsZXRlZCBmcmFtZXMgYW5kLCBvbiB1cHN0cmVhbSBlcnJvciwgcmVvcGVucyB0aGUgY29ubmVjdGlvblxuICogd2l0aCBgc3RhcnRJbmRleCA9IHJlc29sdmVkU3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYC4gUGFydGlhbC1mcmFtZVxuICogYnl0ZXMgYnVmZmVyZWQgYmVmb3JlIHRoZSBjdXQgYXJlIGRpc2NhcmRlZDsgdGhlIHNlcnZlciB3aWxsIHJlc2VuZCB0aGVcbiAqIGluLWZsaWdodCBjaHVuayBpbiBmdWxsIGZyb20gdGhlIG5ldyBzdGFydEluZGV4LlxuICpcbiAqIEEgY2xlYW4gdXBzdHJlYW0gY2xvc2UgKEVPRiB3aXRoIG5vIGVycm9yKSBpcyBOT1QgdHJ1c3RlZCBhcyBjb21wbGV0aW9uXG4gKiBvbiBpdHMgb3duOiBzb21lIHRyYW5zcG9ydCBwYXRocyBub3JtYWxpemUgYSBtaWQtc3RyZWFtIGFib3J0IGludG8gYVxuICogZ3JhY2VmdWwgZW5kIChvYnNlcnZlZCBpbiBwcm9kdWN0aW9uIG9uIFZlcmNlbCByZXNwb25zZSBzdHJlYW1pbmcsIHdoZXJlXG4gKiB0aGUgc2VydmVyJ3MgbWF4LWR1cmF0aW9uIGFib3J0IGFycml2ZXMgYXQgdGhlIGNsaWVudCBhcyBhIGNsZWFuIEVPRikuXG4gKiBPbiBFT0YgdGhlIHdyYXBwZXIgdmVyaWZpZXMgYWdhaW5zdCB0aGUgc3RyZWFtJ3MgYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YVxuICogKGBzdHJlYW1zLmdldEluZm9gKSB0aGF0IHRoZSBzdHJlYW0gaXMgY29tcGxldGUgQU5EIHRoYXQgZXZlcnkgY2h1bmsgdXAgdG9cbiAqIGBkb25lYCB3YXMgZGVsaXZlcmVkOyBvdGhlcndpc2UgaXQgcmVjb25uZWN0cyBmcm9tIHRoZSBuZXh0IGNodW5rIGV4YWN0bHlcbiAqIGxpa2UgYW4gZXJyb3JlZCBjb25uZWN0aW9uLiBJZiB0aGUgbWV0YWRhdGEgcmVhZCBpdHNlbGYgZmFpbHMsIHRoZSBFT0YgaXNcbiAqIHRydXN0ZWQgKGxlZ2FjeSBiZWhhdmlvcikgcmF0aGVyIHRoYW4gZmFpbGluZyBhIHJlYWQgdGhhdCBtYXkgd2VsbCBiZVxuICogY29tcGxldGUuXG4gKlxuICogTmVnYXRpdmUgYHN0YXJ0SW5kZXhgIHZhbHVlcyAobGFzdC1OIHNlbWFudGljcykgc2tpcCB0aGUgcmVjb25uZWN0XG4gKiBtYWNoaW5lcnkgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcHV0ZSBhbiBhYnNvbHV0ZSByZXN1bWUgcG9zaXRpb24gd2l0aG91dFxuICogYSB0YWlsLWluZGV4IGxvb2t1cDsgdGhlIHJldHVybmVkIHN0cmVhbSBiZWhhdmVzIGFzIGEgc2luZ2xlLXNob3QgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyXG4pOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IHJlY29ubmVjdFN1cHBvcnRlZCA9IHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBzdGFydEluZGV4ID49IDA7XG4gIGxldCBjdXJyZW50U3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggPz8gMDtcbiAgbGV0IGNvbnN1bWVkRnJhbWVzID0gMDtcbiAgbGV0IHJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHRvdGFsUmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4gfCB1bmRlZmluZWQ7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVhZCB0ZWxlbWV0cnkgKHNhbWUgc2VtYW50aWNzIGFzIFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0pOlxuICAvLyBkaXNwYXRjaCB0aW1lLCBmaXJzdC1jb25uZWN0IGR1cmF0aW9uLCBmaXJzdC1mcmFtZSBsYXRjaCwgYW5kIHRvdGFscy5cbiAgbGV0IHJlYWRTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29ubmVjdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdENodW5rUmVwb3J0ZWQgPSBmYWxzZTtcbiAgbGV0IGNodW5rc0RlbGl2ZXJlZCA9IDA7XG4gIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG5cbiAgYXN5bmMgZnVuY3Rpb24gY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVN0YXJ0SW5kZXggPSByZWNvbm5lY3RTdXBwb3J0ZWRcbiAgICAgID8gY3VycmVudFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc1xuICAgICAgOiBzdGFydEluZGV4O1xuICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIGVmZmVjdGl2ZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChjb25uZWN0TXMgPT09IHVuZGVmaW5lZCkgY29ubmVjdE1zID0gRGF0ZS5ub3coKSAtIGNvbm5lY3RTdGFydDtcbiAgICByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhbiB1cHN0cmVhbSBFT0YgcmVwcmVzZW50cyBnZW51aW5lIGNvbXBsZXRpb246IHRoZSBzdHJlYW0nc1xuICAgKiBhdXRob3JpdGF0aXZlIG1ldGFkYXRhIHNheXMgaXQgaXMgZG9uZSBBTkQgdGhlIGZyYW1lcyBkZWxpdmVyZWQgc28gZmFyXG4gICAqIGNvdmVyIGV2ZXJ5IGNodW5rIHVwIHRvIHRoZSB0YWlsIChvbmUgb3V0ZXIgZnJhbWUgPT0gb25lIHNlcnZlciBjaHVuaykuXG4gICAqIEEgbWV0YWRhdGEgZmFpbHVyZSB0cnVzdHMgdGhlIEVPRiwgc2luY2UgdHVybmluZyBhIGhlYWx0aHkgY29tcGxldGlvblxuICAgKiBpbnRvIGFuIGVycm9yIChvciBhIHJlY29ubmVjdCBsb29wKSBvbiBhIHRyYW5zaWVudCBtZXRhZGF0YSBibGlwIHdvdWxkXG4gICAqIGJlIHdvcnNlIHRoYW4gdGhlIGxlZ2FjeSBiZWhhdmlvciB0aGlzIGNoZWNrIGd1YXJkcyBhZ2FpbnN0LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gaXNWZXJpZmllZENvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0SW5mbyhydW5JZCwgbmFtZSk7XG4gICAgICByZXR1cm4gaW5mby5kb25lICYmIGN1cnJlbnRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXMgPiBpbmZvLnRhaWxJbmRleDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVhZGVyKSB7XG4gICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBZHZhbmNlIHRoZSByZXN1bWUgcG9zaXRpb24gcGFzdCB0aGUgZnJhbWVzIGFscmVhZHkgZGVsaXZlcmVkLCB0aGVuXG4gICAgLy8gZHJvcCBhbnkgcGFydGlhbC1mcmFtZSBieXRlczogdGhlIHJlb3BlbmVkIGNvbm5lY3Rpb24gcmUtc2VuZHMgZnJvbSBhXG4gICAgLy8gZnJhbWUgYm91bmRhcnkgYXQgdGhlIG5ldyBpbmRleC5cbiAgICBjdXJyZW50U3RhcnRJbmRleCArPSBjb25zdW1lZEZyYW1lcztcbiAgICBjb25zdW1lZEZyYW1lcyA9IDA7XG4gICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAvLyBSZXRyeSB0aGUgcmVvcGVuIGl0c2VsZiBhZ2FpbnN0IHRoZSByZWNvbm5lY3QgYnVkZ2V0LiBBIHRyYW5zaWVudFxuICAgIC8vIGZhaWx1cmUgb2YgY29ubmVjdCgpICh0aGUgc2VydmVyIGJyaWVmbHkgdW5hdmFpbGFibGUgZHVyaW5nIHRoZVxuICAgIC8vIHJlY29ubmVjdCB3aW5kb3cpIGlzIHRoZSBleGFjdCBibGlwIHRoaXMgd3JhcHBlciBleGlzdHMgdG8gc3Vydml2ZSwgc29cbiAgICAvLyBjb3VudCBpdCBhZ2FpbnN0IHRoZSBidWRnZXQgYW5kIHRyeSBhZ2FpbiByYXRoZXIgdGhhbiB0cmVhdGluZyBpdCBhc1xuICAgIC8vIGZhdGFsLiBPbmx5IGJ1ZGdldCBleGhhdXN0aW9uIChhIHNlcnZlciB0aGF0IHN0YXlzIGRvd24pIHRlcm1pbmF0ZXMgdGhlXG4gICAgLy8gc3RyZWFtLlxuICAgIGNvbnN0IG1heFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzKCk7XG4gICAgY29uc3QgbWF4VG90YWxSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzKCk7XG4gICAgZm9yICg7Oykge1xuICAgICAgcmVjb25uZWN0Q291bnQrKztcbiAgICAgIHRvdGFsUmVjb25uZWN0Q291bnQrKztcbiAgICAgIGlmIChyZWNvbm5lY3RDb3VudCA+IG1heFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4UmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsUmVjb25uZWN0Q291bnQgPiBtYXhUb3RhbFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSB0b3RhbCByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4VG90YWxSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFJldGVudGlvbiBleHBpcnkgaXMgdGVybWluYWwgYW5kIHJldHJ5aW5nIGNhbm5vdCByZXN0b3JlIHRoZSBzdHJlYW0uXG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSB0eXBlZCBlcnJvciBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHR1cm5pbmcgb25lIDQxMCBpbnRvXG4gICAgICAgIC8vIDUwIHJlY29ubmVjdCBhdHRlbXB0cyBhbmQgYSBnZW5lcmljIGJ1ZGdldC1leGhhdXN0aW9uIGVycm9yLlxuICAgICAgICBpZiAoU3RyZWFtRXhwaXJlZEVycm9yLmlzKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgIC8vIFJlb3BlbiBmYWlsZWQgdHJhbnNpZW50bHk7IGxvb3AgdG8gcmV0cnksIGNvdW50aW5nIGFnYWluc3QgdGhlXG4gICAgICAgIC8vIGJ1ZGdldCBzbyBhIHNlcnZlciB0aGF0IG5ldmVyIHJlY292ZXJzIHN0aWxsIHRlcm1pbmF0ZXMgdGhlIHN0cmVhbS5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgLy8gTG9vcCB1bnRpbCB3ZSBlbWl0IHNvbWV0aGluZywgaGl0IEVPRiwgb3IgZmF0YWxseSBlcnJvci4gUmVhZHMgdGhhdFxuICAgICAgLy8gb25seSBleHRlbmQgdGhlIGluLWZsaWdodC1mcmFtZSBidWZmZXIgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZzsgd2VcbiAgICAgIC8vIGtlZXAgcmVhZGluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgZW1wdHktaGFuZGVkLlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDogeyBkb25lOiBib29sZWFuOyB2YWx1ZT86IFVpbnQ4QXJyYXkgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IGNvbm5lY3QoKSBndWFyYW50ZWVzIHJlYWRlclxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRlciEucmVhZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIXJlY29ubmVjdFN1cHBvcnRlZCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVjb25uZWN0KCk7XG4gICAgICAgICAgfSBjYXRjaCAocmVjb25uZWN0RXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKHJlY29ubmVjdEVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5kb25lIHx8ICFyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgLy8gQSBjbGVhbiBFT0YgaXMgb25seSB0cnVzdHdvcnRoeSBpZiB0aGUgc3RyZWFtIGlzIGFjdHVhbGx5XG4gICAgICAgICAgLy8gY29tcGxldGUgYW5kIHRoaXMgc2Vzc2lvbiBkZWxpdmVyZWQgZXZlcnkgY2h1bmsgdXAgdG8gYGRvbmVgLlxuICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIGNhbiBub3JtYWxpemUgYSBtaWQtc3RyZWFtIGFib3J0IGludG8gYSBncmFjZWZ1bFxuICAgICAgICAgIC8vIGVuZCAodGhlIHNlcnZlcidzIG1heC1kdXJhdGlvbiBjdXQgaXMgZGVzaWduZWQgdG8gYXJyaXZlIGFzIGFuXG4gICAgICAgICAgLy8gZXJyb3JlZCBib2R5LCBidXQgb24gc29tZSBwYXRocyBpdCByZWFjaGVzIHRoZSBjbGllbnQgYXMgYSBjbGVhblxuICAgICAgICAgIC8vIEVPRiksIGFuZCBhIGNvbXBsZXRlZCBzdHJlYW0gY2FuIHN0aWxsIGJlIGN1dCBtaWQtYm9keTsgYm90aFxuICAgICAgICAgIC8vIHdvdWxkIG90aGVyd2lzZSBiZSBzaWxlbnRseSByZWFkIGFzIGEgc2hvcnRlciwgY29tcGxldGUgc3RyZWFtLlxuICAgICAgICAgIGlmIChyZWNvbm5lY3RTdXBwb3J0ZWQgJiYgIShhd2FpdCBpc1ZlcmlmaWVkQ29tcGxldGUoKSkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHJlY29ubmVjdCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAocmVjb25uZWN0RXJyKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IocmVjb25uZWN0RXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEdlbnVpbmUgZW5kLW9mLXN0cmVhbS4gRHJvcCBhbnkgcGFydGlhbC1mcmFtZSBieXRlcyAodGhlcmVcbiAgICAgICAgICAvLyBzaG91bGRuJ3QgYmUgYW55OyBhIHdlbGwtZm9ybWVkIHN0cmVhbSBlbmRzIG9uIGEgZnJhbWUgYm91bmRhcnkpLlxuICAgICAgICAgIGlmIChyZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjaHVua3NEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICB0b3RhbFJlY29ubmVjdENvdW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIGJ1ZmZlciBhbmQgZW1pdCBhbGwgY29tcGxldGUgZnJhbWVzLlxuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKGluY29taW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBpbmNvbWluZy5sZW5ndGgpO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChidWZmZXIsIDApO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChpbmNvbWluZywgYnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgYnVmZmVyID0gY29tYmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW1pdHRlZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuICAgICAgICAgIC8vIEZvcndhcmQgdGhlIGVudGlyZSBmcmFtZWQgY2h1bmsgKGhlYWRlciArIHBheWxvYWQpIHRvIHRoZVxuICAgICAgICAgIC8vIGRvd25zdHJlYW0gZGVzZXJpYWxpemVyLCB3aGljaCBhbHJlYWR5IGV4cGVjdHMgdGhpcyBsYXlvdXQuXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZSgwLCB0b3RhbCkpO1xuICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICAgICAgY29uc3VtZWRGcmFtZXMrKztcbiAgICAgICAgICBjaHVua3NEZWxpdmVyZWQrKztcbiAgICAgICAgICBieXRlc0RlbGl2ZXJlZCArPSB0b3RhbDtcbiAgICAgICAgICBpZiAoIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJiByZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtaXR0ZWQpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHByb2dyZXNzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb246IGNsZWFyIHRoZVxuICAgICAgICAgIC8vIGNvbnNlY3V0aXZlLWZhaWx1cmUgYnVkZ2V0IHNvIGEgbG9uZyBzdHJlYW0gdGhhdCByZWNvbm5lY3RzXG4gICAgICAgICAgLy8gbWFueSB0aW1lcyAoYnV0IGtlZXBzIGRlbGl2ZXJpbmcpIGlzIG5ldmVyIGZhbHNlbHkgY2FwcGVkLlxuICAgICAgICAgIHJlY29ubmVjdENvdW50ID0gMDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBwYXJ0aWFsIGJ5dGVzOiByZWFkIG1vcmUuXG4gICAgICB9XG4gICAgfSxcbiAgICBjYW5jZWw6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZWFkZXIpIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGNsb3NpbmcgUmVhZGFibGVTdHJlYW0gcmVhZGVyOicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBncm91cC1jb21taXQgd2luZG93IGZvciB0aGUgTEVBRElORyBjaHVuayBvZiBhbiBpZGxlIHN0cmVhbS5cbiAqXG4gKiAwID0gZGlzcGF0Y2ggdGhlIGZpcnN0IGNodW5rIGltbWVkaWF0ZWx5LiBNZWFzdXJlZCBwcm9kdWN0aW9uIHByb2R1Y2VyXG4gKiByYXRlcyAobW9zdCBhZ2VudHM6IH4xLjIgY2h1bmtzIHBlciBmbHVzaCwgPjcwJSBvZiBjaHVua3MgYXJyaXZpbmcgbW9yZVxuICogdGhhbiAxMG1zIGFmdGVyIHRoZSBwcmV2aW91cyByZXF1ZXN0IGFscmVhZHkgZmluaXNoZWQpIHNob3cgYSBmaXhlZFxuICogbGVhZGluZy1lZGdlIHdpbmRvdyB0YXhlcyBpc29sYXRlZC1jaHVuayBkZWxpdmVyeSAofisyMCUgb24gYSB+NTBtcyBSVFQpXG4gKiB3aGlsZSBiYXRjaGluZyBhbG1vc3Qgbm90aGluZyBmb3Igc2xvdyBwcm9kdWNlcnM7IGZhc3QgcHJvZHVjZXJzIGdldFxuICogdGhlaXIgYmF0Y2hpbmcgZnJvbSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uIHJlZ2FyZGxlc3MuIFNldHRpbmcgYSBwb3NpdGl2ZVxuICogaW50ZXJ2YWwgKGVudiBvciBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYCkgb3B0cyBhIGRlcGxveW1lbnQgaW50b1xuICogd2luZG93ZWQgbGVhZGluZy1lZGdlIGJhdGNoaW5nLCB0cmFkaW5nIGZpcnN0LWNodW5rIGxhdGVuY3kgZm9yIGxhcmdlclxuICogZ3JvdXBzLlxuICovXG5jb25zdCBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMgPSAwO1xuXG4vKipcbiAqIGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCwgb3ZlcnJpZGVzXG4gKiBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYDsgd2hlbiB1bnNldCB0aGUgV29ybGQgb3B0aW9uIChvciB0aGVcbiAqIGRlZmF1bHQpIGdvdmVybnMuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIHVuc2V0L2ludmFsaWQgdmFsdWVzIHNvIHRoZVxuICogY2FsbGVyIGNhbiBmYWxsIHRocm91Z2ggdG8gdGhlIFdvcmxkIG9wdGlvbi5cbiAqL1xuY29uc3QgZ2V0RW52U3RyZWFtRmx1c2hJbnRlcnZhbE1zID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMnLCBOdW1iZXIuTmFOLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG59O1xuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciBvbmUgZmx1c2hlZCBiYXRjaCBvZiBzdHJlYW0gd3JpdGVzOiBmaXJzdFxuICogYHdyaXRlKClgIG9mIHRoZSBiYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgc2VydmVyIHdyaXRlIHNldHRsaW5nLiBUaGVcbiAqIHNwYW4ncyBkdXJhdGlvbiBpcyB0aGVyZWZvcmUgdGhlIGFwcC1wZXJjZWl2ZWQgbGF0ZW5jeSBvZiB0aGUgYmF0Y2hcbiAqIChidWZmZXIgZHdlbGwgKyBiYWNrcHJlc3N1cmUgKyBSUEMpOyBgYnVmZmVyX2R3ZWxsX21zYCBpc29sYXRlcyB0aGVcbiAqIHByZS1kaXNwYXRjaCBzaGFyZSBzbyBjbGllbnQtc2lkZSBiYXRjaGluZyBjb3N0IGNhbiBiZSB0b2xkIGFwYXJ0IGZyb21cbiAqIG5ldHdvcmsvc2VydmVyIHRpbWUuIE5hbWVkIGB3b3JrZmxvdy5zdHJlYW0uZmx1c2hgOyB0aGUgcGVyLXJlcXVlc3QgUlBDXG4gKiBiZW5lYXRoIGl0IGlzIHdvcmxkLXZlcmNlbCdzIGB3b3JrZmxvdy5zdHJlYW0ud3JpdGVgIHNwYW4gKGNodW5rX3J0dCksIGFuZFxuICogdGhlIHR3byBtdXN0IHN0YXkgZGlzdGluZ3Vpc2hhYmxlLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIGRpc3BhdGNoRXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJwY01zOiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5mbHVzaCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2ZsdXNoJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5idWZmZXJfZHdlbGxfbXMnOiBkaXNwYXRjaEVwb2NoTXMgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLy8gQ2xpZW50LW9ic2VydmVkIFdvcmxkIHdyaXRlIFJQQyBkdXJhdGlvbiAobmV0d29yayBob3AgaW5jbHVkZWQpLlxuICAgICAgICAvLyBTYW1lIGtleSBhcyB3b3JsZC12ZXJjZWwncyBwZXItcmVxdWVzdCBzcGFuIGF0dHJpYnV0ZSBzbyBxdWVyaWVzXG4gICAgICAgIC8vIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGljaCBsYXllciBlbWl0dGVkIGl0LlxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLndyaXRlLmNodW5rX3J0dCc6IHJwY01zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3IgdGhlIHN0cmVhbS1jbG9zZSBSUEM6IGl0cyBkdXJhdGlvbiBpcyB0aGVcbiAqIGB3b3JsZC5zdHJlYW1zLmNsb3NlYCByb3VuZCB0cmlwIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuIEZpcmUtYW5kLWZvcmdldDtcbiAqIG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtQ2xvc2UoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5jbG9zZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2Nsb3NlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5jbG9zZS5ycGNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gZXh0ZW5kcyBXcml0YWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcnVuUmVhZHlCYXJyaWVyIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGVcbiAgICogYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiB0aGUgc3RlcCBib2R5IHJ1bnNcbiAgICogb3B0aW1pc3RpY2FsbHkgKGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUpLCB0aGUgZmlyc3QgY2h1bmsgd3JpdGUgdG9cbiAgICogYSBicmFuZC1uZXcgc3RyZWFtIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgV29ybGQgYmVmb3JlIHRoZSBydW4gZXhpc3RzXG4gICAqIGFuZCBiZSByZWplY3RlZCBhcyBydW4tbm90LWZvdW5kLiBBd2FpdGluZyB0aGlzIG9uY2UgYmVmb3JlIHRoZSBmaXJzdFxuICAgKiBmbHVzaC9jbG9zZSBvcmRlcnMgdGhlIHdyaXRlIGFmdGVyIHRoZSBydW4ncyBjcmVhdGlvbi4gYHVuZGVmaW5lZGAgb3V0c2lkZVxuICAgKiB0dXJibyBhbmQgb24gdGhlIGF3YWl0IHBhdGgsIHdoZXJlIHRoZSBydW4gd2FzIGFscmVhZHkgZHVyYWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPikge1xuICAgIGlmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBcInJ1bklkXCIgbXVzdCBiZSBhIHN0cmluZywgZ290IFwiJHt0eXBlb2YgcnVuSWR9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAvLyBIb2xkIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgdW50aWwgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAvLyBzdGFydCkuIEF3YWl0ZWQgb25jZSwgdGhlbiBjbGVhcmVkIHNvIGxhdGVyIGZsdXNoZXMgcGF5IG5vdGhpbmcuIFRoZVxuICAgIC8vIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHkgZmFpbGVkXG4gICAgLy8gdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHdyaXRlIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yLlxuICAgIGxldCBwZW5kaW5nUnVuUmVhZHk6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBydW5SZWFkeUJhcnJpZXI7XG4gICAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAocGVuZGluZ1J1blJlYWR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcGVuZGluZ1J1blJlYWR5O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1J1blJlYWR5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBHcm91cC1jb21taXQgYnVmZmVyaW5nLlxuICAgIC8vXG4gICAgLy8gYHdyaXRlKClgIHJlc29sdmVzIGFzIHNvb24gYXMgdGhlIGNodW5rIGVudGVycyB0aGlzIGJvdW5kZWQgYnVmZmVyLFxuICAgIC8vIE5PVCB3aGVuIGl0IGlzIGR1cmFibGUuIFRoYXQgaXMgdGhlIHByb3BlcnR5IHRoYXQgbWFrZXMgYmF0Y2hpbmdcbiAgICAvLyBwYXRoLWluZGVwZW5kZW50OiBhIG5hdGl2ZSBgcmVhZGFibGUucGlwZVRvKHNlcnZlcldyaXRhYmxlKWAgcHVsbHMgdGhlXG4gICAgLy8gbmV4dCBjaHVuayB0aGUgbW9tZW50IGB3cml0ZSgpYCByZXNvbHZlcywgc28gY2h1bmtzIGFjY3VtdWxhdGUgaGVyZVxuICAgIC8vIGR1cmluZyB0aGUgZmx1c2gtdGltZXIgd2luZG93IGFuZCB3aGlsZSBhIHNlcnZlciByZXF1ZXN0IGlzIGluXG4gICAgLy8gZmxpZ2h0LCBhbmQgZWFjaCBhY2N1bXVsYXRlZCBncm91cCBnb2VzIG91dCBhcyBvbmUgYHdyaXRlTXVsdGlgLlxuICAgIC8vIChQcmV2aW91c2x5IGB3cml0ZSgpYCByZXNvbHZlZCBvbmx5IGFmdGVyIHRoZSB0aW1lciBBTkQgdGhlIHNlcnZlclxuICAgIC8vIHJvdW5kIHRyaXAsIHNvIG5hdGl2ZSBwaXBpbmcgc2VyaWFsaXplZCB0byBvbmUgcmVxdWVzdCBwZXIgY2h1bmsgYW5kXG4gICAgLy8gYmF0Y2hpbmcgb25seSB3b3JrZWQgdGhyb3VnaCBgZmx1c2hhYmxlUGlwZWAncyBiZXNwb2tlIGNvYWxlc2NpbmcuKVxuICAgIC8vXG4gICAgLy8gRHVyYWJpbGl0eSBoYXMgYSBkZWRpY2F0ZWQgYmFycmllciBpbnN0ZWFkOiBgZHJhaW4oKWAgKGV4cG9zZWQgdmlhXG4gICAgLy8ge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9KSByZXNvbHZlcyBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgIC8vIGFuZCBubyByZXF1ZXN0IGlzIGluIGZsaWdodC4gYGNsb3NlKClgIGF3YWl0cyBpdCBiZWZvcmUgY2xvc2luZyB0aGVcbiAgICAvLyBzZXJ2ZXIgc3RyZWFtLCBhbmQgdGhlIGZsdXNoYWJsZS1zdHJlYW0gbG9jay1yZWxlYXNlIGNvbXBsZXRpb25cbiAgICAvLyBhd2FpdHMgaXQgYmVmb3JlIGxldHRpbmcgYSBzdGVwIGZpbmlzaCwgc28gXCJzdGVwIGNvbXBsZXRlZFwiIHN0aWxsXG4gICAgLy8gaW1wbGllcyBcInN0cmVhbSBkYXRhIGR1cmFibGVcIiwgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgLy9cbiAgICAvLyBFbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGUgZnJhbWluZyBsZXZlbCBieVxuICAgIC8vIGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbSwgbm90IGhlcmUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheVtdID0gW107XG4gICAgbGV0IGJ1ZmZlckJ5dGVzID0gMDtcbiAgICAvLyBUaGUgZ3JvdXAgY3VycmVudGx5IGluc2lkZSBhIHNlcnZlciByZXF1ZXN0LiBDb3VudGVkIGFnYWluc3QgdGhlXG4gICAgLy8gYnVmZmVyIGJvdW5kIHNvIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2Aga2VlcHMgaXRzXG4gICAgLy8gZG9jdW1lbnRlZCBtZWFuaW5nIChhbiB1cHBlciBib3VuZCBhY3Jvc3MgQUxMIHJlYWQtYnV0LW5vdC1kdXJhYmxlXG4gICAgLy8gY2h1bmtzKSwgbm90IGp1c3QgdGhlIHF1ZXVlZCBmb2xsb3ctdXAgZ3JvdXAuXG4gICAgbGV0IGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICBsZXQgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgbGV0IGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqIFRoZSBpbi1mbGlnaHQgZGlzcGF0Y2ggY2hhaW4uIEF0IG1vc3Qgb25lLCBwcmVzZXJ2aW5nIGNodW5rIG9yZGVyLiAqL1xuICAgIGxldCBpbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0aWNreSBmYWlsdXJlOiBvbmNlIGEgZGlzcGF0Y2ggZmFpbHMsIHRoZSBmYWlsZWQgZ3JvdXAgaXMgcmUtcXVldWVkXG4gICAgICogKHJldGFpbmVkLCBleGFjdGx5IGFzIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiByZXRhaW5lZCBpdHMgYnVmZmVyKVxuICAgICAqIGFuZCBldmVyeSBzdWJzZXF1ZW50IGB3cml0ZSgpYCwgYGNsb3NlKClgIGFuZCBgZHJhaW4oKWAgcmVqZWN0cyB3aXRoXG4gICAgICogdGhlIG9yaWdpbmFsIGVycm9yLiBDaHVua3Mgd2hvc2UgYHdyaXRlKClgIGFscmVhZHkgcmVzb2x2ZWQgc3VyZmFjZVxuICAgICAqIHRoZWlyIGZhaWx1cmUgYXQgdGhlIGR1cmFiaWxpdHkgYmFycmllcjogdGhhdCBpcyB0aGUgY29udHJhY3Qgb2YgYW5cbiAgICAgKiBlYXJseS1hY2sgc2luay5cbiAgICAgKi9cbiAgICBsZXQgc2lua0Vycm9yOiB1bmtub3duO1xuICAgIC8vIEdyb3VwLWNvbW1pdCB3aW5kb3cuIFRoZSBlbnYgdmFyLCB3aGVuIHNldCwgb3ZlcnJpZGVzIHRoZSBXb3JsZFxuICAgIC8vIG9wdGlvbjsgb3RoZXJ3aXNlIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgIGdvdmVybnMgKGRlZmF1bHQgMCksXG4gICAgLy8gaW5jbHVkaW5nIHRoZSBmaXJzdCBjaHVuay4gV2hlbiBpdCBtdXN0IGNvbWUgZnJvbSB0aGUgd29ybGQsXG4gICAgLy8gYHNjaGVkdWxlR3JvdXBDb21taXRgIHdhaXRzIGZvciBgd29ybGRQcm9taXNlYCBiZWZvcmUgZGVjaWRpbmcsIHdoaWNoXG4gICAgLy8gY29zdHMgbm90aGluZzogbm8gcmVxdWVzdCBjYW4gbGVhdmUgYmVmb3JlIGBzZW5kR3JvdXBgJ3Mgb3duIHdvcmxkXG4gICAgLy8gYXdhaXQgZWl0aGVyLlxuICAgIGxldCByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9IGdldEVudlN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpO1xuICAgIGxldCBfZmx1c2hJbnRlcnZhbFJlc29sdXRpb246IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICAvLyBQZXItcmVxdWVzdCB3aXJlIGxpbWl0cyAoc2VydmVyIGNhcHMpIGFuZCB0aGUgYnVmZmVyIGJvdW5kLiBUaGUgYm91bmRcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGtub2JzIHRoZSBjb2FsZXNjaW5nIHBpcGUgdXNlZCwgc28gcHJvZHVjZXIgYmFja3ByZXNzdXJlXG4gICAgLy8gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkOiBvbmNlIGEgcmVxdWVzdC13b3J0aCBvZiBjaHVua3MgKG9yIHRoZSBieXRlXG4gICAgLy8gYm91bmQpIGlzIGJ1ZmZlcmVkLCBgd3JpdGUoKWAgYmxvY2tzIHVudGlsIGEgZ3JvdXAgbGFuZHMgZHVyYWJseS5cbiAgICBjb25zdCBtYXhDaHVua3NQZXJSZXF1ZXN0ID0gZ2V0TWF4Q2h1bmtzUGVyQmF0Y2goKTtcbiAgICBjb25zdCBtYXhCeXRlc1BlclJlcXVlc3QgPSBnZXRNYXhCeXRlc1BlckJhdGNoKCk7XG4gICAgY29uc3QgbWF4QnVmZmVyZWRDaHVua3MgPSBnZXRNYXhJbmZsaWdodENodW5rcygpO1xuICAgIGNvbnN0IG1heEJ1ZmZlcmVkQnl0ZXMgPSBnZXRNYXhCdWZmZXJlZEJ5dGVzKCk7XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHdyaXRlLWJhdGNoIHRpbWluZzogc3RhbXBlZCB3aGVuIHRoZSBidWZmZXIgZ29lc1xuICAgIC8vIGVtcHR54oaSbm9uLWVtcHR5LCBjb25zdW1lZCBieSB0aGUgZ3JvdXAgdGhhdCBjYXJyaWVzIHRoYXQgY2h1bmsgb3V0LlxuICAgIGxldCBidWZmZXJUMDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgdHlwZSBXYWl0ZXIgPSB7IHJlc29sdmU6ICgpID0+IHZvaWQ7IHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZCB9O1xuICAgIC8qKiB3cml0ZSgpIGNhbGxzIGJsb2NrZWQgb24gdGhlIGJ1ZmZlciBib3VuZC4gKi9cbiAgICBsZXQgY2FwYWNpdHlXYWl0ZXJzOiBXYWl0ZXJbXSA9IFtdO1xuICAgIC8qKiBkcmFpbigpIGNhbGxzIHdhaXRpbmcgZm9yIGZ1bGwgZHVyYWJpbGl0eS4gKi9cbiAgICBsZXQgZHJhaW5XYWl0ZXJzOiBXYWl0ZXJbXSA9IFtdO1xuXG4gICAgY29uc3QgcmVqZWN0V2FpdGVycyA9IChlcnI6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFsbCA9IFsuLi5jYXBhY2l0eVdhaXRlcnMsIC4uLmRyYWluV2FpdGVyc107XG4gICAgICBjYXBhY2l0eVdhaXRlcnMgPSBbXTtcbiAgICAgIGRyYWluV2FpdGVycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB3IG9mIGFsbCkgdy5yZWplY3QoZXJyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGFrZSB0aGUgbGFyZ2VzdCBsZWFkaW5nIGdyb3VwIHRoYXQgZml0cyBvbmUgcmVxdWVzdDogYXQgbW9zdFxuICAgICAqIGBtYXhDaHVua3NQZXJSZXF1ZXN0YCBjaHVua3MgYW5kIGBtYXhCeXRlc1BlclJlcXVlc3RgIGN1bXVsYXRpdmUgYnl0ZXNcbiAgICAgKiAoYSBzaW5nbGUgb3ZlcnNpemVkIGNodW5rIHN0aWxsIGdvZXMgb3V0IGFsb25lKS5cbiAgICAgKi9cbiAgICBjb25zdCB0YWtlR3JvdXAgPSAoKTogeyBncm91cDogVWludDhBcnJheVtdOyBieXRlczogbnVtYmVyIH0gPT4ge1xuICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgIGxldCBieXRlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlcikge1xuICAgICAgICBpZiAoY291bnQgPj0gbWF4Q2h1bmtzUGVyUmVxdWVzdCkgYnJlYWs7XG4gICAgICAgIGlmIChjb3VudCA+IDAgJiYgYnl0ZXMgKyBjaHVuay5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXNQZXJSZXF1ZXN0KSBicmVhaztcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdyb3VwID0gYnVmZmVyLnNsaWNlKDAsIGNvdW50KTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShjb3VudCk7XG4gICAgICBidWZmZXJCeXRlcyAtPSBieXRlcztcbiAgICAgIHJldHVybiB7IGdyb3VwLCBieXRlcyB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBsb29wOiB3aGlsZSBjaHVua3MgYXJlIGJ1ZmZlcmVkLCBzZW5kIHRoZW0gZ3JvdXAgYnkgZ3JvdXAuXG4gICAgICogRXhhY3RseSBvbmUgbG9vcCBydW5zIGF0IGEgdGltZSAoYGluRmxpZ2h0YCksIHNvIGdyb3VwcyByZWFjaCB0aGVcbiAgICAgKiBzZXJ2ZXIgaW4gd3JpdGUgb3JkZXIuIENodW5rcyB0aGF0IGFycml2ZSB3aGlsZSBhIGdyb3VwJ3MgcmVxdWVzdCBpc1xuICAgICAqIGluIGZsaWdodCBhY2N1bXVsYXRlIGFuZCBmb3JtIHRoZSBuZXh0IGdyb3VwOiB0aGUgZ3JvdXAtY29tbWl0XG4gICAgICogYmVoYXZpb3IsIG5vdyBpbmRlcGVuZGVudCBvZiBob3cgdGhlIHByb2R1Y2VyIHBpcGVzLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFNlbmQgb25lIGdyb3VwIHRvIHRoZSBzZXJ2ZXI6IGdhdGUgb24gcnVuIHJlYWRpbmVzcywgdGhlbiBvbmVcbiAgICAgKiBgd3JpdGVNdWx0aWAgKG9yIHNlcXVlbnRpYWwgYHdyaXRlYHMgd2hlbiB0aGUgd29ybGQgbGFja3MgaXQpLiBFbWl0c1xuICAgICAqIHRoZSB3cml0ZS1mbHVzaCBzcGFuOyBkd2VsbCBpcyBtZWFzdXJlZCB1cCB0byBqdXN0IGJlZm9yZSB0aGUgUlBDIHNvIGFcbiAgICAgKiB0dXJibyBydW4tcmVhZHkgYmFycmllciB3YWl0IGNvdW50cyBhcyBidWZmZXIgZHdlbGwsIG1hdGNoaW5nIHRoZVxuICAgICAqIHByZS1ncm91cC1jb21taXQgdGVsZW1ldHJ5LlxuICAgICAqL1xuICAgIGNvbnN0IHNlbmRHcm91cCA9IGFzeW5jIChcbiAgICAgIGdyb3VwOiBVaW50OEFycmF5W10sXG4gICAgICBieXRlczogbnVtYmVyLFxuICAgICAgZ3JvdXBUMDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICBjb25zdCBkaXNwYXRjaEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0eXBlb2Ygd29ybGQuc3RyZWFtcy53cml0ZU11bHRpID09PSAnZnVuY3Rpb24nICYmIGdyb3VwLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZU11bHRpKHJ1bklkLCBuYW1lLCBncm91cCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gc2VxdWVudGlhbCB3cml0ZXNcbiAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBncm91cCkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUocnVuSWQsIG5hbWUsIGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdyb3VwVDAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWNvcmRTdHJlYW1Xcml0ZUZsdXNoKFxuICAgICAgICAgIGdyb3VwVDAsXG4gICAgICAgICAgZGlzcGF0Y2hBdCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGdyb3VwLmxlbmd0aCxcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBEYXRlLm5vdygpIC0gZGlzcGF0Y2hBdFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBkaXNwYXRjaExvb3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXBUMCA9IGJ1ZmZlclQwO1xuICAgICAgICBjb25zdCBncm91cFRha2VuQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IGdyb3VwLCBieXRlcyB9ID0gdGFrZUdyb3VwKCk7XG4gICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gZ3JvdXAubGVuZ3RoO1xuICAgICAgICBpbkZsaWdodEJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIGJ1ZmZlclQwID0gYnVmZmVyLmxlbmd0aCA+IDAgPyBncm91cFRha2VuQXQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzZW5kR3JvdXAoZ3JvdXAsIGJ5dGVzLCBncm91cFQwKTtcbiAgICAgICAgICBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgICAgICAgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUmV0YWluIHRoZSBmYWlsZWQgZ3JvdXAgKGFuZCBpdHMgb3JpZ2luYWwgdDApIGF0IHRoZSBmcm9udCBvZlxuICAgICAgICAgIC8vIHRoZSBidWZmZXIsIHBvaXNvbiB0aGUgc2luaywgYW5kIHN1cmZhY2UgdGhlIGZhaWx1cmUgdG8gZXZlcnlcbiAgICAgICAgICAvLyBibG9ja2VkIHdyaXRlciBhbmQgZHJhaW4gd2FpdGVyLlxuICAgICAgICAgIGJ1ZmZlciA9IGdyb3VwLmNvbmNhdChidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlckJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICAgICAgICBpbkZsaWdodEJ5dGVzID0gMDtcbiAgICAgICAgICBidWZmZXJUMCA9XG4gICAgICAgICAgICBncm91cFQwICE9PSB1bmRlZmluZWQgJiYgYnVmZmVyVDAgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IE1hdGgubWluKGdyb3VwVDAsIGJ1ZmZlclQwKVxuICAgICAgICAgICAgICA6IChncm91cFQwID8/IGJ1ZmZlclQwKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgZ3JvdXAgaXMgZHVyYWJsZTogcmVsaWV2ZSB3cml0ZXJzIGJsb2NrZWQgb24gdGhlIGJvdW5kICh0aGV5XG4gICAgICAgIC8vIHJlLWNoZWNrIGl0IGFuZCBtYXkgYmxvY2sgYWdhaW4pLlxuICAgICAgICBjb25zdCByZWxpZXZlZCA9IGNhcGFjaXR5V2FpdGVycztcbiAgICAgICAgY2FwYWNpdHlXYWl0ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiByZWxpZXZlZCkgdy5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBTdGFydCAob3Igam9pbikgdGhlIGRpc3BhdGNoIGNoYWluLiBOZXZlciBsZWF2ZXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi4gKi9cbiAgICBjb25zdCBzdGFydERpc3BhdGNoID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGluRmxpZ2h0IHx8IHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkIHx8IGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGluRmxpZ2h0ID0gZGlzcGF0Y2hMb29wKCkudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgICAvLyBBIHdyaXRlIGNhbiBsYW5kIGluIHRoZSBtaWNyb3Rhc2sgZ2FwIGJldHdlZW4gdGhlIGxvb3Anc1xuICAgICAgICAgIC8vIGVtcHR5LWJ1ZmZlciBleGl0IGFuZCB0aGlzIHJlYWN0aW9uLiBzY2hlZHVsZUdyb3VwQ29tbWl0IHNhd1xuICAgICAgICAgIC8vIGluRmxpZ2h0IHN0aWxsIHNldCBhbmQgYXJtZWQgbm8gdGltZXIsIHNvIHdpdGhvdXQgdGhpcyBjaGVja1xuICAgICAgICAgIC8vIHRoZSBjaHVuayB3b3VsZCBzaXQgc3RyYW5kZWQgdW50aWwgYSBsYXRlciB3cml0ZS9jbG9zZS9kcmFpbi5cbiAgICAgICAgICAvLyBUcmVhdCBpdCBsaWtlIGFuIGluLXJlcXVlc3QgYXJyaXZhbDogZGlzcGF0Y2ggaW1tZWRpYXRlbHkgKHRoZVxuICAgICAgICAgIC8vIG5ldyBjaGFpbiBzZXR0bGVzIHRoZSBkcmFpbiB3YWl0ZXJzIHdoZW4gaXQgZmluaXNoZXMpLlxuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGdWxseSBpZGxlICh0aGUgbG9vcCBvbmx5IGV4aXRzIHdpdGggYW4gZW1wdHkgYnVmZmVyKTogc2V0dGxlXG4gICAgICAgICAgLy8gdGhlIGR1cmFiaWxpdHkgYmFycmllci5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gZHJhaW5XYWl0ZXJzO1xuICAgICAgICAgIGRyYWluV2FpdGVycyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBzZXR0bGVkKSB3LnJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQgPSBudWxsO1xuICAgICAgICAgIHNpbmtFcnJvciA/Pz0gZXJyb3I7XG4gICAgICAgICAgcmVqZWN0V2FpdGVycyhzaW5rRXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMZWFkaW5nLWVkZ2UgZGlzcGF0Y2ggcG9saWN5IGZvciBhbiBpZGxlIHNpbms6XG4gICAgICogLSB3aW5kb3cgPD0gMCAodGhlIGRlZmF1bHQpOiBkaXNwYXRjaCB0aGUgbGVhZGluZyBjaHVuayBpbW1lZGlhdGVseS5cbiAgICAgKiAgIEZhc3QgcHJvZHVjZXJzIHN0aWxsIGJhdGNoIHZpYSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uOiBjaHVua3NcbiAgICAgKiAgIGFycml2aW5nIGR1cmluZyB0aGUgcmVxdWVzdCBmb3JtIHRoZSBuZXh0IGdyb3VwLiBUaGUgdHJhZGUgZm9yIGFuXG4gICAgICogICBpZGxlIGJ1cnN0IGlzIG9uZSBleHRyYSByZXF1ZXN0IChhIDMwLWNodW5rIGJ1cnN0IHNoaXBzIGFzIDEgKyAyOVxuICAgICAqICAgaW5zdGVhZCBvZiBvbmUgMzAtY2h1bmsgZ3JvdXAgdW5kZXIgYSBwb3NpdGl2ZSB3aW5kb3cpIGluIGV4Y2hhbmdlXG4gICAgICogICBmb3IgemVybyBmaXhlZCBmaXJzdC1jaHVuayBkZWxheSwgd2hpY2ggbWF0Y2hlcyBtZWFzdXJlZCBwcm9kdWNlclxuICAgICAqICAgYmVoYXZpb3IsIHdoZXJlIGlzb2xhdGVkIGNodW5rcyBkb21pbmF0ZS5cbiAgICAgKiAtIHdpbmRvdyA+IDAgKGV4cGxpY2l0bHkgY29uZmlndXJlZCk6IGFybSB0aGUgZ3JvdXAtY29tbWl0IHRpbWVyIHNvXG4gICAgICogICB0aGUgbGVhZGluZyBjaHVuayB3YWl0cyB1cCB0byB0aGUgd2luZG93IGNvbGxlY3RpbmcgYSBncm91cCxcbiAgICAgKiAgIHRoZSBvcHQtaW4gdHJhZGUgZm9yIHNsb3ctYnV0LXN0ZWFkeSBwcm9kdWNlcnMuXG4gICAgICogV2luZG93IHJlc29sdXRpb246IGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCxcbiAgICAgKiBvdmVycmlkZXMgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2A7IG90aGVyd2lzZSB0aGUgV29ybGQgb3B0aW9uXG4gICAgICogKGRlZmF1bHQgMCkgZ292ZXJucywgaW5jbHVkaW5nIHRoZSBmaXJzdCBjaHVuay4gRGVjaWRpbmcgbWF5XG4gICAgICogaGF2ZSB0byB3YWl0IGZvciB0aGUgd29ybGQgdG8gcmVzb2x2ZTsgdGhhdCBhZGRzIG5vIGxhdGVuY3kgYmVjYXVzZVxuICAgICAqIGBzZW5kR3JvdXBgIGF3YWl0cyB0aGUgc2FtZSBwcm9taXNlIGJlZm9yZSBhbnkgcmVxdWVzdCBsZWF2ZXMuXG4gICAgICovXG4gICAgY29uc3Qgc2NoZWR1bGVHcm91cENvbW1pdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyIHx8IGluRmxpZ2h0KSByZXR1cm47XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBQcm9taXNlLnJlc29sdmU6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgd29ybGQgaXMgb25seSBldmVyIGF3YWl0ZWQsXG4gICAgICAgIC8vIHdoaWNoIHRvbGVyYXRlcyBhIHN5bmNocm9ub3VzIHZhbHVlICh0ZXN0cyBzdHViIGdldFdvcmxkTGF6eSB0aGF0XG4gICAgICAgIC8vIHdheSk7IC50aGVuKCkgbXVzdCBiZSBnaXZlbiBhIHJlYWwgcHJvbWlzZS5cbiAgICAgICAgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uID8/PSBQcm9taXNlLnJlc29sdmUod29ybGRQcm9taXNlKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKHdvcmxkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID1cbiAgICAgICAgICAgICAgICB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXMgPz8gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gV29ybGQgcmVzb2x1dGlvbiBmYWlsdXJlIHN1cmZhY2VzIG9uIGRpc3BhdGNoOyBmYWxsIGJhY2sgdG9cbiAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc28gYnVmZmVyZWQgY2h1bmtzIHN0aWxsIHJlYWNoIHRoZSBkaXNwYXRjaCBwYXRoXG4gICAgICAgICAgICAgIC8vICh3aGVyZSB0aGUgZXJyb3IgcG9pc29ucyB0aGUgc2luaykuXG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID0gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZS1ldmFsdWF0ZTogdGhlIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgYnkgZHJhaW4oKVxuICAgICAgICAgICAgLy8gb3IgYSBmdWxsLXJlcXVlc3QgZmFzdCBwYXRoIHdoaWxlIHRoZSB3b3JsZCByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPD0gMCkge1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgIH0sIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHVyYWJpbGl0eSBiYXJyaWVyOiByZXNvbHZlcyB3aGVuIGV2ZXJ5IGFjY2VwdGVkIGNodW5rIGhhcyByZWFjaGVkIHRoZVxuICAgICAqIHNlcnZlciBhbmQgbm90aGluZyBpcyBidWZmZXJlZCBvciBpbiBmbGlnaHQ7IHJlamVjdHMgd2l0aCB0aGUgc2luaydzXG4gICAgICogc3RpY2t5IGVycm9yIGlmIGFueSBkaXNwYXRjaCBmYWlsZWQuIEZsdXNoZXMgYSBwZW5kaW5nIGdyb3VwLWNvbW1pdFxuICAgICAqIHdpbmRvdyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIG91dCB0aGUgdGltZXIuXG4gICAgICovXG4gICAgY29uc3QgZHJhaW4gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgIWluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGRyYWluV2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXN5bmMgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICAgIGlmIChidWZmZXJUMCA9PT0gdW5kZWZpbmVkKSBidWZmZXJUMCA9IERhdGUubm93KCk7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgYnVmZmVyQnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYnVmZmVyLmxlbmd0aCA+PSBtYXhDaHVua3NQZXJSZXF1ZXN0IHx8XG4gICAgICAgICAgYnVmZmVyQnl0ZXMgPj0gbWF4Qnl0ZXNQZXJSZXF1ZXN0XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRoZSBidWZmZXJlZCBncm91cCBhbHJlYWR5IGZpbGxzIGEgcmVxdWVzdDogbm8gcG9pbnQgZHdlbGxpbmcgaW5cbiAgICAgICAgICAvLyB0aGUgY29tbWl0IHdpbmRvdy5cbiAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm91bmRlZCBidWZmZXI6IGFjY2VwdCB0aGUgY2h1bmsgKG5ldmVyIGRyb3ApLCB0aGVuIGJsb2NrIHVudGlsXG4gICAgICAgIC8vIHRoZSByZWFkLWJ1dC1ub3QtZHVyYWJsZSBwb3B1bGF0aW9uIChidWZmZXJlZCBBTkQgaW4gdGhlIGFjdGl2ZVxuICAgICAgICAvLyByZXF1ZXN0KSBpcyBiYWNrIHVuZGVyIHRoZSBib3VuZC4gRWFjaCBkdXJhYmx5LXNlbnQgZ3JvdXBcbiAgICAgICAgLy8gcmVsaWV2ZXMgdGhpcy5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIHNpbmtFcnJvciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgKGJ1ZmZlci5sZW5ndGggKyBpbkZsaWdodENodW5rcyA+PSBtYXhCdWZmZXJlZENodW5rcyB8fFxuICAgICAgICAgICAgYnVmZmVyQnl0ZXMgKyBpbkZsaWdodEJ5dGVzID49IG1heEJ1ZmZlcmVkQnl0ZXMpXG4gICAgICAgICkge1xuICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjYXBhY2l0eVdhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgLy8gRXZlcnl0aGluZyBhY2NlcHRlZCBtdXN0IGJlIGR1cmFibGUgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RyZWFtIGlzXG4gICAgICAgIC8vIGNsb3NlZDogdGhlIHNlcnZlciBmZW5jZXMgcG9zdC1jbG9zZSB3cml0ZXMuXG4gICAgICAgIGF3YWl0IGRyYWluKCk7XG5cbiAgICAgICAgLy8gQSBjbG9zZSB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBza2lwcyB0aGUgZGlzcGF0Y2ggcGF0aCAoYW5kIGl0c1xuICAgICAgICAvLyBiYXJyaWVyKSwgYnV0IGNhbiBpdHNlbGYgYmUgdGhlIGZpcnN0IHdyaXRlIHRvIGEgYnJhbmQtbmV3XG4gICAgICAgIC8vIHN0cmVhbSwgc28gZ2F0ZSBpdCB0b28uXG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG5cbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IGNsb3NlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBuYW1lKTtcbiAgICAgICAgcmVjb3JkU3RyZWFtQ2xvc2UoY2xvc2VTdGFydCwgcnVuSWQsIG5hbWUpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGFib3J0KHJlYXNvbikge1xuICAgICAgICAvLyBCdWZmZXJlZCBjaHVua3Mgd2VyZSBhbHJlYWR5IEFDS0VEIHRvIHRoZWlyIHdyaXRlcnMgKGVhcmx5LWFja1xuICAgICAgICAvLyBjb250cmFjdCksIGFuZCBuYXRpdmUgcGlwZVRvIGFib3J0cyB0aGlzIHNpbmsgd2hlbmV2ZXIgaXRzIFNPVVJDRVxuICAgICAgICAvLyBlcnJvcnMsIGUuZy4gYW4gQUkgc3RyZWFtIHRoYXQgZW1pdHMgdGVuIGRlbHRhcyBhbmQgdGhlbiB0aHJvd3MuXG4gICAgICAgIC8vIERpc2NhcmRpbmcgaGVyZSB3b3VsZCBzaWxlbnRseSBsb3NlIHRoZSBhY2NlcHRlZCB0YWlsIG9mIHRoZVxuICAgICAgICAvLyBwcmVmaXgsIHNvIGRlbGl2ZXIgaXQgZmlyc3Q7IG9ubHkgdGhlIHNlcnZlciBzdHJlYW0gY2xvc2UgaXNcbiAgICAgICAgLy8gc2tpcHBlZC4gQSBkaXNwYXRjaCBmYWlsdXJlIGR1cmluZyB0aGlzIGRyYWluIGlzIGFscmVhZHkgc3RpY2t5XG4gICAgICAgIC8vIGFuZCBzdXJmYWNlcyB0aHJvdWdoIHRoZSBzaW5rJ3MgZXJyb3IgcGF0aHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSB1bi10aW1lYm94ZWQgKHVubGlrZSB0aGUgc3RlcC1leGVjdXRvcidzIDUwMG1zXG4gICAgICAgIC8vIGlubGluZSBmbHVzaCk6IGdpdmluZyB1cCBlYXJseSB3b3VsZCBkcm9wIGFja2VkIGNodW5rcywgdGhlXG4gICAgICAgIC8vIGV4YWN0IGxvc3MgdGhpcyBwYXRoIGV4aXN0cyB0byBwcmV2ZW50LiBJdCBpcyBzdGlsbCBib3VuZGVkIGluXG4gICAgICAgIC8vIHByYWN0aWNlIGJ5IHRoZSBXb3JsZCB0cmFuc3BvcnQncyBvd24gdGltZW91dC9yZXRyeSBidWRnZXQ6IGFcbiAgICAgICAgLy8gc3RhbGxlZCB3cml0ZSBlbmRzIGluIGEgdGVybWluYWwgcmVqZWN0aW9uIGFmdGVyIGZpbml0ZSByZXRyaWVzLFxuICAgICAgICAvLyB3aGljaCByZWplY3RzIHRoZSBkaXNwYXRjaCBhbmQgbGFuZHMgaW4gdGhlIGNhdGNoIGJlbG93LiBUaGVcbiAgICAgICAgLy8gc2FtZSBjYXRjaCBhYnNvcmJzIHRoZSBleHBlY3RlZCBjb25mbGljdCB3aGVuIGEgdGVhcmRvd24tZHJpdmVuXG4gICAgICAgIC8vIGFib3J0IGRyYWlucyBpbnRvIGFuIGFscmVhZHktdGVybWluYWwgcnVuLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGRyYWluKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIHNpbmtFcnJvciBpcyBzZXQ7IGFjY2VwdGVkLWJ1dC11bmRlbGl2ZXJhYmxlIGNodW5rcyBzdXJmYWNlIGl0LlxuICAgICAgICB9XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICBidWZmZXJCeXRlcyA9IDA7XG4gICAgICAgIHNpbmtFcnJvciA/Pz0gcmVhc29uID8/IG5ldyBFcnJvcignU3RyZWFtIGFib3J0ZWQnKTtcbiAgICAgICAgLy8gUmVqZWN0IGJsb2NrZWQgd3JpdGVycyBhbmQgZHJhaW4gd2FpdGVycyBzbyBub3RoaW5nIGxlYWtzIG9yXG4gICAgICAgIC8vIGhhbmdzIG9uIGEgcHJvbWlzZSB3aG9zZSB0aW1lciB3YXMganVzdCBjbGVhcmVkLlxuICAgICAgICByZWplY3RXYWl0ZXJzKHNpbmtFcnJvcik7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gRHVyYWJpbGl0eSBiYXJyaWVyIGZvciBvd25lcnMgdGhhdCBjb21wbGV0ZSB3aXRob3V0IGNsb3NpbmcgdGhlXG4gICAgLy8gc3RyZWFtOiBgZmx1c2hhYmxlUGlwZWAncyBsb2NrLXJlbGVhc2UgY29tcGxldGlvbiBhd2FpdHMgdGhpcyBzbyBhXG4gICAgLy8gc3RlcCBjYW5ub3QgZmluaXNoIChhbmQgdGhlIGZ1bmN0aW9uIHN1c3BlbmQpIHdoaWxlIGFjY2VwdGVkIGNodW5rc1xuICAgIC8vIGFyZSBzdGlsbCBjbGllbnQtYnVmZmVyZWQgb3IgaW4gZmxpZ2h0LlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTVFJFQU1fRFJBSU5fU1lNQk9MLCB7XG4gICAgICB2YWx1ZTogZHJhaW4sXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBSZS1leHBvcnQgdHlwZXMgZnJvbSB0aGUgbW9kdWxhciBzZXJpYWxpemF0aW9uIG1vZHVsZXMuXG5leHBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIEltcG9ydCB0eXBlcyBsb2NhbGx5IGZvciB1c2Ugd2l0aGluIHRoaXMgZmlsZS5cbmltcG9ydCB0eXBlIHtcbiAgQnl0ZVN0cmVhbUZyYW1pbmcsXG4gIFJlZHVjZXJzLFxuICBSZXZpdmVycyxcbiAgU2VyaWFsaXphYmxlU3BlY2lhbCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcblxuLy8gLS0tLSBDb21wb3NlZCByZWR1Y2VycyAtLS0tXG4vLyBDb21wb3NlcyBtb2R1bGFyIHJlZHVjZXJzIChjb21tb24sIGNsYXNzLCBzdGVwLWZ1bmN0aW9uKSB3aXRoXG4vLyBtb2RlLXNwZWNpZmljIFJlcXVlc3QvUmVzcG9uc2UvU3RyZWFtIHJlZHVjZXJzIGJlbG93LlxuXG4vKipcbiAqIEJhc2UgcmVkdWNlcnMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBib3VuZGFyaWVzLlxuICogQ29tcG9zZXM6IGNsYXNzICsgc3RlcC1mdW5jdGlvbiArIGNvbW1vbiByZWR1Y2VycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEJhc2VSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZXF1ZXN0UHJvdG90eXBlID0gb25jZSgoKSA9PiBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVxdWVzdCcpKTtcbiAgY29uc3QgcmVzcG9uc2VQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1Jlc3BvbnNlJylcbiAgKTtcbiAgLy8gQ2xhc3MvSW5zdGFuY2UgTVVTVCBjb21lIGJlZm9yZSBFcnJvciBzbyB0aGF0IGN1c3RvbSBFcnJvciBzdWJjbGFzc2VzXG4gIC8vIHdpdGggV09SS0ZMT1dfU0VSSUFMSVpFIHRha2UgcHJlY2VkZW5jZSAoZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMpLlxuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmVkdWNlcnMoKSxcbiAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgLi4uZ2V0Q29tbW9uUmVkdWNlcnMoZ2xvYmFsKSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSByZWR1Y2VycyBhcmUgbW9kZS1zcGVjaWZpYyBhbmQgYWRkZWQgYnlcbiAgICAvLyBnZXRFeHRlcm5hbFJlZHVjZXJzIC8gZ2V0V29ya2Zsb3dSZWR1Y2VycyAvIGdldFN0ZXBSZWR1Y2VycyBiZWxvdy5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoYWluIHdhbGsgcmF0aGVyIHRoYW4gYGluc3RhbmNlb2YgZ2xvYmFsLlJlcXVlc3RgOiBzZWUgdGhlXG4gICAgICAvLyBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGluIGdldFdvcmtmbG93UmVkdWNlcnMgZm9yIHdoeS4gUmVhZHMgZ29cbiAgICAgIC8vIHRocm91Z2ggZGVzY3JpcHRvcnMgc28gYSBnZXR0ZXIgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlcXVlc3RQcm90b3R5cGUudmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBkYXRhOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZXF1ZXN0J10gPSB7XG4gICAgICAgIG1ldGhvZDogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWV0aG9kJykgYXMgc3RyaW5nLFxuICAgICAgICB1cmw6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3VybCcpIGFzIHN0cmluZyxcbiAgICAgICAgaGVhZGVyczogcmVhZFByb3BlcnR5KHZhbHVlLCAnaGVhZGVycycpIGFzIEhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2JvZHknKSBhcyBSZWFkYWJsZVN0cmVhbSB8IG51bGwsXG4gICAgICAgIGR1cGxleDogcmVhZFByb3BlcnR5KHZhbHVlLCAnZHVwbGV4JykgYXMgJ2hhbGYnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUpIGFzXG4gICAgICAgIHwgV3JpdGFibGVTdHJlYW08UmVzcG9uc2U+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8vIEZvcndhcmQgdGhlIHNpZ25hbCBpbiB0d28gY2FzZXM6XG4gICAgICAvLyAgIDEuIEFscmVhZHkgYWJvcnRlZDogcHJlc2VydmUgYWJvcnRlZD10cnVlL3JlYXNvbiBzbyB0aGUgaHlkcmF0ZWRcbiAgICAgIC8vICAgICAgc3RlcCBzZWVzIHRoZSBjYW5jZWxsYXRpb24gdGhhdCBoYXBwZW5lZCBiZWZvcmUgc2VyaWFsaXplLlxuICAgICAgLy8gICAyLiBBbHJlYWR5IHRhZ2dlZCB3aXRoIHdvcmtmbG93IGluZnJhc3RydWN0dXJlLCBpLmUuIGEgc2lnbmFsXG4gICAgICAvLyAgICAgIGZyb20gYSB3b3JrZmxvdy1tYW5hZ2VkIEFib3J0Q29udHJvbGxlciwgd2hpY2ggaGFzIHN0cmVhbS9ob29rXG4gICAgICAvLyAgICAgIGJhY2tpbmcgZm9yIGNyb3NzLWJvdW5kYXJ5IHByb3BhZ2F0aW9uLlxuICAgICAgLy8gUGxhaW4gbm9uLWFib3J0ZWQgbmF0aXZlIHNpZ25hbHMgYXJlIGludGVudGlvbmFsbHkgZHJvcHBlZCAod291bGRcbiAgICAgIC8vIG1pbnQgc3RyZWFtIGluZnJhIGZvciBldmVyeSBSZXF1ZXN0LCBpbmNsdWRpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkXG4gICAgICAvLyBzaWduYWwgb24gYG5ldyBSZXF1ZXN0KHVybClgKS5cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKFxuICAgICAgICBzaWduYWwgJiZcbiAgICAgICAgKHJlYWRQcm9wZXJ0eShzaWduYWwsICdhYm9ydGVkJykgfHxcbiAgICAgICAgICByZWFkUHJvcGVydHkoc2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkpXG4gICAgICApIHtcbiAgICAgICAgZGF0YS5zaWduYWwgPSBzaWduYWwgYXMgQWJvcnRTaWduYWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNlZSB0aGUgUmVxdWVzdCByZWR1Y2VyIGFib3ZlLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlc3BvbnNlUHJvdG90eXBlLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogcmVhZFByb3BlcnR5KHZhbHVlLCAndHlwZScpIGFzIFJlc3BvbnNlWyd0eXBlJ10sXG4gICAgICAgIHVybDogcmVhZFByb3BlcnR5KHZhbHVlLCAndXJsJykgYXMgc3RyaW5nLFxuICAgICAgICBzdGF0dXM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1cycpIGFzIG51bWJlcixcbiAgICAgICAgc3RhdHVzVGV4dDogcmVhZFByb3BlcnR5KHZhbHVlLCAnc3RhdHVzVGV4dCcpIGFzIHN0cmluZyxcbiAgICAgICAgaGVhZGVyczogcmVhZFByb3BlcnR5KHZhbHVlLCAnaGVhZGVycycpIGFzIEhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2JvZHknKSBhcyBSZWFkYWJsZVN0cmVhbSB8IG51bGwsXG4gICAgICAgIHJlZGlyZWN0ZWQ6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3JlZGlyZWN0ZWQnKSBhcyBib29sZWFuLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBhYm9ydCByZWR1Y2VyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEFib3J0U2VyaWFsaXplZERhdGEgPSB7XG4gIHN0cmVhbU5hbWU6IHN0cmluZztcbiAgaG9va1Rva2VuOiBzdHJpbmc7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbjogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3ltYm9sLWtleWVkIGludGVybmFsIGZpZWxkcyB0YWdnZWQgb250byBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWxcbiAqIGluc3RhbmNlcyAoYW5kIGBob2xkZXJgcyBpbiByZWR1Y2VyIGhlbHBlcnMpLiBBbGwgb3B0aW9uYWw6IGEgcGxhaW5cbiAqIG5hdGl2ZSBpbnN0YW5jZSBoYXMgbm9uZSBvZiB0aGVtIHNldC5cbiAqL1xudHlwZSBBYm9ydEludGVybmFscyA9IHtcbiAgW0FCT1JUX1NUUkVBTV9OQU1FXT86IHN0cmluZztcbiAgW0FCT1JUX0hPT0tfVE9LRU5dPzogc3RyaW5nO1xuICBbQUJPUlRfUkVBREVSX0NBTkNFTF0/OiBBYm9ydENvbnRyb2xsZXI7XG59O1xuXG50eXBlIEFib3J0U2lnbmFsTGlrZSA9IEFib3J0SW50ZXJuYWxzICYge1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb24/OiB1bmtub3duO1xuICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIEFib3J0SG9sZGVyID0gQWJvcnRJbnRlcm5hbHMgJiB7IHNpZ25hbD86IEFib3J0SW50ZXJuYWxzIH07XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gZXh0ZXJuYWwgYW5kIHN0ZXBcbiAqIGNvbnRleHRzLiBBc3NpZ25zIHN0cmVhbS9ob29rIG5hbWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsIG9wdGlvbmFsbHlcbiAqIGF0dGFjaGVzIGFuIGFib3J0IGxpc3RlbmVyIGZvciByZWFsLXRpbWUgcHJvcGFnYXRpb24sIGFuZCByZXR1cm5zIHRoZVxuICogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gIHNpZ25hbDogQWJvcnRTaWduYWxMaWtlLFxuICBob2xkZXI6IEFib3J0SG9sZGVyLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB7XG4gIGxldCBzdHJlYW1OYW1lID0gaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgbGV0IGhvb2tUb2tlbiA9IGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgaWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgaG9va1Rva2VuID0gYGFicnRfJHtpZH1gO1xuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICBpZiAoaG9sZGVyLnNpZ25hbCkge1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICB9XG4gIH1cblxuICAvLyBEZWR1cGVkIHZpYSBBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRCBtYXJrZXI6IHNlZSBhdHRhY2hBYm9ydExpc3RlbmVyT25jZS5cbiAgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gICAgc2lnbmFsIGFzIEFib3J0U2lnbmFsLFxuICAgIHN0cmVhbU5hbWUsXG4gICAgcnVuSWQsXG4gICAgY3J5cHRvS2V5LFxuICAgIG9wc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gd29ya2Zsb3cgY29udGV4dC5cbiAqIFJlYWRzIGV4aXN0aW5nIHN0cmVhbS9ob29rIG5hbWVzIGZyb20gc3ltYm9scyAobXVzdCBhbHJlYWR5IGJlIHNldCkuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogQWJvcnRIb2xkZXJcbik6IEFib3J0U2VyaWFsaXplZERhdGEgfCBmYWxzZSB7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPVxuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgY29uc3QgaG9va1Rva2VuID1cbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBzdHJlYW0gbmFtZSBpcyBub3Qgc2V0Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYSBzaW5nbGUgYWJvcnQgbGlzdGVuZXIgdG8gYSBzaWduYWwsIGRlZHVwZWQgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEVhY2ggc2VyaWFsaXphdGlvbiBwYXNzIGdvZXMgdGhyb3VnaCB0aGUgcmVkdWNlciwgYnV0IGEgY29udHJvbGxlciBwYXNzZWRcbiAqIHRvIE4gc3RlcHMgd291bGQgb3RoZXJ3aXNlIGFjY3VtdWxhdGUgTiBsaXN0ZW5lcnMsIGVhY2ggd3JpdGluZyB0aGUgc2FtZVxuICogc3RyZWFtIHBhY2tldCBhbmQgZG91YmxlLWNsb3NpbmcgdGhlIHN0cmVhbSBvbiBhYm9ydC4gVGhlIG1hcmtlciBzeW1ib2xcbiAqIGVuc3VyZXMgdGhlIHN0cmVhbS13cml0ZSBzaWRlLWVmZmVjdCBydW5zIGF0IG1vc3Qgb25jZSBwZXIgKHNpZ25hbCwgcnVuSWQpLlxuICovXG5mdW5jdGlvbiBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W11cbik6IHZvaWQge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgaWYgKChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0pIHJldHVybjtcbiAgKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSA9IHRydWU7XG5cbiAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgJ2Fib3J0JyxcbiAgICAoKSA9PiB7XG4gICAgICBvcHMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRGVoeWRyYXRlIHZpYSB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIHJlYWRlciB1c2VzIChoeWRyYXRlU3RlcEFyZ3VtZW50cylcbiAgICAgICAgICAgIC8vIHNvIHRoZSByZWFzb24gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkgKERPTUV4Y2VwdGlvbixcbiAgICAgICAgICAgIC8vIEVycm9ycywgY3VzdG9tIGNsYXNzZXMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3MgZW5jcnlwdGlvbiBrZXkuXG4gICAgICAgICAgICAvLyBBIGJhcmUgSlNPTi5zdHJpbmdpZnkgaGVyZSB3b3VsZCB3cml0ZSBhIHBhY2tldCB0aGUgcmVhZGVyIGNhbid0XG4gICAgICAgICAgICAvLyBkZWNvZGUgYW5kIHRoZSBsaXN0ZW5lci1zaWRlIGFib3J0IHdvdWxkIHByb3BhZ2F0ZSB3aXRoIG5vIHJlYXNvbi5cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb246IHNpZ25hbC5yZWFzb24gfSxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0sXG4gICAgeyBvbmNlOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHRoZSBjbGllbnQgc2lkZSwgcGFzc2luZyBhcmd1bWVudHNcbiAqIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHBhcmFtIGNyeXB0b0tleVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hlbiBgdHJ1ZWAsIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgKVxuICogICBhcmUgd3JhcHBlZCBpbiBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzIG9uIHRoZSB3aXJlIHNvIHRoZSBjb25zdW1lclxuICogICBjYW4gcmVjb25uZWN0IG9uIHRyYW5zaWVudCBlcnJvcnMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IHJ1bidzXG4gKiAgIGNhcGFiaWxpdHk6IHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHNcbiAqICAgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSBuZXN0ZWQgYFJlYWRhYmxlU3RyZWFtYCBmb3VuZCB3aGlsZSBzZXJpYWxpemluZ1xuICAvLyBpcyBwaXBlZCB0byBpdHMgb3duIHNlcnZlciBzdHJlYW0gaW5kZXBlbmRlbnRseSBvZiB0aGUgb3V0ZXIgc2luaywgc28gaXRzXG4gIC8vIGZpcnN0IGNodW5rIGNhbiByYWNlIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGF0XG4gIC8vIHNpbmsgc28gdGhlIHdyaXRlIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gL1xuICAvLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMpIHMuZnJhbWluZyA9ICdmcmFtZWQtdjEnO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHdoZW4gdGhlIHdyaXRhYmxlIGlzIGFscmVhZHkgYmFja2VkIGJ5IGEgd29ya2Zsb3dcbiAgICAgIC8vIHNlcnZlciBzdHJlYW0gKGUuZy4gaXQgY2FtZSBmcm9tIGEgc3RlcC1jb250ZXh0IGBnZXRXcml0YWJsZSgpYFxuICAgICAgLy8gb3Igd2FzIGh5ZHJhdGVkIGZyb20gYSB3b3JrZmxvdyBpbnB1dCBieSBgZ2V0U3RlcFJldml2ZXJzYCksXG4gICAgICAvLyBmb3J3YXJkIGl0cyB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCB0byB0aGUgcmVjZWl2aW5nIHJ1bi5cbiAgICAgIC8vIFRoZSByZWNlaXZpbmcgcnVuJ3Mgc3RlcC1zaWRlIHJldml2ZXIgb3BlbnMgYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZXMgdGhhdCBydW4nc1xuICAgICAgLy8gZW5jcnlwdGlvbiBrZXkgZGlyZWN0bHksIHNvIHdyaXRlcyBsYW5kIG9uIHRoZSBvcmlnaW5hbCBzdHJlYW1cbiAgICAgIC8vIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgcmVjZWl2aW5nIHJ1biwgd2l0aCBubyBpbi1wcm9jZXNzXG4gICAgICAvLyBicmlkZ2UgdGllZCB0byB0aGUgZGVoeWRyYXRpbmcgc3RlcCdzIGxpZmV0aW1lLlxuICAgICAgY29uc3QgZXhpc3RpbmdOYW1lID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdOYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdSdW5JZCA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0ge1xuICAgICAgICAgIG5hbWU6IGV4aXN0aW5nTmFtZSxcbiAgICAgICAgICBydW5JZDogZXhpc3RpbmdSdW5JZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQdWJsaWNLZXkgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdQdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5lbmNyeXB0aW9uUHVibGljS2V5ID0gZXhpc3RpbmdQdWJsaWNLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhpc3RpbmdEZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdEZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5kZXBsb3ltZW50SWQgPSBleGlzdGluZ0RlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKTtcbiAgICAgIG9wcy5wdXNoKHJlYWRhYmxlLnBpcGVUbyh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIGNsaWVudCBzaWRlIGFuZCBpbnRvIHN0ZXAgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEByZXR1cm5zXG4gKi9cbi8qKlxuICogUHJvdG90eXBlcyB1c2VkIGZvciBicmFuZC1zdHlsZSBpZGVudGlmaWNhdGlvbiBpbiB0aGUgcmVkdWNlcnMgYmVsb3cuXG4gKlxuICogVGhlIHN0cmVhbSBhbmQgYWJvcnQgY2xhc3NlcyBhcmUgaG9zdCBjbGFzc2VzIGluamVjdGVkIGludG8gdGhlIHNhbmRib3gsIHNvXG4gKiBpbnN0YW5jZXMgY2FycnkgdGhlIGhvc3QgcHJvdG90eXBlIGluIHRoZWlyIGNoYWluIGFuZCBhIGNoYWluIHdhbGtcbiAqIGlkZW50aWZpZXMgdGhlbSB3aXRob3V0IGNvbnN1bHRpbmcgYFN5bWJvbC5oYXNJbnN0YW5jZWAgb24gdGhlIHNhbmRib3hcbiAqIGNsYXNzLiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBydW50aW1lIGxhY2tzIHRoZSBjbGFzcywgaW4gd2hpY2ggY2FzZVxuICogaWRlbnRpZmljYXRpb24gZmFsbHMgYmFjayB0byB0aGUgaW5mcmFzdHJ1Y3R1cmUgc3ltYm9scyBhbG9uZS5cbiAqL1xuLyoqXG4gKiBUaGUgcHJvdG90eXBlIG9mIGEgaG9zdCBjbGFzcyB0aGF0IG1heSBhbHNvIGJlIGluamVjdGVkIGludG8gdGhlIHNhbmRib3guXG4gKiBQcmVmZXJzIHRoZSBzYW5kYm94IGJpbmRpbmcgKHRoZSBzYW1lIGhvc3QgY2xhc3Mgb2JqZWN0IGluIHByYWN0aWNlKSBhbmRcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIGhvc3QncyBvd24sIHNvIGEgY2hhaW4gd2FsayBpZGVudGlmaWVzIGluc3RhbmNlcyBmcm9tXG4gKiBlaXRoZXIgcmVhbG0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgLlxuICovXG5mdW5jdGlvbiBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgbmFtZTogc3RyaW5nXG4pOiBvYmplY3QgfCB1bmRlZmluZWQge1xuICAvLyBEZXNjcmlwdG9yIHJlYWRzIChgcmVhZFByb3BlcnR5YCksIG5vdCBiYXJlIGdldHM6IGFuIGFjY2Vzc29yIG9yIFByb3h5XG4gIC8vIHBsYW50ZWQgb24gdGhlIHNhbmRib3ggZ2xvYmFsIChvciB0aGUgY29uc3RydWN0b3IpIG11c3QgYmUgcmVjb3JkZWQgaW5cbiAgLy8gdGhlIGd1ZXN0LWNvZGUgc2luayAoaXQgZ2F0ZXMgVk0gcmV0ZW50aW9uKSwgbm90IHNpbGVudGx5IGV4ZWN1dGVkLlxuICAvLyBDYWxsZXJzIHdyYXAgdGhpcyBpbiBgb25jZSguLi4pYCBwZXIgcmVkdWNlciBzZXQsIHNvIHRoZSByZWFkIGhhcHBlbnNcbiAgLy8gZXhhY3RseSBvbmNlIHBlciBzZXJpYWxpemUgcGFzcywgb24gdGhlIGZpcnN0IGd1YXJkIGludm9jYXRpb24sIGluc2lkZVxuICAvLyB0aGUgcGFzcydzIHNpbmsgc2NvcGUsIG5ldmVyIHBlciB2YWx1ZS5cbiAgY29uc3QgY3RvciA9IHJlYWRQcm9wZXJ0eShnbG9iYWwsIG5hbWUpID8/IHJlYWRQcm9wZXJ0eShnbG9iYWxUaGlzLCBuYW1lKTtcbiAgaWYgKHR5cGVvZiBjdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcmVhZFByb3BlcnR5KGN0b3IsICdwcm90b3R5cGUnKSBhcyBvYmplY3QgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1JlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIGNvbnN0IHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZWFkYWJsZVN0cmVhbScpXG4gICk7XG4gIGNvbnN0IHdyaXRhYmxlU3RyZWFtUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdXcml0YWJsZVN0cmVhbScpXG4gICk7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlclByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnQWJvcnRDb250cm9sbGVyJylcbiAgKTtcbiAgY29uc3QgYWJvcnRTaWduYWxQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0U2lnbmFsJylcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFJlYWRhYmxlL1dyaXRhYmxlIHN0cmVhbXMgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICAgIC8vIGFyZSBcImhhbmRsZXNcIiB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kIHRvIG90aGVyIHN0ZXBzLlxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiBpbnN0ZWFkIG9mIGBpbnN0YW5jZW9mIGdsb2JhbC5SZWFkYWJsZVN0cmVhbWA6XG4gICAgICAvLyB0aGUgY2xhc3MgaXMgaG9zdC1wcm92aWRlZCAoaW5qZWN0ZWQgaW50byB0aGUgc2FuZGJveCksIHNvIGl0c1xuICAgICAgLy8gcHJvdG90eXBlIGlzIGluIHRoZSBjaGFpbiBvZiBib3RoIHJlYWwgc3RyZWFtcyBhbmQgdGhlXG4gICAgICAvLyBgT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUpYCBoYW5kbGVzIHVzZWQgZm9yIHJlcXVlc3RcbiAgICAgIC8vIGJvZGllcywgYnV0IGEgY2hhaW4gd2FsayBuZXZlciBjb25zdWx0cyBgU3ltYm9sLmhhc0luc3RhbmNlYCwgd2hpY2hcbiAgICAgIC8vIHRoZSBzYW5kYm94IGNhbiBkZWZpbmUgYW5kIHdoaWNoIHJhbiBmb3IgZXZlcnkgdmFsdWUgdGhlIGVhcmxpZXJcbiAgICAgIC8vIHJlZHVjZXJzIGRpZCBub3QgY2xhaW0uIFJlYWRzIGJlbG93IGdvIHRocm91Z2ggZGVzY3JpcHRvcnMgc28gYVxuICAgICAgLy8gZ2V0dGVyIG9uIGEgc3RlcCBhcmd1bWVudCBjYW5ub3QgcnVuIHVucmVwb3J0ZWQuXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgcmVhZGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmYWtlIHN0cmVhbSBzdG9yaW5nIEJvZHlJbml0IGZyb20gUmVxdWVzdC9SZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgY29uc3QgYm9keUluaXQgPSByZWFkUHJvcGVydHkodmFsdWUsIEJPRFlfSU5JVF9TWU1CT0wpO1xuICAgICAgaWYgKGJvZHlJbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGZha2Ugc3RyZWFtIC0gc2VyaWFsaXplIHRoZSBCb2R5SW5pdCBkaXJlY3RseVxuICAgICAgICAvLyBkZXZhbHVlIHdpbGwgaGFuZGxlIHNlcmlhbGl6aW5nIHN0cmluZ3MsIFVpbnQ4QXJyYXksIGV0Yy5cbiAgICAgICAgcmV0dXJuIHsgYm9keUluaXQgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgU1RSRUFNX05BTUVfU1lNQk9MKSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdSZWFkYWJsZVN0cmVhbSBgbmFtZWAgaXMgbm90IHNldCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgczogRXh0cmFjdDxcbiAgICAgICAgU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSxcbiAgICAgICAgeyBuYW1lOiBzdHJpbmcgfVxuICAgICAgPiA9IHsgbmFtZSB9O1xuICAgICAgY29uc3QgdHlwZSA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgU1RSRUFNX1RZUEVfU1lNQk9MKSBhc1xuICAgICAgICB8ICdieXRlcydcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGNvbnN0IGZyYW1pbmcgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9GUkFNSU5HX1NZTUJPTCkgYXNcbiAgICAgICAgfCBCeXRlU3RyZWFtRnJhbWluZ1xuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmcmFtaW5nKSBzLmZyYW1pbmcgPSBmcmFtaW5nO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTZWUgdGhlIFJlYWRhYmxlU3RyZWFtIHJlZHVjZXIgYWJvdmUgZm9yIHdoeSB0aGlzIHdhbGtzIHRoZSBjaGFpbi5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCB3cml0YWJsZVN0cmVhbVByb3RvdHlwZS52YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSB3YXMgZm9yd2FyZGVkIGZyb20gYW5vdGhlciBydW4gKHBhcmVudCDihpIgY2hpbGRcbiAgICAgIC8vIHZpYSBgc3RhcnQoKWApLCBwcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCBzbyB0aGUgc3RlcC1zaWRlXG4gICAgICAvLyByZXZpdmVyIG9wZW5zIHRoZSB3cml0YWJsZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBzdHJlYW0uXG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25SdW5JZCA9PT0gJ3N0cmluZycpIHMucnVuSWQgPSBmb3JlaWduUnVuSWQ7XG4gICAgICBjb25zdCBmb3JlaWduRGVwbG95bWVudElkID0gcmVhZFByb3BlcnR5KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yZWlnblB1YmxpY0tleSA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZW5jcnlwdGlvblB1YmxpY0tleSA9IGZvcmVpZ25QdWJsaWNLZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIGluIHdvcmtmbG93IGNvbnRleHQ6IHJlYWQgb25seSBzeW1ib2xzIChoYW5kbGVzKS5cbiAgICAvLyBJbiB0aGUgd29ya2Zsb3cgVk0sIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgaXMgYSBjbGFzcyBidXQgZ2xvYmFsLkFib3J0U2lnbmFsXG4gICAgLy8gaXMgYSBwbGFpbiBvYmplY3QgKG5vdCBhIGNsYXNzKSwgc28gaW5zdGFuY2VvZiBjaGVja3Mgd29uJ3Qgd29yayBmb3Igc2lnbmFscy5cbiAgICAvLyBEZXRlY3QgaW5zdGFuY2VzIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgQUJPUlRfU1RSRUFNX05BTUUgc3ltYm9sIGluc3RlYWQuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIGB2YWx1ZS5zaWduYWxgIHdhcyBhIGJhcmUgcmVhZCwgc28gYSBgc2lnbmFsYCBnZXR0ZXIgb24gYW55IG9iamVjdFxuICAgICAgLy8gcmVhY2hpbmcgdGhpcyByZWR1Y2VyIGV4ZWN1dGVkIHVucmVwb3J0ZWQuIFJlYWQgdGhyb3VnaCBkZXNjcmlwdG9yc1xuICAgICAgLy8gYW5kIGdhdGUgb24gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbCAvIHByb3RvdHlwZSBmaXJzdC5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBob2xkZXIgPSB2YWx1ZSBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEhvbGRlcjtcbiAgICAgIGNvbnN0IG93blN5bWJvbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpO1xuICAgICAgY29uc3QgaXNOYXRpdmVBYm9ydENvbnRyb2xsZXIgPSBpc0luc3RhbmNlT2ZQcm90b3R5cGUoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXJQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAob3duU3ltYm9sID09PSB1bmRlZmluZWQgJiYgIWlzTmF0aXZlQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgIC8vIE5vdCBvdXJzIGFuZCBub3QgYSBuYXRpdmUgY29udHJvbGxlciwgYnV0IGEgZm9yZWlnbiBjb250cm9sbGVyXG4gICAgICAgIC8vIG1heSBzdGlsbCBjYXJyeSB0aGUgc3ltYm9sIG9uIGl0cyBzaWduYWwuXG4gICAgICAgIGNvbnN0IG1heWJlU2lnbmFsID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnc2lnbmFsJyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtYXliZVNpZ25hbCA9PT0gbnVsbCB8fFxuICAgICAgICAgIHR5cGVvZiBtYXliZVNpZ25hbCAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgICByZWFkUHJvcGVydHkobWF5YmVTaWduYWwsIEFCT1JUX1NUUkVBTV9OQU1FKSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc2lnbmFsID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnc2lnbmFsJyk7XG4gICAgICBpZiAoIXNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0QnlTeW1ib2woc2lnbmFsIGFzIEFib3J0U2lnbmFsLCBob2xkZXIpO1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc0Fib3J0U3ltYm9sID1cbiAgICAgICAgcmVhZFByb3BlcnR5KHZhbHVlLCBBQk9SVF9TVFJFQU1fTkFNRSkgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRTaWduYWwgPSBpc0luc3RhbmNlT2ZQcm90b3R5cGUoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBhYm9ydFNpZ25hbFByb3RvdHlwZS52YWx1ZVxuICAgICAgKTtcbiAgICAgIGlmICghaGFzQWJvcnRTeW1ib2wgJiYgIWlzTmF0aXZlQWJvcnRTaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlIGFzIEFib3J0U2lnbmFsLCB2YWx1ZSBhcyBBYm9ydEhvbGRlcik7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCBwYXNzaW5nIHJldHVybiB2YWx1ZSB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIHJldHVybmVkIGBSZWFkYWJsZVN0cmVhbWAgaXMgcGlwZWQgdG8gdGhlIHNlcnZlclxuICAvLyBhZnRlciB0aGUgYm9keSBidXQgd2l0aGluIHRoZSBzYW1lIG9wIGZsdXNoLCBzbyBpdHMgZmlyc3QgY2h1bmsgY2FuIHJhY2VcbiAgLy8gYHJ1bl9zdGFydGVkYC4gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBpbnRvIHRoZSBzaW5rIHNvIHRoYXQgd3JpdGVcbiAgLy8gb3JkZXJzIGFmdGVyIHRoZSBydW4gZXhpc3RzLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWFkYWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU3RyZWFtIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHBhc3NpbmcgYWNyb3NzIGV4ZWN1dGlvbiBib3VuZGFyeVxuICAgICAgaWYgKHZhbHVlLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdSZWFkYWJsZVN0cmVhbSBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cgYm91bmRhcnkuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnUGFzcyB0aGUgc3RyZWFtIGJlZm9yZSBjYWxsaW5nIC5nZXRSZWFkZXIoKSAvIC5waXBlVGhyb3VnaCgpIC8gLnBpcGVUbygpLCBvciB0ZWUgaXQgd2l0aCAudGVlKCkgYW5kIHBhc3Mgb25lIG9mIHRoZSBicmFuY2hlcy4nLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmVhbSBhbHJlYWR5IGhhcyB0aGUgbmFtZSBzeW1ib2wgc2V0LCBpbiB3aGljaCBjYXNlXG4gICAgICAvLyBpdCdzIGFscmVhZHkgYmVpbmcgc3VuayB0byB0aGUgc2VydmVyIGFuZCB3ZSBjYW4gcmV0dXJuIHRoZVxuICAgICAgLy8gbmFtZSBhbmQgdHlwZS5cbiAgICAgIGxldCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGxldCB0eXBlID0gdmFsdWVbU1RSRUFNX1RZUEVfU1lNQk9MXTtcbiAgICAgIC8vIFRoZSBmcmFtaW5nIHN5bWJvbCBpcyBzZXQgd2hlbiBhIHdvcmtmbG93IFZNIHJldml2ZXMgYSBzdHJlYW1cbiAgICAgIC8vIGhhbmRsZSBmcm9tIGEgcHJldmlvdXMgc3RlcCAoc2VlIGBnZXRXb3JrZmxvd1Jldml2ZXJzYCkuIFdoZW5cbiAgICAgIC8vIHByZXNlbnQgd2UgbXVzdCBwcm9wYWdhdGUgdGhlIHNhbWUgZnJhbWluZyBjaG9pY2Ugb24gdGhlIHdheVxuICAgICAgLy8gYmFjayBvdXQsIHNpbmNlIHRoZSBieXRlcyBhbHJlYWR5IG9uIHRoZSBzZXJ2ZXIncyBzdHJlYW0gYXJlIGluXG4gICAgICAvLyB0aGF0IGZvcm1hdDsgc3dpdGNoaW5nIGZvcm1hdCBtaWQtc3RyZWFtIHdvdWxkIGNvcnJ1cHQgdGhlbS5cbiAgICAgIGxldCBmcmFtaW5nOiBCeXRlU3RyZWFtRnJhbWluZyB8IHVuZGVmaW5lZCA9IHZhbHVlW1NUUkVBTV9GUkFNSU5HX1NZTUJPTF07XG5cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgICBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgICB0eXBlID0gZ2V0U3RyZWFtVHlwZSh2YWx1ZSk7XG4gICAgICAgIGZyYW1pbmcgPSB0eXBlID09PSAnYnl0ZXMnICYmIGZyYW1lZEJ5dGVTdHJlYW1zID8gJ2ZyYW1lZC12MScgOiBmcmFtaW5nO1xuXG4gICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgICBpZiAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgICB2YWx1ZS5waXBlVGhyb3VnaChnZXRCeXRlRnJhbWluZ1N0cmVhbSgpKS5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHMucHVzaCh2YWx1ZS5waXBlVG8od3JpdGFibGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgICAgZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyeXB0b0tleSxcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5Xcml0YWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgICBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSlcbiAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnblB1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICBdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmRlcGxveW1lbnRJZCA9IGZvcmVpZ25EZXBsb3ltZW50SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUuc2lnbmFsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydFNpZ25hbCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRTaWduYWwpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENhbmNlbCBkYW5nbGluZyBhYm9ydC1zdHJlYW0gcmVhZGVycyBvbiBhbnkgQWJvcnRDb250cm9sbGVyIGluc3RhbmNlcyBmb3VuZFxuICogaW4gdGhlIGh5ZHJhdGVkIHN0ZXAgYXJndW1lbnRzLiBDYWxsZWQgYWZ0ZXIgdGhlIHN0ZXAgZnVuY3Rpb24gcmV0dXJuc1xuICogKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgdG8gcHJldmVudCByZWFkZXIgcHJvbWlzZXMgZnJvbSBrZWVwaW5nIHRoZSBzZXJ2ZXJsZXNzXG4gKiBmdW5jdGlvbiBhbGl2ZSBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxBYm9ydFJlYWRlcnMoLi4udmFsdWVzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gIGZ1bmN0aW9uIGNhbmNlbElmUHJlc2VudCh2YWw6IEFib3J0SW50ZXJuYWxzKTogdm9pZCB7XG4gICAgY29uc3QgY2FuY2VsID0gdmFsW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICAgIGlmIChjYW5jZWwgJiYgIWNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY2FuY2VsLmFib3J0KCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHdhbGsodmFsOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCBhcyBvYmplY3QpKSByZXR1cm47XG4gICAgdmlzaXRlZC5hZGQodmFsIGFzIG9iamVjdCk7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0Q29udHJvbGxlcikge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscyk7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsLnZhbHVlcygpKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0L1Jlc3BvbnNlIGV4cG9zZSBgc2lnbmFsYC9gYm9keWAgYXMgcHJvdG90eXBlIGdldHRlcnMsIHNvXG4gICAgLy8gT2JqZWN0LnZhbHVlcygpIHdvbid0IGZpbmQgdGhlbS4gRGVzY2VuZCBleHBsaWNpdGx5LlxuICAgIGlmICh0eXBlb2YgUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgd2Fsayh2YWwuc2lnbmFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXModmFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgd2Fsayh2KTtcbiAgfVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB3YWxrKHYpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgYSBzdHJlYW0gcmVhZGVyIG9uIHRoZSBjb250cm9sbGVyIHRoYXQgbGlzdGVucyBmb3IgYW4gYWJvcnQgcGFja2V0LlxuICogUmV0dXJucyB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXIgc28gaXQgY2FuIGJlIHN0b3JlZCBvbiBib3RoIHRoZVxuICogY29udHJvbGxlciBhbmQgc2lnbmFsIGZvciBjbGVhbnVwIGJ5IGNhbmNlbEFib3J0UmVhZGVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICBydW5JZDogc3RyaW5nLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCByZWFkZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgb3BzLnB1c2goXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPHsgdmFsdWU6IHVuZGVmaW5lZDsgZG9uZTogdHJ1ZSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYWRlckNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyQ2FuY2VsLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAnYWJvcnQnLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIC8vIEFuIGFib3J0IHBhY2tldCBhcnJpdmVkOiBwcm9wYWdhdGUgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gUmVsZWFzZVxuICAgICAgICAgIC8vIHRoZSBsb2NrIChzeW5jaHJvbm91cykgcmF0aGVyIHRoYW4gY2FuY2VsbGluZyBoZXJlOiBvbiBhXG4gICAgICAgICAgLy8gc2VydmljZS1iYWNrZWQgV29ybGQgYHJlYWRlci5jYW5jZWwoKWAgY2FuIGRvIGEgbmV0d29yayByb3VuZC10cmlwLFxuICAgICAgICAgIC8vIGFuZCBhd2FpdGluZyBpdCBiZWZvcmUgYGNvbnRyb2xsZXIuYWJvcnQoKWAgd291bGQgZGVsYXkgKG9yLCBpZiBpdFxuICAgICAgICAgIC8vIGhhbmdzLCBkcm9wKSByZWFsLXRpbWUgYWJvcnQgZGVsaXZlcnkgdG8gdGhlIGluLWZsaWdodCBzdGVwLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFJlYWRlciBtYXkgYWxyZWFkeSBiZSByZWxlYXNlZDsgaWdub3JlLlxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSB3cml0ZXIgdXNlZCBzbyB0aGUgcmVhc29uXG4gICAgICAgICAgICAvLyByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gRW5jcnlwdGlvbiBrZXkgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGNvbWVzIGZyb20gdGhlIHN0ZXAgY29udGV4dCwgc2V0IHVwIGJ5IHRoZSBzdGVwIGV4ZWN1dG9yIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCAobm90IGp1c3QgcmVsZWFzZSkgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkOiBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5OiB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5LCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCAoZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGApIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgcmVzdW1lSG9va0R1cmFibGVgLCBub3QgYHJlc3VtZUhvb2tgOiBhd2FpdGluZyB0aGUgbGF0dGVyIG9ubHlcbiAgICAgICAgLy8gZ3VhcmFudGVlcyB0aGUgcmVzdW1lIHdhcyBwdWJsaXNoZWQsIHNpbmNlIHRoZSBsYXp5IHBhdGggbGVhdmVzIHRoZVxuICAgICAgICAvLyBldmVudCB3cml0ZSB0byB0aGUgcXVldWUgY29uc3VtZXIuIFRoYXQgd291bGQgc2F0aXNmeVxuICAgICAgICAvLyBgcHJlQ29tcGxldGlvbk9wc2Agd2hpbGUgbGVhdmluZyB0aGUgdmVyeSByYWNlIHRoaXMgb3JkZXJpbmcgZXhpc3RzXG4gICAgICAgIC8vIHRvIHByZXZlbnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFN3YWxsb3cgZXJyb3JzIGhlcmUgc28gdGhlIHByb21pc2UgY2FuIG9ubHkgZXZlciBlbmZvcmNlIG9yZGVyaW5nXG4gICAgICAgIC8vIHdoZW4gYXdhaXRlZCAoc2VlIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb25cbiAgICAgICAgLy8gU3RlcENvbnRleHQucHJlQ29tcGxldGlvbk9wcyk7IGEgZmFpbGVkIHJlc3VtZSByZXRyaWVzIG9uIG5leHQgcmVwbGF5LlxuICAgICAgICBjb25zdCBob29rUmVzdW1lID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyByZXN1bWVIb29rRHVyYWJsZSB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2tEdXJhYmxlKHZhbHVlLmhvb2tUb2tlbiwge1xuICAgICAgICAgICAgICBhYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGhvb2sgcmVzdW1lOiByZXRyeSBvbiBuZXh0IHJlcGxheVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY3R4LnByZUNvbXBsZXRpb25PcHMucHVzaChob29rUmVzdW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogUmV2aXZlcyBvbmx5IGFuIEFib3J0U2lnbmFsIHdpdGhvdXQgdGhlIHBhdGNoZWQgYWJvcnQoKSBvdmVyaGVhZC5cbiAqIFVzZWQgd2hlbiBvbmx5IGEgc2lnbmFsIChub3QgYSBjb250cm9sbGVyKSB3YXMgc2VyaWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRTaWduYWwoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydFNpZ25hbCddLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbn1cblxuLyoqXG4gKiBCYXNlIHJldml2ZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIGNvbW1vbiByZXZpdmVycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKlxuICogVGhpcyBpcyBleHBvcnRlZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24tZm9ybWF0LnRzIGFuZCBvdGhlciBmaWxlcyByZWZlcmVuY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzKSB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgIC4uLmdldENvbW1vblJldml2ZXJzRnJvbU1vZHVsZShnbG9iYWwpLFxuICB9IGFzIGNvbnN0IHNhdGlzZmllcyBQYXJ0aWFsPFJldml2ZXJzPjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3cml0ZS1vbmx5IGtleSBhIHJ1biBuZWVkcyB3aGVuIHdyaXRpbmcgaW50byBhbm90aGVyIHJ1bidzXG4gKiBmb3J3YXJkZWQgc3RyZWFtLlxuICpcbiAqIFRocmVlIHRpZXJzLCBjaGVhcGVzdCBmaXJzdDpcbiAqXG4gKiAxLiBUaGUgZGVzY3JpcHRvciBjYXJyaWVzIHRoZSBvd25lcidzIFgyNTUxOSBwdWJsaWMga2V5OiBzZWFsIHRvIGl0IHdpdGhcbiAqICAgIG5vIEkvTyB3aGF0c29ldmVyLiBUaGUgb3duZXIgcHVibGlzaGVkIHRoZSBrZXkgd2hlbiBpdCBjcmVhdGVkIHRoZVxuICogICAgc3RyZWFtLCBzbyB0aGlzIGlzIHRoZSB6ZXJvLXJvdW5kLXRyaXAgcGF0aC5cbiAqIDIuIFRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgdGhlIG93bmVyJ3MgZGVwbG95bWVudCBJRDogcmVzb2x2ZSB0aGUgb3duZXInc1xuICogICAgc3ltbWV0cmljIGtleSwgd2hpY2ggY3Jvc3MtZGVwbG95bWVudCBtZWFucyBhIGtleS1BUEkgcm91bmQgdHJpcC5cbiAqIDMuIE5laXRoZXIgKGRlc2NyaXB0b3JzIHdyaXR0ZW4gYnkgb2xkZXIgU0RLcyk6IGxvYWQgdGhlIG93bmluZyBydW4gZmlyc3QsXG4gKiAgICB0aGVuIHJlc29sdmUgaXRzIHN5bW1ldHJpYyBrZXkuXG4gKlxuICogVGllcnMgMiBhbmQgMyBpbXBvcnQgdGhlIGtleSBlbmNyeXB0LW9ubHksIHdoaWNoIGlzIGFuIGhvbm9yLXN5c3RlbVxuICogcmVzdHJpY3Rpb246IHRoZSBzYW1lIGJ5dGVzIGNvdWxkIGRlY3J5cHQuIFRpZXIgMSBtYWtlcyBpdCBhIGNyeXB0b2dyYXBoaWNcbiAqIGd1YXJhbnRlZTogYSBwdWJsaWMga2V5IGNhbm5vdCByZWFkIGFueXRoaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IGRlY29kZVJ1blB1YmxpY0tleShlbmNyeXB0aW9uUHVibGljS2V5KTtcbiAgaWYgKG93bmVyUHVibGljS2V5KSByZXR1cm4gc2VhbFRvKG93bmVyUHVibGljS2V5KTtcblxuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBpZiAoIXdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcmF3S2V5ID0gZGVwbG95bWVudElkXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKHJ1bklkLCB7IGRlcGxveW1lbnRJZCB9KVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCkpO1xuICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSwgWydlbmNyeXB0J10pIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+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+ID0ge31cbik6IHVua25vd24ge1xuICBjb25zdCB7IGRhdGEgfSA9IHByZXBhcmVkO1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4gdW5mbGF0dGVuKGRhdGEgYXMgYW55W10sIHtcbiAgICAgIC4uLmdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGEpO1xuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWh5ZHJhdGUgLyBIeWRyYXRlIEZ1bmN0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlc2UgZGVsZWdhdGUgdG8gdGhlIG1vZHVsYXIgbW9kZSBtb2R1bGVzICh3b3JrZmxvdywgc3RlcCwgY2xpZW50KSBwYXNzaW5nXG4vLyBtb2RlLXNwZWNpZmljIHN0cmVhbSBhbmQgUmVxdWVzdC9SZXNwb25zZSByZWR1Y2Vycy9yZXZpdmVycyBhcyBleHRyYSBvcHRpb25zLlxuLy8gVGhlIHYxQ29tcGF0IHBhdGggaXMgaGFuZGxlZCBpbmxpbmUgYmVmb3JlIGRlbGVnYXRpbmcgdG8gdGhlIG1vZHVsZXMuXG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGBzdGFydCgpYCBmdW5jdGlvbiB0byBzZXJpYWxpemUgdGhlIHdvcmtmbG93IGFyZ3VtZW50c1xuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgYW5kIHRoZW4gaHlkcmF0ZWQgZnJvbVxuICogd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHJ1bklkIC0gVGhlIHdvcmtmbG93IHJ1biBJRCAocmVxdWlyZWQgZm9yIGVuY3J5cHRpb24gY29udGV4dClcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIHYxQ29tcGF0IC0gRW5hYmxlIGxlZ2FjeSB2MSBjb21wYXRpYmlsaXR5IG1vZGVcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZXRoZXIgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZSB3aXJlLWZyYW1lZFxuICogICBieXRlIHN0cmVhbXMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBjYXBhYmlsaXR5OiBzZWVcbiAqICAgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzIHRvIGBmYWxzZWAgZm9yXG4gKiAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSwgZnJhbWVkQnl0ZVN0cmVhbXMpXG4gICAgKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnd29ya2Zsb3cgYXJndW1lbnRzJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQgdG8gaHlkcmF0ZSB0aGUgd29ya2Zsb3dcbiAqIGFyZ3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBhdCB0aGUgc3RhcnQgb2Ygd29ya2Zsb3cgZXhlY3V0aW9uLiBBIHByZXBhcmVkXG4gKiBwYXlsb2FkIHNraXBzIGhvc3Qtc2lkZSBkZWNyeXB0L2RlY29tcHJlc3MgYnV0IGFsd2F5cyBwZXJmb3JtcyBWTSByZXZpdmFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vKipcbiAqIERlaHlkcmF0ZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgZm9yIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZSxcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNpbmsgcmVjZWl2aW5nIHRoZSBmaXJzdCBmaXZlIHNhbXBsZXMgYW5kIGV4YWN0IHRvdGFsIGNvdW50IG9mXG4gICAqIHdvcmtmbG93LWNvZGUgZXhlY3V0aW9ucyBzZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBhdm9pZC4gVGhlIGRpYWdub3N0aWNzXG4gICAqIGFyZSBlbWl0dGVkIGFzIHNwYW4gYXR0cmlidXRlcyBlaXRoZXIgd2F5LCBzbyBvbWl0dGluZyB0aGlzIGxvc2VzIG5vdGhpbmdcbiAgICogb2JzZXJ2YWJpbGl0eS13aXNlLiBUaGUgcmV0YWluZWQtVk0gZ2F0ZSBpbiBydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci50c1xuICAgKiBwYXNzZXMgb25lIGZvciBzdGVwLWlucHV0IGRlaHlkcmF0aW9uLlxuICAgKi9cbiAgZ3Vlc3RDb2RlU3RhdHNPdXQ/OiBHdWVzdENvZGVTdGF0c1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGd1ZXN0Q29kZVN0YXRzOiBHdWVzdENvZGVTdGF0cyA9IGd1ZXN0Q29kZVN0YXRzT3V0ID8/IHtcbiAgICAgIGV4ZWN1dGlvbnM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgICBndWVzdENvZGVTdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgYXdhaXQgcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhndWVzdENvZGVTdGF0cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnd29ya2Zsb3cgcmV0dXJuIHZhbHVlJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgdG8gaHlkcmF0ZSB0aGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlXG4gKiBvZiBhIGNvbXBsZXRlZCB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiBhIHN0ZXAgaXMgYmVpbmcgY3JlYXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZSxcbiAgLyoqIFNlZSBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAuICovXG4gIGd1ZXN0Q29kZVN0YXRzT3V0PzogR3Vlc3RDb2RlU3RhdHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBndWVzdENvZGVTdGF0czogR3Vlc3RDb2RlU3RhdHMgPSBndWVzdENvZGVTdGF0c091dCA/PyB7XG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgICAgZ3Vlc3RDb2RlU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIGF3YWl0IHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoZ3Vlc3RDb2RlU3RhdHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGFyZ3VtZW50cycsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB0byBoeWRyYXRlIHRoZSBhcmd1bWVudHMgb2YgYSBzdGVwXG4gKiBmcm9tIHRoZSBkYXRhYmFzZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0ZXAgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZ1xuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGRlcGxveW1lbnRJZClcbiAgICAgICksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gICAgY29tcHJlc3Npb25TdGF0cyxcbiAgfSk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGV4ZWN1dG9yIHdoZW4gYSBzdGVwIGhhcyBjb21wbGV0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eTogc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTxhbnk+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogb3JkZXIgdGhlIGZpcnN0IGNodW5rIG9mIGEgcmV0dXJuZWQgc3RyZWFtIGFmdGVyXG4gIC8vIHRoZSBiYWNrZ3JvdW5kZWQgYHJ1bl9zdGFydGVkYC4gVGhyZWFkZWQgaW50byB0aGUgc3RlcCByZWR1Y2Vycycgc3RyZWFtXG4gIC8vIHNpbmsuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KFxuICAgICAgdmFsdWUsXG4gICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAga2V5LFxuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3N0ZXAgcmV0dXJuIHZhbHVlJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCB0aHJvd3MuIERlaHlkcmF0ZXMgdGhlIHRocm93blxuICogdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50IGludG8gYSBmb3JtYXQgdGhhdCBjYW5cbiAqIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LlxuICpcbiAqIEFueSBKYXZhU2NyaXB0IHZhbHVlIGNhbiBiZSB0aHJvd24gKHN0cmluZ3MsIG51bWJlcnMsIG9iamVjdHMsIEVycm9ycyxcbiAqIEVycm9yIHN1YmNsYXNzZXMpLCBzbyB0aGUgc2FtZSBzZXJpYWxpemF0aW9uIHBpcGVsaW5lIHVzZWQgZm9yIHN0ZXBcbiAqIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyBpcyBhcHBsaWVkIGhlcmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmc6IGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYVxuICogYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuIEh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbVxuICogdGhlIGRhdGFiYXNlIHNvIHRoZSB3b3JrZmxvdyBjYW4gc2VlIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHBhcmFtIHByZXBhcmVkIC0gT3B0aW9uYWwgY2FjaGVkIGRlY3J5cHQvZGVjb21wcmVzcyByZXN1bHRcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIHJlamVjdCB0aGUgc3RlcCBwcm9taXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRTdGVwRXJyb3IoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gdGhlIHdvcmtmbG93IGl0c2VsZiB0aHJvd3MuXG4gKiBEZWh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgcnVuX2ZhaWxlZGAgZXZlbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIC8vIENvbXByZXNzIGJlZm9yZSBlbmNyeXB0aW5nOiBlbmNyeXB0ZWQgYnl0ZXMgZG9uJ3QgY29tcHJlc3MuXG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBjb21wcmVzcyhcbiAgICAgIHNlcmlhbGl6ZWQsXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICBjb21wcmVzc2VkIGFzIFVpbnQ4QXJyYXksXG4gICAgICBrZXlcbiAgICApKSBhcyBVaW50OEFycmF5O1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcigncnVuIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSAob3Igb2JzZXJ2YWJpbGl0eSB0b29scykgdG8gaHlkcmF0ZSB0aGUgcnVuXG4gKiBlcnJvciB2YWx1ZSBvZiBhIGZhaWxlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byBiZSBjb25zdW1lZCBieSB0aGUgY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUnVuRXJyb3IoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IGRlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgbm90ZSBpbiBgaHlkcmF0ZVN0ZXBFcnJvcmA6IHRoaXMgYnJhbmNoIGlzIGZvclxuICAgIC8vIGRldmFsdWUgZmxhdHRlbmVkIGFycmF5cyBmcm9tIGxlZ2FjeSBjYWxsZXJzOyBjdXJyZW50IFNESyB2ZXJzaW9uc1xuICAgIC8vIGFsd2F5cyBlbWl0IGEgVWludDhBcnJheSwgYW5kIGEgbWlzc2hhcGVuIHZhbHVlIGhlcmUgaW50ZW50aW9uYWxseVxuICAgIC8vIHRocm93cyB2aWEgYHVuZmxhdHRlbmAgc28gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaCBpbiBvMTF5IGhlbHBlcnNcbiAgICAvLyBzdXJmYWNlcyB0aGUgaXNzdWUgcmF0aGVyIHRoYW4gbWFza2luZyBpdC5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqIEh5ZHJhdGVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdGVwIGZyb20gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nXG4gKiBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vLyAtLS0tIEhlbHBlcnMgdG8gZXh0cmFjdCBzdHJlYW0vUmVxdWVzdC9SZXNwb25zZSByZWR1Y2VycyBhbmQgcmV2aXZlcnMgLS0tLVxuLy8gVGhlIG1vZGUtc3BlY2lmaWMgZ2V0KlJlZHVjZXJzL2dldCpSZXZpdmVycyBmdW5jdGlvbnMgcmV0dXJuIG9iamVjdHMgdGhhdFxuLy8gaW5jbHVkZSBib3RoIFwiY29tbW9uXCIgZW50cmllcyAoRGF0ZSwgRXJyb3IsIE1hcCwgZXRjLikgYW5kIG1vZGUtc3BlY2lmaWNcbi8vIGVudHJpZXMgKFJlYWRhYmxlU3RyZWFtLCBXcml0YWJsZVN0cmVhbSwgUmVxdWVzdCwgUmVzcG9uc2UsIFN0ZXBGdW5jdGlvbikuXG4vLyBUaGUgY29tbW9uIGVudHJpZXMgYXJlIGFscmVhZHkgY29tcG9zZWQgYnkgdGhlIGNvZGVjLiBXZSBvbmx5IG5lZWQgdG9cbi8vIHBhc3MgdGhyb3VnaCB0aGUgbW9kZS1zcGVjaWZpYyBlbnRyaWVzIGFzIGV4dHJhUmVkdWNlcnMvZXh0cmFSZXZpdmVycy5cblxuY29uc3QgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMgPSBbXG4gICdSZWFkYWJsZVN0cmVhbScsXG4gICdXcml0YWJsZVN0cmVhbScsXG4gICdSZXF1ZXN0JyxcbiAgJ1Jlc3BvbnNlJyxcbiAgJ1N0ZXBGdW5jdGlvbicsXG4gIC8vIFdpcmUgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHRocm91Z2ggdGhlIGNsaWVudCBzZXJpYWxpemF0aW9uIHBhdGggc29cbiAgLy8gc2lnbmFscyByZWFjaGFibGUgdmlhIFJlcXVlc3Quc2lnbmFsIChvciBhcyBkaXJlY3QgYXJndW1lbnRzKSBnZXQgdGhlaXJcbiAgLy8gZGVkaWNhdGVkIHJlZHVjZXIuIFdpdGhvdXQgdGhpcywgZGV2YWx1ZSBmYWxscyBiYWNrIHRvIGl0cyBhcmJpdHJhcnktUE9KT1xuICAvLyBwYXRoIGFuZCBmYWlscyBmb3IgYW55IHNpZ25hbCB0aGUgUmVxdWVzdCByZWR1Y2VyIGZvcndhcmRzLlxuICAnQWJvcnRDb250cm9sbGVyJyxcbiAgJ0Fib3J0U2lnbmFsJyxcbl0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgYWxsUmVkdWNlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZWR1Y2Vycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICBhbGxSZXZpdmVyczogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMpIHtcbiAgICBpZiAoa2V5IGluIGFsbFJldml2ZXJzKSB7XG4gICAgICBleHRyYVtrZXldID0gYWxsUmV2aXZlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuIl19
|
|
3214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsNERBQTREO0FBQzVELHNFQUFzRTtBQUN0RSxzREFBc0Q7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEtBQUssWUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFFTCxRQUFRLEVBQ1IsVUFBVSxHQUNYLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1Asb0JBQW9CLEVBRXBCLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsWUFBWSxFQUdaLG9CQUFvQixFQUNwQixjQUFjLEVBRWQsTUFBTSxHQUNQLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixxQkFBcUIsR0FDdEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUVMLHFCQUFxQixFQUNyQixZQUFZLEdBQ2IsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLElBQUksMkJBQTJCLEVBQ2hELE1BQU0sR0FDUCxNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsc0JBQXNCLEdBQ3ZCLE1BQU0sMkNBQTJDLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBRUwsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sS0FBSyxjQUFjLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixrQ0FBa0MsRUFDbEMsK0JBQStCLEVBQy9CLDJCQUEyQixFQUMzQixrQkFBa0IsRUFDbEIseUJBQXlCLEdBQzFCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sS0FBSyxJQUFJLE1BQU0scUNBQXFDLENBQUM7QUFDNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckUsdUVBQXVFO0FBQ3ZFLHdFQUF3RTtBQUN4RSxPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQU1WLE1BQU0sRUFDTixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULENBQUM7QUFPRjs7OztHQUlHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBc0I7SUFDbEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEtBQWM7SUFDOUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsSUFBSSxLQUFLLFlBQVksa0JBQWtCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxZQUFZLG9CQUFvQixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsS0FBdUIsRUFDdkIsU0FBc0M7SUFFdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO1FBQUUsT0FBTztJQUM1QixvRUFBb0U7SUFDcEUsMERBQTBEO0lBQzFELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2pCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztZQUN6QyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztZQUMxRCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQztZQUNqRCxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxpQkFBaUIsQ0FBQztZQUN6RCxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUM7WUFDN0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksaUJBQWlCLEdBQUcsQ0FBQztnQkFDM0MsQ0FBQyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FDaEMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsQ0FDcEM7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw0QkFBNEI7SUFDOUIsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUseUJBQXlCLENBQUMsS0FBcUI7SUFDNUQsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUN6RSxJQUFJLGVBQWUsS0FBSyxDQUFDO1FBQUUsT0FBTztJQUNsQyxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsSUFBSSxHQUFHLENBQ1IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN6QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM5QyxDQUNGO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDakIsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxDQUFDO1lBQ3pELEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQztTQUMvQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsNEJBQTRCO0lBQzlCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxRQUEyQixFQUMzQixTQUE2QjtJQUU3QixNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLGdFQUFnRTtJQUNoRSxxRUFBcUU7SUFDckUsc0VBQXNFO0lBQ3RFLGlEQUFpRDtJQUNqRCxNQUFNLFFBQVEsR0FBRztRQUNmLFFBQVEsRUFBRSxLQUFLO1FBQ2YsR0FBRyxFQUFFLFNBQW1DO0tBQ3pDLENBQUM7SUFDRiwyRUFBMkU7SUFDM0Usc0NBQXNDO0lBQ3RDLElBQUksV0FBNkQsQ0FBQztJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBa0I7UUFDbEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdkIsUUFBUSxDQUFDLEdBQUcsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNyRCxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQy9CLFdBQVcsR0FBRyxpQkFBaUIsQ0FDN0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFDL0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ2pCLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO2dCQUNELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLElBQUksUUFBUSxHQUFHLHNCQUFzQixDQUNuQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQzlCLE9BQU8sQ0FDTSxDQUFDO2dCQUVoQixrREFBa0Q7Z0JBQ2xELGlFQUFpRTtnQkFDakUsMERBQTBEO2dCQUMxRCxFQUFFO2dCQUNGLGdFQUFnRTtnQkFDaEUsdUVBQXVFO2dCQUN2RSwrREFBK0Q7Z0JBQy9ELFdBQVc7Z0JBQ1gsRUFBRTtnQkFDRixrRUFBa0U7Z0JBQ2xFLHVFQUF1RTtnQkFDdkUsdUVBQXVFO2dCQUN2RSxtRUFBbUU7Z0JBQ25FLDhEQUE4RDtnQkFDOUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsUUFBUSxHQUFHLHNCQUFzQixDQUMvQixtQkFBbUIsQ0FBQyxNQUFNLEVBQzFCLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDbkIsQ0FBQztnQkFDbEIsQ0FBQztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDeEIsUUFBUSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBZSxDQUFDO2dCQUNuRSxDQUFDO2dCQUVELDhEQUE4RDtnQkFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN2QyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLDZEQUE2RDtnQkFDN0Qsd0RBQXdEO2dCQUN4RCxtQ0FBbUM7Z0JBQ25DLElBQUksc0JBQXNCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3JDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLHdCQUF3QixDQUNoRCxjQUFjLEVBQ2QsS0FBSyxDQUNOLENBQUM7Z0JBQ0YsVUFBVSxDQUFDLEtBQUssQ0FDZCxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDeEQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsUUFBMkIsRUFDM0IsU0FBNkI7SUFFN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixnRUFBZ0U7SUFDaEUsTUFBTSxRQUFRLEdBQUc7UUFDZixRQUFRLEVBQUUsS0FBSztRQUNmLEdBQUcsRUFBRSxTQUFtQztLQUN6QyxDQUFDO0lBQ0YsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSxtQkFBbUI7SUFDbkIsSUFBSSxXQUE2RCxDQUFDO0lBRWxFLFNBQVMsY0FBYyxDQUFDLElBQWdCO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLFVBQVUsYUFBYSxDQUMxQixVQUFpRDtRQUVqRCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixRQUFRLENBQUMsR0FBRyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsV0FBVyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFFRCxpREFBaUQ7UUFDakQsT0FBTyxNQUFNLENBQUMsTUFBTSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxRQUFRLENBQzlCLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsR0FBRyxXQUFXLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLHVDQUF1QztZQUNoRCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FDNUIsaUJBQWlCLEVBQ2pCLGlCQUFpQixHQUFHLFdBQVcsQ0FDaEMsQ0FBQztZQUNGLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxDQUFDO1lBRXZELElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFeEQsbUVBQW1FO1lBQ25FLG1FQUFtRTtZQUNuRSwrREFBK0Q7WUFDL0QsSUFDRSxNQUFNLEtBQUssbUJBQW1CLENBQUMsU0FBUztnQkFDeEMsTUFBTSxLQUFLLG1CQUFtQixDQUFDLE1BQU0sRUFDckMsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssbUJBQW1CLENBQUMsTUFBTSxDQUFDO2dCQUNyRCxxRUFBcUU7Z0JBQ3JFLG9FQUFvRTtnQkFDcEUsMkNBQTJDO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNO29CQUNuQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osVUFBVSxDQUFDLEtBQUssQ0FDZCxJQUFJLHNCQUFzQixDQUN4QixNQUFNO3dCQUNKLENBQUMsQ0FBQyxrRUFBa0U7NEJBQ2hFLHdFQUF3RTt3QkFDNUUsQ0FBQyxDQUFDLHdFQUF3RTs0QkFDdEUsbUVBQW1FLEVBQ3pFO3dCQUNFLE9BQU8sRUFBRTs0QkFDUCxTQUFTLEVBQUUsU0FBUzs0QkFDcEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVOzRCQUM5QixZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07eUJBQ3ZDO3FCQUNGLENBQ0YsQ0FDRixDQUFDO29CQUNGLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLFNBQXFCLENBQUM7Z0JBQzFCLElBQUksQ0FBQztvQkFDSCxtRUFBbUU7b0JBQ25FLG9FQUFvRTtvQkFDcEUsaUVBQWlFO29CQUNqRSwwQkFBMEI7b0JBQzFCLFNBQVMsR0FBRyxNQUFNO3dCQUNoQixDQUFDLENBQUMsTUFBTSxXQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzt3QkFDaEUsQ0FBQyxDQUFFLENBQUMsTUFBTSxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBZ0IsQ0FBQztnQkFDL0QsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLG1FQUFtRTtvQkFDbkUsaUVBQWlFO29CQUNqRSxtRUFBbUU7b0JBQ25FLHNEQUFzRDtvQkFDdEQsSUFBSSxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN0RCxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7b0JBQ3RDLENBQUM7b0JBQ0QsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUVELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBa0I7UUFDbEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVTtZQUMvQiw4REFBOEQ7WUFDOUQsNERBQTREO1lBQzVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLFFBQVEsQ0FDakMsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLENBQUMsVUFBVSxFQUNoQixLQUFLLENBQUMsVUFBVSxDQUNqQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQ0UsY0FBYyxHQUFHLENBQUM7b0JBQ2xCLGNBQWMsR0FBRyxXQUFXLENBQUMsd0JBQXdCO2tCQUNyRCxDQUFDO29CQUNELHlCQUF5QjtvQkFDekIsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0QixNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDaEMsT0FBTztnQkFDVCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLDhDQUE4QztnQkFDOUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QixNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDaEMsT0FBTztZQUNULENBQUM7WUFFRCw2REFBNkQ7WUFDN0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUNwQixvQ0FBb0M7WUFDcEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsMkJBQTJCO0FBQzNCLCtFQUErRTtBQUMvRSxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsd0VBQXdFO0FBQ3hFLHlFQUF5RTtBQUN6RSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSwwREFBMEQ7QUFDMUQsRUFBRTtBQUNGLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0Ysd0VBQXdFO0FBQ3hFLDhEQUE4RDtBQUM5RCx1RUFBdUU7QUFDdkUsMEVBQTBFO0FBQzFFLEVBQUU7QUFDRixvRUFBb0U7QUFDcEUseUVBQXlFO0FBQ3pFLHVFQUF1RTtBQUN2RSx5RUFBeUU7QUFDekUsd0VBQXdFO0FBQ3hFLHFFQUFxRTtBQUVyRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQjtJQUlsQyxPQUFPLElBQUksZUFBZSxDQUF5QjtRQUNqRCxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7WUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTztZQUMvQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLFVBQVUsQ0FBQyxLQUFLLENBQ2QsSUFBSSxvQkFBb0IsQ0FDdEIsd0JBQXdCLEtBQUssQ0FBQyxNQUFNLDZCQUE2QjtvQkFDL0Qsc0JBQXNCLGNBQWMseUJBQXlCO29CQUM3RCxnQ0FBZ0MsRUFDbEMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FDakMsQ0FDRixDQUFDO2dCQUNGLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9ELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNwQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxzQkFBc0I7SUFJcEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFL0IsU0FBUyxjQUFjLENBQUMsSUFBZ0I7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sSUFBSSxlQUFlLENBQXlCO1FBQ2pELFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVTtZQUN6QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUMsT0FBTyxNQUFNLENBQUMsTUFBTSxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksUUFBUSxDQUM5QixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFdEIsSUFBSSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUM7b0JBQ2pDLFVBQVUsQ0FBQyxLQUFLLENBQ2QsSUFBSSxvQkFBb0IsQ0FDdEIsNEJBQTRCLFdBQVcscUJBQXFCLGNBQWMsS0FBSzt3QkFDN0Usc0VBQXNFLEVBQ3hFLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQ2pDLENBQ0YsQ0FBQztvQkFDRixPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLEdBQUcsV0FBVyxDQUFDO2dCQUM5QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSztvQkFBRSxNQUFNO2dCQUVqQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsVUFBVTtZQUNkLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsVUFBVSxDQUFDLEtBQUssQ0FDZCxJQUFJLG9CQUFvQixDQUN0QiwwQkFBMEIsTUFBTSxDQUFDLE1BQU0sbUNBQW1DO29CQUN4RSxxQ0FBcUMsRUFDdkMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FDakMsQ0FDRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMEJBQTBCLENBQ2pDLFlBQW9CLEVBQ3BCLEtBQWEsRUFDYixJQUFZLEVBQ1osVUFBbUIsRUFDbkIsU0FBa0I7SUFFbEIsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2YsTUFBTSxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZLEVBQUU7WUFDNUQsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNqQyxVQUFVLEVBQUU7Z0JBQ1YsaUJBQWlCLEVBQUUsS0FBSztnQkFDeEIsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsMkJBQTJCLEVBQUUsTUFBTTtnQkFDbkMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFlBQVk7Z0JBQ3pELEdBQUcsQ0FBQyxPQUFPLFNBQVMsS0FBSyxRQUFRO29CQUMvQixDQUFDLENBQUMsRUFBRSxpQ0FBaUMsRUFBRSxTQUFTLEVBQUU7b0JBQ2xELENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsR0FBRyxDQUFDLE9BQU8sVUFBVSxLQUFLLFFBQVE7b0JBQ2hDLENBQUMsQ0FBQyxFQUFFLDZCQUE2QixFQUFFLFVBQVUsRUFBRTtvQkFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FDcEMsWUFBb0IsRUFDcEIsS0FBYSxFQUNiLElBQVksRUFDWixTQUFrQjtJQUVsQixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDZixNQUFNLGlCQUFpQixDQUFDLGtDQUFrQyxFQUFFLFlBQVksRUFBRTtZQUN4RSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQ2pDLFVBQVUsRUFBRTtnQkFDVixpQkFBaUIsRUFBRSxLQUFLO2dCQUN4QixzQkFBc0IsRUFBRSxJQUFJO2dCQUM1QixvQ0FBb0MsRUFBRSxTQUFTO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsd0JBQXdCLENBQy9CLFlBQW9CLEVBQ3BCLEtBQWEsRUFDYixJQUFZLEVBQ1osVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsVUFBbUI7SUFFbkIsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2YsTUFBTSxpQkFBaUIsQ0FBQywrQkFBK0IsRUFBRSxZQUFZLEVBQUU7WUFDckUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNqQyxVQUFVLEVBQUU7Z0JBQ1YsaUJBQWlCLEVBQUUsS0FBSztnQkFDeEIsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsMkJBQTJCLEVBQUUsZUFBZTtnQkFDNUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFlBQVk7Z0JBQzFELDZCQUE2QixFQUFFLFVBQVU7Z0JBQ3pDLDRCQUE0QixFQUFFLFNBQVM7Z0JBQ3ZDLEdBQUcsQ0FBQyxPQUFPLFVBQVUsS0FBSyxRQUFRO29CQUNoQyxDQUFDLENBQUMsRUFBRSxpQ0FBaUMsRUFBRSxVQUFVLEVBQUU7b0JBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxPQUFPLDRCQUE2QixTQUFRLGNBQTBCO0lBQzFFLE9BQU8sQ0FBMkM7SUFFbEQsWUFBWSxLQUFhLEVBQUUsSUFBWSxFQUFFLFVBQW1CO1FBQzFELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLG9CQUFvQixDQUFDLDRCQUE0QixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCw2RUFBNkU7UUFDN0Usd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsbUNBQW1DO1FBQ25DLElBQUksU0FBNkIsQ0FBQztRQUNsQyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMvQixzRUFBc0U7UUFDdEUsZ0VBQWdFO1FBQ2hFLDBEQUEwRDtRQUMxRCxJQUFJLFNBQTZCLENBQUM7UUFDbEMsc0VBQXNFO1FBQ3RFLGtDQUFrQztRQUNsQyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssQ0FBQztZQUNKLHFFQUFxRTtZQUNyRSxJQUFJLEVBQUUsT0FBTztZQUViLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDWixJQUFJLFNBQVMsS0FBSyxTQUFTO3dCQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUM7b0JBQ25DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUNoRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFlBQVksQ0FBQztvQkFDdEMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM3QyxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDWixVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztvQkFDcEQsT0FBTztnQkFDVCxDQUFDO2dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7b0JBQ3pCLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUM1Qix3QkFBd0IsQ0FDdEIsU0FBUyxFQUNULEtBQUssRUFDTCxJQUFJLEVBQ0osZUFBZSxFQUNmLGNBQWMsQ0FDZixDQUFDO29CQUNKLENBQUM7b0JBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQixDQUFDO3FCQUFNLENBQUM7b0JBQ04saUVBQWlFO29CQUNqRSxxRUFBcUU7b0JBQ3JFLHdCQUF3QjtvQkFDeEIsSUFDRSxDQUFDLGtCQUFrQjt3QkFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQzt3QkFDM0IsU0FBUyxLQUFLLFNBQVMsRUFDdkIsQ0FBQzt3QkFDRCxrQkFBa0IsR0FBRyxJQUFJLENBQUM7d0JBQzFCLDBCQUEwQixDQUN4QixTQUFTLEVBQ1QsS0FBSyxFQUNMLElBQUksRUFDSixVQUFVLEVBQ1YsU0FBUyxDQUNWLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxlQUFlLElBQUksQ0FBQyxDQUFDO29CQUNyQixjQUFjLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7b0JBQzFDLDZEQUE2RDtvQkFDN0QsNERBQTREO29CQUM1RCxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFFL0MsOEZBQThGO0FBQzlGLE1BQU0sNEJBQTRCLEdBQUcsR0FBVyxFQUFFLENBQ2hELFNBQVMsQ0FDUCx1Q0FBdUMsRUFDdkMsNEJBQTRCLEVBQzVCO0lBQ0UsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsQ0FBQztDQUNQLENBQ0YsQ0FBQztBQUVKOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFFdkQsbUdBQW1HO0FBQ25HLE1BQU0saUNBQWlDLEdBQUcsR0FBVyxFQUFFLENBQ3JELFNBQVMsQ0FDUCw2Q0FBNkMsRUFDN0Msa0NBQWtDLEVBQ2xDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFFSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsOEJBQThCLENBQzVDLEtBQWEsRUFDYixJQUFZLEVBQ1osVUFBbUIsRUFDbkIsd0JBQStELEtBQUssSUFBSSxFQUFFLENBQ3hFLFNBQVM7SUFFWCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQztJQUN2RSxJQUFJLGlCQUFpQixHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQztJQUM1QixJQUFJLE1BQTJELENBQUM7SUFDaEUsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLElBQUksWUFBcUIsQ0FBQztJQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixtRUFBbUU7SUFDbkUsd0VBQXdFO0lBQ3hFLElBQUksU0FBNkIsQ0FBQztJQUNsQyxJQUFJLFNBQTZCLENBQUM7SUFDbEMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDL0IsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFMUIsU0FBUyxXQUFXO1FBQ2xCLElBQUksYUFBYTtZQUFFLE9BQU87UUFDMUIsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSxLQUFLLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUMvQixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04scUVBQXFFO1lBQ3JFLDhEQUE4RDtZQUM5RCxJQUFJLEdBQUc7Z0JBQUUsNkJBQTZCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEUsQ0FBQyxFQUNELEdBQUcsRUFBRSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssVUFBVSxPQUFPO1FBQ3BCLElBQUksUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0I7WUFDNUMsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLGNBQWM7WUFDcEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUNmLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUN6RSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7UUFDbkUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxVQUFVLGtCQUFrQjtRQUMvQixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxpQkFBaUIsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxRSxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssVUFBVSxTQUFTO1FBQ3RCLElBQUksUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0Isc0VBQXNFO1FBQ3RFLHdFQUF3RTtRQUN4RSxtQ0FBbUM7UUFDbkMsaUJBQWlCLElBQUksY0FBYyxDQUFDO1FBQ3BDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLG9FQUFvRTtRQUNwRSxrRUFBa0U7UUFDbEUseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsVUFBVTtRQUNWLE1BQU0sYUFBYSxHQUFHLDRCQUE0QixFQUFFLENBQUM7UUFDckQsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsRUFBRSxDQUFDO1FBQy9ELFNBQVMsQ0FBQztZQUNSLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsSUFBSSxjQUFjLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxXQUFXLENBQ25CLFdBQVcsSUFBSSw2Q0FBNkMsYUFBYSxHQUFHLENBQzdFLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxtQkFBbUIsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLElBQUksV0FBVyxDQUNuQixXQUFXLElBQUksbURBQW1ELGtCQUFrQixHQUFHLENBQ3hGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sT0FBTyxFQUFFLENBQUM7b0JBQUUsT0FBTyxLQUFLLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxRQUFRO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUMzQix1RUFBdUU7Z0JBQ3ZFLHVFQUF1RTtnQkFDdkUsK0RBQStEO2dCQUMvRCxJQUFJLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQUUsTUFBTSxLQUFLLENBQUM7Z0JBQzlDLGlFQUFpRTtnQkFDakUsc0VBQXNFO1lBQ3hFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxjQUFjLENBQWE7UUFDcEMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUN6QixJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNyQixJQUFJLFNBQVMsS0FBSyxTQUFTO2dCQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEQsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSxzRUFBc0U7WUFDdEUsb0VBQW9FO1lBQ3BFLFdBQVcsRUFBRSxDQUFDO1lBQ2Qsc0VBQXNFO1lBQ3RFLG9FQUFvRTtZQUNwRSxtREFBbUQ7WUFDbkQsU0FBUyxDQUFDO2dCQUNSLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDWixJQUFJLENBQUM7d0JBQ0gsSUFBSSxDQUFDLENBQUMsTUFBTSxPQUFPLEVBQUUsQ0FBQzs0QkFBRSxPQUFPO29CQUNqQyxDQUFDO29CQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7d0JBQ2IsSUFBSSxRQUFROzRCQUFFLE9BQU87d0JBQ3JCLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE9BQU87b0JBQ1QsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksTUFBNkMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDO29CQUNILDBFQUEwRTtvQkFDMUUsTUFBTSxHQUFHLE1BQU0sTUFBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsSUFBSSxRQUFRO3dCQUFFLE9BQU87b0JBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3dCQUN4QixVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixPQUFPO29CQUNULENBQUM7b0JBQ0QsSUFBSSxDQUFDO3dCQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sU0FBUyxFQUFFLENBQUM7NEJBQUUsT0FBTztvQkFDbkMsQ0FBQztvQkFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO3dCQUN0QixVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUMvQixPQUFPO29CQUNULENBQUM7b0JBQ0QsU0FBUztnQkFDWCxDQUFDO2dCQUVELElBQUksUUFBUTtvQkFBRSxPQUFPO2dCQUNyQixJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sR0FBRyxTQUFTLENBQUM7b0JBQ25CLDREQUE0RDtvQkFDNUQsZ0VBQWdFO29CQUNoRSxrRUFBa0U7b0JBQ2xFLGlFQUFpRTtvQkFDakUsbUVBQW1FO29CQUNuRSwrREFBK0Q7b0JBQy9ELGtFQUFrRTtvQkFDbEUsTUFBTSxnQkFBZ0IsR0FDcEIsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLFFBQVE7d0JBQUUsT0FBTztvQkFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQ3RCLElBQUksQ0FBQzs0QkFDSCxJQUFJLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxDQUFDO2dDQUFFLE9BQU87d0JBQ25DLENBQUM7d0JBQUMsT0FBTyxZQUFZLEVBQUUsQ0FBQzs0QkFDdEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDL0IsT0FBTzt3QkFDVCxDQUFDO3dCQUNELFNBQVM7b0JBQ1gsQ0FBQztvQkFDRCw2REFBNkQ7b0JBQzdELG9FQUFvRTtvQkFDcEUsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQzVCLHdCQUF3QixDQUN0QixTQUFTLEVBQ1QsS0FBSyxFQUNMLElBQUksRUFDSixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixDQUNwQixDQUFDO29CQUNKLENBQUM7b0JBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNuQixPQUFPO2dCQUNULENBQUM7Z0JBRUQsaURBQWlEO2dCQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM5QixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDeEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN0QyxNQUFNLEdBQUcsUUFBUSxDQUFDO2dCQUNwQixDQUFDO2dCQUVELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDcEIsT0FBTyxNQUFNLENBQUMsTUFBTSxJQUFJLGlCQUFpQixFQUFFLENBQUM7b0JBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksUUFBUSxDQUM5QixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdEIsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLEdBQUcsV0FBVyxDQUFDO29CQUM5QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSzt3QkFBRSxNQUFNO29CQUNqQyw0REFBNEQ7b0JBQzVELDhEQUE4RDtvQkFDOUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDN0IsY0FBYyxFQUFFLENBQUM7b0JBQ2pCLGVBQWUsRUFBRSxDQUFDO29CQUNsQixjQUFjLElBQUksS0FBSyxDQUFDO29CQUN4QixJQUFJLENBQUMsa0JBQWtCLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNuRCxrQkFBa0IsR0FBRyxJQUFJLENBQUM7d0JBQzFCLDBCQUEwQixDQUN4QixTQUFTLEVBQ1QsS0FBSyxFQUNMLElBQUksRUFDSixVQUFVLEVBQ1YsU0FBUyxDQUNWLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixDQUFDO2dCQUVELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osd0RBQXdEO29CQUN4RCw4REFBOEQ7b0JBQzlELDZEQUE2RDtvQkFDN0QsY0FBYyxHQUFHLENBQUMsQ0FBQztvQkFDbkIsT0FBTztnQkFDVCxDQUFDO2dCQUNELGlDQUFpQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdkIsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNoQixZQUFZLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUM3QixNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ25CLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDL0MsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUVuQzs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsR0FBdUIsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsbUNBQW1DLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUN2RSxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDakQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDN0IsWUFBb0IsRUFDcEIsZUFBdUIsRUFDdkIsS0FBYSxFQUNiLElBQVksRUFDWixVQUFrQixFQUNsQixTQUFpQixFQUNqQixLQUFhO0lBRWIsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2YsTUFBTSxpQkFBaUIsQ0FBQyx1QkFBdUIsRUFBRSxZQUFZLEVBQUU7WUFDN0QsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNqQyxVQUFVLEVBQUU7Z0JBQ1YsaUJBQWlCLEVBQUUsS0FBSztnQkFDeEIsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsMkJBQTJCLEVBQUUsT0FBTztnQkFDcEMsdUNBQXVDLEVBQUUsZUFBZSxHQUFHLFlBQVk7Z0JBQ3ZFLDhCQUE4QixFQUFFLFVBQVU7Z0JBQzFDLDZCQUE2QixFQUFFLFNBQVM7Z0JBQ3hDLG1FQUFtRTtnQkFDbkUsbUVBQW1FO2dCQUNuRSw2Q0FBNkM7Z0JBQzdDLGlDQUFpQyxFQUFFLEtBQUs7YUFDekM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixZQUFvQixFQUNwQixLQUFhLEVBQ2IsSUFBWTtJQUVaLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNmLE1BQU0saUJBQWlCLENBQUMsdUJBQXVCLEVBQUUsWUFBWSxFQUFFO1lBQzdELElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDakMsVUFBVSxFQUFFO2dCQUNWLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLHNCQUFzQixFQUFFLElBQUk7Z0JBQzVCLDJCQUEyQixFQUFFLE9BQU87Z0JBQ3BDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZO2FBQzFEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNQLENBQUM7QUFFRCxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsY0FBMEI7SUFDMUU7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLEtBQWEsRUFBRSxJQUFZLEVBQUUsZUFBa0M7UUFDekUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksb0JBQW9CLENBQzVCLGtDQUFrQyxPQUFPLEtBQUssR0FBRyxDQUNsRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLG9CQUFvQixDQUFDLDRCQUE0QixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUVwQyxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUsSUFBSSxlQUFlLEdBQWlDLGVBQWUsQ0FBQztRQUNwRSxNQUFNLGNBQWMsR0FBRyxLQUFLLElBQW1CLEVBQUU7WUFDL0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDO29CQUNILE1BQU0sZUFBZSxDQUFDO2dCQUN4QixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxpREFBaUQ7Z0JBQ25ELENBQUM7Z0JBQ0QsZUFBZSxHQUFHLFNBQVMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYscUVBQXFFO1FBQ3JFLDBCQUEwQjtRQUMxQixFQUFFO1FBQ0Ysc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSx5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLGlFQUFpRTtRQUNqRSxtRUFBbUU7UUFDbkUscUVBQXFFO1FBQ3JFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsRUFBRTtRQUNGLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLGtFQUFrRTtRQUNsRSxvRUFBb0U7UUFDcEUsb0RBQW9EO1FBQ3BELEVBQUU7UUFDRiwyREFBMkQ7UUFDM0QscURBQXFEO1FBQ3JELHFFQUFxRTtRQUNyRSxJQUFJLE1BQU0sR0FBaUIsRUFBRSxDQUFDO1FBQzlCLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxnREFBZ0Q7UUFDaEQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLFVBQVUsR0FBeUMsSUFBSSxDQUFDO1FBQzVELHlFQUF5RTtRQUN6RSxJQUFJLFFBQVEsR0FBeUIsSUFBSSxDQUFDO1FBQzFDOzs7Ozs7O1dBT0c7UUFDSCxJQUFJLFNBQWtCLENBQUM7UUFDdkIsa0VBQWtFO1FBQ2xFLHVFQUF1RTtRQUN2RSwrREFBK0Q7UUFDL0Qsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUNyRSxnQkFBZ0I7UUFDaEIsSUFBSSx1QkFBdUIsR0FBRywyQkFBMkIsRUFBRSxDQUFDO1FBQzVELElBQUksd0JBQXdCLEdBQXlCLElBQUksQ0FBQztRQUMxRCx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixFQUFFLENBQUM7UUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9DLG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsSUFBSSxRQUE0QixDQUFDO1FBR2pDLGlEQUFpRDtRQUNqRCxJQUFJLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFDbkMsaURBQWlEO1FBQ2pELElBQUksWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUVoQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVksRUFBUSxFQUFFO1lBQzNDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxlQUFlLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUNsRCxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHO2dCQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUY7Ozs7V0FJRztRQUNILE1BQU0sU0FBUyxHQUFHLEdBQTJDLEVBQUU7WUFDN0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxLQUFLLElBQUksbUJBQW1CO29CQUFFLE1BQU07Z0JBQ3hDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxrQkFBa0I7b0JBQUUsTUFBTTtnQkFDdEUsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDNUIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLFdBQVcsSUFBSSxLQUFLLENBQUM7WUFDckIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUM7UUFFRjs7Ozs7O1dBTUc7UUFDSDs7Ozs7O1dBTUc7UUFDSCxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQ3JCLEtBQW1CLEVBQ25CLEtBQWEsRUFDYixPQUEyQixFQUNaLEVBQUU7WUFDakIsTUFBTSxjQUFjLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQztZQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUIsSUFBSSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLFVBQVUsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGlDQUFpQztnQkFDakMsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQixzQkFBc0IsQ0FDcEIsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxFQUNMLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxVQUFVLENBQ3hCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsS0FBSyxJQUFtQixFQUFFO1lBQzdDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO2dCQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM5QixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUV4RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDdkMsY0FBYyxHQUFHLENBQUMsQ0FBQztvQkFDbkIsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLGdFQUFnRTtvQkFDaEUsZ0VBQWdFO29CQUNoRSxtQ0FBbUM7b0JBQ25DLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM5QixXQUFXLElBQUksS0FBSyxDQUFDO29CQUNyQixjQUFjLEdBQUcsQ0FBQyxDQUFDO29CQUNuQixhQUFhLEdBQUcsQ0FBQyxDQUFDO29CQUNsQixRQUFRO3dCQUNOLE9BQU8sS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVM7NEJBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7NEJBQzdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQztvQkFDNUIsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxvRUFBb0U7Z0JBQ3BFLG9DQUFvQztnQkFDcEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDO2dCQUNqQyxlQUFlLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVE7b0JBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRiwrRUFBK0U7UUFDL0UsTUFBTSxhQUFhLEdBQUcsR0FBUyxFQUFFO1lBQy9CLElBQUksUUFBUSxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDdkUsUUFBUSxHQUFHLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDNUIsR0FBRyxFQUFFO2dCQUNILFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLDJEQUEyRDtnQkFDM0QsK0RBQStEO2dCQUMvRCwrREFBK0Q7Z0JBQy9ELGdFQUFnRTtnQkFDaEUsaUVBQWlFO2dCQUNqRSx5REFBeUQ7Z0JBQ3pELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsYUFBYSxFQUFFLENBQUM7b0JBQ2hCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxnRUFBZ0U7Z0JBQ2hFLDBCQUEwQjtnQkFDMUIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO2dCQUM3QixZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU87b0JBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNSLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLFNBQVMsS0FBSyxLQUFLLENBQUM7Z0JBQ3BCLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGOzs7Ozs7Ozs7Ozs7Ozs7OztXQWlCRztRQUNILE1BQU0sbUJBQW1CLEdBQUcsR0FBUyxFQUFFO1lBQ3JDLElBQUksVUFBVSxJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNuQyxJQUFJLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxtRUFBbUU7Z0JBQ25FLG9FQUFvRTtnQkFDcEUsOENBQThDO2dCQUM5Qyx3QkFBd0IsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztxQkFDdkQsSUFBSSxDQUNILENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ1IsdUJBQXVCO3dCQUNyQixLQUFLLENBQUMscUJBQXFCLElBQUksd0JBQXdCLENBQUM7Z0JBQzVELENBQUMsRUFDRCxHQUFHLEVBQUU7b0JBQ0gsOERBQThEO29CQUM5RCwrREFBK0Q7b0JBQy9ELHNDQUFzQztvQkFDdEMsdUJBQXVCLEdBQUcsd0JBQXdCLENBQUM7Z0JBQ3JELENBQUMsQ0FDRjtxQkFDQSxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNULDhEQUE4RDtvQkFDOUQsd0RBQXdEO29CQUN4RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFBRSxtQkFBbUIsRUFBRSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztnQkFDTCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksdUJBQXVCLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUNELFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixhQUFhLEVBQUUsQ0FBQztZQUNsQixDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFFRjs7Ozs7V0FLRztRQUNILE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtZQUN0QyxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNaLElBQUksU0FBUyxLQUFLLFNBQVM7b0JBQUUsTUFBTSxTQUFTLENBQUM7Z0JBQzdDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU87Z0JBQzdDLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLEtBQUssQ0FBQztZQUNKLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDZixJQUFJLFNBQVMsS0FBSyxTQUFTO29CQUFFLE1BQU0sU0FBUyxDQUFDO2dCQUM3QyxJQUFJLFFBQVEsS0FBSyxTQUFTO29CQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUVoQyxJQUNFLE1BQU0sQ0FBQyxNQUFNLElBQUksbUJBQW1CO29CQUNwQyxXQUFXLElBQUksa0JBQWtCLEVBQ2pDLENBQUM7b0JBQ0QsbUVBQW1FO29CQUNuRSxxQkFBcUI7b0JBQ3JCLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sbUJBQW1CLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQztnQkFFRCxrRUFBa0U7Z0JBQ2xFLGtFQUFrRTtnQkFDbEUsNERBQTREO2dCQUM1RCxpQkFBaUI7Z0JBQ2pCLE9BQ0UsU0FBUyxLQUFLLFNBQVM7b0JBQ3ZCLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxjQUFjLElBQUksaUJBQWlCO3dCQUNsRCxXQUFXLEdBQUcsYUFBYSxJQUFJLGdCQUFnQixDQUFDLEVBQ2xELENBQUM7b0JBQ0QsYUFBYSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7d0JBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTO29CQUFFLE1BQU0sU0FBUyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLENBQUMsS0FBSztnQkFDVCxrRUFBa0U7Z0JBQ2xFLCtDQUErQztnQkFDL0MsTUFBTSxLQUFLLEVBQUUsQ0FBQztnQkFFZCxnRUFBZ0U7Z0JBQ2hFLDZEQUE2RDtnQkFDN0QsMEJBQTBCO2dCQUMxQixNQUFNLGNBQWMsRUFBRSxDQUFDO2dCQUV2QixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQztnQkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdkMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUNoQixpRUFBaUU7Z0JBQ2pFLG9FQUFvRTtnQkFDcEUsbUVBQW1FO2dCQUNuRSwrREFBK0Q7Z0JBQy9ELCtEQUErRDtnQkFDL0Qsa0VBQWtFO2dCQUNsRSwrQ0FBK0M7Z0JBQy9DLEVBQUU7Z0JBQ0YsOERBQThEO2dCQUM5RCw4REFBOEQ7Z0JBQzlELGlFQUFpRTtnQkFDakUsZ0VBQWdFO2dCQUNoRSxtRUFBbUU7Z0JBQ25FLCtEQUErRDtnQkFDL0Qsa0VBQWtFO2dCQUNsRSw2Q0FBNkM7Z0JBQzdDLElBQUksQ0FBQztvQkFDSCxNQUFNLEtBQUssRUFBRSxDQUFDO2dCQUNoQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxrRUFBa0U7Z0JBQ3BFLENBQUM7Z0JBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDWixXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixTQUFTLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BELCtEQUErRDtnQkFDL0QsbURBQW1EO2dCQUNuRCxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0IsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLDBDQUEwQztRQUMxQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUMvQyxLQUFLLEVBQUUsS0FBSztZQUNaLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWtCRCw4QkFBOEI7QUFDOUIsZ0VBQWdFO0FBQ2hFLHdEQUF3RDtBQUV4RDs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixTQUE4QixVQUFVO0lBRXhDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUNsQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQzFDLENBQUM7SUFDRix3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLE9BQU87UUFDTCxHQUFHLGdCQUFnQixFQUFFO1FBQ3JCLEdBQUcsc0JBQXNCLEVBQUU7UUFDM0IsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDNUIsK0RBQStEO1FBQy9ELHFFQUFxRTtRQUNyRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQiw4REFBOEQ7WUFDOUQsa0VBQWtFO1lBQ2xFLHlEQUF5RDtZQUN6RCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4RSxNQUFNLElBQUksR0FBbUM7Z0JBQzNDLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBVztnQkFDL0MsR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFXO2dCQUN6QyxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQVk7Z0JBQ2xELElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBMEI7Z0JBQzFELE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBVzthQUNoRCxDQUFDO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLHlCQUF5QixDQUV6RCxDQUFDO1lBQ2QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7WUFDM0MsQ0FBQztZQUNELG1DQUFtQztZQUNuQyxxRUFBcUU7WUFDckUsa0VBQWtFO1lBQ2xFLGtFQUFrRTtZQUNsRSxzRUFBc0U7WUFDdEUsK0NBQStDO1lBQy9DLG9FQUFvRTtZQUNwRSxvRUFBb0U7WUFDcEUsaUNBQWlDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDN0MsSUFDRSxNQUFNO2dCQUNOLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7b0JBQzlCLFlBQVksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxFQUMxQyxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBcUIsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsaUNBQWlDO1lBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3pFLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFxQjtnQkFDckQsR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFXO2dCQUN6QyxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQVc7Z0JBQy9DLFVBQVUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBVztnQkFDdkQsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFZO2dCQUNsRCxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQTBCO2dCQUMxRCxVQUFVLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQVk7YUFDekQsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQWdDRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQzlCLE1BQXVCLEVBQ3ZCLE1BQW1CLEVBQ25CLE1BQTJCLEVBQzNCLEdBQW9CLEVBQ3BCLEtBQWEsRUFDYixTQUE2QjtJQUU3QixJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzQyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBRSxNQUFjLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsU0FBUyxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUNyQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsdUJBQXVCLENBQ3JCLE1BQXFCLEVBQ3JCLFVBQVUsRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsQ0FDSixDQUFDO0lBRUYsT0FBTztRQUNMLFVBQVU7UUFDVixTQUFTLEVBQUUsU0FBVTtRQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDbkQsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixNQUE4QyxFQUM5QyxNQUFtQjtJQUVuQixNQUFNLFVBQVUsR0FDZCxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FDYixNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxPQUFPO1FBQ0wsVUFBVTtRQUNWLFNBQVMsRUFBRSxTQUFVO1FBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztRQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztLQUNuRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHVCQUF1QixDQUM5QixNQUFtQixFQUNuQixVQUFrQixFQUNsQixLQUFhLEVBQ2IsU0FBNkIsRUFDN0IsR0FBb0I7SUFFcEIsSUFBSSxNQUFNLENBQUMsT0FBTztRQUFFLE9BQU87SUFDM0IsSUFBSyxNQUFjLENBQUMsdUJBQXVCLENBQUM7UUFBRSxPQUFPO0lBQ3BELE1BQWMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVoRCxNQUFNLENBQUMsZ0JBQWdCLENBQ3JCLE9BQU8sRUFDUCxHQUFHLEVBQUU7UUFDSCxHQUFHLENBQUMsSUFBSSxDQUNOLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDVixJQUFJLENBQUM7Z0JBQ0gsMEVBQTBFO2dCQUMxRSxtRUFBbUU7Z0JBQ25FLHVFQUF1RTtnQkFDdkUsbUVBQW1FO2dCQUNuRSxxRUFBcUU7Z0JBQ3JFLE1BQU0sR0FBRyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sT0FBTyxHQUFHLE1BQU0sc0JBQXNCLENBQzFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUN4QyxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7Z0JBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSw0QkFBNEIsQ0FDL0MsS0FBSyxFQUNMLFVBQVUsQ0FDWCxDQUFDO2dCQUNGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQXFCLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCwyQkFBMkI7WUFDN0IsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQ0wsQ0FBQztJQUNKLENBQUMsRUFDRCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FDZixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxTQUE4QixVQUFVLEVBQ3hDLEdBQW9CLEVBQ3BCLEtBQWEsRUFDYixTQUE2QixFQUM3QixpQkFBaUIsR0FBRyxLQUFLO0FBQ3pCLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSxxQkFBcUI7QUFDckIsZUFBa0M7QUFDbEMscUVBQXFFO0FBQ3JFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLGtCQUFrQjtBQUNsQixjQUErQixHQUFHO0lBRWxDLE9BQU87UUFDTCxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUU3QixjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUU1RCxtRUFBbUU7WUFDbkUsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkVBQTJFLEVBQzNFO29CQUNFLElBQUksRUFBRSwrSEFBK0g7aUJBQ3RJLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFFLE1BQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWxDLE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQTRCLENBQy9DLEtBQUssRUFDTCxJQUFJLEVBQ0osZUFBZSxDQUNoQixDQUFDO1lBQ0YsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQkFDdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSztxQkFDRixXQUFXLENBQ1Ysa0JBQWtCLENBQ2hCLG1CQUFtQixDQUNqQixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixXQUFXLENBQ1osRUFDRCxTQUFTLENBQ1YsQ0FDRjtxQkFDQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQ3BCLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxDQUFDLEdBQTBDLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDMUQsSUFBSSxJQUFJO2dCQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxpQkFBaUI7Z0JBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUM7WUFDbkUsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFNUQsK0RBQStEO1lBQy9ELGtFQUFrRTtZQUNsRSwrREFBK0Q7WUFDL0QsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSwrREFBK0Q7WUFDL0QsaUVBQWlFO1lBQ2pFLGlFQUFpRTtZQUNqRSxrREFBa0Q7WUFDbEQsTUFBTSxZQUFZLEdBQUksS0FBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDeEQsTUFBTSxhQUFhLEdBQUksS0FBYSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDbEUsSUFDRSxPQUFPLFlBQVksS0FBSyxRQUFRO2dCQUNoQyxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQ2pDLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLEdBQTBDO29CQUN4RCxJQUFJLEVBQUUsWUFBWTtvQkFDbEIsS0FBSyxFQUFFLGFBQWE7aUJBQ3JCLENBQUM7Z0JBQ0YsTUFBTSxpQkFBaUIsR0FBSSxLQUFhLENBQ3RDLCtCQUErQixDQUNoQyxDQUFDO2dCQUNGLElBQUksT0FBTyxpQkFBaUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDMUMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDO2dCQUNyRCxDQUFDO2dCQUNELE1BQU0sb0JBQW9CLEdBQUksS0FBYSxDQUN6QyxrQ0FBa0MsQ0FDbkMsQ0FBQztnQkFDRixJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzdDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLENBQUUsTUFBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLEdBQUcsUUFBUSxRQUFRLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvRCxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUV6QyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEIsQ0FBQztRQUVELGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3pCLElBQ0UsQ0FBQyxNQUFNLENBQUMsZUFBZTtnQkFDdkIsT0FBTyxNQUFNLENBQUMsZUFBZSxLQUFLLFVBQVU7Z0JBQzVDLENBQUMsQ0FBQyxLQUFLLFlBQVksTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFFMUMsT0FBTyxLQUFLLENBQUM7WUFDZixPQUFPLHVCQUF1QixDQUM1QixLQUFLLENBQUMsTUFBTSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxTQUFTLENBQ1YsQ0FBQztRQUNKLENBQUM7UUFFRCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixJQUNFLENBQUMsTUFBTSxDQUFDLFdBQVc7Z0JBQ25CLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxVQUFVO2dCQUN4QyxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxXQUFXLENBQUM7Z0JBRXRDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsT0FBTyx1QkFBdUIsQ0FDNUIsS0FBSyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxTQUFTLENBQ1YsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNIOzs7Ozs7OztHQVFHO0FBQ0g7Ozs7O0dBS0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixNQUEyQixFQUMzQixJQUFZO0lBRVoseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSxzRUFBc0U7SUFDdEUsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUN6RSwwQ0FBMEM7SUFDMUMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLENBQXVCLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBOEIsVUFBVTtJQUV4QyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDeEMscUJBQXFCLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQ2hELENBQUM7SUFDRixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDeEMscUJBQXFCLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQ2hELENBQUM7SUFDRixNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDekMscUJBQXFCLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQ2pELENBQUM7SUFDRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDckMscUJBQXFCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUM3QyxDQUFDO0lBQ0YsT0FBTztRQUNMLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBRTdCLDJFQUEyRTtRQUMzRSwwREFBMEQ7UUFDMUQsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsMEVBQTBFO1lBQzFFLGlFQUFpRTtZQUNqRSx5REFBeUQ7WUFDekQscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxtRUFBbUU7WUFDbkUsa0VBQWtFO1lBQ2xFLG1EQUFtRDtZQUNuRCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztnQkFDOUQsT0FBTyxLQUFLLENBQUM7WUFFZixvRkFBb0Y7WUFDcEYsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3ZELElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQiwwREFBMEQ7Z0JBQzFELDREQUE0RDtnQkFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFXLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxNQUFNLENBQUMsR0FHSCxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FFdEMsQ0FBQztZQUNkLElBQUksSUFBSTtnQkFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN4QixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUU1QyxDQUFDO1lBQ2QsSUFBSSxPQUFPO2dCQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLHFFQUFxRTtZQUNyRSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztnQkFDOUQsT0FBTyxLQUFLLENBQUM7WUFDZixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFXLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBMEMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMxRCxpRUFBaUU7WUFDakUsOERBQThEO1lBQzlELDBEQUEwRDtZQUMxRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLDJCQUEyQixDQUFDLENBQUM7WUFDdEUsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRO2dCQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzdELE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxDQUN0QyxLQUFLLEVBQ0wsa0NBQWtDLENBQ25DLENBQUM7WUFDRixJQUFJLE9BQU8sbUJBQW1CLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUM7WUFDdkMsQ0FBQztZQUNELE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUNuQyxLQUFLLEVBQ0wsK0JBQStCLENBQ2hDLENBQUM7WUFDRixJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsZ0ZBQWdGO1FBQ2hGLCtFQUErRTtRQUMvRSxnRkFBZ0Y7UUFDaEYsNEVBQTRFO1FBQzVFLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3pCLHFFQUFxRTtZQUNyRSxzRUFBc0U7WUFDdEUsMkRBQTJEO1lBQzNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzlELE1BQU0sTUFBTSxHQUFHLEtBQXNDLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sdUJBQXVCLEdBQUcscUJBQXFCLENBQ25ELEtBQUssRUFDTCx3QkFBd0IsQ0FBQyxLQUFLLENBQy9CLENBQUM7WUFDRixJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN4RCxpRUFBaUU7Z0JBQ2pFLDRDQUE0QztnQkFDNUMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDbEQsSUFDRSxXQUFXLEtBQUssSUFBSTtvQkFDcEIsT0FBTyxXQUFXLEtBQUssUUFBUTtvQkFDL0IsWUFBWSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLFNBQVMsRUFDMUQsQ0FBQztvQkFDRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDMUIsT0FBTyxtQkFBbUIsQ0FBQyxNQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM5RCxNQUFNLGNBQWMsR0FDbEIsWUFBWSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLFNBQVMsQ0FBQztZQUN2RCxNQUFNLG1CQUFtQixHQUFHLHFCQUFxQixDQUMvQyxLQUFLLEVBQ0wsb0JBQW9CLENBQUMsS0FBSyxDQUMzQixDQUFDO1lBQ0YsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLG1CQUFtQjtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxRCxPQUFPLG1CQUFtQixDQUFDLEtBQW9CLEVBQUUsS0FBb0IsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLFNBQThCLFVBQVUsRUFDeEMsR0FBb0IsRUFDcEIsS0FBYSxFQUNiLFNBQTZCLEVBQzdCLGlCQUFpQixHQUFHLEtBQUs7QUFDekIsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsNEVBQTRFO0FBQzVFLGVBQWtDLEVBQ2xDLGNBQStCLEdBQUc7SUFFbEMsT0FBTztRQUNMLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBRTdCLGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRTVELG1FQUFtRTtZQUNuRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLGtCQUFrQixDQUMxQiwyRUFBMkUsRUFDM0U7b0JBQ0UsSUFBSSxFQUFFLCtIQUErSDtpQkFDdEksQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUVELHFFQUFxRTtZQUNyRSw4REFBOEQ7WUFDOUQsaUJBQWlCO1lBQ2pCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JDLGdFQUFnRTtZQUNoRSxnRUFBZ0U7WUFDaEUsK0RBQStEO1lBQy9ELGtFQUFrRTtZQUNsRSwrREFBK0Q7WUFDL0QsSUFBSSxPQUFPLEdBQWtDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRTFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixNQUFNLFFBQVEsR0FBRyxDQUFFLE1BQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLEdBQUcsUUFBUSxRQUFRLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxHQUFHLElBQUksS0FBSyxPQUFPLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUV4RSxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUMvQyxLQUFLLEVBQ0wsSUFBSSxFQUNKLGVBQWUsQ0FDaEIsQ0FBQztnQkFDRixJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7d0JBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUMzRCxDQUFDO29CQUNKLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDbkMsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sR0FBRyxDQUFDLElBQUksQ0FDTixLQUFLO3lCQUNGLFdBQVcsQ0FDVixrQkFBa0IsQ0FDaEIsZUFBZSxDQUNiLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFdBQVcsQ0FDWixFQUNELFNBQVMsQ0FDVixDQUNGO3lCQUNBLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDcEIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sQ0FBQyxHQUEwQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzFELElBQUksSUFBSTtnQkFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLE9BQU87Z0JBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDakMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFNUQsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDckMsTUFBTSxZQUFZLEdBQUksS0FBYSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sUUFBUSxHQUFHLENBQUUsTUFBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLElBQUksR0FBRyxRQUFRLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixXQUFXLENBQUMsSUFBSSxDQUNkLElBQUksNEJBQTRCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztxQkFDMUMsV0FBVyxDQUNWLG9CQUFvQixDQUNsQixlQUFlLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQ3RELFNBQVMsQ0FDVixDQUNGO3FCQUNBLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDakIsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBMEMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMxRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVE7Z0JBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDN0QsTUFBTSxnQkFBZ0IsR0FBSSxLQUFhLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUN6RSxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsTUFBTSxtQkFBbUIsR0FBSSxLQUFhLENBQ3hDLGtDQUFrQyxDQUNuQyxDQUFDO1lBQ0YsSUFBSSxPQUFPLG1CQUFtQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxDQUFDLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO1lBQ3ZDLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixJQUNFLENBQUMsTUFBTSxDQUFDLGVBQWU7Z0JBQ3ZCLE9BQU8sTUFBTSxDQUFDLGVBQWUsS0FBSyxVQUFVO2dCQUM1QyxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxlQUFlLENBQUM7Z0JBRTFDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsT0FBTyx1QkFBdUIsQ0FDNUIsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDO1FBRUQsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckIsSUFDRSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2dCQUNuQixPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssVUFBVTtnQkFDeEMsQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUV0QyxPQUFPLEtBQUssQ0FBQztZQUNmLE9BQU8sdUJBQXVCLENBQzVCLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFHLE1BQWlCO0lBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDOUIsU0FBUyxlQUFlLENBQUMsR0FBbUI7UUFDMUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUNELFNBQVMsSUFBSSxDQUFDLEdBQVk7UUFDeEIsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQ25ELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFhLENBQUM7WUFBRSxPQUFPO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBYSxDQUFDLENBQUM7UUFDM0IsSUFBSSxHQUFHLFlBQVksZUFBZSxFQUFFLENBQUM7WUFDbkMsZUFBZSxDQUFDLEdBQXVDLENBQUMsQ0FBQztZQUN6RCxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQXNDLENBQUMsQ0FBQztZQUM1RCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksR0FBRyxZQUFZLFdBQVcsRUFBRSxDQUFDO1lBQy9CLGVBQWUsQ0FBQyxHQUFtQyxDQUFDLENBQUM7WUFDckQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUc7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxHQUFHLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRztnQkFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCxtRUFBbUU7UUFDbkUsdURBQXVEO1FBQ3ZELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLEdBQUcsWUFBWSxPQUFPLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQThCLENBQUM7WUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTTtRQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsc0JBQXNCLENBQzdCLFVBQTJCLEVBQzNCLEtBQWEsRUFDYixVQUFrQixFQUNsQixHQUFvQjtJQUVwQixNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBRTNDLEdBQUcsQ0FBQyxJQUFJLENBQ04sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNWLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQTRCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxPQUFPLENBQW1DLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3hELElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDaEMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDMUMsT0FBTztvQkFDVCxDQUFDO29CQUNELFlBQVksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQ2xDLE9BQU8sRUFDUCxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUMvQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FDZixDQUFDO2dCQUNKLENBQUMsQ0FBQzthQUNILENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMscUVBQXFFO2dCQUNyRSwyREFBMkQ7Z0JBQzNELHNFQUFzRTtnQkFDdEUscUVBQXFFO2dCQUNyRSwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQztvQkFDSCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLDBDQUEwQztnQkFDNUMsQ0FBQztnQkFDRCxJQUFJLENBQUM7b0JBQ0gsK0RBQStEO29CQUMvRCwrREFBK0Q7b0JBQy9ELGtFQUFrRTtvQkFDbEUsK0RBQStEO29CQUMvRCx5REFBeUQ7b0JBQ3pELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDNUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLG9CQUFvQixDQUN0QyxNQUFNLENBQUMsS0FBSyxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQUUsYUFBYSxDQUN6QixDQUFxQyxDQUFDO29CQUN2QyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDakMsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLG9FQUFvRTtnQkFDcEUsbUVBQW1FO2dCQUNuRSxrRUFBa0U7Z0JBQ2xFLG1FQUFtRTtnQkFDbkUsc0VBQXNFO2dCQUN0RSxxRUFBcUU7Z0JBQ3JFLG1FQUFtRTtnQkFDbkUsNkRBQTZEO2dCQUM3RCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyREFBMkQ7WUFDM0QsOERBQThEO1FBQ2hFLENBQUM7SUFDSCxDQUFDLENBQUMsRUFBRSxDQUNMLENBQUM7SUFFRixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQ25CLFVBQTJCLEVBQzNCLEtBQWdELEVBQ2hELFlBQThCO0lBRTlCLE1BQU0sZ0JBQWdCLEdBQUcsVUFBOEMsQ0FBQztJQUN4RSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBc0MsQ0FBQztJQUN2RSxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDdkQsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ3JELFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDbkQsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNqRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3JELFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFnQixFQUFFLElBQWlCO0lBQzdELE1BQU0sQ0FBQyxHQUFHLEdBQW1DLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsSUFBb0MsQ0FBQztJQUMvQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixLQUE2QyxFQUM3QyxHQUFvQixFQUNwQixLQUFhO0lBRWIsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUV6QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QixNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FDekMsVUFBVSxFQUNWLEtBQUssRUFDTCxLQUFLLENBQUMsVUFBVSxFQUNoQixHQUFHLENBQ0osQ0FBQztRQUNGLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2hELENBQUM7U0FBTSxDQUFDO1FBQ04sWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFnQixFQUFFLEVBQUU7UUFDdEMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3RDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QixNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNWLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDO29CQUNILGtFQUFrRTtvQkFDbEUsaUVBQWlFO29CQUNqRSw2REFBNkQ7b0JBQzdELDZEQUE2RDtvQkFDN0Qsd0NBQXdDO29CQUN4QyxNQUFNLE9BQU8sR0FBRyxNQUFNLHNCQUFzQixDQUMxQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQ3pCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQ2xDLEdBQUcsQ0FBQyxhQUFhLENBQ2xCLENBQUM7b0JBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSw0QkFBNEIsQ0FDL0MsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFDbEMsS0FBSyxDQUFDLFVBQVUsQ0FDakIsQ0FBQztvQkFDRixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFxQixDQUFDLENBQUM7b0JBQzFDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2QixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCwyQkFBMkI7Z0JBQzdCLENBQUM7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUNMLENBQUM7WUFFRixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDcEIsdUVBQXVFO2dCQUN2RSxvRUFBb0U7Z0JBQ3BFLGlFQUFpRTtnQkFDakUsdUVBQXVFO2dCQUN2RSxvRUFBb0U7Z0JBQ3BFLGdFQUFnRTtnQkFDaEUsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLDhDQUE4QztnQkFDOUMsRUFBRTtnQkFDRixvRUFBb0U7Z0JBQ3BFLDhDQUE4QztnQkFDOUMseUVBQXlFO2dCQUN6RSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUM3QixJQUFJLENBQUM7d0JBQ0gsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7d0JBQ2hFLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7NEJBQ2hDLE9BQU8sRUFBRSxJQUFJOzRCQUNiLE1BQU07eUJBQ1AsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsTUFBTSxDQUFDO3dCQUNQLGdEQUFnRDtvQkFDbEQsQ0FBQztnQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNMLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBeUMsRUFDekMsR0FBb0IsRUFDcEIsS0FBYTtJQUViLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFFekMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQ3pDLFVBQVUsRUFDVixLQUFLLEVBQ0wsS0FBSyxDQUFDLFVBQVUsRUFDaEIsR0FBRyxDQUNKLENBQUM7UUFDRixZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDO1NBQU0sQ0FBQztRQUNOLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBOEIsVUFBVTtJQUN4RSxPQUFPO1FBQ0wsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFDM0IsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUM7S0FDRixDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxLQUFLLFVBQVUsaUNBQWlDLENBQzlDLEtBQWEsRUFDYixZQUFnQyxFQUNoQyxtQkFBdUM7SUFFdkMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvRCxJQUFJLGNBQWM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVsRCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFcEQsTUFBTSxNQUFNLEdBQUcsWUFBWTtRQUN6QixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDN0QsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ25FLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUEyQixFQUMzQixHQUFvQixFQUNwQixLQUFhLEVBQ2IsSUFBWSxFQUNaLFVBQThCLEVBQzlCLFNBQTZCO0lBRTdCLElBQUksTUFBa0QsQ0FBQztJQUN2RCxJQUFJLFNBQThELENBQUM7SUFDbkUsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDL0IsSUFBSSxZQUErQixDQUFDO0lBRXBDLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FDL0I7UUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDbkIsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDWixNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7d0JBQ2hFLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFOzRCQUN6QixTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUNwQixDQUFDO3FCQUNGLENBQUMsQ0FBQyxjQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQXNCLENBQUM7b0JBQzlELE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzVCLElBQUksU0FBUyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDckMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixpRUFBaUU7d0JBQ2pFLGtEQUFrRDt3QkFDbEQsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM1QyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLElBQUksTUFBTSxDQUFDLElBQUk7b0JBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDOztvQkFDL0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUNqQixNQUFNLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7S0FDRjtJQUNELHVFQUF1RTtJQUN2RSxnRUFBZ0U7SUFDaEUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQ3JCLENBQUM7SUFDRixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBUUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBOEIsVUFBVSxFQUN4QyxHQUFvQixFQUNwQixLQUFhLEVBQ2IsU0FBNkIsRUFDN0IsT0FBZ0M7SUFFaEMsT0FBTztRQUNMLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTVCLGdFQUFnRTtRQUNoRSxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsZ0hBQWdILEVBQ2hIO2dCQUNFLElBQUksRUFBRSw4SEFBOEg7YUFDckksQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDMUIsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7WUFDSCxNQUFNLElBQUksa0JBQWtCLENBQzFCLDJFQUEyRSxFQUMzRTtnQkFDRSxJQUFJLEVBQUUsbUlBQW1JO2FBQzFJLENBQ0YsQ0FBQztRQUNKLENBQUMsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ2pDO1FBRUgsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakIsTUFBTSxJQUFJLEdBQXNDO2dCQUM5QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDMUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07YUFDckIsQ0FBQztZQUNGLElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELGtFQUFrRTtZQUNsRSxtRUFBbUU7WUFDbkUscUVBQXFFO1lBQ3JFLElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkUsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xCLDBFQUEwRTtZQUMxRSxvRkFBb0Y7WUFDcEYsT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDckMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUMzQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsNERBQTREO1lBQzVELGtFQUFrRTtZQUNsRSxJQUFJLFVBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDaEMscUZBQXFGO2dCQUNyRixNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztZQUN2QixDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUMzQiwwREFBMEQ7Z0JBQzFELGdFQUFnRTtnQkFDaEUsNkRBQTZEO2dCQUM3RCwyREFBMkQ7Z0JBQzNELHNEQUFzRDtnQkFDdEQsRUFBRTtnQkFDRiw0REFBNEQ7Z0JBQzVELGdFQUFnRTtnQkFDaEUsOERBQThEO2dCQUM5RCwwQ0FBMEM7Z0JBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQTRCLENBQy9DLEtBQUssRUFDTCxLQUFLLENBQUMsSUFBSSxFQUNWLEtBQUssQ0FBQyxVQUFVLENBQ2pCLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhCLDBFQUEwRTtnQkFDMUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQ3hDLEtBQUssQ0FBQyxPQUFPLEtBQUssV0FBVztvQkFDM0IsQ0FBQyxDQUFDLHNCQUFzQixFQUFFO29CQUMxQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRW5DLDZDQUE2QztnQkFDN0MsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDbEQsc0NBQXNDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxxRUFBcUU7Z0JBQ3JFLHNFQUFzRTtnQkFDdEUsSUFBSSxPQUFPLEVBQUUsZUFBZTtvQkFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFDeEQsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUUzQyxPQUFPLFlBQVksQ0FBQztZQUN0QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04saUVBQWlFO2dCQUNqRSwrREFBK0Q7Z0JBQy9ELHVDQUF1QztnQkFDdkMsaUVBQWlFO2dCQUNqRSxtRUFBbUU7Z0JBQ25FLG9FQUFvRTtnQkFDcEUsZ0VBQWdFO2dCQUNoRSxJQUFJLFVBQXVELENBQUM7Z0JBQzVELE1BQU0sVUFBVSxHQUFHLEdBQW9DLEVBQUU7b0JBQ3ZELFVBQVUsS0FBSyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDL0MsT0FBTyxVQUFVLENBQUM7Z0JBQ3BCLENBQUMsQ0FBQztnQkFDRixNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FDN0MsS0FBSyxFQUNMLEtBQUssQ0FBQyxJQUFJLEVBQ1YsS0FBSyxDQUFDLFVBQVUsRUFDaEIsVUFBVSxDQUNYLENBQUM7Z0JBQ0YsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQ3BDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUNuRCxVQUFVLENBQ1gsQ0FBQztnQkFDRixNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFeEIsOENBQThDO2dCQUM5QyxhQUFhLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDNUQsc0NBQXNDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxvRUFBb0U7Z0JBQ3BFLG1FQUFtRTtnQkFDbkUsSUFBSSxPQUFPLEVBQUUsZUFBZTtvQkFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFDeEQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFakQsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBQ0QsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsa0VBQWtFO1lBQ2xFLDhEQUE4RDtZQUM5RCw0Q0FBNEM7WUFDNUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzFFLE1BQU0sU0FBUyxHQUNiLFdBQVcsS0FBSyxLQUFLO2dCQUNuQixDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUMsaUNBQWlDLENBQy9CLFdBQVcsRUFDWCxLQUFLLENBQUMsWUFBWSxFQUNsQixLQUFLLENBQUMsbUJBQW1CLENBQzFCLENBQUM7WUFFUixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FDbEMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQ3hELFNBQVMsQ0FDVixDQUFDO1lBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBSSw0QkFBNEIsQ0FDckQsV0FBVyxFQUNYLEtBQUssQ0FBQyxJQUFJLENBQ1gsQ0FBQztZQUVGLHlDQUF5QztZQUN6QyxNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXhCLDZDQUE2QztZQUM3QyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDbEUsc0NBQXNDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsa0RBQWtEO1lBQ2xELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFNUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLGtCQUFrQixFQUFFO2dCQUM1RCxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSwyQkFBMkIsRUFBRTtnQkFDckUsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztZQUNILElBQUksT0FBTyxLQUFLLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLENBQUMsY0FBYyxDQUNuQixTQUFTLENBQUMsUUFBUSxFQUNsQixrQ0FBa0MsRUFDbEM7b0JBQ0UsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZO29CQUN6QixRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUNELDBFQUEwRTtZQUMxRSwrQkFBK0I7WUFDL0IsSUFBSSxPQUFPLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxDQUFDLGNBQWMsQ0FDbkIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsK0JBQStCLEVBQy9CO29CQUNFLEtBQUssRUFBRSxLQUFLLENBQUMsbUJBQW1CO29CQUNoQyxRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUM1QixDQUFDO1FBRUQsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztRQUNwRSxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO0tBQzdELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBOEIsVUFBVTtJQUV4QyxPQUFPO1FBQ0wsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDNUIsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztRQUNqQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1lBQ2hELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDcEIsS0FBYSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQzdELE9BQU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDO2dCQUM3QixLQUFhLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRTtvQkFDaEMsTUFBTSxJQUFJLGtCQUFrQixDQUMxQiw2REFBNkQsRUFDN0Q7d0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtxQkFDeEgsQ0FDRixDQUFDO2dCQUNKLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDMUIsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7WUFDSCxNQUFNLElBQUksa0JBQWtCLENBQzFCLDJFQUEyRSxFQUMzRTtnQkFDRSxJQUFJLEVBQUUsbUlBQW1JO2FBQzFJLENBQ0YsQ0FBQztRQUNKLENBQUMsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ2pDO1FBQ0gsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixzRUFBc0U7WUFDdEUsSUFBSSxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLDZDQUE2QztnQkFDN0MsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO29CQUNwRCxDQUFDLGdCQUFnQixDQUFDLEVBQUU7d0JBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUTt3QkFDckIsUUFBUSxFQUFFLEtBQUs7cUJBQ2hCO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO2dCQUNwRCxDQUFDLGtCQUFrQixDQUFDLEVBQUU7b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2dCQUNELENBQUMsa0JBQWtCLENBQUMsRUFBRTtvQkFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNqQixRQUFRLEVBQUUsS0FBSztpQkFDaEI7Z0JBQ0QsNkRBQTZEO2dCQUM3RCw4REFBOEQ7Z0JBQzlELGdFQUFnRTtnQkFDaEUsZ0VBQWdFO2dCQUNoRSwwREFBMEQ7Z0JBQzFELENBQUMscUJBQXFCLENBQUMsRUFBRTtvQkFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUNwQixRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQTBCO2dCQUN4QyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2FBQ0YsQ0FBQztZQUNGLDJEQUEyRDtZQUMzRCw0REFBNEQ7WUFDNUQsMENBQTBDO1lBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsR0FBRztvQkFDeEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO29CQUNsQixRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0MsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLEdBQUc7b0JBQy9DLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWTtvQkFDekIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBQ0QsbUVBQW1FO1lBQ25FLHdFQUF3RTtZQUN4RSxrRUFBa0U7WUFDbEUsa0VBQWtFO1lBQ2xFLElBQUksT0FBTyxLQUFLLENBQUMsbUJBQW1CLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xELFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxHQUFHO29CQUM1QyxLQUFLLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtvQkFDaEMsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRSxJQUFJLEtBQUssQ0FBQyxPQUFPO2dCQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE9BQU87Z0JBQ0wsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUNyQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQ25DLE1BQU07Z0JBQ04sS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7YUFDaEIsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLElBQUksS0FBSyxDQUFDLE9BQU87Z0JBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGVBQWUsQ0FDdEIsU0FBOEIsVUFBVSxFQUN4QyxHQUFvQixFQUNwQixLQUFhLEVBQ2IsU0FBNkIsRUFDN0IsWUFBcUI7SUFFckIsT0FBTztRQUNMLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTVCLG9FQUFvRTtRQUNwRSx1REFBdUQ7UUFDdkQsRUFBRTtRQUNGLDhEQUE4RDtRQUM5RCx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLDREQUE0RDtRQUM1RCxnREFBZ0Q7UUFDaEQsdUVBQXVFO1FBQ3ZFLHFEQUFxRDtRQUNyRCxnRUFBZ0U7UUFDaEUsZ0VBQWdFO1FBQ2hFLHVEQUF1RDtRQUN2RCxtRUFBbUU7UUFDbkUsNkJBQTZCO1FBQzdCLHlDQUF5QztRQUN6QyxxRUFBcUU7UUFDckUscURBQXFEO1FBQ3JELFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN0QyxNQUFNLFlBQVksR0FBRyxXQUFXLElBQUksS0FBSyxDQUFDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFeEUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksa0JBQWtCLENBQzFCLGtCQUFrQixNQUFNLHlEQUF5RCxFQUNqRjtvQkFDRSxJQUFJLEVBQUUscUpBQXFKO2lCQUM1SixDQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLFVBQXlCLEdBQUcsSUFBVztnQkFDM0QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDakQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN2RSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEIsTUFBTSxJQUFJLG9CQUFvQixDQUM1Qix1RUFBdUUsQ0FDeEUsQ0FBQztvQkFDSixDQUFDO29CQUNELE1BQU0sVUFBVSxHQUFHO3dCQUNqQixHQUFHLGNBQWM7d0JBQ2pCLFdBQVc7cUJBQ1osQ0FBQztvQkFDRixPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FDakMsQ0FBQztnQkFDSixDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUMsQ0FBUSxDQUFDO1lBRVQsOENBQThDO1lBQzlDLE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRTtnQkFDM0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ25CLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRTtnQkFDN0MsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxLQUFLO2FBQ3BCLENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEMsYUFBYSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9DLENBQUM7WUFFRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtZQUNILE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkVBQTJFLEVBQzNFO2dCQUNFLElBQUksRUFBRSxtSUFBbUk7YUFDMUksQ0FDRixDQUFDO1FBQ0osQ0FBQyxFQUNELEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FDakM7UUFFSCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBc0M7Z0JBQzlDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTthQUNyQixDQUFDO1lBQ0YsSUFBSSxLQUFLLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsa0VBQWtFO1lBQ2xFLG1FQUFtRTtZQUNuRSxxRUFBcUU7WUFDckUsSUFBSSxLQUFLLENBQUMsTUFBTTtnQkFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsS0FBSyxFQUFFLFFBQWtCLEVBQUUsRUFBRTtvQkFDakQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzVDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsMEVBQTBFO1lBQzFFLG9GQUFvRjtZQUNwRixPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQzNDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4Qiw0REFBNEQ7WUFDNUQscUVBQXFFO1lBQ3JFLElBQUksVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxxRkFBcUY7Z0JBQ3JGLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUMzQiwwREFBMEQ7Z0JBQzFELGdFQUFnRTtnQkFDaEUsNkRBQTZEO2dCQUM3RCxnRUFBZ0U7Z0JBQ2hFLHNEQUFzRDtnQkFDdEQsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhCLDBFQUEwRTtnQkFDMUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQ3hDLEtBQUssQ0FBQyxPQUFPLEtBQUssV0FBVztvQkFDM0IsQ0FBQyxDQUFDLHNCQUFzQixFQUFFO29CQUMxQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRW5DLDZDQUE2QztnQkFDN0MsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDbEQsc0NBQXNDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxrREFBa0Q7Z0JBQ2xELGdCQUFnQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFdEMsT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUNwQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUM1RCxTQUFTLENBQ1YsQ0FBQztnQkFDRixNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFeEIsNkNBQTZDO2dCQUM3QyxhQUFhLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDNUQsc0NBQXNDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxrREFBa0Q7Z0JBQ2xELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTVDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLGtFQUFrRTtZQUNsRSxnRUFBZ0U7WUFDaEUsRUFBRTtZQUNGLGdFQUFnRTtZQUNoRSxrRUFBa0U7WUFDbEUsa0VBQWtFO1lBQ2xFLDhEQUE4RDtZQUM5RCx5REFBeUQ7WUFDekQsaUVBQWlFO1lBQ2pFLCtEQUErRDtZQUMvRCw4REFBOEQ7WUFDOUQsMERBQTBEO1lBQzFELE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxRSxNQUFNLGtCQUFrQixHQUN0QixPQUFPLEtBQUssQ0FBQyxZQUFZLEtBQUssUUFBUTtnQkFDcEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZO2dCQUNwQixDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUs7b0JBQ3JCLENBQUMsQ0FBQyxZQUFZO29CQUNkLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbEIsTUFBTSxTQUFTLEdBQ2IsV0FBVyxLQUFLLEtBQUs7Z0JBQ25CLENBQUMsQ0FBQyxTQUFTO2dCQUNYLENBQUMsQ0FBQyxpQ0FBaUMsQ0FDL0IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixLQUFLLENBQUMsbUJBQW1CLENBQzFCLENBQUM7WUFFUixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FDbEMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUNwRCxTQUFTLENBQ1YsQ0FBQztZQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksNEJBQTRCLENBQ3JELFdBQVcsRUFDWCxLQUFLLENBQUMsSUFBSSxDQUNYLENBQUM7WUFFRix5Q0FBeUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztZQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV4Qiw2Q0FBNkM7WUFDN0MsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xFLHNDQUFzQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUVILGtEQUFrRDtZQUNsRCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRTVDLG1FQUFtRTtZQUNuRSwrREFBK0Q7WUFDL0QsNkRBQTZEO1lBQzdELDBEQUEwRDtZQUMxRCw4REFBOEQ7WUFDOUQsa0JBQWtCO1lBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtnQkFDNUQsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNqQixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsMkJBQTJCLEVBQUU7Z0JBQ3JFLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUM7WUFDSCxJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxjQUFjLENBQ25CLFNBQVMsQ0FBQyxRQUFRLEVBQ2xCLGtDQUFrQyxFQUNsQztvQkFDRSxLQUFLLEVBQUUsa0JBQWtCO29CQUN6QixRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUNELDBFQUEwRTtZQUMxRSwrQkFBK0I7WUFDL0IsRUFBRTtZQUNGLHlFQUF5RTtZQUN6RSwwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLHlFQUF5RTtZQUN6RSxtRUFBbUU7WUFDbkUsa0NBQWtDO1lBQ2xDLEVBQUU7WUFDRixxRUFBcUU7WUFDckUsMEVBQTBFO1lBQzFFLHNEQUFzRDtZQUN0RCxFQUFFO1lBQ0YsMEVBQTBFO1lBQzFFLHdFQUF3RTtZQUN4RSxxREFBcUQ7WUFDckQsSUFDRSxPQUFPLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxRQUFRO2dCQUM3QyxXQUFXLEtBQUssS0FBSztnQkFDckIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQzNCLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FDbkIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsK0JBQStCLEVBQy9CO29CQUNFLEtBQUssRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7b0JBQ2pELFFBQVEsRUFBRSxLQUFLO2lCQUNoQixDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxDQUFDLGNBQWMsQ0FDbkIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsK0JBQStCLEVBQy9CO29CQUNFLEtBQUssRUFBRSxLQUFLLENBQUMsbUJBQW1CO29CQUNoQyxRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUM1QixDQUFDO1FBRUQsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztRQUNwRSxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO0tBQzdELENBQUM7QUFDSixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLHFCQUFxQjtBQUNyQiwrRUFBK0U7QUFDL0UseUZBQXlGO0FBQ3pGLHFGQUFxRjtBQUVyRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxJQUFnQixFQUNoQixHQUEyQjtJQUUzQixPQUFPLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFlLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FDaEMsSUFBMEIsRUFDMUIsR0FBMkI7SUFFM0IsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUE0QkQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQTBCLEtBQUssRUFDOUQsS0FBSyxFQUNMLEdBQUcsRUFDSCxFQUFFO0lBQ0YsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUMvQixNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQ3pCLGdCQUFnQixDQUNqQixDQUFDO0lBQ0YsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQzVCLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0NBQWdDLENBQzlDLFFBQStCLEVBQy9CLFNBQThCLFVBQVUsRUFDeEMsZ0JBQXFELEVBQUU7SUFFdkQsT0FBTyxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDL0MsTUFBTTtRQUNOLGFBQWEsRUFBRTtZQUNiLEdBQUcsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0QsR0FBRyxhQUFhO1NBQ2pCO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsUUFBK0IsRUFDL0IsU0FBOEIsVUFBVSxFQUN4QyxnQkFBcUQsRUFBRTtJQUV2RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQzFCLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sU0FBUyxDQUFDLElBQWEsRUFBRTtZQUM5QixHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztZQUM5QixHQUFHLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsSUFBSSxNQUFNLEtBQUssbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hCLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1lBQzlCLEdBQUcsYUFBYTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLGdDQUFnQztBQUNoQywrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRix3RUFBd0U7QUFFeEU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDBCQUEwQixDQUM5QyxLQUFjLEVBQ2QsS0FBYSxFQUNiLEdBQTJCLEVBQzNCLE1BQXVCLEVBQUUsRUFDekIsU0FBOEIsVUFBVSxFQUN4QyxRQUFRLEdBQUcsS0FBSyxFQUNoQixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLFdBQVcsR0FBRyxLQUFLLEVBQ25CLGNBQStCLEdBQUc7SUFFbEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FDbkIsS0FBSyxFQUNMLG1CQUFtQixDQUNqQixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxHQUFHLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxXQUFXLENBQ1osQ0FDRixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNO1lBQ04sYUFBYSxFQUFFLDJCQUEyQixDQUN4QyxtQkFBbUIsQ0FDakIsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsR0FBRyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsV0FBVyxDQUNaLENBQ0Y7WUFDRCxXQUFXO1lBQ1gsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLHdCQUF3QixDQUNoRCxvQkFBb0IsRUFDcEIsS0FBSyxDQUNOLENBQUM7UUFDRixNQUFNLElBQUksa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsS0FBMkIsRUFDM0IsTUFBYyxFQUNkLEdBQTJCLEVBQzNCLFNBQThCLFVBQVUsRUFDeEMsZ0JBQXFELEVBQUUsRUFDdkQsUUFBZ0M7SUFFaEMsT0FBTyxnQ0FBZ0MsQ0FDckMsUUFBUSxJQUFJLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFDcEQsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEIsQ0FDaEQsS0FBYyxFQUNkLE1BQWMsRUFDZCxHQUEyQixFQUMzQixTQUE4QixVQUFVLEVBQ3hDLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLFdBQVcsR0FBRyxLQUFLO0FBQ25COzs7Ozs7R0FNRztBQUNILGlCQUFrQztJQUVsQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQW1CLGlCQUFpQixJQUFJO1lBQzFELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ3BELE1BQU07WUFDTixhQUFhLEVBQUUsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkUsV0FBVztZQUNYLGdCQUFnQjtZQUNoQixjQUFjO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxNQUFNLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FDaEQsdUJBQXVCLEVBQ3ZCLEtBQUssQ0FDTixDQUFDO1FBQ0YsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsS0FBMkIsRUFDM0IsS0FBYSxFQUNiLEdBQTJCLEVBQzNCLE1BQXVCLEVBQUUsRUFDekIsU0FBOEIsVUFBVSxFQUN4QyxnQkFBcUQsRUFBRTtJQUV2RCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDeEQsTUFBTTtRQUNOLGFBQWEsRUFBRTtZQUNiLEdBQUcsMkJBQTJCLENBQzVCLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUM3QztZQUNELEdBQUcsYUFBYTtTQUNqQjtRQUNELGdCQUFnQjtLQUNqQixDQUFDLENBQUM7SUFDSCxNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxLQUFjLEVBQ2QsTUFBYyxFQUNkLEdBQTJCLEVBQzNCLFNBQThCLFVBQVUsRUFDeEMsUUFBUSxHQUFHLEtBQUssRUFDaEIsV0FBVyxHQUFHLEtBQUs7QUFDbkIsMENBQTBDO0FBQzFDLGlCQUFrQztJQUVsQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQW1CLGlCQUFpQixJQUFJO1lBQzFELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ3BELE1BQU07WUFDTixhQUFhLEVBQUUsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkUsV0FBVztZQUNYLGdCQUFnQjtZQUNoQixjQUFjO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxNQUFNLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RSxNQUFNLElBQUksa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxLQUEyQixFQUMzQixLQUFhLEVBQ2IsR0FBMkIsRUFDM0IsTUFBc0IsRUFBRSxFQUN4QixTQUE4QixVQUFVLEVBQ3hDLGdCQUFxRCxFQUFFLEVBQ3ZELFlBQXFCO0lBRXJCLE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztJQUM5QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUN0RCxNQUFNO1FBQ04sYUFBYSxFQUFFO1lBQ2IsR0FBRywyQkFBMkIsQ0FDNUIsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FDdkQ7WUFDRCxHQUFHLGFBQWE7U0FDakI7UUFDRCxnQkFBZ0I7S0FDakIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxLQUFjLEVBQ2QsS0FBYSxFQUNiLEdBQTJCLEVBQzNCLE1BQXNCLEVBQUUsRUFDeEIsU0FBOEIsVUFBVSxFQUN4QyxRQUFRLEdBQUcsS0FBSyxFQUNoQixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLFdBQVcsR0FBRyxLQUFLO0FBQ25CLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUscURBQXFEO0FBQ3JELGVBQWtDLEVBQ2xDLGNBQStCLEdBQUc7SUFFbEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FDbkIsS0FBSyxFQUNMLGVBQWUsQ0FDYixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxHQUFHLEVBQ0gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixXQUFXLENBQ1osQ0FDRixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxNQUFNO1lBQ04sYUFBYSxFQUFFLDJCQUEyQixDQUN4QyxlQUFlLENBQ2IsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsR0FBRyxFQUNILGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsV0FBVyxDQUNaLENBQ0Y7WUFDRCxXQUFXO1lBQ1gsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLHdCQUF3QixDQUNoRCxtQkFBbUIsRUFDbkIsS0FBSyxDQUNOLENBQUM7UUFDRixNQUFNLElBQUksa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxLQUFjLEVBQ2QsS0FBYSxFQUNiLEdBQTJCLEVBQzNCLE1BQXNCLEVBQUUsRUFDeEIsU0FBOEIsVUFBVSxFQUN4QyxXQUFXLEdBQUcsS0FBSztJQUVuQixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLHNCQUFzQixDQUN2QyxtQkFBbUIsQ0FBQyxVQUFVLEVBQzlCLE9BQU8sQ0FDTSxDQUFDO1FBQ2hCLDhEQUE4RDtRQUM5RCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQy9CLFVBQVUsRUFDVixXQUFXLEVBQ1gsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sWUFBWSxDQUNuQyxVQUF3QixFQUN4QixHQUFHLENBQ0osQ0FBZSxDQUFDO1FBQ2pCLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLHdCQUF3QixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RSxNQUFNLElBQUksa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxLQUEyQixFQUMzQixNQUFjLEVBQ2QsR0FBMkIsRUFDM0IsU0FBOEIsVUFBVSxFQUN4QyxnQkFBcUQsRUFBRSxFQUN2RCxRQUFnQztJQUVoQyxPQUFPLDRCQUE0QixDQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUNwRCxNQUFNLEVBQ04sYUFBYSxDQUNkLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEtBQWMsRUFDZCxNQUFjLEVBQ2QsR0FBMkIsRUFDM0IsU0FBOEIsVUFBVSxFQUN4QyxXQUFXLEdBQUcsS0FBSztJQUVuQixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQ3ZDLG1CQUFtQixDQUFDLFVBQVUsRUFDOUIsT0FBTyxDQUNNLENBQUM7UUFDaEIsOERBQThEO1FBQzlELE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FDL0IsVUFBVSxFQUNWLFdBQVcsRUFDWCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxZQUFZLENBQ25DLFVBQXdCLEVBQ3hCLEdBQUcsQ0FDSixDQUFlLENBQUM7UUFDakIsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLEtBQTJCLEVBQzNCLEtBQWEsRUFDYixHQUEyQixFQUMzQixNQUF1QixFQUFFLEVBQ3pCLFNBQThCLFVBQVUsRUFDeEMsZ0JBQXFELEVBQUU7SUFFdkQsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO0lBQzlDLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUNoQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQ3pCLGdCQUFnQixDQUNqQixDQUFDO0lBQ0YsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUV6RCxJQUFJLENBQUMsQ0FBQyxTQUFTLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN2QyxrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsNkNBQTZDO1FBQzdDLE9BQU8sU0FBUyxDQUFDLFNBQWtCLEVBQUU7WUFDbkMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDL0MsR0FBRyxhQUFhO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTFELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNoQixHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUMvQyxHQUFHLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLEtBQTJCLEVBQzNCLE1BQWMsRUFDZCxHQUEyQixFQUMzQixTQUE4QixVQUFVLEVBQ3hDLGdCQUFxRCxFQUFFLEVBQ3ZELFFBQWdDO0lBRWhDLE9BQU8sZ0NBQWdDLENBQ3JDLFFBQVEsSUFBSSxDQUFDLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQ3BELE1BQU0sRUFDTixhQUFhLENBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSw2RUFBNkU7QUFDN0Usd0VBQXdFO0FBQ3hFLHlFQUF5RTtBQUV6RSxNQUFNLHVCQUF1QixHQUFHO0lBQzlCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULFVBQVU7SUFDVixjQUFjO0lBQ2QsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsOERBQThEO0lBQzlELGlCQUFpQjtJQUNqQixhQUFhO0NBQ0wsQ0FBQztBQUVYLFNBQVMsMkJBQTJCLENBQ2xDLFdBQWdDO0lBRWhDLE1BQU0sS0FBSyxHQUF3QyxFQUFFLENBQUM7SUFDdEQsS0FBSyxNQUFNLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzFDLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUNsQyxXQUFnQztJQUVoQyxNQUFNLEtBQUssR0FBd0MsRUFBRSxDQUFDO0lBQ3RELEtBQUssTUFBTSxHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUnVudGltZURlY3J5cHRpb25FcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBTdHJlYW1FcnJvcixcbiAgU3RyZWFtRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9lbnYtY29uZmlnJztcbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUZsdXNoYWJsZVN0YXRlLFxuICBmbHVzaGFibGVQaXBlLFxuICBnZXRNYXhCdWZmZXJlZEJ5dGVzLFxuICBnZXRNYXhCeXRlc1BlckJhdGNoLFxuICBnZXRNYXhDaHVua3NQZXJCYXRjaCxcbiAgZ2V0TWF4SW5mbGlnaHRDaHVua3MsXG4gIHBvbGxSZWFkYWJsZUxvY2ssXG4gIHBvbGxXcml0YWJsZUxvY2ssXG59IGZyb20gJy4vZmx1c2hhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuL3ByaXZhdGUuanMnO1xuLy8gVjI6IHVzZSBnZXRXb3JsZExhenkgaW4gc3RlcC1zaWRlIGNvZGUgcGF0aHMgc28gVHVyYm9wYWNrIGNhbiBzdGF0aWNhbGx5XG4vLyByZXNvbHZlIHRoZSB3b3JsZCBicmlkZ2UgZnJvbSB0aGUgc3RlcCBidW5kbGUgd2l0aG91dCBkcmFnZ2luZyB0aGUgZnVsbFxuLy8gd29ybGQudHMgbW9kdWxlIChhbmQgaXRzIGR5bmFtaWMtaW1wb3J0IGJlaGF2aW91cikgaW50byB0aGUgZmxvdyByb3V0ZS5cbi8vIFNlZSBgcGFja2FnZXMvY29yZS9zcmMvcnVudGltZS9nZXQtd29ybGQtbGF6eS50c2AgYW5kIHRoZVxuLy8gXCJUdXJib3BhY2sgTkZUIFRyYWNpbmcgRXJyb3JzIGluIFYyIENvbWJpbmVkIEZsb3cgUm91dGVcIiBzZWN0aW9uIG9mXG4vLyBgZG9jcy9jb250ZW50L2RvY3MvY2hhbmdlbG9nL2VhZ2VyLXByb2Nlc3NpbmcubWR4YC5cbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vcnVudGltZS9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICBieXRlc1RvQmFzZTY0LFxuICBjcmVhdGVPcGVuU2Vzc2lvbixcbiAgY3JlYXRlU2VhbFNlc3Npb24sXG4gIGRlY29kZVJ1blB1YmxpY0tleSxcbn0gZnJvbSAnLi9zZWFsZWQtYm94LmpzJztcbmltcG9ydCAqIGFzIGNsaWVudE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY2xpZW50LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ29tcHJlc3Npb25TdGF0cyxcbiAgY29tcHJlc3MsXG4gIGRlY29tcHJlc3MsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb21wcmVzc2lvbi5qcyc7XG5pbXBvcnQge1xuICBhZXNLZXlPZixcbiAgZGVjcnlwdCxcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgRW5jcnlwdGlvbktleVBhcmFtLFxuICBlbmNyeXB0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBpc1NlYWxUYXJnZXQsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgcmVzb2x2ZUVuY3J5cHRpb25LZXksXG4gIHJ1blBheWxvYWRLZXlzLFxuICB0eXBlIFNlYWxUYXJnZXQsXG4gIHNlYWxUbyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yLFxuICByZXRocm93SWZSdW50aW1lRXJyb3IsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lcnJvcnMuanMnO1xuaW1wb3J0IHtcbiAgZGVjb2RlRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBpc0VuY3J5cHRlZCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Zvcm1hdC5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEd1ZXN0Q29kZVN0YXRzLFxuICBpc0luc3RhbmNlT2ZQcm90b3R5cGUsXG4gIHJlYWRQcm9wZXJ0eSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7XG4gIGdldENsYXNzUmVkdWNlcnMsXG4gIGdldENsYXNzUmV2aXZlcnMsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9jbGFzcy5qcyc7XG5pbXBvcnQge1xuICBnZXRDb21tb25SZWR1Y2VycyxcbiAgZ2V0Q29tbW9uUmV2aXZlcnMgYXMgZ2V0Q29tbW9uUmV2aXZlcnNGcm9tTW9kdWxlLFxuICByZXZpdmUsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9jb21tb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcixcbiAgZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL3N0ZXAtZnVuY3Rpb24uanMnO1xuaW1wb3J0ICogYXMgc3RlcE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vc3RlcC5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgKiBhcyB3b3JrZmxvd01vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCB7XG4gIEFCT1JUX0hPT0tfVE9LRU4sXG4gIEFCT1JUX0xJU1RFTkVSX0FUVEFDSEVELFxuICBBQk9SVF9SRUFERVJfQ0FOQ0VMLFxuICBBQk9SVF9TVFJFQU1fTkFNRSxcbiAgQk9EWV9JTklUX1NZTUJPTCxcbiAgU1RBQkxFX1VMSUQsXG4gIFNUUkVBTV9EUkFJTl9TWU1CT0wsXG4gIFNUUkVBTV9GUkFNSU5HX1NZTUJPTCxcbiAgU1RSRUFNX05BTUVfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsXG4gIFNUUkVBTV9UWVBFX1NZTUJPTCxcbiAgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSxcbn0gZnJvbSAnLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlU3BhbiwgZ2V0U3BhbktpbmQsIHJlY29yZEVsYXBzZWRTcGFuIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZCB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Fib3J0U2lnbmFsIH0gZnJvbSAnLi93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLmpzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCB1dGlsaXRpZXMgZnJvbSB0aGUgbW9kdWxhciBzZXJpYWxpemF0aW9uIG1vZHVsZXNcbi8vIHNvIGV4aXN0aW5nIGNvbnN1bWVycyBvZiBgQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbmAga2VlcCB3b3JraW5nLlxuZXhwb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBlbmNyeXB0LFxuICBkZWNyeXB0LFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIC8vIFNlYWxlZC1ib3ggKCdlbmNwJykga2V5IHZhcmlhbnRzOiBzZWUgc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLnRzLlxuICB0eXBlIFBheWxvYWRLZXksXG4gIHR5cGUgUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxuICBydW5QYXlsb2FkS2V5cyxcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgaXNSdW5QYXlsb2FkS2V5cyxcbiAgYWVzS2V5T2YsXG59O1xuXG4vLyBSZS1leHBvcnQgdGhlIGxlZ2FjeSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4vLyBOZXcgY29kZSBzaG91bGQgdXNlIEZvcm1hdFByZWZpeCBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnLlxuZXhwb3J0IHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgPVxuICAodHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXQpW2tleW9mIHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0XTtcblxuLyoqXG4gKiBEZWZhdWx0IFVMSUQgZ2VuZXJhdG9yIGZvciBjb250ZXh0cyB3aGVyZSBWTSdzIHNlZWRlZCBgc3RhYmxlVWxpZGAgaXNuJ3QgYXZhaWxhYmxlLlxuICogVXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gc2VyaWFsaXppbmcgc3RyZWFtcyBvdXRzaWRlIHRoZSB3b3JrZmxvdyBWTSBjb250ZXh0XG4gKiAoZS5nLiwgd2hlbiBzdGFydGluZyBhIHdvcmtmbG93IG9yIGhhbmRsaW5nIHN0ZXAgcmV0dXJuIHZhbHVlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIERldGVjdCBpZiBhIHJlYWRhYmxlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBzdHJlYW1cbiAqIEByZXR1cm5zIGBcImJ5dGVzXCJgIGlmIHRoZSBzdHJlYW0gaXMgYSBieXRlIHN0cmVhbSwgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJlYW1UeXBlKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiAnYnl0ZXMnIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKHsgbW9kZTogJ2J5b2InIH0pO1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgIHJldHVybiAnYnl0ZXMnO1xuICB9IGNhdGNoIHt9XG59XG5cbi8qKlxuICogRnJhbWUgZm9ybWF0IGZvciBzdHJlYW0gY2h1bmtzOlxuICogICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVtmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZF1cbiAqXG4gKiBFYWNoIGNodW5rIGlzIGluZGVwZW5kZW50bHkgZnJhbWVkIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuIGZpbmRcbiAqIGNodW5rIGJvdW5kYXJpZXMgZXZlbiB3aGVuIG11bHRpcGxlIGNodW5rcyBhcmUgY29uY2F0ZW5hdGVkIG9yXG4gKiBzcGxpdCBhY3Jvc3MgdHJhbnNwb3J0IHJlYWRzLlxuICovXG5jb25zdCBGUkFNRV9IRUFERVJfU0laRSA9IDQ7XG5cbi8qKlxuICogVGhlIG1vZGUtc3BlY2lmaWMgc2VyaWFsaXplcnMgKGAuL3NlcmlhbGl6YXRpb24ve2NsaWVudCxzdGVwLHdvcmtmbG93fS50c2ApXG4gKiBhbHJlYWR5IHRocm93IGEgYFNlcmlhbGl6YXRpb25FcnJvcmAgd2hvc2UgYC5jYXVzZWAgaXMgdGhlIHVuZGVybHlpbmdcbiAqIGRldmFsdWUgLyBzZXJkZSBmYWlsdXJlLiBUaGUgb3V0ZXIgZGVoeWRyYXRlL2h5ZHJhdGUgd3JhcHBlcnMgd2FudCB0b1xuICogcmUtZnJhbWUgdGhhdCBlcnJvciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBjb250ZXh0IGxhYmVsIChlLmcuIFwid29ya2Zsb3dcbiAqIGFyZ3VtZW50c1wiIGluc3RlYWQgb2YgZ2VuZXJpYyBcIndvcmtmbG93IHZhbHVlXCIpLCBzbyB0aGV5IHVud3JhcCB0aGVcbiAqIGlubmVyIFNlcmlhbGl6YXRpb25FcnJvciBhbmQgcmVmb3JtYXQgd2l0aCB0aGUgb3JpZ2luYWwgY2F1c2UuIEVycm9yc1xuICogdGhhdCBhcmVuJ3QgYWxyZWFkeSBTZXJpYWxpemF0aW9uRXJyb3IgZmxvdyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgaXMgYW4gZXhjZXB0aW9uOiBpdCBtdXN0IGtlZXAgaXRzIGlkZW50aXR5IChhbmRcbiAqIGBjb250ZXh0YCkgc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXIgcm91dGVzIGl0IHRvIGBSVU5USU1FX0VSUk9SYCxcbiAqIHNvIHRoaXMgcmV0aHJvd3MgaXQgdW5jaGFuZ2VkIGJlZm9yZSBhbnkgdW53cmFwcGluZy4gTm90ZSB0aGlzIGd1YXJkXG4gKiBtdXN0IHJ1biBiZWZvcmUgdGhlIGdlbmVyaWMgYFdvcmtmbG93UnVudGltZUVycm9yYCB1bndyYXAgYmVsb3csIHNpbmNlXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgZXh0ZW5kcyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIGFuZCBjYXJyaWVzIGFcbiAqIGBjYXVzZWAgKHRoZSB1bmRlcmx5aW5nIERPTUV4Y2VwdGlvbikgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgdW53cmFwcGVkXG4gKiBhbmQgcmVmcmFtZWQgYXMgYSBgU2VyaWFsaXphdGlvbkVycm9yYC5cbiAqL1xuZnVuY3Rpb24gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlcmlhbGl6YXRpb25FcnJvciAmJiBlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlO1xuICB9XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG4vKipcbiAqIEVtaXQgY29tcHJlc3Npb24gdGVsZW1ldHJ5IG9udG8gdGhlIGFjdGl2ZSBzcGFuIGFmdGVyIGEgKGRlKXNlcmlhbGl6ZS5cbiAqXG4gKiBUaGUgY29tcHJlc3Npb24gbGF5ZXIgcG9wdWxhdGVzIGBzdGF0c2Agb25seSB3aGVuIGl0IGFjdHVhbGx5IHJhbiAoYmluYXJ5XG4gKiBkYXRhIG9uIGEgc3BlYyA+PSA1IHBhdGgpOyBsZWdhY3kgLyB2MUNvbXBhdCBwYXRocyBsZWF2ZSBpdCB1bnJlY29yZGVkLCBzb1xuICogdGhpcyBuby1vcHMgZm9yIHRoZW0gYW5kIGF2b2lkcyB0aGUgYGdldEFjdGl2ZVNwYW5gIGxvb2t1cC4gQXR0cmlidXRlcyBsYW5kXG4gKiBvbiB3aGF0ZXZlciBzcGFuIGlzIGFjdGl2ZSwgdHlwaWNhbGx5IHRoZSBkZWRpY2F0ZWQgYHN0ZXAuZGVoeWRyYXRlYCAvXG4gKiBgc3RlcC5oeWRyYXRlYCBzcGFuLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBydW4vc3RhcnQgc3Bhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkQ29tcHJlc3Npb24oXG4gIHN0YXRzOiBDb21wcmVzc2lvblN0YXRzLFxuICBvcGVyYXRpb246ICdzZXJpYWxpemUnIHwgJ2Rlc2VyaWFsaXplJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc3RhdHMucmVjb3JkZWQpIHJldHVybjtcbiAgLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgYnJlYWsgdGhlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBkYXRhIHBhdGg6IGFcbiAgLy8gbWlzc2luZy9mYWlsaW5nIHRyYWNlciBpcyBwdXJlbHkgYW4gb2JzZXJ2YWJpbGl0eSBsb3NzLlxuICB0cnkge1xuICAgIGNvbnN0IHNwYW4gPSBhd2FpdCBnZXRBY3RpdmVTcGFuKCk7XG4gICAgaWYgKCFzcGFuKSByZXR1cm47XG4gICAgY29uc3QgdW5jb21wcmVzc2VkQnl0ZXMgPSBzdGF0cy51bmNvbXByZXNzZWRCeXRlcyA/PyAwO1xuICAgIGNvbnN0IHN0b3JlZEJ5dGVzID0gc3RhdHMuc3RvcmVkQnl0ZXMgPz8gMDtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db21wcmVzc2VkKHN0YXRzLmNvbXByZXNzZWQgPz8gZmFsc2UpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uQ29kZWMoc3RhdHMuY29kZWMgPz8gJ25vbmUnKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblVuY29tcHJlc3NlZEJ5dGVzKHVuY29tcHJlc3NlZEJ5dGVzKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblN0b3JlZEJ5dGVzKHN0b3JlZEJ5dGVzKSxcbiAgICAgIC4uLihzdGF0cy5jb21wcmVzc2VkICYmIHVuY29tcHJlc3NlZEJ5dGVzID4gMFxuICAgICAgICA/IEF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzaW9uUmF0aW8oXG4gICAgICAgICAgICAxIC0gc3RvcmVkQnl0ZXMgLyB1bmNvbXByZXNzZWRCeXRlc1xuICAgICAgICAgIClcbiAgICAgICAgOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSB0ZWxlbWV0cnkgZmFpbHVyZXNcbiAgfVxufVxuXG4vKipcbiAqIEVtaXRzIE9UZWwgc3BhbiBhdHRyaWJ1dGVzIGZvciB3b3JrZmxvdyAoZ3Vlc3QpIGNvZGUgZXhlY3V0aW9ucyB0aGF0IHRoZVxuICogaGFyZGVuZWQgc2VyaWFsaXplciBjb3VsZCBub3QgYXZvaWQgKGdldHRlcnMsIHByb3hpZXMsIGN1c3RvbVxuICogc2VyaWFsaXplcnMpLiBOby1vcHMgd2hlbiBzZXJpYWxpemF0aW9uIHdhcyBmdWxseSBzaWRlLWVmZmVjdCBmcmVlLFxuICogdGhlIGNvbW1vbiBjYXNlLiBTYW1lIG5ldmVyLWJyZWFrLXRoZS1kYXRhLXBhdGggY29udHJhY3QgYXNcbiAqIGByZWNvcmRDb21wcmVzc2lvbmAgYWJvdmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoc3RhdHM6IEd1ZXN0Q29kZVN0YXRzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRvdGFsRXhlY3V0aW9ucyA9IHN0YXRzLnRvdGFsRXhlY3V0aW9ucyA/PyBzdGF0cy5leGVjdXRpb25zLmxlbmd0aDtcbiAgaWYgKHRvdGFsRXhlY3V0aW9ucyA9PT0gMCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHNwYW4gPSBhd2FpdCBnZXRBY3RpdmVTcGFuKCk7XG4gICAgaWYgKCFzcGFuKSByZXR1cm47XG4gICAgY29uc3QgZGV0YWlscyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgIHN0YXRzLmV4ZWN1dGlvbnMubWFwKChlKSA9PlxuICAgICAgICAgIGUuZGV0YWlsID8gYCR7ZS5raW5kfSAoJHtlLmRldGFpbH0pYCA6IGUua2luZFxuICAgICAgICApXG4gICAgICApLFxuICAgIF07XG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkd1ZXN0Q29kZUV4ZWN1dGlvbnModG90YWxFeGVjdXRpb25zKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkd1ZXN0Q29kZURldGFpbHMoZGV0YWlscyksXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSB0ZWxlbWV0cnkgZmFpbHVyZXNcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICByZWR1Y2VyczogUGFydGlhbDxSZWR1Y2Vycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICAvLyBOb3RlOiBpZiByZXNvbHZpbmcgY3J5cHRvS2V5IHJlamVjdHMgKGUuZy4sIG5ldHdvcmsgZXJyb3IgZmV0Y2hpbmdcbiAgLy8gdGhlIGRlcml2ZWQga2V5KSwgdGhlIHJlamVjdGlvbiB3b24ndCBzdXJmYWNlIHVudGlsIHRoZSBmaXJzdCBjaHVua1xuICAvLyBpcyBwcm9jZXNzZWQsIG5vdCBhdCBzdHJlYW0gY29uc3RydWN0aW9uIHRpbWUuXG4gIGNvbnN0IGtleVN0YXRlID0ge1xuICAgIHJlc29sdmVkOiBmYWxzZSxcbiAgICBrZXk6IHVuZGVmaW5lZCBhcyBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICB9O1xuICAvLyBTZXQgd2hlbiB0aGUgcmVzb2x2ZWQga2V5IGlzIGEgc2VhbCB0YXJnZXQ7IGFtb3J0aXplcyB0aGUgS0VNIGFjcm9zcyBhbGxcbiAgLy8gZnJhbWVzIHRoaXMgc3RyZWFtIGluc3RhbmNlIHdyaXRlcy5cbiAgbGV0IHNlYWxTZXNzaW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVTZWFsU2Vzc2lvbj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgICAgICBrZXlTdGF0ZS5yZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzU2VhbFRhcmdldChrZXlTdGF0ZS5rZXkpKSB7XG4gICAgICAgICAgICBzZWFsU2Vzc2lvbiA9IGNyZWF0ZVNlYWxTZXNzaW9uKFxuICAgICAgICAgICAgICBrZXlTdGF0ZS5rZXkucmVjaXBpZW50UHVibGljS2V5LFxuICAgICAgICAgICAgICBrZXlTdGF0ZS5rZXkuYWFkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc3RyaW5naWZ5KGNodW5rLCByZWR1Y2Vycyk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShzZXJpYWxpemVkKTtcbiAgICAgICAgbGV0IHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICAgICAgcGF5bG9hZFxuICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgZnJhbWUgcGF5bG9hZCBpZiBhIGtleSBpcyBwcm92aWRlZC5cbiAgICAgICAgLy8gVGhlIGxlbmd0aCBoZWFkZXIgcmVtYWlucyBpbiB0aGUgY2xlYXIgc28gdGhlIGRlc2VyaWFsaXplciBjYW5cbiAgICAgICAgLy8gZmluZCBmcmFtZSBib3VuZGFyaWVzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFdmVyeSBmcmFtZSBnZXRzIGEgZnJlc2ggcmFuZG9tIG5vbmNlLiBOZXZlciBzd2l0Y2ggdGhpcyB0byBhXG4gICAgICAgIC8vIGNvdW50ZXI6IGEgc3RyZWFtIHJlY29ubmVjdCBvciBhIGR1cmFibGUgcmVwbGF5IHJlc3RhcnRzIHRoZSB3cml0ZXIsXG4gICAgICAgIC8vIHdoaWNoIHdvdWxkIHJlcGVhdCBgKGtleSwgbm9uY2UpYCBhbmQgY2F0YXN0cm9waGljYWxseSBicmVha1xuICAgICAgICAvLyBBRVMtR0NNLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbiB0aGUgc2VhbGVkIHBhdGggdGhlIEtFTSBpcyBhbW9ydGl6ZWQgYWNyb3NzIHRoZSBzdHJlYW0gdmlhIGFcbiAgICAgICAgLy8gc2Vzc2lvbiAob25lIEVDREggcGVyIHdyaXRlciBpbnN0ZWFkIG9mIG9uZSBwZXIgZnJhbWUpLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgLy8gcHJlY2lzZWx5IGJlY2F1c2UgdGhlIG5vbmNlcyBzdGF5IHJhbmRvbSwgYW5kIGJlY2F1c2UgdGhlIHNlc3Npb24gaXNcbiAgICAgICAgLy8gc2NvcGVkIHRvIHRoaXMgc3RyZWFtIGluc3RhbmNlOiBhIHJlcGxheWVkIG9yIHJlY29ubmVjdGVkIHdyaXRlclxuICAgICAgICAvLyBidWlsZHMgYSBuZXcgb25lIGFuZCBuZXZlciBpbmhlcml0cyBhIHByZXZpb3VzIGNvbnRlbnQga2V5LlxuICAgICAgICBpZiAoc2VhbFNlc3Npb24pIHtcbiAgICAgICAgICBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRCxcbiAgICAgICAgICAgIGF3YWl0IHNlYWxTZXNzaW9uLnNlYWwocHJlZml4ZWQpXG4gICAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9IGVsc2UgaWYgKGtleVN0YXRlLmtleSkge1xuICAgICAgICAgIHByZWZpeGVkID0gKGF3YWl0IGVuY3J5cHQocHJlZml4ZWQsIGtleVN0YXRlLmtleSkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWU6IFs0LWJ5dGUgbGVuZ3RoXVtwcmVmaXhlZCBkYXRhXVxuICAgICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgcHJlZml4ZWQubGVuZ3RoKTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIHByZWZpeGVkLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgICBmcmFtZS5zZXQocHJlZml4ZWQsIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVuY3J5cHRpb24gZmFpbHVyZXMgbXVzdCBrZWVwIHRoZWlyIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JcbiAgICAgICAgLy8gaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIHJhdGhlciB0aGFuIGJlIHJlZnJhbWVkIGFzIGFcbiAgICAgICAgLy8gU2VyaWFsaXphdGlvbkVycm9yIChVU0VSX0VSUk9SKS5cbiAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdzdHJlYW0gY2h1bmsnLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlOiBlcnJvciB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gIHJldml2ZXJzOiBQYXJ0aWFsPFJldml2ZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+IHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgY29uc3Qga2V5U3RhdGUgPSB7XG4gICAgcmVzb2x2ZWQ6IGZhbHNlLFxuICAgIGtleTogdW5kZWZpbmVkIGFzIFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIH07XG4gIC8vIE1pcnJvciBvZiB0aGUgd3JpdGVyJ3Mgc2VhbCBzZXNzaW9uOiBldmVyeSBmcmFtZSBmcm9tIG9uZSB3cml0ZXIgY2Fycmllc1xuICAvLyB0aGUgc2FtZSBlcGhlbWVyYWwgcHVibGljIGtleSwgc28gdGhpcyB0dXJucyBhbiBFQ0RIIHBlciBmcmFtZSBpbnRvIGFuXG4gIC8vIEVDREggcGVyIHdyaXRlci5cbiAgbGV0IG9wZW5TZXNzaW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVPcGVuU2Vzc2lvbj4gfCB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV3QnVmZmVyLnNldChidWZmZXIsIDApO1xuICAgIG5ld0J1ZmZlci5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV3QnVmZmVyO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYW1lcyhcbiAgICBjb250cm9sbGVyOiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjxhbnk+XG4gICkge1xuICAgIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdFxuICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICBrZXlTdGF0ZS5yZXNvbHZlZCA9IHRydWU7XG4gICAgICBpZiAoaXNSdW5QYXlsb2FkS2V5cyhrZXlTdGF0ZS5rZXkpKSB7XG4gICAgICAgIG9wZW5TZXNzaW9uID0gY3JlYXRlT3BlblNlc3Npb24oa2V5U3RhdGUua2V5LmtleVBhaXIsIGtleVN0YXRlLmtleS5hYWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSB0byBleHRyYWN0IGNvbXBsZXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXNcbiAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7IC8vIEluY29tcGxldGUgZnJhbWUsIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcmFtZURhdGEgPSBidWZmZXIuc2xpY2UoXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFLFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoXG4gICAgICApO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpO1xuXG4gICAgICBsZXQgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChmcmFtZURhdGEpO1xuXG4gICAgICAvLyBJZiB0aGUgZnJhbWUgcGF5bG9hZCBpcyBlbmNyeXB0ZWQgb3Igc2VhbGVkLCByZWNvdmVyIGl0IGZpcnN0IHRvXG4gICAgICAvLyByZXZlYWwgdGhlIGlubmVyIGZvcm1hdC1wcmVmaXhlZCBkYXRhIChlLmcuLCAnZGV2bCcgKyBzZXJpYWxpemVkXG4gICAgICAvLyB0ZXh0KSwgdGhlbiBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24gcGF0aC5cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCB8fFxuICAgICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVEXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VhbGVkID0gZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRDtcbiAgICAgICAgLy8gQSBzZWFsZWQgZnJhbWUgbmVlZHMgdGhlIHJ1bidzIGtleXBhaXI7IGEgc3ltbWV0cmljIGZyYW1lIG5lZWRzIGFuXG4gICAgICAgIC8vIEFFUyBrZXkuIFJlcG9ydCB0aGUgc2hvcnRmYWxsIHByZWNpc2VseTogXCJubyBrZXkgYXQgYWxsXCIgYW5kIFwidGhlXG4gICAgICAgIC8vIHdyb25nIGtpbmQgb2Yga2V5XCIgaGF2ZSBkaXN0aW5jdCBjYXVzZXMuXG4gICAgICAgIGNvbnN0IHVzYWJsZSA9IHNlYWxlZFxuICAgICAgICAgID8gaXNSdW5QYXlsb2FkS2V5cyhrZXlTdGF0ZS5rZXkpXG4gICAgICAgICAgOiBhZXNLZXlPZihrZXlTdGF0ZS5rZXkpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghdXNhYmxlKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgICAgICAgICBzZWFsZWRcbiAgICAgICAgICAgICAgICA/ICdTZWFsZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIHJ1biBrZXlwYWlyIGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgIFwiT3BlbmluZyBhIHNlYWxlZCBmcmFtZSByZXF1aXJlcyB0aGUgcnVuJ3Mgb3duIGVuY3J5cHRpb24ga2V5IG1hdGVyaWFsLlwiXG4gICAgICAgICAgICAgICAgOiAnRW5jcnlwdGVkIHN0cmVhbSBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBlbmNyeXB0aW9uIGtleSBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAgICAgICAgICAgICAnRW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZCBvciBubyBrZXkgd2FzIHByb3ZpZGVkIGZvciB0aGlzIHJ1bi4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBwYXlsb2FkLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICBmb3JtYXRQcmVmaXg6IHNlYWxlZCA/ICdlbmNwJyA6ICdlbmNyJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlY3J5cHRlZDogVWludDhBcnJheTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTZWFsZWQgZnJhbWVzIGdvIHRocm91Z2ggdGhlIHNlc3Npb24gc28gcmVwZWF0ZWQgZnJhbWVzIGZyb20gb25lXG4gICAgICAgICAgLy8gd3JpdGVyIHJldXNlIGEgc2luZ2xlIGRlY2Fwc3VsYXRpb24uIEV2ZXJ5dGhpbmcgZWxzZSBkZWxlZ2F0ZXMgdG9cbiAgICAgICAgICAvLyB0aGUgc2hhcmVkIGVudmVsb3BlIGxheWVyLCBrZWVwaW5nIHRoZSB0d28gc2NoZW1lcyBpbiBsb2Nrc3RlcFxuICAgICAgICAgIC8vIHdpdGggdGhlIG9uZS1zaG90IHBhdGguXG4gICAgICAgICAgZGVjcnlwdGVkID0gc2VhbGVkXG4gICAgICAgICAgICA/IGF3YWl0IG9wZW5TZXNzaW9uIS5vcGVuKGRlY29kZUZvcm1hdFByZWZpeChmcmFtZURhdGEpLnBheWxvYWQpXG4gICAgICAgICAgICA6ICgoYXdhaXQgZGVjcnlwdChmcmFtZURhdGEsIGtleVN0YXRlLmtleSkpIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBsb3ctbGV2ZWwgY3J5cHRvIGxheWVyIG9ubHkgc2VlcyB0aGUgc3RyaXBwZWQgcGF5bG9hZCwgc28gaXRcbiAgICAgICAgICAvLyBjYW5ub3QgcmVjb3JkIHRoZSBvdXRlciBlbnZlbG9wZSBwcmVmaXguIFdlIHBlZWtlZCBpdCBoZXJlLCBzb1xuICAgICAgICAgIC8vIGVucmljaCB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHdpdGggdGhlIHJlYWwgZm9ybWF0IHByZWZpeCBiZWZvcmVcbiAgICAgICAgICAvLyBwcm9wYWdhdGluZywgbWlycm9yaW5nIHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50cy5cbiAgICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikgJiYgZXJyb3IuY29udGV4dCkge1xuICAgICAgICAgICAgZXJyb3IuY29udGV4dC5mb3JtYXRQcmVmaXggPSBmb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgICh7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRlY3J5cHRlZCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UodGV4dCwgcmV2aXZlcnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgLy8gRmlyc3QsIHRyeSB0byBkZXRlY3QgaWYgdGhpcyBpcyBsZW5ndGgtcHJlZml4ZWQgZnJhbWVkIGRhdGFcbiAgICAgIC8vIGJ5IGNoZWNraW5nIGlmIHRoZSBmaXJzdCA0IGJ5dGVzIGZvcm0gYSBwbGF1c2libGUgbGVuZ3RoLlxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgY2h1bmsubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGNodW5rLmJ1ZmZlcixcbiAgICAgICAgICBjaHVuay5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGNodW5rLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPCAxMDBfMDAwXzAwMCAvLyBzYW5pdHkgY2hlY2s6IDwgMTAwTUJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTG9va3MgbGlrZSBmcmFtZWQgZGF0YVxuICAgICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBbHJlYWR5IGluIGZyYW1lZCBtb2RlIChoYXZlIGJ1ZmZlcmVkIGRhdGEpXG4gICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgZm9ybWF0OiBuZXdsaW5lLWRlbGltaXRlZCBkZXZhbHVlIHRleHQgKG5vIGZyYW1pbmcpXG4gICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUoY2h1bmspO1xuICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKGxpbmUsIHJldml2ZXJzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFByb2Nlc3MgYW55IHJlbWFpbmluZyBmcmFtZWQgZGF0YVxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ5dGUtc3RyZWFtIHdpcmUgZnJhbWluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4vLyBhcmUgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB3b3JsZCdzIHN0cmVhbSB0cmFuc3BvcnQgb25lIHVzZXIgY2h1bmsgYXRcbi8vIGEgdGltZS4gV2l0aG91dCBhbiBpbi1iYW5kIGVudmVsb3BlLCB0aGUgcmVhZGVyIHNlZXMgYSBmbGF0IHN0cmVhbSBvZlxuLy8gYnl0ZXM6IHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHdoZXJlIG9uZSB1c2VyIGNodW5rIGVuZHMgYW5kIHRoZSBuZXh0XG4vLyBiZWdpbnMsIHdoaWNoIG1ha2VzIG1pZC1zdHJlYW0gcmVjb25uZWN0IGltcG9zc2libGUgKHdlIGRvbid0IGtub3cgaG93XG4vLyBtYW55IHNlcnZlci1zaWRlIGNodW5rcyBoYXZlIGJlZW4gY29uc3VtZWQpLlxuLy9cbi8vIFRvIGVuYWJsZSB0cmFuc3BhcmVudCByZWNvbm5lY3QsIHRoaXMgUFIgaW50cm9kdWNlcyBhbiBvcHQtaW4gd2lyZVxuLy8gZW52ZWxvcGUgdGhhdCB3cmFwcyBlYWNoIHVzZXIgY2h1bmsgaW4gYSBsZW5ndGgtcHJlZml4OlxuLy9cbi8vICAgWzQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aF1bdXNlciBwYXlsb2FkIGJ5dGVzXVxuLy9cbi8vIFRoZSBlbnZlbG9wZSBpcyBpZGVudGljYWwgaW4gc2hhcGUgdG8gYGdldFNlcmlhbGl6ZVN0cmVhbWAncyBmcmFtaW5nLFxuLy8gYnV0IHRoZSBwYXlsb2FkIGhlcmUgaXMgKnJhdyB1c2VyIGJ5dGVzKjogdGhlcmUgaXMgbm8gaW5uZXJcbi8vIGZvcm1hdC1wcmVmaXgsIG5vIGRldmFsdWUsIG5vIGVuY3J5cHRpb24uIEEgZnJhbWVkIGJ5dGUgc3RyZWFtIHN0YXlzXG4vLyBzZW1hbnRpY2FsbHkgYSBieXRlIHN0cmVhbSBlbmQtdG8tZW5kOyB0aGUgZnJhbWluZyBpcyBwdXJlbHkgdHJhbnNwb3J0LlxuLy9cbi8vIFRoZSBkZWNpc2lvbiB0byB1c2UgZnJhbWluZyBmb3IgYSBnaXZlbiBzdHJlYW0gaXMgcmVjb3JkZWQgaW4gdGhlXG4vLyBzZXJpYWxpemVkIHN0cmVhbSByZWYgKGBmcmFtaW5nOiAnZnJhbWVkLXYxJ2ApLCBzbyBib3RoIHNpZGVzIGFncmVlIG9uXG4vLyB0aGUgd2lyZSBmb3JtYXQgd2l0aG91dCBydW50aW1lIG5lZ290aWF0aW9uLiBQcm9kdWNlcnMgdGhhdCB0YXJnZXQgYVxuLy8gcnVuIHdob3NlIGRlcGxveW1lbnQgZG9lc24ndCBzdXBwb3J0IGZyYW1pbmcgKHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYFxuLy8gaW4gY2FwYWJpbGl0aWVzLnRzKSBlbWl0IHJhdyBieXRlcyBhbmQgYSByZWYgd2l0aG91dCB0aGUgZmllbGQsIHdoaWNoXG4vLyB0aGUgcmVhZGVyIHRyZWF0cyBhcyBsZWdhY3kgcmF3IGJ5dGVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuLyoqXG4gKiBNYXhpbXVtIGFsbG93ZWQgYnl0ZS1zdHJlYW0gZnJhbWUgcGF5bG9hZCBzaXplICgxMDBNQikuIFNoYXJlZCBieSB0aGVcbiAqIGZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgdXNlciBjaHVua3MgYXQgd3JpdGUgdGltZSwgd2hlcmUgdGhlIGVycm9yIGlzXG4gKiBhY3Rpb25hYmxlKSBhbmQgdGhlIHVuZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCBsZW5ndGggaGVhZGVycyBhdCByZWFkXG4gKiB0aW1lLCB3aGljaCB1c3VhbGx5IGluZGljYXRlIGEgbm9uLWZyYW1lZCB3aXJlIGJlaW5nIHJlYWQgYXMgZnJhbWVkKS5cbiAqIEtlZXBpbmcgYm90aCBzaWRlcyBvbiBvbmUgY29uc3RhbnQgZ3VhcmFudGVlcyBhbnkgY2h1bmsgdGhlIGZyYW1lclxuICogYWNjZXB0cyBjYW4gYWx3YXlzIGJlIGRlY29kZWQgYnkgdGhlIHVuZnJhbWVyLlxuICovXG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEwMF8wMDBfMDAwO1xuXG4vKipcbiAqIFdyYXBzIGVhY2ggY2h1bmsgb2YgYSBieXRlIHN0cmVhbSBpbiBhIDQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aFxuICogcHJlZml4LiBVc2VkIGJ5IHRoZSBwcm9kdWNlciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogRW1wdHkgY2h1bmtzIChsZW5ndGggMCkgYXJlIGRyb3BwZWQ6IHRoZSByZXN1bHRpbmcgYFsweDAwIDB4MDAgMHgwMCAweDAwXWBcbiAqIGZyYW1lIHdvdWxkIGJlIGFtYmlndW91cyB3aXRoIHRoZSBsZWdhY3kgXCJsb29rcyBmcmFtZWRcIiBkZXRlY3Rpb24gaW5cbiAqIGBnZXREZXNlcmlhbGl6ZVN0cmVhbWAsIGFuZCBpdCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLlxuICpcbiAqIExvYWQtYmVhcmluZyBpbnZhcmlhbnQ6IGVhY2ggdXNlciBjaHVuayBiZWNvbWVzIGV4YWN0bHkgb25lIGZyYW1lLCBhbmRcbiAqIGVhY2ggZnJhbWUgaXMgZW5xdWV1ZWQgYXMgZXhhY3RseSBvbmUgdHJhbnNwb3J0IGNodW5rICh0aGUgZG93bnN0cmVhbVxuICogd3JpdGFibGUgcGVyZm9ybXMgb25lIHdpcmUgd3JpdGUgcGVyIGNodW5rLCBwcmVzZXJ2aW5nIGJvdW5kYXJpZXMpLiBUaGVcbiAqIHNlcnZlciB0aGVyZWZvcmUgc3RvcmVzIG9uZSBmcmFtZSBwZXIgY2h1bmsgaW5kZXgsIHdoaWNoIGlzIHdoYXQgYWxsb3dzXG4gKiBhIGZ1dHVyZSByZWNvbm5lY3RpbmcgcmVhZGVyIHRvIHJlc3VtZSBhIGZyYW1lZCBieXRlIHN0cmVhbSBhdFxuICogYHN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AsIHRoZSBzYW1lIGFyaXRobWV0aWNcbiAqIGBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW1gIHJlbGllcyBvbiBmb3Igb2JqZWN0IHN0cmVhbXMuIERvIG5vdFxuICogY29hbGVzY2Ugb3Igc3BsaXQgZnJhbWVzIGhlcmUgd2l0aG91dCByZXZpc2l0aW5nIHRoYXQgcmVzdW1lIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGNodW5rIG9mICR7Y2h1bmsubGVuZ3RofSBieXRlcyBleGNlZWRzIHRoZSBtYXhpbXVtIGAgK1xuICAgICAgICAgICAgICBgZnJhbWVkIGNodW5rIHNpemUgKCR7TUFYX0ZSQU1FX1NJWkV9KS4gU3BsaXQgdGhlIGRhdGEgaW50byBgICtcbiAgICAgICAgICAgICAgYHNtYWxsZXIgY2h1bmtzIGJlZm9yZSB3cml0aW5nLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIGNodW5rLmxlbmd0aCk7XG4gICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgY2h1bmsubGVuZ3RoLCBmYWxzZSk7XG4gICAgICBmcmFtZS5zZXQoY2h1bmssIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVW53cmFwcyBsZW5ndGgtcHJlZml4ZWQgYnl0ZS1zdHJlYW0gZnJhbWVzIGJhY2sgaW50byB0aGUgb3JpZ2luYWwgdXNlclxuICogY2h1bmtzLiBVc2VkIGJ5IHRoZSBjb25zdW1lciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogQnVmZmVycyBhY3Jvc3MgcmVhZCBib3VuZGFyaWVzLCBzaW5jZSB0aGUgdHJhbnNwb3J0IG1heSBzcGxpdCBhIHNpbmdsZVxuICogZnJhbWUgYWNyb3NzIG11bHRpcGxlIHJlYWRzIChoZWFkZXIgaW4gb25lIGNodW5rLCBwYXlsb2FkIGluIGFub3RoZXIpXG4gKiBvciBjb2FsZXNjZSBtdWx0aXBsZSBmcmFtZXMgaW50byBhIHNpbmdsZSByZWFkLiBUaGUgdHJhbnNmb3JtIGVtaXRzXG4gKiB3aG9sZSB1c2VyIGNodW5rcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAqXG4gKiBFcnJvcnMgdGhlIHN0cmVhbSBpZiB0aGUgbGVuZ3RoIGhlYWRlciBhZHZlcnRpc2VzIGEgZnJhbWUgbGFyZ2VyIHRoYW5cbiAqIGBNQVhfRlJBTUVfU0laRWAgYnl0ZXMsIHNpbmNlIHRoYXQgYWxtb3N0IGNlcnRhaW5seSBpbmRpY2F0ZXMgYVxuICogbWlzZnJhbWVkIHdpcmUgKGUuZy4gYSByYXcgYnl0ZSBzdHJlYW0gYmVpbmcgZmVkIHRocm91Z2ggdGhpcyB0cmFuc2Zvcm1cbiAqIGJ5IG1pc3Rha2UpIGFuZCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFuIGVub3Jtb3VzIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXh0LnNldChidWZmZXIsIDApO1xuICAgIG5leHQuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5leHQ7XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gMCkgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuXG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgICBpZiAoZnJhbWVMZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBmcmFtZSBsZW5ndGggJHtmcmFtZUxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtICgke01BWF9GUkFNRV9TSVpFfSkuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIHVzdWFsbHkgbWVhbnMgYSBub24tZnJhbWVkIGJ5dGUgc3RyZWFtIGlzIGJlaW5nIHJlYWQgYXMgZnJhbWVkLmAsXG4gICAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuXG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUsIHRvdGFsKSk7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZW5kZWQgd2l0aCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIG9mIGluY29tcGxldGUgZnJhbWUgZGF0YS4gYCArXG4gICAgICAgICAgICAgIGBUaGUgc3RyZWFtIHdhcyB0cnVuY2F0ZWQgbWlkLWZyYW1lLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgZW5kLXRvLWVuZCB0aW1lLXRvLWZpcnN0LWNodW5rIHNwYW4gZm9yIGEgbGl2ZSByZWFkOlxuICogcmVhZCBkaXNwYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoaW5nIHRoZVxuICogcmVhZGVyLCBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXIsXG4gIGNvbm5lY3RNcz86IG51bWJlclxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLnJlYWQnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdyZWFkJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnR0ZmNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAuLi4odHlwZW9mIGNvbm5lY3RNcyA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNvbm5lY3RfbXMnOiBjb25uZWN0TXMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odHlwZW9mIHN0YXJ0SW5kZXggPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0uc3RhcnRfaW5kZXgnOiBzdGFydEluZGV4IH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbi8qKlxuICogUmVjb3JkIHNwZWN1bGF0aXZlIHJ1bi1rZXkgcmVzb2x1dGlvbiBpbmRlcGVuZGVudGx5IGZyb20gcmF3IHN0cmVhbSBUVEZDLlxuICogVGhpcyBwaGFzZSBuZXZlciBjYXJyaWVzIGtleSBtYXRlcmlhbCBhbmQgaXMgaW50ZW50aW9uYWxseSBzZXBhcmF0ZSBmcm9tXG4gKiBgd29ya2Zsb3cuc3RyZWFtLnJlYWRgLCB3aG9zZSBlbmRwb2ludCByZW1haW5zIHRoZSBmaXJzdCByYXcgZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbVJlYWRLZXlSZXNvbHV0aW9uKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdWNjZWVkZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnJlc29sdmVfa2V5Jywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmtleV9zdWNjZWVkZWQnOiBzdWNjZWVkZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCByZWFkLWNvbXBsZXRpb24gc3BhbiB3aGVuIGEgc3RyZWFtIHJlYWQgZHJhaW5zOlxuICogYmFjay1kYXRlZCB0byB0aGUgcmVhZCBkaXNwYXRjaCwgc28gaXRzIGR1cmF0aW9uIGlzIHRoZSB0b3RhbCByZWFkLCB3aXRoXG4gKiBjaHVuay9ieXRlIGNvdW50cyBmb3IgdGhyb3VnaHB1dC4gQ2FuY2VsbGVkIHJlYWRzIGVtaXQgbm90aGluZy4gRmlyZS1hbmQtXG4gKiBmb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICByZWNvbm5lY3RzPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWRfY29tcGxldGUnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudG90YWxfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAuLi4odHlwZW9mIHJlY29ubmVjdHMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5yZWNvbm5lY3RzJzogcmVjb25uZWN0cyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgI3JlYWRlcj86IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PjtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3RhdGUuIGByZWFkU3RhcnRgIGlzIHN0YW1wZWQgd2hlbiB0aGVcbiAgICAvLyByZWFkZXIgc3RhcnRzIGNvbnN1bWluZyAoZmlyc3QgcHVsbCDihpIgdGhlIHJlYWQgZGlzcGF0Y2gpOyB0aGUgc3BhbiBpc1xuICAgIC8vIGVtaXR0ZWQgb25jZSwgd2hlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoZXMgdGhlIHJlYWRlci4gU28gaXRzXG4gICAgLy8gZHVyYXRpb24gaXMgdGhlIGVuZC10by1lbmQgVFRGQyBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBOby1vcCB3aXRob3V0XG4gICAgLy8gYW4gT3BlblRlbGVtZXRyeSBTREsgcmVnaXN0ZXJlZC5cbiAgICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCBjb25uZWN0IGR1cmF0aW9uOiB0aGUgd29ybGQuc3RyZWFtcy5nZXQgYXdhaXQgKHJlYWRcbiAgICAvLyBkaXNwYXRjaCAtPiBzdHJlYW0gaGFuZGxlIC8gcmVzcG9uc2UgaGVhZGVycykuIFN0YW1wZWQgb24gdGhlXG4gICAgLy8gd29ya2Zsb3cuc3RyZWFtLnJlYWQgc3BhbiBvbmNlIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzLlxuICAgIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBSZWFkLWNvbXBsZXRpb24gY291bnRlcnMgZm9yIHRoZSB3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZSBzcGFuXG4gICAgLy8gZW1pdHRlZCB3aGVuIHRoZSBzdHJlYW0gZHJhaW5zLlxuICAgIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICAgIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG4gICAgc3VwZXIoe1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBpcyBjb21wbGFpbmluZyBhYm91dCB0aGlzXG4gICAgICB0eXBlOiAnYnl0ZXMnLFxuXG4gICAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBsZXQgcmVhZGVyID0gdGhpcy4jcmVhZGVyO1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgICAgICAgcmVhZGVyID0gdGhpcy4jcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVhZGVyJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgZmx1c2hlcyBhIGxlYWRpbmcgemVyby1sZW5ndGggY2h1bmsgKHYzKykgdG8gY29tbWl0XG4gICAgICAgICAgLy8gcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUgYW55IGRhdGE7IHNraXAgZW1wdGllcyBzbyBUVEZDIG1lYXN1cmVzIHRvXG4gICAgICAgICAgLy8gdGhlIGZpcnN0IHJlYWwgY2h1bmsuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJlxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgICByZWFkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCArPSAxO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIC8vIEZvcndhcmQgcmF3IGJ5dGVzOyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGVcbiAgICAgICAgICAvLyBmcmFtaW5nIGxldmVsIGJ5IGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbS5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXhpbXVtIGNvbnNlY3V0aXZlIHJlY29ubmVjdCBhdHRlbXB0cyBmb3IgYSBzaW5nbGUgZnJhbWVkIHN0cmVhbSBzZXNzaW9uLlxuICogVGhlIGNvdW50ZXIgcmVzZXRzIHRvIHplcm8gd2hlbmV2ZXIgYSByZWNvbm5lY3QgbWFrZXMgZm9yd2FyZCBwcm9ncmVzcyAoYVxuICogZnJhbWUgaXMgZGVsaXZlcmVkKSwgc28gdGhpcyBib3VuZHMgKmNvbnNlY3V0aXZlKiBmYWlsdXJlcywgbm90IHRoZSBsaWZldGltZVxuICogdG90YWw6IGEgbG9uZy1saXZlZCBzZXJ2ZXJsZXNzIHN0cmVhbSBtYXkgbGVnaXRpbWF0ZWx5IHJlY29ubmVjdCBmYXIgbW9yZVxuICogdGhhbiB0aGlzIG1hbnkgdGltZXMgYXMgbG9uZyBhcyBlYWNoIHJlY29ubmVjdCBrZWVwcyBkZWxpdmVyaW5nIGRhdGEuIFdlIG9ubHlcbiAqIGdpdmUgdXAgYWZ0ZXIgdGhpcyBtYW55IHJlY29ubmVjdHMgaW4gYSByb3cgcHJvZHVjZSBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyA9IDUwO1xuXG4vKiogRWZmZWN0aXZlIGNvbnNlY3V0aXZlLXJlY29ubmVjdCBjYXAuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMsXG4gICAge1xuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQWJzb2x1dGUgYmFja3N0b3Agb24gdG90YWwgcmVjb25uZWN0cyBmb3IgYSBzaW5nbGUgc2Vzc2lvbiwgaW5kZXBlbmRlbnQgb2ZcbiAqIHByb2dyZXNzLiBUaGUgY29uc2VjdXRpdmUgY2FwIGFib3ZlIHJlc2V0cyBvbiBmb3J3YXJkIHByb2dyZXNzLCB3aGljaCBpc1xuICogY29ycmVjdCBmb3IgYSB3ZWxsLWJlaGF2ZWQgYmFja2VuZCB0aGF0IGhvbm9ycyBgc3RhcnRJbmRleGAuIEJ1dCBpZiBhIFdvcmxkJ3NcbiAqIGBzdHJlYW1zLmdldGAgZXZlciBpZ25vcmVkIGBzdGFydEluZGV4YCBhbmQgcmUtZGVsaXZlcmVkIGVhcmxpZXIgY2h1bmtzLFxuICogXCJwcm9ncmVzc1wiIHdvdWxkIGJlIHJlcG9ydGVkIGV2ZXJ5IHJlY29ubmVjdCBhbmQgdGhlIGNvbnNlY3V0aXZlIGNhcCB3b3VsZFxuICogbmV2ZXIgdHJpcCwgdHVybmluZyBhIGJvdW5kZWQgZmFpbHVyZSBpbnRvIGFuIHVuYm91bmRlZCByZWNvbm5lY3QgbG9vcC4gVGhpc1xuICogaGFyZCBjZWlsaW5nIGd1YXJhbnRlZXMgdGhlIGxvb3AgYWx3YXlzIHRlcm1pbmF0ZXMuIEl0IGlzIHNldCBoaWdoIGVub3VnaFxuICogKGhvdXJzIG9mIHN0cmVhbWluZyBhdCByZWFsaXN0aWMgcGVyLXNlc3Npb24gdGltZW91dHMpIHRvIG5ldmVyIGludGVyZmVyZVxuICogd2l0aCBsZWdpdGltYXRlIGxvbmctbGl2ZWQgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMgPSAxMDAwO1xuXG4vKiogRWZmZWN0aXZlIHRvdGFsLXJlY29ubmVjdCBiYWNrc3RvcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgbGVuZ3RoLXByZWZpeC1mcmFtZWQgYnl0ZSBzdHJlYW0gZnJvbSBgd29ybGQuc3RyZWFtcy5nZXRgIHdpdGhcbiAqIHRyYW5zcGFyZW50IGF1dG8tcmVjb25uZWN0LlxuICpcbiAqIEV2ZXJ5IGZ1bGx5LWRlY29kZWQgb3V0ZXIgZnJhbWUgY29ycmVzcG9uZHMgdG8gZXhhY3RseSBvbmUgc2VydmVyLXNpZGVcbiAqIGNodW5rICh0aGUgc2VyaWFsaXplIHRyYW5zZm9ybSBlbnF1ZXVlcyBvbmUgZnJhbWUgcGVyIHdvcmtmbG93IHdyaXRlLCBhbmRcbiAqIHRoZSB3cml0YWJsZSBidWZmZXJzIG9uZSBmcmFtZSBwZXIgY2h1bmsgd2hlbiBtdWx0aS13cml0aW5nKS4gVGhlIHdyYXBwZXJcbiAqIGNvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGFuZCwgb24gdXBzdHJlYW0gZXJyb3IsIHJlb3BlbnMgdGhlIGNvbm5lY3Rpb25cbiAqIHdpdGggYHN0YXJ0SW5kZXggPSByZXNvbHZlZFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AuIFBhcnRpYWwtZnJhbWVcbiAqIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB0aGUgY3V0IGFyZSBkaXNjYXJkZWQ7IHRoZSBzZXJ2ZXIgd2lsbCByZXNlbmQgdGhlXG4gKiBpbi1mbGlnaHQgY2h1bmsgaW4gZnVsbCBmcm9tIHRoZSBuZXcgc3RhcnRJbmRleC5cbiAqXG4gKiBBIGNsZWFuIHVwc3RyZWFtIGNsb3NlIChFT0Ygd2l0aCBubyBlcnJvcikgaXMgTk9UIHRydXN0ZWQgYXMgY29tcGxldGlvblxuICogb24gaXRzIG93bjogc29tZSB0cmFuc3BvcnQgcGF0aHMgbm9ybWFsaXplIGEgbWlkLXN0cmVhbSBhYm9ydCBpbnRvIGFcbiAqIGdyYWNlZnVsIGVuZCAob2JzZXJ2ZWQgaW4gcHJvZHVjdGlvbiBvbiBWZXJjZWwgcmVzcG9uc2Ugc3RyZWFtaW5nLCB3aGVyZVxuICogdGhlIHNlcnZlcidzIG1heC1kdXJhdGlvbiBhYm9ydCBhcnJpdmVzIGF0IHRoZSBjbGllbnQgYXMgYSBjbGVhbiBFT0YpLlxuICogT24gRU9GIHRoZSB3cmFwcGVyIHZlcmlmaWVzIGFnYWluc3QgdGhlIHN0cmVhbSdzIGF1dGhvcml0YXRpdmUgbWV0YWRhdGFcbiAqIChgc3RyZWFtcy5nZXRJbmZvYCkgdGhhdCB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlIEFORCB0aGF0IGV2ZXJ5IGNodW5rIHVwIHRvXG4gKiBgZG9uZWAgd2FzIGRlbGl2ZXJlZDsgb3RoZXJ3aXNlIGl0IHJlY29ubmVjdHMgZnJvbSB0aGUgbmV4dCBjaHVuayBleGFjdGx5XG4gKiBsaWtlIGFuIGVycm9yZWQgY29ubmVjdGlvbi4gSWYgdGhlIG1ldGFkYXRhIHJlYWQgaXRzZWxmIGZhaWxzLCB0aGUgRU9GIGlzXG4gKiB0cnVzdGVkIChsZWdhY3kgYmVoYXZpb3IpIHJhdGhlciB0aGFuIGZhaWxpbmcgYSByZWFkIHRoYXQgbWF5IHdlbGwgYmVcbiAqIGNvbXBsZXRlLlxuICpcbiAqIE5lZ2F0aXZlIGBzdGFydEluZGV4YCB2YWx1ZXMgKGxhc3QtTiBzZW1hbnRpY3MpIHNraXAgdGhlIHJlY29ubmVjdFxuICogbWFjaGluZXJ5IGJlY2F1c2Ugd2UgY2Fubm90IGNvbXB1dGUgYW4gYWJzb2x1dGUgcmVzdW1lIHBvc2l0aW9uIHdpdGhvdXRcbiAqIGEgdGFpbC1pbmRleCBsb29rdXA7IHRoZSByZXR1cm5lZCBzdHJlYW0gYmVoYXZlcyBhcyBhIHNpbmdsZS1zaG90IHJlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW0oXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlcixcbiAgcHJlZmV0Y2hFbmNyeXB0aW9uS2V5OiAoKSA9PiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+ID0gYXN5bmMgKCkgPT5cbiAgICB1bmRlZmluZWRcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVjb25uZWN0U3VwcG9ydGVkID0gc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0SW5kZXggPj0gMDtcbiAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gc3RhcnRJbmRleCA/PyAwO1xuICBsZXQgY29uc3VtZWRGcmFtZXMgPSAwO1xuICBsZXQgcmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgdG90YWxSZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVhZCB0ZWxlbWV0cnkgKHNhbWUgc2VtYW50aWNzIGFzIFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0pOlxuICAvLyBkaXNwYXRjaCB0aW1lLCBmaXJzdC1jb25uZWN0IGR1cmF0aW9uLCBmaXJzdC1mcmFtZSBsYXRjaCwgYW5kIHRvdGFscy5cbiAgbGV0IHJlYWRTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29ubmVjdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdENodW5rUmVwb3J0ZWQgPSBmYWxzZTtcbiAgbGV0IGNodW5rc0RlbGl2ZXJlZCA9IDA7XG4gIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG4gIGxldCBrZXlQcmVmZXRjaGVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcHJlZmV0Y2hLZXkoKTogdm9pZCB7XG4gICAgaWYgKGtleVByZWZldGNoZWQpIHJldHVybjtcbiAgICBrZXlQcmVmZXRjaGVkID0gdHJ1ZTtcbiAgICBjb25zdCBrZXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgLy8gVGhlIHJhdyBzdHJlYW0gYW5kIGtleSBsb29rdXAgZGVsaWJlcmF0ZWx5IHJhY2UuIE9ic2VydmUgYSBzcGVjdWxhdGl2ZVxuICAgIC8vIGZhaWx1cmUgaGVyZTogaWYgdGhlIHN0cmVhbSBpcyBjYW5jZWxsZWQgb3IgZmFpbHMgYmVmb3JlIGFuIGVuY3J5cHRlZFxuICAgIC8vIGZyYW1lIHJlYWNoZXMgdGhlIGRlc2VyaWFsaXplIHRyYW5zZm9ybSwgdGhpcyBwcm9taXNlIG90aGVyd2lzZSBoYXMgbm9cbiAgICAvLyBjb25zdW1lciBhbmQgd291bGQgYmVjb21lIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uIFRoZSB0cmFuc2Zvcm0gc3RpbGxcbiAgICAvLyBhd2FpdHMgdGhlIHNhbWUgcHJvbWlzZSBhbmQgc3VyZmFjZXMgdGhlIG9yaWdpbmFsIGVycm9yIG9uIGNvbnN1bXB0aW9uLlxuICAgIHZvaWQgcHJlZmV0Y2hFbmNyeXB0aW9uS2V5KCkudGhlbihcbiAgICAgIChrZXkpID0+IHtcbiAgICAgICAgLy8gVW5lbmNyeXB0ZWQgcnVucyBkbyBub3QgbmVlZCBhIGtleS1yZXNvbHV0aW9uIHNwYW4uIFRoZWlyIHJlc29sdmVyXG4gICAgICAgIC8vIHN0aWxsIHJ1bnMgc3BlY3VsYXRpdmVseSBzbyBhbiBlbmNyeXB0ZWQgZnJhbWUgY2FuIGpvaW4gaXQuXG4gICAgICAgIGlmIChrZXkpIHJlY29yZFN0cmVhbVJlYWRLZXlSZXNvbHV0aW9uKGtleVN0YXJ0LCBydW5JZCwgbmFtZSwgdHJ1ZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gcmVjb3JkU3RyZWFtUmVhZEtleVJlc29sdXRpb24oa2V5U3RhcnQsIHJ1bklkLCBuYW1lLCBmYWxzZSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY29ubmVjdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoY2FuY2VsZWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVN0YXJ0SW5kZXggPSByZWNvbm5lY3RTdXBwb3J0ZWRcbiAgICAgID8gY3VycmVudFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc1xuICAgICAgOiBzdGFydEluZGV4O1xuICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIGVmZmVjdGl2ZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgYXdhaXQgc3RyZWFtLmNhbmNlbChjYW5jZWxSZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbm5lY3RNcyA9PT0gdW5kZWZpbmVkKSBjb25uZWN0TXMgPSBEYXRlLm5vdygpIC0gY29ubmVjdFN0YXJ0O1xuICAgIHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIHVwc3RyZWFtIEVPRiByZXByZXNlbnRzIGdlbnVpbmUgY29tcGxldGlvbjogdGhlIHN0cmVhbSdzXG4gICAqIGF1dGhvcml0YXRpdmUgbWV0YWRhdGEgc2F5cyBpdCBpcyBkb25lIEFORCB0aGUgZnJhbWVzIGRlbGl2ZXJlZCBzbyBmYXJcbiAgICogY292ZXIgZXZlcnkgY2h1bmsgdXAgdG8gdGhlIHRhaWwgKG9uZSBvdXRlciBmcmFtZSA9PSBvbmUgc2VydmVyIGNodW5rKS5cbiAgICogQSBtZXRhZGF0YSBmYWlsdXJlIHRydXN0cyB0aGUgRU9GLCBzaW5jZSB0dXJuaW5nIGEgaGVhbHRoeSBjb21wbGV0aW9uXG4gICAqIGludG8gYW4gZXJyb3IgKG9yIGEgcmVjb25uZWN0IGxvb3ApIG9uIGEgdHJhbnNpZW50IG1ldGFkYXRhIGJsaXAgd291bGRcbiAgICogYmUgd29yc2UgdGhhbiB0aGUgbGVnYWN5IGJlaGF2aW9yIHRoaXMgY2hlY2sgZ3VhcmRzIGFnYWluc3QuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBpc1ZlcmlmaWVkQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXRJbmZvKHJ1bklkLCBuYW1lKTtcbiAgICAgIHJldHVybiBpbmZvLmRvbmUgJiYgY3VycmVudFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lcyA+IGluZm8udGFpbEluZGV4O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb25uZWN0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyZWFkZXIpIHtcbiAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEFkdmFuY2UgdGhlIHJlc3VtZSBwb3NpdGlvbiBwYXN0IHRoZSBmcmFtZXMgYWxyZWFkeSBkZWxpdmVyZWQsIHRoZW5cbiAgICAvLyBkcm9wIGFueSBwYXJ0aWFsLWZyYW1lIGJ5dGVzOiB0aGUgcmVvcGVuZWQgY29ubmVjdGlvbiByZS1zZW5kcyBmcm9tIGFcbiAgICAvLyBmcmFtZSBib3VuZGFyeSBhdCB0aGUgbmV3IGluZGV4LlxuICAgIGN1cnJlbnRTdGFydEluZGV4ICs9IGNvbnN1bWVkRnJhbWVzO1xuICAgIGNvbnN1bWVkRnJhbWVzID0gMDtcbiAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICAgIC8vIFJldHJ5IHRoZSByZW9wZW4gaXRzZWxmIGFnYWluc3QgdGhlIHJlY29ubmVjdCBidWRnZXQuIEEgdHJhbnNpZW50XG4gICAgLy8gZmFpbHVyZSBvZiBjb25uZWN0KCkgKHRoZSBzZXJ2ZXIgYnJpZWZseSB1bmF2YWlsYWJsZSBkdXJpbmcgdGhlXG4gICAgLy8gcmVjb25uZWN0IHdpbmRvdykgaXMgdGhlIGV4YWN0IGJsaXAgdGhpcyB3cmFwcGVyIGV4aXN0cyB0byBzdXJ2aXZlLCBzb1xuICAgIC8vIGNvdW50IGl0IGFnYWluc3QgdGhlIGJ1ZGdldCBhbmQgdHJ5IGFnYWluIHJhdGhlciB0aGFuIHRyZWF0aW5nIGl0IGFzXG4gICAgLy8gZmF0YWwuIE9ubHkgYnVkZ2V0IGV4aGF1c3Rpb24gKGEgc2VydmVyIHRoYXQgc3RheXMgZG93bikgdGVybWluYXRlcyB0aGVcbiAgICAvLyBzdHJlYW0uXG4gICAgY29uc3QgbWF4UmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFJlY29ubmVjdHMoKTtcbiAgICBjb25zdCBtYXhUb3RhbFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhUb3RhbFJlY29ubmVjdHMoKTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICByZWNvbm5lY3RDb3VudCsrO1xuICAgICAgdG90YWxSZWNvbm5lY3RDb3VudCsrO1xuICAgICAgaWYgKHJlY29ubmVjdENvdW50ID4gbWF4UmVjb25uZWN0cykge1xuICAgICAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3IoXG4gICAgICAgICAgYFN0cmVhbSBcIiR7bmFtZX1cIiBleGNlZWRlZCBtYXhpbXVtIHJlY29ubmVjdGlvbiBhdHRlbXB0cyAoJHttYXhSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodG90YWxSZWNvbm5lY3RDb3VudCA+IG1heFRvdGFsUmVjb25uZWN0cykge1xuICAgICAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3IoXG4gICAgICAgICAgYFN0cmVhbSBcIiR7bmFtZX1cIiBleGNlZWRlZCBtYXhpbXVtIHRvdGFsIHJlY29ubmVjdGlvbiBhdHRlbXB0cyAoJHttYXhUb3RhbFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGF3YWl0IGNvbm5lY3QoKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gUmV0ZW50aW9uIGV4cGlyeSBpcyB0ZXJtaW5hbCBhbmQgcmV0cnlpbmcgY2Fubm90IHJlc3RvcmUgdGhlIHN0cmVhbS5cbiAgICAgICAgLy8gUHJlc2VydmUgdGhlIHR5cGVkIGVycm9yIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgdHVybmluZyBvbmUgNDEwIGludG9cbiAgICAgICAgLy8gNTAgcmVjb25uZWN0IGF0dGVtcHRzIGFuZCBhIGdlbmVyaWMgYnVkZ2V0LWV4aGF1c3Rpb24gZXJyb3IuXG4gICAgICAgIGlmIChTdHJlYW1FeHBpcmVkRXJyb3IuaXMoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgLy8gUmVvcGVuIGZhaWxlZCB0cmFuc2llbnRseTsgbG9vcCB0byByZXRyeSwgY291bnRpbmcgYWdhaW5zdCB0aGVcbiAgICAgICAgLy8gYnVkZ2V0IHNvIGEgc2VydmVyIHRoYXQgbmV2ZXIgcmVjb3ZlcnMgc3RpbGwgdGVybWluYXRlcyB0aGUgc3RyZWFtLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgIHB1bGw6IGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIEJlZ2luIHJlc29sdmluZyB0aGUga2V5IGJlZm9yZSBhd2FpdGluZyBzdHJlYW1zLmdldCgpL3RoZSBmaXJzdCByYXdcbiAgICAgIC8vIGZyYW1lLiBUaGlzIGlzIGludGVudGlvbmFsbHkgbm90IGF3YWl0ZWQ6IGJ1ZmZlcmVkIHJhdyBmcmFtZXMgcmVtYWluXG4gICAgICAvLyBib3VuZGVkIGJ5IHRoZSBXZWIgU3RyZWFtcyBiYWNrcHJlc3N1cmUgY2hhaW4gd2hpbGUgdGhlIGRlc2VyaWFsaXplXG4gICAgICAvLyB0cmFuc2Zvcm0gam9pbnMgdGhpcyBwcm9taXNlIG9ubHkgaWYgYW4gZW5jcnlwdGVkIGZyYW1lIG5lZWRzIGl0LlxuICAgICAgcHJlZmV0Y2hLZXkoKTtcbiAgICAgIC8vIExvb3AgdW50aWwgd2UgZW1pdCBzb21ldGhpbmcsIGhpdCBFT0YsIG9yIGZhdGFsbHkgZXJyb3IuIFJlYWRzIHRoYXRcbiAgICAgIC8vIG9ubHkgZXh0ZW5kIHRoZSBpbi1mbGlnaHQtZnJhbWUgYnVmZmVyIGRvbid0IGVucXVldWUgYW55dGhpbmc7IHdlXG4gICAgICAvLyBrZWVwIHJlYWRpbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGVtcHR5LWhhbmRlZC5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgY29ubmVjdCgpKSkgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGNhbmNlbGVkKSByZXR1cm47XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDogeyBkb25lOiBib29sZWFuOyB2YWx1ZT86IFVpbnQ4QXJyYXkgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IGNvbm5lY3QoKSBndWFyYW50ZWVzIHJlYWRlclxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRlciEucmVhZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXJlY29ubmVjdFN1cHBvcnRlZCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgcmVjb25uZWN0KCkpKSByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAocmVjb25uZWN0RXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKHJlY29ubmVjdEVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbmNlbGVkKSByZXR1cm47XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSB8fCAhcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIC8vIEEgY2xlYW4gRU9GIGlzIG9ubHkgdHJ1c3R3b3J0aHkgaWYgdGhlIHN0cmVhbSBpcyBhY3R1YWxseVxuICAgICAgICAgIC8vIGNvbXBsZXRlIGFuZCB0aGlzIHNlc3Npb24gZGVsaXZlcmVkIGV2ZXJ5IGNodW5rIHVwIHRvIGBkb25lYC5cbiAgICAgICAgICAvLyBJbmZyYXN0cnVjdHVyZSBjYW4gbm9ybWFsaXplIGEgbWlkLXN0cmVhbSBhYm9ydCBpbnRvIGEgZ3JhY2VmdWxcbiAgICAgICAgICAvLyBlbmQgKHRoZSBzZXJ2ZXIncyBtYXgtZHVyYXRpb24gY3V0IGlzIGRlc2lnbmVkIHRvIGFycml2ZSBhcyBhblxuICAgICAgICAgIC8vIGVycm9yZWQgYm9keSwgYnV0IG9uIHNvbWUgcGF0aHMgaXQgcmVhY2hlcyB0aGUgY2xpZW50IGFzIGEgY2xlYW5cbiAgICAgICAgICAvLyBFT0YpLCBhbmQgYSBjb21wbGV0ZWQgc3RyZWFtIGNhbiBzdGlsbCBiZSBjdXQgbWlkLWJvZHk7IGJvdGhcbiAgICAgICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYmUgc2lsZW50bHkgcmVhZCBhcyBhIHNob3J0ZXIsIGNvbXBsZXRlIHN0cmVhbS5cbiAgICAgICAgICBjb25zdCB2ZXJpZmllZENvbXBsZXRlID1cbiAgICAgICAgICAgICFyZWNvbm5lY3RTdXBwb3J0ZWQgfHwgKGF3YWl0IGlzVmVyaWZpZWRDb21wbGV0ZSgpKTtcbiAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXZlcmlmaWVkQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IHJlY29ubmVjdCgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAocmVjb25uZWN0RXJyKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IocmVjb25uZWN0RXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEdlbnVpbmUgZW5kLW9mLXN0cmVhbS4gRHJvcCBhbnkgcGFydGlhbC1mcmFtZSBieXRlcyAodGhlcmVcbiAgICAgICAgICAvLyBzaG91bGRuJ3QgYmUgYW55OyBhIHdlbGwtZm9ybWVkIHN0cmVhbSBlbmRzIG9uIGEgZnJhbWUgYm91bmRhcnkpLlxuICAgICAgICAgIGlmIChyZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjaHVua3NEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICB0b3RhbFJlY29ubmVjdENvdW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIGJ1ZmZlciBhbmQgZW1pdCBhbGwgY29tcGxldGUgZnJhbWVzLlxuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKGluY29taW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBpbmNvbWluZy5sZW5ndGgpO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChidWZmZXIsIDApO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChpbmNvbWluZywgYnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgYnVmZmVyID0gY29tYmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW1pdHRlZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuICAgICAgICAgIC8vIEZvcndhcmQgdGhlIGVudGlyZSBmcmFtZWQgY2h1bmsgKGhlYWRlciArIHBheWxvYWQpIHRvIHRoZVxuICAgICAgICAgIC8vIGRvd25zdHJlYW0gZGVzZXJpYWxpemVyLCB3aGljaCBhbHJlYWR5IGV4cGVjdHMgdGhpcyBsYXlvdXQuXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZSgwLCB0b3RhbCkpO1xuICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICAgICAgY29uc3VtZWRGcmFtZXMrKztcbiAgICAgICAgICBjaHVua3NEZWxpdmVyZWQrKztcbiAgICAgICAgICBieXRlc0RlbGl2ZXJlZCArPSB0b3RhbDtcbiAgICAgICAgICBpZiAoIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJiByZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtaXR0ZWQpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHByb2dyZXNzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb246IGNsZWFyIHRoZVxuICAgICAgICAgIC8vIGNvbnNlY3V0aXZlLWZhaWx1cmUgYnVkZ2V0IHNvIGEgbG9uZyBzdHJlYW0gdGhhdCByZWNvbm5lY3RzXG4gICAgICAgICAgLy8gbWFueSB0aW1lcyAoYnV0IGtlZXBzIGRlbGl2ZXJpbmcpIGlzIG5ldmVyIGZhbHNlbHkgY2FwcGVkLlxuICAgICAgICAgIHJlY29ubmVjdENvdW50ID0gMDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBwYXJ0aWFsIGJ5dGVzOiByZWFkIG1vcmUuXG4gICAgICB9XG4gICAgfSxcbiAgICBjYW5jZWw6IGFzeW5jIChyZWFzb24pID0+IHtcbiAgICAgIGNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgIGNhbmNlbFJlYXNvbiA9IHJlYXNvbjtcbiAgICAgIGNvbnN0IGN1cnJlbnRSZWFkZXIgPSByZWFkZXI7XG4gICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoY3VycmVudFJlYWRlcikge1xuICAgICAgICBhd2FpdCBjdXJyZW50UmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGNsb3NpbmcgUmVhZGFibGVTdHJlYW0gcmVhZGVyOicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZ3JvdXAtY29tbWl0IHdpbmRvdyBmb3IgdGhlIExFQURJTkcgY2h1bmsgb2YgYW4gaWRsZSBzdHJlYW0uXG4gKlxuICogMCA9IGRpc3BhdGNoIHRoZSBmaXJzdCBjaHVuayBpbW1lZGlhdGVseS4gTWVhc3VyZWQgcHJvZHVjdGlvbiBwcm9kdWNlclxuICogcmF0ZXMgKG1vc3QgYWdlbnRzOiB+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/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGEgc2luZ2xlIGFib3J0IGxpc3RlbmVyIHRvIGEgc2lnbmFsLCBkZWR1cGVkIGFjcm9zcyBjYWxscy5cbiAqXG4gKiBFYWNoIHNlcmlhbGl6YXRpb24gcGFzcyBnb2VzIHRocm91Z2ggdGhlIHJlZHVjZXIsIGJ1dCBhIGNvbnRyb2xsZXIgcGFzc2VkXG4gKiB0byBOIHN0ZXBzIHdvdWxkIG90aGVyd2lzZSBhY2N1bXVsYXRlIE4gbGlzdGVuZXJzLCBlYWNoIHdyaXRpbmcgdGhlIHNhbWVcbiAqIHN0cmVhbSBwYWNrZXQgYW5kIGRvdWJsZS1jbG9zaW5nIHRoZSBzdHJlYW0gb24gYWJvcnQuIFRoZSBtYXJrZXIgc3ltYm9sXG4gKiBlbnN1cmVzIHRoZSBzdHJlYW0td3JpdGUgc2lkZS1lZmZlY3QgcnVucyBhdCBtb3N0IG9uY2UgcGVyIChzaWduYWwsIHJ1bklkKS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiB2b2lkIHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gIGlmICgoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdKSByZXR1cm47XG4gIChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0gPSB0cnVlO1xuXG4gIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdhYm9ydCcsXG4gICAgKCkgPT4ge1xuICAgICAgb3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSByZWFkZXIgdXNlcyAoaHlkcmF0ZVN0ZXBBcmd1bWVudHMpXG4gICAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5IChET01FeGNlcHRpb24sXG4gICAgICAgICAgICAvLyBFcnJvcnMsIGN1c3RvbSBjbGFzc2VzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzIGVuY3J5cHRpb24ga2V5LlxuICAgICAgICAgICAgLy8gQSBiYXJlIEpTT04uc3RyaW5naWZ5IGhlcmUgd291bGQgd3JpdGUgYSBwYWNrZXQgdGhlIHJlYWRlciBjYW4ndFxuICAgICAgICAgICAgLy8gZGVjb2RlIGFuZCB0aGUgbGlzdGVuZXItc2lkZSBhYm9ydCB3b3VsZCBwcm9wYWdhdGUgd2l0aCBubyByZWFzb24uXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgIHsgYWJvcnRlZDogdHJ1ZSwgcmVhc29uOiBzaWduYWwucmVhc29uIH0sXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHBheWxvYWQgYXMgVWludDhBcnJheSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IHN0cmVhbSB3cml0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9LFxuICAgIHsgb25jZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsIHBhc3NpbmcgYXJndW1lbnRzXG4gKiB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEBwYXJhbSBjcnlwdG9LZXlcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZW4gYHRydWVgLCBieXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYClcbiAqICAgYXJlIHdyYXBwZWQgaW4gbGVuZ3RoLXByZWZpeGVkIGZyYW1lcyBvbiB0aGUgd2lyZSBzbyB0aGUgY29uc3VtZXJcbiAqICAgY2FuIHJlY29ubmVjdCBvbiB0cmFuc2llbnQgZXJyb3JzLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBydW4nc1xuICogICBjYXBhYmlsaXR5OiBzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzXG4gKiAgIHRvIGBmYWxzZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgbmVzdGVkIGBSZWFkYWJsZVN0cmVhbWAgZm91bmQgd2hpbGUgc2VyaWFsaXppbmdcbiAgLy8gaXMgcGlwZWQgdG8gaXRzIG93biBzZXJ2ZXIgc3RyZWFtIGluZGVwZW5kZW50bHkgb2YgdGhlIG91dGVyIHNpbmssIHNvIGl0c1xuICAvLyBmaXJzdCBjaHVuayBjYW4gcmFjZSBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhhdFxuICAvLyBzaW5rIHNvIHRoZSB3cml0ZSBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC9cbiAgLy8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4sXG4gIC8vIE9wZXJhdGlvbnMgdGhhdCByZWFkIGRhdGEgYmFjayBmcm9tIHRoZSB3b3JrZmxvdyBpbnRvIGNhbGxlci1vd25lZFxuICAvLyB3cml0YWJsZXMuIFRoZXNlIG11c3Qgc3RheSBzZXBhcmF0ZSBmcm9tIHByb2R1Y2VyIHVwbG9hZHM6IGEgcmVhZGJhY2sgY2FuXG4gIC8vIG9ubHkgZmluaXNoIGFmdGVyIHRoZSB3b3JrZmxvdyBydW5zLCBzbyBhd2FpdGluZyBpdCBiZWZvcmUgZGlzcGF0Y2ggd291bGRcbiAgLy8gZGVhZGxvY2suIERlZmF1bHRzIHRvIGBvcHNgIGZvciBleGlzdGluZyBjYWxsZXJzIHRoYXQgZmx1c2ggZXZlcnl0aGluZyBpblxuICAvLyB0aGUgYmFja2dyb3VuZC5cbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcykgcy5mcmFtaW5nID0gJ2ZyYW1lZC12MSc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogd2hlbiB0aGUgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbSAoZS5nLiBpdCBjYW1lIGZyb20gYSBzdGVwLWNvbnRleHQgYGdldFdyaXRhYmxlKClgXG4gICAgICAvLyBvciB3YXMgaHlkcmF0ZWQgZnJvbSBhIHdvcmtmbG93IGlucHV0IGJ5IGBnZXRTdGVwUmV2aXZlcnNgKSxcbiAgICAgIC8vIGZvcndhcmQgaXRzIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHRvIHRoZSByZWNlaXZpbmcgcnVuLlxuICAgICAgLy8gVGhlIHJlY2VpdmluZyBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyBhIHNlcnZlciB3cml0YWJsZVxuICAgICAgLy8gYWdhaW5zdCB0aGUgb3JpZ2luYWwgYChydW5JZCwgbmFtZSlgIGFuZCByZXNvbHZlcyB0aGF0IHJ1bidzXG4gICAgICAvLyBlbmNyeXB0aW9uIGtleSBkaXJlY3RseSwgc28gd3JpdGVzIGxhbmQgb24gdGhlIG9yaWdpbmFsIHN0cmVhbVxuICAgICAgLy8gZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSByZWNlaXZpbmcgcnVuLCB3aXRoIG5vIGluLXByb2Nlc3NcbiAgICAgIC8vIGJyaWRnZSB0aWVkIHRvIHRoZSBkZWh5ZHJhdGluZyBzdGVwJ3MgbGlmZXRpbWUuXG4gICAgICBjb25zdCBleGlzdGluZ05hbWUgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgY29uc3QgZXhpc3RpbmdSdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleGlzdGluZ05hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZiBleGlzdGluZ1J1bklkID09PSAnc3RyaW5nJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7XG4gICAgICAgICAgbmFtZTogZXhpc3RpbmdOYW1lLFxuICAgICAgICAgIHJ1bklkOiBleGlzdGluZ1J1bklkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBleGlzdGluZ1B1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1B1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBleGlzdGluZ1B1YmxpY0tleTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZ0RlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ0RlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLmRlcGxveW1lbnRJZCA9IGV4aXN0aW5nRGVwbG95bWVudElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgY29uc3QgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpO1xuICAgICAgcmVhZGJhY2tPcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG4vKipcbiAqIFByb3RvdHlwZXMgdXNlZCBmb3IgYnJhbmQtc3R5bGUgaWRlbnRpZmljYXRpb24gaW4gdGhlIHJlZHVjZXJzIGJlbG93LlxuICpcbiAqIFRoZSBzdHJlYW0gYW5kIGFib3J0IGNsYXNzZXMgYXJlIGhvc3QgY2xhc3NlcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzb1xuICogaW5zdGFuY2VzIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbiBhbmQgYSBjaGFpbiB3YWxrXG4gKiBpZGVudGlmaWVzIHRoZW0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgIG9uIHRoZSBzYW5kYm94XG4gKiBjbGFzcy4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVudGltZSBsYWNrcyB0aGUgY2xhc3MsIGluIHdoaWNoIGNhc2VcbiAqIGlkZW50aWZpY2F0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbHMgYWxvbmUuXG4gKi9cbi8qKlxuICogVGhlIHByb3RvdHlwZSBvZiBhIGhvc3QgY2xhc3MgdGhhdCBtYXkgYWxzbyBiZSBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LlxuICogUHJlZmVycyB0aGUgc2FuZGJveCBiaW5kaW5nICh0aGUgc2FtZSBob3N0IGNsYXNzIG9iamVjdCBpbiBwcmFjdGljZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBob3N0J3Mgb3duLCBzbyBhIGNoYWluIHdhbGsgaWRlbnRpZmllcyBpbnN0YW5jZXMgZnJvbVxuICogZWl0aGVyIHJlYWxtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdENsYXNzUHJvdG90eXBlKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5hbWU6IHN0cmluZ1xuKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgLy8gRGVzY3JpcHRvciByZWFkcyAoYHJlYWRQcm9wZXJ0eWApLCBub3QgYmFyZSBnZXRzOiBhbiBhY2Nlc3NvciBvciBQcm94eVxuICAvLyBwbGFudGVkIG9uIHRoZSBzYW5kYm94IGdsb2JhbCAob3IgdGhlIGNvbnN0cnVjdG9yKSBtdXN0IGJlIHJlY29yZGVkIGluXG4gIC8vIHRoZSBndWVzdC1jb2RlIHNpbmsgKGl0IGdhdGVzIFZNIHJldGVudGlvbiksIG5vdCBzaWxlbnRseSBleGVjdXRlZC5cbiAgLy8gQ2FsbGVycyB3cmFwIHRoaXMgaW4gYG9uY2UoLi4uKWAgcGVyIHJlZHVjZXIgc2V0LCBzbyB0aGUgcmVhZCBoYXBwZW5zXG4gIC8vIGV4YWN0bHkgb25jZSBwZXIgc2VyaWFsaXplIHBhc3MsIG9uIHRoZSBmaXJzdCBndWFyZCBpbnZvY2F0aW9uLCBpbnNpZGVcbiAgLy8gdGhlIHBhc3MncyBzaW5rIHNjb3BlLCBuZXZlciBwZXIgdmFsdWUuXG4gIGNvbnN0IGN0b3IgPSByZWFkUHJvcGVydHkoZ2xvYmFsLCBuYW1lKSA/PyByZWFkUHJvcGVydHkoZ2xvYmFsVGhpcywgbmFtZSk7XG4gIGlmICh0eXBlb2YgY3RvciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRQcm9wZXJ0eShjdG9yLCAncHJvdG90eXBlJykgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZWFkYWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVhZGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCB3cml0YWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnV3JpdGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXJQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0Q29udHJvbGxlcicpXG4gICk7XG4gIGNvbnN0IGFib3J0U2lnbmFsUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdBYm9ydFNpZ25hbCcpXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgXCJoYW5kbGVzXCIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBzdGVwcy5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gaW5zdGVhZCBvZiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW1gOlxuICAgICAgLy8gdGhlIGNsYXNzIGlzIGhvc3QtcHJvdmlkZWQgKGluamVjdGVkIGludG8gdGhlIHNhbmRib3gpLCBzbyBpdHNcbiAgICAgIC8vIHByb3RvdHlwZSBpcyBpbiB0aGUgY2hhaW4gb2YgYm90aCByZWFsIHN0cmVhbXMgYW5kIHRoZVxuICAgICAgLy8gYE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKWAgaGFuZGxlcyB1c2VkIGZvciByZXF1ZXN0XG4gICAgICAvLyBib2RpZXMsIGJ1dCBhIGNoYWluIHdhbGsgbmV2ZXIgY29uc3VsdHMgYFN5bWJvbC5oYXNJbnN0YW5jZWAsIHdoaWNoXG4gICAgICAvLyB0aGUgc2FuZGJveCBjYW4gZGVmaW5lIGFuZCB3aGljaCByYW4gZm9yIGV2ZXJ5IHZhbHVlIHRoZSBlYXJsaWVyXG4gICAgICAvLyByZWR1Y2VycyBkaWQgbm90IGNsYWltLiBSZWFkcyBiZWxvdyBnbyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGFcbiAgICAgIC8vIGdldHRlciBvbiBhIHN0ZXAgYXJndW1lbnQgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCBCT0RZX0lOSVRfU1lNQk9MKTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IEV4dHJhY3Q8XG4gICAgICAgIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10sXG4gICAgICAgIHsgbmFtZTogc3RyaW5nIH1cbiAgICAgID4gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9UWVBFX1NZTUJPTCkgYXNcbiAgICAgICAgfCAnYnl0ZXMnXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fRlJBTUlOR19TWU1CT0wpIGFzXG4gICAgICAgIHwgQnl0ZVN0cmVhbUZyYW1pbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGFib3ZlIGZvciB3aHkgdGhpcyB3YWxrcyB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wpO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0OiByZWFkIG9ubHkgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBgdmFsdWUuc2lnbmFsYCB3YXMgYSBiYXJlIHJlYWQsIHNvIGEgYHNpZ25hbGAgZ2V0dGVyIG9uIGFueSBvYmplY3RcbiAgICAgIC8vIHJlYWNoaW5nIHRoaXMgcmVkdWNlciBleGVjdXRlZCB1bnJlcG9ydGVkLiBSZWFkIHRocm91Z2ggZGVzY3JpcHRvcnNcbiAgICAgIC8vIGFuZCBnYXRlIG9uIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2wgLyBwcm90b3R5cGUgZmlyc3QuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaG9sZGVyID0gdmFsdWUgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRIb2xkZXI7XG4gICAgICBjb25zdCBvd25TeW1ib2wgPSByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRDb250cm9sbGVyID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG93blN5bWJvbCA9PT0gdW5kZWZpbmVkICYmICFpc05hdGl2ZUFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3Qgb3VycyBhbmQgbm90IGEgbmF0aXZlIGNvbnRyb2xsZXIsIGJ1dCBhIGZvcmVpZ24gY29udHJvbGxlclxuICAgICAgICAvLyBtYXkgc3RpbGwgY2FycnkgdGhlIHN5bWJvbCBvbiBpdHMgc2lnbmFsLlxuICAgICAgICBjb25zdCBtYXliZVNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmVTaWduYWwgPT09IG51bGwgfHxcbiAgICAgICAgICB0eXBlb2YgbWF5YmVTaWduYWwgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KG1heWJlU2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKCFzaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHNpZ25hbCBhcyBBYm9ydFNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9XG4gICAgICAgIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0U2lnbmFsID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRTaWduYWxQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc0Fib3J0U3ltYm9sICYmICFpc05hdGl2ZUFib3J0U2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZSBhcyBBYm9ydFNpZ25hbCwgdmFsdWUgYXMgQWJvcnRIb2xkZXIpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBgUmVhZGFibGVTdHJlYW1gIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGUgc2FtZSBvcCBmbHVzaCwgc28gaXRzIGZpcnN0IGNodW5rIGNhbiByYWNlXG4gIC8vIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGUgc2luayBzbyB0aGF0IHdyaXRlXG4gIC8vIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gYWxyZWFkeSBoYXMgdGhlIG5hbWUgc3ltYm9sIHNldCwgaW4gd2hpY2ggY2FzZVxuICAgICAgLy8gaXQncyBhbHJlYWR5IGJlaW5nIHN1bmsgdG8gdGhlIHNlcnZlciBhbmQgd2UgY2FuIHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQ7IHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmIChmcmFtaW5nKSBzLmZyYW1pbmcgPSBmcmFtaW5nO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIHJlYWRiYWNrT3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIHJlYWRiYWNrT3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnblB1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICBdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmRlcGxveW1lbnRJZCA9IGZvcmVpZ25EZXBsb3ltZW50SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUuc2lnbmFsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydFNpZ25hbCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRTaWduYWwpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENhbmNlbCBkYW5nbGluZyBhYm9ydC1zdHJlYW0gcmVhZGVycyBvbiBhbnkgQWJvcnRDb250cm9sbGVyIGluc3RhbmNlcyBmb3VuZFxuICogaW4gdGhlIGh5ZHJhdGVkIHN0ZXAgYXJndW1lbnRzLiBDYWxsZWQgYWZ0ZXIgdGhlIHN0ZXAgZnVuY3Rpb24gcmV0dXJuc1xuICogKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgdG8gcHJldmVudCByZWFkZXIgcHJvbWlzZXMgZnJvbSBrZWVwaW5nIHRoZSBzZXJ2ZXJsZXNzXG4gKiBmdW5jdGlvbiBhbGl2ZSBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxBYm9ydFJlYWRlcnMoLi4udmFsdWVzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gIGZ1bmN0aW9uIGNhbmNlbElmUHJlc2VudCh2YWw6IEFib3J0SW50ZXJuYWxzKTogdm9pZCB7XG4gICAgY29uc3QgY2FuY2VsID0gdmFsW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICAgIGlmIChjYW5jZWwgJiYgIWNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY2FuY2VsLmFib3J0KCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHdhbGsodmFsOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCBhcyBvYmplY3QpKSByZXR1cm47XG4gICAgdmlzaXRlZC5hZGQodmFsIGFzIG9iamVjdCk7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0Q29udHJvbGxlcikge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscyk7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsLnZhbHVlcygpKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0L1Jlc3BvbnNlIGV4cG9zZSBgc2lnbmFsYC9gYm9keWAgYXMgcHJvdG90eXBlIGdldHRlcnMsIHNvXG4gICAgLy8gT2JqZWN0LnZhbHVlcygpIHdvbid0IGZpbmQgdGhlbS4gRGVzY2VuZCBleHBsaWNpdGx5LlxuICAgIGlmICh0eXBlb2YgUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgd2Fsayh2YWwuc2lnbmFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXModmFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgd2Fsayh2KTtcbiAgfVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB3YWxrKHYpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgYSBzdHJlYW0gcmVhZGVyIG9uIHRoZSBjb250cm9sbGVyIHRoYXQgbGlzdGVucyBmb3IgYW4gYWJvcnQgcGFja2V0LlxuICogUmV0dXJucyB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXIgc28gaXQgY2FuIGJlIHN0b3JlZCBvbiBib3RoIHRoZVxuICogY29udHJvbGxlciBhbmQgc2lnbmFsIGZvciBjbGVhbnVwIGJ5IGNhbmNlbEFib3J0UmVhZGVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICBydW5JZDogc3RyaW5nLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCByZWFkZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgb3BzLnB1c2goXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPHsgdmFsdWU6IHVuZGVmaW5lZDsgZG9uZTogdHJ1ZSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYWRlckNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyQ2FuY2VsLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAnYWJvcnQnLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIC8vIEFuIGFib3J0IHBhY2tldCBhcnJpdmVkOiBwcm9wYWdhdGUgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gUmVsZWFzZVxuICAgICAgICAgIC8vIHRoZSBsb2NrIChzeW5jaHJvbm91cykgcmF0aGVyIHRoYW4gY2FuY2VsbGluZyBoZXJlOiBvbiBhXG4gICAgICAgICAgLy8gc2VydmljZS1iYWNrZWQgV29ybGQgYHJlYWRlci5jYW5jZWwoKWAgY2FuIGRvIGEgbmV0d29yayByb3VuZC10cmlwLFxuICAgICAgICAgIC8vIGFuZCBhd2FpdGluZyBpdCBiZWZvcmUgYGNvbnRyb2xsZXIuYWJvcnQoKWAgd291bGQgZGVsYXkgKG9yLCBpZiBpdFxuICAgICAgICAgIC8vIGhhbmdzLCBkcm9wKSByZWFsLXRpbWUgYWJvcnQgZGVsaXZlcnkgdG8gdGhlIGluLWZsaWdodCBzdGVwLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFJlYWRlciBtYXkgYWxyZWFkeSBiZSByZWxlYXNlZDsgaWdub3JlLlxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSB3cml0ZXIgdXNlZCBzbyB0aGUgcmVhc29uXG4gICAgICAgICAgICAvLyByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gRW5jcnlwdGlvbiBrZXkgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGNvbWVzIGZyb20gdGhlIHN0ZXAgY29udGV4dCwgc2V0IHVwIGJ5IHRoZSBzdGVwIGV4ZWN1dG9yIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCAobm90IGp1c3QgcmVsZWFzZSkgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkOiBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5OiB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5LCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCAoZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGApIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBoZXJlIHNvIHRoZSBwcm9taXNlIGNhbiBvbmx5IGV2ZXIgZW5mb3JjZSBvcmRlcmluZ1xuICAgICAgICAvLyB3aGVuIGF3YWl0ZWQgKHNlZSB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpOyBhIGZhaWxlZCByZXN1bWUgcmV0cmllcyBvbiBuZXh0IHJlcGxheS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdW1lSG9vayB9ID0gYXdhaXQgaW1wb3J0KCcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2sodmFsdWUuaG9va1Rva2VuLCB7XG4gICAgICAgICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgaG9vayByZXN1bWU6IHJldHJ5IG9uIG5leHQgcmVwbGF5XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBjdHgucHJlQ29tcGxldGlvbk9wcy5wdXNoKGhvb2tSZXN1bWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBSZXZpdmVzIG9ubHkgYW4gQWJvcnRTaWduYWwgd2l0aG91dCB0aGUgcGF0Y2hlZCBhYm9ydCgpIG92ZXJoZWFkLlxuICogVXNlZCB3aGVuIG9ubHkgYSBzaWduYWwgKG5vdCBhIGNvbnRyb2xsZXIpIHdhcyBzZXJpYWxpemVkLlxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydFNpZ25hbChcbiAgdmFsdWU6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0Fib3J0U2lnbmFsJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydFNpZ25hbCB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vKipcbiAqIEJhc2UgcmV2aXZlcnMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBib3VuZGFyaWVzLlxuICogQ29tcG9zZXM6IGNsYXNzICsgY29tbW9uIHJldml2ZXJzIGZyb20gdGhlIG1vZHVsYXIgbW9kdWxlcy5cbiAqXG4gKiBUaGlzIGlzIGV4cG9ydGVkIGJlY2F1c2Ugc2VyaWFsaXphdGlvbi1mb3JtYXQudHMgYW5kIG90aGVyIGZpbGVzIHJlZmVyZW5jZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJldml2ZXJzKGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKGdsb2JhbCksXG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnNGcm9tTW9kdWxlKGdsb2JhbCksXG4gIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFBhcnRpYWw8UmV2aXZlcnM+O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHdyaXRlLW9ubHkga2V5IGEgcnVuIG5lZWRzIHdoZW4gd3JpdGluZyBpbnRvIGFub3RoZXIgcnVuJ3NcbiAqIGZvcndhcmRlZCBzdHJlYW0uXG4gKlxuICogVGhyZWUgdGllcnMsIGNoZWFwZXN0IGZpcnN0OlxuICpcbiAqIDEuIFRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgdGhlIG93bmVyJ3MgWDI1NTE5IHB1YmxpYyBrZXk6IHNlYWwgdG8gaXQgd2l0aFxuICogICAgbm8gSS9PIHdoYXRzb2V2ZXIuIFRoZSBvd25lciBwdWJsaXNoZWQgdGhlIGtleSB3aGVuIGl0IGNyZWF0ZWQgdGhlXG4gKiAgICBzdHJlYW0sIHNvIHRoaXMgaXMgdGhlIHplcm8tcm91bmQtdHJpcCBwYXRoLlxuICogMi4gVGhlIGRlc2NyaXB0b3IgY2FycmllcyB0aGUgb3duZXIncyBkZXBsb3ltZW50IElEOiByZXNvbHZlIHRoZSBvd25lcidzXG4gKiAgICBzeW1tZXRyaWMga2V5LCB3aGljaCBjcm9zcy1kZXBsb3ltZW50IG1lYW5zIGEga2V5LUFQSSByb3VuZCB0cmlwLlxuICogMy4gTmVpdGhlciAoZGVzY3JpcHRvcnMgd3JpdHRlbiBieSBvbGRlciBTREtzKTogbG9hZCB0aGUgb3duaW5nIHJ1biBmaXJzdCxcbiAqICAgIHRoZW4gcmVzb2x2ZSBpdHMgc3ltbWV0cmljIGtleS5cbiAqXG4gKiBUaWVycyAyIGFuZCAzIGltcG9ydCB0aGUga2V5IGVuY3J5cHQtb25seSwgd2hpY2ggaXMgYW4gaG9ub3Itc3lzdGVtXG4gKiByZXN0cmljdGlvbjogdGhlIHNhbWUgYnl0ZXMgY291bGQgZGVjcnlwdC4gVGllciAxIG1ha2VzIGl0IGEgY3J5cHRvZ3JhcGhpY1xuICogZ3VhcmFudGVlOiBhIHB1YmxpYyBrZXkgY2Fubm90IHJlYWQgYW55dGhpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG93bmVyUHVibGljS2V5ID0gZGVjb2RlUnVuUHVibGljS2V5KGVuY3J5cHRpb25QdWJsaWNLZXkpO1xuICBpZiAob3duZXJQdWJsaWNLZXkpIHJldHVybiBzZWFsVG8ob3duZXJQdWJsaWNLZXkpO1xuXG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCByYXdLZXkgPSBkZXBsb3ltZW50SWRcbiAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4ocnVuSWQsIHsgZGVwbG95bWVudElkIH0pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5LCBbJ2VuY3J5cHQnXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcnVuJ3Mgb2JqZWN0IHJlYWRhYmxlIHdpdGhvdXQgZGlzcGF0Y2hpbmcgaXRzIHN0cmVhbSBHRVQgb3JcbiAqIGVuY3J5cHRpb24ta2V5IGxvb2t1cCB1bnRpbCB0aGUgY2FsbGVyIHJlYWRzIGl0LiBUaGUgZXh0ZXJuYWwgcmV2aXZlciBzdGFydHNcbiAqIGl0cyBiYWNrZ3JvdW5kIHBpcGUgaW1tZWRpYXRlbHksIHNvIHRoaXMgYm91bmRhcnkgYmVsb25ncyBoZXJl4oCUbmV4dCB0byB0aGVcbiAqIHNvdXJjZS90cmFuc2Zvcm0gYXNzZW1ibHnigJRyYXRoZXIgdGhhbiBpbiBgUnVuYC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1blJlYWRhYmxlU3RyZWFtPFQ+KFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFJlYWRhYmxlU3RyZWFtPFQ+IHtcbiAgbGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFQ+IHwgdW5kZWZpbmVkO1xuICBsZXQgbG9ja1N0YXRlOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVGbHVzaGFibGVTdGF0ZT4gfCB1bmRlZmluZWQ7XG4gIGxldCBsb2NrUG9sbGluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgbGV0IHVzZXJSZWFkYWJsZTogUmVhZGFibGVTdHJlYW08VD47XG5cbiAgdXNlclJlYWRhYmxlID0gbmV3IFJlYWRhYmxlU3RyZWFtPFQ+KFxuICAgIHtcbiAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCB7XG4gICAgICAgICAgICAgIG9uUmVhZGFibGVTdGF0ZTogKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9ja1N0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KS5SZWFkYWJsZVN0cmVhbSEoeyBuYW1lLCBzdGFydEluZGV4IH0pIGFzIFJlYWRhYmxlU3RyZWFtPFQ+O1xuICAgICAgICAgICAgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICAgICAgaWYgKGxvY2tTdGF0ZSAmJiAhbG9ja1BvbGxpbmdTdGFydGVkKSB7XG4gICAgICAgICAgICAgIGxvY2tQb2xsaW5nU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIC8vIFRoZSBjYWxsZXIgb3ducyB0aGlzIHdyYXBwZXIncyByZWFkZXIsIHNvIHBvbGxpbmcgaXQgcHJlc2VydmVzXG4gICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudGVkIHJlbGVhc2VMb2NrKCkgY29tcGxldGlvbiBzaWduYWwuXG4gICAgICAgICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBsb2NrU3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIGVsc2UgY29udHJvbGxlci5lbnF1ZXVlKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlcj8uY2FuY2VsKHJlYXNvbikuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIEEgcG9zaXRpdmUgZGVmYXVsdCBoaWdoLXdhdGVyIG1hcmsgd291bGQgcnVuIHB1bGwgYXQgY29uc3RydWN0aW9uIHRvXG4gICAgLy8gZmlsbCB0aGUgcXVldWUsIHR1cm5pbmcgYW4gdW5yZWFkIFJ1bi5nZXRSZWFkYWJsZSgpIGludG8gSS9PLlxuICAgIHsgaGlnaFdhdGVyTWFyazogMCB9XG4gICk7XG4gIHJldHVybiB1c2VyUmVhZGFibGU7XG59XG5cbi8qKiBPcHRpb25zIGZvciBleHRlcm5hbGx5IHJldml2ZWQgb2JqZWN0IHN0cmVhbXMuIEBpbnRlcm5hbCAqL1xudHlwZSBFeHRlcm5hbFJldml2ZXJPcHRpb25zID0ge1xuICAvKiogUmVjZWl2ZXMgY29tcGxldGlvbiBzdGF0ZSB3aGVuIGEgd3JhcHBlciBvd25zIHRoZSBwdWJsaWMgcmVhZGFibGUuICovXG4gIG9uUmVhZGFibGVTdGF0ZT86IChzdGF0ZTogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRmx1c2hhYmxlU3RhdGU+KSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gdGhlIGNsaWVudCBzaWRlLFxuICogcmVjZWl2aW5nIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgb3B0aW9ucz86IEV4dGVybmFsUmV2aXZlck9wdGlvbnNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZnJvbSB3b3JrZmxvd3MgdG8gY2xpZW50c1xuICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgJ1N0ZXAgZnVuY3Rpb25zIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgaW4gY2xpZW50IGNvbnRleHQuIFN0ZXAgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZnJvbSB3b3JrZmxvd3MuJyxcbiAgICAgICAge1xuICAgICAgICAgIGhpbnQ6ICdBIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlIHJlYWNoZWQgdGhlIGNsaWVudC4gUmV0dXJuIGEgc2VyaWFsaXphYmxlIHZhbHVlIChlLmcuIHRoZSBzdGVwIHJlc3VsdCkgaW5zdGVhZCBvZiB0aGUgc3RlcCBpdHNlbGYuJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdXcmFwIHRoZSB3b3JrZmxvdyB3aXRoIGBzdGFydCh3b3JrZmxvd0ZuLCB7IC4uLiB9KWAgZnJvbSBgd29ya2Zsb3dgIHRvIGJlZ2luIGEgcnVuIGluc3RlYWQgb2YgaW52b2tpbmcgaXQgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gTm90ZTogUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIHN0YXR1cywgc3RhdHVzVGV4dCwgYW5kIGhlYWRlcnNcbiAgICAgIC8vIFRoZSB0eXBlLCB1cmwsIGFuZCByZWRpcmVjdGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBhbmQgc2V0IGJ5IHRoZSBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuIG5ldyBnbG9iYWwuUmVzcG9uc2UodmFsdWUuYm9keSwge1xuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIGhhcyBib2R5SW5pdCwgaXQgY2FtZSBmcm9tIGEgUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIC8vIENvbnZlcnQgaXQgdG8gYSBSRUFMIHN0cmVhbSBub3cgdGhhdCB3ZSdyZSBvdXRzaWRlIHRoZSB3b3JrZmxvd1xuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZS5ib2R5SW5pdDtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgUmVzcG9uc2UgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgY29udmVydCBCb2R5SW5pdCB0byBSZWFkYWJsZVN0cmVhbVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBnbG9iYWwuUmVzcG9uc2UoYm9keUluaXQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgLy8gRm9yIGJ5dGUgc3RyZWFtcywgdXNlIGZsdXNoYWJsZSBwaXBlIHdpdGggbG9jayBwb2xsaW5nLlxuICAgICAgICAvLyBJZiB0aGUgcHJvZHVjZXIgd3JvdGUgZnJhbWVkIGJ5dGVzIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJyksXG4gICAgICAgIC8vIHVud3JhcCB0aGUgbGVuZ3RoLXByZWZpeCBlbnZlbG9wZSBiZWZvcmUgaGFuZGluZyBjaHVua3MgdG9cbiAgICAgICAgLy8gdGhlIHVzZXIuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlczpcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vIGF1dG8tcmVjb25uZWN0IGhlcmUgeWV0OiByYXcgYnl0ZSBzdHJlYW1zIGhhdmUgbm8gd2lyZVxuICAgICAgICAvLyBmcmFtaW5nIHRvIGNvdW50IGNvbnN1bWVkIGNodW5rcyB3aXRoLiBGcmFtZWQtdjEgYnl0ZSBzdHJlYW1zXG4gICAgICAgIC8vIG1ha2UgZnJhbWUgY291bnRpbmcgcG9zc2libGUsIHNvIGV4dGVuZGluZyB0aGUgcmVjb25uZWN0aW5nXG4gICAgICAgIC8vIHJlYWRlciB0byB0aGVtIGlzIGEgc2VwYXJhdGUgZm9sbG93LXVwLlxuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBpZGVudGl0eSAob3IgdW5mcmFtaW5nKSB0cmFuc2Zvcm0gdG8gZ2l2ZSB0aGUgdXNlciBhIHJlYWRhYmxlXG4gICAgICAgIGNvbnN0IHsgcmVhZGFibGU6IHVzZXJSZWFkYWJsZSwgd3JpdGFibGUgfSA9XG4gICAgICAgICAgdmFsdWUuZnJhbWluZyA9PT0gJ2ZyYW1lZC12MSdcbiAgICAgICAgICAgID8gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpXG4gICAgICAgICAgICA6IG5ldyBnbG9iYWwuVHJhbnNmb3JtU3RyZWFtKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHdyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERpcmVjdCByZXZpdmVyIGNhbGxlcnMgaG9sZCB0aGlzIHJlYWRhYmxlLiBBIGZ1dHVyZSBwdWJsaWMgd3JhcHBlclxuICAgICAgICAvLyBjYW4gcHJvdmlkZSB0aGUgc3RhdGUgYW5kIHBvbGwgdGhlIHJlYWRhYmxlIGl0IGhhbmRzIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgIGlmIChvcHRpb25zPy5vblJlYWRhYmxlU3RhdGUpIG9wdGlvbnMub25SZWFkYWJsZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgZWxzZSBwb2xsUmVhZGFibGVMb2NrKHVzZXJSZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB1c2VyUmVhZGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tYnl0ZSBzdHJlYW1zIGNhcnJ5IGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMsIHNvIHdlIGNhbiBjb3VudFxuICAgICAgICAvLyBjb21wbGV0ZWQgZnJhbWVzIGFuZCB0cmFuc3BhcmVudGx5IHJlY29ubmVjdCB3aGVuIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3Rpb24gdGltZXMgb3V0IG1pZC1ydW4uXG4gICAgICAgIC8vIE1lbW9pemUgdGhpcyByZXNvbHZlciBwZXIgcmVhZGFibGUgc2Vzc2lvbi4gVGhlIGZpcnN0IHJhdyBwdWxsXG4gICAgICAgIC8vIHN0YXJ0cyBpdCBjb25jdXJyZW50bHkgd2l0aCB0aGUgc3RyZWFtIEdFVDsgZ2V0RGVzZXJpYWxpemVTdHJlYW1cbiAgICAgICAgLy8gam9pbnMgdGhlIHNhbWUgcHJvbWlzZSB3aGVuIGFuIGVuY3J5cHRlZCBmcmFtZSBhcnJpdmVzLiBUaGlzIGFsc29cbiAgICAgICAgLy8gYXZvaWRzIGludm9raW5nIGFyYml0cmFyeSBFbmNyeXB0aW9uS2V5UGFyYW0gY2FsbGJhY2tzIHR3aWNlLlxuICAgICAgICBsZXQga2V5UHJvbWlzZTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcmVzb2x2ZUtleSA9ICgpOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICBrZXlQcm9taXNlID8/PSByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgIHJldHVybiBrZXlQcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZWFkYWJsZSA9IGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXgsXG4gICAgICAgICAgcmVzb2x2ZUtleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgcmVzb2x2ZUtleSksXG4gICAgICAgICAgcmVzb2x2ZUtleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERpcmVjdCByZXZpdmVyIGNhbGxlcnMgaG9sZCB0aGlzIHJlYWRhYmxlLiBUaGUgcHVibGljIFJ1biBmYWN0b3J5XG4gICAgICAgIC8vIHdyYXBzIGl0IGZvciBmaXJzdC1wdWxsIGxhemluZXNzIGFuZCBwb2xscyB0aGF0IHdyYXBwZXIgaW5zdGVhZC5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVhZGFibGVTdGF0ZSkgb3B0aW9ucy5vblJlYWRhYmxlU3RhdGUoc3RhdGUpO1xuICAgICAgICBlbHNlIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+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=
|