footprintjs 9.46.0 → 9.47.0
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/AGENTS.md +4 -3
- package/CLAUDE.md +8 -8
- package/README.md +1 -1
- package/dist/advanced.js +95 -90
- package/dist/esm/advanced.d.ts +16 -10
- package/dist/esm/advanced.js +14 -9
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.js +5 -3
- package/dist/esm/lib/decide/evaluator.js +2 -2
- package/dist/esm/lib/decide/evidence.js +2 -2
- package/dist/esm/lib/engine/handlers/servedPause.js +2 -2
- package/dist/esm/lib/memory/EventLog.d.ts +1 -1
- package/dist/esm/lib/memory/EventLog.js +2 -2
- package/dist/esm/lib/memory/RecordFrame.d.ts +41 -6
- package/dist/esm/lib/memory/RecordFrame.js +36 -5
- package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/esm/lib/memory/SharedMemory.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +21 -14
- package/dist/esm/lib/memory/StageContext.js +36 -74
- package/dist/esm/lib/memory/borrowedMutation.d.ts +1 -1
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/honesty.d.ts +4 -3
- package/dist/esm/lib/memory/honesty.js +5 -4
- package/dist/esm/lib/memory/index.d.ts +4 -2
- package/dist/esm/lib/memory/index.js +6 -4
- package/dist/esm/lib/memory/placeholders.d.ts +23 -28
- package/dist/esm/lib/memory/placeholders.js +24 -29
- package/dist/esm/lib/memory/recordCommit.d.ts +5 -3
- package/dist/esm/lib/memory/recordCommit.js +7 -5
- package/dist/esm/lib/memory/redaction.d.ts +78 -40
- package/dist/esm/lib/memory/redaction.js +130 -64
- package/dist/esm/lib/memory/runAddress.d.ts +20 -0
- package/dist/esm/lib/memory/runAddress.js +25 -0
- package/dist/esm/lib/memory/scrub.d.ts +53 -0
- package/dist/esm/lib/memory/scrub.js +74 -0
- package/dist/esm/lib/memory/utils.d.ts +3 -3
- package/dist/esm/lib/memory/utils.js +4 -4
- package/dist/esm/lib/memory/verbs.d.ts +1 -1
- package/dist/esm/lib/memory/verbs.js +2 -2
- package/dist/esm/trace.d.ts +2 -0
- package/dist/esm/trace.js +3 -2
- package/dist/esm/write.d.ts +47 -0
- package/dist/esm/write.js +46 -0
- package/dist/index.js +5 -3
- package/dist/lib/decide/evaluator.js +3 -3
- package/dist/lib/decide/evidence.js +3 -3
- package/dist/lib/engine/handlers/servedPause.js +3 -3
- package/dist/lib/memory/EventLog.js +2 -2
- package/dist/lib/memory/RecordFrame.js +36 -5
- package/dist/lib/memory/SharedMemory.js +2 -2
- package/dist/lib/memory/StageContext.js +42 -80
- package/dist/lib/memory/borrowedMutation.js +2 -2
- package/dist/lib/memory/honesty.js +5 -4
- package/dist/lib/memory/index.js +6 -4
- package/dist/lib/memory/placeholders.js +25 -30
- package/dist/lib/memory/recordCommit.js +9 -7
- package/dist/lib/memory/redaction.js +144 -75
- package/dist/lib/memory/runAddress.js +29 -0
- package/dist/lib/memory/scrub.js +79 -0
- package/dist/lib/memory/utils.js +4 -4
- package/dist/lib/memory/verbs.js +2 -2
- package/dist/trace.js +6 -4
- package/dist/types/advanced.d.ts +16 -10
- package/dist/types/index.d.ts +4 -2
- package/dist/types/lib/memory/EventLog.d.ts +1 -1
- package/dist/types/lib/memory/RecordFrame.d.ts +41 -6
- package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +21 -14
- package/dist/types/lib/memory/borrowedMutation.d.ts +1 -1
- package/dist/types/lib/memory/honesty.d.ts +4 -3
- package/dist/types/lib/memory/index.d.ts +4 -2
- package/dist/types/lib/memory/placeholders.d.ts +23 -28
- package/dist/types/lib/memory/recordCommit.d.ts +5 -3
- package/dist/types/lib/memory/redaction.d.ts +78 -40
- package/dist/types/lib/memory/runAddress.d.ts +20 -0
- package/dist/types/lib/memory/scrub.d.ts +53 -0
- package/dist/types/lib/memory/utils.d.ts +3 -3
- package/dist/types/lib/memory/verbs.d.ts +1 -1
- package/dist/types/trace.d.ts +2 -0
- package/dist/types/write.d.ts +47 -0
- package/dist/write.js +52 -0
- package/package.json +15 -1
|
@@ -3,39 +3,22 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Like a stack frame in a compiler/runtime:
|
|
5
5
|
* - A RecordFrame — the record half (C3): the heap, the address, the
|
|
6
|
-
* first-touch base, the lazy transaction buffer
|
|
6
|
+
* first-touch base, the lazy transaction buffer and every write's scrub
|
|
7
|
+
* (C4), the readKeys list
|
|
7
8
|
* - Links to parent/child/next contexts (call stack frames)
|
|
8
9
|
* - What belongs to a stage inside a run: retention of reads and writes, the
|
|
9
|
-
* redaction
|
|
10
|
+
* redaction decision per write (`redaction.ts · decideWrite`) and where the
|
|
11
|
+
* frame writes (`runAddress.ts`), the dev-mode warnings, the commit observer
|
|
10
12
|
* - DiagnosticCollector for logs, errors, metrics
|
|
11
13
|
*/
|
|
12
14
|
import { summarizeReadValue, summarizeWriteValue } from '../capture/summarize.js';
|
|
13
15
|
import { isDevMode } from '../devMode.js';
|
|
14
16
|
import { borrowedMutationMessage, committedMutationMessage, firstDifferingPath } from './borrowedMutation.js';
|
|
15
17
|
import { DiagnosticCollector } from './DiagnosticCollector.js';
|
|
16
|
-
import { SCOPE_PLACEHOLDER } from './placeholders.js';
|
|
17
18
|
import { RecordFrame } from './RecordFrame.js';
|
|
18
|
-
import { CLEAR, RedactionRule } from './redaction.js';
|
|
19
|
+
import { CLEAR, decideWrite, inheritByIdentity, markStagedWrite, RedactionRule, SCOPE_PLACEHOLDER, scrubOf, userKeyOf, } from './redaction.js';
|
|
20
|
+
import { runAddress } from './runAddress.js';
|
|
19
21
|
import { DEFAULT_RUN_POLICY, withRedaction } from './runPolicy.js';
|
|
20
|
-
/** The user-level key of a write or read — dotted only for a nested path (a
|
|
21
|
-
* subflow seed's `['profile'] + 'auth'`); no allocation for the common
|
|
22
|
-
* single-segment case. */
|
|
23
|
-
function userKeyOf(path, key) {
|
|
24
|
-
return path.length > 0 ? [...path, key].join('.') : key;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* The key run namespaces sit under — a frame with run id `c0` (a fork or
|
|
28
|
-
* selector child takes its own id at the top level) writes at `runs/c0/…`. The
|
|
29
|
-
* engine's one spelling of it: every frame's address is built from it
|
|
30
|
-
* ({@link runAddress}), and the record layer takes that address as data (C2).
|
|
31
|
-
*/
|
|
32
|
-
const RUN_NAMESPACE = 'runs';
|
|
33
|
-
/** The root's address, shared by every frame without a run id (most of them). Never edited. */
|
|
34
|
-
const ROOT_ADDRESS = Object.freeze([]);
|
|
35
|
-
/** Where a frame with run id `runId` reads and writes: `['runs', <id>]`, or `[]` (the root) with none. */
|
|
36
|
-
function runAddress(runId) {
|
|
37
|
-
return runId ? [RUN_NAMESPACE, runId] : ROOT_ADDRESS;
|
|
38
|
-
}
|
|
39
22
|
export class StageContext {
|
|
40
23
|
/**
|
|
41
24
|
* The record half of this frame (`RecordFrame.ts`, L3, C3): the heap and,
|
|
@@ -261,10 +244,10 @@ export class StageContext {
|
|
|
261
244
|
* and stores nothing under `'off'` (entry skipped entirely — nothing to
|
|
262
245
|
* leak). A field-level verdict scrubs a clone BEFORE the dial sees it, so
|
|
263
246
|
* a summary preview can never show the secret either. The verdict is the
|
|
264
|
-
* one `stageWrite`
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
* `
|
|
247
|
+
* one `stageWrite` decided BEFORE staging, carried to commit with the
|
|
248
|
+
* value. The staged write itself is unaffected — redaction of the
|
|
249
|
+
* committed payload is the record frame's scrub of that write
|
|
250
|
+
* (`RecordFrame · write`, then `scrub.ts` at commit).
|
|
268
251
|
*/
|
|
269
252
|
trackWrite(userKey, value, verdict, operation) {
|
|
270
253
|
if (this.policy.writeTracking === 'off')
|
|
@@ -337,55 +320,34 @@ export class StageContext {
|
|
|
337
320
|
/**
|
|
338
321
|
* THE ONE FUNNEL every staged write passes through — facade writes AND
|
|
339
322
|
* the paths that bypass the facade (subflow seed, `outputMapper`
|
|
340
|
-
* merge-back, resume re-seed).
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
323
|
+
* merge-back, resume re-seed). Two owners (C4): the run's rule DECIDES,
|
|
324
|
+
* the record frame WRITES the verdict's bytes, in four steps
|
|
325
|
+
* (`redaction.ts`, "The write decision"):
|
|
326
|
+
* 1. the verdict — `decideWrite`, under the rule active as the write begins;
|
|
327
|
+
* 2. identity inheritance — `inheritByIdentity`, against this frame's
|
|
328
|
+
* selected reads as they stand after step 1;
|
|
329
|
+
* 3. the bytes — `RecordFrame · write`, the op and its scrub (the whole
|
|
330
|
+
* value, or the fields inside it);
|
|
331
|
+
* 4. the marks — `markStagedWrite`, only once the write staged, so a
|
|
332
|
+
* write that fails to stage marks nothing.
|
|
333
|
+
* Each step reads the rule (and the selected reads) when it acts, as this
|
|
334
|
+
* funnel always did. Returns the verdict so the caller retains and reports
|
|
335
|
+
* under the same decision.
|
|
348
336
|
*/
|
|
349
337
|
stageWrite(nsPath, path, key, value, explicit, verb) {
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
// or a primitive copied across names is selected by its own name only.
|
|
359
|
-
const read = rule !== undefined && verdict.kind !== 'whole' && value !== null && typeof value === 'object'
|
|
360
|
-
? this._selectedObjects?.get(value)
|
|
361
|
-
: undefined;
|
|
362
|
-
if (read !== undefined && rule !== undefined) {
|
|
363
|
-
if (read.kind === 'whole')
|
|
364
|
-
rule.mark(userKeyOf(path, key));
|
|
365
|
-
else if (read.kind === 'fields') {
|
|
366
|
-
const at = [...path.slice(1), ...(path.length > 0 ? [key] : [])];
|
|
367
|
-
rule.inheritFields(path[0] ?? key, read.paths.map((field) => [...at, field].join('.')));
|
|
368
|
-
}
|
|
369
|
-
verdict = rule.verdictAt(path, key);
|
|
370
|
-
}
|
|
371
|
-
const whole = verdict.kind === 'whole';
|
|
372
|
-
const buffer = this.record.getTransactionBuffer();
|
|
373
|
-
if (verb === 'merge')
|
|
374
|
-
buffer.merge(nsPath, value, whole);
|
|
375
|
-
else if (verb === 'delete')
|
|
376
|
-
buffer.delete(nsPath, whole);
|
|
377
|
-
else
|
|
378
|
-
buffer.set(nsPath, value, whole);
|
|
379
|
-
if (verdict.kind === 'fields')
|
|
380
|
-
buffer.markRedactedFields(nsPath, verdict.paths);
|
|
381
|
-
if (verb === 'delete') {
|
|
382
|
-
rule?.unmark(userKeyOf(path, key));
|
|
383
|
-
}
|
|
384
|
-
else if (verdict.kind === 'whole') {
|
|
385
|
-
// The REAL rule, not the active one: an explicit mark on an inert rule
|
|
386
|
-
// is exactly what makes it active for the rest of the run.
|
|
387
|
-
this.policy.redaction?.mark(verdict.key);
|
|
338
|
+
const active = this.activeRule();
|
|
339
|
+
if (active === undefined && !explicit) {
|
|
340
|
+
// The no-policy fast path, the same four steps with nothing to do: no rule with anything to say
|
|
341
|
+
// and no flag is clear (step 1), nothing to inherit without a rule (step 2), no scrub (step 3),
|
|
342
|
+
// and nothing to mark — a clear verdict marks nothing, and a delete unmarks only on the rule
|
|
343
|
+
// active as it began (step 4). The default run pays the record's write and nothing else.
|
|
344
|
+
this.record.write(nsPath, value, verb);
|
|
345
|
+
return CLEAR;
|
|
388
346
|
}
|
|
347
|
+
const asked = decideWrite(active, path, key, explicit);
|
|
348
|
+
const verdict = inheritByIdentity(active, asked, this._selectedObjects, path, key, value);
|
|
349
|
+
this.record.write(nsPath, value, verb, scrubOf(verdict));
|
|
350
|
+
markStagedWrite(active, this.policy.redaction, verdict, path, key, verb);
|
|
389
351
|
return verdict;
|
|
390
352
|
}
|
|
391
353
|
/**
|
|
@@ -900,4 +862,4 @@ export class StageContext {
|
|
|
900
862
|
return snapshot;
|
|
901
863
|
}
|
|
902
864
|
}
|
|
903
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlHLE9BQU8sRUFBMEIsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFZbkU7OzJCQUUyQjtBQUMzQixTQUFTLFNBQVMsQ0FBQyxJQUFjLEVBQUUsR0FBVztJQUM1QyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QiwrRkFBK0Y7QUFDL0YsTUFBTSxZQUFZLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFMUQsMEdBQTBHO0FBQzFHLFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7Ozs7T0FTRztJQUNjLE1BQU0sQ0FBYztJQUNyQzs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxHQUFjLGtCQUFrQixDQUFDO0lBQy9DLGtGQUFrRjtJQUMxRSxTQUFTLENBQVU7SUFFcEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0Qix1RUFBdUU7SUFDaEUsT0FBTyxDQUFTO0lBQ3ZCLHFGQUFxRjtJQUM5RSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCOzs7Ozs7O09BT0c7SUFDSSxJQUFJLENBQXFCO0lBQ2hDOzs7OztPQUtHO0lBQ2EsS0FBSyxDQUFTO0lBQzlCOzs7Ozs7T0FNRztJQUNLLFlBQVksQ0FBVTtJQUN2QixRQUFRLENBQVU7SUFDbEIsU0FBUyxDQUFVO0lBQ25CLE1BQU0sQ0FBVTtJQUN2QixtRkFBbUY7SUFDNUUsV0FBVyxDQUFVO0lBQzVCLGdGQUFnRjtJQUN6RSxTQUFTLENBQVU7SUFFbkIsTUFBTSxDQUFnQjtJQUN0QixJQUFJLENBQWdCO0lBQ3BCLFFBQVEsQ0FBa0I7SUFFMUIsS0FBSyxHQUF3QixJQUFJLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFekY7O3lFQUVxRTtJQUM3RCxZQUFZLEdBQStFLEVBQUUsQ0FBQztJQUV0Rzs7Ozs7Ozs7T0FRRztJQUNLLGNBQWMsQ0FHcEI7SUFFRixtRUFBbUU7SUFDM0QsV0FBVyxHQUE0QixFQUFFLENBQUM7SUFFbEQ7Ozs7Ozs7T0FPRztJQUNLLFlBQVksQ0FBZTtJQUVuQzs7Ozs7OztPQU9HO0lBQ0ssVUFBVSxDQUFlO0lBRWpDOzs7Ozs7O09BT0c7SUFDSyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCLGlFQUFpRTtJQUN6RCxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLDBHQUEwRztJQUNsRyxnQkFBZ0IsQ0FBcUM7SUFFN0Q7Ozs7Ozs7O09BUUc7SUFDSyxpQkFBaUIsQ0FBd0I7SUFFakQsMkZBQTJGO0lBQ25GLGVBQWUsQ0FFYjtJQUVWLFlBQ0UsS0FBYSxFQUNiLElBQVksRUFDWixPQUFlLEVBQ2YsWUFBMEIsRUFDMUIsUUFBaUIsRUFDakIsUUFBbUIsRUFDbkIsU0FBbUI7UUFFbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELGlFQUFpRTtJQUNqRSxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLGNBQWMsQ0FBQyxLQUFhLEVBQUUsU0FBd0M7UUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM3RCxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQscUZBQXFGO0lBQ3JGLG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FBQyxNQUFvQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLHVCQUF1QjtRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLE1BQWlCO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBbUI7UUFDbEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxJQUFJO1lBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFVBQVUsQ0FBQyxJQUFrQjtRQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssV0FBVyxDQUFDLE1BQWlCO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNLLFVBQVUsQ0FDaEIsT0FBZSxFQUNmLEtBQWMsRUFDZCxPQUF5QixFQUN6QixTQUFzQztRQUV0QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLEtBQUs7WUFBRSxPQUFPO1FBQ2hELENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNuRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHO2dCQUNULEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQztnQkFDNUYsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2FBQ3ZCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUNqQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QyxDQUFDO2dCQUFTLENBQUM7WUFDVCxzRUFBc0U7WUFDdEUscUVBQXFFO1lBQ3JFLG9FQUFvRTtZQUNwRSxvRUFBb0U7WUFDcEUsa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxZQUFZLENBQ2xCLE9BQXlCLEVBQ3pCLEtBQWMsRUFDZCxJQUEwQyxFQUMxQyxTQUFzQztRQUV0QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLE9BQU8saUJBQWlCLENBQUM7UUFDdkQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3pHLElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUM7UUFDNUQsT0FBTyxRQUFRLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFVBQVU7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDbkMsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxVQUFVLENBQ2hCLE1BQWdCLEVBQ2hCLElBQWMsRUFDZCxHQUFXLEVBQ1gsS0FBYyxFQUNkLFFBQTZCLEVBQzdCLElBQWdDO1FBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLE9BQU8sR0FBcUIsUUFBUTtZQUN0QyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQzlDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNWLHdGQUF3RjtRQUN4Rix3RkFBd0Y7UUFDeEYsdUVBQXVFO1FBQ3ZFLE1BQU0sSUFBSSxHQUNSLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQzNGLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNuQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3RELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsYUFBYSxDQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNwRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2xELElBQUksSUFBSSxLQUFLLE9BQU87WUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDcEQsSUFBSSxJQUFJLEtBQUssUUFBUTtZQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDOztZQUNwRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFBRSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLHVFQUF1RTtZQUN2RSwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxZQUFZLENBQUMsS0FBbUI7UUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRSxNQUFNLElBQUksS0FBSyxDQUNiLDJDQUEyQyxJQUFJLENBQUMsT0FBTyxpREFBaUQsQ0FDekcsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxvRkFBb0Y7SUFDcEYsSUFBWSxXQUFXO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsS0FBSyxDQUFDLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYyxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxHQUFHLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYyxFQUFFLFlBQXNCO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRCxTQUFTLENBQ1AsSUFBYyxFQUNkLEdBQVcsRUFDWCxLQUFjLEVBQ2QsWUFBc0IsRUFDdEIsV0FBb0IsRUFDcEIsaUJBQW9DO1FBRXBDLHNFQUFzRTtRQUN0RSxvRUFBb0U7UUFDcEUsMkRBQTJEO1FBQzNELGtFQUFrRTtRQUNsRSxNQUFNLE9BQU8sR0FDWCxpQkFBaUIsS0FBSyxRQUFRO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO1lBQzFGLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEYsc0VBQXNFO1FBQ3RFLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUNsRixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxXQUFXLEVBQUUsQ0FBQztZQUNwRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxZQUFZLENBQ1YsSUFBYyxFQUNkLEdBQVcsRUFDWCxLQUFjLEVBQ2QsV0FBb0IsRUFDcEIsWUFBc0I7UUFFdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRCxzRUFBc0U7UUFDdEUseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVcsRUFBRSxLQUFjO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ3pELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxhQUFhLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFnQixFQUFFLFdBQW9CO1FBQy9FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxXQUFXLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxHQUE0QixFQUFFLFdBQW9CO1FBQ3pGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUNWLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNsRSxDQUFDLENBQUMsRUFBRSxHQUFJLFFBQW9DLEVBQUUsR0FBRyxHQUFHLEVBQUU7WUFDdEQsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsMEVBQTBFO0lBRTFFOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLElBQWMsRUFBRSxHQUFZLEVBQUUsV0FBb0I7UUFDekQsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkQsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSwyQkFBMkI7UUFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqRixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQztZQUN6QixpR0FBaUc7WUFDakcsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakgsQ0FBQztRQUNELHlFQUF5RTtRQUN6RSxpRUFBaUU7UUFDakUsd0VBQXdFO1FBQ3hFLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM1RCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzVFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQzVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztvQkFDbkQsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDcEMsS0FBSyxLQUFLLFNBQVM7b0JBQ2pCLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVEO29GQUNnRjtJQUNoRixjQUFjLENBQUMsSUFBYyxFQUFFLEdBQVk7UUFDekMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCwwRUFBMEU7SUFFMUU7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLE1BQXVCO1FBQ3pDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEO3lFQUNxRTtJQUNyRSxpQkFBaUIsQ0FDZixRQUF5RztRQUV6RyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUNHO0lBQ0ssc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBQ25GLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxxRUFBcUU7WUFDckUsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUNoRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQzFDLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFBRSxTQUFTO1lBQzdFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN4RCxTQUFTO1lBQ1gsQ0FBQztZQUVELG9FQUFvRTtZQUNwRSxzRUFBc0U7WUFDdEUscURBQXFEO1lBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUVwQyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsSUFBSSxJQUFJLEtBQUssU0FBUztnQkFBRSxTQUFTO1lBQ2pDLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRCwyR0FBMkc7SUFDbkcsdUJBQXVCLENBQUMsR0FBVyxFQUFFLFVBQW9CLEVBQUUsUUFBaUI7UUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU87UUFDcEMsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBQy9CLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Q0c7SUFDSCxNQUFNLENBQUMsS0FBbUI7UUFDeEIsb0VBQW9FO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3pELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLDRFQUE0RTtRQUM1RSx3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3JCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN4QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDLENBQUMsQ0FBQztRQUNKLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQStCRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVELDBFQUEwRTtJQUUxRTs7Ozs7Ozs7O09BU0c7SUFDSCxVQUFVLENBQUMsSUFBWSxFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFNBQVMsR0FBRyxLQUFLO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvRixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVix3RUFBd0UsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUk7Z0JBQzdGLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLG1CQUFtQixTQUFTLFdBQVcsT0FBTyxpQkFBaUI7Z0JBQ3pGLHVDQUF1QyxDQUMxQyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFNBQVMsR0FBRyxLQUFLO1FBQ2hHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuSCxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQzVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsOEVBQThFO0lBQzlFLGFBQWEsQ0FBQyxPQUEwQixFQUFFLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNwRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLElBQWU7UUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLElBQWU7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELG1CQUFtQixDQUNqQixJQUFxQixFQUNyQixXQUFtQixFQUNuQixPQUFxRztRQUVyRyxNQUFNLFdBQVcsR0FBZ0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsMEVBQTBFO0lBRTFFLFVBQVU7UUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXO1FBQ1QscUVBQXFFO1FBQ3JFLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsa0VBQWtFO1FBQ2xFLHNDQUFzQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQXNELENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUcsQ0FBQztZQUNsQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDYixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUN6QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO29CQUMzQyxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEO3FEQUNpRDtJQUN6QyxZQUFZO1FBQ2xCLE1BQU0sUUFBUSxHQUFrQjtZQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDaEIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUztZQUNoRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUNqQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1NBQzlCLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxrRUFBa0U7WUFDbEUsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztZQUMzQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMxQixDQUFDO1lBQ0QsUUFBUSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciwgdGhlIHJlYWRLZXlzIGxpc3RcbiAqIC0gTGlua3MgdG8gcGFyZW50L2NoaWxkL25leHQgY29udGV4dHMgKGNhbGwgc3RhY2sgZnJhbWVzKVxuICogLSBXaGF0IGJlbG9uZ3MgdG8gYSBzdGFnZSBpbnNpZGUgYSBydW46IHJldGVudGlvbiBvZiByZWFkcyBhbmQgd3JpdGVzLCB0aGVcbiAqICAgcmVkYWN0aW9uIHZlcmRpY3QgcGVyIHdyaXRlLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSwgY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlLCBmaXJzdERpZmZlcmluZ1BhdGggfSBmcm9tICcuL2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgdHlwZSBEaWFnbm9zdGljQ2hhbm5lbCwgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nIH0gZnJvbSAnLi9FdmVudExvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRTb3VyY2VQb3NpdGlvbiB9IGZyb20gJy4vZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB7IFJlY29yZEZyYW1lIH0gZnJvbSAnLi9SZWNvcmRGcmFtZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBDTEVBUiwgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1pdFBoYXNlLFxuICBGbG93Q29udHJvbFR5cGUsXG4gIEZsb3dNZXNzYWdlLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBTdGFnZVNuYXBzaG90LFxuICBVbnRyYWNrZWRTb3VyY2UsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSB1c2VyLWxldmVsIGtleSBvZiBhIHdyaXRlIG9yIHJlYWQg4oCUIGRvdHRlZCBvbmx5IGZvciBhIG5lc3RlZCBwYXRoIChhXG4gKiAgc3ViZmxvdyBzZWVkJ3MgYFsncHJvZmlsZSddICsgJ2F1dGgnYCk7IG5vIGFsbG9jYXRpb24gZm9yIHRoZSBjb21tb25cbiAqICBzaW5nbGUtc2VnbWVudCBjYXNlLiAqL1xuZnVuY3Rpb24gdXNlcktleU9mKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG59XG5cbi8qKlxuICogVGhlIGtleSBydW4gbmFtZXNwYWNlcyBzaXQgdW5kZXIg4oCUIGEgZnJhbWUgd2l0aCBydW4gaWQgYGMwYCAoYSBmb3JrIG9yXG4gKiBzZWxlY3RvciBjaGlsZCB0YWtlcyBpdHMgb3duIGlkIGF0IHRoZSB0b3AgbGV2ZWwpIHdyaXRlcyBhdCBgcnVucy9jMC/igKZgLiBUaGVcbiAqIGVuZ2luZSdzIG9uZSBzcGVsbGluZyBvZiBpdDogZXZlcnkgZnJhbWUncyBhZGRyZXNzIGlzIGJ1aWx0IGZyb20gaXRcbiAqICh7QGxpbmsgcnVuQWRkcmVzc30pLCBhbmQgdGhlIHJlY29yZCBsYXllciB0YWtlcyB0aGF0IGFkZHJlc3MgYXMgZGF0YSAoQzIpLlxuICovXG5jb25zdCBSVU5fTkFNRVNQQUNFID0gJ3J1bnMnO1xuXG4vKiogVGhlIHJvb3QncyBhZGRyZXNzLCBzaGFyZWQgYnkgZXZlcnkgZnJhbWUgd2l0aG91dCBhIHJ1biBpZCAobW9zdCBvZiB0aGVtKS4gTmV2ZXIgZWRpdGVkLiAqL1xuY29uc3QgUk9PVF9BRERSRVNTOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4vKiogV2hlcmUgYSBmcmFtZSB3aXRoIHJ1biBpZCBgcnVuSWRgIHJlYWRzIGFuZCB3cml0ZXM6IGBbJ3J1bnMnLCA8aWQ+XWAsIG9yIGBbXWAgKHRoZSByb290KSB3aXRoIG5vbmUuICovXG5mdW5jdGlvbiBydW5BZGRyZXNzKHJ1bklkOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBydW5JZCA/IFtSVU5fTkFNRVNQQUNFLCBydW5JZF0gOiBST09UX0FERFJFU1M7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFnZUNvbnRleHQge1xuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgZnJhbWUgYmVsb25ncyB0byDigJQgaXRzIGlkZW50aXR5IG9uIGV2ZXJ5IGV2ZW50LCBhbmQgdGhlIHJ1blxuICAgKiBuYW1lc3BhY2UgaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiAoe0BsaW5rIHJ1bkFkZHJlc3N9KSwgcmVhZCBvbmNlLCB3aGVuIHRoZVxuICAgKiBmcmFtZSBpcyBidWlsdCAoQzMpLiBPbmx5IHtAbGluayB1c2VBZGRyZXNzT2Z9IG1vdmVzIHRoZSBhZGRyZXNzIGFmdGVyXG4gICAqIHRoYXQsIGFuZCBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gbmFtZXNwYWNlIHRoaXMgZnJhbWUgd3JpdGVzIGFuZCByZWFkcyBpbiB3aGVuIHRoYXQgaXMgbm90IGl0cyBvd25cbiAgICogYHJ1bklkYCDigJQgc2V0IG9uY2UsIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSwgYnlcbiAgICoge0BsaW5rIHVzZUFkZHJlc3NPZn0uIEl0cyBvbmUgdXNlciBpcyBhIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIChSMTMpOlxuICAgKiB0aGUgcmVjb3JkIG5hbWVzIHRoZSBtb3VudCwgdGhlIHZhbHVlcyBsYW5kIHdoZXJlIHRoZSBtb3VudCdzIHBhcmVudFxuICAgKiB3cml0ZXMuIEFic2VudCDihpIgYHJ1bklkYCwgc28gZXZlcnkgb3RoZXIgZnJhbWUgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRyZXNzUnVuSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigoKSA9PiB0aGlzLnBvbGljeS5yZWRhY3Rpb24pO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0XG4gICAqICDigJQgaW4gdGhlaXIgUkVUQUlORUQgZm9ybSAoY2xvbmVkIC8gc3VtbWFyaXNlZCAvIHJlZGFjdGVkKS4gRmlsbGVkIGZyb21cbiAgICogIHtAbGluayBfcGVuZGluZ1dyaXRlc30gYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSBhdCBjb21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgd3JpdGVzIG9mIHRoZSBDVVJSRU5UIGV4ZWN1dGlvbiwgaGVsZCBieSByZWZlcmVuY2Ugd2l0aCB0aGUgdmVyZGljdFxuICAgKiB0aGV5IHdlcmUgc3RhZ2VkIHVuZGVyICg5LjIzLjApLiBBIGtleSB3cml0dGVuIGsgdGltZXMgaG9sZHMgaXRzIExBU1RcbiAgICogdmFsdWU7IHRoZSByZXRhaW5lZCBmb3JtICh0aGUgYHdyaXRlVHJhY2tpbmdgIGNsb25lIG9yIHN1bW1hcnksIHRoZVxuICAgKiByZWRhY3Rpb24gcGxhY2Vob2xkZXIgb3IgZmllbGQgc2NydWIpIGlzIHRha2VuIE9OQ0UgcGVyIGtleSBhdCBjb21taXQg4oCUXG4gICAqIHNlZSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LiBTYW1lIGxhdyBhcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogcGF0Y2ggdHJlZXM6IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgcGFpZCBhdCB0aGUgYm91bmRhcnksIG5vdCBhdFxuICAgKiBldmVyeSB3cml0ZS4gTGF6aWx5IGFsbG9jYXRlZDsgYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlcyBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nV3JpdGVzPzogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHZhbHVlOiB1bmtub3duOyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0OyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9XG4gID47XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF9zdGFnZVJlYWRzYCBrZXlzIHRoYXQgd2VyZSByZWFkIGF0IGEgTkVTVEVEIHBhdGggKGBnZXRWYWx1ZShwYXRoLFxuICAgKiBrZXkpYCB3aXRoIGEgbm9uLWVtcHR5IGBwYXRoYCkuIE9ubHkgdGhlIGVuZ2luZSByZWFkcyB0aGF0IHdheSDigJQgdGhlXG4gICAqIGZhY2FkZSByZWFkcyByb290cyDigJQgc28gdGhlc2UgYXJlIG5vdCB1c2VyIHJlYWRzIGFuZCB0aGUgYm9ycm93ZWQtcmVhZFxuICAgKiBndWFyZCBza2lwcyB0aGVtIGJ5IHRoaXMgbWFya2VyLCBuZXZlciBieSBndWVzc2luZyBmcm9tIGEgZG90IGluIHRoZSBrZXlcbiAgICogKGEgdXNlcidzIHRvcC1sZXZlbCBrZXkgbWF5IGl0c2VsZiBjb250YWluIG9uZSkuIExhemlseSBjcmVhdGVkOyB0aGVcbiAgICogZmFjYWRlIHBhdGggbmV2ZXIgYWxsb2NhdGVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVzdGVkUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogRGV2IG1vZGUgb25seTogdGhlIHJvb3Qga2V5cyB3aG9zZSBMQVNUIHRyYWNrZWQgcmVhZCB3YXMgc2VydmVkIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlIOKAlCBiZWZvcmUgdGhpcyBzdGFnZSdzIGZpcnN0IHdyaXRlLCB3aGVuIG5vIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlciBleGlzdHMgeWV0LiBTdWNoIGEgcmVhZCBpcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIHNvIGFuXG4gICAqIGluLXBsYWNlIGVkaXQgb2YgaXQgbW92ZXMgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSB0b28gKGNvcHktb24td3JpdGUsXG4gICAqIDkuMjkuMCk7IHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufSBjaGVja3MgdGhlc2Uga2V5cyBldmVuIHdoZW4gdGhlXG4gICAqIHN0YWdlIHdyb3RlIHRoZW0uIE5ldmVyIGFsbG9jYXRlZCBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlld1JlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhhcyB0aGlzIGZyYW1lIGNvbW1pdHRlZCBhdCBsZWFzdCBvbmNlPyBUaGUgYm9ycm93ZWQtcmVhZCBndWFyZCBydW5zIG9uXG4gICAqIHRoZSBGSVJTVCBjb21taXQgb25seSDigJQgc2VlIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufS4gVGhlIGZyYW1lXG4gICAqIGl0c2VsZiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0ICgjMTNiKTogdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgcmVseSBvbiBpdC4gVGhlXG4gICAqIHVzZXItbGV2ZWwgcmVmdXNhbCBvZiBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGxpdmVzIGF0IHRoZSBzY29wZVxuICAgKiB0aWVyIChgU2NvcGVGYWNhZGVgLCBvbmUgcGVyIHN0YWdlIGV4ZWN1dGlvbiksIG5vdCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqIFRyYWNrZWQgcmVhZHMgb2YgYSBzZWxlY3RlZCB2YWx1ZSAoe0BsaW5rIHNlbGVjdGVkUmVhZHN9KS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSZWFkcyA9IDA7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGlzIGZyYW1lIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIOKGkiB0aGF0IHJlYWQncyB2ZXJkaWN0IChgc3RhZ2VXcml0ZWAgaGFuZHMgaXQgb24pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZE9iamVjdHM/OiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXJzIOKAlCB1bnRyYWNrZWQgcmVhZCBwYXRocyB1c2VkIGR1cmluZyBUSElTXG4gICAqIHN0YWdlJ3MgZXhlY3V0aW9uIChgJ2FyZ3MnYCAvIGAnZW52J2AgLyBgJ3NpbGVudCdgKS4gTWFya2VkIGJ5XG4gICAqIGBTY29wZUZhY2FkZWAsIHN1cmZhY2VkIG9uIHRoZSBzdGFnZSdzIENvbW1pdEJ1bmRsZSBhc1xuICAgKiBgdW50cmFja2VkU291cmNlc2AsIHRoZW4gUkVMRUFTRUQgd2l0aCB0aGUgc3RhZ2luZyBzdGF0ZSBhdCBjb21taXQgZW5kXG4gICAqIChzbyB0aGUgcm91dGluZSBkb3VibGUtY29tbWl0IHBhdGhzIOKAlCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IG1vdW50cyDigJRcbiAgICogcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UsIG9uIHRoZSBmaXJzdCBjb21taXQpLiBMYXppbHkgYWxsb2NhdGVkOlxuICAgKiBzdGFnZXMgdGhhdCBuZXZlciB0b3VjaCBhbiB1bnRyYWNrZWQgcGF0aCBwYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3VudHJhY2tlZFNvdXJjZXM/OiBTZXQ8VW50cmFja2VkU291cmNlPjtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgU2NvcGVSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmRGcmFtZShzaGFyZWRNZW1vcnksIGV2ZW50TG9nLCBydW5BZGRyZXNzKHJ1bklkKSk7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcodGhpcy5wb2xpY3kpO1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGU7XG4gIH1cblxuICAvKiogQGludGVybmFsIFN0YW1wZWQgYmVzaWRlIHJ1bnRpbWVTdGFnZUlkLCBiZWZvcmUgc2NvcGUgY29uc3RydWN0aW9uLiAqL1xuICBiaW5kRW1pdE9yaWdpbihydW5JZDogc3RyaW5nLCBkcmlsbFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0UnVuSWQgPSBkcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJ1bklkO1xuICAgIGlmIChkcmlsbFBhdGggIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubG9nPy5iaW5kQWRkcmVzcyhydW5JZCwgZHJpbGxQYXRoKTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIGZyb20gdGhpcyBmcmFtZSdzIE9XTiBsb2cuIEEgbWFudWFsL3VuYWRkcmVzc2FibGUgZnJhbWUgc3RheXMgdW5rbm93bi4gKi9cbiAgY2FwdHVyZUVtaXRQb3NpdGlvbigpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVtaXRSdW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZWNvcmQubG9nPy5jYXB0dXJlUG9zaXRpb24odGhpcy5lbWl0UnVuSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyBhcHBseVxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCB0aGUgb25lcyB0aGUgbG9nIHJlY29yZHMg4oCUIHRvXG4gICAqIHRoaXMgbWlycm9yLCBiZXNpZGUgdGhlIHJhdyBwYXRjaGVzIG9uIHRoZSBoZWFwIChgcmVjb3JkQ29tbWl0YCkuXG4gICAqIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0IHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbiBhIHJ1bnRpbWUncyByb290IGZyYW1lIGJ5IGBFeGVjdXRpb25SdW50aW1lYCB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihtaXJyb3IpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHJlZGFjdGVkIG1pcnJvciBpZiBpbnN0YWxsZWQsIGVsc2UgdW5kZWZpbmVkLiAqL1xuICBnZXRSZWRhY3RlZFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5taXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCkgb24gdGhpcyBmcmFtZSDigJQgY2FsbGVkIG9uIGFcbiAgICogcnVudGltZSdzIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIChhdCBjb25zdHJ1Y3Rpb24sIGFuZCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VQb2xpY3lgIG9uIGEgc2FtZS1leGVjdXRvciByZXN1bWUpLiBEZXNjZW5kYW50cyBnZXRcbiAgICogdGhlIHNhbWUgcmVmZXJlbmNlIHRocm91Z2gge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH07IGFcbiAgICogc3ViZmxvdydzIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgd2l0aCBpdCwgc28gaXRzIHNlZWQgZnJhbWUgYW5kIGV2ZXJ5XG4gICAqIGZyYW1lIGFmdGVyIGNvbW1pdCB1bmRlciB0aGUgcnVuJ3MgZGlhbHMgdG9vLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgdGhpcyBmcmFtZSByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMgdW5kZXIuICovXG4gIGdldFBvbGljeSgpOiBSdW5Qb2xpY3kge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeSBzYXlcbiAgICogYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkg4oCUIGFzIGEgTkVXIHBvbGljeSBmb3IgdGhpcyBmcmFtZVxuICAgKiAodGhlIHNoYXJlZCBvbmUgaXMgbmV2ZXIgZWRpdGVkKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgYXJyaXZlc1xuICAgKiB3aXRoIHRoZSBydW4ncyBwb2xpY3k7IHRoaXMgZG9vciBpcyBmb3IgYSBgU2NvcGVGYWNhZGVgIG9uIGEgYmFyZSBmcmFtZVxuICAgKiAodW5pdCB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpLCB3aGljaCBicmluZ3MgaXRzIG93biBydWxlLiBFdmVyeSBzdGFnZWRcbiAgICogd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhc2tzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgcGFzc2VzIGFcbiAgICogZmFjYWRlIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJRcbiAgICogaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWUgdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50OiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGljeS5yZWRhY3Rpb24gIT09IHJ1bGUpIHRoaXMuYWRvcHRQb2xpY3kod2l0aFJlZGFjdGlvbih0aGlzLnBvbGljeSwgcnVsZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBpbnN0YWxsZWQgcmVkYWN0aW9uIHJ1bGUsIGlmIGFueSAodGhlIGZhY2FkZSdzIGxvb2t1cCkuICovXG4gIGdldFJlZGFjdGlvblJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBydW4gZnJvbSBgZnJvbWA6IHRoZSBwb2xpY3kgKGJ5IHJlZmVyZW5jZSkgYW5kIHRoZSBydW4ncyBtaXJyb3JcbiAgICogc3RvcmUuIFRoZSBPTkUgaW5oZXJpdGFuY2Ugc3RlcCDigJQge0BsaW5rIGNyZWF0ZU5leHR9IGFuZFxuICAgKiB7QGxpbmsgY3JlYXRlQ2hpbGR9IGJvdGggY2FsbCBpdCwgYW5kIGl0IG5hbWVzIG5vIGRpYWwuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSdW4oZnJvbTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShmcm9tLnBvbGljeSk7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKGZyb20ucmVjb3JkLm1pcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ORSBwbGFjZSB0aGlzIGZyYW1lJ3MgcG9saWN5IGNoYW5nZXM6IHRoZSBmcmFtZSBob2xkcyBpdCwgYW5kIGl0c1xuICAgKiByZWNvcmQgZnJhbWUgZW5jb2RlcyB1bmRlciB0aGUgc2FtZSByZWZlcmVuY2UgKGBjb21taXRWYWx1ZXNgLFxuICAgKiBgd3JpdGVQcm92ZW5hbmNlYCDigJQgYFJlY29yZEZyYW1lIMK3IHVzZUVuY29kaW5nYCksIHNvIHRoZSB0d28gbmV2ZXIgZGlmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdFBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGFza2VkIHRoZSBydWxlIGZvciBCRUZPUkUgc3RhZ2luZywgY2FycmllZCB0byBjb21taXRcbiAgICogd2l0aCB0aGUgdmFsdWUuIFRoZSBzdGFnZWQgd3JpdGUgaXRzZWxmIGlzIHVuYWZmZWN0ZWQg4oCUIHJlZGFjdGlvbiBvZlxuICAgKiB0aGUgY29tbWl0dGVkIHBheWxvYWQgaXMgaGFuZGxlZCBieSB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogYHJlZGFjdGVkUGF0aHNgLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1dyaXRlKFxuICAgIHVzZXJLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnLFxuICApIHtcbiAgICBpZiAodGhpcy5wb2xpY3kud3JpdGVUcmFja2luZyA9PT0gJ29mZicpIHJldHVybjtcbiAgICAodGhpcy5fcGVuZGluZ1dyaXRlcyA/Pz0gbmV3IE1hcCgpKS5zZXQodXNlcktleSwgeyB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBfc3RhZ2VXcml0ZXNgIHdpdGggZXZlcnkgcGVuZGluZyB3cml0ZSBmb2xkZWQgaW4gYXMgaXRzIHJldGFpbmVkIGZvcm1cbiAgICog4oCUIHRoZSByZWNvcmQgYSByZWFkZXIgc2Vlcy4gQ29uc3VtZXMgbm90aGluZzogYSBtaWQtcnVuIHNuYXBzaG90IHJlYWRzXG4gICAqIHRoZSB3cml0ZXMgc28gZmFyLCBhbmQgY29tbWl0IHN0aWxsIG1hdGVyaWFsaXNlcyB0aGUgZmluYWwgdmFsdWVzLlxuICAgKiBSZXR1cm5zIGBfc3RhZ2VXcml0ZXNgIGl0c2VsZiB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRXcml0ZXMoKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4ge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuIHRoaXMuX3N0YWdlV3JpdGVzO1xuICAgIGNvbnN0IG91dCA9IHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHddIG9mIHRoaXMuX3BlbmRpbmdXcml0ZXMpIHtcbiAgICAgIG91dFtrZXldID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0ody52ZXJkaWN0LCB3LnZhbHVlLCB0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nLCBzdW1tYXJpemVXcml0ZVZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiB3Lm9wZXJhdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcmV0YWluZWQgZm9ybSBvZiBldmVyeSBwZW5kaW5nIHdyaXRlIOKAlCBPTkNFIHBlciBrZXksIGZyb20gdGhlXG4gICAqIHZhbHVlIGFzIGl0IHN0YW5kcyBhdCBjb21taXQgKDkuMjMuMCkg4oCUIGFuZCByZWxlYXNlIHRoZSByZWZlcmVuY2VzLiBUaGVcbiAgICogZmlyc3QgdGhpbmcgYGNvbW1pdCgpYCBkb2VzLCBzbyB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYW5kIHRoZVxuICAgKiBjb21taXQgb2JzZXJ2ZXIgc2VlIHRoZSBmaW5pc2hlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG1hdGVyaWFsaXNlV3JpdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVsZWFzZWQgZXZlbiB3aGVuIGEgcmV0YWluZWQgZm9ybSBjYW5ub3QgYmUgdGFrZW4g4oCUIGFuIHVuY2xvbmVhYmxlXG4gICAgICAvLyB2YWx1ZSAoYSBmdW5jdGlvbiwgYSBQcm94eSkgaXMgYSBjb250cmFjdCB2aW9sYXRpb24gKFwic3RhdGUgdmFsdWVzXG4gICAgICAvLyBtdXN0IHN1cnZpdmUgc3RydWN0dXJlZENsb25lXCIpIHRoYXQgbm93IHN1cmZhY2VzIEhFUkUsIGF0IGNvbW1pdCxcbiAgICAgIC8vIGFuZCBmYWlscyB0aGUgcnVuIGxvdWRseTsgYSBsYXRlciBzbmFwc2hvdCBvZiB0aGUgZmFpbGVkIHJ1biBtdXN0XG4gICAgICAvLyBub3QgdGhyb3cgdGhlIHNhbWUgZXJyb3IgYWdhaW4uXG4gICAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBvZiBhIHZhbHVlIHRoZSBlbmdpbmUgUkVUQUlOUyAocmVhZHMgYW5kIHdyaXRlcyByZXRlbnRpb24pOlxuICAgKiB0aGUgcGxhY2Vob2xkZXIgYmVhdHMgZXZlcnkgZGlhbDsgYSBmaWVsZC1sZXZlbCBzY3J1YiBoYXBwZW5zIGJlZm9yZSB0aGVcbiAgICogZGlhbCBzZWVzIHRoZSB2YWx1ZTsgYSBjbGVhciB2YWx1ZSBpcyBzdW1tYXJpemVkIG9yIGNsb25lZCBhcyB0aGUgZGlhbFxuICAgKiBzYXlzLiBDYWxsZXJzIGhhbmRsZSBgdW5kZWZpbmVkYCBiZWZvcmUgYXNraW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZEZvcm0oXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBSZWFkVHJhY2tpbmdNb2RlIHwgV3JpdGVUcmFja2luZ01vZGUsXG4gICAgc3VtbWFyaXplOiAodmFsdWU6IHVua25vd24pID0+IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBzY3J1YmJlZCA9IHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobW9kZSA9PT0gJ3N1bW1hcnknKSByZXR1cm4gc3VtbWFyaXplKHNjcnViYmVkID8/IHZhbHVlKTtcbiAgICByZXR1cm4gc2NydWJiZWQgPz8gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSB3aXRoIHNvbWV0aGluZyB0byBzYXkg4oCUIGB1bmRlZmluZWRgIG9uIHRoZSBuby1wb2xpY3kgcGF0aCAobm9cbiAgICogcnVsZSBpbnN0YWxsZWQsIG9yIGEgcnVsZSB3aXRoIG5vIHBvbGljeSBlbnRyaWVzIGFuZCBubyBtYXJrZWQga2V5cyksIHNvXG4gICAqIGEgdHJhY2tlZCByZWFkIG9yIGEgc3RhZ2VkIHdyaXRlIHRoZXJlIHBheXMgbm8gdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoXG4gICAqIGFsbG9jYXRpb24uIFRoZSBkZWZhdWx0IHJ1biBpcyBieXRlLWlkZW50aWNhbCBBTkQgY29zdC1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IHJ1bGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIE9ORSBGVU5ORUwgZXZlcnkgc3RhZ2VkIHdyaXRlIHBhc3NlcyB0aHJvdWdoIOKAlCBmYWNhZGUgd3JpdGVzIEFORFxuICAgKiB0aGUgcGF0aHMgdGhhdCBieXBhc3MgdGhlIGZhY2FkZSAoc3ViZmxvdyBzZWVkLCBgb3V0cHV0TWFwcGVyYFxuICAgKiBtZXJnZS1iYWNrLCByZXN1bWUgcmUtc2VlZCkuIFRoZSBPTkUgZGVjaXNpb24gaXMgbWFkZSBoZXJlOiBhbiBleHBsaWNpdFxuICAgKiBwZXItY2FsbCBmbGFnIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgb3V0cmlnaHQgKGFuZCBtYXJrcyB0aGUga2V5IGZvciB0aGVcbiAgICogcmVzdCBvZiB0aGUgcnVuLCB0aGUgZGVjbGFyZS1vbmNlIGNvbnRyYWN0KTsgb3RoZXJ3aXNlIHRoZSBpbnN0YWxsZWRcbiAgICogcnVsZSBkZWNpZGVzIGZyb20gdGhlIHVzZXItbGV2ZWwgcGF0aC4gSXQgc3RhZ2VzIHRoZSB3cml0ZSwgcmVnaXN0ZXJzXG4gICAqIHRoZSByZWRhY3RlZCBwYXRocyB0aGUgY29tbWl0IGxvZyBhbmQgbWlycm9yIHdpbGwgc2NydWIgKHdob2xlIGtleSwgb3JcbiAgICogdGhlIGZpZWxkcyBpbnNpZGUgdGhlIHZhbHVlKSwgYW5kIGtlZXBzIHRoZSBydW4ncyBtYXJrZWQta2V5cyBzZXQgaW5cbiAgICogc3RlcCAoYSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXk7IGEgZGVsZXRlIGNsZWFycyB0aGUgbWFyaykuIFJldHVybnNcbiAgICogdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBsZXQgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9IGV4cGxpY2l0XG4gICAgICA/IHsga2luZDogJ3dob2xlJywga2V5OiB1c2VyS2V5T2YocGF0aCwga2V5KSB9XG4gICAgICA6IHJ1bGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkpXG4gICAgICA6IENMRUFSO1xuICAgIC8vIEEgY29weSBJTlNJREUgdGhlIHN0YWdlOiB0aGUgdmVyeSBvYmplY3QgaXQgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gdW5kZXJcbiAgICAvLyBhbm90aGVyIChgcy5wZXJzb24gPSBzLnByb2ZpbGVgKSwga2VlcHMgdGhhdCBydWxlIOKAlCBtYXRjaGVkIGJ5IElERU5USVRZLiBBIG5ldyBvYmplY3RcbiAgICAvLyBvciBhIHByaW1pdGl2ZSBjb3BpZWQgYWNyb3NzIG5hbWVzIGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gbmFtZSBvbmx5LlxuICAgIGNvbnN0IHJlYWQgPVxuICAgICAgcnVsZSAhPT0gdW5kZWZpbmVkICYmIHZlcmRpY3Qua2luZCAhPT0gJ3dob2xlJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgID8gdGhpcy5fc2VsZWN0ZWRPYmplY3RzPy5nZXQodmFsdWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZWFkICE9PSB1bmRlZmluZWQgJiYgcnVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocmVhZC5raW5kID09PSAnd2hvbGUnKSBydWxlLm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAocmVhZC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgICBjb25zdCBhdCA9IFsuLi5wYXRoLnNsaWNlKDEpLCAuLi4ocGF0aC5sZW5ndGggPiAwID8gW2tleV0gOiBbXSldO1xuICAgICAgICBydWxlLmluaGVyaXRGaWVsZHMoXG4gICAgICAgICAgcGF0aFswXSA/PyBrZXksXG4gICAgICAgICAgcmVhZC5wYXRocy5tYXAoKGZpZWxkKSA9PiBbLi4uYXQsIGZpZWxkXS5qb2luKCcuJykpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdmVyZGljdCA9IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSk7XG4gICAgfVxuICAgIGNvbnN0IHdob2xlID0gdmVyZGljdC5raW5kID09PSAnd2hvbGUnO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMucmVjb3JkLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIGJ1ZmZlci5tZXJnZShuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUobnNQYXRoLCB3aG9sZSk7XG4gICAgZWxzZSBidWZmZXIuc2V0KG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgYnVmZmVyLm1hcmtSZWRhY3RlZEZpZWxkcyhuc1BhdGgsIHZlcmRpY3QucGF0aHMpO1xuICAgIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgcnVsZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICB9IGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykge1xuICAgICAgLy8gVGhlIFJFQUwgcnVsZSwgbm90IHRoZSBhY3RpdmUgb25lOiBhbiBleHBsaWNpdCBtYXJrIG9uIGFuIGluZXJ0IHJ1bGVcbiAgICAgIC8vIGlzIGV4YWN0bHkgd2hhdCBtYWtlcyBpdCBhY3RpdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgICB0aGlzLnBvbGljeS5yZWRhY3Rpb24/Lm1hcmsodmVyZGljdC5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhbmQgcmVhZCBhdCBBTk9USEVSIGZyYW1lJ3MgYWRkcmVzcyAoaXRzIHJ1biBuYW1lc3BhY2UpIHdoaWxlIHRoaXNcbiAgICogZnJhbWUga2VlcHMgaXRzIG93biBpZGVudGl0eSBvbiB0aGUgcmVjb3JkIOKAlCBgc3RhZ2VgLCBgc3RhZ2VJZGAsXG4gICAqIGBydW50aW1lU3RhZ2VJZGAsIHRhZ3MuIEEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgaXMgdGhlIG9uZSBjYWxsZXJcbiAgICogKGBTdWJmbG93RXhlY3V0b3IgwrcgZXhlY3V0ZVN1YmZsb3dgLCBSMTMpOiB0aGUgbW91bnQgZnJhbWUgb2YgYSBicmFuY2ggb3JcbiAgICogZm9yayBjaGlsZCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0cyBwYXJlbnQgd3JpdGVzLCBhcyBiZWZvcmUsIGFuZCBpdHNcbiAgICogYnVuZGxlIG5vdyBuYW1lcyB0aGUgbW91bnQgaW5zdGVhZCBvZiB0aGUgc3RhZ2UgYmVmb3JlIGl0LiBSZWZ1c2VkIG9uY2VcbiAgICogdGhlIGZyYW1lIGhhcyBzdGFnZWQgYW55dGhpbmcg4oCUIGl0cyBidWZmZXIncyBhZGRyZXNzIGlzIGZpeGVkIHRoZW4uIFRoZVxuICAgKiBkZWNpc2lvbiBpcyB0aGUgZW5naW5lJ3MgKG5hbWVzcGFjZSBpZHMsIGFzIHNpbmNlIFIxMyk7IHRoZSByZWNvcmQgZnJhbWVcbiAgICogdGFrZXMgdGhlIGFkZHJlc3MgaXQgY29tZXMgdG8gKGBSZWNvcmRGcmFtZSDCtyB1c2VBZGRyZXNzYCkuXG4gICAqL1xuICB1c2VBZGRyZXNzT2YoZnJhbWU6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICAgIHRoaXMucmVjb3JkLnVzZUFkZHJlc3MocnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKiogVGhlIHJ1biBuYW1lc3BhY2Ugd3JpdGVzIGFuZCByZWFkcyBnbyB0bzoge0BsaW5rIGFkZHJlc3NSdW5JZH0sIGVsc2UgYHJ1bklkYC4gKi9cbiAgcHJpdmF0ZSBnZXQgbmFtZXNwYWNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUnVuSWQgPz8gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgLy8gVGhlIHJlY29yZCBmcmFtZSBzZXJ2ZXMgdGhlIHZhbHVlICh0d28gdGllcnMpIGFuZCBrZWVwcyB0aGUgcGVyLXdyaXRlXG4gICAgLy8gcHJvdmVuYW5jZSByZWdpc3RyeSAoI1AxKSDigJQga2V5IHN0cmluZ3Mgb25seSwgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAgLy8gcmVhZFRyYWNraW5nIHJldGVudGlvbiBkaWFsICh3aGljaCBnb3Zlcm5zIFZBTFVFIHJldGVudGlvbiBiZWxvdykuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIC8vIFRoZSB2ZXJkaWN0LCBvbmNlIOKAlCBmb3IgdGhlIHJldGFpbmVkIHJlYWQgYmVsb3cgYW5kIHRoZSBzZWxlY3RlZC1yZWFkXG4gICAgLy8gY291bnQgKGBzZWxlY3RlZFJlYWRzYCkuIE5vIHBvbGljeSBhbmQgbm8gbWFya3Mg4oaSIG5vIHZlcmRpY3QgY2FsbCwgbm9cbiAgICAvLyBhbGxvY2F0aW9uIChhY3RpdmVSdWxlKS5cbiAgICBjb25zdCBydWxlID0ga2V5ICE9PSB1bmRlZmluZWQgPyB0aGlzLmFjdGl2ZVJ1bGUoKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5IGFzIHN0cmluZykgOiBDTEVBUjtcbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVhZHMgKz0gMTtcbiAgICAgIC8vIEFuIG9iamVjdCByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSwgd3JpdHRlbiBiYWNrIHVuZGVyIGFub3RoZXIsIGtlZXBzIGl0cyBydWxlIChzdGFnZVdyaXRlKS5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSAodGhpcy5fc2VsZWN0ZWRPYmplY3RzID8/PSBuZXcgV2Vha01hcCgpKS5zZXQodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyDigJQgcmV0YWluZWQgdW5kZXJcbiAgICAvLyB0aGUgcnVsZSdzIHZlcmRpY3QgKDkuMTkuMCk6IGEgcmVkYWN0ZWQga2V5IGlzIHJldGFpbmVkIGFzIHRoZVxuICAgIC8vIHBsYWNlaG9sZGVyLCBhIGZpZWxkLWxldmVsIGtleSBhcyBhIHNjcnViYmVkIGNsb25lLCBuZXZlciB0aGUgc2VjcmV0LlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdvZmYnKSB7XG4gICAgICBpZiAocGF0aC5sZW5ndGggPiAwKSAodGhpcy5fbmVzdGVkUmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucG9saWN5LnJlYWRUcmFja2luZyA9PT0gJ2Z1bGwnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQpIHRoaXMuX3ZpZXdSZWFkcz8uZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgKHRoaXMuX3ZpZXdSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybSh2ZXJkaWN0LCB2YWx1ZSwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nLCBzdW1tYXJpemVSZWFkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdHJhY2tlZCByZWFkcyBvZiB0aGlzIGZyYW1lIHJlYWQgYSB2YWx1ZSB0aGUgcnVuJ3MgcnVsZSBzZWxlY3RzXG4gICAqIChhIGtleSBpdCBtYXNrcyB3aG9sZSwgb3Igb25lIHdpdGggc2VjcmV0IGZpZWxkcykuIEEgYm91bmRhcnkgdGhhdCBtYXBzXG4gICAqIHdoYXQgYSBzdGFnZSBmdW5jdGlvbiBSRUFEIGludG8gYSBuZXcgbmFtZSDigJQgdGhlIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zXG4gICAqIHNlbGVjdG9yIOKAlCBjb21wYXJlcyBpdCBiZWZvcmUgYW5kIGFmdGVyLCBhcyBhIHN1YmZsb3cgbWFwcGVyJ3MgdGFpbnQgZG9lc1xuICAgKiAoYG1lbW9yeS9yZWRhY3Rpb24udHMgwrcgTWFwcGVyVGFpbnRgKS4gQWx3YXlzIDAgd2l0aG91dCBhIHBvbGljeSBvciBhIG1hcmsuXG4gICAqL1xuICBnZXQgc2VsZWN0ZWRSZWFkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJlYWRzO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkTGl2ZShrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRHbG9iYWwoa2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiByZWNvcmQgdGhhdCB0aGlzIHN0YWdlIGNvbnN1bWVkIGFuIHVudHJhY2tlZCByZWFkIHBhdGguXG4gICAqIENhbGxlZCBieSBgU2NvcGVGYWNhZGVgIChgZ2V0QXJnc2AvYGdldEVudmAvdW5zaGFkb3dlZCBgZ2V0VmFsdWVTaWxlbnRgKTtcbiAgICogc3VyZmFjZWQgYXMgYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCBvbiB0aGlzIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbWFya1VudHJhY2tlZFNvdXJjZShzb3VyY2U6IFVudHJhY2tlZFNvdXJjZSk6IHZvaWQge1xuICAgICh0aGlzLl91bnRyYWNrZWRTb3VyY2VzID8/PSBuZXcgU2V0KCkpLmFkZChzb3VyY2UpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERldi1tb2RlIG9ubHk6IGRpZCB0aGlzIHN0YWdlIGNoYW5nZSwgSU4gUExBQ0UsIGEgdmFsdWUgaXQgbWVyZWx5IFJFQUQ/XG4gICAqXG4gICAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaCDigJQgYSBwcm9wZXJ0eSBhdCBhbnlcbiAgICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICAgKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSByZWFkIG1ldGhvZCAoYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCxcbiAgICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nKTogd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXRcbiAgICogb2YgZXZlcnkgcmVhZCwgd2hpY2ggaXMgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBTbyB0aGF0IGZhbWlseVxuICAgKiBpcyBXQVJORUQgQUJPVVQgcmF0aGVyIHRoYW4gaW50ZXJjZXB0ZWQg4oCUIGxvdWRseSwgaGVyZSwgaW5zdGVhZCBvZiBlbmRpbmdcbiAgICogdGhlIHJ1biB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IHNpbGVudGx5IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgUkVQT1JUIGFmdGVyIHRoZSBmYWN0LCBub3QgYSByZWZ1c2FsIGF0IHRoZSB3cml0ZTogdGhlIHdyaXRlIGhhc1xuICAgKiBhbHJlYWR5IGhhcHBlbmVkIGluIHBsYWNlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVyY2VwdC4gSXQgcnVucyB1bmRlclxuICAgKiBUV08gcHJlY29uZGl0aW9ucywgYm90aCBuYW1lZCBpbiB0aGUgUkVBRE1FIOKAlCBgZW5hYmxlRGV2TW9kZSgpYCwgYW5kXG4gICAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSwgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBuZWVkcyB0aGVcbiAgICogY2xvbmUgb2YgdGhlIHZhbHVlIHRoYXQgbW9kZSByZXRhaW5zIGF0IHJlYWQgdGltZS4gQSBrZXkgdGhlIHN0YWdlIG5ldmVyXG4gICAqIHN0YWdlZCBtdXN0IHN0aWxsIGhvbGQgdGhhdCBjbG9uZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwXG4gICAqIGFuZCB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUgdG8gdGhpcyBzdGFnZS4gS2V5cyB0aGUgc3RhZ2UgRElEXG4gICAqIHN0YWdlIGFyZSBza2lwcGVkICh0aGV5IGFyZSBleHBlY3RlZCB0byBkaWZmZXIsIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVjb3JkKSxcbiAgICogc28gYXJlIGtleXMgdW5kZXIgYSByZWRhY3Rpb24gdmVyZGljdCwgd2hvc2UgcmV0YWluZWQgZm9ybSBpcyBkZWxpYmVyYXRlbHlcbiAgICogbm90IHRoZSB2YWx1ZSwgYW5kIHNvIGFyZSBrZXlzIHJlYWQgYXQgYSBuZXN0ZWQgcGF0aCAoYF9uZXN0ZWRSZWFkc2ApIOKAlFxuICAgKiB0aG9zZSBhcmUgZW5naW5lIHJlYWRzICh0aGUgc3ViZmxvdyBtZXJnZS1iYWNrKSwgbm90IHVzZXIgcmVhZHMuXG4gICAqXG4gICAqIEl0IGFsc28gb25seSBsb29rcyBhdCBrZXlzIHNlcnZlZCBmcm9tIHRoZSBQSU5ORUQgc291cmNlIOKAlCB0aGUgZmlyc3QtdG91Y2hcbiAgICogdmlldyBvciB0aGlzIHN0YWdlJ3Mgb3duIGJ1ZmZlci4gQSBrZXkgYWJzZW50IGZyb20gYm90aCB3YXMgc2VydmVkIGJ5IHRoZVxuICAgKiByZWFkJ3MgbGl2ZSBmYWxsYmFjayAoYFJlY29yZEZyYW1lIMK3IHJlYWRgLCB0aWVyIDIpLCB3aGljaCBhIHBhcmFsbGVsIHNpYmxpbmcncyByb290LWtleSBjb21taXQgY2FuXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlOyBhY2N1c2luZyB0aGUgc3RhZ2UgdGhlcmUgd291bGQgYmUgYSBmYWxzZSBhbGFybS4gRm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbiBpdCBydW5zIG9uIHRoZSBmcmFtZSdzIEZJUlNUIGNvbW1pdCBvbmx5OiB0aGUgcmVhZHMgYmVsb25nXG4gICAqIHRvIHRoYXQgcm91bmQsIGFuZCBieSB0aGUgZW5naW5lJ3Mgc2Vjb25kIHJvdW5kIChhIGZvcmsgZG91YmxlLWNvbW1pdCwgYVxuICAgKiBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZCBicmFuY2ggcGFyZW50KSBvdGhlciBzdGFnZXMgaGF2ZVxuICAgKiBsZWdpdGltYXRlbHkgbW92ZWQgdGhlIHN0YXRlIHRoZXkgd2VyZSBjb21wYXJlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBBIGtleSB0aGUgc3RhZ2UgRElEIHN0YWdlIGlzIHN0aWxsIGNoZWNrZWQgd2hlbiBpdHMgbGFzdCByZWFkIGNhbWUgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUgKHtAbGluayBfdmlld1JlYWRzfSDigJQgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlKTpcbiAgICogdGhhdCByZWFkIHdhcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIGFuZCB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIElTXG4gICAqIHRoYXQgb2JqZWN0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLCBzbyBhbiBpbi1wbGFjZSBlZGl0IGZvbGxvd2VkIGJ5IGFcbiAgICogd3JpdGUgb2YgdGhlIGtleSBjb21taXRzIE5PIGNoYW5nZSDigJQgbGl2ZSBzdGF0ZSBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZ1xuICAgKiBkb2VzIG5vdC4gQ29tcGFyZWQgYWdhaW5zdCBjb21taXR0ZWQgc3RhdGUsIG5vdCB0aGUgd3JpdHRlbiB2YWx1ZSwgc28gYVxuICAgKiBsZWdpdGltYXRlIHdyaXRlIG5ldmVyIHRyaXBzIGl0LlxuICAgKlxuICAgKiBDb3N0cyBub3RoaW5nIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy5yZWNvcmQuYXQoW10sIGtleSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpIHx8IHRoaXMucmVjb3JkLndhc1N0YWdlZChuYW1lc3BhY2VkKSkge1xuICAgICAgICB0aGlzLndhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleSwgbmFtZXNwYWNlZCwgcmV0YWluZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHBpbm5lZCBzb3VyY2Ugb25seSDigJQgc2VlIHRoZSBub3RlIG9uIHRoZSBsaXZlIGZhbGxiYWNrIGFib3ZlLlxuICAgICAgLy8gYHBlZWtgLCBub3QgYGdldGA6IGEgcmVwb3J0IGNvbXBhcmVzLCBhbmQgbXVzdCBub3QgdGFrZSB0aGUgcHJpdmF0ZVxuICAgICAgLy8gY29weSBhIHN0YWdlJ3MgcmVhZCB3b3VsZCAoY29weS1vbi13cml0ZSwgOS4yOS4wKS5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlY29yZC5wZWVrKG5hbWVzcGFjZWQpO1xuICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHN0YWdlZC1rZXkgaGFsZiBvZiB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn06IGRpZCBjb21taXR0ZWQgc3RhdGUgaXRzZWxmIG1vdmUgdW5kZXIgYSByZWFkPyAqL1xuICBwcml2YXRlIHdhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleTogc3RyaW5nLCBuYW1lc3BhY2VkOiBzdHJpbmdbXSwgcmV0YWluZWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdSZWFkcz8uaGFzKGtleSkpIHJldHVybjtcbiAgICBjb25zdCBjb21taXR0ZWQgPSB0aGlzLnJlY29yZC5iYXNlQXQobmFtZXNwYWNlZCk7XG4gICAgaWYgKGNvbW1pdHRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY29tbWl0dGVkKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogYHBoYXNlYCAoOS4zOS4wKSBpcyB0aGUgY2FsbGVyJ3Mgc3RhdGVtZW50IG9mIHdoYXQgYSBDT05USU5VQVRJT04gY29tbWl0XG4gICAqIGlzIOKAlCBgJ2V4aXQnYCBmcm9tIGEgc3ViZmxvdyBtb3VudCdzIGV4aXQsIGAncmVwZWF0J2AgZnJvbSBhIGZvcmtcbiAgICogZmFuLW91dCdzIHNldHRsZS4gSXQgaXMgc3RhbXBlZCBvbiB0aGUgYnVuZGxlIChgQ29tbWl0QnVuZGxlLnBoYXNlYCkgb25seVxuICAgKiB3aGVuIHRoaXMgZnJhbWUgaGFzIEFMUkVBRFkgY29tbWl0dGVkOiB0aGUgRklSU1QgYnVuZGxlIG9mIGFuIGV4ZWN1dGlvblxuICAgKiBpcyB0aGUgc3RhZ2UncyBvd24gYW5kIG5ldmVyIGNhcnJpZXMgYSBgcGhhc2VgIOKAlCBzbyBhIG1vdW50IHdpdGhvdXQgYW5cbiAgICogYG91dHB1dE1hcHBlcmAgKGEgbGF6eSBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoKSwgd2hvc2UgZXhpdFxuICAgKiBpcyBpdHMgb25seSBidW5kbGUsIHJlY29yZHMgdGhhdCBidW5kbGUgYXMgaXRzIG93biwgdGFncyBhbmQgYWxsLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogdGhlIHJlY29yZCBmcmFtZSdzIGJ1ZmZlciBhbmRcbiAgICogZmlyc3QtdG91Y2ggYmFzZSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbiwgYXMgdGhlIHJlYWQgc25hcHNob3QgK1xuICAgKiBuZXQtY2hhbmdlIGRpZmYgYmFzZSwgc28gdGhlIHJlY29yZCBmcmFtZSByZWxlYXNlcyB0aGVtIG9uY2UgdGhlIGNvbW1pdFxuICAgKiBoYXMgbGFuZGVkIGFuZCB0aGUgb2JzZXJ2ZXIgaGFzIHNlZW4gaXQgKGBSZWNvcmRGcmFtZSDCtyByZWxlYXNlYCDigJQgd2h5IGFcbiAgICogZnJhbWUgdGhhdCBrZXB0IHRoZW0gd291bGQgcmV0YWluIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZFxuICAgKiBzdGFnZSwgYW5kIHdoeSBhIHJlLXVzZWQgZnJhbWUgcmUtYW5jaG9ycyBvbiBjdXJyZW50IHN0YXRlLCBpcyB0aGVyZSkuXG4gICAqXG4gICAqIFJFLVVTRSBBRlRFUiBDT01NSVQgc3RheXMgY29ycmVjdCBiZWNhdXNlIGJvdGggcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyBvbiB0aGUgQ1VSUkVOVCBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzXG4gICAqICAgdGhpcyBzdGFnZSdzIG93biBmbHVzaGVkIHdyaXRlcyk7XG4gICAqIC0gYSBsYXRlciBXUklURSBjb25zdHJ1Y3RzIGEgZnJlc2ggYnVmZmVyIG9uIHRoYXQgcmUtYW5jaG9yZWQgdmlldywgc28gYVxuICAgKiAgIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCBwb3N0LWZpcnN0LWNvbW1pdCBzdGF0ZS4gVGhlIHByZS1yZWxlYXNlXG4gICAqICAgYnVmZmVyIGJlaGF2ZWQgdGhlIHNhbWUgZm9yIFZBTFVFUyAoaXRzIGB3b3JraW5nQ29weWAgd2FzIHJlc2V0IG9uXG4gICAqICAgY29tbWl0LCBmYWxsaW5nIHJlYWRzIHRocm91Z2ggdG8gbGl2ZSBzdGF0ZSkgYnV0IGtlcHQgdGhlIE9SSUdJTkFMXG4gICAqICAgYGJhc2VTbmFwc2hvdGAgYXMgZGlmZiBiYXNlIOKAlCB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZTogdGhlIGVuZ2luZSdzXG4gICAqICAgb25seSB3cml0ZXMgYWZ0ZXIgYSBjb21taXQgYXJlIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZFxuICAgKiAgIGJyYW5jaCBwYXJlbnQgKGEgZGVjaWRlciBvciBmb3JrIGZyYW1lIGNvbW1pdHMgYmVmb3JlIGl0cyBicmFuY2ggcnVucyk7XG4gICAqICAgdGhlIG90aGVyIFwid3JpdGUgYWZ0ZXIgY29tbWl0XCJcbiAgICogICBzaXRlcyAoU3ViZmxvd0V4ZWN1dG9yIHNlZWQg4oaSIHJlcGxhY2VzIHRoZSBjb250ZXh0OyByZXN1bWUg4oaSIGZyZXNoXG4gICAqICAgY29udGV4dCB2aWEgYGxlYWYuY3JlYXRlTmV4dGApIG5ldmVyIHJlLXVzZSBhIGNvbW1pdHRlZCBjb250ZXh0LlxuICAgKiAtIEEgVVNFUiBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBpcyBhIGRpZmZlcmVudCBtYXR0ZXI6IGl0cyB3cml0ZXNcbiAgICogICB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzLiBUaGF0IHJlZnVzYWwgbGl2ZXMgb24gdGhlXG4gICAqICAgc2NvcGUgdGllciAoYFNjb3BlRmFjYWRlYCwgc2VhbGVkIGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXIg4oCUIDkuMjIuMCksXG4gICAqICAgYmVjYXVzZSB0aGUgZnJhbWUncyByZS11c2FiaWxpdHkgaXMgZXhhY3RseSB3aGF0IHRoZSBlbmdpbmUgcGF0aHNcbiAgICogICBhYm92ZSBuZWVkLlxuICAgKiAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCBhcmUgTk9UIHJlbGVhc2VkIOKAlCBgc25hcHNob3RTZWxmKClgXG4gICAqICAgcmVhZHMgdGhlbSBwb3N0LXJ1biBmb3IgdGhlIGV4ZWN1dGlvbi10cmVlIHNuYXBzaG90LlxuICAgKi9cbiAgY29tbWl0KHBoYXNlPzogQ29tbWl0UGhhc2UpOiB2b2lkIHtcbiAgICAvLyBBIGNvbnRpbnVhdGlvbiBvbmx5IEFGVEVSIHRoZSBleGVjdXRpb24ncyBvd24gYnVuZGxlIChzZWUgYWJvdmUpLlxuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHRoaXMuX2NvbW1pdHRlZCA/IHBoYXNlIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubWF0ZXJpYWxpc2VXcml0ZXMoKTtcbiAgICB0aGlzLndhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTtcbiAgICAvLyBUaGUgcmVjb3JkJ3MgaGFsZiAoYFJlY29yZEZyYW1lIMK3IGNvbW1pdGAg4oaSIGByZWNvcmRDb21taXQudHNgKS4gTm8gYnVmZmVyXG4gICAgLy8gPSBubyB3cml0ZSBldmVyIGJ1aWx0IG9uZSAoIzEzKTogdGhlIGNvbW1pdCBpcyBlbXB0eSBieSBjb25zdHJ1Y3Rpb24sXG4gICAgLy8gcmVjb3JkZWQgd2l0aCBaRVJPIGNsb25lcy4gVGhlIG5hbWVzIGFyZSByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXMgYnVpbHQuXG4gICAgdGhpcy5yZWNvcmQuY29tbWl0KCgpID0+ICh7XG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHVudHJhY2tlZFNvdXJjZXM6IHRoaXMuX3VudHJhY2tlZFNvdXJjZXMsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICBwaGFzZTogY29udGludWF0aW9uLFxuICAgIH0pKTtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSBzZWVzIHRoZSB0cmFja2VkIG11dGF0aW9ucywgVEhFTiB0aGUgc3RhZ2luZ1xuICAgIC8vIHN0YXRlIGlzIHJlbGVhc2VkICgjMTNiKSwgc28gaXQgc2VlcyB0aGUgd29ybGQgYXMgaXQgd2FzLiBEMidzIG1hcmtlcnNcbiAgICAvLyBhbmQgdGhlIGRlY2xhcmVkIHRhZ3MgcmVsZWFzZSB3aXRoIGl0IOKAlCBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiwgc28gdGhlXG4gICAgLy8gZW5naW5lJ3MgZG91YmxlLWNvbW1pdCBwYXRocyByZWNvcmQgdGhlbSBleGFjdGx5IG9uY2UuXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZC5yZWxlYXNlKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIHRoZSByZWNvcmQgZnJhbWUncyBzdGFnZWQgc3RhdGUgKGBSZWNvcmRGcmFtZSDCtyBkaXNjYXJkYCkg4oCUIHRoZSBidWZmZXJcbiAgICogICAgICAgICAgICAgICAgICAgICh0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0cyB3aXRoIG5vdGhpbmcgc3RhZ2VkKSwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICBmaXJzdC10b3VjaCBiYXNlIChpdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhc1xuICAgKiAgICAgICAgICAgICAgICAgICAgaXQgc3RhbmRzIE5PVyDigJQgYSBzaWJsaW5nIGZvcmsgYnJhbmNoIG1heSBsZWdpdGltYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pIGFuZCB0aGUgcmVhZEtleXMgbGlzdCAoI1AxOlxuICAgKiAgICAgICAgICAgICAgICAgICAgYSBkaXNjYXJkZWQgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2ApO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcykuXG4gICAqIERpYWdub3N0aWNzIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXQgZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGVcbiAgICogcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXIgYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQuZGlzY2FyZCgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgVHJlZSBuYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgKG9yIHJldHVybikgdGhpcyBjb250ZXh0J3MgbGlua2VkIHN1Y2Nlc3Nvci5cbiAgICpcbiAgICogTUVNT0laRUQ6IHRoZSBmaXJzdCBjYWxsIGNyZWF0ZXMgYHRoaXMubmV4dGA7IGV2ZXJ5IGxhdGVyIGNhbGwgcmV0dXJuc1xuICAgKiB0aGF0IFNBTUUgY29udGV4dCBhbmQgSUdOT1JFUyBpdHMgYXJndW1lbnRzLiBJbiBub3JtYWwgdHJhdmVyc2FsIGVhY2hcbiAgICogY29udGV4dCBhZHZhbmNlcyBleGFjdGx5IG9uY2UsIHNvIHRoZSBtZW1vIG5ldmVyIGJpdGVzIOKAlCBidXQgYSBjYWxsZXJcbiAgICogZXhwZWN0aW5nIGEgZnJlc2ggY29udGV4dCBmb3IgZGlmZmVyZW50IGBzdGFnZU5hbWVgL2BzdGFnZUlkYCBhcmdzIGdldHNcbiAgICogdGhlIG9sZCBvbmUgc2lsZW50bHkuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgd2FybnMgb24gdGhhdFxuICAgKiBtaXNtYXRjaCAoYmFja2xvZyBCNCkuXG4gICAqL1xuICBjcmVhdGVOZXh0KHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5uZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXcgU3RhZ2VDb250ZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsICcnLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgICB0aGlzLm5leHQucGFyZW50ID0gdGhpcztcbiAgICAgIHRoaXMubmV4dC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgJiYgKHRoaXMubmV4dC5zdGFnZUlkICE9PSBzdGFnZUlkIHx8IHRoaXMubmV4dC5zdGFnZU5hbWUgIT09IHN0YWdlTmFtZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQuY3JlYXRlTmV4dDogbmV4dCBjb250ZXh0IGFscmVhZHkgZXhpc3RzIGFzIFwiJHt0aGlzLm5leHQuc3RhZ2VOYW1lfVwiIGAgK1xuICAgICAgICAgIGAoaWQ6IFwiJHt0aGlzLm5leHQuc3RhZ2VJZH1cIikg4oCUIGFyZ3VtZW50cyBcIiR7c3RhZ2VOYW1lfVwiIChpZDogXCIke3N0YWdlSWR9XCIpIGFyZSBpZ25vcmVkIGAgK1xuICAgICAgICAgICdhbmQgdGhlIGV4aXN0aW5nIGNvbnRleHQgaXMgcmV0dXJuZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgYnJhbmNoSWQsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNoaWxkLmluaGVyaXRSdW4odGhpcyk7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEBpbnRlcm5hbCBSZXRhaW5lZCBpbmNvbWluZyB2YWx1ZSBmb3IgdGhlIGZhY2FkZSdzIGxlZ2FjeSBlbWl0IGNoYW5uZWwuICovXG4gIGFkZERpYWdub3N0aWMoY2hhbm5lbDogRGlhZ25vc3RpY0NoYW5uZWwsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuZGVidWcuYWRkKGNoYW5uZWwsIGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
|
|
865
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUcsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZGLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0QsT0FBTyxFQUNMLEtBQUssRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBWW5FLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7Ozs7T0FTRztJQUNjLE1BQU0sQ0FBYztJQUNyQzs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxHQUFjLGtCQUFrQixDQUFDO0lBQy9DLGtGQUFrRjtJQUMxRSxTQUFTLENBQVU7SUFFcEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0Qix1RUFBdUU7SUFDaEUsT0FBTyxDQUFTO0lBQ3ZCLHFGQUFxRjtJQUM5RSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCOzs7Ozs7O09BT0c7SUFDSSxJQUFJLENBQXFCO0lBQ2hDOzs7OztPQUtHO0lB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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBBIFJlY29yZEZyYW1lIOKAlCB0aGUgcmVjb3JkIGhhbGYgKEMzKTogdGhlIGhlYXAsIHRoZSBhZGRyZXNzLCB0aGVcbiAqICAgZmlyc3QtdG91Y2ggYmFzZSwgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyIGFuZCBldmVyeSB3cml0ZSdzIHNjcnViXG4gKiAgIChDNCksIHRoZSByZWFkS2V5cyBsaXN0XG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gV2hhdCBiZWxvbmdzIHRvIGEgc3RhZ2UgaW5zaWRlIGEgcnVuOiByZXRlbnRpb24gb2YgcmVhZHMgYW5kIHdyaXRlcywgdGhlXG4gKiAgIHJlZGFjdGlvbiBkZWNpc2lvbiBwZXIgd3JpdGUgKGByZWRhY3Rpb24udHMgwrcgZGVjaWRlV3JpdGVgKSBhbmQgd2hlcmUgdGhlXG4gKiAgIGZyYW1lIHdyaXRlcyAoYHJ1bkFkZHJlc3MudHNgKSwgdGhlIGRldi1tb2RlIHdhcm5pbmdzLCB0aGUgY29tbWl0IG9ic2VydmVyXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVJlYWRWYWx1ZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UsIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSwgZmlyc3REaWZmZXJpbmdQYXRoIH0gZnJvbSAnLi9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IHR5cGUgRGlhZ25vc3RpY0NoYW5uZWwsIERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0U291cmNlUG9zaXRpb24gfSBmcm9tICcuL2V2ZW50UG9zaXRpb24uanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVZlcmIsIFJlY29yZEZyYW1lIH0gZnJvbSAnLi9SZWNvcmRGcmFtZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQge1xuICBDTEVBUixcbiAgZGVjaWRlV3JpdGUsXG4gIGluaGVyaXRCeUlkZW50aXR5LFxuICBtYXJrU3RhZ2VkV3JpdGUsXG4gIFJlZGFjdGlvblJ1bGUsXG4gIFNDT1BFX1BMQUNFSE9MREVSLFxuICBzY3J1Yk9mLFxuICB1c2VyS2V5T2YsXG59IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHJ1bkFkZHJlc3MgfSBmcm9tICcuL3J1bkFkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHdpdGhSZWRhY3Rpb24gfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWl0UGhhc2UsXG4gIEZsb3dDb250cm9sVHlwZSxcbiAgRmxvd01lc3NhZ2UsXG4gIFJlYWRUcmFja2luZ01vZGUsXG4gIFN0YWdlU25hcHNob3QsXG4gIFVudHJhY2tlZFNvdXJjZSxcbiAgV3JpdGVUcmFja2luZ01vZGUsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSByZWNvcmQgaGFsZiBvZiB0aGlzIGZyYW1lIChgUmVjb3JkRnJhbWUudHNgLCBMMywgQzMpOiB0aGUgaGVhcCBhbmQsXG4gICAqIHdoZW4gdGhlIHJ1biBrZWVwcyB0aGVtLCB0aGUgcmVkYWN0ZWQgbWlycm9yIGFuZCB0aGUgbG9nOyB0aGUgYWRkcmVzcztcbiAgICogdGhlIGZpcnN0LXRvdWNoIGJhc2U7IHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlcjsgdGhlIHJlYWRLZXlzIGxpc3QuXG4gICAqIEV2ZXJ5IHN0YXRlIHJlYWQgb2YgdGhpcyBmcmFtZSBnb2VzIHRocm91Z2ggaXQsIGFuZCBzbyBkb2VzIGV2ZXJ5XG4gICAqIGNvbW1pdC4gVGhlIG1pcnJvciBpcyBwcmVzZW50ICoqb25seSoqIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhXG4gICAqIHJlZGFjdGVkIHZpZXcgKGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZCkg4oCUIHJlYWQgdmlhXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAsIHRoZSBmb3VuZGF0aW9uIGZvclxuICAgKiBzaGFyaW5nIGEgdHJhY2Ugd2l0aG91dCBsZWFraW5nIHJhdyBQSUkgdGhyb3VnaCBgc2hhcmVkU3RhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWNvcmQ6IFJlY29yZEZyYW1lO1xuICAvKipcbiAgICogVGhlIHJ1bidzIHBvbGljeSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZSByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvciBmbGFnXG4gICAqIChgcnVuUG9saWN5LnRzYCwgRjUpLiBIZWxkIEJZIFJFRkVSRU5DRTogb25lIGZyb3plbiBvYmplY3QgcGVyIHJ1biAoYW5kXG4gICAqIHBlciByZXN1bWUpLCBzaGFyZWQgYnkgZXZlcnkgZnJhbWUgb2YgdGhlIHJ1biwgYSBzdWJmbG93J3MgaW5jbHVkZWQg4oCUXG4gICAqIHtAbGluayBjcmVhdGVOZXh0fS97QGxpbmsgY3JlYXRlQ2hpbGR9IHBhc3MgdGhlIHJlZmVyZW5jZVxuICAgKiAoe0BsaW5rIGluaGVyaXRSdW59KSwgdGhlIHJ1bnRpbWUgaW5zdGFsbHMgaXQgb24gaXRzIHJvb3RcbiAgICogKHtAbGluayB1c2VQb2xpY3l9KS4gTmV2ZXIgZWRpdGVkOyBhIGNoYW5nZSBpcyBhIG5ldyBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHBvbGljeTogUnVuUG9saWN5ID0gREVGQVVMVF9SVU5fUE9MSUNZO1xuICAvKiogVGhlIGVtaXR0aW5nIGZyYW1lJ3MgbG9naWNhbCBsZWcsIG5ldmVyIHRoZSBtdXRhYmxlIGV4ZWN1dG9yJ3MgY3VycmVudCBsZWcuICovXG4gIHByaXZhdGUgZW1pdFJ1bklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBzdGFnZU5hbWUgPSAnJztcbiAgLyoqIFVuaXF1ZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgcHVibGljIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gU2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgc3RhZ2UgZXhlY3V0aW9uLiAqL1xuICBwdWJsaWMgcnVudGltZVN0YWdlSWQgPSAnJztcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkgZm9yIHRoZSBzdGFnZSB0aGlzIGNvbnRleHQgaXMgZXhlY3V0aW5nLiBTZXQgYnlcbiAgICogdGhlIHRyYXZlcnNlciBiZXNpZGUgYHJ1bnRpbWVTdGFnZUlkYCAocGVyLW5vZGUgaWRlbnRpdHkg4oCUIE5PVCBpbmhlcml0ZWRcbiAgICogYnkgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYCksIHJlY29yZGVkIG9uIHRoZSBmaXJzdCBidW5kbGVcbiAgICogYGNvbW1pdCgpYCB3cml0ZXMsIHRoZW4gcmVsZWFzZWQgc28gYSByb3V0aW5lIHNlY29uZCBjb21taXQgb24gdGhlIHNhbWVcbiAgICogY29udGV4dCAoYSBmb3JrIGNoaWxkJ3MgZmFuLW91dCByZXBlYXQsIGEgbW91bnQncyBleGl0IGJ1bmRsZSkgY2Fycmllc1xuICAgKiBub25lIOKAlCB0aGUgc2FtZSBvbmNlLXBlci1leGVjdXRpb24gbGF3IGBfdW50cmFja2VkU291cmNlc2Aga2VlcHMuXG4gICAqL1xuICBwdWJsaWMgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8g4oCUIGl0cyBpZGVudGl0eSBvbiBldmVyeSBldmVudCwgYW5kIHRoZSBydW5cbiAgICogbmFtZXNwYWNlIGl0IHJlYWRzIGFuZCB3cml0ZXMgaW4gKHtAbGluayBydW5BZGRyZXNzfSksIHJlYWQgb25jZSwgd2hlbiB0aGVcbiAgICogZnJhbWUgaXMgYnVpbHQgKEMzKS4gT25seSB7QGxpbmsgdXNlQWRkcmVzc09mfSBtb3ZlcyB0aGUgYWRkcmVzcyBhZnRlclxuICAgKiB0aGF0LCBhbmQgb25seSBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuIG5hbWVzcGFjZSB0aGlzIGZyYW1lIHdyaXRlcyBhbmQgcmVhZHMgaW4gd2hlbiB0aGF0IGlzIG5vdCBpdHMgb3duXG4gICAqIGBydW5JZGAg4oCUIHNldCBvbmNlLCBiZWZvcmUgdGhlIGZyYW1lJ3MgZmlyc3Qgd3JpdGUsIGJ5XG4gICAqIHtAbGluayB1c2VBZGRyZXNzT2Z9LiBJdHMgb25lIHVzZXIgaXMgYSBzdWJmbG93IG1vdW50J3MgbWVyZ2UtYmFjayAoUjEzKTpcbiAgICogdGhlIHJlY29yZCBuYW1lcyB0aGUgbW91bnQsIHRoZSB2YWx1ZXMgbGFuZCB3aGVyZSB0aGUgbW91bnQncyBwYXJlbnRcbiAgICogd3JpdGVzLiBBYnNlbnQg4oaSIGBydW5JZGAsIHNvIGV2ZXJ5IG90aGVyIGZyYW1lIGlzIHVudG91Y2hlZC5cbiAgICovXG4gIHByaXZhdGUgYWRkcmVzc1J1bklkPzogc3RyaW5nO1xuICBwdWJsaWMgYnJhbmNoSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBpc0RlY2lkZXI6IGJvb2xlYW47XG4gIHB1YmxpYyBpc0Zvcms6IGJvb2xlYW47XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmcm9tIGJ1aWxkZXIgKHNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIGV4ZWN1dGlvbikuICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciAoc2V0IGJ5IHRyYXZlcnNlciB3aGVuIHRoaXMgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50KS4gKi9cbiAgcHVibGljIHN1YmZsb3dJZD86IHN0cmluZztcblxuICBwdWJsaWMgcGFyZW50PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgbmV4dD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGNoaWxkcmVuPzogU3RhZ2VDb250ZXh0W107XG5cbiAgcHVibGljIGRlYnVnOiBEaWFnbm9zdGljQ29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKCkgPT4gdGhpcy5wb2xpY3kucmVkYWN0aW9uKTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgd3JpdGVzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3IGFuZCBvbkNvbW1pdFxuICAgKiAg4oCUIGluIHRoZWlyIFJFVEFJTkVEIGZvcm0gKGNsb25lZCAvIHN1bW1hcmlzZWQgLyByZWRhY3RlZCkuIEZpbGxlZCBmcm9tXG4gICAqICB7QGxpbmsgX3BlbmRpbmdXcml0ZXN9IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30gYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIF9zdGFnZVdyaXRlczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIHdyaXRlcyBvZiB0aGUgQ1VSUkVOVCBleGVjdXRpb24sIGhlbGQgYnkgcmVmZXJlbmNlIHdpdGggdGhlIHZlcmRpY3RcbiAgICogdGhleSB3ZXJlIHN0YWdlZCB1bmRlciAoOS4yMy4wKS4gQSBrZXkgd3JpdHRlbiBrIHRpbWVzIGhvbGRzIGl0cyBMQVNUXG4gICAqIHZhbHVlOyB0aGUgcmV0YWluZWQgZm9ybSAodGhlIGB3cml0ZVRyYWNraW5nYCBjbG9uZSBvciBzdW1tYXJ5LCB0aGVcbiAgICogcmVkYWN0aW9uIHBsYWNlaG9sZGVyIG9yIGZpZWxkIHNjcnViKSBpcyB0YWtlbiBPTkNFIHBlciBrZXkgYXQgY29tbWl0IOKAlFxuICAgKiBzZWUge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfS4gU2FtZSBsYXcgYXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIHBhdGNoIHRyZWVzOiB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHBhaWQgYXQgdGhlIGJvdW5kYXJ5LCBub3QgYXRcbiAgICogZXZlcnkgd3JpdGUuIExhemlseSBhbGxvY2F0ZWQ7IGEgc3RhZ2UgdGhhdCBuZXZlciB3cml0ZXMgcGF5cyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1dyaXRlcz86IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyB2YWx1ZTogdW5rbm93bjsgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdDsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfVxuICA+O1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCByZWFkcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VSZWFkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGBfc3RhZ2VSZWFkc2Aga2V5cyB0aGF0IHdlcmUgcmVhZCBhdCBhIE5FU1RFRCBwYXRoIChgZ2V0VmFsdWUocGF0aCxcbiAgICoga2V5KWAgd2l0aCBhIG5vbi1lbXB0eSBgcGF0aGApLiBPbmx5IHRoZSBlbmdpbmUgcmVhZHMgdGhhdCB3YXkg4oCUIHRoZVxuICAgKiBmYWNhZGUgcmVhZHMgcm9vdHMg4oCUIHNvIHRoZXNlIGFyZSBub3QgdXNlciByZWFkcyBhbmQgdGhlIGJvcnJvd2VkLXJlYWRcbiAgICogZ3VhcmQgc2tpcHMgdGhlbSBieSB0aGlzIG1hcmtlciwgbmV2ZXIgYnkgZ3Vlc3NpbmcgZnJvbSBhIGRvdCBpbiB0aGUga2V5XG4gICAqIChhIHVzZXIncyB0b3AtbGV2ZWwga2V5IG1heSBpdHNlbGYgY29udGFpbiBvbmUpLiBMYXppbHkgY3JlYXRlZDsgdGhlXG4gICAqIGZhY2FkZSBwYXRoIG5ldmVyIGFsbG9jYXRlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgX25lc3RlZFJlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIERldiBtb2RlIG9ubHk6IHRoZSByb290IGtleXMgd2hvc2UgTEFTVCB0cmFja2VkIHJlYWQgd2FzIHNlcnZlZCBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSDigJQgYmVmb3JlIHRoaXMgc3RhZ2UncyBmaXJzdCB3cml0ZSwgd2hlbiBubyB0cmFuc2FjdGlvblxuICAgKiBidWZmZXIgZXhpc3RzIHlldC4gU3VjaCBhIHJlYWQgaXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBzbyBhblxuICAgKiBpbi1wbGFjZSBlZGl0IG9mIGl0IG1vdmVzIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgdG9vIChjb3B5LW9uLXdyaXRlLFxuICAgKiA5LjI5LjApOyB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0gY2hlY2tzIHRoZXNlIGtleXMgZXZlbiB3aGVuIHRoZVxuICAgKiBzdGFnZSB3cm90ZSB0aGVtLiBOZXZlciBhbGxvY2F0ZWQgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgX3ZpZXdSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIYXMgdGhpcyBmcmFtZSBjb21taXR0ZWQgYXQgbGVhc3Qgb25jZT8gVGhlIGJvcnJvd2VkLXJlYWQgZ3VhcmQgcnVucyBvblxuICAgKiB0aGUgRklSU1QgY29tbWl0IG9ubHkg4oCUIHNlZSB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0uIFRoZSBmcmFtZVxuICAgKiBpdHNlbGYgc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCAoIzEzYik6IHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IHJlbHkgb24gaXQuIFRoZVxuICAgKiB1c2VyLWxldmVsIHJlZnVzYWwgb2YgYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBsaXZlcyBhdCB0aGUgc2NvcGVcbiAgICogdGllciAoYFNjb3BlRmFjYWRlYCwgb25lIHBlciBzdGFnZSBleGVjdXRpb24pLCBub3QgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKiBUcmFja2VkIHJlYWRzIG9mIGEgc2VsZWN0ZWQgdmFsdWUgKHtAbGluayBzZWxlY3RlZFJlYWRzfSkuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkUmVhZHMgPSAwO1xuICAvKiogRWFjaCBvYmplY3QgdGhpcyBmcmFtZSByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSDihpIgdGhhdCByZWFkJ3MgdmVyZGljdCAoYHN0YWdlV3JpdGVgIGhhbmRzIGl0IG9uKS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRPYmplY3RzPzogV2Vha01hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+O1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VycyDigJQgdW50cmFja2VkIHJlYWQgcGF0aHMgdXNlZCBkdXJpbmcgVEhJU1xuICAgKiBzdGFnZSdzIGV4ZWN1dGlvbiAoYCdhcmdzJ2AgLyBgJ2VudidgIC8gYCdzaWxlbnQnYCkuIE1hcmtlZCBieVxuICAgKiBgU2NvcGVGYWNhZGVgLCBzdXJmYWNlZCBvbiB0aGUgc3RhZ2UncyBDb21taXRCdW5kbGUgYXNcbiAgICogYHVudHJhY2tlZFNvdXJjZXNgLCB0aGVuIFJFTEVBU0VEIHdpdGggdGhlIHN0YWdpbmcgc3RhdGUgYXQgY29tbWl0IGVuZFxuICAgKiAoc28gdGhlIHJvdXRpbmUgZG91YmxlLWNvbW1pdCBwYXRocyDigJQgZm9yayBjaGlsZHJlbiwgc3ViZmxvdyBtb3VudHMg4oCUXG4gICAqIHJlY29yZCB0aGUgZmllbGQgZXhhY3RseSBvbmNlLCBvbiB0aGUgZmlyc3QgY29tbWl0KS4gTGF6aWx5IGFsbG9jYXRlZDpcbiAgICogc3RhZ2VzIHRoYXQgbmV2ZXIgdG91Y2ggYW4gdW50cmFja2VkIHBhdGggcGF5IG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF91bnRyYWNrZWRTb3VyY2VzPzogU2V0PFVudHJhY2tlZFNvdXJjZT47XG5cbiAgLyoqIE9ic2VydmVyIGNhbGxlZCBhZnRlciBjb21taXQoKSDigJQgdXNlZCBieSBTY29wZUZhY2FkZSB0byBmaXJlIFNjb3BlUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkRnJhbWUoc2hhcmVkTWVtb3J5LCBldmVudExvZywgcnVuQWRkcmVzcyhydW5JZCkpO1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHRoaXMucG9saWN5KTtcbiAgICB0aGlzLmJyYW5jaElkID0gYnJhbmNoSWQ7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSAhIWlzRGVjaWRlcjtcbiAgICB0aGlzLmlzRm9yayA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIFNoYXJlZE1lbW9yeSBpbnN0YW5jZSAobmVlZGVkIGJ5IHNjb3BlIGxheWVyKS4gKi9cbiAgZ2V0U2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBTdGFtcGVkIGJlc2lkZSBydW50aW1lU3RhZ2VJZCwgYmVmb3JlIHNjb3BlIGNvbnN0cnVjdGlvbi4gKi9cbiAgYmluZEVtaXRPcmlnaW4ocnVuSWQ6IHN0cmluZywgZHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuZW1pdFJ1bklkID0gZHJpbGxQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBydW5JZDtcbiAgICBpZiAoZHJpbGxQYXRoICE9PSB1bmRlZmluZWQpIHRoaXMucmVjb3JkLmxvZz8uYmluZEFkZHJlc3MocnVuSWQsIGRyaWxsUGF0aCk7XG4gIH1cblxuICAvKiogQ2FwdHVyZSBmcm9tIHRoaXMgZnJhbWUncyBPV04gbG9nLiBBIG1hbnVhbC91bmFkZHJlc3NhYmxlIGZyYW1lIHN0YXlzIHVua25vd24uICovXG4gIGNhcHR1cmVFbWl0UG9zaXRpb24oKTogRW1pdFNvdXJjZVBvc2l0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0UnVuSWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVjb3JkLmxvZz8uY2FwdHVyZVBvc2l0aW9uKHRoaXMuZW1pdFJ1bklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yLiBTdWJzZXF1ZW50IGBjb21taXQoKWAgY2FsbHMgYXBwbHlcbiAgICogdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgdGhlIG9uZXMgdGhlIGxvZyByZWNvcmRzIOKAlCB0b1xuICAgKiB0aGlzIG1pcnJvciwgYmVzaWRlIHRoZSByYXcgcGF0Y2hlcyBvbiB0aGUgaGVhcCAoYHJlY29yZENvbW1pdGApLlxuICAgKiBDaGlsZCAvIG5leHQgY29udGV4dHMgaW5oZXJpdCB0aGUgbWlycm9yIHZpYSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgLlxuICAgKlxuICAgKiBDYWxsZWQgb24gYSBydW50aW1lJ3Mgcm9vdCBmcmFtZSBieSBgRXhlY3V0aW9uUnVudGltZWAgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yLlxuICAgKi9cbiAgdXNlUmVkYWN0ZWRNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC51c2VNaXJyb3IobWlycm9yKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZWRhY3RlZCBtaXJyb3IgaWYgaW5zdGFsbGVkLCBlbHNlIHVuZGVmaW5lZC4gKi9cbiAgZ2V0UmVkYWN0ZWRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQubWlycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2ApIG9uIHRoaXMgZnJhbWUg4oCUIGNhbGxlZCBvbiBhXG4gICAqIHJ1bnRpbWUncyByb290IGJ5IGBFeGVjdXRpb25SdW50aW1lYCAoYXQgY29uc3RydWN0aW9uLCBhbmQgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlUG9saWN5YCBvbiBhIHNhbWUtZXhlY3V0b3IgcmVzdW1lKS4gRGVzY2VuZGFudHMgZ2V0XG4gICAqIHRoZSBzYW1lIHJlZmVyZW5jZSB0aHJvdWdoIHtAbGluayBjcmVhdGVOZXh0fS97QGxpbmsgY3JlYXRlQ2hpbGR9OyBhXG4gICAqIHN1YmZsb3cncyBydW50aW1lIGlzIGNvbnN0cnVjdGVkIHdpdGggaXQsIHNvIGl0cyBzZWVkIGZyYW1lIGFuZCBldmVyeVxuICAgKiBmcmFtZSBhZnRlciBjb21taXQgdW5kZXIgdGhlIHJ1bidzIGRpYWxzIHRvby5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMuYWRvcHRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuJ3MgcG9saWN5IHRoaXMgZnJhbWUgcmV0YWlucywgZW5jb2RlcyBhbmQgc2NydWJzIHVuZGVyLiAqL1xuICBnZXRQb2xpY3koKTogUnVuUG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHJlZGFjdGlvbiBydWxlIOKAlCB0aGUgT05FIG93bmVyIG9mIFwid2hhdCBkb2VzIHRoZSBwb2xpY3kgc2F5XG4gICAqIGFib3V0IHRoaXMgcGF0aFwiIChgbWVtb3J5L3JlZGFjdGlvbi50c2ApIOKAlCBhcyBhIE5FVyBwb2xpY3kgZm9yIHRoaXMgZnJhbWVcbiAgICogKHRoZSBzaGFyZWQgb25lIGlzIG5ldmVyIGVkaXRlZCkuIFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydWxlIGFycml2ZXNcbiAgICogd2l0aCB0aGUgcnVuJ3MgcG9saWN5OyB0aGlzIGRvb3IgaXMgZm9yIGEgYFNjb3BlRmFjYWRlYCBvbiBhIGJhcmUgZnJhbWVcbiAgICogKHVuaXQgdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSwgd2hpY2ggYnJpbmdzIGl0cyBvd24gcnVsZS4gRXZlcnkgc3RhZ2VkXG4gICAqIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgYXNrcyBpdCwgc28gYSB3cml0ZSB0aGF0IG5ldmVyIHBhc3NlcyBhXG4gICAqIGZhY2FkZSDigJQgYSBzdWJmbG93IHNlZWQsIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIGEgcmVzdW1lIHJlLXNlZWQg4oCUXG4gICAqIGlzIHJldGFpbmVkIHVuZGVyIHRoZSBzYW1lIHZlcmRpY3QgYXMgYSBmYWNhZGUgd3JpdGUuIEFic2VudDogZXZlcnlcbiAgICogdmVyZGljdCBpcyBgJ2NsZWFyJ2AgdW5sZXNzIHRoZSBjYWxsZXIgcGFzc2VkIGFuIGV4cGxpY2l0IGZsYWcuXG4gICAqL1xuICB1c2VSZWRhY3Rpb25SdWxlKHJ1bGU6IFJlZGFjdGlvblJ1bGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xpY3kucmVkYWN0aW9uICE9PSBydWxlKSB0aGlzLmFkb3B0UG9saWN5KHdpdGhSZWRhY3Rpb24odGhpcy5wb2xpY3ksIHJ1bGUpKTtcbiAgfVxuXG4gIC8qKiBUaGUgaW5zdGFsbGVkIHJlZGFjdGlvbiBydWxlLCBpZiBhbnkgKHRoZSBmYWNhZGUncyBsb29rdXApLiAqL1xuICBnZXRSZWRhY3Rpb25SdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcnVuIGZyb20gYGZyb21gOiB0aGUgcG9saWN5IChieSByZWZlcmVuY2UpIGFuZCB0aGUgcnVuJ3MgbWlycm9yXG4gICAqIHN0b3JlLiBUaGUgT05FIGluaGVyaXRhbmNlIHN0ZXAg4oCUIHtAbGluayBjcmVhdGVOZXh0fSBhbmRcbiAgICoge0BsaW5rIGNyZWF0ZUNoaWxkfSBib3RoIGNhbGwgaXQsIGFuZCBpdCBuYW1lcyBubyBkaWFsLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0UnVuKGZyb206IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIHRoaXMuYWRvcHRQb2xpY3koZnJvbS5wb2xpY3kpO1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihmcm9tLnJlY29yZC5taXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBPTkUgcGxhY2UgdGhpcyBmcmFtZSdzIHBvbGljeSBjaGFuZ2VzOiB0aGUgZnJhbWUgaG9sZHMgaXQsIGFuZCBpdHNcbiAgICogcmVjb3JkIGZyYW1lIGVuY29kZXMgdW5kZXIgdGhlIHNhbWUgcmVmZXJlbmNlIChgY29tbWl0VmFsdWVzYCxcbiAgICogYHdyaXRlUHJvdmVuYW5jZWAg4oCUIGBSZWNvcmRGcmFtZSDCtyB1c2VFbmNvZGluZ2ApLCBzbyB0aGUgdHdvIG5ldmVyIGRpZmZlci5cbiAgICovXG4gIHByaXZhdGUgYWRvcHRQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyhwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBkZWNpZGVkIEJFRk9SRSBzdGFnaW5nLCBjYXJyaWVkIHRvIGNvbW1pdCB3aXRoIHRoZVxuICAgKiB2YWx1ZS4gVGhlIHN0YWdlZCB3cml0ZSBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mIHRoZVxuICAgKiBjb21taXR0ZWQgcGF5bG9hZCBpcyB0aGUgcmVjb3JkIGZyYW1lJ3Mgc2NydWIgb2YgdGhhdCB3cml0ZVxuICAgKiAoYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlbiBgc2NydWIudHNgIGF0IGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nID09PSAnb2ZmJykgcmV0dXJuO1xuICAgICh0aGlzLl9wZW5kaW5nV3JpdGVzID8/PSBuZXcgTWFwKCkpLnNldCh1c2VyS2V5LCB7IHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogYF9zdGFnZVdyaXRlc2Agd2l0aCBldmVyeSBwZW5kaW5nIHdyaXRlIGZvbGRlZCBpbiBhcyBpdHMgcmV0YWluZWQgZm9ybVxuICAgKiDigJQgdGhlIHJlY29yZCBhIHJlYWRlciBzZWVzLiBDb25zdW1lcyBub3RoaW5nOiBhIG1pZC1ydW4gc25hcHNob3QgcmVhZHNcbiAgICogdGhlIHdyaXRlcyBzbyBmYXIsIGFuZCBjb21taXQgc3RpbGwgbWF0ZXJpYWxpc2VzIHRoZSBmaW5hbCB2YWx1ZXMuXG4gICAqIFJldHVybnMgYF9zdGFnZVdyaXRlc2AgaXRzZWxmIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZFdyaXRlcygpOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm4gdGhpcy5fc3RhZ2VXcml0ZXM7XG4gICAgY29uc3Qgb3V0ID0geyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgd10gb2YgdGhpcy5fcGVuZGluZ1dyaXRlcykge1xuICAgICAgb3V0W2tleV0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnJldGFpbmVkRm9ybSh3LnZlcmRpY3QsIHcudmFsdWUsIHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVHdvIG93bmVycyAoQzQpOiB0aGUgcnVuJ3MgcnVsZSBERUNJREVTLFxuICAgKiB0aGUgcmVjb3JkIGZyYW1lIFdSSVRFUyB0aGUgdmVyZGljdCdzIGJ5dGVzLCBpbiBmb3VyIHN0ZXBzXG4gICAqIChgcmVkYWN0aW9uLnRzYCwgXCJUaGUgd3JpdGUgZGVjaXNpb25cIik6XG4gICAqICAgMS4gdGhlIHZlcmRpY3Qg4oCUIGBkZWNpZGVXcml0ZWAsIHVuZGVyIHRoZSBydWxlIGFjdGl2ZSBhcyB0aGUgd3JpdGUgYmVnaW5zO1xuICAgKiAgIDIuIGlkZW50aXR5IGluaGVyaXRhbmNlIOKAlCBgaW5oZXJpdEJ5SWRlbnRpdHlgLCBhZ2FpbnN0IHRoaXMgZnJhbWUnc1xuICAgKiAgICAgIHNlbGVjdGVkIHJlYWRzIGFzIHRoZXkgc3RhbmQgYWZ0ZXIgc3RlcCAxO1xuICAgKiAgIDMuIHRoZSBieXRlcyDigJQgYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlIG9wIGFuZCBpdHMgc2NydWIgKHRoZSB3aG9sZVxuICAgKiAgICAgIHZhbHVlLCBvciB0aGUgZmllbGRzIGluc2lkZSBpdCk7XG4gICAqICAgNC4gdGhlIG1hcmtzIOKAlCBgbWFya1N0YWdlZFdyaXRlYCwgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQsIHNvIGFcbiAgICogICAgICB3cml0ZSB0aGF0IGZhaWxzIHRvIHN0YWdlIG1hcmtzIG5vdGhpbmcuXG4gICAqIEVhY2ggc3RlcCByZWFkcyB0aGUgcnVsZSAoYW5kIHRoZSBzZWxlY3RlZCByZWFkcykgd2hlbiBpdCBhY3RzLCBhcyB0aGlzXG4gICAqIGZ1bm5lbCBhbHdheXMgZGlkLiBSZXR1cm5zIHRoZSB2ZXJkaWN0IHNvIHRoZSBjYWxsZXIgcmV0YWlucyBhbmQgcmVwb3J0c1xuICAgKiB1bmRlciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VXcml0ZShcbiAgICBuc1BhdGg6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgIHZlcmI6IFdyaXRlVmVyYixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gdW5kZWZpbmVkICYmICFleHBsaWNpdCkge1xuICAgICAgLy8gVGhlIG5vLXBvbGljeSBmYXN0IHBhdGgsIHRoZSBzYW1lIGZvdXIgc3RlcHMgd2l0aCBub3RoaW5nIHRvIGRvOiBubyBydWxlIHdpdGggYW55dGhpbmcgdG8gc2F5XG4gICAgICAvLyBhbmQgbm8gZmxhZyBpcyBjbGVhciAoc3RlcCAxKSwgbm90aGluZyB0byBpbmhlcml0IHdpdGhvdXQgYSBydWxlIChzdGVwIDIpLCBubyBzY3J1YiAoc3RlcCAzKSxcbiAgICAgIC8vIGFuZCBub3RoaW5nIHRvIG1hcmsg4oCUIGEgY2xlYXIgdmVyZGljdCBtYXJrcyBub3RoaW5nLCBhbmQgYSBkZWxldGUgdW5tYXJrcyBvbmx5IG9uIHRoZSBydWxlXG4gICAgICAvLyBhY3RpdmUgYXMgaXQgYmVnYW4gKHN0ZXAgNCkuIFRoZSBkZWZhdWx0IHJ1biBwYXlzIHRoZSByZWNvcmQncyB3cml0ZSBhbmQgbm90aGluZyBlbHNlLlxuICAgICAgdGhpcy5yZWNvcmQud3JpdGUobnNQYXRoLCB2YWx1ZSwgdmVyYik7XG4gICAgICByZXR1cm4gQ0xFQVI7XG4gICAgfVxuICAgIGNvbnN0IGFza2VkID0gZGVjaWRlV3JpdGUoYWN0aXZlLCBwYXRoLCBrZXksIGV4cGxpY2l0KTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gaW5oZXJpdEJ5SWRlbnRpdHkoYWN0aXZlLCBhc2tlZCwgdGhpcy5fc2VsZWN0ZWRPYmplY3RzLCBwYXRoLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yk9mKHZlcmRpY3QpKTtcbiAgICBtYXJrU3RhZ2VkV3JpdGUoYWN0aXZlLCB0aGlzLnBvbGljeS5yZWRhY3Rpb24sIHZlcmRpY3QsIHBhdGgsIGtleSwgdmVyYik7XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYW5kIHJlYWQgYXQgQU5PVEhFUiBmcmFtZSdzIGFkZHJlc3MgKGl0cyBydW4gbmFtZXNwYWNlKSB3aGlsZSB0aGlzXG4gICAqIGZyYW1lIGtlZXBzIGl0cyBvd24gaWRlbnRpdHkgb24gdGhlIHJlY29yZCDigJQgYHN0YWdlYCwgYHN0YWdlSWRgLFxuICAgKiBgcnVudGltZVN0YWdlSWRgLCB0YWdzLiBBIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIGlzIHRoZSBvbmUgY2FsbGVyXG4gICAqIChgU3ViZmxvd0V4ZWN1dG9yIMK3IGV4ZWN1dGVTdWJmbG93YCwgUjEzKTogdGhlIG1vdW50IGZyYW1lIG9mIGEgYnJhbmNoIG9yXG4gICAqIGZvcmsgY2hpbGQgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHMgcGFyZW50IHdyaXRlcywgYXMgYmVmb3JlLCBhbmQgaXRzXG4gICAqIGJ1bmRsZSBub3cgbmFtZXMgdGhlIG1vdW50IGluc3RlYWQgb2YgdGhlIHN0YWdlIGJlZm9yZSBpdC4gUmVmdXNlZCBvbmNlXG4gICAqIHRoZSBmcmFtZSBoYXMgc3RhZ2VkIGFueXRoaW5nIOKAlCBpdHMgYnVmZmVyJ3MgYWRkcmVzcyBpcyBmaXhlZCB0aGVuLiBUaGVcbiAgICogZGVjaXNpb24gaXMgdGhlIGVuZ2luZSdzIChuYW1lc3BhY2UgaWRzLCBhcyBzaW5jZSBSMTMpOyB0aGUgcmVjb3JkIGZyYW1lXG4gICAqIHRha2VzIHRoZSBhZGRyZXNzIGl0IGNvbWVzIHRvIChgUmVjb3JkRnJhbWUgwrcgdXNlQWRkcmVzc2ApLlxuICAgKi9cbiAgdXNlQWRkcmVzc09mKGZyYW1lOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkICYmIGZyYW1lLm5hbWVzcGFjZUlkICE9PSB0aGlzLm5hbWVzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQudXNlQWRkcmVzc09mOiAnJHt0aGlzLnN0YWdlSWR9JyBoYXMgYWxyZWFkeSBzdGFnZWQgd3JpdGVzIGF0IGl0cyBvd24gYWRkcmVzcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZGRyZXNzUnVuSWQgPSBmcmFtZS5uYW1lc3BhY2VJZDtcbiAgICB0aGlzLnJlY29yZC51c2VBZGRyZXNzKHJ1bkFkZHJlc3ModGhpcy5uYW1lc3BhY2VJZCkpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4gbmFtZXNwYWNlIHdyaXRlcyBhbmQgcmVhZHMgZ28gdG86IHtAbGluayBhZGRyZXNzUnVuSWR9LCBlbHNlIGBydW5JZGAuICovXG4gIHByaXZhdGUgZ2V0IG5hbWVzcGFjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzc1J1bklkID8/IHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgV3JpdGUgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwYXRjaChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdtZXJnZScpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICAvLyBFeHBsaWNpdCBkZWxldGlvbiAoU2NvcGVGYWNhZGUuZGVsZXRlVmFsdWUpIHN0YWdlcyBhIGRpc3RpbmN0IG9wIHNvXG4gICAgLy8gZGVsdGEtbW9kZSBjb21taXRzICgjMTNjLUIpIGNhbiBlbWl0IGEgcmVhbCBgZGVsZXRlYCB0cmFjZSBlbnRyeS5cbiAgICAvLyBVbmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSB0aGUgYnVmZmVyIGNvbW1pdHMgaXQgYXMgYVxuICAgIC8vIHNldC1vZi11bmRlZmluZWQg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcuXG4gICAgY29uc3QgdmVyZGljdCA9XG4gICAgICBvcGVyYXRpb25PdmVycmlkZSA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgPyB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB1bmRlZmluZWQsIHNob3VsZFJlZGFjdCwgJ2RlbGV0ZScpXG4gICAgICAgIDogdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBCT1JST1dFRCDigJQgc2VlIHRoZSBjb250cmFjdCBvblxuICAgKiBgU2NvcGVGYWNhZGUuZ2V0VmFsdWVgLiBSZWFkLXRyYWNraW5nIGNvc3QgaXMgcG9saWN5LWdhdGVkICgjMTQpOlxuICAgKiBgJ2Z1bGwnYCBjbG9uZXMgdGhlIHZhbHVlIGludG8gYF9zdGFnZVJlYWRzYCAoaGlzdG9yaWNhbCBkZWZhdWx0KSxcbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIG1hcmtlciwgYCdvZmYnYCByZWNvcmRzIG5vdGhpbmcuXG4gICAqL1xuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIC8vIFRoZSByZWNvcmQgZnJhbWUgc2VydmVzIHRoZSB2YWx1ZSAodHdvIHRpZXJzKSBhbmQga2VlcHMgdGhlIHBlci13cml0ZVxuICAgIC8vIHByb3ZlbmFuY2UgcmVnaXN0cnkgKCNQMSkg4oCUIGtleSBzdHJpbmdzIG9ubHksIGluZGVwZW5kZW50IG9mIHRoZVxuICAgIC8vIHJlYWRUcmFja2luZyByZXRlbnRpb24gZGlhbCAod2hpY2ggZ292ZXJucyBWQUxVRSByZXRlbnRpb24gYmVsb3cpLlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWNvcmQucmVhZChwYXRoLCBrZXkpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubm90ZVJlYWQocGF0aCwga2V5KTtcbiAgICAvLyBUaGUgdmVyZGljdCwgb25jZSDigJQgZm9yIHRoZSByZXRhaW5lZCByZWFkIGJlbG93IGFuZCB0aGUgc2VsZWN0ZWQtcmVhZFxuICAgIC8vIGNvdW50IChgc2VsZWN0ZWRSZWFkc2ApLiBObyBwb2xpY3kgYW5kIG5vIG1hcmtzIOKGkiBubyB2ZXJkaWN0IGNhbGwsIG5vXG4gICAgLy8gYWxsb2NhdGlvbiAoYWN0aXZlUnVsZSkuXG4gICAgY29uc3QgcnVsZSA9IGtleSAhPT0gdW5kZWZpbmVkID8gdGhpcy5hY3RpdmVSdWxlKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmVyZGljdCA9IHJ1bGUgIT09IHVuZGVmaW5lZCA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSBhcyBzdHJpbmcpIDogQ0xFQVI7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlYWRzICs9IDE7XG4gICAgICAvLyBBbiBvYmplY3QgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gYmFjayB1bmRlciBhbm90aGVyLCBrZWVwcyBpdHMgcnVsZSAoc3RhZ2VXcml0ZSkuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgKHRoaXMuX3NlbGVjdGVkT2JqZWN0cyA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkKSB0aGlzLl92aWV3UmVhZHM/LmRlbGV0ZShrZXkpO1xuICAgICAgICBlbHNlICh0aGlzLl92aWV3UmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMucG9saWN5LnJlYWRUcmFja2luZywgc3VtbWFyaXplUmVhZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRyYWNrZWQgcmVhZHMgb2YgdGhpcyBmcmFtZSByZWFkIGEgdmFsdWUgdGhlIHJ1bidzIHJ1bGUgc2VsZWN0c1xuICAgKiAoYSBrZXkgaXQgbWFza3Mgd2hvbGUsIG9yIG9uZSB3aXRoIHNlY3JldCBmaWVsZHMpLiBBIGJvdW5kYXJ5IHRoYXQgbWFwc1xuICAgKiB3aGF0IGEgc3RhZ2UgZnVuY3Rpb24gUkVBRCBpbnRvIGEgbmV3IG5hbWUg4oCUIHRoZSBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtc1xuICAgKiBzZWxlY3RvciDigJQgY29tcGFyZXMgaXQgYmVmb3JlIGFuZCBhZnRlciwgYXMgYSBzdWJmbG93IG1hcHBlcidzIHRhaW50IGRvZXNcbiAgICogKGBtZW1vcnkvcmVkYWN0aW9uLnRzIMK3IE1hcHBlclRhaW50YCkuIEFsd2F5cyAwIHdpdGhvdXQgYSBwb2xpY3kgb3IgYSBtYXJrLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkUmVhZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZWFkcztcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZExpdmUoa2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkR2xvYmFsKGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlLmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieSB0aGVcbiAgICogcmVhZCdzIGxpdmUgZmFsbGJhY2sgKGBSZWNvcmRGcmFtZSDCtyByZWFkYCwgdGllciAyKSwgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQSBrZXkgdGhlIHN0YWdlIERJRCBzdGFnZSBpcyBzdGlsbCBjaGVja2VkIHdoZW4gaXRzIGxhc3QgcmVhZCBjYW1lIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlICh7QGxpbmsgX3ZpZXdSZWFkc30g4oCUIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSk6XG4gICAqIHRoYXQgcmVhZCB3YXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBhbmQgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBJU1xuICAgKiB0aGF0IG9iamVjdCAoY29weS1vbi13cml0ZSwgOS4yOS4wKSwgc28gYW4gaW4tcGxhY2UgZWRpdCBmb2xsb3dlZCBieSBhXG4gICAqIHdyaXRlIG9mIHRoZSBrZXkgY29tbWl0cyBOTyBjaGFuZ2Ug4oCUIGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2dcbiAgICogZG9lcyBub3QuIENvbXBhcmVkIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlLCBub3QgdGhlIHdyaXR0ZW4gdmFsdWUsIHNvIGFcbiAgICogbGVnaXRpbWF0ZSB3cml0ZSBuZXZlciB0cmlwcyBpdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnZnVsbCcgfHwgdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpKSB7XG4gICAgICBjb25zdCByZXRhaW5lZCA9IHRoaXMuX3N0YWdlUmVhZHNba2V5XTtcbiAgICAgIC8vIE9ubHkgYSBjb250YWluZXIgY2FuIGJlIG11dGF0ZWQgaW4gcGxhY2U7IGEgcHJpbWl0aXZlIHJlYWQgY2Fubm90LlxuICAgICAgaWYgKHJldGFpbmVkID09PSBudWxsIHx8IHR5cGVvZiByZXRhaW5lZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuX25lc3RlZFJlYWRzPy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAocnVsZSAhPT0gdW5kZWZpbmVkICYmIHJ1bGUudmVyZGljdEF0KFtdLCBrZXkpLmtpbmQgIT09ICdjbGVhcicpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMucmVjb3JkLmF0KFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLnJlY29yZC53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZWNvcmQucGVlayhuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gdGhpcy5yZWNvcmQuYmFzZUF0KG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIGBwaGFzZWAgKDkuMzkuMCkgaXMgdGhlIGNhbGxlcidzIHN0YXRlbWVudCBvZiB3aGF0IGEgQ09OVElOVUFUSU9OIGNvbW1pdFxuICAgKiBpcyDigJQgYCdleGl0J2AgZnJvbSBhIHN1YmZsb3cgbW91bnQncyBleGl0LCBgJ3JlcGVhdCdgIGZyb20gYSBmb3JrXG4gICAqIGZhbi1vdXQncyBzZXR0bGUuIEl0IGlzIHN0YW1wZWQgb24gdGhlIGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS5waGFzZWApIG9ubHlcbiAgICogd2hlbiB0aGlzIGZyYW1lIGhhcyBBTFJFQURZIGNvbW1pdHRlZDogdGhlIEZJUlNUIGJ1bmRsZSBvZiBhbiBleGVjdXRpb25cbiAgICogaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYCDigJQgc28gYSBtb3VudCB3aXRob3V0IGFuXG4gICAqIGBvdXRwdXRNYXBwZXJgIChhIGxhenkgbW91bnQsIGV2ZXJ5IGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCksIHdob3NlIGV4aXRcbiAgICogaXMgaXRzIG9ubHkgYnVuZGxlLCByZWNvcmRzIHRoYXQgYnVuZGxlIGFzIGl0cyBvd24sIHRhZ3MgYW5kIGFsbC5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IHRoZSByZWNvcmQgZnJhbWUncyBidWZmZXIgYW5kXG4gICAqIGZpcnN0LXRvdWNoIGJhc2UgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sIGFzIHRoZSByZWFkIHNuYXBzaG90ICtcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UsIHNvIHRoZSByZWNvcmQgZnJhbWUgcmVsZWFzZXMgdGhlbSBvbmNlIHRoZSBjb21taXRcbiAgICogaGFzIGxhbmRlZCBhbmQgdGhlIG9ic2VydmVyIGhhcyBzZWVuIGl0IChgUmVjb3JkRnJhbWUgwrcgcmVsZWFzZWAg4oCUIHdoeSBhXG4gICAqIGZyYW1lIHRoYXQga2VwdCB0aGVtIHdvdWxkIHJldGFpbiBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2UsIGFuZCB3aHkgYSByZS11c2VkIGZyYW1lIHJlLWFuY2hvcnMgb24gY3VycmVudCBzdGF0ZSwgaXMgdGhlcmUpLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlc1xuICAgKiAgIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpO1xuICAgKiAgIHRoZSBvdGhlciBcIndyaXRlIGFmdGVyIGNvbW1pdFwiXG4gICAqICAgc2l0ZXMgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaFxuICAgKiAgIGNvbnRleHQgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dC5cbiAgICogLSBBIFVTRVIgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgaXMgYSBkaWZmZXJlbnQgbWF0dGVyOiBpdHMgd3JpdGVzXG4gICAqICAgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0cy4gVGhhdCByZWZ1c2FsIGxpdmVzIG9uIHRoZVxuICAgKiAgIHNjb3BlIHRpZXIgKGBTY29wZUZhY2FkZWAsIHNlYWxlZCBieSB0aGUgY29tbWl0IG9ic2VydmVyIOKAlCA5LjIyLjApLFxuICAgKiAgIGJlY2F1c2UgdGhlIGZyYW1lJ3MgcmUtdXNhYmlsaXR5IGlzIGV4YWN0bHkgd2hhdCB0aGUgZW5naW5lIHBhdGhzXG4gICAqICAgYWJvdmUgbmVlZC5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgLy8gQSBjb250aW51YXRpb24gb25seSBBRlRFUiB0aGUgZXhlY3V0aW9uJ3Mgb3duIGJ1bmRsZSAoc2VlIGFib3ZlKS5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSB0aGlzLl9jb21taXR0ZWQgPyBwaGFzZSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hdGVyaWFsaXNlV3JpdGVzKCk7XG4gICAgdGhpcy53YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk7XG4gICAgLy8gVGhlIHJlY29yZCdzIGhhbGYgKGBSZWNvcmRGcmFtZSDCtyBjb21taXRgIOKGkiBgcmVjb3JkQ29tbWl0LnRzYCkuIE5vIGJ1ZmZlclxuICAgIC8vID0gbm8gd3JpdGUgZXZlciBidWlsdCBvbmUgKCMxMyk6IHRoZSBjb21taXQgaXMgZW1wdHkgYnkgY29uc3RydWN0aW9uLFxuICAgIC8vIHJlY29yZGVkIHdpdGggWkVSTyBjbG9uZXMuIFRoZSBuYW1lcyBhcmUgcmVhZCBvbmNlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0LlxuICAgIHRoaXMucmVjb3JkLmNvbW1pdCgoKSA9PiAoe1xuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgcGhhc2U6IGNvbnRpbnVhdGlvbixcbiAgICB9KSk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmQucmVsZWFzZSgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYXdheSBldmVyeXRoaW5nIHRoaXMgc3RhZ2UgaGFzIFNUQUdFRCwgd2l0aG91dCBjb21taXR0aW5nIGFueSBvZiBpdC5cbiAgICpcbiAgICogVGhlIGlzb2xhdGlvbiBwcmltaXRpdmUgYmVoaW5kIGRlY2xhcmF0aXZlIHJldHJ5OiB3aGVuIGEgbm9uLWZpbmFsIGF0dGVtcHRcbiAgICogZmFpbHMsIHRoZSB3cml0ZXMgaXQgc3RhZ2VkIG11c3Qgbm90IGJlIHZpc2libGUgdG8gdGhlIG5leHQgYXR0ZW1wdCwgbXVzdFxuICAgKiBub3QgcmVhY2ggc2hhcmVkIHN0YXRlLCBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBjb21taXQgbG9nIG9yIGluIHRoaXNcbiAgICogc3RhZ2UncyBzbmFwc2hvdC4gRHJvcHBpbmcgdGhlIHN0YWdpbmcgc3RhdGUgYWNoaWV2ZXMgYWxsIGZvdXIgYXQgb25jZSDigJRcbiAgICogdGhlcmUgaXMgbm8gcm9sbGJhY2sgbWFjaGluZXJ5IHRvIGludm9rZSBiZWNhdXNlIG5vdGhpbmcgd2FzIGV2ZXIgYXBwbGllZFxuICAgKiAoTTE6IHRoZSB0cmFuc2FjdGlvbiBidWZmZXIgaG9sZHMgd3JpdGVzIHVudGlsIGBjb21taXQoKWAgZmx1c2hlcyB0aGVtKS5cbiAgICpcbiAgICogV2hhdCBpcyByZWxlYXNlZCwgYW5kIHdoeSBlYWNoIG9uZSBtYXR0ZXJzIGZvciB0aGUgbmV4dCBhdHRlbXB0OlxuICAgKiAgLSB0aGUgcmVjb3JkIGZyYW1lJ3Mgc3RhZ2VkIHN0YXRlIChgUmVjb3JkRnJhbWUgwrcgZGlzY2FyZGApIOKAlCB0aGUgYnVmZmVyXG4gICAqICAgICAgICAgICAgICAgICAgICAodGhlIG5leHQgYXR0ZW1wdCBzdGFydHMgd2l0aCBub3RoaW5nIHN0YWdlZCksIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgZmlyc3QtdG91Y2ggYmFzZSAoaXQgcmUtYW5jaG9ycyBvbiBjb21taXR0ZWQgc3RhdGUgYXNcbiAgICogICAgICAgICAgICAgICAgICAgIGl0IHN0YW5kcyBOT1cg4oCUIGEgc2libGluZyBmb3JrIGJyYW5jaCBtYXkgbGVnaXRpbWF0ZWx5XG4gICAqICAgICAgICAgICAgICAgICAgICBoYXZlIGNvbW1pdHRlZCBpbiBiZXR3ZWVuKSBhbmQgdGhlIHJlYWRLZXlzIGxpc3QgKCNQMTpcbiAgICogICAgICAgICAgICAgICAgICAgIGEgZGlzY2FyZGVkIGF0dGVtcHQncyByZWFkcyBtdXN0IG5ldmVyIHJlYWNoIHRoZSBuZXh0XG4gICAqICAgICAgICAgICAgICAgICAgICBhdHRlbXB0J3MgYFRyYWNlRW50cnkucmVhZEtleXNgKTtcbiAgICogIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3BlbmRpbmdXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCDigJQgdGhlIHNuYXBzaG90XG4gICAqICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOyB3aXRob3V0IHRoZSByZXNldCB0aGUgZXhlY3V0aW9uIHRyZWUgd291bGRcbiAgICogICAgICAgICAgICAgICAgICAgIHJlcG9ydCB3cml0ZXMgdGhhdCB3ZXJlIGRpc2NhcmRlZCwgd2hpY2ggaXMgdGhlIGV4YWN0XG4gICAqICAgICAgICAgICAgICAgICAgICBsaWUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBwcmV2ZW50ICh0aGUgcGVuZGluZyBtYXBcbiAgICogICAgICAgICAgICAgICAgICAgIGhvbGRzIGJhcmUgcmVmZXJlbmNlcyDigJQgZHJvcHBpbmcgaXQgdW4tY2xvbmVzIG5vdGhpbmcpO1xuICAgKiAgLSBgX3VudHJhY2tlZFNvdXJjZXNgIOKAlCB0aGUgRDIgaG9uZXN0eSBtYXJrZXJzLCByZWxlYXNlZCB3aXRoIHRoZSByZXN0LlxuICAgKlxuICAgKiBXaGF0IGlzIGRlbGliZXJhdGVseSBLRVBUOiBgZGVidWdgIChsb2dzLCBtZXRyaWNzLCBlcnJvcnMsIGZsb3cgbWVzc2FnZXMpLlxuICAgKiBEaWFnbm9zdGljcyBhcmUgdGhlIGFwcGVuZC1vbmx5IHJlY29yZCBvZiB3aGF0IGV2ZXJ5IGF0dGVtcHQgZGlkLCBhbmQgdGhlXG4gICAqIHJldHJ5IGZlYXR1cmUncyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBlYXJsaWVyIGF0dGVtcHRzIHN0YXkgdmlzaWJsZS5cbiAgICpcbiAgICogTm8gY29tbWl0IGlzIHJlY29yZGVkIGFuZCBubyBvYnNlcnZlciBmaXJlcyDigJQgYSBkaXNjYXJkZWQgYXR0ZW1wdCBpcyBub3QgYVxuICAgKiBjdXJzb3Igc3RvcCwgYmVjYXVzZSBmcm9tIHNoYXJlZCBzdGF0ZSdzIHBvaW50IG9mIHZpZXcgaXQgbmV2ZXIgaGFwcGVuZWQuXG4gICAqL1xuICBkaXNjYXJkU3RhZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLmRpc2NhcmQoKTtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB7fTtcbiAgICB0aGlzLl9zdGFnZVJlYWRzID0ge307XG4gICAgdGhpcy5fbmVzdGVkUmVhZHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmlld1JlYWRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCAnJywgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgICB0aGlzLm5leHQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsIGJyYW5jaElkLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBjaGlsZC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgY3JlYXRlRGVjaWRlcihwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5leHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0cnVlKTtcbiAgfVxuXG4gIHNldEFzRGVjaWRlcigpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNEZWNpZGVyID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFzRm9yaygpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNGb3JrID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEaWFnbm9zdGljcyBkZWxlZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBAaW50ZXJuYWwgUmV0YWluZWQgaW5jb21pbmcgdmFsdWUgZm9yIHRoZSBmYWNhZGUncyBsZWdhY3kgZW1pdCBjaGFubmVsLiAqL1xuICBhZGREaWFnbm9zdGljKGNoYW5uZWw6IERpYWdub3N0aWNDaGFubmVsLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnLmFkZChjaGFubmVsLCBrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXJyb3Ioa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRGbG93RGVidWdNZXNzYWdlKFxuICAgIHR5cGU6IEZsb3dDb250cm9sVHlwZSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107IHJhdGlvbmFsZT86IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IGl0ZXJhdGlvbj86IG51bWJlciB9LFxuICApIHtcbiAgICBjb25zdCBmbG93TWVzc2FnZTogRmxvd01lc3NhZ2UgPSB7IHR5cGUsIGRlc2NyaXB0aW9uLCB0aW1lc3RhbXA6IERhdGUubm93KCksIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmRlYnVnLmFkZEZsb3dNZXNzYWdlKGZsb3dNZXNzYWdlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTdGFnZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSByZXR1cm4gdGhpcy5zdGFnZU5hbWU7XG4gICAgcmV0dXJuIGAke3RoaXMucnVuSWR9LiR7dGhpcy5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFN0YWdlU25hcHNob3Qge1xuICAgIC8vIEl0ZXJhdGl2ZSB3YWxrIChleHBsaWNpdCB3b3JrIHN0YWNrKSwgTk9UIHJlY3Vyc2lvbjogdGhlIGV4ZWN1dGlvblxuICAgIC8vIHRyZWUgZGVlcGVucyBieSBvbmUgbGV2ZWwgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGBuZXh0YCBjaGFpbnMsIGFuZFxuICAgIC8vIHRoZSB0cmFtcG9saW5lZCB0cmF2ZXJzZXIgYWxsb3dzIGNoYWlucy9sb29wcyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZlxuICAgIC8vIHN0YWdlcyDigJQgZmFyIGRlZXBlciB0aGFuIGEgcmVjdXJzaXZlIHNlcmlhbGl6ZXIgY2FuIHdhbGsgYmVmb3JlXG4gICAgLy8gXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnNuYXBzaG90U2VsZigpO1xuICAgIGNvbnN0IHdvcms6IEFycmF5PHsgY3R4OiBTdGFnZUNvbnRleHQ7IHNuYXA6IFN0YWdlU25hcHNob3QgfT4gPSBbeyBjdHg6IHRoaXMsIHNuYXA6IHJvb3QgfV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBjdHgsIHNuYXAgfSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKGN0eC5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRTbmFwID0gY3R4Lm5leHQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgIHNuYXAubmV4dCA9IG5leHRTbmFwO1xuICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGN0eC5uZXh0LCBzbmFwOiBuZXh0U25hcCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHguY2hpbGRyZW4pIHtcbiAgICAgICAgc25hcC5jaGlsZHJlbiA9IGN0eC5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRTbmFwID0gY2hpbGQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjaGlsZCwgc25hcDogY2hpbGRTbmFwIH0pO1xuICAgICAgICAgIHJldHVybiBjaGlsZFNuYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBvZiBUSElTIGNvbnRleHQncyBvd24gZmllbGRzIOKAlCBgbmV4dGAvYGNoaWxkcmVuYCBhcmUgZmlsbGVkXG4gICAqICBpbiBieSB0aGUgaXRlcmF0aXZlIHdhbGsgaW4gYGdldFNuYXBzaG90YC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdFNlbGYoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* memory/borrowedMutation — the honest boundary's two texts: the dev-mode
|
|
3
3
|
* REPORT for a write the engine cannot see ({@link borrowedMutationMessage})
|
|
4
4
|
* and the REFUSAL for a write from a handle held past its stage
|
|
5
|
-
* ({@link deadFrameMessage}, thrown by `
|
|
5
|
+
* ({@link deadFrameMessage}, thrown by `ScopeFacade · assertLive`).
|
|
6
6
|
*
|
|
7
7
|
* ── The honest boundary ──────────────────────────────────────────────────
|
|
8
8
|
* The typed scope intercepts every write it can reach: a property at any
|